2、测序数据格式基础:FASTQ、BAM、SAM、CRAM格式介绍及质量指标
做生信分析,说白了就是在跟这几种文件格式打交道。我记得刚入行那会儿,拿到一批测序数据,对着.fastq、.sam、.bam这些后缀一头雾水——每个文件里存的什么信息?为什么同一种数据要存成这么多花样?踩过坑之后才明白,搞懂这些格式是做好质控的第一道门槛。
2.1 FASTQ格式:最原始的测序数据
FASTQ是测序仪直接吐出来的原始格式,你拿到的第一手数据就长这样。它每4行记录一条测序read:
- 第1行:以@开头,是read的唯一标识符,包含测序仪器、flowcell编号、坐标等信息
- 第2行:碱基序列(A/T/C/G/N)
- 第3行:以+开头,通常只重复第1行的标识符(可省略)
- 第4行:质量值字符串,每个字符对应第2行中一个碱基的测序质量
举个例子:
@EAS139:136:FC706VJ:2:2104:15343:197393 1:Y:18:ATCACG
CTCAAGGTTGTTGCAAGACGGGAGGTAGGTGTCTCTGGGTAGAAAGCTCT
+
;;C;;;C;;;;;A;D?D?DD?C?D?DDDDAADDD?A?CDDDDDD?
质量值怎么算的? 我刚开始也觉得复杂,其实就是一个转换公式:
Q = -10 × log₁₀(P)
其中P是碱基识别错误的概率。
如果Q=30,表示错误概率为0.001,即准确率99.9%。
2.2 质量指标:如何评估测序质量
| 指标 | 含义 | 质控阈值(我个人经验) |
|---|---|---|
| Q20 | 错误概率1%,准确率99% | 单碱基Q20比例 ≥ 85% |
| Q30 | 错误概率0.1%,准确率99.9% | 单碱基Q30比例 ≥ 75% |
| GC含量 | 序列中G+C的占比 | 偏离理论值±5%以上需警惕 |
| N碱基比例 | 未识别碱基的比例 | 超过5%建议处理 |
| 序列重复率 | 完全相同序列的出现频率 | 超过20%可能是PCR扩增偏好 |
Q30比例是整个质控中最直观的指标。我遇到过一波数据,Q30看上去没问题,但GC含量分布明显偏离——后来发现是文库构建时发生了污染。你看,只看单个指标容易翻车,得综合判断。
质量值编码体系也得注意。不同版本的测序仪用过不同编码:
Q = ASCII码值 - 质量偏移量
Sanger/Illumina 1.8+(Phred+33):
质量偏移量 = 33,ASCII 33-126对应Q 0-93
Illumina 1.3-1.7(Phred+64):
质量偏移量 = 64,ASCII 64-126对应Q 0-62
所以看到质量值字符串里出现"!"、"0"、"B"这些字符时,我就得先确认编码版本,否则读出来的Q值全是错的。
2.3 SAM/BAM格式:比对结果的标准存储
FASTQ经过比对之后,会生成SAM(Sequence Alignment/Map)格式。这玩意儿是纯文本,可读性不错,但文件体积大得吓人。BAM就是它的二进制压缩版,体积小、加载快,是实际工作里的主力。
我以前踩过一个坑:拿到一个50G的SAM文件,想直接读进来分析,结果内存直接爆掉。从那以后,我养成了习惯——任何时候接到比对结果,第一件事就是先看是SAM还是BAM。如果是SAM,二话不说先转成BAM:
samtools view -bS sample.sam > sample.bam
samtools sort sample.bam -o sample.sorted.bam
samtools index sample.sorted.bam # 建索引才能随机访问
SAM文件的结构,说白了就两大块:
- 头部(Header):以@开头,记录参考基因组版本、比对参数、reads分组等信息
- 主体(Alignment):每一行是一条read的比对结果,包含11个必填字段加可选标签
关键字段我得提一下:
| 字段 | 含义 | 质控中关注什么 |
|---|---|---|
| FLAG | 比对标记位(配对、链方向、质量等) | 检查配对是否正常 |
| MAPQ | 比对质量值 | MAPQ < 30 的建议过滤 |
| CIGAR | 比对操作的紧凑表示(匹配、插入、删除等) | 过长插入/缺失可能表示比对问题 |
| NM tag | 与参考序列的错配数 | 错配过多的read可能是污染或假基因 |
2.4 CRAM格式:更高压缩比的替代方案
CRAM是BAM的升级版,压缩率能再砍掉30%-50%。它的核心思路是:不直接存碱基序列,而是存与参考基因组的差异。所以CRAM文件必须依赖一个参考基因组才能解压。
什么时候该用CRAM?我个人的判断标准是这样的:
- 长期归档:数据存三年五年,CRAM能省一大笔存储费
- 云上传输:几十G的BAM传起来要命,CRAM能快不少
- 参考基因组稳定:如果你用的参考版本经常换,CRAM的解压就麻烦了
用最常用的工具操作一下:
# BAM转CRAM(指定参考基因组)
samtools view -C -T reference.fasta input.bam -o output.cram
# CRAM转BAM
samtools view -b -T reference.fasta input.cram -o output.bam
# 直接统计CRAM的比对信息
samtools flagstat input.cram
一个实用的建议:保存CRAM时,一定要在元数据里写好参考基因组的版本和下载链接。我见过太多人三年后打不开自己的CRAM文件,就因为忘了当初用的哪个参考版本。
2.5 知识体系总览
说了这么多,其实这几种格式的关系很简单。我画了张图帮大家理清思路:
这几种格式不是孤立的,它们是数据流动中不同阶段的产物。我建议大家在实际工作中,建立起"格式即状态"的意识——看到什么后缀,就知道数据走到哪个环节了,质控该关注什么点。比如看到FASTQ,脑子里就蹦出Q30;看到BAM,第一反应是check MAPQ和比对率。
一个实用的小技巧:处理生信数据时,给不同的文件类型加上统一前缀。比如 projectX_raw.fastq、projectX_aligned.bam、projectX_archive.cram。这样一看文件名,整个处理流程就清楚了,团队协作时也不容易弄混。