Pergunta

Sempre que eu corro grande escala simulações de Monte Carlo no S-Plus, eu sempre acabo crescer a barba enquanto eu esperar por ele para ser concluído.

O que são os melhores truques para a execução de simulações de Monte Carlo em R? Qualquer bons exemplos de processos em execução de forma distribuída?

Foi útil?

Solução

  • Usando vários núcleos / máquinas deve ser simples se você está apenas usando repetições independentes paralelos , mas estar cientes de deficiências comuns de geradores de números aleatórios (por exemplo, se estiver usando a hora atual como semente , gerando muitos processos com um RNG para cada produto poder correlacionados números aleatórios, o que leva a resultados inválidos - ver, por exemplo neste artigo )

  • Você pode querer usar variância redução para reduzir o número de repetições requeridas , isto é, para diminuir o tamanho da amostra necessária. técnicas mais avançadas de redução de variância pode ser encontrada em muitos livros didáticos, por exemplo, em esta .

Outras dicas

preallocate seus vetores!

> nsims <- 10000
> n <- 100
> 
> system.time({
     res <- NULL
     for (i in 1:nsims) {
         res <- c(res,mean(rnorm(n)))
     }
 })
   user  system elapsed 
  0.761   0.015   0.783 
> 
> system.time({
     res <- rep(NA, nsims)
     for (i in 1:nsims) {
         res[i] <- mean(rnorm(n))
     }
 })
   user  system elapsed 
  0.485   0.001   0.488 
> 

Latin Hypercube Sampling é facilmente aplicada e tem uma grande influência sobre os resultados. Basicamente você ter uma amostra hipercubo latino de uma distribuição uniforme (por exemplo, usando randomLHS () no LHS pacote) e transformar isso para sua distribuição desejada usando, por exemplo, qnorm (uniformsample).

Eu sei que esta discussão é muito velho, mas se alguém se depara com ele e está à procura de um método mais rápido, eu acho que as seguintes obras:

library(data.table)
library(microbenchmark)

nsims <- 10000
n <- 100

# Answer from @Eduardo_Leoni:
preallocate<-function(nsims, n) {
  res <- rep(NA, nsims)
  for (i in 1:nsims) {
    res[i] <- mean(rnorm(n))
  }
  return(res)
}

# Answer using data.table:
datatable<-function(nsims,n) {
  dt <- data.table(i=1:nsims)[,list(res=mean(rnorm(1:n))),by=i]
  return(dt)
}

# Timing benchmark:
microbenchmark(preallocate(nsims,n), datatable(nsims,n), times=100)
#Unit: milliseconds
#                  expr      min       lq   median       uq      max neval
# preallocate(nsims, n) 428.4022 432.3249 434.2910 436.4806 489.2061   100
#   datatable(nsims, n) 238.9006 242.3517 244.1229 246.5998 303.6133   100
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top