Docker + R + checkpointで再現可能な解析プロジェクトを作る


1. はじめに

1.1. 統計解析の再現性

近年、科学の広い分野で、研究結果の再現性を確保する取り組みが進められています。私の場合は統計学の一部、メタアナリシスの応用を専門にしていることもあり、統計解析の再現性については特に気になっています。再現性を確保するための要件は様々な角度から議論されていますが、大雑把に言えば以下の2つが重要です。

  • 解析前に、根拠に基づいて研究計画書(プロトコル)を作成し、公開する
  • 解析後に、第三者が追試できるような状態を整え、提供する

解析前の段階では、多くの分野でプロトコルを作成し公開することが強く推奨されており、既に主要なジャーナルはプロトコルの登録番号がないと原稿を受理しません。例えば、メタアナリシスではいくつかのガイドラインを遵守したうえで、審査を受けたプロトコルをPROSPEROで事前に公開することが、査読に進むための最低条件です。[1]

一方、解析後の段階については状況はより混沌としており、具体的な手段に関する合意は形成されていません。2022年4月現在、いくつかのジャーナルがデータセットと解析コードの公開を原稿受理の条件としたり、専門のレビュワーがデータとコードセットから研究結果を再現できるか確認したりしていますが、こうした取り組みはまだ稀です。とはいえ、今のうちから再現性を確保できるような解析方法を仕組みとして実装しておくことは必要でしょうし、研究の品質向上にも役立つと思います。[2]

1.2. 実装

1.2.1. Rのバージョンを管理し解析環境をコンテナ化する

解析環境をどこまで再現できるようしておくかは悩むところですが、[3] オペレーティングシステム(OS)や統合解析環境(IDE)も解析結果に影響を与えることがありますし、追試者がそこまで統一するのはなかなか困難です。そこでコンテナ技術を活用して、これらも簡単に再現できるようにします。今回はDockerを採用し、Rocker Project が作成している rocker/rstudio イメージで、OS、IDE及びRのバージョンを管理します。

1.2.2. Rのパッケージ群を管理する

CRAN Task View: Reproducible Researchに、再現性の確保に役立つパッケージが紹介されており、"Package Reproducibility"の項で様々なRのパッケージ管理方法がまとめられています。その中から、今回は論文の執筆に向いた便利な特徴を備えている checkpoint を選びました。

  • 特定のスナップショット日に CRAN に存在したパッケージをインストールすることができる
    • 全パッケージのリストを確認しなくても、スナップショット日と、R のバージョン及び主要な解析パッケージ名というわずかな情報から、解析に使用したソフトウェア群を特定できる
    • 簡単に複数のスナップショット日を切り替えることができるので、解析パッケージ群の変更によって解析結果が変化したかどうかを検証するのが楽
  • 使い方がシンプル
    • 解析コードの冒頭に一つの関数を記述しておけば解析パッケージの固定も復元も可能
    • checkpointMicrosoft R Archived Networkからパッケージだけではなく、スナップショット日のドキュメントも保存してくれるので、過去のドキュメントを探しに行かなくてもいい
  • 動作が安定している
    • checkpoint のバージョン1.0以降はそれ以前のバージョンとは別物で、パッケージのキャッシュが利用でき、リストアが早い

パッケージの初回ビルドはコンパイルが必要なので時間がかかりますが、2回目以降はキャッシュを読み込むだけなので高速です。初回ビルド中はコーヒーブレイクということで。

1.2.3. 解析データと解析レポートを統合する

先に挙げた "CRAN Task View" の "Literate Programming"の項にあるように、解析コード、解析結果及び解釈をひとつのドキュメントにまとめて直接解析レポートを生成すると改ざんの余地がなく、研究の作業フローもシンプルになります。そこで、この解析プロジェクトのテンプレートではQuartoまたはR Markdownを使用することを前提にしました。

QuartoとR Markdownは、以下のような特徴を持つドキュメント生成システムです。

  • Markdown記法を採用している
  • ひとつのファイル(.qmd または .Rmd ファイル)にRやPythonなどのコードと通常の文章を同時に書くことができる
  • HTML、PDF、ワードファイルなど、様々な形式のドキュメントを出力できる
  • 出力結果にコードの実行結果を含めることができる

QuartoとR Markdownとの使用感はほぼ同じで、Rユーザーにとっては「Quarto = 次世代版R Markdown」という認識で良いと思います。Quartoはまだ開発版ですが、仕様の変化が減ってきている(気がする)ので、この記事ではQuartoの設定例を紹介します。

1.2.4. データセットと解析コードを公開する

追試者や、将来の研究者の利便性を考えると、データセットと解析コードをリポジトリに公開し、デジタルオブジェクト識別子(DOI)を付与して、論文で引用するのがスムーズだと思います。今回はGit/GitHubを使用し、Zenodoと連携することを想定しています。

  • Git/GitHubでリポジトリを作成し、データセット、解析コード及び解析レポートを公開
  • リポジトリをZenodoでアーカイブし、DOIを付与 + ORCiDに紐づけ
  • DOIを論文で引用

リポジトリが出来上がった後の話なのでこの記事では詳しく書きませんが、GitHubとORCiD/Zenodoは簡単に連携できます。下の画像は、Zenodoの操作説明ですが、このぐらいシンプルです。

1.3. やりたいこと

以下のように解析プロジェクトを構成します。

  • DockerでRStudio Serverを動かす
    • rocker/rstudio イメージを使用する
    • MakeとDocker Composeで、簡単に起動・終了できるようにする
  • checkpoint でプロジェクト固有のパッケージライブラリを作成・管理する
    • Rパッケージのキャッシュはホストからマウントする
  • QuartoまたはR Markdownが使用できるようにする
  • Git/GitHubでソースコードとデータセットをバージョン管理する

1.4. テストした環境

  • OS:Windows 10 Pro(バージョン:21H2、OSビルド 19044.1586)
    • WSL2-Ubuntu 20.04.4 TLS
      • git と make が使用可能で、GitHubに接続可能
  • Docker Desktop 4.6.0(WSL2 バックエンド)
    • Docker version 20.10.13, build a224086
    • Docker Compose version v2.3.3

2. 成果物

2.1. 解析プロジェクトのテンプレートリポジトリ

今回作ったテンプレートリポジトリをGitHubで公開しました。踏み台として使っていただけたら幸いです。