使用glmer.nb的nb.control参数

时间:2017-10-02 21:18:44

标签: r

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

1 个答案:

答案 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