3. 常用的 RNA-seq 分析模型:DESeq2、edgeR、limma-voom、机器学习模型简介

好,我们进入正题。

RNA-seq 差异表达分析,说白了就是回答一个问题:

这个基因在两个条件下,到底有没有显著变化?

你手头可能有一张表达矩阵,行是基因,列是样本,数字是 counts。但直接拿这些 counts 做 t 检验?不行。为什么?因为 RNA-seq 数据天生有三大难题:均值-方差关系、文库大小差异、以及低表达基因的高噪声。我前几年刚入行时,就曾直接拿 raw counts 跑 t 检验,结果假阳性率高得吓人,被审稿人一顿痛批。从此我记住了:工具选对,事半功倍。

这一章,我就把常用的模型给你捋一遍。我会重点讲三个经典模型,再简单提一下机器学习方法。你不需要每个都精通,但得知道什么时候用谁。

3.1 DESeq2:稳健派代表

DESeq2 是我个人最常用的模型之一。它的核心思想是:假设基因的 counts 服从负二项分布,然后估计每个基因的离散度参数,再通过一个类似 Wald 检验或 LRT(似然比检验)来做假设检验。

它的一个关键步骤是归一化,用的是“中位数比率法”。这种方法比简单用总 counts 归一化要稳健很多。如果某个高表达基因在一个样本中异常高,它不会把整个归一化因子拉偏。

你写代码通常这样跑:

library(DESeq2)

dds <- DESeqDataSetFromMatrix(
  countData = count_matrix,
  colData = col_data,
  design = ~ condition
)
dds <- DESeq(dds)
res <- results(dds, contrast = c("condition", "treated", "control"))

输出结果里,最重要的是 log2FoldChange 和 padj(校正后的 p 值)。

我的经验:如果样本量偏小(比如每组 3 个),DESeq2 的离散度先验能让结果更稳。但要注意,如果实验设计有 batch 效应,记得用 design = ~ batch + condition 做校正。

3.2 edgeR:速度快,准度高

edgeR 和 DESeq2 是兄弟模型,也是基于负二项分布。但它的归一化方法用的是 TMM(Trimmed Mean of M-values)。说白了,就是去掉那些极端高表达和低表达的基因,只以中间部分做基准。

我个人的感觉是:edgeR 速度比 DESeq2 快一截,尤其是你跑几千个样本的时候。它的核心差异在于用了一个经验贝叶斯的精确检验或者准似然 F 检验。

library(edgeR)

dge <- DGEList(counts = count_matrix, group = group_factor)
dge <- calcNormFactors(dge, method = "TMM")
dge <- estimateDisp(dge)
et <- exactTest(dge)
topTags(et)
避坑指南:我曾遇到过一个转录组数据,有一半基因表达几乎为零,结果 TMM 归一化把那些非零的样本推得特别高。后来我加了 filterByExpr(dge) 过滤掉低表达基因,结果才合理。

3.3 limma-voom:从微阵列“借”来的将军

limma 本来是为微阵列芯片设计的,用线性模型 + 经验贝叶斯做差异表达。RNA-seq 数据进来后,voom 方法把它“翻译”成 limma 能吃的样子。

具体来说,voom 将 counts 变成 log2 CPM,然后估算每个基因的均值-方差权重,最后丢给 limma 做线性建模。我总觉得,这个方法其实是一种更灵活的折中方案:你想在模型中加多个协变量?limma-voom 配合度很高。

library(limma)
library(edgeR)

dge <- DGEList(counts = count_matrix)
dge <- calcNormFactors(dge)
v <- voom(dge, design = model.matrix(~ condition))
fit <- lmFit(v, design)
fit <- eBayes(fit)
topTable(fit, coef = "conditiontreated")
我的建议:如果你的实验设计比较复杂,比如同时考虑时间、处理、个体,limma-voom 的灵活性是最高的。而且它对大样本(每组 10+)的适用性非常好。

3.4 三种模型的差异对比

我把它们的核心差异整理成一张表,方便你快速对比:

特性 DESeq2 edgeR limma-voom
分布假设 负二项分布 负二项分布 线性模型 + 方差权重
归一化方法 中位数比率 TMM TMM + logCPM
优势场景 小样本(3-5)、稳健 大样本、快速 复杂设计、多协变量
输出指标 log2FC, padj, baseMean logFC, FDR, CPM logFC, adj.P.Val, AveExpr
假阳性控制 严格,适合敏感分析 中等,适合筛选 偏宽松,适合探索

你想想看:如果你的实验只有 2 组,每组 3 个样本,我推荐 DESeq2。如果样本量有 10 个以上,edgeR 或 limma-voom 都行,主要取决于设计复杂度。

3.5 机器学习模型简介

近两年,越来越多的研究开始用机器学习模型直接做分类或差异基因筛选。常见的方法有:

  • 随机森林(Random Forest):可以给基因排重要性,适合大量特征的初步筛选。
  • 支持向量机(SVM):小样本高维数据下表现不错,但需要调参数。
  • 深度学习(如 autoencoder):主要用于降维或构建 latent 特征,不适合直接做差异检验。
  • XGBoost / LightGBM:梯度提升树,对特征交互敏感,但容易过拟合。
注意:机器学习模型通常不提供 p 值或 FDR 校正。它们更擅长做样本级别的分类或聚类,而不是基因级别的差异统计推断。我个人建议:机器学习模型可作为 特征排序 的补充,但不要替代 DESeq2 或 edgeR 的核心结果。当然,如果你只看 AUC 或 准确率,ML 模型在验证外部数据集时很有用。

好了,这就是本章的模型总览。你记住一个原则:先理解数据特点,再选模型,不要习惯性只用一个。我建议你把三个统计模型都跑一遍,看看哪些基因是稳定出名的,再结合机器学习做个交叉验证,结果会更有说服力。

RNA-seq 差异表达分析模型对比 差异表达分析模型 经典统计模型 DESeq2 负二项+中位数比率 edgeR 负二项+TMM limma-voom 线性+voom权重 机器学习模型 随机森林 特征重要性 SVM / XGBoost 分类/筛选 深度学习 降维 / 表征 经验:小样本 → DESeq2;复杂设计 → limma-voom; 大样本快速筛选 → edgeR;交叉验证 → 加ML排序