Skip to content

Comparison to Ferguson Model

Patricia edited this page Feb 23, 2022 · 28 revisions

Comparison to Ferguson Model

This page details the location and nature of any alternative implementations we have added alongside the Ferguson Model in our implementation, allowing comparison of both methods.

Severity Class Labels

Location: pyEpiabm/pyEpiabm/property/infection_status.py Ferguson: The severity classes (once infected) are labelled Asymptomatic, Mild, ILI (for influenza-like illness), SARI (for severe acute respiratory infection), Critical (requires intensive care unit), Stepdown (from intensive care unit, but not recovered yet), Dead, Recovered. Alternative: We label the severity classes as InfectAsympt, InfectMild, InfectGP, InfectHosp, InfectICU, InfectICURecov, Recovered, Dead. Motivation: Clarity. Behaviour: This does not change the behaviour, as all classes are kept (apart from the obvious, ILI becomes InfectGP, SARI becomes InfectHosp, Critical becomes InfectICU, and Stepdown becomes InfectICURecov).

Template Issue

Location: pyEpiabm/pyEpiabm/test_file.py, the sweeper() function
Ferguson: They randomly determine the entire fate of an individual upon exposure.
Alternative: We randomly determine the fate of an individual on a stage-by-stage basis, so the time of progression of an individual to the next stage is only determined when entering the previous stage.
Motivation: This allows for reaction to changing policy, or updating hospital densities etc.
Behaviour: This should only change the behaviour of the model if further progression is time dependant (i.e. a new drug is made available, or medical treatment effectiveness depends on (time-dependant) patient numbers), which is favourable behaviour for the model.
Validation: This has not been explicitly validated against the Ferguson implementation.

Initialisation Sweeps

Update Sweeps

Update Place Sweep

Location: pyEpiabm/pyEpiabm/update_place_sweep.py, the sweeper() function for household infections.
Ferguson: Considers whether people in a microcell will be present in any place using a calculation involving on Euclidean distance to the place. Runs for every time-step in the model and for every person in the microcell.
Alternative: We differ from Ferguson here, as the population of the place is reconfigured at each time step to produce a list of people from the microcell who are present in each place at each time-point.
Motivation: This increases readability. We also create functions to calculate place susceptibility and infectiousness both follow the Ferguson model, and allow for user input.
Behaviour: This allows for greater readability and flexibility within the model, while still allowing for direct comparison to the Ferguson model.
Validation: This has not been explicitly validated against the Ferguson implementation.

Spatial Infection Sweeps

Household Sweep

Location: pyEpiabm/pyEpiabm/household_sweep.py, the sweeper() function for household infections.
Ferguson: Implement a household sweep as the first part of the loop considering infection events. Allows for various interventions such as vaccinations or lockdowns to be implemented. These appear in adjustments to the susceptibility and infectiousness parameters given to individual households.
Alternative: We mostly follow Ferguson here, though loop through the population on each section of the sweep to increase reader clarity.
Motivation: Small increases to readability. We also create functions to calculate household susceptibility and infectiousness both follow the Ferguson model, and allow for user input.
Behaviour: This allows for greater readability and flexibility within the model, while still allowing for direct comparison to the Ferguson model.
Validation: This has not been explicitly validated against the Ferguson implementation.

Pseudorandom Number Generator

Location: pyEpiabm/pyEpiabm/utility/random_methods.py

We implemented the algorithm in Ferguson's model ranf_mt, but adapted it so it is used on only 1 thread (as there will be no multi-threading in the python version). Instead of initialising s1 and s2 using a 32-bit integer pointer and using the thread number, we set s1 and s2 to initial "random" integers, s1 = 163858 and s2 = 6573920043. The remaining of the algorithm is exactly the same.

Clone this wiki locally