R model.matrix 因子的列名
R model.matrix column names for factors
我使用 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)
有趣的是,result_test数据的列名是"X.Intercept." "x1B" "x2"
为什么第二列名称不是"x1A"
?
然后我试了data_test$x1 <- factor(x = data_test$x1, levels = c("A","B"))
但还是一样。
那是因为如果你有 c("X.Intercept.", "x1A", "x1B", "x2")
,那么你就会有完美的多重共线性:x1A + x1B
将是一列 1,就像 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
,规则似乎是第一个因素水平消失了。相反,如果我们使用
levels(data_test$x1) <- c("B", "A")
然后这给出
names(result_test)
# [1] "X.Intercept." "x1A" "x2"
我使用 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)
有趣的是,result_test数据的列名是"X.Intercept." "x1B" "x2"
为什么第二列名称不是"x1A"
?
然后我试了data_test$x1 <- factor(x = data_test$x1, levels = c("A","B"))
但还是一样。
那是因为如果你有 c("X.Intercept.", "x1A", "x1B", "x2")
,那么你就会有完美的多重共线性:x1A + x1B
将是一列 1,就像 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
,规则似乎是第一个因素水平消失了。相反,如果我们使用
levels(data_test$x1) <- c("B", "A")
然后这给出
names(result_test)
# [1] "X.Intercept." "x1A" "x2"