每当我在S-Plus中运行大规模蒙特卡罗模拟时,我总是要等待很长时间,期间我会留起胡须。
在R中运行蒙特卡罗模拟的最佳技巧是什么?有没有好的分布式处理进程的示例?
每当我在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
>
我知道这个帖子已经很老了,但如果有人偶然发现并正在寻找一种更快的方法,我认为以下方法是可行的:
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
data.table
比@Eduardo_Leoni的循环解决方案提供了约1.8倍的加速。如果我漏掉了什么,请告诉我,因为我绝对不是基准测试的专家... - dnlbrky拉丁超立方抽样是一种易于应用且对结果产生重大影响的方法。基本上,您可以从均匀分布中获取拉丁超立方样本(例如使用lhs包中的randomLHS()函数),然后使用qnorm(uniformsample)将其转换为所需的分布。