`lm` 摘要不显示所有因素水平
`lm` summary not display all factor levels
我是 运行 多个属性的线性回归,包括两个分类属性 B
和 F
,我没有得到每个因子水平的系数值我有。
B
有 9 个级别,F
有 6 个级别。当我最初 运行 模型(带截距)时,我得到了 B
的 8 个系数和 F
的 5 个系数,我将其理解为截距中包含的每个系数的第一级。
我希望运行根据系数在 B
和 F
内确定水平,因此我在每个系数后添加 -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
不可见.
有谁知道如何显示 B
和 F
的所有级别,或者如何评估 F1
与 [=12= 的其他级别相比的相对权重] 从我的输出中?
这个问题被反复提出,但不幸的是,还没有令人满意的答案可以作为一个合适的重复目标。看来我得写一篇了
大多数人都知道这与"contrasts"有关,但并不是每个人都知道为什么需要它,以及如何理解它的结果。我们必须查看 模型矩阵 才能完全消化这一点。
假设我们对具有两个因子的模型感兴趣:~ f + g
(数值协变量无关紧要,因此我包括了其中的 none;响应未出现在模型矩阵中,因此将其删除, 也)。考虑以下可重现的示例:
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)}
。 在此完整规范中,有 2 列无法识别。 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 个线性约束,才能获得满秩模型。这 2 个约束是什么并不重要,但必须有 2 个线性独立的约束。 例如,我们可以执行以下任一操作:
- 从
X0
中删除任意 2 列;
- 在参数上添加两个总和为零的约束,就像我们要求
f1
、f2
和 f3
的系数总和为 0,[=25= 也一样]、g2
和 g3
.
- 使用正则化,例如对
f
和g
添加脊线惩罚。
请注意,这三种方式最终会产生三种不同的解决方案:
- 对比;
- 约束最小二乘法;
- 线性混合模型或惩罚最小二乘法。
前两个还在固定效应建模的范围内。通过"contrasts",我们减少参数的数量,直到我们得到一个满秩模型矩阵;而另外两个并没有减少参数个数,反而有效降低了有效自由度。
现在,您肯定是在追求 "contrasts" 方式。所以,请记住,我们必须删除 2 列。他们可以
f
的一列和g
的一列,给模型~ f + g
,与f
和g
对比;
- 截距,以及来自
f
或 g
的一列,给模型 ~ f + g - 1
。
现在你应该清楚了,在删除列的框架内,你无法得到你想要的,因为你只希望删除 1 列。生成的模型矩阵仍然是秩亏的。
如果你真的想要所有系数,使用约束最小二乘法,或惩罚回归/线性混合模型。
现在,当我们有因素的相互作用时,事情就更复杂了,但思路还是一样的。但是鉴于我的回答已经够长了,我不想再继续了。
我是 运行 多个属性的线性回归,包括两个分类属性 B
和 F
,我没有得到每个因子水平的系数值我有。
B
有 9 个级别,F
有 6 个级别。当我最初 运行 模型(带截距)时,我得到了 B
的 8 个系数和 F
的 5 个系数,我将其理解为截距中包含的每个系数的第一级。
我希望运行根据系数在 B
和 F
内确定水平,因此我在每个系数后添加 -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
不可见.
有谁知道如何显示 B
和 F
的所有级别,或者如何评估 F1
与 [=12= 的其他级别相比的相对权重] 从我的输出中?
这个问题被反复提出,但不幸的是,还没有令人满意的答案可以作为一个合适的重复目标。看来我得写一篇了
大多数人都知道这与"contrasts"有关,但并不是每个人都知道为什么需要它,以及如何理解它的结果。我们必须查看 模型矩阵 才能完全消化这一点。
假设我们对具有两个因子的模型感兴趣:~ f + g
(数值协变量无关紧要,因此我包括了其中的 none;响应未出现在模型矩阵中,因此将其删除, 也)。考虑以下可重现的示例:
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)}
。 在此完整规范中,有 2 列无法识别。 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 个线性约束,才能获得满秩模型。这 2 个约束是什么并不重要,但必须有 2 个线性独立的约束。 例如,我们可以执行以下任一操作:
- 从
X0
中删除任意 2 列; - 在参数上添加两个总和为零的约束,就像我们要求
f1
、f2
和f3
的系数总和为 0,[=25= 也一样]、g2
和g3
. - 使用正则化,例如对
f
和g
添加脊线惩罚。
请注意,这三种方式最终会产生三种不同的解决方案:
- 对比;
- 约束最小二乘法;
- 线性混合模型或惩罚最小二乘法。
前两个还在固定效应建模的范围内。通过"contrasts",我们减少参数的数量,直到我们得到一个满秩模型矩阵;而另外两个并没有减少参数个数,反而有效降低了有效自由度。
现在,您肯定是在追求 "contrasts" 方式。所以,请记住,我们必须删除 2 列。他们可以
f
的一列和g
的一列,给模型~ f + g
,与f
和g
对比;- 截距,以及来自
f
或g
的一列,给模型~ f + g - 1
。
现在你应该清楚了,在删除列的框架内,你无法得到你想要的,因为你只希望删除 1 列。生成的模型矩阵仍然是秩亏的。
如果你真的想要所有系数,使用约束最小二乘法,或惩罚回归/线性混合模型。
现在,当我们有因素的相互作用时,事情就更复杂了,但思路还是一样的。但是鉴于我的回答已经够长了,我不想再继续了。