如何在lavaan中基于多重插补数据构建含双调节变量的区分性 dyad 调节型APIM模型
如何在lavaan中基于多重插补数据构建含双调节变量的区分性 dyad 调节型APIM模型
我明白你现在的需求是给区分性的母亲-父亲 dyad 构建调节型APIM,让母亲的调节变量只作用于她自己的Actor和Partner路径,父亲的调节变量同理,同时还要处理多重插补的数据。之前你尝试手动生成交互项但模型结构没搭对,我来帮你修正这个思路和代码。
一、核心思路梳理
针对区分性 dyad 的调节型APIM,我们需要明确几个关键点:
- 母亲的调节变量(
mom_mod)要调节母亲的Actor效应(mom_var1→mom_var2)和母亲的Partner效应(mom_var1→dad_var2) - 父亲的调节变量(
dad_mod)要调节父亲的Actor效应(dad_var1→dad_var2)和父亲的Partner效应(dad_var1→mom_var2) - 调节分析必须先控制调节变量的主效应,且交互项要基于中心化后的变量生成(你之前做的均值中心化是对的,能有效减少多重共线性)
- 多重插补后生成交互项的流程没问题:转long格式生成交互项再转回mids对象,这个步骤是正确的
二、修正后的完整代码流程
1. 加载包与数据生成、预处理
这部分你原来的代码基本没问题,我只做了小幅度的简洁化调整:
library(mice) library(lavaan) library(tidyverse) library(faux) library(missMethods) library(semTools) library(semPlot) options(scipen = 9999) set.seed(1234) # 生成模拟数据 df <- faux::rnorm_multi(n = 100, vars = 6, mu = 3, sd = 1, varnames = c("mom_var1", "mom_var2", "mom_mod", "dad_var1", "dad_var2", "dad_mod")) %>% mutate(id = rep(1:100)) %>% select(id, everything()) %>% missMethods::delete_MCAR(cols = c("mom_var1", "mom_var2", "mom_mod", "dad_var1", "dad_var2", "dad_mod"), p = .15) # 均值中心化调节变量(仅中心化,不标准化) center_scale <- function(x) { as.numeric(scale(x, center = TRUE, scale = FALSE)) } df <- df %>% mutate(mom_mod = center_scale(mom_mod), dad_mod = center_scale(dad_mod))
2. 多重插补与交互项生成
这部分你的逻辑完全正确,直接保留即可:
# 多重插补 imp <- mice::mice(df, m = 5, maxit = 10, seed = 1234, printFlag = FALSE) # 转long格式生成交互项,再转回mids对象 impute_dfs <- mice::complete(imp, action = "long", include = TRUE) %>% mutate(mom_int = mom_var1 * mom_mod, # 母亲核心变量×母亲调节变量 dad_int = dad_var1 * dad_mod) # 父亲核心变量×父亲调节变量 imp <- as.mids(impute_dfs)
3. 修正后的调节型APIM模型语法
这是最关键的部分,我去掉了多余的协方差和截距设定,聚焦于被调节的路径本身,完全匹配你想要的模型结构:
# 调节型APIM模型语法 moderated_apim <- " # 主效应路径 + 调节效应路径(交互项) # 母亲的Y变量:主效应(自身X、父亲X、母亲调节变量)+ 调节效应(父亲X×父亲调节变量) mom_var2 ~ a1*mom_var1 + p21*dad_var1 + mom_mod + p21_mod*dad_int # 父亲的Y变量:主效应(自身X、母亲X、父亲调节变量)+ 调节效应(母亲X×母亲调节变量) dad_var2 ~ a2*dad_var1 + p12*mom_var1 + dad_mod + p12_mod*mom_int # 额外的调节效应:自身X×自身调节变量(Actor效应的调节) mom_var2 ~ a1_mod*mom_int dad_var2 ~ a2_mod*dad_int # APIM基础结构:均值、方差、协方差 # X变量的均值 mom_var1 ~ mx1*1 dad_var1 ~ mx2*1 # Y变量的截距 mom_var2 ~ my1*1 dad_var2 ~ my2*1 # X变量的方差 mom_var1 ~~ vx1*mom_var1 dad_var1 ~~ vx2*dad_var1 # Y变量的残差方差 mom_var2 ~~ vy1*mom_var2 dad_var2 ~~ vy2*dad_var2 # dyad内X的协方差、Y残差的协方差 mom_var1 ~~ cx*dad_var1 mom_var2 ~~ cy*dad_var2 # 可选:定义差异/平均参数(用于区分性dyad的组间比较) a_diff := a1 - a2 # Actor效应差异 p_diff := p12 - p21 # Partner效应差异 a_mod_diff := a1_mod - a2_mod # Actor调节效应差异 p_mod_diff := p12_mod - p21_mod # Partner调节效应差异 "
4. 拟合模型与查看结果
# 拟合多重插补后的模型 sem_model <- sem.mi(model = moderated_apim, fixed.x = FALSE, data = imp) # 查看结果(标准化解更易解释调节效应) summary(sem_model, standardized = TRUE, fit.measures = TRUE)
5. 模型可视化
你之前的可视化代码可以调整一下,确保路径对应正确:
# 用完整数据拟合模型用于绘图(仅可视化用,不用于参数估计) df_plot <- df %>% mutate(mom_int = mom_var1*mom_mod, dad_int = dad_var1*dad_mod) plot_model <- sem(moderated_apim, fixed.x = FALSE, data = df_plot) baseplot <- semPlot::semPlotModel(plot_model) # 替换为多重插补模型的标准化估计 desired_output <- data.frame(standardizedsolution(sem_model)) %>% filter(op != ":=") baseplot@Pars$est <- desired_output$est.std # 绘制路径图 semPaths(baseplot, nCharNodes = 0, what = "est", whatLabels = "invisible", fade = FALSE, layout = "tree2", rotation = 2, style = "ram", intercepts = FALSE, residuals = FALSE, optimizeLatRes = TRUE, curve = 3.1, nDigits = 3, sizeMan = 12, sizeMan2 = 10, label.cex = 1.2, edge.label.position = 0.45, edge.label.cex = 1.5)
三、模型参数解释
a1:母亲的Actor主效应(mom_var1→mom_var2),a1_mod:母亲调节变量对这个Actor效应的调节程度a2:父亲的Actor主效应(dad_var1→dad_var2),a2_mod:父亲调节变量对这个Actor效应的调节程度p12:母亲的Partner主效应(mom_var1→dad_var2),p12_mod:母亲调节变量对这个Partner效应的调节程度p21:父亲的Partner主效应(dad_var1→mom_var2),p21_mod:父亲调节变量对这个Partner效应的调节程度- 如果某个调节参数(如
a1_mod)显著,说明对应的调节变量会改变该路径的效应强度
备注:内容来源于stack exchange,提问作者jrcalabrese
相关产品推荐
相关产品推荐

