Мне нужно запустить два разных регрессионных анализа для четырех разных наборов данных (каждого), всего восемь моделей. При использовании обычной parLapply
-функции нижеприведенные результаты показывают время, затраченное на работу на ядро, модель и набор данных:
Core 1 Core 2 Core 3 Core 4
Dataset 1 Dataset 2 Dataset 3 Dataset 4
Regression model 1 31 min 48 min 2 h 26 min 3 h 16 min
Core 1 Core 2 Core 3 Core 4
Dataset 5 Dataset 6 Dataset 7 Dataset 8
Regression model 2 8 min 14 min 24 min 55 min
Как видите, подавляющее большинство времени ЦП используется регрессионная модель 1 с набором данных 4. Если бы мы могли только передавать дополнительную работу другим ядрам во время вычисления этой модели, мы могли бы сократить общее время до 3 часов 16 минут.
Обычно это требует распараллеливания задач с использованием функции mcapply, но я думаю, что нашел способ обойти это. Модель регрессии 1 и модель регрессии 2 очень похожи, как показано ниже (для аргумента данных установлено значение x для использования с parLapply):
regression_model_1<-function(x){glm(
totstatus_bin~.
-Examen
-PERC_CREDIT
-CREDITS
-NYA_REGION_GROV_FYRSTADSOMRÅDET
-lär_mell
-gymnasie_mergrov_samhälle_ekonomi
-urvalsgrupp_betyg,
data=x,family=binomial)%>%
stepAIC(trace = FALSE)}
regression_model_2<-function(x){glm(
Examen~.
-totstatus_bin
-PERC_CREDIT
-CREDITS
-NYA_REGION_GROV_FYRSTADSOMRÅDET
-lär_mell
-gymnasie_mergrov_samhälle_ekonomi
-urvalsgrupp_betyg,
data=x,family=binomial)%>%
stepAIC(trace = FALSE)}
Единственное различие между моделями - это размещение totstatus_bin и Экзамен-аргументы. Теоретически я должен иметь возможность передавать эти аргументы через clusterMap, использовать динамическую c балансировку нагрузки и заставить мой процессор работать со всеми моделями одновременно.
Я указываю следующую комбинированную модель регрессии:
reg_avhopp_examen<-function(x,dependent,skipped_independent){glm(
dependent~.
-skipped_independent
-PERC_CREDIT
-CREDITS
-NYA_REGION_GROV_FYRSTADSOMRÅDET
-gymnasie_mergrov_samhälle_ekonomi
-lär_mell
-ADMISSIONROUND_ID_HT2019
-urvalsgrupp_betyg,
data=x,family=binomial)%>%
stepAIC(trace = FALSE)}
Мы определяем наш список наборов данных:
data_examen_avhopp<-list(
"EnkelAnalysMaSv"=EnkelAnalysMaSv,
"EnkelAnalysMa"=EnkelAnalysMa,
"EnkelAnalysSv"=EnkelAnalysSv,
"EnkelAnalys"=EnkelAnalys,
"EnkelAnalysExamenCom"=EnkelAnalysExamenCom,
"EnkelAnalysExamenComMa"=EnkelAnalysExamenComMa,
"EnkelAnalysExamenComSv"=EnkelAnalysExamenComSv,
"EnkelAnalysExamenComMaSv"=EnkelAnalysExamenComMaSv)
И, наконец, мы пытаемся определить наш вызов clusterMap и экспортировать соответствующую информацию рабочим. Я немного не уверен, как именно передать вектор переменных в регрессионную модель, но я пытаюсь сделать следующее:
cl<-makeCluster(4)
clusterEvalQ(cl, library("dplyr"))
clusterEvalQ(cl, library("MASS"))
clusterExport(cl,"reg_avhopp_examen")
models_avhopp_examen<-clusterMap(cl,reg_avhopp_examen,data_examen_avhopp,dependent=list(
data_examen_avhopp$EnkelAnalysMaSv$totstatus_bin,
data_examen_avhopp$EnkelAnalysMa$totstatus_bin,
data_examen_avhopp$EnkelAnalysSv$totstatus_bin,
data_examen_avhopp$EnkelAnalys$totstatus_bin,
data_examen_avhopp$EnkelAnalysExamenCom$Examen,
data_examen_avhopp$EnkelAnalysExamenComMa$Examen,
data_examen_avhopp$EnkelAnalysExamenComSv$Examen,
data_examen_avhopp$EnkelAnalysExamenComMaSv$Examen),
skipped_independent=list(
data_examen_avhopp$EnkelAnalysMaSv$Examen,
data_examen_avhopp$EnkelAnalysMa$Examen,
data_examen_avhopp$EnkelAnalysSv$Examen,
data_examen_avhopp$EnkelAnalys$Examen,
data_examen_avhopp$EnkelAnalysExamenCom$totstatus_bin,
data_examen_avhopp$EnkelAnalysExamenComMa$totstatus_bin,
data_examen_avhopp$EnkelAnalysExamenComSv$totstatus_bin,
data_examen_avhopp$EnkelAnalysExamenComMaSv$totstatus_bin),.scheduling=c("dynamic"))
stopCluster(cl)
Идея состоит в том, что для первых четырех моделей skipped_independent звучит так: «Examen "и зависимым является" totstatus_bin ", для последних четырех моделей должно применяться противоположное.
Процессорное время для этой модели, однако, мизерное, общее время намного больше, чем у метода с parLapply:
Core 1 Core 2 Core 3 Core 4
Regression model_combined 2 h 15 min 2 h 29 min 3 h 56 min 6 h 23 min
Вдобавок вывод бессмысленный, только с двумя из пятнадцати переменных:
> summary(models_avhopp_examen$EnkelAnalys)
Call:
glm(formula = dependent ~ totstatus_bin, family = binomial, data = x)
Deviance Residuals:
Min 1Q Median 3Q Max
-2.409e-06 -2.409e-06 2.409e-06 2.409e-06 2.409e-06
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -26.57 7880.86 -0.003 0.997
totstatus_bin 53.13 10390.34 0.005 0.996
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 6.5559e+03 on 4807 degrees of freedom
Residual deviance: 2.7894e-08 on 4806 degrees of freedom
AIC: 4
Number of Fisher Scoring iterations: 25
Возможна ли моя цель (запускать регрессионные модели с разными аргументами на разных ядрах, используя clusterMap), и если да, то как мне go передать правильные аргументы регрессионного анализа в clusterMap ()?