跳转至

402_单细胞多组学整合MOFA+


一句话说明

MOFA+(多组学因子分析+)就像给多种组学数据做"主成分分析",找出驱动样本差异的潜在生物学因子。


核心知识点

MOFA+是什么

  • 全称:Multi-Omics Factor Analysis Plus
  • 核心思想:用少数潜在因子(Factors)解释多种组学数据的变异
  • 类比:把10000个基因的表达量压缩成10个因子,每个因子代表一种生物学过程
  • 升级点:相比原版MOFA,MOFA+支持多组(multi-group)设计和单细胞数据

适用场景

  • 单细胞多组学(scRNA+scATAC,10x Multiome)
  • 批量样本多组学整合(RNA+蛋白+代谢)
  • 时序多组学(结合group设计)

关键概念

概念含义
Factor潜在变量,代表一种隐藏的生物学信号
Weight每个因子对每个特征的重要性(正/负权重)
Variance Explained该因子能解释多少该组学的变异
Group样本分组(如不同时间点、不同条件)

实战代码

# 安装:pip install mofapy2
# 或 R: BiocManager::install("MOFA2")

# ========== Python接口示例 ==========
from mofapy2.run.entry_point import entry_point
import numpy as np
import pandas as pd

# ========== 1. 准备输入数据 ==========
np.random.seed(42)
n_samples = 50   # 样本数
n_genes = 500    # 基因数
n_peaks = 300    # ATAC peak数
n_proteins = 100 # 蛋白数

# 模拟三种组学数据(样本 x 特征)
rna_data = pd.DataFrame(
    np.random.negative_binomial(10, 0.5, size=(n_samples, n_genes)),
    columns=[f"Gene_{i}" for i in range(n_genes)]
)

atac_data = pd.DataFrame(
    np.random.binomial(1, 0.3, size=(n_samples, n_peaks)),  # 0/1二值化数据
    columns=[f"Peak_{i}" for i in range(n_peaks)]
)

protein_data = pd.DataFrame(
    np.random.normal(0, 1, size=(n_samples, n_proteins)),
    columns=[f"Protein_{i}" for i in range(n_proteins)]
)

print(f"RNA数据: {rna_data.shape}")      # (50, 500)
print(f"ATAC数据: {atac_data.shape}")    # (50, 300)
print(f"蛋白数据: {protein_data.shape}") # (50, 100)

# ========== 2. 初始化MOFA+模型 ==========
ent = entry_point()  # 创建MOFA+入口

# 设置数据(字典格式:{组学名: {分组名: 数据矩阵}})
data_dict = {
    "RNA": {"group1": rna_data.values.T},     # 注意:特征 x 样本
    "ATAC": {"group1": atac_data.values.T},
    "Protein": {"group1": protein_data.values.T}
}
ent.set_data_options(
    scale_groups=False,  # 不对组间缩放
    scale_views=True     # 对不同组学缩放(推荐,因量级不同)
)
ent.set_data_matrix(data_dict)

# ========== 3. 设置模型参数 ==========
ent.set_model_options(
    factors=10,           # 潜在因子数量(从10开始,根据方差解释量调整)
    likelihoods=["gaussian", "bernoulli", "gaussian"]  # 对应RNA/ATAC/蛋白的分布
)

ent.set_train_options(
    iter=1000,      # 最大迭代次数
    convergence_mode="fast",  # fast/medium/slow
    seed=42         # 随机种子(保证可重复)
)

# ========== 4. 训练模型 ==========
ent.build()
ent.run()

# 保存模型到HDF5文件
ent.save("mofa_model.hdf5")
print("模型已保存!")

# ========== 5. 下游分析(R语言更友好) ==========
# R代码示例:
r_code = """
library(MOFA2)  # 加载MOFA2包

# 加载保存的模型
model <- load_model("mofa_model.hdf5")

# 查看每个因子解释的方差比例
plot_variance_explained(model, max_r2=15)  # 热图展示

# 查看因子值(每个样本的因子得分)
factors <- get_factors(model, as.data.frame=TRUE)

# 查看因子权重(每个特征对因子的贡献)
weights <- get_weights(model, as.data.frame=TRUE)

# 找出Factor1权重最大的基因(=对Factor1贡献最大的基因)
top_genes <- weights %>%
    filter(view == "RNA", factor == "Factor1") %>%
    arrange(desc(abs(value))) %>%
    head(20)

# 关联因子与临床信息(如病人分组)
plot_factor(model, factor=1, color_by="condition")
"""
print("R分析代码(复制到R中运行):")
print(r_code)

面试常问点

  1. Q: MOFA+与PCA有什么区别? A: PCA只能处理单一数据矩阵,MOFA+可同时分析多个组学数据矩阵,找出跨组学的共同潜在因子。

  2. Q: 如何确定因子数量? A: 通过方差解释曲线(elbow plot),选取额外因子方差解释量<1%时的因子数;也可用贝叶斯模型自动确定。

  3. Q: MOFA+对缺失数据怎么处理? A: MOFA+天然支持部分缺失的多组学数据,通过变分贝叶斯推断对缺失值建模,无需插补。

  4. Q: Factor的生物学意义如何解释? A: 通过权重(weights)找到对该因子贡献最大的特征,再做通路富集分析;或关联临床表型找含义。


速查表

参数推荐值说明
factors10-25初始因子数,后可剪枝
iter1000训练迭代次数
scale_viewsTRUE不同组学量级差异大时开启
likelihoodgaussian/bernoulli/poisson连续/二值/计数数据
convergence_modefast快速/中等/慢速收敛