Встановити насіння перед кожним кодовим блоком або один раз на проект?


13

Стандартна порада встановити випадкове насіння, щоб можна було відтворити результати. Однак, оскільки насіння просунуте по мірі виведення псевдовипадкових чисел, результати можуть змінитися, якщо будь-який фрагмент коду намалює додаткове число.

На перший погляд, контроль над версіями виглядає як вирішення цього питання, оскільки це, принаймні, дозволить вам повернутися назад і відтворити наявну версію, коли ви записували результати у своїх замітках або на папері. Однак, оскільки для зіпсування речей потрібно лише один розіграш, якщо оновити R, результати можуть змінитися.

Я розумію, що це, мабуть, проблематично лише в рідкісних випадках, але мені цікаво, чи є тут найкращі практики. Це те, з чим я боровся у власній роботі.

Відповіді:


8

Це залежить від того, як ви будете запускати код або чи є якийсь код, який є дещо стохастичним, оскільки він малює випадкові числа випадковим чином. (Прикладом цього є тести на перестановку в нашому вегетаріанському пакеті, де ми продовжуємо пермітувати лише до того моменту, поки не зібрали достатньо даних, щоб знати, чи результат відрізняється від заявленої помилки типу I, враховуючи показник помилок типу II.) Хоча навіть це не повинен впливати на нічиї ...

Якщо остаточний сценарій коли-небудь буде запускатися як пакетне завдання або в повному обсязі, і немає стохастичних малюнків у генераторі псевдовипадкових чисел, то можна сміливо встановити насіння у верхній частині сценарію та запустити його в повному обсязі. .

Якщо ви хочете перейти через код, можливо, повторно блокуючи, тоді вам потрібен set.seed()виклик перед кожним викликом функції, який буде здійснюватися з генератора псевдовипадкових чисел.

Для своїх наукових робіт я звичайно проходжу супер захисні сили і збираю насіння перед кожним шматочком коду; це дозволяє оновлювати сценарій пізніше, які, можливо, потрібно буде вставити в існуючий сценарій в будь-який момент - скажімо, щоб відповісти на коментарі рецензентів чи співавторів.

Сподіваємось, ваші результати не залежатимуть від певного набору псевдослучайних значень, тому питання може відтворити точні значення, зазначені у звіті чи статті. Незважаючи на те, що ви можете бути супер захисними і встановлювати на кожну частину коду, вам все ж може знадобитися відтворити точну установку --- R-версію та версії пакету, тому запис цих деталей є вкрай важливим. Щоб бути додатково безпечним, вам потрібно тримати попередні версії та пакети для конкретних проектів / робіт. Дійсно, багато людей це роблять.


+1. Останній абзац: вам не потрібно зберігати всі ці сміття, і вам не доведеться відтворювати всю установку. Якщо ви конкретно стосуєтесь того, який RNG ви використовуєте, то замість того, щоб приймати за замовчуванням, все, що потребує збереження, - це (1) вихідний код для цього RNG (як правило, короткий) та (2) стан RNG на кожному вирішальному етапі . Для більшості Rробіт ця держава може знайти .Random.seed. Моє найбільше занепокоєння Rполягає в тому, що деякі процедури можуть це обійти - а, можливо set.seed, в деяких випадках взагалі можуть ігнорувати .
whuber

2
@whuber Я думав, що там взагалі більше - якщо проблема буде відтворювати точний набір результатів, вам швидше за все знадобляться версія R та версії будь-яких використовуваних пакетів. Побілити; R 3.0.0 змінив точність, з якою він повідомляв значення - не головну, але цього було достатньо, щоб скинути всі багато тестів перевірки пакетів, які передбачали занадто велику точність. Також пакети регулярно оновлюються і все змінюється.
Гевін Сімпсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.