[R] Regression with factor having1 level
peter dalgaard
pdalgd at gmail.com
Fri Mar 11 23:07:23 CET 2016
> On 11 Mar 2016, at 17:56 , David Winsemius <dwinsemius at comcast.net> wrote:
>
>>
>> On Mar 11, 2016, at 12:48 AM, peter dalgaard <pdalgd at gmail.com> wrote:
>>
>>
>>> 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
>
> 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:
You're missing the point: model.matrix has a beef with 1-level factors, not with 2-level factors of which one level happens to be absent, which is what this thread was originally about. It is lm that via model.frame with drop.unused.levels=TRUE converts the latter factors to the former.
-pd
>
>> 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 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
>>
>>
>>
>>
>>
>>
>>
>>
>>
>
> David Winsemius
> Alameda, CA, USA
--
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