变异检测流程(GATK Best Practices)¶
1. 一句话说明¶
变异检测(Variant Calling)就是拿测序数据和参考基因组"找不同",把每个样本中发生了碱基变化的位点找出来,是从"序列数据"到"生物学发现"的关键一步。
2. 什么是变异检测¶
白话解释¶
把你的 DNA 想象成一本 30 亿字的书。测序就是把书重新抄了一遍(还抄了几十遍),比对就是把每一行抄的内容对回原书。变异检测就是:逐字对比后,找出你抄的版本和原书不一样的地方。
三类主要变异¶
| 类型 | 全称 | 白话解释 | 大小 | 例子 |
|---|---|---|---|---|
| SNP/SNV | Single Nucleotide Polymorphism/Variant | 一个字母写错了(A→G) | 1 bp | rs6025(凝血因子V突变) |
| InDel | Insertion/Deletion | 多写了几个字/少写了几个字 | 1-50 bp | BRCA1 移码突变 |
| SV | Structural Variant | 一大段内容被删除/重复/倒过来/搬到别处 | >50 bp | 唐氏综合征(21号染色体多一条) |
本文重点:SNP 和 InDel 的检测(germline short variant discovery),这是面试最常问的。
3. GATK Best Practices 完整流程¶
工具版本¶
- GATK: 4.6.2.0(2025-04-14 发布,Apache 2.0 开源)
- Picard: 已整合入 GATK4,不再需要单独安装
- 参考基因组: hg38(GRCh38)推荐使用 Broad 提供的 bundle
流程全景图¶
BAM(比对后) → MarkDuplicates → BQSR → HaplotypeCaller → GVCF
↓
GenomicsDBImport(合并多样本)
↓
GenotypeGVCFs(联合基因分型)
↓
VQSR / 硬过滤 → 最终 VCF
起点说明:本文从 BWA-MEM 比对产生的 BAM 文件开始。比对步骤详见知识库1《14_比对与组装工具》。
3.1 排序与格式转换(如未完成)¶
# 如果 BAM 未排序,先排序(通常 BWA 输出经过 samtools sort 已排好)
# -@ 8 表示用 8 个线程加速
# -o 输出文件名
samtools sort -@ 8 -o sample_sorted.bam sample.bam
# 建索引(后续所有工具都需要 .bai 索引文件)
samtools index -@ 8 sample_sorted.bam
3.2 标记重复序列(MarkDuplicates)¶
为什么要做:PCR 扩增时,同一条 DNA 片段可能被复制多次。这些"复制品"如果不标记,变异检测时会误以为某个碱基有很多 reads 支持,实则只是同一条的拷贝。
白话比喻:考试时 10 个人抄了同一个人的答案,阅卷老师不能因为"11个人都选A"就认为答案一定对——标记重复就是在卷子上标注"这10份是抄的"。
# GATK4 MarkDuplicates(已整合原 Picard 功能)
# --INPUT 输入的排序后 BAM
# --OUTPUT 输出标记重复后的 BAM
# --METRICS_FILE 重复率统计报告
# --REMOVE_DUPLICATES false 标记但不删除(保留信息)
# --CREATE_INDEX true 自动创建索引
gatk MarkDuplicates \
--INPUT sample_sorted.bam \
--OUTPUT sample_markdup.bam \
--METRICS_FILE sample_dup_metrics.txt \
--REMOVE_DUPLICATES false \
--CREATE_INDEX true
查看重复率:
# 正常重复率:WGS 10-30%,WES 10-40%
# 如果 >50%,说明文库复杂度低,数据质量有问题
grep "PERCENT_DUPLICATION" sample_dup_metrics.txt
3.3 碱基质量值重校准(BQSR)¶
为什么要做:测序仪给每个碱基打了一个质量分数(Base Quality Score),但这个分数不一定准确(可能偏高或偏低)。BQSR 利用已知变异位点(如 dbSNP)来校正这些分数,让后续变异检测更准确。
白话比喻:就像给温度计做校准——拿一个已知是 100°C 的沸水测一下,如果温度计显示 98°C,就知道它偏低 2 度,以后读数都加 2 度。
# 第一步:建立重校准模型(BaseRecalibrator)
# -R 参考基因组 FASTA
# -I 输入 BAM
# --known-sites 已知变异位点(用来排除真实变异,只看测序误差)
# 需要下载 Broad 提供的资源包(dbSNP + Mills + 1000G)
# -O 输出重校准表
gatk BaseRecalibrator \
-R ref/hg38.fa \
-I sample_markdup.bam \
--known-sites ref/dbsnp_146.hg38.vcf.gz \
--known-sites ref/Mills_and_1000G_gold_standard.indels.hg38.vcf.gz \
--known-sites ref/1000G_phase1.snps.high_confidence.hg38.vcf.gz \
-O sample_recal_data.table
# 第二步:应用重校准(ApplyBQSR)
# 把校准表应用到 BAM 文件,生成校准后的 BAM
gatk ApplyBQSR \
-R ref/hg38.fa \
-I sample_markdup.bam \
--bqsr-recal-file sample_recal_data.table \
-O sample_bqsr.bam
可选:生成校准前后对比图(验证校准效果):
# 再跑一次 BaseRecalibrator(用校准后的 BAM)
gatk BaseRecalibrator \
-R ref/hg38.fa \
-I sample_bqsr.bam \
--known-sites ref/dbsnp_146.hg38.vcf.gz \
--known-sites ref/Mills_and_1000G_gold_standard.indels.hg38.vcf.gz \
-O sample_recal_after.table
# 生成对比报告
gatk AnalyzeCovariates \
-before sample_recal_data.table \
-after sample_recal_after.table \
-plots recalibration_plots.pdf
3.4 变异检测(HaplotypeCaller)¶
核心算法:HaplotypeCaller 不是简单地"数碱基个数",而是: 1. 找到可能存在变异的活跃区域(Active Region) 2. 对该区域进行局部重组装(de novo assembly),构建候选单倍型(haplotype) 3. 用 Pair-HMM 算法计算每条 read 属于哪个单倍型的概率 4. 用贝叶斯模型确定最可能的基因型
白话比喻:不是一个字一个字对比找错别字,而是"把可疑段落重新拼了一遍",然后和原文对比,这样连插入/缺失都能准确找到。
# 单样本模式(输出 GVCF 格式,便于后续多样本联合分析)
# -R 参考基因组
# -I 校准后的 BAM
# -O 输出 GVCF(含变异位点 + 非变异位点的置信度信息)
# -ERC GVCF 启用 GVCF 模式(面试重点:为什么用 GVCF?)
# --native-pair-hmm-threads 4 Pair-HMM 计算线程数
gatk HaplotypeCaller \
-R ref/hg38.fa \
-I sample_bqsr.bam \
-O sample.g.vcf.gz \
-ERC GVCF \
--native-pair-hmm-threads 4
# 如果只分析特定区域(如外显子组),加 -L 参数
# gatk HaplotypeCaller ... -L exome_targets.bed
为什么用 GVCF 而不是直接出 VCF? - VCF 只记录变异位点,无法区分"没检测到变异"和"该位点没有数据覆盖" - GVCF 对非变异区域也记录覆盖度和置信度,多样本合并时不会丢信息 - 每个样本独立运行一次 HaplotypeCaller,后续可以随时加入新样本联合分析
3.5 合并多样本 GVCF(GenomicsDBImport)¶
适用场景:当你有多个样本(如 100 个 T2D 患者 + 100 个健康对照)需要联合分析时。
# GenomicsDBImport:把多个样本的 GVCF 导入一个 GenomicsDB 数据库
# --genomicsdb-workspace-path 数据库存储路径
# -V 每个样本的 GVCF 文件
# -L 分析区域(按染色体拆分可并行加速)
gatk GenomicsDBImport \
--genomicsdb-workspace-path cohort_db_chr1 \
-V sample1.g.vcf.gz \
-V sample2.g.vcf.gz \
-V sample3.g.vcf.gz \
-L chr1 \
--reader-threads 4
# 样本多时用 sample map 文件代替多个 -V 参数
# sample_map.txt 格式:样本名\t文件路径
# gatk GenomicsDBImport --sample-name-map sample_map.txt ...
替代方案:CombineGVCFs(样本少时可用,但样本多时效率低于 GenomicsDBImport)。
3.6 联合基因分型(GenotypeGVCFs)¶
作用:对合并后的数据进行联合基因分型,利用群体信息提高稀有变异的检测能力。
# 对 GenomicsDB 进行联合基因分型
# -V gendb:// 指向 GenomicsDBImport 创建的数据库
# -O 输出多样本联合 VCF
gatk GenotypeGVCFs \
-R ref/hg38.fa \
-V gendb://cohort_db_chr1 \
-O cohort_chr1_raw.vcf.gz
3.7 变异质量过滤¶
方案一:VQSR(变异质量分数重校准,推荐 ≥30 样本)¶
原理:用机器学习(高斯混合模型)从已知真阳性变异中学习"好变异长什么样",然后给每个变异打分。
要求:样本量 ≥30(最好 ≥100),否则训练集太小模型不准。
# 第一步:对 SNP 建立 VQSR 模型
# -V 原始 VCF
# --resource 训练资源(truth=true 表示高置信真阳性集)
# -an 用于训练的注释特征
# --mode SNP 只处理 SNP
# -O 输出重校准文件
# --tranches-file 输出灵敏度梯度文件
gatk VariantRecalibrator \
-R ref/hg38.fa \
-V cohort_raw.vcf.gz \
--resource:hapmap,known=false,training=true,truth=true,prior=15.0 hapmap_3.3.hg38.vcf.gz \
--resource:omni,known=false,training=true,truth=false,prior=12.0 1000G_omni2.5.hg38.vcf.gz \
--resource:1000G,known=false,training=true,truth=false,prior=10.0 1000G_phase1.snps.hg38.vcf.gz \
--resource:dbsnp,known=true,training=false,truth=false,prior=2.0 dbsnp_146.hg38.vcf.gz \
-an QD -an MQRankSum -an ReadPosRankSum -an FS -an MQ -an SOR \
--mode SNP \
-O cohort_snp.recal \
--tranches-file cohort_snp.tranches
# 第二步:应用 VQSR 过滤
# --truth-sensitivity-filter-level 99.5 保留 99.5% 的真阳性
gatk ApplyVQSR \
-R ref/hg38.fa \
-V cohort_raw.vcf.gz \
-O cohort_snp_filtered.vcf.gz \
--recal-file cohort_snp.recal \
--tranches-file cohort_snp.tranches \
--truth-sensitivity-filter-level 99.5 \
--mode SNP
# 第三步:对 InDel 重复上述步骤(使用不同参数和资源)
gatk VariantRecalibrator \
-R ref/hg38.fa \
-V cohort_snp_filtered.vcf.gz \
--resource:mills,known=false,training=true,truth=true,prior=12.0 Mills_and_1000G.hg38.vcf.gz \
--resource:dbsnp,known=true,training=false,truth=false,prior=2.0 dbsnp_146.hg38.vcf.gz \
-an QD -an ReadPosRankSum -an FS -an SOR \
--mode INDEL \
--max-gaussians 4 \
-O cohort_indel.recal \
--tranches-file cohort_indel.tranches
gatk ApplyVQSR \
-R ref/hg38.fa \
-V cohort_snp_filtered.vcf.gz \
-O cohort_final_filtered.vcf.gz \
--recal-file cohort_indel.recal \
--tranches-file cohort_indel.tranches \
--truth-sensitivity-filter-level 99.0 \
--mode INDEL
方案二:硬过滤(Hard Filtering,适合样本量少或非模式生物)¶
适用场景:样本 <30 个、非人类物种、外显子组等 VQSR 训练不充分的情况。
# 先把 SNP 和 InDel 分开
gatk SelectVariants \
-V cohort_raw.vcf.gz \
--select-type-to-include SNP \
-O cohort_raw_snps.vcf.gz
gatk SelectVariants \
-V cohort_raw.vcf.gz \
--select-type-to-include INDEL \
-O cohort_raw_indels.vcf.gz
# SNP 硬过滤(GATK 推荐阈值)
# QD < 2.0 质量除以深度,过低说明支持变异的证据不够
# FS > 60.0 Fisher链偏差,过高说明变异只出现在一条链上
# MQ < 40.0 比对质量均值,过低说明reads比对不可靠
# MQRankSum < -12.5 参考/变异allele比对质量差异
# ReadPosRankSum < -8.0 变异出现在read的位置偏向末端(测序误差高)
# SOR > 3.0 链偏差的另一个指标
gatk VariantFiltration \
-V cohort_raw_snps.vcf.gz \
--filter-expression "QD < 2.0" --filter-name "LowQD" \
--filter-expression "FS > 60.0" --filter-name "HighFS" \
--filter-expression "MQ < 40.0" --filter-name "LowMQ" \
--filter-expression "MQRankSum < -12.5" --filter-name "LowMQRankSum" \
--filter-expression "ReadPosRankSum < -8.0" --filter-name "LowReadPosRankSum" \
--filter-expression "SOR > 3.0" --filter-name "HighSOR" \
-O cohort_filtered_snps.vcf.gz
# InDel 硬过滤(阈值和 SNP 不同)
gatk VariantFiltration \
-V cohort_raw_indels.vcf.gz \
--filter-expression "QD < 2.0" --filter-name "LowQD" \
--filter-expression "FS > 200.0" --filter-name "HighFS" \
--filter-expression "ReadPosRankSum < -20.0" --filter-name "LowReadPosRankSum" \
--filter-expression "SOR > 10.0" --filter-name "HighSOR" \
-O cohort_filtered_indels.vcf.gz
4. bcftools 变异检测(对比方案)¶
bcftools(当前版本 1.23.1,2026-03-18)是 samtools 生态的一部分,采用不同的统计模型。
与 GATK 的对比¶
| 特点 | GATK HaplotypeCaller | bcftools mpileup+call |
|---|---|---|
| 算法 | 局部重组装 + Pair-HMM | 基于 pileup 的贝叶斯模型 |
| InDel 检测 | 强(重组装优势) | 较弱 |
| 速度 | 慢(单样本 WGS ~24h) | 快(~2-4h) |
| 内存 | 高(4-8 GB) | 低(1-2 GB) |
| 适用场景 | 临床/精确检测 | 快速筛查/非模式生物 |
| 学习曲线 | 复杂(多步骤) | 简单 |
bcftools 完整流程¶
# 第一步:生成 pileup 并计算基因型似然值
# mpileup 逐位点统计每个碱基的支持reads数
# -f 参考基因组
# -q 20 最低比对质量(过滤比对差的reads)
# -Q 20 最低碱基质量
# --threads 8 多线程
# -a "FORMAT/AD,FORMAT/DP" 输出等位基因深度和总深度
bcftools mpileup \
-f ref/hg38.fa \
-q 20 -Q 20 \
--threads 8 \
-a "FORMAT/AD,FORMAT/DP,FORMAT/ADF,FORMAT/ADR" \
sample_bqsr.bam | \
# 第二步:变异调用
# call 基于似然值判断基因型
# -m 使用多等位基因调用模型(推荐,替代旧的 -c 模型)
# -v 只输出变异位点(不输出非变异位点)
# --ploidy 2 二倍体
# -Oz 输出 gzip 压缩的 VCF
bcftools call \
-m -v \
--ploidy 2 \
--threads 8 \
-Oz -o sample_bcftools_raw.vcf.gz
# 第三步:基础过滤
bcftools filter \
-i 'QUAL>=30 && DP>=10 && DP<=200 && MQ>=40' \
-Oz -o sample_bcftools_filtered.vcf.gz \
sample_bcftools_raw.vcf.gz
# 建索引
bcftools index sample_bcftools_filtered.vcf.gz
面试说法:GATK 是"精雕细琢",bcftools 是"快刀斩乱麻"。临床和发表论文首选 GATK;快速预览数据或资源有限时用 bcftools。很多流程用两者取交集来提高准确度。
5. DeepVariant(AI 变异检测)¶
本节专注于 DeepVariant 的变异检测实操,与知识库2《20_AI与生信交叉》中介绍的 AI 在生信中的通用应用场景互补不重复。
DeepVariant(当前版本 1.10.0,2026-03-05)是 Google 开发的基于深度学习(CNN 卷积神经网络)的变异检测工具。
核心原理¶
- 把 BAM 文件中每个候选位点的 reads 堆叠图转化为图像(类似 IGV 截图)
- 用训练好的 CNN 模型对图像进行"分类":纯合变异 / 杂合变异 / 非变异
- 输出标准 VCF 格式
白话比喻:传统方法是用数学公式算概率,DeepVariant 是"看图说话"——让 AI 像人类看 IGV 一样判断变异。
使用方法(Docker,推荐)¶
# 拉取 DeepVariant Docker 镜像
docker pull google/deepvariant:1.10.0
# 运行 DeepVariant(一条命令完成全部流程)
# --model_type WGS/WES/PACBIO/ONT(根据数据类型选择)
# --ref 参考基因组
# --reads 输入 BAM(需经过排序和建索引)
# --output_vcf 输出 VCF
# --output_gvcf 输出 GVCF(可选)
# --num_shards 并行数(=CPU核心数)
docker run -v "$(pwd):/input" -v "$(pwd)/output:/output" \
google/deepvariant:1.10.0 \
/opt/deepvariant/bin/run_deepvariant \
--model_type=WGS \
--ref=/input/ref/hg38.fa \
--reads=/input/sample_bqsr.bam \
--output_vcf=/output/sample_deepvariant.vcf.gz \
--output_gvcf=/output/sample_deepvariant.g.vcf.gz \
--num_shards=16
GATK vs DeepVariant 对比¶
| 维度 | GATK HaplotypeCaller | DeepVariant |
|---|---|---|
| 方法 | 统计模型(贝叶斯) | 深度学习(CNN) |
| SNP 准确率 | 高(F1 ~99.7%) | 略高(F1 ~99.8%) |
| InDel 准确率 | 高 | 更高(图像识别优势) |
| 三代数据 | 支持有限 | 原生支持 PacBio/ONT |
| 可解释性 | 强(可查看统计量) | 弱(黑箱模型) |
| 自定义过滤 | VQSR/硬过滤 | 模型内置质量评估 |
| GVCF 支持 | 原生支持 | 支持 |
实际建议:重要项目两种方法都跑,取交集或并集。PrecisionFDA Truth Challenge 中 DeepVariant 多次排名第一。
6. VCF 文件过滤策略¶
核心过滤指标详解¶
| 指标 | 含义 | SNP 阈值 | InDel 阈值 | 白话解释 |
|---|---|---|---|---|
| QUAL | 变异存在的置信度(Phred 值) | ≥30 | ≥30 | QUAL=30 表示 99.9% 概率是真变异 |
| DP | 位点总覆盖深度 | 10-200 | 10-200 | 太低=看不清,太高=可能是重复区域 |
| QD | QUAL÷DP(标准化质量) | ≥2.0 | ≥2.0 | 消除深度对质量的影响 |
| FS | Fisher 链偏差检验 | <60 | <200 | 真变异应该正反链都能看到 |
| SOR | Strand Odds Ratio | <3.0 | <10.0 | 比 FS 更适合高深度数据 |
| MQ | 平均比对质量 | ≥40 | - | 比对质量低说明 reads 可能比错了位置 |
| MQRankSum | 变异/参考 allele 比对质量差 | >-12.5 | - | 差异太大说明变异 reads 质量可疑 |
| ReadPosRankSum | 变异在 read 上的位置 | >-8.0 | >-20.0 | 变异集中在 read 末端=测序误差 |
| AD | 各 allele 的深度 | - | - | 用于计算 VAF |
| GQ | 基因型质量 | ≥20 | ≥20 | 基因型判断的置信度 |
bcftools 过滤实战¶
# 综合过滤:质量 + 深度 + 链偏差 + 缺失率
bcftools filter \
-i 'QUAL>=30 && INFO/DP>=10 && INFO/DP<=500 && MQ>=40' \
-Oz -o step1.vcf.gz input.vcf.gz
# 按样本级别过滤(GQ 和 DP)
bcftools filter \
-i 'FMT/GQ>=20 && FMT/DP>=8' \
-S . \
-Oz -o step2.vcf.gz step1.vcf.gz
# 过滤缺失率(>20% 样本缺失的位点去掉)
bcftools view \
-i 'F_MISSING < 0.2' \
-Oz -o final.vcf.gz step2.vcf.gz
# 统计过滤前后变异数量
bcftools stats input.vcf.gz | grep "^SN"
bcftools stats final.vcf.gz | grep "^SN"
7. 变异注释工具¶
变异检测只告诉你"哪里变了",注释告诉你"变了有什么影响"。
三大工具对比¶
| 工具 | 版本 | 速度 | 数据库 | 优点 | 缺点 |
|---|---|---|---|---|---|
| ANNOVAR | 2020-06-07 | 快 | 本地下载 | 简单直观,临床常用 | 商业使用需授权,更新慢 |
| SnpEff | v5.4c | 很快 | 内置 | 一条命令搞定,Java 跨平台 | 注释粒度不如 VEP |
| VEP | release/115.2 | 中等 | Ensembl | 最全面,插件丰富 | 安装复杂,依赖 Perl |
ANNOVAR 示例¶
# 第一步:VCF 转 ANNOVAR 输入格式
# convert2annovar.pl 是 ANNOVAR 的格式转换脚本
convert2annovar.pl -format vcf4 input.vcf > input.avinput
# 第二步:基因注释 + 数据库注释
# table_annovar.pl 一条命令完成多数据库注释
# -buildver hg38 参考基因组版本
# -protocol 注释数据库列表
# refGene 基因区域注释(外显子/内含子/UTR)
# gnomad41_genome 人群频率(gnomAD v4.1)
# clinvar_20240917 临床意义(致病/良性/意义不明)
# dbnsfp47a 功能预测分数(SIFT/PolyPhen2/CADD等)
# -operation 每个数据库对应的注释类型(g=基因,f=过滤)
table_annovar.pl input.avinput humandb/ \
-buildver hg38 \
-out sample_annotated \
-protocol refGene,gnomad41_genome,clinvar_20240917,dbnsfp47a \
-operation g,f,f,f \
-nastring . \
-csvout
SnpEff 示例¶
# 一条命令完成注释(速度最快)
# GRCh38.p14 是预构建的人类基因组数据库
# -v 详细输出
# -stats 生成 HTML 统计报告
java -Xmx8g -jar snpEff.jar \
-v GRCh38.p14 \
-stats snpeff_report.html \
input.vcf.gz > annotated.vcf
# 常见输出字段解读:
# missense_variant 错义突变(氨基酸改变)
# synonymous_variant 同义突变(氨基酸不变)
# frameshift_variant 移码突变(InDel导致阅读框改变,通常有害)
# stop_gained 无义突变(提前出现终止密码子)
# splice_region_variant 剪接区域变异
VEP 示例¶
# Ensembl VEP(功能最全面)
# --cache 使用本地缓存(需提前下载)
# --assembly GRCh38 指定基因组版本
# --everything 输出所有可用注释
# --vcf 输出 VCF 格式
# --plugin CADD 加载 CADD 评分插件(预测有害性)
vep --input_file input.vcf.gz \
--output_file annotated_vep.vcf \
--cache \
--assembly GRCh38 \
--everything \
--vcf \
--plugin CADD,whole_genome_SNVs.tsv.gz \
--fork 8
8. 面试怎么答¶
Q1:请描述 GATK Best Practices 的 germline variant calling 流程¶
参考回答:
流程分为数据预处理和变异发现两大阶段。预处理包括:(1) BWA-MEM 比对得到 BAM;(2) MarkDuplicates 标记 PCR 重复;(3) BQSR 校准碱基质量值。变异发现包括:(4) HaplotypeCaller 以 GVCF 模式逐样本检测变异;(5) GenomicsDBImport 合并多样本 GVCF;(6) GenotypeGVCFs 联合基因分型;(7) VQSR 或硬过滤去除假阳性。GATK4 已将 Picard 功能整合,全程用 gatk 命令即可完成。
Q2:为什么要做 BQSR?跳过会怎样?¶
参考回答:
测序仪报告的碱基质量值存在系统性偏差(如某些测序周期、特定碱基组合的质量被高估或低估)。BQSR 利用 dbSNP 等已知变异作为"真值",建立误差模型进行校正。跳过 BQSR 会导致变异检测时的质量分数不准确,使得下游过滤阈值失效——可能漏掉真变异或保留假阳性。对于非模式生物(没有已知变异数据库),可以先不做 BQSR 跑一轮变异检测,用高置信变异集作为已知位点再做 BQSR(bootstrap 策略)。
Q3:GVCF 模式和普通 VCF 模式有什么区别?什么时候用 GVCF?¶
参考回答:
普通模式只输出有变异的位点,GVCF 模式额外记录非变异区域的覆盖度和置信度(用 <NON_REF> allele 和 reference confidence block 表示)。GVCF 的优势是:(1) 支持增量式多样本分析——新增样本时只需重新合并和基因分型,无需重跑 HaplotypeCaller;(2) 能区分"该位点是纯合参考"和"该位点没有数据覆盖"。任何需要多样本联合分析的项目都应该用 GVCF 模式。
Q4:VQSR 和硬过滤怎么选?各自的原理是什么?¶
参考回答:
VQSR 用高斯混合模型从 HapMap、1000G 等已知真阳性集中学习"好变异"的特征分布,给每个变异打一个质量分数(VQSLOD),再按灵敏度阈值过滤。它是数据驱动的,能自适应不同数据集。但 VQSR 要求样本量 ≥30 且需要物种特异性训练资源。
硬过滤是人工设定固定阈值(如 QD<2、FS>60 等),适用于小样本、非模式生物或外显子组数据。缺点是阈值不能自适应,可能在不同数据集上需要调整。
选择标准:人类 WGS ≥30 样本用 VQSR;其他情况用硬过滤。
Q5:DeepVariant 和 GATK 的原理有什么不同?各有什么优势?¶
参考回答:
GATK HaplotypeCaller 是基于统计模型的方法——对活跃区域局部重组装,用 Pair-HMM 计算 reads 的似然值,再用贝叶斯推断基因型。DeepVariant 是基于深度学习的方法——把每个候选位点的 reads 堆叠信息编码为图像(类似 IGV 截图),用卷积神经网络做三分类(纯合变异/杂合变异/非变异)。
GATK 优势:可解释性强、有成熟的多样本联合分析流程(GVCF→GenomicsDB→Joint Calling)、社区资源丰富。DeepVariant 优势:InDel 检测更准确、对三代测序数据(PacBio/ONT)支持更好、无需手动设定过滤阈值。实际项目中建议两者都跑取交集或并集以提高准确度。
9. 速查表¶
GATK 核心命令速查¶
| 步骤 | 命令 | 输入 | 输出 |
|---|---|---|---|
| 标记重复 | gatk MarkDuplicates | sorted.bam | markdup.bam |
| BQSR-建表 | gatk BaseRecalibrator | markdup.bam + known sites | recal.table |
| BQSR-应用 | gatk ApplyBQSR | markdup.bam + recal.table | bqsr.bam |
| 变异检测 | gatk HaplotypeCaller -ERC GVCF | bqsr.bam | sample.g.vcf.gz |
| GVCF合并 | gatk GenomicsDBImport | 多个 g.vcf.gz | GenomicsDB |
| 联合分型 | gatk GenotypeGVCFs | GenomicsDB | cohort_raw.vcf.gz |
| VQSR-建模 | gatk VariantRecalibrator | raw.vcf + resources | recal + tranches |
| VQSR-应用 | gatk ApplyVQSR | raw.vcf + recal | filtered.vcf.gz |
| 硬过滤 | gatk VariantFiltration | raw.vcf | filtered.vcf.gz |
硬过滤阈值速查¶
| 指标 | SNP 过滤条件 | InDel 过滤条件 |
|---|---|---|
| QD | < 2.0 | < 2.0 |
| FS | > 60.0 | > 200.0 |
| SOR | > 3.0 | > 10.0 |
| MQ | < 40.0 | - |
| MQRankSum | < -12.5 | - |
| ReadPosRankSum | < -8.0 | < -20.0 |
变异注释工具速查¶
| 工具 | 安装方式 | 核心命令 |
|---|---|---|
| ANNOVAR | 官网下载 | table_annovar.pl input.avinput humandb/ -buildver hg38 -protocol refGene,gnomad... |
| SnpEff | conda install snpeff | java -jar snpEff.jar GRCh38.p14 input.vcf |
| VEP | conda install ensembl-vep | vep --input_file in.vcf --cache --everything |
文件格式速查¶
| 格式 | 说明 | 查看命令 |
|---|---|---|
| BAM | 比对结果(二进制) | samtools view -h sample.bam \| less |
| VCF | 变异位点记录 | bcftools view sample.vcf.gz \| less |
| GVCF | 含非变异区域的 VCF | zcat sample.g.vcf.gz \| grep -v "^#" \| head |
| .table | BQSR 校准表 | cat recal.table |
| .recal | VQSR 模型文件 | GATK 内部格式 |
10. 延伸资源¶
官方文档¶
- GATK Best Practices: https://gatk.broadinstitute.org/hc/en-us/sections/360007226651
- GATK GitHub: https://github.com/broadinstitute/gatk
- DeepVariant GitHub: https://github.com/google/deepvariant
- bcftools 文档: https://samtools.github.io/bcftools/
参考数据下载¶
- Broad Resource Bundle (hg38): https://console.cloud.google.com/storage/browser/genomics-public-data/resources/broad/hg38/v0
- dbSNP: https://ftp.ncbi.nih.gov/snp/latest_release/VCF/
学习资源¶
- GATK 官方教程(含练习数据): https://gatk.broadinstitute.org/hc/en-us/articles/360035889771
- PrecisionFDA Truth Challenge: https://precision.fda.gov/challenges
- VCF 格式规范: https://samtools.github.io/hts-specs/VCFv4.3.pdf
版本信息(本文撰写时)¶
- GATK: 4.6.2.0 (2025-04-14)
- DeepVariant: 1.10.0 (2026-03-05)
- bcftools: 1.23.1 (2026-03-18)
- SnpEff: v5.4c
- VEP: release/115.2 (2025-09-26)
与其他知识库文档的关系: - 比对步骤 → 知识库1《14_比对与组装工具》 - AI 在生信中的通用应用 → 知识库2《20_AI与生信交叉》(本文 DeepVariant 部分专注于变异检测实操,不重复介绍通用 AI 概念) - 宏基因组方向的变异 → 知识库2《14_宏基因组binning与MAGs提取》(宏基因组更关注菌群层面,本文聚焦人类基因组 germline 变异检测)