第四章 训练集的选择:HapMap、1000G、dbSNP、Omni 的用途与坑

做VQSR这事儿,说白了就是给变异位点“打分”。但打分得有个对照标准,不能瞎评。这个标准,就是我们的训练集。很多新手一上来问我用什么训练集好,我都会反问一句:你先搞清楚你要过滤什么、期望什么质量?这东西没放之四海而皆准的答案。

我个人习惯是把训练集分成两类:第一类是高度可信的真阳性集,用来告诉模型“这些位点绝对没问题,你照着学”;第二类是丰富性集,用来增加位点数量防止过拟合。第四类还有Omni这种专门用于校正批次效应的。下面我一个个讲。

4.1 HapMap:最老牌的“黄金标准”

HapMap是我用得最多的真阳性集之一。它的核心优势只有一个:准确。HapMap的数据是通过严格的家系连锁分析验证过来的,假阳性率极低。我在做人类全基因组测序项目时,只要样本是CEU、YRI、CHB这些标准人群,HapMap 3.3版几乎是必选。你想想看,它能帮你把真阳性率从99%拉到99.5%以上。

但这里有个坑:HapMap的位点覆盖面不全。它主要抓的是常见SNV,低频和罕见变异覆盖率很差。我曾经有一次做罕见病家系数据,想用HapMap做真阳性训练集,结果覆盖率不到40%,模型直接崩了——因为它学到的位点太少,评分模型偏移到了低频区。

避坑指南:如果你做的是低频/罕见变异较多的高深度WGS项目,别只依赖HapMap。它更适合WES或标准WGS,对低频变异过滤效果会明显下降。

4.2 1000 Genomes Phase 3:覆盖面广,但质量参差不齐

1000G Phase 3,我个人觉得它是“全能选手”,但也是“搅局者”。全能是因为它包含了2500多个样本,覆盖了几乎所有的常见和中等频率变异,位点数达到8000万以上,很适合做“丰富性训练集”来增加模型的学习基数。但我记得有一次做非测序数据质量评估时,发现1000G中约2%~3%的位点是测序误差导致的假阳性,尤其是polyN区附近的indel。这直接导致模型学会了宽容假阳性——你有没有嗅到这个风险?

我处理的方案是这样:

  • 如果资源允许,把1000G同时作为truth和training双重角色使用,但truth时要按--max-num-training-variants进行截断,避免低质量位点压倒真阳性信号。
  • 与HapMap做交叉验证:我习惯先跑一个只有HapMap的初步模型,再叠加1000G丰富集,对比两阶段的VQSLOD分布是否偏移。如果偏移超过0.2,就减少1000G权重。

4.3 dbSNP:别拿它当真理源

dbSNP这个资源,我建议你只把它当“丰富性训练集”使用。为什么?dbSNP收录了几乎所有公开的变异,包括大量未经群体验证的、来自单一实验室的、甚至是人工测序假阳性。你想想,如果一个变异在dbSNP里,但它只是某篇论文的测序结果,没有任何重复验证,你能放心把它当黄金标准?

我在做NIST大中华区标准样本评估时,专门做过对比:dbSNP 150中的indel有大约8%在HapMap和1000G中找不到任何支持——这些位点八成是假的。如果把它们放进truth集,模型学到的是“indel容忍度高”,结果真实indel被放过,假indel造成大量下游问题。

个人心得:我一般只用dbSNP的“Common”和“Validation”子集做训练,避开“Unvalidated”标签。命令示例:
gatk IndexFeatureFile -I dbSNP_v151_common_validated.vcf.gz
gatk VariantRecalibrator \
   -resource:dbsnp,known=false,training=true,truth=false,prior=2.0 \
   /path/to/dbSNP_common_validated.vcf.gz

4.4 Omni:专治批次效应

Omni资源(如Omni 2.5M、Omni 5M)是我专门用于样本质控和批次校正的。它来自Illumina Omni阵列,是芯片数据,不是测序数据。什么意思?就是说Omni的位点是在芯片上验证过的,每个位点的基因型非常准确,但覆盖度低(约250万~500万位点)。

我遇到过这样的情况:两个WGS项目来自不同测序中心,合并后VQSR模型的transitions/transversion比值出现显著差异。我排查了一圈,发现是其中一个中心的indel调用了太多低质量位点。把Omni作为known资源加入模型后,模型学会了区分跨中心的批次效应,VQSLOD分布对齐了。嗯,这事让我对Omni刮目相看。

核心建议:做多批次或遗留数据合并时,Omni是必不可少的“校准器”。它的先验权重(prior)我一般设到6.0,高于HapMap的5.0。原因很简单:芯片数据本身就是金标准,不需要再怀疑。

4.5 资源选择一览

我整理了一个简表,方便你在实际项目中快速对照选择:

资源类型覆盖变异数准确度主要用途先验权重建议
HapMap真理/训练~400万极高真阳性基准集5.0
1000G训练/丰富~8000万中高,含少量假阳性丰富模型学习样本3.0~4.0
dbSNP仅仅丰富>1.5亿低(含未验证位点)防止模型过度稀疏2.0
Omni已知~300万极高批次校正/样本质控6.0

这里要强调:先验权重不是越大越好。权重大了,模型会过度信任这个资源,如果资源本身有薄弱点(比如DB距离dbsnp的低质量位点被赋高权重),模型就会出偏差。

4.6 一个SVG:训练集选择的核心流程

为了帮你理清思路,我画了张图展示四类资源在VQSR模型中的关系和选择逻辑:

VQSR训练集选择核心逻辑图 候选变异的来源 HapMap 真理 + 训练 1000G 训练 + 丰富 dbSNP 仅丰富 Omni 已知 + 校正 数据层:是否跨批次 / 是否低频 / 是否验证过? 判断依据:覆盖度要求、样本来源、先验权重 最终训练集组合方案 HapMap(truth) + 1000G(training) + Omni(known) + dbSNP(仅丰富) 根据项目需求动态调整先验权重 注意:先验权重越大,模型越信任该资源;权重太低等于没有加

4.7 一个避坑实例:当我用错了dbSNP

讲个真事儿。前年我帮某基因公司优化VQSR流程,他们一直抱怨SNV假阳性率太高,达到了5%。我看完他们的GATK命令后,发现他们同时把
dbSNP的全量vcf既作为truth,又作为training。结果模型大量学习了dbSNP中的假阳性indel,导致真实高频变异被错误过滤。调整后我只用dbSNP的“common”子集做training,truth全部切换成HapMap+1000G交叉集。效果立竿见影——假阳性率从5%降到了0.8%。嗯,同一套数据,差别就这么大。

4.8 总结一下核心操作建议

  • 必须选一个可靠的真理集:HapMap是默认,Omni是备选。没有真理集就别想VQSR。
  • 至少选一个丰富集:1000G或dbSNP都可以,用来防止模型学到的位点太少导致过拟合。
  • 检查资源的交叉覆盖:我习惯跑gatk CollectVariantCallingMetrics对比两套资源,如果交叉率低于60%,说明资源不匹配,需要调整先验权重或者换资源。
  • 不要迷信全量资源:全量dbSNP是毒药,全量1000G需要质量控制。只取已验证的子集。
一句话记忆:HapMap当师傅、1000G当教材、Omni当质检员、dbSNP当备注——分工明确,模型不崩溃。