문제

S-Plus에서 대규모 Monte Carlo 시뮬레이션을 실행할 때마다, 나는 그것이 완료되기를 기다리는 동안 항상 수염을 키 웁니다.

R에서 Monte Carlo 시뮬레이션을 실행하는 가장 좋은 요령은 무엇입니까? 분산 방식으로 진행되는 프로세스의 좋은 예가 있습니까?

도움이 되었습니까?

해결책

  • 만 사용하는 경우 여러 코어/머신을 사용하면 간단해야합니다. 병렬 독립 복제, 그러나 임의 번호 생성기의 일반적인 결함을 알고 있어야합니다 (예 : 현재 시간을 종자로 사용하는 경우 각각 하나의 RNG로 많은 프로세스를 산란하여 상관 관계가있는 랜덤 숫자를 생성 할 수 있습니다. 잘못된 결과 - 예를 들어보십시오 이 종이)

  • 사용하고 싶을 수도 있습니다 분산 감소 에게 필요한 복제 수를 줄입니다, 즉 필요한 샘플의 크기를 축소하려면. 보다 고급 분산 감소 기술은 많은 교과서에서 찾을 수 있습니다. 이 하나.

다른 팁

벡터를 prealloce!

> 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 
> 

라틴 하이퍼 큐브 샘플링은 쉽게 적용되며 결과에 큰 영향을 미칩니다. 기본적으로 균일 한 분포 (예 : 패키지 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