3. 数据预处理差异:原始计数 vs 规范化因子

咱们开始聊第三个关键点。

很多人跑完 DESeq2 和 edgeR,发现结果不一样,第一反应是“算法没选对”。

其实,真正的瓶颈不在算法,在数据预处理。这一步,才是两个工具分道扬镳的起点。

3.1 原始计数:为什么它不够用?

先说原始计数。什么是原始计数?就是比对软件给你的那个整数,比如某个基因在这个样本里检测到了 123 条 reads。

你想想看,这个数字直接能用吗?

当然不行。因为它受两个因素影响太大了:

  • 测序深度差异:一个样本测了 5000 万条 reads,另一个只测了 2000 万条。同一个基因,在深度高的样本里计数自然就高,这不代表它真表达得多。
  • 基因长度差异:长基因容易被更多 reads 覆盖。两个基因表达水平一样,但一个长一个短,计数也能差好几倍。

所以,直接用原始计数做差异分析,结果就是:测序深的样本里所有基因都“表达上调”,长基因全被误判为“差异基因”。

避坑提醒:我曾经接过一个项目,合作方直接拿原始计数跑 edgeR,结果出来几百个“显著差异基因”。我一检查,全是深度最高的那个样本贡献的。嗯,这就是典型的数据没预处理。

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: median of ratios ① 每个基因 / 几何平均 → 比值 ② 取每个样本比值的中位数 sizeFactors edgeR: TMM 归一化 ① 选参考样本,计算 M值 / A值 ② 修剪极端 M值后取加权平均 normFactors

看懂这张图就明白了:两个工具的核心分歧,就在于第二步和第三步的差异。

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 可能算出来的因子方差很大。

我个人的习惯是:

  1. 先看数据概况:用 boxplot(log2(counts+1)) 看分布是否偏态。
  2. 如果不偏,优先用 DESeq2(因为它的因子估计方差小)。
  3. 如果偏态明显,或者有明确的批次效应,试试 edgeR 的 TMM。
  4. 最后,两个都跑一次,看 top 显著基因的重叠率。如果重叠率超过 80%,说明因子差异不大;如果只有 50% 以下,得回头检查数据质量和预处理。

嗯,这就是第三个差异点的全部内容。