lavaan中cfa()梯度非零收敛警告的含义及解决方法咨询
Lavaan CFA梯度未收敛警告的原因与解决办法
问题背景
运行验证性因子分析(CFA)时弹出梯度未收敛警告,此前相同代码运行正常,样本量N=327。
警告信息
lavaan WARNING:
the optimizer (NLMINB) claimed the model converged, but not all
elements of the gradient are (near) zero; the optimizer may not
have found a local solution use check.gradient = FALSE to skip
this check
模型代码
comp_model <- ' LC =~ LC_1 + LC_2 + LC_3 + LC_4 + LC_5 + LC_6 + LC_7 + LC_8 + LC_9 + LC_10 + LC_11 + LC_12 + LC_13 + LC_14 + LC_15 + LC_16 + LC_17 + LC_18 + LC_19 + LC_20 + LC_21 + LC_22 + LC_23 + LC_24 + LC_25 + LC_26 + LC_27 + LC_28 + LC_29 + LC_30 + LC_31 + LC_32 + LC_33 + LC_34 + LC_35 + LC_36 + LC_37 + LC_38 + LC_39 + LC_40 + LC_41 + LC_42 + LC_43 + LC_44 + LC_45 + LC_46 + LC_47 + LC_48 + LC_49 + LC_50 + LC_51 + LC_52 + LC_53 + LC_54 + LC_55 + LC_56 + LC_57 + LC_58 + LC_59 + LC_60 + LC_61 MTL =~ MTL_1 + MTL_2 + MTL_3 + MTL_4 + MTL_5 + MTL_6 + MTL_7 + MTL_8 + MTL_9 + MTL_10 WB =~ WB_E_1 + WB_E_2 + WB_E_3 + WB_S_1 + WB_S_2 + WB_S_3 + WB_S_4 + WB_S_5 + WB_P_1 + WB_P_2 + WB_P_3 + WB_P_4 + WB_P_5 + WB_P_6 Coping =~ Coping_A_1 + Coping_A_2 + Coping_A_3 + Coping_A_4 + Coping_A_5 + Coping_A_6 + Coping_A_7 + Coping_A_8 + Coping_A_9 + Coping_A_10 + Coping_A_11 + Coping_A_12 + Coping_A_13 + Coping_A_14 + Coping_PR_1 + Coping_PR_2 + Coping_PR_3 + Coping_PR_4 + Coping_PR_5 + Coping_PR_6 + Coping_PR_7 + Coping_PR_8 + Coping_PR_9 + Coping_PR_10 + Coping_PR_11 + Coping_PR_12 + Coping_APS_1 + Coping_APS_2 + Coping_APS_3 + Coping_APS_4 + Coping_APS_5 + Coping_APS_6 + Coping_APS_7 + Coping_APS_8 + Coping_APS_9 + Coping_APS_10 ENG =~ ENG_1 + ENG_2 + ENG_3 + ENG_4 + ENG_5 + ENG_6 + ENG_7 + ENG_8 + ENG_9 PsyCap =~ ENG_10 + ENG_11 + ENG_12 + ENG_13 + ENG_14 + ENG_15 + ENG_16 + ENG_17 + ENG_18 + ENG_19 E =~ Trait_1_E + Trait_6_E_rev A =~ Trait_2_A_rev + Trait_7_A C =~ Trait_3_C + Trait_8_C_rev ES =~ Trait_4_ES_rev + Trait_9_ES O =~ Trait_5_O + Trait_10_O_rev '
拟合代码
lavaan::cfa(model = comp_model, data = CFA_data, std.lv = F)
输出摘要(开头部分)
lavaan 0.6-12 did NOT end normally after 296 iterations ** WARNING ** Estimates below are most likely unreliable Estimator ML Optimization method NLMINB Number of model parameters 355 Number of observations 327 Parameter Estimates: Standard errors Standard Information Expected Information saturated (h1) model Structured Latent Variables: Estimate Std.Err z-value P(>|z|) ci.lower ci.upper Std.lv Std.all LC =~ LC_1 1.000 1.000 1.000 0.215 0.342 LC_2 1.234 NA NA NA 0.265 0.460 LC_3 1.304 NA NA NA 0.280 0.484 LC_4 1.417 NA NA NA 0.304 0.427 LC_5 1.294 NA NA NA 0.278 0.427 LC_6 1.250 NA NA NA 0.268 0.465
核心原因
- 参数-样本量失衡:模型有355个参数,样本量仅327,参数数量接近甚至超过样本量,导致估计自由度不足,优化器无法找到稳定的收敛点。
- 潜变量指标数量极端:
- LC因子有61个指标,Coping因子有40个,过多指标会导致载荷估计冗余,增加优化难度;
- E/A/C/ES/O等因子仅2个指标,虽满足最低识别要求,但参数估计稳定性差,容易与其他因子的参数优化产生冲突。
- 数据或环境变化:此前运行正常可能是使用了不同数据集,当前数据可能存在极端值、缺失值分布变化,或者lavaan版本、R环境更新导致优化逻辑微调,引发收敛问题。
解决办法
1. 精简模型结构(最关键)
- 缩减多指标因子:对LC、Coping这类超大因子先做探索性因子分析(EFA),筛选载荷低于0.4的指标删除,或合并高度相关的指标,将每个潜变量的指标数控制在10-15个以内,甚至更少。
- 调整双指标因子:E/A/C/ES/O仅2个指标,要么增加对应维度的测量题项,要么直接将这些变量作为显变量纳入模型,减少潜变量参数数量。
2. 优化拟合参数
- 更换优化器:改用BFGS优化器,它在处理复杂模型时比NLMINB更稳健:
lavaan::cfa(model = comp_model, data = CFA_data, std.lv = F, optimizer = "BFGS") - 增加迭代次数:给优化器更多收敛空间:
lavaan::cfa(model = comp_model, data = CFA_data, std.lv = F, iter.max = 1000) - 临时关闭梯度检查:仅作为排查手段,不能作为最终解决方案:
lavaan::cfa(model = comp_model, data = CFA_data, std.lv = F, check.gradient = FALSE)
3. 数据预处理
- 清理极端值与缺失值:用
boxplot()或outlierTest()识别极端值并处理,缺失值采用多重插补(如mice包)或删除法(确保样本量仍足够)。 - 标准化显变量:对所有观测变量做标准化处理,帮助优化器更快找到稳定解:
CFA_data <- scale(CFA_data)
4. 分步建模验证
先拟合单个潜变量的子模型,确认每个子模型收敛稳定后,再逐步合并成完整模型,定位可能引发问题的模块。
内容的提问来源于stack exchange,提问作者Ana C. Ruiz Pardo
相关产品推荐
相关产品推荐

