【问题标题】:Creating turtles with variables set according to probabilities?用根据概率设置的变量创建海龟?
【发布时间】:2017-05-16 18:41:25
【问题描述】:

我正在尝试用 1000 只海龟填充模型。每只乌龟都有三个变量:性别、收入、教育。我想根据一些概率来分配这些变量的值。例如。 -48% 女性,52% 男性 -33% 的机会收入低于 100000,20% 的机会收入在 100000 和 200000 之间,xx% 的机会,等等。 -20% 的机会没有受过教育,7% 的机会获得博士学位,yy 的机会获得 zz 教育等。

概率将通过 csv 文件或用户界面提供。稍后我将制定规则,这些人如何投票(基于统计数据)。但现在,我只需要创建一个具有正确价值观的群体。

我尝试在某些条件下使用“询问 n-of”,但随着变量和可能值的数量增加,它变得……复杂。

我也尝试过“rnd:weighted-n-of”和类似的方法,但我似乎无法理解它(我已经 25 年没有做过统计了):-)

有什么想法吗?

一切顺利, 帕勒

【问题讨论】:

  • 您是否阅读过 Nicolas Payettes 的回答 here? 它简要概述了如何使用您所描述的 rnd 扩展名,并且可以作为复习/澄清。
  • 谢谢。 Nicolas 的精彩解释——我发现所有其他的,我没有得到——部分原因是匿名过程的语法显然已经改变了。

标签: netlogo


【解决方案1】:

ask-n-of 是正确的方法,您不需要加权随机化。如果您知道总会有 1000 只海龟,并且您希望 48% 是雄性,那么您需要如下代码:

ask turtles [set sex "female"]
ask-n-of 480 turtles [set sex "male"]

也就是说,您必须先将它们全部设置为一个类别,然后再将一些设置为另一个类别。但是,这仅在您有两个类别时才有效,因为如果您要求 50% 为男性,然后要求 50% 为女性,则每个 ask-n-of 都是从整个人口中随机抽取的。你可能想要的是这样的:

ask turtles
[ let choose-income random-float 1
  if choose-income < 0.5 [ set income 50000 ]
  if choose-income >= 0.5 and choose-income < 0.8 [ set income 100000 ]
  if choose-income >= 0.8 [ set income 150000 ]
]

所以你正在做的是将区间从 0 到 1 分成概率等于部分长度的部分。所以上面的代码会给你 50% 的机会 50000、30% 的机会 100000 和 20% 的机会 150000。

请注意,如果我在我的模型中对此进行编码,我实际上会使用 if-elseifelse-value。但是,这需要嵌套的 if/else 块,这很难阅读。

【讨论】:

  • 非常感谢。我的问题恰恰是,每一次询问都是从整个人口中抽取的。我看你是怎么修的。您的关于 if-else 的 cmets,我想这将是为了性能。但我需要它易于新手阅读。
  • 查看 cf extension(现在与 NetLogo 捆绑在一起)作为嵌套 ifelses 的替代方案。
  • 优秀。不知道这一点,我们一直在寻找类似的东西。谢谢!
  • 我怎么错过了 cf 扩展?这是个好消息。是的,嵌套 if-else 是为了提高性能,但你的问题是关于逻辑而不是代码,所以我认为可读性更好:)
  • 没错。再次感谢:-)
猜你喜欢
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-22
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
相关资源
最近更新 更多