COVID-19 VIRUS SPREAD
Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)
WHAT IS IT?
COVID-19 Virus Spread Model is an Agent-Based-Model built from the skeleton of an SIR model developed by Paul Smaldino currently (2020) at the Cognitive and Information Sciences Department at the University of California, Merced; and was further developed by Nich Martin at the University of Florida, Department of Entomology and Nematology as a tool to help educate the public on how interaction models concerning the current COVID-19 pandemic are used to make predictions and recommendations to the public.
HOW IT WORKS
An initial population of agents (blue-colored humanoids) are randomly placed in the model space with an initial population of infected individuals (red). As time moves forward, agents move randomly through the model space according to specified parameters such as number of stationary individuals and mobility. Infected individuals transmit the virus to susceptible individuals by coming within a certain distance of each other. Whether the susceptible individual becomes infected is determined by a random probability, the likelihood of which increases as transmission rate increases. The model can be run with and without immune individuals; when ran with immunity, infected individuals will become immune (color changes to gray) according to a random probability, the liklihood of which increases with increasing recovery rate. Mortality rate can be adjusted. The ability of hospitals to cope with the proportion of infected individuals can be adjusted as well. Once the proportion of infected individuals is greater than health care capacity mortality increases an order of magnitude, as predicted by other current models.
HOW TO USE IT
After adjusting the parameters, described below, simply click the setup button and click go. The model will continue to run until there are either no more infected individuals or no more susceptible individuals.
Initial Population
Control population size by adjusting the init-population slider.
Initial Number of Infected Individuals
Controls initial number of infected using the init-infected slider.
Transmission Rate
Current estimates are between 0.50 and 0.70. Set transmission rate by moving the transmission.rate slider.
Number of Stationary Individuals
The stationary slider allows the user to control the number of individals not moving (represents physical/social distancing) in the model space.
Mobility
The mobility slider allows the user to set how much distance non-stationary individuals move throughout the model space.
Recovery Rate
Set the recovery.rate slider low for longer recovery time and high for quick recovery. Suggested recovery rate for the current virus is 0.15.
Immunity
Activate individuals' ability to recover from infection by turning on the immunity? switch.
Initial Number of Immune Individuals
Use the init-immune slider to adjust the number of individuals immune to the virus before the model runs.
Mobilize the Immune
By activating the mobilize-immune? switch, individuals who were once stationary are allowed to move throughout the model space once they become immune.
Quarantine Effort
By adjusting the quarantine.effort slider, users can control infected individuals' ability to infect susceptibles.
Health Care Capacity
The healthcare.capacity slider changes the proportion of infected individuals hospitals can provide care for. Once the proportion of infected individuals exceeds health care capacity (which I'm told should realistically be set at least below 0.30) mortality rate increases one order of magnitude from where it was initially set.
Mortality Rate
The infected.mortality slider changes the base-line mortality rate for those infected. Estimates for mortality rate range from 1 to 10%, averaging around 3.6 when not accounting for health care capacity.
THINGS TO NOTICE
You can watch the model space and individuals moving throughout it to see how disease spreads throughout a population.
The model has two plot outputs. The first shows the number of susceptible, infected, and immune individuals through time. This same figure also shows a line for health care capacity.
The plot below the first shows the total number of individuals who have died as the model moves through time.
There are also a number of indicator values including the maximum propotion of individuals infected, the proportion uninfected, the number of people who have died, and the current population size.
THINGS TO TRY
Try adjusting the init-population slider to see how more sparse, rural areas are affected vs. densely populated cities.
Adjust the stationary slider to see how many people "social distancing" it takes to "flatten the curve".
Adjust the init-immune slider to see what outcomes would look like if a vaccine was available, and how many individuals getting vaccinated it would take to see the effects of "herd immunity".
By adjusting the quarantine.effort you can see what the effects of isolating individuals already infected has on the dynamics of the system.
EXTENDING THE MODEL
If you have any suggestions for things to add or change in the model feel free to contact me at n.martin@ufl.edu. I (Nich Martin) am not an epidemiologist, so if there are epidemiologists out there who feel the model needs drastic improvement, please contact me. But please also bear in mind, this was developed as an educational tool so changes will likely only be made if they serve an educational benefit. Netlogo users are encouraged to adjust the code as they see fit; I would be delighted if you send me your updates; I am new to agent-based modeling and would like useful feedback.
RELATED MODELS
This model is based off an initial model by Paul Smaldino "SIR Model with random movement" http://smaldino.com/wp/
CREDITS AND REFERENCES
CREATIVE COMMONS LICENSE This code is distributed by Nich Martin under a Creative Commons License: Attribution-ShareAlike 4.0 International (CC 4.0) https://creativecommons.org/licenses/by/4.0/
Comments and Questions
;;SIR Model with random movement ;;Agents move around at random. ;;They are either Susceptible, Infected, or Recovered (or, equivalently, removed) globals [max-infected] turtles-own[ infected? immune? stationary? ] to setup clear-all setup-turtles setup-infected setup-stationary setup-immune set max-infected (count turtles with [infected?]) reset-ticks end to setup-turtles create-turtles init-population [ set color blue set shape "person" set size 2 set infected? false set immune? false set stationary? false setxy random-pxcor random-pycor ] end to setup-infected ask n-of init-infected turtles [ set color red set infected? true ] end to setup-stationary ask n-of stationary turtles[ set stationary? true ] end to setup-immune ask n-of init-immune turtles[ set immune? true set color grey ] end to go ;;stop if everyone or noone is infected if (count turtles with [infected?] = 0) or (count turtles with [infected?] = init-population) [stop] infect-susceptibles kill-susceptibles recover-infected recolor move calculate-max-infected tick end to infect-susceptibles ;; S -> I ask turtles [ let infected-neighbors (count other turtles with [color = red] in-radius 1 * (1 - quarantine.effort)) if (random-float 1 < 1 - (((1 - transmission.rate) ^ infected-neighbors)) and not immune?) [set infected? true] ] end to recolor ask turtles with [infected?] [ set color red] end to move ask turtles [ if (stationary? = false) [ right random 360 ;;get a new random heading forward random-normal mobility 0.01] ifelse mobilize-immune? [if (stationary? = true and immune? = true) [set stationary? false]] [if (stationary? = true and immune? = true) [set stationary? true] ] ] end to recover-infected ;;I -> R ask turtles with [infected?] [ if random-float 1 < recovery.rate [ set infected? false ifelse immunity? [ set immune? true set color gray ] [ set color blue ] ] ] end to-report prop-infected report (count turtles with [infected?] / count turtles) end to kill-susceptibles ask turtles with [infected?] [ifelse prop-infected < healthcare.capacity [if (random-float 1000 < (infected-mortality)) [die]] [if (random-float 1000 < (10 * infected-mortality)) [die]]] end to-report num-dead report (init-population - count turtles) end to-report population report (count turtles) end to calculate-max-infected let x (count turtles with [infected?]) if x > max-infected [set max-infected x] end to-report max-infected-prop report max-infected / init-population end to-report prop-uninfected report (count turtles with [not infected? and not immune?]) / init-population end
There is only one version of this model, created over 4 years ago by Nich Martin.
Attached files
File | Type | Description | Last updated | |
---|---|---|---|---|
COVID-19 VIRUS SPREAD.png | preview | Preview for 'COVID-19 VIRUS SPREAD' | over 4 years ago, by Nich Martin | Download |
This model does not have any ancestors.
This model does not have any descendants.
Neil K
Error init-population (Question)
I can't run the program. I get ERROR nothing named init-population has been defined
Posted about 4 years ago
Nich Martin
RE: Error init-population
Hi Neil, Did you download the complete model, or copy the code script and paste it into Netlogo running on your desktop? If you did the latter, the code does not have an interface with which to interact and the variables of the model will be undefined. Are you able to run the model in NetLogo Web?
Posted about 4 years ago
Neil K
Thanks. That was my mustake.
Thanks. That was my mustake. Where do I get the model?
Posted about 4 years ago
Neil K
Found it.
Found it. Thanks for your patience.
Posted about 4 years ago
Pranav Adiga
Code language (Question)
Can I get this code in Python language to implement on a micro:bit device?
Posted about 4 years ago
Nich Martin
Re: Code language
Hi Pranav, sorry to say I have not programmed this model in Python. Right now, I'm learning to write ABModels in base R, and once I have that figured out, I plan to extend them to other programming languages (e.g., Python). Thanks for the interest.
Posted about 4 years ago