分类变量(因子)和虚拟变量之间的差异

时间:2019-02-01 00:09:37

标签: r statistics linear-regression lm

我正在使用分类变量进行回归,并遇到了this question。在这里,用户想为每个假人添加一列。这让我很困惑,因为尽管我的列中包含使用as.factor()存储的所有虚拟变量的数据很长,但等同于具有虚拟变量。

有人可以解释以下两个线性回归模型之间的区别吗?

线性模型1,其中月份是一个因素:

dt_long
          Sales Period Month
   1: 0.4898943      1    M1
   2: 0.3097716      1    M1
   3: 1.0574771      1    M1
   4: 0.5121627      1    M1
   5: 0.6650744      1    M1
  ---                       
8108: 0.5175480     24   M12
8109: 1.2867316     24   M12
8110: 0.6283875     24   M12
8111: 0.6287151     24   M12
8112: 0.4347708     24   M12

M1 <- lm(data = dt_long,
         fomrula = Sales ~ Period + factor(Month)

线性模型2,其中每个月都是一个指标变量:

    dt_wide
          Sales Period M1 M2 M3 M4 M5 M6 M7 M8 M9 M10 M11 M12
   1: 0.4898943      1  1  0  0  0  0  0  0  0  0   0   0   0
   2: 0.3097716      1  1  0  0  0  0  0  0  0  0   0   0   0
   3: 1.0574771      1  1  0  0  0  0  0  0  0  0   0   0   0
   4: 0.5121627      1  1  0  0  0  0  0  0  0  0   0   0   0
   5: 0.6650744      1  1  0  0  0  0  0  0  0  0   0   0   0
  ---                                                        
8108: 0.5175480     24  0  0  0  0  0  0  0  0  0   0   0   1
8109: 1.2867316     24  0  0  0  0  0  0  0  0  0   0   0   1
8110: 0.6283875     24  0  0  0  0  0  0  0  0  0   0   0   1
8111: 0.6287151     24  0  0  0  0  0  0  0  0  0   0   0   1
8112: 0.4347708     24  0  0  0  0  0  0  0  0  0   0   0   1

M2 <- lm(data = data_wide,
         formula = Sales ~ Period + M1 + M2 + M3 + ... + M11 + M12

this previously asked question看,两个模型似乎完全相同。但是,在运行两个模型之后,我注意到M1返回11个虚拟估计量(因为M1被用作参考水平),而M2返回12个虚拟变量。

一个模型比另一个模型好吗? M1更有效吗?我可以在M1中设置参考水平以使两个模型完全相同吗?

2 个答案:

答案 0 :(得分:1)

M1中那样定义模型只是包括虚拟变量的捷径:如果您想手工计算那些回归系数,显然它们必须是数字。

现在,您可能没有注意到的M2是,其中一个假人应具有NA系数。那是因为您手动包括了所有它们,并且 离开了拦截。这样,我们就有了一个完美的共线性问题。通过不包括其中一个虚拟变量或添加-1来消除常数项,一切都会很好。

一些例子。让

y <- rnorm(100)
x0 <- rep(1:0, each = 50)
x1 <- rep(0:1, each = 50)
x <- factor(x1)

通过这种方式x0x1x的分解。然后

## Too much
lm(y ~ x0 + x1)

# Call:
# lm(formula = y ~ x0 + x1)

# Coefficients:
# (Intercept)           x0           x1  
#    -0.15044      0.07561           NA  

## One way to fix it
lm(y ~ x0 + x1 - 1)

# Call:
# lm(formula = y ~ x0 + x1 - 1)

# Coefficients:
#       x0        x1  
# -0.07483  -0.15044  

## Another one
lm(y ~ x1)

# Call:
# lm(formula = y ~ x1)

# Coefficients:
# (Intercept)           x1  
#    -0.07483     -0.07561  

## The same results
lm(y ~ x)

# Call:
# lm(formula = y ~ x)

# Coefficients:
# (Intercept)           x1  
#    -0.07483     -0.07561  

最终所有模型都包含相同数量的信息,但是在多重共线性的情况下,我们将面临识别问题。

答案 1 :(得分:1)

  1. 伪编码不正确。

将类别变量更改为虚拟变量时,虚拟变量将比类别少一个。这是因为最后一个类别已经通过在所有其他虚拟变量上都设置为0来表示。包括最后一个类别仅会添加冗余信息,从而导致多重共线性。因此,请务必检查您的虚拟编码,看是否存在多重共线性问题。