lmer()中的“模型无法收敛”警告


21

对于以下数据集,我想查看响应(效果)是否随站点,季节,持续时间及其相互作用而变化。一些在线统计论坛建议我继续使用线性混合效应模型,但是问题在于,由于每个站点内的重复样本都是随机的,因此我几乎没有机会连续几个季度从完全相同的位置收集样本(例如,季风后s1的repl-1可能与季风不同。这与临床试验(采用受试者内部设计)不同,在临床试验中,您会按季节重复测量同一受试者。但是,考虑到站点和季节是随机因素,我运行了以下命令并收到警告消息:

Warning messages:
1: In checkConv(attr(opt, "derivs"), optpar,ctrl=controlpar,ctrl=controlcheckConv, 
: unable to evaluate scaled gradient
2: In checkConv(attr(opt, "derivs"), optpar,ctrl=controlpar,ctrl=controlcheckConv, 
: Model failed to converge: degenerate Hessian with 1 negative eigenvalues

谁能帮我解决这个问题?代码如下:

library(lme4)
read.table(textConnection("duration season  sites   effect
                          4d    mon s1  7305.91
                          4d    mon s2  856.297
                          4d    mon s3  649.93
                          4d    mon s1  10121.62
                          4d    mon s2  5137.85
                          4d    mon s3  3059.89
                          4d    mon s1  5384.3
                          4d    mon s2  5014.66
                          4d    mon s3  3378.15
                          4d    post    s1  6475.53
                          4d    post    s2  2923.15
                          4d    post    s3  554.05
                          4d    post    s1  7590.8
                          4d    post    s2  3888.01
                          4d    post    s3  600.07
                          4d    post    s1  6717.63
                          4d    post    s2  1542.93
                          4d    post    s3  1001.4
                          4d    pre s1  9290.84
                          4d    pre s2  2199.05
                          4d    pre s3  1149.99
                          4d    pre s1  5864.29
                          4d    pre s2  4847.92
                          4d    pre s3  4172.71
                          4d    pre s1  8419.88
                          4d    pre s2  685.18
                          4d    pre s3  4133.15
                          7d    mon s1  11129.86
                          7d    mon s2  1492.36
                          7d    mon s3  1375
                          7d    mon s1  10927.16
                          7d    mon s2  8131.14
                          7d    mon s3  9610.08
                          7d    mon s1  13732.55
                          7d    mon s2  13314.01
                          7d    mon s3  4075.65
                          7d    post    s1  11770.79
                          7d    post    s2  4254.88
                          7d    post    s3  753.2
                          7d    post    s1  11324.95
                          7d    post    s2  5133.76
                          7d    post    s3  2156.2
                          7d    post    s1  12103.76
                          7d    post    s2  3143.72
                          7d    post    s3  2603.23
                          7d    pre s1  13928.88
                          7d    pre s2  3208.28
                          7d    pre s3  8015.04
                          7d    pre s1  11851.47
                          7d    pre s2  6815.31
                          7d    pre s3  8478.77
                          7d    pre s1  13600.48
                          7d    pre s2  1219.46
                          7d    pre s3  6987.5
                          "),header=T)->dat1


m1 = lmer(effect ~ duration + (1+duration|sites) +(1+duration|season),
          data=dat1, REML=FALSE)

@Ian_Fin。感谢您的修改。其实,我不知道如何包含R代码如上
Syamkumar。

Answers:


47

在没有收到关于收敛失败的警告的意义上,“解决”您遇到的问题非常简单:您不使用默认的BOBYQA优化器,而是选择使用早期早期版本中默认使用的Nelder-Mead优化例程1.0.x。或者,您可以安装该软件包,optimx以便直接使用L-BFGS-B例程nlminb(或与lme4ver。之前的版本相同1)。例如:

m1 = lmer(effect~duration+(1+duration|sites)+(1+duration|season), 
          data = dat1, REML = FALSE, 
          control = lmerControl(optimizer ="Nelder_Mead")
library(optimx)
m1 = lmer(effect~duration+(1+duration|sites)+(1+duration|season), 
          data = dat1, REML = FALSE, 
          control = lmerControl(
                           optimizer ='optimx', optCtrl=list(method='L-BFGS-B')))
m1 = lmer(effect~duration+(1+duration|sites)+(1+duration|season), 
          data = dat1, REML = FALSE, 
          control = lmerControl(
                           optimizer ='optimx', optCtrl=list(method='nlminb')))

一切正常(没有警告)。有趣的问题是:

  1. 为什么您会收到这些警告?
  2. 为什么使用时REML = TRUE没有警告。

简而言之,1.您收到这些警告,是因为您duration既定义了固定效果,也定义了因子sites和的随机斜率season。该模型有效地利用了自由度,以估计斜率与您定义的截距之间的相关性。如果您使用的是边际简单的模型,例如:

m1 = lmer(effect~duration+ (1+duration|sites) + (0+duration|season) + (1|season),
          data=dat1, REML = FALSE)

您将不会遇到任何收敛问题。该模型将有效地估计每个不相关的随机截距和随机斜率season

另外,2.定义时,REML = FALSE您使用的是“估计的最大可能性”而不是“限制的最大可能性”。REML估计尝试在寻找最佳随机效应方差结构之前“分解”固定效应的影响(有关更多详细信息,请参见线程“ 什么是“受限最大似然”以及何时使用? ”)有关此问题的信息)。计算上,此过程实质上是通过将原始LME模型方程式的两个部分乘以矩阵使得,即,将原始都更改为,的Xÿ=Xβ+žγ+ϵķķX=0ÿķÿž到。我强烈怀疑这影响了设计矩阵的条件数,因此可以帮助您摆脱最初发现自己的数字难题。ķžž

最后一点是,我不确定将其season用作随机效果是否有意义。毕竟只有这么多的季节,所以您最好将它们视为固定效果。


顺便说一句,欢迎来到社区!
usεr11852恢复单胞菌说,

1
@ Syamkumar.R:太好了,很高兴我能提供帮助。如果您认为这可以回答您的问题,则可以考虑接受答案。
usεr11852恢复单胞菌说,

非常感谢你!!第三个变体- REML = FALSE, glmerControl(optimizer ='optimx', optCtrl=list(method='nlminb'))解决了in中的收敛问题glmer
好奇的

0

问题是统计上的,而不是技术上的。实际上,我使用的是随机效应模型而不是固定效应模型,我认为不应将任何因素都视为随机因素,因为我们至少需要5或6级或将其复制才能将其视为随机效应(请参见在此,随机影响因子的最小建议组数是多少?)。

上面的数据集仅包含三个重复的样本/位置/季节,这对于随机效应模型是不够的。在数据集中,持续时间为4天和7天属于同时进行的两个独立的平行实验。因此,将数据集按持续时间(4天和7天)吐出,并针对每个持续时间(季节和地点)执行2次方差分析,因为这些因素足以在此处建模效果(响应变量)。该模型应为以下模型:

lm(day_4_effect~sites*season, data=dat1)

lm(day_7_effect~sites*season, data=dat1)

感谢Bodo Winter(http://www.bodowinter.com/tutorial/bw_LME_tutorial2.pdf)和@usεr11852帮助我解决了这个问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.