做生信分析,GEO数据库几乎是绕不开的大山。很多刚入行的兄弟,一上来就对着密密麻麻的矩阵发呆,或者下载完数据发现根本没法用。今天我不讲虚的,直接聊聊我在项目里踩过的坑,以及怎么高效搞定公共数据库geo里的数据。
先说个真实案例。上个月有个做肿瘤免疫的朋友,想复现一篇高分文章的结果。他直接从GEO官网下载了Series Matrix文件,用R语言读进去,发现样本量对不上。折腾了两天,最后发现是平台注释文件没更新,探针映射错了基因。这种低级错误,其实完全可以避免。
公共数据库geo的数据质量参差不齐,有的平台甚至十年没更新过注释。所以,第一步,别急着下载。先看元数据。
很多新手忽略了一个关键点:平台信息。在GEO官网搜到GSE编号后,一定要点进Platform那一栏。看看这个芯片是Affymetrix的还是Illumina的,版本是多少。比如,如果是老版的HG-U133 Plus 2.0芯片,现在的注释库可能已经变了。这时候,你得去NCBI或者ArrayExpress找找最新的注释文件,或者用Bioconductor里的包去映射。
第二步,数据清洗比分析更重要。
下载下来的Series Matrix文件,里面往往混着很多非目标样本,或者重复测定的样本。我通常的做法是,先写个简单的脚本,把样本类型过滤一遍。只保留你需要的组别,比如肿瘤vs正常。别偷懒,手动检查一遍样本名称和分组标签是否对应。我之前就遇到过,标签写的是Control,实际数据却是处理组,这种错误一旦带入分析,结果直接废掉。
第三步,标准化和批次效应处理。
这是最容易被忽视,也最影响结果的部分。公共数据库geo里的数据,很多是不同时间、不同实验室做的。批次效应(Batch Effect)简直是无孔不入。如果你直接拿原始数据做差异分析,很可能发现差异基因全是技术噪音。
建议用limma包进行标准化。如果是芯片数据,先用RMA或者GCRMA算法处理原始CEL文件,得到表达矩阵。如果是RNA-seq数据,注意看作者是否提供了count数据,如果没有,可能需要自己从fastq文件重新比对,但这太耗时,通常建议用作者提供的标准化后的表达值。处理批次效应时,可以用ComBat函数,但要注意,只有在样本量足够大,且批次信息明确的情况下才用。否则,可能会把生物学差异也给抹平了。
第四步,差异分析与功能富集。
这一步大家比较熟,但我得提醒一点,P值的校正。很多人只看P<0.05,却忽略了FDR(False Discovery Rate)。在成千上万个基因里,假阳性率很高。务必使用BH方法校正P值,保留FDR<0.05的基因。另外,不要只看差异倍数(Fold Change),结合两者筛选,结果更靠谱。
我有个学生,之前做差异分析,只看了P值,选了一堆基因。后来做qPCR验证,成功率不到30%。后来我让他加上Fold Change>2的条件,验证成功率提到了80%以上。这就是细节决定成败。
最后,关于数据下载的工具。
虽然GEO官网有下载按钮,但速度极慢,还容易断连。我推荐用GEO2R在线工具做初步探索,或者用Python的pyGEO库,或者R的GEOquery包。GEOquery是最稳定的,但要注意设置代理,不然经常超时。
总结一下,玩转公共数据库geo,核心在于“细”和“慎”。细在元数据的核对,慎在批次效应的处理。别指望一键出图,每一步都要经得起推敲。
记住,数据不会撒谎,但解读数据的人会。保持敬畏,保持严谨,你的分析结果才能经得起时间的考验。希望这些经验能帮你少走弯路,早日发文章。