You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在结构方程模型(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 19:50:25