首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中定义线性模型时的对比误差

在R中定义线性模型时的对比误差
EN

Stack Overflow用户
提问于 2013-08-11 11:04:47
回答 9查看 220.8K关注 0票数 60

当我试图在R中定义线性模型时,如下所示:

代码语言:javascript
复制
lm1 <- lm(predictorvariable ~ x1+x2+x3, data=dataframe.df)

我收到以下错误消息:

代码语言:javascript
复制
Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
contrasts can be applied only to factors with 2 or more levels 

有什么办法可以忽略它或者修复它吗?有些变量是因素,有些则不是。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2013-08-11 11:12:30

如果您的自变量(RHS变量)是一个只接受一个值的因素或字符,则会发生该类型的错误。

实例:R中的iris数据

代码语言:javascript
复制
(model1 <- lm(Sepal.Length ~ Sepal.Width + Species, data=iris))

# Call:
# lm(formula = Sepal.Length ~ Sepal.Width + Species, data = iris)

# Coefficients:
#       (Intercept)        Sepal.Width  Speciesversicolor   Speciesvirginica  
#            2.2514             0.8036             1.4587             1.9468  

现在,如果你的数据只有一个物种:

代码语言:javascript
复制
(model1 <- lm(Sepal.Length ~ Sepal.Width + Species,
              data=iris[iris$Species == "setosa", ]))
# Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
#   contrasts can be applied only to factors with 2 or more levels

如果变量是数值(Sepal.Width),但只取单个值(例如3 ),则模型将运行,但您将获得NA作为该变量的系数,如下所示:

代码语言:javascript
复制
(model2 <-lm(Sepal.Length ~ Sepal.Width + Species,
             data=iris[iris$Sepal.Width == 3, ]))

# Call:
# lm(formula = Sepal.Length ~ Sepal.Width + Species, 
#    data = iris[iris$Sepal.Width == 3, ])

# Coefficients:
#       (Intercept)        Sepal.Width  Speciesversicolor   Speciesvirginica  
#             4.700                 NA              1.250              2.017

解决方案:只有一个值的因变量没有足够的变化。因此,无论是数字变量、字符变量还是因素变量,都需要删除该变量。

根据注释更新:,因为您知道错误只会发生在因子/字符上,所以您只能关注这些因素变量的长度,看看这些因素变量的级别长度是1(下降)还是大于1 (NODROP)。

要查看变量是否是一个因素,请使用以下代码:

代码语言:javascript
复制
(l <- sapply(iris, function(x) is.factor(x)))
# Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
#        FALSE        FALSE        FALSE        FALSE         TRUE 

然后,您可以只获得因子变量的数据框架。

代码语言:javascript
复制
m <- iris[, l]

现在,找到因素变量的数量,如果这是您需要删除的一个。

代码语言:javascript
复制
ifelse(n <- sapply(m, function(x) length(levels(x))) == 1, "DROP", "NODROP")

注意:如果因子变量的级别只有一个,那么就是变量,您必须删除。

票数 78
EN

Stack Overflow用户

发布于 2013-08-11 11:13:12

看来,至少有一个预测因子,x1x2x3,只有一个因子级别,因此是一个常数。

看一下

代码语言:javascript
复制
lapply(dataframe.df[c("x1", "x2", "x3")], unique)

找出不同的价值观。

票数 19
EN

Stack Overflow用户

发布于 2017-11-28 16:59:14

当数据包含NA时,也可能发生此错误消息。

在这种情况下,行为取决于缺省值(请参阅文档),可能所有在变量中提到的列中包含NA的情况都会被静默删除。因此,可能一个因素确实有几个结果,但当仅限于不使用NA的情况时,该因素只有一个结果。

在这种情况下,要修复错误,要么更改模型(从公式中删除问题因素),要么更改数据(即完成案例)。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18171246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档