[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