我正在使用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参数的语法是什么?任何想法将不胜感激。谢谢!

最佳答案

这有点违反直觉,但是您应该为此使用control=glmerControl(...),就像您为类似的glmer fit那样使用-这将传递给内部循环。

设置数据等:

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]]

适合“ Vanilla ”:
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

关于r - 使用glmer.nb的nb.control参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46533903/

10-13 08:43