`lm`摘要不显示所有因子水平

Kar*_*rts 4 regression r linear-regression lm

我对一些属性,包括两个分类属性运行的线性回归,B并且F,我没有得到每一个因子水平我有一个系数值.

B有9个级别,F有6个级别.当我最初运行模型(带截距)时,我得到8个系数B,F其中5个我理解为拦截中包含的每个系数的第一级.

我希望在其中排列水平BF基于它们的系数,所以我-1在每个因子之后添加以将截距锁定为0,以便我可以获得所有级别的系数.

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 ***
Run Code Online (Sandbox Code Playgroud)

这部分工作,导致所有级别的显示B,但F1仍然没有显示.由于不再有拦截,我很困惑为什么F1不在线性模型中.

切换调用的顺序使得+ F - 1先前+ B - 1导致所有级别的系数F可见但不可见B1.

有谁知道既如何同时显示各级BF,或如何评估的相对权重F1相对于其他级别F从我的产出?

李哲源*_*李哲源 7

这个问题一再被提出,但不幸的是,没有令人满意的答案,这可能是一个适当的重复目标.看起来我需要写一个.


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

假设我们对具有两个因素的模型感兴趣:( ~ 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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

请注意,我们有:

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
Run Code Online (Sandbox Code Playgroud)

所以span{f1, f2, f3} = span{g1, g2, g3} = span{(Intercept)}.在此完整规范中,2列无法识别.X0将有列排名1 + 3 + 3 - 2 = 5:

qr(X0)$rank
# [1] 5
Run Code Online (Sandbox Code Playgroud)

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

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  
Run Code Online (Sandbox Code Playgroud)

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

  • 删除任何2列X0;
  • 添加两个总和到零约束的参数,就像我们需要的系数f1,f2f3总结为0,与同为g1,g2g3.
  • 使用正则化,例如,向f和添加岭惩罚g.

请注意,这三种方式最终有三种不同的解决方案:

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

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


现在,你肯定是在采取"对比"的方式.所以,请记住,我们必须删除2列.他们可以

  • 从一列f和从一列g,给人以一种模式~ f + g,以fg对比;
  • 拦截,以及任一个f或一个列g,给予模型~ f + g - 1.

现在您应该清楚,在删除列的框架内,您无法获得所需的内容,因为您希望只删除1列.得到的模型矩阵仍然是秩不足的.

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


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