2016-02-11 1 views
0

Я пытаюсь написать простую модель популяции с использованием вложенных циклов. Я хочу спрогнозировать население 10yrs, и я хочу запустить эту проекцию 100 раз. Мне нужен вывод каждого временного шага и включающий счетчик, поэтому я знаю, в каком году итерации соответствуют результаты. У меня есть пример, использующий этот код, но мне было интересно, есть ли:Улучшение вложенных циклов

1) Было более элегантное решение, чем использование строк < -rows + 1 для сброса и продвижения счетчика каждый раз?

2) Существует более элегантное решение, чем для циклов, чтобы выполнить это?

library(VGAM) 
popdata<-matrix(nrow=1000,ncol=3) 
dimnames(popdata)[[2]]<-c('iteration','year','popsize') 
rows<-1 
for (iteration in 1:100){ 
    pop<-50 

    for(year in 1:10){ 
     popdata[rows,1]<-iteration 
     popdata[rows,2]<-year 

     pop<-rbetabinom(1,pop,0.6) 

     popdata[rows,3]<-pop 
     rows<-rows+1 
    } 
} 
+0

извините, исправлено. У вас есть полезное решение? – tlyons253

ответ

1

Вы можете заменить счетчик строк на (iteration - 1) * 10 + year. Вы также можете очистить работу, выполняемую в цикле, назначив данные итерации и года вне, как вы знаете заранее, какими будут эти результаты.

Это дает что-то вроде

popdata<-matrix(nrow=1000,ncol=3) 
dimnames(popdata)[[2]]<-c('iteration','year','popsize') 

# Do the deterministic stuff first 
popdata[, 1] <- rep(1:100, each = 10) 
popdata[, 2] <- rep(1:10, times = 100) 

for (iteration in 1:100){ 
    pop<-50 

    for(year in 1:10){ 
     rows <- (iteration - 1) * 10 + yea 
     pop<-rbetabinom(1,pop,0.6) 
     popdata[rows,3]<-pop 
    } 
} 

Поскольку pop зависит от предыдущего pop он менее упростить внутренний цикл полностью. Я думаю, что подход должен был бы генерировать все ваши биномиальные результаты как длинный вектор из 1 и 0. Затем в каждом цикле вы должны подмножить следующие элементы pop этого вектора. В конце концов, я не думаю, что на самом деле было бы более аккуратным или более читаемым.

+0

Спасибо за предложение! – tlyons253