3. 数据预处理差异:原始计数 vs 规范化因子
咱们开始聊第三个关键点。
很多人跑完 DESeq2 和 edgeR,发现结果不一样,第一反应是“算法没选对”。
其实,真正的瓶颈不在算法,在数据预处理。这一步,才是两个工具分道扬镳的起点。
3.1 原始计数:为什么它不够用?
先说原始计数。什么是原始计数?就是比对软件给你的那个整数,比如某个基因在这个样本里检测到了 123 条 reads。
你想想看,这个数字直接能用吗?
当然不行。因为它受两个因素影响太大了:
- 测序深度差异:一个样本测了 5000 万条 reads,另一个只测了 2000 万条。同一个基因,在深度高的样本里计数自然就高,这不代表它真表达得多。
- 基因长度差异:长基因容易被更多 reads 覆盖。两个基因表达水平一样,但一个长一个短,计数也能差好几倍。
所以,直接用原始计数做差异分析,结果就是:测序深的样本里所有基因都“表达上调”,长基因全被误判为“差异基因”。
3.2 规范化因子:两个工具的核心手段
为了消除这些干扰,DESeq2 和 edgeR 都引入了规范化因子。但两者的计算思路完全不一样。
3.2.1 DESeq2 的方法:相对丰度估计
DESeq2 使用 median of ratios 方法。大白话怎么说?就是先算每个基因在每个样本里的“相对丰度”,然后取中位数作为总体缩放因子。
我习惯这么理解:
- 先挑出在所有样本里都有表达的基因(至少计数不为0)。
- 对每个基因,计算它相对于几何平均的比值。
- 取每个样本所有基因比值的中位数,作为这个样本的规范化因子。
代码里怎么调?在 R 里写:
dds <- DESeqDataSetFromMatrix(countData = counts, colData = meta, design = ~ condition)
dds <- estimateSizeFactors(dds)
sizeFactors(dds) # 查看规范化因子
这个因子是一个浮点数,比如 1.2 表示这个样本的测序深度比平均高 20%。
3.2.2 edgeR 的方法:TMM 与 RLE
edgeR 默认用的是 TMM(Trimmed Mean of M-values)。它的思路不一样:
- 选一个参考样本(通常是测序深度中等的样本)。
- 对每个基因,计算 log2 倍变化(M值)和平均表达水平(A值)。
- 只保留 M值在中位数附近的基因,排除那些表达差异极大的基因。
- 取这些基因的加权平均,作为规范化因子。
还有个选项叫 RLE(Relative Log Expression),和 DESeq2 的思路更接近一点。但 edgeR 默认用 TMM,这是有道理的——对异常值更鲁棒。
y <- DGEList(counts = counts, group = condition)
y <- calcNormFactors(y, method = "TMM")
y$samples$norm.factors # 查看规范化因子
3.3 核心差异表:两个工具到底差在哪?
| 对比维度 | DESeq2 | edgeR |
|---|---|---|
| 规范化方法 | median of ratios | TMM(默认)或 RLE |
| 核心思想 | 相对丰度中位数 | 修剪后的 M值加权平均 |
| 对稀疏数据的鲁棒性 | 较好(中位数天然抗噪) | 一般(需要一定数量的非零基因) |
| 适用的测序类型 | RNA-seq、scRNA-seq 均可 | 传统 bulk RNA-seq 较佳 |
| 参考样本选择 | 几何平均(隐式参考) | 显式选择一个样本作为参考 |
| 因子数值范围 | 通常 0.5~2.0 | 通常 0.5~2.0 |
| 后续统计模型 | 负二项 + 对数线性模型 | 负二项 + quasi-likelihood |
这张表里,最值得记住的是:两种因子背后对“什么是异常基因”的假设不同。
DESeq2 认为大部分基因表达不变,所以用中位数;edgeR 认为极端表达基因会干扰因子估计,所以先剪掉它们。这就导致:
- 如果你的数据里确实有一批基因差异极大(比如处理组和对照组完全不同的通路),DESeq2 的因子可能被“正常基因”拖累。
- 如果你的数据里大部分基因都表达稳定,edgeR 的 TMM 和 DESeq2 的 median of ratios 结果基本一致。
3.4 实战经验:什么时候选哪种?
我在项目中遇到过这种情况:用 DESeq2 跑一个肿瘤 vs 正常组织的比较,发现正常组的规范化因子普遍偏大。原因是正常组织有很多高表达基因,拉高了中位数。这时候,DESeq2 对正常样本的“矫正强度”就偏大,导致肿瘤样本里一些本来上调的基因被压低了。
换 edgeR 的 TMM 再跑,因子就合理多了。因为 TMM 把那些极端高表达的基因先剪掉了,剩下的基因更均衡。
反过来,有一次做 scRNA-seq 的数据,细胞稀疏度很高,大部分基因在单个细胞里是 0。edgeR 的 TMM 直接警告说“计算不稳定”。而 DESeq2 的 median of ratios 还能跑,虽然 p-value 的可靠性也下降了。
filterByExpr(edgeR)或 rowSums(counts >= 10)(DESeq2)过滤掉低表达基因。这能同时提升两个工具的健壮性。
3.5 画一张图:规范化因子的计算流程对比
下面这张图,可以帮你直观地看到两个工具的因子计算路径从哪里开始分叉:
看懂这张图就明白了:两个工具的核心分歧,就在于第二步和第三步的差异。
DESeq2 选“中位数”,edgeR 选“修剪后的加权平均”。中位数简单、稳健、不需调参,但遇到极端偏态时可能迟钝。修剪加权平均灵活,可调trim参数,但需要数据质量好。
3.6 对后续结果的影响
我说个实际案例。之前处理一个水稻的胁迫数据,对照组 vs 处理组。对照组有一个样本的测序深度特别高(6000万 reads),其他都只有 2000万左右。
DESeq2 给那个深度高的样本算出的 sizeFactor 是 2.1,直接把它的所有计数除以 2.1 再建模。结果,这个样本里原本正常的基因都被“打压”了,导致显著基因数量减少了 30% 以上。
edgeR 的 TMM 给的 normFactor 是 1.3。因为 TMM 修剪掉了一些高表达基因,它认为这个样本的深度差异没那么大。最终结果,显著基因数量比 DESeq2 多了 20%。
核心判断标准:
- 如果数据里存在少数极高表达的基因(比如核糖体RNA、线粒体基因),DESeq2 的因子容易被拉高,edgeR 更安全。
- 如果数据里大部分基因表达水平差别不大,DESeq2 的中位数更稳定。
- 如果数据稀疏(大量0值),DESeq2 更稳,edgeR 可能算出来的因子方差很大。
我个人的习惯是:
- 先看数据概况:用
boxplot(log2(counts+1))看分布是否偏态。 - 如果不偏,优先用 DESeq2(因为它的因子估计方差小)。
- 如果偏态明显,或者有明确的批次效应,试试 edgeR 的 TMM。
- 最后,两个都跑一次,看 top 显著基因的重叠率。如果重叠率超过 80%,说明因子差异不大;如果只有 50% 以下,得回头检查数据质量和预处理。
嗯,这就是第三个差异点的全部内容。