本文关键词:GEO数据库做gsea功能富集
真的服了,每次看到网上那些“五分钟教你跑通GSEA”的教程,我都想扔键盘。那种把复杂的东西说得像喝水一样的文风,害我前期在Rstudio里头撞包了整整三天。今天不整虚的,直接把我自己从报错信息里爬出来的GEO数据库做gsea功能富集 经验甩给你。特别是那些用Limma或者edgeR做差异分析后,直接拿top genes去跑GSEA结果全是乱码或者P值爆炸的朋友,往下看。
第一步:别急着跑函数,先看你手里的数据长啥样
很多新手最大的误区就是拿到基因列表直接扔进clusterProfiler。你那些rank_list排序逻辑对吗?GSEA最核心的是排序列表,不是差异显著性列表。我是建议直接用log2FC绝对值乘以 -log10(p.adjust) 来排序,还是直接用log2FC?我试了几轮,发现如果你的差异倍数不大但P值显著的情况多,直接用log2FC排序,GSEA往往能找出那些被limma漏掉的“隐形富集通路”。这点很关键,GEO数据库做gsea功能富集 的精髓就在这排序权重里,别死记硬背教程。
第二步:参考集别乱用,MSigDB版本要锁死
我去下载c5.cp.kegg.gmt文件的时候,手抖下了个旧的B版,结果跑出来的通路全是些十年前的老黄历,跟现在的文献对不上。后来才搞清楚,GMT文件里的通路定义是会更新的。我现在的习惯是,固定用最新的MSigDB v2024_1,并且在脚本里写死这个版本号。别跟我说“差不多就行”,生物信息这东西,差不多就是差很多。另外,如果你用的是小鼠数据,记得把物种前缀改对,不然GSEA会报“gene not found in reference set”,这个错我也栽过跟头,排查了半天才发现是小鼠基因符号没转成小鼠专用ID。
第三步:参数设置里的深水区
nperm=1000是默认值?错。我一般设nperm=1000,但如果你的样本量小于20,我建议加大到5000甚至10000,不然P值不稳定,今天跑是显著,明天跑就不显著了,这种灵异事件我亲眼见过。还有个坑,ESUmin和ESUmax,这两个参数默认是0.25,但我发现对于肿瘤异质性大的样本,把ESUmin调到0.05,能挖出很多低表达但协同变化明显的通路。当然,代价是计算时间会变长,R核数设满,喝杯咖啡等着就行。
第四步:结果解读别只看Nominal p
我看到好多论文,图很漂亮,但全是Nominal p < 0.05,FDR居然全大于0.25。这种结果发出来会被同行diss的。GEO数据库做gsea功能富集 的结果里,FDR.Q才是硬道理。如果FDR.Q > 0.05,那就换个基因排序方式,或者检查下样本有没有污染。我后来发现,有时候FDR压不下去,是因为batch effect没去干净。记得先跑limma的sva或者ComBat去批次效应,再去跑GSEA,不然你的富集结果可能都是技术噪音。
最后啰嗦一句,GSEA是个黑盒工具,你得懂它背后的超几何分布原理,不然参数乱调就是玄学。我踩过最大的坑就是把相关性基因和差异基因搞混了,GSEA喜欢差异基因,不喜欢高相关基因。希望这篇能帮你省掉我那三天三夜的调试时间。如果还有报错,把log甩出来,咱们一个个debug。