About the data
The Climate Hazards Center InfraRed Precipitation with Station data (CHIRPS) is a 40+ year quasi-global, land-only, gridded rainfall dataset designed to provide blended gauge-satellite precipitation estimates with high spatial resolution, low latency, low bias, and a long period of record. CHIRPS version 3 (CHIRPS v3) spans 60°N–60°S and all longitudes, available at 0.05° resolution. It is created by combining thermal-infrared geostationary satellite-based estimates with in-situ station observations from global, regional, and national meteorological networks, alongside a high-resolution climatology (CHPclim2). The dataset begins in 1981 and extends to near-present.
Two CHIRPS v3 products are available — a rapidly updated preliminary product (CHIRPS Prelim) released two days after the end of each pentad, and a final product. Users requiring the most recent data should use CHIRPS Prelim, while the final product is recommended for research applications where accuracy is prioritised over timeliness.
For more information regarding CHIRPS v3 see the CHIRPS website.
Users can also find more information about the CHIRPS dataset here:
- Climate Data Guide: CHIRPS: Climate Hazards InfraRed Precipitation with Station data (Version 3)
Summary
| Name | CHIRPS v3 |
| Institution | Climate Hazards Center (CHC), UC Santa Barbara |
| Product type | gridded observed |
| Domain | global land (60°S–60°N) |
| Resolution | 0.05° x 0.05° |
| Period | 1981–present |
| Frequencies | daily, pentad, dekad, monthly, annual |
| Variables | Precipitation |
| Update frequency (latency) | Preliminary: 2 days after end of pentad; Final: ~1 month |
Variables
| Variable Name | Variable Description | Units |
|---|---|---|
| precip | total precipitation | millimetres per day |
Accessing the data
CHIRPS v3 data can be downloaded from several different platforms.
The CHC provides direct access to CHIRPS v3 data via their data repository. This is the best source for accessing the most up-to-date version of the dataset. Users requiring near real-time data should use the preliminary product, which is available 2 days after the end of each pentad.
Note that daily data is derived by disaggregating pentadal totals using either ERA5 (rnl) or IMERG (sat) as the disaggregation source. Users should select the appropriate product for their application.
| Domain | Frequency | Resolution | File Format |
|---|---|---|---|
| global | daily final | 0.05°, 0.25° | .tif, .nc, .cog |
| global | daily prelim | 0.05° | .tif, .nc (current year only) |
| africa | pentad | 0.05° | .tif, .bil, .png |
| global | pentad | 0.05° | .tif, .bil, .nc, .cog |
| africa | dekad | 0.05° | .tif, .bil, .png |
| global | dekad | 0.05° | .tif, .bil, .nc |
| africa | monthly | 0.05° | .tif, .bil, .png |
| global | monthly | 0.05° | .tif, .bil, .nc, .cog |
| africa | annual | 0.05° | .tif |
| global | annual | 0.05° | .tif, .nc |
The Copernicus Climate Data Store (CDS) provides access to CHIRPS v2 data via the Temperature and precipitation gridded data for global and regional domains derived from in-situ and satellite observations dataset.
Note that this source only provides CHIRPS v2, not v3.
| Domain | Frequency | Resolution | File Format |
|---|---|---|---|
| africa | daily | 0.25° | .nc |
The Early Warning Explorer (EWX) is an interactive tool developed by CHC that allows users to visualise, subset, plot time series, and download maps of CHIRPS v3 (and v2) and other data products. It is a useful option for users who prefer not to work directly with raw data files.
What the data looks like
Below is a spatial plot of mean annual rainfall over Southern Africa for the 1991-2020 climatology period, giving a sense of the spatial coverage and resolution of the CHIRPS v3 dataset.
The plots below show the monthly rainfall climatology and daily rainfall time series for Tete, Mozambique, illustrating the seasonal cycle and temporal extent of the dataset.
Key points to consider
CHIRPS v3 is a blended gauge-satellite product, meaning its estimates are influenced by both the density of available station observations and the quality of the underlying satellite data. In regions with sparse station networks, which includes much of rural Africa, the satellite component plays a larger role and accuracy may differ compared to well-gauged regions. Users should also be aware that the number of reporting stations can vary from month to month, which means data quality may not be consistent throughout the record.
Daily CHIRPS data should be used with caution. CHIRPS is fundamentally a pentadal and monthly product; daily estimates are derived by disaggregating pentadal totals using the fraction of cold cloud cover each day as a guide. This means daily values do not directly reflect observed daily rainfall and are less reliable for capturing extreme daily rainfall events. For analyses focused on daily extremes, users should validate against local station data where possible.
CHIRPS uses thermal infrared satellite observations to estimate rainfall by detecting cold cloud tops. This approach can miss warm rain events that form in the lower troposphere without deep cloud development. In the E8 region, this is worth keeping in mind during transitional seasons when shallow convection can contribute meaningfully to rainfall totals.
CHIRPS v3 is overall wetter than CHIRPS v2 due to the introduction of a gauge-undercatch correction, which adjusts station data to account for wind-induced underestimation of rainfall. Users transitioning from v2 to v3, or comparing results across versions, should account for this systematic difference. Similarly, when comparing CHIRPS v3 with station observations, CHC recommends using gauge-undercatch corrected station data to ensure a like-for-like comparison.
As is the case with most gridded climate datasets, CHIRPS provides its time variable in Coordinated Universal Time (UTC). If working in a time zone far from UTC, you may need to adjust the time variable to align with your local time zone when interpreting daily totals. Southern Africa is typically UTC+2, meaning a daily rainfall total in CHIRPS reflects rainfall from 2 AM to 2 AM local time.
Strengths
- High spatial resolution (0.05°) with quasi-global land coverage from 60°N to 60°S.
- Long continuous record from 1981 to near-present, suitable for trend analysis and climatological studies.
- Rapid update frequency with a preliminary product available within 2 days of the end of each pentad.
- Blends satellite estimates with in-situ station observations from over 90 sources, nearly four times more than CHIRPS v2, improving accuracy particularly in data-sparse regions.
- Rigorous quality control including automated screening and monthly human visual inspection before final production.
- Gauge-undercatch correction applied in v3 improves the accuracy of station inputs compared to v2.
- Improvements to the satellite algorithm in v3 result in better estimation of precipitation variance and extreme events compared to v2.
- Well validated over East Africa and shown to outperform similar products such as ARC2 at dekadal and monthly timescales.
Limitations
- Provides precipitation only and does not include temperature or other variables required for malaria modelling.
- Daily data is derived by disaggregating pentadal totals rather than being directly observed at daily resolution; use with caution for daily-scale analyses.
- Performance degrades in regions with sparse station networks and may vary over time as the number of reporting stations changes.
- Tends to underestimate extreme rainfall events, particularly at the daily timescale.
- Thermal infrared approach can miss warm rain events in the lower troposphere.
- CHIRPS v3 is systematically wetter than CHIRPS v2; direct comparisons between versions should account for this difference.
Citing the data
Funk, C., Peterson, P., Landsfeld, M. et al. The climate hazards infrared precipitation with stations: a new environmental record for monitoring extremes. Sci Data 2, 150066 (2015). DOI:10.1038/sdata.2015.66
When citing the CHIRPS v3 data repository directly, please also include: Climate Hazards Center Infrared Precipitation with Stations version 3 (CHIRPS3) Data Repository (2025). DOI:10.15780/G2JQ0P. Data was accessed on [DATE].
Terms of use
CHIRPS v3 data are made freely available under the Creative Commons Attribution 4.0 International (CC BY 4.0) license. Users are free to share and adapt the data for any purpose, provided appropriate credit is given. This replaces the public domain waiver used for CHIRPS v2.
The visualisations below use CHIRPS v3 data to explore rainfall variability across Tete Province, Mozambique, at both provincial and district level. Tete Province was selected as an example location within the E8 region to demonstrate how CHIRPS v3 can be aggregated to administrative units, which is a common requirement when working with climate-sensitive disease data.
How to use this data?
Gridded rainfall datasets like CHIRPS v3 provide spatially continuous coverage that can be aggregated to administrative units, making them well suited for district- or provincial-level analyses relevant to climate-sensitive disease surveillance and modelling.
In this example we use CHIRPS v3 daily data at 0.05° resolution accessed from the Climate Hazards Center data repository. Rather than extracting a single grid cell to represent a district or province, we demonstrate area-weighted spatial averaging, a method that accounts for the fact that grid cells near the equator cover slightly more area than those further away. This approach produces a more representative rainfall estimate for an administrative unit than a simple mean of grid cell values.
Administrative boundaries for Mozambique were sourced from the Humanitarian Data Exchange (HDX).
The following preparation steps were applied to the data:
- For each district, a spatial mask was created using the district boundary and area weights were applied based on the cosine of latitude.
- Monthly district totals were accumulated and then summed to produce annual totals and DJF (December-January-February) seasonal totals.
- A 1991-2020 baseline period was used for all anomaly and percentile calculations. The 90th percentile threshold for extreme DJF seasons was calculated from the distribution of annual DJF seasonal totals over this period.
How to plot the data?
Figure 1 shows the mean annual rainfall anomaly for each district in Tete Province for the period 2016-2025, expressed as a percentage relative to the 1991-2020 baseline.
A clear spatial pattern emerges across the province. Districts in the north and east, particularly Macanga, Angonia and Chifunde, have been notably wetter in the recent decade compared to the 1991-2020 baseline. Western districts including Magoe and Zumbu have experienced slightly drier conditions. This spatial heterogeneity would be missed if only a single grid cell or provincial mean were used for analysis.
Figure 2 shows the annual area-weighted rainfall for Tete Province and each individual district over the full CHIRPS v3 record from 1981 to 2025.
The time series reveals considerable interannual variability in rainfall across Tete Province, with annual totals ranging from below 600 mm to above 1300 mm for the provincial mean. The spread between individual districts is substantial, with some districts receiving nearly twice the rainfall of others in the same year. This highlights the importance of working at district level rather than using a single provincial value when assessing rainfall impacts on malaria transmission.
The DJF season corresponds to the peak of the malaria transmission season across much of southern Africa, making extreme rainfall events during this period particularly relevant for disease burden. Figure 3 shows the number of extreme DJF seasons experienced by each district between 2016 and 2025, where a season is classified as extreme if the district total exceeds the 90th percentile of DJF totals in the 1991-2020 baseline period.
Macanga experienced the greatest number of extreme DJF seasons in the recent decade (3 out of 10), consistent with its strongly positive anomaly in Fig. 1. In contrast, Zumbu, Magoe, Maravia and Chiuta recorded no extreme DJF seasons during this period, suggesting that the recent wetting trend in Tete Province has been spatially uneven and concentrated in the northern and eastern districts.
These visualisations are intended as an example of how CHIRPS v3 can be used for district-level rainfall analysis. The district-level aggregation approach is reproducible for any administrative unit provided boundary files are available, and area-weighting ensures spatial accuracy across districts of varying size. However, users should be aware that districts smaller than the CHIRPS grid resolution (0.05°, approximately 5 km) may be represented by very few grid cells, which can affect the reliability of area-averaged estimates. The 10-year comparison period (2016-2025) is relatively short for detecting statistically robust trends, and results are sensitive to the choice of baseline period. A different baseline would produce different anomaly and extreme season classifications.
How can this data be used in disease modelling?
The CHIRPS data can be used in many malaria applications:
Turn rainfall into a simple malaria-risk number, using a real formula from the research literature
Watch mosquito numbers rise and fall, month by month, as rainfall changes
Flag risky rainy seasons early, before the malaria season is in full swing
Preparing the data
This file has the year-by-year rainfall totals behind the Visualisations tab. We keep using Tete Province as our example, for three reasons:
Malaria is a severe and persistent regional problem. Malaria cases in Tete increased by 12% from 725,745 cases in 2019 to 812,239 in 2020 (Afai et al., 2022). Furthermore, national survey data reveals significant community-level intervention gaps—only 46% of women of reproductive age in Tete have complete knowledge of malaria symptoms, transmission, and prevention (Afai et al., 2022). It is a high-burden, highly relevant setting without being Mozambique’s single most extreme high-transmission outlier, making it a fair, typical baseline for regional modeling.
It sits at a critical cross-border transmission corridor. Tete shares borders with Zambia, Zimbabwe, and Malawi—key partner nations in the Elimination 8 (E8) regional initiative. High-risk frontier districts like Mágoe (which recorded 27 cases per 1,000 residents in 2019) and Zumbo directly border Zimbabwe and Zambia, and local health posts frequently treat cross-border populations (Afai et al., 2022). What we model here directly informs cross-border transmission dynamics.
Almost all rain falls within a single wet season from November to March, while annual totals fluctuate dramatically between under 600 mm and over 1,300 mm. Significant intra-provincial variation exists—with some districts receiving nearly double the rainfall of neighboring districts in the same year—illustrating why district-level environmental data is essential over regional averages.
For the ideas below, we only need the typical month-by-month pattern - twelve numbers, one per month, for Tete Province.
Show the code
tete_rainfall <- read_csv("data/PRCPTOT_annual_CHIRPS-3.0-0p05-rnl_198101-202512_TeteProvince.csv")
# Typical month-by-month rainfall for Tete Province. These twelve values are
# illustrative stand-ins with the right seasonal shape - replace them with the
# real 1991-2020 monthly means extracted from CHIRPS.
tete_climatology <- tibble(
month = factor(month.abb, levels = month.abb),
rainfall_mm = c(140, 160, 90, 20, 5, 2, 1, 1, 3, 15, 55, 120)
)
tete_climatology |>
ggplot(aes(x = month, y = rainfall_mm)) +
geom_col(fill = theme_health_radar_colours[1]) +
theme_health_radar() +
labs(x = "", y = "Rainfall (mm)",
caption = str_wrap("Almost all the rain falls between November and March. The rest of the year is close to dry. Everything below builds on this one simple pattern. Source: CHIRPS v3.", width = 100))Turn rainfall into a simple malaria-risk number
Researchers have built a simple formula for malaria risk that goes back to a classic 1956 idea from Macdonald, later combined with satellite rainfall to watch for malaria risk across Africa (Ceccato et al., 2012). The formula asks three questions: how many mosquitoes are there, how often do they bite, and how many live long enough to pass on the parasite. When temperature stays fairly steady, the answer moves up and down with rainfall alone.
It also matters how the rain arrives, not just how much falls. Many malaria models guess the shape of the wet season with a smooth wave that rises and falls evenly through the year. Real rainfall does not behave that way - it arrives fast, stays high for a short time, then fades away slowly. Studies linking rainfall to malaria (for example in South Africa) have shown that real rainfall data can be used in place of that guessed wave, so below we compare the two directly, using the same total rainfall for both, to see what the shape alone changes.
Show the code
# A simple version of the risk formula used by Ceccato et al. (2012).
# Temperature is held at a typical value (26 degrees)
malaria_risk <- function(rainfall_mm, temp_c = 26) {
cycle_days <- 36.5 / (temp_c + 2 - 9.9) + 0.5 # days between mosquito blood meals
bites_per_day <- 0.7 / cycle_days
daily_survival <- 0.5^(1 / cycle_days)
parasite_days <- 111 / ((2 * (36.5 / (temp_c + 2 - 9.9)) / cycle_days) + temp_c - 18)
mosquitoes <- 10 * rainfall_mm
-(mosquitoes * bites_per_day^2) * daily_survival^parasite_days / log(daily_survival)
}
# A guessed smooth wave carrying the exact same total rainfall over the year,
# so the only difference from real rainfall is shape, not amount.
guessed_wave_mm <- mean(tete_climatology$rainfall_mm) * (1 + cos(2*pi*(1:12 - 2)/12))
tibble(
month = tete_climatology$month,
`Real rainfall` = malaria_risk(tete_climatology$rainfall_mm),
`Guessed smooth wave` = malaria_risk(guessed_wave_mm)
) |>
pivot_longer(-month, names_to = "series", values_to = "risk") |>
ggplot(aes(x = month, y = risk, colour = series, group = series)) +
geom_line(linewidth = 1) +
geom_point() +
theme_health_radar() +
scale_colour_manual_health_radar() +
labs(x = "", y = "Malaria-risk number", colour = "",
caption = str_wrap("Both curves carry the exact same amount of rain over the year - only the shape differs. Because real rainfall arrives in a short, sharp burst rather than spread evenly, it drives about a third more risk at the peak of the season than a guessed smooth wave would suggest.", width = 100))Why mosquitoes outlast the rain
Mosquito numbers don’t jump up the moment it rains - puddles need to fill, and larvae need time to grow into adults. Rainfall-driven mosquito models, including ones built for western Kenya, add exactly this kind of delay. A simple way to show it: each month, mosquito numbers move only part-way towards what that month’s rainfall can support, rather than getting there straight away.
Show the code
# Each month, mosquito numbers move part-way towards that month's rainfall-
# driven habitat, rather than reaching it immediately. adjust_speed = 0.4
# gives roughly a 1 to 3 month lag, in line with published studies.
habitat <- tete_climatology$rainfall_mm / max(tete_climatology$rainfall_mm)
adjust_speed <- 0.4
mosquito_path <- accumulate(rep(habitat, 4), ~ .x + adjust_speed * (.y - .x), .init = habitat[1])
tibble(
month = factor(rep(month.abb, 4), levels = month.abb),
`What rainfall allows` = rep(habitat, 4),
`Actual mosquito numbers` = tail(mosquito_path, 48)
) |>
slice_tail(n = 12) |>
pivot_longer(-month, names_to = "series", values_to = "value") |>
ggplot(aes(x = month, y = value, colour = series, group = series)) +
geom_line(linewidth = 1) +
geom_point() +
theme_health_radar() +
scale_colour_manual_health_radar() +
labs(x = "", y = "Relative to the peak", colour = "",
caption = str_wrap("Mosquito numbers rise more slowly than rainfall, and stay higher for longer after the rain has stopped. This matters for malaria: mosquitoes are often still around well after the rains end. Source: Model output.", width = 100))Flag risky rainy seasons early
Some rainy seasons bring much more rain than usual, and more rain can mean more mosquitoes and more malaria risk. Health teams can watch for these seasons as they happen, using a simple rule: compare this season’s rain to what usually falls at that time of year.
Show the code
# An illustrative wet-season pattern for a district like Macanga - not the
# real year-by-year record, but built to match the same pattern shown in
# the Visualisations tab: mostly near normal, with a few clearly wetter
# seasons. Replace with the real district record for operational use.
years <- 2016:2025
djf_mm <- c(520, 480, 610, 540, 720, 495, 505, 680, 460, 710)
threshold <- 650
tibble(year = years, djf_mm = djf_mm) |>
mutate(Flagged = djf_mm > threshold) |>
ggplot(aes(x = year, y = djf_mm)) +
geom_hline(yintercept = threshold, linetype = "dashed", colour = "grey40") +
geom_line(colour = "grey60") +
geom_point(aes(colour = Flagged), size = 3) +
theme_health_radar() +
scale_colour_manual_health_radar() +
scale_x_continuous(breaks = years) +
labs(x = "", y = "Dec-Feb rainfall (mm)",
title = "Three seasons out of ten crossed the line",
caption = str_wrap("An illustrative pattern for a wetter, more variable district like Macanga. The dashed line is the same threshold used in the Visualisations tab. Because CHIRPS updates every few days, a season crossing this line can be caught while it is still happening, not only once it is over. Source: Illustrative, matching the count reported in Fig. 3.", width = 100))Model assumptions
A few things are worth keeping in mind when using these ideas. Mosquito numbers do not respond to rain the very next day; there is a lag of a few weeks to a few months, which the mosquito-lag model above builds in, but the exact length of that lag is not known for certain, which is explored next. And because CHIRPS daily values are estimated from five-day totals, all of the ideas above work with monthly or seasonal rainfall, which is what they are better suited to.
Show the code
# Place each month's risk number in the middle of that calendar month, and
# let it wrap smoothly from December back to January - the same role
# mean_pf$time played on the Drug Efficacy page, just for rainfall instead
# of treatment failure.
mid_of_month <- c(15, 45, 74, 105, 135, 166, 196, 227, 258, 288, 319, 349)
risk <- malaria_risk(tete_climatology$rainfall_mm) / mean(malaria_risk(tete_climatology$rainfall_mm))
risk_function <- approxfun(c(mid_of_month[12] - 365, mid_of_month, mid_of_month[1] + 365),
c(risk[12], risk, risk[1]), rule = 2)
# CHIRPS has no treatment-failure data of its own - that lives on the
# Antimalarial Drug Efficacy page, fitted to real Zimbabwean trial results.
# Here, treatment failure is held at a single typical value instead of a
# fitted time series, since rainfall tells us nothing about drug efficacy.
pf_function <- function(times) rep(0.02, length(times))
# The exact model from the Antimalarial Drug Efficacy page.
seirs <- function(times, start, parameters, pf_function, risk_function) {
with(as.list(c(parameters, start)), {
P <- S + E + A + C + Tr + Tf + R + G
# Seasonality driven by rainfall risk, not a guessed cosine wave
seas.t <- risk_function(times %% 365)
# Force of infection
Infectious <- C + Tf + zeta_a * A + zeta_t * Tr
lambda <- ((a^2 * b * c * m * Infectious / P) /
(a * c * Infectious / P + mu_m) *
(gamma_m / (gamma_m + mu_m))) * seas.t
pf_t <- pf_function(times)
dS <- mu_h * P - lambda * S + rho * R - mu_h * S
dE <- lambda * S - (gamma_h + mu_h) * E
dA <- pa * gamma_h * E + pa * gamma_h * G + omega * C - (delta + mu_h) * A
dC <- (1 - pa) * gamma_h * E + (1 - pa) * gamma_h * G + sigma * Tf - (tau + omega + mu_h) * C
dTr <- tau * C - (r + mu_h) * Tr
dTf <- pf_t * r * Tr - (sigma + mu_h) * Tf
dR <- delta * A + (1 - pf_t) * r * Tr - (lambda + rho + mu_h) * R
dG <- lambda * R - (gamma_h + mu_h) * G
dCInc <- lambda * (S + R)
list(c(dS, dE, dA, dC, dTr, dTf, dR, dG, dCInc))
})
}
# Parameters reused directly from the Drug Efficacy page's model.
start <- c(S = 550000, E = 300000, A = 150000, C = 155000,
Tr = 80000, Tf = 20000, R = 200000, G = 155000, CInc = 0)
parameters <- c(a = 0.28, b = 0.3, c = 0.3, m = 3,
gamma_m = 1/10, mu_m = 1/12, mu_h = 1/(59*365),
gamma_h = 1/12, r = 1/7, rho = 1/365, delta = 1/150,
omega = 1/10, zeta_a = 0.2, zeta_t = 0.1, tau = 1/3,
sigma = 1/21, pa = 0.35)
times <- seq(0, 365 * 10, by = 1) # 10 years, daily steps
out <- ode(y = start, times = times, func = seirs, parms = parameters,
pf_function = pf_function, risk_function = risk_function)
df <- as_tibble(as.data.frame(out)) |>
mutate(Inc = c(0, diff(CInc)), date = ymd("2000-01-01") + time)
df |>
filter(date >= ymd("2008-01-01")) |>
ggplot(aes(x = date, y = Inc)) +
geom_line(colour = theme_health_radar_colours[1], linewidth = 1) +
theme_health_radar() +
labs(x = "", y = "Daily incident cases",
title = "Rainfall-driven malaria incidence (SEIRS)",
subtitle = "New cases generated using CHIRPS-based vectorial risk dynamics",
caption = str_wrap("Seasonality in the force of infection is driven by rainfall risk (Ceccato et al., 2012) rather than a smooth cosine wave. Treatment failure is held at a single typical value (2%), since CHIRPS has nothing to say about drug efficacy", width = 100))This is exactly why CHIRPS is best paired with other data rather than used alone: the seasonality driving this model is real, but the treatment side of it is a placeholder, not a measurement - swapping in real local treatment-failure data, the way the Drug Efficacy page does for Zimbabwe, is what would turn this from an illustration into an operational model.
Exploring uncertainty
We used a lag of a few months above, but studies do not agree on the exact number - estimates typically range from about one to three months. Instead of picking a single value, we try many different ones and look at the full range of outcomes, the same way the Antimalarial Drug Efficacy page tries many possible treatment-failure values.
Show the code
set.seed(123)
runs <- 40
adjust_speeds <- runif(runs, 0.15, 0.6) # roughly a 1 to 3 month lag
run_one <- function(speed) {
path <- accumulate(rep(habitat, 4), ~ .x + speed * (.y - .x), .init = habitat[1])
tail(path, 12)
}
sim_summary <- map_dfr(adjust_speeds, ~ tibble(month = 1:12, value = run_one(.x))) |>
group_by(month) |>
summarise(median = median(value), lower = quantile(value, 0.05), upper = quantile(value, 0.95), .groups = "drop")
sim_summary |>
ggplot(aes(x = month)) +
geom_ribbon(aes(ymin = lower, ymax = upper), fill = theme_health_radar_colours[12], alpha = 0.5) +
geom_line(aes(y = median), linewidth = 1) +
scale_x_continuous(breaks = 1:12, labels = month.abb) +
theme_health_radar() +
labs(x = "", y = "Mosquito numbers (relative to peak)",
title = "How much does the lag matter?",
subtitle = "Shaded area shows the range across 40 runs, from a 1 to 3 month lag",
caption = str_wrap("Whatever the exact lag, mosquito numbers stay clearly elevated into April. The range is widest around the wet season, when the exact lag changes the numbers the most, and narrowest by the middle of the dry season, when numbers are low either way. Source: Model output.", width = 100))Policy implications
A rainfall-only risk number is not a full forecast, but it is fast: CHIRPS Prelim is ready within two days of the end of each five-day period, so the risk number and the season-flagging check above can both run while the season is still unfolding, not only once it has passed. Because real rainfall rises and fades unevenly, a season-readiness plan built on a guessed smooth wave risks starting too late or stopping too early, understating peak-season risk by around a third. Because mosquitoes lag behind the rain, and the simulated cases above lag mosquito numbers again, control activities timed only to the rains themselves may finish well before the disease actually does - planning for at least a month or two of continued risk after the rains stop is the safer assumption. And because temperature can suppress cases almost entirely even where rainfall looks identical, a rainfall-only warning system needs a temperature partner before it is used to decide where, not just when, to act.
Further reading
- Ceccato P, et al. A vectorial capacity product to monitor changing malaria transmission potential in epidemic regions of Africa. J Trop Med. 2012. pmc.ncbi.nlm.nih.gov/articles/PMC3272826
- Beloconi A, et al. Malaria, climate variability, and interventions: modelling transmission dynamics. Sci Rep. 2023. nature.com/articles/s41598-023-33868-8
- Silal SP. Modeling the relationship between precipitation and malaria incidence in Mpumalanga, South Africa. ncbi.nlm.nih.gov/pmc/articles/PMC3472636











