原创:hxj7
本文用RVirusBroadcast展示模拟的疫情数据
本文篇幅较长,分为以下几个部分:
-
前言
-
效果展示
-
小结
-
附录:RVirusBroadcast代码
前言
前几天微博的一个热搜主题是**“计算机仿真程序告诉你为什么现在还没到出门的时候!!!”**,该视频用模拟的疫情数据告诉大家“不要随便出门(宅在家)”对战胜疫情很重要,生动形象,广受好评。
所用的程序叫VirusBroadcast,源码已经公开,是用Java写的。鉴于画图是R语言的优势,所以笔者在读过源码后,写了一个VirusBroadcast程序的R语言版本,暂且叫做RVirusBroadcast。与VirusBroadcast相比,RVirusBroadcast所用的模型和逻辑大体不变,只是在少许细节上做了修改。
(为了防止上面的超链接被过滤掉而打不开,文末也放上了明文链接)
效果展示
下面两段视频是RVirusBroadcast用模拟的数据展示的效果,由于笔者的电脑性能实在一般,所以暂时只模拟了30天的数据。请再次注意下面两段视频的数据是模拟生成的,纯属虚构,不具有现实意义,仅供电脑模拟实验所用。
其他条件不变,当人们随意移动时,病毒传播迅速,疫情很难控制
其他条件不变,当人们控制自己的移动时,病毒传播缓慢,疫情逐渐得到控制
小结
诚如VirusBroadcast的作者所说,现在的模型是一个很简单的模型,所用的数据也是模拟生成的,还需优化改进。朋友们如果有兴趣,可以自行查阅复制下文中的R代码,自由修改。
如果您对代码有任何意见或建议,请联系hxj5hxj5@126.com。谢谢!
参考
[1] “计算机仿真程序告诉你为什么现在还没到出门的时候” 视频地址:
https://www.bilibili.com/video/av86478875?spm_id_from=333.788.b_765f64657363.1
[2] VirusBroadcast (Java)程序源码:
https://github.com/KikiLetGo/VirusBroadcast
附录:RVirusBroadcast代码
###name:RVirusBroadcast
###author:hxj7(hxj5hxj5@126.com)
###version:202002010
###note:本程序是"VirusBroadcast (in Java)"的R版本
### VirusBroadcast (in Java) 项目链接:
### https://github.com/KikiLetGo/VirusBroadcast/tree/master/src
library(tibble)
library(dplyr)
########## 模拟参数 ##########
ORIGINAL_COUNT <- 50 # 初始感染数量
BROAD_RATE <- 0.8 # 传播率
SHADOW_TIME <- 140 # 潜伏时间,14天为140
HOSPITAL_RECEIVE_TIME <- 10 # 医院收治响应时间
BED_COUNT <- 1000 # 医院床位
MOVE_WISH_MU <- -0.99 # 流动意向平均值,建议调整范围:[-0.99,0.99];
# -0.99 人群流动最慢速率,甚至完全控制疫情传播;
# 0.99为人群流动最快速率, 可导致全城感染
CITY_PERSON_SIZE <- 5000 # 城市总人口数量
FATALITY_RATE <- 0.02 # 病死率,根据2月6日数据估算(病死数/确诊数)为0.02
SHADOW_TIME_SIGMA <- 25 # 潜伏时间方差
CURED_TIME <- 50 # 治愈时间均值,从入院开始计时
CURED_SIGMA <- 10 # 治愈时间标准差
DIE_TIME <- 300 # 死亡时间均值,30天,从发病(确诊)时开始计时
DIE_SIGMA <- 50 # 死亡时间标准差
CITY_WIDTH <- 700 # 城市大小即窗口边界,限制不允许出城
CITY_HEIGHT <- 800
MAX_TRY <- 300 # 最大模拟次数,300代表30天
########## 生成人群点,用不同颜色代表不同健康状态。 ##########
# 用正态分布刻画人群点的分布
CITY_CENTERX <- 400 # x轴的mu值
CITY_CENTERY <- 400
PERSON_DIST_X_SIGMA <- 100 # x轴的sigma值
PERSON_DIST_Y_SIGMA <- 100
# 市民状态应该需要细分,虽然有的状态暂未纳入模拟,但是细分状态应该保留
STATE_NORMAL <- 0 # 正常人,未感染的健康人
STATE_SUSPECTED <- STATE_NORMAL + 1 # 有暴露感染风险
STATE_SHADOW <- STATE_SUSPECTED + 1 # 潜伏期
STATE_CONFIRMED <- STATE_SHADOW + 1 # 发病且已确诊为感染病人
STATE_FREEZE <- STATE_CONFIRMED +