第三章 数据获取:公共数据库检索与FASTQ格式详解

公共数据库三巨头:GEO、SRA、ENA

做RNA-seq差异表达分析,第一步永远是找数据。公共数据库说白了就是全球实验室的"数据仓库"。我个人习惯把这三个库看作一套体系:GEO(Gene Expression Omnibus)是NCBI下的数据门户,SRA(Sequence Read Archive)是它的原始数据仓库,ENA(European Nucleotide Archive)是欧洲的兄弟版本。

数据库 全称 主要用途 我推荐的操作
GEO Gene Expression Omnibus 查阅实验设计、样本信息、处理后的表达矩阵 先在这里搜实验,确认数据可用
SRA Sequence Read Archive 存储原始FASTQ/FASTQ.gz,需要prefetch下载 从GEO的SRA链接跳转,拿SRR编号
ENA European Nucleotide Archive 和SRA互为镜像,有时下载更快 碰上SRA太慢时,切到ENA试试

为什么会这样?三个库其实是同一个项目的不同入口。我记得刚入行时有个坑:在GEO上看到了漂亮的统计图,兴冲冲下载表达矩阵,结果发现原始测序数据不在里面。嗯,这里要注意——GEO只能告诉你"这个实验存在"和"最终结果长了什么样",原始测序文件一定要去SRA或者ENA拿。

GEO检索实操

我在项目中遇到过最头疼的情况:搜索关键词太宽,溢出几千条数据;关键词太窄,又漏掉重要实验。这里分享一个我反复验证过的工作流。

  1. 第一步:明确生物问题和条件——比如"人乳腺癌细胞系MCF-7,DOX处理 vs 对照",比搜"breast cancer"精准十倍
  2. 第二步:在NCBI GEO主页使用Advanced Search Builder,组合条件:(breast cancer[MH]) AND (MCF-7[Text Word]) AND (Expression profiling by high throughput sequencing[DataSet Type])
  3. 第三步:筛选结果——看Series个数,一般5-50个是合理范围。点进去后重点看"Samples"表格,确认是否有对照和处理、生物学重复数目。

我个人习惯在GEO上先读那个"Summary"区块,如果实验设计写得清楚,我会继续下去;如果描述模棱两可,直接跳过,后面踩坑的概率极大。

一个省心技巧:GEO页面底部通常有"SRA Run Selector"链接。点击进去会出现一个包含所有样本的表格,直接勾选需要的样本,拿到SRR编号列表。我经常用这个功能一次性搞清所有样本的测序策略。

SRA下载实战

拿到SRR编号后,下载工具最主流的是SRA Toolkit里的prefetch和fasterq-dump。我的标准流程如下。

# 下载SRA文件(.sra格式,压缩态)
prefetch SRR1234567

# 转换成FASTQ(默认生成两个文件:SRR1234567_1.fastq, SRR1234567_2.fastq)
fasterq-dump --split-files SRR1234567

# 想更精细控制:指定输出目录、线程数
fasterq-dump --split-files --outdir ./fastq/ --threads 4 SRR1234567

你想想看,为什么我还要用prefetch再fasterq-dump?直接fastq-dump不就行了吗?其实prefetch下载的是SRA专有格式,可以断点续传,网络断开后不用从头开始。我经历过在服务器上下载20G数据到95%断网,没这个功能真的会崩溃。

曾经踩过的坑:有一次我在集群上同时prefetch了20个样本,结果因为写入磁盘太猛把inode用光了。现在我的习惯:每次同时下载不超过5个样本,并且用--max-size 50G限制单个文件大小。还有,千万别在/tmp里直接跑——空间不够的话,你会发现辛辛苦苦下到一半的文件就没了。

如果SRA官方的面镜像速度太慢,你可以切到ENA:ENA的下载地址格式通常是:ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR123/SRR1234567/SRR1234567_1.fastq.gz。我本人习惯优先从ENA下载,实测快不少,尤其是在欧洲的节点上。

  • 关键参数:
    • --split-files:双端测序时把read1和read2分到两个文件,必加
    • --threads:根据CPU核心数设置,我一般用4或8
    • --outdir:指定输出目录,防止散落在当前目录
  • 一次性下载多个样本:
    # 准备SRR_Acc_List.txt,每行一个SRR号
    cat SRR_Acc_List.txt | xargs -n 1 -P 3 prefetch

FASTQ格式:一字一句都不能错

FASTQ是RNA-seq的金标准格式。说白了,它就是给每个序列配上一个质量分数。一下是一个FASTQ记录的完整拆解。

@SRR1234567.1 HWI-ST1234:1:1101:1234:1234 length=100
ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
行号 标识符 内容 踩坑高频条目
第1行 @ 序列ID + 可选仪器/坐标信息 ID中的空格可能导致下游工具解析错误,千万别自己添加空格
第2行 序列 碱基序列(ATCGN) 如果N太多说明测序失败,这种read我会在质控后直接淘汰
第3行 + 通常只写一个"+",有时会重复ID 我遇到过某些工具要求第三行必须与第一行完全一致,否则报错,用seqtk可以标准化
第4行 质量 与第2行等长的ASCII字符,每个字符对应一个碱基的质量值 质量编码模式(Sanger/Illumina)不匹配是最常见的错误

为什么质量值用ASCII字符而不是数字?你想想看,如果直接用数字写,一行100个数值,那文件就膨了。ASCII字符相当于一个"查表式压缩":每个字符的ASCII码值减去33(Sanger编码)就是质量分数。

质量编码速查:Sanger(Phred+33)是目前最通用的标准,ASCII范围从"!"(0)到"I"(40)。老Illumina版本用过Phred+64,但基本已经淘汰。我从项目一开始就强制检查质量编码一致性,避免后面差异表达分析结果失真。
# 用Python快速检查质量编码是不是Phred+33
from Bio import SeqIO
for record in SeqIO.parse("sample.fastq", "fastq"):
    qual = record.letter_annotations["phred_quality"]
    # 如果最小值小于0,那肯定是Phred+64(旧版本),需要转换
    if min(qual) < 0:
        print("检测到Phred+64编码,建议转换")
        break
    elif max(qual) > 40:
        print("可能存在偏移")
        break
    else:
        print("Sanger编码,一切正常")
    break  # 只用第一个read判断就够了

实战流程:搜索→下载→格式确认

下面这张SVG图完整展示了从数据库检索到拿到合格FASTQ的路线。我一直觉得,看得见流程比闷头敲命令更重要。

RNA-seq数据获取流程图 1. 确定研究目标 2. GEO高级检索 3. 获取SRR编号 4. prefetch + fasterq-dump 5. FASTQ质量检查 记住:下载完成后第一件事就是跑fastqc,别急着做差异表达分析

看到这张图,你应该能理解:数据获取不是一条单线任务,而是一个需要反复验证的循环。我个人习惯在每一步都做一次"完整性确认":GEO检索完确认实验设计,下载完确认文件不损坏,格式转换完确认质量编码正确。一次完整的RNA-seq分析,数据获取这部分如果做扎实了,后面80%的错误都可以避免。

我曾经遇到最离谱的事:花了两周时间用一批"正确的"FASTQ跑完差异分析,结果发现样本标签全部错位——对照和处理的SRR编号被我搞混了。从那以后我强制自己在SRR编号后面加注释,比如SRR1234567_Control_Rep1,永远不会错。

格式细节:为什么只有4行却总出问题

FASTQ看起来简单,但我在教程里见过太多人踩坑了。

  • 换行符问题:Windows的CRLF(\r\n)和Linux的LF(\n)混用会导致某些工具无法解析。我个人习惯用dos2unix对所有FASTQ文件统一处理。
  • 降碱基符号:除了A、T、C、G,还可能出现IUPAC模糊字符如R、Y、M、K。大部分比对工具都能处理,但如果你用自定义bin计数脚本,一定要考虑N和模糊字符。
  • 质量值标度:Sanger(Phred+33)质量范围0-40;Illumina 1.8+(也是Phred+33,但上限可能到41或更)。我见过不少工具用Phred+33当作固定假设,如果文件是Phred+64,所有质量值都会偏移33,导致错误低估。
# 用seqtk检查质量编码是否Sanger(Phred+33)
seqtk test sample.fastq | head -n 4

这里面其实有一个隐藏的技巧:seqtk test命令会输出一个简化质量分布,你能看到第一个read的质量值ASCII范围。如果最大字符接近'I'(73 ASCII),可能是Phred+64;如果最大字符小于'K',大概率是Phred+33。我在项目启动前10秒用这招,避免等跑完比对才发现编码不对。

终极检查方法:我最信赖的是fastqc输出的"Per base sequence quality"图。如果Quality scores over range显示的值完全不对,比如全部<10或>40,十有八九就是编码模式选错了。这种情况我会写一个简单脚本重新映射。

说到底,数据获取和格式理解是RNA-seq分析中最"苦"但又最关键的基线工作。很多人急于做差异表达,在这个阶段马虎了事,结果后面的分析全都建立在沙地上。我的建议:花40%时间在数据获取和质控上,这比花80%时间在调试下游分析省心多了。