Frage

Jedes Mal, wenn ich in großem Maßstab laufen Monte- Carlo-Simulationen in S-Plus, habe ich immer einen Bart am Ende wächst, während ich warten, bis es zu vervollständigen.

Was sind die besten Tricks für die Ausführung von Monte- Carlo-Simulationen in R? Jedes gute Beispiele für Prozesse in einer verteilten Art und Weise ausgeführt wird?

War es hilfreich?

Lösung

  • mehr Kerne mit / Maschinen sollten einfach sein, wenn Sie gerade mit parallel unabhängigen Replikationen , sondern von gemeinsamen Mangel von Zufallszahlengeneratoren bewusst sein (zB wenn die aktuelle Zeit als Saatgut verwendet für jeden viele Prozesse mit einem RNG Laichen könnten Zufallszahlen korreliert erzeugen, die zu ungültige Ergebnisse führt - siehe zB dieses Papier )

  • Sie möchten vielleicht Varianzreduktion reduzieren die Anzahl der verwenden erforderlich Replikationen , dh die Größe der benötigten Probe zu schrumpfen. Fortgeschrittenere Varianzreduktionstechniken können in vielen Lehrbüchern gefunden werden, z.B. in diese .

Andere Tipps

vorbelegen Ihre Vektoren!

> 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 ist leicht anzuwenden und hat einen großen Einfluss auf die Ergebnisse. Grundsätzlich nehmen Sie eine Latin Hypercube Probe von einer gleichmäßigen Verteilung (zum Beispiel unter Verwendung von randomLHS () in dem Paket linke Skala) und verwandeln diese auf die gewünschte Verteilung unter Verwendung von zum Beispiel qnorm (uniformsample).

Ich weiß, dass dieser Thread ist wirklich alt, aber wenn jemand auf sie stolpert und sucht eine noch schnellere Methode, denke ich folgende Arbeiten:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top