Предположу, у меня есть следующий простой для петель для оценки имитационной и МНКА:Сохранение несколько результатов цикла просмотра в 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 только во внутреннем контуре).
Обычно лучше всего распараллелить * внешний * цикл, так как вы хотите, чтобы задачи, которые были отправлены рабочим, были трудоемкими по сравнению с накладными расходами на распараллеливание. Если внешний цикл имеет больше итераций, чем у вас есть процессоры, вам не нужны вложенные петли foreach. В противном случае я могу указать только на [виньетка] (http://cran.r-project.org/web/packages/foreach/vignettes/nested.pdf). Кстати, в вашем примере вам не следует использовать 'lm', но основную функцию' lsfit', которая будет намного быстрее. Кроме того, сравнение чисел с плавающей запятой, как в вашем примере, является глупым. – Roland
@Roland Спасибо за ваш комментарий. На самом деле у меня всего 4 итерации во внешнем цикле, 8 во втором цикле и около 400 во внутреннем цикле. Мне требуется около 5 часов, чтобы получить внутреннюю петлю 400, используя максимальную оценку правдоподобия в моей реальной модели. Поэтому общее время выполнения составит около 160 часов (4 * 8 * 5 = 160). Каково ваше предложение? использовать вложенные петли foreach или просто распараллелить внешний цикл? Я планирую запустить код на сервере. – Chen
@ Roland и еще одна вещь. Я не совсем понимаю ваше последнее предложение «сравнение чисел с плавающей запятой, как в вашем примере, глупо». Что такое числа с плавающей запятой? Случайные ошибки? Можете ли вы это указать? Большое спасибо. – Chen