做生物信息这行十一年,我见过太多人死磕TCGA和GEO之间去批次,最后头发掉了一把,结果发现根本没法比。这篇不整虚的,直接告诉你为什么这两类数据硬凑在一起是灾难,以及真正能用的替代方案是什么。别再用ComBat简单粗暴地抹平差异了,那是在掩盖生物学真相。
先说个大实话,TCGA和GEO虽然都是转录组数据,但它们的“出身”完全不同。TCGA是大型多中心临床队列,标准化做得极好,测序平台统一,临床信息详实得像教科书。而GEO呢?那是个大杂烩,不同实验室、不同测序仪、不同建库方法,甚至不同物种的亚型混在一起。你让一个在标准实验室里长大的孩子,去和一个在野外风吹日晒的人比身高体重,还指望他们站在同一个起跑线上?这不科学,也不合理。
很多新手一上来就打开R语言,调用sva包里的ComBat函数,噼里啪啦一顿跑,看着PCA图上的点聚到一起了,就以为成功了。我告诉你,这是典型的自欺欺人。你去批次(Batch Effect Removal)的核心逻辑是假设批次效应是技术噪音,而生物学信号是共同的。但在TCGA和GEO之间,这个假设根本不成立。TCGA的数据分布和GEO的数据分布,不仅在均值和方差上不同,连整体的基因表达结构都可能有系统性偏差。强行去批次,往往会把真实的生物学差异当成噪音给抹掉,或者把技术噪音当成生物学信号给保留下来。
我有个朋友,之前为了发文章,把TCGA的肺癌数据和GEO里的一个小型队列拼在一起做差异分析。结果发现,去批次后,原本在TCGA里显著上调的基因,在合并数据里全都不显著了。他急得跳脚,问我是不是代码写错了。我看了他的PCA图,发现去批次前,两个数据集分得很开,这是正常的;去批次后,它们重叠了,但这重叠是人为制造的假象。这种操作在审稿人眼里就是硬伤,直接拒稿没商量。
那该怎么办?别慌。如果你真的需要整合这两个数据集,首先要明确你的研究目的。如果是为了验证某个在TCGA中发现的 biomarker,你根本不需要把原始数据合并。你可以直接用TCGA训练模型,然后用GEO作为独立验证集。这才是正路。如果非要整合,请先检查数据的预处理流程是否一致。比如,TCGA通常用FPKM或TPM,而GEO很多原始数据是Count。你得先把GEO的数据通过DESeq2或edgeR标准化到类似的尺度,但这还不够。
其次,考虑使用更高级的整合方法,比如Harmony或Seurat的CCA/Integration算法,这些方法在设计时考虑了细胞类型的对应关系,比单纯的ComBat更适合高维数据。但即便这样,也要小心过拟合。记住,去批次不是目的,发现生物学规律才是。如果去批次后,你的生物学结论变得模糊不清,那说明数据本身就不适合整合。
最后,我想强调一点,不要为了凑数据量而强行合并。TCGA的数据量已经足够大了,除非你有非常特殊的临床亚型需要GEO来补充,否则没必要冒这个险。很多时候,我们之所以想合并,是因为样本量不够,统计效能不足。这时候,你应该做的是扩大TCGA的筛选范围,或者寻找其他高质量的TCGA子集,而不是去碰GEO这个“雷区”。
做科研要诚实,面对数据也要诚实。承认数据的局限性,比强行修正数据要高贵得多。希望这篇能帮你省下那些无用的加班时间,把精力花在真正的生物学问题上。别再把时间浪费在TCGA和GEO之间去批次的无效尝试上了,那是个无底洞。