有序Likert数据多组CFA低频类别报错的原因及解决方法
多组有序CFA空类别报错差异原因与修复方案
问题背景
使用Likert量表数据运行心理测量工具的多组CFA,已将数据转换为有序类型,采用WLSMV估计法与theta参数化。
初始CFA模型代码
model_ord <- ' depression =~ f1h09_ordinal+f1h16_ordinal+f1h17_ordinal+f1h18_ordinal+f1h35_ordinal+f1h50_ordinal anxiety =~ f1h01_ordinal+f1h12_ordinal+f1h19_ordinal+f1h38_ordinal+f1h45_ordinal+f1h49_ordinal somatization =~ f1h02_ordinal+f1h07_ordinal+f1h23_ordinal+f1h29_ordinal+f1h33_ordinal+f1h37_ordinal depression~~anxiety anxiety~~somatization depression~~somatization' # use the cfa function from the lavaan package to fit a CFA of our model fit_ord <- cfa(model_ord, data=d_ord, estimator='WLSMV', std.lv=TRUE, parameterization="theta")
初始运行警告
Warning message: In lav_model_vcov(lavmodel = lavmodel, lavsamplestats = lavsamplestats, : lavaan WARNING: The variance-covariance matrix of the estimated parameters (vcov) does not appear to be positive definite! The smallest eigenvalue (= -1.030933e-16) is smaller than zero. This may be a symptom that the model is not identified.
注:该警告为浮点计算精度导致的误报,-1e-16的特征值属于机器误差范围,不代表模型存在识别问题
分组运行报错情况
- 按性别分组(分组变量
f103)
config_ord <- cfa(model_ord, data=d_ord, estimator='WLSMV', std.lv=TRUE, group="f103", parameterization="theta")
报错信息:
Error in lav_samplestats_step1(Y = Data, wt = wt, ov.names = ov.names, : lavaan ERROR: some categories of variable `f1h35_ordinal' are empty in group 1; frequencies are [75 15 2 0 0]
模型直接终止运行,无拟合结果返回。
- 按伴侣状态分组(分组变量
binaryrelationship)
config_ord2 <- cfa(model_ord2, data=d_ord, estimator='WLSMV', std.lv=TRUE, group="binaryrelationship", parameterization="theta")
报错信息:
Error in lav_samplestats_step1(Y = Data, wt = wt, ov.names = ov.names, : lavaan ERROR: some categories of variable `f1h35_ordinal' are empty in group 1; frequencies are [98 22 4 3 0]
报错后仍返回模型拟合结果。
报错差异原因
两种场景下空类别的数量和分布不同,触发了lavaan不同的校验逻辑:
- 性别分组场景下,
f1h35_ordinal有2个连续的最高类别为空,有效响应类别仅3个,空类别占总类别数的40%,lavaan判定无法估计该变量的阈值参数,直接终止运行。 - 伴侣状态分组场景下,仅1个最高类别为空,有效响应类别为4个,lavaan的兼容逻辑会自动折叠最高空类别后继续估计,仅输出错误提示但仍返回拟合结果,该差异与lavaan版本的校验规则有关。
修复方案
- 合并低频率类别:将
f1h35_ordinal的最高两个响应类别合并为同一类别,确保所有分组下每个类别的观测数≥5,符合有序CFA的估计要求,是最推荐的处理方案。 - 剔除问题条目:若该条目对抑郁因子的载荷较低,且分组下响应偏差不具备研究意义,可以直接将
f1h35_ordinal从测量模型中剔除,避免空类别干扰。 - 显式触发自动折叠:在
cfa()函数中添加ordered = TRUE, group.equal = c("thresholds")参数,显式指定有序变量阈值跨组约束,触发lavaan的空类别自动折叠逻辑,无需手动合并类别。
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

