置信带的并行Bootstrap t-procedure

时间:2014-11-16 01:56:31

标签: r parallel-processing statistics statistics-bootstrap

我正在为统计信息的置信带实现bootstrap-t过程。 这是我的代码:

 #Compute bootstrap variance
bt.var<-function(x,statistic,R=10000){
    var(replicate(R,statistic(sample(x,replace=T))))
} 

#Compute studentized bootstrap statistic
bt.one.student<-function(x, statistic.0, statistic,R=10000){
    (statistic(x)-statistic.0)/sqrt(bt.var(x,statistic,R))
}


#Compute 95% confidence bands
bt.student<-function(x,statistic,R1=10000,R2=10000){
    statistic.0<-statistic(x)
    one.boot<-function(x,statistic.0,statistic,R2){
        x.star<-sample(x,replace=T)
        theta.hat<-statistic(x.star)
        out<-bt.one.student(x.star,statistic.0,statistic,R2)
        c(theta.hat,out)
    }
    output<-replicate(R1, one.boot(x,statistic.0,statistic,R2))
    var.est<-var(output[1,])
    q<-quantile(output[2,], c(0.025, 0.975))
    c(statistic.0-sqrt(var.est)*q[2], statistic.0-sqrt(var.est)*q[1])
} 

由于我想使用bt.student()包来实现函数parallel以利用多核,我使用以下代码:

library(parallel)
cl<-makeCluster(detectCores())
bt.var<-function(x,statistic,R=10000){
          var(parSapply(cl, 1:R, function(i) statistic(sample(x,replace=T))))
}

bt.one.student<-function(x, statistic.0, statistic,R=10000){
    (statistic(x)-statistic.0)/sqrt(bt.var(x,statistic,R))
}

one.boot<-function(x,statistic.0,statistic,R2){
        x.star<-sample(x,replace=T)
        theta.hat<-statistic(x.star)
        out<-bt.one.student(x.star,statistic.0,statistic,R2)
        c(theta.hat,out)
    }

bt.student<-function(x,statistic,R1=10000,R2=10000){
    statistic.0<-statistic(x)
    output<-parSapply(cl, 1:R1, function(i) one.boot(x,statistic.0,statistic,R2) )
    var.est<-var(output[1,])
    q<-quantile(output[2,], c(0.025, 0.975))
    c(statistic.0-sqrt(var.est)*q[2], statistic.0-sqrt(var.est)*q[1])
}

clusterExport(cl, c("bt.var","bt.one.student","one.boot"))

clusterSetRNGStream(cl)

x<-rnorm(40,mean=3,sd=2)

clusterExport(cl, "x")

bt.student(x,mean,R1=150,R2=150)

我收到以下错误: Error in checkForRemoteErrors(val) : 4 nodes produced errors; first error: could not find function "parSapply"

你知道为什么我会收到这个错误吗?我必须使用parSapply,因为replicate包中没有并行等效parallel

2 个答案:

答案 0 :(得分:0)

因为新生成的R进程是新生成的 - 即它们是默认进程。这意味着他们没有在本地加载并行包。

尝试添加clusterEvalQ(cl, library(parallel))

答案 1 :(得分:0)

看起来你正在尝试使用嵌套并行机制,这样做很棘手,而且通常不是必需的。为了让你的例子工作,你必须在每个工人上创建一个集群对象,但是你会有太多的工人,这可能会让你的机器陷入困境。

我建议您将“bt.var”恢复为原始顺序版本,并仅在“bt.student”中使用“parSapply”。这为您提供了10,000个大小合适的任务,这些任务应该可以正常运行并充分利用您的核心。