【问题标题】:Trying to use a for loop for population simulation(2)尝试使用 for 循环进行人口模拟(2)
【发布时间】:2016-02-20 23:07:03
【问题描述】:

很抱歉,我又遇到了 for 循环的问题。我正在尝试将循环的人口估计中的最终数字保存到新矩阵中,但我只能让人口估计显示在第 100 行。我知道它与育种Pop2 有关,但我无法弄清楚。任何帮助将非常感激。请在下面找到代码:

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
}

【问题讨论】:

  • 您的i 正在每个for(i in 1:00) 循环中更新。在最后一个循环结束时,i 设置为 100。因此,在您的finalPop[i, 1] 分配中,您将始终使用finalPop[100, 1] &lt;- breedingPop2
  • 尽管如此,我认为您的计算存在更多基本问题,并且它没有按照您认为的那样做。我已经更新了我的解决方案以尝试突出显示这一点。

标签: r


【解决方案1】:

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

您的变量i 正在您的“内部”for() 循环中更新,因此当您到达finalPop[i, 1] &lt;- breedingPop2 时,i 始终等于100。

您需要在内部 for() 循环中使用不同的变量,例如 j。

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
}

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

其他问题

winterPop 和 summerPop 的值将永远分别为 fallPop * winterSurvival[100] 和 springPop * breedingSurvival[100]。这是你想要的吗?

【讨论】:

  • 不,这不是我想要的。根据您的评论,我现在看到我的每个 for 循环变量名称都需要不同才能在计算中获得适当的值。我对么?另外,至于我对嵌套 for 循环的使用,这就是讲师教我们为这种计算编写代码的方式。我将研究如何编写更高效的代码,但我自己学习这些东西非常困难。
  • @DonSegundo 你有你正在研究的基础数学/公式吗?从头开始可能比解构你当前的方法更容易?
  • 没有基础数学或公式。这是一个种群模拟,从 90,000 只鸟的种群规模开始,并包含在一年周期内影响种群的参数。我已经合并了迁移期间的生存参数(fallMig 和 springMig)、繁殖生存(breedingSurvival)、冬季生存(winterSurvival)和不同类别的后代生产(pfecund 和 npfecund)。我不知道这对你是否有意义。
  • 我认为至少您应该将 cmets 放入您的代码中,以显示您认为每个循环在做什么,以及它应该输出什么。然后分别测试每个循环,看看它是否工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 2019-10-02
  • 2021-03-04
  • 1970-01-01
  • 2021-02-15
  • 1970-01-01
相关资源
最近更新 更多