如何解决glmer混合效应模型的收敛错误问题?
我运行以下代码时持续遇到相同错误:
model5 <- glmer(violentyn~vpul + bmi_new + wmax + (1|fid), data = cohort4, family = binomial)
得到的警告信息:
1: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, :
Model failed to converge with max|grad| = 0.254024 (tol = 0.002, component 1)
2: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, :
Model is nearly unidentifiable: very large eigenvalue
Rescale variables?
变量说明
以儿子的静息心率(连续变量,vpul)为预测变量,BMI(bmi_new)和体能变量(wmax)为协变量(均为连续变量),预测儿子的暴力行为(二元变量violentyn,0/1),并按家庭ID(fid)聚类。数据集为大规模人群数据,包含父子信息,但当前仅使用儿子的变量。
我尝试在代码末尾添加优化器设置:control=glmerControl(optimizer="bobyqa")),但仍出现相同错误。
请问:1)该错误产生的原因是什么?2)有哪些解决方法?
运行allFit后的结果
> summary(Newmodel) $which.OK bobyqa Nelder_Mead nlminbwrap optimx.L-BFGS-B nloptwrap.NLOPT_LN_NELDERMEAD TRUE TRUE TRUE TRUE TRUE nloptwrap.NLOPT_LN_BOBYQA TRUE $msgs $msgs$bobyqa $msgs$bobyqa[[1]] [1] "Model failed to converge with max|grad| = 0.0492524 (tol = 0.002, component 1)" $msgs$bobyqa[[2]] [1] "Model is nearly unidentifiable: very large eigenvalue\n - Rescale variables?" $msgs$Nelder_Mead $msgs$Nelder_Mead[[1]] [1] "Model failed to converge with max|grad| = 0.0208731 (tol = 0.002, component 1)" $msgs$Nelder_Mead[[2]] [1] "Model is nearly unidentifiable: very large eigenvalue\n - Rescale variables?" $msgs$nlminbwrap [1] "boundary (singular) fit: see help('isSingular')" $msgs$`optimx.L-BFGS-B` [1] "unable to evaluate scaled gradient" "Model failed to converge: degenerate Hessian with 1 negative eigenvalues" $msgs$nloptwrap.NLOPT_LN_NELDERMEAD [1] "unable to evaluate scaled gradient" "Model failed to converge: degenerate Hessian with 1 negative eigenvalues" $msgs$nloptwrap.NLOPT_LN_BOBYQA [1] "Model failed to converge with max|grad| = 17.0248 (tol = 0.002, component 1)" $fixef (Intercept) bobyqa -12.325043 Nelder_Mead -12.326691 nlminbwrap -3.119328 optimx.L-BFGS-B -12.328315 nloptwrap.NLOPT_LN_NELDERMEAD -12.325046 nloptwrap.NLOPT_LN_BOBYQA -11.525685 $llik bobyqa Nelder_Mead nlminbwrap optimx.L-BFGS-B nloptwrap.NLOPT_LN_NELDERMEAD -7945.366 -7945.358 -15968.103 -7945.366 -7945.365 nloptwrap.NLOPT_LN_BOBYQA -7987.759 $sdcor fid.(Intercept) bobyqa 28.77715048132 Nelder_Mead 28.81300356231 nlminbwrap 0.00004213222 optimx.L-BFGS-B 28.83265512110 nloptwrap.NLOPT_LN_NELDERMEAD 28.79536607386 nloptwrap.NLOPT_LN_BOBYQA 22.37746729938 $theta fid.(Intercept) bobyqa 28.77715048132 Nelder_Mead 28.81300356231 nlminbwrap 0.00004213222 optimx.L-BFGS-B 28.83265512110 nloptwrap.NLOPT_LN_NELDERMEAD 28.79536607386 nloptwrap.NLOPT_LN_BOBYQA 22.37746729938 $times user.self sys.self elapsed user.child sys.child bobyqa 169.55 12.90 182.62 NA NA Nelder_Mead 240.92 18.10 259.18 NA NA nlminbwrap 9.69 0.37 10.06 NA NA optimx.L-BFGS-B 226.92 10.24 237.44 NA NA nloptwrap.NLOPT_LN_NELDERMEAD 136.09 5.62 141.89 NA NA nloptwrap.NLOPT_LN_BOBYQA 80.90 3.26 84.19 NA NA $feval bobyqa Nelder_Mead nlminbwrap optimx.L-BFGS-B nloptwrap.NLOPT_LN_NELDERMEAD 142 191 NA 50 103 nloptwrap.NLOPT_LN_BOBYQA 96 attr(,"class") [1] "summary.allFit"
1. 错误产生的原因
从警告和allFit结果来看,核心问题有两点:
- 模型收敛失败:最大梯度值超过了容忍阈值(tol=0.002),说明优化算法寻找最优参数时未达到稳定状态。
- 模型近乎不可识别:特征值过大,结合
nlminbwrap的“边界(奇异)拟合”提示,以及不同优化器给出的组间标准差差异极大(从接近0到28以上),说明组间随机效应的方差几乎为0,或与固定效应参数存在共线性。
此外,二元因变量(暴力行为)可能存在类别不平衡(比如暴力行为样本占比极低),这会大幅提升逻辑斯蒂混合模型的优化难度,也是收敛失败的潜在诱因。
2. 解决方法
(1)标准化/缩放连续变量
警告明确提示“Rescale variables?”,这是最优先尝试的方案:
将所有连续预测变量标准化为均值0、标准差1的变量,或缩放到0-1区间。示例代码:
cohort4$vpul_z <- scale(cohort4$vpul) cohort4$bmi_new_z <- scale(cohort4$bmi_new) cohort4$wmax_z <- scale(cohort4$wmax) # 用标准化后的变量重新拟合模型 model5 <- glmer(violentyn~vpul_z + bmi_new_z + wmax_z + (1|fid), data = cohort4, family = binomial, control=glmerControl(optimizer="bobyqa"))
缩放变量能缩小参数间的数值差异,降低优化过程中的数值不稳定问题,同时缓解模型不可识别性。
(2)处理类别不平衡
如果暴力行为(violentyn=1)样本占比极低:
- 可使用加权逻辑斯蒂模型,给少数类样本赋予更高权重;
- 尝试Firth惩罚逻辑斯蒂混合模型,用
brglm2包实现,该方法专门针对分离数据(类别极端不平衡),能提升模型稳定性。
(3)调整优化器与收敛阈值
从allFit结果看,bobyqa和Nelder_Mead的结果相对一致,可尝试放宽收敛阈值或增加迭代次数:
model5 <- glmer(violentyn~vpul_z + bmi_new_z + wmax_z + (1|fid), data = cohort4, family = binomial, control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=10000), # 增加最大迭代次数 checkConv=checkConvControl(grad=0.01) # 放宽梯度容忍阈值 ))
(4)简化模型
如果组间随机效应方差确实接近0,说明按家庭ID聚类的结构对模型无显著贡献,可去掉随机效应,使用普通逻辑斯蒂回归:
model5 <- glm(violentyn~vpul_z + bmi_new_z + wmax_z, data = cohort4, family = binomial)
之后可用似然比检验比较混合模型与普通模型的拟合优度,验证随机效应是否必要。
(5)使用贝叶斯方法
若频繁出现收敛问题,换用贝叶斯框架拟合模型更稳定,比如用brms包:
library(brms) model5 <- brm(violentyn~vpul_z + bmi_new_z + wmax_z + (1|fid), data = cohort4, family = binomial, prior = prior(normal(0, 1), class = b) + prior(cauchy(0, 1), class = sd))
贝叶斯方法通过引入先验分布,能缓解参数不可识别问题,且无需依赖优化算法的收敛性判断。
内容的提问来源于stack exchange,提问作者Bridget

