回归中的定性变量编码导致“奇点”

机器算法验证 r 回归 分类数据 多重共线性 分类编码
2022-01-30 05:39:32

我有一个名为“质量”的自变量;这个变量有 3 种响应方式(质量差;中等质量;高质量)。我想将这个自变量引入我的多元线性回归中。当我有一个二进制自变量(虚拟变量,我可以编码0/ 1)时,很容易将其引入多元线性回归模型。

但是使用 3 种响应方式,我尝试像这样对这个变量进行编码:

Bad quality      Medium quality      High quality

     0                1                  0
     1                0                  0
     0                0                  1
     0                1                  0

但是当我尝试进行多元线性回归时出现了一个问题:该模态Medium quality给了我NA

Coefficients: (1 not defined because of singularities) 

如何使用 3 种模式对这个变量“质量”进行编码?我是否必须创建一个变量作为一个因子(factorin R),但是我可以在多元线性回归中引入这个因子吗?

2个回答

您遇到的问题(即“奇点”)可以被认为是multicollinearity的一个实例。多重共线性通常定义为:

一个或多个预测变量是其他预测变量的线性组合。

事实上,这是一个相当严格的定义;它是完美的多重共线性,您很容易遇到多重共线性问题,而您的任何变量都不是其他变量的完美线性组合。此外,完全多重共线性很少发生。但是,您偶然发现了可能发生的情况。让我们看看如何根据我们对其他两个类别的知识进行完美预测medium quality(我们将使用回归模型来做到这一点,其中medium qualityY&分别): 注意没有错误项,Ybad qualityhigh qualityX1X2

Y=β0+β1X1+β2X2
ε,指定,因为我们可以完美地预测这一点。为此,我们设置现在,当你有,然后,它取消了)和,所以这个术语也被取消了( )。因此,我们对 ( )的预测值为,这是完全正确的。我会把它留给你来解决其他可能性(在你的情况下它总是有效的)。 β0=1β1=1β2=1bad qualityX1=1β01+1×1X2=01×00Ymedium quality

那么你应该怎么做呢?在表示分类变量时,我们通常使用参考单元编码(通常称为“虚拟编码”)。为此,我们选择分类变量的一个级别作为参考级别;该级别没有自己的虚拟代码,而是简单地通过在所有其他级别的虚拟代码中包含正如您已经完成的那样,您的分类变量的其他级别由虚拟代码表示。(有关这方面的更多信息,您可以在此处查看我的答案:Regression based for example on days of week。)如果您正在使用,您可以使用 a0RfactorR将为您完成这一切——它会正确完成,而且更方便——尽管如此,值得理解的是,这就是“幕后”正在发生的事情。

@gung 已经清楚地解释了这个理论。这是一个实际的例子来说明:

set.seed(1)
pred1 <- factor(c("bad", "med", "high"), levels=c("bad", "med", "high"))
df1 <- data.frame(y=20*abs(runif(6)),
                  x=rnorm(6),
                  q=sample(pred1, 6, replace=TRUE)
                  )
l1 <- lm(y ~ x, data=df1)
### add variable q    
l2 <- lm(y ~ x + q, data=df1)
### look at dummy variables generated in creating model
model.matrix(l2)

这向我们展示了参考电平(全如第 4 行所示:0bad

  (Intercept)          x qmed qhigh
1           1  1.5952808    1     0
2           1  0.3295078    0     1
3           1 -0.8204684    0     1
4           1  0.4874291    0     0
5           1  0.7383247    1     0
6           1  0.5757814    0     0

现在,如果我们自己编写虚拟变量并尝试使用所有这些变量来拟合模型:

df1 <- within(df1, {
       qbad <- ifelse(q=="bad", 1, 0)
       qmed <- ifelse(q=="med", 1, 0)
       qhigh <- ifelse(q=="high", 1, 0)
       })    
lm(y ~ x + qbad + qmed + qhigh, data=df1, singular.ok=FALSE)

我们得到预期的错误:singular fit encountered