【问题标题】:speed up a monte carlo simulation with nested loop in R在 R 中使用嵌套循环加速蒙特卡罗模拟
【发布时间】:2012-11-29 15:31:44
【问题描述】:

我想加快 DEA 估计的以下蒙特卡罗模拟

A<-nrow(banks)
effm<-matrix(nrow=A, ncol=2)
m<-20
B<-100

pb <- txtProgressBar(min = 0,
                     max = A, style=3)
for(a in 1:A) {
  x1<-x[-a,]
  y1<-y[-a,]
  theta=matrix(nrow=B,ncol=1) 

  for(i in 1:B){

    xrefm<-x1[sample(1:nrow(x1),m,replace=TRUE),]
    yrefm<-y1[sample(1:nrow(y1),m,replace=TRUE),]
    theta[i,]<-dea(matrix(x[a,],ncol=3),
                   matrix(y[a,],ncol=3),
                   RTS='vrs',ORIENTATION='graph',
                   xrefm,yrefm,FAST=TRUE)
  }

  effm[a,1]=mean(theta)
  effm[a,2]=apply(theta,2,sd)/sqrt(B)
  setTxtProgressBar(pb, a) 
}
close(pb)
effm 

一旦 A 变大,模拟就会冻结。我从在线研究中了解到,apply 函数可以快速加速此类代码,但不确定如何在上述过程中使用它。

任何帮助/指导将不胜感激

巴里

【问题讨论】:

  • 网上有很多错误信息。 apply 函数可能比 for 循环快,也可能不快;这取决于你在做什么。您需要分析代码的速度以查看哪些部分最慢(请参阅?Rprof),然后您就会知道哪些部分需要更快。如果您提供reproducible example,人们可以帮助分析您的代码。
  • @JoshuaUlrich 同上!此外,如果您可以发布您正在使用的部分数据,我们将能够实际运行您的代码,从而更容易提供帮助
  • 你能定义“冻结”吗?需要很长时间的进程与耗尽系统内存(或其他东西)并挂起进程和/或整个操作系统的进程之间存在很大差异。
  • 如果我们可以在本地运行此代码将会很有帮助。 banks 是什么?

标签: r nested-loops montecarlo


【解决方案1】:

以下应该更快....但是,如果您在 A 很大时锁定,则可能是内存问题,并且以下内容会占用更多内存。更多信息,例如 banks 是什么、x 是什么、y、您从哪里获得 dea 以及目的是什么会有所帮助。

基本上我所做的只是尽可能多地移出内部循环。越短,你的情况就会越好。

A <- nrow(banks)
effm <- matrix(nrow = A, ncol = 2)
m <- 20
B <- 100
pb <- txtProgressBar(min = 0,
                     max = A, style=3)
for(a in 1:A) {
  x1 <- x[-a,]
  y1 <- y[-a,]
  theta <- numeric(B)
  xrefm <- x1[sample(1:nrow(x1), m * B, replace=TRUE),] # get all of your samples at once
  yrefm <- y1[sample(1:nrow(y1), m * B, replace=TRUE),]
  deaX <- matrix(x[a,], ncol=3)
  deaY <- matrix(y[a,], ncol=3)

  for(i in 1:B){
    theta[i] <- dea(deaX, deaY, RTS = 'vrs', ORIENTATION = 'graph',
                   xrefm[(1:m) + (i-1) * m,], yrefm[(1:m) + (i-1) * m,], FAST=TRUE)
  }

  effm[a,1] <- mean(theta)
  effm[a,2] <- sd(theta) / sqrt(B)
  setTxtProgressBar(pb, a) 
}
close(pb)
effm 

【讨论】:

  • 如果在第二个循环之前创建dea 的前两个参数会更快。
  • 就此而言,xynrow&lt;-nrow(x1);mB&lt;-m*B 并重写为 xrefm &lt;- x1[sample(1:xynrow, mB, replace=TRUE),] 将从您的任务中删除大量计算。
  • @John 我猜 dea 来自基准测试包,但你能用 2 句话解释你执行代码的想法吗?
  • 感谢迄今为止所有有用的 cmets,并对我的帖子中的一些含糊之处表示歉意。我的代码正在运行 M 阶双曲线效率估计,其中
  • 没有 x 就很难调试... 您可以删除无法编辑的 cmets。您应该在您的问题中添加很多内容并删除 cmets。
猜你喜欢
  • 2013-01-02
  • 2020-03-26
  • 2015-02-10
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多