我正试图使用glmmTMB
来运行我的模型的多次迭代,但不断出现相同的连续错误。我试着在下面解释我的实验,并插入了我试图运行的完整模型。
实验背景
我试图建模的因变量是细菌16S基因拷贝数,在这种情况下用作细菌生物量的指标。
实验设计是,我有来自8条河流的沉积物,它们沿着污染梯度下降(被影响到原始状态)。(因子1=流,有8个级别)。
对8个流中的每一个进行以下操作,将沉淀物添加到6个托盘中。其中3个托盘被放置在加热至13°C的人工流道中,而其他3个托盘则被加热至17°C(因子2=加热处理,有2个水平)。总共有16个通道,加温治疗被随机分配到一个通道。
然后,我在四个时间点上重复测量每个流通道中的3个托盘(因子3=天,有4个水平)。
此时此刻,我将托盘视为真正的生物复制品,而不是伪复制品,因为托盘在通道中彼此相距甚远,但这一点有待探索。
因此,总结一下:模型条款是(所有条款都被指定为因素):
- 加温处理(13℃对17℃)
- 流ID(1,2,3,4,5,6,7,8)
- 第天(T1、T4、T7、T14)
我提出的完整模型是
X4_tmb.nb2<-glmmTMB(CopyNo~Treatment*Stream*Time, family=nbinom2, data=qPCR)
尽管这个版本的模型不包括随机效果,但我想使用glmmTMB
包,而不是使用lme4
运行它,因为我想探索添加模型组件以考虑分散的想法,还想探索添加托盘作为随机效果的选项(不确定这是否正确)。通过在glmmTMB
中运行所有版本的模型,我能够自信地比较他们的AIC分数。如果我在lme4
中运行没有色散分量的完整模型,而其他模型使用glmmTMB
,我将无法做到这一点。
不幸的是,当使用glmmTMB时,对于完整模型的大多数迭代(我的意思是按顺序删除模型项),我会得到相同的持续警告:
警告消息:在fitTMB(TMBStruc)中:模型收敛问题;错误收敛(8)。参见小插曲("故障排除")
我试图理解这个错误,但我很难理解,因为令人困惑的是,当我使用lme4运行完整模型时,它运行时没有错误。
这是在lme4、中运行的完整模型的版本
X4 = glm.nb(CopyNo~Treatment*Stream*Time, data = qPCR
据我所知https://www.biorxiv.org/content/10.1101/132753v1.full.pdf@行225,可以使用该包在GLM和GLMM之间进行交叉比较。你知道我是否正确理解了这一点吗?
我还使用了DHARMa
包来帮助验证使用glmmTMB
未能收敛的模型和版本,通过了KStest、离散度test、异常值test和组合调整分位数test,但理想情况下我不希望出现收敛误差。
如有任何帮助,我们将不胜感激。
这里有一堆。
警告信息
不幸的是,很难对此做太多:这是一个臭名昭著的模糊错误消息。正如推特上建议的那样,你可以尝试不同的优化器,例如包括
control = glmmTMBControl(optimizer = optim, optArgs = list(method="BFGS"))
在您的通话中。希望这能给出一个非常相似的答案(在这种情况下,你会得出结论,收敛警告可能是误报,因为不同的优化器不太可能以相同的方式失败)。(您可以尝试上面的method="CG"
作为第三种选择。)(请注意,在使用最近修复的备用优化器时,打印和汇总输出有一个小错误;如果您正在处理这个问题,则可能需要在修复传播到CRAN之前安装开发版本。)
"lme4"型号
glm.nb()
函数不是来自lme4
包的,而是来自MASS
包。如果你在模型中有随机效果,你会使用glmer.nb()
,在lme4
包中是。。。与上面的优化器切换测试一样,如果您在glmmTMB
和glm.nb
中得到类似的答案,则可以得出结论,来自glmmTMB
的警告(实际上是来自glmmTMB
内部调用的nlminb()
优化器)可能是误报。
检查不同包装的可能性/AIC是否相称的最简单方法是,如果可能的话,在两个包装中都适合相同的模型,例如
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值);我建议将Stream制作成随机效果,即
CopyNo ~ Treatment + (Treatment|StreamID) + (1|Time/StreamID)
这符合(1)整体治疗效果;(2) 流间变化、流间处理效果的变化;(3) 跨时间和跨时间点内的流的变化。这只使用2(固定:截距+治疗)+3(截距方差、治疗方差及其在流之间的协方差)+2(时间内和流之间的方差)。这并不完全是"最大"模型;由于两种处理都是在每个流中的每个时间测量的,最后一项可能是(Treatment|time/StreamID),但这会增加很多模型复杂性。由于4组对随机效果来说不算多,你可能会发现你想把最后一个项变成Time + (1|Time:StreamID)
,它将适合固定的时间和随机的(时间内的流)。。。