如何确保模块化lme4函数识别control参数?
问题原因
你在lFormula()中传入的control参数仅作用于公式解析阶段,优化器的配置需要传递给optimizeLmer()函数——这才是实际执行模型优化的核心环节。原代码里optimizeLmer(devfun)未指定控制参数,因此它会使用默认的lmerControl()配置(默认优化器为nloptwrap),导致你设置的bobyqa未生效。
解决步骤
- 单独定义控制参数(可选,让代码更清晰):
ctrl <- lmerControl( optimizer="bobyqa", optCtrl=list(maxeval=1) )
- 在调用
optimizeLmer()时传入该控制参数:
opt <- optimizeLmer(devfun, control = ctrl)
完整修正代码
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) # 定义控制参数 ctrl <- lmerControl( optimizer="bobyqa", optCtrl=list(maxeval=1) ) lmod <- lFormula(y ~ 1 + (1 | fake)) lmod$reTrms$Zt <- lmod$reTrms$Ztlist[[1]] <- Matrix(t(pres)) devfun <- do.call(mkLmerDevfun, lmod) # 优化时传入控制参数 opt <- optimizeLmer(devfun, control = ctrl) m1 <- mkMerMod(environment(devfun), opt, lmod$reTrms, fr=lmod$fr) summary(m1) m1@optinfo$optimizer # 现在会显示"bobyqa"
额外说明
lFormula()的control参数主要用于控制公式解析的细节(比如检查秩亏、处理对比矩阵等),和优化器配置完全无关。- 在lme4的模块化接口中,
optimizeLmer()是负责调用优化器的关键函数,所有和优化相关的控制参数都需要传递给它。
内容的提问来源于stack exchange,提问作者covaruberpaz
相关产品推荐
相关产品推荐

