Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在LME中出现反向选择,在反向求解中出现奇异性_R_Mixed Models - Fatal编程技术网

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
    test:wing
    交互来做到这一点。R允许您这样做,但模型不一定有意义。。。我有点惊讶你最终得到了这个模型规范——通常是
    stepAIC
    ,和
    drop1
    ,以及R的其他内置模型简化工具,试图尊重边际性,因此不会让你在这里结束
  • 如果你真的想适应这些类型的模型,可以使用
    lmer
    (尽管处理异方差比较困难),或者用
    model.matrix()
    构造你自己的数值伪变量
  • 检查此类混叠问题最好使用
    model.matrix()
    ,在模型拟合范围之外(
    lm
    /
    lme
    /
    lmer
    )函数本身
为了简单起见,我将省略方差模型(
weights=varIdent(form=~1 | test)
),因为它似乎与这个特定问题无关(我不知道这是先验的,但使用和不使用它的测试没有区别)

啊哈
lmer
自动检测到模型矩阵存在秩缺陷
lm
自动执行此操作,并用
NA
值替换别名术语。目前,
lmer
只是删除了它们,尽管在
lme4的合理最新版本中,
add.drop=TRUE
to
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
所以第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