最近帮一个读研的师弟做转录组数据,他对着电脑屏幕直挠头,气呼呼地跟我说:“学长,我从GEO下载的GPL文件怎么全是这种看不懂的探针ID?哪里去找GeneID啊?我都卡在这一步两天了。”我看了一眼他的文件,典型的Spike-in或者某种特定平台的GPL表格,那一列Column确实只有Affy ID或者Entrez Gene的别名,根本没有直接的GeneID列。这种geo下载的gpl文件没有geneid的情况,其实在生信入门阶段简直太常见了,根本不是什么BUG,而是数据处理的“常态”。
很多刚接触RNA-seq或者Microarray的朋友,习惯了在GEO网页上看到的漂亮表格,点一下下载,以为拿到的就是个完美的、可以直接跑DESeq2或edgeR的矩阵。现实狠狠打脸:GEO是个存档库,不是一个清洗好的分析中心。同一个物种,不同的芯片平台(比如HG-U133 Plus 2.0和HG-U133A),它们的探针定义、注释来源、甚至基因命名规则都可能完全不同。有时候注释源用了UCSC,有时候用的是Ensembl,导致你看到的ID格式五花八门。这就是为什么你会遇到geo下载的gpl文件没有geneid这种尴尬局面。
拿我之前经手的HG-U1133平台数据举例,那个GPL表格确实稀碎。你要手动把那个探针ID映射到GeneID,中间可能要过三四道坎。我当时的解决办法很笨拙但有效,就是拿AnnData和BiomaRt这两个工具反复横跳。先是用annoteAffy包把Affy ID转换成ENTREZ ID,结果发现有一部分探针因为芯片太老,数据库里已经废弃或者没收录了,直接报了错。这时候别慌,去查一下这个探针对应的RefSeq或者Uniprot,再回头找GeneID。这过程就像在迷宫里找出口,急不来。
还有个坑,就是注释版本对不上。GEO上传数据时用的注释版本,和你现在用的biomart数据库版本可能差了三年五年。你发现有些基因名字变了,ID也没变,但语义完全不同。我见过一次惨案,有人直接用旧版本的注释去匹配新数据,最后分析出来的差异基因里混入了一堆假阳性,因为那个GeneID在两版注释里指向了完全不同的转录本变体。这种错误比geo下载的gpl文件没有geneid更致命,因为它让你以为自己分析完了,其实从第一步就歪了。
怎么破?我建议分三步走。第一步,确认你的GPL文件里到底有什么。打开表头,看看有没有“Entrez Gene ID”、“UniGene”或者“Probe Name”。如果没有GeneID,看看有没有AffyID或Ensembl ID。只要有这些锚点,就能通过数据库映射。第二步,选对数据库工具。对于小鼠大鼠,biomart非常靠谱;对于人,也可以试试R的org.Hs.eg包,它打包得很全。记住,一定要锁住生物版本,比如用GRCh37对应Ensembl 89,不要用最新的去匹配老数据,否则ID对不上。第三步,处理缺失值。映射后总会有一部分探针找不到GeneID,通常是垃圾探针或者重复探针。这部分直接丢弃就行,不用纠结。我一般保留映射成功的探针,如果映射率低于80%,就要考虑是不是平台太老了,数据质量本身就有问题。
我在实际项目中,通常会在代码里写一个检查脚本,统计映射成功率和重复率。如果重复率太高,说明这个平台探针设计有问题,或者你的注释源太粗糙。这时候宁可多花点时间手动核查几个关键基因,也不要盲目跑通整个流程。数据处理的耐心,有时候比代码能力更重要。
最后给个实在的建议。如果你真的被这个问题卡住了,尤其是面对非人源物种或者非常古老的芯片平台,不要死磕自动脚本。去NCBI的GEO Accession页面,翻一翻原始论文,看看作者当年是怎么定义差异基因的。有时候,遵循原作者的定义逻辑,比你自己搞一套最新的注释更稳妥。实在搞不定,带上你的GPL表格片段和具体的物种信息,找同行或者社区求助,这种具体的技术卡点,有时候别人一句话就能点醒你。别怕露怯,大家都这么过来的。】