R中嵌套数据框的多层中介分析:适配包与实现方案问询
重复测量嵌套数据的中介分析解决方案
问题描述
现有嵌套重复测量数据:3个分组(Group A/B/C),每个分组包含30个用户ID,每个ID对应3条不同产品(Fruit/Dairy/Meat)的反应记录。需完成两类中介分析:
- 组间中介分析与汇总:比较不同Group的中介效应
- 组内产品间中介分析与汇总:同一Group内,不同Product的中介效应比较
可复现数据生成代码:
set.seed(1994) # 生成90个唯一ID n_IDs <- 90 ID <- paste0("ID", 1:n_IDs) # 定义分组与产品 Groups <- rep(c("A", "B", "C"), each = n_IDs / 3) Products <- rep(c("Fruit", "Dairy", "Meat"), times = n_IDs) # 每个ID重复3次匹配产品 ID_rep <- rep(ID, each = 3) # 确保所有向量长度一致 n_total <- length(ID_rep) # 生成中介变量、协变量、自变量与因变量 Mediator1 <- round(runif(n_total, -100, 100)) Mediator2 <- round(runif(n_total, -100, 100)) Mediator3 <- round(runif(n_total, -100, 100)) Mediator4 <- round(runif(n_total, -100, 100)) Covariate1 <- round(runif(n_total, -100, 100)) Covariate2 <- round(runif(n_total, -100, 100)) IV <- round(runif(n_total, -100, 100)) DV <- round(runif(n_total, -100, 100)) # 创建数据框 DF <- data.frame(ID = ID_rep, Group = rep(Groups, each = 3), Product = Products, Mediator1, Mediator2, Mediator3, Mediator4, Covariate1, Covariate2, IV, DV)
参考工具为Amanda Kay Montoya开发的MEMORE宏(非R环境),需适配R包实现分析。
适配R包与代码实现
针对嵌套重复测量结构,推荐使用**lavaan(支持多层结构方程模型,适配ID嵌套)和mediation**(结合混合效应模型检验中介效应),以下分两类需求实现:
1. 组间中介分析与汇总
实现思路
通过分层结构方程模型,将Group作为分组变量,ID作为聚类变量,同时拟合各组中介模型并检验组间效应差异。
代码示例(以Mediator1为例,可扩展多中介)
# 安装加载依赖包 if (!require(lavaan)) install.packages("lavaan") if (!require(dplyr)) install.packages("dplyr") library(lavaan) library(dplyr) # 定义多层中介模型 group_med_model <- ' # 中介路径定义 Mediator1 ~ a*IV + Covariate1 + Covariate2 DV ~ b*Mediator1 + c*IV + Covariate1 + Covariate2 # 计算总效应与间接效应 total_eff := c + a*b indirect_eff := a*b # 允许路径系数随Group变化(检验组间差异) a ~~ 0*Group b ~~ 0*Group c ~~ 0*Group ' # 拟合模型,指定ID为聚类变量,Group为分组变量 fit_group <- sem(group_med_model, data = DF, cluster = "ID", group = "Group") # 查看模型整体结果 summary(fit_group, fit.measures = TRUE, ci = TRUE) # 提取各组中介效应并汇总 group_eff_summary <- parameterEstimates(fit_group) %>% filter(label %in% c("indirect_eff", "total_eff")) %>% select(group, label, est, se, ci.lower, ci.upper) print(group_eff_summary)
2. 组内产品间中介分析与汇总
实现思路
按Group分组,在每组内结合混合效应模型(控制ID随机效应),检验不同Product下的中介效应差异,通过mediation包实现效应的Bootstrap检验。
代码示例(以Mediator1为例)
# 安装加载依赖包 if (!require(lmerTest)) install.packages("lmerTest") if (!require(mediation)) install.packages("mediation") library(lmerTest) library(mediation) library(dplyr) # 按Group循环分析,存储结果 product_med_results <- list() for (g in unique(DF$Group)) { # 提取当前组数据 group_subset <- DF %>% filter(Group == g) # 拟合中介变量模型(控制ID随机效应与Product固定效应) m_model <- lmer(Mediator1 ~ IV + Covariate1 + Covariate2 + Product + (1|ID), data = group_subset) # 拟合因变量模型(控制ID随机效应、Product固定效应与中介变量) dv_model <- lmer(DV ~ IV + Mediator1 + Covariate1 + Covariate2 + Product + (1|ID), data = group_subset) # 检验Product分组下的中介效应(Bootstrap抽样1000次) med_fit <- mediate(m_model, dv_model, treat = "IV", mediator = "Mediator1", sims = 1000, group = "Product") product_med_results[[g]] <- med_fit cat("\n===== 分组", g, "产品间中介效应结果 =====\n") print(summary(med_fit)) } # 汇总所有组的产品中介效应 product_eff_summary <- do.call(rbind, lapply(names(product_med_results), function(g) { eff_data <- product_med_results[[g]]$d1 data.frame( Group = g, Product = rownames(eff_data), indirect_eff = eff_data$Estimate, se = eff_data$SE, ci_lower = eff_data$`2.5%`, ci_upper = eff_data$`97.5%` ) })) print(product_eff_summary)
补充说明
- 多中介变量扩展:若需同时检验Mediator1-Mediator4,可在
lavaan模型中添加多条中介路径,或在mediation循环中遍历每个中介变量。 - 模型调整:可根据需求修改模型(如添加Product随机效应、调整控制变量)。
- 效应显著性:Bootstrap置信区间不含0则说明中介效应显著。
内容的提问来源于stack exchange,提问作者Smuts94
相关产品推荐
相关产品推荐

