分类变量(因素)和虚拟变量之间的差异
Difference between categorical variables (factors) and dummy variables
我是 运行 使用分类变量的回归并遇到 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
根据 判断,两个模型看起来完全一样。然而,在 运行 两个模型之后,我注意到 M1
returns 11 个虚拟估计器(因为 M1 被用作参考水平),而 M2 returns 12 个虚拟估计器。
一个模型比另一个好吗? M1效率更高吗?我可以在 M1 中设置参考水平以使两个模型完全相等吗?
在 M1
中定义模型只是包含虚拟变量的捷径:如果您想手动计算这些回归系数,显然它们必须是数字。
关于 M2
,您可能没有注意到其中一个假人应该具有 NA 系数。那是因为你手动包含了所有的 and 离开了截距。这样我们就有了一个完美的共线性问题。通过不包括其中一个假人或添加 -1
来消除常数项,一切都会好起来的。
一些例子。让
y <- rnorm(100)
x0 <- rep(1:0, each = 50)
x1 <- rep(0:1, each = 50)
x <- factor(x1)
这样x0
和x1
就是x
的分解。那么
## 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
最终所有模型包含的信息量相同,但在多重共线性的情况下,我们面临识别问题。
- 虚拟编码不正确。
当您将分类变量更改为虚拟变量时,虚拟变量将比类别少一个。这是因为最后一个类别已经由所有其他虚拟变量上的 0 指示。包括最后一类只会增加冗余信息,从而导致多重共线性。因此,如果您遇到多重共线性问题,请务必检查您的虚拟编码。
我是 运行 使用分类变量的回归并遇到 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
根据 M1
returns 11 个虚拟估计器(因为 M1 被用作参考水平),而 M2 returns 12 个虚拟估计器。
一个模型比另一个好吗? M1效率更高吗?我可以在 M1 中设置参考水平以使两个模型完全相等吗?
在 M1
中定义模型只是包含虚拟变量的捷径:如果您想手动计算这些回归系数,显然它们必须是数字。
关于 M2
,您可能没有注意到其中一个假人应该具有 NA 系数。那是因为你手动包含了所有的 and 离开了截距。这样我们就有了一个完美的共线性问题。通过不包括其中一个假人或添加 -1
来消除常数项,一切都会好起来的。
一些例子。让
y <- rnorm(100)
x0 <- rep(1:0, each = 50)
x1 <- rep(0:1, each = 50)
x <- factor(x1)
这样x0
和x1
就是x
的分解。那么
## 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
最终所有模型包含的信息量相同,但在多重共线性的情况下,我们面临识别问题。
- 虚拟编码不正确。
当您将分类变量更改为虚拟变量时,虚拟变量将比类别少一个。这是因为最后一个类别已经由所有其他虚拟变量上的 0 指示。包括最后一类只会增加冗余信息,从而导致多重共线性。因此,如果您遇到多重共线性问题,请务必检查您的虚拟编码。