はじめての環境DNA
研究室から現場まで、実践で使える知識を!
データの解析方法

NCBI 16s rRNAのBLAST DBを複数階級の情報をもつ形式に変換してqiime2の系統解析で使いやすいようにする

きっかけ

NCBIのFTPサイトで提供されている塩基配列データは以下のような形式になっています。

>NR_025636.1 Mycobacterium shottsii strain M175 16S ribosomal RNA, partial sequence
GTTTGATCCTGGCTCAGGACGAACGCTGGCGGCGTGCTTAACACATGCAAGTCGAACGGAAAGGTCTCCTCGGAGATACT…..
>NR_025639.1 Aequorivita antarctica strain SW49 16S ribosomal RNA, partial sequence
GAACGCTAGCGGCAGGCCTAACACATGCAAGTCGAGGGGTAGAGAGTGCTTGCGCTCTTGAGACCGGCGCACGGGTGCGT…..

一方、Microbiomeにおけるmetagenomicsの参照データベースとして一般的に用いられる、SILVAやGreengeneは以下のように複数の分類階級を記載する形式となっています。

>(識別番号1)
GTTTGATCCTGGCTCAGGACGAACGCTGGCGGCGTGCTTAACACATGCAAGTCGAACGGAAAGGTCTCCTCGGAGATACT….
>(識別番号2)
GAACGCTAGCGGCAGGCCTAACACATGCAAGTCGAGGGGTAGAGAGTGCTTGCGCTCTTGAGACCGGCGCACGGGTGCGT…..

配列ファイル (.fasta)

(識別番号1) k__Bacteria;p__Actinomycetota;c__Actinomycetes;o__Corynebacteriales;f__Mycobacteriaceae;g__Mycobacterium;s__Mycobacterium shottsii

(識別番号2) k__Bacteria;p__Bacteroidota;c__Flavobacteriia;o__Flavobacteriales;f__Flavobacteriaceae;g__Aequorivita;s__Aequorivita antarctica

分類情報ファイル (.tsv)

NCBI Refseqは種や属といった単一階級の情報しか無いため、少し使用しづらいなと感じていました。

もう少し使いやすいように、NCBI Accession Numberをキーとして、SILVAなどで採用されている複数の分類階級を記載する形式に変換してみよう。というのが今回の内容になります。

注意点として、データベースのキュレーションの方法がSILVA, Greengenes, NCBI-RefSeq, GTDB, RDPで異なり、どのデータベースを使用するかにより、分類の解像度や結果が異なる可能性があります(ref1, ref2)。Metabarcodingなどでデータベースとして利用する際にはそれぞれの特徴を理解した上で使用してください。

今回使用するのはNCBI Refseq 16s rRNAの配列データとNCBI taxonomy databaseのデータセットです。

全体のながれ

流れは以下の通りです。

  1. NCBI ftp siteよりRefseqのbacteria 16s rRNAのBlast DBをダウンロード
  2. blastdbcmdにてBlast DB形式からfastaへ
  3. Taxonkit, csvtkを使って、単一階級から複数階級の情報を持つtsv ファイルと、Accession numberで紐付くfastaファイルを作成 (QIIME2ではセットで使います)

先にまとめコードを示しておきます。

本記事で説明する内容のうち、”配列データの取得”以降の作業がまとめられてます。

  1. デスクトップ上似作成したbioinfoフォルダ下にq2reformatというフォルダを作成
  2. その中にqiime2-reformat.shというファイルを作成して以下のまとめコードを記載
  3. 本記事の”配列データの取得”の後まで実施した後にbash qiime2-reformat.shを実行

そうすれば配列データの16S_ribosomal_RNA_seq_acc.fastaと分類情報が記載されている16S_ribosomal_RNA_tax_qiime2-form.tsvが生成されるはずです。

内容

準備

作業ディレクトリの準備

q2reformatというフォルダをデスクトップのbioinfoというフォルダ内に作成します。デスクトップ上でコマンドラインを開いて以下のように入力。

次に出力フォルダ等を作成

移行はq2reformatをベースに02refと_tempフォルダにデータをどんどん出力していきます。

Taxonokit, csvtk, blastdbcmdのインストール

Taxonkit

Taxonkitは、NCBI Taxonomy Databaseから取得した分類情報を含むtaxonomy dump fileを取り扱うためのコマンドラインツールです。taxonomy dump fileを読み込んで、分類群の分類階級、学名、シノニム、分類群の識別子などの情報を取得し、変換することができます。

taxonkit

開発者githubはこちら。オプションは以下の通り。

taxdumpファイルのダウンロード

NCBIのFPTサイトよりtaxdump.tar.gzファイルをダウンロードして、ワークディレクトリに保存用フォルダを作成後、必要なファイルを移動させておきます。

最新の分類情報を使用したい場合、結構な頻度で更新かかってるので、こまめにNCBIのTaxonomy dumpファイルを更新して常に最新のものにすることをおすすめします。

Taxonokitのインストール

作業する仮想環境あればactivateして以下を実行します。

仮想環境がない場合は、作成してインストール

taxonkit -hでhelpが表示されればインストール完了

csvtk

csvtkはカンマ区切り、またはタブ区切りテキストをコマンドライン上で編集するツールです。似たものにcsvkitがありますが、csvtkの方が後発なため包括関係になってます。また、awkより簡潔なので使いやすいです。

FeaturescsvtkcsvkitNote
Read GzipYesYesread gzip files
Fields rangesYesYese.g. -f 1-4,6
Unselect filedsYese.g. -1 for excluding first column
Fuzzy fieldsYese.g. ab* for columns with name prefix “ab”
Reorder fieldsYesYesit means -f 1,2 is different from -f 2,1
Rename columnsYesrename with new name(s) or from existed names
Sort by multiple keysYesYesbash sort like operations
Sort by numberYese.g. -k 1:n
Multiple sortYese.g. -k 2:r -k 1:nr
Pretty outputYesYesconvert CSV to readable aligned table
Unique dataYesunique data of selected fields
frequencyYesfrequencies of selected fields
SamplingYessampling by proportion
Mutate fieldsYescreate new columns from selected fields
ReplaceYesreplace data of selected fields
https://github.com/shenwei356/csvtk より

開発者githubはこちら。オプションは以下の通り。

csvtkのインストール

作業する仮想環境あればそちらにactivateして以下を実行します。

blastdbcmd

NCBI BLASTの一部で、BLAST DB内のシーケンス情報などを抽出することができます。他にもたくさんの機能はありますが、ここでは必要な情報の抽出程度にしか使用しません。

オプションは以下の通り。

blastdbcmdのインストール

blastdbcmdはBLAST+に内包されています。そのため、BLAST+をインストールすれば使用できるようになります。こちらの記事でも解説しましたが、mambaを使って導入可能です。

完了したら確認。

並列でファイルを回答可能なpigzもインストール

配列データの取得

NCBI FTPサイトよりBLAST DB形式になっているデータを取得します。

.tarファイルを解凍して以下のファイルが出力されていればOK。

次にblastdbcmdを使って、BLAST DB形式から配列データなどを抽出します。

配列データ

multifastaファイルが得られます。

中身を確認してみます。

taxid, taxidとAccession numberの対応表の取得

Taxonkitで使用するtaxidは以下のように取得します。

スクリプトで実施しているのは以下になります。

  • blastdbcmdのoutfmt%Tを使用することでBLAST DBに登録されている配列のtaxidを抽出
  • awkで重複の削除 & sortで並び替え

出力ファイルの内容をcatでチェック

うまく得られているようです。

次は、taxidとAccession Numberとの対応表を作成します。

スクリプトで実施しているのは以下になります。

  • blastdbcmdのoutfmtに%Tに加えて%aを指定することでaccession numberを抽出(区切り文字は一時的に##とした)
  • sedで##をタブに変換 & sort

Taxonkitを使ってtaxidに系統分類の情報を付与する

ここでTaxonkitが登場します。taxonkitのlineageオプションを使用することで、taxonomy dumpファイルにtaxidで検索をかけて系統分類の情報を抽出していきます (-j オプションは自身のPCのコアを指定してください)

ここで[WARN]と表示されることがあります。2023/4/2現在だと以下のような表示でした。

試しにNCBI taxonomyで対象のtaxidとして1176194を調べてみると、merged into 2878561と表示されていたように、Hitしたのは2878561に割り振られている生物の情報でした。配列が登録された後に分類が見直されたりとかしたのですかね。

1176194についてtaxonomy browserで検索
Hitしたのは2878561

このような変更は多々あるので、taxonomy dumpファイルは可能な限り最新のものかversionが分かるように管理して利用することが望ましいと思います。

出力したファイルを見てみましょう。

先程抽出したtaxidに系統分類情報を付与することができました。

次はformatの修正です。taxonkitのreformatオプションを使用して、k__;p__;c__;o__;f__;__;g__;s__の形に変更します。

出力したファイルを見てみましょう。

Reformatすることができました。

もう少し修正

Refseqに登録されているデータはキュレーションされたものなので良いのですが、ntデータベースを対象に種名を利用してlineageのアサイメントをすると、分類情報が登録されていない情報が出てきます。

その中で全くlineageに関する情報が振られていないものは、振られていない = “NoInfo”と情報つけておく方が後々助かるのでcsvtkを使って情報の付与を行います。

今回の場合、16S_ribosomal_RNA_tax_taxonomy_no_lineage.tsvのデータ量は0 byteになりますが、ifで条件分岐させてエラーが出ないようにしました。

以下の作業で出力される16S_ribosomal_RNA_tax_taxonomy.tsvは先ほど確認した、Reformat後のデータと同じです。

分割していたファイルを結合する処理が以下になります。

後々、QIIME2で使用することを考慮して”Feature ID”と”Taxon”というheaderを追加します。

出力したファイルを見てみましょう。

無事、headerが追加されたようです。

Accession numberが付与されたfastaファイルを取得する

最後にblastdbcmdでAccession numberを配列のheaderとするfastaファイルを出力します。

出力したファイルを見てみましょう。

Accession Numberが情報となった配列データベースが得られました。

ちなみに、2つのファイルに情報が別れているのが嫌な場合、seqkitのfx2tabを使用するとタブ区切りの情報をもとにfastaの配列情報部分を置換してくれます。

ここまできたら、16S_ribosomal_RNA_seq_acc.fasta16S_ribosomal_RNA_tax_qiime2-form.tsvを使って、

  1. classify-consensus-blast

でASV/OTUに対してtaxonomic assignmentを実施したり、

  1. fit-classifier-naive-bayesで分類機を作成後、
    1. classify-sklearn
    2. classify-consensus-vsearch
    3. classify-hybrid-vsearch-sklearn

などで、ASV/OTUに対してtaxonomic assignmentを実施することができると思います。

また、qiime2ベースでBLASTを実施する場合、1coreでの実行似制限されているのですが、query配列を分割することで事実上の並列処理が可能です。またその記事を公開したら↓にリンク掲載したいと思います。

↓ 更新しました @2023/5/14

最後までご覧いただきありがとうございました。

Reference

免責事項

本記事の情報・内容については可能な限り十分注意は払っていますが、正確性や完全性、妥当性および公平性について保証するものではありません。本記事の利用や閲覧によって生じたいかなる損害について責任を負いません。また、本記事の情報は予告なく変更される場合がありますので、ご理解くださいますようお願い申し上げます。

ABOUT ME
しばた
分析・データ解析なんでもします。環境DNA使って研究したい方、気軽に相談ください。