
你可能遇到过这种“怪事”:
- 同一份基因列表,别的工具能跑出一堆显著通路,clusterProfiler 却结果很少,甚至没有。
- 同一条通路,别的工具给出的 p 值小很多,看起来“更显著”。
这两件事,其实是一回事:很多时候,不是 clusterProfiler “不灵”,而是它把容易踩坑的细节都算进去了,所以 p 值更保守、结果更克制。经过多年不懈努力地说,大家慢慢形成了共识:富集分析要避坑,clusterProfiler 值得优先考虑。
我的❤️充满惆怅,只为今天的村庄还唱着过去的歌谣
富集分析离不开基因功能注释库。Nature Methods 的文章提到:有超过 42% 的软件,注释库几年都不更新。你拿着今天的数据,却用几年前的注释去解释它,就像“带着现在的问题,穿越回过去找答案”。就连SCIENCE文章都会被吐槽,这件事大家已经开始重视。
臣妾要告发
熹贵妃私通结果不显著,秽乱后宫定是分析有误,罪不容诛!
但还有一个更容易“把人哄开心”、却更危险的坑:背景偏差。
注释库老旧之所以容易被注意,是因为它会让显著结果变少;而背景偏差之所以容易被忽略,是因为它往往让显著结果变多、p 值变得更小,看起来更漂亮。
有时我们不是不关心真相,而是默认了一个心态:只要 p 值小,里面有我想看到的通路,就算“过关”。更糟的是,有些工具甚至不允许你指定背景基因,或者背景来源含糊不清。结果就像早期搜索引擎那样:搜不到也得给点东西,让用户觉得“这工具真行”。
你可能也听过“背景很重要”,但现实里,很多人并不会把背景当回事:反正结果能显著就行。问题是:背景一旦选错,显著不一定代表真相,更可能代表“统计游戏玩对了”。
先把概念说清楚:
- GSEA 通常不需要你显式指定背景基因集合。
- ORA(过表达富集)本质上是一个无放回抽样的统计过程,背景非常重要:你根本检测不到/定量不到的基因,就不可能在抽样里被抽中,也就不应该出现在背景里。
背景问题并不新。我读研时做 microarray 分析就知道它的重要性,只是很多年里一直没被足够重视。这篇文章也不是为了重复“背景要对”这个老话,而是想强调一个更隐蔽、但影响很大的细节:
在 clusterProfiler 的 ORA 里,我会把没有注释的基因扔掉。
原因是:在 ORA 里,我们把基因分成“属于该通路 / 不属于该通路”。可没有注释的基因其实是未知。如果你不把它们扔掉,它们常常会被默认归到“不属于”,这会引入另一层偏差,让 p 值更容易变小。
据我所知,只有 clusterProfiler 坚持这么做,也因此经常被质疑:“别人都没这么搞。”这篇文章就是在讲清楚:我为什么这么做,以及你为什么最好也这么做。
另一个常见误区是:直接拿全基因组当背景。
这个想法在 microarray 时代就存在,但今天它带来的偏差反而更容易被放大:非编码基因越来越多,而这些基因通常缺乏功能注释;同时,在转录组/蛋白组实验里,它们又往往不可能被鉴定或定量。很多工具如果把“所有基因 ID”都塞进背景里,背景里就会混入大量“理论上存在、实际不可能抽到”的基因,p 值就更容易被压得很小很小。
而 clusterProfiler 做“背景基因 ∩ 注释库”的交集处理,并把没有注释的扔掉,恰好会滤掉一大批缺乏注释的基因(其中相当一部分是非编码基因)。所以即使你懒到用全基因组当背景,结果也不至于偏得太离谱;而当你认真指定了更合理的背景时,这个处理会让 p 值更可靠、更保守。

所以这篇文章想强调的核心只有一句话:
背景基因要和注释库取交集,这是 clusterProfiler 的做法,你最好也这么做。
-
使用全基因组做背景,用这一招,让懒人不犯大错,这一操作影响是比较大的。
-
当我们有意识地去指定一个正确的背景,用这一招,让 p 值更准确保守一点,影响比较小。
如果你只想带走一个“能立刻用起来”的操作建议:
- 做 ORA 时,背景尽量用“实验里有机会被检测/定量到的基因集合”,别图省事直接上全基因组。
- 无论背景怎么选,都把背景和注释库取交集,再做富集;把没有注释的基因当作“未知”,不要硬塞进“不属于”。
- 报告里写清楚你用的注释库版本和背景定义,这比多几个显著通路更有说服力。
作为一篇 Editorial,我也想呼吁期刊、审稿人、工具开发者和研究者:把背景偏差当成必须认真对待的问题。富集分析的价值是帮助我们接近机制,而不是帮助我们把 p 值“做得更好看”。