R 在LME中出现反向选择,在反向求解中出现奇异性
我有数据,其中“飞行速度”是一个响应变量,R 在LME中出现反向选择,在反向求解中出现奇异性,r,mixed-models,R,Mixed Models,我有数据,其中“飞行速度”是一个响应变量,组(实验/控制),测试(第一次/第二次),FL(燃料负荷占瘦体重的百分比:从0到~25%),机翼(机翼长度单位:mm)。由于我们已经对同一只鸟进行了两次测试(第一次和第二次测试,实验组被感染),我想执行混合模型(添加一个随机项~1 | ring)。由于异方差,我还为test变量添加了weight参数 mod<-lme(speed~test* group * FL * wing,weight=~1|test,random=~1|ring,data=d
组
(实验/控制),测试
(第一次/第二次),FL
(燃料负荷占瘦体重的百分比:从0到~25%),机翼
(机翼长度单位:mm)。由于我们已经对同一只鸟进行了两次测试(第一次和第二次测试,实验组被感染),我想执行混合模型(添加一个随机项~1 | ring
)。由于异方差,我还为test
变量添加了weight
参数
mod<-lme(speed~test* group * FL * 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
事实证明,这相当棘手。我认为问题在于,由于构造第二个公式的方式,R并没有自动从模型矩阵中删除共线变量 tl;dr这是一种意识流,但我认为基本要点是
不一定为您检查/处理型号规格中的别名(不同于lme
,或者在较小程度上不同于lm
)lmer
- 如果您违反了边际性,您可能会在R的公式中遇到麻烦,您在这里通过包括
交互而不包括test:group:wing
和group:wing
交互来做到这一点。R允许您这样做,但模型不一定有意义。。。我有点惊讶你最终得到了这个模型规范——通常是test:wing
,和stepAIC
,以及R的其他内置模型简化工具,试图尊重边际性,因此不会让你在这里结束drop1
- 如果你真的想适应这些类型的模型,可以使用
(尽管处理异方差比较困难),或者用lmer
构造你自己的数值伪变量model.matrix()
- 检查此类混叠问题最好使用
,在模型拟合范围之外(model.matrix()
/lm
/lme
)函数本身lmer
weights=varIdent(form=~1 | test)
),因为它似乎与这个特定问题无关(我不知道这是先验的,但使用和不使用它的测试没有区别)
啊哈lmer
自动检测到模型矩阵存在秩缺陷lm
自动执行此操作,并用NA
值替换别名术语。目前,lmer
只是删除了它们,尽管在lme4的合理最新版本中,add.drop=TRUE
tofixef()
将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
所以第9-12列的和与第5列完全相同(相同的值,相反的符号)。这是怎么回事
colnames(X)[zz!=0]
## [1] "wing" "testfirst:groupC:wing" "testsecond:groupC:wing"
## [4] "testfirst:groupE:wing" "testsecond:groupE:wing"
看起来我们通过与wing交互的组交互,以及wing
变量本身,以某种方式获得了测试的所有级别
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
如果我们定义一个尊重边缘性的模型,那么我们又可以了
form3 <- speed_aver~test*group*wing+FL*(group+wing)
X1 <- model.matrix(form3,dd)
c(rankMatrix(X1)== ncol(X1)) ## TRUE
非常感谢你!我有你的想法,事实上,我违反了边际,当我开始手动反向选择。我用stepAIC得到的模型相当复杂,有点混乱(因此没有任何用处),所以我试图证明它,并手动重复选择过程。现在,我将尝试查看您的解释详细信息(对我来说不太容易=)并解决问题。再次感谢你的帮助。
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
colnames(X)[zz!=0]
## [1] "wing" "testfirst:groupC:wing" "testsecond:groupC:wing"
## [4] "testfirst:groupE:wing" "testsecond:groupE:wing"
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
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
form5 <- speed_aver~wing+test*group*wing
X3 <- model.matrix(form5,dd)
c(rankMatrix(X3)== ncol(X3)) ## TRUE