代码之家  ›  专栏  ›  技术社区  ›  LeGeniusII

r model.matrix因子的列名称

  •  1
  • LeGeniusII  · 技术社区  · 6 年前

    我使用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"

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

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   Julius Vainora    6 年前

    那是因为如果你有 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 规则似乎是第一要素水平消失了。如果我们使用

    levels(data_test$x1) <- c("B", "A")
    

    然后给出

    names(result_test)
    # [1] "X.Intercept." "x1A"          "x2"