尝试使用for循环进行种群模拟(2)

时间:2016-02-20 23:07:03

标签: r

我很遗憾地说我再次遇到for循环问题。我试图将最终数量从循环的人口估计值保存到新的矩阵中,但我只能在第100行显示总体估计值。我知道它与育种波2有关但我无法弄清楚。任何帮助将非常感激。请找到以下代码:

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
}

1 个答案:

答案 0 :(得分:0)

我认为您的循环结构存在更多基本问题,并且您无法获得您期望的正确结果。但是,关于仅更新第100行的具体问题的原因是:

您的变量i正在您的内部&#39;内部进行更新。 for()循环,所以当您到达finalPop[i, 1] <- breedingPop2时,i始终等于100

您需要在内部j循环中使用其他变量for()

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
}

话虽如此,for()通常不推荐使用多个嵌套R循环;你应该能够使用矩阵乘法/矢量化来获得相同的结果。

其他问题

winterPopsummerPop的值分别只有fallPop * winterSurvival[100]springPop * breedingSurvival[100]。这是你的意图吗?