# Nigeria State-Level TB Incidence and Case-Detection Gap, 2023
The first **state-level (sub-national) tuberculosis incidence** estimates for Nigeria,
with an explicit estimate of the **undetected fraction** in each state — a layer
that neither WHO nor the NTBLCP publishes. Written entirely in **R**; every figure
and number is reproduced from public sources by the scripts here.
## Headline
Against WHO's 2023 national estimate of **499,000 incident TB cases**
(95% UI 326,000–709,000), **371,019 were notified (74%)** and roughly **a quarter went
undetected**. The undetected burden concentrates in the deprived, under-served
**North-West and North-East** (Jigawa, Kano, Katsina, Bauchi, Borno, Kebbi). The same
high notifications mean opposite things in different states — a barely-caught epidemic
in Sokoto versus a well-run programme in Lagos — so the estimates are framed as a
**policy typology** (invest in case-finding / sustain / audit the data).
**These are model-based estimates, not measurements.** Nigeria has no sub-national TB
prevalence survey, so the incidence/detection split cannot be identified from data
alone. Uncertainty is propagated honestly (per-state 95% intervals dominated by WHO's
national uncertainty); the ranking is robust, individual absolute values are ranges.
## What the model does
Notifications = incidence × detection (one equation, two unknowns). We triangulate a
**structural-risk** estimate (incidence tracks deprivation/undernutrition) with a
**detection-adjusted** estimate (case-finding tracks GeneXpert access), benchmark to
the WHO national total, and propagate WHO's national uncertainty plus parameter
uncertainty through a **3,000-draw Monte Carlo**.
## Reproduce
```r
# install once
install.packages(c("sf","ggplot2","rnaturalearth","rnaturalearthdata",
"viridis","patchwork","ggspatial","exactextractr","terra","pdftools"))
# run in order (each writes to data/)
for (f in sprintf("analysis/%02d_*.R", 1:12)) source(Sys.glob(f))
```
| Scr …