-
Notifications
You must be signed in to change notification settings - Fork 5
Cholera
This page is created to document the earliest work being done on the LASER-Cholera model. At this time, the development work is on its 4th day, so we're just getting started here.
https://gilesjohnr.github.io/MOSAIC-docs/model-description.html#eq:system
Northern Nigeria Measles Model (NNMM) LASER.
https://github.com/InstituteforDiseaseModeling/laser/tree/cholera
Note that there's a branch called 'cholera' and a top-level script called cholera.py, but the code at this time is still in the nnmm subdirectory.
- S -> S (already extant from Measles)
- Added E (already extant from Measles) even though not in spec. From distribution or constant.
- I -> I (already extant from Measles)
- R -> Waning Immunity, simple uniform draw from 3 to 6 years for now.
- "W" -> Environmental transmission route added to contact. See below for details.
- V -> RI and SIA delivering (waning) immunity already extant from Measles.
- Cases (all) -> To be done in post from incidence report
- Disease Deaths -> Also to be done in post; no disease deaths at runtime.
- Applied as multiplier on beta in transmission. Input as formula or precalculated LUT.
- Read in suitability (
$\psi$ ) csv/dataframe; calculate$\delta$ (decay rate) and$\beta^{env}_{jt}$ for each timestep and node. - Seasonality applied as multiplier on
$\beta^{env}_{jt}$ in transmission. Input as formula or precalculated LUT. -
$\zeta$ -> Environmental shedding is a simulation-level input parameter, constant across the sim. - WASH -> Read in as csv/dataframe for each timestep and node; applied during transmission. IS THIS RUNTIME INTERVENTION ALSO? That's easy too.
- Already well supported, but now waning everywhere with susceptibility_timer.
- Biggest impact is that we need more agents for the entire sim since we don't have the performance benefit of a recovered (R) cohort.
- Natural Infection: https://github.com/InstituteforDiseaseModeling/laser/blob/cholera/nnmm/mods/intrahost.py#L66
- Vaccination: https://github.com/InstituteforDiseaseModeling/laser/blob/cholera/nnmm/mods/ri.py#L124
- Maternal: ? (Right now doing 6 months per Measles, but easy to remove; nothing in spec)
- Initialization (4.9): https://github.com/InstituteforDiseaseModeling/laser/blob/cholera/nnmm/mods/immunity.py#L30
- No changes from Measles.
- Treated as post-processing activity; will dictate reporting which will impact perf.
- No changes from Measles. Been using Northern Nigeria as placeholder for prototyping.
Below are the set of input data files currently being used in the prototype. They data can easily be changed to represent different demographics. Any of the other structural details can be changed as needed. This information is provided to add clarity.
Total populations by LGA (nigeria.py)
This is the most fundamental input data file which specifies our population and nodes (lgas). Note that this is here a python file but really it's data assigned to a variable in a way that a python script can just import.
- Format: Py
- Location: Bundled in package
- Format: CSV. See: https://github.com/InstituteforDiseaseModeling/laser/blob/cholera/src/idmlaser_cholera/manifest.py#L4 which points to https://github.com/InstituteforDiseaseModeling/laser/blob/cholera/src/idmlaser_cholera/USA-pyramid-2023.csv.
- Location: Bundled in package.
- Format: Py
- Location: in package.
Mortality is done starting with "# Derived from table 1 of "National Vital Statistics Reports Volume 54, Number 14 United States Life Tables, 2003" (see README.md)" extracted as a cumulative_deaths array length 102 at the link.
- Format: CSV
- Location: User-provided. Synthetic data can be generated by package utility.
manifest.py points to a file, local to the user, called synthetic_psi_data.csv. If it's not found, a built-in utility is run to create it.
I would probably change that to point to "suitability.csv" and then symlink to either a synthetic data file or an actual data file, but symlinks seem to create issues on certain platforms.
- Format: npy?
- Location: User-provided. Synthetic data can be generated by package utility.
Actually right now (measles model) this is handled with a single line of code:
beta_effective = model.params.beta + model.params.seasonality_factor * np.sin(2 * np.pi * (tick - model.params.seasonality_phase) / 365)
But the cholera spec makes it seem like we might want this to vary by node/patch and also vary by year (climate vs weather) and we may want to fit to data rather than just have a simple sine wave. All of which may be better handled by pre-generating a complete data series for each location, or a partial point series for linear interpolation from.
- Format: py
- Location: Bundled in package
See "gravity" node in nigeria.py.
Solution for user-provided weights file is TBD.
- Format: CSV?
- Location: User provided
This file indicates the vaccination coverages to be provided by time and location. TBD, no code yet to support this.
- A lot of the new cholera input parameters are highly oversimplified. The goal so far as been structural/qualitative, not quantitative.
- Parameter sensitivity to the new parameters has been started.
- No spatial validation has been attempted.
- As of this writing, the model runs a lot more slowly -- no EULAs, more reporting.
At this time, we're simulating 100 million agents for 5 years (all agents, all timesteps) with continuous transmission in 4.5 minutes.