在R中定义线性模型时出现对比误差

REn*_*ast 41 database statistics r

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

lm1 <- lm(predictorvariable ~ x1+x2+x3, data=dataframe.df)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
contrasts can be applied only to factors with 2 or more levels 
Run Code Online (Sandbox Code Playgroud)

有没有办法忽略它或修复它?有些变量是因素,有些则不是.

Met*_*ics 57

如果您的自变量(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  
Run Code Online (Sandbox Code Playgroud)

现在,如果您的数据只包含一个物种:

(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
Run Code Online (Sandbox Code Playgroud)

如果变量是numeric(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
Run Code Online (Sandbox Code Playgroud)

解决方案:因变量的变化不足,只有一个值.因此,您需要删除该变量,无论是数字,字符还是因子变量.

根据注释更新:由于您知道错误仅发生在因子/字符上,因此您只能关注那些因素,并查看这些因子变量的级别长度是1(DROP)还是大于1(NODROP).

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

(l <- sapply(iris, function(x) is.factor(x)))
# Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
#        FALSE        FALSE        FALSE        FALSE         TRUE 
Run Code Online (Sandbox Code Playgroud)

然后,您只能获得因子变量的数据框

m <- iris[, l]
Run Code Online (Sandbox Code Playgroud)

现在,找到因子变量的级别数,如果这是你需要删除的那个

ifelse(n <- sapply(m, function(x) length(levels(x))) == 1, "DROP", "NODROP")
Run Code Online (Sandbox Code Playgroud)

注意:如果因子变量的级别只有一个,那么这就是变量,你必须放弃.

  • 你最后的'ifelse`不起作用.变量可以有2个级别,但如果其中一个为空,则会出现错误,但您的代码将无法检测到它.使用数据框"df",更好的公式是:`(sapply(df,function(x)length(unique(x))<2))`列出了有问题的变量. (3认同)
  • 另外 - 如果您的变量包含“外来”字符,则会显示相同的错误。我猜这是一个错误。我的变量 CustomerType 有一个包含“ö”的值,当我更改时错误消失了 (2认同)

Sve*_*ein 15

看来,你预测的至少一个,x1,x2,或者x3,只有一个因素水平,因此是一个常数.

看一下

lapply(dataframe.df[c("x1", "x2", "x3")], unique)
Run Code Online (Sandbox Code Playgroud)

找到不同的价值观.


jar*_*auh 6

当数据包含NAs时,也可能出现此错误消息。

在这种情况下,行为取决于默认值(请参阅文档),并且可能NA会悄悄删除变量中提到的列中带有' 的所有情况。因此,一个因素可能确实有多个结果,但是当限制为没有NA's的情况时,该因素只有一个结果。

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


小智 5

其他作者的答案已经解决了只有一个级别或 NA 的因素问题。

今天,我在使用该rstatix::anova_test()函数时偶然发现了同样的错误,但我的因素还可以(不止一个级别,没有 NA,没有字符向量,......)。相反,我可以通过删除数据框中未包含在模型中的所有变量来修复错误。我不知道这种行为的原因是什么,但在遇到此错误时,仅了解这一点也可能会有所帮助。

  • 你刚刚解决了我的问题。这一定是一个错误,您认为该函数应该能够忽略其他列 (2认同)