我使用model.matrix创建GLM使用的矩阵。
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)
有趣的是,结果测试数据的列名是 "X.Intercept." "x1B" "x2"
"X.Intercept." "x1B" "x2"
为什么第二个列名不是 "x1A" ?
"x1A"
然后我尝试 data_test$x1 <- factor(x = data_test$x1, levels = c("A","B")) 但还是一样的。
data_test$x1 <- factor(x = data_test$x1, levels = c("A","B"))
那是因为如果你有 c("X.Intercept.", "x1A", "x1B", "x2") 那么你就有了完美的多重共线性: x1A + x1B 会是一列一列的,就像 X.Intercept. 列。如果为了解释,你更喜欢 x1A 我们可以使用
c("X.Intercept.", "x1A", "x1B", "x2")
x1A + x1B
X.Intercept.
x1A
formula_test <- as.formula("Y ~ -1 + x1 + x2")
给
names(result_test) # [1] "x1A" "x1B" "x2"
和
all(rowSums(result_test[, c("x1A", "x1B")]) == 1) # [1] TRUE
至于为什么 X1A 那是放弃而不是 x1B 规则似乎是第一要素水平消失了。如果我们使用
X1A
x1B
levels(data_test$x1) <- c("B", "A")
然后给出
names(result_test) # [1] "X.Intercept." "x1A" "x2"