如何在Lavaan的CFA分析中提取测量误差得分
实现逻辑
你需要的个体层面单题测量误差得分,本质是CFA模型的观测级残差,不需要特殊的小众方法,常规CFA框架下即可计算,你提到的等载荷约束属于平行测量的模型设定,不会改变残差的提取逻辑。
核心逻辑是:单题观测得分 = 截距 + 因子载荷 * 对应潜变量得分 + 测量误差,反过来做减法就能得到每个样本对应单题的误差值,和提取因子得分的逻辑完全匹配。
操作步骤
- 第一步:拟合约束后的CFA模型
按照研究设定给3个潜变量匹配对应题项,将同一潜变量下的因子载荷设置为相等约束,待模型收敛、拟合指标符合要求后,导出两个核心结果:① 每个样本的潜变量因子得分(主流CFA工具都自带该输出功能);② 每个题项对应的非标准化因子载荷、题项截距(开启均值结构即可输出)。 - 第二步:计算单题的潜变量预测值
对每一道题,用「题项截距 + 对应非标准化载荷 * 样本对应潜变量得分」的公式,算出该样本在这道题上由潜变量解释的预测得分。 - 第三步:计算测量误差得分
用样本在该题上的原始观测得分,减去上一步得到的潜变量预测得分,得到的残差就是你需要的每个数据点对应题项的测量误差得分。
R语言lavaan包实现示例
library(lavaan) # 定义带等载荷约束的3因子CFA模型,示例为每个因子对应3个题项,可根据实际题量调整 # 模型语法说明:固定每个因子第一个题项载荷为1做尺度锚定,用equal()约束同一因子下其余载荷与第一个载荷相等 cfa_model <- ' f1 =~ c(1,NA,NA)*x1 + equal("f1=~x1")*x2 + equal("f1=~x1")*x3 f2 =~ c(1,NA,NA)*x4 + equal("f2=~x4")*x5 + equal("f2=~x4")*x6 f3 =~ c(1,NA,NA)*x7 + equal("f3=~x7")*x8 + equal("f3=~x7")*x9 ' # 拟合模型,开启均值结构输出截距 fit <- cfa(cfa_model, data = your_dataset, meanstructure = TRUE) # 提取因子得分合并到原数据集 factor_scores <- lavPredict(fit) data_res <- cbind(your_dataset, factor_scores) # 提取非标准化载荷、截距的估计值 par_table <- parameterEstimates(fit, standardized = FALSE) loading_val <- par_table[par_table$op == "=~", c("rhs", "lhs", "est")] intercept_val <- par_table[par_table$op == "~1", c("rhs", "est")] # 逐题计算测量误差,以x1为例,其余题项按相同逻辑替换变量名即可 data_res$e_x1 <- data_res$x1 - ( intercept_val[intercept_val$rhs == "x1", "est"] + loading_val[loading_val$rhs == "x1", "est"] * data_res[, loading_val[loading_val$rhs == "x1", "lhs"]] )
注意:如果模型未设置均值结构,可先将所有题项做中心化处理,省略截距项直接用「载荷*因子得分」计算预测值,再用中心化后的题项得分减去预测值,得到的误差得分和带均值结构的计算结果完全等价。
内容的提问来源于stack exchange,提问作者BrentHendrickx
相关产品推荐
相关产品推荐

