studio Razones para usar la función set.seed




set.seed r (4)

Muchas veces he visto la función set.seed en R, antes de comenzar el programa. Sé que básicamente se usa para la generación de números aleatorios. ¿Hay alguna necesidad específica de establecer esto?


básicamente la función set.seed () ayudará a reutilizar el mismo conjunto de variables aleatorias, que en el futuro podremos necesitar para volver a evaluar una tarea en particular con los mismos varibales aleatorios

solo tenemos que declararlo antes de usar cualquier función generadora de números aleatorios.


Solo agregué algunos aspectos adicionales. Necesidad de establecer una semilla: en el mundo académico, si uno afirma que su algoritmo alcanza, digamos 98.05% de rendimiento en una simulación, otros necesitan poder reproducirlo.

?set.seed

Repasando el archivo de ayuda de esta función, estos son algunos datos interesantes:

(1) set.seed () devuelve NULL, invisible

(2) "Inicialmente, no hay semilla, se crea una nueva a partir de la hora actual y la ID del proceso cuando se requiere. Por lo tanto, diferentes sesiones darán resultados de simulación diferentes, por defecto. Sin embargo, la semilla podría restaurarse desde una sesión anterior si se restaura un espacio de trabajo previamente guardado. ", esta es la razón por la que desea llamar a set.seed () con los mismos valores enteros la próxima vez que desee una misma secuencia de secuencia aleatoria.


La corrección de la semilla es esencial cuando tratamos de optimizar una función que involucra números generados al azar (por ejemplo, en la estimación basada en la simulación). En términos generales, si no arreglamos la semilla, la variación debida al dibujo de diferentes números aleatorios probablemente hará que el algoritmo de optimización falle.

Supongamos que, por alguna razón, desea estimar la desviación estándar (sd) de una distribución normal media cero por simulación, dada una muestra. Esto se puede lograr ejecutando una optimización numérica alrededor de los pasos

  1. (Estableciendo la semilla)
  2. Dado un valor para sd, genere datos distribuidos normalmente
  3. Evalúa la probabilidad de tus datos dadas las distribuciones simuladas

Las siguientes funciones hacen esto, una vez sin el paso 1., una vez que lo incluye:

# without fixing the seed
simllh <- function(sd,y,Ns){
  simdist <- density(rnorm(Ns,mean=0,sd=sd))
  llh <- sapply(y,function(x){simdist$y[which.min((x-simdist$x)^2)]})
  return(-sum(log(llh)))
}
# same function with fixed seed
simllh.fix.seed <- function(sd,y,Ns){
  set.seed(48)
  simdist <- density(rnorm(Ns,mean=0,sd=sd))
  llh <- sapply(y,function(x){simdist$y[which.min((x-simdist$x)^2)]})
  return(-sum(log(llh)))
}

Podemos verificar el rendimiento relativo de las dos funciones al descubrir el verdadero valor del parámetro con un breve estudio de Monte Carlo:

N <- 20; sd <- 2 # features of simulated data
est1 <- rep(NA,1000); est2 <- rep(NA,1000) # initialize the estimate stores
for(i in 1:1000){
  as.numeric(Sys.time())-> t; set.seed((t - floor(t)) * 1e8 -> seed) # set the seed to random seed
  y <- rnorm(N,sd=sd) # generate the data
  est1[i] <- optim(1,simllh,y=y,Ns=1000,lower=0.01)$par
  est2[i] <- optim(1,simllh.fix.seed,y=y,Ns=1000,lower=0.01)$par
}
hist(est1)
hist(est2)

Las distribuciones resultantes de las estimaciones de los parámetros son:

Cuando arreglamos la semilla, la búsqueda numérica termina cerca del verdadero valor del parámetro de 2 mucho más a menudo.


Tienes que establecer la semilla cada vez que quieras obtener un resultado aleatorio reproducible.

set.seed(1)
rnorm(4)
set.seed(1)
rnorm(4)




random