Trans_作为Microsimulation基础的ABM:基于Netlogo的人口微观仿真建模

Lawson T. A Demographic Microsimulation Model Using NetLogo. Centre for Research in Economic Sociology and Innovation Working Paper Series, 2009.
摘要:动力学微观仿真模型已经成为人口变迁预测中卓有成效的模型。一些领域已有应用,如对未来的税收、养老金与医保费用的估计等,但这些模型都很复杂,建模难可能是阻碍微观仿真建模在更多领域应用的一个原因。这篇论文则使用1991年英国家庭面板调查的原始数据(British Household Panel survey, BHPS),用容易上手的Netlogo来做仿真建模。模型的有效性,是通过将仿真预测的数据(1991-2005)与BHPS记录的实际数据作比较。论文表明,Netlogo很适合作为动力学微观仿真建模的工具,其内置的对行动者集体的操作函数,及其图形化的界面,都相对地简化了动力学微观仿真建模的难度。

一、简介

(1)这篇论文首先概述了微观仿真建模(microsimulation)的历史,作为与之近似的基于行动者建模(agent based modeling)的背景。
(2)然后讨论了一下最新的(2009年)可供选择的行动者建模方法,比如用C++做,或者用基于Java的库做,或者用脚本语言如Netlogo做。
(3)再后,论文基于Netlogo讲了一下英国人口预测的实现过程,从设计、建模到检验。
(4)最后,论文评估了基于行动者建模(ABM)的工具包,作为大规模微观仿真建模(Microsimulation)的基础的潜力。

二、微观仿真建模的概述

(一)历史

动力学微观仿真肇始于1957年Guy Orcutt写的一篇论文“一种新型社会-经济系统”。正如他讲到的,在使用汇总数据(aggregated data)时,不可避免的会导致在加总过程中损失信息,特别是如人口年龄结构的分布信息。比如,不同的年龄结构可能得到相同的人口年龄均值。他给出的解决办法是,建立一个“含有各种不断输入、输出的持续互动单位(microsimulation units)”的模型。他定义输入为“任何进入、作用于,或被单位考虑的事物”;输入可以是年龄、收入或者通货膨胀率等等;输出是“任何源于,或由单位产生的事物”,如意见表达、结婚、生子和死亡等等。从输入到输出的核心是Orcutt所称的“操作特性(operating characteristics, OC)”,如方程、图或表。通常,OC以概率的方式表现,这使得,具有相同输入的相同单位可能产生不同的输出。这可以通过从概率分布中选择输出来实现。这种方法的优点是,尽管无法预测单个单位的行为,但只要正确地估计了概率,相对比例的响应结果就反映了目标群体。Orcutt由此提出了一个囊括出生、死亡、结婚与离婚的解释模型的构想,1961年,他与他的学生实现了这个模型,1976年,他发展出了一个用于模拟美国退休金财政的更复杂的模型DYNASIM2,之后,他又用更新的数据重编了转换率部分,发展了Dynasim3。
微观模拟模型的思想由此在国际上传播开来,在挪威,MOSART被发展成公共支出模型(Fredriksen 1998);在法国,DESTINIE被创建来预测养老金需求(INSEE 1999);在英国,开发了一系列模型来帮助政策制定,如PENSIM被用于养老金的预测(Hancock et al. 1992 ),CARESIM被用于医疗支出的预测(Zaidi & Rake 2001 ),乃及SAGE(Simulating Social Policy in an Ageing Society)提供了一个如何建模一个大型的动力学微观仿真模型的清晰思路(Cheesbrough & Scott 2003)。

(二)基于SAGE的微观仿真模型

SAGE由LSE与Kings College London开发于1999年。基础数据库由1991年英国人口普查的1%的匿名数据构成。这份数据囊括了216000个家庭于超500,000的个体数据。根据每年的转换概率对模拟进行更新。SAGE是模块化的设计,首先是死亡率模块,尔后是生育模块,然后是离婚模块,再后是同居和婚姻模块。
死亡率由ONS(国家统计局)根据年龄、性别与社会阶级所制作的生命表提供。
[论文之后概述了SAGE各模块的运算,生育率、离婚率、同居和结婚率、乃及更复杂的模拟劳动力市场和收入的模块。如Harding (2007: 4)认为的,这些描述在某种程度上解释了为什么构建一个质量足以支撑政府政策的微观模拟模型可能是一项耗资数百万英镑的工作,需要一个研究团队花费数年才能完成。]

(三)工具比较:SAGE、ModGen、MISTRAL

SAGE是用C++编写的,作为一种面向对象语言,C++是实现微仿真模型的好选择。但要求研究中具有较高的编程水平。
减轻软件复杂性问题的一个尝试是加拿大统计局生产的ModGen。这种通用的微观模拟语言隐藏了控制单元的底层机制。它还提供了一个可视化的界面、文档和一系列用于列表输出的工具。这使建模者从大量低级编程中解放出来,并允许他们集中精力设置参数、单位和事件。尽管如此,MODGEN作为C++的超集,需要建模人员了解这种语言的某些东西,并且“对结构化编程原理有一定的理解”。
另一种方法,是将单元保存在数据库中,并通过数据库管理系统(DBMS)访问它们。这是在UMDS(通用微型数据库系统)(Sauerbier 2002)中使用的方法。在这方面,基于Pascal精简版本的微观仿真语言MISTRAL(Micro Simulation Transformation and Analysis language)包括图形用户界面。
虽然像ModGen和UMDS这样的通用的微观仿真(generic microsimulation)工具非常少见,但是有许多通用的基于行动者建模(Agent Based Modelling )的包。论文认为,这些工具包与微观仿真建模有许多共同的特点。下一部分,论文讨论了基于行动者建模(ABM)的工具包作为微观仿真建模(microsimulation modelling )的基础的可行性。

三、基于行动者建模的概述

(一)历史

基于行动者建模(agent based modeling, ABM)的起源可以追溯到自复制机器的概念,现在被称为von Neumann机器(von Neumann 1966)。这本身是从一种通用计算机或图灵机(Turing 1937)派生出来的。
1970年代,Conway推出了“生命游戏”(Gardner 1970),这在当时的电脑爱好者中广为人知。这个游戏的基础是一个由细胞组成的网格,可以是“活的”或“死的”,用电脑屏幕上的黑色或白色来表示。在某种意义上,每个细胞都能感知环境,并根据简单的规则改变其状态。如果一个细胞死了,但它的三个相邻的细胞是活的,那么它就活了;但如果它周围有三个以上的相邻细胞存活,细胞就会因过度拥挤而死亡;如果它的周围少于两个相邻的细胞存活,细胞就会因隔离而死亡。这些细胞都有自己固定的位置。
最初一批实现移动行动者的模型中,有一个是名为Boids的鸟群行为模拟,模拟鸟类在分群规则下的行为,如转向以避免鸟群过度拥挤等。通过改变规则,研究者可以模拟一系列其他的生物,如牛群和鱼群,乃及人类行为如在社会网络中合作或在国家之间结成联盟。

由于基于行动者仿真建模之间的相似性,很明显,许多软件都可以用工具包的形式实现。这使得建模者可以集中精力指定行动者要遵循的规则。
Swarm2是第一个被广泛使用的基于行动者建模的工具包。Swarm最初由Objective C编写的,随后,基于Java的一个版本变得更好用,它使用Java的类来调用底层的Objective C程序。
自1990末以来,一系列的“Swarm clones”都是用Java编写的。其中包括Repast3、MASON4和JAS5(Java代理模拟器)。最近,可以使用脚本语言的基于行动者建模的工具包已经面世,它们利用高级语言访问Java库。Repast可以用Java或Python建模;NetLogo(Wilensky 1999)也提供了自己的脚本语言。

四、作为Microsimulation基础的ABM

(一)Microsimulation与ABM

很明显,行动者(agents)与微观仿真单位(microsimulation units)的结构很像。他们都有输入,因为它们可能受到环境特征的影响;他们都有输出,包括对其输入和其当前状态的响应。它们都具有控制输入转化为输出的操作特性(OC)。正是这些相似性,我们有必要考虑将agent based modelling toolkit作为microsimulation model的基础。
Chattoe Brown(2009)指出了微观仿真建模和基于行动者建模之间的一些重要区别,二者的差异主要集中在微观仿真建模是由定量的、数据驱动的方法,而许多基于行动者建模更加强调行为。
但论文没有详细讨论这一有趣的争论,这篇论文的重点是侧重于技术方面,如何使用基于行动者建模的工具包,来加速动力学微观仿真建模的开发。

(二)案例:JAS瑞典人口、Netlogo英国人口

目前,基于行动者建模工具包的微观仿真建模,案例如IFSIM模型(Baroni, Zamac & Oberg 2009)。这是一个用Java编写的、基于JAS框架的基于行动者建模。它对瑞典人口中发生的人口变化进行建模和预测,包括生育率、死亡率、配对和离家等模块。还有仿真劳动力市场、税收、福利和养老金制度及人力资本和教育的模块。这允许递归建模人口变化对经济的影响,以及通过生育率来反应经济变化对人口的影响。
[简述JAS的功能,与从头开始编写模拟相比,基于行动者建模的工具包(如JAS)有可能使开发过程更简单、更快。此外,没有功能损失,因为开发人员可以在必要时访问底层Java代码,但是使用这种类型的工具包仍然需要软件工程方面的高水平技能。]
从软件工程的角度来看,使用高级脚本语言的工具包的要求要少得多。NetLogo就是这样一种语言派生出来的基于行动者建模的工具,这种语言是为了让小学生学习基于行动者建模。在这里,名为“turtles”的行动者在由简单命令控制的“patches”网格上移动,如“forward 1”前进到相邻的patches,“right 5”向右5度改变方向。这似乎不太可能扩展到实现复杂的微观仿真建模。然而,NetLogo模型库中确实有许多非常复杂的模型。Railsback, Lytinen and Jackson (2006)也验证了大量模型可以在NetLogo中实现。据作者(Tony Lawson)声明,这篇论文首次尝试使用基于高级语言编写的基于行动者建模工具包来实现动态微观仿真建模。论文探索了如何建立一个英国的人口微观仿真模型。

五、基于Netlogo的实操

从DYNASIM开始,学者就希望能够对人口未来作动力学微观仿真建模,包括预测出生、死亡、婚姻和离婚等。如果NetLogo被认为是一个适合于微观仿真建模的工具,那么它至少应该证明它可以实现这些功能。

(一)设计

1、程序设计
一个人的生命史可以看作是一条通过许多状态(出生、单身、同居、结婚、离异、分居、丧偶等)的轨迹。
出生事件导致单身状态。单身后,存在两种可能性,行动者可能同居(Cohabiting),也可能结婚(Married);假设新的状态是同居,行动者可以重新回到单身状态,也可以改变为已婚状态。这一过程随着每个个体在生命阶段的移动而继续。死亡可以在行动者处于任何状态时发生,可以被认为是在生命图之外的移动。
状态之间的每个箭头都对应着要计算其转换的可能概率。为了简化程序的调试和维护,这是在一系列模块中实现的。例如,同居关系的模块将每年从人口中选择一些人或结婚或同居;死亡模块将选择从人群中移除一些行动者。在这个基本结构的基础上,增加了代表单身人士离开和返回父母家的模块。这些模块每年按顺序运行。
2、转换率的数据参考
每一个状态之间转换的发生概率取决于许多因素。确定这些因素是什么需要大量工作。幸运的是,一些现有微观仿真建模的学者已经提供了他们的发现,这些发现被用于创建这个模型。Zaidi and Rake (2001)提供了一些微观仿真建模中设计行动者如何做选择的结论。MOSART中,死亡率取决于年龄、性别、婚姻状况、教育程度和残疾程度。DYNASIM2中,婚姻取决于年龄、种族、性别和之前婚姻状况等因素。SAGE Technical Notes (Scott 2003)中也有详细说明SAGE建模的考量。这些都为本文基于Netlogo的建模提供了重要参考。

(二)数据:BHPS

具体而言,这篇论文的转换率,是通过为每个要建模的事件,构造一组logistic回归方程来计算其转换概率。此外,一些难以获得的概率则取自SAGE项目团队编制的SAGE技术说明(Scot 2003)。
一些年度的事件转换相对较少。如,BHPS中20至30岁男性每年都结婚的人数通常是个位数,为了获得足够数量的此类事件,以推导准确的转换概率,根据需要,论文使用了BHPS的纵向权重(wLRWGHT)对前15年的数据进行汇总和加权。
(1)建模第一步,构建数据文件。用于计算回归方程系数,首先创建一个数据文件,其中包含BHPS的15年样本中,每对年份的每个个体的信息。此表中的每一行都包含以下项目:第一年的婚姻状况和第二年的婚姻状况;第一年最小的孩子的年龄和第二年最小的孩子的年龄。由此,可以判断在每个特定年份是否发生了转换,因此根据个人在第一年的参数估计发生转换的概率。根据每个人参与BHPS的年数,每个人最多可以有14对年。
(2)建模第二部,事件史分析风险率。下一步是进行二项logistic回归。一些自变量被分为不同的水平,例如年龄可能被归类为“20多岁”、“30多岁”等。在少数情况下,有些在5%的置信水平下并不显著。这意味着该级别的事件概率与作为基底的事件概率大致相同。发生这种情况时,为了保持模型的一致性,没有更改级别。得到的系数在附件的一系列表格中给出,包括0、标准误差和5%显著性水平。

(三)模型参数说明

(1)死亡率的每年概率取自国家统计局2004-2006年的生命表。对于40岁以下的人来说,这是一个简单的年死亡率平均值。对于40岁以上的人,每年的死亡率拟合为指数函数。为确定行动者是否在当年底前死亡,根据生命表计算出的每年概率为:对于40岁及以下的男性,死亡率p=0.000736;40岁以上男性,p=0.00003e^0.0954。40岁及以下女性,p=0.000411;40岁以上女性p=0.00001e^0.1017。
(2)出生率模块,主要适用于15至60岁的女性。任何年份的出生率都是用三个logistic方程来计算的,这三个方程是用BHPS数据算的。从A波(1991年)到O波(2005年)的成对年(Pairs of years)被合并。得到了不同的logistic方程:一个是已婚妇女,一个是同居者,一个是单身者和其他人。它们都是根据年龄、儿童人数和最小儿童的年龄确定的;双胞胎或三胞胎的概率则使用SAGE技术说明中的数据进行建模。
此外还有:(3)离家率、(4)离婚率、(5)分居率、(6)同居率、(7)结婚率、(8)离家后返回家庭模块、(9)所有行动者返回家庭模块、(10)子女随父母转移模块。不一一赘述。

(四)仿真结果

总的来说,模型在14年仿真结束时的预测值与实际值相差在2%以内。
虽然最初的人口数据是从1991年的数据中获得的,但实际上的转换概率是1991年至2006年期间的平均数。尽管如此,模拟预测与整个时间段的实际数据平行。该模型是否可以提供未来人口趋势的可靠预测,取决于潜在的转换概率不会随着时间发生显著变化。这些概率的长期稳定性可以构成进一步研究的领域。
除此之外,该模型还有一些特性可以改进或扩展。通过计算转换概率时考虑更多因素,并用更复杂的logistic模型,可以提高预测的准确性;还可以添加其他模块,如就业和收入。

六、Tony Lawson的感想

这个仿真模型的开发占用了Tony Lawson博士项目的第一年时间。这包括综述基于行动者建模的软件,学习使用NetLogo编程,研究现有的微观仿真建模工具,及编写和测试软件。仿真模型的开发花了Lawson大约六个月的时间。一个简单的原型在一个月内完成,剩下的五个月用来编写和测试最终版本。主要任务是计算年转移概率,建立了13个logistic回归模型,由于需要在15年纵向样本中汇集对年数而变得复杂。(这也使得我本来打算模仿Lawson做一些,具体实操时想了一下比较复杂)
Lawson的论文通过使用NetLogo对英国人口仿真建模,证明了用Netlogo实现动力学微观仿真建模的可行性。虽然NetLogo在这个案例中表现良好,但这并不一定意味着它是最佳平台。但这确实提供了一种可能性,即这种多层次非线性建模技术将得到更广泛的应用,从而使我们接近Orcutt的最初设想。

------ End of this article ------

Copyright Notice 版权声明

Yuteng Yan by Yuteng Yan is licensed under a Creative Commons BY-NC-ND 4.0 International License.
闫誉腾创作并维护的Yuteng Yan博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证
本文首发于Yuteng Yan 博客(http://yanyuteng.github.io),转载请保留原文链接及作者。