我想加快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函数可以快速加速这些代码,但我不确定如何在上述过程中使用它。
非常感谢任何帮助/方向
巴里答案 0 :(得分: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