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.

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to