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%。
我个人的习惯:拿到FASTQ第一步,先看质量值分布。如果Q30比例低于80%,我会直接建议重新测序——后面再怎么补救都有限。

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可能是污染或假基因
我曾经遇过一个情况:某批次数据的FLAG显示大量read是unmapped,但序列质量明明很好。查了半天发现是参考基因组版本和比对用的索引不匹配——你想想看,这种问题根本不会在常规QC里报错,得靠经验排查。

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/GC/重复率) SAM(文本) BAM(二进制/压缩) CRAM(更高压缩比) 核心原则:数据流向 原始测序 → FASTQ → 质量控制 → 比对 → SAM/BAM/CRAM(按存储需求选型)

这几种格式不是孤立的,它们是数据流动中不同阶段的产物。我建议大家在实际工作中,建立起"格式即状态"的意识——看到什么后缀,就知道数据走到哪个环节了,质控该关注什么点。比如看到FASTQ,脑子里就蹦出Q30;看到BAM,第一反应是check MAPQ和比对率。

一个实用的小技巧:处理生信数据时,给不同的文件类型加上统一前缀。比如 projectX_raw.fastq、projectX_aligned.bam、projectX_archive.cram。这样一看文件名,整个处理流程就清楚了,团队协作时也不容易弄混。