我有数据,其中“飞行速度”是响应变量和group
(实验/控制),test
(第一/第二),FL
(燃料负载,%)从瘦体重:0到~25%),wing
(翼长,mm)。由于我们已经对同一只鸟进行了两次测试(第一次和第二次测试,实验组被感染),我想要执行混合模型(添加随机项~1|ring
)。由于异方差性,我还为weight
变量添加了test
参数。
mod<-lme(speed~test* group * FL * wing,weight=~1|test,random=~1|ring,data=data,method="ML")
这就是完整模型的样子(我使用nlme
包)。之后我开始向后选择。我手动完成(根据最低AIC),然后使用函数stepAIC
(MASS包)检查结果。在这种情况下,前两个选择步骤很好,但是当我从模型开始时:
mod3<-lme(speed~test+group + FL + wing+ test:group + group:FL + FL:wing + test:group:wing, weight=~1|test,random=~1|ring,data=data,method="ML")
我收到了一个错误:
Error in MEEM(object, conLin, control$niterEM) :
Singularity in backsolve at level 0, block 1
据我了解,这意味着并非所有因素的相互作用都存在。但是我应该已经完整模型得到了同样的错误。而对于其他响应变量,它运作良好。如果你们有任何想法,我会很高兴的!
原始数据
ring group wing speed_aver FL test
1 XZ13125 E 75 0.62 16.2950000 first
2 XZ13125 E 75 0.22 12.5470149 second
3 XZ13126 E 68 0.39 7.7214876 first
4 XZ13127 C 75 0.52 9.1573643 first
5 XZ13127 C 75 0.17 -1.9017391 second
6 XZ13129 C 73 0.46 10.3821705 first
7 XZ13129 C 73 0.33 -0.5278261 second
8 XZ13140 C 73 0.48 13.0774436 first
9 XZ13140 C 73 0.27 18.0092199 second
10 XZ13144 C 73 0.36 7.5144000 first
11 XZ13144 C 73 0.36 9.6820312 second
12 XZ13146 E 73 0.32 14.3651852 first
13 XZ13146 E 73 0.28 20.8171233 second
14 XZ13159 C 74 0.55 20.2760274 first
15 XZ13159 C 74 0.37 19.1687500 second
16 XZ13209 E 72 0.35 8.1464000 first
17 XZ13209 E 72 0.43 10.9945736 second
18 XZ13213 E 74 0.57 5.3682927 first
19 XZ13213 E 74 0.26 1.3584746 second
20 XZ13220 C 73 0.30 6.0105691 first
21 XZ13220 C 73 0.36 -8.0439252 second
22 XZ13230 E 74 0.44 5.3682927 first
23 XZ13230 E 74 0.31 3.0025000 second
24 XZ13231 C 75 0.28 6.2504000 first
25 XZ13231 C 75 0.37 7.7267717 second
26 XZ13232 C 74 0.34 16.8592857 first
27 XZ13232 C 74 0.33 13.7800000 second
28 XZ13271 C 73 0.32 16.2268116 first
29 XZ13271 C 73 0.28 14.3651852 second
30 XZ13278 E 72 0.45 15.5757353 first
31 XZ13278 E 72 0.37 14.9503704 second
32 XZ13280 C 74 0.33 15.0386861 first
33 XZ13280 C 74 0.36 7.6214286 second
34 XZ13340 E 73 0.62 16.8294964 first
35 XZ13340 E 73 0.26 13.7261194 second
36 XZ13367 E 75 0.42 23.4071895 first
37 XZ13370 E 71 0.25 13.6159091 first
答案 0 :(得分:8)
事实证明这非常棘手。我认为问题在于,由于您构建第二个公式的方式,R不会自动从模型矩阵中删除共线变量。
tl; dr 这是一种意识流,但我认为基本的回家点是
lme
并不一定在您的模型规范中检查/处理别名(与lm
不同,或者在较小程度上lmer
)test:group:wing
互动而未包含{{1 }和group:wing
互动。 R允许你这样做,但模型并不一定有意义......我对你最终得到这个模型规范感到有些惊讶 - 通常test:wing
和stepAIC
和R的其他内置模型简化工具,试图尊重边缘性,因此不会让你最终在这里... drop1
(尽管处理异方差性更难),或使用lmer
构建自己的数字虚拟变量。 .. model.matrix()
/ model.matrix()
/ lm
)函数本身的范围之外,lme
可以最好地检查出这些类型的别名问题... 为简单起见,我将省略方差模型(lmer
),因为它似乎与这个特定问题无关(我不知道先验,但有和没有它的测试都没有区别。)
weights=varIdent(form=~1|test)
如果我们使用library("nlme")
form1 <- speed_aver~test* group * FL * wing
form2 <- speed_aver~test+group + FL + wing+
test:group + group:FL + FL:wing +
test:group:wing
mod <- lme(form1,random=~1|ring,data=dd,method="ML") ## OK
update(mod,form2)
## fails with "Singularity in backsolve" error
尝试该怎么办?
lme4
啊哈! ## ugh, I wish I knew a better way to append to a formula
form1L <- formula(paste(deparse(form1),"(1|ring)",sep="+"))
form2L <- formula(paste(deparse(form2,width=100),"(1|ring)",sep="+"))
library("lme4")
mod2 <- lmer(form1L, data=dd)
mod3 <- lmer(form2L, data=dd)
## fixed-effect model matrix is rank deficient so dropping 1 column / coefficient
自动检测模型矩阵是否缺乏排名。 lmer
会自动执行此操作和替换别名字词的lm
值。目前NA
只是放弃它们,尽管lmer
的合理最新版本(已记录但未公布)选项lme4
到add.dropped=TRUE
会将fixef()
值恢复在适当的地方。
让我们研究一下模型矩阵:
NA
尝试识别别名列:X0 <- model.matrix(form1,data=dd)
c(rankMatrix(X0)==ncol(X0)) ## TRUE; both are 16
X <- model.matrix(form2,data=dd)
c(rankMatrix(X))==ncol(X) ## FALSE; 11<12
的第12个元素很小(1e-15)
svd(X)$d
因此,第9-12列的总和与第5列完全相同(相同的值,对立的符号)。这里发生了什么?
ss <- svd(X)
(zz <- zapsmall(ss$v[,12])) ## elements of collinear grouping
## [1] 0.0000000 0.0000000 0.0000000 0.0000000 -0.4472136 0.0000000
## [7] 0.0000000 0.0000000 0.4472136 0.4472136 0.4472136 0.4472136
看起来我们以某种方式得到所有的逐层交互级别与wing交互,以及colnames(X)[zz!=0]
## [1] "wing" "testfirst:groupC:wing" "testsecond:groupC:wing"
## [4] "testfirst:groupE:wing" "testsecond:groupE:wing"
变量本身......
wing
我仍然不能100%确定为什么会这样,但你可以看到R扩展了三向互动,包括所有双向互动的四个级别(反过来与连续mm <- X[,zz!=0]
colnames(mm) <- gsub("(test|group|:wing)","",colnames(mm))
head(mm)
## wing first:C second:C first:E second:E
## 1 75 0 0 75 0
## 2 75 0 0 0 75
## 3 68 0 0 68 0
## 4 75 75 0 0 0
## 5 75 0 75 0 0
## 6 73 73 0 0 0
变量互动,但它也得到了wing
wing
如果我们定义一个尊重边缘性的模型,那么我们再次确定......
colnames(X)
## [1] "(Intercept)" "testsecond" "groupE"
## [4] "FL" "wing" "testsecond:groupE"
## [7] "groupE:FL" "FL:wing" "testfirst:groupC:wing"
## [10] "testsecond:groupC:wing" "testfirst:groupE:wing"
## "testsecond:groupE:wing"
colnames(X0)
## [1] "(Intercept)" "testsecond"
## [3] "groupE" "FL"
## [5] "wing" "testsecond:groupE"
## [7] "testsecond:FL" "groupE:FL"
## [9] "testsecond:wing" "groupE:wing"
## [11] "FL:wing" "testsecond:groupE:FL"
## [13] "testsecond:groupE:wing" "testsecond:FL:wing"
## [15] "groupE:FL:wing" "testsecond:groupE:FL:wing"
我们可以通过这种方式更简单地复制问题:
form3 <- speed_aver~test*group*wing+FL*(group+wing)
X1 <- model.matrix(form3,dd)
c(rankMatrix(X1)== ncol(X1)) ## TRUE
此模型具有三向交互(显式),但缺少双向交互。如果我们使用form4 <- speed_aver~wing+test:group:wing
X2 <- model.matrix(form4,dd)
c(rankMatrix(X2)== ncol(X2)) ## FALSE
,甚至~wing*test*group
,我们就可以了......
~wing+wing*test*group