Hi David,

You attach the dataset, which creates a copy of it.  You set the contrasts
on the copy, but in your models, you reference the dataset explicitly.  You
should set the contrasts directly in the data (and for your sake and your
students, would encourage not using attach() ).

contrasts(Eysenck$Condition) <- contr.sum

Setting the global option works because it applies to everything R does, so
even the dataset where contrasts were not set.

Cheers,

Josh




On Mon, Dec 2, 2013 at 5:41 PM, David C. Howell <David.Howell@uvm.edu>wrote:

> 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.
>



-- 
Joshua Wiley
Ph.D. Student, Health Psychology
University of California, Los Angeles
http://joshuawiley.com/
Senior Analyst - Elkhart Group Ltd.
http://elkhartgroup.com

	[[alternative HTML version deleted]]

