第2章 数据获取与格式:FASTQ格式、公共数据库(SRA/GEO)使用
好,聊完了RNA-seq的整个实验设计和基本原理,咱们得着手搞数据了。这一章,我带你看看最原始的数据长什么样,以及怎么从公共数据库里把它们扒下来。说实话,这一步要是搞错了,后面分析得再好也是白搭。
2.1 FASTQ格式:测序仪吐出来的“原始密码”
你从测序仪或者公共数据库下载下来的,多半是FASTQ文件。这个格式,说白了就是测序仪直接把读到的一堆DNA小片段,加上对应的质量分数,打包成文件扔给你。
FASTQ 文件里记录的是 序列(Sequence) 和 质量(Quality)。序列就是ATCG的排列组合,质量则记录了每个碱基被测序仪读错的概率。
2.1.1 FASTQ的“四行一条”结构
每个read在FASTQ文件中占4行,这是铁律。你随便打开一个看,结构都一模一样。
@EAS139:136:FC706VJ:2:2104:15343:197393 1:Y:18:ATCACG
CTTCACAAAATCCTTTGATAATCTCATGACCAAAATCCCTTAACGTGAGTTTTCGTTCCACTGAGCGTC
+
;;C;;F;;FFF:FF::FFF:::FFFFF:F:FFCF:FFFF:F:FFFFFFFFFF:FFF:FFFFCFFFFF
第一行以 @ 开头,是读段的标识符,包含仪器ID、流动槽位置、坐标等信息。第二行是碱基序列。第三行是一个 +,后面可以跟描述信息(但通常为空)。第四行是质量分数,每个字符对应第二行每个碱基的质量。
质量分数怎么算?
第四行的每个字符通过ASCII码映射成一个数值,再经过一定的公式转换,就得到了这个碱基的 Phred Quality Score(Q值)。
- Q = -10 log10(P),P是这个碱基测错的概率。
- Q = 30,意味着测错概率是千分之一(P = 0.001),准确率99.9%。
- Q = 20,意味着测错概率是百分之一(P = 0.01),准确率99%。
| Phred质量分数 (Q) | 碱基错误率 (P) | 碱基准确率 |
|---|---|---|
| 10 | 1/10 | 90% |
| 20 | 1/100 | 99% |
| 30 | 1/1000 | 99.9% |
| 40 | 1/10000 | 99.99% |
避坑指南
我曾经以为FASTQ文件里第四行的+号是多余的,直到有一次我写脚本解析时,发现有些机器产出的数据在第三行后面带了额外的信息,直接导致解析错误。记住,第三行的+号是行分隔符,不能丢。另外,质量编码方式有Phred+33和Phred+64两种,大部分公共数据库用的是+33,但早年的Solexa数据用的是+64。用错了编码,你的质量分就全乱了。
2.1.2 用命令行看一眼FASTQ
在Linux环境下,我习惯用 less 或者 zcat 直接看压缩文件。但是千万别直接打开整个文件,会卡死。
# 查看压缩的FASTQ文件前8行(即前2条read)
zcat sample_R1.fastq.gz | head -n 8
# 查看共有多少条read
zcat sample_R1.fastq.gz | echo $((`wc -l` / 4))
# 或者直接用seqkit统计
seqkit stat sample_R1.fastq.gz
我的小习惯
拿到一个新的FASTQ文件,我总会先跑一下seqkit stat或者fastqc。这能快速告诉我数据量够不够,质量好不好,有没有接头污染。我的做法是:先快速看一眼,心里有数,再决定下一步的质量控制策略。
2.2 公共数据库:SRA和GEO的用法
你自己做实验拿到了数据,或者想用别人的数据练手,都得去公共数据库。环境里最常用的两个库:SRA(Sequence Read Archive) 和 GEO(Gene Expression Omnibus)。
有什么区别?
简单来说,SRA是存原始测序数据的“仓库”,而GEO是存处理后的表达矩阵和元数据的“档案馆”。你想下载原始FASTQ文件,就去SRA;你想看别人分析好的基因表达表、差异基因列表,就去GEO。
| 数据库 | 存储内容 | 典型用途 | 数据格式 |
|---|---|---|---|
| SRA | 原始测序reads (FASTQ/SRA格式) | 下载原始数据、重复分析、开发新算法 | SRR (SRA Run), FASTQ |
| GEO | 处理后的数据、样本元数据、实验设计 | 查询研究背景、下载表达矩阵、查找样本信息 | GSE, GSM, SOFT, MINiML |
2.2.1 从SRA下载原始数据:SRP、SRR、SRA Toolkit
我刚开始用SRA时,被那一串编号搞晕过。简单梳理一下:
- SRP (SRA Project):对应一个研究项目,比如“某某癌细胞系RNA-seq”。
- SRS (SRA Sample):对应一个生物学样本。
- SRR (SRA Run):对应具体的测序数据文件,一个样本可能有多个SRR(比如双端测序的两个文件)。
下载数据,需要用到官方的工具 SRA Toolkit。
# 安装SRA Toolkit (Ubuntu)
conda install -c bioconda sra-tools
# 或者下载源码安装
wget https://ftp-trace.ncbi.nlm.nih.gov/sra/sdk/current/sratoolkit.current-ubuntu64.tar.gz
tar -vxzf sratoolkit.current-ubuntu64.tar.gz
# 然后添加到环境变量PATH
下载的核心命令是 fastq-dump 或者更好用的 fasterq-dump。
# 用fastq-dump下载一个SRR文件,默认生成单个FASTQ文件
fastq-dump SRR12345678
# 下载双端测序数据,生成_R1和_R2两个文件
fastq-dump --split-files SRR12345678
# 推荐用fasterq-dump,速度更快,支持线程
fasterq-dump --split-files --threads 8 SRR12345678
注意:环境变量配置
我记得有次在新服务器上装SRA Toolkit,跑了半天命令报错:vdb-config没配置。默认情况下,工具需要一个 .ncbi 目录来缓存配置。你可以运行一行命令初始化它:
vdb-config --interactive # 或者直接接受默认设置:vdb-config -s
否则,后续下载可能因为找不到临时目录或者代理设置失败。
2.2.2 从GEO挖掘元数据
SRA只管原始数据,但你想知道样本是怎么处理的、用了什么细胞系、分组信息,这些得去GEO找。GEO的核心编号是 GSE (GEO Series) 和 GSM (GEO Sample)。
我教你一个快速抓取元数据的方法。GEO的官网支持直接下载处理后的数据(通常是表达矩阵),而且有个SOFT格式文件,里面包罗万象。
# 下载GSE的SOFT格式文件(包含所有样本信息和平台信息)
wget "https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE123456&targ=self&form=text&view=full" -O GSE123456_soft.txt
# 或者用R包GEOquery
# 在R中运行
library(GEOquery)
gse <- getGEO("GSE123456", destdir=".")
# 提取表达矩阵
exprs_data <- exprs(gse[[1]])
# 提取样本元数据
pdata <- pData(phenoData(gse[[1]]))
我的经验
看到一篇文献,想复现结果,我通常会:
1. 先在GEO搜GSE号,下载SOFT文件,快速看样本怎么分组的。
2. 然后根据GSE号对应的SRA项目号(SRP),去SRA下载对应的SRR文件。
3. 最后对着样本描述,把SRR文件跟分组信息对应起来。
这一步叫“元数据清洗”,往往最费时间。我曾经为了弄清楚一篇文章里两个样本的性别标签到底写没写,翻遍了所有的GEO的配套文档。
2.3 总结:拿到数据后的第一件事
好了,你现在知道数据从哪里来、长什么样了。我建议你拿到任何RNA-seq数据后,先做这三件事:
- 肉眼检查:用
zcat | head看看格式对不对,特别是质量分数那行。 - 统计质量:跑
fastqc,生成初步的质量报告。 - 清洗元数据:整理出样本名称、分组、实验条件,做成一个清晰的CSV表格。
一句话总结
数据获取不光是下载文件,更关键的是建立 “数据-格式-元数据” 的铁三角关系。这一步做扎实了,后续分析才能站稳脚跟。