Various implementations of the classical SIR model in Julia
Try the notebooks out in Binder:
GitHub Markdown doesn't parse equations, so here's a description of the underlying SIR model.
- The ordinary differential equation model considers:
- Susceptible, S, with initial condition S(0)=990
- Infected, I, with initial condition, I(0)=10
- Recovered, R, with initial condition R(0)=10
- Total population, N=S+I+R=1000
- Susceptible individuals make contacts with others at rate c (=10.0), with the probability of a contact with an infectious person being I/N. With probability β (=0.05), an infected person will infect a susceptible given a contact.
- Infected individuals recover at a per-capita rate γ (=0.25).
The above process can be represented in different kinds of ways:
- Ordinary differential equation using DifferentialEquations.jl
- Ordinary differential equation using ModelingToolkit.jl
- Stochastic differential equation using DifferentialEquations.jl
- Stochastic differential equation using StochasticDiffEq.jl
- Function map
- Stochastic Markov model
- Jump process (Gillespie) using DifferentialEquations.jl
- Jump process (Gillespie) using reaction networks from DiffEqBiological.jl
- Reaction network conversion to ODEs, SDEs and jump process using ModelingToolkit
- Jump process (Gillespie) using Gillespie.jl
- Discrete event simulation using SimJulia
- Agent-based model using base Julia as well as using DifferentialEquations
- Agent-based model using Agents.jl
In addition to the above examples of simulation, there are also examples of inference of the parameters of the model using counts of new cases. Although these are toy examples, they provide the building blocks for more complex situations.
Note that the implementations and choice of parameters may be suboptimal, and are intended to illustrate more-or-less the same underlying biological process with different mathematical representations. Additional optimizations may be obtained e.g. by using StaticArrays
.
I've also tried to transform parameterisations in discrete time as closely as possible to their continuous counterparts. Please see the great work by Linda Allen for how these different representations compare.
Thanks to Weave.jl
, Julia Markdown files (in tutorials/
) are converted into multiple formats.
git clone https://github.com/epirecipes/sir-julia
cd sir-julia
Then launch julia
and run the following.
cd(@__DIR__)
import IJulia
IJulia.notebook(;dir="notebook")
To add an example, make a new subdirectory in the tutorials
directory, and add a Julia Markdown (.jmd
) document to it. Set the beginning to something like the following:
# Agent-based model using Agents.jl
Simon Frost (@sdwfrost), 2020-04-27
Suggested sections:
- Introduction
- Libraries
- Utility functions
- Transitions
- Time domain
- Initial conditions
- Parameter values
- Random number seed
- Running the model
- Post-processing
- Plotting
- Benchmarking
In addition, an appendix that displays the machine on which the code is run, and the package details,{} can be added using the following code:
include(joinpath(@__DIR__,"tutorials","appendix.jl"))
appendix()
Change to the root directory of the repository and run the following from within Julia.
include("build.jl")
weave_all()
Examples use the following libraries:
- The
DifferentialEquations.jl
ecosystem for many of the examples SimJulia
for discrete event simulationsAgents.jl
for agent-based modelsGillespie.jl
for the Doob-Gillespie process
Parts of the code were taken from @ChrisRackauckas DiffEqTutorials
, which comes highly recommended.