各コードブロックの前にシードを設定するか、プロジェクトごとに1回設定しますか?


12

結果を再現できるようにランダムなシードを設定することは標準的なアドバイスです。擬似乱数が描かれているようにシードが高度であるためただし、結果が変化する可能性が任意のコードの一部は、追加数を描きます。

一見すると、バージョン管理はこれに対する解決策であるように見えます。少なくともメモや紙に結果を書き留めたときに、戻って現在のバージョンを再現できるからです。ただし、失敗するのは1回の描画だけなので、Rを更新すると結果も変わる可能性があります。

これはおそらくまれなケースでのみ問題があると思いますが、ここにベストプラクティスがあるかどうか知りたいです。これは自分の仕事で苦労してきたことです。

回答:


8

それは、コードをどのように実行するか、またはランダムな方法で乱数を描画するという点で多少確率的であるコードがあるかどうかに依存します。(これの例は、ビーガンパッケージの順列テストです。ここでは、タイプIIエラー率を考慮して、結果が前述のタイプIエラーと異なるかどうかを知るのに十分なデータが集まるまで、順列を続けます。)ドローには影響しないはずです...

最終的なスクリプトがバッチジョブとしてのみ実行されるか、全体として実行され、疑似乱数ジェネレータからの確率的な描画がない場合は、スクリプトの上部にシードを設定して、全体を実行しても安全です。 。

コードをステップ実行する場合、おそらくブロックを再実行する場合はset.seed()、疑似乱数ジェネレータから描画する各関数呼び出しの前に呼び出しが必要です。

私の科学論文では、私は日常的に超防御的に行き、各コードチャンクの前にシードを設定します。これにより、後日、既存のスクリプトに挿入する必要がある可能性のあるスクリプトの更新が可能になります。たとえば、レビュー担当者または共同執筆者のコメントに返信するなどです。

結果が特定の一連のpseduo-random値に依存しないことが望ましいので、問題はレポートまたはペーパーに記載されている正確な値を再現することができます。非常に防御力があり、各コードチャンクにシードを設定する場合でも、正確なインストールを再作成する必要があります--- Rバージョンとパッケージバージョンなので、これらの詳細を記録することが不可欠です。安全性をさらに高めるには、特定のプロジェクト/論文のために、以前のRバージョンとパッケージを維持する必要があります。実際、多くの人がこれを行っています。


+1。最後の段落について:すべてのジャンクを保存する必要はなく、インストール全体を再作成する必要もありません。使用するRNGを具体的に指定する場合、デフォルトを受け入れるのではなく、保存が必要なのは、(1)そのRNGのソースコード(通常は短い)と(2)重要な各接続点でのRNGの状態です。 。ほとんどのR作業で、この状態はにあり.Random.seedます。私の最大の懸念Rは、一部のルーチンがこれを回避できる可能性がset.seedあることです。場合によっては、まったく無視することもできます。
whuber

2
@whuber私はそこでより一般的に考えていました-懸念が結果の正確なセットを再現している場合は、おそらくRのバージョンと使用するパッケージのバージョンが必要になるでしょう。聖霊降臨するために; R 3.0.0は、値を報告する精度を変更しました。メジャーではありませんが、あまりにも多くの精度を想定していた多くのパッケージチェックテストをすべて破棄するには十分でした。また、パッケージは定期的に更新され、状況は変化します。
モニカの復活-G.シンプソン2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.