更新 (2014 年 8 月):私はこの問題の真相にたどり着くことはなく、Revolution のフォーラムで何のフィードバックも得られませんでした。ただし、この問題は、Revolution R 7.2 (R 3.0.3、これもアカデミック バージョン) で修正されたようです。lme() テストを数百回以下で実行しましたが、予想どおり、すべて同じ結果が得られました。[更新の終了]
Revolution R 7.0 (R 3.0.2) のアカデミック バージョンを新しい PC にインストールしたところ、以下のコードで奇妙な結果が得られました。コードが実行されるたびに、異なる結果が得られます。CRAN-R では、結果は常に同じです (そうあるべきだと思います)。test.data.table()
コード スニペットは、バージョン 1.8.10 のテスト 527 からのもので、エラーを指摘しました。
library(nlme)
all.equal(lme(distance ~ age, data=Orthodont), lme(distance ~ age, data=Orthodont))
以下のようなものが得られますが、毎回異なります。
> all.equal(lme(distance ~ age, data=Orthodont), lme(distance ~ age, data=Orthodont))
[1] "Component 4: Component 2: Component 1: Mean relative difference: 1.774149e-08"
[2] "Component 7: Mean relative difference: 0.0003335902"
「楽しい」ことは、nlme
パッケージ(そのlme()
一部)自体が同一であることです。念のため、アンインストールして再インストールしました(パッケージの nlme_3.1-113.zip ファイルはビットごとに同一です)。
ボンネットの下に行くにはまだ十分に知りません。ポインタやアイデアをいただければ幸いです。Revolutions のフォーラムにも投稿しましたが、ここよりもはるかに人口が少ないようです...
これは、64 ビットの Windows 8.1、64 ビットの R も同様であり、重要であれば Intel i7-4770 CPU です。Revolution R の現在のバージョン (R 3.0.2) と以前のバージョン (2.15.3) の両方で、予期しない (私にとって) 動作が発生します。CRAN-R 3.0.1 と 3.0.2 は同じ結果を生成します。
Revolution R の sessionInfo() 出力:
> sessionInfo()
R version 3.0.2 (2013-09-25)
Platform: x86_64-w64-mingw32/x64 (64-bit)
locale:
[1] LC_COLLATE=English_United States.1252
[2] LC_CTYPE=English_United States.1252
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C
[5] LC_TIME=English_United States.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] nlme_3.1-113 Revobase_7.0.0 RevoMods_7.0.0 RevoScaleR_7.0.0
[5] lattice_0.20-24 rpart_4.1-3
loaded via a namespace (and not attached):
[1] codetools_0.2-8 foreach_1.4.1 grid_3.0.2 iterators_1.0.6
[5] pkgXMLBuilder_1.0 revoIpe_1.0 tools_3.0.2 XML_3.98-1.1
更新 1: Revolution R が Intel MKL BLAS ライブラリを使用しているという事実まで、問題を追跡しました (以下の回答とコメントからのいくつかのポインタに従います)。CRAN が提供する BLAS ライブラリに切り替えると、問題は解決します。(注: 私は R を自分でコンパイルするのに十分な知識がないので、OpenBLAS やその他の代替手段をテストしていません。Revolution R では、2 つの dll の名前を変更するだけです。)
他の人もMKL で一貫性のない結果を得ているようです。違いはマシンの許容範囲内です。つまりall.equal()
、TRUEidentical()
と FALSE があります。私の場合のさまざまな結果は、意味のあるほど大きいようです。
この問題を Revolution R のフォーラムに投稿しました。応答があればここで更新します。この時点で、私の質問は「いつMKL BLASを使用し、いつCRAN-R BLASを使用するか」に変更する必要があると思います。これは速度(*)の問題ではなく、一貫した正しい結果の問題です。R の出力を既知の正しい出力と照合するための標準的なテスト スイート (ここでの用語がわからない場合) を探すために、もう少し時間を費やします。これは私が気に入っている点の 1 つでdata.table
、エンド ユーザーに表示される独自のテストがあります。すべての (またはほとんどの) パッケージを網羅する単一のテストではなく、少なくとも基本機能をカバーするものを期待するべきではないことは承知しています。
(*) 速度は具体的なワークフローに依存します。この特定のケースでは、CRAN BLAS は MKL よりも高速です (どちらもシングルスレッドで実行されます)。他の作業では、レボリューション R が大幅に高速化されているので、調べています。