如何在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
相关产品推荐
相关产品推荐

