如何在结构方程模型(SEM)中编码协变误差?附实操代码问询
基于已发表相关矩阵重构SEM的误差编码问题
我使用某已发表论文的相关矩阵重新分析数据并重构结构方程模型(SEM),但不清楚如何对误差进行编码,尤其是模型中Empathy和**Teaching Self-Efficacy(Teaching_SE)**变量的误差。以下是我的实操代码:
library(MVN) library(lavaan) library(haven) library(semPlot) library(lavaanPlot) Goroshit_Hen_cor_mat <- matrix(c(1, 0.11, -0.12, -0.1, -0.09, 0.03, 0.11, 1, .3, -0.01, -0.05, 0.06, -0.12, 0.3, 1, 0.21, 0.23, 0.24, -0.1, -0.01, 0.21, 1, 0.56, 0.53, -0.09, -0.05, 0.23, 0.56, 1, 0.38, 0.03, 0.06, 0.24, 0.53, 0.38, 1), nrow = 6, ncol = 6) var_names = c("Gender", "Degree", "Years_Teaching", "Emotional_SE", "Empathy", "Teaching_SE") Goroshit_Hen_cor_mat var_sds <- c(0.47, 0.42, 10.19, 0.48, 0.43, 0.55) Goroshit_Hen_cov <- cor2cov(Goroshit_Hen_cor_mat, var_sds, names = var_names) Goroshit_Hen_cov Goroshit_Hen_SEM <-"Empathy ~ Emotional_SE Empathy ~ Gender Empathy ~ Degree Empathy ~ Years_Teaching Teaching_SE ~ Emotional_SE Teaching_SE ~ Gender Teaching_SE ~ Degree Teaching_SE ~ Years_Teaching Emotional_SE ~~ Gender Emotional_SE ~~ Degree Emotional_SE ~~ Years_Teaching Gender ~~ Degree Gender ~~ Years_Teaching Degree ~~ Years_Teaching Empathy ~~ Teaching_SE Empathy ~~ Empathy Teaching_SE ~~ Teaching_SE " Goroshit_Hen_SEM_fit <- sem(Goroshit_Hen_SEM, sample.cov = Goroshit_Hen_cov, sample.nobs = 273) semPaths(Goroshit_Hen_SEM_fit, "path", whatLabels = "est", edge.label.cex = 1, intercepts = FALSE, residuals = TRUE, curve = 1, curvature = 2, nCharNodes = 8, sizeMan = 6, sizeMan2 = 3, optimizeLatRes = T, rotation = 3, edge.color = "#000000") summary(Goroshit_Hen_SEM_fit)
误差编码的核心说明与代码优化
1. lavaan中观测变量误差的默认处理逻辑
在lavaan中,**内生观测变量(即被预测的变量,比如你的Empathy和Teaching_SE)**的残差(误差)会被自动添加到模型中,不需要手动声明Empathy ~~ Empathy或Teaching_SE ~~ Teaching_SE。这两行代码本质上是显式要求估计这两个变量的残差方差,虽然结果和默认行为一致,但属于冗余写法。
2. 外生变量协方差的冗余声明
你代码中关于外生变量(Gender、Degree、Years_Teaching、Emotional_SE)之间的协方差声明(比如Emotional_SE ~~ Gender、Gender ~~ Degree等)同样是冗余的。lavaan默认会自动估计所有外生变量之间的协方差,除非你需要固定某个协方差为0或特定值,否则无需手动添加。
3. 优化后的模型代码
简化后的模型语法如下,完全保留原模型的核心关系,同时去掉冗余的误差和协方差声明:
Goroshit_Hen_SEM <-" # 核心预测路径 Empathy ~ Emotional_SE + Gender + Degree + Years_Teaching Teaching_SE ~ Emotional_SE + Gender + Degree + Years_Teaching # 仅保留需要显式声明的协方差(比如Empathy和Teaching_SE的残差相关) Empathy ~~ Teaching_SE "
4. 关于Empathy和Teaching_SE的误差解释
- 这两个变量作为内生观测变量,它们的误差代表了模型中未被预测变量解释的变异部分。
- 在简化后的模型中,lavaan会自动为它们生成残差项,并估计残差方差,你可以在
summary()输出的Residual covariances或Residual variances部分看到估计结果。 - 如果需要对误差进行约束(比如固定残差方差为某个值,或者让两个误差相关),才需要手动添加类似
Empathy ~~ c(0.2) * Empathy(固定残差方差为0.2)或Empathy ~~ Teaching_SE(你原代码中已经添加的残差相关)的语句。
5. 验证模型拟合
运行优化后的代码后,通过summary(Goroshit_Hen_SEM_fit, fit.measures = TRUE)查看拟合指标,同时检查残差方差的估计值是否合理,确保模型与原论文的结果趋势一致。
内容的提问来源于stack exchange,提问作者jeisman
相关产品推荐
相关产品推荐

