尽管有两个水平,但对比只能应用于具有两个或更多水平的因素[重复]
Posted
技术标签:
【中文标题】尽管有两个水平,但对比只能应用于具有两个或更多水平的因素[重复]【英文标题】:contrasts can be applied only to factors with 2 or more levels in spite of having two levels [duplicate] 【发布时间】:2015-07-23 17:33:36 【问题描述】:我正在尝试线性回归并观察到,尽管我的所有因子列都至少有两个水平,但我得到了这个错误。
我找到了给我这个错误的列,这是该列的摘要
> summary(df[,30])
0 1 <NA>
31543 14 0
> unique(df[,30])
[1] 0 1
Levels: 0 1 <NA>
我还通过执行以下操作消除了所有具有 NA 值的行
df = na.omit(df)
请注意,上面的 NA 是我使用 addNA 函数添加的附加因子水平。
我该如何解决这个问题?
编辑: 我在 http://aftabubuntu.cloudapp.net/ 上的公开分享中放置了一个可重现的示例。请从这里下载reproduce.RDS文件。
这是我正在使用的代码
df = readRDS('reproduce.RDS')
model = lm(formula = COL_101~.,data=traindf)
predict.lm(model, df[1:5,])
这是我的输出
> model = lm(formula = COL_101~.,data=df)
Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) :
contrasts can be applied only to factors with 2 or more levels
【问题讨论】:
你必须给我们一些可重现的东西;除了您在此处描述的内容之外,还有其他事情正在发生。我会举一个反例作为答案。 @Aaron 我明白了,让我试着创造一些你可以复制的东西 请在how to make a great reproducible example 上查看此问题以获取建议。 好的,我偷看了,即使它在另一个网站上。首先,您有 100 个观察值和 104 个预测变量,所以这甚至不是明智之举。其次,运行na.omit
后,您的摘要行不在数据集中;该数据集只有 13 个观测值。请参阅上面的链接以获取有关如何制作出色的可重现示例的建议;如果您遵循该建议,您会注意到这一点。
@PepperBoy,你还记得你是怎么解决这个问题的吗?
【参考方案1】:
这不是一个完整的答案,尽管可能是,如果它证明了这个问题。我可以重新创建看起来像你的数据,但它是有效的,如下所示。
set.seed(5)
df <- data.frame(y=rnorm(100), x=addNA(rep(c(0,1), c(80,20))))
table(df$x)
## 0 1 <NA>
## 80 20 0
lm(y~x, data=df)
## Call:
## lm(formula = y ~ x, data = df)
##
## Coefficients:
## (Intercept) x1
## 0.007601 0.120172
【讨论】:
我在编辑中提到的公共共享中放置了一个可重现的示例。请参阅我上面的编辑。 为了后代,最好不要依赖其他网站上发布的数据或信息。您可以将其简化为最简单的情况并在此处发布吗?以上是关于尽管有两个水平,但对比只能应用于具有两个或更多水平的因素[重复]的主要内容,如果未能解决你的问题,请参考以下文章
使用具有 2 个或更多水平的因素运行(混合模型)回归时,错误“对比只能应用于具有 2 个或更多水平的因素”
回归在输入变量之一上给出错误“对比只能应用于具有2个或更多水平的因素”[重复]
使用 lm 构建回归模型时出错(`对比<-`中的错误(`*tmp*`...对比只能应用于具有2个或更多级别的因素)[重复]
`contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) 中的错误:对比只能应用于具有 2 个或更多级别的因子