“lm”摘要未显示所有因子水平

`lm` summary not display all factor levels

提问人:Karen Roberts 提问时间:12/8/2016 最后编辑:Gregor ThomasKaren Roberts 更新时间:10/8/2022 访问量:17607

问:

我正在对许多属性(包括两个分类属性)和 运行线性回归,并且我没有得到我拥有的每个因子水平的系数值。BF

B有 9 个级别,有 6 个级别。当我最初运行模型(带有截距)时,我得到了 8 个系数和 5 个系数,我将其理解为每个系数都包含在截距中的第一级。FBF

我想根据它们的系数对水平进行排名,所以我在每个因子之后添加以将截距锁定在 0,这样我就可以获得所有水平的系数。BF-1

Call:
lm(formula = dependent ~ a + B-1 + c + d + e + F-1 + g + h, data = input)

Coefficients:
       Estimate Std. Error t value Pr(>|t|)    
a     2.082e+03  1.026e+02  20.302  < 2e-16 ***
B1   -1.660e+04  9.747e+02 -17.027  < 2e-16 ***
B2   -1.681e+04  9.379e+02 -17.920  < 2e-16 ***
B3   -1.653e+04  9.254e+02 -17.858  < 2e-16 ***
B4   -1.765e+04  9.697e+02 -18.202  < 2e-16 ***
B5   -1.535e+04  1.388e+03 -11.059  < 2e-16 ***
B6   -1.677e+04  9.891e+02 -16.954  < 2e-16 ***
B7   -1.644e+04  9.694e+02 -16.961  < 2e-16 ***
B8   -1.931e+04  9.899e+02 -19.512  < 2e-16 ***
B9   -1.722e+04  9.071e+02 -18.980  < 2e-16 ***
c    -6.928e-01  6.977e-01  -0.993 0.321272    
d    -3.288e-01  2.613e+00  -0.126 0.899933    
e    -8.384e-01  1.171e+00  -0.716 0.474396    
F2    4.679e+02  2.176e+02   2.150 0.032146 *  
F3    7.753e+02  2.035e+02   3.810 0.000159 ***
F4    1.885e+02  1.689e+02   1.116 0.265046    
F5    5.194e+02  2.264e+02   2.295 0.022246 *  
F6    1.365e+03  2.334e+02   5.848 9.94e-09 ***
g     4.278e+00  7.350e+00   0.582 0.560847    
h     2.717e-02  5.100e-03   5.328 1.62e-07 ***

这在一定程度上起作用,导致显示所有级别的 B,但仍然不显示 F1。由于不再有截距,我很困惑为什么 F1 不在线性模型中。

切换调用顺序,使 + F - 1 在 + B - 1 之前,会导致所有 F 级别的系数可见,但 B1 不可见。

有没有人知道如何显示两者的所有级别,或者如何从我拥有的输出中评估与其他级别的相对权重?BFF1F

回归 线性回归 LM R-FAQ

评论

0赞 ClementWalter 12/8/2016
李哲元给出了一个非常有效的回应,简单地说,线性回归是将原始函数正交投影到一组更简单的函数,即变量上。如果两个(或多个)变量相同(例如常量函数),则只保留一个变量。而且似乎只保留了第一个出现R

答:

20赞 Zheyuan Li 12/8/2016 #1

这个问题一遍又一遍地被提出,但不幸的是,没有给出令人满意的答案,这可能是一个合适的重复目标。看来我需要写一个。


大多数人都知道这与“对比”有关,但并不是每个人都知道为什么需要它,以及如何理解它的结果。我们必须查看模型矩阵才能完全消化这一点。

假设我们对一个具有两个因素的模型感兴趣:(数值协变量无关紧要,所以我不包含任何因子;响应不会出现在模型矩阵中,所以也要删除它)。请考虑以下可重现的示例:~ f + g

set.seed(0)

f <- sample(gl(3, 4, labels = letters[1:3]))
# [1] c a a b b a c b c b a c
#Levels: a b c

g <- sample(gl(3, 4, labels = LETTERS[1:3]))
# [1] A B A B C B C A C C A B
#Levels: A B C

我们从完全没有对比的模型矩阵开始:

X0 <- model.matrix(~ f + g, contrasts.arg = list(
                   f = contr.treatment(n = 3, contrasts = FALSE),
                   g = contr.treatment(n = 3, contrasts = FALSE)))

#   (Intercept) f1 f2 f3 g1 g2 g3
#1            1  0  0  1  1  0  0
#2            1  1  0  0  0  1  0
#3            1  1  0  0  1  0  0
#4            1  0  1  0  0  1  0
#5            1  0  1  0  0  0  1
#6            1  1  0  0  0  1  0
#7            1  0  0  1  0  0  1
#8            1  0  1  0  1  0  0
#9            1  0  0  1  0  0  1
#10           1  0  1  0  0  0  1
#11           1  1  0  0  1  0  0
#12           1  0  0  1  0  1  0

请注意,我们有:

unname( rowSums(X0[, c("f1", "f2", "f3")]) )
# [1] 1 1 1 1 1 1 1 1 1 1 1 1

unname( rowSums(X0[, c("g1", "g2", "g3")]) ) 
# [1] 1 1 1 1 1 1 1 1 1 1 1 1

所以。在此完整规范中,有 2 列是不可识别的。X0 的列排名为 1 + 3 + 3 - 2 = 5span{f1, f2, f3} = span{g1, g2, g3} = span{(Intercept)}

qr(X0)$rank
# [1] 5

因此,如果我们用这个拟合线性模型,则 7 个参数中的 2 个系数将为:X0NA

y <- rnorm(12)  ## random `y` as a response
lm(y ~ X - 1)  ## drop intercept as `X` has intercept already

#X0(Intercept)           X0f1           X0f2           X0f3           X0g1  
#      0.32118        0.05039       -0.22184             NA       -0.92868  
#         X0g2           X0g3  
#     -0.48809             NA  

这真正意味着,我们必须在 7 个参数上添加 2 个线性约束,才能获得完整的秩模型。这 2 个约束是什么并不重要,但必须有 2 个线性独立的约束。例如,我们可以执行以下任一操作:

  • 从中删除任意 2 列X0;
  • 在参数上添加两个和到零的约束,例如我们要求 的系数为 ,并且 和 的系数为 0,而 和 的系数相同。f1f2f3g1g2g3
  • 使用正则化,例如,将 Ridge Penalty 添加到 和 。fg

请注意,这三种方法最终会得到三种不同的解决方案:

  • 对比;
  • 约束最小二乘法;
  • 线性混合模型或惩罚最小二乘法。

前两个仍在固定效应建模的范围内。通过“对比”,我们减少参数的数量,直到得到一个完整的秩模型矩阵;而另外两个并没有减少参数的数量,而是有效地降低了有效自由度。


现在,你肯定是在追求“对比”的方式。所以,请记住,我们必须删除 2 列。它们可以是

  • 一列从和一列从,给一个模型,与和对比;fg~ f + gfg
  • 截距,并从 或 中给出一列给模型。fg~ f + g - 1

现在你应该清楚了,在删除列的框架内,你不可能得到你想要的东西,因为你期望只删除 1 列。生成的模型矩阵仍将存在秩缺陷。

如果你真的想把所有的系数都放在那里,请使用约束最小二乘法,或惩罚回归/线性混合模型。


现在,当我们有各种因素的相互作用时,事情会变得更加复杂,但想法仍然是一样的。但鉴于我的回答已经足够长了,我不想继续。

评论

0赞 Karen Roberts 12/9/2016
谢谢浙源这么详细的讲解!我现在明白了为什么我不能只使用这种方法删除一列(截距)。我将研究您建议的选项,以找到最适合我的数据:)
1赞 tjebo 3/22/2023
lm(y ~ X - 1)- 应该是 ?lm(y ~ X0 - 1)
0赞 Ben Bolker 12/19/2023
我绝对必须将这个答案添加为书签——当我需要它时,我总是找不到它......