跳转至

SnpEff变异注释(SnpEff/SnpSift/ANNOVAR/VEP变异功能注释与过滤)

一句话概述

变异功能注释是利用SnpEff、SnpSift、ANNOVAR、VEP等工具,对VCF格式的基因组变异(SNP/InDel/SV)进行系统性的功能预测和注释,包括变异对基因/转录本的影响(同义/错义/无义/移码等)、致病性预测(SIFT/PolyPhen2/CADD)、人群频率标注(gnomAD)和临床意义注释(ClinVar),是变异解读和临床基因组学的关键步骤。


核心知识点表格

知识点说明
SnpEffJava编写的变异功能效应注释工具
SnpSiftSnpEff的伴侣工具,用于VCF过滤和数据库注释
ANNOVAR综合性变异注释工具,支持多数据库
VEPEnsembl Variant Effect Predictor,Ensembl官方注释工具
VCFVariant Call Format,变异调用标准格式
同义突变Synonymous,氨基酸不变
错义突变Missense,氨基酸改变
无义突变Nonsense/Stop-gain,产生提前终止密码子
移码突变Frameshift,插入或缺失导致阅读框偏移
SIFT基于序列保守性的致病性预测
PolyPhen-2基于结构和保守性的致病性预测
CADDCombined Annotation Dependent Depletion,综合致病性评分
gnomAD人群等位基因频率数据库
ClinVarNCBI临床意义变异数据库

各步骤详解

第一步:变异注释基本概念

白话解释: 通过WGS/WES测序和变异检测(GATK HaplotypeCaller等),我们找到了成千上万个变异位点。但大多数变异是"无害"的——人群中很常见、不影响蛋白功能。变异注释就是给每个变异"贴标签":它在基因的什么位置?会不会改变蛋白质?改变后有没有危害?在正常人群中常不常见?临床上有没有报道过?

技术细节:

变异功能效应分类(Impact层级):

Impact效应类型例子
HIGH高影响移码(frameshift)、无义(stop_gain)、剪接位点(splice_donor/acceptor)
MODERATE中等影响错义(missense)、框内插入/缺失(inframe_indel)
LOW低影响同义(synonymous)、剪接区域(splice_region)
MODIFIER修饰内含子(intron)、基因间区(intergenic)、UTR

注释信息来源: 1. 基因注释:变异在基因组上的位置(外显子/内含子/UTR/基因间) 2. 蛋白质效应:氨基酸变化及其功能预测 3. 人群频率:在各人群中的等位基因频率 4. 致病性预测:计算工具对功能影响的预测 5. 临床数据库:ClinVar、HGMD等临床变异数据库 6. 保守性评分:跨物种保守性(PhyloP, GERP++)

第二步:SnpEff变异注释

白话解释: SnpEff是最常用的变异效应注释工具——给它一个VCF文件,它会告诉你每个变异会对蛋白质产生什么影响(如从甘氨酸变成了丝氨酸),这个影响有多严重(高/中/低影响),以及涉及哪个基因和转录本。

# ===== SnpEff安装 =====
conda install -c bioconda snpeff snpsift

# 或手动安装
wget https://snpeff.blob.core.windows.net/versions/snpEff_latest_core.zip
unzip snpEff_latest_core.zip

# ===== 下载注释数据库 =====
# 查看可用数据库
snpEff databases | grep "GRCh38"

# 下载人类GRCh38数据库
snpEff download -v GRCh38.105

# ===== 运行SnpEff注释 =====
snpEff ann \
  -v \
  GRCh38.105 \
  input_variants.vcf.gz \
  > annotated.vcf

# 带统计报告
snpEff ann \
  -v \
  -stats snpeff_stats.html \
  -csvStats snpeff_stats.csv \
  GRCh38.105 \
  input_variants.vcf.gz | \
  bgzip > annotated.vcf.gz
tabix -p vcf annotated.vcf.gz

# ===== 高级参数 =====
snpEff ann \
  -v \
  -canon \                    # 只注释canonical转录本
  -nodownstream \             # 不注释下游区域
  -noUpstream \               # 不注释上游区域
  -noIntergenic \             # 不注释基因间区
  -no-intron \                # 不注释内含子
  -noLog \
  -lof \                      # 预测Loss of Function
  -hgvs \                     # 使用HGVS命名法
  GRCh38.105 \
  input.vcf.gz > annotated.vcf

# ===== 查看注释结果 =====
# SnpEff在VCF的INFO字段添加ANN注释
# 格式:ANN=Allele|Annotation|Impact|Gene_Name|Gene_ID|Feature_Type|Feature_ID|Transcript_BioType|Rank|HGVS.c|HGVS.p|cDNA.pos/cDNA.length|CDS.pos/CDS.length|AA.pos/AA.length|Distance|ERRORS_WARNINGS_INFO

# 示例:
# ANN=T|missense_variant|MODERATE|BRCA1|ENSG00000012048|transcript|ENST00000357654.9|protein_coding|10/23|c.1129G>A|p.Gly377Ser|1234/5592|1129/5451|377/1817||

# 查看HTML报告
# 包含变异效应统计、各类变异数量、Ts/Tv比率等

第三步:SnpSift数据库注释与过滤

白话解释: SnpEff告诉你变异"做了什么"(效应),SnpSift则帮你查数据库——这个变异在正常人群中多常见?ClinVar说它致不致病?SIFT/PolyPhen2预测它有害吗?然后SnpSift还能帮你过滤——只保留你感兴趣的变异。

# ===== SnpSift数据库注释 =====

# 1. dbSNP注释(添加rsID)
snpSift annotate \
  -v \
  dbSnp156.vcf.gz \
  annotated.vcf.gz > annotated_dbsnp.vcf

# 2. ClinVar注释
snpSift annotate \
  -v \
  -info CLNSIG,CLNDN,CLNREVSTAT \
  clinvar.vcf.gz \
  annotated_dbsnp.vcf > annotated_clinvar.vcf

# 3. dbNSFP注释(包含SIFT, PolyPhen2, CADD等多种预测)
# 下载dbNSFP(4.x系列最新为4.9a,5.x系列最新为5.3)
# 下载地址参见 https://sites.google.com/site/jpopgen/dbNSFP 或 https://www.dbnsfp.org/
wget https://dbnsfp.s3.amazonaws.com/dbNSFP4.9a.zip
# 准备dbNSFP for SnpSift
zcat dbNSFP4.9a_variant.chr*.gz | \
  awk 'NR==1 || $1!="#"' | bgzip > dbNSFP4.9a.txt.gz
tabix -s 1 -b 2 -e 2 dbNSFP4.9a.txt.gz

snpSift dbnsfp \
  -v \
  -db dbNSFP4.9a.txt.gz \
  -f SIFT_pred,Polyphen2_HDIV_pred,Polyphen2_HVAR_pred,\
CADD_phred,REVEL_score,MutationTaster_pred,\
GERP_RS,phyloP100way_vertebrate,gnomAD_genomes_AF \
  annotated_clinvar.vcf > annotated_full.vcf

# 4. gnomAD人群频率注释(推荐使用v4.1,v3.1.2的AF计算有bug已在v4.1修复)
snpSift annotate \
  -v \
  -info AF,AF_eas,AF_nfe,AF_afr \
  gnomad.genomes.v4.1.sites.vcf.gz \
  annotated_full.vcf > annotated_gnomad.vcf

# ===== SnpSift过滤 =====

# 基于Impact过滤(只保留HIGH和MODERATE影响)
snpSift filter \
  "(ANN[*].IMPACT = 'HIGH') | (ANN[*].IMPACT = 'MODERATE')" \
  annotated_full.vcf > high_moderate.vcf

# 基于人群频率过滤(稀有变异:MAF < 1%)
snpSift filter \
  "(!(exists gnomAD_genomes_AF)) | (gnomAD_genomes_AF < 0.01)" \
  high_moderate.vcf > rare_damaging.vcf

# 基于致病性预测过滤
snpSift filter \
  "(SIFT_pred = 'D') & (Polyphen2_HDIV_pred = 'D') & (CADD_phred >= 20)" \
  rare_damaging.vcf > predicted_pathogenic.vcf

# 基于ClinVar过滤(已知致病)
snpSift filter \
  "(CLNSIG = 'Pathogenic') | (CLNSIG = 'Likely_pathogenic')" \
  annotated_clinvar.vcf > clinvar_pathogenic.vcf

# 组合复杂过滤
snpSift filter \
  "((ANN[*].IMPACT = 'HIGH') | \
    ((ANN[*].IMPACT = 'MODERATE') & (CADD_phred >= 20))) & \
   (!(exists gnomAD_genomes_AF) | (gnomAD_genomes_AF < 0.01))" \
  annotated_full.vcf > candidate_variants.vcf

# ===== 提取特定字段为表格 =====
snpSift extractFields \
  annotated_full.vcf \
  CHROM POS ID REF ALT QUAL FILTER \
  "ANN[0].GENE" "ANN[0].IMPACT" "ANN[0].EFFECT" \
  "ANN[0].HGVS_C" "ANN[0].HGVS_P" \
  "SIFT_pred" "Polyphen2_HDIV_pred" "CADD_phred" \
  "gnomAD_genomes_AF" "CLNSIG" \
  > variants_table.tsv

第四步:ANNOVAR变异注释

白话解释: ANNOVAR是另一个非常流行的注释工具,特点是支持大量注释数据库,且输出格式清晰(表格形式)。它把所有注释信息整合到一张大表里,方便直接用Excel查看和筛选。

# ===== ANNOVAR安装和数据库下载 =====
# 从ANNOVAR官网注册下载
# https://annovar.openbioinformatics.org/

# 下载注释数据库
# 基因注释
perl annotate_variation.pl -buildver hg38 -downdb -webfrom annovar refGene humandb/
perl annotate_variation.pl -buildver hg38 -downdb -webfrom annovar ensGene humandb/

# 人群频率
perl annotate_variation.pl -buildver hg38 -downdb -webfrom annovar gnomad40_genome humandb/
perl annotate_variation.pl -buildver hg38 -downdb -webfrom annovar exac03 humandb/
perl annotate_variation.pl -buildver hg38 -downdb -webfrom annovar 1000g2015aug humandb/

# 致病性预测
perl annotate_variation.pl -buildver hg38 -downdb -webfrom annovar dbnsfp47a humandb/
perl annotate_variation.pl -buildver hg38 -downdb -webfrom annovar clinvar_20231231 humandb/
perl annotate_variation.pl -buildver hg38 -downdb -webfrom annovar avsnp150 humandb/
perl annotate_variation.pl -buildver hg38 -downdb -webfrom annovar cosmic97 humandb/

# ===== VCF转ANNOVAR格式 =====
perl convert2annovar.pl -format vcf4 input.vcf > input.avinput

# ===== ANNOVAR注释(一步完成多数据库注释) =====
perl table_annovar.pl \
  input.vcf \
  humandb/ \
  -buildver hg38 \
  -out annotated \
  -remove \
  -protocol refGene,ensGene,gnomad40_genome,exac03,avsnp150,dbnsfp47a,clinvar_20231231 \
  -operation g,g,f,f,f,f,f \
  -nastring . \
  -vcfinput \
  -polish \
  -thread 8

# 输出文件:
# annotated.hg38_multianno.txt   # 主要注释表格
# annotated.hg38_multianno.vcf   # 注释后的VCF

# ===== 查看结果 =====
head annotated.hg38_multianno.txt
# 包含列:Chr, Start, End, Ref, Alt, Func.refGene, Gene.refGene,
#         GeneDetail.refGene, ExonicFunc.refGene, AAChange.refGene,
#         gnomad40_genome_AF, SIFT_pred, Polyphen2_HDIV_pred,
#         CADD_phred, CLNSIG, ...

# ===== ANNOVAR过滤变异 =====
# 在R或Python中过滤(ANNOVAR输出为制表符分隔文本,易于处理)
# R中处理ANNOVAR输出
library(dplyr)

# 读取ANNOVAR注释结果
anno <- read.table("annotated.hg38_multianno.txt", header = TRUE, sep = "\t",
                    quote = "", fill = TRUE, comment.char = "")

# 过滤策略:
# 1. 功能性变异(外显子区域非同义突变)
exonic <- anno %>% filter(Func.refGene %in% c("exonic", "splicing"))
nonsynonymous <- exonic %>% filter(!ExonicFunc.refGene %in% c("synonymous SNV", "."))

# 2. 稀有变异(gnomAD MAF < 1%)
rare <- nonsynonymous %>%
  filter(is.na(gnomad40_genome_AF) | gnomad40_genome_AF < 0.01 | gnomad40_genome_AF == ".")

# 3. 致病性预测(至少一种工具预测有害)
damaging <- rare %>%
  filter(SIFT_pred == "D" | Polyphen2_HDIV_pred == "D" | 
         (!is.na(CADD_phred) & CADD_phred >= 20))

# 4. ClinVar已知致病
clinvar_pathogenic <- anno %>%
  filter(grepl("Pathogenic|Likely_pathogenic", CLNSIG))

# 5. 合并候选变异
candidates <- unique(rbind(damaging, clinvar_pathogenic))
cat("候选致病变异数:", nrow(candidates), "\n")

# 输出结果
write.csv(candidates, "candidate_pathogenic_variants.csv", row.names = FALSE)

第五步:VEP变异注释

白话解释: VEP(Variant Effect Predictor)是Ensembl的官方注释工具,使用Ensembl最新的基因注释,支持丰富的插件系统,可以一次性添加各种预测和数据库注释。它在临床基因组学中使用非常广泛。

# ===== VEP安装 =====
# Docker方式(推荐)
docker pull ensemblorg/ensembl-vep

# Conda方式
conda install -c bioconda ensembl-vep

# 下载缓存数据
vep_install --AUTO cf --ASSEMBLY GRCh38 --SPECIES homo_sapiens --PLUGINS all

# ===== 运行VEP =====
vep \
  --input_file input.vcf.gz \
  --output_file vep_annotated.vcf \
  --vcf \
  --cache \
  --dir_cache $HOME/.vep/ \
  --assembly GRCh38 \
  --species homo_sapiens \
  --force_overwrite \
  --fork 8 \
  --everything \
  --offline \
  --fasta GRCh38.fa

# --everything 等价于同时启用:
# --sift b --polyphen b --ccds --hgvs --symbol --numbers
# --domains --regulatory --canonical --protein --biotype
# --af --af_1kg --af_gnomadg --max_af --pubmed --clinical_signif

# ===== 使用插件增强注释 =====
vep \
  --input_file input.vcf.gz \
  --output_file vep_annotated.vcf \
  --vcf \
  --cache \
  --assembly GRCh38 \
  --fork 8 \
  --force_overwrite \
  --everything \
  --offline \
  --fasta GRCh38.fa \
  --plugin CADD,snv=whole_genome_SNVs.tsv.gz,indels=InDels.tsv.gz \
  --plugin REVEL,file=new_tabbed_revel_grch38.tsv.gz \
  --plugin SpliceAI,snv=spliceai_scores.raw.snv.hg38.vcf.gz,indel=spliceai_scores.raw.indel.hg38.vcf.gz \
  --plugin AlphaMissense,file=AlphaMissense_hg38.tsv.gz \
  --plugin LoFtool \
  --plugin MaxEntScan \
  --custom clinvar.vcf.gz,ClinVar,vcf,exact,0,CLNSIG,CLNDN

# ===== VEP过滤(vep_filter) =====
# 使用filter_vep工具
filter_vep \
  --input_file vep_annotated.vcf \
  --output_file filtered.vcf \
  --filter "IMPACT is HIGH or (IMPACT is MODERATE and CADD_PHRED >= 20)" \
  --filter "MAX_AF < 0.01 or not MAX_AF"

# ===== VEP输出为表格 =====
vep \
  --input_file input.vcf.gz \
  --output_file vep_table.txt \
  --tab \
  --fields "Uploaded_variation,Location,Allele,Gene,Feature,Consequence,\
cDNA_position,CDS_position,Protein_position,Amino_acids,Codons,\
IMPACT,SYMBOL,BIOTYPE,SIFT,PolyPhen,CADD_PHRED,gnomADg_AF,CLIN_SIG" \
  --cache --assembly GRCh38 --fork 8 --everything --offline

第六步:致病性预测工具详解

白话解释: 单个预测工具可能不准,所以我们常常看多个工具的一致预测。SIFT看进化保守性(保守位点的变化更可能有害),PolyPhen看蛋白质结构和保守性,CADD综合了多种信息给出一个统一评分,REVEL用机器学习整合多个工具。

技术细节:

工具原理阈值解读
SIFT多序列比对保守性<0.05有害D=Damaging, T=Tolerated
PolyPhen-2序列+结构特征>0.85致病D=Probably damaging, P=Possibly, B=Benign
CADD综合~60种注释>20(top 1%)Phred-scaled, >30=top 0.1%
REVEL集成13种工具的ML>0.5致病0-1连续评分
MutationTaster进化+功能特征多种分类D=Disease causing, N=Neutral
GERP++多物种保守性>2保守拒绝率(Rejected Substitutions)
AlphaMissenseAlphaFold结构+进化>0.564致病Google DeepMind最新预测器
SpliceAI深度学习剪接预测>0.5显著预测剪接效应
# ===== R中综合致病性评估 =====
library(dplyr)

# 读取注释结果
variants <- read.table("annotated_full.tsv", header = TRUE, sep = "\t")

# 定义致病性评估函数
assess_pathogenicity <- function(sift, polyphen, cadd, revel, gerp) {
  score <- 0
  if (!is.na(sift) && sift == "D") score <- score + 1
  if (!is.na(polyphen) && polyphen %in% c("D", "P")) score <- score + 1
  if (!is.na(cadd) && cadd >= 20) score <- score + 1
  if (!is.na(revel) && revel >= 0.5) score <- score + 1
  if (!is.na(gerp) && gerp >= 2) score <- score + 1

  if (score >= 4) return("Likely Pathogenic")
  if (score >= 3) return("Possibly Pathogenic")
  if (score >= 2) return("VUS")
  return("Likely Benign")
}

# 应用评估
variants$pathogenicity <- mapply(assess_pathogenicity,
                                  variants$SIFT_pred,
                                  variants$Polyphen2_HDIV_pred,
                                  variants$CADD_phred,
                                  variants$REVEL_score,
                                  variants$GERP_RS)

table(variants$pathogenicity)

第七步:变异过滤策略

白话解释: WES检测到的变异通常有几万到十几万个,但真正致病的可能只有1-2个。变异过滤就是层层筛选——先按功能影响过滤(只看影响蛋白的),再按人群频率过滤(只看罕见的),再按致病性预测过滤,最后结合遗传模式和临床表型缩小范围。

# ===== 分步过滤pipeline =====

# 步骤1:SnpEff功能注释
snpEff ann -v -canon GRCh38.105 input.vcf.gz | bgzip > step1_annotated.vcf.gz

# 步骤2:保留功能性变异
snpSift filter \
  "(ANN[*].IMPACT = 'HIGH') | (ANN[*].IMPACT = 'MODERATE')" \
  step1_annotated.vcf.gz > step2_functional.vcf

# 步骤3:添加人群频率和致病性注释
snpSift dbnsfp \
  -v \
  -db dbNSFP4.9a.txt.gz \
  -f gnomAD_genomes_AF,SIFT_pred,Polyphen2_HDIV_pred,CADD_phred,REVEL_score \
  step2_functional.vcf > step3_annotated.vcf

# 步骤4:稀有变异过滤(MAF < 1%)
snpSift filter \
  "(!(exists gnomAD_genomes_AF)) | (gnomAD_genomes_AF < 0.01)" \
  step3_annotated.vcf > step4_rare.vcf

# 步骤5:致病性过滤
snpSift filter \
  "(CADD_phred >= 15) | (SIFT_pred = 'D') | (REVEL_score >= 0.5)" \
  step4_rare.vcf > step5_damaging.vcf

# 步骤6:ClinVar注释
snpSift annotate \
  -info CLNSIG,CLNDN \
  clinvar.vcf.gz \
  step5_damaging.vcf > step6_clinvar.vcf

# 步骤7:输出表格
snpSift extractFields \
  step6_clinvar.vcf \
  CHROM POS ID REF ALT QUAL \
  "ANN[0].GENE" "ANN[0].EFFECT" "ANN[0].IMPACT" \
  "ANN[0].HGVS_P" "ANN[0].HGVS_C" \
  gnomAD_genomes_AF SIFT_pred Polyphen2_HDIV_pred CADD_phred REVEL_score \
  CLNSIG CLNDN \
  > final_candidates.tsv

# 统计各步骤变异数
echo "Step 1 (all variants): $(grep -vc '^#' step1_annotated.vcf.gz)"
echo "Step 2 (functional): $(grep -vc '^#' step2_functional.vcf)"
echo "Step 4 (rare): $(grep -vc '^#' step4_rare.vcf)"
echo "Step 5 (damaging): $(grep -vc '^#' step5_damaging.vcf)"
echo "Final candidates: $(wc -l < final_candidates.tsv)"

第八步:遗传模式与家系分析

白话解释: 如果有患者家系数据(三人家系:患者+父母),可以根据遗传模式进一步缩小候选变异范围——常染色体显性疾病找de novo或杂合遗传变异,常染色体隐性找纯合或复合杂合变异。

# ===== 家系变异分析 =====
library(dplyr)

# 读取三人家系注释结果
variants <- read.table("trio_annotated.tsv", header = TRUE, sep = "\t")

# 假设列包含:proband_GT, father_GT, mother_GT
# GT格式:0/0=野生型纯合, 0/1=杂合, 1/1=变异纯合

# === 常染色体显性(de novo)===
de_novo <- variants %>%
  filter(proband_GT == "0/1" &   # 患者杂合
         father_GT == "0/0" &     # 父亲野生型
         mother_GT == "0/0" &     # 母亲野生型
         IMPACT %in% c("HIGH", "MODERATE"))
cat("De novo变异:", nrow(de_novo), "\n")

# === 常染色体隐性(纯合) ===
ar_homozygous <- variants %>%
  filter(proband_GT == "1/1" &   # 患者纯合
         father_GT == "0/1" &     # 父亲携带
         mother_GT == "0/1" &     # 母亲携带
         IMPACT %in% c("HIGH", "MODERATE"))
cat("AR纯合变异:", nrow(ar_homozygous), "\n")

# === 常染色体隐性(复合杂合) ===
# 在同一基因中找两个不同的杂合变异
ar_het <- variants %>%
  filter(proband_GT == "0/1" & IMPACT %in% c("HIGH", "MODERATE"))

# 找同一基因中有≥2个杂合变异的基因
compound_het_genes <- ar_het %>%
  group_by(GENE) %>%
  filter(n() >= 2) %>%
  ungroup()

# 验证:一个来自父亲,一个来自母亲(trans配置)
# 需要检查父母的基因型

# === X连锁隐性 ===
xlinked <- variants %>%
  filter(CHROM == "chrX" &
         proband_GT %in% c("0/1", "1/1") &  # 男性患者
         mother_GT == "0/1" &                  # 母亲携带
         IMPACT %in% c("HIGH", "MODERATE"))

# ===== ACMG分类标准 =====
# 根据ACMG指南对变异进行5级分类
# Pathogenic, Likely Pathogenic, VUS, Likely Benign, Benign
# 考虑因素:
# - PVS1: 无效变异(Loss of Function)在已知LOF致病基因中
# - PS1: 已知致病的相同氨基酸变化
# - PM2: 稀有变异(人群频率极低)
# - PP3: 多种计算工具预测有害
# - BP1: 错义变异在LOF致病基因中(弱良性证据)

实战命令(可复制)

完整变异注释与过滤流程

#!/bin/bash
# ============================================
# 变异注释与过滤完整流程
# ============================================

INPUT="raw_variants.vcf.gz"
OUTPUT_DIR="annotation_results"
mkdir -p $OUTPUT_DIR

# 1. SnpEff功能注释
snpEff ann -v -canon -hgvs -lof \
  -stats $OUTPUT_DIR/snpeff_stats.html \
  GRCh38.105 $INPUT | \
  bgzip > $OUTPUT_DIR/snpeff.vcf.gz
tabix -p vcf $OUTPUT_DIR/snpeff.vcf.gz

# 2. dbNSFP致病性注释
snpSift dbnsfp -v \
  -db dbNSFP4.9a.txt.gz \
  -f SIFT_pred,Polyphen2_HDIV_pred,CADD_phred,REVEL_score,\
MutationTaster_pred,GERP_RS,gnomAD_genomes_AF \
  $OUTPUT_DIR/snpeff.vcf.gz > $OUTPUT_DIR/dbnsfp.vcf

# 3. ClinVar注释
snpSift annotate -v \
  -info CLNSIG,CLNDN,CLNREVSTAT \
  clinvar_20240101.vcf.gz \
  $OUTPUT_DIR/dbnsfp.vcf > $OUTPUT_DIR/clinvar.vcf

# 4. 过滤:功能性 + 稀有 + 致病
snpSift filter \
  "((ANN[*].IMPACT = 'HIGH') | \
    ((ANN[*].IMPACT = 'MODERATE') & \
     ((CADD_phred >= 20) | (REVEL_score >= 0.5)))) & \
   (!(exists gnomAD_genomes_AF) | (gnomAD_genomes_AF < 0.01))" \
  $OUTPUT_DIR/clinvar.vcf > $OUTPUT_DIR/filtered.vcf

# 5. 导出表格
snpSift extractFields $OUTPUT_DIR/filtered.vcf \
  CHROM POS ID REF ALT QUAL FILTER \
  "ANN[0].GENE" "ANN[0].EFFECT" "ANN[0].IMPACT" \
  "ANN[0].HGVS_C" "ANN[0].HGVS_P" "ANN[0].BIOTYPE" \
  gnomAD_genomes_AF SIFT_pred Polyphen2_HDIV_pred \
  CADD_phred REVEL_score GERP_RS \
  CLNSIG CLNDN \
  > $OUTPUT_DIR/final_table.tsv

# 统计
echo "Total variants: $(bcftools stats $INPUT | grep 'number of records' | awk '{print $6}')"
echo "After filtering: $(grep -vc '^#' $OUTPUT_DIR/filtered.vcf)"
echo "HIGH impact: $(grep -c 'HIGH' $OUTPUT_DIR/filtered.vcf)"

面试常问点

Q1: SnpEff, ANNOVAR, VEP三个工具的优缺点各是什么?

A: SnpEff:速度快、输出VCF格式(与downstream工具兼容好)、支持LOF预测,但数据库注释能力不如ANNOVAR。ANNOVAR:数据库最丰富(一步注释几十种数据库)、输出为易读的表格格式,但不输出标准VCF且需注册下载。VEP:Ensembl官方维护、注释最准确(使用最新注释)、插件系统强大(CADD/SpliceAI/AlphaMissense)、临床应用最广(FDA认可),但速度较慢。推荐:临床级别用VEP,科研快速注释用SnpEff+SnpSift,需要全面数据库注释用ANNOVAR。

Q2: CADD评分的原理和阈值怎么理解?

A: CADD(Combined Annotation Dependent Depletion)整合了约60种不同的注释(保守性、功能效应、调控信息等),使用一个线性SVM模型将观测变异与模拟变异区分开来。输出的Phred-scaled CADD分数:CADD≥10表示在top 10%最有害;≥20在top 1%;≥30在top 0.1%。常用阈值:临床上通常用≥15作为初步筛选,≥20作为有害预测,≥30高度可能致病。但CADD是连续评分,不应作为二值化的致病/良性判断依据。

Q3: 为什么要看多个致病性预测工具而不是只用一个?

A: 因为每个工具基于不同原理,有不同的优势和局限:SIFT基于保守性(对高度保守位点准确但对新进化特征盲区),PolyPhen用结构信息(对有3D结构的蛋白好但覆盖有限),CADD综合性好但对每个特征都不深入。Meta-predictor如REVEL集成了13种工具,通常比单个工具更准确。ACMG指南推荐将"多种计算工具一致预测有害"作为致病性证据(PP3),而非依赖单一工具。

Q4: 如何处理变异注释中的多转录本问题?

A: 一个变异可能影响多个转录本,在不同转录本中效应可能不同(如在一个转录本中是错义,在另一个中可能在内含子)。处理策略:(1) 使用canonical transcript注释(SnpEff的-canon选项);(2) 选择MANE Select转录本(refseq/ensembl共识的主转录本);(3) 选择最严重的效应(SnpEff默认行为);(4) 选择编码最长蛋白的转录本。VEP的--pick选项可自动选择"最相关"转录本。

Q5: gnomAD的AF=0和AF缺失有什么区别?

A: AF缺失(NA/.)表示gnomAD中没有覆盖到这个位点(可能在技术难区域,或变异类型不在gnomAD检测范围内)。AF=0表示gnomAD检测了这个位点但在所有样本中都没有发现这个变异——是真正的超稀有变异。两者都应被视为"人群频率极低",但AF缺失需要额外验证(可能是假阳性变异)。过滤时应将两者都保留:(!exists AF) | (AF < 0.01)

Q6: ACMG变异分类的基本框架是什么?

A: ACMG 2015指南将变异分为5类:Pathogenic(致病)、Likely Pathogenic(可能致病)、VUS(意义不明)、Likely Benign(可能良性)、Benign(良性)。基于28条证据规则(PVS/PS/PM/PP=致病证据,BS/BP=良性证据)的组合。关键证据包括:PVS1(LOF in LOF-intolerant gene)、PS1(same aa change as known pathogenic)、PM2(absent from controls)、PP3(computational prediction damaging)。InterVar工具可自动化部分ACMG分类。

Q7: 体细胞变异和胚系变异的注释有什么不同?

A: (1) 频率数据库:胚系用gnomAD过滤常见变异;体细胞变异在gnomAD中通常不存在(因为是肿瘤特异的),需要额外排除胚系变异。(2) 致病性数据库:胚系用ClinVar/HGMD;体细胞用COSMIC/OncoKB/CIViC。(3) 注释重点:胚系关注LOF和错义致病性;体细胞关注驱动突变(driver)vs乘客突变(passenger)、可靶向性(actionability)。(4) 过滤策略:胚系按遗传模式过滤;体细胞按VAF、驱动基因、热点突变过滤。


易错点

1. 基因组版本不匹配

问题: VCF基于hg38坐标,但注释数据库使用hg19,导致大量变异注释为intergenic或无注释。 解决: 始终确认VCF、参考基因组、注释数据库使用相同的基因组版本。用bcftools view检查VCF header中的reference信息。如需转换可用CrossMap或Picard LiftoverVcf。

2. 不区分多等位基因位点

问题: 多等位基因位点(如A>C,T)在VCF中一行表示两个变异,注释时可能只注释第一个。 解决: 注释前用bcftools norm -m -将多等位基因拆分为独立行:bcftools norm -m -both input.vcf.gz -o normalized.vcf.gz

3. SnpEff的ANN字段解析错误

问题: ANN字段包含多个转录本的注释(用逗号分隔),直接按字符串匹配会出错。 解决: 使用SnpSift的专用语法(ANN[0].IMPACT取第一个转录本,ANN[*].IMPACT匹配任意转录本),或用专门的VCF解析库(pyvcf、cyvcf2)。

4. 过度依赖单一致病性预测工具

问题: 仅因为CADD>20就判定变异致病,忽略了CADD对某些变异类型(如同义变异的剪接效应)不敏感。 解决: 综合多种工具预测。对剪接变异额外使用SpliceAI,对错义变异参考REVEL/AlphaMissense,对LOF变异参考pLI/LOEUF。遵循ACMG标准进行系统性评估。

5. 忘记过滤低质量变异

问题: 注释了所有变异包括低质量调用(QUAL<20, FILTER=不PASS),导致大量假阳性进入候选列表。 解决: 注释前先过滤:bcftools view -f PASS -i 'QUAL>=30' input.vcf.gz。或在注释后的过滤中加入质量条件。

6. 人群频率数据库版本过旧

问题: 使用旧版gnomAD(如v2.1)注释,缺少新收集的人群频率数据,导致一些实际常见的变异被错误判断为稀有。 解决: 使用最新版本的人群频率数据库(gnomAD v4.1+,注意v4.0有AF计算bug,v4.1已修复),并注意选择合适的亚群频率(如东亚人群AF_eas)。


补充知识

常用人群频率数据库

数据库样本量特点
gnomAD v4.1~807K total (730K exomes + 76K genomes)最大最全,含SVs
1000 Genomes~2,500全基因组,多种族
ExAC~60K exomesgnomAD前身
ChinaMAP~10K中国人群专用
KRGDB~1,722韩国人群
ToMMo~38K日本人群

临床变异数据库

数据库特点用途
ClinVarNCBI官方,社区提交临床意义查询
HGMD商业数据库,最全面胚系致病变异
COSMIC肿瘤体细胞变异癌症驱动变异
OncoKB肿瘤可靶向变异用药指导
CIViC社区驱动的肿瘤证据临床解读
InterVarACMG自动分类变异分类

自动化ACMG分类工具

  • InterVar:自动化18条ACMG证据的评估
  • Franklin (Genoox):商业级自动ACMG分类
  • VarSome:在线变异解读平台
  • ClinGen:社区专家变异解读

变异命名标准(HGVS)

# 基因组水平
NC_000017.11:g.7675088C>T

# cDNA水平
NM_000546.6:c.743G>A

# 蛋白质水平
NP_000537.3:p.Arg248Gln (或 p.R248Q)

# 规则:
# 编码区SNV: c.位置碱基>碱基
# 缺失: c.位置del
# 插入: c.位置_位置insXXX
# 重复: c.位置_位置dup
# 移码: p.氨基酸位置fs*终止位置