lm() 如何知道哪些预测变量是分类的?
How does lm() know which predictors are categorical?
通常,我和你(假设你不是机器人)很容易识别预测变量是分类还是定量.例如,性别显然是绝对的。您的最后一票可以分类分类。
基本上,我们可以轻松识别分类预测变量。但是当我们在 R
中输入一些数据并且它的 lm
函数为预测变量生成虚拟变量时会发生什么?它是如何做到的?
在 Whosebug 上有点 related Question。
搜索 R factor
函数。这是一个小演示,第一个模型使用气缸数作为数值值。第二个模型将其用作分类变量。
> summary(lm(mpg~cyl,mtcars))
Call:
lm(formula = mpg ~ cyl, data = mtcars)
Residuals:
Min 1Q Median 3Q Max
-4.9814 -2.1185 0.2217 1.0717 7.5186
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 37.8846 2.0738 18.27 < 2e-16 ***
cyl -2.8758 0.3224 -8.92 6.11e-10 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 3.206 on 30 degrees of freedom
Multiple R-squared: 0.7262, Adjusted R-squared: 0.7171
F-statistic: 79.56 on 1 and 30 DF, p-value: 6.113e-10
> summary(lm(mpg~factor(cyl),mtcars))
Call:
lm(formula = mpg ~ factor(cyl), data = mtcars)
Residuals:
Min 1Q Median 3Q Max
-5.2636 -1.8357 0.0286 1.3893 7.2364
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 26.6636 0.9718 27.437 < 2e-16 ***
factor(cyl)6 -6.9208 1.5583 -4.441 0.000119 ***
factor(cyl)8 -11.5636 1.2986 -8.905 8.57e-10 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 3.223 on 29 degrees of freedom
Multiple R-squared: 0.7325, Adjusted R-squared: 0.714
F-statistic: 39.7 on 2 and 29 DF, p-value: 4.979e-09
Hxd1011 解决了更困难的情况,当分类变量存储为数字时,因此 R 默认理解它是一个数值 - 如果这不是我们想要的行为,我们必须使用 factor
功能。
您在数据集 Carseats
中使用预测变量 ShelveLoc
的示例更简单,因为它是一个文本(字符)变量,因此它只能是一个分类变量。
> head(Carseats$ShelveLoc)
[1] Bad Good Medium Medium Bad Bad
Levels: Bad Good Medium
R 根据特征类型决定那个东西。您可以使用 str(数据集)进行检查。如果该特征是因子类型,那么它将为该特征创建虚拟对象。
通常,我和你(假设你不是机器人)很容易识别预测变量是分类还是定量.例如,性别显然是绝对的。您的最后一票可以分类分类。
基本上,我们可以轻松识别分类预测变量。但是当我们在 R
中输入一些数据并且它的 lm
函数为预测变量生成虚拟变量时会发生什么?它是如何做到的?
在 Whosebug 上有点 related Question。
搜索 R factor
函数。这是一个小演示,第一个模型使用气缸数作为数值值。第二个模型将其用作分类变量。
> summary(lm(mpg~cyl,mtcars))
Call:
lm(formula = mpg ~ cyl, data = mtcars)
Residuals:
Min 1Q Median 3Q Max
-4.9814 -2.1185 0.2217 1.0717 7.5186
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 37.8846 2.0738 18.27 < 2e-16 ***
cyl -2.8758 0.3224 -8.92 6.11e-10 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 3.206 on 30 degrees of freedom
Multiple R-squared: 0.7262, Adjusted R-squared: 0.7171
F-statistic: 79.56 on 1 and 30 DF, p-value: 6.113e-10
> summary(lm(mpg~factor(cyl),mtcars))
Call:
lm(formula = mpg ~ factor(cyl), data = mtcars)
Residuals:
Min 1Q Median 3Q Max
-5.2636 -1.8357 0.0286 1.3893 7.2364
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 26.6636 0.9718 27.437 < 2e-16 ***
factor(cyl)6 -6.9208 1.5583 -4.441 0.000119 ***
factor(cyl)8 -11.5636 1.2986 -8.905 8.57e-10 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 3.223 on 29 degrees of freedom
Multiple R-squared: 0.7325, Adjusted R-squared: 0.714
F-statistic: 39.7 on 2 and 29 DF, p-value: 4.979e-09
Hxd1011 解决了更困难的情况,当分类变量存储为数字时,因此 R 默认理解它是一个数值 - 如果这不是我们想要的行为,我们必须使用 factor
功能。
您在数据集 Carseats
中使用预测变量 ShelveLoc
的示例更简单,因为它是一个文本(字符)变量,因此它只能是一个分类变量。
> head(Carseats$ShelveLoc)
[1] Bad Good Medium Medium Bad Bad
Levels: Bad Good Medium
R 根据特征类型决定那个东西。您可以使用 str(数据集)进行检查。如果该特征是因子类型,那么它将为该特征创建虚拟对象。