第四章 训练集的选择:HapMap、1000G、dbSNP、Omni 的用途与坑
做VQSR这事儿,说白了就是给变异位点“打分”。但打分得有个对照标准,不能瞎评。这个标准,就是我们的训练集。很多新手一上来问我用什么训练集好,我都会反问一句:你先搞清楚你要过滤什么、期望什么质量?这东西没放之四海而皆准的答案。
我个人习惯是把训练集分成两类:第一类是高度可信的真阳性集,用来告诉模型“这些位点绝对没问题,你照着学”;第二类是丰富性集,用来增加位点数量防止过拟合。第四类还有Omni这种专门用于校正批次效应的。下面我一个个讲。
4.1 HapMap:最老牌的“黄金标准”
HapMap是我用得最多的真阳性集之一。它的核心优势只有一个:准确。HapMap的数据是通过严格的家系连锁分析验证过来的,假阳性率极低。我在做人类全基因组测序项目时,只要样本是CEU、YRI、CHB这些标准人群,HapMap 3.3版几乎是必选。你想想看,它能帮你把真阳性率从99%拉到99.5%以上。
但这里有个坑:HapMap的位点覆盖面不全。它主要抓的是常见SNV,低频和罕见变异覆盖率很差。我曾经有一次做罕见病家系数据,想用HapMap做真阳性训练集,结果覆盖率不到40%,模型直接崩了——因为它学到的位点太少,评分模型偏移到了低频区。
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造成大量下游问题。
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刮目相看。
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模型中的关系和选择逻辑:
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需要质量控制。只取已验证的子集。