You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 23:35:20