*Import SplitCov.xls as WORK.splitcov or simply read the data below; data a; input block spf wpf wp response spcov; datalines; 1 1 1 1 12.5 2 1 2 1 1 17 2 1 3 1 1 13.7 3 1 1 2 2 20.9 3 1 2 2 2 23.1 2 1 3 2 2 25.1 5 2 1 1 3 17.9 1 2 2 1 3 17.4 2 2 3 1 3 21 3 2 1 2 4 20 2 2 2 2 4 20.5 4 2 3 2 4 25.3 5 3 1 1 5 17.7 2 3 2 1 5 16.2 2 3 3 1 5 19.5 4 3 1 2 6 20.4 2 3 2 2 6 23.1 4 3 3 2 6 23.5 6 ; run; /*data a; set splitcov; run; */ /* Create a Whole Plot Covariate */ proc sort data=a; by wp; proc means data=a noprint; by wp; var spcov; output out=b (where=(_stat_='MEAN') rename=(spcov=wpcov) drop=_TYPE_ _FREQ_); proc print; run; /* Append the Whole Plot Covariate to the data */ data c; merge a b; by wp; drop _STAT_; run; proc print; run; data f; set c; spfcov=spcov-wpcov; run; /* Data set F has a split plot covariate and whole plot covariate, but no WPF covariate */ proc print data=f; run; *Plot the covariates against the response; proc sgplot data=f; scatter x=spcov y=response/group=wpf; loess x=spcov y=response/group=wpf nomarkers; xaxis label="Covariate"; yaxis label="Response"; run; proc sgplot data=f; scatter x=wpcov y=response/group=wpf; loess x=wpcov y=response/group=wpf nomarkers; xaxis label="Whole plot covariate"; yaxis label="Response"; run; proc sgplot data=f; scatter x=spfcov y=response/group=wpf; loess x=spfcov y=response/group=wpf nomarkers; xaxis label="Split plot covariate"; yaxis label="Response"; run; proc print; run; /* Traditional ANOVA */ proc glm data=f; class Block SPF WPF; model response=Block WPF WPF*Block SPF WPF*SPF SPF*Block SPF*WPF*Block; random Block/test; test h=WPF e=wpf*block; test h=SPF e=spf*block; test h=spf*wpf e=spf*wpf*block; run; /* Traditional ANOVA with pooled split plot error term */ proc glm data=f; class Block SPF WPF; model response=Block WPF WPF*Block SPF WPF*SPF; random Block WPF*Block/test; run; /*Traditional ANOVA with pooled split plot error term */ /* GLIMMIX omits extraneous tests on random effects */ proc glimmix data=f; class spf wpf block; model response=wpf spf wpf*spf/ddfm=satterthwaite; random block wpf*block; run; /* Yandell ANOVA */ proc glm data=f; class WP SPF WPF; model response=WPF WP(WPF) SPF WPF*SPF; random WP(WPF)/test; run; /* Yandell ANOVA */ proc glimmix data=f; class spf wpf wp; model response=wpf spf wpf*spf/ddfm=satterthwaite; random wp(wpf); run; /* Yandell ANOVA with Whole Plot covariates */ proc glm data=f; class SPF WPF WP; model response=wpcov wpf wp(wpf) spf wpf*spf; /* This next statement won't work */ *random wp(wpf)/test; test h=wpf e=wp(wpf); test h=wpcov e=wp(wpf)/htype=1 etype=1; run; /* Replicating the above analysis in GLIMMIX */ proc glimmix data=f; class spf wpf wp; model response=wpcov wpf spf wpf*spf/ddfm=satterthwaite htype=(1 3); random wp(wpf); run; /* Yandell ANOVA with Split Plot covariates */ proc glm data=f; class SPF WPF WP; model response=wpcov wpf wp(wpf) spfcov spf wpf*spf; test h=wpf e=wp(wpf); test h=wpcov e=wp(wpf)/htype=1 etype=1; run; /* Same analysis in GLIMMIX */ proc glimmix data=f; class spf wpf wp; model response=wpcov wpf spfcov spf wpf*spf/ddfm=satterthwaite htype=(1 3); random wp(wpf); run;