加速rnorm进行循环

时间:2013-11-23 12:19:07

标签: r performance montecarlo random-sample

我正在尝试基于蒙特卡罗方法编写估算不确定性预算的函数。在这里,我将仅报告我需要加速的代码片段。

inout<-function(var1,svar1,var2,svar2){
          M<-10^6

          var1m<-matrix(nrow=length(var1),ncol=M)
          var2m<-matrix(nrow=length(var2),ncol=M)

          j<-1
          for (j in 1:length(var1)) {
            var1m[j,]<-var1[j]+rnorm(M,0,svar1[j])
            var2m[j,]<-var2[j]+rnorm(M,0,svar2[j])
          }
          var1a<-apply(var1m,1,mean)
          var2a<-apply(var2m,1,mean)
          return(list(a=round(var1a,digits=1),b=round(var2a,digits=1)))
        }

 fake1<-cbind(rnorm(200,10,1),rnorm(200,1,0.1),rnorm(200,15,2),rnorm(200,2,0.1))
 fake2<-cbind(rnorm(200,5,1),rnorm(200,2,0.1),rnorm(200,150,2),rnorm(200,4,0.1))
 inout(var1=fake[,1],svar1=fake[,2],var2=fake[,3],svar2=fake[,4])

出于我的目的,j与其var1词语相关联的每个rnorm(M,0,svar1[j])元素非常重要。
谢谢。

AB

1 个答案:

答案 0 :(得分:2)

这应该做同样的事情:

inout2<-function(var1,svar1,var2,svar2, M){
  var1m <- matrix(rnorm(M*length(var1), mean=0, sd=rep(svar1, each=M)), 
                  ncol=length(var1))
  var2m <- matrix(rnorm(M*length(var2), mean=0, sd=rep(svar2, each=M)), 
                  ncol=length(var2))

  var1a <- colMeans(var1m) + var1
  var2a <- colMeans(var2m) + var2

  return(list(a=round(var1a,digits=1),b=round(var2a,digits=1)))
}

您是否知道(由于四舍五入),如果svar1足够大,结果通常会独立于svar2M