使用mice与semTools进行SEM缺失值插补后无法获取p值与拟合指数
解决SEM多重插补后标准化系数与拟合指标获取问题
问题本质
你遇到的是sem.mi()/runMI()返回的pooled模型对象不兼容lavaan通用函数的问题——普通summary()、fitMeasures()无法直接处理这类多重插补合并后的模型,需要用semTools专为MI设计的工具函数。
解决方案
1. 提取标准化系数
使用standardizedSolution.mi()(semTools专属方法)替代summary(standardized=TRUE):
# 针对runMI/sem.mi返回的pooled_model std_results <- standardizedSolution.mi(pooled_model) print(std_results)
该函数会输出合并后的标准化系数(含std.all/std.nox/std.lv等维度)、标准误、p值等完整统计量。
2. 获取模型拟合指标
用fitMeasures.mi()替代通用fitMeasures():
fit_stats <- fitMeasures.mi(pooled_model) print(fit_stats)
此函数会合并15个插补数据集的拟合结果,返回CFI、TLI、RMSEA、SRMR等常用指标。
3. 整合非标准化与标准化输出
若需同屏查看两类系数,可组合基础summary和标准化结果:
# 非标准化系数汇总 summary(pooled_model) # 标准化系数补充输出 cat("\n=== 标准化系数 ===\n") print(std_results[, c("lhs", "op", "rhs", "est.ave", "std.all", "p.ave")])
4. 模拟数据集验证代码
以下完整流程可复现并验证解决方案:
library(mice) library(semTools) library(lavaan) # 生成带缺失值的模拟SEM数据 set.seed(123) dat <- simulateData(" f1 =~ x1 + x2 + x3 f2 =~ x4 + x5 + x6 f1 ~~ f2 ", sample.nobs = 200) dat <- ampute(dat, prop = 0.2)$amputed # 加入20%缺失值 # 生成15个插补数据集 imp <- mice(dat, m = 15, printFlag = FALSE) # 定义SEM模型 sem_model <- ' f1 =~ x1 + x2 + x3 f2 =~ x4 + x5 + x6 f1 ~~ f2 ' # 运行多重插补SEM pooled_model <- runMI(sem_model, data = imp, fun = "sem") # 获取标准化系数 std_results <- standardizedSolution.mi(pooled_model) # 获取拟合指标 fit_stats <- fitMeasures.mi(pooled_model) # 查看结果 print(std_results) print(fit_stats)
注意事项
- 必须使用semTools中带
.mi后缀的方法,这类方法专门适配多重插补后的pooled模型对象。 - 确认
runMI()传入的是mice生成的mids对象,而非手动拆分的数据集列表;若用sem.mi(),需确保输入的是插补数据集列表(complete(imp, "all"))。
内容的提问来源于stack exchange,提问作者Lisa Mauch
相关产品推荐
相关产品推荐

