如您所见,通过删除截距为因子的每个级别获取参数的技巧仅在只有一个因子时才有效。你可以通过计算自由度来理解为什么:让因子a有a水平,因素b和b水平。然后因素a有a−1自由度,这意味着指标矩阵a用,用 a 表示的列1在该行所在级别的每一行中,都有排名a−1. 同样的因素b有b−1自由程度。截距有一个自由度。所以模型公式 a+b(这真的是 a+b+1) 有1+a−1+b−1=a+b−1自由程度。去除截距(模型公式 a+b−1) 表示相同的模型,只是参数化发生了变化。所以它也必须有a+b−1自由程度。那−1表明不可能有a+b参数,因此其中一个因素仍然必须比水平数少一个参数。
这就解释了你所看到的。但是您仍然可以获得缺失水平的系数b,它应该是零,简单地说。(取决于您使用的对比度)。
为了更清楚地说明这一点,让我们看一个例子。我将使用 R 作为矩阵代数。为了根据因子制作设计矩阵(用 R 的说法“模型矩阵”),我们需要定义对比函数。我使用默认值:
> options("contrasts")
$contrasts
unordered ordered
"contr.treatment" "contr.poly"
首先,我们为一个简单的、完全交叉的设计制作了两个因素:
a <- factor(rep(letters[1:3], 3))
b <- factor(rep(letters[1:3], each=3))
然后为它们中的每一个设计矩阵:
> X1 <- model.matrix( ~ a-1)
> X2 <- model.matrix( ~b-1)
> X1
aa ab ac
1 1 0 0
2 0 1 0
3 0 0 1
4 1 0 0
5 0 1 0
6 0 0 1
7 1 0 0
8 0 1 0
9 0 0 1
attr(,"assign")
[1] 1 1 1
attr(,"contrasts")
attr(,"contrasts")$a
[1] "contr.treatment"
> X2
ba bb bc
1 1 0 0
2 1 0 0
3 1 0 0
4 0 1 0
5 0 1 0
6 0 1 0
7 0 0 1
8 0 0 1
9 0 0 1
attr(,"assign")
[1] 1 1 1
attr(,"contrasts")
attr(,"contrasts")$b
[1] "contr.treatment"
它们中的每一个分别是满级的:
library(MASS)
library(Matrix)
> Matrix::rankMatrix(X1)
[1] 3
attr(,"method")
[1] "tolNorm2"
attr(,"useGrad")
[1] FALSE
attr(,"tol")
[1] 1.998401e-15
> Matrix::rankMatrix(X2)
[1] 3
attr(,"method")
[1] "tolNorm2"
attr(,"useGrad")
[1] FALSE
attr(,"tol")
[1] 1.998401e-15
但是当组合在一起时,就会出现排名不足,因此它们必须具有“共同”的一个维度:
rankMatrix(cbind(X1, X2))
[1] 5
attr(,"method")
[1] "tolNorm2"
attr(,"useGrad")
[1] FALSE
attr(,"tol")
[1] 1.998401e-15
为了识别公共维度,我们使用Null()
package 中的函数MASS
,计算空空间:
Null(t(cbind(X1, X2)))
[,1]
[1,] -0.4082483
[2,] -0.4082483
[3,] -0.4082483
[4,] 0.4082483
[5,] 0.4082483
[6,] 0.4082483
是的,共同维度是常数向量。