Uncertainty · What the instrument knows about itself

The error bars, and the ideas that did not survive

Every figure here is read at build time from the same file the map's readout uses. If the model is re-fitted, this page changes with it — it cannot be more flattering than the instrument.

The platform provides planning-grade estimates based on open data and simplified physical models. Outputs are intended for scenario exploration and prioritisation, not certified engineering, legal, or medical decision-making.

Ward-level surface temperature

Scored out-of-sample against ECOSTRESS thermal overpasses, leave-one-overpass-out. The ceiling is what a perfect model of this kind could reach given the observation's own noise; the band is the model's error rounded up to the nearest 0.5 K and is what the map shows.

PhaseScenesModel RMSECeilingBand shownTier
Night (22:00) 50 2.93 K 2.233 K ±3.5 K quantitative
Daytime peak (13:00) 29 4.42 K 3.338 K ±4.5 K indicative

Night — Night surface temperature tracks air temperature closely, and the model now reproduces the nocturnal heat island rather than inverting it — the modelled surface sits above air as measured (bias +0.18 K; the previous structure was −1.54 K, i.e. the wrong side of air entirely). 2.93 K against a 2.233 K ceiling, over 50 ward-scenes. The displayed band is +/-3.5 K because it must cover the leave-one-overpass-out error of 3.102 K, not the in-sample fit.

Peak — Daytime is indicative only. Surface temperature at noon depends on local insolation, cloud timing and soil moisture that 50 km reanalysis forcing cannot resolve — no model on this data does better than ±3.3 K. Ours is 4.42 K, so unlike the night view it is NOT at that limit and the daytime structure is still incomplete. Use the night view for quantitative comparison.

For scale: published continental land-surface products sit at 2.3–2.7 K (Good 2015) and global 1 km daily products at 1.7–2.4 K by continent (Zhang et al. 2022). The honest ceiling for daily, station-independent surface temperature from satellite is roughly 2–3 K. These bands are at that level, achieved at ward scale.

The pattern inside a ward

Ward-level temperature is calibrated against ECOSTRESS. The pattern WITHIN a ward is not: block by block it scores r = 0.30, still below the r = 0.31 of a vegetation map given the same treatment, and coarsening the comparison does not close that gap at any scale. At neighbourhood scale (~300-500 m) it reaches r = 0.5. The colour range inside a ward is also about 1.2x wider than the satellite measures, so read contrasts as exaggerated. Ward figures are measured, neighbourhood contrast is indicative, block-by-block detail is illustrative.

MeasureValueMeaning
Ward-scenes scored873 wards × near-nadir scenes after cloud and QC masking
r, shipped field vs ECOSTRESS0.297within-ward correlation of the modelled pattern
r, vegetation map alone0.313the null — and it still wins
Amplitude ratio1.17the map's within-ward colour range is this much wider than ECOSTRESS measures
Anomaly RMSE1.59 Kerror once ward-mean bias is removed

So: the ward-level number is calibrated; the placement of heat inside a ward is not yet better than a vegetation map. That is stated on the map itself, and it is why the two hypotheses below were tested.

Two hypotheses, pre-registered, both rejected

The solver is two-dimensional — sun and kRad are scalars, so building geometry cannot enter it. Two ways of letting it in were tested with the direction of the expected effect written down before any number was computed. Both failed, and both are published here rather than buried.

Sky-view factor

Prediction: enclosed cells radiate less to the sky, so the model — which assumes an open sky everywhere — should over-cool them. Expected corr(SVF, model − obs) > 0 at night.

PhaseScenesMean r% positivepVerdict
night50-0.5140%1.8 × 10⁻15REJECTED: significant, WRONG SIGN
day37-0.5053%5.5 × 10⁻10REJECTED: significant, WRONG SIGN

Rejected with the wrong sign, unanimously. The physical reason: SVF is collinear with built fraction, which the model already carries, so it has no independent variance left to explain. (An earlier draft quoted an SVF range for these wards here; the sign-test artefact records only the per-scene spread, not the level, so the figure had no source and has been removed rather than left standing.)

Building shadow

Prediction: shaded cells receive less beam, so the model — which assumes full sun everywhere — should over-heat them. Expected corr(shade, model − obs) > 0 by day. A placebo arm was pre-registered alongside: night scenes scored against the same geometry lit at local noon, when no sun was shining. A real shadow effect must be ~0 there.

ArmScenesMean r% positivepVerdict
day (the test)35+0.39594%3.7 × 10⁻8PASS — sign as pre-registered
night (placebo)45+0.23487%5.4 × 10⁻7CONFOUNDED: placebo fired

The pre-registered statistic passed — and the placebo fired, which voids it. A correlation with a shadow that was not there can only be building density. With built and vegetation regressed out, the day effect collapses to +0.070, p = 0.31. Shadow dies of the same collinearity as SVF. It is not the same kind of null, though: post-hoc, the partial correlation tracks building height across the three wards, as real shadow would — though on three points that is one-in-six by chance. The companion prediction, that the effect should strengthen at low sun, does not hold: across 35 day scenes spanning 9°–86° solar altitude the correlation between sun angle and the partial is +0.07, which is no relationship at all — underpowered, half-supported, and a falsifiable prediction for a taller city.

Building heights

Heights ship from a zonal statistic over each footprint. Independent validation against ICESat-2 returned the pre-registered verdict underpowered: 28 distinct buildings measured against a pre-registered minimum of 30, over 31 passes on 2 ground tracks. Below the bar, so nothing depending on validated heights ships as validated. Heights are not in the thermal physics today; they matter for the render and for the shadow work above.

Sources: src/scripts/climate-engine/accuracy.ts, data/calibration/svf-signtest.json, data/calibration/shadow-signtest.json. Machine-readable per ward at /api/wards/{id}/metadata.json.