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 只反映测序和比对的可信度,不保证生物学意义。
FILTER 字段:PASS 不是万能钥匙
FILTER 列只有两种状态——PASS 或自定义标签。如果 caller 觉得某个位点质量不够,会写上标签名,比如 LowQual、QD<2.0、SB。多个标签用分号连接。
我曾经踩过一个坑——以为只要标记了 PASS 就一定准确。后来发现,GATK 的 VQSR 会把一些低质量位点也标成 PASS,只是概率上更可靠。所以建议:
- 严格流程:只保留 FILTER = PASS 的行
- 松一点:保留特定标签(比如
LowQual但也结合 QUAL 值综合判断) - 从头看:不要迷信 PASS,最好看一眼元数据中每个 FILTER 标签的真实含义
INFO 字段:藏着变异的所有细节
INFO 是个键值对集合,每个工具往里面塞的东西五花八门。常用的公共字段包括:
| 键 | 解释 | 示例 |
|---|---|---|
| DP | 该位点的总测序深度 | DP=80 |
| AF | 等位基因频率 | AF=0.45 |
| AN | 总等位基因数(样本数 x 2) | AN=200 |
| AC | ALT 等位基因计数 | AC=90 |
| QD | 质量值/深度比值 | QD=3.06 |
| FS | Fisher 链偏度 | FS=1.5 |
| SOR | 链偏向性比值 | SOR=0.8 |
| MQRankSum | Mapping Quality 秩和检验 | MQRankSum=0.1 |
| ReadPosRankSum | 读取位置秩和检验 | ReadPosRankSum=-0.3 |
你想想看,这些字段其实涵盖了三大类信息:
- 深度类:DP、AD(allele depth)、PL(Phred likelihood)
- 频率类:AF、AC、AN
- 质量类:QD、FS、SOR、MQRankSum
我个人的习惯是,拿到一个 VCF 先看看 INFO 字段里有没有 QD 和 FS。如果 QD < 2.0 且 FS > 60,这个位点大概率是假阳性。这个组合判断对 WGS 数据尤其好用。
FORMAT 与样本字段:每个人的基因型
FORMAT 列定义后面每个样本的数据格式。常见格式:
| 标识符 | 全称 | 说明 |
|---|---|---|
| GT | Genotype | 0/0 纯合参考,0/1 杂合,1/1 纯合变异 |
| DP | Read Depth | 该样本在该位点的深度 |
| GQ | Genotype Quality | Phred 量表,值越高越可信 |
| AD | Allele Depth | REF、ALT 分别的深度,如 60,20 |
| PL | Phred-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 是最可能的基因型。
VCF 知识结构总览
下面这张图帮你把 VCF 格式的骨架印在脑子里。从元数据到样本数据,每个部分做什么,一目了然。
最后想说的
VCF 格式本身不难,难的是你拿到一个 VCF 后能不能快速判断数据质量、看懂每个字段背后的生物学意义。我花了很久才形成自己的检查清单:先看 #CHROM 行确认列数,再看 FILTER 列统计 PASS 比例,最后抽几个位点看 INFO 里的 QD 和 FS。
嗯,这一章的内容希望你对 VCF 有了一个立体的认识。下个话题我们将一起动手操作 VCF 文件,包括过滤、合并、排序这些基本功。