第一讲:VCF文件格式解析——结构、字段与元数据行

大家好,我是老赵。今天我们正式开始《多批次VCF一致性分析实战》。

先聊点实在的。你在生信分析中肯定见过VCF文件,对吧?

但你真的「读」懂过它吗?

我见过太多人直接把VCF当成一个「带坐标的变异列表」,然后就开始跑分析工具。结果后面比对结果、做一致性分析时,发现样本名匹配不上、字段含义搞混、元数据行被忽略…最后整个分析结论都得重来。

所以第一讲,我们先啃VCF这块「硬骨头」。你把它彻底搞懂了,后面30章的实战才有根。

1.1 VCF到底是什么?

VCF全称 Variant Call Format。说白了,就是记录样本在基因组上「哪里发生了变异」,以及「变异的具体细节」。它由国际基因组样本联盟(1000 Genomes Project)推广,现在已经是生信界的标准了。

为什么重要?因为所有变异位点信息——SNV、Indel、结构变异、基因型——都可以塞进这个文本文件里。你想从多个批次中找出「同一个样本的同一块变异」,必须先把VCF的结构理清。

核心观点:VCF文件 = 元数据部分(以##开头)+ 数据部分(表头行 + 数据行)。
元数据行不是注释,是「字典」。数据行不是表格,是「记录集」。

1.2 元数据行(Meta-information lines)

先看第1行:

##fileformat=VCFv4.2

这行告诉你当前文件使用的VCF版本。我自己的习惯是遇到VCF文件,先看这一行。4.0和4.2在某些字段定义上有细微差别,不注意就会掉坑。

然后就是大量的 ##INFO、##FORMAT、##FILTER 等定义行。举个例子:

##INFO=
##FORMAT=
##FILTER=
##contig=

很多人觉得元数据行「无关紧要」,直接跳过。我曾经犯过这个错误——有一次批处理时发现样本名始终对不上,结果回看才是 ##SAMPLE 元数据行里把样本ID写错了。从那以后,我每个VCF都要检查元数据行。

小技巧:批量处理前,先跑一行命令提取所有元数据行:
grep '^##' input.vcf | head -20
这样一秒就能看清文件使用的reference、样本名、以及所有自定义标签。

1.3 数据行(Data lines)

数据行以 #CHROM 开头的表头行作为分界。表头行格式如下:

#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT sample1 sample2

记住每一列的位置,后面的一致性比对就是基于这些列做键值匹配。

一条典型的数据行:

chr1    1000    rs12345    A    G    50.0    PASS    DP=100;AF=0.5    GT:DP:GQ    0/1:50:99    1/1:49:99

从第10列开始,就是样本列。每个样本列是一个「字段名=值」的组合,字段名由FORMAT字段定义。

嗯,这里要留意一个细节:FORMAT列里定义的标签顺序,直接对应后面样本列中值的顺序。一旦标签顺序写错了、多了一个,整个样本的基因型就解析错误。我见过有人手动编辑VCF样本列,结果顺序搞反,导致后面做一致性分析时全乱了。

避坑指南:千万不要手动修改VCF的样本列!如果非要改,用bcftools或picard工具来操作。我曾经手工改了,结果一个分号位置不对,整行数据解析失败,白白多查了一天。

1.4 关键字段说明

列名 含义 典型值 我的备注
CHROM 染色体名称 chr1, 1, NC_000001.11 不同批次可能用不同命名约定
POS 变异在染色体上的起始位置 1000 基准从1开始
ID 变异标识符(通常dbSNP ID) rs12345, . 如果是点,表示无rs号
REF 参考等位基因 A, C, AT 对InDel需要小心
ALT 替代等位基因 G, T, *, <DEL> 多等位用逗号分隔
QUAL 质量值(Phred评分) 50.0 30以上通常可信任
FILTER 过滤状态 PASS, LowQual, . 如果是点表示未过滤
INFO 变异级别信息(键=值对) DP=100;AF=0.5 关键信息的仓库
FORMAT 样本字段定义 GT:DP:GQ 多字段用冒号隔开
样本列 每个样本的基因型/深度等 0/1:50:99 与FORMAT列一一对应

我刚开始接触生物信息学时,花了很长时间去理解INFO和FORMAT的差异。其实一句话就能说清:INFO是变异级别的属性(对所有样本都适用),FORMAT是样本级别的属性(每个样本不同)。你想想看,这个区别非常重要——在做多批次一致性分析时,你要选对字段做比较,否则分析就偏了。

1.5 基因型(GT)字段深度解析

GT(Genotype)是所有样本字段中最核心的一个。它用「/」或「|」分隔两个数字,表示父源和母源的等位基因。

举个例子:

  • 0/0:纯合参考(没有变异)
  • 0/1:杂合(一个参考,一个变异)
  • 1/1:纯合变异
  • 1/2:两个不同的变异等位基因
  • ./.:缺失,表示没有检测到基因型

在实际项目中,./. 的样本列很容易被忽略。我记得有一次做三个批次的一致性分析,一个样本在第一批次是 0/1,在第二批次是 ./.。如果我不在意这个缺失值,直接把它当成「未变异」来处理,结论就完全反了。

提醒:做一致性分析时,建议先统计每个样本在每个位点的缺失率。如果某样本有大量 ./.,先排查测序深度或比对质量问题。

1.6 本章知识体系图

为了方便你记住VCF的核心结构,我画了一张框架图。你看完应该能建立起整体认知。

VCF文件结构体系 元数据行 (##) 数据行 (无##) ##INFO / ##FORMAT / ##FILTER ##contig / ##SAMPLE / ##reference 自定义元数据行 #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT 列 + 样本列1...样本列N 基因型(GT)、深度(DP)、质量(GQ)等 元数据行定义结构,数据行承载内容 二者缺一不可

1.7 实操小练习

光看不够,我建议你动手。随便找一个手上的VCF文件,打开看看:

less yourfile.vcf

先看前10行(元数据),再看表头行。然后数一数样本列有多少个,FORMAT列里定义了哪些标签。如果能把元数据行中的 ##contig、##INFO、##FORMAT 都理解一遍,你对VCF的「骨架」就有了把握。

我的建议:养成习惯——每次拿到新的VCF数据集,先做三步检查:
1. 看版本号(第1行)
2. 看样本名(表头行第10列以后)
3. 看FORMAT字段(至少确认GT和DP两个存在)
做完这三步,再往下读数据。

这一讲的内容就到这里。记住VCF的结构,后面我们做多批次比对、合并、差异分析时,才能游刃有余。