2014-09-22 4 views
1

Предположу, у меня есть следующий простой для петель для оценки имитационной и МНКА:Сохранение несколько результатов цикла просмотра в R

set.seed (12345) 
m <- rnorm(20, 0, 1) 
n <- 10 
b1 <- 0.5 
b2 <- 2 
model1_b <- matrix(nrow=n, ncol=2) 
model2_b <- matrix(nrow=n, ncol=2) 
error <- matrix(nrow=20, ncol=n) 

for (a in 1:2){ 
for (b in 1:4){ 

    x <- (m+a)/b 

    for (r in 1:10){ 
    repeat { 

     e <- rnorm(20, 0, 0.5) # the error term 
     error[,r] <- e 

     # OLS estimation of Model_1 
     y=b1 + b2*x + e # the true model 1 
     Model_1 <- lm (y~x) 
     model1_b[r,]=Model_1$coef 

     # OLS estimation of Model_2 
     y=b1 + b2*(x^2) + e # the true model 2 
     Model_2 <- lm (y~x) 
     model2_b[r,]=Model_2$coef 

     if (Model_1$coef[1]!=0 & Model_2$coef[1]!=0) {break} 

    } # end of repeat{} loop 
    } # end of for(r){} loop 
    } # end of for(b){} loop 
    } # end of for(a){} loop 

    error 
    model1_b 
    model2_b 

Я хочу, чтобы преобразовать эти вложенные для петель в вложенные foreach Петли, чтобы я мог выполнять параллельные вычисления. Как вы можете видеть, данные, генерируемые в циклах, такие как ошибка, model1_b, model2_b, сохраняются один за другим в матрицах, которые я определил перед запуском цикла. Мой вопрос: как я могу сохранить эти результаты в foreach петли? независимо от того, в кадре, кадре данных или матрице.

(Примечание: моя фактическая модель намного сложнее, а первая (внешняя) и вторая петли относительно небольшая по размеру. Но третья (внутренняя) петля довольно большая. Может быть, мне не нужны вложенные петли foreach , и все в порядке, чтобы распараллелить только внутренний цикл. Действительно оцените, если вы, ребята, можете научить меня, как сохранить результаты в обеих ситуациях (используя три вложенных петли foreach и использовать foreach только во внутреннем контуре).

+2

Обычно лучше всего распараллелить * внешний * цикл, так как вы хотите, чтобы задачи, которые были отправлены рабочим, были трудоемкими по сравнению с накладными расходами на распараллеливание. Если внешний цикл имеет больше итераций, чем у вас есть процессоры, вам не нужны вложенные петли foreach. В противном случае я могу указать только на [виньетка] (http://cran.r-project.org/web/packages/foreach/vignettes/nested.pdf). Кстати, в вашем примере вам не следует использовать 'lm', но основную функцию' lsfit', которая будет намного быстрее. Кроме того, сравнение чисел с плавающей запятой, как в вашем примере, является глупым. – Roland

+0

@Roland Спасибо за ваш комментарий. На самом деле у меня всего 4 итерации во внешнем цикле, 8 во втором цикле и около 400 во внутреннем цикле. Мне требуется около 5 часов, чтобы получить внутреннюю петлю 400, используя максимальную оценку правдоподобия в моей реальной модели. Поэтому общее время выполнения составит около 160 часов (4 * 8 * 5 = 160). Каково ваше предложение? использовать вложенные петли foreach или просто распараллелить внешний цикл? Я планирую запустить код на сервере. – Chen

+0

@ Roland и еще одна вещь. Я не совсем понимаю ваше последнее предложение «сравнение чисел с плавающей запятой, как в вашем примере, глупо». Что такое числа с плавающей запятой? Случайные ошибки? Можете ли вы это указать? Большое спасибо. – Chen

ответ

0

относительно результатов в магазине (ошибка, model1_b и model2_b) в цикле Еогеасп, ответ может быть найден в Saving multiple outputs of foreach dopar loop

и% dorng% могут быть использованы вместо использования% dopar%.

Смежные вопросы