使用 lm 构建回归模型时出错(`对比<-`中的错误(`*tmp*`...对比只能应用于具有2个或更多级别的因素)[重复]

Posted

技术标签:

【中文标题】使用 lm 构建回归模型时出错(`对比<-`中的错误(`*tmp*`...对比只能应用于具有2个或更多级别的因素)[重复]【英文标题】:Error when building regression model using lm ( Error in `contrasts<-`(`*tmp*`... contrasts can be applied only to factors with 2 or more levels) [duplicate] 【发布时间】:2016-04-21 13:30:39 【问题描述】:

我收到此错误取决于我包含哪些变量以及我在公式中指定它们的顺序:

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

我对此进行了一些研究,看起来这可能是由所讨论的变量不是因子变量引起的。在这种情况下(is_women_owned),它是一个具有 2 个级别(“是”、“否”)的因子变量。

> levels(customer_accounts$is_women_owned)
[1] "No"  "Yes"

没有错误:

f1 <- lm(combined_sales ~ is_women_owned, data=customer_accounts)

没有错误:

f2 <- lm(combined_sales ~ total_assets + market_value + total_empl + empl_growth + sic + city + revenue_growth + revenue + net_income + income_growth, data=customer_accounts)

回归上述公式加上因子变量“is_women_owned”:

f3 <- lm(combined_sales ~ total_assets + market_value + total_empl + empl_growth + sic + city + revenue_growth + revenue + net_income + income_growth + is_women_owned, data=customer_accounts)

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

如您所料,在应用逐步线性回归时,我得到了同样的错误。

这似乎是一个错误,它应该给我们一个模型,其中“is_women_owned”可能没有提供额外的解释价值,因为它与其他变量高度相关,而不是像这样的错误。

我验证了这个变量也没有丢失数据:

> which(is.na(customer_accounts$is_women_owned))
integer(0)

此外,因子变量中存在两个值:

customer_accounts$is_women_owned[1:20]
 [1] No  No  No  No  No  No  No  No  No  No  No  No  No  No  Yes No 
[17] No  No  No  No 
Levels: No Yes

【问题讨论】:

对于 F2,is_women_owned 的值始终相同?这就是导致错误的原因。此外,如果变量在所有响应中都相同,则它不会提供有关响应变量的信息,并且不应成为回归中的一个因素 很难理解这实际上意味着什么。因子变量 is_women_owned 有两个值。可能与其他变量存在某种关系。也许它与其中的一个或多个高度相关。在这种情况下,它在模型中是多余的。但它不限于一个值。 您说“is_women_owned 对于 f2 始终是相同的值”。您的数据也没有显示任何过滤来明确这一点。在 customer_accounts 中是否存在 f2 是不同值的情况? 我认为我对 f2 评论的措辞具有误导性/混淆性。我将对其进行编辑以使其更清晰。我应该首先写f3。其次,我的评论是关于回归模型,而不是变量的值。我的意思是“is_women_owned”是否等同于“total_assets + market_value + total_empl + empl_growth + sic + city +income_growth +income + net_income +income_growth”)?所有模型的预测变量值都相同(f1、f2、 f3). 当我过去使用一些人为的示例变量完成此操作时,这不会导致错误。例如,添加第三个变量 x3 = x1 + x2 并对 y ~ x1 + x2 + x3 进行回归可以正常工作,它只是包含冗余信息。 【参考方案1】:
twofac = data.frame("y" = c(1,2,3,4,5,1), "x" = c(2,56,3,5,2,1), "f" = c("apple","apple","apple","apple","apple","banana"))
onefac = twofac[1:5,]

lm(y~x+f,data=twofac)
lm(y~x+f,data=onefac)

> str(onefac)
'data.frame':   5 obs. of  3 variables:
 $ y: num  1 2 3 4 5
 $ x: num  2 56 3 5 2
 $ f: Factor w/ 2 levels "apple","banana": 1 1 1 1 1
> str(twofac)
'data.frame':   6 obs. of  3 variables:
 $ y: num  1 2 3 4 5 1
 $ x: num  2 56 3 5 2 1
 $ f: Factor w/ 2 levels "apple","banana": 1 1 1 1 1 2
> lm(y~x+f,data=twofac)

Call:
lm(formula = y ~ x + f, data = twofac)

Coefficients:
(Intercept)            x      fbanana  
    3.30783     -0.02263     -2.28519  

> lm(y~x+f,data=onefac)
Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
  contrasts can be applied only to factors with 2 or more levels

如果您运行上述代码,您会注意到 twofac,一个具有 2 水平因子的模型,其中两个因子都存在,将运行没有问题。 onefac,一个具有相同 2 水平因子但只存在一个水平的模型,给出了与您相同的错误。

如果您的因子只有一个水平,那么根据该因子回归不会提供额外信息,因为它在所有响应变量中都是恒定的

【讨论】:

我的因子变量有两个值,而不是一个。 我明白这一点,但错误告诉您,您的 2 个级别的因子只存在一个级别。无论错误与否,这都不是一个变量,可以为您提供任何额外信息 对,我理解你的解释,这是有道理的,但我验证了这个变量存在两个值。我在上面编辑了我的问题以表明这一点。 我很可能不了解有关因子变量线性回归的基本知识。

以上是关于使用 lm 构建回归模型时出错(`对比<-`中的错误(`*tmp*`...对比只能应用于具有2个或更多级别的因素)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

R使用lm构建多变量线性回归模型

R使用lm构建单变量线性回归模型

在 R 中使用 lm() 绘制多项式回归的预测时的混乱图

R语言使用lmPerm包应用于线性模型的置换方法(置换检验permutation tests)使用lm模型构建简单线性回归模型使用lmp函数生成置换检验回归分析模型

R语言使用lmPerm包应用于线性模型的置换方法(置换检验permutation tests)使用lm模型构建多元线性回归模型使用lmp函数生成置换检验多元线性回归模型

R语言使用lmPerm包应用于线性模型的置换方法(置换检验permutation tests)使用lm模型构建多项式回归模型使用lmp函数生成置换检验多项式回归模型