1. DESeq2简介:背景、原理、与edgeR/limma的比较归纳总结
1.1 为什么要学DESeq2
做RNA-seq差异表达分析,说白了就是回答一个问题:这个基因在对照组和实验组里,表达量到底变没变?
我刚开始做这个的时候,以为直接用read count做个t-test就完事了。后来才发现——根本行不通。为什么?因为你拿到的counts数据,方差不是均匀的。表达量低的基因,波动大;表达量高的基因,相对稳定。用普通统计模型处理这种数据,假阳性会高得离谱。
DESeq2就是为解决这个问题而生的。它基于负二项分布模型,专门处理RNA-seq count数据的过离散问题。我个人觉得,它是目前最稳健的差异表达分析工具之一。
1.2 核心原理速览
DESeq2的核心思想其实不复杂:
- 假设每个基因的counts服从负二项分布
- 用所有基因的信息去估计每个基因的方差
- 通过缩小估计(shrinkage)提高小样本下的稳定性
嗯,这里要注意一个关键点——过离散参数。普通泊松分布假设均值等于方差,但真实RNA-seq数据里,方差通常比均值大很多。DESeq2就是通过引入一个额外的离散参数来解决这个问题的。
个人经验:我记得最早用DESeq(第一版)分析一个小鼠数据集时,发现它对低表达基因的处理比直接跑edgeR好很多。后来DESeq2改进了离散估计的算法,效果更稳定了。
1.3 与edgeR和limma的对比
这三兄弟都是差异表达分析的主流工具。我工作中经常被问到“该用哪个?”——其实没有绝对答案,但各有侧重。
| 维度 | DESeq2 | edgeR | limma |
|---|---|---|---|
| 核心模型 | 负二项分布 | 负二项分布 | 线性模型+经验贝叶斯 |
| 离散估计方法 | 基因-wise + 缩小到回归曲线 | 条件似然 + 经验贝叶斯 | 不直接估计离散,用voom转换 |
| 小样本表现 | 优秀 | 较好 | 需要大样本更好 |
| 适用数据类型 | counts(整数) | counts(整数) | counts/log2转化后均可 |
| 标准化方法 | 几何均值比率 | TMM | voom自动处理 |
| 处理因子设计 | 公式接口灵活 | 可处理多因子 | 最灵活的线性模型 |
你想想看,如果数据只有两三个生物学重复,DESeq2的缩小估计能帮你稳住方差。如果样本量很大(比如10个以上),limma加voom可能更快。
避坑指南:我曾经在一个项目中,用edgeR处理了一个只有2个重复的数据集,结果差异基因列表反复横跳。后来换成DESeq2,结果稳定多了。但这不是说edgeR不好——在重复数足够时,它们的结论基本一致。
1.4 什么时候优先选DESeq2
我个人习惯这样判断:
- 重复数少(2-4个)→ DESeq2
- 数据中有大量低表达基因 → DESeq2的缩小估计更稳健
- 需要处理复杂实验设计(时间序列、多因子)→ 三者都可以,但DESeq2的公式接口比较直观
- 大规模分析(上千个样本)→ limma+voom更快,DESeq2会慢一些
1.5 一个简单的DESeq2工作流
先看一眼基础代码长什么样,心里有个底:
library(DESeq2)
# 构建DESeqDataSet对象
dds <- DESeqDataSetFromMatrix(
countData = counts_matrix,
colData = sample_info,
design = ~ treatment
)
# 核心分析
dds <- DESeq(dds)
# 提取结果
res <- results(dds, contrast = c("treatment", "treated", "control"))
# 查看显著差异基因
res_sig <- subset(res, padj < 0.05 & abs(log2FoldChange) > 1)
你看,核心函数其实就一个 DESeq()。它内部封装了:估计size factor → 估计离散 → 拟合模型 → 假设检验。整个流程非常清晰。
1.6 整体知识框架
我把本章的核心逻辑画成了下面的结构图。你可以把它当作后续课程的总纲:
注意:DESeq2要求输入是未标准化的整数counts。不要先做RPKM/FPKM标准化,否则会破坏统计模型的假设。
1.7 本章小结
这一章我们聊了:
- DESeq2是为RNA-seq差异表达设计的专用工具——不是t-test的替代品,是更好的选择
- 核心原理是负二项分布 + 缩小估计,解决了count数据的过离散问题
- 与edgeR相比,DESeq2在小样本下更稳健;与limma相比,它更贴合count数据特性
- 选择哪款工具,取决于你的样本量、实验设计和分析目标
说实话,我自己的项目里,80%的情况我直接用DESeq2。只有在样本量超过50且需要快速迭代时,才会考虑limma。