[R] Contrast specified with C() - R vs S-Plus problem

Prof Brian Ripley ripley at stats.ox.ac.uk
Wed Oct 8 14:51:29 CEST 2003


On Wed, 8 Oct 2003, Pascal A. Niklaus wrote:

> Hi,
> 
> For a n-level factor, I'd like to specify the first contrast and have
> the remaining n-2 constructed automatically so that the set is
> orthogonal. I then test the contrasts with summary.lm(anova-object).
> 
> In S-Plus, the following works:
> 
>     >y.anova <- aov( y ~ C(CO2,c(1,0,-1)) )
>     >summary.lm(y.anova)

I can't reproduce that in S-PLUS 6.1, and it is not as documented:

   contr
          what contrasts to use. May be one of four standard names ( helmert,
          poly, treatment, or sum), a function, or a matrix with as many rows as
          there are levels to the factor.

You haven't given a matrix, and your vector gets converted to a 3x1 
matrix when there are four levels.  I suspect you have not got the same 
data in S-PLUS and R, but you haven't given us anything to check that.


> In R, it fails with the following error:
> 
>     >levels(CO2)
>     [1] ""  "A" "C" "E"
> 
>     >y.anova <- aov(y + C(CO2,c(1,0,-1)) )
>     Error in "contrasts<-"(*tmp*, value = contr) :
>             wrong number of contrast matrix rows
> 
> What is the way to do this in R?

There are four levels, so

> CO2 <- factor(c("", "A", "C", "E"))
> attributes(C(CO2, as.matrix(1:4)))
$levels
[1] ""  "A" "C" "E"

$class
[1] "factor"

$contrasts
  [,1]       [,2]       [,3]
     1  0.0236068  0.5472136
A    2 -0.4393447 -0.7120227
C    3  0.8078689 -0.2175955
E    4 -0.3921311  0.3824045

does as you ask.

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595




More information about the R-help mailing list