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)
面试常问点¶
Q: MOFA+与PCA有什么区别? A: PCA只能处理单一数据矩阵,MOFA+可同时分析多个组学数据矩阵,找出跨组学的共同潜在因子。
Q: 如何确定因子数量? A: 通过方差解释曲线(elbow plot),选取额外因子方差解释量<1%时的因子数;也可用贝叶斯模型自动确定。
Q: MOFA+对缺失数据怎么处理? A: MOFA+天然支持部分缺失的多组学数据,通过变分贝叶斯推断对缺失值建模,无需插补。
Q: Factor的生物学意义如何解释? A: 通过权重(weights)找到对该因子贡献最大的特征,再做通路富集分析;或关联临床表型找含义。
速查表¶
| 参数 | 推荐值 | 说明 |
|---|---|---|
| factors | 10-25 | 初始因子数,后可剪枝 |
| iter | 1000 | 训练迭代次数 |
| scale_views | TRUE | 不同组学量级差异大时开启 |
| likelihood | gaussian/bernoulli/poisson | 连续/二值/计数数据 |
| convergence_mode | fast | 快速/中等/慢速收敛 |