1. GVCF原理概述

大家好,欢迎来到《群体联合基因分型GVCF实战》的第一章。这一章我先带大家理解核心概念:什么是GVCF?为什么要用群体联合方式?GATK那一套流程到底怎么串起来的?

我刚开始接触这个领域时,也觉得“GVCF”不过是个中间文件格式,后来做过几个大规模群体项目后才发现,这玩意儿是整个群体遗传分析的基石。说白了,GVCF就是每个样本在每个位点的“概率快照”,而联合基因分型则是把这些快照拼成一张完整的群体“基因型地图”。

1.1 应用场景:谁需要群体联合基因分型?

你想想看,每次做几十个、几百个甚至上千个样本的WGS或WES,如果每个样本单独跑HaplotypeCaller然后直接过滤,不仅慢,而且丢失了群体中的等位基因频率信息。群体联合基因分型正好解决两个核心问题:

  • 多重检测能力:利用所有样本的read证据,检测低频率的变异,尤其是那些只有少数样本携带的稀有突变。
  • 一致性校正:用群体层面的LD信息和比对质量,重新校准每个样本的基因型概率,减少假阳性。

主要场景包括:

场景典型样本量联合分型优势
GWAS(全基因组关联研究)数百~数千统一质量过滤,提高关联统计功效
人群遗传结构分析上千精确估算等位基因频率,支持PCA/Admixture
家系/罕见病研究数十~数百发现共有稀有变异,降低假阳性
临床肿瘤panel10~100减少批次效应,提高体细胞突变检测一致性

举个例子,我在做一个人群队列项目时,200个样本单独跑VCF,然后合并过滤,结果在一个已知癌症相关基因上发现一个低频突变,但单一样本的QUAL太低被过滤掉了。后来用联合基因分型重新跑,那个位点的GQ从20直接提高到99,群体中其他样本也有部分支持reads。这才把它重新捞回来。

1.2 GATK工作流简介:从BAM到群体VCF

GATK推荐的群体联合基因分型工作流分为三个阶段:

  1. 单样本GVCF生成:使用HaplotypeCaller的GVCF模式,对每个样本输出.g.vcf.gz。
  2. 数据库构建:用GenomicsDBImport将多个GVCF导入一个分区块的GenomicsDB。
  3. 联合基因分型:用GenotypeGVCFs从数据库中读取所有样本信息,输出最终的群体VCF。

为什么要有这个中间数据库?因为直接合并几百个GVCF文件会造成巨大的内存开销。GenomicsDBImport将基因组切分成区间,每个区间独立建库,再并行调用GenotypeGVCFs,效率高得多。我个人习惯是每个染色体分成几个区间,避免单个数据库文件过大。

下面是一个典型的流程命令示例(仅供参考,具体调优后面章节会细讲):

# 第1步:单样本GVCF
gatk HaplotypeCaller \
   -R reference.fa \
   -I sample1.bam \
   -O sample1.g.vcf.gz \
   --emit-ref-confidence GVCF \
   --pcr-indel-model NONE

# 第2步:构建GenomicsDB(以chr20为例)
gatk GenomicsDBImport \
   --genomicsdb-workspace-path my_database \
   --batch-size 50 \
   -L chr20 \
   --sample-name-map sample_map.txt \
   --reader-threads 5

# 第3步:联合基因分型
gatk GenotypeGVCFs \
   -R reference.fa \
   -V gendb://my_database \
   -O cohort.chr20.vcf.gz

这里有个陷阱:--sample-name-map文件一定要与GVCF文件名一一对应,我曾经因为文件名中有一个特殊字符没转义,数据库构建到一半报错,排查了半天才发现是映射文件里的GATK版本格式变了。后面前车之鉴啊。

1.3 GVCF格式的核心:每位点的四状态概率

GVCF与普通VCF最大的区别在于,它记录了每个位点上四种基因型(RR、RA、AA、ref-ref)的似然值,还有Reference Confidence模型。这样在联合分型时,即使某个样本在位点上没有read覆盖,也能用群体先验信息推断出来。

你可以在GVCF文件中看到类似下面这样的区块(省略了部分列):

#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT sample1
chr20 104   . G   A   1000  .    ...
GT:AD:GQ:PL  0/1:30,15:99:200,0,150

注意:GVCF中还会包含非变异位点的记录(通过--emit-ref-confidence GVCF控制),这些位置在后续联合分型时会作为背景信息使用。这也是为什么联合分型能提高低深度位点准确性的原因。

1.4 为什么非要用GVCF?直接合并VCF不行吗?

我最近遇到一位同行,他坚持用bcftools merge直接合并硬过滤后的单样本VCF。这种做法在小样本集(比如5个以内)勉强能用,但一旦超过20个样本,问题就来了:

  • 每个样本的VCF只保留通过过滤的变异,低频变异被过早丢弃。
  • 合并后无法重新计算GQ和PL,只能做简单的交集/并集。
  • 无法利用群体信息校正基因型准确性。

GVCF方式保留了每个位点的原始概率证据,联合分型时再统一做过滤决策,这才是正确的做法。

核心要点:群体联合基因分型的本质是“先保留所有可能性,再统一决策”,而非“每个样本先做硬过滤再合并”。

个人小技巧:如果你项目预算有限,可以在GVCF生成阶段启用--parallelism参数,用多线程加快单样本处理。但注意不要超过服务器的物理核心数,否则会因IO竞争反而变慢。

避坑指南:曾经我在一个超大规模项目(3000例)中直接使用GenomicsDBImport,默认的batch-size=50导致内存溢出。后来我把batch-size降到20,并增加了--tmp-dir到单独的高速SSD,才顺利跑完。建议先在小样本测试集上调好参数再上生产。

1.5 本章知识体系总览

下面这个SVG图梳理了GVCF联合分型的整体流程,从输入BAM到最终的群体VCF,你可以看到数据是如何一层层汇聚的:

GVCF群体联合基因分型流程概览 输入 BAM + REF HaplotypeCaller 单样本 GVCF GenomicsDBImport GenomicsDB GenotypeGVCFs 群体 VCF 说明: HaplotypeCaller 为每个样本生成 GVCF → 所有 GVCF 导入 GenomicsDB → 最后 GenotypeGVCFs 输出群体 VCF。