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


17

我有一个称为“质量”的自变量;此变量具有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
也许我误解了这个问题,但是由于完美的共线性,您不能将分类变量的所有级别都包含在线性回归中。您的类别之一将被删除,以提供与其他类别进行比较的基本类别。
RickyB

1
在统计上下文中,关于什么构成奇异矩阵有一个出色的解释:什么相关使一个矩阵奇异?
gung-恢复莫妮卡

Answers:


23

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

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

实际上,这是一个相当严格的定义;它是完美的多重共线性,并且您可以很容易地遇到多重共线性问题,而您的任何变量都不是其他变量的完美线性组合。而且,极少出现完美的多重共线性。但是,您偶然发现了可能发生的情况。让我们看看我们如何能够完美地预测medium quality从我们的其他两类知识(我们会以一个回归模型,其中这样做medium quality,和&是X 1X 2,分别):Ÿ = β 0 + β 1Ybad qualityhigh qualityX1X2
。注意,没有误差项, ε,指定的,因为我们可以预测此完美。要做到这一点,我们设定 β 0 = 1

Y=β0+β1X1+β2X2
εβ0=1,和β 2 = - 1。现在,当你有,那么X 1 = 1,这抵消了β 01β1=1β2=1bad qualityX1=1β0),并且 X 2 = 0,因此项也被抵消了(1 × 0)。因此,我们对 Y()的预测值为 0,这是正确的。我将把它留给您解决其他可能性(根据您的情况,它总是有效的)。 1+1×1X2=01×00Ymedium quality

那你该怎么办呢?当代表分类变量时,我们通常使用参考单元编码(通常称为“虚拟编码”)。为此,我们选择分类变量的一个级别作为参考级别;该级别不会获得自己的伪代码,而只是通过将所有其他级别的伪代码中的全表示出来。就像您已经做过的一样,分类变量的其他级别由虚拟代码表示。(有关此信息的更多信息,您可以在这里看到我的答案:例如基于星期几的回归。)如果您使用,则可以使用和0RfactorR 将会为您完成所有操作-可以正确完成,并且更加方便-尽管如此,值得理解的是这是“幕后”发生的事情。


谢谢你们的评论 !我正在使用R,所以如果我理解得很清楚,那么只要有一个因素,R就可以完成所有事情,而我不需要做任何事情!太好了!坦克再来一次!
varin sacha

如果您在 lm公式(+ 0)中将它将起作用吗?
Firebug

1
@Firebug,如果您使用级别均值编码(即,每个级别都有一个单独的变量),则可以将拦截设置为零,并且应该可以正常工作。尽管可变系数和假设检验的含义会有所不同。
gung-恢复莫妮卡

10

@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)

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


1
乐趣。希望现在一切都清楚了。factor通常会为您处理伪变量编码,但要注意“幕后”发生了什么。
dardisco
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.