首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >glmmTMB + lme4中错误收敛误差的理解与修正

glmmTMB + lme4中错误收敛误差的理解与修正
EN

Stack Overflow用户
提问于 2020-06-19 21:08:36
回答 1查看 2.6K关注 0票数 1

我正在尝试使用glmmTMB来运行我的模型的一些迭代,但始终得到相同的持续错误。我试着在下面解释我的实验,并插入我想要运行的完整模型。

实验背景

我试图模拟的因变量是细菌16S基因拷贝数,在这种情况下用作细菌生物量的代名词。

实验设计是,我有来自8条河流的河流沉积物,它们沿着污染梯度下降(影响到原始的)。(因子1=流,有8级)。

对8条溪流中的每一条进行了以下操作,将沉积物添加到6个托盘中。其中3只被放置在温度13°C的人工河道中,其余3只被加热到17°C (因子2=升温处理,2级)。总共有16个通道,并随机将暖化处理分配到一个通道。

然后,我在四个时点重复测量每个溪流通道中的三个托盘(第3因子=日,有4个水平)。

此时此刻,我把托盘当作一个真正的生物复制物,而不是假的,因为托盘在通道中相距很远,但这是有待探索的。

因此,简单地总结一下:模型术语是(所有这些都被指定为因素):

  • 升温处理(13对17摄氏度)
  • StreamID (1,2,3,4,5,6,7,8)
  • 日(T1,T4,T7,T14)

我提出的完整模型是,

代码语言:javascript
复制
X4_tmb.nb2<-glmmTMB(CopyNo~Treatment*Stream*Time, family=nbinom2, data=qPCR)   

尽管该模型的这个版本不包含随机效应,但我希望使用glmmTMB包,而不是使用lme4运行它,因为我想探索添加模型组件以考虑色散的想法,并探索添加托盘作为随机效应的选项(不确定这是否正确)。通过在glmmTMB中运行所有版本的模型,我能够自信地比较它们的AIC分数。如果没有lme4中的分散组件和使用glmmTMB的其他组件,我就无法运行完整的模型。

不幸的是,在使用glmmTMB时,对于整个模型的大多数迭代(我的意思是依次删除模型术语),我得到了相同的常量警告:

警告消息:在fitTMB(TMBStruc)中:模型收敛问题;假收敛(8)。见vignette(“故障排除”)

我试图理解这个错误,但是我很难理解,因为当我使用lme4运行完整的模型时,它没有任何错误。

这是运行在lme4中的完整模型的版本,

代码语言:javascript
复制
X4 = glm.nb(CopyNo~Treatment*Stream*Time, data = qPCR

据我从https://www.biorxiv.org/content/10.1101/132753v1.full.pdf @第225行中了解到,可以使用这个包在GLMs和GLMs之间进行交叉比较。你知道我是否理解得对吗?

我还使用DHARMa包来帮助验证使用glmmTMB无法收敛的模型和版本,通过了KStest、色散检验、离群点检验和组合调整分位数检验,但理想情况下我不希望收敛误差。

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2020-06-19 23:49:35

这里有一堆人。

警告讯息

不幸的是,很难做到这一点:它是一个声名狼藉的错误信息。作为推特上建议,您可以尝试不同的优化器,例如包括

代码语言:javascript
复制
 control = glmmTMBControl(optimizer = optim, optArgs = list(method="BFGS"))

在你的电话里。希望这将给出一个非常相似的答案(在这种情况下,您的结论是收敛警告可能是错误的,因为不同的优化器不可能以相同的方式失败)。(您可以尝试将上面的method="CG"作为第三种选择。)(请注意,在使用替代优化器(即最近修正了)时,有一个打印和总结输出的小错误;如果在修复程序传播到CRAN之前正在安装开发版本,则可能需要安装开发版本。)

"lme4“模型

glm.nb()函数不是来自lme4包,而是来自MASS包。如果模型中有随机效应,您将使用glmer.nb(),它在lme4包中.与上面的优化器切换测试一样,如果您在glmmTMBglm.nb中得到类似的答案,您可以得出结论,来自glmmTMB的警告(实际上,来自glmmTMB内部调用的nlminb()优化器)可能是错误的。

检查来自不同包的可能性/AICs是否相称的最简单的方法是,如果可能的话,在两个包中安装相同的模型。

代码语言:javascript
复制
library(MASS)
library(glmmTMB)

quine.nb1 <- glm.nb(Days ~ Sex/(Age + Eth*Lrn), data = quine)
quine.nb2 <- glmmTMB(Days ~ Sex/(Age + Eth*Lrn), data = quine,
                     family=nbinom2)
all.equal(AIC(quine.nb1),AIC(quine.nb2))  ## TRUE

其他细节

模型中可能存在的问题之一是,通过拟合三个范畴变量的全部三向交互作用,您将尝试估计(2*4*8=) 64个参数,并将其与64*3=192观测值(如果我正确理解您的实验设计)。这两种方法都更有可能遇到数值问题(如上面所述),并且可能给出不精确的结果。虽然有些人推荐它,但我不建议亲自推荐一种模型选择方法(全子集或顺序的、基于AIC的或基于p值的);我建议将流变成随机效应,例如:

代码语言:javascript
复制
CopyNo ~ Treatment + (Treatment|StreamID) + (1|Time/StreamID)

这符合(1)总体治疗效果;(2)跨流变化,跨流治疗效果变化;(3)跨时间和跨时间点跨流变化。这只使用2(固定的:截获+处理)+3(拦截方差、处理方差以及它们跨流的协方差)+2(时间和时间内的流之间的方差)。这并不完全是“最大”模型;因为这两种处理都是在每个流中的每一时间测量的,所以最后一项可能是(处理_由于4个组对随机效应的影响不大,您可能会发现,您希望将最后一个项放入Time + (1|Time:StreamID)中,这将使时间与固定的时间和(时间内的流)作为随机的.

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62478569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档