在大型过程中通过并行处理加快R中的k样本Anderson-Darling测试

时间:2019-05-02 10:01:41

标签: r testing parallel-processing

我正在执行一系列测试,以比较成对的多个非常大的样本(每个样本大于100万个)。

为了使计算效率更高,我将所有测试嵌套在以下类型的并行过程中:

library(foreach)
library(doParallel)

cl <- makeCluster(7) 
registerDoParallel(cl)

output<- foreach(j=1:length(regions), .combine = rbind) %dopar% {
  library(dplyr) 

旁注:由于clusterCall(请参阅this)由于我无法识别的原因而无法工作,因此每次迭代都必须调用库

  library(kSamples)
  sample1_region<-sample1 %>%
    filter(region==regions[j])
  sample1_region<-sample1_region$value

  sample2_region<-sample2 %>%
    filter(region==regions[j])
  sample2_region<-sample2_region$value

这两个样本在大约30个区域中有大约3000万个条目。 我想比较计算T检验,Kolmogorov–Smirnov检验和Anderson Darling检验的样本:

t_test<-t.test(sample2_region, sample1_region)
ks_test<-ks.test(unique(sample2_region), unique(sample1_region))
ad_test<-ad.test(unique(sample2_region), unique(sample1_region))
output_temp <- data.frame("region"=regions[j]
                           , "sample1_mean" = t_test$estimate[[2]]
                           , "sample2_mean" = t_test$estimate[[1]]
                           , "diff" = t_test$estimate[[1]]-t_test$estimate[[2]]
                           , "t.value" = sprintf("%.3f", t_test$statistic)
                           , "df"= t_test$parameter
                           , "t_p.value" = as.numeric(sprintf("%.3f", t_test$p.value))
                           , "ks_p.value" = as.numeric(sprintf("%.3f", ks_test$p.value))
                           , "ad_p.value" = as.numeric(sprintf("%.3f", ad_test$ad[1,3]))
                           , stringsAsFactors = FALSE)
   output_temp 
}
stopCluster(cl)

脚本运行得很好,但是kSamples::ad.test(我找不到其他软件包中的k-samples实例实现的此函数)要花很长时间才能运行(每次迭代> 10分钟),而其他两项测试仅需几秒钟。 有什么办法可以加快或简化此过程?

0 个答案:

没有答案