我一直在使用模块化
lme4
函数来自定义我们的一些问题,我注意到控制参数似乎在模块化函数中被忽略,或者我只是没有将其放在正确的位置。这是一个基于 https://rpubs.com/bbolker/groupmembers 的 rpub 的最小示例
你能帮我找到我错过了什么,因为我无法使用模块化 lme4 函数更改优化器吗?
nm <- 20
nobs <- 500
set.seed(101)
## choose items for observations
pres <- matrix(rbinom(nobs*nm, prob=0.25, size=1), nrow=nobs, ncol=nm)
dimnames(pres) <- list(NULL, LETTERS[seq(nm)])
pres[1:5, ]
b <- rnorm(nm) ## item-level effects
## n.b. get in trouble if we don't add residual error
## (theta is scaled relative to residual error)
## here, use theta=sigma=1
y <- c(pres %*% b) + rnorm(nobs, sd=1)
## helpful to specify a factor with the right levels:
## actual values are unimportant since we will specify Zt/Ztlist directly
fake <- rep(LETTERS[seq(nm)], length.out=nobs)
lmod <- lFormula(y ~ 1 + (1 | fake), control=lmerControl(
optimizer="bobyqa",
optCtrl=list(maxeval=1)
))
lmod$reTrms$Zt <- lmod$reTrms$Ztlist[[1]] <- Matrix(t(pres))
devfun <- do.call(mkLmerDevfun, lmod)
opt <- optimizeLmer(devfun)
m1 <- mkMerMod(environment(devfun), opt, lmod$reTrms, fr=lmod$fr)
summary(m1)
m1@optinfo$optimizer # does not coincide with requested optimizer
# [1] "nloptwrap"
tl;dr 将
control
包含在传递给 mkLmerDevfun
的参数列表中。如果我们看一下mkLmerDevfun
的论点:
args(mkLmerDevfun)
function (fr, X, reTrms, REML = TRUE, start = NULL, verbose = 0,
control = lmerControl(), ...)
如果我们看看
lmer
本身如何调用 mkLmerDevfun
(这里):
devfun <- do.call(mkLmerDevfun,
c(lmod,
list(start=start, verbose=verbose, control=control)))
我们可以看到
start
、verbose
和 control
不是从 lFormula
继承而来。从逻辑上讲,这是因为这些参数控制优化的完成方式,而不是适应模型所需的数据结构的构造。
因此,您需要在模块化拟合的
start
步骤中包含 verbose
、control
和 mkLmerDevfun()
组件(如果与默认值不同)——事实上,它比这稍微糟糕一些,一些论点必须也可在optimizeLmer
步骤提供1:
## we have to use 'maxfun' and not 'maxeval' for bobyqa()
ctrl <-lmerControl(optimizer="bobyqa", optCtrl=list(maxfun=1))
devfun <- do.call(mkLmerDevfun, c(lmod, list(control = ctrl)))
opt <- optimizeLmer(devfun, optimizer = ctrl$optimizer,
control = ctrl$optCtrl)
1:由于历史原因,这有点混乱