Я изо всех сил пытаюсь сделать мой код быстрее. В настоящее время я где-то использую doParallel, но мне интересно, можно ли сделать это быстрее, используя более умное программирование вместо более быстрого аппаратного обеспечения. Вот стилизованная версия того, что я хочу сделать:
library(dplyr)
library(doParallel)
library(data.table)
cl <- makeCluster(detectCores(all.tests=FALSE,logical=TRUE))
registerDoParallel(cl)
set.seed(12345)
crit <- 0.5
dta <- data.frame(treat = sample(1:12,1000, replace=TRUE),
dep = sample(100:200,1000, replace=TRUE),
uniqID = rep(1:100,length.out = 1000))
nr_repl <- 1000
oper <- foreach (repl = 1:nr_repl, .combine=cbind,.packages = c("data.table")) %dopar% {
dta_sim <- data.table(dta)
setDT(dta_sim)[,perm:=sample(treat),by = (uniqID)]
dta_sim$recipient <- "single"
dta_sim$recipient[dta_sim$perm == 5 |dta_sim$perm == 6 |dta_sim$perm == 7 |dta_sim$perm == 12 ] <- "couple"
return(abs(summary(lm(dep~recipient=='couple', data=dta_sim))$coefficients[2,1]) > abs(crit) )
}
mean(oper)
После полезных комментариев и предложений вот что я закончил:
library(dplyr)
library(doParallel)
library(data.table)
cl <- makeCluster(detectCores(all.tests=FALSE,logical=TRUE))
registerDoParallel(cl)
set.seed(12345)
crit <- .5
dta <- data.frame(treat = sample(1:12,1000, replace=TRUE),
dep = sample(100:200,1000, replace=TRUE),
uniqID = rep(1:100,length.out = 1000))
nr_repl <- 1000
oper <- foreach (repl = 1:nr_repl, .combine=cbind,.packages = c("data.table")) %dopar% {
dta_sim <- data.table(dta)
setDT(dta_sim)[,perm:=sample(treat),by = (uniqID)]
dta_sim$recipient <- ifelse(dta_sim$perm %in% c(5,6,7,12), "couple", "single")
return(abs(coef(lm(dep~recipient=='couple', data=dta_sim))[2]) > abs(crit) )
}
mean(oper)