我正在使用R的glmer.nb
包中的lme4
函数研究负二项模型。实际模型本身有点复杂,但应该(至少我相信)统计上合理。我现在的问题出现了,因为该模型难以收敛并返回此警告:
In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, :
Model failed to converge with max|grad| = 0.00753068 (tol = 0.001, component 1)
大多数时候,我在标准glmer
函数内工作,当我收到此警告时,我将此参数添加到glmer
函数中:
glmerControl(optimizer="bobyqa", optCtrl = list(maxfun = 100000))
这通常可以解决问题。现在,查看glmer.nb
的帮助文件,glmer.nb
的类似参数似乎是nb.control
。但是,当我将glmerControl
更改为nb.control
时,R会返回一个无法找到该功能的错误。好的,没关系。从帮助文件中的给定语法看,nb.control
看起来应该被设置为等于所需控制参数的列表。我已经尝试了各种方法来获得我想要的两个更改,而R只是不断删除nb.control
警告" extra argument(s) ‘nb.control’ disregarded
"
我尝试使用互联网搜索大量资源,例如使用nb.control
参数的人。我发现的大多数事情(我已经找不到,因此这个问题)似乎只是建议使用glmerControl
中的glmer
参数。当我提出这个论点时,似乎并没有解决问题。
基本上,我只是想知道如何使用nb.control
参数将优化器更改为' bobyqa'并将迭代次数更改为高于默认值的数字。当nb.control
参数不是NULL
的defauilt值时,使用onclick
参数的语法是什么?任何想法将不胜感激。谢谢!
答案 0 :(得分:3)
这有点违反直觉,但你应该使用control=glmerControl(...)
,就像你对类似的glmer
拟合一样 - 这将被传递到内循环。
设置数据等:
library(lme4)
dd <- expand.grid(f1 = factor(1:3),
f2 = LETTERS[1:2], g=1:9, rep=1:15)
dd$y <- simulate(~f1+f2+(1|g),
newparams=list(beta=rep(1,4),
theta=1),
newdata=dd,
seed=101,
family=negative.binomial(theta=1.5))[[1]]
Fit&#34; vanilla&#34;:
m.nb <- glmer.nb(y ~ f1+f2 + (1|g), data=dd)
检查优化信息:
m.nb@optinfo[c("optimizer","control")]
## $optimizer
## [1] "Nelder_Mead"
##
## $control
## $control$verbose
## [1] 0
适合其他优化器/等:
m.nb2 <- glmer.nb(y ~ f1+f2 + (1|g), data=dd,
control=glmerControl(optimizer="bobyqa",
optCtrl=list(maxfun=1e5)))
检查我们确实改变了一些东西:
m.nb2@optinfo[c("optimizer","control")]
## $optimizer
## [1] "bobyqa"
##
## $control
## $control$maxfun
## [1] 1e+05
##
## $control$iprint
## [1] 0