核心区别就一句:
X → M → YX → M → Y 和 M → X → Y但要注意,双向中介分析不等于真的证明双向因果。它更像是:在缺乏强先验时,对两种中介方向做对比分析,看看哪种路径更有统计支持。
标准中介模型是:
X \rightarrow M \rightarrow Y
例如:
X = 微生物丰度M = 代谢物丰度Y = 疾病分组想回答的是:
微生物是否通过代谢物影响表型?
对应两步模型:
M = \alpha_0 + aX + \varepsilon
Y = \beta_0 + c'X + bM + \varepsilon
间接效应:
ab
双向中介分析会把变量角色互换,再做一次:
X \rightarrow M \rightarrow Y
M \rightarrow X \rightarrow Y
比如在你的场景里:
然后比较:
普通中介分析只检验一个预设方向。
双向中介分析检验两个对立方向。
普通中介分析更适合有明确机制假设的场景。
双向中介分析更适合探索性分析,但解释时更谨慎。
如果普通中介分析显著,你可以说:
支持 X 通过 M 影响 Y 的中介路径。
如果双向都显著,不能直接说:
X 和 M 互为因果中介。
更稳妥的说法是:
两种方向均观察到统计上的中介信号,但真实因果方向仍需结合时序、生物机制或干预实验进一步验证。
假设数据框 df 有三列:
microbe:微生物丰度metabolite:代谢物丰度group:疾病分组,0/1我们先做普通中介分析:
先用 mediation 包。
install.packages("mediation")
library(mediation)
假设 group 是二分类变量。
model.m <- lm(metabolite ~ microbe, data = df)
model.y <- glm(group ~ microbe + metabolite, data = df, family = binomial())
set.seed(123)
med.out <- mediate(
model.m,
model.y,
treat = "microbe",
mediator = "metabolite",
boot = TRUE,
sims = 1000
)
summary(med.out)
你会看到类似输出:
ACME:间接效应ADE:直接效应Total EffectProp. Mediated比如:
ACME = -0.12, p = 0.01
ADE = -0.05, p = 0.20
Total = -0.17, p = 0.03
说明:
group 有显著间接效应这就是普通中介分析。
现在把角色反过来,再做一次。
model.m.rev <- lm(microbe ~ metabolite, data = df)
model.y.rev <- glm(group ~ metabolite + microbe, data = df, family = binomial())
set.seed(123)
med.out.rev <- mediate(
model.m.rev,
model.y.rev,
treat = "metabolite",
mediator = "microbe",
boot = TRUE,
sims = 1000
)
summary(med.out.rev)
你可以这样整理:
res <- data.frame(
direction = c("microbe -> metabolite -> group",
"metabolite -> microbe -> group"),
ACME = c(summary(med.out)$d.avg, summary(med.out.rev)$d.avg),
ADE = c(summary(med.out)$z.avg, summary(med.out.rev)$z.avg),
Total = c(summary(med.out)$tau.coef, summary(med.out.rev)$tau.coef),
ACME.p = c(summary(med.out)$d.avg.p, summary(med.out.rev)$d.avg.p)
)
print(res)
这样你就能直观看到哪个方向更强。
下面直接生成一份假数据,模拟“微生物通过代谢物影响疾病”的场景。
set.seed(123)
n <- 120
# 暴露变量:微生物
microbe <- rnorm(n, mean = 0, sd = 1)
# 中介变量:受微生物影响
metabolite <- 0.7 * microbe + rnorm(n, mean = 0, sd = 1)
# 结局:二分类 group,受 microbe 和 metabolite 共同影响
linpred <- -0.3 * microbe - 0.8 * metabolite
prob <- 1 / (1 + exp(-linpred))
group <- rbinom(n, size = 1, prob = prob)
df <- data.frame(
microbe = microbe,
metabolite = metabolite,
group = group
)
library(mediation)
model.m <- lm(metabolite ~ microbe, data = df)
model.y <- glm(group ~ microbe + metabolite, data = df, family = binomial())
med.out <- mediate(
model.m, model.y,
treat = "microbe",
mediator = "metabolite",
boot = TRUE,
sims = 1000
)
summary(med.out)
model.m.rev <- lm(microbe ~ metabolite, data = df)
model.y.rev <- glm(group ~ metabolite + microbe, data = df, family = binomial())
med.out.rev <- mediate(
model.m.rev, model.y.rev,
treat = "metabolite",
mediator = "microbe",
boot = TRUE,
sims = 1000
)
summary(med.out.rev)
因为这份模拟数据是按:
[
microbe \rightarrow metabolite \rightarrow group
]
生成的,所以通常会出现:
这就是双向中介分析的用途:
用来比较“统计上哪一个方向更像数据支持的机制”。
但它仍然不能单靠统计结果证明真正因果方向。
假设 group 不是 0/1,而是连续表型 phenotype_score,那两个模型都可以直接用 lm():
model.m <- lm(metabolite ~ microbe, data = df)
model.y <- lm(phenotype_score ~ microbe + metabolite, data = df)
med.out <- mediate(
model.m, model.y,
treat = "microbe",
mediator = "metabolite",
boot = TRUE,
sims = 1000
)
summary(med.out)
model.m.rev <- lm(microbe ~ metabolite, data = df)
model.y.rev <- lm(phenotype_score ~ metabolite + microbe, data = df)
med.out.rev <- mediate(
model.m.rev, model.y.rev,
treat = "metabolite",
mediator = "microbe",
boot = TRUE,
sims = 1000
)
summary(med.out.rev)
你的普通中介分析通常是:
microbe = exposuremetabolite = mediatorgroup = outcome即:
[
\text \rightarrow \text \rightarrow \text
]
双向中介分析就是额外再测:
[
\text \rightarrow \text \rightarrow \text
]
适合下面这种情况:
We performed mediation analysis to test whether the association between microbial abundance and phenotype was mediated by metabolite levels.
To assess the robustness of the inferred mediation direction, we additionally performed bidirectional mediation analysis by alternatively treating microbial abundance and metabolite levels as exposure and mediator variables.
如果双向都显著,建议写:
Significant mediation signals were observed in both directions, suggesting that the statistical associations were not fully direction-specific. Therefore, the biological directionality should be interpreted with caution and further validated using longitudinal or experimental data.
双向中介分析不是“高级版普通中介分析”,而是“方向敏感性分析”。
它能帮你回答的是:
它不能单独证明:
你要的话,我下一条可以直接给你一份 “适合你这个微生物丰度矩阵 + 代谢物矩阵 + group”的批量双向中介分析 R 脚本,包括: