第3章 数据获取:公共数据库(GEO、EGA)及格式说明
做单细胞批次整合,第一步就是拿数据。说白了,没有数据你连跑都不跑不了。
很多人觉得从公共数据库下载数据很简单——点几个链接、敲几行命令就行了。但我在项目里踩过不少坑,所以这一章把 GEO 和 EGA 这两个主流数据库的玩法讲透,顺便把常见的格式也说清楚。
为什么非要用公共数据库?
自己测序当然好,但成本高、周期长。大多数情况下我们都是复用公共数据。GEO 和 EGA 就是两个最大的单细胞数据仓库。GEO 偏向开放数据,EGA 则管理受控数据(比如人类样本需要授权)。个人习惯是:如果项目允许,优先从 GEO 拿;需要隐私合规的,走 EGA。
GEO 数据库:怎么找?怎么下?
GEO(Gene Expression Omnibus)由 NCBI 维护。地址你肯定知道,我就不写了。但刚入门的人容易搞混几个概念:Series、Sample、Platform。我给你拆开讲:
- Series(GSE 号):一个完整的研究项目,包含多个样本和实验设计。
- Sample(GSM 号):单个测序文库,一个 Series 下通常有几十个 GSM。
- Platform(GPL 号):测序平台,比如 10x Genomics 的 Chromium 对应 GPL24676。
举个例子。你想找一篇 10x vs Smart-seq2 的整合数据,直接搜关键词或者 GSE 号就行。点进 Series 页面,往下翻就能看到 Supplementary files。注意!这里经常有坑:有的数据是 raw data(FASTQ),有的已经是 count matrix(HDF5 或 mtx)。
下载方法:最简单的是手动点击,但样本一多就累死。我推荐用 GEOparse 或 wget + 正则。给个例子:
# 用 GEOparse 下载 Series 的 metadata
pip install GEOparse
python -c "
import GEOparse
gse = GEOparse.get_GEO(geo='GSE123456', destdir='./')
print(gse.metadata['title'])
"
具体文件可以解析 gse.series_metadata 里的 ftp 链接。也可以直接拼 URL:
# 假设 GSE123456 的 suppl 文件在:
# https://ftp.ncbi.nlm.nih.gov/geo/series/GSE123nnn/GSE123456/suppl/
wget -r -np -nH --cut-dirs=4 -A "*.fastq.gz,*.h5" \
ftp://ftp.ncbi.nlm.nih.gov/geo/series/GSE123nnn/GSE123456/suppl/
EGA 数据库:授权与下载流程
EGA(European Genome-phenome Archive)管控更严。你需要先注册账号、提交数据访问申请(DAC 或 Data Access Committee 审批)。审批通过后,会拿到一个 EGA Dataset ID 或 EGA File ID。
我记得第一次用 EGA 时,完全没想到还要走申请流程。项目 deadline 前一周才发现数据拿不到,差点翻车。所以我的建议是:尽早申请,至少预留 2 周。
下载工具官方推荐 pyEGA3 或 EGA Download Client。用 pyEGA3 的步骤:
- 安装:
pip install pyega3 - 配置凭证:在 ~/.ega/credential 写入 username 和 password
- 下载:
pyega3 -cf ~/.ega/credential fetch EGAD123456789 data/
效果?稳,但慢。EGA 服务器在欧洲,国内可能会卡。你可以加 --connections 4 开启多线程。
格式对比:FASTQ、BAM、HDF5、mtx
拿到数据后,你看到的格式五花八门。我把最常见的列在下表:
| 格式 | 内容 | 适用场景 | 典型大小 |
|---|---|---|---|
| FASTQ | 原始 reads(序列 + 质量) | 重新比对、完整分析流程 | 1~10 GB 每样本 |
| BAM | 比对后的 reads | 直接计数、可视化 | 0.5~5 GB |
| HDF5 (10x) | 过滤后的特征-条形码矩阵 | 直接对接 Seurat / Scanpy | 50~500 MB |
| mtx / mtx.gz | 稀疏矩阵 (Market Exchange) | 社区标准格式,兼容性好 | 10~100 MB |
你想想看,如果你是做批次整合,用 HDF5 或 mtx 当然最方便,但前提是不同样本的处理流程要一致。我建议拿到数据后先看 Supplementary 文件,如果是 10x 的 HDF5,直接用 Read10X_h5 读入;如果是 Smart-seq2 的 BAM,得用 featureCounts 或 STARsolo 重新量化。
实际操作:一个 GEO 数据下载的完整案例
正好我之前整合过一篇 10x 和 Smart-seq2 的数据,GSE 号就不贴了。流程如下:
- 浏览器打开 Series 页,定位到 Supplementary files。
- 发现 10x 样本提供的是
filtered_feature_bc_matrix.h5,Smart-seq2 样本提供的是counts.tsv.gz。 - 把 H5 和 TSV 全部下载到本地,注意文件名要保留样本 ID。
- 用 Python 批量读取:
import pandas as pd
import scanpy as sc
# 10x 数据
adata_10x = sc.read_10x_h5('10x_sample1.h5')
# Smart-seq2 数据直接读 TSV
adata_ss2 = sc.read_text('smartseq2_sample1.counts.tsv.gz', delimiter='\t')
但有个细节:Smart-seq2 的 TSV 通常是基因在行、样本在列,而 10x 的 H5 是样本在行。读完后记得用 .T 转置,或者统一 adata.X 的 shape。
_1 或 _2。我曾经因为这个找不到基因名,debug 了半天。解法是读入后 strip 后缀:adata.var_names = [x.split('_')[0] for x in adata.var_names]。
SVG:数据获取与格式转化流程
常见问题与避坑(个人经验)
- GEO 下载断连:用 wget 加
-c断点续传,或者用aria2c多线程下载。 - EGA 授权被拒:有时 DAC 审批需要你提供研究目的。我建议写清楚论文标题和大纲,别写太笼统。
- 文件损坏:下载完记得用 md5sum 比对官网提供的 checksum。我曾经因为网络波动下了一半的 FASTQ 没在意,后期比对时才发现基因覆盖度异常,浪费了一整天。
- 格式不统一:同一个 Series 里,10x 样本可能提供 h5,Smart-seq2 样本可能提供 tsv。不要怕,用 pandas 统一读成 AnnData 就行。
嗯,这一章就到这里。数据拿到手,下一步就是对齐和预处理了。记住,公共数据库是宝库,但需要耐心和细心。我踩的坑希望你一个都别踩。