如何使用 n-1 个变量实现虚拟变量?

机器算法验证 r 回归 分类数据 分类编码
2022-03-15 02:25:29

如果我有一个有 4 个级别的变量,理论上我需要使用 3 个虚拟变量。在实践中,这实际上是如何进行的?我使用 0-3,我使用 1-3 并将 4 留空吗?有什么建议么?

注意:我将在 R 中工作。

更新:如果我只使用一列使用对应于 AD 的 1-4 会发生什么?这会起作用还是会带来问题?

4个回答

在实践中,通常让自己选择的软件来处理创建和操作虚拟变量。有几种方法可以处理它;以下是具有四个观测值的数据集的几种常见可能性,每个观测值位于 A、B、C 和 D 的每个级别。这些是不同的参数化;它们产生完全相同的模型拟合,但对参数的解释不同。使用基本代数可以轻松地从一种转换到另一种;注意它们都是彼此的线性组合;事实上,任何线性组合都可以使用。

使用与第一级的差异(R 中的默认值):

A 0 0 0
B 1 0 0
C 0 1 0
D 0 0 1

使用与上一级的差异(SAS 中的默认值):

A 1 0 0
B 0 1 0
C 0 0 1
D 0 0 0

使用“总和”对比:

A    1    0    0
B    0    1    0
C    0    0    1
D   -1   -1   -1

使用“helmert”对比:

A   -1   -1   -1
B    1   -1   -1
C    0    2   -1
D    0    0    3

让我们假设您的变量水平是 A、B、C 和 D。如果您在回归中有一个常数项,则需要使用三个虚拟变量,否则,您需要全部四个。

有许多数学上等效的方法可以实现虚拟变量。如果您在回归中有一个常数项,一种方法是选择其中一个级别作为“基线”级别,并将其他三个与它进行比较。具体来说,假设基线水平是 A。那么当水平为 B 时,您的第一个虚拟变量取值为 1,否则为 0;当级别为 C 时,第二个取值为 1,否则为 0,而当级别为 D 时,第三个取值为 1,否则为 0。因为您的常数项始终等于 1,所以第一个虚拟变量的估计系数将是 B 级和 A 级之间差异的估计值,其他虚拟变量也是如此。

如果您没有常数项,您可以只使用四个虚拟变量,如上例所示,只需为 A 级添加一个。

在 R 中,将变量定义为一个因子,它将为您实现它:

x <- as.factor(sample(LETTERS[1:4], 20, replace = TRUE))
y <- rnorm(20)
lm (y ~ x)

返回

Call:
lm(formula = y ~ x)

Coefficients:
(Intercept)           xB           xC           xD  
     1.0236      -0.6462      -0.9466      -0.4234  

R 中“lm”、“factor”和“formula”的文档填写了一些细节。

whuber 在评论中告诉您,使用 0-3 或 1-4 编码而不是创建虚拟变量并不是您想要的。这是尝试 - 我希望能解释您将使用该模型做什么以及为什么它是错误的。

如果你对变量 X 进行编码,如果 A 则 X=1,如果 B 然后 X=2,如果 C 然后 X=3,如果 D 然后 X=4,那么当你进行回归时,你只会得到一个参数。假设最终与 X 相关的估计参数为 2。这将告诉您 B 的均值与 A 的均值之间的预期差异为 2。它还告诉您 C 的均值之间的预期差异B 的平均值为 2。D 和 C 的平均值为 2。您将迫使这些组的平均值差异遵循这种非常严格的模式。这个参数可以准确地告诉您所有组的含义是如何相互关联的。

因此,如果您进行这种编码,您将需要假设您不仅得到了正确的排序(因为在这种情况下,如果您期望从 A 增加到 B,那么您需要期望从 B 到 C 和从 C到 D) 但您还需要假设该差异是相同的!

相反,如果您执行建议的虚拟编码,您将允许每个组有自己的平均值 - 没有限制。该模型更加明智,可以回答您想要的问题。