做生物信息这行,尤其是搞甲基化分析的,最头疼的不是跑代码,而是找对那个该死的注释文件。我入行八年,见过太多刚毕业的硕士博士,拿着TMM或者DESeq2跑出来的差异甲基化位点(DMR),对着那堆hg19或者hg38的坐标发呆。为啥?因为注释文件没搞对,或者版本没对齐。今天不整那些虚头巴脑的理论,就聊聊怎么在geo里扒拉出靠谱的甲基化注释文件,以及怎么避免踩雷。
先说个真事儿。去年有个学生找我救火,说他的WGBS数据怎么注释都是“intergenic”,连个基因名都标不上。我一看,好家伙,他用的注释文件是2015年的,而他的数据是最近两年测的。虽然都是hg19,但基因组组装版本微调后,坐标偏移了,注释自然全乱套。这就是典型的“版本强迫症”没治好。所以,第一点铁律:必须确认你的测序数据参考基因组版本。如果是Illumina 450K芯片,现在主流还是用Illumina提供的Annotate package,或者从Bioconductor下载最新的IlluminaHumanMethylation450kanno.ilmn12.hg19。别去网上随便下个txt文件就完事,那里面可能连probe ID都对应错了。
再说说27K和450K的区别。很多老项目还在用27K的数据,这时候千万别直接套450K的注释。虽然大部分probe是重叠的,但450K多了不少CpG岛周边和增强子区域的位点。如果你强行用450K的注释去解释27K的数据,那些新增加的位点你没法处理,而旧的位点虽然能对上,但可能因为探针设计的细微差别(比如SNP位点干扰),导致结果偏差。我有个客户,就是混用了注释,最后发现几个关键启动子区域的甲基化水平异常高,后来排查才发现是探针跟SNP重叠了,被注释文件里的默认过滤规则给漏掉了,或者反之,没过滤掉。
这里有个细节很多人容易忽略:CpG位点的类型。在注释文件里,你会看到CpG Island, Shore, Shelf, Open Sea这些分类。做差异分析时,如果你只盯着CpG Island看,可能会漏掉很多重要的调控信息。现在的研究趋势是看全基因组,特别是Shore和Shelf区域,往往藏着更精细的调控机制。我在处理一个肺癌样本的时候,就发现几个关键的抑癌基因启动子附近的Shelf区域甲基化变化比Island本身更显著。所以,拿到注释文件后,别急着过滤,先看看分布情况。
还有,关于数据库的更新。很多人喜欢用UCSC的Table Browser去下载,觉得这样最权威。其实对于芯片数据,Illumina官方维护的注释更贴合探针设计。如果是WGBS测序数据,那就得看Gencode或者Ensembl的版本了。这里有个小坑:Gencode v19和v21的基因ID格式不一样,一个是ENSG...,一个是ENST...,搞混了会导致后续关联表达量数据时全部匹配失败。我上次就因为这个,花了两天时间重新写脚本清洗ID,简直想砸键盘。
最后,给大家提个醒,别迷信“最新”就是“最好”。有时候,稳定的旧版本反而更靠谱,因为社区验证多,bug少。比如hg19虽然老了,但配套的注释资源极其丰富,很多现成的分析流程都是基于这个做的。除非你的数据是最新的PacBio或Nanopore长读长测序,否则别轻易换hg38,除非你准备好重写所有的比对和注释流程。
总之,搞geo甲基化注释文件,核心就两个字:对齐。数据版本、基因组版本、注释版本,三者必须严丝合缝。别嫌麻烦,前期多花一小时核对,后期能省三天改bug。希望这些踩坑经验能帮大家在分析路上少掉点头发。毕竟,头发比代码值钱多了。