如何在R中实现双因子ESEM?是否仅能在MPlus中完成?
双因子ESEM的R实现方案
核心解决方案:用lavaan包嵌套ESEM结构实现双因子模型
你之前直接调用lavaan::efa()仅得到单水平因子,是因为该函数仅支持常规EFA;双因子ESEM需要在CFA框架下同时指定一般因子和带旋转的特定因子组,具体实现如下:
1. 基础双因子ESEM拟合语法(以5个特定因子为例)
针对190个项目、WLSMV估计器、Bigeomin旋转的需求,模型需明确一般因子加载所有项目,特定因子组通过efa()函数启用交叉载荷与旋转:
library(lavaan) # 定义双因子ESEM模型 bifactor_esem_model <- ' # 一般因子:加载全部190个项目 g =~ item1 + item2 + ... + item190 # 特定因子组:用ESEM指定,启用Bigeomin斜交旋转 f1-f5 =~ efa("bigeomin")*item1 + efa("bigeomin")*item2 + ... + efa("bigeomin")*item190 ' # 拟合模型(适配分类数据的WLSMV估计器) fit <- cfa( model = bifactor_esem_model, data = your_data, # 替换为你的数据集名称 estimator = "WLSMV", rotation = "bigeomin", # 针对特定因子的旋转设置 orthogonal = FALSE, # Bigeomin为斜交旋转,需关闭正交约束 std.lv = TRUE, # 标准化潜变量载荷,便于解读 verbose = FALSE # 项目数多可关闭冗余输出加速拟合 ) # 查看结果(含一般因子、特定因子载荷及拟合指数) summary(fit, fit.measures = TRUE, standardized = TRUE)
2. 批量尝试不同特定因子数量(确定最优模型)
通过循环生成不同特定因子数的模型,对比拟合指数(CFI、TLI、RMSEA、AIC、BIC等)筛选最优解:
# 定义要测试的特定因子数量范围(示例:3-8个) test_factors <- 3:8 fit_results <- list() fit_stats <- data.frame() for(k in test_factors){ # 动态生成模型语法 model_text <- paste0(' g =~ ', paste0("item", 1:190, collapse = " + "), ' f1-', paste0("f", k), ' =~ efa("bigeomin")*', paste0("item", 1:190, collapse = " + "), ' ') # 拟合模型 current_fit <- cfa( model = model_text, data = your_data, estimator = "WLSMV", rotation = "bigeomin", orthogonal = FALSE, std.lv = TRUE, verbose = FALSE ) # 保存拟合结果与统计量 fit_results[[paste0("k=", k)]] <- current_fit stats <- fitMeasures(current_fit, c("cfi", "tli", "rmsea", "srmr", "aic", "bic")) fit_stats <- rbind(fit_stats, data.frame(n_specific = k, t(stats))) } # 输出拟合指数对比表 print(fit_stats, row.names = FALSE)
关键说明
- 双因子ESEM的核心是在CFA模型中嵌套ESEM特定因子,而非单独使用
efa()函数,这样才能同时估计一般因子与带交叉载荷的特定因子。 - Bigeomin旋转仅作用于特定因子组,一般因子保持固定载荷结构(无旋转)。
- 190个项目+2000样本量的组合,拟合耗时可能较长,可考虑启用
parallel = TRUE(需提前加载parallel包)利用多线程加速。
内容的提问来源于stack exchange,提问作者Dani Broxy
相关产品推荐
相关产品推荐

