Welcome to the Institute for Digital Research and Education
Institute for Digital Research and Education HomeRegression with SAS
Chapter 7: Categorical and Continuous Predictors and Interactions
Chapter Outline
1. Continuous and categorical predictors without interaction
2. Continuous and categorical predictors with interaction
3. Show slopes for each group
3.1 Show slopes by performing separate analyses
3.2 Show slopes for each group from one analysis
4. Compare slopes across groups
5. Simple effects and simple comparisons of group, strategy 1
5.1 Simple effects and comparisons when meals is 1 sd below mean
5.2 Simple effects and comparisons when meals is at the mean
5.3 Simple effects and comparisons when meals is 1 sd above the mean
6. Simple effects and simple comparisons of group, strategy 2
7. More on predicted values
1.0 Continuous and categorical predictors without interaction
data elemapi2; set 'd:sassasdataelemapi2'; run;
Creating the variables Icollcat2 and Icollcat3 by using the reverse Helmert coding on collcat.
data elemapi2; set elemapi2; Icollcat2 = 0; if collcat = 1 then Icollcat2 = -.5; if collcat = 2 then Icollcat2 = .5; Icollcat3 = 2/3; if collcat = 1 then Icollcat3 = -1/3; if collcat = 2 then Icollcat3 = -1/3; run; proc freq data=elemapi2; tables ( Icollcat2 Icollcat3)*collcat/ norow nocol nopercent ; run;
The FREQ Procedure Table of Icollcat2 by collcat
Icollcat2 collcat Frequency| 1| 2| 3| Total ---------+--------+--------+--------+ -0.5 | 129 | 0 | 0 | 129 ---------+--------+--------+--------+ 0 | 0 | 0 | 137 | 137 ---------+--------+--------+--------+ 0.5 | 0 | 134 | 0 | 134 ---------+--------+--------+--------+ Total 129 134 137 400
Table of Icollcat3 by collcat
Icollcat3 collcat Frequency | 1| 2| 3| Total -------------+--------+--------+--------+ -0.333333333 | 129 | 134 | 0 | 263 -------------+--------+--------+--------+ 0.6666666667 | 0 | 0 | 137 | 137 -------------+--------+--------+--------+ Total 129 134 137 400
Traditional ANCOVA: regressing a continuous dependent variable on predictors that includes both categorical and
continuous predictors (without any interactions).
proc reg data= elemapi2; model api00 = Icollcat2 Icollcat3 meals; output out=temp p=predict; run; quit;
The REG Procedure Model: MODEL1 Dependent Variable: api00 api 2000 Analysis of Variance Sum of Mean Source DF Squares Square F Value Pr > F
Model 3 6586952 2195651 584.83 <.0001 Error 396 1486720 3754.34394 Corrected Total 399 8073672 Root MSE 61.27270 R-Square 0.8159 Dependent Mean 647.62250 Adj R-Sq 0.8145 Coeff Var 9.46118
Parameter Estimates Parameter Standard Variable DF Estimate Error t Value Pr > |t|
Intercept 1 885.17891 6.71886 131.75 <.0001 Icollcat2 1 14.01454 7.62786 1.84 0.0669 Icollcat3 1 17.23322 6.58145 2.62 0.0092 meals 1 -3.94267 0.09883 -39.89 <.0001
Generating the graph with a regression line for each level of collcat.
Note: Each line has the same slope, namely the coefficient of meals in the regression output. The coefficient of
Icollcat2 is the difference in y-intercepts between the lines for collcat=1 and collcat=2 whereas the coefficient of
Icollcat3 is the difference in y-intercept between the line for collcat=3 and the average of the lines for collcat=1
and collcat=2. This is simply a result of using the reverse Helmert coding for collcat when creating Icollcat2 and
Icollcat3.
goptions reset=all; symbol1 v=square i=join c=blue h=.6; symbol2 v=dot i=join c=red h=.6; symbol3 v=plus i=join c=green h=.6; axis1 label=(a=90 'Predicted'); proc gplot data=temp; plot predict*meals=collcat/overlay vaxis=axis1; run; quit;
2.0 Continuous and categorical predictors with interaction
Testing the homogeneity of slopes by creating the two interactions and then testing to see if the overall
interaction is significant.
data elemapi2; set elemapi2; Icolmeal2 = Icollcat2*meals; Icolmeal3 = Icollcat3*meals; run; proc reg data=elemapi2; model api00 = meals Icollcat2 Icollcat3 Icolmeal2 Icolmeal3; output out=temp p=predict; interaction: test Icolmeal2=Icolmeal3=0; run; quit;
The REG Procedure Model: MODEL1 Dependent Variable: api00 api 2000 Analysis of Variance Sum of Mean Source DF Squares Square F Value Pr > F
Model 5 6629930 1325986 361.86 <.0001 Error 394 1443742 3664.32012 Corrected Total 399 8073672 Root MSE 60.53363 R-Square 0.8212 Dependent Mean 647.62250 Adj R-Sq 0.8189 Coeff Var 9.34705
Parameter Estimates Parameter Standard Variable DF Estimate Error t Value Pr > |t|
Intercept 1 882.47026 6.69004 131.91 <.0001 meals 1 -3.85935 0.10064 -38.35 <.0001 Icollcat2 1 10.29492 16.24717 0.63 0.5267 Icollcat3 1 -26.42920 14.31193 -1.85 0.0655 Icolmeal2 1 0.02815 0.22250 0.13 0.8994 Icolmeal3 1 0.79489 0.23242 3.42 0.0007
The REG Procedure Model: MODEL1 Test interaction Results for Dependent Variable api00 Mean Source DF Square F Value Pr > F
Numerator 2 21489 5.86 0.0031 Denominator 394 3664.32012
Generating a graph with a regression line for each of the levels of collcat.
Note: The lines are no longer parallel like they were in the previous graph which we
expected to see since the overall interaction test was significant.
goptions reset=all; symbol1 v=square i=join c=blue h=.6; symbol2 v=dot i=join c=red h=.6; symbol3 v=plus i=join c=green h=.6; axis1 label=(a=90 'Predicted'); proc gplot data=temp; plot predict*meals = collcat/overlay vaxis=axis1; run; quit;
3.0 Show slopes for each group
3.1 Show slopes by performing separate analyses
It is entirely possible to get the slope and y-intercept for the regression line for each of
the levels of collcat. The by statement in the regression will accomplish this very easily.
Note: We need to sort the data set on collcat before we can use the by statement.
proc sort data=elemapi2 out=elemapisort; by collcat; run; proc reg data=elemapisort; by collcat; model api00=meals; run; quit;
collcat=1
The REG Procedure Model: MODEL1 Dependent Variable: api00 api 2000 Analysis of Variance Sum of Mean Source DF Squares Square F Value Pr > F
Model 1 2617393 2617393 664.41 <.0001 Error 127 500307 3939.42342 Corrected Total 128 3117699 Root MSE 62.76483 R-Square 0.8395 Dependent Mean 596.34884 Adj R-Sq 0.8383 Coeff Var 10.52485
Parameter Estimates Parameter Standard Variable DF Estimate Error t Value Pr > |t|
Intercept 1 886.13253 12.52709 70.74 <.0001 meals 1 -4.13839 0.16055 -25.78 <.0001
collcat=2 Analysis of Variance Sum of Mean Source DF Squares Square F Value Pr > F
Model 1 2424782 2424782 676.61 <.0001 Error 132 473050 3583.71194 Corrected Total 133 2897832 Root MSE 59.86411 R-Square 0.8368 Dependent Mean 651.50000 Adj R-Sq 0.8355 Coeff Var 9.18866
Parameter Estimates Parameter Standard Variable DF Estimate Error t Value Pr > |t|
Intercept 1 896.42745 10.74270 83.45 <.0001 meals 1 -4.11024 0.15801 -26.01 <.0001
collcat=3 Analysis of Variance Sum of Mean Source DF Squares Square F Value Pr > F
Model 1 975466 975466 279.96 <.0001 Error 135 470385 3484.33611 Corrected Total 136 1445851 Root MSE 59.02827 R-Square 0.6747 Dependent Mean 692.10949 Adj R-Sq 0.6723 Coeff Var 8.52875
Parameter Estimates Parameter Standard Variable DF Estimate Error t Value Pr > |t|
Intercept 1 864.85079 11.48996 75.27 <.0001 meals 1 -3.32943 0.19899 -16.73 <.0001
3.2 Obtaining slopes for each group in one analysis
Obtaining the slope of meals for each level of collcat by first sorting the data and then using a by statement can be a bit cumbersome. Instead we can use the estimate statement in proc glm. Recall the variable coded using the reverse Helmert coding:
collcat Icollcat2 Icollcat3 1 -.5 -1/3 2 .5 -1/3 3 0 -2/3
Thus, in order to get the slope of meals we need to have the appropriate coefficient for each of the interaction variables. For example, for the collcat=1 group the coefficient for Icolmeal2 will be the coefficient in the column for Icollcat2 in the collcat=1 row in the table above. In other words, the coefficient for Icolmeal2 will be -.5. This is because Icolmeal2 is the interaction of Icollcat2 and meals. Using the same logic we find that the coefficient for Icolmeal3 is -1/3, the coefficient for Icollcat3 in the collcat=1 row in the table above. Furthermore, using the same reasoning we find that for the collcat=2 group the coefficient for Icolmeal2 is .5 and for Icolmeal3 the coefficient is -1/3. For the collcat=3 group the coefficient for
Icolmeal2 is 0 and for Icolmeal3 it is -2/3.
Note: We are using the regression coding and the proc glm is missing a class statement which means that proc glm is basically functioning as a proc reg--but it is a new an improved proc reg because now it has an estimate statement!!!!
proc glm data=elemapi2; model api00 = meals Icollcat2 Icollcat3 Icolmeal2 Icolmeal3; estimate 'slope of meals at collcat=1' meals 1 Icolmeal2 -.5 Icolmeal3 -.333333333; estimate 'slope of meals at collcat=2' meals 1 Icolmeal2 .5 Icolmeal3 -.3333333333; estimate 'slope of meals at collcat=3' meals 1 Icolmeal2 0 Icolmeal3 .666666667; run; quit;
The GLM Procedure Number of observations 400 The GLM Procedure Dependent Variable: api00 api 2000 Sum of Source DF Squares Mean Square F Value Pr > F
Model 5 6629929.872 1325985.974 361.86 <.0001 Error 394 1443742.126 3664.320 Corrected Total 399 8073671.998
R-Square Coeff Var Root MSE api00 Mean
0.821179 9.347054 60.53363 647.6225
Source DF Type I SS Mean Square F Value Pr > F
meals 1 6549825.145 6549825.145 1787.46 <.0001 Icollcat2 1 11385.768 11385.768 3.11 0.0787 Icollcat3 1 25740.884 25740.884 7.02 0.0084 Icolmeal2 1 115.990 115.990 0.03 0.8589 Icolmeal3 1 42862.086 42862.086 11.70 0.0007
Source DF Type III SS Mean Square F Value Pr > F
meals 1 5389132.969 5389132.969 1470.70 <.0001 Icollcat2 1 1471.242 1471.242 0.40 0.5267 Icollcat3 1 12495.833 12495.833 3.41 0.0655 Icolmeal2 1 58.655 58.655 0.02 0.8994 Icolmeal3 1 42862.086 42862.086 11.70 0.0007
Standard Parameter Estimate Error t Value Pr > |t|
slope of meals at collcat=1 -4.13839216 0.15484383 -26.73 <.0001 slope of meals at collcat=2 -4.11024157 0.15978196 -25.72 <.0001 slope of meals at collcat=3 -3.32942579 0.20406098 -16.32 <.0001
Standard Parameter Estimate Error t Value Pr > |t|
Intercept 882.4702589 6.69003553 131.91 <.0001 meals -3.8593532 0.10063563 -38.35 <.0001 Icollcat2 10.2949246 16.24717093 0.63 0.5267 Icollcat3 -26.4292002 14.31192705 -1.85 0.0655 Icolmeal2 0.0281506 0.22250143 0.13 0.8994 Icolmeal3 0.7948911 0.23241688 3.42 0.0007
Obtaining the exact same results using the GLM default coding (and a class statement so that proc glm functions
as proc glm and not as a proc reg).
proc glm data=elemapi2; class collcat; model api00 = meals collcat collcat*meals ; estimate 'slope of meals at collcat=1' meals 1 collcat*meals 1 0 0; estimate 'slope of meals at collcat=2' meals 1 collcat*meals 0 1 0; estimate 'slope of meals at collcat=3' meals 1 collcat*meals 0 0 1; run; quit;
The GLM Procedure Class Level Information Class Levels Values
collcat 3 1 2 3 Number of observations 400 The GLM Procedure Dependent Variable: api00 api 2000 Sum of Source DF Squares Mean Square F Value Pr > F
Model 5 6629929.872 1325985.974 361.86 <.0001 Error 394 1443742.126 3664.320 Corrected Total 399 8073671.998
R-Square Coeff Var Root MSE api00 Mean
0.821179 9.347054 60.53363 647.6225
Source DF Type I SS Mean Square F Value Pr > F
meals 1 6549825.145 6549825.145 1787.46 <.0001 collcat 2 37126.652 18563.326 5.07 0.0067 meals*collcat 2 42978.076 21489.038 5.86 0.0031
Source DF Type III SS Mean Square F Value Pr > F
meals 1 5389132.969 5389132.969 1470.70 <.0001 collcat 2 14535.351 7267.676 1.98 0.1390 meals*collcat 2 42978.076 21489.038 5.86 0.0031
Standard Parameter Estimate Error t Value Pr > |t|
slope of meals at collcat=1 -4.13839216 0.15484383 -26.73 <.0001 slope of meals at collcat=2 -4.11024157 0.15978196 -25.72 <.0001 slope of meals at collcat=3 -3.32942579 0.20406098 -16.32 <.0001
4.0 Comparing Slopes Across Groups
By using the reverse Helmert coding we can compare slopes of group 1 versus group2
by looking at the t-test for the coefficient of Icolmeal2. We can compare the slopes of
group 3 versus the average of groups 1 and 2 by looking at the t-test for the coefficient
of Icolmeal2 and Icolmeal3. From this we can conclude that the slopes of groups 1 and 2 are not
significantly different (p=0.8994) but that the slope of group 3 is significantly different
from the slope of the average of groups 1 and 2 (p=0.0007).
proc reg data=elemapi2; model api00 = meals Icollcat2 Icollcat3 Icolmeal2 Icolmeal3; run; quit;
The REG Procedure Model: MODEL1 Dependent Variable: api00 api 2000 Analysis of Variance Sum of Mean Source DF Squares Square F Value Pr > F
Model 5 6629930 1325986 361.86 <.0001 Error 394 1443742 3664.32012 Corrected Total 399 8073672 Root MSE 60.53363 R-Square 0.8212 Dependent Mean 647.62250 Adj R-Sq 0.8189 Coeff Var 9.34705
Parameter Estimates Parameter Standard Variable DF Estimate Error t Value Pr > |t|
Intercept 1 882.47026 6.69004 131.91 <.0001 meals 1 -3.85935 0.10064 -38.35 <.0001 Icollcat2 1 10.29492 16.24717 0.63 0.5267 Icollcat3 1 -26.42920 14.31193 -1.85 0.0655 Icolmeal2 1 0.02815 0.22250 0.13 0.8994 Icolmeal3 1 0.79489 0.23242 3.42 0.0007
5.0 Simple Effects and Simple Comparisons of Groups, method I
The tests of the coefficients of the interactions reflect if the slopes of the groups are
significantly different across the whole dataset. However, sometimes it can be very
informative to test for significant difference between the groups at specific points in the
dataset. A common strategy is to test for differences at the mean, the mean - 1 standard
deviation, the mean + 1 standard deviation. So, we need to calculate the mean and
standard deviation of meals.
Here we insert the graph maybe with circles and/or moving parts!
proc means data=elemapi2 mean std; var meals; run; proc reg data=elemapi2 noprint; model api00 = meals Icollcat2 Icollcat3 Icolmeal2 Icolmeal3; output out=temp p=predict; run; quit; goptions reset=all; symbol1 v=square i=join c=blue h=.6; symbol2 v=dot i=join c=red h=.6; symbol3 v=plus i=join c=green h=.6; axis1 label=(a=90 'Predicted'); axis2 label=(' '); proc gplot data=temp; plot predict*meals=collcat/overlay vaxis=axis1 haxis=axis2 href=28.403299 60.3150000 92.226701; run; quit;
The MEANS Procedure Analysis Variable : meals pct free meals Mean Std Dev ---------------------------- 60.3150000 31.9117011 ----------------------------
5.1 Simple effects and comparisons when meals = means - 1std.
First, we generate a variable for meals that is shifted to be centered at one standard
deviation below the mean using proc sql. We also create new interaction variables
using the new variable for meals.
proc sql; create table low as select *, meals - ( mean(meals) - std(meals) ) as meals_low from elemapi2; quit; data low; set low; Icolmeals2_low = Icollcat2*meals_low; Icolmeals3_low = Icollcat3*meals_low; run;
Now that we have the new variable for meals we can perform the same regression as previously and the
only difference is that instead of meals we will use meals_low. By using the variable for meals centered
at one standard deviation below the mean we can now test for group differences at this specific point.
If you refer to the graph above we are testing for group differences at the first vertical line. Since the
three lines are very close together we anticipate that we probably won't find any significant differences.
proc reg data=low; model api00 = meals_low Icollcat2 Icollcat3 Icolmeals2_low Icolmeals3_low; test: test Icollcat2=Icollcat3=0; run; quit;
The REG Procedure Model: MODEL1 Dependent Variable: api00 api 2000 Analysis of Variance Sum of Mean Source DF Squares Square F Value Pr > F
Model 5 6629930 1325986 361.86 <.0001 Error 394 1443742 3664.32012 Corrected Total 399 8073672 Root MSE 60.53363 R-Square 0.8212 Dependent Mean 647.62250 Adj R-Sq 0.8189 Coeff Var 9.34705
Parameter Estimates Parameter Standard Variable DF Estimate Error t Value Pr > |t|
Intercept 1 772.85190 4.36931 176.88 <.0001 meals_low 1 -3.85935 0.10064 -38.35 <.0001 Icollcat2 1 11.09449 11.05054 1.00 0.3160 Icollcat3 1 -3.85167 8.95725 -0.43 0.6674 Icolmeals2_low 1 0.02815 0.22250 0.13 0.8994 Icolmeals3_low 1 0.79489 0.23242 3.42 0.0007 Test test Results for Dependent Variable api00 Mean Source DF Square F Value Pr > F
Numerator 2 2346.37142 0.64 0.5277 Denominator 394 3664.32012
By looking at the coefficient for Icollcat2 in the regression output we can see if the simple comparison of the group collcat=1 and the group collcat=2 is significant. The t-test has a p-value of 0.316 and this comparison is therefore not statistically significant at the 0.05 level. We can see if the simple comparison of groups 3 vs group 12 is significant by looking at the coefficient for Icollcat3. We can also calculate these numbers by recalling that Icollcat2 is the difference in the y-intercept between groups 1 and 2. Let's calculate the predicted values (y-intercepts) for group 1 and for group 2 using proc glm and then we can subtract them to get exactly the coefficient for Icollcat2. We will also obtain the test of the simple comparison between group 3 and groups 1,2, as well as the predicted values for groups 12 and 3 at meals=28.4 (one standard deviation below the mean).
Note: We are using the regression coding and the proc glm is missing a class statement which means that proc glm is basically functioning as a proc reg--but it is a new an improved proc reg because now it has an estimate statement!!!!
proc glm data=low; model api00 = meals_low Icollcat2 Icollcat3 Icolmeals2_low Icolmeals3_low; estimate 'simple comparisons group 1 v 2, m=28.4' Icollcat2 1; estimate 'predicted value group 1, m=28.4' intercept 1 Icollcat2 -.5 Icollcat3 -.3333333; estimate 'predicted value group 2, m=28.4' intercept 1 Icollcat2 .5 Icollcat3 -.3333333; estimate 'simple comparisons group 3 vs 12, m=28.4' Icollcat3 1; estimate 'predicted value group 1,1, m=28.4' intercept 1 Icollcat2 0 Icollcat3 -.3333333; estimate 'predicted value group 2, m=28.4' intercept 1 Icollcat2 0 Icollcat3 .6666667; run; quit;
The GLM Procedure Number of observations 400 The GLM Procedure Dependent Variable: api00 api 2000 Sum of Source DF Squares Mean Square F Value Pr > F
Model 5 6629929.872 1325985.974 361.86 <.0001 Error 394 1443742.126 3664.320 Corrected Total 399 8073671.998
R-Square Coeff Var Root MSE api00 Mean
0.821179 9.347054 60.53363 647.6225
Source DF Type I SS Mean Square F Value Pr > F
meals_low 1 6549825.145 6549825.145 1787.46 <.0001 Icollcat2 1 11385.768 11385.768 3.11 0.0787 Icollcat3 1 25740.884 25740.884 7.02 0.0084 Icolmeals2_low 1 115.990 115.990 0.03 0.8589 Icolmeals3_low 1 42862.086 42862.086 11.70 0.0007
Source DF Type III SS Mean Square F Value Pr > F
meals_low 1 5389132.969 5389132.969 1470.70 <.0001 Icollcat2 1 3693.531 3693.531 1.01 0.3160 Icollcat3 1 677.552 677.552 0.18 0.6674 Icolmeals2_low 1 58.655 58.655 0.02 0.8994 Icolmeals3_low 1 42862.086 42862.086 11.70 0.0007
Standard Parameter Estimate Error t Value Pr > |t|
comparisons group 1 v 2, m=28.4 11.094494 11.0505357 1.00 0.3160 pred value group 1, m=28.4 768.588540 8.3629162 91.90 <.0001 pred value group 2, m=28.4 779.683035 7.2232933 107.94 <.0001 comparisons group 3 vs 12, m=28.4 -3.851671 8.9572501 -0.43 0.6674 pred value group 1,1, m=28.4 774.135788 5.5252676 140.11 <.0001 pred value group 2, m=28.4 770.284116 7.0500883 109.26 <.0001
Standard Parameter Estimate Error t Value Pr > |t|
Intercept 772.8518972 4.36931324 176.88 <.0001 meals_low -3.8593532 0.10063563 -38.35 <.0001 Icollcat2 11.0944942 11.05053567 1.00 0.3160 Icollcat3 -3.8516714 8.95725011 -0.43 0.6674 Icolmeals2_low 0.0281506 0.22250143 0.13 0.8994 Icolmeals3_low 0.7948911 0.23241688 3.42 0.0007
Obtaining the exact same results using the GLM coding (and a class statement so that proc glm functions as proc glm and not as a proc reg).
proc glm data=elemapi2; class collcat; model api00 = meals collcat collcat*meals ; estimate 'slope of 2 v 1 at m=28.4' collcat -1 1 0 collcat*meals -28.4 28.4 0; estimate 'pred values, group 1, m=28.4' intercept 1 meals 28.4 collcat 1 0 0 collcat*meals 28.4 0 0; estimate 'pred values, group 2, m=28.4' intercept 1 meals 28.4 collcat 0 1 0 collcat*meals 0 28.4 0; estimate 'pred values, group 12, m=28.4' intercept 1 meals 28.4 collcat .5 .5 0 collcat*meals 14.2 14.2 0; estimate 'pred values, group 3, m=28.4' intercept 1 meals 28.4 collcat 0 0 1 collcat*meals 0 0 28.4; estimate 'slope of 3 v 12 at m=28.4' collcat -.5 -.5 1 collcat*meals -14.2 -14.2 28.4; run; quit;The GLM Procedure Class Level Information Class Levels Valuescollcat 3 1 2 3 Number of observations 400 The GLM Procedure Dependent Variable: api00 api 2000 Sum of Source DF Squares Mean Square F Value Pr > FModel 5 6629929.872 1325985.974 361.86 <.0001 Error 394 1443742.126 3664.320 Corrected Total 399 8073671.998R-Square Coeff Var Root MSE api00 Mean0.821179 9.347054 60.53363 647.6225Source DF Type I SS Mean Square F Value Pr > Fmeals 1 6549825.145 6549825.145 1787.46 <.0001 collcat 2 37126.652 18563.326 5.07 0.0067 meals*collcat 2 42978.076 21489.038 5.86 0.0031Source DF Type III SS Mean Square F Value Pr > Fmeals 1 5389132.969 5389132.969 1470.70 <.0001 collcat 2 14535.351 7267.676 1.98 0.1390 meals*collcat 2 42978.076 21489.038 5.86 0.0031Standard Parameter Estimate Error t Value Pr > |t|slope of 2 v 1 at m=28.4 11.094401 11.0510713 1.00 0.3160 pred values, group 1, m=28.4 768.602193 8.3633100 91.90 <.0001 pred values, group 2, m=28.4 779.696594 7.2236571 107.94 <.0001 pred values, group 12, m=28.4 774.149393 5.5255356 140.10 <.0001 pred values, group 3, m=28.4 770.295100 7.0505458 109.25 <.0001 slope of 3 v 12 at m=28.4 -3.854294 8.9577754 -0.43 0.6672
5.2 Simple Effects and Comparisons for meals=mean.
First, we generate a variable for meals that is shifted to be centered at the mean using proc sql. We also create new interaction variables
using the new variable for meals.
proc sql; create table mean as select *, meals - mean(meals) as meals_mean from elemapi2; quit; data mean; set mean; Icolmeals2_mean = Icollcat2*meals_mean; Icolmeals3_mean = Icollcat3*meals_mean; run;
Performing the regression using meals_mean and testing for the simple effects of collcat at meals=mean. Conclusion: The three groups of collcat are significantly different at meals=mean. The individual t-tests for Icollcat2 and Icollcat3, however, indicate that only the comparisons between group 3 and groups 1,2 is significant (p<.000).
proc reg data=mean; model api00=meals_mean Icollcat2 Icollcat3 Icolmeals2_mean Icolmeals3_mean; test: test Icollcat2=Icollcat3=0; run; quit;
The REG Procedure Model: MODEL1 Dependent Variable: api00 api 2000 Analysis of Variance Sum of Mean Source DF Squares Square F Value Pr > F
Model 5 6629930 1325986 361.86 <.0001 Error 394 1443742 3664.32012 Corrected Total 399 8073672 Root MSE 60.53363 R-Square 0.8212 Dependent Mean 647.62250 Adj R-Sq 0.8189 Coeff Var 9.34705
Parameter Estimates Parameter Standard Variable DF Estimate Error t Value Pr > |t|
Intercept 1 649.69337 3.12218 208.09 <.0001 meals_mean 1 -3.85935 0.10064 -38.35 <.0001 Icollcat2 1 11.99283 7.61738 1.57 0.1162 Icollcat3 1 21.51465 6.64932 3.24 0.0013 Icolmeals2_mean 1 0.02815 0.22250 0.13 0.8994 Icolmeals3_mean 1 0.79489 0.23242 3.42 0.0007
Test test Results for Dependent Variable api00 Mean Source DF Square F Value Pr > F
Numerator 2 23138 6.31 0.0020 Denominator 394 3664.32012
Looking at the simple comparisons, first of group 1 vs 2 and then for group 3 vs 1,2 using proc glm.
Note: We are using the regression coding and the proc glm is missing a class statement which means that proc glm is basically functioning as a proc reg--but it is a new an improved proc reg because now it has an estimate statement!!!!
proc glm data=mean; model api00 =meals_mean Icollcat2 Icollcat3 Icolmeals2_mean Icolmeals3_mean; estimate 'simple comparisons group 1 v 2, m=60.3' Icollcat2 1; estimate 'simple comparisons group 3 vs 12, m=60.3' Icollcat3 1; run; quit;
The GLM Procedure Number of observations 400 The GLM Procedure Dependent Variable: api00 api 2000 Sum of Source DF Squares Mean Square F Value Pr > F
Model 5 6629929.872 1325985.974 361.86 <.0001 Error 394 1443742.126 3664.320 Corrected Total 399 8073671.998
R-Square Coeff Var Root MSE api00 Mean 0.821179 9.347054 60.53363 647.6225
Source DF Type I SS Mean Square F Value Pr > F
meals_mean 1 6549825.145 6549825.145 1787.46 <.0001 Icollcat2 1 11385.768 11385.768 3.11 0.0787 Icollcat3 1 25740.884 25740.884 7.02 0.0084 Icolmeals2_mean 1 115.990 115.990 0.03 0.8589 Icolmeals3_mean 1 42862.086 42862.086 11.70 0.0007
Source DF Type III SS Mean Square F Value Pr > F
meals_mean 1 5389132.969 5389132.969 1470.70 <.0001 Icollcat2 1 9082.915 9082.915 2.48 0.1162 Icollcat3 1 38362.580 38362.580 10.47 0.0013 Icolmeals2_mean 1 58.655 58.655 0.02 0.8994 Icolmeals3_mean 1 42862.086 42862.086 11.70 0.0007
Standard Parameter Estimate Error t Value Pr > |t| comparisons group 1 v 2, m=60.3 11.9928275 7.61738092 1.57 0.1162 comparisons group 3 vs 12, m=60.3 21.5146549 6.64931923 3.24 0.0013
Standard Parameter Estimate Error t Value Pr > |t|
Intercept 649.6933723 3.12217544 208.09 <.0001 meals_mean -3.8593532 0.10063563 -38.35 <.0001 Icollcat2 11.9928275 7.61738092 1.57 0.1162 Icollcat3 21.5146549 6.64931923 3.24 0.0013 Icolmeals2_mean 0.0281506 0.22250143 0.13 0.8994 Icolmeals3_mean 0.7948911 0.23241688 3.42 0.0007
Obtaining the exact same results using the GLM coding (and a class statement so that proc glm functions as proc glm and not as a proc reg).
proc glm data=elemapi2; class collcat; model api00 = meals collcat collcat*meals ; estimate 'slope of 2 v 1 at m=60.3' collcat -1 1 0 collcat*meals -60.3 60.3 0; estimate 'slope of 3 v 12 at m=60.3' collcat -.5 -.5 1 collcat*meals -30.15 -30.15 60.3; run; quit;The GLM Procedure Class Level Information Class Levels Valuescollcat 3 1 2 3 Number of observations 400 The GLM Procedure Dependent Variable: api00 api 2000 Sum of Source DF Squares Mean Square F Value Pr > FModel 5 6629929.872 1325985.974 361.86 <.0001 Error 394 1443742.126 3664.320 Corrected Total 399 8073671.998R-Square Coeff Var Root MSE api00 Mean0.821179 9.347054 60.53363 647.6225Source DF Type I SS Mean Square F Value Pr > Fmeals 1 6549825.145 6549825.145 1787.46 <.0001 collcat 2 37126.652 18563.326 5.07 0.0067 meals*collcat 2 42978.076 21489.038 5.86 0.0031Source DF Type III SS Mean Square F Value Pr > Fmeals 1 5389132.969 5389132.969 1470.70 <.0001 collcat 2 14535.351 7267.676 1.98 0.1390 meals*collcat 2 42978.076 21489.038 5.86 0.0031Standard Parameter Estimate Error t Value Pr > |t| slope of 2 v 1 at m=60.3 11.992405 7.6178035 1.57 0.1162 slope of 3 v 12 at m=60.3 21.502731 6.6486489 3.23 0.0013
5.3 Simple Effects and Comparisons when Meals=mean+1 std
First, we generate a variable for meals that is shifted to be centered at one standard deviation above the mean using proc sql. We also create new interaction variables using the new variable for meals.
proc sql; create table high as select *, meals - ( mean(meals) + std(meals) ) as meals_high from elemapi2; quit; data high; set high; Icolmeals2_high = Icollcat2*meals_high; Icolmeals3_high = Icollcat3*meals_high; run;
Performing the regression using meals_mean and testing for the simple effects of collcat at meals=mean. Conclusion: The three groups of collcat are significantly different at meals=mean. The individual t-tests for Icollcat2 and Icollcat3 however indicate that only the comparison between group 3 and groups 1,2 is significant (p<.000).
proc reg data=high; model api00 =meals_high Icollcat2 Icollcat3 Icolmeals2_high Icolmeals3_high; test: test Icollcat2=Icollcat3=0; run; quit;
The REG Procedure Model: MODEL1 Dependent Variable: api00 api 2000 Analysis of Variance Sum of Mean Source DF Squares Square F Value Pr > F
Model 5 6629930 1325986 361.86 <.0001 Error 394 1443742 3664.32012 Corrected Total 399 8073672 Root MSE 60.53363 R-Square 0.8212 Dependent Mean 647.62250 Adj R-Sq 0.8189 Coeff Var 9.34705
Parameter Estimates Parameter Standard Variable DF Estimate Error t Value Pr > |t|
Intercept 1 526.53485 4.58606 114.81 <.0001 meals_high 1 -3.85935 0.10064 -38.35 <.0001 Icollcat2 1 12.89116 9.73478 1.32 0.1862 Icollcat3 1 46.88098 10.87258 4.31 <.0001 Icolmeals2_high 1 0.02815 0.22250 0.13 0.8994 Icolmeals3_high 1 0.79489 0.23242 3.42 0.0007
Test test Results for Dependent Variable api00 Mean Source DF Square F Value Pr > F
Numerator 2 38869 10.61 <.0001 Denominator 394 3664.32012
Looking at the simple comparisons, first of group 1 vs 2 and then for group 3 vs 1,2 using proc glm.
Note: We are using the regression coding and the proc glm is missing a class statement which means that proc glm is basically functioning as a proc reg--but it is a new an improved proc reg because now it has an estimate statement!!!!
proc glm data=high; model api00 =meals_high Icollcat2 Icollcat3 Icolmeals2_high Icolmeals3_high; estimate 'simple comparisons group 1 v 2, m=92.2' Icollcat2 1; estimate 'simple comparisons group 3 vs 12, m=92.2' Icollcat3 1; run; quit;
The GLM Procedure Number of observations 400 The GLM Procedure Dependent Variable: api00 api 2000 Sum of Source DF Squares Mean Square F Value Pr > F
Model 5 6629929.872 1325985.974 361.86 <.0001 Error 394 1443742.126 3664.320 Corrected Total 399 8073671.998
R-Square Coeff Var Root MSE api00 Mean
0.821179 9.347054 60.53363 647.6225
Source DF Type I SS Mean Square F Value Pr > F
meals_high 1 6549825.145 6549825.145 1787.46 <.0001 Icollcat2 1 11385.768 11385.768 3.11 0.0787 Icollcat3 1 25740.884 25740.884 7.02 0.0084 Icolmeals2_high 1 115.990 115.990 0.03 0.8589 Icolmeals3_high 1 42862.086 42862.086 11.70 0.0007
Source DF Type III SS Mean Square F Value Pr > F
meals_high 1 5389132.969 5389132.969 1470.70 <.0001 Icollcat2 1 6425.767 6425.767 1.75 0.1862 Icollcat3 1 68127.391 68127.391 18.59 <.0001 Icolmeals2_high 1 58.655 58.655 0.02 0.8994 Icolmeals3_high 1 42862.086 42862.086 11.70 0.0007
Standard Parameter Estimate Error t Value Pr > |t|
comparisons group 1 v 2, m=92.2 12.8911608 9.7347822 1.32 0.1862 comparisons group 3 vs 12, m=92.2 46.8809811 10.8725776 4.31 <.0001
Standard Parameter Estimate Error t Value Pr > |t|
Intercept 526.5348475 4.58605897 114.81 <.0001 meals_high -3.8593532 0.10063563 -38.35 <.0001 Icollcat2 12.8911608 9.73478216 1.32 0.1862 Icollcat3 46.8809811 10.87257762 4.31 <.0001 Icolmeals2_high 0.0281506 0.22250143 0.13 0.8994 Icolmeals3_high 0.7948911 0.23241688 3.42 0.0007
Obtaining the exact same results using the GLM coding (and a class statement so that proc glm functions as proc glm and not as a proc reg).
proc glm data=elemapi2; class collcat; model api00 = meals collcat collcat*meals ; estimate 'slope of 2 v 1 at m=92.2' collcat -1 1 0 collcat*meals -92.2 92.2 0; estimate 'slope of 3 v 12 at m=92.2' collcat -.5 -.5 1 collcat*meals -46.1 -46.1 92.2; run; quit;The GLM Procedure Class Level Information Class Levels Valuescollcat 3 1 2 3 Number of observations 400 The GLM Procedure Dependent Variable: api00 api 2000 Sum of Source DF Squares Mean Square F Value Pr > FModel 5 6629929.872 1325985.974 361.86 <.0001 Error 394 1443742.126 3664.320 Corrected Total 399 8073671.998R-Square Coeff Var Root MSE api00 Mean0.821179 9.347054 60.53363 647.6225Source DF Type I SS Mean Square F Value Pr > Fmeals 1 6549825.145 6549825.145 1787.46 <.0001 collcat 2 37126.652 18563.326 5.07 0.0067 meals*collcat 2 42978.076 21489.038 5.86 0.0031Source DF Type III SS Mean Square F Value Pr > Fmeals 1 5389132.969 5389132.969 1470.70 <.0001 collcat 2 14535.351 7267.676 1.98 0.1390 meals*collcat 2 42978.076 21489.038 5.86 0.0031Standard Parameter Estimate Error t Value Pr > |t|slope of 2 v 1 at m=92.2 12.8904091 9.7310376 1.32 0.1860 slope of 3 v 12 at m=92.2 46.8597567 10.8676142 4.31 <.0001
6.0 Simple effects, simple group and interaction comparisons, strategy 2
How to get all the all these comparisons from both proc reg and proc glm. proc reg only has a test statement. That means it will not give the estimate for the effect we are interested, only the significance test. For that reason, we have to switch to proc glm using its estimate statement.
Note1: .5*28.403 = 14.2015 and (1/3)*28.403=9.4676667, and (2/3)*28.403=18.935333.
Note2: For the interactions it is much more confusing because you have to pre-calculate all the correct coefficients. For example, the first interaction you can use (1*Icollcat2+ 60.315*Icolmeal2) - (1*Icollcat + 28.403*Icolmeal2) whereas in proc glm you have to reduce that to 31.912*Icolmeal2 in order to use it in an estimate statement. If you repeat the variables SAS will only recognize it the first time you use a variable and ignore it the other times.
Note: We are using the regression coding and the proc glm is missing a class statement which means that proc glm is basically functioning as a proc reg--but it is a new an improved proc reg because now it has an estimate statement!!!!
proc reg data=elemapi2; model api00 = meals Icollcat2 Icollcat3 Icolmeal2 Icolmeal3; low: test Icollcat2+28.403*Icolmeal2=0, Icollcat3+28.403*Icolmeal3=0; mean: test Icollcat2+60.315*Icolmeal2=0, Icollcat3+60.315*Icolmeal3=0; high: test Icollcat2+92.23*Icolmeal2=0, Icollcat3+92.23*Icolmeal3=0; run; quit; proc glm data=elemapi2; model api00 = meals Icollcat2 Icollcat3 Icolmeal2 Icolmeal3; estimate 'Group 1 v 2, meals=28.403' Icollcat2 1 Icolmeal2 28.403; estimate 'Predicted values, Group 1, m=28.403' intercept 1 Icollcat2 -.5 Icollcat3 -.3333333 meals 28.403 Icolmeal2 -14.2015 Icolmeal3 -9.4676667; estimate 'Predicted values, Group 2, m=28.403' intercept 1 Icollcat2 .5 Icollcat3 -.3333333 meals 28.403 Icolmeal2 14.2015 Icolmeal3 -9.4676667; estimate 'Group 3 v 12, meals=28.403' Icollcat3 1 Icolmeal3 28.403; estimate 'Predicted values, Group 12, m=28.403' intercept 1 Icollcat2 0 Icollcat3 -.3333333 meals 28.403 Icolmeal2 0 Icolmeal3 -9.4676667; estimate 'Predicted values, Group 1, m=28.403' intercept 1 Icollcat2 0 Icollcat3 .6666666667 meals 28.403 Icolmeal2 0 Icolmeal3 18.935333; estimate 'Group 1 v 2, meals=60.315' Icollcat2 1 Icolmeal2 60.315; estimate 'Group 3 v 12, meals=60.315' Icollcat3 1 Icolmeal3 60.315; estimate 'Group 1 v 2, meals=92.23' Icollcat2 1 Icolmeal2 92.23; estimate 'Group 3 v 12, meals=92.23' Icollcat3 1 Icolmeal3 92.23; estimate 'Interaction: group 1 v 2, m=mean v m=mean+1std' Icolmeal2 31.912; estimate 'Interaction: group 3 v 12, m=mean v m=mean+1std' Icolmeal3 31.912; run; quit;
The REG Procedure Model: MODEL1 Dependent Variable: api00 api 2000 Analysis of Variance Sum of Mean Source DF Squares Square F Value Pr > F
Model 5 6629930 1325986 361.86 <.0001 Error 394 1443742 3664.32012 Corrected Total 399 8073672 Root MSE 60.53363 R-Square 0.8212 Dependent Mean 647.62250 Adj R-Sq 0.8189 Coeff Var 9.34705
Parameter Estimates Parameter Standard Variable DF Estimate Error t Value Pr > |t|
Intercept 1 882.47026 6.69004 131.91 <.0001 meals 1 -3.85935 0.10064 -38.35 <.0001 Icollcat2 1 10.29492 16.24717 0.63 0.5267 Icollcat3 1 -26.42920 14.31193 -1.85 0.0655 Icolmeal2 1 0.02815 0.22250 0.13 0.8994 Icolmeal3 1 0.79489 0.23242 3.42 0.0007 Test low Results for Dependent Variable api00 Mean Source DF Square F Value Pr > F
Numerator 2 2346.39755 0.64 0.5277 Denominator 394 3664.32012
Test mean Results for Dependent Variable api00 Mean Source DF Square F Value Pr > F
Numerator 2 23138 6.31 0.0020 Denominator 394 3664.32012
Test high Results for Dependent Variable api00 Mean Source DF Square F Value Pr > F
Numerator 2 38869 10.61 <.0001 Denominator 394 3664.32012
The GLM Procedure Number of observations 400 The GLM Procedure Dependent Variable: api00 api 2000 Sum of Source DF Squares Mean Square F Value Pr > F
Model 5 6629929.872 1325985.974 361.86 <.0001 Error 394 1443742.126 3664.320 Corrected Total 399 8073671.998
R-Square Coeff Var Root MSE api00 Mean
0.821179 9.347054 60.53363 647.6225
Source DF Type I SS Mean Square F Value Pr > F
meals 1 6549825.145 6549825.145 1787.46 <.0001 Icollcat2 1 11385.768 11385.768 3.11 0.0787 Icollcat3 1 25740.884 25740.884 7.02 0.0084 Icolmeal2 1 115.990 115.990 0.03 0.8589 Icolmeal3 1 42862.086 42862.086 11.70 0.0007
Source DF Type III SS Mean Square F Value Pr > F
meals 1 5389132.969 5389132.969 1470.70 <.0001 Icollcat2 1 1471.242 1471.242 0.40 0.5267 Icollcat3 1 12495.833 12495.833 3.41 0.0655 Icolmeal2 1 58.655 58.655 0.02 0.8994 Icolmeal3 1 42862.086 42862.086 11.70 0.0007
Standard Parameter Estimate Error t Value Pr > |t|
Group 1 v 2, meals=28.403 11.094486 11.0505842 1.00 0.3160 Pred values, Group 1, m=28.403 768.589777 8.3629518 91.90 <.0001 Pred values, Group 2, m=28.403 779.684262 7.2233262 107.94 <.0001 Group 3 v 12, meals=28.403 -3.851909 8.9572977 -0.43 0.6674 Pred values, Group 12, m=28.403 774.137020 5.5252918 140.11 <.0001 Pred values, Group 1, m=28.403 770.285111 7.0501298 109.26 <.0001 Group 1 v 2, meals=60.315 11.992828 7.6173809 1.57 0.1162 Group 3 v 12, meals=60.315 21.514655 6.6493192 3.24 0.0013 Group 1 v 2, meals=92.23 12.891254 9.7352449 1.32 0.1862 Group 3 v 12, meals=92.23 46.883603 10.8731909 4.31 <.0001 Group 1 v 2, m=mean v m=mean+1std 0.898342 7.1004657 0.13 0.8994 Group 3 v 12, m=mean v m=mean+1std 25.366564 7.4168876 3.42 0.0007 Standard Parameter Estimate Error t Value Pr > |t|
Intercept 882.4702589 6.69003553 131.91 <.0001 meals -3.8593532 0.10063563 -38.35 <.0001 Icollcat2 10.2949246 16.24717093 0.63 0.5267 Icollcat3 -26.4292002 14.31192705 -1.85 0.0655 Icolmeal2 0.0281506 0.22250143 0.13 0.8994 Icolmeal3 0.7948911 0.23241688 3.42 0.0007
Obtaining the exact same results using the GLM coding (and a class statement so that proc glm functions as proc glm and not as a proc reg).
proc glm data=elemapi2; class collcat; model api00 = meals collcat collcat*meals ; estimate 'slope of 2 v 1 at m=28.4' collcat -1 1 0 collcat*meals -28.4 28.4 0; estimate 'pred values, group 1, m=28.4' intercept 1 meals 28.4 collcat 1 0 0 collcat*meals 28.4 0 0; estimate 'pred values, group 2, m=28.4' intercept 1 meals 28.4 collcat 0 1 0 collcat*meals 0 28.4 0; estimate 'slope of 3 v 12 at m=28.4' collcat -.5 -.5 1 collcat*meals -14.2 -14.2 28.4; estimate 'pred values, group 12, m=28.4' intercept 1 meals 28.4 collcat .5 .5 0 collcat*meals 14.2 14.2 0; estimate 'pred values, group 3, m=28.4' intercept 1 meals 28.4 collcat 0 0 1 collcat*meals 0 0 28.4; estimate 'slope of 2 v 1 at m=60.3' collcat -1 1 0 collcat*meals -60.3 60.3 0; estimate 'slope of 3 v 12 at m=60.3' collcat -.5 -.5 1 collcat*meals -30.15 -30.15 60.3; estimate 'slope of 2 v 1 at m=92.2' collcat -1 1 0 collcat*meals -92.2 92.2 0; estimate 'slope of 3 v 12 at m=92.2' collcat -.5 -.5 1 collcat*meals -46.1 -46.1 92.2; estimate 'slope of 2 v 1 at m=60.3 v m=28.4' collcat*meals -31.9 31.9 0; estimate 'slope of 3 v 12 at m=60.3 v m=28.4' collcat*meals -15.95 -15.95 31.9 ; run; quit;The GLM Procedure Class Level Information Class Levels Valuescollcat 3 1 2 3 Number of observations 400 The GLM Procedure Dependent Variable: api00 api 2000 Sum of Source DF Squares Mean Square F Value Pr > FModel 5 6629929.872 1325985.974 361.86 <.0001 Error 394 1443742.126 3664.320 Corrected Total 399 8073671.998R-Square Coeff Var Root MSE api00 Mean0.821179 9.347054 60.53363 647.6225Source DF Type I SS Mean Square F Value Pr > Fmeals 1 6549825.145 6549825.145 1787.46 <.0001 collcat 2 37126.652 18563.326 5.07 0.0067 meals*collcat 2 42978.076 21489.038 5.86 0.0031Source DF Type III SS Mean Square F Value Pr > Fmeals 1 5389132.969 5389132.969 1470.70 <.0001 collcat 2 14535.351 7267.676 1.98 0.1390 meals*collcat 2 42978.076 21489.038 5.86 0.0031Standard Parameter Estimate Error t Value Pr > |t|slope of 2 v 1 at m=28.4 11.094401 11.0510713 1.00 0.3160 pred values, group 1, m=28.4 768.602193 8.3633100 91.90 <.0001 pred values, group 2, m=28.4 779.696594 7.2236571 107.94 <.0001 slope of 3 v 12 at m=28.4 -3.854294 8.9577754 -0.43 0.6672 pred values, group 12, m=28.4 774.149393 5.5255356 140.10 <.0001 pred values, group 3, m=28.4 770.295100 7.0505458 109.25 <.0001 slope of 2 v 1 at m=60.3 11.992405 7.6178035 1.57 0.1162 slope of 3 v 12 at m=60.3 21.502731 6.6486489 3.23 0.0013 slope of 2 v 1 at m=92.2 12.890409 9.7310376 1.32 0.1860 slope of 3 v 12 at m=92.2 46.859757 10.8676142 4.31 <.0001 slope of 2 v 1 at m=60.3 v m=28.4 0.898004 7.0977957 0.13 0.8994 slope of 3 v 12 at m=60.3 v m=28.4 25.357025 7.4140986 3.42 0.0007
7.0 More on Predicted Values
To be expanded!
The content of this web site should not be construed as an endorsement of any particular web site, book, or software product by the University of California.