モンテカルロシミュレーションを高速化するための最善のトリックは何ですか? [閉まっている]

StackOverflow https://stackoverflow.com/questions/1403560

質問

S-Plusで大規模なモンテカルロシミュレーションを実行するたびに、ひげが完了するのを待つ間、常にひげを伸ばします。

Rでモンテカルロシミュレーションを実行するための最良のトリックは何ですか?プロセスを分散型で実行する良い例はありますか?

役に立ちましたか?

解決

  • 複数のコア/マシンの使用は、並列独立レプリケーションを使用している場合は簡単ですが、乱数ジェネレーターの一般的な欠陥に注意してください(例えば、現在時刻をシードとして使用する場合) 、1つのRNGで多くのプロセスを生成すると、相関する乱数が生成され、無効な結果につながる可能性があります。たとえば、このペーパー

  • 分散の削減を使用して、必要な複製、つまり必要なサンプルのサイズを縮小します。より高度な分散低減技術は、多くの教科書で見つけることができます。 これで。

他のヒント

ベクトルを事前に割り当てます!

> 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サンプリングは簡単に適用でき、結果に大きな影響を与えます。基本的に、均一分布からラテンハイパーキューブサンプルを取得し(たとえば、パッケージlhsのrandomLHS()を使用)、これをqnorm(uniformsample)を使用して目的の分布に変換します。

このスレッドは本当に古いことを知っていますが、誰かがそれに出くわしてさらに高速な方法を探しているなら、次のように動作すると思います:

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top