多组学整合DIABLO¶
一句话概述:DIABLO(mixOmics包中的多组学整合方法)通过多模块稀疏偏最小二乘判别分析(multi-block sPLS-DA)从多种组学数据中同时筛选高相关的跨组学生物标志物,是2025-2026年最活跃的多组学整合R包之一。
核心知识点速览¶
| 概念 | 白话解释 |
|---|---|
| 多组学整合 | 把转录组+蛋白组+代谢组等多种数据合在一起分析 |
| mixOmics | 多组学整合分析的R包,包含PLS系列方法 |
| DIABLO | mixOmics中的多组学判别分析方法 |
| PLS-DA | 偏最小二乘判别分析,有监督的降维方法 |
| sPLS-DA | 稀疏PLS-DA,同时降维+变量选择 |
| block.splsda | DIABLO的核心函数,多模块稀疏PLS-DA |
| 设计矩阵 | 控制不同组学数据之间关联强度的矩阵 |
| 潜变量 | PLS方法提取的隐藏因子(类似PCA的主成分) |
| VIP | 变量投影重要性,衡量每个变量的贡献 |
| Circos图 | 圆形图,展示跨组学变量之间的相关性 |
一、多组学整合策略¶
1.1 为什么需要多组学整合?¶
单组学的局限:
- 转录组只看mRNA,不等于蛋白和代谢物水平
- 蛋白组遗漏翻译后修饰的调控
- 代谢组不知道上游基因调控
多组学整合的优势:
1. 更全面的生物学图景
2. 跨层次验证(基因→蛋白→代谢物一致变化更可靠)
3. 发现跨组学的调控关系
4. 更准确的生物标志物(多组学签名)
三种整合策略:
① 早期整合(Early Integration):拼接数据矩阵后分析
简单但忽略了组学间差异
② 晚期整合(Late Integration):各组学分别分析后合并结果
保留组学特性但不能发现跨组学关系
③ 中间整合(Intermediate Integration):DIABLO属于此类
同时分析多组学数据,发现跨组学相关特征
1.2 mixOmics包概览¶
mixOmics包含的主要方法:
| 方法 | 功能 | 有/无监督 | 数据块数 |
|------|------|-----------|----------|
| PCA | 主成分分析 | 无监督 | 1 |
| PLS | 偏最小二乘 | 有监督 | 2 |
| sPLS | 稀疏PLS | 有监督+变量选择 | 2 |
| PLS-DA | PLS判别分析 | 有监督(分类) | 1+标签 |
| sPLS-DA | 稀疏PLS-DA | 有监督+变量选择 | 1+标签 |
| DIABLO | 多模块sPLS-DA | 有监督+变量选择 | N+标签 |
| MINT | 批次效应校正PLS-DA | 有监督 | 1+标签+批次 |
二、DIABLO分析流程¶
2.1 安装和数据准备¶
# 安装mixOmics
BiocManager::install("mixOmics") # 安装
library(mixOmics) # 加载
# DIABLO需要的输入数据:
# 1. 多个组学数据矩阵(行=样本,列=特征)
# 2. 样本分组标签(Y)
# 3. 设计矩阵(控制组学间关联)
# 示例:3个组学数据块
# X_mrna: 100个样本 × 2000个基因
# X_mirna: 100个样本 × 300个miRNA
# X_protein: 100个样本 × 500个蛋白
# 准备数据列表
X <- list(
mRNA = X_mrna, # 转录组矩阵
miRNA = X_mirna, # miRNA矩阵
protein = X_protein # 蛋白组矩阵
)
# 分组标签
Y <- factor(sample_groups) # 如c("Cancer", "Normal", "Cancer", ...)
cat("样本分组:", table(Y), "\n")
# 检查数据一致性
# 所有矩阵的行名(样本名)必须一致!
lapply(X, dim) # 查看各矩阵维度
sapply(X, function(x) identical(rownames(x), rownames(X[[1]]))) # 检查样本名一致
2.2 设置设计矩阵¶
# 设计矩阵控制不同组学数据之间的关联强度
# 值为0-1之间:0=完全独立,1=完全关联
# 方法1:全关联设计(推荐起始)
design <- matrix(0.1, nrow = length(X), ncol = length(X),
dimnames = list(names(X), names(X))) # 初始化
diag(design) <- 0 # 对角线为0(自己和自己不需要关联)
design
# mRNA miRNA protein
# mRNA 0.0 0.1 0.1
# miRNA 0.1 0.0 0.1
# protein 0.1 0.1 0.0
# 方法2:基于先验知识的设计
# 如果知道miRNA调控mRNA但与蛋白关系较远
design_custom <- matrix(c(
0, 0.8, 0.3, # mRNA和miRNA强关联,和蛋白弱关联
0.8, 0, 0.1, # miRNA和mRNA强关联,和蛋白弱关联
0.3, 0.1, 0 # 蛋白和mRNA中等关联,和miRNA弱关联
), nrow = 3, dimnames = list(names(X), names(X)))
# 设计矩阵对结果影响:
# 值越大 → 强调组学间的相关性 → 选出跨组学高相关的变量
# 值越小 → 强调判别能力 → 选出区分分组最好的变量
# 通常用0.1作为起始值,然后根据结果调整
2.3 参数调优¶
# ===== 步骤1:确定每个组学的最佳成分数 =====
# 先用PLS-DA对每个组学单独评估
perf_plsda <- list()
for (i in names(X)) {
plsda_model <- plsda(X[[i]], Y, ncomp = 10) # 拟合PLS-DA
perf_plsda[[i]] <- perf(plsda_model, # 性能评估
validation = "Mval", # M折交叉验证
folds = 5, # 5折
nrepeat = 10) # 重复10次
}
# 查看每个组学的最佳成分数
# 通常2-5个成分就够了
# ===== 步骤2:确定每个组学每个成分选多少变量 =====
# 使用tune.block.splsda函数
test_keepX <- list(
mRNA = c(10, 20, 50, 100), # mRNA候选变量数
miRNA = c(5, 10, 15, 20), # miRNA候选变量数
protein = c(10, 20, 30, 50) # protein候选变量数
)
tune_result <- tune.block.splsda(
X = X, # 多组学数据
Y = Y, # 分组标签
ncomp = 2, # 成分数
test.keepX = test_keepX, # 候选变量数
design = design, # 设计矩阵
validation = "Mval", # M折交叉验证
folds = 5, # 5折
nrepeat = 10, # 重复10次
dist = "centroids.dist" # 距离度量
)
# 查看最佳变量数
tune_result$choice.keepX # 每个组学每个成分的最佳变量数
# 例如:mRNA=50, miRNA=10, protein=20
# 查看分类错误率
plot(tune_result) # 画错误率曲线
2.4 运行DIABLO¶
# 使用最优参数运行DIABLO
keepX <- tune_result$choice.keepX # 最优变量数
ncomp <- tune_result$choice.ncomp # 最优成分数
# 运行DIABLO(block.splsda)
diablo_model <- block.splsda(
X = X, # 多组学数据列表
Y = Y, # 分组标签
ncomp = ncomp, # 成分数
keepX = keepX, # 每个组学的变量数
design = design # 设计矩阵
)
# 查看模型摘要
diablo_model
2.5 模型评估¶
# 交叉验证评估
perf_diablo <- perf(
diablo_model,
validation = "Mval", # M折交叉验证
folds = 5, # 5折
nrepeat = 10, # 重复10次
dist = "centroids.dist" # 距离度量
)
# 查看分类错误率
perf_diablo$error.rate # 每个组学的错误率
perf_diablo$WeightedVote # 加权投票的错误率
# 画错误率图
plot(perf_diablo)
# AUC曲线
auc_result <- auroc(diablo_model, roc.block = "miRNA") # 指定某个组学的AUC
三、结果可视化¶
3.1 样本图¶
# 1. 个体样本投影图(Score Plot)
plotIndiv(diablo_model,
ind.names = FALSE, # 不显示样本名
legend = TRUE, # 显示图例
title = "DIABLO Score Plot",
comp = c(1, 2)) # 画成分1和2
# 2. 按组学分别画样本图
plotIndiv(diablo_model,
blocks = "mRNA", # 只画mRNA组学
comp = c(1, 2),
ind.names = FALSE,
legend = TRUE,
title = "mRNA Block")
3.2 变量图¶
# 1. 变量投影图(Loading Plot)
# 查看每个组学中被选中的变量及其贡献
plotLoadings(diablo_model,
comp = 1, # 成分1
contrib = "max", # 显示贡献最大的分组
method = "median") # 中位数
# 2. 所有组学的变量相关图
plotVar(diablo_model,
var.names = FALSE, # 不显示变量名(太多时)
style = "graphics",
legend = TRUE,
pch = c(16, 17, 15), # 不同组学用不同符号
cex = c(2, 2, 2))
3.3 跨组学关联图¶
# 1. Circos图——展示跨组学变量相关性
circosPlot(diablo_model,
cutoff = 0.7, # 相关性阈值
line = TRUE, # 显示连接线
color.Y = c("red", "blue"), # 分组颜色
size.labels = 1.5) # 标签大小
# Circos图解读:
# 外圈:不同颜色代表不同组学
# 线条:变量间的相关性(>cutoff才显示)
# 颜色:正相关(红色)/负相关(蓝色)
# 2. 相关网络图
network(diablo_model,
blocks = c(1, 2, 3), # 显示所有3个组学
color.node = c("cyan", "orange", "green"), # 节点颜色
cutoff = 0.6, # 相关性阈值
save = "network_plot", # 保存图片
shape.node = c("circle", "diamond", "square")) # 节点形状
# 3. 相关热图(CIM图)
cimDiablo(diablo_model,
color.Y = c("red", "blue"), # 分组颜色
margins = c(10, 5), # 边距
legend.position = "topright") # 图例位置
3.4 提取生物标志物签名¶
# 提取每个组学选中的变量(多组学签名)
selected_vars <- selectVar(diablo_model, comp = 1) # 成分1
# mRNA签名
mrna_signature <- selected_vars$mRNA$name # 基因名
mrna_loading <- selected_vars$mRNA$value # 载荷值
cat("mRNA签名基因数:", length(mrna_signature), "\n")
# miRNA签名
mirna_signature <- selected_vars$miRNA$name
cat("miRNA签名数:", length(mirna_signature), "\n")
# 蛋白签名
protein_signature <- selected_vars$protein$name
cat("蛋白签名数:", length(protein_signature), "\n")
# 导出签名
signature_df <- data.frame(
omics = c(rep("mRNA", length(mrna_signature)),
rep("miRNA", length(mirna_signature)),
rep("protein", length(protein_signature))),
feature = c(mrna_signature, mirna_signature, protein_signature)
)
write.csv(signature_df, "DIABLO_signature.csv", row.names = FALSE)
四、预测新样本¶
# 用训练好的DIABLO模型预测新样本
# 新样本也需要有相同的多组学数据
new_X <- list(
mRNA = new_mrna_data, # 新样本mRNA数据
miRNA = new_mirna_data, # 新样本miRNA数据
protein = new_protein_data # 新样本蛋白数据
)
# 预测
predictions <- predict(diablo_model, newdata = new_X)
# 获取预测标签
predicted_class <- predictions$WeightedVote$centroids.dist[, 2] # 成分2的加权预测
cat("预测结果:", table(predicted_class), "\n")
# 加权投票:综合所有组学的预测结果
# 比单组学预测更准确
常见报错与解决¶
| 报错信息 | 原因 | 解决方案 |
|---|---|---|
Sample names don't match | 组学间样本名不一致 | 统一所有矩阵的行名 |
tune: too slow | 候选参数太多 | 减少test.keepX的候选值 |
block.splsda: singular matrix | 变量数太少或共线性 | 增加变量数或预先过滤 |
design matrix error | 设计矩阵维度不对 | 确保行列数等于组学数 |
perf: error rate = 0 | 过拟合(样本太少) | 增加样本量或减少成分数 |
circosPlot: no connections | cutoff设置太高 | 降低cutoff值(如0.5) |
速查表¶
# DIABLO分析流程
准备数据列表(X) + 标签(Y) + 设计矩阵(design)
→ tune.block.splsda()(调参)
→ block.splsda()(建模)
→ perf()(评估)
→ 可视化(plotIndiv/plotLoadings/circosPlot/cimDiablo)
→ selectVar()(提取签名)
# 核心函数
block.splsda(): DIABLO建模
tune.block.splsda(): 自动调参
perf(): 交叉验证评估
plotIndiv(): 样本散点图
plotLoadings(): 变量贡献图
circosPlot(): 跨组学关联圆形图
cimDiablo(): 聚类热图
network(): 相关网络图
selectVar(): 提取选中变量
predict(): 预测新样本
# 参数选择指南
设计矩阵值: 0.1起始,高值→强调跨组学关联
成分数ncomp: 通常2-5,看交叉验证误差
keepX: tune函数自动确定
交叉验证: Mval(留一法的改进),5-10折,重复10次
# 与其他多组学方法对比
DIABLO: 有监督+变量选择+多组学(mixOmics)
MOFA+: 无监督+多组学潜因子分析(Python/R)
iCluster: 有监督+多组学聚类(R)
SNF: 相似性网络融合(R)
面试高频问题¶
Q1:DIABLO的原理是什么?¶
答:DIABLO是多模块稀疏偏最小二乘判别分析(multi-block sPLS-DA)。它同时分析N个组学数据块,通过最大化三个目标:①每个组学数据块的潜变量与分组标签Y的协方差(判别能力);②不同组学数据块之间潜变量的协方差(跨组学关联);③稀疏性约束——每个成分只选择少量变量(LASSO类型的L1正则化)。设计矩阵控制②的权重。最终输出是跨组学高度相关且能区分分组的变量子集。
Q2:设计矩阵(design matrix)有什么用?¶
答:设计矩阵是DIABLO的独特之处,控制不同组学数据之间的关联强度(0-1之间)。值为0时只关注判别能力,值为1时最大化跨组学相关性。实际使用中,高值(如0.8-1.0)会选出跨组学高度相关的变量(但可能牺牲判别能力),低值(如0.1)优先选判别力强的变量。推荐从0.1开始,如果不同组学选出的变量间无相关性再提高。也可以根据先验知识设置——如miRNA和mRNA关联应该强于miRNA和代谢物。
Q3:如何评估DIABLO模型的好坏?¶
答:三个层面:①分类性能——用M折交叉验证(Mval, 5-10折,重复10次)评估分类错误率,越低越好;②AUC曲线——每个组学单独和加权投票的AUC,>0.8为好;③生物学可解释性——选出的跨组学变量是否有已知的生物学关系(如miR-21与其靶基因都被选中),Circos图和相关网络是否揭示合理的调控关系。过拟合是主要风险,样本量至少应该是变量数的3-5倍。
Q4:DIABLO和MOFA+有什么区别?¶
答:核心区别:DIABLO是有监督方法(需要分组标签,目标是分类和标志物发现),MOFA+是无监督方法(不需要标签,目标是发现潜在的变异因子)。DIABLO用PLS框架同时降维和选变量,适合标志物发现和预测模型。MOFA+用贝叶斯因子分析,适合探索数据的隐藏结构和各组学对变异的贡献。选择依据:有明确分组→DIABLO;探索性分析、发现隐藏模式→MOFA+。
Q5:多组学整合相比单组学有什么实际优势?¶
答:2025年COVID-19多组学研究用DIABLO整合转录组和蛋白组,成功识别了区分疾病严重程度的跨组学标志物。实际优势:①信号互补——某些调控关系在转录水平不明显但在蛋白/代谢水平显著;②交叉验证——在多个组学层面都变化的分子更可靠;③机制解析——可以发现"基因A上调→蛋白B上调→代谢物C增加"的调控链;④预测准确——多组学签名的分类准确率通常高于单组学(加权投票策略)。