当我试图在R中定义线性模型时,如下所示:
lm1 <- lm(predictorvariable ~ x1+x2+x3, data=dataframe.df)我收到以下错误消息:
Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) :
contrasts can be applied only to factors with 2 or more levels 有什么办法可以忽略它或者修复它吗?有些变量是因素,有些则不是。
发布于 2013-08-11 11:12:30
如果您的自变量(RHS变量)是一个只接受一个值的因素或字符,则会发生该类型的错误。
实例:R中的iris数据
(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 现在,如果你的数据只有一个物种:
(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作为该变量的系数,如下所示:
(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)。
要查看变量是否是一个因素,请使用以下代码:
(l <- sapply(iris, function(x) is.factor(x)))
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# FALSE FALSE FALSE FALSE TRUE 然后,您可以只获得因子变量的数据框架。
m <- iris[, l]现在,找到因素变量的数量,如果这是您需要删除的一个。
ifelse(n <- sapply(m, function(x) length(levels(x))) == 1, "DROP", "NODROP")注意:如果因子变量的级别只有一个,那么就是变量,您必须删除。
发布于 2013-08-11 11:13:12
看来,至少有一个预测因子,x1、x2或x3,只有一个因子级别,因此是一个常数。
看一下
lapply(dataframe.df[c("x1", "x2", "x3")], unique)找出不同的价值观。
发布于 2017-11-28 16:59:14
当数据包含NA时,也可能发生此错误消息。
在这种情况下,行为取决于缺省值(请参阅文档),可能所有在变量中提到的列中包含NA的情况都会被静默删除。因此,可能一个因素确实有几个结果,但当仅限于不使用NA的情况时,该因素只有一个结果。
在这种情况下,要修复错误,要么更改模型(从公式中删除问题因素),要么更改数据(即完成案例)。
https://stackoverflow.com/questions/18171246
复制相似问题