双向中介分析与普通中介分析的区别

最后发布时间:2026-03-19 15:12:59 浏览量:

核心区别就一句:

  • 普通中介分析:先假定一个方向,检验 X → M → Y
  • 双向中介分析:把两个可能方向都检验一遍,比如
    X → M → YM → X → Y

但要注意,双向中介分析不等于真的证明双向因果。它更像是:在缺乏强先验时,对两种中介方向做对比分析,看看哪种路径更有统计支持。


一、普通中介分析是什么

标准中介模型是:

X \rightarrow M \rightarrow Y

例如:

  • X = 微生物丰度
  • M = 代谢物丰度
  • Y = 疾病分组

想回答的是:

微生物是否通过代谢物影响表型?

对应两步模型:

模型 1:中介模型

M = \alpha_0 + aX + \varepsilon

模型 2:结局模型

Y = \beta_0 + c'X + bM + \varepsilon

间接效应:

ab


二、双向中介分析是什么

双向中介分析会把变量角色互换,再做一次:

方向 A

X \rightarrow M \rightarrow Y

方向 B

M \rightarrow X \rightarrow Y

比如在你的场景里:

方向 A

  • 微生物 → 代谢物 → 表型

方向 B

  • 代谢物 → 微生物 → 表型

然后比较:

  • 哪个方向的间接效应显著
  • 哪个方向更符合生物学解释
  • 两个方向是否都显著

三、两者的本质区别

1)假设不同

普通中介分析只检验一个预设方向
双向中介分析检验两个对立方向

2)解释力度不同

普通中介分析更适合有明确机制假设的场景。
双向中介分析更适合探索性分析,但解释时更谨慎。

3)结果解读不同

如果普通中介分析显著,你可以说:

支持 X 通过 M 影响 Y 的中介路径。

如果双向都显著,不能直接说:

X 和 M 互为因果中介。

更稳妥的说法是:

两种方向均观察到统计上的中介信号,但真实因果方向仍需结合时序、生物机制或干预实验进一步验证。


四、用一个具体例子说明

假设数据框 df 有三列:

  • microbe:微生物丰度
  • metabolite:代谢物丰度
  • group:疾病分组,0/1

我们先做普通中介分析:

方向 A:microbe → metabolite → group


五、R 代码:普通中介分析

先用 mediation 包。

install.packages("mediation")
library(mediation)

假设 group 是二分类变量。

1. 中介模型

model.m <- lm(metabolite ~ microbe, data = df)

2. 结局模型

model.y <- glm(group ~ microbe + metabolite, data = df, family = binomial())

3. 中介分析

set.seed(123)

med.out <- mediate(
  model.m,
  model.y,
  treat = "microbe",
  mediator = "metabolite",
  boot = TRUE,
  sims = 1000
)

summary(med.out)

结果解释

你会看到类似输出:

  • ACME:间接效应
  • ADE:直接效应
  • Total Effect
  • Prop. Mediated

比如:

ACME  = -0.12, p = 0.01
ADE   = -0.05, p = 0.20
Total = -0.17, p = 0.03

说明:

  • 微生物通过代谢物对 group 有显著间接效应
  • 直接效应不显著

这就是普通中介分析


六、R 代码:双向中介分析

现在把角色反过来,再做一次。

方向 B:metabolite → microbe → group

1. 中介模型

model.m.rev <- lm(microbe ~ metabolite, data = df)

2. 结局模型

model.y.rev <- glm(group ~ metabolite + microbe, data = df, family = binomial())

3. 中介分析

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 = exposure
  • metabolite = mediator
  • group = 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 脚本,包括:

  1. 批量遍历微生物 × 代谢物
  2. 正向和反向都跑
  3. 输出结果表
  4. 自动筛选显著路径。