很多人一上来就纠结算法用LIMMA还是edgeR,其实搞geo数据库基因表达分析时,80%的失败是因为数据本身就不干净。今天分享我去年带实习生踩坑后总结的实操流程,能帮你避开绝大多数数据陷阱。上周刚用这套流程帮一个课题组跑完了肝癌亚型的相关工作,省了至少一周的调参时间。
第一步千万别急着下原始数据。我遇到过不少新手直接去NCBI搜个ID就下载,结果回来发现GEO的GPL平台描述不全或者芯片批次太多。正确做法是先登录GEO,找到感兴趣的系列(比如GSE76427肝癌系列),仔细检查Sample的phenodata字段。我通常会在Excel里手动把Patient ID、分期(TNM)、生存状态先列出来。记住,如果样本量低于60例,或者混杂因素比如性别比例严重失衡(比如8:1),建议直接换个数据集,后期多复杂的回归都救不回来。去年有个同事非要用一个只有35例的早期数据集,最后因为统计效力不足被审稿人拒了,这就是典型的因小失大。
第二步是数据清洗,这是最脏活累活但也最关键的一步。不要相信GEO自带的预处理好的RMA值,尤其是对于RNA-seq数据或者老芯片。我习惯先用limma包里的normalize函数做标准化,但更重要的是剔除坏批次。这里有个真实案例,某篇高分文献里有个批次效应严重到两组病人完全混在一起,后来作者补发勘误表承认了错误。你怎么检测?画PCA图是最直观的。如果同一个临床表型(比如正常组织)的点在PCA图上散落在不同区域,那说明有技术偏差。这时候可以用svaseq或者limma::removeBatchEffect去掉批次效应。注意,去批次效应会牺牲部分生物信号,所以一定要在去掉前后对比一下PC1和PC2的解释方差,确保生物学变异保留下来。我一般建议保留前10%的主成分即可。
第三步才是差异表达分析(DEA)。对于microarray数据,limMA依然是标杆,设置modulated=TRUE,fdr阈值设0.05比较稳妥。如果是RNA-seq,DESeq2是目前主流,注意要设置prior.count=TRUE来提高稳定性。这里有个很多人忽略的细节:不要只看Fold Change(FC)大于2或小于0.5,一定要结合p-value。我经常看到学生只筛FC>3的基因,结果漏掉了那些变化不大但高度显著的枢纽基因。建议用火山图筛选出top 50个显著差异基因,然后去DAVID或Metascape做GO/KEGG富集。如果富集结果全是“氧化磷酸化”或者“翻译过程”这种太宽泛的通途,多半是细胞组成偏差没去干净,回去查第二步。
最后一点忠告,关于发表数据。现在期刊越来越看重可重复性,务必在Methods部分注明你使用的GEO accession number、软件版本号(比如R 4.3.0, limma 3.54.3)、具体的筛选阈值。别偷懒只写“使用公开数据库”,那样审稿人一定会让你补充信息。我最近看到一个被拒稿的案例,就因为没写清楚是用探针均值还是最大探针值来处理多对一的基因,被反复问询三次。
这套流程看似老套,但每一步都对应着真实的报错和驳回理由。geo数据库基因表达数据挖掘不是拼谁用的软件新,而是拼谁对数据的质量把控更严。希望这篇能帮你少走弯路,毕竟在这个数据爆炸的时代,干净的数据比炫酷的模型值钱多了。