Startwert vor jedem Codeblock oder einmal pro Projekt setzen?

12

Es ist Standardempfehlung, einen zufälligen Startwert festzulegen, damit die Ergebnisse reproduziert werden können. Da der Startwert jedoch beim Zeichnen von Pseudozufallszahlen vorgerückt wird, können sich die Ergebnisse ändern, wenn ein Code eine zusätzliche Zahl zeichnet.

Auf den ersten Blick scheint die Versionskontrolle eine Lösung dafür zu sein, da Sie zumindest zurückgehen und die vorhandene Version reproduzieren können, wenn Sie die Ergebnisse in Ihre Notizen oder Ihr Papier geschrieben haben. Da Sie jedoch nur eine Ziehung benötigen, um die Dinge durcheinander zu bringen, können sich auch die Ergebnisse ändern, wenn Sie R aktualisieren.

Mir ist klar, dass dies wahrscheinlich nur in seltenen Fällen problematisch ist, aber ich bin gespannt, ob es hier Best Practices gibt. Damit habe ich in meiner eigenen Arbeit zu kämpfen.

Ari B. Friedman
quelle

Antworten:

8

Es hängt davon ab, wie Sie den Code ausführen oder ob es einen Code gibt, der insofern etwas stochastisch ist, als er Zufallszahlen auf zufällige Weise zeichnet. (Ein Beispiel hierfür sind die Permutationstests in unserem veganen Paket, bei denen wir nur so lange permutieren, bis wir genügend Daten gesammelt haben, um zu wissen, ob sich ein Ergebnis von dem angegebenen Fehler vom Typ I unterscheidet, wobei eine Fehlerrate vom Typ II berücksichtigt wird.) Obwohl selbst das sollte die Auslosungen nicht beeinflussen ...

Wenn das endgültige Skript immer nur als Batch-Job oder in seiner Gesamtheit ausgeführt wird und es keine stochastischen Draws vom Pseudozufallszahlengenerator gibt, ist es sicher, einen Startwert oben im Skript zu setzen und ihn in seiner Gesamtheit auszuführen .

Wenn Sie den Code schrittweise durchlaufen und möglicherweise Blöcke erneut ausführen möchten, benötigen Sie set.seed()vor jedem Funktionsaufruf einen Aufruf, der vom Pseudozufallszahlengenerator abgerufen wird.

Für meine wissenschaftlichen Arbeiten gehe ich routinemäßig super defensiv und setze Samen vor jedem Codeblock; Dies ermöglicht Aktualisierungen des Skripts zu einem späteren Zeitpunkt, die möglicherweise jederzeit in das vorhandene Skript eingefügt werden müssen - beispielsweise um auf Kommentare von Rezensenten oder Mitautoren zu antworten.

Ihre Ergebnisse hängen hoffentlich nicht von einem bestimmten Satz von pseduo-zufälligen Werten ab, sodass das Problem in der Lage ist, die genauen Werte zu reproduzieren, die in einem Bericht oder Papier angegeben sind. Auch wenn Sie möglicherweise sehr defensiv sind und für jeden Codeblock einen Startwert festlegen, müssen Sie möglicherweise die genaue Installation neu erstellen --- R-Version und Paketversionen, sodass das Aufzeichnen dieser Details unerlässlich ist. Um besonders sicher zu sein, müssen Sie frühere R-Versionen und -Pakete für bestimmte Projekte / Papiere aufbewahren. In der Tat tun dies viele Menschen.

Stellen Sie Monica wieder her - G. Simpson
quelle
+1. Zum letzten Absatz: Sie müssen nicht den ganzen Müll speichern und nicht die gesamte Installation neu erstellen. Wenn Sie genau wissen, welches RNG Sie verwenden, müssen Sie nicht die Standardeinstellungen akzeptieren, sondern nur (1) den Quellcode für dieses RNG (der normalerweise kurz ist) und (2) den Status des RNG an jedem entscheidenden Punkt speichern . Für die meisten RArbeiten kann dieser Zustand in gefunden werden .Random.seed. Meine größte Sorge Rist, dass einige Routinen dies umgehen könnten - und set.seedin einigen Fällen möglicherweise ganz ignorieren könnten .
whuber
2
@whuber Ich habe dort allgemeiner nachgedacht - wenn das Problem darin besteht, die genauen Ergebnisse zu reproduzieren, benötigen Sie höchstwahrscheinlich die Version von R und die Versionen aller verwendeten Pakete. Zu weiß; R 3.0.0 hat die Genauigkeit geändert, mit der Werte gemeldet wurden - nicht wesentlich, aber das war genug, um alle vielen Paketprüfungstests, die von zu hoher Genauigkeit ausgehen, abzuschaffen. Außerdem werden Pakete regelmäßig aktualisiert und die Dinge ändern sich.
Stellen Sie Monica wieder her - G. Simpson