Physics
Can this reading even be real?
Fine dust (PM2.5) is part of all dust (PM10), so it can never be bigger. A monitor that says otherwise, or repeats the same number for hours, is broken.
Formula and thresholds
Each hour fails if any of these is true:
- PM2.5 > 1.05 × PM10 (5% allowed for instrument noise)
- PM10 outside 1–2000 µg/m³, or PM2.5 outside 1–1500 µg/m³
- Stuck: the same PM2.5, PM10, NO2 or CO value for 3 or more hours in a row
Over the last 7 days (at least 24 hours with PM data): worth a look if more than 1% of hours fail, doesn't add up if more than 5% fail.
Uses PM2.5 and PM10.
Neighbours
Does it agree with the monitors around it?
Hour by hour, against the four nearest. Daytime air mixes, so some difference is normal; we only flag a monitor that drifts far more than the rest of the city.
Formula and thresholds
- Neighbours: the 4 nearest monitors with data within 12 km (great-circle distance). Monitors closer than 0.5 km are skipped, because they are twins on the same site.
- Hourly gap: g = ln(PM10 ÷ median PM10 of the neighbours), when at least 2 neighbours report that hour.
- Daily contrast: d = median g over 11:00–16:59, minus median g over 22:00–05:59 (at least 4 hours each). Its weekly value is the median d over the last 7 days.
- Mixing correction: by day, air mixes higher, so a monitor that reads high at night drifts towards its neighbours. We fit one Theil–Sen line of d against the night gap across the city, and score each monitor's distance from that line.
- Score: robust z = (residual − median) ÷ (1.4826 × MAD) across all monitors. Worth a look at |z| ≥ 2, doesn't add up at |z| ≥ 3.
- Two passes: monitors flagged in the first pass are taken out of everyone's reference and out of the city line in the second.
Uses PM10. Medians and MAD, not means and standard deviations, so one bad hour or one bad monitor can't move the reference.
History
Has it suddenly changed?
We compare the last 7 days with the 3 weeks before. A sudden jump against its own past means something changed at that monitor.
Formula and thresholds
- The same daily contrast d as Neighbours, for PM10 (log ratio) and for humidity (percentage points).
- Shift: median d over the last 7 days, minus median d over the 21 days before. This needs at least 4 recent days and 10 earlier days.
- Score: z = shift ÷ robust SD of the earlier 21 days, where robust SD = 1.4826 × MAD. Its floor is 0.02 for PM10 and 1 point for humidity, so a very steady monitor isn't flagged for a tiny change. The larger |z| of the two measures counts.
- Worth a look at |z| ≥ 2, doesn't add up at |z| ≥ 3.
Uses PM10 and humidity. A sudden humidity shift against the neighbours usually means something changed at the monitor itself, such as its inlet, its dryer or where it stands.
How the three checks become one answer
A monitor's answer is the most serious of its three checks. So a single check can flag a monitor, even one about humidity, and the monitor's card always names the check and the measure that raised it. Physics uses PM2.5 and PM10; Neighbours uses PM10; History uses PM10 and humidity.
The number you act on is PM2.5, the fine dust that health advice is based on. The checks lean on PM10 because the coarse dust it measures is what dust control and water spraying change the most.
When fewer than 2 neighbours, or too few days of data, are available, a check answers not enough data instead of guessing. A monitor gets that answer only if none of its checks can run.