如何确保模块化 lme4 接受控制参数?

问题描述 投票:0回答:1

我一直在使用模块化

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"
r lme4
1个回答
0
投票

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:由于历史原因,这有点混乱

© www.soinside.com 2019 - 2024. All rights reserved.