嵌套数据集混合模型不收敛问题求解
问题背景
我有一个学生嵌套于学校的数据集,包含两类变量:学校层面变量(仅跨校变化、校内无差异,比如学校社会经济指数、所在区域)和学生层面变量。使用R语言lme4包的lmer函数建模时,加入学校层面变量作为随机斜率的模型始终无法收敛,寻求解决方法。
模型与报错情况
模型1(仅随机截距,收敛正常)
m1 = lmer( english_scores ~ (1| school_id) + school_region + school_linguistic_region + school_socioeconomic + school_size + student_birth + student_gender + student_socioeconomic + student_inmigrant + student_spanish_score + student_maths_score + student_language, data=primary)
模型2(尝试加入学校层面变量作为随机斜率,报错)
m2 = lmer( english_scores ~ (1 + school_region + school_linguistic_region + school_socioeconomic + school_size | school_id) + school_region + school_linguistic_region + school_socioeconomic + school_size + student_birth + student_gender + student_socioeconomic + student_inmigrant + student_spanish_score + student_maths_score + student_language, data=primary)
运行后报错:
boundary (singular) fit: see help('isSingular') Warning message: Model failed to converge with 2 negative eigenvalues: -3.4e+00 -9.3e+00
简化随机斜率后的模型(仍有警告)
m2 = lmer( english_scores ~ (1 + school_socioeconomic + school_size | school_id) + school_socioeconomic + school_size + student_birth + student_gender + student_socioeconomic + student_inmigrant + student_spanish_score + student_maths_score + student_language, data=primary)
警告信息:
Warning messages:
1: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, :
Model failed to converge with max|grad| = 3.41928 (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?
核心问题分析
学校层面变量校内无差异,给这类变量加随机斜率在统计逻辑上不成立:随机斜率的本质是估计“变量对因变量的效应在组间的变异”,但同一学校内所有学生的学校层面变量取值完全相同,无法计算校内效应,直接导致模型识别困难、收敛失败。
具体解决步骤
- 修正模型结构:移除学校层面变量的随机斜率,仅保留随机截距(即模型1的结构)。如果要考察学校特征对效应的调节,可将学校层面变量与学生变量做固定效应交互项,而非设置随机斜率。
- 标准化连续变量:把
school_socioeconomic、school_size等连续变量标准化为均值0、标准差1的变量,降低数值计算压力。示例代码:
用标准化后的变量重新建模。primary$school_socioeconomic_z = scale(primary$school_socioeconomic) primary$school_size_z = scale(primary$school_size) primary$student_socioeconomic_z = scale(primary$student_socioeconomic) - 调整收敛控制参数:若仍需尝试随机斜率模型,可换用更稳定的优化器或增大迭代次数。示例代码:
注意:这只是缓解收敛警告的手段,无法解决模型设定的根本问题,优先调整结构。m2_adj = lmer(english_scores ~ (1 + school_socioeconomic_z + school_size_z | school_id) + school_socioeconomic_z + school_size_z + student_birth + student_gender + student_socioeconomic_z + student_inmigrant + student_spanish_score + student_maths_score + student_language, data=primary, control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 10000))) - 检查样本量:统计学校数量和各校学生数(
table(primary$school_id)),若学校数量过少(比如少于50所),随机效应的估计会极不稳定,建议放弃复杂的随机斜率模型。
内容的提问来源于stack exchange,提问作者Elena García

