Take the 2-minute tour ×
Cross Validated is a question and answer site for people interested in statistics, machine learning, data analysis, data mining, and data visualization. It's 100% free, no registration required.

Please provide R code which allows one to conduct a between-subjects ANOVA with -3, -1, 1, 3 contrasts. I understand there is a debate regarding the appropriate Sum of Squares (SS) type for such an analysis. However, as the default type of SS used in SAS and SPSS (Type III) is considered the standard in my area. Thus I would like the results of this analysis to match perfectly what is generated by those statistics programs. To be accepted an answer must directly call aov(), but other answers may be voted up (espeically if they are easy to understand/use).

sample.data <- data.frame(IV=rep(1:4,each=20),DV=rep(c(-3,-3,1,3),each=20)+rnorm(80))

Edit: Please note, the contrast I am requesting is not a simple linear or polynomial contrast but is a contrast derived by a theoretical prediction, i.e. the type of contrasts discussed by Rosenthal and Rosnow.

share|improve this question
I understand that you need Type III sum, but this (stats.ox.ac.uk/pub/MASS3/Exegeses.pdf) article is a good read. It illustrates some interesting points. –  suncoolsu Nov 15 '10 at 19:03
Concerning your question you might be interested in the following discussion: stats.stackexchange.com/questions/60362/… The choice between ANOVA type I, II, and III is not as easy as it seems. –  phx Jun 8 '14 at 19:15
Upvoted your question as useful in that it provoked several learned responses, but I also note that you agreed with the respondent who basically said that the premise of the question was incorrect. I hope I am summarizing StaGuy's position as saying defined contrasts were by definition "type I" and discussion of other types only became relevant when assessing partial regression statistics, presumably most important when letting "the machine do the driving" using automated methods. –  DWin May 11 at 18:10
@DWin: I'm not sure I entirely follow you. One can legitimately use other types of SS without letting the 'machine do the driving' (at least as I understand that phrase). I might be a bit rusty here, but if memory serves, other types can be relevant when not using partial regression. For example, Type III SS doesn't partial the main effects out of the interaction. The distinction between the types matters there precisely because Type III doesn't partial whereas Type I does. The problem as stated included only a single contrast and therefore the distinction between types of SS was/is moot. –  rpierce May 11 at 18:37
My understanding was that the rationale given by SAS for choosing type III SSS (and this seems to be why people thinks that type-III is preferred) is that it better supports the backward and forward selection process. –  DWin May 11 at 19:18

5 Answers 5

up vote 14 down vote accepted

Type III sum of squares for ANOVA are readily available through the Anova() function from the car package.

Contrast coding can be done in several ways, using C(), the contr.* family (as indicated by @nico), or directly the contrasts() function/argument. This is detailed in §6.2 (pp. 144-151) of Modern Applied Statistics with S (Springer, 2002, 4th ed.). Note that aov() is just a wrapper function for the lm() function. It is interesting when one wants to control the error term of the model (like in a within-subject design), but otherwise they both yield the same results (and whatever the way you fit your model, you still can output ANOVA or LM-like summaries with summary.aov or summary.lm).

I don't have SPSS to compare the two outputs, but something like

> library(car)
> sample.data <- data.frame(IV=factor(rep(1:4,each=20)),
> Anova(lm1 <- lm(DV ~ IV, data=sample.data, 
                  contrasts=list(IV=contr.poly)), type="III")
Anova Table (Type III tests)

Response: DV
            Sum Sq Df F value    Pr(>F)    
(Intercept)  18.08  1  21.815  1.27e-05 ***
IV          567.05  3 228.046 < 2.2e-16 ***
Residuals    62.99 76                      
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

is worth to try in first instance.

About factor coding in R vs. SAS: R considers the baseline or reference level as the first level in lexicographic order, whereas SAS considers the last one. So, to get comparable results, either you have to use contr.SAS() or to relevel() your R factor.

share|improve this answer
I don't think this answer uses the -3,-1,1,3 contrast I specified nor does it seem to provide a 1 df test of the contrast. –  rpierce Nov 15 '10 at 21:33
@drknexus Yes, you're right. Wrote too quickly. Something like Anova(lm(DV ~ C(IV, c(-3,-1,1,3),1), data=sample.data), type="III") should be better. Please let me know if this ok with you. –  chl Nov 15 '10 at 22:23
Thanks! That looks okay I'll validate it against SPSS tomorrow and get back to you. –  rpierce Nov 15 '10 at 22:35
BTW, have a look at the ez package (cran.r-project.org/web/packages/ez/index.html) for wrapping the Anova code... –  Tal Galili Nov 16 '10 at 12:45
@drknexus: If only there were a feature request & issues submission page for ez... github.com/mike-lawrence/ez/issues :) –  Mike Lawrence Sep 15 '11 at 10:50

You may want to have a look at this blog post:

Obtaining the same ANOVA results in R as in SPSS - the difficulties with Type II and Type III sums of squares

(Spoiler: add options(contrasts=c("contr.sum", "contr.poly")) at the beginning of your script)

share|improve this answer

This may look like a bit of self-promotion (and I suppose it is). But I developed an lsmeans package for R (available on CRAN) that is designed to handle exactly this sort of situation. Here is how it works for your example:

> sample.data <- data.frame(IV=rep(1:4,each=20),DV=rep(c(-3,-3,1,3),each=20)+rnorm(80))
> sample.aov <- aov(DV ~ factor(IV), data = sample.data)

> library("lsmeans")
> (sample.lsm <- lsmeans(sample.aov, "IV"))
 IV    lsmean        SE df   lower.CL  upper.CL
  1 -3.009669 0.2237448 76 -3.4552957 -2.564043
  2 -3.046072 0.2237448 76 -3.4916980 -2.600445
  3  1.147080 0.2237448 76  0.7014539  1.592707
  4  3.049153 0.2237448 76  2.6035264  3.494779

> contrast(sample.lsm, list(mycon = c(-3,-1,1,3)))
 contrast estimate       SE df t.ratio p.value
 mycon    22.36962 1.000617 76  22.356  <.0001

You could specify additional contrasts in the list if you like. For this example, you'll get the same results with the built-in linear polynomial contrast:

> contrast(sample.lsm, "poly")
 contrast   estimate        SE df t.ratio p.value
 linear    22.369618 1.0006172 76  22.356  <.0001
 quadratic  1.938475 0.4474896 76   4.332  <.0001
 cubic     -6.520633 1.0006172 76  -6.517  <.0001

To confirm this, note that the "poly" specification directs it to call poly.lsmc, which produces these results:

> poly.lsmc(1:4)
  linear quadratic cubic
1     -3         1    -1
2     -1        -1     3
3      1        -1    -3
4      3         1     1
share|improve this answer

When you are doing contrasts, you are doing a specific, stated linear combination of cell means within the context of the appropriate error term. As such, the concept of "Type of SS" is not meaningful with contrasts. Each contrast is essentially the first effect using a Type I SS. "Type of SS" has to do with what is partialled out or accounted for by the other terms. For contrasts, nothing is partialled out or accounted for. The contrast stands by itself.

share|improve this answer
You are absolutely right. –  rpierce Jan 31 '13 at 0:36

Try the Anova command in the car library. Use the type="III" argument, as it defaults to type II. For example:

mod <- lm(conformity ~ fcategory*partner.status, data=Moore, contrasts=list(fcategory=contr.sum, partner.status=contr.sum))
Anova(mod, type="III")
share|improve this answer
I know Moore is in the car library, but When sample data is provided it is easier for the question asker to understand your response if you use the sample data. –  rpierce Nov 15 '10 at 21:23

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.