使用 model.matrix 进行 One-hot 编码

2023-12-14

model.matrix 中有一些我不明白的东西。当我输入一个没有截距的二进制变量时,它返回两个级别。

> temp.data <- data.frame('x' = sample(c('A', 'B'), 1000, replace = TRUE))
> temp.data.table <- model.matrix( ~ 0 + x, data = temp.data)
> head(temp.data.table)
  xA xB
1  1  0
2  0  1
3  0  1
4  0  1
5  1  0
6  0  1

但是,当我输入另一个二进制级别时,它仅创建 3 列。这是为什么?是什么让函数的行为突然不同?我怎样才能避免它?

> temp.data <- data.frame('x' = sample(c('A', 'B'), 1000, replace = TRUE),
+                         'y' = sample(c('J', 'D'), 1000, replace = TRUE))
> temp.data.table <- model.matrix( ~ 0 + x + y, data = temp.data)
> head(temp.data.table)
  xA xB yJ
1  0  1  0
2  0  1  1
3  0  1  1
4  0  1  0
5  1  0  1
6  0  1  0

您需要与factors并设置contrasts to FALSE。尝试这个:

n <- 10
temp.data <- data.frame('x'=sample(c('A', 'B'), n, replace=TRUE),
                        'y'=factor(sample(c('J', 'D'), n, replace=TRUE)))
model.matrix( ~ 0 + x + y, data=temp.data,
              contrasts=list(y=contrasts(temp.data$y, contrasts=FALSE)))

#    xA xB yD yJ
# 1   0  1  1  0
# 2   1  0  0  1
# 3   0  1  1  0
# 4   1  0  0  1
# 5   0  1  0  1
# 6   1  0  1  0
# 7   1  0  1  0
# 8   0  1  1  0
# 9   0  1  0  1
# 10  0  1  1  0
# attr(,"assign")
# [1] 1 1 2 2
# attr(,"contrasts")
# attr(,"contrasts")$x
# [1] "contr.treatment"
# 
# attr(,"contrasts")$y
#   D J
# D 1 0
# J 0 1

要了解为什么会发生这种情况,请尝试:

contrasts(temp.data$y)
#   J
# D 0
# J 1

contrasts(temp.data$y, contrasts=F)
#   D J
# D 1 0
# J 0 1

和你的x变量这通过设置自动发生0 +删除拦截。 (实际上x也应该编码为factor).

原因是,在线性回归中,因子变量的水平通常与参考水平进行比较(您可以使用relevel)。在您的模型矩阵中,0 +您删除第一个变量的截距,但不删除以下变量(尝试model.matrix( ~ 0 + y + x, data=temp.data)你只得到一个x but to y)。这是标准中确定的contrasts默认情况下使用处理对比设置。

您可能想阅读相关帖子罗丝·梅尔 (2015)详细解释这一点:

  • R 中的对比
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 model.matrix 进行 One-hot 编码 的相关文章

随机推荐