Razões para usar a function set.seed

Muitas vezes eu vi a function set.seed em R, antes de iniciar o programa. Eu sei que é basicamente usado para a geração de números randoms. Existe alguma necessidade específica para definir isso?

A necessidade é o possível desejo de resultados reproduzíveis, que podem, por exemplo, advir da tentativa de depurar seu programa ou, claro, de tentar refazer o que ele faz:

Esses dois resultados “nunca” serão reproduzidos, já que pedi algo “random”:

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

Estes dois, no entanto, são idênticos porque eu defini a semente :

 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> 

Há vasta literatura sobre tudo isso; A Wikipédia é um bom começo. Em essência, esses RNGs são chamados de Geradores de Números Pseudo-Aleatórios, porque são, na verdade, totalmente algorítmicos : dada a mesma semente, você obtém a mesma sequência. E isso é um recurso e não um bug.

Você precisa definir a semente toda vez que quiser obter um resultado random reproduzível.

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

Apenas adicionando alguns aspectos de adição. Necessidade de criar sementes: No mundo acadêmico, se alguém afirma que seu algoritmo alcança, digamos 98,05% de desempenho em uma simulação, outros precisam ser capazes de reproduzi-lo.

 ?set.seed 

Indo através do arquivo de ajuda desta function, estes são alguns fatos interessantes:

(1) set.seed () retorna NULL, invisível

(2) “Inicialmente, não há semente; um novo é criado a partir do momento atual e do ID do processo quando um é necessário. Portanto, diferentes sessões darão resultados de simulação diferentes, por padrão. No entanto, a semente pode ser restaurada de um session anterior se uma área de trabalho salva anteriormente for restaurada. “, é por isso que você deve chamar set.seed () com os mesmos valores inteiros na próxima vez que desejar uma seqüência de seqüência aleatória.

Consertar a semente é essencial quando tentamos otimizar uma function que envolve números gerados aleatoriamente (por exemplo, na estimativa baseada em simulação). Falando livremente, se não corrigirmos a semente, a variação devido ao desenho de números randoms diferentes provavelmente fará com que o algoritmo de otimização falhe.

Suponha que, por algum motivo, você queira estimar o desvio padrão (dp) de uma distribuição normal média-zero por simulação, dada uma amostra. Isso pode ser conseguido executando uma otimização numérica em torno de etapas

  1. (Definindo a semente)
  2. Dado um valor para sd, gere dados normalmente distribuídos
  3. Avalie a probabilidade de seus dados, dadas as distribuições simuladas

As seguintes funções fazem isso, uma vez sem a etapa 1., uma vez incluída:

 # 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 o desempenho relativo das duas funções ao descobrir o verdadeiro valor do parâmetro com um estudo de Monte Carlo curto:

 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) 

As distribuições resultantes das estimativas de parâmetros são:

  • Histograma de estimativas de parâmetros sem fixar a semente
  • Histograma de estimativas de parâmetros que fixam a semente

Quando corrigimos a semente, a pesquisa numérica termina perto do valor verdadeiro do parâmetro 2 com muito mais frequência.

Basicamente set.seed () function irá ajudar a reutilizar o mesmo conjunto de variables ​​aleatórias, o que podemos precisar no futuro para avaliar novamente tarefa particular novamente com o mesmo varibales randoms

nós só precisamos declará-lo antes de usar qualquer function geradora de números randoms.