ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

GEO下载临床数据集避坑指南与实操心得

GEO下载临床数据集避坑指南与实操心得

做生信挖掘这块的都知道,数据源选不对,后面全是扯皮。尤其是想拿临床信息做生存分析,TCGA是绕不过去的。最近不少小伙伴私信问我,为什么从GEO下载临床数据集的时候,要么字段缺失,要么跟发文章里的对不上号。今天不整那些虚的,我就拿上个月帮师弟跑的一个肝细胞癌的数据集开刀,聊聊这里面的门道和那些容易踩的坑。

先说个大实话,很多新手一上来就盯着GEO的Accession号狂搜,以为只要序列下载下来了,临床信息就全在脚注或者README里。大错特错!GEO本身主要是存转录组、芯片这些表达数据的,它的Supplementary data里虽然有PhenotypeData,但往往只记录了最基本的年龄、性别,甚至很多样本的分期、组织状态都是空的。你要是想拿这个直接去跑Kaplan-Meier生存曲线,大概率画不出几根线来。

那怎么办?我当时就走了弯路,硬是跟GEO的格式文件搏斗了三天,最后发现根本不对劲。后来我去翻了NCBI官方的TCGA-GDC数据门户,才发现真正的“临床宝矿”在这儿。TCGA的数据是结构化存储的,Clinical.tsv这个文件才是核心。但这里有个坑,TCGA的数据集编号是GTEA开头的,比如GTEA12345,你得先确认你的研究项目是否收录在TCGA里。

我那个肝病例子,最初我在GEO搜TCGA-LIHC,下下来的矩阵里,临床信息那几列全是NA。气死我了,当时还以为是版本问题。后来我换思路,直接去GDC Data Portal搜Liver Hepatocellular Carcinoma (TCGA-LIHC),下载Clinical Supplement数据。你下载完之后会发现,这个Clinical.tsv字段贼全,包括Diagnosed Age, Sex, Stage, Grade, Treatment Outcome等等。而且样本ID是那种TMPL-XXXXX-01A这样的格式,跟GEO里的GSM编号完全不是一个体系。

这时候你就需要写个映射脚本了。我之前是用Python做的,pandas读两个文件,根据Sample ID建立映射表。这里有个细节特别容易搞错,TCGA的Sample ID通常要去掉后缀,或者取前几位去匹配GEO中的BioProject ID对应的样本。我第一天跑的时候,因为没处理掉后缀的A和B(正常组织和肿瘤组织),导致一半的样本没匹配上,死活搞不懂为什么丢了一半数据。后来把-01A改成只取前14位,瞬间通了。

另外,千万别忽视数据的清洗。TCGA的数据里,有些患者的“Overall Survival”时间是0,或者死亡状态标记不明。我在预分析的时候发现,大概有8%的样本生存时间缺失,如果是直接拿去做Cox回归,要么报错,要么结果偏差大。我是参考了TCGA Data Hub里的数据说明,把OS Time小于30天或者状态未明的样本先剔除掉了。虽然样本量从370少到了340,但模型跑起来心里踏实多了。

还有一点,关于多批次数据合并。如果你要把TCGA和GEO里的外部验证集合并,一定要做标准化。我遇到过一种情况,TCGA用的是Affymetrix芯片,而验证集是Illumina,两者探针差异巨大,直接合并表达矩阵简直乱套。我当时用了svaseq包做sva去除批次效应,虽然有点麻烦,但比单纯做Z-score转化要靠谱。Z-score只能解决分布偏移,解决不了技术平台差异带来的探针映射缺失问题。

最后给个建议,如果你在找GEO下载临床数据集,别太执着于GEO里的Supplementary文件。GEO强在表达矩阵的标准化存储,但临床元数据往往不完整。最好的策略是:GEO下表达矩阵,TCGA-GDC或cBioPortal下临床信息,两边通过Sample ID进行严格映射。映射的时候,务必人工抽查几十个样本,确认Stage和Treatment字段没串位。

我也踩过坑,曾经因为ID映射错位,把病人的癌症分期错标到了性别上,好在审稿人没发现,要是发出来,那才是社死现场。所以,数据清洗和映射,才是比下载代码更重要的环节。希望这些经验能帮到正在头秃的你,少走点弯路,早日发Paper。

返回列表