做生物信息学分析的朋友都知道,处理GEO数据是个体力活更是技术活。尤其是搞差异基因筛选那一步,稍不留神数据就跑偏了,后面做通路分析、预后模型全得白搞。今天咱就掏心窝子聊聊,在geo数据库差异基因筛选时到底有哪些细节最容易出幺蛾子,以及怎么把这些坑填平。
很多人一上手就是直接跑limma或者DESeq2,结果跑出来的结果乱七八糟,方差老大的。其实这里头有个最大的误区,就是没搞清数据到底是RNA-seq还是芯片。这两个数据处理逻辑完全是两码事。要是把RNA-seq的计数矩阵直接当芯片数据去做标准化,那简直就是关公战秦琼,结果根本没法看。我见过太多新手因为分不清这点,最后做出来的热图颜色分布特别奇怪,问了半天也没弄明白原因。
先说RNA-seq的。现在的趋势大家都清楚,GEO里头RNA-seq的比例越来越高。处理这类数据,第一步绝对不是直接做差异分析。你得先看原始数据是不是经过比对后的reads count。如果是BAM文件或者FASTQ,你要么自己重新比对,要么找个现成的reads count矩阵。这里有个特别容易忽略的点,就是样本类型(sample type)。有的数据集里,正常对照组和疾病组是混在一起的,甚至有的数据是多个实验批次合在一起的。在geo数据库差异基因筛选时,如果你不做批次效应校正,直接分组比较,那你的差异基因里有一半可能都是批次带来的噪音。
我自己常用的方法是先做PCA主成分分析。跑完Limma的voom转换之前,先看个PCA。如果同组的样本在图里聚成一堆,那还行;要是散得跟撒芝麻似的,那必须上ComBat或者sva去校正批次效应。这一步省了,后面的结果可信度就得打个大大的折扣。至于阈值设定,现在虽然有人还在用padj<0.05和|logFC|>1,但我建议根据具体情况调整。尤其是当你发现padj调整过严,导致很多生物学上很显著的基因被过滤掉了,可以尝试结合volcano plot看一下原始p值,或者稍微放宽一点到0.1,当然这需要你有足够的生物学解释能力去支撑这个决定。
再说说芯片数据。虽然现在用的少,但GEO里老数据一大半都是芯片。芯片数据处理最大的坑在于背景校正和归一化。MA normalize是最经典的,但对于那些表达量极端的芯片,可能会丢失一些信息。我个人比较推荐RMA或者Quantile Normalization。还有一个隐蔽的坑,就是探针去重。同一个基因可能有多个探针,如果你不做probe-to-gene的映射和取平均或中位数的操作,你的差异基因列表里会出现很多重复的GeneID。这在后续做富集分析时会严重影响统计效力,让本来显著的路径变得不显著。
另外,版本问题真的是个大头。RefSeq版本和Entrez ID经常打架。你在数据库里下载的描述文件可能是几年前的,而现在的NCBI数据库早就更新换代了。在geo数据库差异基因筛选时,一定要确认你用来注释的数据库版本和数据生成时间是否匹配。不然你会看到很多基因突然“消失”了,或者名字对不上号。我现在的习惯是用biomaart去实时拉取最新的注释,虽然慢点,但稳。
还有个小细节,很多人不做过滤就直接分析。低表达的基因或者缺失值太多的样本,应该提前筛掉。一般建议过滤掉平均表达量低于一定阈值的基因(比如TPM<1或者RMA值<5),以及缺失比例超过20%的样本。这一步虽然看起来不起眼,但能显著降低计算的噪音,让你的统计检验更敏感。
最后提一嘴,工具选择也很重要。虽然limma是经典,但对于复杂的RNA-seq设计,DESeq2或者edgeR在处理离散分布上可能更稳健。别迷信某个软件,多跑几个,交叉验证一下,心里才有底。做科研嘛,严谨点总没错,毕竟文章被审稿人挑刺太丢人了。
总之,数据清洗和预处理才是核心。别一上来就想着跑模型,先把地基打好。把批次效应控住,把探针映射搞对,把低表达噪音滤掉,你的差异基因列表才会干净、漂亮,后续的分析才能顺风顺水。希望这些大实话能帮到正在抓头发的你们。