2022年2月7日月曜日

RStudio で Python を使うための環境構築: Reticulate パッケージの導入

20220207_Blogger0018

昔から現在に至るまで、自分の研究のデータ解析では R のお世話になることが多いです。R は RStudio という統合開発環境から使っています。RStudio は非常に洗練されていて、さらに無料で使うことができるのでとてもおすすめです。

近年、データ解析は大規模化・高度化・複雑化の一途をたどっており、その流れは自分が専門としている生態学でも同様です。流行りの 「機械学習」 は R でも実行可能ですが、Python の方がより充実した解析パッケージが用意されており、機械学習を研究のメインとするのであれば Python が第一の選択肢となるでしょう。

今回は、Python に興味がある R ユーザー向けに、RStudio を使って Python を使い始めるための環境構築について書きたいと思います。

なお、今回の記事を書くにあたって使用した環境については以下の通りです:

  • macOS 12.1 (M1 chip)
  • R 4.1.2
  • RStudio 2021.09.2+382
  • Pyton 3.9.5

したがって、本記事には Windows には適用されない記述もあります。

(*今回 Apple の M1 チップを搭載した Macbook Pro に乗り換えたタイミングで、 M1 Macbook Pro 特有のプロセスについてはカッコ書きで記載します)

(*また、比較的新しい M1 Mac でトライしたので、本記事の状況は近い将来変わるかもしれません。ご注意ください)

R と RStudio のインストール

まずは R と RStudio のインストールが必要です。Python を使うための特別な対応は必要はありません。

(* 2022年2月6日現在、mac 向けには R-4.1.2.pkg [Intel Mac 向け] と R-4.1.2-arm64.pkg [M1 Mac 向け] が用意されています。が、結論から言うと今回の目的達成にはなぜか R-4.1.2.pkg を選ぶとよかったです。本記事の一番下を参照)

RStudio はこちらからダウンロードできます。Free バージョンで問題ありません。

Miniconda のインストール

RStudio 経由で Python を使う際には、Python の実行環境の一つである Miniconda をインストールする必要があります (Miniconda は Anaconda の縮小版)。

Miniconda のウェブサイト

Miniconda は Windows, Mac, Linux 向けにそれぞれバージョンが用意されているので、適するものを選んでダウンロードします。

Miniconda のインストーラー

(*M1 Mac 向けには Miniconda3 macOS Apple M1 64-bit bash というのがありますが、ここでは Miniconda3 MacOSX 64-bit pkg を選びます。これも本記事の一番下を参照))

Reticulate 向けの仮想環境の構築

Miniconda (もしくは Anaconda) がインストールされるとターミナルの様子が少し変わります。下のような感じです。

  • インストール前: ushio@MacBook-Pro ~ %
  • インストール後: (base) ushio@MacBook-Pro ~ %

(base)という文字が現れます。これは、conda 管理下の base という環境に現在いることを表しています。ここから Miniconda/Anaconda が提供する様々なconda のコマンドを使用することができます。

Reticulate パッケージ導入の準備

RStudio 内で Python を使用するために、Reticulate という R パッケージを利用します。この Reticulate、いきなり RStudio 内からインストールしても問題ありません。しかし、Reticulate 専用の仮想環境を用意して、R 経由で Python を使う際は常にその仮想環境を利用したほうが無用な混乱を避けられます。そこで、R 内ではなくターミナルで 次のコマンドを入力して仮想環境を作成しておきます。

# r-reticulate という仮想環境を作成 (名前は何でもいい)
# x.x.xx には使用する Python のバージョンを指定
conda create -n r-reticulate python=x.x.xx

# r-reticulate ができたことを確認
conda info -e

# 仮想環境 r-reticulate に入ってみる
conda activate r-reticulate

# 仮想環境 r-reticulate から出てみる
conda deactivate

RStudio から Reticulate のインストール

Reticulate 用の仮想環境が準備できたら、RStudio を立ち上げて Reticulate パッケージをインストールします。

# Reticulate のインストール
# RStudio のツールバーの機能を使っても可
install.pacakges("reticulate")

インストール後、library(reticulate) でパッケージを呼び出し、Python 環境に入る関数 repl_python() を実行してみます。すると、Python が認識されない場合は 「Miniconda をインストールしますか?」 というメッセージが出てきます。

「Miniconda をインストールしますか?」 のメッセージ

上記 「Miniconda のインストール」 「Reticulate 向けの仮想環境の構築」 を行っていない場合はここでインストールすることもできます。ただし、これまでここで RStudio 経由で Miniconda をインストールして、Python 環境が混乱したことがあり、それもあって事前に Miniconda 導入 & 仮想環境の構築をするようにしています。この辺はまだいろいろと検証の余地がありそうです。

(*M1 Mac 向けの Miniconda3 macOS Apple M1 64-bit bash を利用して Miniconda をインストールしたときはこのメッセージは出てきませんでした)

この記事に従って、すでに Miniconda をインストールしているにも関わらずこのメッセージが出た場合は、ここでは n を選んで RStudio による Miniconda のインストールをスキップします。

Reticulate で使用する Python を指定

library(reticulate) でエラーが出なければ、Miniconda 関係のメッセージが出る出ないに関わらず、Reticulate そのもののインストールは成功しています。

そこで RStudio を再起動して、再度 library(reticulate) で Reticulate を呼び出します。そして、repl_python() を実行する前に、以下のコマンドで使用する Python を指定します。

use_python("/opt/miniconda3/envs/r-reticulate/bin/python3", required = T)

/opt/miniconda3/envs/r-reticulate/bin/python3 の部分は自分の環境に応じて変えてください。ターミナルで r-reticulate 環境に入った状態で which python または which python3 とすると r-reticulate で使用している Python の場所を教えてくれます。

使用してほしい Python をうまく認識させることができれば、repl_python() を実行したときに指定した Python のパスが表示されます。

使用する Python を指定して、Python 環境に入る

R を使用中であることを示す > ではなく、Python を使用中であることを示す >>> がでれば、きちんと Python 環境に入れています。

Python パッケージのインストール

新しいパッケージを追加したい場合は、R 環境で retuculate::conda_install() 関数を使用する か、もしくはターミナルで r-reticulate 環境に入って、conda install を使うと入れることができます。自分はターミナルから conda install で入れることが多いです。

おまけ

お得ポイント

もちろん Python は RStudio からでなくても使えますが、RStudio から使うといいこともあります。一つのスクリプト内で、R と Python を行ったり来たりできるので、機械学習は Python にまかせて、作図は R、ということがスムーズにできます。

(私見ですが、作図に関しては R の方がいいように思っています。ただし、自分のプログラミング能力が R >> Python であることによるバイアスは否めません)

あと、Reticulate は直接関係ありませんが、Python で書かれたスクリプトが少しずつ読めるようになってくるので、解析アルゴリズムの勉強が捗るようになります。

M1 Mac ではどうする?

最初、「M1 Mac 向け」 とあった R-4.1.2-arm64.pkg で R をインストールしました。この場合、Miniconda3 macOS Apple M1 64-bit bash でインストールした Miniconda でも問題なく Reticulate が使用できました。ただし、こちらの方法では Bioconductor からの R パッケージのインストールでつまづくことがあるようです。DNA 配列解析用の R パッケージ DADA2 のインストールでつまづきました。DADA2 のヘビーユーザーなので、これは困る、ということでここで紹介した方法で落ち着きました。近いうちにこの状況は変わるかもしれません。

また、Miniconda ではなくて Miniforge という Python 環境もあるようで、M1 Mac と関連してウェブ情報がヒットします。Reticulate で Miniforge が使えるかどうかは試していませんが、試してみるのもいいのかもしれません。

関連発表しました

RStudio と Python については 2021 年 11 月の個体群生態学会で関連の発表をしました。機会があればこの発表に関連した追記をするかもしれません。

Written with StackEdit.

2021年12月16日木曜日

環境 DNA メタバーコーディングとユニバーサルプライマー

20211216_Blogger0017

環境 DNA メタバーコーディングでは自分たちが興味ある特定の分類群に属する生物の DNA をまとめて増幅するための 「ユニバーサルプライマー」 が使用されます。調査・研究の目的に合ったユニバーサルプライマーを選ぶことは環境 DNA メタバーコーディングにおいて最も重要なステップの一つです。

この 「適したユニバーサルプライマーを選ぶ」 という作業、簡単なようでその難易度は研究目的や解析対象の分類群によりかなりばらつきがあります。今回はユニバーサルプライマーに関連して、以下の項目の記事を書いてみようと思います。

1. ユニバーサルプライマーを選ぶ際に考慮する条件
2. 環境 DNA メタバーコーディングで使用されるユニバーサルプライマー ・ 生物分類群 ・ シーケンサー
3. 自分の研究対象の分類群/種はユニバーサルプライマーで増えるのか ?

ユニバーサルプライマーを選ぶ際に考慮する条件

ユニバーサルプライマーの選択の際に考慮すべき条件は概ね以下のとおりです。

  1. 生物分類群 : 自分たちが興味ある分類群の DNA を増幅できること。これは必須の条件です。また、自分たちが興味ない分類群の DNA を増幅しないこと/増幅しすぎないこと、も重要です。
  2. (種) 同定の解像度 : 解読された DNA 配列を用いて 「どの程度の階層 (種・属・科など) まで生物の分類群を同定できるか」 も重要な指標です。
  3. 増幅産物の長さ : 環境 DNA メタバーコーディングでは高スループットなシーケンサーを用いて配列解読を行いますが、シーケンサー毎に解読可能な配列長が異なります。したがって、どのシーケンサーで配列を解読予定か、予め考慮しなければなりません。

ユニバーサルプライマーの開発論文では、コンピュータ上での計算や実際にサンプルを用いた実験により、上記に関する様々な指標の評価が行われています。なお、本記事ではユニバーサルプライマーの開発方法そのものについては解説しません。

環境 DNA メタバーコーディングで使用されるユニバーサルプライマー ・ 生物分類群 ・ シーケンサー

環境 DNA メタバーコーディングで使用可能なユニバーサルプライマー・対応する生物分類群とシーケンサーをいくつか列挙します。当然 (?) 列挙しきることは不可能なので下の方で参考文献・ウェブサイトも紹介します (それでも足りないですが)。

生物分類群とユニバーサルプライマー

その他、哺乳類 (Ushio et al. 2017)、両生類 (Sakata et al. 2021)、水生昆虫 (Leese et al. 2020)、エビ・カニ類 (Komai et al. 2019) などについてのユニバーサルプライマーも報告されています。真核生物の 18S rRNA 遺伝子領域については PR2 Primer Database で多くの情報が手に入ります。また、Environmental DNA: For Biodiversity Research and Monitoring の巻末にあるユニバーサルプライマーリストも非常に便利です。Earch Microbiome Project のウェブサイト東北大の田邉さんのウェブサイト にも記載があります。

対応するシーケンサー

よく使われるプライマーとシーケンサーの組み合わせは以下のとおりです。一般的に解析する DNA が短い方がシーケンサーの選択肢が多く、シーケンス試薬も安い傾向があります。一方で、短い DNA は解析する領域が同じ場合は、種同定の分解能 (科まで同定可能か、種まで同定可能か、など) は低い傾向にあります。

  • 150 bp x 2 Paired End (iSeq 100, MiSeq, HiSeq, NovaSeq など)

    • MiFish-U-F/R
    • 1391F - EukBr
  • 250 bp x 2 Paired End (MiSeq, NovaSeq など)

    • mlCOIintF - HCO2198
    • 515F - 806R
    • 515F-Y - 926R
  • 300 bp x 2 Paired End (MiSeq のみ)

    • ITS1_F_KYO1 - ITS2_KYO2

また、一般的な組み合わせは以上のとおりですが、515F - 806R や ITS1_F_KYO1 - ITS2_KYO2 を iSeq 100 のシングルエンドで 300 bp 程度連続で読んだりすることもできます。このあたりは、使える予算・かけられる時間・求める種同定の分解能などを考慮して決めることになります。

また、近年は Oxford Nanopore MinION などロングリードシーケンサーの登場により環境 DNA でもより長い領域を解析するような研究も報告されつつあります。

ユニバーサルプライマーで自分の興味ある種の DNA は増えるのか?

さて、調査対象の生物分類群全般を増幅してくれるユニバーサルプライマーは非常に頼もしいですが、当然ながら対象分類群に含まれる生物種の DNA を 100% 増幅してくれるわけではありません。例えば、魚類全般を対象とした MiFish-U-F/R を用いても DNA が増えない or 増えにくい魚種が存在します。 例えば ヤツメウナギの DNA は増えないそうですし、エイ・サメの仲間の DNA も増えにくいようです (なので MiFish-E-F/R がデザインされている; Miya et al. 2015)。

このような状況下で、例えば次のような疑問がよく生まれます:
昆虫を mlCOIintF - HCO2198 のプライマーを用いて環境サンプル中の DNA を網羅的に解析予定だが、このプライマーは自分が特に興味あるハチの仲間の DNA も (もし含まれていたら) 増幅してくれるのだろうか?

最近、特にこういった質問をよくされます。そこで、いくつか典型的なやり方をまとめてみました。 (調べましたが、以下の 3 つ以外の方法はよく分かりませんでした。もし他にいい方法があったら教えて下さい)

1. テキストファイルで検索 (眺める)

最もシンプルなのはこの方法です。興味ある生物の DNA 配列 (FASTA ファイル) がすでにある場合は、そのファイルをテキストエディタで開き、プライマーの配列を検索する、ということが可能です。

例えば、以下のようにクサフグのミトコンドリア DNA の配列が手元にあるとします。

クサフグのミトコンドリア DNA の配列

このテキストファイルに MiFish-U-F の配列 (GTCGGTAAAACTCGTGCCAGC) で検索をかけます。

MiFish-U-F の配列で検索

MiFish-U-F の配列が 1 箇所だけにヒットしました。どうやら一致する領域があるようです。さらに、図は出していませんが、MiFish-U-R の配列の逆相補配列 (“CAAACTGGGATTAGATACCCCACTATG”) に一致する場所も見つかります。したがって、クサフグの DNA は MiFish-U-F/R のプライマーセットで増幅できそう、ということになります。

似たようなことは FASTA ファイルの表示に特化した他のソフトウェアでも可能でしょう。

この方法は、特別な技術やソフトウェアが不要で直感的にわかりやすいのでお手軽かもしれません。ただし、配列が手元にないと調べられませんし、調べたい配列数やプライマー数が増えると大変です。また、上記 515F-Y - 926R などに見られるような縮重塩基を含むようなプライマーと一致する領域を検索で探すのも大変です。さらに、プライマー - 鋳型 DNA のミスマッチを許容しつつ探す、ということはできません。

2. NCBI + seqkit amplicon

2 番目はもう少し網羅的な方法で、少し配列解析っぽくなります。

配列データをダウンロード

まず、NCBI (https://www.ncbi.nlm.nih.gov/nuccore) などの公共のデータベースで興味ある種や分類群の DNA 配列を検索します。「1」 と同じく Takifugu niphobles (もしくは Takifugu alboplumbeus?) を検索します。ミトコンドリア DNA の配列が欲しいので、「Takifugu niphobles AND mitochondrion」 で検索してみます。

NCBI Nucleotide で検索

3 件ヒットしました。これらの配列をダウンロードしたい場合は、チェックボックスにチェックを入れます。

図4. 検索結果

その後、ページの上の方にある 「Send to」 のボタンをクリックして、「Complete Record」 → 「File」 → 「FASTA」 → 「Create File」 を選択すると FASTA ファイルとして DNA 配列がダウンロードできます。

配列のダウンロード

seqkit を使ってプライマーと一致する領域を抽出

さて、ダウンロードした配列ファイルは seqkit というツールで調べます。

seqkit のウェブサイト

配列ファイルを操作する様々な機能を備えており、かつ軽くて高速、使い勝手もいいです。非常におすすめのツールです。インストール方法はこちら

macOS の場合は上記のウェブサイトで seqkit_darwin_amd64.tar.gz を選択してダウンロードします。その後、ターミナルで以下をタイプします。

  1. tar -zxvf seqkit_darwin_amd64.tar.gz
  2. sudo cp seqkit /usr/local/bin/
  3. seqkit version とタイプしてバージョンが表示されればインストールされています。

Windows の場合は上記のウェブサイトで seqkit_windows_amd64.exe.tar.gz を選択します。その後、コマンドプロンプトで以下をタイプします。

  1. tar -zxvf seqkit_windows_amd64.exe.tar.gz
  2. seqkit.exeC:\WINDOWS\system32 にコピー。
  3. seqkit version とタイプしてバージョンが表示されればインストールされています。

インストールができたら、NCBI からダウンロードした配列 (sequence.fasta というファイル) があるフォルダに移動して、ターミナルかコマンドプロンプトで以下をタイプして、seqkit amplicon の機能を使用します。

seqkit amplicon -F GTCGGTAAAACTCGTGCCAGC -R CATAGTGGGGTATCTAATCCCAGTTTG -w 0 -m 0 sequence.fasta

-F にフォーワードプライマー配列、-R にリバースプライマー配列を指定します (ここでは MiFish-U-F/R)。-w 0 は出力する DNA 配列の改行なしのオプション、-m 0 はミスマッチ数 0 の仮定のもとでの抽出を行うオプションです。

すると次のように画面上にプライマーと一致する領域およびその間の領域、つまりは PCR で増幅されうる領域が切り出されます。

seqkit amplicon でプライマーと一致する領域を抽出

もしくは、下記のように入力することで出力結果をファイルに保存できます。

seqkit amplicon -F GTCGGTAAAACTCGTGCCAGC -R CATAGTGGGGTATCTAATCCCAGTTTG -w 0 -m 0 sequence.fasta > amplified.fasta

この方法を使えば手持ちの配列がなくても、興味ある生物の DNA が特定のユニバーサルプライマーで増えそうかどうかを調べることができます。また、seqkit amplicon-m オプションを指定すればミスマッチの数を指定して調べることもできます。さらに、プライマー配列に縮重塩基が含まれていても大丈夫です。

3. カスタムスクリプトを作る

多少のコーディング作業がありますが、「2」 のやり方でほぼ完璧なように思えます。しかし、いくつもの生物分類群やプライマーを調べる必要がある場合は、上記の検索作業を何度も繰り返すことになります。検索して、ファイルをダウンロードして、ターミナルを開いて seqkit amplicon を実行、を繰り返すのはなかなか面倒なものです。

基本的には 「配列のダウンロード」 と 「seqkit amplicon」 が使えれば全て解決するはずなので、全ての作業を R で記述し、一つの関数にすることにしました。少し探したのですが、幸い rentrez という良さそうなパッケージがあったのでそれを利用することにしました。

R から配列のダウンロード

まず、検索ワードを指定して配列の ID などを収集します。

# rentrez のインストールと読み込み
devtools::install_github("ropensci/rentrez")
library("rentrez"); packageVersion("rentrez") # v1.2.3

# 検索ワードを指定 (Trachurus かつ mitochondrion かつ 配列長 1000~20000)
SEARCH_QUERY <- "Trachurus AND mitochondrion AND 1000:20000[SLEN]"

# 検索
rentrez_search <- entrez_search(db = "nucleotide", term = SEARCH_QUERY)

配列をダウンロードして、一度書き出して保存します。

# 配列をダウンロード
entrez_fasta <- entrez_fetch(db = "nucleotide", id = rentrez_search$ids, rettype="fasta", parsed = FALSE)

# FASTA ファイルとして書き出し
write.table(entrez_fasta, file = "entrez_fasta.fa", quote = FALSE, col.names = FALSE, row.names = FALSE)

R の system 関数を使って seqkit amplicon を R から実行して、プライマー (ここでは MiFish-U-F/R) と一致する領域を持つ配列を抽出します。

system("seqkit amplicon -F GTCGGTAAAACTCGTGCCAGC -R CATAGTGGGGTATCTAATCCCAGTTTG -w 0 -m 1 entrez_fasta.fa > amplified.fa")

これで amplified.fa という FASTA ファイルに MiFish-U-F/R で増幅されうる領域が書き出されます。以上の操作を関数としてまとめれば、検索ワードを変更するだけでどんどん 「自分の研究対象種/分類群はユニバーサルプライマーで増えるのか ?」 を調べることができます。

おまけ!

実は seqkit amplicon は 「縮重塩基を含むプライマー + -m オプションを使ったミスマッチ数の同時指定」 ができません (これ、昔はまって seqkit の開発者に質問したことがあります; 正確に言うと seqkit 内で解決できる問題ですが、手作業でやると少々ややこしいです)。-F もしくは -R に縮重塩基を含むプライマーを指定すると -m オプションは無視されます。

そのへんの問題を自作の関数で解決しつつ、上記のカスタムスクリプトを関数としてまとめてみました。ついでに以前から興味があった R package の作成に挑戦するのにいい機会 (?) ということで、単純な関数ではありますがパッケージ化を試みました。成果物が以下です。

もし 「自分の研究対象種/分類群はユニバーサルプライマーで増えるのか ?」 を調べる必要があったら使ってあげてください。

rDoAMP (DOes my primer set AMPlify my targets?)
https://github.com/ong8181/rDoAMP

詳しくは Github のページを読んでもらうといいのですが、devtools::install_github("ong8181/rDoAMP") でインストール可能です。seqkit が正しくインストールされていれば macOS と Windows で動作します。Linux でも動くはずですが未確認です。

縮重塩基を含むプライマーの問題は expand_degenerate_primer() という関数を用意して、あり得るプライマーの組み合わせを tsv ファイルとして書き出し、それを用いることで解決しています。例えば以下のようなコマンドを使っています。-p プライマーリスト のオプションと -m のオプションは同時使用可能です。

seqkit amplicon -p primer_list.tsv -m 3 download.fa | seqkit rmdup -w 0

また、entrez_search はヒットした ID を上から順番に取ってくるので、似通った配列の ID が連続して取得されることが多いです。そこで、デフォルトでは予めダウンロード予定の配列数の 10 倍の ID を取得しておいて、その中からランダムにダウンロードする配列を選ぶ、という風にしています。こうすることで取得する配列の多様性が挙がります。

(いろいろ小細工しましたが、ほぼほぼ seqkit amplicon です。seqkit すごいです)

R package の作成は以下のウェブサイトを参考にさせていただきました (どうもありがとうございます)。楽しかったです (もっと勉強します)。

参考文献・情報

Written with StackEdit.

2021年8月14日土曜日

定量的な環境 DNA メタバーコーディング

20210814_Blogger0016

近年、環境 DNA メタバーコーディングは 「野外や実験室でのプロトコルの確立」 「シーケンス技術の発達」 「データ解析パイプラインの充実」 などのおかげで、野外における生物相調査の方法として非常に popular な技術になりつつあります (もうなっている?)。しかし、まだまだ手法として検討・改善の余地のある部分も多くあります。環境 DNA をどのように定量するか、はその一つであり、現在でも様々な改善が試みられています。環境 DNA 分析を行う人、行いたい人にとっても定量は興味があるところのようで、最近とくに定量的環境 DNA メタバーコーディングに関して多く質問をもらいます。

そこで今回は、定量的な環境 DNA メタバーコーディングについての記事を書こうと思います。

なお、本記事内では 「環境 DNA」 に微生物 DNA も含んで話を進めます。また、環境 DNA = Environmental DNA = eDNA と記載します。eDNA そのものについての基礎的な部分はすでに Wikipedia にも日本語の解説があります。また、最近、『環境 DNA ―生態系の真の姿を読み解く―』という日本語の本も出版されましたので、興味ある方はご一読いただければと思います (自分も一部執筆しています)。

eDNA メタバーコーディングにおける 「定量」 とは

まず、「eDNA を定量的に分析する」 と言った場合に、その意味することに2つのパターンがありえます。

1. サンプル中の eDNA の濃度を定量する

「eDNA を定量的に分析する」 を文字通りに解釈するとこちらの意味となります。例えば、水サンプル中に調査対象となる生物種の DNA がどの程度含まれているか、その濃度を測ります。最終的な結果は “xx copies/ml water” とか、“xx ng/ml water” といった単位で表されるでしょう。 対象種が 1 種であれば、定量 PCR を用いることで定量が達成できます。

2. eDNA の濃度から調査対象の種の個体数やバイオマスを推定する

文字通りの意味とはやや異なりますが、しばしば勘違いされるのがこちらの意味です。実際の生物調査では、調査する人が最終的に欲しいのは eDNA の濃度そのものではなく、調査対象種の個体数やバイオマスの情報であることがほとんどです。現状では、調査対象種の個体数やバイオマスを知るために、「eDNA の濃度が調査対象種の個体数やバイオマスを反映している」 と仮定して eDNA を定量していることが多いです。この仮定は、魚由来の eDNA を水サンプルから抽出して定量する場合はどうやら概ね正しいようです (Takahara et al. 2012; Yamamoto et al. 2016; Stoeckle et al. 2017)。また、個体 (細胞) そのものをまるごと分析することになる微生物が対象の場合も概ね正しいでしょう。ただし、他の生物や他のサンプルではどうか、は注意深く考える必要があります。例えば、森林の池から陸生哺乳類の eDNA が検出可能であることが分かっていますが (Ushio et al. 2017)、その濃度が森林全体の陸生哺乳類の量とどのように関係しているかはわかりません。また、魚や微生物の場合でも、eDNA の濃度のみから厳密な個体数の推定は容易ではありません。魚であれば、種・行動・成長段階によって eDNA の放出速度が変わるでしょうし、オープンな水域であれば eDNA の拡散過程や分解速度を考慮する必要もあるでしょう (労力をかけてこれを行ったのが Fukaya et al. 2021)。細菌の 16S rRNA 遺伝子を対象とした解析の場合は、各細菌種がもつ 16S rRNA 遺伝子コピーの数が異なることも問題になるでしょう。

いずれにしても、「2」 の意味での定量はかなりハードルが高く、未だに革新的な技術は生み出されていません。今回はその前段階である 「サンプル中の eDNA 濃度を定量する」 について主に解説します。

定量 PCR と eDNA メタバーコーディング: なぜ通常の eDNA メタバーコーディングは定量的でないのか

さて、eDNA を定量したいとして、対象種が 1 種であれば種特異的なプライマーをデザインして、定量 PCR を行えば問題は解決します。プライマーがきちんとデザインできて、検量線がきちんと引けていれば、PCR 阻害などの問題は起こるかもしれませんが、感度の高い定量が可能でしょう。

一方で、調査対象種が複数いる場合、または調査する系に何種類の生物 (例えば魚) がいるかは分からないが、とにかく網羅的にそれらを検出して解析したい場合は Illumina MiSeq などの High-throughput sequencer を用いた eDNA メタバーコーディングを行うことになります。

なお、定量 PCR と eDNA メタバーコーディングは eDNA 分析で用いられる最も代表的な手法でそれぞれメリット・デメリットがあります (図 1 参照)。

図 1. 定量 PCR と eDNA メタバーコーディング

eDNA メタバーコーディングを行えば、サンプルから網羅的に調査対象種を検出することが可能ですが、定量性は失われます (“xx copies/ml water” などという値で結果は出ない)。なぜでしょうか?

eDNA メタバーコーディングでは配列解析をした後、「種 A 由来 (と思われる) 配列があるサンプルから XX 本」 というデータが得られます。この 「配列 XX 本」 というのは、最終的にシーケンサーに投入したあるサンプル中の種 A 由来の DNA 濃度に概ね比例します。しかし、eDNA メタバーコーディングでは、一般的にはシーケンサーに投入するまでに、増幅・精製・切り出し・濃度調整などのサンプル処理プロセスが必要です (「ライブラリ調整」 などと呼ばれます)。これらのプロセスの内、特に定量性を損なう原因となるのは増幅と濃度調整のプロセスです。 (ただし、実験手法にもよりますし、異論もあるとは思います。個人的見解が入っています。)

増幅のプロセスでは解析のターゲットとなるゲノム領域が増幅されますが、環境サンプルでは、サンプルごとに PCR の効率がかなりばらつきます。抽出 DNA に含まれる PCR 阻害物質の量がサンプルごとに違うことが要因の一つと考えています (が、他にも理由があるかもしれません)。これにより、同じ量の DNA が各サンプルに入っていたとしても、増幅後の PCR 産物の濃度はサンプルごとに変わってしまいます。

また、eDNA メタバーコーディングでは、しばしば各サンプルから得られる配列数を同程度にするために、各サンプルの増幅・精製後の PCR 産物の濃度をあえて均一に揃える、という操作をすることがあります。これはあえて定量性を無くしているとも言えますが、各サンプルからの取得配列を同程度にすることで、各サンプルに対する 「調査努力量」 を揃える効果があります。

その他、PCR 産物の精製に AMPure を用いたビーズ精製を利用する場合は、PCR 産物の濃度が濃すぎる場合にビーズに吸着しきらない DNA が出てくるため、このプロセスも定量性に影響がありそうです。これら様々なプロセスを経て、「最終的にシーケンサーに投入したあるサンプル中の種 A 由来の DNA 濃度」 が決まります。そのため、基本的には「あるサンプルから得られる種 A 由来の配列 XX 本」 ≒ 「最終的にシーケンサーに投入したあるサンプル中の種 A 由来の DNA 濃度」 は 「抽出 DNA に含まれていたあるサンプル中の種 A 由来の DNA 濃度」 を反映しません。

定量的 eDNA メタバーコーディング: 方法の概要

eDNA メタバーコーディングは網羅的に種を検出できる、という点で非常に強力ですが、上記で述べたように定量性があまりありません。eDNA メタバーコーディングに定量性を付加することができれば、定量性と網羅性を同時に達成する eDNA 分析ができることになります。定量性を持った多種の eDNA モニタリングデータは適用できる解析の幅も広がり、定量性を持たない eDNA データに比べてより多くの情報を提供してくれます。

そこで、Ushio et al. (2018) Metabarcoding & Metagenomics では定量的 eDNA メタバーコーディングの手法を開発し、その性能を検証しました。

方法

Ushio et al. (2018) で採用した手法は極めてシンプルで、「PCR による増幅の前にサンプルに濃度既知の標準 DNA を添加する」 というものです (図 2)。この方法自体は完全に新規なものというわけではなく、類似の方法は RNA-seq や土壌微生物の研究で使用されていました (例. Smets et al. 2016; 魚の eDNA に適用したのはおそらく Ushio et al. 2018 が初めて)。

この手法では、標準 DNA を複数種類 (3-5 種類) 用意し、濃度を調整して 「PCR 前」 にサンプル (実際には PCR の反応溶液) に添加し、その後通常のライブラリ調整を行います。図 2 では、赤・青・緑の 3 つの標準 DNA を濃度 1, 2, 3 で PCR 前に加え、ライブラリ調整をしています。

図 2. 標準 DNA を用いた定量的 eDNA メタバーコーディング

途中、増幅や精製を経ても、最終的に 「投入した標準 DNA の濃度」 と 「得られた標準 DNA の配列数」 に線形の対応が見られれば (この線を検量線、と呼んでいます)、ライブラリ調整やシーケンスのプロセスをすべて含めた結果、「サンプル中の単位 DNA 量あたり何本の配列が取得されるか」 が分かることになり、標準 DNA 以外にもともとサンプル中に含まれていた DNA の濃度も推定できます。

この手法では、実際に 「投入した標準 DNA の濃度」 と 「得られた標準 DNA の配列数」 の間に線形な関係が見られるかどうかが問題になりますが、これまでに実施したほぼすべてのケースで、良好な直線関係が得られています。

例えば、下の図 3 は Ushio (2020) bioRxiv で公開中の査読前プレプリントの Fig. S3A, B です。

図 3. 標準 DNA の濃度と取得配列数の直線的関係 (Ushio 2020 の Fig. S3A, B).

Ushio (2020) では、人工水田から採取した 610 の水サンプルから DNA を抽出し、標準 DNA を添加した定量 eDNA メタバーコーディングを実施しました。標準 DNA には人工合成 DNA を利用しました。610 サンプルの 4 つの DNA 領域 (16S rRNA, 18S rRNA, COI, ITS) を分析しており、すなわち合計 2,440 サンプルのシーケンスが行われたことになります。

図 3 A (左のパネル) は 16S rRNA を分析した結果で、横軸に投入した標準 DNA の濃度、縦軸にシーケンス後に得られた配列数をプロットしています。3 本の直線が引かれていますが、標準DNAの配列数 = 傾き × 標準DNAの濃度 として回帰した時の回帰係数 (= 傾き) が最も高かったサンプル、中間のサンプル、最も低かったサンプル、の結果を例として示しています。この図 3 A からは2つのことがわかります。1つ目は、投入した標準 DNA の濃度と取得配列数の間には非常に綺麗な直線関係があるということです。つまり、DNA 1 copy あたり取得されうる配列数がサンプルごとに推定可能ということです。2つ目は、サンプルによって直線の傾きが大きく違う、ということです。つまり、あるサンプルでは 50,000 copies/µl の DNA を投入すると 5,000 配列程度の配列が取得されるのに対して、違うサンプルでは 1,000 配列程度しか取得されない、ということが起こっています。これを見ても、「配列数そのものは DNA 濃度の指標とならない」 ことがわかります。

図 3 B はこの直線の R2R^2 (決定係数) の分布を解析対象した 4 つの領域ごとに示しています。概ね、ほとんどのサンプル・領域で R2>0.9R^2 > 0.9 です。つまり、ほとんどのサンプル・領域について、投入した標準 DNA の濃度と取得配列数の間には綺麗な直線関係があるということがわかります。

定量的 eDNA メタバーコーディング: 利点・不利点

標準 DNA を用いた定量的 eDNA メタバーコーディングは多種に対して同時に eDNA 量の推定を可能にします。これは大きな利点ですが、同時にいくつかの不利点もあります。ここではこの手法の利点・不利点をリストアップしてみます。また、利点とも不利点とも言えないが、実際の運用や結果の解釈において注意深く考慮すべき点もありますので、それらもリストアップします。

ちなみに微生物の研究に関する情報がメインですが、Harrison et al. (2020) Molecular Ecology Resources “The quest for absolute abundance: The use of internal standards for DNA-based community ecology” においても、以下に上げた項目のうちいくつかと共通する内容が議論されています。

利点

  • 網羅的な種検出と同時に DNA 量の推定ができる
    言うまでもなく一番の利点は網羅的な種検出と同時に DNA 量の推定ができることです。手前味噌ではありますが、標準 DNA を用いたメタバーコーディングが他の DNA 定量手法と比べてどのような測定値を出すかについて、これまでいくつかの検討を行っています (図4, 5)。

    図 4. 定量 eDNA メタバーコーディングによる定量と他の手法との比較 (Ushio 2020 の Fig. S3C, D, E)。© 蛍光により定量した全 DNA 量 (Quant-IT を使用) と定量メタバーコーディングにより推定した全 DNA コピー数の関係。(D) 定量 PCR と定量メタバーコーディングにより定量した 16S rRNA 遺伝子の全コピー数の関係。(E) 定量 PCR で測定した 16S rRNA 遺伝子の全コピー数と 定量メタバーコーディングの際に取得した 16S rRNA 遺伝子の全配列数の関係。点線は Ⅱ 型回帰による回帰直線。点の色はサンプルを取得した水田プロット。

    図 4C では、蛍光法で定量した全 DNA 量と定量メタバーコーディングで定量した全 DNA コピー数の関係を示しています (手法の細かい部分は Ushio 2020 bioRxiv の Supplementary Information を参照)。軸は両対数ですが、それにしてもきれいな対応関係が見られます。図 4D は 16S rRNA 遺伝子のコピー数を定量 PCR と定量メタバーコーディングで測っていますが、こちらもきちんと対応関係がみられます (ただし、1:1 のラインからは少しずれています)。一方、シーケンサーから出力される配列数と定量 PCR による 16S rRNA 遺伝子の定量結果の間にはきれいな対応関係は見られません (図 4E)。
    図 5. 定量 eDNA メタバーコーディングによるカタクチイワシの定量と種特異的な定量 PCR との比較 (Ushio 2018 の Fig. 4b)。点線は 1:1 のライン。実線は線形回帰の直線。点の色は定量メタバーコーディングの際に得られた各サンプルの検量線の傾きを示す。詳しくは Ushio et al. (2018) を参照。

    また、魚の eDNA に関しても図 5 で示すような検討を行っています。舞鶴湾のカタクチイワシ eDNA を定量メタバーコーディングと定量 PCR (TaqMan) で測定した結果ですが、きれいな対応関係が見られます。もちろんここまできれいな対応関係が見られない場合もあって、その例や考えられる理由は Ushio et al. (2018) で考察しています。とは言うものの、定量 eDNA メタバーコーディングは、特に優占的な種については既存の手法とよい対応関係が得られるような結果を出してくれるようです。

  • 異なる研究の間で結果の比較ができる
    eDNA の定量ができる、ということはその値を異なる研究間で比較できる、ということになります。これはメタ解析などを行う上ではかなり有益と考えています。一方で、配列数しか得られない場合は、配列数は実験手順や使用するシーケンサーによって大きく変わるので、各種の割合 (群集組成) に注目した (メタ) 解析しかできない、ということになります。

  • 適用できる統計解析が広がる
    eDNA の濃度が分かると割合データには適用できなかったデータ解析が適用可能になります。例えば、何度かこのブログで紹介した Empirical Dynamic Modeling (EDM) は基本的には割合データには適用できません (この記事の最後の方に書いてます)。そもそも、一連の eDNA の網羅的定量化の方法は eDNA データに EDM を適用するために開発しました。

不利点

  • 標準 DNA を準備しなければならない
    定量 eDNA メタバーコーディングを行うためには標準 DNA を準備しなくてはなりません。標準 DNA は 「分析予定のサンプルには標準 DNA の配列が含まれていない」 という条件を満たさなければなりません。舞鶴湾の魚類 eDNA を分析した Ushio et al. (2018) では東南アジア・アフリカの淡水魚の抽出 DNA を標準 DNA として利用しました (舞鶴湾には決して居ないはずの魚)。Ushio (2020) bioRxiv では人工合成 DNA を利用しています。人工合成 DNA は (i) 使用予定のプライマーと完全一致するプライマー結合部位を持ち、(ii) インサート領域には解析対象の生物群類群 (例えば、原核生物) と同じ保存領域を持ち、(iii) しかし可変領域は現在登録されているどの解析対象生物とも一致しない、という 3 つの特徴を持つようにデザインしました。

  • 投入する標準 DNA の濃度を決めなければならない
    定量 eDNA メタバーコーディングを実行する上でこれが一番厄介だと感じています。つまり、投入する標準 DNA の濃度が薄すぎると、標準 DNA の配列が検出されないサンプルが出てきてしまい、そのようなサンプルは検量線が引けず、取得した配列数を DNA 濃度に変換できないことになります。一方、投入する標準 DNA の濃度が濃すぎると、検出される配列のほとんどが標準 DNA になってしまい、肝心のサンプル中にもともと含まれていた生物の DNA が検出されない、ということになってしまいます。投入する標準 DNA の濃度は以下のような方法で見積ることができます。

    1. 定量 PCR で解析予定サンプルの解析対象領域を定量する。
    2. 解析予定サンプルと標準 DNA の解析予定領域をメタバーコーディングのライブラリ調整と同様に PCR で増幅し、増幅産物の濃度を定量する。
    3. 少数の代表サンプルについて、実際にいくつかの濃度で標準 DNA を混ぜて、ライブラリ調整をしてシーケンスまで行う。MiSeq であれば MiSeq V2 試薬キット Nano/Micro といったシーケンスのスケールが小さく価格も安い試薬キットがあるので、それらを使って予備シーケンス。

    時間とお金に余裕がある場合は 「3」 の選択肢が一番確実です。Ushio (2020) bioRxiv では一度のシーケンスで 700 近くのサンプルをシーケンスする必要があったので、MiSeq V2 試薬キット Nano を使って 50 サンプルほどの代表サンプルを予備シーケンスして、投入する標準 DNA の濃度を決めていました。

  • 出力される配列の少なくない割合が標準 DNA に "喰われる"
    上記の問題と関連しますが、適切に投入する標準 DNA の濃度を決めたとしても、それなりの割合の配列が標準 DNA に割り振られます (いつも “喰われる” と言ってます)。これまでのシーケンスでは、だいたい 30% 程度の配列が標準 DNA に喰われていますが、ちょっともったいない感じがするのは否めません。経験上、検量線はうまく引ける場合がほとんどなので、Ushio et al. (2018) や Ushio (2020) で使用した 5 点で検量線を書く方法ではなく、3 点で検量線を描く方法でもいいのかな、と思い始めています。実際、Tsuji et al. (2020) Molecular Ecology Resources では 3 点の検量線を用いてアユの種内多型を定量的に解析していますが、きれいな結果を得ることができています。

  • 実験室が汚染される恐れがある
    定量 eDNA メタバーコーディングは標準 DNA として同じ配列を何度も大量に増幅します。結果として、実験操作のミスや廃棄物の処理を適切に行なっていないと、実験室環境を同じ配列の増幅産物で汚染してしまうことになりかねません (しばしばその危険性を指摘されます)。現在のところ、自分の実験環境では深刻な汚染が起こったことはありませんが、これから導入を考えている場合は注意が必要でしょう。

考慮点

  • DNA 抽出効率は考慮されない
    ここで紹介した方法は、DNA を抽出した後に標準 DNA を添加するので、標準 DNA 添加以前の過程は考慮できません。例えば、サンプルによって DNA 抽出効率に差がある場合でも、「各サンプル間で DNA 抽出効率に差はない」という仮定をおいて解析を進めていることと同じになります。環境サンプルの場合はサンプル間で抽出効率が多少なりとも違うということは起こりそうです。土壌微生物を解析した Smets et al. (2016) では DNA 抽出を始める前に土壌に検量線を引くのに使う微生物 (土壌にはまずいないであろう微生物) を添加しており、サンプルごとの DNA の違いを考慮したものとなっています。ただし、微生物種間での DNA 抽出効率の違いはこの方法でも考慮できません。

  • プライマーの match/mismatch に起因する生物種間での増幅効率の差は考慮されない
    標準 DNA はしばしばプライマー領域が使用予定のプライマーと完全一致するようにデザインされています。しかし、実際の解析対象生物の中にはプライマーとミスマッチがあるプライマー領域を持つものもいるでしょう。そのような場合、PCR における増幅効率が標準 DNA と異なることが想定されますが、このような違いも今回紹介した方法では考慮できません。研究上重要な特定の解析対象生物種がいる場合は、あえてプライマー領域にミスマッチのある標準 DNA をデザインして検量線を引くのもいいかもしれません。

標準 DNA を用いる以外の定量的メタバーコーディングの方法

今回紹介した標準 DNA を用いる以外にも定量的・網羅的な eDNA データを得る方法があります。ここでは2つ、概要だけ紹介します。

Unique Molecular Identifier (UMI) を利用する方法

UMI はランダムな塩基を複数 (例えば、12個) つなげてつくる 「分子特異的なタグ」 です。DNA の塩基は 4 種類なので、例えば 12 個のランダム塩基 (N で表す) をつなげるとすると、NNNNNNNNNNNN となりますが、その中身は 412=16,777,2164^{12} = 16,777,216 種類の塩基配列となります。この UMI とプライマー配列 (例えば MiFish-F) をくっつけると NNNNNNNNNNNNGTCGGTAAAACTCGTGCCAGC となります。1677万コピー以下しか MiFish 領域が存在しないサンプルに対して、このようなプライマーを用いて PCR を 1 回分だけ行うと、理想的には MiFish プライマーと 1677万種類のうちどれか一つの 「タグ」 がついた産物ができます (確率的な挙動を考えると間違っていますが、話を単純にしています)。このタグ配列が以後置き換わらないようにライブラリ調整を行い、シーケンスをします。すると、理想的には NNNNNNNNNNNN はかぶることなくテンプレートの DNA と結合するので、シーケンス後に NNNNNNNNNNNN の種類数を数えればそれがそのままテンプレート DNA 中の解析対象 DNA の濃度になります。

この技術も RNA-seq などで頻繁に使われ、細菌の 16S rRNA 解析にも使用されています (Hoshino & Inagaki 2017 PLoS ONE)。また、最近、水槽水の魚の eDNA 定量にも応用されました (Hoshino et al. 2021 Scientific Reports)。

この方法は標準 DNA を必要としないため、標準 DNA の用意・投入する標準 DNA の濃度の決定・配列が標準 DNA に喰われる、などの問題を回避できます。一方で、1 回目の反応でタグ付きのプライマーが狙った DNA と結合するかどうかが鍵のようで、解析対象の eDNA の濃度が低い場合 (= 魚類などのマクロ生物を野外の水で検出する場合など) について、どれほどの感度で定量が可能なのか、慎重に検討する必要があります。また、アンプリコンシーケンスにおいて UMI を効率的に処理するパイプラインもまだあまり充実していないようです。探した限りでは Clements et al. (2018) Bioinformatics による AmpUMI というツールが使えるかもしれません (RNA-seq の場合は他にも色々ツールがあるようです)。

他の手法で補正する方法

もう一つの手法は、通常の eDNA メタバーコーディングを行った後に他の手法で解析対象の生物全体の絶対量を測定し、その絶対量に eDNA メタバーコーディングで分かる割合データ (相対優占度) を掛けて、各生物種の絶対量とする、というやり方です。例えば、細菌が解析対象であれば、定量 PCR による 16S rRNA 全コピー数の定量や顕微鏡観察による細菌の全細胞数の計測などによって細菌の全体量を推定し、そこに eDNA メタバーコーディングによる割合データを掛ければよいでしょう。また、通常の eDNA メタバーコーディングを行った後、(ほぼ) すべてのサンプルから出てくる生物種について、後から定量 PCR で eDNA の絶対量を測る、というやり方も考えられます。例えば、魚であればクロダイやアジ、フグの仲間は日本の多くの沿岸域で見られると思いますが、それらの eDNA 量を定量すれば、通常の eDNA メタバーコーディングのデータと合わせて、サンプルごとに単位 eDNA 量あたり得られる配列数の推定が可能になり、その他の魚種についても eDNA の絶対量が推定できます。ただし、この定量 PCR での事後補正は、サンプルごとに異なるかもしれない PCR 阻害の効果の補正はできません。また、ほとんどのサンプルから出てくる生物種、というのが見つからない場合は使用できません。一方で標準 DNA を用意する必要がないため、上記で紹介した標準 DNA 関連の不利点は回避できます。

まとめ

さて、いろいろと紹介させてもらいましたが、現時点では標準 DNA を用いた eDNA メタバーコーディングは、網羅的かつ定量的に eDNA を分析したい場合、有力な候補となる方法です。特に、現状 UMI での正確な定量が難しそうな低濃度なマクロ生物の eDNA を分析する際は有効でしょう。一方で、標準 DNA の準備や投入する濃度の決定などが手間であることも事実です。これらの点をなんとか克服して、定量的・網羅的な eDNA 分析が簡便・迅速に実行できるようにする、というのが当面の課題です。

また、環境サンプル中の eDNA のより長い配列がより正確に分析できて、eDNA から 「個体識別」 ができるようになれば、個体数を数えることが可能になり、「eDNA から調査対象の種の個体数やバイオマスを推定する」 ことが一気に現実的になってきます。こちらもずいぶんチャレンジングですが、このようなことができれば、eDNA 分析が提供できる情報の価値がさらに増すでしょう。

参考文献

Written with StackEdit.

2021年4月28日水曜日

phyloseq による DADA2 処理後の統計解析

20210428_Blogger0015

以前のブログDADA2Claident を用いたアンプリコンシーケンスのデータ解析について触れました。今回は DADA2 と Claident を用いて「分類群 × サンプルのテーブル」ができた後の解析について解説します。DADA2 は Amplicon Sequence Variant (ASV) を生成するので、ここではこの「分類群 × サンプルのテーブル」を ASV テーブルと呼ぶことにします。分類群 = Operational Taxonomic Unit (OTU) の場合は OTU テーブルと呼びます。

DADA2 後の統計解析

DADA2 で ASV テーブルを作成した後はいくつかお決まりの解析が待っています。ここでは以下の 5 点について、R と phyloseq パッケージを利用した実装とともに解説します。

  • 群集組成バターンを棒グラフで可視化
  • 種多様性パターンの可視化
  • Rarefaction カーブの作成
  • 次元圧縮によるパターンの可視化
  • ASV の再クラスタリング

phyloseq は McMurdie & Holmes (2013) PLoS ONE で発表されたアンプリコンシーケンスのデータの統計解析を行うための R のパッケージです。2021年4月時点で5000回以上引用されているようです。公式チュートリアルはこちら

デモデータ

今回も Ushio (2019) Methods in Ecology and Evolution のデータを使います。全配列データは DRA (ここここ) に、全解析コードやメタデータは Zenodo (ここ) にアーカイブしてありますが、今回のデモでは一部のデータだけ使用します。

研究は DNA 抽出法の検討をするために行いました。複数のサイトから環境水をサンプリングし、16S メタバーコーディングを行っています。DNA 抽出法は 3 種類試しました。デモ用のデータは、2サイト (Site = “sea”, “pond”)、3抽出法 (Method = “w_beads”, “wo_beads”, “destruction”)、5反復 + ネガコン のデータを含みます。

DADA2 や Claident の部分は飛ばして、ASV table からスタートします。Github にデモデータやスクリプトを置いたので、自分で再現したい方はダウンロードしてください (https://github.com/ong8181/random-scripts/tree/master/05_DADA2Phyloseq)。

準備

まずは以下のコードで必要なパッケージをロードします。

# Load library and functions
library(tidyverse); packageVersion("tidyverse") # 1.3.0
library(phyloseq); packageVersion("phyloseq") # 1.34.0
library(cowplot); packageVersion("cowplot") # 1.1.1
library(ggsci); packageVersion("ggsci") # 2.9
theme_set(theme_cowplot())

tidyverse はデータ整形を効率的に行うため、cowplotggsci は可視化のための ggplot2 パッケージの補助パッケージです。ggplot2tidyverse をロードするときに同時にロードされています。theme_set(theme_cowplot()) で図のテーマを指定しています (これはただの好みです)。

パッケージのロードができたら以下のコードでサンプルメタデータ、ASV テーブル、 分類群情報を読み込みます。分類群情報は Claident で推定したものです。

sample_sheet <- read.csv("data_subset/sample_sheet.csv", row.names = 1)
asv_sheet <- read.csv("data_subset/asv_sheet.csv", row.names = 1)
tax_sheet <- read.csv("data_subset/tax_sheet.csv", row.names = 1)

phyloseq へのデータの読み込み

デモデータの読み込みができたら、まずはデータがきちんと phyloseq オブジェクトに変換できる形になっているかどうかを確認します。

dim(sample_sheet); dim(asv_sheet); dim(tax_sheet)
all(rownames(asv_sheet) == rownames(sample_sheet))
all(colnames(asv_sheet) == rownames(tax_sheet))

以下の条件を満たしている必要があります:

  • asv_sheet の行数 = サンプル数 = sample_sheet の行数
  • asv_sheet の行名 = サンプル ID = sample_sheet の行名
  • asv_sheet の列数 = 分類群数 = tax_sheet の行数
  • asv_sheet の列名 = 分類群 ID = tax_sheet の行名

今回は ASV テーブルの行 = サンプル、列 = 分類群、となっていますが、行と列を逆にしたテーブルも読み込み可能です。データが phyloseq オブジェクトに変換できる形になっていることを確認できたら、以下のコードで phyloseq オブジェクトを生成します。

ps_all <- phyloseq(otu_table(asv_sheet, taxa_are_rows = FALSE),
                   sample_data(sample_sheet),
                   tax_table(as.matrix(tax_sheet)))

ASV テーブルの行 = 分類群、列 = サンプル、となっている場合は taxa_are_rows = TRUE としてください。tax_sheetas.matrix() をかまさないと読み込めないのですが、理由は分かりません。また、系統樹情報も同時に読み込むことができますが、今回は利用しません。

phyloseq にはいくつものデータハンドリングのための関数が用意されています。

  • サンプルを絞る
## Select "sea" samples
subset_samples(ps_all, Site == "sea")

## Select samples with total reads > 10^4
prune_samples(sample_sums(ps_all) > 10^4, ps_all)
  • 分類群を絞る・優占種を選ぶ
## Select "Proteobacteria" phylum
subset_taxa(ps_all, phylum == "Proteobacteria")

## Select top 50 taxa
top_taxa <- names(sort(taxa_sums(ps_all), decreasing = TRUE)[1:50])
prune_taxa(top_taxa, ps_all)

subset_xxx()prune_xxx() が似ていますが、選びたいサンプル名や分類群名のリストがある場合は prune_xxx() が便利です。例えば、select_samples <- c("R001", "R002", "R003") とある場合は prune_samples(select_samples, ps_all) として選べます。ps_all を入れるべき位置が subset_xxx()prune_xxx() で違う理由は分かりません。

  • 配列の値を変換
## Transform sample counts
transform_sample_counts(ps_all, function(x) 100* x / sum(x))
transform_sample_counts(ps_all, log)

上では配列を相対値に変換、log を取る、という操作をしています。

全体のパターンを棒グラフで可視化

群集組成の可視化

plot_bar() で全体のパターンを確認できます。また、 + を続けることで ggplot2 の機能が利用できます。scale_fill_igv()ggsci パッケージ内のカラーパレットです。

# plot_bar
plot_bar(ps_all, x = "Sample", fill = "phylum") + scale_fill_igv()

facet_wrap() を使って、サイトと手法ごとに分けて結果を表示。

plot_bar(ps_all, x = "replicate", fill = "phylum") +
  facet_wrap(.~ Site + Method) + scale_fill_igv()

種多様性パターンの可視化

plot_richness() で多様性パターンを可視化できます。以下ではシンプルに検出 ASV の数をプロットしています。

# plot_richness
plot_richness(ps_all, measures = "Observed")

measures の引数を変更するとシンプソンやシャノンの多様度指数も図示することができます。

psmelt()ggplot() による可視化

psmelt() を使うと元データをバラすことができ、より自由度の高い可視化が可能になります。例えば、以下は最も優占していた分類群の配列数を箱ひげ図 + ジッタープロットで表示したものです。

# Visualize patterns (scatterplot)
ps_m1 <- psmelt(ps_all) %>%
  select(OTU, Sample, Abundance, Site, Method) %>%
  filter(OTU == top_taxa[1], Site == "pond")
ggplot(ps_m1, aes(y = Abundance, x = Method)) +
  geom_boxplot(outlier.shape = NA, width = 0.2) +
  geom_jitter(height = 0, width = 0.2)

Rarefaction カーブ

「自分の配列データが多様性をどの程度を捉えているのか」 を配列数が増える毎にどのくらい検出 ASV の数が増加していくのかで把握します。この「検出 ASV 数 v.s. 配列数」の曲線は rarefaction カーブと呼ばれ、微生物群集関連の研究では頻繁に登場します。以下では、ここの記事を参考に rarefaction カーブを ggplot で書いています。

まず、群集生態学関連のパッケージ vegan でデータを rarefy しています。ちなみにこの時点でも図が出力されます。これ以後のコードは単に ggplot で描くためだけのものです。

## From 
# Rarefy samples
ps_rr <- vegan::rarecurve(as.matrix(otu_table(ps_all)), step = 50, label = TRUE)

rarecurve で得た出力 (ps_rr) を ggplot 向けに整形します。

rare <- lapply(ps_rr, function(x){
  b <- as.data.frame(x)
  b <- data.frame(ASV = b[,1], raw_read = rownames(b))
  b$raw_read <- as.numeric(gsub("N", "",  b$raw_read))
  return(b)
})
# Label list
names(rare) <- rownames(sample_data(ps_all))
# Convert to the data frame
rare_df <- map_dfr(rare, function(x) return(data.frame(x)), .id = "sample")

最後に ggplot で図示します。概ね 5,000 – 10,000 配列以上取得しても出現する ASV の数に変化はないようです。ただし、DADA2 による解析結果は原理上シングルトンが出現しないので解釈には注意が必要です。

# Visualize with ggplot
ggplot(rare_df, aes(x = raw_read, y = ASV, color = sample)) +
  geom_line() + scale_color_igv() +
  xlab("Reads") + ylab("The number of ASV")

次元圧縮によるパターンの可視化

次元圧縮 (次元削減) による高次元データの可視化は全体のパターンを把握する上で非常に有効です。以下では、NMDS、t-SNE、UMAP を適用して微生物群集データを 2 次元で可視化しています (各手法の原理の詳細はここでは解説しません)。

ここではデータのうち海から取得した配列データ (Site == "sea" のサンプル) に対して次元圧縮を適用してみます。また、ネガコンを除いたサンプルのみ (sample_nc == "sample") を解析します。

ps_sea <- subset_samples(ps_all, Site == "sea" & sample_nc == "sample")

NMDS

Nonmetric Multidimensional Scaling (NMDS; 非計量多次元尺度法) は次元圧縮の古典的な手法です。phyloseq では ordinate()plot_ordination() で解析を実行できます。ランダムな過程を含むので、再現性確保のために乱数のシードを設定しています。

# Nonmetric multidimensional scaling
set.seed(1234)
ps_bray <- ordinate(ps_sea, "NMDS", "bray")
plot_ordination(ps_sea, ps_bray, color = "Method", shape = "Method") +
  stat_ellipse(geom = "polygon", alpha = 0.1, aes(fill=Method)) +
  geom_point(size = 2) + scale_color_startrek() + scale_fill_startrek() +
  xlab("Axis 1") + ylab("Axis 2") + ggtitle("NMDS")

上のコードでは stat_ellipse() を使って各グループの信頼区間 (範囲?) も表示しています。scale_xxxx_startrek() は ggsci パッケージの関数で、カラーパレットを指定しています。主成分分析 (PCA) なども ordinate() 関数を用いた同じコードで実行できます。

t-SNE

t-distributed Stochastic Neighbor Embedding (t-SNE) は確率分布に基づいて次元圧縮する手法で 2008年に提案されています (Maaten & Hinton 2008)。アンプリコンシーケンスの微生物群集データよりは RNA-seq データの解析などでよく見る印象です。phyloseq そのものには t-SNE は実装されていませんが、tsnemicroboita パッケージを使うことで phyloseq オブジェクトのまま t-SNE を実行できます (単に t-SNE を実行するだけのパッケージは他にも色々あります)。

# t-SNE
#library(tsnemicrobiota)
tsne_res <- tsnemicrobiota::tsne_phyloseq(ps_sea, distance='bray', perplexity = 5, rng_seed = 1234)
tsnemicrobiota::plot_tsne_phyloseq(ps_sea, tsne_res, color = "Method", shape = "Method") +
  stat_ellipse(geom = "polygon", alpha = 0.1, aes(fill=Method)) +
  geom_point(size = 2) + scale_color_startrek() + scale_fill_startrek() +
  xlab("Axis 1") + ylab("Axis 2") + ggtitle("t-SNE")

UMAP

Uniform Manifold Approximation (UMAP) は 2018 年に提案された手法です (Mcinnes et al. 2018 arXiv)。t-SNE よりもデータをきれいに分けることができ、かつ高速とされています。ただし、今回のデモデータでは分類群の数もサンプルの数も非常に少ないので、その効果は実感できません。アンプリコンシーケンスの微生物群集データに適用されているのはほとんど見たことがありません (自分が知らないだけかもですが)。phyloseq オブジェクトをそのまま扱って UMAP を実行するパッケージは見つけられませんでした。

# UMAP by uwot package
#library(uwot)
set.seed(1234)
umap_res <- uwot::tumap(otu_table(ps_sea)@.Data, n_neighbors = 5, n_components = 2)
umap_df <- cbind(data.frame(sample_data(ps_sea)), umap_res)
colnames(umap_df)[(ncol(umap_df)-1):ncol(umap_df)] <- c("UMAP1", "UMAP2")
ggplot(umap_df, aes(x = UMAP1, y = UMAP2, color = Method, shape = Method)) +
  stat_ellipse(geom = "polygon", alpha = 0.1, aes(fill=Method)) +
  geom_point(size = 2) + scale_color_startrek() + scale_fill_startrek() +
  xlab("Axis 1") + ylab("Axis 2") + ggtitle("UMAP")

ざっと並べてみると、サンプル数や ASV 数がそれほど多くないのであれば NMDS で十分な印象を受けます。データサイズが大きくなれば (RNA-seq のデータとか)、t-SNE や UMAP が良いかもしれません。いずれにしてもどちらも試してみることをおすすめします。

ASV の再クラスタリング

ASV はアンプリコン同士の違いを 1 塩基レベルで識別する非常に強力な方法ですが、種内多型のような変異も拾うため、多様性 (= ASV の数) が増大し、ときに見たいパターンが見えなくなるときがあります。そのような場合、DADA2 でエラー除去した ASV を OTU として再クラスタリングすることが有効な場合があります。

以下では、R を用いて DADA2 の出力を OTU に再クラスタリングする方法を紹介します。以下のコードは DADA2 の issues のページで議論されていたものを参考にしています。Biostrings と DECIPHER (http://www2.decipher.codes/) というパッケージを使用しています。また、R 内で解析を完結されることにこだわらないのであれば vsearch などのツールを使っても同様のことができるはずです。

クラスタリングプロセスは非常にシンプルです。以下では 97% 一致で OTU を作成しています。

# Preparation
n_cores <- parallel::detectCores() # set to number of cpus/processors to use for the clustering
dna <- Biostrings::DNAStringSet(tax_sheet$seq)
# Find clusters of ASVs to form the new OTUs
aln <- DECIPHER::AlignSeqs(dna, processors = n_cores)
aln_dist <- DECIPHER::DistanceMatrix(aln, processors = n_cores)
# use `cutoff = 0.03` for a 97% OTU 
clusters <- DECIPHER::IdClusters(aln_dist, method = "complete",
                                 processors = n_cores, type = "clusters",
                                 cutoff = 0.03, showPlot = F)

クラスタリングができたらクラスター情報を利用して ASV テーブルを変換します。

colnames(clusters) <- "cluster_id"
clusters$cluster_id <- factor(clusters$cluster_id, levels = unique(clusters$cluster_id))
length(unique(clusters$cluster_id))
# Use dplyr to merge the columns of the asv_sheet matrix for ASVs in the same OTU
merged_asv_sheet <- asv_sheet %>% t %>%
  rowsum(clusters$cluster_id) %>% t

また、phyloseq オブジェクトにクラスタリング結果を適用することもできます。speedyseq パッケージ内の merge_taxa_vec() という関数を使用しています。

# Make OTU-based phyloseq objects
# Import DADA2 ASV output to phyloseq
asv_sheet2 <- asv_sheet; colnames(asv_sheet2) <- tax_sheet$seq
ps_tmp <- phyloseq(otu_table(asv_sheet2, taxa_are_rows = FALSE))
# Merge taxa in "ps" using cluster information
ps_otu <- speedyseq::merge_taxa_vec(ps_tmp, group = clusters$cluster_id)

以下は解析そのものとは関係ないですが、ASV と OTU の対応を確認するためのサマリーを作成しています。

# Get OTU sequences and OTU table
otu_seqs <- colnames(otu_table(ps_otu))
otu_sheet <- otu_table(ps_otu)@.Data

# Sanity check (make clustering summary data frame)
otu_only <- data.frame(taxa_id = sprintf("OTU%05d", 1:length(otu_seqs)),
                       seq = otu_seqs)
clusters$seq_sum <- colSums(asv_sheet)
clusters$asv_seq <- tax_sheet$seq
asv_1st <- clusters %>% group_by(cluster_id) %>% summarize(otu_seqs = asv_seq[[1]])
clusters$otu_seq <- unlist(asv_1st[match(clusters$cluster_id, asv_1st$cluster_id), "otu_seqs"])

お役立ちパッケージ

その他、phyloseq にはいろいろな拡張パッケージがあります。一部を紹介します。

  • speedyseq (https://github.com/mikemc/speedyseq)
    phyloseq の 「ちょっと遅いなぁ」 と感じる関数を高速化したパッケージです。以下では psmelt() 関数を試しています。データサイズが大きいとかなり威力を発揮します。
#library(speedyseq)
system.time(psmelt(ps_all))             # 0.103 sec elapsed
system.time(speedyseq::psmelt(ps_all))  # 0.025 sec elapsed
#library(fantaxtic)
ps_top20 <- fantaxtic::get_top_taxa(ps_all, n = 20, relative = TRUE,
                                    discard_other = FALSE, other_label = "Other")
fantaxtic::fantaxtic_bar(ps_top20, color_by = "phylum",
                         label_by = "phylum", other_label = "Other", order_alg = "alph")

まとめ

微生物群集のアンプリコンシーケンス解析では、サンプルメタデータ・配列データ・ASV (or OTU) テーブル・分類群データ・系統樹など、複数のデータを組み合わせて解析することが求められます。phyloseq はそのようなデータを整然と扱えるようにデザインされていますので、うまく使って再現性のある解析を進めていただければと思います。

References

Written with StackEdit.

2020年12月30日水曜日

Shiny と rEDM による Empirical Dynamic Modeling のウェブアプリ

20201230_Blogger0014

以前紹介した非線形時系列解析 Empirical Dynamic Modeling (EDM) (https://ushio-ecology-blog.blogspot.com/2019/12/20191205blogger0004.html など) ですが、R の Shiny を用いてコーディングなしで EDM を体験できるウェブアプリケーションを作成しました。このアプリでは EDM の基本的なツールである Simplex projection (Sugihara & May 1990) ・ S-map (Sugihara 1994) と、発展的な手法で変数間の因果関係が推定できる Convergent Cross-Mapping (CCM; Sugihara et al. 2012) を実行できます。計算パッケージとしては rEDM (Ye et al. 2018) を使用しています。

ウェブアプリケーションは以下からアクセスできます。
Empirical Dynamic Modeling with Shiny App

*注意点: このアプリは EDM を体験することを主目的に作りました。そのため、計算をスピーディに進めることを重視しており、データ解析としては甘い部分があります。特に CCM の結果を確定的なものと捉えないでください。

*注意点: 公開には現在のところ shinyapp.io の無料アカウントを使用しており、月当たり一定のユーザー数・使用時間数を超えるとアクセスできなくなります。アクセス不可が頻発するようでしたら他の公開方法に切り替える可能性もあります。

データの形式とアップロード

このアプリで受け付けるのは以下のような形式の CSV ファイルです。1列目に “time_index” という列名で時間のインデックスを入力してください。この列名は他のものは受け付けません。

2列目・3列目に CCM で因果関係を推定したい変数の時系列データを入力します。これらの列名は何でも構いません。

enter image description here

手持ちの時系列データがない場合はアプリ中の「Two-species demo data」をクリックしてデモデータをダウンロードし、それをそのままアップロードしてください。

enter image description here

このデモデータは以下の式に従って作成した X が Y に影響を与えている時系列データです。Y から X への影響はありません。

X[t+1]=X[t]×(3.83.8×X[t])Y[t+1]=Y[t]×(3.53.5×Y[t]0.1×X[t])X[t+1] = X[t] \times (3.8 - 3.8 \times X[t]) \\ Y[t+1] = Y[t] \times (3.5 - 3.5 \times Y[t] - 0.1 \times X[t])

デモを走らせるには time_index と2変数のデータが格納されたデータセットが必要です。1変数のみのデータでも Simplex projection や S-map は可能ですが、それを行いたい場合はダミー変数でもいいので (0, 1, 0, 1, … とか) 1列分余計にデータを追加してください (なお、ダミー変数を入れた状態で CCM の実行ボタンを押すとアプリが停止することがあります)。

1変数のみのデータをアップロードすると以下のように警告が出ます。

enter image description here

正しい形式のデータをアップロードしたら、「Show standardized timse series」のボタンを押すと時系列データを図示します。表示範囲はスライダーで 0 – 300 の範囲で適当に変更できます。300 時間点以上のデータセットもアップロード & 解析可能ですが、CCM の計算時間が長くなるかもしれません。また、短い時系列データもアップロード & 解析可能ですが、概ね 30 – 40 時間点以上の時系列データが望ましいです。短い時系列 & 多数の反復を持つデータセットは反復間に NaN を挟むことで Simplex projection と S-map が可能ですが、CCM には今の所対応していません (この場合は time_index は NaN にせず、時系列の値だけ NaN にしてください)。

enter image description here

Simplex projection の実行

次に、Simplex projection と S-map で解析する変数を指定します。この変数は CCM の際に「結果」の候補変数としても使用され、指定しなかった変数が「原因」の候補変数となります。また、Simplex projection では埋め込み次元 (過去の EDM に関する記事を参照してください) の推定を行いますが、この際に使用する予測精度の指標も指定します。特に好みがなければデフォルトの RMSE を指定してください。

その後、「1. Perform simplex projection: Check embedding dimension」をクリックします。

enter image description here

ボタンを押すと E = 1 – 20 までを使用したときの予測結果が出力されます。予測値は Leave one-out cross-variation (LOOCV) によるものです。下の図の赤丸が最適な予測を示す E を表しています。ここも詳細については過去の記事を参照してください (https://ushio-ecology-blog.blogspot.com/2019/12/20191211blogger0005.html)。

図のタイトル部分に変数名・Simplex projection による E の推定結果・使用した予測指標を表示しています。

enter image description here

enter image description here

S-map の実行

Simplex projection で推定した最適埋め込み次元を用いて S-map を
実行します (S-map の詳細)。「2. Perform S-map: Check nonlinearity」のボタンをクリックすると S-map を実行し、Simplex projection と同様に予測結果を出力します。最適な非線形パラメーター (theta) を決定しますが、この theta は次の CCM では特に使用していません。アップロードしたデータに非線形があるかどうかをチェックしています。最適な theta > 0 であれば EDM の枠組みでは「非線形な動態」とされます。

ここでも図のタイトル部分に変数名・S-map による theta の推定結果・使用した予測指標を表示しています。

enter image description here

enter image description here

CCM の実行

最後に最初に指定した変数に、もう一つの変数が因果を及ぼしているかどうかを CCM で推定します (CCM の詳細)。CCM の前に結果判定に使用する予測指標を指定します。オリジナルの論文 (Sugihara et al. 2012) では rho (相関係数) が使用されていますが、MAE や RMSE も指定できます。特に好みがなければ rho のままにしておいて構いません。なお、rEDM::ccm()には tpという引数がありますが、ここでは -1 を指定しています。

enter image description here

CCM の結果は以下のように出力されます。実線と点がオリジナルデータを元にした cross-mapping です。グレーの領域は rEDM::make_surrogate_ebisuzaki()で生成したサロゲートデータ 100 本に基づいた 95% 信頼区間です。本来はもう少し多くのサロゲートデータに基づいて計算すべき、かつ、データによって使用するサロゲートを検討すべきですが、計算時間を短縮するためこのようにしています。

因果の判定は「最大ライブラリサイズでの予測精度 >> 最大ライブラリサイズでの 95% 信頼区間」&「最大ライブラリサイズでの予測精度 >> 最小ライブラリでの予測精度」に基づいています。この指標もちゃんと解析するときはもう少し検討すべきですが、簡略化しています。

ここでも図のタイトル部分に CCM の結果が表示されます。モデルデータでは、「X が Y に影響を与えている」というモデル式通りの結果が得られます。

enter image description here

最後に

「自分のデータに EDM を適用してみたいけどハードルが高そう」という方に、まずこのアプリで遊んでもらえば、と思って作成してみました。適用した結果、Simplex projection や S-map での予測精度がよく、CCM で因果がありそうな結果が出れば、EDM の適用を本格的に考えてもいいと思います。

そのような場合に一人では解析に自信がない、ということであれば連絡いただければ何らかの助けができるかもしれません。

また、このアプリに何らかのバグがあれば教えていただけるとありがたいです。時間が取れるときがあれば修正したいと思います。

Shiny でのアプリ作成、2作目ですが、前回より少し分かってきました。面白いです。まだもやもやしている部分はありますが、またアイデアが出てきたら何か作ってみたいです。

参考情報

アプリ内部で使用したパッケージのバージョン

  • R 0.4.3
  • shiny: v1.5.0
  • rEDM: v0.7.5
  • tidyverse: v1.3.0
  • cowplot: v1.1.0
  • ggsci: v2.9

関連ウェブサイト

参考文献

  • Sugihara, G. et al. (2012) Detecting causality in complex ecosystems. Science 338, 496–500
  • Sugihara G, May RM. (1990) Nonlinear forecasting as a way of distinguishing chaos from measurement error in time series. Nature 344, 734–741
  • Sugihara G. (1994) Nonlinear forecasting for the classification of natural time series. Philos. Trans. R. Soc. A 348, 477–495
  • Ye H, et al. (2018) rEDM: Applications of Empirical Dynamic Modeling from Time Series. doi:10.5281/zenodo.1935847

Written with StackEdit.

2020年8月1日土曜日

iSeq による環境サンプルのアンプリコンシーケンス: MiSeq との違い

20200801_Blogger0013

これまで Illumina のシーケンサーは主に MiSeq を使ってきました。300 - 600 bp の断片をそれなりにリーズナブルな価格と手間で読めるため、環境サンプルの Amplicon Sequence をショートリードでやる際にはちょうどよかったからです。

最近、MiSeq よりも小型でメンテナンスがほとんど不要なシーケンサー、iSeq を使う機会が出てきました。iSeq も 300 bp の断片まで読むことができ、環境サンプルの Amplicon Sequence に適しています。例えば、魚の環境 DNA メタバーコーディングでよく読まれる MiFish 領域 (Miya et al. 2015) は 170 bp 程度なので、iSeq でも十分カバーできます。

MiSeq と iSeq は似た部分が多く、MiSeq のプロトコルがほとんどそのまま利用できます。とは言うものの、違う点もあり、つまづいた部分が何点かありました。そこで、これから使い始める方の参考になるかもしれないので、自分が学んだことを書いておこうと思います。

1. MiSeq v.s. iSeq: データ量と試薬の価格

MiSeq は V3 600 cycle というちょっとお高い試薬キット (28万円ほど) で最大 300 bp × 2 (Paired-end) まで読むことができます。この際に得られる配列数は 2,500 万配列程度です。また、MiFish 領域であれば V2 300 cycle という試薬キット (16 万円ほど) で読むことができ、この場合は 1,500 万配列程度のデータを得ることができます。

また、MiSeq には V2 300 cycle Nano といった試薬キットもあり、得られる配列数は 100 万配列程度ですが、試薬キットの価格が 5-6 万円とお安くなっています。

(*試薬価格は割引のあるなしで変わります)

一方、iSeq は現時点では最大 150 bp × 2 の長さを読むことができます。この場合は 400 万配列程度のデータを得ることができ、試薬キットの価格は 10 万円前後です。

2. MiSeq v.s. iSeq: ライブラリ調製プロトコル

環境サンプルの Amplicon Sequence を行いたい場合、この部分は MiSeq と iSeq でほとんど違いはありません。MiSeq で読むために調整したライブラリをそのまま iSeq で読むこともできます。

ただし、(後で詳しく書きますが) iSeq では使用するプライマーの構造の変更を検討してもいいかもしれません

3. MiSeq v.s. iSeq: シーケンシング

シーケンスの作業は両者に違いがあります。MiSeq のシーケンスもさほどストレスなくできていましたが、iSeq でのシーケンスはさらに簡単です

MiSeq でのシーケンス

  1. 1 N NaOH を希釈して 0.2 N NaOH を作成。
  2. 0.2 N NaOH を用いて 4nM (or 2 nM) の 2 本鎖のライブラリを 1 本鎖に変性。
  3. 変性したライブラリを試薬キットに付属のバッファーを用いて希釈して 20 pM の変性ライブラリを作成。
  4. (必要な場合は) 塩基の多様性を高めるためにスパイクインする PhiX を用意。
  5. 20 pM のライブラリ (+ PhiX) をさらに希釈してシーケンス用試薬カートリッジにロードする濃度に調整した後、ロードしてシーケンス開始。

iSeq でのシーケンス

  1. 1 nM のライブラリを Illumina が提供するバッファーもしくは 10 mM Tris-HCl (pH 8.5) を用いて 50 pM に希釈。
  2. (必要な場合は) 塩基の多様性を高めるためにスパイクインする PhiX を用意。
  3. 50 pM のライブラリ (+ PhiX) をシーケンス用試薬カートリッジにロードして、シーケンス開始。

iSeq は試薬カートリッジの中で 2 本鎖から 1 本鎖への変性が行われるため、自分たちでライブラリの変性を行う必要がありません。MiSeq でのシーケンシングは慣れれば 30 分 〜 1 時間以内で終わっていましたが、iSeq でのシーケンスは 5 〜 10 分程度で終わってしまいます

シーケンスに使用されるフローセルは MiSeq ではランダムフローセルで、iSeq ではパターン化フローセルです (ここの PDF の 8 枚目など御覧ください)。

違いをざっと書くと、ランダムフローセルではシーケンスされる DNA のクラスターができる場所がランダムで、従ってシーケンスの最初の方で DNA クラスターの 「位置検出」 が行われます。一方、パターン化フローセルでは、予めクラスターができうる場所が決まっており、ランダムフローセルに比べて DNA のクラスターを高密度化することができます (= 面積あたりの取得配列数が多くなる)。

4. MiSeq v.s. iSeq: シーケンシング後とメンテナンス

MiSeq はシーケンス後に Stand-by Wash や Post-Run Wash が必要になります。また、定期的にマシン内の流路の Wash (Maintenance wash) も必要です。iSeq ではこれらの作業が必要なく 置いておくだけ です。これはとてもありがたいです。

5. MiSeq と iSeq で特に違うなと思ったこと

・操作・メンテナンスの簡単さ

これは上述したとおりです。

・シーケンス試薬の融解

MiSeq のシーケンス試薬は前日から冷蔵庫に入れて解凍するか、シーケンス当日に水につけて解凍します。当日に水に入れて融解する場合は、試薬カートリッジの側面にある 「Maximum Water Line」 を超えない水位に 60 - 90 分程度つけて融解します。

一方 iSeq の試薬融解はもう少々時間がかかります。20 - 25 度のウォーターバスで融解する場合は 6 時間、室温に放置する場合は 9 時間、冷蔵庫内で融解する場合は 36 時間かかります。「今からシーケンスしよう!」 となっても試薬を融解するための時間が必要なのでそうはいかないため、注意が必要です。また、試薬をしっかり融解しないでランを行うとシーケンスクオリティの低下を招きます

・PhiX の添加・使用するプライマーの構造

環境サンプルのアンプリコンシーケンスを行う場合は、これまで MiSeq のシーケンシングプライマーと分類群特異的なプライマーの間にランダム塩基を 6 個 (= NNNNNN) 入れて塩基の多様性を挙げて、フローセル上のクラスターの分離を改善していました。これまでの経験上、NNNNNN を入れておくと塩基の多様性をさらに向上させるための PhiX を入れなくても十分なクオリティが得られていました (%Pass Filter > 80-90%, %Q30 > 90% など)。

しかし、ランダムフローセルとパターン化フローセルの違いなのかもしれませんが、iSeq でのシーケンスではプライマーに NNNNNN を入れていても PhiX なしではシーケンスがうまくいきませんでした (例えば、%Q30 が 70% を切る)。試行錯誤の結果、結局 PhiX を 20 - 30% 添加、という条件に落ち着きました

「PhiX がシーケンスされた配列のうち何%を占めるか?」 が %Q30 にかなりクリティカルに効きます。現段階では PhiX を 20% 入れたのにシーケンス後に Align される PhiX が 5 - 10% だったり、逆に 20% を超えたりすることがまだあります。このあたりは今後の改善点です。

また、結局 PhiX を添加するのであればプライマーに NNNNNN を入れなくてもよいのでは、ということになり現在 iSeq でのシーケンスは NNNNNN を入れないプライマーを使用しています。こちらの方が少しだけターゲット領域を長く読むことができます。まだラン回数は多くないのですが、NNNNNN がなくても (PhiX がけっこう入っているためか) シーケンスの質にはあまり差がないように思います。

・%PassFilter の値

iSeq は MiSeq に比べて %PassFilter の値があまり高くならないのが気になっていましたが、どうやら原理的に 70 - 80% 程度で頭打ちになるようで、MiSeq のように 90% 超えの値は出ないようです。現在は PassFilter 後の配列数が十分に取得できているようであれば iSeq の %PassFilter の値はそれほど気にしないようにしています。

・出力される FASTQ ファイルの Q score

これは次に詳細を述べます。

6. 配列データの解析

Q score が違う

MiSeq と iSeq が吐き出す配列データ (FASTQ ファイル) は基本的には同じ構造ですが、各塩基の読み取りの正確性を表す Q score (Phred score) には大きな違いがあります。MiSeq の FASTQ ファイルには 40 までの 1 刻みで Q score が記載されていますが、iSeq の FASTQ ファイルには 3 種類の Q score しかありません。MiSeq で Q17 までは Q11、Q18 - Q29 は Q25, Q30 - Q40 は Q37 と表示されています。

MiSeq の Q score の分布
(スコアは 1 刻み)

iSeq の Q score の分布
(スコアは 3 つだけ)

データ解析への影響は?

これまでは配列データの解析には DADA2 (Callahan et al. 2016 Nature Methods) というパイプラインを使用していました。DADA2 は Q score が 1 刻みのデータを元に開発されていたため、iSeq のデータを見たとき、DADA2 を iSeq の配列データ解析に用いてもよいのだろうか?という疑問が生じました。DADA2 の原理的には iSeq のデータも解析できそう (してもよさそう) と思いましたが、確たる情報がありませんでした。そこで、以下の手順で自分で検証してみることにしました。

  1. 手持ちのデータとして MiSeq で読まれた原核生物の配列があったので、それを元にシェルスクリプトで 「iSeq が出力したような配列」 を生成しました (サンプル数は 126)。つまり、無理やり Q score は 3 種類だけにした配列データを生成しました。
  2. これら 「元々同じだった 2 種類の配列データ」 を DADA2 を使って全く同じように解析を行いました。
  3. その後、群集組成のパターン、各分類群の配列数や相対優占度を比較しました。

詳しい解析コードや結果は Github 上のレポジトリで公開してありますので、興味ある方は御覧ください (https://github.com/ong8181/random-scripts/tree/master/04_MiSeq_vs_iSeq_DADA2)。ここでは主な結果のみ紹介します。

原核生物の群集組成

enter image description here
上のパネルが MiSeq が出力した元配列データ、下のパネルがそれを iSeq っぽく編集した配列データを解析したものです。ぱっと見るとほとんど同じ群集組成を示しているように見えます。

各分類群の検出配列数の比較

点線は 1:1 のラインです。かなり 1:1 のラインに近い場所に点が集まっていますが、iSeq のデータの方がやや検出配列数が少ない傾向にあるようです。

各分類群の相対優占度の比較

こちらは相対優占度ですが、ほぼ 1:1 のラインに点がのっています。比較的レアな分類群がやや 1:1 のラインから外れています。

今回の検証の結論
今回の検証と DADA2 の解析アルゴリズムから考えると、iSeq のデータを DADA2 で解析しても、MiSeq のときと大きな違いはなさそう です。特に、全体的な組成や優占種に関心があるときは DADA2 での解析は問題ないと考えています。レア種に特に興味があるときは注意が必要かもしれませんが、そのようなときはそもそもショートリードのアンプリコンシーケンス以外の分析も視野にいれるべきでしょう。

また、上記の疑問 「iSeq のデータを DADA2 で解析しても大丈夫?」 を Github 上の DADA2 のフォーラムに、今回の解析結果とともに投げてみました (こちら → https://github.com/benjjneb/dada2/issues/1083)。DADA2 開発者の Callahan さんが回答してくださいましたが、Callahan さんも自分と同意見のようでした。また、NovaSeq も似たような形式の FASTQ ファイルを出力するため、そのような質問も同じフォーラムで行われていました (https://github.com/benjjneb/dada2/issues/791)。

まとめ

最初は MiSeq と同じノリで解析を始めていろいろとつまずきました。だいぶ慣れてきて、iSeq も楽しくなってきました。

参考資料

Written with StackEdit.

2020年5月7日木曜日

解析するときのルールあれこれ

20200507_Blogger0012

自分の現在のデータ解析の相棒は主に R です。簡単な解析であれば R スクリプトのファイルを一つ作って解析を行えばよいのですが、解析が長くなってくるとスクリプトが非常に長くなったり、関数を定義したりと行う作業が増えてきます。そのような状況下で、特に何のルールも設けずにファイルやフォルダを増やしていくと後で解析をやり直す際に、目的の操作を行った箇所を見つけ出すことができなかったり、最悪自分で行った解析を自分で再現できなくなったりします。そのようなことを避けるために自分が気をつけていることをリストしてみます。

データ解析・コード作成を行う際に気をつけるべきことがイギリス生態学会が公開している Guides to Reproducible Code でとてもよくまとめられています。以下でリストしている項目のいくつかについても触れられていますので、参考にしてみてください。

また、Guides to Better Science の Website ではその他のガイドも公開されています。こちらも興味ある方は御覧ください。

以下で解説しているルールは、例えばここで実践しています (Ushio 2019 Methods in Ecology and Evolution で使用したコードです)。

1. ファイル・フォルダ関係

ファイル・フォルダ名

  • できるだけシンプルな、しかし中身を想像できる英語でつけます。日本語は使いません (日本語は bug の原因になったりする)。“data”, “function”, “fig” など。
  • 解析スクリプトのような順番があるものにはファイル名の先頭に番号をふっています (“01_XXXXX.R”, “02_XXXXX.R” など)。ファイルの並び替えが容易になりますし、解析の順番が明示的になります。ちなみに自分は番号を 01, 02, …, などと2桁にしています。ファイル数が 10 を超えることがあるからです。
  • あまりやりたくはないのですが、サブの番号を使うこともあります。例えば、“01_1_XXXXX.R” などです。
  • 基本的に “-” は使いません。つなぎの文字としては “_” (アンダーバー) が好きです。

“data” フォルダ

  • 解析するデータを格納するフォルダは常に “data” という名前をつけています。また、“data” フォルダ内のファイルはマニュアルでは (= 作業記録が残らない方法では) いじらないようにしています

“function” フォルダ

  • だいたいの解析において処理を効率化するための自作関数を使用することになるので、そのような関数は一括して “function” フォルダに格納しています。

“FigCode” フォルダ

  • 自分は Figure の作成・体裁の調整をあとでまとめて行っており、そのためのコードを一括して “FigCode” フォルダに格納しています。この辺は好みによりそうです。

出力フォルダと計算結果の保存

  • R スクリプトファイルと同じ名前 + “Out” を計算結果を格納するフォルダ名にしています。“01_XXXXXOut” などとなります。
  • R スクリプト内に出力フォルダを生成するコードを書いています。dir.create("01_XXXXXOut") で生成できます。
  • 計算結果の保存は次の2つの方法のどちらかを使っています。1つ目は workspace をまとめて保存する方法で、以下のコマンドを使っています: save(list = ls(all.names = TRUE), file = "filename.RData")。2つ目は R オブジェクトを単体で保存する方法で、以下のコマンドを使っています: saveRDS(object, "filename.obj")。workspace を保存すると全オブジェクトが保存されますが、それではファイルサイズが重くなりすぎるときや、オブジェクトの数が増えすぎているときには、以後の解析で必要なオブジェクトだけを選んで保存して以後の解析で使用する、という風に使い分けています。

セッション情報保存用フォルダ

  • 計算結果だけでなく R のバージョン・パッケージのバージョンなどの情報を格納するためのフォルダを作成しています。“00_SessionInfo” というフォルダを最初のスクリプトで作っています。dir.create("00_SessionInfo") としています。
  • 各解析スクリプトの最後にセッション情報を取得して、保存するためのコードを書いています。Sys.time() 関数を使用して解析を行った日付も同時に記録するようにしています。
writeLines(capture.output(sessionInfo()),
           sprintf("00_SessionInfo/01_SessionInfo_%s.txt", substr(Sys.time(), 1, 10)))

以下のような感じでセッション情報が保存されます。何のパッケージのどのバージョンを使って解析したのか、あとからでもこれを確認すれば一目瞭然です。

enter image description here

上記のルールを実行していくと以下のような見てくれのフォルダ構造となります (下の例では “data” フォルダは “sampledata” と “seqdata” に分かれています)。自分としては解析の順番も見やすく、あとから解析のし直しもやりやすいので気に入っています。「解析は良くも悪くも必ずやり直しが必要になる」 ということは意識しています。

enter image description here

2. スクリプトの書き方

スクリプトの始まり

  • 完全に個人ルールですが、最初にメモ的なものを書くようにしています。例えば次のような感じです。# を4つ入れているのも特に意味はありません。
####
#### R script for Ushio (2020)
#### "Use of a filter cartridge combined with intra-cartridge bead beating improves detection of microbial DNA from water samples"
#### No.1 Sequence analysis by DADA2
#### 2019.2.19 Ushio
#### R 3.5.2
####

パッケージのロード

  • パッケージをロードする際に毎回バージョンを確認するようにしています: library(xxxxx); packageVersion("xxxxx")

コメント

  • 処理の前に何をするか説明するコメントを (面倒でも) 書いています。例えば以下のような感じです。
# Load library
library(xxxx); packageVersion("xxxx")

# Load previous workspace
load("01_xxxxxOut/01_xxxxxOut.RData")

他の言語の利用

  • R 以外の言語を利用することがありますが、それら言語に応じて対応しています。
  • C++ (あまり得意でないです)、Python は Rstudio 内でそのまま利用できます。C++ は Rcpp パッケージを、Python は reticulate パッケージで対応しています。
  • DNA 配列解析ではよくシェルを利用する場合がありますが、短いコードであれば R の system() 関数などを使って R 内で対応しています。

3. 作図

作図は最近はもっぱら ggplot2 パッケージを利用しています。保存した解析の結果 (workspace ファイルもしくはオブジェクトファイル) をロードして、ggplot() 関数で作図する感じです。一点気を使っているのは、特別な理由がない限り画像編集ソフトでいじらない という点です。たまに細かい部分を編集したいときにコードでどう書いたらいいかわからないことがありますが、時間をかけてでも調べて、図の全てをコードで再現できるように努力しています。面倒でもそうした方が研究の再現性は上がりますし、改訂などのときに自分自身が楽になると思っているからです。さすがにイラストは画像編集ソフトを使いますが。

(ただし、これに成功したのは Ushio 2019 の DNA 抽出論文からです)

利用している ggplot2 の関連パッケージ

作図では ggplot2 に加えて、以下のお助けパッケージのお世話になっています。特に cowplot はヘビーに使っています (詳しい使い方は今回は省略します)。

cowplot (チュートリアル)

主に複数のパネルを配置するときに使っています。plot_grid() 関数にはいつもお世話になっています。

ggsci (ここで公開されている Rmd とかが便利です)

あまり手間をかけずにそれなりにかっこいい配色をしたいときに使っています。一方、本気でやりたいときには使ってなかったりします。

ggrepel (チュートリアル)

妙にいい感じにプロット内にラベルを付けてくれます。便利です。

Rmarkdown による図の結合

作図が全部できたら最後に Rmarkdown の機能を使って図をまとめて、Figure legend もくっつけています。Rstudio の “New File” には “R Markdown” という選択肢があるので、それをクリックして R Markdown の新しいファイルを作ります。

ヘッダー部分 (YAML と呼ばれます) でいろいろと Rmarkdown に関する設定をするのですが、一番シンプルな場合には以下のように記載しています。

title: "XXXXXX"
author: "Masayuki Ushio"
date: "XX/XX/XXXX"
output:
  pdf_document:
    fig_caption: yes

その後、以下のコードを使って図をどんどんまとめていきます。

![caption](../0_Figs/Fig1_xxxxx.pdf)

4. まとめ

  • いろいろと書いてみましたが、結局の所 「将来、他人が見たときに何をやったか分かるように構成できていて、全く同じ結果を再生産 (reproduce) できれば最高」 です。
  • いきなりそこまで行くのは様々なケアが必要なので実はかなり大変ですが、「少なくとも自分が将来見直したときに何をやったかきちんと思い出せるように構成する」 という部分がスタート地点かなと思いました。
  • 最近は、解析がどんどん複雑になってきていて、docker などのツールの利用も進んできています。docker はビギナーなので、まだまだ修行しながら頑張りたいと思います。

Written with StackEdit.

2020年3月13日金曜日

"Idea Paper" が出版されました

20200313_Blogger0011

以下の論文が Ecological Research から出版されました。

Ushio (2020) Idea paper: Predicting culturability of microbes from population dynamics under field conditions. Ecological Research (early view) https://doi.org/10.1111/1440-1703.12104

(bioRxiv の preprint https://doi.org/10.1101/795401 も内容は上記とほぼ同じです)

この論文、ちょっと特殊なフォーマットをしていて、“Promoting idea sharing via Idea Paper” という特集の中の一本です。この “Idea Paper” が企画されることになった背景を解説しつつ、論文の内容もちょっと紹介します。

Idea Paper とは ?

目的

“Idea Paper” では 「データは共有」 という流れができつつあるのに、「アイデア」 が共有されないのはなぜか? という疑問を元に、データは (あまり) ないがアイデアが面白そう・重要そう というものを通常の論文よりも短い文量で、アイデアのみを、しかしきちんとした基準で審査して査読付き論文として出版します。こうすることで、アイデアの提唱者にきちんとクレジットを与えつつ、生態学コミュニティに面白そう・重要そうなアイデアを広め、生態学を発展させることを目的としています。

首謀者 (?)

Idea paper の首謀者 (?) は龍谷大学の三木さんたちです。三木さんの HP に Idea Paper の特集号が企画されることになった経緯が説明されています (https://sites.google.com/view/ideapaper3/home?authuser=0)。

歴史

ざっとまとめると以下のとおりです。

  • 2018 年 3 月 17 日: 日本生態学会でアイデアペーパーの自由集会が企画される。タイトルは “「データは共有」 という流れができつつあるのに、「アイデア」 が共有されないのはなぜか?―アイデアの共有促進を目指して” (これには参加しました)
  • 2018 年 10 月 7 日: 近畿大学でアイデアペーパーの実現に向けた 2 回目の集会が開かれる。タイトルは “Idea Paper の実現に向けて 2” (これには参加できませんでした)
  • 2019 年 3 月 15 日: 再び日本生態学会でアイデアペーパーの自由集会が開かれます。タイトルは “Idea Paper の実現に向けて 3”。ここには参加し、上記の論文の元となるアイデアを紹介しました。

3 回の集会 (と多分自分が知らないであろう企画者の方々の議論) を経て、Ecological Research の特集号として出版されることが決まり、2019 年 10 月頃に原稿の受付が始まりました。

自分が発表したアイデア

冒頭で紹介した自分の論文では 「微生物の野外での個体群動態を解析することでその微生物の培養可能性に関する示唆を得ることができるのではないか ?」 というアイデアを提唱しました。

ものすごく単純な状況を考えると、例えば野外において高い温度条件で個体数を増やし、低い温度条件で個体数が減る微生物がいたとします。その場合、この微生物を培養しようとするならば、多くの人がまず高い温度条件での培養を試すでしょう。これはすなわち、(無意識のうちに) 野外での個体群動態に隠れている微生物の生態特性を抽出し、それを培養に応用していると言えるでしょう。この 「野外での個体群動態に埋め込まれている微生物の生態特性の抽出」 を時系列解析を用いて行うことで、直感に頼るよりも多くの有用な情報を取り出せるのではないかと考えました。

上で書いたように Idea Paper は 「データはないがアイデアが面白いものを載せる」 と書きました。なので、上記のアイデアを提唱する上で特にデータや解析結果を提示する必要はありませんでした。しかし、たとえ preliminary でも具体的なデータと解析結果があったほうがアイデアも伝わりやすいだろうと考えました。都合の良いことに、自分は (未発表ですが) たくさんの微生物の時系列データを持っていたので、その一部を使用して上記のアイデアのデモンストレーションを行いました。

実際にやったこととしては、以前このブログで解説した Empirical Dynamic Modeling という時系列解析の手法を手持ちの微生物の時系列データに適用して、微生物動態の複雑性 (Complexity) と状況依存性 (State dependency) を定量化しました。ものすごくざっくり言ってしまうと 「複雑性」 は 「その微生物の動態が潜在的にどのくらいの数の因子の影響を受けて制御されていそうか」 ということを示しており、「状況依存性」 は 「ちょっとした状況の変化でその微生物の動態を制御しているルールがどのくらい変わりそうか」 ということを示しています。自分の Idea Paper では 「複雑性や状況依存性が高ければ、そのような微生物はそもそも培養が難しく、一方で複雑性や状況依存性が低いのであれば、そのような微生物はたとえ今培養されていないとしても、実は多少の条件検討で培養可能なのかもしれない」 ということを述べました。

デモンストレーションとして合計 398 種の微生物の動態を解析したところ、その多くが低い複雑性や状況依存性を示しました。これを自分のアイデアに基づいてそのまま解釈すると、「解析対象とした微生物の多くは比較的単純な条件で培養可能かもしれない」 となります。しかし、使用したデータの特性からおそらくそこまでは言えません。今回のアイデアをしっかりとしたものにするためにはよりクオリティの高い時系列データや種特性のデータが必要になってきます。アイデアをきちんと検証するためにはどのようなデータが必要かについても論文内で触れていますので、興味がある方はご覧ください。

このアイデア論文、正式発表の前に bioRxiv の preprint として発表したのですが、微生物学者と思しき方々からも SNS 上で mention していただいて嬉しかったです。

enter image description here

感想

比較的短い文章の中で自分のアイデアを述べる、というような論文は書いたことがありませんでしたが、実際に書いてみると随分楽しかったです。アイデアだからといって何でもかんでも述べてよいわけではなくきちんとしたルールが事前に決まっていたのも良かったと思います。

今回は Ecological Research 内の一特集で終わるようですが、人気が出て (= たくさん読まれてたくさん引用されて) Ecological Research の Regular Section となればいいなと思いました。

Written with StackEdit.

2020年2月14日金曜日

DRA での DNA 配列のメタデータ登録でハマったときのメモ

20200214_Blogger0010

MiSeq などでシーケンスした DNA 配列の登録はいつも DDBJ Sequence Read Archive (DRA) という場所に登録しています。これまではだいたい DRA に用意されているウェブツールを利用してサンプルのメタデータを入力していました。これまではせいぜい 100 サンプル程度しか登録しなかったので特に問題はなかったのですが、先日、2700 サンプル以上の情報を登録しようとした時につまづいてしまったので、同じように困っている方がいるかも知れないと思い、メモとして残すことにしました。

DDBJ Sequence Read Archive での配列登録の流れ

最初に DDBJ での次世代シーケンサーが出力した配列の登録の流れについてざっと書いておきます。詳しくは DDBJ が丁寧なマニュアルを用意してくれているので、そちらを参照してください。

  1. D-way でアカウント作成
    DDBJ で MiSeq などが出力した配列を登録するためにはまず D-way というウェブサイトでアカウントを作成します (画面は下のような感じです)。マニュアルはこちら

enter image description here

  1. BioProject と BioSample の登録
    配列とメタデータを登録する前に BioProject と BioSample という二つの情報を登録する必要があります (赤丸の部分から登録できます)。マニュアルはこちら。これらはさほど時間のかかる作業ではありません。

enter image description here

  1. DRA への FASTQ ファイルのアップロード
    FASTQ ファイルのアップロードは Cyberduck などの FTP cliant を利用して行います。これについてもここに詳細な解説があります。

  2. DRA へのメタデータのアップロード
    FASTQ ファイルがアップロードできたら D-way 内の DRA からメタデータをアップロードします (下図の赤丸)。このメタデータのアップロードがなかなか鬼門で、今回ハマりました。

enter image description here

ハマったこと

サンプルのメタデータは xml という形式で登録されます。DRA には xml を作成を支援するウェブツールが備わっています。サンプル数が少ないときはメタデータのアップロードの際に下図の赤丸で示した 「Enter/Update metadata」 のボタンを押してウェブ上で情報を入力/編集していき、それを xml に変換してもらうという方法で問題はありません。

enter image description here

しかし、サンプル数が 200 を超えると「Save」 ボタンを押すたびに、また、過去に Save した情報をロードするたびに多大な時間がかかることに今回気づきました。具体的には一回 「Save」 ボタンを押すたびに 1 時間程度の待ち時間が生じ、またしばしばその間に接続がタイムアウトしてしまい、再度 D-way にログインし直さなければならない、という状況が生じました。今回登録したかったサンプル (というかライブラリ情報; 以後 オブジェクトといいます) は 688 × 4 = 2752 でしたので、「これは一体いつ終わるんだろうか…」 という気持ちになりました。

試したこと

この状況で以下のことを行いました。

  • DDBJ にメールで問い合わせ: DDBJ の方からは 「200 以上のオブジェクトもしくは 2000 ファイル以上のデータファイルを登録する際にはそのような状況が生じうる」 とのことで、そのような場合は 「1 回の Submission で登録するオブジェクトの数を 200 程度になるように分けて登録する」 のが最もシンプルな解決法とのことです。

  • ウェブ (Twitter とか) で情報を収集: その後、ウェブでも情報を収集してみると同じように大量のサンプルを登録しようとして苦戦した方の情報がいくつか上がってきました。まとめると皆さん色々と試行錯誤して独自に (?) いくつかの解決法 (?) に行き着いていたようでした。
    – 1. 長い時間かかるのは我慢してウェブツールを使って登録
    – 2. DDBJ の人に頼んで、メタデータ (or データファイルも??) を送って登録してもらう
    – 3. xml ファイルを自身で作成・編集して登録

  • 再度 DDBJ にメールで問い合わせ: その後、上記の 「2」 ができるのかなぁと思い、再度 DDBJ の人に問い合わせてみました。すると、まずは 「1」 と 「3」 の方法で何とかできないか試してみてはとのことでした。ちなみに 「1」 の方法で 600 程度のオブジェクトを登録できたこともあり、また 「3」 の方法で 1000 程度のオブジェクトを登録する方もいるとのことでした。

そこで、覚悟を決めて 「1」 「3」 の方法を試すことにしました。自分が登録したいオブジェクトは 688 × 4 という分かれ方をしていたので、2752 オブジェクトを一度に登録するのではなく、688 オブジェクトずつ登録を試みることにしました。

  • 「長い時間かかるのは我慢してウェブツールを使って登録」 を試す
    結論から言うと、これでも何とか登録できました。688 オブジェクトのメタデータをウェブツールを使い、ボタンを押しては 0.5 〜 1.5 時間くらい待つ、を繰り返しました。メタデータの投稿までに何回ボタンを押したかは忘れましたが (10 回くらい??)、結局半日から一日で何とか最初の 688 オブジェクトの投稿を終了しました。メタデータの投稿をしたあとは 「validation」 という投稿した情報が acceptable かどうかのチェックが行われるのですが、もしここで 「validation failed」 となると もう一回やり直し の可能性がありましたが、幸いここは一度で 「validation success」 となりました。

しかし、これでは残り 688 × 3 のオブジェクトを登録するまで 最短でも あと 3 日はかかることになります。これはつらい、ということでこの段階で 「3」 を試すことにしました。

  • 「xml ファイルを自身で作成・編集して登録」 も試す
    xml ファイルを自身で作成・編集するやり方はいくつもあると思います。今回は、ぱっと思いついたのが3つの方法でした。
    – 適当なエディターを使って手で編集
    – 適当なプログラミング言語で編集
    Claident に準備されているコマンドで編集

    今回は、幸いにして一度メタデータの登録が成功しており、かつ残りの 688 × 3 のメタデータもすでに登録したメタデータと大部分が同じ、という状況でした。そのため、登録に成功した xml ファイルを少し編集するだけでうまく登録できるはず、と思いました。それでも手作業で編集するには情報が多すぎたので、まずは適当なプログラム言語で xml が編集できないかどうか調べてみました。

    すると、自分がよく使っている R 言語に xml2 というパッケージがあることが分かり、それを利用することで必要な情報をぱぱっと書き換えることができました (python の方がより簡単そうかなとは思いましたが…)。XXXXX-submission.xml, XXXXX-experiment.xml, XXXXX-run.xml という3つのファイルを用意して、「XML Upload [+]」 をクリックすると xml ファイルを直接アップロードする場所が現れるので、そこにアップロードしました (下図の赤丸部分です)。この場合は、何度もボタンを押す必要はなく、「Upload XML files」 のボタンを一度だけ押せば大丈夫です。このアップロードにもそれなりに時間がかかりましたが (1.5 時間くらい)、ボタンを押すのが一度だけで良い というのはウェブツールを使う方法に比べると大きな利点でした。

    この方法で比較的素早くメタデータが登録できたため、残りの 688 × 2 のメタデータも同様にして登録しました。全てのメタデータの validation が success になったときはかなりホッとしました。

enter image description here

この時点で全てのデータを登録できたので、「Claident に準備されているコマンドで編集」 を行いませんでしたが、結局はこれが一番効率的に xml ファイルを準備できる方法かなと思いました。今回、実際にこの方法で生成した xml ファイルを登録していないので、確実に登録に成功するとは言えないのですが、同じように大量サンプルを登録しようとしている人はまず検討すべき選択肢でしょう。

Claident を利用した xml ファイルの作成については本家にマニュアルがあるので、そこを参考にしてみてください。自分も次回このような機会があればまずは Claident による xml ファイルの作成を第一候補とするでしょう。

(ちなみに Claident のコマンド clsplitseq で demultiplex を行ったファイルはそのままでは配列名の問題で DRA にうまく登録できません [アンダーバーが2回続く記述 “__” が混じっているのが駄目?なようですが、詳細未確認]。最新の Claident の clsplitseq についているオプションの --sequencerenaming を DISABLE にするか、自分でシェルなどを使って配列名を変える必要があります)

現段階での選択肢

さて、色々と試しましたが、現状としては以下の選択肢があるでしょう。

  • Claident がインストールできている方であれば、マニュアルに従い clmaketsvclmakexml のコマンドでぱぱっと xml ファイルを生成してそれをアップロードするのが一番早そう (ただし、実際にうまくいくかどうかは確認していない)。
  • 過去に DRA に登録した経験があり、かつ似たようなメタデータを登録する場合は自分の D-way アカウントから xml ファイルがダウンロードできるはずなので、それらを何らかの方法 (例えば R の xml2 パッケージ) で編集して、アップロード。
  • ウェブツールでも気合があればおそらく登録できます。今回は 688 オブジェクトが登録できることを確認しました。
  • 最後の手段は DDBJ の人に頼み込むことですが、お忙しいと思うので、なるべく避けたい方法です…

Written with StackEdit.

Empirical Dynamic Modeling with rEDM: (2) Near-future forecasting (Simplex projection)

20231015_Blogger0021 *This is an English version of my previous post (first translated by ChatGPT, checked and edited ...