runif - Razones para usar la función set.seed
sample r (5)
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
- (Estableciendo la semilla)
- Dado un valor para sd, genere datos distribuidos normalmente
- 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:
- Histograma de estimaciones de parámetros sin fijar la semilla
- Histograma de estimaciones de parámetros que fijan la semilla
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.
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.
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.