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

如何在lavaan中介模型中处理2×2被试内设计的重复测量依赖?

2×2被试内设计的中介分析:处理被试内依赖与变量放置

我采用2×2被试内设计,已完成ANOVA分析,现需开展中介分析,请问如何在该模型中考虑被试内依赖?重复测量项应放置在模型的哪个位置?

原代码示例

library(lavaan)
library(dplyr)

id <- rep(c(1, 2, 3), each = 4)
IV1 <- rep(c(2, 1), each = 2, times = 3)
IV2 <- rep(c(1, 2), times = 6)
DV <- c(4,3,2,4,4,4,5,4,4,4,3,5)
M1 <- c(1,1,1,3,3,5,3,4,3,4,2,4)
M2 <- c(3,4,4,4,4,5,4,5,4,4,4,4)
df2 <- data.frame(id, IV1, IV2, DV, M1, M2)

model <- "
  # Regression paths from IV to mediators
  M1 ~ a1*IV1 + a2*IV2 
  M2 ~ b1*IV1 + b2*IV2 
  
  # Regression paths from mediators to DV
  DV ~ c1*M1 + c2*M2 + c3*IV1 + c4*IV2
  
  # Indirect effects
  direct_IV1 := c3
  direct_IV2 := c4
  indirect_IV1 := a1*c1 + b1*c2
  indirect_IV2 := a2*c1 + b2*c2
  total_IV1 := a1*c1 + b1*c2 + c3
  total_IV2 := a2*c1 + b2*c2 + c4
"

fit <- cfa(model, data = df2)
parameterEstimates(fit) %>% filter(op == ":=")
#>            lhs op            rhs        label    est    se      z pvalue
#> 1   direct_IV1 :=             c3   direct_IV1 -0.209 0.261 -0.798  0.425
#> 2   direct_IV2 :=             c4   direct_IV2  0.001 0.337  0.004  0.997
#> 3 indirect_IV1 :=    a1*c1+b1*c2 indirect_IV1  0.209 0.547  0.382  0.703
#> 4 indirect_IV2 :=    a2*c1+b2*c2 indirect_IV2  0.332 0.587  0.566  0.572
#> 5    total_IV1 := a1*c1+b1*c2+c3    total_IV1  0.000 0.602  0.000  1.000
#> 6    total_IV2 := a2*c1+b2*c2+c4    total_IV2  0.333 0.602  0.554  0.580
#>   ci.lower ci.upper
#> 1   -0.721    0.304
#> 2   -0.660    0.663
#> 3   -0.863    1.280
#> 4   -0.818    1.482
#> 5   -1.179    1.179
#> 6   -0.846    1.513

解决方案:用多层SEM处理被试内依赖

被试内设计中,同一被试的多次测量数据存在嵌套关系(观测值嵌套于被试),直接用普通SEM会忽略这种依赖,导致标准误偏误。需通过**多层结构方程模型(Multilevel SEM)**拆分数据层面,明确控制被试间随机变异。

1. 被试内依赖的处理方式

  • 将id作为分组变量,在lavaan中指定cluster = "id",让模型按被试分组计算正确的标准误。
  • 构建分层模型语法,区分Level 1(重复测量层面)和Level 2(被试层面),在Level 2为核心变量设置随机截距,允许每个被试的基线水平存在差异。

2. 重复测量项的放置位置

所有重复测量的自变量(IV1、IV2)、中介变量(M1、M2)、因变量(DV)都属于Level 1(观测层面),中介效应的回归路径全部在该层面定义;Level 2仅用于控制被试间的随机变异(如随机截距)。

修改后的多层中介模型代码

library(lavaan)
library(dplyr)

# 原数据
id <- rep(c(1, 2, 3), each = 4)
IV1 <- rep(c(2, 1), each = 2, times = 3)
IV2 <- rep(c(1, 2), times = 6)
DV <- c(4,3,2,4,4,4,5,4,4,4,3,5)
M1 <- c(1,1,1,3,3,5,3,4,3,4,2,4)
M2 <- c(3,4,4,4,4,5,4,5,4,4,4,4)
df2 <- data.frame(id, IV1, IV2, DV, M1, M2)

# 分层模型语法:明确区分重复测量层面和被试层面
model_multilevel <- "
  # Level 1:重复测量层面的中介路径
  %within%
    # 自变量到中介变量的路径
    M1 ~ a1*IV1 + a2*IV2
    M2 ~ b1*IV1 + b2*IV2
    # 中介变量到因变量的路径(含直接效应)
    DV ~ c1*M1 + c2*M2 + c3*IV1 + c4*IV2
    
    # 定义效应指标
    direct_IV1 := c3
    direct_IV2 := c4
    indirect_IV1 := a1*c1 + b1*c2
    indirect_IV2 := a2*c1 + b2*c2
    total_IV1 := indirect_IV1 + direct_IV1
    total_IV2 := indirect_IV2 + direct_IV2
  
  # Level 2:被试层面的随机截距(控制被试间基线差异)
  %between%
    M1 ~ 1
    M2 ~ 1
    DV ~ 1
"

# 拟合多层模型,指定聚类变量为id
fit_multilevel <- sem(model_multilevel, data = df2, cluster = "id")

# 查看效应估计结果
parameterEstimates(fit_multilevel) %>% filter(op == ":=")

关键说明

  • %within%块:所有被试内的效应关系都在这里定义,对应重复测量的变异。
  • %between%块:X ~ 1表示为变量X设置随机截距,允许不同被试的X基线水平存在随机差异;若需检验被试间效应,可在此添加Level 2自变量。
  • 使用sem()而非cfa():当前模型是回归路径模型,而非验证性因子分析。

内容的提问来源于stack exchange,提问作者aesm315

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 03:52:51