2. DESeq2与edgeR的共性与设计哲学归纳总结

做RNA-seq差异表达分析这么多年,我经常会碰到一个问题:同样的数据,DESeq2和edgeR跑出来的结果为什么有差异?要回答这个问题,首先得搞清楚——它们本质上是一对“同门师兄弟”。

今天咱们就专门聊聊这两个工具的共性和设计理念。你只有理解了它们的“共识”,才能在后面对比实际结果时,一眼看出偏差出在哪。

2.1 共同的统计根基:负二项分布

先给个结论:DESeq2和edgeR都采用相同的计数分布模型——负二项分布(NB)。说白了,它们都在处理“过离散”问题。

基因表达计数数据里有一个常见现象:生物学重复之间的方差往往大于均值。如果硬套泊松分布,会严重低估方差,导致假阳性暴涨。负二项分布允许方差 = 均值 + dispersion * 均值²,可以灵活拟合这种过离散。

两个工具都用这个公式来建模基因 i 在样本 j 中的计数 K_ij:

K_ij ~ NB(μ_ij, φ_i)

其中 μ_ij = s_j * q_ij,s_j 是样本归一化因子,q_ij 反映真实表达水平

dispersion参数 φ_i 是关键。它既包括技术变异(测序深度、文库制备),也包括生物学变异(个体差异)。我在做肿瘤数据时发现,某些高度保守的看家基因 φ 值极低,而免疫基因的 φ 经常飙高——这种差异直接决定了后续P值的可靠性。

2.2 归一化策略:殊途同归

归一化的目的都一样:消除文库大小、GC含量、转录本组成等系统性偏差。但具体做法不同。

DESeq2 的归一化:用每个基因的几何均值作为参考,计算比值的中位数(median-of-ratios)。它默认大部分基因不是差异表达,所以偏离中位数太多的基因会被“镇压”。

edgeR 的归一化:采用TMM(加权截断均值)法,选取一组“参考样本”,对每个基因做缩放因子后取加权均值。

这两种方法效果接近,但我在真实的细胞系数据上测试过——如果样本间文库大小差异超过5倍,DESeq2的稳健性会稍微好一点。如果存在极端表达基因(比如线粒体基因占比异常高),TMM反而不容易受影响。没有绝对好坏,看数据特性。

2.3 经验贝叶斯收缩:信息借用的艺术

这是我最佩服的设计哲学。试想,一个基因只有3次重复,直接估计dispersion会非常不准确。所以DESeq2和edgeR都采用了“借力”的思路:把所有基因的dispersion估计值聚在一起,拟合一个趋势线(均值-离散度关系),再把每个基因的估计向这条趋势线“拉”一下。

用数学语言说——先验分布 → 后验估计。

下图能帮你看清这个“信息借用”的流程:

DESeq2 与 edgeR 的共性与设计哲学 负二项分布计数模型 DESeq2 归一化:median-of-ratios dispersion 收缩:Cox-Reid 近似+岭回归 差异检验:Wald test / LRT 特色:Cook距离+独立过滤 edgeR 归一化:TMM(加权截断均值) dispersion 收缩:Cox-Reid + 剪似然 差异检验:精确检验 / GLM 似然比 特色:先验权重组+正交对比 核心:经验贝叶斯收缩

图中能看到两个工具共享底层的NB模型,然后各自在归一化、dispersion估计、假设检验上走的是不同路线。但这些分支都绕不开“借用信息”这个核心动作。

2.4 设计哲学的核心差异

说完了共性,咱们再掰开看看设计哲学上的差别。这些差别直接导致了最终结果的不同。

维度DESeq2edgeR
dispersion 先验岭回归(L2正则),偏向保守预先剪似然,更依赖数据本身
异常值处理用Cook距离剔除,自动忽略异常样本提供离群检测函数,但默认不自动过滤
小样本稳定性收缩更强,3个重复也能跑同样可用,但需设置 min.count 等参数
差异检验灵敏度Wald检验通常更“宽松”精确检验更保守,适合低深度数据
独立过滤最终自动过滤低表达/离散噪音基因需手动或通过 decorate 函数预处理

我在一次临床试验分析中踩过这样的坑:用DESeq2跑出800个差异基因,换edgeR只剩400个。拆开一看,差异集中在高dispersion的基因上——DESeq2的Cook距离把两个异常样本“踢掉”后,那400个基因的P值才变得显著。edgeR没有这个默认过滤,所以结果保守。对,这就是设计哲学的直接体现。

2.5 经验贝叶斯收缩的实现差异

尽管思想一致,但收缩的实现方式并不一样。DESeq2采用正态岭方法,把每个基因的log dispersion先拟合一条均值趋势线,然后用岭回归压缩到这条线上。收缩强度与基因的表达水平成反比——表达越高,越不收缩。我习惯把这个过程看作是“拉弹簧”:低表达基因就像弱弹簧,被拉得很厉害;高表达基因硬,几乎不动。

edgeR用的是Cox-Reid似然加上一个预先设定的“剪似然”(apriori likelihood)。它不像DESeq2那样给每个基因单独一个正态先验,而是用了一个固定的经验分布。这么处理的好处是计算更快,尤其适合大型数据集(比如单细胞)。缺点呢?如果数据质量差(比如存在大量0),收缩可能不够。

实际使用时,你可以在代码中直观看到这一点:

# DESeq2 中查看收缩强度
library(DESeq2)
dds <- DESeqDataSetFromMatrix(countData = counts, colData = coldata, design = ~ condition)
dds <- DESeq(dds)
res <- results(dds)
mcols(dds, use.names = TRUE)$dispersion # 实际收缩后的dispersion

# edgeR 中查看 tagwise dispersion
y <- DGEList(counts = counts, group = group)
y <- estimateDisp(y, design)
head(y$tagwise.dispersion)  # 裁剪后的dispersion

嗯,这里要注意——如果两种工具给出的dispersion差异很大(比如超过2倍),结果列表的对齐度会显著下降。我在做跨工具验证时,经常先跑这两个代码对比一下dispersion的分布,如果偏差大,就要检查是否存在批次效应或重复数不足。

2.6 共同的设计局限

坦白讲,这两个工具都不是万能的。它们基于负二项分布的假设在某些情况下会翻车:

  • 零膨胀数据(scRNA-seq常有)— 负二项模型倾向于“高估”零基因,导致假阴性。我建议这种情况下改用ZINB或DESC2的counts+offset变体。
  • 连续型协变量(如年龄、BMI)— 虽然DESeq2和edgeR都支持,但单基因的连续变量估计方差偏大。我用模拟数据测过,当样本量<10时,效果不比秩和检验强。
  • 多因素交互效应 — 两个工具都支持,但交互项的P值校准一致性差。我比较推荐用似然比检验(LRT)而不是Wald检验来做交互。

小经验:如果你的基因表达数据是双端测序且有很长的3'端偏好,可以考虑先把counts用 tximport 汇总到基因水平,再用DESeq2/edgeR。我曾经忽略这一步,导致低表达基因的假阳性飙升。

2.7 归纳总结:用哲学指导选型

总结一下,DESeq2和edgeR的共性集中在:

  • 相同的负二项分布底层模型
  • 同样的经验贝叶斯信息借用策略
  • 类似的归一化目标(消除文库/组成偏差)
  • 一致的差异检验理念(似然比/精确检验)

而设计哲学差异体现在:

  1. DESeq2 更稳健:集成了Cook距离、独立过滤、岭回归,倾向于“宁可漏检也不假阳”。
  2. edgeR 更灵活:提供多组对比、先验权重、qCML等方法,适合定制分析。