From pdalgd at gmail.com  Wed Apr 21 22:26:08 2010
From: pdalgd at gmail.com (Peter Dalgaard)
Date: Wed, 21 Apr 2010 22:26:08 +0200
Subject: [Rd] Bugs? when dealing with contrasts
In-Reply-To: <l2u971536df1004211100q9beecbep1bceb5bbbd3b8175@mail.gmail.com>
References: <l2u971536df1004211100q9beecbep1bceb5bbbd3b8175@mail.gmail.com>
Message-ID: <4BCF5F60.7020203@gmail.com>

Gabor Grothendieck wrote:
> R version 2.10.1 (2009-12-14)
> Copyright (C) 2009 The R Foundation for Statistical Computing
> ISBN 3-900051-07-0
> 
> R is free software and comes with ABSOLUTELY NO WARRANTY.
> You are welcome to redistribute it under certain conditions.
> Type 'license()' or 'licence()' for distribution details.
> 
>   Natural language support but running in an English locale
> 
> R is a collaborative project with many contributors.
> Type 'contributors()' for more information and
> 'citation()' on how to cite R or R packages in publications.
> Below are two cases where I don't seem to be getting contr.sum
> contrasts even though they were specified.  Are these bugs?
> 
> The first case is an interaction between continuous and factor variables.
> 
> The second case contrasts= was specified as an arg to lm.  The second
> works ok if we set the contrasts through options but not if we set it
> through an lm argument.

In case #2, I think you just failed to read the help page.

> model.matrix(~fac, contrasts=list(fac="contr.sum"))
   (Intercept) fac1 fac2
1            1    1    0
2            1    1    0
3            1    1    0
4            1    1    0
5            1    1    0
6            1    0    1
7            1    0    1
8            1    0    1
9            1    0    1
10           1    0    1
11           1   -1   -1
12           1   -1   -1
13           1   -1   -1
14           1   -1   -1
15           1   -1   -1
attr(,"assign")
[1] 0 1 1
attr(,"contrasts")
attr(,"contrasts")$fac
[1] "contr.sum"

As for case #1, the rules are tricky in cases where interactions are
present without main effects, but AFAICS, what you observe is
essentially the same effect as

> model.matrix(~fac-1, contrasts=list(fac="contr.sum"))
   fac1 fac2 fac3
1     1    0    0
2     1    0    0
3     1    0    0
4     1    0    0
5     1    0    0
6     0    1    0
7     0    1    0
8     0    1    0
9     0    1    0
10    0    1    0
11    0    0    1
12    0    0    1
13    0    0    1
14    0    0    1
15    0    0    1
attr(,"assign")
[1] 1 1 1
attr(,"contrasts")
attr(,"contrasts")$fac
[1] "contr.sum"


I.e., that R reverts to using indicator variables when the intercept is
absent.

> 
>> # 1. In this case I don't seem to be getting contr.sum contrasts:
>>
>> options(contrasts = c("contr.sum", "contr.poly"))
>> getOption("contrasts")
> [1] "contr.sum"  "contr.poly"
>> scores <- rep(seq(-2, 2), 3); scores
>  [1] -2 -1  0  1  2 -2 -1  0  1  2 -2 -1  0  1  2
>> fac <- gl(3, 5); fac
>  [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
> Levels: 1 2 3
>> # I get this:
>> model.matrix(~ scores:fac)
>    (Intercept) scores:fac1 scores:fac2 scores:fac3
> 1            1          -2           0           0
> 2            1          -1           0           0
> 3            1           0           0           0
> 4            1           1           0           0
> 5            1           2           0           0
> 6            1           0          -2           0
> 7            1           0          -1           0
> 8            1           0           0           0
> 9            1           0           1           0
> 10           1           0           2           0
> 11           1           0           0          -2
> 12           1           0           0          -1
> 13           1           0           0           0
> 14           1           0           0           1
> 15           1           0           0           2
> attr(,"assign")
> [1] 0 1 1 1
> attr(,"contrasts")
> attr(,"contrasts")$fac
> [1] "contr.sum"
> 
>> # But I was expecting this since I am using contr.sum
>> cbind(1, model.matrix(~ fac)[,2:3] * scores)
>      fac1 fac2
> 1  1   -2    0
> 2  1   -1    0
> 3  1    0    0
> 4  1    1    0
> 5  1    2    0
> 6  1    0   -2
> 7  1    0   -1
> 8  1    0    0
> 9  1    0    1
> 10 1    0    2
> 11 1    2    2
> 12 1    1    1
> 13 1    0    0
> 14 1   -1   -1
> 15 1   -2   -2
>>
>> # 2.
>> # here I don't get contr.sum but rather get contr.treatment
>> options(contrasts = c("contr.treatment", "contr.poly"))
>> getOption("contrasts")
> [1] "contr.treatment" "contr.poly"
>> model.matrix(lm(seq(15) ~ fac, contrasts = c("contr.sum", "contr.poly")))
>    (Intercept) fac2 fac3
> 1            1    0    0
> 2            1    0    0
> 3            1    0    0
> 4            1    0    0
> 5            1    0    0
> 6            1    1    0
> 7            1    1    0
> 8            1    1    0
> 9            1    1    0
> 10           1    1    0
> 11           1    0    1
> 12           1    0    1
> 13           1    0    1
> 14           1    0    1
> 15           1    0    1
> attr(,"assign")
> [1] 0 1 1
> attr(,"contrasts")
> attr(,"contrasts")$fac
> [1] "contr.treatment"
> 
>> model.matrix(lm(seq(15) ~ fac)) # same
>    (Intercept) fac2 fac3
> 1            1    0    0
> 2            1    0    0
> 3            1    0    0
> 4            1    0    0
> 5            1    0    0
> 6            1    1    0
> 7            1    1    0
> 8            1    1    0
> 9            1    1    0
> 10           1    1    0
> 11           1    0    1
> 12           1    0    1
> 13           1    0    1
> 14           1    0    1
> 15           1    0    1
> attr(,"assign")
> [1] 0 1 1
> attr(,"contrasts")
> attr(,"contrasts")$fac
> [1] "contr.treatment"
> 
>> # I was expecting the first one to give me this
>> options(contrasts = c("contr.sum", "contr.poly"))
>> model.matrix(lm(seq(15) ~ fac))
>    (Intercept) fac1 fac2
> 1            1    1    0
> 2            1    1    0
> 3            1    1    0
> 4            1    1    0
> 5            1    1    0
> 6            1    0    1
> 7            1    0    1
> 8            1    0    1
> 9            1    0    1
> 10           1    0    1
> 11           1   -1   -1
> 12           1   -1   -1
> 13           1   -1   -1
> 14           1   -1   -1
> 15           1   -1   -1
> attr(,"assign")
> [1] 0 1 1
> attr(,"contrasts")
> attr(,"contrasts")$fac
> [1] "contr.sum"
> 
>> R.version.string
> [1] "R version 2.10.1 (2009-12-14)"
>> win.version()
> [1] "Windows Vista (build 6002) Service Pack 2"
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel


-- 
Peter Dalgaard
Center for Statistics, Copenhagen Business School
Phone: (+45)38153501
Email: pd.mes at cbs.dk  Priv: PDalgd at gmail.com



[Rd] Bugs? when dealing with contrasts
Peter Dalgaard