Data and methods

What the tables hold, how far they can be trusted, and how to use them in a model

Published

29 September 2026

This page is for anyone using the data in an analysis. The overview is the short version. The column definitions are in dictionary.md.

The tables

File One row is Rows Use it for
facility_events.csv one thing one report says about one facility 1,895 anything that should respect what was known when
facilities.csv one facility, with dates derived from its events 604 a register of sites; a join key
facility_opening.csv one facility, with the interval its opening falls in 604 opening dates, with their censoring
capacity_indicators.csv one figure: an indicator, a place, a date, a source 2,280 system bed capacity and occupancy over time

Every row in the first and last tables carries the sentence or table row it came from, in evidence_quote, and the report it came from. Read the quote before relying on a row.

Loading, in R:

library(data.table)
base <- "https://raw.githubusercontent.com/epiforecasts/bvd-capacity/main/data/"
events <- fread(paste0(base, "facility_events.csv"))
opening <- fread(paste0(base, "facility_opening.csv"))
capacity <- fread(paste0(base, "capacity_indicators.csv"))

# The national bed series a model should use: DRC only, one figure a key
beds <- capacity[country == "Democratic Republic of the Congo" &
    indicator == "beds_capacity" & level == "national" & preferred]

Pin a commit rather than main for anything you publish: ids change as naming decisions land.

Reports read

Bar chart of reports per week, mostly six or seven a week from late May to mid-September.
Figure 1: Situation reports read, by week. Seven SitRep numbers were never published; a facility first mentioned just after a gap may have been open earlier.

116 reports, SitReps 001 to 122, from 14 May to 13 September. Missing numbers: 003, 029, 043, 045, 063, 075, 076. 006_v2 is a reissue kept as its own report.

From sentences to facilities

Events What the report gave
1,604 named, resolved to a facility id
178 a site described but not named
113 a name that could be several sites

A language model (gemini-3.1-pro, low thinking, one call a report) reads each report and returns events in a fixed vocabulary, each with a quote. A quote that is not a character-for-character span of the report is dropped; 2 events are dropped this way and listed in checks/rejected_events.csv. Names are then keyed and matched to a hand-maintained vocabulary of spellings.

Code cannot tell a misspelling from a second centre at the same hospital, so where two names might be one site they stay apart and are flagged. A person settles each question and the answer is recorded with who decided and why.

Decision Decided by Questions
looked at, left open kathsherratt 3
kept apart, deliberately kathsherratt 5
merged into one facility kathsherratt 14
merged into one facility claude-code 5

claude-code decisions were made by the assistant that built the pipeline from GRID3 names and spelling evidence, and nobody who knows the sites has checked them. 9 questions have evidence sheets in checks/decisions/ and are unanswered. Until they are, facility counts are an upper bound: the error runs towards counting one site twice, never towards merging two.

Opening dates

The reports almost never give an opening date. An opening is inferred from two kinds of report: one showing a site being built or planned (it had not opened by then) and one showing it open or holding patients (it had opened by then).

Kind of site bounded left censored right censored uninformative
Hospital isolation 1 80 1 1
Isolation centre (CI) 0 8 9 4
Transit centre (CT) 0 33 2 1
Treatment centre (CTE) 13 49 7 1

bounded is a site seen building and later seen open, so both ends of its opening are known. left censored is first seen already open: the opening is at or before that date and nothing earlier is known. right censored was seen building and never seen open. For most sites the only honest statement is “open by this date”.

Timeline of about seventy treatment centres ordered by opening. Most are single dots; thirteen have short segments of a few days.
Figure 2: Treatment centres: the interval each opening falls in. A segment runs from the last report showing the centre not yet open to the first showing it open. A lone dot is left censored: open by then, earlier unknown. An open circle was never seen open, and sits at the last report showing it not yet open.

A date in these tables is the date a report said something, not the date it happened. For a model of when capacity came online, treat opened_by as an upper bound on the opening and model the delay from opening to first mention.

The capacity series

capacity_indicators.csv has a fixed vocabulary of ten indicators. The INSP situation reports carry bed tables until early August; WHO AFRO’s weekly reports carry national and province figures from late June. Where they overlap the two can be checked against each other.

Dot matrix of indicators against date, coloured by source.
Figure 3: Which indicators each source gives, when, at national or province level. One mark a figure.

When a report gives two figures

A report sometimes gives two different figures for the same indicator, place and date. Every figure stays in the table. The column preferred marks the one a series should use, chosen by these rules in order, decided by Kath Sherratt on 26 September 2026 and recorded in registry/capacity_decisions.csv:

  1. “Increased from A to B”: B is current; A belongs to the week before.
  2. Where the report states a numerator and denominator, the occupancy consistent with them is preferred over a printed percentage that contradicts them. Where no beds-occupied figure is printed, patients in isolation stands in as the numerator.
  3. Otherwise the headline figure box beats a narrative sentence.
Indicator Settled by Figures
bed_occupancy_pct 2: numerator and denominator 4
beds_capacity 1: from A to B 2
beds_capacity 3: headline box 2
deaths_in_facility 1: from A to B 2
discharges_recovered 3: headline box 2
escapes not settled 2
facilities_operational read by hand 2
facilities_operational 1: from A to B 2
laboratories_testing 1: from A to B 6
patients_in_isolation read by hand 3

A key with no preferred figure is one the rules could not settle; it is listed in checks/capacity_conflicts.csv and left out of any series.

INSP against WHO AFRO

Two panels comparing INSP and WHO AFRO national figures over the weeks both report.
Figure 4: Patients in isolation and bed occupancy, national, where both sources give a figure. INSP is daily, WHO AFRO weekly.
Indicator Pairs Median INSP / AFRO Middle 80 %
admissions 2 0.98 0.96 to 1.00
bed_occupancy_pct 41 1.00 0.90 to 1.12
beds_capacity 15 1.00 0.95 to 1.08
discharges_recovered 7 0.67 0.22 to 1.13
patients_in_isolation 59 1.00 0.68 to 1.08

Each INSP daily figure is paired with any WHO AFRO figure for the same indicator within three days, so part of the spread is a day’s change rather than disagreement. Stock figures (beds, occupancy, patients in isolation) agree to within a few per cent at the median. Discharges do not: WHO AFRO’s cumulative recoveries and INSP’s daily Sorties Guéris are not the same count, and should not be joined.

The close agreement is not independent confirmation. WHO AFRO’s DRC figures are most likely compiled from the same national data INSP publishes, so the two sources agree because they share an origin. What the overlap does show is that the series can be spliced: INSP to early August, WHO AFRO after, with no step at the join.

INSP against BVDOutbreakSize

Quantity Cells Agree Second read only
admissions 150 150 0
bed_occupancy_pct 124 124 9
beds_capacity 44 44 0
deaths_in_facility 147 147 147
discharges_recovered 120 120 120
patients_in_isolation 152 152 0

BVDOutbreakSize reads the same INSP province tables twice, a scan and a blind read, for its treatment model. R/33_compare_bos.R joins those reads to this repository’s on SitRep and province, SitReps 018 to 080. Unlike WHO AFRO, these are separate reads of one printed table, so agreement here is a check on the reading, not on the source. “Second read only” counts cells where BVDOutbreakSize has only its blind read, for which this repository is the second. Escapes and patients in a bed have no counterpart there. The comparison records the BVDOutbreakSize commit it ran against, 126d07fb.

Before using this in a model

  • Filter on country. The WHO AFRO rows include Uganda, and 10 rows have no country.
  • Use preferred. Without it a national series double-counts dates where a report printed two figures.
  • Occupancy above 100 % is printed by WHO AFRO for Nord-Kivu in several weeks. It is kept as printed; the reports do not say what it counts.
  • Absence is not zero. A figure a report did not print is missing, never 0.
  • Facility counts are an upper bound until the open naming questions are settled.
  • Facility bed counts are sparse: 25 facilities have one, because the INSP facility bed table stops after SitRep
  • 291 events describe a site without a usable name. They are in facility_events.csv with an empty facility_id and absent from every per-facility table.

Sources and citation

Institut National de Santé Publique, DRC (2026), situation reports on the 17th Ebola virus disease epidemic, https://insp.cd/ebola-17eme-epidemie/, via the corpus in bvd-sitreps. WHO Regional Office for Africa weekly situation reports, CC BY-NC-SA 3.0 IGO. GRID3 COD Health Facilities v8.0, CC BY 4.0, doi:10.7916/f1ft-y872.

Cite the report a figure came from. If you relied on the facility identities or opening intervals, also cite bvd-capacity.