基于NetLogo的COVID-19传播主体模型再生数(R0)计算方法咨询
嘿,我刚好对NetLogo里的流行病模型R0计算很熟悉,帮你梳理两种实用方法,顺便解决你关于恢复率参数的疑问~
chance-to-recover 和 γ(恢复率) 你猜的没错!如果你的模型里chance-to-recover滑块设置的是1/平均病程,那它直接就是γ(单位时间恢复率)的数值。举个例子:如果平均病程是10个时间步,那chance-to-recover设为0.1,γ就等于0.1,对应每步有10%的概率康复,平均10步康复,完全符合γ=1/平均病程的定义。
如果你的模型用的是固定康复时间(比如有recovery-time滑块),那γ=1/recovery-time,这时候chance-to-recover可以不用,直接用这个值计算就行。
根据R0的定义,完全易感人群中单个感染者的平均二代病例数,公式就是:
R0 = β(有效接触率) / γ(恢复率)
拆解参数怎么从你的模型里提取:
- β的计算:NetLogo里的病毒模型通常用「每次接触的感染概率」×「每步平均接触数」,比如你的模型里有
infection-probability(接触后感染的概率)和contacts-per-step(每步的平均接触次数),那β = infection-probability × contacts-per-step - γ的计算:如果用
chance-to-recover滑块,γ就是这个滑块的值;如果用固定病程recovery-time,γ=1/recovery-time
Excel计算示例:
| 参数 | 数值 | 公式 |
|---|---|---|
| 接触感染概率 | 0.2 | - |
| 每步平均接触数 | 5 | - |
| β(有效接触率) | 1.0 | =A2*A3 |
| chance-to-recover(γ) | 0.1 | - |
| R0 | 10 | =A4/A5 |
分两种场景,你可以根据模型情况选:
1. 公式法(快速计算,适合均匀混合模型)
直接在模型里定义全局变量,初始化时计算R0,还能实时显示在界面上:
globals [ r0 beta gamma ] to setup clear-all reset-ticks ; 初始化种群(保留你原模型的代码) create-turtles population-size [ set color green set status "susceptible" ; 自定义状态变量:易感/感染/康复 ] ; 计算beta:替换成你模型里的参数名 set beta infection-probability * contacts-per-step ; 计算gamma:二选一,根据你的模型参数 ; 情况1:用chance-to-recover滑块 set gamma chance-to-recover ; 情况2:用固定recovery-time滑块 ; set gamma 1 / recovery-time ; 计算R0 set r0 beta / gamma ; 打印到命令行,也可以加一个监视器在界面显示r0 print (word "理论计算R0: " round r0) end
2. 模拟估算法(更准确,适合有空间/异质性的模型)
这种方法完全贴合R0的定义:初始化1个感染者,其余全易感,运行到这个感染者康复,统计期间产生的新感染数,就是R0的估算值。代码示例:
to estimate-r0 clear-all reset-ticks ; 初始化:1个初始感染者,其余全易感 create-turtles 1 [ set color red set status "infected" set who 0 ; 标记初始病例,方便后续判断 ] create-turtles (population-size - 1) [ set color green set status "susceptible" ] let new-infections 0 ; 运行直到初始感染者康复 while [ any? turtles with [ status = "infected" and who = 0 ] ] [ ; 执行你的模型感染逻辑(复制原模型的感染代码) ask turtles with [ status = "infected" ] [ ask other turtles in-radius contact-radius with [ status = "susceptible" ] [ if random-float 1 < infection-probability [ set status "infected" set color red set new-infections new-infections + 1 ] ] ; 执行你的模型恢复逻辑(复制原模型的恢复代码) if random-float 1 < chance-to-recover [ set status "recovered" set color blue ] ] tick ] print (word "模拟估算R0: " round new-infections) end
这种方法能考虑模型里的空间接触(比如in-radius)、随机波动,比纯公式更贴近你模型的实际行为。
EpiDEM Basic里的R0计算本质和公式法一致,只是参数命名可能不同。比如它可能用infectivity代表β的一部分,contact-rate代表每步接触数,recovery-rate就是γ,所以代码里会有类似set r0 (infectivity * contact-rate) / recovery-rate的逻辑。如果你还是看不懂,可以把它的参数对应到β和γ的定义上,就容易理解了。
内容的提问来源于stack exchange,提问作者Lawan

