SnpEff变异注释(SnpEff/SnpSift/ANNOVAR/VEP变异功能注释与过滤)¶
一句话概述¶
变异功能注释是利用SnpEff、SnpSift、ANNOVAR、VEP等工具,对VCF格式的基因组变异(SNP/InDel/SV)进行系统性的功能预测和注释,包括变异对基因/转录本的影响(同义/错义/无义/移码等)、致病性预测(SIFT/PolyPhen2/CADD)、人群频率标注(gnomAD)和临床意义注释(ClinVar),是变异解读和临床基因组学的关键步骤。
核心知识点表格¶
| 知识点 | 说明 |
|---|---|
| SnpEff | Java编写的变异功能效应注释工具 |
| SnpSift | SnpEff的伴侣工具,用于VCF过滤和数据库注释 |
| ANNOVAR | 综合性变异注释工具,支持多数据库 |
| VEP | Ensembl Variant Effect Predictor,Ensembl官方注释工具 |
| VCF | Variant Call Format,变异调用标准格式 |
| 同义突变 | Synonymous,氨基酸不变 |
| 错义突变 | Missense,氨基酸改变 |
| 无义突变 | Nonsense/Stop-gain,产生提前终止密码子 |
| 移码突变 | Frameshift,插入或缺失导致阅读框偏移 |
| SIFT | 基于序列保守性的致病性预测 |
| PolyPhen-2 | 基于结构和保守性的致病性预测 |
| CADD | Combined Annotation Dependent Depletion,综合致病性评分 |
| gnomAD | 人群等位基因频率数据库 |
| ClinVar | NCBI临床意义变异数据库 |
各步骤详解¶
第一步:变异注释基本概念¶
白话解释: 通过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) |
| AlphaMissense | AlphaFold结构+进化 | >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 exomes | gnomAD前身 |
| ChinaMAP | ~10K | 中国人群专用 |
| KRGDB | ~1,722 | 韩国人群 |
| ToMMo | ~38K | 日本人群 |
临床变异数据库¶
| 数据库 | 特点 | 用途 |
|---|---|---|
| ClinVar | NCBI官方,社区提交 | 临床意义查询 |
| HGMD | 商业数据库,最全面 | 胚系致病变异 |
| COSMIC | 肿瘤体细胞变异 | 癌症驱动变异 |
| OncoKB | 肿瘤可靶向变异 | 用药指导 |
| CIViC | 社区驱动的肿瘤证据 | 临床解读 |
| InterVar | ACMG自动分类 | 变异分类 |
自动化ACMG分类工具¶
- InterVar:自动化18条ACMG证据的评估
- Franklin (Genoox):商业级自动ACMG分类
- VarSome:在线变异解读平台
- ClinGen:社区专家变异解读