[R] Setting contrasts

David C. Howell David.Howell at uvm.edu
Tue Dec 3 02:41:26 CET 2013


I have been having trouble understanding the difference between 
"contrasts(Group) <- contr.sum" and options(contrasts = 
c("contr.sum","contr.poly"). They both seem to say that they have done 
what I want, but only the latter works.

The reason why the question arises is tha,t using Fox's Anova, it is 
important to use sum contrasts. So I wrote the following code, with the 
result commented in.


# Start R from scratch in case old contrasts are left over  --They aren't
#removed with rm()
# Note that the data are balanced, so almost any solution SHOULD give 
the same
#result.
Eysenck <- 
read.table("http://www.uvm.edu/~dhowell/methods7/DataFiles/Tab13-2.dat",
  header = TRUE)
Eysenck$subj <- factor(1:100)
Eysenck$Condition <- factor(Eysenck$Condition, levels = 1:5, labels = 
c("Counting",
      "Rhyming", "Adjective", "Imagery","Intention"))
Eysenck$Age <- factor(Eysenck$Age, levels = 1:2, labels = c("Old","Young"))
attach(Eysenck)
result <- anova(aov(Recall~Condition*Age, data = Eysenck))
print(result)      # This is the correct result
             #Analysis of Variance Table
#
       #      Response: Recall
       #                                 Df  Sum Sq Mean Sq F value Pr(>F)
       #      Condition           4 1514.94  378.73 47.1911 < 2.2e-16 ***
       #      Age                     1  240.25  240.25 29.9356 
3.981e-07 ***
       #      Condition:Age   4  190.30   47.57  5.9279 0.0002793 ***
       #      Residuals         90  722.30 8.03
getOption("contrasts")
       #              unordered ordered
       #      "contr.treatment" "contr.poly"
#Note that these are the default treatment contrasts--bad, bad, but OK 
here.

# Leave the contrasts alone for now
library(car)
resultsCar1 <- lm(Recall~Age*Condition, data = Eysenck )
type2 <- Anova(resultsCar1, type = "II")     #This is OK, but the next 
is very  wrong
print(type2)
       #Anova Table (Type II tests)
       #type2 <- Anova(resultsCar1, type = "III")
       #Response: Recallprint(type2)
       #               Sum Sq Df F value Pr(>F)
       #Age                 240.25  1 29.9356 3.981e-07 ***
       #Condition     1514.94  4 47.1911 < 2.2e-16 ***
       #Age:Condition 190.30  4  5.9279 0.0002793 ***
       #Residuals      722.30 90

resultsCar2 <- lm(Recall~Age*Condition, data = Eysenck )
type3 <- Anova(resultsCar1, type = "III")
print(type3)   #  This is still wrong --Fox says I need sum contrasts
         #Anova Table (Type III tests)
       #  contrasts(Condition) <- contr.sum
       #  Response: Recallcontrasts(Age) <- contr.sum
       #                        Sum Sq Df F value Pr(>F)
       #  (Intercept)    490.00  1 61.0550  9.85e-12 ***
       #  Age                     1.25  1  0.1558 0.6940313
       #  Condition      351.52  4 10.9500  2.80e-07 ***    # Hmmm! why 
do we still have treatment contrasts
       #  Age:Condition 190.30  4  5.9279 0.0002793 ***## No LUCK!!
       #  Residuals    722.30 90
getOption("contrasts")
       #  unordered ordered
       #"contr.treatment" "contr.poly"
contrasts(Condition) <- contr.sum
contrasts(Age) <- contr.sum
contrasts(Condition); contrasts(Age)
    #Yup, we see sum contrasts!
       #          [,1] [,2] [,3] [,4]
       #Counting     1    0    0 0
       #Rhyming      0    1    0 0
       #Adjective    0    0    1 0
       #Imagery      0    0    0 1
       #Intention   -1   -1   -1 -1
       # [,1]
       #Old 1
       #Young -1
# BUT!!
resultsCar3 <- lm(Recall~Age*Condition, data = Eysenck )
type3 <- Anova(resultsCar3, type = "III")
print(type3)
       #Anova Table (Type III tests)
#
       #Response: Recall
       #                       Sum Sq Df F value Pr(>F)
       #(Intercept)     490.00  1 61.0550  9.85e-12 ***
       #Age                     1.25  1  0.1558 0.6940313
       #Condition      351.52  4 10.9500  2.80e-07 ***
       #Age:Condition 190.30  4  5.9279 0.0002793 ***
       #Residuals    722.30 90

##Damn! We are still wrong even though the above shows sum contrasts

## So we do it another way
options(contrasts = c("contr.sum","contr.poly"))
getOption("contrasts")
      #[1] "contr.sum" "contr.poly"
resutsCar4 <- lm(Recall~Age*Condition, data = Eysenck )
type4 <- Anova(resultsCar4, type = "III")
       #print(type4)  # Now we're back where we should be
       #Anova Table (Type III tests)
#
       #Response: Recall
       #                      Sum Sq Df   F value Pr(>F)
       #(Intercept)   13479.2  1 1679.5361 < 2.2e-16 ***
       #Age               240.2  1   29.9356 3.981e-07 ***
       #Condition      1514.9  4   47.1911 < 2.2e-16 ***
       #Age:Condition  190.3  4    5.9279 0.0002793 ***
       #Residuals       722.3 90
## Now it works just fine.
##So what is the difference between setting contrasts individuall and 
setting
##them through the options?

I get similar results if I use drop1, but perhaps that is what Fox did 
also.



More information about the R-help mailing list