跳转至

多组学整合DIABLO

一句话概述:DIABLO(mixOmics包中的多组学整合方法)通过多模块稀疏偏最小二乘判别分析(multi-block sPLS-DA)从多种组学数据中同时筛选高相关的跨组学生物标志物,是2025-2026年最活跃的多组学整合R包之一。

核心知识点速览

概念白话解释
多组学整合把转录组+蛋白组+代谢组等多种数据合在一起分析
mixOmics多组学整合分析的R包,包含PLS系列方法
DIABLOmixOmics中的多组学判别分析方法
PLS-DA偏最小二乘判别分析,有监督的降维方法
sPLS-DA稀疏PLS-DA,同时降维+变量选择
block.splsdaDIABLO的核心函数,多模块稀疏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 connectionscutoff设置太高降低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增加"的调控链;④预测准确——多组学签名的分类准确率通常高于单组学(加权投票策略)。