1. edgeR 简介:RNA‑seq 差异表达分析到底在干什么

RNA‑seq 差异表达分析,说白了就是回答一个问题:哪些基因在不同实验条件下表达量有显著变化? 你可能已经有了一套 counts 矩阵(每个基因在每个样本中的 read 计数),但还没法直接拿去算差异——因为技术误差、生物学变异、文库大小不同,全是坑。我刚开始做 RNA‑seq 的时候,拿到数据直接 t 检验,结果检出来的假阳性多到没法看……嗯,后来才知道,差分的底层逻辑远比想象中复杂。

这章我就带你从背景出发,捋清楚 edgeR 到底靠什么思想搞定差异分析,再和 limma、DESeq2 做个横向对比。学完之后,你对 GLM 批次处理的理论基础会更清楚。

1.1 RNA‑seq 数据的“家底”:counts 和它的歪屁股分布

原始数据是一张计数矩阵:

  • 行是基因(或转录本)
  • 列是样本
  • 值是比对到该基因的 read 条数

counts 数据有个显著特点:离散度高。同一个基因在生物学重复之间,方差往往远大于均值。我在项目中遇到好几次,新手用 TMM 归一化后直接套泊松分布,结果 p‑value 小的吓人——其实全是假阳。为什么?因为真实数据的过离散(over‑dispersion)让泊松分布根本兜不住。

我在处理小鼠肝脏样本时验证过:若强行用纯泊松模型,两万多个基因里有三千多个 p < 0.05,但换成负二项模型后只剩四百多个——这才是合理的。

1.2 edgeR 的核心思想:负二项 + 经验贝叶斯 + 广义线性模型

edgeR 是我的主力工具之一,它的核心可以拆成三步:

  1. 负二项分布建模:每个基因的 counts 用一个均值-方差关系来描述。方差 = 均值 + 均值² × 离散度。这个离散度参数就是过离散的关键。
  2. 经验贝叶斯收缩:单个基因的信息不够可靠,edgeR 会借整个基因组的信息来“缩小”离散度估计——尤其是低表达基因。我在一次单细胞数据批处理里就靠这个避免了大量假阳。
  3. 广义线性模型(GLM):把实验设计(分组、批次)映射到模型中,灵活处理多因素设计。比如你有处理、时间、批次三个变量,GLM 一句公式就能应对。

小技巧:edgeR 的 estimateDisp 函数里有个 robust 参数,设为 TRUE 可以降低个别极端基因对离散度估计的干扰。我一般默认开启。

下面是一段最基础的 edgeR 操作流程,你感受一下:

library(edgeR)

# 构造 DGEList 对象
dge <- DGEList(counts = count_matrix, group = group_factor)

# 过滤低表达基因
keep <- filterByExpr(dge)
dge <- dge[keep, , keep.lib.sizes = FALSE]

# TMM 归一化
dge <- calcNormFactors(dge)

# 估计离散度(经验贝叶斯)
dge <- estimateDisp(dge, design = design)

# GLM 拟合
fit <- glmQLFit(dge, design)

# 差异检验
qlf <- glmQLFTest(fit, coef = 2)
topTags(qlf)

你想想看,就这么几行代码,背后已经完成了负二项建模、贝叶斯收缩、GLM 系数推断——edgeR 帮我们封装得很漂亮。

1.3 edgeR、DESeq2、limma 怎么选?我从项目角度给你排个序

市场上做差分的工具很多,但最常用的就这仨。我根据实际踩过的坑整理了一张对比表:

维度 edgeR DESeq2 limma + voom
基础模型 负二项 + 经验贝叶斯 负二项 + 经验贝叶斯(含先验) voom 变换后 + 正态线性模型
归一化方法 TMM RLE (相对对数表达) voom 自带权重
离散度估计 全局趋势 + tagwise 收缩 先验 + 收缩(更保守) voom 把均值-方差关系转为权重
多因素/复杂设计 GLM 灵活,批次处理很方便 GLM 也支持,但速度偏慢 线性模型,叠加批次需手动
速度 较快 中等(大矩阵尤其慢) 最快
小样本(n < 3) 谨慎使用,需设 BCV 先验 内置收缩,相对稳健 不推荐
我的推荐场景 有明确批次、多分组、需要快速跑 样本少、偏好保守结果 已 logCPM 表达量、后期做富集

曾经踩的坑:我有一次为了图快,用 limma+voom 处理了有 8 个批次的人类肿瘤数据——结果检出的差异基因列表里,有一半都是批次相关基因。后来换成 edgeR 的 GLM 加上批次因子,假阳才压下来。所以如果你的实验有明确批次效应,edgeR 的 GLM 是你的首选。

1.4 三种方法的核心逻辑对比例图

下面这张 SVG 图总结了 edgeR、DESeq2、limma 从原始 counts 到差异基因的完整路径——我根据自己画过的流程图重新整理了一份,希望能帮你建立直观理解:

三种差异分析方法核心流程对比 RNA-seq count 矩阵 edgeR TMM 归一化 负二项 + 经验贝叶斯离散度 GLM 拟合(含批次因子) DESeq2 RLE 归一化 负二项 + 先验收缩离散度 Wald 检验 / LRT limma + voom voom 变换(均值-方差权重) 线性模型拟合 经验贝叶斯(方差收缩) 差异表达统计量(logFC, p-value, FDR) 差异基因列表 → 功能注释 / 验证 🟦 起点:counts 数据 🟥🟩🟪 三种分析路径 🟧 最终产出:差异基因

1.5 小结:本章你到底该带走什么

  • edgeR 的核心武器:负二项模型 + 经验贝叶斯收缩 + GLM,特别适合含批次的多因素设计。
  • 什么时候用它:手头有 counts 矩阵,实验条件超过 2 个,或者带有明确批次效应(比如不同测序批次、不同操作员)。
  • 和另两个工具的取舍:limma 最快但对付批次吃力,DESeq2 保守但慢,edgeR 在速度和稳健性之间取了一个不错的折中。

我个人习惯是:批量分析先跑 edgeR,然后再用 DESeq2 验证关键结果——两者检出的重叠基因通常最可靠。