我打算使用R中的“clhs”软件包从群体中提取代表性样本(a,b,c,d,...见下文)。我的(多核)计算机上的采样过程需要很长时间,所以我想并行运行采样程序(同时使用多个CPU内核)。
这些是我想要绘制样本的一些(示例)数据框(“种群”):
a <- as.data.frame(replicate(1000, rnorm(20)))
b <- as.data.frame(replicate(1000, rnorm(20)))
c <- as.data.frame(replicate(1000, rnorm(20)))
d <- as.data.frame(replicate(1000, rnorm(20)))
我要运行的clhs代码是:
clh_a <- clhs(x=a, size=round(nrow(a)/5), iter=2000, simple=F)) # 20% of all samples should be selected
clh_b <- clhs(x=b, size=round(nrow(b)/5), iter=2000, simple=F))
等...
并行运行此采样过程的方法是什么?或者是否有另一种方式以有效的方式做到这一点?
附录(非常感谢“zipfzapf”):
我试图使用“parLapply” - 不幸的是,最后,R正在抛出一条错误消息:“长度错误(x):'x'缺失”,我真的不明白..任何想法?
我的代码:
library("snow")
a <- as.data.frame(replicate(1000, rnorm(20)))
b <- as.data.frame(replicate(1000, rnorm(20)))
c <- as.data.frame(replicate(1000, rnorm(20)))
d <- as.data.frame(replicate(1000, rnorm(20)))
abcd <- list(a, b, c, d)
cl <- makeCluster(4)
results <- parLapply(cl,
X = abcd,
FUN = function(i) {
clhs(x = i, size = round(nrow(i) / 5), iter = 2000, simple = FALSE)
},
)
答案 0 :(得分:3)
这对我有用(注意我改变了迭代次数,以便以合理的速度移动)。
library(snowfall)
sfInit(parallel = TRUE, cpus = 4, type = "SOCK")
sfLibrary(clhs)
x <- sfLapply(abcd, fun = function(x) {
clhs(x = x, size=round(nrow(x)/5), iter = 200, simple =FALSE)
})
Length Class Mode
[1,] 5 cLHS_result list
[2,] 5 cLHS_result list
[3,] 5 cLHS_result list
[4,] 5 cLHS_result list
答案 1 :(得分:1)
(内置)包mclapply
中的函数parallel
是lapply
的多核版本:
library(parallel)
# population samples
abcd <- list(a, b, c, d)
# multi-core version of 'lapply(abcd, [....])'
results <- parallel::mclapply(
X = abcd,
FUN = function(elem) {
clhs(x = elem, size = round(nrow(elem) / 5), iter = 2000, simple = FALSE))
},
mc.preschedule = FALSE,
mc.cores = 4L
)
这将为您提供一个列表,其中每个元素都包含相应clhs
调用的结果。
请注意,参数mc.preschedule
和mc.cores
是可选的。如果mc.preschedule
的每个函数调用可能需要一段时间(如您的情况),则将FALSE
设置为FUN
是个好主意。
答案 2 :(得分:0)
使用“snow”的解决方案 - 只需添加“clusterEvalQ(cl,library(clhs))”就可以了:
a <- as.data.frame(replicate(1000, rnorm(20)))
b <- as.data.frame(replicate(1000, rnorm(20)))
c <- as.data.frame(replicate(1000, rnorm(20)))
d <- as.data.frame(replicate(1000, rnorm(20)))
abcd <- list(a, b, c, d)
library("snow")
cl <- makeCluster(4)
clusterEvalQ(cl, library(clhs))
results <- parLapply(cl, abcd, fun = function(elem) {
clhs(x = elem, size = round(nrow(elem) / 2), iter = 50)
})
stopCluster(cl)
非常感谢zipfzapf&amp; RomanLuštrik!