数据格式基础:FASTQ、BAM、VCF、CRAM 详解

做 NA12878 基准数据集对比,说白了就是跟这几种文件格式打交道。你打开任何一份公开基准数据,看到的也就是这些后缀。我个人把它们当成基因组学里的“四件套”——原始数据、比对结果、变异位点、压缩存档。

这节我们就把每种格式掰开揉碎讲清楚。我会带上一些实际项目里的踩坑经历,帮你少走弯路。

1. FASTQ:一切从这里开始

原始测序数据,长得像文本,其实里面藏着四个部分。我刚开始接触时总以为这玩意跟 FASTA 差不多,直到一次比对任务怎么都跑不对,才发现是质量评分系统搞错了。

一条 FASTQ 记录长这样:

@SEQ_ID
GATTTGGGGTTCAAAGCAGTATCGATCAAATAGTAAATCCATTTGTTCAACTCACAGTTT
+
!''*((((***+))%%%++)(%%%%).1***-+*''))**55CCF>>>>>>CCCCCCC65
  • 第一行:以 @ 开头,后面是序列标识符,通常包含测序仪器、flowcell、lane 和坐标信息。
  • 第二行:碱基序列,A/T/C/G,N 表示不确定。
  • 第三行:以 + 开头,可以重复标识符,有时留空。
  • 第四行:质量评分,每个字符对应一个 Phred 分值。
避坑指南:质量评分系统有两种编码——Phred+33 和 Phred+64。我遇到过把 Solexa 旧格式当成标准 Sanger 来解析,结果下游突变鉴定全偏。你可以用 seqkit 或 fastp 直接检测编码类型,别自己猜。

质量值怎么还原呢?很简单,每个 ASCII 字符减去偏移量(通常是 33),得到的就是该碱基的测序错误概率。比如字符 '!'(ASCII 33)对应 Phred 分值 0,意味着 50% 的概率是错的;'I'(ASCII 40)对应 Phred 分值 7,错误概率约 20%。

2. BAM:比对的核心,二进制但高效

BAM 是 SAM 的二进制压缩版。为什么不用 SAM?你想想看,一个全基因组测序的 SAM 文件动辄上百 GB,磁盘写入就够受的。BAM 不光省空间,还能被索引,随机读取飞快。

我记得第一次做 NA12878 的比对,用了 BWA-MEM,输出直接是 BAM,省掉了转换步骤。但如果你手里有 SAM,可以用 samtools view 转成 BAM:

samtools view -bS input.sam > output.bam
samtools sort output.bam -o output.sorted.bam
samtools index output.sorted.bam

排序和建立索引是关键。没有索引的 BAM 就是个大二进制文件,你没法快速定位到某个区域。

一句话提醒:BAM 文件一定要生成 .bai 或 .csi 索引。我自己就有过教训,拿未索引的 BAM 去跑 GATK,等了两个小时报错“index not found”。那感觉,嗯,不太好。

BAM 内部结构分两部分:头部(@HD、@SQ 等)和记录体(每条比对一行)。你可以用 samtools view -H 看头部信息,用 samtools view 看记录。记录包含 11 个必填字段,包括 RNAME(参考序列名)、POS(比对起始位置)、MAPQ(比对质量)、CIGAR(比对描述)等。

3. VCF:变异档案

VCF 是存储变异信息的标准格式。你做任何基准对比,最后都要落到 VCF 上。

一个标准的 VCF 文件结构如下:

#CHROM  POS     ID       REF  ALT     QUAL  FILTER  INFO
chr1    10001   .        G    A       30    PASS    DP=100;AF=0.5
chr1    10002   rs12345  C    T       45    PASS    DP=80;AF=0.3
  • 以 # 开头的行是元数据,包含格式信息和样本说明。
  • 主体是制表符分隔的 8 列固定字段,后面跟样本基因型列。
  • INFO 字段很灵活,可以扩展。比如 DP 代表读取深度,AF 代表等位基因频率。

做对比时,我建议你先检查 VCF 的 FILTER 列。很多公开基准集的 VCF 包含未通过质控的位点,如果用全部数据去算,精度会莫名其妙低一大截。通常我们只看 PASS 过滤后的变异。

核心对比指标:VCF 对比主要看真假阳性——真相集中存在的变异在你的 call set 里有没有,你的 call 在真相集里是不是假阳性。这些后续章节会详细展开。

4. CRAM:终极压缩

CRAM 是 BAM 的进化版,2013 年由 EBI 提出。它利用参考基因组做差分编码,只存储测序 reads 与参考基因组的差异部分,压缩率比 BAM 高出 30%~50%。

转换成 CRAM 的典型做法:

samtools view -C -T reference.fa input.bam -o output.cram
samtools index output.cram

注意那个 -T reference.fa,这是关键。没有参考序列,CRAM 文件就是一堆无意义的数字。至于 CRAM 和 BAM 的差异,我整理了一张表:

特性 BAM CRAM
压缩率 3~5x 5~10x
依赖参考基因组 否 是
解码速度 快 略慢(但可接受)
工具兼容性 最好(所有工具都支持) 较好(主流工具已支持)

我个人倾向在存储归档阶段用 CRAM,在频繁读取和分析阶段用 BAM。毕竟你每次跑都用 CRAM 解压,时间成本积攒起来也不少。

深层提醒:CRAM 的版本有 v2.1、v3.0 等。旧版工具可能无法读取新版 CRAM。如果你要长期保存数据,建议保留原始 BAM 或 FASTQ,或者记录清楚 CRAM 的生成工具和参考基因组版本。

5. 本章知识结构:四种格式的关系

NA12878 数据转换与格式关系 原始 FASTQ 比对 BAM 压缩 CRAM 排序/去重 BAM 变异 VCF 基准对比 箭头表示典型处理流程;虚线表示 VCF 可直接用于基准对比

上图清晰展示了 NA12878 数据从原始 FASTQ 到最终对比的完整转换路径。你可以看到,BAM 和 CRAM 是并列的存档选择,而变异检测后的 VCF 才是最终对比的战场。

6. 实际操作中的避坑清单

光讲理论不够,我把自己这些年栽过的坑列出来,你遇到类似情况可以快速跳过。

  1. FASTQ 质量编码搞错:用 seqtk test 或 fastp -Q 自动检测,别手动猜。
  2. BAM 未排序:现代的变异检测工具基本都要求比对数据是排序后的。跑之前先确认 PYSAM 或 igv 能正常浏览。
  3. VCF 的 FILTER 列不清空:我遇到过直接把 .PASS 以外的位点当真的案例。最好用 bcftools view -f PASS 过滤后再对比。
  4. CRAM 参考基因组版本不匹配:这是最常见的错误。CRAM 文件记录了解码必须的参考基因组,但如果你用的是不同版本,解码照样报错。保持 GRCh38 系列的统一。
  5. 忽略索引文件:无论是 BAM、CRAM 还是 VCF,生成索引是常规操作。没有索引,很多工具会拒绝工作。

嗯,以上就是我对这四种数据格式的全部理解。每种格式都有它的历史背景和适用场景,做 NA12878 对比时你总会用到它们中的一个或多个。记住这些小技巧,你的分析流程会顺畅很多。