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.

2020年1月29日水曜日

核酸配列に基づかない微生物群集の分析方法

20200129_Blogger0009

核酸を使わない微生物群集の分析方法

核酸 (DNA や RNA) を利用した微生物の分析方法は、環境サンプル中の微生物を群集として扱う場合には間違いなく最もポピュラーな方法です (Knight et al. 2018 Nature Review Microbiology など)。また、環境サンプルの分析だけでなく微生物の研究におけるあらゆる場面で核酸の分析が必要な技術であることは疑いようがありません。

一方で、微生物群集の分析方法は核酸に基づいたもの以外にも数多くあります。それらは、核酸に基づいた分析ほど頻繁に利用されるわけではありませんが、それぞれ核酸分析では得られない情報を提供してくれます。使用する機会があるかどうかは別として、どのような方法があり、どのような情報を得ることができるかを知っておくことは有益です。

そこで今回のポストでは (1) 顕微鏡観察、(2) リン脂質脂肪酸、(3) キノン、(4) BIOLOG、(5) 分解酵素活性、について紹介したいと思います (単離培養 については超重要ですがここでは触れません)。

1. 顕微鏡観察

顕微鏡観察は最も古典的な微生物の分析方法の一つと言ってもいいかもしれません。核酸分析にない一番の特徴としては 形態情報が得られる ことでしょうか。どのような形をしているのか、どのくらいの大きさなのか、といった情報はその微生物の生態に関する示唆を与えてくれるだけでなく、その微生物が保持する炭素や窒素など元素の量の推定も可能にします (微生物が保持する元素の量は地球上の炭素循環や窒素循環を考える上で非常に重要です)。

顕微鏡には非常に多くの種類があり、自分自身も素人に近いですが、微生物の分野で使用されているいくつかの顕微鏡関連の手法を紹介します。

DAPI による (微生物種を区別しない) 核酸染色と細胞数カウント

DAPI という色素で微生物細胞中の核酸 (主に DNA) を青く染めて蛍光顕微鏡下で細胞数を数えたりします。簡便な方法で、煩雑な操作を必要とせず細胞中の DNA を染色できます。ただし、微生物種の区別はできません。また、微生物以外のDNA も光ります。

FISH (Fluorescent in situ hybridization) (Amann et al. 1990 Journal of Bacteriology) により微生物種を染め分けて細胞数カウント

FISH では微生物の 16S rRNA と相補的なプローブ (短い DNA 配列) を用意します。このプローブには蛍光色素がくっついており、染めたい微生物種 (分類群) の 16S rRNA に特異的なプローブをデザインすることで特定の微生物のみを染めて観察することができます (核酸を利用しているとも言えますが、配列を解読しているわけではありません)。

FISH には様々な改良法があります。例えば、手順は増えますが Horshradish peroxidase という酵素を利用して、蛍光を増幅することで観察を容易にする CARD-FISH という方法もあります (Schönhuber et al. 1998 Applied and Environmental Microbiology; Pernthelar et al. 2002 Applied and Environmental Microbiology) (めんどくさくて発狂しそうになる、という意見も)。

自分は CARD-FISH を土壌サンプルに対して適用してみました (Ushio et al. 2013b Soil Biology & Biochemistry)。下の写真はスウェーデンのツンドラ土壌のサンプルを CARD-FISH 法で染色したものです。青色に光っているのが DAPI により染色された細菌で、黄緑色に光っているのが古細菌特異的なプローブで染めた古細菌です (2重染色しています)。微生物周辺にあるもやもやしたものは土壌有機物の集合体と思われます。

enter image description here

電子顕微鏡

電子顕微鏡ももちろん使用されていますが、こちらは自分はほとんど使用経験がありません。

2. リン脂質脂肪酸 (PLFA)

リン脂質脂肪酸 (Phospholipid Fatty Acid; PLFA) は微生物の細胞膜に含まれる成分です。下記は Wikipedia の 「リン脂質」 のページに掲載されている図です。

enter image description here

リン酸とグリセリンの左側に脂肪酸 (オレイン酸とかパルミチン酸) が結合しています。面白いことに、この脂肪酸部分は微生物の分類群ごとに “ある程度” その種類が決まっています。従って、脂肪酸の種類をガスクロマトグラフィーで分析することでサンプル中の微生物群集の組成を推定することが可能です。この手法は Ushio et al. (2008, 2010a, 2010b, 2013a, 2013c) などでお世話になりました。

脂肪酸の記載方法

脂肪酸、およびその構造の記載方法は生態学ではあまり頻繁に登場するものではありません。脂肪酸の構造の記載方法について少しだけ解説しておきます。脂肪酸は上に示したように長い炭素鎖が基本にあり、それに加えて二重結合があったり、炭素鎖に分岐があったりします。例えば、以下のパルミトレイン酸という脂肪酸は炭素数が 16 で途中に二重結合が一つある構造をしています (Wikipedia より引用しています)。

enter image description here

この場合、16:1ω7 などと記載されます。“16” が炭素数を示し、":1" は二重結合が 1 つあることを示します。“ω7” の部分は炭素鎖の末端 (-OH がない方) から数えて 7 番目に二重結合があることを示しています。また、炭素数を表す “16” の前に “a”, “i”, “cy” などのアルファベットが付くことがありますが、これは “antiiso-”, “iso-”, “cyclo” などの立体構造に関する情報を表します。

分類群特異的脂肪酸

以下、Ushio et al. (2013c) Plant and Soil で使用した代表的なバイオマーカーを示しておきます。

  • 真菌: 18:2ω6,9
  • グラム陽性菌: i14:0, i15:0, a15:0, i16:0, i17:0, a17:0
  • グラム陰性菌: 16:1ω7, cy17:0, cy19:0

また、自分は指標として使用しませんでしたが、微生物のストレス状態によっても脂肪酸の組成が変わるらしいです。つまり、脂肪酸の組成は細胞膜の流動性に関わるようで、例えば脂肪酸に二重結合が増えると (ω がついた脂肪酸が増えると)、細胞膜の流動性が上がりストレス環境下 (例えば、低温状態) においてより適応的になると考えられます (不勉強で少し自信がありません…)。

利点と不利点

PLFA を用いた微生物群集の組成分析は 核酸に基づいた分析に比べて以下のような利点・不利点があります。

  • 利点
    分析結果が定量的。例えば、PLFA は量として XX µmol/g soil などとして得られるため、異なるサンプルを比較して、どちらのほうが真菌が多い、少ない、といった議論が可能です (真菌:細菌比の算出も一度の分析でできます)。
    核酸のように煩雑な事後解析が不要。核酸の配列解析にはいわゆるバイオインフォマティクスのような知識が多少なりとも必要ですが、PLFA の解析ではそこまで煩雑な前処理は必要ありません。 ガスクロマトグラフィーのピークの位置とピークの面積から脂肪酸の種類と量を推定します。
    – 細胞膜成分は、微生物が死ぬと比較的迅速に分解されると考えており、PLFA の分析結果は生きている微生物の量を反映していると考えられています。この点、時に死んだ微生物の DNA の存在が問題となる核酸に基づいた分析とは対照的です (例えば、Carini et al. 2016 Nature Microbiology)。
    – 同位体トレーサーなどと組み合わせることで物質の動態を追える。例えば、適当な基質を同位体トレーサーでラベリングすることで、その基質がどのような分類群の微生物に取り込まれたか調べることができます (これは核酸分析でも可能な場合がありますが)。

  • 不利点
    分類群の解像度が低い。種レベル・属レベルといった解析は不可能です。DNA に基づいた分析と比べると決定的な不利点、という感じがします。
    – 化学的な分析が必要で有機溶媒をたくさん使用するため、試薬のハンドリングや廃棄に気をつける必要があります。
    – 使っている人が核酸分析に比べると少ない。従って、関連情報も得にくいです。PLFA を使った研究を発表すると 「なぜ DNA を使わないの?」 と聞かれたりします。

3. キノン

キノンは呼吸鎖における電子伝達物質ですが、PLFA と同じように、微生物分類群ごとにその化学種が大まかに決まっています。ユビキノン・メナキノンなどの種類があるようですが、自分には使用経験がなく文献などもあまり読み込んでいないため、ここでは解説は控えることにします。定量性があることや分類群の解像度がそこまで高くないことなど、PLFA と似たような特徴を持っているようです。

知り合いが使用して湖の微生物の研究をしていました。例えば、Takasu et al. (2013) Limnology などをご覧ください。

4. 分解酵素活性

PLFA やキノン、また DNA も環境中の微生物群集の組成に関する情報を提供します。微生物群集の組成は、「その環境中にどのような微生物が生育しているか」 という情報を提供してくれますが、環境中での物質の流れを考えたい場合などはその 機能 の評価も重要になります。核酸に基づいた方法であれば、環境中の微生物群集の機能遺伝子や RNA 発現パターンを調べることで微生物群集の機能に関する情報が得られます。しかし、核酸に基づいた方法だけでは、実際に微生物群集が物質を代謝しているのか どうかは分かりません。そういった場合に、分解酵素活性の分析や次で紹介する BIOLOG が有効になってきます。

分解酵素活性の分析では、何らかの発色物質と結合した基質を利用します。代表的なものは次の二つです。

p-ニトロフェノール 結合基質

p-ニトロフェノールはニトロ基を有する単純なフェノール化合物です。p-ニトロフェノールに結合したリン酸 (p-ニトロフェニルリン酸) などが試薬会社から市販されており、このような化合物を分析に用います。例えば、p-ニトロフェニルリン酸の溶液に微生物を含む土壌抽出液を少量添加すると、p-ニトロフェニルリン酸が代謝された場合は p-ニトロフェノールとリン酸が分離し、(pH 調整後に) 溶液が黄色く発色します。この発色を吸光度計で測定することで分解酵素活性を測定します。p-ニトロフェニルリン酸を分解する酵素はリン酸分解酵素などと呼ばれます。p-ニトロフェノールが結合する基質を選ぶことでいろいろな分解酵素活性の測定が可能です。この手法は Ushio et al. (2010a, 2010b, 2013c) などでお世話になりました。

Methylumbelliferone (MUB) 結合基質

測定原理はほぼ p-ニトロフェノール結合基質と同じです。MUB と結合した基質が微生物群集の分解酵素で分解されると MUB が遊離し、その量を測定することで分解酵素活性を測定します。ただし、MUB は蛍光物質であり、測定には吸光度計ではなく、蛍光プレートリーダーが必要です。p-ニトロフェノールと同じく、MUB に結合している基質を選ぶことで様々な分解酵素活性を測定することができます。Ushio et al. (2013) PLoS ONE で使用しました。

p-ニトロフェノール結合基質の方が試薬も必要な実験機器も安価ですが、大量のサンプルを処理する場合には 96ウェルマイクロプレートを利用しやすい MUB 結合基質の方が向いているように思います。

5. BIOLOG

BIOLOG は分解酵素活性分析と同様に、微生物群集の基質代謝能力を測ることの出来る手法です (Garland & Mills 1991 など)。実験に使用するマイクロプレートは BIOLOG 社が販売していて、“BIOLOG” というワードは会社の名前でも有り、手法の名前でもあり、商品の名前でもある、という感じです (多分)。

BIOLOG プレートにはいろいろな種類があります (EcoPlate など)。96ウェルマイクロプレートに様々な化合物が微生物の代謝基質として予め入れられており、そこに生きた微生物を含むサンプル (単離株でもいいし、水や土壌などの環境サンプルでもよい) を適当に希釈して投入して使用します。サンプル中の微生物 (群集) にウェル内の基質の代謝能力があれば、ウェル内の基質が代謝され、紫色に発色します。プレートリーダーでその強度を読み取ることで、微生物 (群集) の基質代謝能力を評価できます (Miki et al. 2018 Ecological Research などをご覧ください)。

(自分も使用したことはあるのですが、論文になるデータが取れませんでした…)

終わりに

冒頭に述べたように微生物生態学では核酸に基づいた分析が主流であることは間違いありません。その一方で、核酸分析に加えてここで解説したような手法を追加することで研究対象となる微生物群集をより深く分析することができます。それぞれの手法は核酸分析では得られない情報を多かれ少なかれ提供してくれます。様々な角度から微生物群集を分析することで、その群集組成・機能・生態系での役割を明らかにすることができるはずです。

参考文献

  • Amann R, Krumholz L, Stahl DA. (1990) Fluorescent-oligonucleotide probing of whole cells for determinative, phylogenetic, and environmental studies in microbiology. Journal of Bacteriology 172: 762-770
  • Carini P, Marsden PJ, Leff JW, Morgan EE, Strickland MS, Fierer N (2016) Relic DNA is abundant in soil and obscures estimates of soil microbial diversity. Nature Microbiology 2: 16242
  • Garland JL, Mills AL. (1991) Classification and characterization of heterotrophic microbial communities on the basis of patterns of community-level sole-carbon-source utilization. Applied and Environmental Microbiology 57: 2351-2359
  • Knight R, et al. (2018) Best practice for analysing microbiomes. Nature Review Microbiology 16: 410-422
  • Miki T, Yokokawa T, Ke P-J, Hsieh I-F, Hsieh C-h, Kume T, Yoneya K, Matsui K (2018) Statistical recipe for quantifying microbial functional diversity from EcoPlate metabolic profiling, Ecological Research 33: 249-260
  • Pernthaler A, Pernthaler J, Amann R. (2002) Fluorescence in situ hybridization and catalyzed reporter deposition for the identification of marine Bacteria. Applied and Environmental Microbiology 68: 3094-3101
  • Schönhuber W, Fuchs B, Juretschko S, Amann R. (1997) Improved sensitivity of whole-cell hybridization by the combination of horseradish peroxidase-labeled oligonucleotides and tyramide signal amplification. Applied and Environmental Microbiology 63: 3268-3273
  • Takasu H, Kunihiro T, Nakano S (2013) Estimation of carbon biomass and community structure of planktonic bacteria in Lake Biwa using respiratory quinone analysis. Limnology 14: 274-256
  • Ushio M, Wagai R, Balser TC, Kitayama K. (2008) Variations in the soil microbial community composition of a tropical montane forest ecosystem: Does tree species matter? Soil Biology & Biochemistry 40: 2699-2702
  • Ushio M, Kitayama K, Balser TC. (2010a) Tree species-mediated spatial patchiness of the composition of microbial community and physicochemical properties in the topsoils of a tropical montane forest.Soil Biology & Biochemistry 42: 1588-1595
  • Ushio M, Kitayama K, Balser TC. (2010b) Tree species effects on soil enzyme activities through effects on soil physicochemical and microbial properties in a tropical montane forest on Mt. Kinabalu, Borneo. Pedobiologia 53: 227-233
  • Ushio M, Miki T, Balser TC. (2013a) A coexisting fungal-bacterial community stabilizes soil decomposition activity in a microcosm experiment. PLoS ONE 8: e80320
  • Ushio M, Makoto K, Klaminder J, Nakano S-I. (2013b) CARD-FISH analysis of prokaryotic community composition and abundance along small-scale vegetation gradients in a dry arctic tundra ecosystem. Soil Biology & Biochemistry 64: 147-154
  • Ushio M, Balser TC, Kitayama K. (2013c) Effects of condensed tannins in conifer leaves on the composition and activity of soil microbial community in a tropical montane forest. Plant and Soil 365: 157-170

Written with StackEdit.

2020年1月13日月曜日

rEDM を用いた Empirical Dynamic Modeling: (5) Convergent Cross Mapping (CCM)

20200113_Blogger0008

Convergent Cross Mapping (CCM)

ここでは変数間の因果関係を検出する Convergent Cross Mapping (CCM; Sugihara et al. 2012) について解説します。

CCM で使用されるアルゴリズムは基本的に Simplex projection に非常に似ており、従って Simplex projection を理解できていればアルゴリズムを理解することは比較的容易です。

1. CCM の概念的な説明

「因果がある」 とは

「相関は必ずしも因果を意味しない」 というのはあまりにも有名です (例えば、Wikipedia による解説も御覧ください)。ここではそれについては改めて詳しく説明することはしませんが、それではそもそも 「因果がある」 とはどういうことでしょうか?この疑問について深く考えると非常に難しく、哲学や宗教も絡んできそうですが、ここではひとまずそのようなことは考えず 「同じ力学系に属していれば因果がある」 と思うことにしましょう。例えば 「時系列データを用いた動態の再構成」 で用いたローレンツアトラクターは以下の微分方程式から現れる動態でした。

dxdt=pX+pYdydt=XZ+rXYdzdt=XYbZ\frac{dx}{dt} = -pX + pY\\ \frac{dy}{dt} = -XZ + rX - Y\\ \frac{dz}{dt} = XY - bZ

enter image description here

この系は一つの力学系ですが、XX, YY, ZZ が同じ力学系に属して (お互いに因果を持ちながら) 動態を形成しています。このような状況のときには、例えば XX の時間変化に YY が影響を与えていますし、直感的な意味で YYXX に因果がある、影響があると考えて良さそうです。もっと簡単に考えると、YY の値が変化するときに、XX も変化する、ということができます。

同じ力学系に属しているかどうかを調べる

さて、CCM は2つの変数が同じ力学系に属しているかどうかを調べようとします (他の解釈も可能ですが、図的に説明しやすいのでここではこの解釈を説明します)。では、どうやって同じ力学系に属しているかどうか調べるのでしょうか?

下の図を覚えているでしょうか?左は X(t)X(t) の時間遅れを用いて再構成した動態 (MxM_x とします)、右は Y(t)Y(t) の時間遅れを用いて再構成した動態 (MyM_y) です。
enter image description here

以前説明したように、MxM_x はもともとの XX, YY, ZZ を用いて再構成した動態 (便宜的に真の動態、と呼びます) と同じかたちとみなせます。同様に MyM_y も真の動態と同じかたちとみなせます。従って、Mx=[真の動態]=MyM_x = [真の動態] = M_y となり、もし XXYY が同じ力学系に属していれば MxM_xMyM_y は同じかたちになるはず です (下図)。

enter image description here

CCM では、Simplex projection を応用して、再構成された2つの動態が同じかたちかどうかを調べることで変数間の因果関係を検出しようとします。

注意: 最近、とある研究会で 「動態の再構成についてローレンツアトラクタ−を例として説明するのはあまりよくないのではないか」 とのご指摘をいただきました。その方はカオス時系列などの研究をされていた方でいくつかの根拠を持ってそのような指摘をしてくれました。この点について現在勉強中で、ひょっとすると将来説明の仕方が変わる可能性があります。

2. CCM のアルゴリズム

では、Simplex projection を応用して、どのようにして 「同じかたちかどうか」 をチェックするのか、R を利用して解説していきます。

マニュアルコードによる解説

例によって自作の2種系のデータセットを使用して説明します (四度目)。

# rEDM のロード
library(rEDM)
packageVersion("rEDM") # 2020年1月時点で v0.7.5

# 2種系のデータセットを作成
d0 <- as.data.frame(matrix(rep(NA,3*1000),ncol=3))
colnames(d0) <- c("time","x","y")
d0[,1] <- 1:1000
d0[1,2:3] <- c(0.1, 0.1)
for(i in 1:999){
        d0[i+1,2] <- d0[i,2]*(3.8 - 3.80*d0[i,2] - 0.02*d0[i,3])
        d0[i+1,3] <- d0[i,3]*(3.5 - 0.10*d0[i,2] - 3.50*d0[i,3])
}

# 最初の 99 点を捨てて、時間 100 から 1000 のデータを使用
d <- d0[100:1000,]

最適埋め込み次元の決定

まずは Simplex projection を利用して最適埋め込み次元 (E) を決定します。ここでは rEDM の simplex 関数を利用します。

simp_res <- simplex(y)
plot(simp_res$E, simp_res$rmse, type = "b", las = 1, xlab = "E", ylab = "RMSE")

enter image description here

RMSE に基づいて、最適埋め込み次元は 2 を使用することにします。

Ey <- simp_res$E[which.min(simp_res$rmse)]

最近傍点の特定

最適埋め込み次元を決定した後は Simplex projection と同様に Y(t)Y(t) の埋め込みを作り、ターゲットの点を決めて最近傍点を特定します。

# Y(t) の埋め込みを作成して、ターゲットの点を指定
y_embed <- make_block(y, max_lag = Ey)
t_target <- 240 # ターゲットの点を指定

# t = 240 の点から各点への距離を計算
distance <- sqrt(rowSums((y_embed[,2:3] - c(y_embed[t_target, 2:3]))^2))
nn_index <- order(distance)[2:4] # 自分自身を除いて 3 点近い点を選ぶ

# 最短距離を取得
min_distance <- distance[nn_index][1]
# 最短距離で補正した重みを計算
weights <- exp(-distance[nn_index]/min_distance)
# 合計の重みを計算
total_weight <- sum(weights)

Cross mapping

通常の Simplex projection ではこの後、以下のように Y(ttarget)Y(t_{target}) の近傍点の情報 (nn_index) から、Y(t+1)Y(t+1) を予測します。

# Y(t+1) を予測
pred <- (weights %*% as.matrix(y_embed[nn_index + 1,3:2])) / total_weight

一方、CCM では以下のようにして Y(ttarget)Y(t_{target}) の近傍点の情報 (nn_index) を元にして X(t)X(t) の値を予測します。この

# Y(t) の近傍点の情報を利用して X(t) を予測
pred <- (weights %*% as.matrix(x[nn_index])) / total_weight

予測値を見てみましょう。かなり近い値を予測できていることが分かります。

> pred # 予測値
[1,] -1.21572
> x[t_target] # 実測値
[1] -1.254002

この操作は一体何をしているのでしょうか?これは、元の時系列に戻ってみると分かりやすいでしょう。下の図を使って説明します。
enter image description here
図の左上のパネルは Y(t)Y(t) のターゲット点周辺の様子です (ttarget=240t_{target} = 240 ですが、生成したデータの最初の 99 点を捨てているので実際の time は 339 となっています)。2次元で動態を再構成しているので、Y(t)Y(t)Y(t1)Y(t-1) の点の 「動き」 に注目していることになります。最近傍点の特定とは、ターゲットの点の 「動き」 と似た点を Y(t)Y(t) の時系列から探していることになります。これは図中では (1) Identify nearest neighbors に相当します。その後、特定した Y(t)Y(t) の時間と同じ時間の X(t)X(t) を特定します (図中 (2) Cross-mapping)。Y(t)Y(t) の情報を元に特定された X(t)X(t) の値を重み付け平均して X(t)X(t) の値を予測しています (図中 (3) Prediction)。(図中の (2) と (3) を合わせて Cross-mapping と呼ぶべきかも知れませんが、ここでは説明の都合上2つを分けています)

Convergence のチェック

CCM では上記の手順を X(t)X(t) の全てのデータ点で行い、Y(t)Y(t) の情報のみから X(t)X(t) を予測できるかを調べます。さらに CCM では Simplex projection では通常行わない計算が加わります。それは、状態空間の再構成に利用するデータ点の数 (rEDM パッケージ内では library size と呼ばれます) を変化させ、データ点数の増加に伴って予測精度が上昇するかどうかをチェックします。この現象は Convergence と呼ばれていて、CCM の名前の由来にもなっています。

rEDM の ccm 関数を利用してこの Convergence をチェックしてみましょう。ccm 関数で求めた Cross-mapping による予測精度を ccm_means 関数で見やすい形にまとめています。

# Convergence のチェック
ccm_all_res <- ccm(cbind(y, x), E = Ey, lib_sizes = seq(Ey+1, nrow(d), by = 30))
ccm_res <- ccm_means(ccm_all_res)

# 結果の図示
plot(ccm_res$lib_size, ccm_res$rho, type = "l",
     xlab = "Library size", ylab = expression(rho), las = 1)
plot(ccm_res$lib_size, ccm_res$rmse, type = "l",
     xlab = "Library size", ylab = "RMSE", las = 1)

enter image description here

Library size の増加に伴って、相関係数 (ρ\rho) の増加や RMSE の減少が見られます。これは XX から YY への因果があることを示唆しています。

注意点: CCM では YY の情報を使って XX を予測できたとき、それは XX から YY への因果を意味しています。XYX → Y のときは、XX の情報が YY に流れており、そのため YY の情報を用いた XX の予測が可能になります。

また、ここで ccm 関数の引数の説明もしておきます。

ccm(time_series,                             # 時系列データ
    lib = c(1, NROW(time_series)),           # 埋め込みに使用するデータの範囲
    pred = lib,                              # 予測値を出すデータの範囲
    norm = 2,                                # 重み付けのための距離の計算方法
    E = 1,                                   # 試行する埋め込み次元の範囲
    tau = 1,                                 # 時間遅れの単位
    tp = 0,                                  # 何ステップ先を予測するか
    num_neighbors = "e+1",                   # 使用する最近傍点の数
    lib_sizes = seq(10, 100, by = 10),       # library size の指定
    random_libs = TRUE,                      # library からベクトルを選ぶときにランダムに選ぶかどうか
    num_samples = 100,                       # ある library size に対して何回 library を作るか
    replace = TRUE,                          # library を選ぶ際に同じベクトルを複数回選択することを許すかどうか
    lib_column = 1,                          # cross-map 元 (= library) の変数 (減員側の変数)
    target_column = 2,                       # cross-map 先の変数 (因果側の変数)
    first_column_time = FALSE,               # 時系列のデータフレームの最初の列が時間かどうか
    RNGseed = NULL,                          # library の再構成に使用するデータを選ぶ際の random seed の設定
    exclusion_radius = NULL,                 # 最近傍点を探す条件として、予測したい点とどの程度時間的に近い点を除くか (数値を指定する)
    epsilon = NULL,                          # 最近傍点を探す条件として、予測したい点とどの程度距離的に遠い点を除くか (数値を指定する)
    stats_only = TRUE,                       # 予測の統計情報のみを出力するのか、それとも予測値も実際に出力するのか
    silent = FALSE)                          # Warning message を出力するかどうか

たくさんの引数がありますが、解析上重要なのは、time_series, E, lib_sizes, tp などです。特に tp を変化させることで時間遅れの効果による因果の判定もできます (Ye et al. 2015)。

なぜ Convergence が重要か?

では、なぜ Convergence をチェックすることで因果のあるなしが、すなわち2つのかたちが同じかどうか判定できるのでしょうか? Cross-mapping を利用して片方の動態からもう片方の値を予測するということは、ローレンツアトラクターを例にすると以下のように2つの動態の中のある点とある点の対応をチェックしていることになります。

enter image description here

Library size が小さいときは、疎な状態のアトラクターを利用して最近傍点を特定し、Cross-mapping を行います。このときはたとえ二変数の間に因果があっても比較的遠くの点しか最近傍点として利用できず、当然 Cross-mapping による予測精度は低くなります。一方、だんだんと Library size を大きくすると、アトラクターが密な状態になっていき、より近い点を最近傍点として選べるようになります。仮に無限のデータ点が利用でき、そのデータに誤差が全く含まれていない場合は、無限に近い点を最近傍点として利用できることになり、最終的には完全な予測 (RMSE = 0) が達成できることになります。このとき、二つのアトラクター上の点と点は完全に 1:1 に対応していると判断でき、そのため二つのかたちは同じということができます。実際の時系列データは有限で誤差も含まれると思いますが、予測精度の上昇傾向を見て、最終的に二つのアトラクター上の点が 1:1 に対応しそうかどうかを調べている、ということです。

Sugihara et al. (2012) の補足資料である以下のビデオも参考になると思います。https://www.youtube.com/watch?v=NrFdIz-D2yM&t=10s

典型的な解析手順

CCM について解説しましたが、典型的な解析手順を再度まとめておきます。

  1. 時系列データの標準化
  2. Simplex projection による最適埋め込み次元 (EE) の推定
  3. 決定した EE を用いて ccm 関数で Cross-mapping を実行。この際、library_sizes 引数を指定して Convergence を同時にチェックします。典型的な library size の範囲は E + 1 から全てのデータ点 (length(y)nrow(d)) までです。
  4. ccm_means 関数で結果をまとめ、Convergence が見られるかチェックする。少なくとも最小のライブラリ数による予測精度を最大のライブラリ数による予測精度が上回っていなければ因果なしという判定になります。
  5. Convergence が見られた場合は、サロゲートデータ (ある一定のルールに従って元の時系列データをシャッフルしたもの) を作成し、その Convergence が有意かどうか検定する。この際、rEDM の make_surrogate_data 関数が使用できます。どのサロゲートデータを使用するかも重要な問題ですが、初学者はまずは make_surrogate_ebisuzaki を試してみるのが良いかと思います。このサロゲートや検定に関してはまた時間があるときに解説してみようと思います。

解析上の注意点

CCM はうまく使用すれば非常に有用な手法ですが、比較的若い手法でまだまだ未解決問題やそれらに関連した注意点がいくつかあります。開発も続いているので、近い将来状況が変わる可能性は大いにありますが、現段階での注意点・未解決問題を列挙しておきます。自分のデータが以下の問題に当てはまるときは、EDM・CCM の原理を理解した上で慎重に解析を実行する必要があります。

  • データに強い季節性がある (特に変数間でその季節性が同調している): このとき、単純な CCM では因果を誤検出する可能性があり、季節性を考慮した解析が必要です。現段階ではしばしば make_surrogate_seasonal 関数によって季節性を保存したサロゲートデータを作ることで対応しますが、これでも十分ではないかも知れません。Deyle et al. (2016), Baskerville & Cobey (2017), Sugihara et al. (2017), Cobey & Baskerville (2016) などを御覧ください。
  • 欠損値が含まれる: 欠損値が含まれると時間遅れ埋め込みの際に状態空間中で位置を確定できないベクトルが増加します。そのため、CCM を行う際にライブラリとして使用するための十分なデータ点数を確保できなくなる可能性があります。多少の欠損値であれば何らかの方法で値を内挿し値を埋めることもありますが、一番はやはり欠損値がないようなデータセットを準備することです。
  • 時系列データの時間間隔が一定ではない: 時系列データの時間間隔が一定でない場合は時間遅れ埋め込みによる状態空間の再構成が使えません。従って、複数のデータ点の平均値を取るなどして時間間隔を調整するか、EDM の適用を諦めることになります。
  • データが相対優占度 (%) である: 微生物群集の DNA データなどにありがちですが、データが絶対量ではなく、相対優占度でしか手に入らない場合があります。相対優占度のデータは計算上、どうしても二変数間に因果が出てしまいます。つまり2種類の生物 A と B しかいない場合、A と B の間に因果関係がなくても、相対優占度は常に A = 1 - B となるように計算されており、明らかに A の相対優占度は B の相対優占度の影響を受けます。従って、CCM の安易な適用はできません。絶対量のデータを取得する、というのがもっとも直接的な解決方法で、Ushio et al. (2018) や Ushio (2019) はそれを目的として行われた手法開発です。
  • 時系列データは短いが、時系列データに反復がある: 一般的には EDM は最低でも 35–40 点程度の時系列データが必要と言われていますが (もちろん動態によります)、これは生態学の分野ではなかなか厳しい制約です。たとえば、データが 1 年に 1 回しか取得できなければ 35–40 年分のデータが最低でも必要ということになります。ただし、データ点がそれよりも少ないが、調査地点が複数あるときは別の選択肢が考えられます。例えば、時系列データは 20 点しかないが、そのような調査が行われた地点が 10 地点ある、などの場合は Spatial convergent cross mapping (Clark et al. 2015) のような手法を適用することも考えられます。

終わりに

5回に渡って EDM について書いてきましたが、Simplex projection, S-map, CCM について理解できれば一通り EDM についての入門は終わりと言っても良いでしょう。あとは自分の時系列データに適用しながら理解を深めていって下さい。

EDM はまだまだ開発途上でこれから先数年のうちにまた新しい手法が出てくることが期待されます。そうなった場合にはまた解説記事を書くかも知れません。また今回の記事ではカバーできなかった部分も要望などがあれば再び追加で記事を書くかもしません (サロゲートデータや検定についてなど)。そうなったときはまた目を通していただければ幸いです。

参考文献

  • Baskerville EB & Cobey S (2017) Does influenza drive absolute humidity? PNAS 114:E2270-E2271
  • Cobey S & Baskerville EB (2016) Limits to causal inference with state-space reconstruction for infectious disease. PLoS ONE 11: e0169050
  • Clark AT, et al. (2015) Spatial convergent cross mapping to detect causal relationships from short time series. Ecology 96: 1174-1181
  • Deyle ER, Maher MC, Hernandez RD, Basu S, Sugihara G (2016) Global environmental drivers of influenza. PNAS 113:13081–13086
  • Sugihara G, Deyle ER, Ye H (2017) Reply to Baskerville and Cobey: Misconceptions about causation with synchrony and seasonal drivers. PNAS 114: E2272-E2274
  • Sugihara G, et al. (2012) Detecting causality in complex ecosystems. Science 338: 496–500
  • Ushio M, et al. (2018) Quantitative monitoring of multispecies fish environmental DNA using high-throughput sequencing. Metabarcoding & Metagenomics 2: e23297
  • Ushio M (2019) Use of a filter cartridge combined with intra-cartridge bead-beating improved detection of microbial DNA from water samples. Methods in Ecology and Evolution 10:1142-1156
  • Ye H, Deyle ER, Gilarranz LJ, Sugihara G (2015) Distinguishing time-delayed causal interactions using convergent cross mapping. Scientific Reports 5:14750
  • Ye H, et al. (2018) rEDM: Applications of Empirical Dynamic Modeling from Time Series. doi:10.5281/zenodo.1935847

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 ...