モンテカルロシミュレーションを高速化するための最善のトリックは何ですか? [閉まっている]
-
05-07-2019 - |
質問
S-Plusで大規模なモンテカルロシミュレーションを実行するたびに、ひげが完了するのを待つ間、常にひげを伸ばします。
Rでモンテカルロシミュレーションを実行するための最良のトリックは何ですか?プロセスを分散型で実行する良い例はありますか?
他のヒント
ベクトルを事前に割り当てます!
> 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
所属していません StackOverflow