user5935577
user5935577

Reputation:

Trying to use a for loop for population simulation(2)

Im sorry to say that I have a problem with a for loop, again. I'm trying to save the final number from a population estimate for loop into a new matrix but I am only able to get the population estimate to show up in row 100. I know it relates to breedingPop2 but I cant figure it out. Any help would be much appreciated. Please find the code below:

finalPop=matrix(nrow=102, ncol=1)
for(i in 1:100){

SWWAyears=data.frame(iteration=rep(NA,101),pop=NA)
breedingPop<-90000
fallMig<-.825
springMig<-.825
winterSurvival<-rbeta(100,.95,.05)
npFecund<-rbinom(100, 3.0, .9)
pFecund<-rbeta(100, .85,.25)
breedingSurvival<-rbeta(100,.95,.05)

# Set initial starting condition
SWWAyears[1,2]=breedingPop
for(years in 2:101) {
  fallPop<-(SWWAyears[years-1,2]*fallMig)
  for (i in 1:100){
  winterPop<-(fallPop*winterSurvival[i])}
  springPop<-(winterPop*springMig)
        for (i in 1:100){
        summerPop<-(springPop*breedingSurvival[i])
        }
            for(i in 1:100){
            breedingPop2<-((summerPop*.26)*npFecund[i])+((summerPop*.14)*pFecund[i])+(summerPop*.60)
            }
  SWWAyears[years,1]=years
  SWWAyears[years,2]<-breedingPop2             
}
finalPop[i,1]<-breedingPop2
}

Upvotes: 1

Views: 185

Answers (1)

tospig
tospig

Reputation: 8343

I think you have more fundamental issues with your looping structure and you're not getting the correct results you're expecting. However, the reason for your specific question about only the 100th row being updated is:

Your variable i is being updated inside your 'inner' for() loops, so by the time you reach finalPop[i, 1] <- breedingPop2, i always equals 100.

You need to use a different variable, j for example, in your inner for() loops.

finalPop=matrix(nrow=102, ncol=1)

for(i in 1:100){

  SWWAyears = data.frame(iteration=rep(NA,101),pop=NA)
  breedingPop <- 90000
  fallMig <- .825
  springMig <- .825
  winterSurvival <- rbeta(100,.95,.05)
  npFecund <- rbinom(100, 3.0, .9)
  pFecund <- rbeta(100, .85,.25)
  breedingSurvival <- rbeta(100,.95,.05)

  # Set initial starting condition
  SWWAyears[1,2] = breedingPop

  for(years in 2:101) {
    fallPop <- (SWWAyears[years-1,2]*fallMig)
    for (j in 1:100){
      winterPop <- (fallPop*winterSurvival[j])
    }
    springPop <- (winterPop*springMig)
    for (j in 1:100){
      summerPop <- (springPop*breedingSurvival[j])
    }
    for(j in 1:100){
      breedingPop2 <- ((summerPop*.26)*npFecund[j])+((summerPop*.14)*pFecund[j])+(summerPop*.60)
    }
    SWWAyears[years,1] = years
    SWWAyears[years,2] <- breedingPop2
    }
  finalPop[i,1] <- breedingPop2
}

Having said that, using multiple nested for() loops is generally not recommended in R; you should be able to use matrix multiplication / vectorisation to achieve the same result.

Other Issues

your values of winterPop and summerPop will only ever be fallPop * winterSurvival[100] and springPop * breedingSurvival[100] respectively. Is this what you intended?

Upvotes: 0

Related Questions