アメリエフのブログ

Amelieff Staff Blog

snpEffとSnpSiftのfilter

kubo-mです。
最近人にSnpSiftの機能の説明をしたときに大変だったので、SnpSiftの記事を書こうと思います。
このブログでSnpSiftの話をするのは VCFのアノテーション - アメリエフのブログ 以来ですね。

上の記事では annotate 機能の紹介を行っていますが、この記事ではfilter機能の話をします。
SnpSiftのフィルタは非常に多機能で、どこから説明したらいいのか迷うところですが、詳しくは公式ドキュメントに、どんなフィルタが可能かの実例がたくさんありますので、これを見ていただくのが良いと思います。
pcingola.github.io

実例を見るとわかるとおり、文法は以下の通りです。

java -jar SnpSift.jar filter "( フィルタ条件 )" [VCF file]

今回は、せっかくなので、他のツールでは代替しづらい、SnpSiftとセットであるツールsnpEffを用いておこなった、アノテーションによるフィルタの例をご紹介します。
変異検出後、snpEffで遺伝子アノテーションを付与すると、その変異がどのような変異であるかをsnpEffがアノテーションし、VCFのヘッダと、各変異のINFO列に下記のような情報が書き込まれます。

    :
##INFO=<ID=ANN,Number=.,Type=String,Description="Functional annotations: 'Allele | Annotation | 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=A|missense_variant|MODERATE|TMPRSS15|TMPRSS15|transcript|NM_002772.2|protein_coding|19/25|c.2194C>T|p.Pro732Ser|2225/3944|2194/3060|732/1019||
    :

ANN=がsnpEffがその変異に付与したアノテーションです。|区切りで書かれた情報が何を表しているかは、ヘッダに書かれているとおりです。どの遺伝子、あるいは転写産物上の変異か、ミスセンスバリアントであること、変異によってどんなアミノ酸置換が生じるか、などが詳しく書かれています。

このうちヘッダでいうところの Annotation_Impact というのは、変異が与えるインパクトを、sequence ontologyをもとにインパクトが大きい順に HIGH 、 MODERATE 、 LOW 、MODIFIER 、 MODIFIER の4段階に分類しています(※)。
だいたいの目安ですが、翻訳後のアミノ酸に影響を与えそうなsequence ontologyはHIGHかMODERATEに分類されています。ということは、表現型や疾患に関連する可能性がある非同義変異を探索するときは、Annotation_ImpactがHIGHまたはMODERATEの変異に絞って探索すると効率がよさそうです。

公式ドキュメントを頼りに、SnpSiftを用いてやってみましょう。今回は説明を簡易化するためにAnnotation_ImpactがHIGHのときの話だけをします。
snpEffのANNフィールドに書かれたたくさんの情報(サブフィールドと呼びます)のうち、Annotation_Impact をフィルタリングに使用します。上記の公式ドキュメントの "Available ANN sub-fields are ... " 以下に、snpEffで付与されたANNフィールドのフィルタリングに利用可能なANN サブフィールド名の一覧があります。これによるとAnnotation_Impact に対応するサブフィールド名がIMPACTになるので、フィルタ条件は

ANN.IMPACT == 'HIGH'

という形になります。しかし、実はsnpEffは一つの変異に複数のアノテーションを付与することがあるのでほとんどなので、すべてのアノテーションのうち、いずれかでAnnotation_Impact がHIGHのとき、という書き方をしないとフィルタリングがうまくいきません。 ANN[*] とつけると「すべてのアノテーションの」という指定方法になるため、コマンドの完成形は下記になります。

java -jar SnpSift.jar filter "( ANN[*].IMPACT == 'HIGH' )" test_ann.vcf

正直なところ、SnpSiftのフィルタ条件の文法は、複雑だなあと思うのですが、他にも他ツールでは実現困難な様々なフィルタ条件が使用可能です。
変異解析をする方は、目的にあわせて使いこなすことができれば、いろいろな解析がラクになりますよ。


※どんな変異がどのインパクトにカテゴライズされるかについては、https://pcingola.github.io/SnpEff/adds/VCFannotationformat_v1.0.pdf の6ページ目を参照してください。