Установить начальное число перед каждым блоком кода или один раз для каждого проекта?

12

Это стандартный совет, чтобы установить случайное семя, чтобы результаты могли быть воспроизведены. Однако, поскольку начальное число продвигается, когда рисуются псевдослучайные числа, результаты могут измениться, если какой-либо фрагмент кода будет рисовать дополнительное число.

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

Я понимаю, что это, вероятно, проблематично только в редких случаях, но мне любопытно, есть ли здесь лучшие практики. Это то, с чем я боролся в своей работе.

Ари Б. Фридман
источник

Ответы:

8

Это зависит от того, как вы будете запускать код или есть какой-нибудь код, который несколько стохастичен, поскольку он рисует случайные числа случайным образом. (Примером этого являются тесты перестановки в нашем веганском пакете, где мы продолжаем перестановку только до тех пор, пока не накопим достаточно данных, чтобы узнать, отличается ли результат от заявленной ошибки Типа I с учетом частоты ошибок Типа II.) Хотя даже это не должно влиять на ничьи ...

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

Если вы хотите пошагово выполнить код, возможно, перезапустить блоки, то вам нужен set.seed()вызов перед каждым вызовом функции, который будет извлекаться из генератора псевдослучайных чисел.

Что касается моих научных работ, я обычно делаю суперзащиту и устанавливаю семена перед каждым фрагментом кода; это позволяет обновлять сценарий позднее, который, возможно, потребуется в любой момент вставить в существующий сценарий, например, чтобы ответить на комментарии рецензентов или соавторов.

Надеемся, что ваши результаты не будут зависеть от определенного набора псевдослучайных значений, поэтому проблема заключается в возможности воспроизвести точные значения, указанные в отчете или статье. Даже несмотря на то, что вы можете быть очень оборонительными и устанавливать начальное значение для каждого фрагмента кода, вам все равно может потребоваться воссоздать точную установку - версию R и версии пакета, поэтому запись этих деталей крайне важна. Для большей безопасности вам необходимо хранить предыдущие версии R и пакеты для конкретных проектов / документов. Действительно, многие люди делают это.

Гэвин Симпсон
источник
+1. Последний абзац: вам не нужно сохранять весь этот мусор, и вам не нужно заново создавать всю установку. Если вы конкретно указываете, какой ГСЧ вы используете, то вместо того, чтобы принимать значения по умолчанию, все, что нужно сохранить, это (1) исходный код этого ГСЧ (который обычно короткий) и (2) состояние ГСЧ на каждом критическом этапе , Для большинства Rработ это состояние можно найти в .Random.seed. Больше всего меня беспокоит Rто, что некоторые процедуры могут обойти это - и, возможно set.seed, в некоторых случаях могут вообще игнорировать .
uber
2
@whuber Я думал об этом более широко - если проблема заключается в воспроизведении точного набора результатов, вам, скорее всего, понадобится версия R и версии любых используемых пакетов. Ничуть; R 3.0.0 изменил точность, с которой он сообщал значения - не главное, но этого было достаточно, чтобы отбросить все многие тесты проверки пакетов, которые предполагали слишком большую точность. Кроме того, пакеты регулярно обновляются, и все меняется.
Гэвин Симпсон