首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R因子的model.matrix列名

R因子的model.matrix列名
EN

Stack Overflow用户
提问于 2019-01-17 08:57:00
回答 1查看 296关注 0票数 1

我使用model.matrix来创建GLM使用的矩阵。

代码语言:javascript
复制
formula_test <- as.formula("Y ~ x1 + x2")
data_test <- expand.grid(
  Y = 1:100
  , x1 = c("A","B")
  , x2 = 1:20
)
result_test <- data.frame(model.matrix(
  object = formula_test
  , data = data_test
))
names(result_test)

有趣的是,result_test数据的列名是"X.Intercept." "x1B" "x2"

为什么第二个列名不是"x1A"

然后我尝试了data_test$x1 <- factor(x = data_test$x1, levels = c("A","B")),但它仍然是一样的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-17 09:25:14

这是因为如果你有c("X.Intercept.", "x1A", "x1B", "x2"),那么你就会有完美的多重共线性:x1A + x1B将是一列1,就像X.Intercept.列一样。如果,为了解释起见,您更喜欢使用x1A而不是截取,我们可以使用

代码语言:javascript
复制
formula_test <- as.formula("Y ~ -1 + x1 + x2")

给予

代码语言:javascript
复制
names(result_test)
# [1] "x1A" "x1B" "x2" 

代码语言:javascript
复制
all(rowSums(result_test[, c("x1A", "x1B")]) == 1)
# [1] TRUE

至于为什么是x1A而不是x1B被删除,规则似乎是第一个因素级别消失了。如果我们改为使用

代码语言:javascript
复制
levels(data_test$x1) <- c("B", "A")

然后这就给出了

代码语言:javascript
复制
names(result_test)
# [1] "X.Intercept." "x1A"          "x2"  
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54227571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档