具有分类变量的回归模型:虚拟代码或转换为因子

时间:2018-02-06 05:10:11

标签: r

我知道这可能是一个有点愚蠢的问题,但我想问的主要原因是因为我被教过DUMMY CODE! DUMMY CODE! DUMMY CODE!由多个班级的多名教师全部使用R.

所以我对ISLR包中的自动数据集进行了这种比较。

library(ISLR)
Auto$c3 <- ifelse(Auto$cylinders == 3, 1, 0)
Auto$c4 <- ifelse(Auto$cylinders == 4, 1, 0)
Auto$c5 <- ifelse(Auto$cylinders == 5, 1, 0)
Auto$c6 <- ifelse(Auto$cylinders == 6, 1, 0)
Auto$c8 <- ifelse(Auto$cylinders == 8, 1, 0)
Auto$cylinders <- as.factor(Auto$cylinders)

summary(lm(mpg~displacement + cylinders, data = Auto))
summary(lm(mpg~displacement + c4 + c5 + c6 + c8, data = Auto))

Call:
lm(formula = mpg ~ displacement + cylinders, data = Auto)

Residuals:
    Min      1Q  Median      3Q     Max 
-10.692  -2.694  -0.347   2.157  20.307 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)  24.33811    2.25278   10.80  < 2e-16 ***
displacement -0.05225    0.00693   -7.54  3.3e-13 ***
cylinders4   10.67609    2.23296    4.78  2.5e-06 ***
cylinders5   10.60478    3.39198    3.13   0.0019 ** 
cylinders6    7.04473    2.46493    2.86   0.0045 ** 
cylinders8    8.65170    2.92786    2.95   0.0033 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 4.39 on 386 degrees of freedom
Multiple R-squared:  0.687, Adjusted R-squared:  0.683 
F-statistic:  170 on 5 and 386 DF,  p-value: <2e-16

> summary(lm(mpg~displacement + c4 + c5 + c6 + c8, data = Auto))

Call:
lm(formula = mpg ~ displacement + c4 + c5 + c6 + c8, data = Auto)

Residuals:
    Min      1Q  Median      3Q     Max 
-10.692  -2.694  -0.347   2.157  20.307 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)  24.33811    2.25278   10.80  < 2e-16 ***
displacement -0.05225    0.00693   -7.54  3.3e-13 ***
c4           10.67609    2.23296    4.78  2.5e-06 ***
c5           10.60478    3.39198    3.13   0.0019 ** 
c6            7.04473    2.46493    2.86   0.0045 ** 
c8            8.65170    2.92786    2.95   0.0033 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 4.39 on 386 degrees of freedom
Multiple R-squared:  0.687, Adjusted R-squared:  0.683 
F-statistic:  170 on 5 and 386 DF,  p-value: <2e-16

两者产生相同的输出,这在我看来并不令人惊讶。令我感到惊讶的是,我被教导为虚拟代码而不是转换为因子。使用因子变量对伪代码有任何分析,计算或任何理由吗?使用一个因子似乎更容易,需要更少的代码,并且你不会得到一堆额外的变量。我可以看到虚拟编码与使用因子的唯一可能的优点是你可以选择你的参考组,我猜你也可以用一个因素来做。

1 个答案:

答案 0 :(得分:1)

使用dummies包可以轻松完成虚拟编码。

library(dummies)

#sample data
auto <- tail(ISLR::Auto,10)

#dummy coding
auto_dummyCoded <- cbind(auto, dummy(c("cylinders"), data=auto))
auto_dummyCoded

在上面的虚拟编码中,添加了两个新变量(即cylinders4cylinders6),因为样本数据中有两个圆柱类别。


现在,我们将cylinders列转换为“factor”,而不是虚拟编码,然后再将其传递给lm

auto$cylinders <- as.factor(auto$cylinders)
fit <- lm(mpg ~ cylinders, data=auto, x=T)

让我们打印fit$x,了解内部编码cylinders列的方式。 R已将柱面列转换为cylinders6和一个常量列intercept(比“柱面”列中可用的类别数少一个,另外还有一个常量变量。虚拟编码的方式!)

    (Intercept) cylinders6
388           1          0
389           1          1
390           1          0
391           1          0
392           1          0
393           1          0
394           1          0
395           1          0
396           1          0
397           1          0