параллельные вычисления в R, реализация начальной загрузки

В настоящее время я пытаюсь вычислить оценки модели с помощью начальной загрузки BLB и хотел бы сделать это параллельно. мой код отлично работает, когда я не делаю его параллельно. проблема, когда я выполняю параллельные вычисления, заключается в том, что результаты, которые я получаю от каждого ядра, содержат значения NA. Я не понимаю, как я получаю значения NA, если значения набора данных Iris вообще не содержат NA. вот код, который я использую:

library(doParallel)
library(itertools)

 num_of_cores <- detectCores()
 cl <- makePSOCKcluster(num_of_cores)
 registerDoParallel(cl)

 attach(iris)
 data <- iris
 coeftmp <- data.frame()
 system.time(
 r <- foreach(dat = isplitRows(data, chunks=num_of_cores),
             .combine = cbind) %dopar% {

                 BLBsize = round(nrow(dat)^0.6)
                 for (i in 1:400){
                         set.seed(i)

                         # sampling B(n) data points from the original data set without replacement
                         sample_BOFN <- dat[sample(nrow(dat), size = BLBsize, replace = FALSE), ]

                          # sampling from the subsample with replacment
                         sample_bootstrap <- sample_BOFN[sample(nrow(sample_BOFN), size = nrow(sample_BOFN), replace = TRUE), ]

                         bootstrapModel <- glm(sample_bootstrap$Petal.Width ~ Petal.Length + Sepal.Length + Sepal.Width, data = sample_bootstrap)
                         coeftmp <- rbind(coeftmp, bootstrapModel$coefficients)

                 }
                 #calculating the estimators of the model with mean
                  colMeans(coeftmp)

         })

person navri    schedule 14.11.2015    source источник
comment
Поскольку я не знаю, сколько у вас ядер, я не уверен, решит ли этот вопрос вашу проблему. Но может: stackoverflow.com/questions/33221779   -  person Alex W    schedule 14.11.2015
comment
Кроме того, мне непонятно, почему вы используете образец без замены для sample_BOFN, если вы выполняете загрузку. Но также не похоже, что вы используете sample_BOFN, поэтому вы можете удалить это из (примера) кода.   -  person Alex W    schedule 14.11.2015
comment
Я пытаюсь реализовать загрузку BLB, которая требует выборки из подвыборок без замены. так вот почему.   -  person navri    schedule 15.11.2015
comment
на самом деле ссылка на эту ссылку не помогла, потому что у меня 4 ядра, и я разбиваю свой набор данных с помощью итератора на 4 части. Я хотел бы обучить модель на каждом ядре с помощью бутстрапа BLB. Я не понимаю, как это возможно, что я получаю ценности NA? (Я запускаю код на MAC, кстати)   -  person navri    schedule 15.11.2015
comment
Получаете ли вы NAs, если используете только 1 ядро?   -  person Alex W    schedule 15.11.2015
comment
нет, я получаю NA при использовании всех 4 ядер.   -  person navri    schedule 16.11.2015


Ответы (1)


Я думаю, вам придется пройти несколько итераций отладчика, чтобы решить эту проблему. Но вы получаете NAs из этой строки

bootstrapModel <- glm(sample_bootstrap$Petal.Width ~ Petal.Length + Sepal.Length + Sepal.Width, data = sample_bootstrap)

Я предполагаю, что вы получаете сингулярность от одного из ваших sample_bootstrap, поскольку сингулярность даст вам коэффициент NA. Но возможно, что что-то еще вызывает эту ошибку, хотя это определенно из этой строки кода ... вам нужно выполнить отладчик, чтобы изолировать ее.

... т.е. это не полный ответ. Но это должно позволить вам решить вашу собственную проблему:

Вы можете убедиться в этом, исследуя:

r2 <- foreach(dat = isplitRows(data, chunks=1)) %dopar% {

     BLBsize = round(nrow(dat)^0.6)
     for (i in 1:400){
       set.seed(i)

       # sampling B(n) data points from the original data set without replacement
       sample_BOFN <- dat[sample(nrow(dat), size = BLBsize, replace = FALSE), ]

       # sampling from the subsample with replacment
       sample_bootstrap <- sample_BOFN[sample(nrow(sample_BOFN), size = nrow(sample_BOFN), replace = TRUE), ]

       bootstrapModel <- glm(sample_bootstrap$Petal.Width ~ Petal.Length + Sepal.Length + Sepal.Width, data = sample_bootstrap)
       coeftmp <- rbind(coeftmp, bootstrapModel$coefficients)

     }
     #calculating the estimators of the model with mean
     # return a list, not just the colMeans -- for debugging purposes
     return(list(coeftmp= coeftmp, result= colMeans(coeftmp)))

   }

   sum(is.na(r2[[1]][[1]])) # no missing coefficients with 1 core

r <- foreach(dat = isplitRows(data, chunks=num_of_cores)) %dopar% {

     BLBsize = round(nrow(dat)^0.6)
     for (i in 1:400){
       set.seed(i)

       # sampling B(n) data points from the original data set without replacement
       sample_BOFN <- dat[sample(nrow(dat), size = BLBsize, replace = FALSE), ]

       # sampling from the subsample with replacment
       sample_bootstrap <- sample_BOFN[sample(nrow(sample_BOFN), size = nrow(sample_BOFN), replace = TRUE), ]

       bootstrapModel <- glm(sample_bootstrap$Petal.Width ~ Petal.Length + Sepal.Length + Sepal.Width, data = sample_bootstrap)
       coeftmp <- rbind(coeftmp, bootstrapModel$coefficients)

     }
     #calculating the estimators of the model with mean
     # return a list, not just the colMeans -- for debugging purposes
     return(list(coeftmp= coeftmp, result= colMeans(coeftmp)))

   }

 # lots of missing values in your coeftmp results.
 lapply(r, function(l) {sum(is.na(l[[1]]))}) 
person Alex W    schedule 16.11.2015