MOFA 与其他多组学整合方法对比
做多组学整合的朋友,基本都会遇到一个选择题:到底用 MOFA、DIABLO 还是 NMF?
我刚开始接触这个领域时,也是挨个试了一遍。每种方法都有自己的脾气,选错了后面的分析全白搭。今天我就把这三家的核心差异、适用场景、以及我在项目中踩过的坑,一次性给你讲清楚。
为什么需要对比?
说白了,没有银弹。每种方法的假设和数学框架都不一样。
- MOFA 学的是共享+私有因子结构,适合探索组间共享变异和组内特有信号。
- DIABLO 是监督型整合,目标是通过稀疏线性组合最大化组间相关性,常用在分类/表型关联场景。
- NMF 则是纯无监督的非负矩阵分解,强制所有因子非负,适合表达率/丰度这类天然非负数据。
你想想看,如果数据全是 log2 变换的强度值,藏着很多负值,这时候非负约束就是硬伤。我曾经在甲基化数据上硬套 NMF,结果一堆负值被截成 0,模型完全没法解释。
DIABLO:监督式集成,目标明确
DIABLO 出自 mixOmics 包,它的核心是稀疏广义典型相关分析。它能利用表型标签(比如疾病组 vs 对照组)来引导整合方向。
你已经有明确的分类/预后标签,想找哪些特征组合可以跨组学区分样本。DIABLO 的稀疏性会帮你筛出最重要的基因、代谢物和甲基化位点。
我建议在二分类或小样本场景下优先考虑 DIABLO。它收敛快,结果解释起来也容易。但要注意:DIABLO 的 keepX 参数控制每个组学保留的特征数,调不好很容易过拟合。
# mixOmics 中 DIABLO 的标准调用
# 需要设计实验设计矩阵 design 和块列表 blocks
design <- matrix(0.1, ncol = 3, nrow = 3)
diablo.model <- block.plsda(
X = list(omics1, omics2, omics3),
Y = phenotype,
indY = 1,
ncomp = 2,
design = design,
keepX = list(omics1 = 10, omics2 = 8, omics3 = 12)
)
我曾帮一家药企分析多组学数据,20 个样本,3 个组学,用 DIABLO 找出的特征和已知通路完美重合。但换到 200 个样本的队列,keepX 调了十几遍才稳定。
NMF:非负约束,直觉但脆弱
NMF 的数学很漂亮:把数据矩阵 ≈ 基矩阵 × 系数矩阵,且所有元素 ≥ 0。这在基因表达、微生物丰度等数据上很自然。
但实际问题是我遇到的坑:
- 数据预处理必须保证绝对非负。任何负值(比如 z-score 归一化后的数据)都不行。
- 结果容易受初始值影响,需要多次迭代选最优解。
- 无法直接处理私有因子结构 —— 所有组学共享同一组基,组间差异被压缩在一起。
我曾经在蛋白质组学数据上用 NMF,因为缺失值填补用了全局均值(产生了不少接近 0 的负值),结果分解出来的因子全是噪声。后来改用 Half-minimum 填补才正常。切记:NMF 的输入必须是正矩阵,且最好做 TMM 或 CPM 这类相对定量标准化。
常见的 NMF 工具比如 NMF R 包,或者 Python 的 sklearn.decomposition.NMF,用法很简单:
from sklearn.decomposition import NMF
import numpy as np
model = NMF(n_components=5, init='nndsvd', random_state=42)
W = model.fit_transform(X) # 基矩阵
H = model.components_ # 系数矩阵
但说实话,多组学场景下 NMF 的灵活性很差。你不能单独控制某个组学对因子的贡献度,所有组学都被拉进同一个低维空间。
核心对比:一张表看明白
| 维度 | MOFA | DIABLO | NMF |
|---|---|---|---|
| 数学框架 | 概率因子分析 + 变分推断 | 稀疏 CCA / PLS | 非负矩阵分解 (NNLS) |
| 因子结构 | 共享因子 + 组学私有因子 | 共享判别成分 | 全共享因子(无私有分离) |
| 数据要求 | 任意连续值,缺失值友好 | 连续值,推荐 z-score | 必须非负(≥0) |
| 监督/无监督 | 无监督,可后续关联表型 | 监督(需要标签) | 无监督 |
| 稀疏性 | 可设置稀疏先验(可选) | 内置稀疏(keepX) | 无原生稀疏(可加 L1 惩罚) |
| 可解释性 | 因子特征权重大 | 载荷 + 相关性排名 | 基矩阵 + 系数矩阵 |
| 计算复杂度 | 较高(迭代优化 ELBO) | 较低(PLS 高效) | 中等(多启动随机) |
从表里能看出来:MOFA 在灵活性上占优,既能处理缺失也能分离私有信号;DIABLO 适合有监督的快速标记;NMF 则受限于非负假设。
选型建议:我自己的经验法则
- 数据缺失多,想发现潜在结构 → MOFA。我就靠这个特性在一批临床数据里找到了一直被忽略的批次效应。
- 有分类标签,特征筛选优先 → DIABLO。注意控制 keepX 避免过拟合。
- 数据全是计数或丰度,且组学同质性高 → NMF。比如微生物组 + 宏转录组,可以用同一套基。
早期我天真地以为 NMF 最简单,直接拿多组学拼接矩阵去分解。结果每个因子都混合了不同组学的变异,根本无法解释。后来才知道:多组学整合的难点正在于组间数据结构和噪声水平不同,MOFA 的“私有因子”恰好解决了这个痛点。
有一次,我在一个病理组学项目里,先用 DIABLO 做分类(准确率很高),再用 MOFA 对 DIABLO 留下的残差做因子分析,发现了一组跟药物响应相关的私有代谢信号。这种“组合拳”往往比单独用一种更有效。
结构总览:三种方法的关系
从这个图能直观看出:MOFA 偏向因子结构发现,DIABLO 偏向监督分类,NMF 偏向非负分解。实际项目中,我会先用 MOFA 做探索,再用 DIABLO 验证关键特征,如果数据允许的话 NMF 可以放在子组学内部试一下。
小结:我给你的选型清单
- 数据缺失多且无标签 → MOFA。它会自动处理缺失,你不用补值。
- 有明确的分类表型 → DIABLO。记得多做交叉验证选 keepX。
- 数据全是非负计数且组学间分布接近 → NMF。但最好先做一步 SVA 去批次。
- 想探索组内私有信号 → 只有 MOFA 能做。DIABLO 和 NMF 都不支持,硬做会丢失信息。
别在调参上花太多时间犹豫。我现在的习惯是:先跑一个默认 MOFA 模型看因子数量,再跑一个 DIABLO 看分类精度,最后用这两个结果反向验证。如果它们给出的主要结构一致,那基本稳了。
三种方法各有千秋,选对工具能让分析事半功倍。接下来我们就要深入 MOFA 的参数调优了 —— 准备好面对“因子数量”这个第一个大坑了吗?