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

9
我正在对一些属性进行线性回归,其中包括两个分类属性BF,但我并没有得到每个因子水平的系数值。 B有9个水平,F有6个水平。当我最初运行模型(带截距)时,我得到了B的8个系数和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 ***

这部分代码在某种程度上起作用,显示了所有的B级别,但是F1仍然没有显示。由于不再有拦截器,我很困惑为什么F1不在线性模型中。

将调用顺序更改,使得+ F - 1先于+ B - 1,结果是所有F级别的系数都可见,但是B1不能被看到。

有人知道如何同时显示所有BF级别,或者如何通过输出来评估F1相对于其他F级别的重要性吗?


李哲源的回答非常简洁明了,他说线性回归可以看作是将原始函数在一组简单函数(即变量)上进行正交投影。如果两个或多个变量相同(例如常数函数),则只保留一个。似乎“R”只保留第一个出现的变量。 - ClementWalter
1个回答

20

这个问题已经反复提出,但不幸的是还没有一个令人满意的答案可以作为合适的重复目标。看起来我需要写一个。


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

假设我们对一个包含两个因素的模型感兴趣:~ 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

因此,span{f1,f2,f3} = span{g1,g2,g3} = span{(Intercept)}在这个完整的说明中,有两列无法识别。X0 的列秩为1 + 3 + 3 - 2 = 5:

qr(X0)$rank
# [1] 5

因此,如果我们使用这个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  
这实际上意味着我们需要在7个参数上添加2个线性约束条件,以获得完整秩的模型。这两个约束条件具体是什么并不重要,但必须是线性独立的约束条件。例如,我们可以执行以下操作之一: - 从X0中删除任意2列; - 在参数上添加两个总和为零的约束条件,例如对于f1、f2和f3的系数,以及g1、g2和g3的系数,它们的和为0; - 使用正则化,例如对f和g添加岭回归惩罚。 请注意,这三种方法得到了三种不同的解决方案:对比、受限最小二乘和线性混合模型或带惩罚项的最小二乘。 前两种方法仍然处于固定效应建模的范围内。通过“对比”,我们减少参数数量,直到得到一个完整秩的模型矩阵;而其他两种方法不会减少参数数量,但有效地减少了自由度。 现在,您肯定是想采用“对比”的方式。因此,请记住,我们必须删除2列。它们可以是: - 从f和g中各删除1列,得到一个模型~ f + g,其中f和g被对比; - 截距和f或g中的一列,得到一个模型~ f + g - 1。 现在你应该清楚,在删除列的框架内,你没有办法得到想要的结果,因为你期望只删除1列。得到的模型矩阵仍然是秩亏的。 如果你真的想要所有系数,使用受限最小二乘或带惩罚回归/线性混合模型。 现在,当我们有因素交互作用时,情况会更加复杂,但思路仍然相同。

谢谢Zheyuan提供如此详细的解释!现在我明白了,为什么我不能仅使用此方法删除一个列(截距)。我会研究你建议的选项,找到最适合我的数据的一种方法 :) - Karen Roberts
1
lm(y ~ X - 1) - 应该是 lm(y ~ X0 - 1) 吗? - tjebo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接