MOFA 简介:为什么我们需要它

我开始做组学数据分析那几年,最头疼的事就是手里同时拿着转录组、甲基化、蛋白质组好几张表,想找它们之间的关系——结果每个组学都有几万个特征,样本还不一定对齐。说白了,我们就像盲人摸象,每个组学只能看到一部分,合起来却不知道大象长什么样。

多组学整合不是简单地把数据拼在一起。你想想看,不同组学测量尺度不一样(RNA-seq 是计数,蛋白质组是强度值),缺失模式不同,噪声水平也不同。直接拼,模型会被高方差组学带偏。这就是我当年踩过的坑:把表达量和甲基化 beta 值直接拼接跑聚类,结果全被甲基化那个宽范围值吞掉了。

多组学整合的常见挑战

我个人习惯把挑战归纳为三点,你对照自己的数据看看是不是也中招:

  • 维度灾难:每个组学都有数千到数万个特征,但样本往往只有几十到几百。直接建模很容易过拟合。
  • 数据异质性:不同组学数据类型不同(连续、计数、二值)、分布不同、缺失机制不同。
  • 信号稀疏性:真正在不同的生物条件间有差异的因子很少,大部分特征是噪声或无关变化。
嗯,这里要注意:千万别忽略批次效应。我曾经在一个跨平台整合项目里没做批次校正,结果第一个因子全部分离的是测序平台,生物信号反而被淹没了。

那怎么解决?传统方法要么每个组学单独分析再手动合并结果(效率低,丢失互作信息),要么用矩阵分解类的模型,但大多只支持两个视图。MOFA(Multi-Omics Factor Analysis)就是冲着这堆问题来的。

MOFA 的动机:从“分别分析”到“联合因子分解”

MOFA 的核心想法非常直观:假设不同组学共享一组潜在因子,每个因子代表一个独立的生物过程(比如免疫激活、代谢重编程)。不同组学通过不同的“载荷”(权重)来反映这个因子。因子是跨组学共享的,但载荷是组学特异的。

你想想看,这就像几个不同语言的乐队合奏同一首曲子——主旋律(因子)一样,但每个乐器(组学)演奏的方式不同。MOFA 能从混杂的噪声里把主旋律抽出来。

一句话总结:MOFA 通过变分贝叶斯推断,同时学习因子和载荷,自动处理缺失值,并且能告诉你每个组学对每个因子的贡献度。

MOFA 的核心优势

优势 为什么重要
任意数量组学 支持 2 个及以上组学视图,最多见过有人塞了 6 个组学
自动处理缺失值 不需要删除有缺失的样本或特征,推断时自动边缘化
可解释因子 每个因子由一组特征载荷定义,可以进行富集分析
组学重要性评估 计算每个组学对每个因子的方差解释比例,知道哪个组学贡献大
开源免费 R 包 MOFA2 和 Python 包 mofapy2,社区活跃

我记得第一次在一个肿瘤多组学数据集上跑 MOFA,结果里第一个因子把免疫浸润高的样本和低的样本分得清清楚楚,还顺便告诉我这个因子主要是由转录组贡献的,甲基化贡献很少。这种层次化的信息是传统拼接方法给不了的。

快速上手:安装与最小示例

安装很简单,R 用户一行命令:

install.packages("MOFA2")

Python 用户:

pip install mofapy2

下面是一个最小的工作流程(R 版):

library(MOFA2)

# 准备数据列表:每个元素是一个组学矩阵(样本x特征)
data <- list(
  RNA = rna_matrix,
  Meth = meth_matrix,
  Protein = prot_matrix
)

# 创建 MOFA 对象
mofa_obj <- create_mofa(data)

# 训练模型(默认推断10个因子)
mofa_obj <- run_mofa(mofa_obj, outfile = "model.hdf5")

# 查看因子
factors <- get_factors(mofa_obj, as.data.frame = TRUE)
head(factors)
我的经验:如果你数据里组学间的缺失模式非常不同(比如 RNA 全有,蛋白质只测了 30% 的样本),建议先查看各视图缺失率,不要盲目设太多因子。我通常从 5-10 个开始,然后用模型比较(ELBO)确定最佳数量。
MOFA 多组学整合核心逻辑 转录组 甲基化组 蛋白质组 共享潜因子 因子1 · 因子2 · 因子K 样本分组 / 临床关联 特征载荷 / 通路富集 组学重要性 / 方差分解 多个组学通过共享因子联合降维,每个因子对应一个生物过程 载荷矩阵可解释(哪个基因/探针贡献大),且支持部分缺失数据

从这张图你能看到 MOFA 的整体流程:左侧是多个组学数据(可以更多),中间用一个共享隐因子矩阵来整合,右侧输出可以直接用于下游分析。这也是我个人最欣赏 MOFA 的地方——整个流程透明可解释,不像某些深度学习黑箱模型,调完参数连因子含义都说不清。

关键点回顾:
  • 多组学整合的三大痛点:维度灾难、数据异质性、信号稀疏性
  • MOFA 通过变分推断联合学习共享因子和组学特异载荷
  • 优势包括:支持任意多个组学、自动缺失值处理、因子可解释、开源生态成熟

我建议你在运行第一个模型前,先用 plot_data_overview(mofa_obj) 看看哪些样本缺失率高,以及各视图的观测数量。这个快速检查能帮你避免“模型跑完了才发现某个组学只覆盖了 20% 样本”的尴尬——我曾经踩过这个坑,后来每次都先画这个图。