R

Recuperación de las semillas empleadas en procesos aleatorios

Al realizar procesos en lo que se utilizan número aleatorios es una buena práctica fijar la semilla utilizada para garantizar que se puedan reproducir los resultados. En R esto se suele realizar mediante la instrucción set.seed(). Una alternativa a esta práctica puede ser guardar la semilla empleada antes de inicial el proceso y posteriormente recuperarla cuando sea necesario reproducirlo. El valor de la semilla que empleará R para la generación del siguiente número aleatorio se encuentra almacenado en la variable de entorno .Random.seed.

Planteamiento del problema

El procedimiento que se ha de utilizar para recuperar las simulaciones es bastante sencillo, antes de lanzar un proceso en el que se utilicen número aleatorios (generado por el generador de R) se carga en un variable el estado del generador de números aleatorios. En el caso de que sea necesario reproducir los resultados se puede recuperar el estado volviendo a asignar el estado guardado en la variable de entorno.

A modo de ejemplo se ruede realizar una simulación simple. Se pueden generar 100 número aleatorios, sumar su valor y repetir el proceso varias veces con diferentes semillas, esto se puede hacer con siguiente código:

total <- rep(NA, 25)
seeds <- list(NULL)

for(i in 1:25) {
 seeds <- .Random.seed
 total <- sum(sum(runif(100)))
}

En el código se generan 25 veces 10 número aleatorios que se guardan en el vector total, por otro lado, las semillas se guardan en la lista seeds. Ahora para comprobar que se pueden reproducir los resultados simplemente se ha de volver a simular con la semilla adecuada. Esto se puede comprobar con el código:

for(i in 25:1) {
 .Random.seed <- seeds[[i]]
 stopifnot(total[i] == sum(sum(runif(100))))
}

Al ejecutar estas líneas en el caso de que no se cumplan las igualdades la función stopifnot() detendría la ejecución del programa mediante una llamada a la función stop(), cosa que no sucede. Lo que sí sucede por ejemplo en el siguiente caso:

stopifnot(total[1] == sum(sum(runif(100))))

En donde se genera el siguiente error:

Error: total[1] == sum(sum(runif(100))) is not TRUE

¿Te ha parecido de utilidad el contenido?

Daniel Rodríguez

Share
Published by
Daniel Rodríguez

Recent Posts

Por qué migrar tus proyectos TypeScript a ES Modules en 2026

Durante años, CommonJS (require/module.exports) ha sido la forma por defecto de organizar módulos en Node.js,…

5 días ago

Método del codo: interpretación correcta y limitaciones

Cuando usas k-means tienes que decidir algo incómodo de entrada: cuántos grupos, , vas a…

7 días ago

Errores comunes al interpretar resultados estadísticos

La estadística no suele fallar en los cálculos: falla en la interpretación. El test está…

2 semanas ago

Dashboard CLV: cuatro modelos, un mismo dataset, conclusiones muy distintas

Los artículos anteriores de esta serie cubrieron cuatro formas de mirar el valor del cliente:…

2 semanas ago

Curiosidad: Por qué la criptografía habla siempre de Alice y Bob

Quien se acerca a la criptografía descubre enseguida a dos personajes que aparecen en casi…

3 semanas ago

Desbalanceo de Clases en Credit Scoring: Por Qué Usamos Ponderación en lugar de Undersampling

En credit scoring el desbalanceo de clases es la norma, no la excepción. En una…

3 semanas ago

This website uses cookies.