¿Establecer semilla antes de cada bloque de código o una vez por proyecto?

12

Es un consejo estándar establecer una semilla aleatoria para que los resultados puedan reproducirse. Sin embargo, dado que la semilla se avanza a medida que se dibujan números pseudoaleatorios, los resultados podrían cambiar si cualquier código extrae un número adicional.

A primera vista, el control de versiones parece ser una solución para esto, ya que al menos le permitiría regresar y reproducir la versión existente cuando anotó los resultados en sus notas o papel. Sin embargo, dado que solo se necesita un sorteo para desordenar las cosas, si actualiza R, los resultados también podrían cambiar.

Me doy cuenta de que esto probablemente solo sea problemático en casos raros, pero tengo curiosidad por saber si hay mejores prácticas aquí. Esto es algo con lo que he estado luchando en mi propio trabajo.

Ari B. Friedman
fuente

Respuestas:

8

Depende de cómo ejecutará el código o si hay algún código que sea algo estocástico, ya que dibuja números aleatorios de manera aleatoria. (Un ejemplo de esto son las pruebas de permutación en nuestro paquete vegano en las que solo continuamos permutando hasta que hayamos acumulado suficientes datos para saber si un resultado es diferente del error de Tipo I establecido teniendo en cuenta una tasa de error de Tipo II). Aunque incluso eso no debería afectar los sorteos ...

Si el script final solo se ejecutará como un trabajo por lotes o en su totalidad y no hay dibujos estocásticos del generador de números pseudoaleatorios, entonces es seguro establecer una semilla en la parte superior del script y ejecutarlo en su totalidad .

Si desea recorrer el código, quizás volver a ejecutar bloques, entonces necesita una set.seed()llamada antes de cada llamada de función que se extraerá del generador de números pseudoaleatorios.

Para mis trabajos científicos, rutinariamente me pongo súper defensivo y establezco semillas antes de cada fragmento de código; esto permite actualizaciones en el script en una fecha posterior que podría necesitar insertarse en el script existente en cualquier momento, por ejemplo, para responder a los comentarios de los revisores o coautores.

Con suerte, sus resultados no dependerán de un conjunto particular de valores pseduo-aleatorios, por lo que el problema es poder reproducir los valores exactos establecidos en un informe o documento. Aunque puede ser súper defensivo y establecer una semilla en cada fragmento de código, es posible que deba volver a crear la instalación exacta: la versión R y las versiones del paquete, por lo que es esencial registrar esos detalles. Para estar más seguro, necesitará mantener versiones y paquetes de R anteriores para proyectos / documentos específicos. De hecho, muchas personas hacen esto.

Gavin Simpson
fuente
+1. Re el último párrafo: no tiene que guardar toda esa basura y no tiene que recrear una instalación completa. Si es específico acerca de qué RNG usa, en lugar de aceptar los valores predeterminados, todo lo que necesita guardar es (1) el código fuente de ese RNG (que generalmente es corto) y (2) el estado del RNG en cada coyuntura crucial . Para la mayoría del Rtrabajo, este estado se puede encontrar en .Random.seed. Mi mayor preocupación Res que algunas rutinas podrían eludir esto, y tal vez podrían ignorar por set.seedcompleto en algunos casos.
whuber
2
@whuber Estaba pensando de manera más general allí: si la preocupación es reproducir el conjunto exacto de resultados, lo más probable es que necesites la versión de R y las versiones de cualquier paquete utilizado. A pizca R 3.0.0 cambió la precisión con la que informaba los valores, no mayor, pero eso fue suficiente para descartar todas las pruebas de verificación de paquetes que suponían demasiada precisión. Además, los paquetes se actualizan regularmente y las cosas cambian.
Gavin Simpson,