我正在执行一系列测试,以比较成对的多个非常大的样本(每个样本大于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分钟),而其他两项测试仅需几秒钟。
有什么办法可以加快或简化此过程?