做生物信息这行十三年了,我见过太多人拿着GEO里的甲基化芯片数据(比如450K或者EPIC)在那儿傻乐,以为下载下来跑个R脚本就能发高分文章。醒醒吧!现实是,90%的人死在了数据预处理这一步。今天我不讲那些高大上的算法原理,就聊聊怎么从这些“垃圾”里淘出真金,顺便吐槽一下那些坑人的细节。
先说个真事儿。上周有个研究生找我救火,说他跑出来的差异甲基化位点(DMRs)少得可怜,P值全不显著。我一看他的原始数据,好家伙,Batch效应(批次效应)重得像泼了墨一样。他居然直接用raw数据里的IDAT文件去normalize,连探针过滤都没做干净。这种低级错误,在GEO数据库甲基化分析里太常见了。很多人以为GEO就是个大仓库,下载就能用,其实那是个杂乱的集市。
咱们得承认,GEO数据库甲基化数据的质量参差不齐。有些样本的Detection P-value > 0.01的探针比例高达20%,这意味着什么?意味着近五分之一的数据是噪音!如果你不把这些噪音剔除,后续的差异分析就是空中楼阁。我通常建议,先检查每个样本的缺失值比例,超过5%的样本直接扔掉,别心疼,留着也是祸害。
再说说探针类型的问题。450K芯片里有很多探针会同时结合到多个基因组位置,这些多映射探针(multi-mapping probes)必须剔除。还有那些含有SNP(单核苷酸多态性)的探针,如果SNP位点正好在CpG位点上,甲基化信号就会失真。这一步如果不做,你的结果可能反映的不是甲基化差异,而是基因型的差异。这点很多新手容易忽略,导致结论完全跑偏。
对比一下,如果你用的是WGBS(全基因组重亚硫酸盐测序)数据,那预处理相对简单,主要关注比对率和覆盖度。但GEO上大部分还是芯片数据,芯片数据的痛点在于探针设计的局限性。比如,有些启动子区域的CpG岛并没有被探针覆盖,或者覆盖密度不够。这时候,如果你强行做GO富集分析,可能会得到一堆看似合理但实际无意义的通路。
我个人的经验是,不要盲目追求差异位点的数量。有时候,只有几十个关键位点的变化,比几千个微弱变化的位点更有生物学意义。关键在于这些位点是否位于功能区域,比如增强子、启动子或者基因体内部。你可以结合已有的ChIP-seq数据或者ATAC-seq数据来看,看看这些甲基化变化是否伴随着染色质开放性的改变。这种多组学整合分析,比单看甲基化数据要有说服力得多。
另外,关于标准化方法的选择。Noob、SWAN、BMIQ、Functional Normalization,这些方法各有优劣。对于临床样本,尤其是那些DNA质量不太好的样本,我推荐用Functional Normalization,它对批次效应的校正效果比较好。但如果你发现校正后,生物学变异也被抹平了,那就要小心了,可能需要调整参数或者换用其他方法。
最后,别指望工具能自动帮你解决所有问题。GEO数据库甲基化分析的核心在于“人”。你要懂数据背后的生物学故事,要会看质控图,要能判断哪些异常是技术噪音,哪些是真实的生物学现象。别做数据的奴隶,要做数据的侦探。
记住,数据清洗花的时间应该占整个项目的50%以上。别嫌麻烦,这一步做好了,后面的分析就是顺水推舟。要是这一步偷懒,后面就算跑出显著结果,审稿人也会把你怼得怀疑人生。所以,沉下心来,把那些探针过滤、批次校正、缺失值处理做扎实,这才是硬道理。别总想着走捷径,捷径往往是最远的路。希望这些大实话能帮你少走点弯路,早点出结果。