読者です 読者をやめる 読者になる 読者になる

未完放流

終わりなど無い、有るのは試練だけだ……

Microsoft R Open は解析の再現性を気にしているらしい

Creators Update で全て壊しているのでRも消えました。 これまで通りGNU Rをインストールしても良いのですが、前回と同じことをやっても面白くないのでMicrosoft R Openをインストールしようかと思ったら、現場で問題になりがちな再現性に力を入れている事が分かりました。

Microsoft R Open とは?

知名度は今一つの気がしますが、通常のR(GNU R)と互換性があるMicrosoftが配布している実装です。 もともとはRevolution Analytics社が開発しており、Microsoftが買収して現在の名前になりました。 githubには、アカウントやレポジトリが残っていますね。

バージョンアップなどはGNU版より少し遅れます(R 3.3.3も待たされました)。

他のエディションに、Microsoft R Client, Microsoft R Server があり機能が追加されています。 Clientは個人でも入手が容易なので記事にするかもしれません。

msdn.microsoft.com

行列演算が intel MKL (Math Kernel Library)

GNU版との違いはWindows,Linux版ならintel MKL(Math Kernel Library)が使えるので行列演算の高速化*1が期待されます。

私自身は巨大行列を頻繁に使うような演算はC++で行っていますが、Rの直感的な文法で速度が出るとしたら使い勝手が良い場面も多いのではないでしょうか?

解析の再現性を重視している check point package

実際の仕事では再現性の確保がしばしば問題になります。

同じコードを処理をして少し間をあけると「前回と結果が異なる」ということが時々起こります。 動く場合はまだ良いのですが最悪止まることもあり得ます。 現在ではライブラリの依存関係が複雑で、使用している物のどれかが毎日アップデートするという状況が起きています。

gitでコード、Renvで言語のバージョン管理できるが、パッケージは……

Renv*2でプロジェクトごとに言語のバージョン管理もできます。 コードもきちんとバージョン管理システム運用してれば数か月前のものであってもすぐに再現できます。 しかしパッケージはその間にもアップデートされ変わり続け再現は困難です。

CRANはパッケージの過去バージョンをアーカイブしていますので、 sessionInfo()で使用パッケージのバージョンを全てを出力して問題が起きたら手動で再現するという方法も考えられますが 現実的ではありません。

毎日CRANの変化を把握してしまえ:checkpoint server

Revolution Analyticsが開発していたcheckpointというパッケージで大胆な方法を提案していました。

Using checkpoint for reproducible research

パッケージの構成を再現することを考えた場合、何時(YYYY年MM月DD日)からプロジェクトの開発が始まったかを起点にしています。

CRANのDaily snapshotsを保持したcheckpoint-serverと、コードに以下の2行を書き込むことでパッケージのバージョン管理を可能にしてくれます。

library(checkpoint)
checkpoint("YYYY-MM-DD", checkpointLocation=dir)

日付を基準に管理されたパッケージを提供するサーバーと、コードに日付を書き込んでおいて同期してパッケージのバージョンを再現します。

ローカルで最初に回すときはプロジェクトのコードをスキャンして使用パッケージを保持します。

他人と共有する場合も時間を基準に、サーバーから同一バージョンのパッケージが提供されるので環境の違いを減らしてくれます。

実際に使うとしたら

大がかりな方法ですが、コードだけで再現性が確保しやすくなっているので他人との共有が必要な場合には特に効果を発揮するかもしれません。

Microsoft R Open は最初からcheckpointが入っています。 現在checkpoint-serverの運用はmicrosoftが行っているようです。 ただ先日はサーバーのダウンが確認されましたので少し心配ですね。 GNU版でもcheckpoint パッケージはCRANからも落とせますし、使えると思います。

ただしMRANが管理していないものは対象外になりますので、Bioconductor野良ビルドなものを使う際などは注意が必要です。

パッケージのローカルミラーサーバーを準備できるのでしたら、そちらの方が良い気がします。