在LME中向后选择,在后向解决中出现奇点

时间:2014-10-19 11:25:14

标签: r mixed-models

我有数据,其中“飞行速度”是响应变量和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

1 个答案:

答案 0 :(得分:8)

事实证明这非常棘手。我认为问题在于,由于您构建第二个公式的方式,R不会自动从模型矩阵中删除共线变量。

tl; dr 这是一种意识流,但我认为基本的回家点是

  • lme并不一定在您的模型规范中检查/处理别名(与lm不同,或者在较小程度上lmer
  • 如果您违反了边缘性,您可能会遇到R&R的公式问题,您在此处通过包含test:group:wing互动而未包含{{1 }和group:wing互动。 R允许你这样做,但模型并不一定有意义......我对你最终得到这个模型规范感到有些惊讶 - 通常test:wingstepAIC和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的合理最新版本(已记录但未公布)选项lme4add.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