R语言模拟疫情传播-RVirusBroadcast

原创: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 +
  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值