将for循环方程中的最后一个变量存储到数组中

时间:2016-11-14 18:51:24

标签: r algorithm

我正试图计算虚构蜥蜴种群数量的灭绝概率。为此,我在30年的时间内运行100次模拟的for循环,并看到每次模拟灭绝的可能性。在我的100次模拟结束时,我需要绘制一个直方图,描绘30年间隔结束时的最终人口规模。我认为绘制直方图的最简单方法是创建一个不同的向量,并将每个模拟的最终种群大小存储到此向量中(pop)。但是,我不知道如何为此编码,并且没有在线找到我的困境答案。

我使用以下代码:

tmax <- 31
runmax <- 100
Year <- 0:(tmax-1)
N <- numeric(tmax) %vector for the population size
N <- N + 1
epsilon <- numeric(tmax) 
rmax <- 0.87992 %maximum growth rate (a value previously calculated)
K <- 34.64252 %carrying capacity (a value previously calculated)
N[1] <- K
extinct <- 0

for(t in 2:tmax){
    sdr <- 0.9469428
    epsilon[t-1] <- rnorm(1,0,sdr) %this takes into account the random population stochasticity (random chance a population will go extinct)
    N[t] <- exp(rmax*(1-(N[t-1]/K))+epsilon[t-1])*N[t-1]
    if(N[t] < 1.0) {
        N[t] <- 0.0;break
    }
    pop=numeric(runmax)
    pop[1]=N[30]
}

extinct <- extinct + ifelse(N[tmax]<=1,1,0)

plot(Year,N,type='l',ylim=c(0,200))

for(i in 1:runmax){
    N <- numeric(tmax)
    N <- N+1
    N[1] <- K
    for(t in 2:tmax){
        sdr <- 0.9469428
        epsilon[t-1] <- rnorm(1,0,sdr) 
        N[t] <- exp(rmax*(1-(N[t-1]/K))+epsilon[t-1])*N[t-1]
        if(N[t] < 1.0) {
            N[t] <- 0.0
            break
        }
    for(w in 2:runmax){
        pop[w]<- N[30]
    }
}

extinct <- extinct + ifelse(N[tmax]<=1,1,0)
lines(Year,N,col=i)
}

因此,在上面的代码中,pop是我将人口存储在N[30]的向量。然后想法使用hist(pop)绘制直方图。

提前致谢!

1 个答案:

答案 0 :(得分:1)

你可以用这样的矩阵得到结果:

pop=matrix(rep(0,runmax*tmax),ncol=tmax)
for(i in 1:runmax){
  N <- numeric(tmax)
  N <- N+1 # this can be removed
  N[1] <- K
  for(t in 2:tmax){
    sdr <- 0.9469428 # this could be placed outside the loops
    epsilon[t-1] <- rnorm(1,0,sdr)
    N[t] <- exp(rmax*(1-(N[t-1]/K))+epsilon[t-1])*N[t-1]
    if(N[t] < 1.0) {N[t] <- 0.0}
    pop[i,t]=N[t]
    if(N[t] ==0) {break}
  }

  extinct <- extinct + ifelse(N[tmax]<=1,1,0)
  lines(Year,N,col=i)
}
hist(pop[,tmax])  #simulation results for tmax