NetLogo中rngs:rnd-negbinomial实现是否输出错误结果?
负二项分布赋值结果与理论均值偏差极大
我希望使用负二项分布为turtle分配属性值,但得到的结果似乎存在异常。
在我的模型中,我需要为breed children 的breeds-own变量 time-treatment 按照负二项分布赋值,所用代码如下:
extensions [ rngs ] breed [children child] children-own [ time-treatment ] to setup clear-all rngs:init rngs:set-seed 1 500 reset-ticks end to go create-children 100 [ setxy random-xcor random-ycor set time-treatment rngs:rnd-negbinomial 1 20 0.78 ] tick end
运行后统计time-treatment的均值,结果约为70。
但根据负二项分布均值的数学公式,理论均值应为r(1-p)/p = 20*(1-0.78)/0.78 ≈ 5.641,该偏差产生的原因是什么?
解答
偏差的核心原因是你搞错了rngs:rnd-negbinomial的参数语义,套错了对应参数化形式的均值公式。rngs扩展里的rnd-negbinomial参数规则是:
- 第1位:随机数生成器ID
- 第2位
k:停止试验的失败次数阈值 - 第3位
p:单次试验的成功概率
返回值是累计达到k次失败前,总共出现的成功次数。
你用的均值公式r(1-p)/p,对应的是另一种参数化的负二项分布:统计累计r次成功前出现的失败次数,和当前函数的统计逻辑刚好把成功、失败的计数对象反过来了。
对应这个函数的正确均值公式是k*p/(1-p),代入你填的参数k=20、p=0.78,算出来理论均值是20*0.78/(1-0.78)≈70.9,和你跑出来的70左右的结果完全匹配,随机数生成本身没有问题。
要是你想得到预期的均值约5.64的分布,只要把传入的概率值换成1-0.78就行,把赋值行改成:
set time-treatment rngs:rnd-negbinomial 1 20 (1 - 0.78)
这时候传入p=0.22,算出来均值就是20*0.22/(1-0.22)≈5.64,和你预期的结果一致。
内容的提问来源于stack exchange,提问作者Nelis
相关产品推荐
相关产品推荐

