我正在为统计信息的置信带实现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
。
答案 0 :(得分:0)
因为新生成的R进程是新生成的 - 即它们是默认进程。这意味着他们没有在本地加载并行包。
尝试添加clusterEvalQ(cl, library(parallel))
。
答案 1 :(得分:0)
看起来你正在尝试使用嵌套并行机制,这样做很棘手,而且通常不是必需的。为了让你的例子工作,你必须在每个工人上创建一个集群对象,但是你会有太多的工人,这可能会让你的机器陷入困境。
我建议您将“bt.var”恢复为原始顺序版本,并仅在“bt.student”中使用“parSapply”。这为您提供了10,000个大小合适的任务,这些任务应该可以正常运行并充分利用您的核心。