studio - set.seed r




Razones para usar la función set.seed (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?


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.


La necesidad es el posible deseo de obtener resultados reproducibles, que pueden provenir, por ejemplo, de tratar de depurar su programa o, por supuesto, de intentar rehacer lo que hace:

Estos dos resultados "nunca" reproduciremos, ya que acabo de pedir algo "aleatorio":

R> sample(LETTERS, 5)
[1] "K" "N" "R" "Z" "G"
R> sample(LETTERS, 5)
[1] "L" "P" "J" "E" "D"

Estos dos, sin embargo, son idénticos porque establecí la semilla :

R> set.seed(42); sample(LETTERS, 5)
[1] "X" "Z" "G" "T" "O"
R> set.seed(42); sample(LETTERS, 5)
[1] "X" "Z" "G" "T" "O"
R> 

Hay una gran cantidad de literatura sobre todo eso; Wikipedia es un buen comienzo. En esencia, estos RNG se llaman Pseudo Random Number Generators porque de hecho son completamente algorítmicos : dada la misma semilla, obtienes la misma secuencia. Y esa es una característica y no un error.


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

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

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.





random