Ustawić seed przed każdym blokiem kodu lub raz na projekt?

13

Standardową wskazówką jest ustawienie losowego materiału siewnego, aby można było odtworzyć wyniki. Ponieważ jednak ziarno jest posuwane naprzód w miarę losowania liczb pseudolosowych, wyniki mogą ulec zmianie, jeśli jakikolwiek fragment kodu losuje dodatkową liczbę.

Na pierwszy rzut oka kontrola wersji wydaje się rozwiązaniem tego problemu, ponieważ przynajmniej pozwoli ci cofnąć się i odtworzyć istniejącą wersję po zapisaniu wyników w notatkach lub papierze. Ponieważ jednak potrzeba tylko jednego losowania, aby coś zepsuć, jeśli zaktualizujesz R, wyniki również mogą się zmienić.

Zdaję sobie sprawę, że jest to prawdopodobnie problematyczne tylko w rzadkich przypadkach, ale jestem ciekawy, czy istnieją tutaj najlepsze praktyki. To jest coś, z czym walczyłem w mojej własnej pracy.

Ari B. Friedman
źródło

Odpowiedzi:

8

Zależy to od tego, jak uruchomisz kod lub czy jest jakiś kod, który jest nieco stochastyczny, ponieważ losowo losuje liczby. (Przykładem tego są testy permutacji w naszym pakiecie wegańskim , gdzie kontynuujemy permutację, dopóki nie zgromadzimy wystarczającej ilości danych, aby wiedzieć, czy wynik różni się od podanego błędu typu I uwzględniającego poziom błędu typu II). Mimo to nawet to nie powinno wpływać na losowania ...

Jeśli końcowy skrypt będzie zawsze uruchamiany tylko jako zadanie wsadowe lub w całości i nie będzie losowania stochastycznego z generatora liczb pseudolosowych, można bezpiecznie ustawić ziarno na początku skryptu i uruchomić go w całości .

Jeśli chcesz przejść przez kod, być może ponownie uruchomić bloki, potrzebujesz set.seed()wywołania przed każdym wywołaniem funkcji, które będzie czerpać z generatora liczb pseudolosowych.

W moich pracach naukowych rutynowo wybieram superobronę i ustawiam nasiona przed każdą częścią kodu; umożliwia to aktualizację skryptu w późniejszym terminie, który może wymagać wstawienia do istniejącego skryptu w dowolnym momencie - powiedzmy, aby odpowiedzieć na komentarze recenzentów lub współautorów.

Mamy nadzieję, że wyniki nie będą zależeć od określonego zestawu losowo wybranych wartości pseduo, więc problemem jest możliwość odtworzenia dokładnych wartości podanych w raporcie lub dokumencie. Nawet jeśli jesteś bardzo defensywny i ustawiasz ziarno dla każdego fragmentu kodu, nadal może być konieczne odtworzenie dokładnej instalacji --- wersja R i wersje pakietu, więc rejestrowanie tych szczegółów jest niezbędne. Aby być bardziej bezpiecznym, musisz zachować poprzednie wersje R i pakiety dla konkretnych projektów / dokumentów. Rzeczywiście, wiele osób to robi.

Gavin Simpson
źródło
+1. Ostatni akapit: nie musisz zapisywać wszystkich tych śmieci i nie musisz odtwarzać całej instalacji. Jeśli jesteś pewien, jakiego RNG używasz, to zamiast akceptować wartości domyślne, wszystko, co wymaga zapisania, to (1) kod źródłowy dla tego RNG (który zwykle jest krótki) i (2) stan RNG w każdym kluczowym momencie . Dla większości Rprac ten stan można znaleźć w .Random.seed. Moją największą obawą Rjest to, że niektóre rutyny mogą to obejść - a może set.seedw niektórych przypadkach mogą całkowicie zignorować .
whuber
2
@ whuber Myślałem tam bardziej ogólnie - jeśli problemem jest odtworzenie dokładnego zestawu wyników, bardziej niż prawdopodobnie będziesz potrzebować wersji R i wersji dowolnych użytych pakietów. Do odrobiny; R 3.0.0 zmienił dokładność, z jaką zgłaszał wartości - nie była duża, ale to wystarczyło, aby zrzucić wszystkie testy sprawdzające pakiety, które zakładały zbyt dużą precyzję. Ponadto pakiety są regularnie aktualizowane i rzeczy się zmieniają.
Gavin Simpson