VCF 格式详解:结构、字段、样本信息、QUAL/FILTER/INFO 等关键列解读

如果你做过 variant calling,一定对 VCF 不陌生。这是个看起来简单、但实际挺多门道的格式。我记得最早接触 VCF 时,以为它就是个表格,一行一个变异。后来被坑了几次,才发现背后有不少设计逻辑。

这一章,我们把 VCF 格式从头到尾捋一遍。我的目标是——学完后,你能像个老手一样读懂任何 VCF 文件中每一列、每一行在说什么。

VCF 文件的核心骨架

VCF 文件说白了就是三个部分:元数据头、列标题行、以及实际的数据行。我们一个个拆。

  • 元数据头:以 ## 开头,描述文件版本、INFO/FORMAT/FILTER 字段定义、参考基因组路径等。
  • 列标题行:以 #CHROM 开头,固定有 8 个必选列 + 1 个 FORMAT 列 + N 个样本列。
  • 数据行:每行一个变异位点,各列用 Tab 分隔。

来个真实案例。这是某个 WGS 项目的 VCF 片段:

##fileformat=VCFv4.2
##source=GATK4.2.0.0
##contig=<ID=chr1,length=248956422>
##INFO=<ID=DP,Number=1,Type=Integer,Description="Total Depth">
##INFO=<ID=AF,Number=A,Type=Float,Description="Allele Frequency">
##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
##FORMAT=<ID=GQ,Number=1,Type=Integer,Description="Genotype Quality">
#CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT  SAMPLE1
chr1    100     .       G       A       245.3   PASS    DP=80;AF=0.45    GT:GQ   0/1:85

嗯,这里要注意。第一列 ##fileformat=VCFv4.2 是硬要求,旧版解析器可能直接报错。我建议项目一开始就统一用 4.2 或 4.3。

八个必选字段:CHROM、POS、ID、REF、ALT、QUAL、FILTER、INFO

这部分我习惯按「位置信息 → 变异信息 → 质量过滤信息」来记。下面这张表帮你快速对号入座:

列名缩写含义个人提醒
CHROM染色体chr1 ~ chr22, chrX, chrY, chrM有些工具用 "1" 不用 "chr1",注意转换
POS位置参考基因组上的 1-based 坐标1-based 哦,别跟 0-based 搞混
ID标识符dbSNP rsID 或点号(.)新发现变异通常是 .
REF参考碱基一个或多个碱基至少一个碱基
ALT变异碱基逗号分隔多个 alt 等位基因点号表示无变异
QUAL质量值Phred-scaled quality越高越可信
FILTER过滤标记PASS / 自定义过滤标签PASS 才被后续流程信任
INFO附加信息键=值;分号分隔每个工具写的东西不同

QUAL 字段:到底多少分算「好」?

QUAL 是 Phred-scaled 质量值。公式其实很简单:

Q = -10 * log10( P(call is wrong) )

所以 QUAL = 30 意味着错误概率 0.001,也就是 99.9% 置信度。QUAL = 20 是 99%。

我在实际项目中遇到过这样的情况:QUAL 值很高,但一看比对图谱,其实是段 repeats 区域的假阳性。为什么会这样?因为 QUAL 只反映测序和比对的可信度,不保证生物学意义。

实用技巧:我个人习惯对 SNV 用 QUAL ≥ 30,对 INDEL 用 QUAL ≥ 50。INDEL 的比对置信度天然就低,阈值提高一点能筛掉很多假阳性。

FILTER 字段:PASS 不是万能钥匙

FILTER 列只有两种状态——PASS 或自定义标签。如果 caller 觉得某个位点质量不够,会写上标签名,比如 LowQual、QD<2.0、SB。多个标签用分号连接。

我曾经踩过一个坑——以为只要标记了 PASS 就一定准确。后来发现,GATK 的 VQSR 会把一些低质量位点也标成 PASS,只是概率上更可靠。所以建议:

  • 严格流程:只保留 FILTER = PASS 的行
  • 松一点:保留特定标签(比如 LowQual 但也结合 QUAL 值综合判断)
  • 从头看:不要迷信 PASS,最好看一眼元数据中每个 FILTER 标签的真实含义
避坑:某些 VCF 文件中 FILTER 列可能全是点号(.),表示「未过滤」。这时候你需要自己去看 QUAL 和 INFO 里的 VQSLOD、QD 来手动过滤。

INFO 字段:藏着变异的所有细节

INFO 是个键值对集合,每个工具往里面塞的东西五花八门。常用的公共字段包括:

键解释示例
DP该位点的总测序深度DP=80
AF等位基因频率AF=0.45
AN总等位基因数(样本数 x 2)AN=200
ACALT 等位基因计数AC=90
QD质量值/深度比值QD=3.06
FSFisher 链偏度FS=1.5
SOR链偏向性比值SOR=0.8
MQRankSumMapping Quality 秩和检验MQRankSum=0.1
ReadPosRankSum读取位置秩和检验ReadPosRankSum=-0.3

你想想看,这些字段其实涵盖了三大类信息:

  1. 深度类:DP、AD(allele depth)、PL(Phred likelihood)
  2. 频率类:AF、AC、AN
  3. 质量类:QD、FS、SOR、MQRankSum

我个人的习惯是,拿到一个 VCF 先看看 INFO 字段里有没有 QD 和 FS。如果 QD < 2.0 且 FS > 60,这个位点大概率是假阳性。这个组合判断对 WGS 数据尤其好用。

FORMAT 与样本字段:每个人的基因型

FORMAT 列定义后面每个样本的数据格式。常见格式:

标识符全称说明
GTGenotype0/0 纯合参考,0/1 杂合,1/1 纯合变异
DPRead Depth该样本在该位点的深度
GQGenotype QualityPhred 量表,值越高越可信
ADAllele DepthREF、ALT 分别的深度,如 60,20
PLPhred-scaled Genotype Likelihoods三个值对应 AA/AB/BB

举个例子:GT:GQ:AD:PL 对应的值为 0/1:85:60,20:0,85,1000。意思就是该样本是杂合子,GQ=85,REF 有 60 条 reads,ALT 有 20 条,PL 值说明 0/1 是最可能的基因型。

实用组合判断:想知道一个位点是否可靠?看三个数:GQ ≥ 20、DP ≥ 10、AD 中 ALT 支持 ≥ 3。我经常用这条规则快速扫盘。

VCF 知识结构总览

下面这张图帮你把 VCF 格式的骨架印在脑子里。从元数据到样本数据,每个部分做什么,一目了然。

VCF 文件结构总览 VCF 文件(.vcf / .vcf.gz) 元数据 ## 头 文件版本、参考基因组 字段定义、过滤器描述 列标题行 #CHROM 8 必选列 + FORMAT + 样本 数据行(每条一行) CHROM/POS/ID/REF/ALT QUAL / FILTER / INFO FORMAT + 样本列 样本基因型字段示例:GT:GQ:AD:PL 元数据定义各字段 列标题定义结构

最后想说的

VCF 格式本身不难,难的是你拿到一个 VCF 后能不能快速判断数据质量、看懂每个字段背后的生物学意义。我花了很久才形成自己的检查清单:先看 #CHROM 行确认列数,再看 FILTER 列统计 PASS 比例,最后抽几个位点看 INFO 里的 QD 和 FS。

嗯,这一章的内容希望你对 VCF 有了一个立体的认识。下个话题我们将一起动手操作 VCF 文件,包括过滤、合并、排序这些基本功。