研究における再現性を考える上で,Clarerbout, Jが提案したReplicabilityとReproducibilityの区分はとても便利です。Clarerbout, Jによると,
とされます2。Replicability(再現可能性) は,簡単に言うと新たに追試をして同じ結果が得られることです。これについては,これ以上このページでは扱いません。
一方,Reproducibility(再生可能性)は,既に収集されたデータに対して,論文などで記載されている同じ解析を行った場合に,同じ結果が得られることです。再生が不可能な研究は,再現もしないと思われるので,まずは再生可能な研究ができることが前提になります。本ページの以降では,この再生可能なデータ解析について詳しく解説します。
再生可能なデータ解析をする際の原則は,「データに対して行った操作をすべて記録する」です。これが可能なら,ExcelやSPSSなどを使っても全く問題はありません。つまり,これらのソフトの操作をするたびに,テキストエディタなどにすべての作業を記入し,それを第三者にもわかるようにしておけば良いです。ただ,これはかなり骨が折れます3。なんで骨が折れるかというと,Excelなどでマウスを動かしてポチポチやった作業を記録するのですが,これが面倒です。面倒ですが,その記録がないと,生データから解析結果を得ることができなくなります(例えば,逆点処理・変数変換・データの除外をしたのに記録してないと結果は変わってきます)。
そこで便利なのがRやPythonなどのオープンソースなプログラミング言語です4。プログラムコードを書くのが面倒くさいなあと思われるかもしれませんが,インターネットで検索すれば,必ず優れた例や解説もあるので,すぐに慣れると思います。生データを読み込んで,それ以降Rなどで処理をすれば,その行った処理がすべて記録されます。ただ,Rのコンソールにそのまま書き込むと行った処理の記録になりませんので,R Markdownを使用することを強くおすすめします。
Rでのコードの書き方やR
Markdownの使い方などは,以下のスライドで詳しく解説しているので,参照してください。R
Markdonwについては,kazutanのサイトや中京大学の高橋康介先生による「再現可能性のすゝめ
」を参照することを強くおすすめします。最近は,githubやOSFなどで,データとコードが配布されていることも多くなりました。興味のある研究のデータやコードをダウンロードして,解析やRコードの書き方を学ぶのも実践的で良いかと思います。
RやR Markdownを使っていれば大丈夫かというとそうではなくて,Rなどのオープンソースソフトウェアは,急速に発展しており,どんどん新しいパッケージが発表されたり変更が加えられています。Rパッケージはgithub上で開発されていることもあり,それをみると何人もの人が共同しつつ目まぐるしいスピードで変更を加えているのがわかりますし,エラーがあればissueに報告され,直ちに修正されている様子も確認できます。そのような急速にソフトウェアが開発される状況を踏まえて,Epskamp(2019)は5,再生可能性を低める脅威として以下のようなものを指摘しています。
β版:よく使用されているけど,β版(よく0.x.xなどで表現される)のソフトも多い。しかし,β版は今後大きな変更が加えられる可能性があり,将来の再生性を低める可能性がある。
アップデートと依存関係:ソフトが大きくアップデートされると再生性が低くなる。また,Rパッケージの多くは他のパッケージと依存関係にあるので,依存しているパッケージのどれかが変更されると芋づる式に再生性が低くなる可能性がある。
Epskamp(2019)は,急速なソフトウェア開発に伴う再生性低下のために,以下のような解決方法を提案しています。
上記の1と2だけでは,急速に開発されるソフトウェア環境で再生性を担保することができないので,3が必要になります。使用したソフトウェアパッケージの状態を再生できるようにするためには,(1)Rパッケージのバージョン管理, (2)解析環境のコンテナ化を推奨します。(Epskamp, 2019)。
一番シンプルな方法は,以下のようにsessionInfo()を実行して,使用しているRパッケージのバージョン情報を記録することです。sessionInfo()を実行することで,現在どういう環境で解析がなされたかが記録できます。
sessionInfo()
## R version 4.1.2 (2021-11-01)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 20.04.3 LTS
##
## Matrix products: default
## BLAS/LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.8.so
##
## locale:
## [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
## [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
## [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
## [7] LC_PAPER=en_US.UTF-8 LC_NAME=C
## [9] LC_ADDRESS=C LC_TELEPHONE=C
## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## loaded via a namespace (and not attached):
## [1] rstudioapi_0.13 knitr_1.37 magrittr_2.0.2 R6_2.5.1
## [5] rlang_1.0.2 fastmap_1.1.0 fansi_1.0.2 stringr_1.4.0
## [9] tools_4.1.2 xfun_0.30 utf8_1.2.2 cli_3.2.0
## [13] jquerylib_0.1.4 htmltools_0.5.2 ellipsis_0.3.2 yaml_2.3.5
## [17] digest_0.6.29 tibble_3.1.6 lifecycle_1.0.1 crayon_1.5.0
## [21] sass_0.4.0 vctrs_0.3.8 glue_1.6.2 evaluate_0.15
## [25] rmarkdown_2.12 stringi_1.7.6 compiler_4.1.2 bslib_0.3.1
## [29] pillar_1.7.0 jsonlite_1.8.0 pkgconfig_2.0.3
devtools::install_version()を使えば,sessionInfo()で記録されたのと同じバージョンのRパッケージをインストールすることができます。以下の例の場合は,古いバージョンのggplot2をインストールしています。詳しくは,こちらを参照ください。
devtools::install_version("ggplot2", version = "0.9.1")
ただし,sessionInfo()+devtools::install_version()の組み合わせでは,Rパッケージの膨大な依存関係までは扱うことができないので,完全な環境の再現にはなりません。そこで,Rパッケージのバージョン管理では,現段階では,以下の3つのRパッケージを使うことを推奨します。それぞれ特徴はありますが,解析実施時or終了時のスナップショット(Rパッケージのバージョン情報などが含まれる)をとっておいて,後でその状態を再現するパッケージになります。なお,それぞれの解説については,既に優れた記事があるので,そちらを参照ください。
checkpoint: checkpointの解説記事
packrat: Shinya Uryu氏によるpackratの日本語解説資料
しかし,そもそもOSが違うとかR本体の大きな変更があった場合は,これらのパッケージのバージョン管理だけでは,解決することはできません(古いRをいれればいいとかもありますが,面倒ですね・・・)。OSやR本体の変更も含めた再生性の確保をする場合は,次で説明する解析環境のコンテナ化が必須です。
OSやRのバージョンなどが違っても再生性を担保するには,仮想環境を作って,そこにOSやソフトを用意するという方法があります。ただ,これだとかなり容量が大きくなるので,Dockerが提供するコンテナ技術を使って,最小限の構成でRを使った解析環境を作って,後で利用できるようにすることを推奨します。なんとなく難易度が高そうですが,ユーザーは作業が少なくて済むので,おすすめです。また,RStanやJAGSなどの準備が面倒だったり,難しいと感じるユーザーは,既に準備されたDockerを使えば,お手軽に解析環境を準備することができます。以下は,私が作成したRStudioを使った解析用Dockerのリストです。ベースのpaper-rを使用すれば,すぐにstanやJAGSが使えます。
心理学で使うRパッケージの入ったRStudio Docker (日本語環境対応版は,こちら)
使用はとっても簡単で,以下の5ステップで利用可能です。
1.Docker Desktop ( https://www.docker.com/products/docker-desktop )をインストールする。
2.ターミナル(Macの場合。Winはコマンドプロンプト)を開く
3.ターミナルに以下を打ち込んで、コンテナーをrunする(runの前にPullが自動的なされます)。パスワードとコンテナ名はご自身の好きなように設定ください。
docker run -e PASSWORD=好きなパスワード -p 8787:8787 -v ~:/home/rstudio -d --好きなコンテナ名 ykunisato/国里のDockerHubで使いたいコンテナ名
4.ブラウザを開いて,urlバー(アドレスバー)に,http://localhost:8787/ とタイプする
5.ブラウザ上にRstudioが出てくるので,IDにrstudio,パスに上記で設定したパスワードをいれる。
国里のDocker hubに登録されているDockerはちょくちょく変更されます(ベースにしているrockerの変更があった場合,国里が気まぐれに変更した場合など)。そのため,解析が一段落したら,その現在使っているコンテナごと保存しておく必要があります。まず,解析で使っているコンテナのCONTAINER IDを確認します。確認には,ターミナルに以下のコマンドを打ち込んでください。
docker ps -a
CONTAINER IDが分かったら,以下のコマンドを打ち込んで,使っているコンテナをイメージ(保存しやすくまとめる程度の理解で良いと思います)にします。例えば,私の使っているコンテナ(IDはb1c05f9a452)をcog190817という名前でイメージ化する場合は,“docker commit b1c05f9a452 cog190817”と打ち込みます。
docker commit コンテナのID 好きな名前+日付
次に,以下のコマンドを打ち込んで,作成したイメージを保存します(形式はtar)。 例えば,先程作成したイメージのcog190817を保存する場合は,“docker save cogModel190817 > cogModel190817.tar”と打ち込みます。まあまあ大きなサイズのファイルが保存されると思います(国里のDockerを使っている場合は,4GBを超えると思います)。これを保存しておけば,後で同じ環境で解析が実施できたり,配布すれば第三者が確認することもできます。
docker save 上で付けた名前 > 好きな名前.tar
tar形式で保存できたら,今度使うときは,ターミナルに以下のコマンドで読み込みます。先程の例の場合は,“docker load < cogModel190817.tar”です。
docker load < 上で付けた名前.tar
“docker ps -a”を打ち込んで,上記のコマンドにより読み込まれた内容を確認します。REPOSITORYの列でリポジトリ名を確認します。そのリポジトリ名を使って,以下のようにrunをします(パスワードやコンテナ名は好きに設定する)。
run -e PASSWORD=パスワード -p 8787:8787 -v ~:/home/rstudio -d --name コンテナ名 リポジトリ名
ファイルサイズが大きめなのが悩ましいですが,これだと時間が経っても再生可能な形式で保存・配布が可能です。
解析環境とともにコードとデータを提供する方法としては,holepunchパッケージを使って,Binder上で公開する方法があります。holepunchパッケージは,自動的に依存関係を調べた上で,Dockerファイルを生成し,Binderで使えるようにしてくれます。Binderは,github上のリポジトリを元にJupyterやRstudio serverを使えるようにしてくれるサービです。Binder上ではRstudio serverが動くので,非常に簡単に解析環境を共有できます。詳しくは,こちらの公式の説明を確認ください。
公式の解説にしたがって,holepunchをインストールした上で,以下のコードを実行すると,Binderへのリンク用バッジが出てきます。
library(holepunch)
write_compendium_description(package = "Your compendium name",
description = "Your compendium description")
write_dockerfile(maintainer = "your_name")
generate_badge() # This generates a badge for your readme.
これを,GithubのREADME.mdファイルなどに貼り付けておくと,そこからbinderで飛ぶリンクになります。例として,杣取さんと取り組んだ追試の解析用のGithubリポジトリをご確認ください。
ReproducibilityとReplicabilityの定訳はないと思います。どちらも再現可能性と訳されることもありますが,意味は違いますので,Reproducibilityを再生可能性,Replicabilityを再現可能性と分けて訳してみました。翻訳にあたり,すでに再現実験などの言葉が日本語として定着しており,再現性には追試のニュアンスがあることから,Replicabilityを再現可能性と訳しました。そして,Reproducibilityは再現という言葉を避けて,すでに得られたデータから同じ結果を繰り返すことができるかというニュアンスを含めるために,再生可能性と訳しました。これは国里が2017年からなんとなく使っている翻訳なので,正式な翻訳やもっと良い翻訳があれば修正したいと考えています。↩︎
Goodman, S. N. et al. 2016 What does research reproducibility mean? Science Translational Medicine, 8(341), 341ps12.link↩︎
私は,データに対して強迫的な傾向があるので,Rを本格的に導入する前は,すべてテキストエディタに記載していました。ただ,人間なので,どこかでエディタへのメモ記載を忘れることがあります。そうすると,また,最初からデータを処理し直したりしており,えらい無駄に時間をかけていました(データ解析版賽の河原の石積み)。こういう再生可能性への関心が高まってきて,ずいぶんと便利になってきました。↩︎
RでもPythonでも良いのですが,データ解析のみの場合は,Rの方が便利と思います。また,インターネットで調べた時に,心理学関連の解析であれば,Rの方が圧倒的に情報が多いと思います。↩︎
Epskamp, S. (2019). Reproducibility and Replicability in a Fast-Paced Methodological World. Advances in Methods and Practices in Psychological Science, 2(2), 145-155. link, preprint↩︎