Lab · Intermediate
Three ladders, three denominators
Write reference sheets for the JMP water, sanitation and hygiene service ladders, compute all three from one household survey, and discover that the three indicators cannot share a denominator.
The JMP service ladders look like categories. They are indicator definitions, and this lab is what happens when you treat them as such: write the reference sheet first, and the analysis becomes a transcription.
The catch is in the denominators. Three ladders, one survey, and the honest denominator is different for each — which means the three coverage figures on your dashboard cannot be added, averaged or compared to each other, and somebody will do all three.
The file
wash-household-survey-2024.v1.csv — 2,403 household interviews across three
districts and eighteen communities, covering water source, collection time,
quantity, point-of-collection testing, sanitation and hygiene. Synthetic, and it
carries a district name written four ways.
Set up first
An RStudio project, the file read-only, an outputs/ directory, and a script that
runs top to bottom from a clean session.
Part one: three reference sheets
Before any analysis, write a reference sheet for each of the three ladders, using
the thirteen fields from the course. Write them as data — one JSON or YAML file
per indicator in indicators/ — not as prose.
Each sheet must answer, at minimum:
- The numerator. Which ladder rungs count as the indicator, exactly. “Basic drinking water service” is an improved source with a round trip of 30 minutes or less, and a household on an improved source 45 minutes away is limited, not basic.
- The denominator. All households, all people, or the tested subsample — and the rule from the course decides it, not convenience.
- The exclusions, with counts.
- The decision informed. If two of your three sheets name the same decision, say why you need both indicators.
Part two: compute them from the sheets
Your script should read the sheets and produce the indicators, so that changing a threshold in a sheet changes the output without editing the analysis.
Four things stand in the way.
The district name. Three districts arrive as six. Normalise against an administrative list before grouping, and assert the level count afterwards.
Sanitation sharing. An improved facility shared between households is limited service, not basic. The column is there; forgetting it inflates basic sanitation.
Household size is missing for some households. Which matters for the person-level denominator and not for the household-level one — so the two indicators have different analysable samples, and both numbers must state their own n.
Water quality is tested on a subsample. Roughly a third of households have an E. coli result and about 40% a chlorine reading. Quality indicators run on the tested subsample and access indicators on the whole sample, and the column names must say which.
Part three: the denominator table
Produce one small table that is the actual deliverable of this lab.
| Indicator | Denominator | n | Value |
|---|---|---|---|
| Basic drinking water service | ? | ? | ? |
| Basic sanitation service | ? | ? | ? |
| Basic hygiene service | ? | ? | ? |
| Below Sphere 15 L/person/day | ? | ? | ? |
| E. coli detected at point of collection | ? | ? | ? |
Then write three sentences on why a reader must not compare row five to row one, and what would have to be true for the comparison to be legitimate.
What to hand in
An R script, sourced from a clean session, producing:
- three reference sheets in
indicators/, read by the script rather than duplicated in it - the denominator table above, with every cell filled and every n stated
- each of the three ladder distributions in full — not just the “basic” share, but every rung, because a ladder that only reports its top rung has thrown away the gradient it exists to show
- the same coverage figures computed at household level and at person level, side by side
Check your numbers
The dataset notes state what a correct analysis finds.
| Expected | |
|---|---|
| Below Sphere 15 L/person/day | about 13% |
| Round trip over 30 minutes | about 39% |
| Open defecation | about 13% |
| Basic hygiene service | about 34% |
If your district table has more than three rows, the normalisation did not run
before the grouping. If basic sanitation looks high, shared_sanitation is not
in your numerator rule.
The questions to answer in prose
Three sentences each.
1. Your three ladder indicators have different denominators. Name them, say which of the three would be wrong to publish as a single “WASH coverage” figure, and what you would publish instead.
2. About a quarter of households sit on limited water service because of collection time alone, on an improved source. Explain what a programme that reported on source alone would conclude, and which decision that error would send the wrong way.
3. The person-level and household-level figures differ by less than a point on this survey. Say why you would still report the person-level one against the Sphere standard, and describe a survey where the gap would be large.
How to know you are done
Delete outputs/, restart R, one source(), and every table regenerates
identically. Changing a threshold in a reference sheet changes the output without
any edit to the analysis script — if it does not, the sheet is documentation
rather than a definition.
What this lab is not
It is not WASH analysis. Why the ladders are built the way they are, what limited service means for health outcomes, and how the JMP arrives at national estimates belong with the WASH content. This lab is indicator design: definitions written before code, denominators chosen by rule rather than by convenience, and a table that tells a reader which of your numbers may be compared with which.