富集显著性检验在线计算(超几何分布 / Fisher 精确检验)
做完差异表达,拿到一串基因,接下来总要问一句:这串基因里富集了某条通路, 是真的,还是随机就能碰上?
回答这个问题用的是超几何分布。设:
N = 背景基因总数
K = 背景里属于该通路的基因数
n = 你的基因列表长度
k = 列表里落在该通路里的基因数(重叠)
随机抽 n 个基因,恰好抽中 i 个通路基因的概率是
P(X = i) = C(K, i) × C(N−K, n−i) / C(N, n)
p 值是「至少这么多」的概率,也就是把 i 从 k 加到头:P(X ≥ k)。
期望重叠是 n × K / N,富集倍数是实际重叠除以期望重叠。
富集倍数告诉你效应有多大,p 值只告诉你它有多不像随机——两个都要看。
单尾 Fisher 精确检验(alternative = greater)算出来和超几何 p 值完全相同, 它们是同一个分布的两种说法。工具把两者一起给出,方便你和论文里的写法对上。
背景基因数选错,是这里最常见的错误
N 不是”人类全部基因约两万个”,而是你这次实验实际检测到、且有通路注释的基因数。
- 用了只覆盖 1.2 万个基因的芯片,
N就该是 1.2 万,不是 2 万; - RNA-seq 里做过低表达过滤,
N是过滤后剩下的基因数; - 通路数据库没注释到的基因,严格说也不该计入。
把 N 填大会系统性地高估显著性——分母越大,随机撞上的概率越低,p 值就越漂亮。
这是富集分析里最容易被审稿人抓住的地方。
还有两件事
一条通路算完不算完。 你通常一次检验几百上千条通路,必须做多重检验校正。 本站的多重检验校正工具可以把一列 p 值批量转成 BH 校正后的 q 值。
重叠数太小时 p 值不稳。 重叠只有 1–2 个基因时,多一个少一个都会让 p 值差出一个数量级。 这种结果不要单独拿出来讲。
常见问题
背景基因数 N 该填多少?
填本次实验实际检测到、且在通路数据库里有注释的基因数。用 1.2 万基因的芯片就填 1.2 万,RNA-seq 做过低表达过滤就填过滤后的数量。填成「人类约两万个基因」会系统性高估显著性。
超几何检验和 Fisher 精确检验有什么区别?
单尾情况下没有区别,算出来是同一个数——它们是同一个分布的两种表述。双尾 Fisher 会把另一侧也算进去,用于检验「重叠异常多或异常少」。
p 值很小就说明这条通路重要吗?
不一定。p 值只说明不像随机,富集倍数才说明效应大小。背景基因多时,一个 1.2 倍的富集也可能给出很小的 p 值。两个数要一起看。
为什么我算的和 DAVID / clusterProfiler 不一样?
多半是背景不同。这些工具默认用数据库全集作背景,而你的实验只测了其中一部分。另外它们默认输出的是校正后的 q 值,不是原始 p 值。