3. VCF质量控制:深度、质量、缺失率过滤
拿到一个VCF文件,别急着往下跑分析。先做质控。
QC的目的很单纯。把不可靠的变异位点干掉。把缺失太多的样本提出来。保证下游分析的数据底子干净。
这一章,我就把VCF质控最核心的三个指标讲透——深度、质量、缺失率。顺便聊聊我在实战里踩过的坑。
3.1 为什么QC这么重要?
VCF文件包含几十亿个位点的信息。但说实话,这里面有大量“噪音”。
举个夸张的例子。一个位点测序深度只有2x,这个变异是真是假?你没法判断。再比如,一个位点质量值(Qual)只有5,基本就是背景噪音。把这些低质量位点带进后续分析,结果大概率是错的。
我觉得很多初学者容易忽视这点——他们以为VCF就是金标准。其实VCF只是原始数据的“整理版”,不是“真相”。
3.2 深度过滤:DP (Depth of Coverage)
深度是VCF质控的第一道防线。它告诉你当前位点被测了多少次。
在VCF里,每个样本的深度信息一般存在FORMAT字段的DP里,有时也出现在INFO字段的DP(位点总深度)。
我个人习惯先看样本级的DP分布。你可以用bcftools快速统计:
bcftools query -f '%CHROM\t%POS[\t%DP]\n' input.vcf | head -20
然后我一般会给一个最低深度阈值。比如全外显子组数据,我习惯设10x。如果某个样本在某个位点的DP小于10,我会认为这个位点的基因型是不可靠的。
为什么是10?我曾经过过一个项目,把阈值从8降到5,假的变异位点一下子多出来15%。之后我再也没用过5x以下的阈值。
过滤命令也很简单:
bcftools filter -e 'FMT/DP < 10' input.vcf -o filtered_dp.vcf
这里要注意,FMT/DP是对每个样本单独过滤——某个样本深度不够,就只把那个样本标为缺失,而不是删掉整个位点。你要是用INFO/DP过滤,那是直接砍掉整个位点,区别很大。
| 字段 | 含义 | 使用场景 |
|---|---|---|
| INFO/DP | 所有样本深度之和 | 位点级过滤,砍掉整体深度不足的位点 |
| FMT/DP | 单个样本的深度 | 样本级过滤,只标记低深度的样本为缺失 |
3.3 质量值过滤:QUAL和GQ
QUAL和GQ是两个容易搞混的指标。我给你讲清楚。
- QUAL:位点的变异检测置信度。越高越可靠。
- GQ:某个样本基因型叫准的置信度。样本级别。
我一般会跟个规则:QUAL用INFO字段整个位点过滤,GQ用FORMAT字段逐个样本过滤。
QUAL的过滤阈值我习惯用30,对应99.9%的准确率。但你要是用GATK的VQSR做过后处理,QUAL可能不是主要过滤指标了——VQSR会重新给质量分数。
GQ的话,全基因组数据我设20,全外显子设30。为啥不一样?因为WES的捕获效率高,深度分布比较均匀,GQ偏高的比例多,阈值可以设高一点。
过滤命令示范:
# 位点QUAL过滤
bcftools filter -e 'QUAL < 30' input.vcf -o qual_filtered.vcf
# 样本GQ过滤
bcftools filter -e 'FMT/GQ < 20' input.vcf -o gq_filtered.vcf
bcftools query -f '%QUAL\n' input.vcf | head -5000 | sort -n | tail -1可以快速了解数据质量区间。别上来就设一个固定的30——万一你数据质量普遍偏低,冤枉了一堆好位点。
3.4 缺失率过滤:MISSING RATE
缺失率是另一个容易被忽视的指标。它反映的是:在所有样本中,某个位点被成功基因型化(即不是./.或.)的比例。
为什么要关心缺失率?
如果某个位点有70%的样本都是缺失,说明这个位点本身就有问题——要么在基因组上的重复区,要么测序质量奇差。这种位点留着就是隐患。你在关联分析里加入这种位点,就是添乱。
我一般会给个阈值:缺失率≤20%,也就是至少有80%的样本覆盖到这个位点。
过滤逻辑是:先统计每个位点的缺失样本数,除总样本数,去掉超标的位点。
可以用bcftools配合awk来算:
bcftools view -e 'F_MISSING > 0.2' input.vcf -o missing_filtered.vcf
F_MISSING是bcftools自动计算的内置统计量——缺失样本比例。省得你手动数./.了。
- 统计维度:位点级别(每个位点) 和 样本级别(每个样本)
- 常见阈值:位点F_MISSING < 0.2, 样本缺失率 < 0.1
- 我经历过一个极端案例:一个样本缺失率高达40%,查看后发现是DNA降解了。这种样本必须剔除。
3.5 实战流程:一个典型的QC管线
上面的三个指标单独讲是清楚的,但实际中你得一起用。下面是我常用的质控流程,你可以直接套用:
- 预检: 查VCF基本统计。看总位点数、样本数、变异类型。命令
bcftools stats input.vcf > stats.txt - 样本缺失率过滤: 剔除缺失率超过10%的坏样本。
- 位点缺失率过滤: 去掉F_MISSING > 0.2的位点。
- 深度过滤: 按样本DP<10设为缺失。
- 质量过滤: QUAL<30砍位点,GQ<20砍单样本基因型。
- 后验: 再跑一次
bcftools stats,对比过滤前后的位点数、转换/颠换比(Ti/Tv)。
简单写成一个脚本就是:
bcftools view -e 'F_MISSING > 0.2' input.vcf | \
bcftools filter -e 'FMT/DP < 10 | FMT/GQ < 20' - | \
bcftools filter -e 'QUAL < 30' - > final_qc.vcf
这一套下来,一般80%的位点都能留下来,但假阳性基本都被干掉了。
3.6 常见QC指标速查表
最后给你一张速查表,日常做QC时对着看就行:
| 指标 | 说明 | 常见阈值 | 备注 |
|---|---|---|---|
| DP | 测序深度 | WGS: ≥8, WES: ≥10 | 深度过低 = 假阳性高 |
| QUAL | 位点质量分数 | ≥30 | VQSR后可放宽 |
| GQ | 基因型置信度 | ≥20 | 样本级过滤,建议和DP联动 |
| F_MISSING | 位点缺失率 | ≤0.2 | 高缺失率位点往往是重复区 |
| Ti/Tv | 转换/颠换比 | WGS: 2.0-2.1, WES: 2.8-3.0 | 偏离太多说明数据有问题 |
| HWE P值 | 哈代-温伯格平衡 | ≥1e-6 | 用于群体遗传学,剔除强烈偏离的位点 |