Skip to content

Cholera

Jonathan Bloedow edited this page Sep 24, 2024 · 19 revisions

Purpose

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.

Spec

https://gilesjohnr.github.io/MOSAIC-docs/model-description.html#eq:system

Starting Point

Northern Nigeria Measles Model (NNMM) LASER.

Branch

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.

Key changes:

Mapping Spec Features to LASER Capabilities

4.1: Intrahost/States

  • 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.

4.2: Seasonality (Contact)

  • Applied as multiplier on beta in transmission. Input as formula or precalculated LUT.

4.3: Environmental Transmission

  • 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.

4.4: Immunity

4.5: Migration

  • No changes from Measles.

4.6: Cases

  • Treated as post-processing activity; will dictate reporting which will impact perf.

4.7: Demographics

  • No changes from Measles. Been using Northern Nigeria as placeholder for prototyping.

Initial Results

Contact transmission only

Screenshot from 2024-09-11 17-12-29

Enviro transmission only (very slow decay)

Screenshot from 2024-09-12 08-33-27

Enviro transmission only (faster decay)

Screenshot from 2024-09-12 09-08-46

Combined transmission

image

Proposed/Current Data Inputs

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.

laser_diagram_io

Initial Populations by Node

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

Age pyramid

Mortality

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.

Environmental Suitability (by time and location)

  • 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.

Seasonal Contact Scaling

  • 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.

Migration Weights

  • Format: py
  • Location: Bundled in package

See "gravity" node in nigeria.py.

Solution for user-provided weights file is TBD.

campaign

  • 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.

Way Ahead

  • 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.

Perf snapshot

image

At this time, we're simulating 100 million agents for 5 years (all agents, all timesteps) with continuous transmission in 4.5 minutes.

Clone this wiki locally