[R] Regression with factor having1 level
peter dalgaard
pdalgd at gmail.com
Fri Mar 11 09:48:40 CET 2016
> On 11 Mar 2016, at 08:25 , David Winsemius <dwinsemius at 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
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 at 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.mes at cbs.dk Priv: PDalgd at gmail.com
More information about the R-help
mailing list