我正在尝试模拟确定性指数人口增长的随机模型,其中在哪里是人口规模和是率 (时间)。我假设没有承载能力。此页面(http://cnr.lwlss.net/DiscreteStochasticLogistic/)建议使用此算法模拟区间上的增长:
- 开始于具有初始人口规模
- 下次为出生事件抽奖,(是承载能力)
- 增加人口规模,
- 放
- 如果然后退出,否则转到步骤 2。
因为我没有承载能力,我假设它是无限的,所以下一个出生时间是. 那是对的吗?
当我以这种方式运行模拟时,它根本不会给出类似的结果(在哪里是初始人口规模)。即使对多次迭代进行平均,它似乎也会给出不同的增长曲线。
下面是我的代码和模拟结果。红色曲线是确定性指数增长,黑色曲线是使用指数分布模拟。他们显然不匹配。
import numpy as np
import matplotlib.pylab as plt
def sim(rate, start, end, init):
N = 200
finalsizes = []
results = []
for n in range(N):
size = init
curr_t = 0
times = [curr_t]
sizes = [init]
new_rate = rate
while curr_t <= end:
# simulate next birth time. the scale
# parameter is inversely proportional to population
# size
new_rate = 1/float(new_rate * size)
div_time = np.random.exponential(scale=new_rate)
# advance time
curr_t += div_time
if curr_t > end:
# if we exceed time interval, quit
break
times.append(curr_t)
# increase population size
size += 1
sizes.append(size)
finalsizes.append([times, sizes])
return finalsizes
# run simulation and plot results
init = 20
start = 0
end = 20
rate = 1
finalsizes = sim(rate, start, end, init)
plt.figure()
allsizes = []
for f in finalsizes:
allsizes.append(f[1][-1])
plt.plot(f[0], f[1], color="k", alpha=0.5)
times = np.arange(0, end + 1)
plt.plot(times, init*np.power(2, rate * times), color="r")
plt.xlabel("time")
plt.ylabel("size of population")
print "mean final size: ", np.mean(allsizes)
plt.show()
对 whuber 的出色回答的回应: 我不明白为什么我必须提前指定人口规模。我的模拟是要问:在给定的时间内,假设指数增长,人口规模的可变性是多少?(而不是,平均需要多长时间才能使人口规模达到,这就是 whuber 的模拟似乎正在做的事情)。
另外,我认为我“还没有做足够的模拟来欣赏他们告诉你的东西”是不正确的。我更新了我的模拟以绘制 1000 次运行。如您所见,在我的基于时间的停止条件下,结果始终低估了确定性指数增长人口规模。
我的理由是,如果我模拟运行一段时间,然后作为,我从模拟中得到的平均人口规模应该是基于确定性指数增长模型的人口规模的无偏估计, IE. 例如,如果我模拟 3 个时间步长(从单个个体开始),我预计模拟中的人口规模有时会大于 8,有时会小于 8,并且平均值会收敛到 8。这似乎是即使我从一个非常小的人口开始,只要我模拟足够的运行,这应该是正确的。这是不正确的吗?这个推理有什么问题?模拟不支持这一点,尽管我希望它是真的。看来我的推理和/或模拟中必须存在缺陷。
更新 2:固定模拟,其中指数分布的尺度参数随人口规模(与其成反比)而减小,初始人口规模为 10。它仍然严重低估了指数增长。



