4

我打算使用 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))

ETC...

并行运行此采样过程的方法是什么?还是有另一种有效的方式来做到这一点?

附录(非常感谢“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)
       },
    )
4

3 回答 3

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
于 2012-12-21T16:36:46.680 回答
1

mclapply(builtin) 包中的函数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.preschedulemc.cores是可选的。如果每个函数调用可能需要一段时间(如您的情况),设置mc.preschedule为是​​一个好主意。FALSEFUN

于 2012-12-21T11:33:46.673 回答
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 和 Roman Luštrik!

于 2012-12-22T10:17:48.987 回答