差异表达分析基础

说实话,很多人一上来就想着怎么画火山图,结果图出来了自己都看不懂。这不怪你,因为差异表达分析是整个火山图的根基。今天我就把这几个核心概念掰开了讲清楚,都是我自己这些年做项目时反复用到的东西。

什么是差异表达

差异表达,说白了就是找不同。两组样本里,同一个基因的表达量到底有没有显著变化?这个问题听起来简单,但做起来有不少坑。

我举个例子。你用测序测了一组用药前后的细胞,发现基因A在用药前表达量是100,用药后变成50。那这是不是就算差异表达了?不一定。因为这可能是随机波动。所以我们需要统计方法来帮我们判断——差异表达到底是真的,还是只是偶然。

差异表达分析的结果通常是一个列表,里面包含所有被测基因的信息。每行代表一个基因,一般会包含下面几列:

列名 含义 作用
gene_name 基因名或ID 标识哪个基因
baseMean 标准化后的平均表达量 反映基因整体的表达水平
log2FoldChange 表达变化的对数倍数 判断上调还是下调
pvalue 原始p值 统计显著性的初步判断
padj 校正后的p值 多重检验校正后的显著性

这里的padj就是我们常说的「校正p值」。我一开始做分析时用的都是原始p值,结果发现假阳性高得吓人。后来才明白,做几千个基因的检验,不用多重校正就是在给自己的结果挖坑。

p值——统计意义上有多可信

p值的概念,我从实际应用的角度来讲。p值是在「零假设为真」的前提下,观察到当前结果或更极端结果的概率。在差异表达里,零假设就是这个基因在两个组里没有差异。

p值越小,说明如果基因真没差异,那么出现这么大差异的可能性就越小。所以p值小,我们就有理由怀疑「没差异」这个假设,认为它确实有差异。

举个例子。p = 0.01,意思是假如这个基因实际上没差异,那么你观测到这种差异水平的概率只有1%。嗯,这个概率很低,所以我们倾向于认为它真的有差异。

但你想想看,一次检测一个基因,p值设0.05可以接受。可我们要测两万个基因,哪怕里面一万个都是没差异的,也至少有500个会纯属偶然地出现p < 0.05。这就是为什么我们必须做多重检验校正。

关键点:差异表达分析中,别再只看原始p值了。用校正后的padj(比如BH法校正)才是规范做法。我见过太多人只看p < 0.05,结果在文章中画出一堆假阳性基因,审稿人一问就露馅。

log2FoldChange——变化幅度有多大

这个指标很多人会算错,包括我以前也犯过糊涂。Fold Change是倍数变化,即处理组表达量除以对照组表达量。但为什么取log2?因为这样对称好看——上调2倍是log2FC = 1,下调2倍是log2FC = -1,直观吧?

如果直接看倍数,上调2倍是2,下调2倍是0.5。数值范围不对称,做图也难看。取log2之后就对称了,这正是火山图横轴喜欢用log2FC的原因。

计算方式其实很简单。假设处理组表达量是A,对照组是B:

FoldChange = A / B
log2FoldChange = log2(A / B)

有些工具会加一个小的伪计数,防止分母为零。比如DESeq2内部就会做这个处理,你不用自己操心。

阈值怎么定?我个人习惯是|log2FC| ≥ 1,也就是变化至少两倍。当然,如果你的数据信噪比很高,也可以适当放宽到|log2FC| ≥ 0.58,相当于1.5倍。这个没有标准答案,取决于你的实验目的。

一个实用技巧:我在处理低表达基因时,会先过滤掉baseMean < 10的基因。因为这些基因的表达量太低,算出来的log2FC往往不稳定,容易产生虚假的大倍数变化。去掉后再分析,结果会靠谱很多。

显著性阈值的选择

阈值选不对,分析就白做。我这里给出一个我常用的组合方案,也是现在主流文章的标准做法:

  • padj < 0.05 作为显著性门槛
  • |log2FC| ≥ 1 作为变化幅度门槛
  • 同时满足以上两个条件,才标记为差异表达基因

当然,有时候我会根据实际情况调整。比如做筛选实验时,可以先放宽到padj < 0.1,再结合其他验证手段确认。但正式发表的话,还是按标准来比较稳妥。

我记得有一次帮同事做分析,他非要用p < 0.001作为显著门槛。结果跑出来只有十几个差异基因,根本做不了富集分析。后来我帮他换回padj < 0.05,差异基因变成两百多个,富集分析结果一下就出来了,他也顺利发了文章。

这个经历让我意识到,阈值不是越严越好。要结合你后续分析的需求来权衡。差异表达分析的目的是找到足够多的候选基因去做后续的生物学解释,而不是把大部分基因都筛掉。

避坑提醒:千万不要只用一个p值或者只用一个FC来筛选。二者必须联合使用。我曾经见过有人只凭log2FC > 2就选了一堆基因,结果p值全都在0.5以上——那些基因基本上就是测序噪音,完全没有重复性。

核心逻辑图:差异表达分析的流程

下面这张图我把差异表达分析的核心逻辑画出来了。从原始数据开始,经过统计检验,到筛选有意义的差异基因,再到后续的可视化。你看完应该能明白整个流程是怎么串起来的。

差异表达分析核心逻辑 基因表达定量数据 差异表达统计检验 输出指标 p值(统计显著性) + log2FC(表达变化幅度) 阈值联合筛选:padj < 0.05 + |log2FC| ≥ 1 差异表达基因列表 输入 reads count / FPKM 两组或多组样本 输出用途 火山图可视化 富集分析输入

这张图我反复改了好几个版本,把最关键的环节都放上去了。你可以看到,整个流程走下来,最后得到的就是差异基因列表,而火山图就是把列表里的padj和log2FC画成一张图,让人一眼就能看出哪些基因显著上调、下调。

做分析的时候,我建议你在心里过一遍这张图。每个步骤想清楚,数据处理就不会出错。尤其是阈值筛选这一步,很多时候直接决定了你能不能做出靠谱的结果。