第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)。

我曾经大意过:下载了 count matrix 当 raw data 做流程校准,跑了半天发现归一化根本不对。后来才意识到,批次整合最好从 FASTQ 或原始 BAM 重新对齐,否则不同数据库的预处理差异会引入额外批次效应。

下载方法:最简单的是手动点击,但样本一多就累死。我推荐用 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 的步骤:

  1. 安装:pip install pyega3
  2. 配置凭证:在 ~/.ega/credential 写入 username 和 password
  3. 下载: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 / Scanpy50~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。

避坑指南:有些 GEO 条目里的 H5 文件是用 10x 旧版 cellranger 生成的(v2 或 v3),特征名可能包含后缀 _1 或 _2。我曾经因为这个找不到基因名,debug 了半天。解法是读入后 strip 后缀:adata.var_names = [x.split('_')[0] for x in adata.var_names]。

SVG:数据获取与格式转化流程

数据获取与格式转化流程 搜索GEO/EGA GEO:开放数据 EGA:受控数据 wget / GEOparse pyEGA3 / 客户端 FASTQ / BAM HDF5 / mtx / TSV 原始数据用于重新比对,矩阵数据可直接整合
小技巧:如果你不确定数据是原始还是矩阵,可以先看文件大小。大于 1 GB 的通常是 FASTQ 或 BAM;几十 MB 的基本是矩阵。我用这个经验判断了无数次,从来没翻车。

常见问题与避坑(个人经验)

  • GEO 下载断连:用 wget 加 -c 断点续传,或者用 aria2c 多线程下载。
  • EGA 授权被拒:有时 DAC 审批需要你提供研究目的。我建议写清楚论文标题和大纲,别写太笼统。
  • 文件损坏:下载完记得用 md5sum 比对官网提供的 checksum。我曾经因为网络波动下了一半的 FASTQ 没在意,后期比对时才发现基因覆盖度异常,浪费了一整天。
  • 格式不统一:同一个 Series 里,10x 样本可能提供 h5,Smart-seq2 样本可能提供 tsv。不要怕,用 pandas 统一读成 AnnData 就行。

嗯,这一章就到这里。数据拿到手,下一步就是对齐和预处理了。记住,公共数据库是宝库,但需要耐心和细心。我踩的坑希望你一个都别踩。