Skip to content

Comparison to Ferguson Model

HenrietteCapel edited this page Sep 27, 2023 · 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

Initialise Place Sweep

Location: pyEpiabm/pyEpiabm/initial_place_sweep.py, the sweeper() function for place initialisation.
Ferguson: Considers whether people in a cell will be present in any place. Places are populated by a "fixed" population that remain in one place for the whole of the simulation. Places also have a variable population which changes at each timestep. This sweep initialises the fixed population, and also the first iteration of the variable population. People may be a member of any place in their cell, and are assigned weighted by the age distribution 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 follow Ferguson here, using identical distributions and parameters to calculated the capacity and group structure within a place. Each person is checked to make sure they are in an appropriate age category and are weighted by how likely they are to be in any place.
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. It also reduces the run time of the simulation by decreasing the number of people that have to be reassigned to places at each timestep.
Validation: This has not been explicitly validated against the Ferguson implementation.

Update Sweeps

Update Place Sweep

Location: pyEpiabm/pyEpiabm/update_place_sweep.py, the sweeper() function for place updates.
Ferguson: Considers whether people in a cell 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 may be reconfigured at each time step to produce a list of people which comprise the "variable population" of the place at each time-point. This models the movement of people to different places such as restaurants in their cell. The size and substructure of the variable population is recalculated at each timestep which again models the variability of real-life.
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.

Set Infectiousness in Host Progression Sweep

Location: pyEpiabm/pyEpiabm/sweep/host_progression_sweep.py, the _set_infectiousness method.
Ferguson: Defines the infectiousness of a symptomatic infected person as negative.
Alternative: We differ and conserve the infectiousness as a positive number. The difference between the infectiousness of an asymptomatic or symptomatic infected person will be asserted in a different way.
Motivation: It seems more natural and clearer approach, thus a better implementation.
Behaviour: It should not affect the behaviour of the rest of the model, as the difference between the infectiousness of an asymptomatic vs symptomatic infected person will be measured using the infection status attribute of the person.

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.

Place Sweep

Location: pyEpiabm/pyEpiabm/place_sweep.py, the sweeper() function for place infections.
Ferguson: Implement a place sweep as the second part of the loop considering infection events. Allows for various interventions such as movement restrictions to be implemented. Ferguson differentiates between Hotel-type places which travelling hosts are associated with, and non-Hotel-type places.
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.

Spatial Sweep

Location: pyEpiabm/pyEpiabm/spatial_sweep.py, the sweeper() function for spatial infections.
Ferguson: Implement a spatial sweep as the third part of the loop considering infection events. This allow people in different cells to infect one another.
Alternative: We mostly follow Ferguson here, though loop through the population on each section of the sweep to increase reader clarity. We do propose a second method which chosen the infectee cell based on a purely distance based meaure, with a cutoff distance beyond which infection events cannot occur.
Motivation: Small increases to readability. We allow for the user to follow the Covidsim weighting choice, or use a inverse distance based measure.
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.

InverseCdf Method Choose

Location: pyEpiabm/pyEpiabm/utility/inverse_cdf
Change: We implemented two similar choose method that can be found in CovidSim, one without exponentialisation and one with negative exponentialisation on which is applied the natural logarithm and then multiplied by one. For simplicity, in the program we use the method without exponentialisation.
Motivation: It is simpler and should not change the result.
Behaviour: It does not change the resulting sampling.
Validation: We compared below the distribution of sampling for latent time for the two methods. The results are very similar and do not seem to be significantly different.