3. VCF质量控制:深度、质量、缺失率过滤

拿到一个VCF文件,别急着往下跑分析。先做质控。

QC的目的很单纯。把不可靠的变异位点干掉。把缺失太多的样本提出来。保证下游分析的数据底子干净。

这一章,我就把VCF质控最核心的三个指标讲透——深度、质量、缺失率。顺便聊聊我在实战里踩过的坑。

3.1 为什么QC这么重要?

VCF文件包含几十亿个位点的信息。但说实话,这里面有大量“噪音”。

举个夸张的例子。一个位点测序深度只有2x,这个变异是真是假?你没法判断。再比如,一个位点质量值(Qual)只有5,基本就是背景噪音。把这些低质量位点带进后续分析,结果大概率是错的。

我觉得很多初学者容易忽视这点——他们以为VCF就是金标准。其实VCF只是原始数据的“整理版”,不是“真相”。

需要当心: 不同测序平台、不同捕获方案产生的VCF,QC阈值完全不同。全基因组和全外显子组的深度分布差异很大,不能“一阈值走天下”。

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
小技巧: 我建议先看QUAL分布,再定阈值。用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自动计算的内置统计量——缺失样本比例。省得你手动数./.了。

  1. 统计维度:位点级别(每个位点) 和 样本级别(每个样本)
  2. 常见阈值:位点F_MISSING < 0.2, 样本缺失率 < 0.1
  3. 我经历过一个极端案例:一个样本缺失率高达40%,查看后发现是DNA降解了。这种样本必须剔除。

3.5 实战流程:一个典型的QC管线

上面的三个指标单独讲是清楚的,但实际中你得一起用。下面是我常用的质控流程,你可以直接套用:

  1. 预检: 查VCF基本统计。看总位点数、样本数、变异类型。命令bcftools stats input.vcf > stats.txt
  2. 样本缺失率过滤: 剔除缺失率超过10%的坏样本。
  3. 位点缺失率过滤: 去掉F_MISSING > 0.2的位点。
  4. 深度过滤: 按样本DP<10设为缺失。
  5. 质量过滤: QUAL<30砍位点,GQ<20砍单样本基因型。
  6. 后验: 再跑一次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%的位点都能留下来,但假阳性基本都被干掉了。

VCF质量过滤决策流程 原始VCF 1. 预检 (bcftools stats) 2. 缺失率过滤 (F_MISSING) 3. 深度 & 质量过滤 (DP/GQ/QUAL) 输出QC后VCF ⚠ 注意 阈值依平台调整 WGS vs WES不同 先看分布再定

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 用于群体遗传学,剔除强烈偏离的位点
核心原则: 深度过低就砍掉。质量过低就砍掉。缺失太多就砍掉。不要舍不得。 我记得有次,一个团队的GWAS结果迟迟做不出来,最后发现就是没做GQ过滤——一堆低质量位点混了进去,信号全被噪音淹了。