4. 外部数据集的获取:公共数据库与数据检索
外部验证的第一步,就是找数据。
说得直白点,你用自己的数据集训了个模型,自我感觉良好,AUC高得离谱——但这叫Cheating Yourself。模型真正有没有泛化能力,得拿到别人的数据上跑一遍才知道。
我个人习惯在做验证之前,先把能找到的公共数据扫一遍。这行干久了你会发现,很多论文里的模型之所以复现不了,不是算法不行,而是数据集高度同质。换一批样本,换个测序平台,性能就崩了。
4.1 三大公共数据库概览
RNA-seq数据最集中的地方,就是下面这三个仓库。你不需要全用,但至少要知道它们各自长什么样。
| 数据库 | 全称 | 特点 | 典型场景 |
|---|---|---|---|
| GEO | Gene Expression Omnibus | NCBI旗下,收录最广,元数据相对规范 | 表达谱芯片、RNA-seq、甲基化 |
| ArrayExpress | ArrayExpress Archive | EBI旗下,与GEO有部分交叉,质量控制更严 | 功能基因组实验,尤其是欧洲项目 |
| TCGA | The Cancer Genome Atlas | 仅限癌症,大规模、多组学、临床数据完整 | 肿瘤预后、分子分型验证 |
我经常被问到:“那我到底该选哪个?” 我的答案很简单——看你的样本量需求。如果你只需要几十例对比,GEO足够;如果你要做泛癌种分析,TCGA是首选;如果你要验证一些罕见病模型,ArrayExpress里有时能翻到意想不到的宝藏。
4.2 GEO:最常用的数据来源
GEO是我个人用得最多的库,没有之一。它的设计有点像论文的“补充材料”,但比那规范多了。
4.2.1 数据层级
理解GEO的数据结构是第一步。很多新手上来就搜GSE号,然后发现下载下来一堆乱七八糟的文件——那是因为你没搞清楚GEO的三个层级。
- GSE (Series):研究的整体描述,包含实验设计、样本分组、数据摘要。你应该从这里开始搜索。
- GPL (Platform):测序平台信息。对RNA-seq来说,就是Illumina的哪个机器、哪个试剂版本。
- GSM (Sample):单个样本的原始数据或处理后的表达矩阵。这是你最终要下载的东西。
我的经验:先读GSE的摘要和分组信息,确认数据是否适合你的任务。我曾经浪费两天下载了一个GSE,结果发现它是单细胞测序,而我的模型是批处理模式——完全用不上。
4.2.2 检索与下载
GEO的数据检索核心就是Entrez。你可以通过网页手动搜,也可以用程序批量拉。
手动检索路径:NCBI GEO主页 → 输入关键词 → 筛选Expression profiling by high throughput sequencing → 点开GSE记录。
程序化检索,我推荐用GEOquery包(R语言)或者biopython的Entrez模块。下面是R的示例:
library(GEOquery)
# 下载GSE数据,会自动拉取表达矩阵
gse <- getGEO("GSE123456", GSEMatrix = TRUE)
# 提取表达矩阵
exprs_data <- exprs(gse[[1]])
# 查看样本分组
pdata <- pData(gse[[1]])
table(pdata$title)
注意一点:getGEO有时候会超时,尤其是国内网络环境。我建议在脚本里加个tryCatch,或者把数据下载到本地再解析。
避坑指南:GEO里的RNA-seq表达矩阵,部分提交者只上传了counts格式,部分上传了FPKM。你下载后务必检查量纲。我遇到过用FPKM训练的模型去预测counts格式的数据,结果所有预测值都偏高一到两个数量级。
4.3 ArrayExpress:欧洲的备选方案
ArrayExpress和GEO有大量的数据重叠,但它的数据质量控制更严格。我个人感觉,ArrayExpress的元数据(metadata)格式更统一,解析起来更顺手。
检索路径:EBI ArrayExpress主页 → 搜索 → 筛选RNA-seq → 导出。
代码示例(Python):
from bioservices import ArrayExpress
ae = ArrayExpress()
# 搜索与"breast cancer"相关的RNA-seq数据
records = ae.search("breast cancer RNA-seq", format="json")
# 查看前3条结果
for rec in records[:3]:
print(rec["accession"], rec["title"])
下载数据可以直接用wget拉FTP链接,ArrayExpress的FTP结构非常清晰:
wget -r -np -nH --cut-dirs=3 \
ftp://ftp.ebi.ac.uk/pub/databases/arrayexpress/data/experiment/E-MTAB-XXXX/
什么时候优先用ArrayExpress? 如果你的研究涉及欧洲的临床样本(比如UK Biobank的子项目),ArrayExpress收录更全。此外,它的原始数据(FASTQ)归档率比GEO高,如果你需要做从头比对,ArrayExpress是更好的选择。
4.4 TCGA:癌症研究的数据金矿
TCGA不用多介绍,三十多种癌症类型、超过两万例样本,多组学+临床数据——唯一的缺点是数据量太大,下载一次够吃半天。
TCGA的数据通过TCGAbiolinks(R包)或gdc-client(官方命令行工具)访问。我更喜欢后者,因为它支持断点续传,下载大文件时省心很多。
gdc-client下载流程:
# 1. 下载manifest文件(GDC官网勾选数据后导出)
# 2. 批量下载
gdc-client download -m manifest.txt -d ./tcga_data/
# 3. 解压并整理
find ./tcga_data -name "*.gz" | xargs gunzip
个人建议:TCGA的RNA-seq表达量官方提供了三种版本——FPKM、FPKM-UQ、Counts。如果你的模型是用Counts训练的,下载HTSeq-Counts列;如果是FPKM,就下载FPKM列。混用会导致结果偏差,我吃过这个亏。
4.5 数据检索的核心逻辑
说了这么多,我们来抽象一下外部数据检索的共同模式。这也是我每次做验证前都会在脑子里过一遍的步骤:
- 明确需求:疾病类型、样本量、数据形式(counts/FPKM/raw)。
- 搜索:在GEO/ArrayExpress/TCGA中按条件筛选。
- 验证可用性:检查样本数量、分组是否合理、是否公开。
- 下载:通过API或FTP批量获取。
- 质量检查:表达量分布、基因注释完整性、批次效应。
下图把这五个步骤串起来了,方便你照做:
4.6 实用经验总结
最后,我列几条在这几年里踩出来的坑,希望对你有帮助:
- 不要只用一个数据集做外部验证。至少找2-3个独立的数据集,覆盖不同的测序平台和人群背景。我曾经只用了一个GEO数据集做验证,模型表现很好,结果换到TCGA上直接掉15个点。
- 检查批次效应。如果你把多个GSE的数据合并做验证,一定要用
ComBat或Harmony校正。我见过一个案例,外部验证的“精度差”其实是批次差异,不是模型问题。 - 记录Meta information。下载数据时,顺手把样本的临床信息、处理日期、实验条件记下来。很多模型验证失败的原因,是训练集和验证集的样本处理流程不一样——RNA提取方法不同,都会影响表达量。
- 注意数据版本。TCGA的数据每隔一段时间会更新,你下载时务必记录版本号。老版本的表达矩阵和最新版可能有几百个基因的差异。
一句话总结:外部数据集获取的核心,不是“我会下载GSE”,而是“我知道要找什么数据、从哪找、拿到后怎么确认它能用”。数据质量决定了你验证结果的可信度——这个环节省了时间,后面全得加倍还回来。