Skip to main content

PyRoss is a numerical library for inference, forecasts, and optimal control of epidemiological models in Python

Project description

Imagel

PyRoss: inference, forecasts, and optimised control for epidemiological models in Python Binder CI Notebooks PyPI Python Version Downloads stars forks License

About | Documentation | Examples | Installation | Publications |

About

PyRoss is a numerical library that offers an integrated platform for inference, forecasts and non-pharmaceutical interventions in structured epidemiological compartment models.

Compartment models of arbitrary complexity can be user-defined through Python dictionaries. The most common epidemiological models, and several less common ones, come pre-defined with the library. Models can include stages to allow for non-exponentially distributed compartmental residence times. Currently, pre-defined models include ones with multiple disease states (exposed, asymptomatic, symptomatic, etc) and may be further divided by age, and by objective medical states (hospitalized, in ICU, etc). The compartment framework supports models for disease surveillance and quarantine and a variety of other processes of epidemiological relevance.

Generative processes can be formulated stochastically (as Markov population processes) or deterministically (as systems of differential equations). Population processes are sampled exactly by the Doob-Gillespie algorithm or approximately by the tau-leaping algorithm while differential equations are integrated by both fixed and adaptive time-stepping. A hybrid algorithm transits dynamically between these depending on the magnitude of the compartmental fluctuations.

Bayesian inference on pre-defined or user-defined models is performed using model-adapted Gaussian processes derived from functional limit theorems for Markov population process. Generative models are fitted to data through the surveillance model allowing for possibily unobserved compartments. The MAP estimates of parameters and their standard errors can be obtained rapidly by optimising, obviating the need for expensive Markov chain Monte Carlo. This enables the fast evaluation of the model evidence, through which competing models may be objectively compared and their forecasts combined by Bayesian model averaging. Forecasts of disease progression, then, can be fully Bayesian, convolving uncertainties in data, parameters and models. The sensitivity of these forecasts is estimated through the Fisher information matrix.

Non-pharmaceutical interventions are implemented as modifications of the contact structures of the model. Optimised control of these structures, given cost functions, is possible.

PyRossGeo is a companion library that supports spatially resolved compartment models with explicit commuting networks.

The libraries are named after Sir Ronald Ross, doctor, mathematician and poet. In 1898 he made "the great discovery" in his laboratory in Calcutta "that malaria is conveyed by the bite of a mosquito". He won the Nobel Prize in 1902 and laid the foundations of the mathematical modelling of infectious diseases.

The library was developed as a part of The Rapid Assistance in Modelling the Pandemic (RAMP) taskforce at the University of Cambridge. In alphabetical order, the authors are: Ronojoy Adhikari, Austen Bolitho, Erik Brorson, Fernando Caballero, Michael Cates, Jakub Dolezal, Tim Ekeh, Jules Guioth, Robert Jack, Julian Kappler, Lukas Kikuchi, Hideki Kobayashi, Irene Li, Joseph Peterson, Patrick Pietzonka, Benjamin Remez, Paul Rohrbach, Rajesh Singh, and Günther Turk. PyRoss development was also partially supported by a Microsoft Research Award for "Building an open platform for pandemic modelling".

Please read the PyRoss paper and PyRoss Wiki before you use PyRoss for your research. Open an issue, in preference to emailing us with queries. Join our Slack channel for discussion. Please follow the Contributor Covenant in all PyRoss fora. Thank you!

Installation

You can take PyRoss for a spin without installation: Binder. Please be patient while Binder loads.

From a checkout of PyRoss GitHub repository

This is the recommended way as it downloads a whole suite of examples along with the package.

Install PyRoss and an extended list of dependencies using

>> git clone https://github.com/rajeshrinet/pyross.git
>> cd pyross
>> pip install -r requirements.txt
>> python setup.py install

Install PyRoss and an extended list of dependencies, via Anaconda, in an environment named pyross:

>> git clone https://github.com/rajeshrinet/pyross.git
>> cd pyross
>> make env
>> conda activate pyross
>> make

Via pip

Install the latest PyPI version

>> pip install pyross

Testing

Short test of initialisation and running

>> make test

Long test of all example notebooks. Optionally can specify path and recursion to test a certain subset of notebooks

>> make nbtest -e path=examples/deterministic/

Examples

PyRoss has model-agnostic, formulation-agnostic intuitive interface. Once a model is instantiated, stochastic, deterministic and hybrid simulations can be performed through the same interface. The example below shows how to set up a deterministic SIR simulation with three age-groups.

# SIR with three age-groups (M=3)

import numpy as np
import pyross
import matplotlib.pyplot as plt


model_spec = { "classes" : ["S", "I"],

             "S" : {"infection" : [ ["I","S", "-beta"] ]},  ## the I class passes infection to S class
             "I" : { "linear"    : [ ["I", "-gamma"] ],     ## this is recovery process for I class
                    "infection" : [ ["I", "S", "beta"]]}    
             
              ## the recovered class R is internally determined by number conservation
             }


parameters = {'beta'  : 0.1,
              'gamma' : 0.1, 
              }

M=3;  Ni=1000*np.ones(M);  N=np.sum(Ni) 


# Initial conditions as an array
x0 = np.array([
    980, 980, 980,    # S
    20,   20,  20,    # I
])

# Or initial conditions as a dictionary 
x0 = {'S': [n-20 for n in Ni], 'I':  [20, 20, 20]  }


CM = np.array( [[1,   0.5, 0.1],
               [0.5, 1,   0.5],
               [0.1, 0.5, 1  ]], dtype=float)

def contactMatrix(t):
    return CM


# duration of simulation and data file
Tf = 160;  Nf=Tf+1; 

det_model = pyross.deterministic.Model(model_spec, parameters, M, Ni)

# simulate model 
data = det_model.simulate(x0, contactMatrix, Tf, Nf)


# plot the data and obtain the epidemic curve
S = np.sum(det_model.model_class_data('S', data), axis=1)
I = np.sum(det_model.model_class_data('I', data), axis=1)
R = np.sum(det_model.model_class_data('R', data), axis=1)
t = data['t']

fig = plt.figure(num=None, figsize=(10, 8), dpi=80, facecolor='w', edgecolor='k')
plt.rcParams.update({'font.size': 22})

plt.fill_between(t, 0, S/N, color="#348ABD", alpha=0.3)
plt.plot(t, S, '-', color="#348ABD", label='$S$', lw=4)

plt.fill_between(t, 0, I/N, color='#A60628', alpha=0.3)
plt.plot(t, I, '-', color='#A60628', label='$I$', lw=4)

plt.fill_between(t, 0, R/N, color="dimgrey", alpha=0.3)
plt.plot(t, R, '-', color="dimgrey", label='$R$', lw=4)

plt.legend(fontsize=26); plt.grid() 
plt.autoscale(enable=True, axis='x', tight=True)
plt.ylabel('Compartment value')
plt.xlabel('Days');

Read more in the examples folders.

Publications

  • Bayesian inference across multiple models suggests a strong increase in lethality of COVID-19 in late 2020 in the UK. Patrick Pietzonka, Erik Brorson, William Bankes, Michael E. Cates, Robert L. Jack, R. Adhikari medRxiv, 2021

  • Efficient Bayesian inference of fully stochastic epidemiological models with applications to COVID-19. Yuting I. Li, Günther Turk, Paul B. Rohrbach, Patrick Pietzonka, Julian Kappler, Rajesh Singh, Jakub Dolezal, Timothy Ekeh, Lukas Kikuchi, Joseph D. Peterson, Hideki Kobayashi, Michael E. Cates, R. Adhikari, Robert L. Jack, arXiv:2010.11783, 2020 | ResearchGate

  • Efficient and flexible methods for time since infection models, Joseph D. Peterson, R. Adhikari, arXiv:2010.10955, 2020

  • Inference, prediction and optimization of non-pharmaceutical interventions using compartment models: the PyRoss library. R. Adhikari, Austen Bolitho, Fernando Caballero, Michael E. Cates, Jakub Dolezal, Timothy Ekeh, Jules Guioth, Robert L. Jack, Julian Kappler, Lukas Kikuchi, Hideki Kobayashi, Yuting I. Li, Joseph D. Peterson, Patrick Pietzonka, Benjamin Remez, Paul B. Rohrbach, Rajesh Singh, and Günther Turk, arXiv:2005.09625, 2020 | ResearchGate.

  • Age-structured impact of social distancing on the COVID-19 epidemic in India. Rajesh Singh and R. Adhikari, arXiv:2003.12055, 2020 | ResearchGate.

License

We believe that openness and sharing improves the practice of science and increases the reach of its benefits. This code is released under the MIT license. Our choice is guided by the excellent article on Licensing for the scientist-programmer.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyross-2.2.1.tar.gz (2.4 MB view details)

Uploaded Source

Built Distributions

pyross-2.2.1-py3.10-macosx-11.1-arm64.egg (5.0 MB view details)

Uploaded Source

pyross-2.2.1-cp310-cp310-macosx_11_0_arm64.whl (5.0 MB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

File details

Details for the file pyross-2.2.1.tar.gz.

File metadata

  • Download URL: pyross-2.2.1.tar.gz
  • Upload date:
  • Size: 2.4 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/6.0.0 pkginfo/1.9.6 requests/2.29.0 requests-toolbelt/0.9.1 tqdm/4.65.0 CPython/3.10.9

File hashes

Hashes for pyross-2.2.1.tar.gz
Algorithm Hash digest
SHA256 2cdef036fa5a347cbcf782dcc08017b403364d299e891aa613622d8e9f45247f
MD5 0f9d19426cc3491ea0de4decfac41bb1
BLAKE2b-256 2f780534360300f55e7cc0e32eebd1514303bf8a90662c1d9ca767b441b11488

See more details on using hashes here.

File details

Details for the file pyross-2.2.1-py3.10-macosx-11.1-arm64.egg.

File metadata

  • Download URL: pyross-2.2.1-py3.10-macosx-11.1-arm64.egg
  • Upload date:
  • Size: 5.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/6.0.0 pkginfo/1.9.6 requests/2.29.0 requests-toolbelt/0.9.1 tqdm/4.65.0 CPython/3.10.9

File hashes

Hashes for pyross-2.2.1-py3.10-macosx-11.1-arm64.egg
Algorithm Hash digest
SHA256 6d67fac6fd86bb54f35f9baf5bb35df5dab454c1b245c713202d30c12983bb96
MD5 842b9d4b6acbad32e1ccbc4715d50ffc
BLAKE2b-256 565cfb7e2808ed41775d87fa13768adfffc1a8b4541bc8a8a3a24499094ed550

See more details on using hashes here.

File details

Details for the file pyross-2.2.1-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

  • Download URL: pyross-2.2.1-cp310-cp310-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 5.0 MB
  • Tags: CPython 3.10, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/6.0.0 pkginfo/1.9.6 requests/2.29.0 requests-toolbelt/0.9.1 tqdm/4.65.0 CPython/3.10.9

File hashes

Hashes for pyross-2.2.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 dd79a5ba9992a904a13e7d0ba5a6fa2c458835c1032c6782c3633a3bec0af959
MD5 e996aeb74061af22a8e3d9d959b4d52f
BLAKE2b-256 0d95fcae9aac69e8340fc41215bc94d8710e3d9c87dfdd54d01eeaa6ccdd920d

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page