> On Mar 11, 2016, at 12:48 AM, peter dalgaard <pda...@gmail.com> wrote:
> 
> 
>> On 11 Mar 2016, at 08:25 , David Winsemius <dwinsem...@comcast.net> wrote:
>>> 
> ...
>>>> dfrm <- data.frame(y=rnorm(10), x1=rnorm(10) ,x2=as.factor(TRUE), 
>>>> x3=rnorm(10))
>>>> lm(y~x1+x2+x3, dfrm, na.action=na.exclude)
>>> Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
>>> contrasts can be applied
>> 
>> Yes, and the error appears to come from `model.matrix`:
>> 
>>> model.matrix(y~x1+factor(x2)+x3, dfrm)
>> Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
>> contrasts can be applied only to factors with 2 or more levels
>> 
> 
> Actually not. The above is because you use an explicit factor(x2). The actual 
> smoking gun is this line in lm()
> 
> mf$drop.unused.levels <- TRUE

It's possible that modifying model.matrix to allow single level factors would 
then bump up against that check, but  at the moment the traceback() from an 
error generated with data that has a single level factor and no call to factor 
in the formula still implicates code in model.matrix:

> dfrm <- data.frame(y=rnorm(10), x1=rnorm(10) ,x2=factor(TRUE), x3=rnorm(10))
> lm(y~x1+x2+x3, dfrm)
Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
  contrasts can be applied only to factors with 2 or more levels
> traceback()
5: stop("contrasts can be applied only to factors with 2 or more levels")
4: `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]])
3: model.matrix.default(mt, mf, contrasts)
2: model.matrix(mt, mf, contrasts)
1: lm(y ~ x1 + x2 + x3, dfrm)

-- 
David.

> 
> which someone must have thought was a good idea at some point....
> 
> model.matrix itself is quite happy to leave factors alone and let subsequent 
> code sort out any singularities, e.g.
> 
>> model.matrix(y~x1+x2, data=df[1:2,])
>  (Intercept) x1 x2B
> 1           1  1   0
> 2           1  1   0
> attr(,"assign")
> [1] 0 1 2
> attr(,"contrasts")
> attr(,"contrasts")$x2
> [1] "contr.treatment"
> 
> 
> 
>>> model.matrix(y~x1+x2+x3, dfrm)
>>  (Intercept)          x1 x2TRUE         x3
>> 1            1  0.04887847      1 -0.4199628
>> 2            1 -1.04786688      1  1.3947923
>> 3            1 -0.34896007      1 -2.1873666
>> 4            1 -0.08866061      1  0.1204129
>> 5            1 -0.41111366      1 -1.6631057
>> 6            1 -0.83449110      1  1.1631801
>> 7            1 -0.67887823      1  0.3207544
>> 8            1 -1.12206068      1  0.6012040
>> 9            1  0.05116683      1  0.3598696
>> 10           1  1.74413583      1  0.3608478
>> attr(,"assign")
>> [1] 0 1 2 3
>> attr(,"contrasts")
>> attr(,"contrasts")$x2
>> [1] "contr.treatment"
>> 
>> -- 
>> 
>> David Winsemius
>> Alameda, CA, USA
>> 
>> ______________________________________________
>> R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> 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.
> 
> -- 
> Peter Dalgaard, Professor,
> Center for Statistics, Copenhagen Business School
> Solbjerg Plads 3, 2000 Frederiksberg, Denmark
> Phone: (+45)38153501
> Office: A 4.23
> Email: pd....@cbs.dk  Priv: pda...@gmail.com
> 
> 
> 
> 
> 
> 
> 
> 
> 

David Winsemius
Alameda, CA, USA

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
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.

Reply via email to