VCF 与 BAM 格式概述

多组学数据处理,说白了就是跟各种文件格式打交道。你手上可能有几十个G的测序数据,也可能有来自不同平台的突变列表。怎么把它们串起来?我的习惯是,先搞清楚两种最核心的格式——VCF 和 BAM(SAM)。这俩就像多组学世界的“普通话”,不懂它们,后面寸步难行。

核心观点:VCF 描述“哪里变了”,BAM 描述“测序到底读了什么”。两者相辅相成,缺一不可。

VCF 是什么?

VCF 全称 Variant Call Format,是变异检测的结果文件。简单说,它就是一张表格,记录每个样本在每个位点上的基因型、质量、深度等统计量。为什么选 VCF?因为紧凑,一个变异位点一行数据,压缩后非常小,适合做大规模人群分析。

举个实际例子:我刚入行时接手一个肿瘤项目,需要对比 100 个样本的体细胞突变。原始 BAM 文件堆了 2TB,根本没法直接比较。用 GATK 转成 VCF 后,整个变异列表只有几百 MB,这才是能分析的样子。

一个标准的 VCF 文件长这样:

##fileformat=VCFv4.2
##INFO=
#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1
chr1 100 . A G 200.0 PASS AF=0.5 GT:AD 0/1:30,25
chr1 200 . C T 150.0 PASS AF=0.3 GT:AD 1/1:10,15

头部的“##”是元信息,告诉你怎么解析后面的数据。主体部分每行都是一个变异位点。嗯,这里要注意:VCF 是分样本的,同一个位点每个样本的基因型(GT)都可能不同。

避坑指南:我见过不少人把 VCF 当纯文本去解析,写死行数去取信息。结果换了一个 VCF 版本就全崩了。建议用 htslib 或者 PyVCF 这类库去解析,别手撕格式。我曾经因为这个原因debug到凌晨三点,再也不这么干了。

BAM / SAM 是什么?

BAM 是 Binary Alignment/Map 格式的压缩版本。它存的不是汇总后的变异,而是每一条测序 reads 比对到参考基因组上的详细信息。有多大?一个 30X 外显子组的 BAM 约 5-10GB,全基因组可以到 100GB 以上。说实话,刚接触时我都不敢随便 open 它。

SAM 是文本版,可读性好但占空间;BAM 是二进制版,压缩后空间少、读写快;CRAM 是进一步压缩版,主要靠参考序列做差分压缩。日常工作中,存数据用 BAM,快速轻量处理可以用 SAMtools view。我个人习惯是这样:原始数据用 CRAM 归档,分析中保留 BAM。

SAM 格式的每一行都代表着一条 reads 的完整比对信息。看一个例子:

SRR1177523 163 chr1 100 60 150M = 200 250 ATGC...GTCA * NM:i:0
SRR1177523 83 chr1 200 60 150M = 100 -250 ATCA...TGAG * NM:i:1

列位依次是:reads 名称、flag、染色体、比对起点、比对质量、CIGAR 操作、mate 染色体、mate 起点、模板长度、序列、质量值、可选标签。

重要:CIGAR 操作(例如 150M 表示完美比对的 150bp)是判断插入缺失和剪切位点的关键。如果比对质量低(如 MAPQ < 20),这行数据最好过滤掉再往下分析。切记,不验 CIGAR 和 MAPQ 直接做变异检测,出来的假阳性会非常多。

两者在多组学中的作用

不管你做基因组、转录组、甲基化还是 ChIP-seq,最终都会回归到这两种格式上。为什么?因为它们承载了从原始数据到高级分析之间的“桥梁层”。

下表对比了它们在不同组学中的典型用途:

组学类型 BAM 作用 VCF 作用 常见下游分析
全基因组/全外显子组 保留原始比对,用于深度评估和拷贝数分析 存储 SNP / INDEL / SV 的基因型 GWAS、罕见变异关联、家族遗传分析
转录组(RNA-seq) 保留跨内含子的 junction 比对 存储可变剪切事件和 RNA 编辑位点 表达定量、差异剪接、融合基因检测
单细胞测序 保留每个细胞的 UMI 和 barcode 标签 存储每个细胞的突变信息 克隆进化树构建、细胞分型
甲基化测序 保留 reads 的碱基替换(C→T)信息 存储每个位点的甲基化率 差异甲基化区域鉴定、表观时钟构建
ChIP-seq 保留 peak 区域的 reads 覆盖堆叠 存储峰值区域的边界和峰高 转录因子结合位点预测、组蛋白修饰图谱

你想想看,如果没有 VCF,你拿 BAM 去做 100 个人的等位基因频率比较,那磁盘和 IO 得炸。反过来,没有 BAM 拿 VCF 去验证一个结构变异的真实断点,你永远不知道这个变异是真是假。所以,多组学的核心能力里,格式转换和标准化是最基本也是最长尾的活。

实用技巧:做多组学整合时,我通常先把所有样本的 VCF 合并成一个大矩阵(比如用 bcftools merge),然后从每个样本的 BAM 中提取覆盖度和质量值映射到变异上。这样既保留了变异特征,又保留了 reads 级别的质控信息。怎么做?后续章节会细讲。

为了帮你建立直观的认知,我画了一张图:从测序仪到最终结论的整个数据流里,BAM 和 VCF 占什么位置。

BAM & VCF 在多组学分析中的典型位置 测序仪 FASTQ 原始数据 比对 BWA / STAR → BAM/SAM 变异检测 GATK / FreeBayes VCF 变异结果文件 GWAS / 突变注释 / 进化分析 (区分样本、统计等位基因频率) 工具:samtools / bedtools 覆盖度深度(BED / WIG) CNV分析 / 甲基化/ ChIP-seq (使用reads覆盖信息) 左路侧重变异发现,右路侧重定量和覆盖,两者在整合分析时交汇

图里你看到了吧?BAM 可以流向变异检测得到 VCF,也可以独立做深度和覆盖分析。你在做多组学时,经常需要从 BAM 信息来回看某个 VCF 中的位点 reads 质量好坏。说白了,BAM 是数据海洋,VCF 是航海图。

经验分享:我的工作流里,BAM 一旦比对完成就不再轻易修改;VCF 则会持续迭代——随着新样本加入或者质控标准提高,不断 merge 和过滤。记住一句话:BAM 是你的原始资产,丢失或损坏就没办法了;VCF 是加工品,可以重做。

今天讲的是概念和位置,后面我们会一步一步深入到怎么用工具转换,怎么标准化列名和染色体符号,以及一条完整的数据流转脚本怎么写。先打好这个基础。