2. 差异表达分析的基本原理归纳总结

做RNA-seq差异分析,很多人上手就是跑DESeq2或edgeR。但你要是不懂背后的原理,调参就是瞎调。今天我就把这套底层的逻辑掰开揉碎了讲清楚。

2.1 什么是差异表达分析?

说白了,就是比较两组样本里,哪些基因的表达量有统计学意义上的显著变化。比如用药组 vs 对照组,敲除组 vs 野生型,癌症组织 vs 正常组织。

差异分析的核心输入是一个计数矩阵——每一行是基因,每一列是样本,每个格子是对齐到该基因的read数。输出呢,是一张差异基因列表,里面包含了log₂倍变化、p值、校正后p值这些指标。

关键认知:差异分析的输入是整数计数,不是FPKM/RPKM,也不是TPM。我遇到过有人把FPKM直接丢进DESeq2,结果跑出来一堆假阳性。切记——DESeq2和edgeR都只认原始整数计数。

2.2 为什么不能直接比较表达量?

直觉上,一个基因在A样本有1000条read,在B样本有500条read,你可能会觉得它在A里表达更高。但事情没那么简单。

三个因素会干扰这种直接比较:

  1. 测序深度不同: A样本测了4000万条read,B样本只测了2000万条。A的计数天然就大,不归一化根本没法比。
  2. 基因长度差异: 同一个基因在不同样本里长度是一样的,但不同基因之间长度差异很大。长度越长,能比对上去的read就越多。
  3. 文库组成效应: 这个我重点说一下。少数高表达基因如果发生了差异表达,会挤压其他基因的比对空间,造成一种"所有基因都变了"的假象。这是归一化要解决的核心问题。

我的习惯:拿到一个新数据集,我先用plotRLE()或plotPCA()看一眼样本间的整体偏差。如果批次效应或文库组成效应很明显,归一化参数就得格外小心。

所以,差异分析不能直接比原始计数。你得先归一化,再建模,最后做统计检验。

2.3 统计模型的核心:负二项分布

RNA-seq的计数数据有两个特点:

  • 离散性: 计数是整数,不是连续值。
  • 过离散: 方差大于均值。这是生物学重复带来的——同一基因在同组样本里,表达量会有波动。

泊松分布要求方差等于均值,但RNA-seq数据显然不满足。所以DESeq2和edgeR都用了负二项分布(也叫Gamma-Poisson分布)。它在泊松的基础上加了一个散度参数,用来描述方差和均值之间的关系。

数学形式很简单:

Var(Y) = μ + α · μ²

其中μ是均值,α是散度参数。α越大,数据越分散。α=0时退化为泊松分布。

我曾经踩过的坑: 有一次做时间序列差异分析,3个生物学重复,结果散度参数估计出来是负的。后来发现是两个样本的标签搞混了。如果你碰到散度参数为负、或者模型无法收敛,先别急着调参数——回去检查样本注释和比对质量。

2.4 归一化方法

DESeq2和edgeR各自用了不同的归一化策略。下面这个表格可以帮你快速理解差异。

工具 归一化方法 核心思想 适用场景
DESeq2 RLE (Relative Log Expression) 以所有基因为参考,计算每个样本相对于"伪参考样本"的中位比例因子 大多数常规转录组;对文库组成效应较稳健
edgeR TMM (Trimmed Mean of M-values) 剔除两端的M值,用加权平均估计比列因子 文库组成效应较大时表现更稳;适合TMM默认参数
limma/voom CPM / log-CPM + 权重 先转成CPM,再用voom估计均值-方差权重 适用于大样本或多因素实验

实际上,DESeq2的RLE和edgeR的TMM在大部分数据集上结果非常接近。我个人的建议是:如果你不确定选哪个,就用DESeq2的RLE,它在默认参数下的稳定性更好。

2.5 多重假设检验校正

做完差异检验,你拿到了一堆p值。假设你分析了20000个基因,如果直接用p < 0.05筛选,那假阳性就有1000个——这显然不可接受。

为什么?因为每个基因的检验是独立的,20000次检验里,纯随机也会产生约5%的显著性结果。这就是多重比较问题。

常见的校正方法有以下几种:

  1. Bonferroni校正: 把阈值除以基因数。太严格了,在转录组分析中几乎不用。
  2. BH (Benjamini-Hochberg) 校正: 控制FDR(假发现率)。这是差异分析的标配。DESeq2和edgeR默认输出的padj/p值就是BH校正后的结果。
  3. q-value: 基于阳性FDR的方法,比BH更激进一些,但不太常用。

筛选原则: 我一般用 padj < 0.05 和 |log₂FC| > 1 作为初筛条件。padj控制假阳性,log₂FC控制效应大小。两个条件一起用,可以大幅减少报告出去的假阳性。

2.6 差异分析完整流程

把上面讲的内容串起来,完整的差异分析流程就是下面这张图的样子。我建议你把它打印出来贴在工位上。

差异表达分析完整流程 原始计数矩阵 整数read计数 归一化 RLE / TMM 负二项分布拟合 均值-方差建模 统计检验 Wald / LRT 多重检验校正 BH校正 💡 说明: • 原始计数矩阵 → 归一化:消除测序深度和文库组成效应 • 负二项分布拟合:为每个基因估计离散参数 → 统计检验:计算p值和log₂倍变化 → 多重检验校正:控制假发现率 差异表达分析完整流程 DESeq2 / edgeR 统一分析管线 计数 拟合 检验 校正

整个流程看下来,你会发现核心就四步:归一化 → 建模 → 检验 → 校正。DESeq2和edgeR在这四个步骤上都用了类似但不同的策略,这也是下一章我们对比的重点。

一个小技巧: 我在做流程测试时,经常先用DESeq2的estimateSizeFactors()看一眼归一化因子的分布。如果某个样本的因子超过0.5-2的范围,我就会回去检查一下这个样本是不是有问题。这比直接跑完整分析要快很多。

嗯,到这里差异分析的核心原理你应该已经清楚了。归一化解决可比性问题,负二项分布解决过离散问题,BH校正解决多重比较问题。这三件事搞明白,后面的工具对比你就知道该看什么了。