A dataset containing identified epidemic peaks from cholera surveillance data across African countries. Peaks are detected using time series analysis with smoothing and prominence-based peak detection algorithms.
Format
A data frame with 6 variables:
- iso_code
ISO 3166-1 alpha-3 country code
- peak_start
Start date of the epidemic period (Date)
- peak_date
Date of peak incidence (Date)
- peak_stop
End date of the epidemic period (Date)
- reported_cases
Number of reported cholera cases at peak (numeric)
- outbreak_interval_days
Length of the peak window in days,
peak_stop - peak_start(numeric)
Source
Generated from cholera surveillance data using est_epidemic_peaks()
function on combined daily surveillance data from WHO and other sources.
Details
Scope: The dataset is the full historical detection record from the
surveillance time series (all years of the combined daily series, observed
weeks only – AI Fourier reconstructions are excluded) and is not pre-trimmed to any
particular simulation window. Consumers that score peaks against a
specific config window (e.g. calc_model_likelihood(), the Python
likelihood port, the simulation config builders) must filter against
[date_start, date_stop] first – otherwise which.min(abs(date_seq - peak_date)) silently snaps out-of-window peaks to t=1 or t=N and
biases the peak-shape likelihood terms. The internal helper
MOSAIC:::.filter_epidemic_peaks() is the canonical filter and is
applied at build time inside make_config_default.R, at runtime
inside get_location_config(), and defensively inside
calc_model_likelihood().
Epidemic peaks are identified using the following methodology:
Time series smoothing with 28-day running mean window
Local maxima detection with 10-day comparison windows
Prominence-based filtering (minimum 8% of maximum smoothed value for most countries; country-specific overrides below)
Minimum peak height threshold of 3 smoothed cases (default)
Minimum 75-day separation between consecutive peaks
Peak boundaries defined where incidence drops to 1/3 of peak height
Country-specific adjustments are applied for:
Niger (NER): Lower prominence threshold (1.5%) for gradual peaks
Cameroon (CMR): Adjusted threshold (4%) for plateau-shaped peaks
Ethiopia (ETH): Lower threshold (3%) for multiple outbreaks
Detected peaks sit on observed weeks: imputed (AI Fourier, assumed-zero) weeks are treated as missing (a WHO multi-week report spread over its window counts as observed), a peak day must be observed with cases > 0, and a detected peak whose window is at least half imputed days is dropped. The manual corrections below are documented outbreaks and are exempt from that window filter.
Manual corrections have been applied for known issues including:
Ethiopia 2024: February peak corrected to March (sustained outbreak)
DRC 2023: Added January peak (filtered due to proximity)
Nigeria 2024: Added October peak
Kenya 2022-2023: Added December 2022, removed June 2023 minor peak
Mozambique: Added February 2024 and March 2025 peaks
Somalia: Added major April 2017 peak and 2024-2025 peaks
Zambia: Added January 2018 peak
Tanzania: Added January 2017 peak
See also
est_epidemic_peaks for the function that generates this data
plot_epidemic_peaks for visualization
Examples
data(epidemic_peaks)
head(epidemic_peaks)
#> iso_code peak_start peak_date peak_stop reported_cases
#> 1 AGO 2006-03-27 2006-04-23 2006-05-23 757
#> 174 AGO 2018-01-01 2018-01-04 2018-01-31 24
#> 2 AGO 2025-04-09 2025-04-28 2025-05-25 303
#> 3 AGO 2025-10-02 2025-10-13 2025-10-24 149
#> 4 AGO 2026-04-18 2026-04-27 2026-05-12 106
#> 5 BDI 1980-02-02 1980-02-10 1980-02-18 15
#> outbreak_interval_days
#> 1 57
#> 174 30
#> 2 46
#> 3 22
#> 4 24
#> 5 16
# Countries with epidemic data
unique(epidemic_peaks$iso_code)
#> [1] "AGO" "BDI" "BEN" "BFA" "CAF" "CIV" "CMR" "COD" "COG" "COM" "ETH" "GHA"
#> [13] "GIN" "GNB" "KEN" "LBR" "MLI" "MOZ" "MWI" "NER" "NGA" "RWA" "SDN" "SEN"
#> [25] "SLE" "SOM" "SSD" "TCD" "TGO" "TZA" "UGA" "ZAF" "ZMB" "ZWE"
# Recent peaks (2024-2025)
recent_peaks <- epidemic_peaks[epidemic_peaks$peak_date >= as.Date("2024-01-01"), ]
table(recent_peaks$iso_code)
#>
#> AGO BDI CAF CIV CMR COD COG COM ETH GHA KEN MOZ NER NGA RWA SDN SOM SSD TCD TZA
#> 3 4 1 1 1 3 1 1 3 1 3 3 1 3 1 4 2 3 2 3
#> UGA ZMB ZWE
#> 3 2 2
# Peak duration calculation
epidemic_peaks$duration <- as.numeric(
epidemic_peaks$peak_stop - epidemic_peaks$peak_start
)
summary(epidemic_peaks$duration)
#> Min. 1st Qu. Median Mean 3rd Qu. Max.
#> 2.00 16.00 25.00 29.34 44.00 117.00
