我的数据框看起来与此类似:
maindata <- data.frame(cbind(num=c(79,61,62,57),
denom=c(162356,170189,164634,162006),
group=c(1,2,3,4)))
我的目的是选择每一行,执行引导程序重新采样,查找95%置信区间的分位数,并将CI输出到具有2列且与原始数据帧相同行数的数据帧。嵌套foreach和%do%的这个函数工作得很好,但是迭代次数越多(例如1000),行数越多的数据帧越慢:
boots = function(data, boots, seed=1234){
if (!missing(seed))
set.seed(seed)
pct <- NULL
ci.pct <- list()
foreach(j=1:nrow(data)) %do% {
datast1 <- c(rep(1, data[j,]$num),
rep(0, data[j,]$denom))
foreach(i=1:boots, .combine='c') %do% {
index <- sample(1:length(datast1), size=length(datast1), replace=TRUE)
sampledata <- datast1[index]
pct[i] <- mean(sampledata)
}
ci.pct[[j]] <- cbind(quantile(pct, prob=c(0.025))*100000,
quantile(pct, prob=c(0.975))*100000)
}
ci.pcts <- do.call("rbind", ci.pct)
return(ci.pcts)
}
boots(data=maindata, boots=5, seed=1234)
我一直试图用%dopar%来找到一种方法来进行并行处理但不能完全掌握它:
bootsd = function(data, boots, seed=1234){
if (!missing(seed))
set.seed(seed)
pct <- NULL
ci.pct <- list()
foreach(j=1:nrow(data)) %do% {
datast1 <- c(rep(1, data[j,]$num),
rep(0, data[j,]$denom))
foreach(i=1:boots, .combine='c') %dopar% {
index <- sample(1:length(datast1), size=length(datast1), replace=TRUE)
sampledata <- datast1[index]
pct[i] <- mean(sampledata)
}
ci.pct[[j]] <- cbind(quantile(pct, prob=c(0.025))*100000,
quantile(pct, prob=c(0.975))*100000)
}
ci.pcts <- do.call("rbind", ci.pct)
return(ci.pcts)
}
bootsd(data=maindata, boots=5, seed=1234)
有没有人建议如何通过正确实施%dopar%或其他一些巧妙的技巧来修改代码以使其运行得更快?
答案 0 :(得分:0)
我稍微重写了你的功能。我将cuda-memcheck
看作一个函数,它从循环中返回结果。现在它适用于foreach
。唯一的问题 - 它不服从种子。每次运行都会返回不同的结果。如果有必要,你可能需要查看%dopar%
包。
doRNG