我有六个条件。我们可以称它们为A、B、C、D、E、F。 我正在尝试在 R 中创建一个对比矩阵。我将在回归模型中使用这些对比。
#Compare A, B, C to D, E, F
contrast1 <- c(1/3, 1/3, 1/3, -1/3, -1/3, -1/3)
#Next compare A and D to C and F.
contrast2 <- c(1/2, 0, -1/2, 1/2, 0, -1/2)
#Next compare B and E to C and F
contrast3 <- c(0, 1/2, -1/2, 0, 1/2, -1/2)
#Next compare A and D to B and E
contrast4 <- c(1/2, -1/2, 0, 1/2, -1/2, 0)
#Create interaction
contrast.interaction <- contrast1 * contrast4
mat.temp <- rbind(constant=1/6, contrast1, contrast2, contrast3, contrast4, contrast.interaction)
mat.temp
这是矩阵的输出:
[,1] [,2] [,3] [,4] [,5] [,6]
constant 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667 0.1666667
contrast1 0.3333333 0.3333333 0.3333333 -0.3333333 -0.3333333 -0.3333333
contrast2 0.5000000 0.0000000 -0.5000000 0.5000000 0.0000000 -0.5000000
contrast3 0.0000000 0.5000000 -0.5000000 0.0000000 0.5000000 -0.5000000
contrast4 0.5000000 -0.5000000 0.0000000 0.5000000 -0.5000000 0.0000000
contrast.interaction 0.1666667 -0.1666667 0.0000000 -0.1666667 0.1666667 0.0000000
当我运行
solve()
时,如下所示:
mat <- solve(mat.temp)
我得到的错误是:
solve.default(mat.temp) 中的错误:Lapack 例程 dgesv:系统完全是奇异的:U[6,6] = 0
所以我知道它是单数,但我不明白如何/为什么?哪些对比导致了这个问题?
全部。这是列的线性组合,其总和为零向量:
v <- c(1, 1, -2, -1, -1, 2)
c(mat.temp %*% v)
## [1] 0 0 0 0 0 0
我是如何想到这一点的:
caret::findLinearCombos(mat.temp)
(确定所有 6 列同时共线 - 即,没有子集本身共线)eigen(mat.temp)
。特别是如果 ee <- eigen(mat.temp)
那么 v <- ee$vectors[,6]/sqrt(1/12)
为我们提供了上面使用的线性组合(1/sqrt(12)
并不是严格必要的,但使事情变得更漂亮)。@G.Grothendieck 的评论:
如果列是 A、B、C、D、E、F,则 A+B-2C = D+E-2F,因此它们是线性相关的
是等价的(但要求你只盯着列来弄清楚,而不仅仅是计算......)