UrbanLensIndia

Coverage-bias laboratory

Treating missing imagery as a missing-data problem

The project’s actual scientific contribution isn’t the vision model — it’s applying a rigorous missing-data framework to a question usually handled by reporting whatever imagery happens to exist.

Rubin’s missingness taxonomy

Rubin (1976) gives the canonical three-way split for why data might be missing. Which bucket coverage falls into determines whether a simple average of what’s photographed is a trustworthy city-level estimate.

MCAR

Missing Completely at Random

Whether a road segment has usable imagery is unrelated to anything, observed or not.

Very unlikely here. Contributors don't drive random roads with a camera mounted.

MAR

Missing at Random (conditional on observables)

Coverage depends on things we can measure and put in a model: road class, population density, nightlights, distance to city center.

The working assumption for the propensity model below — testable, not assumed to be true.

Systematic / MNAR

Missing Not at Random

Coverage depends on something unobserved that also affects the infrastructure attribute itself — e.g. informal settlements are both under-photographed and structurally different.

The scenario a reweighting correction cannot fully fix, and the masking experiment below is designed to probe for.

Propensity modeling

For every sampled road point, a propensity model estimates the probability that usable street-level imagery exists there, as a function of observable covariates: OSM road class, WorldPop population density, GHSL built-up/degree-of-urbanisation, VIIRS nightlight radiance, and distance from the city center. Fitted propensities feed two corrections downstream (see /infrastructure):

  • Inverse-probability weighting (IPW) — weight each covered point by 1 / propensity so under-photographed strata count more.
  • Post-stratification — bucket road points by covariate strata and reweight stratum means to match the full road-network universe, following Little (1993).

Both are standard survey-methodology tools (see Seaman & White, 2013 for the IPW misspecification caveat) applied here to a domain — crowdsourced street imagery coverage — where, per the literature review, no prior published work seems to have applied them.

The masking experiment

To test whether the correction actually works rather than just looking plausible, the design artificially masks additional imagery in a city with genuinely good coverage — using a known, controlled missingness mechanism — and checks whether the reweighted estimate recovers the true (fully-covered) value more closely than the naive one. A correction that only helps under the mechanism it was designed for, and fails under a systematic (MNAR-like) masking pattern, is itself a finding worth reporting, not a failure to hide.

Masking-experiment results

This run is real and complete — run it yourself with make bias-study. What’s real: the road network (9 cities, OpenStreetMap) and the covariates at every point (WorldPop population density, VIIRS nightlights, GHSL built-up surface). What’s simulated and labeled as such in the output file: the outcome (“infrastructure quality”) attached to each point, since no real infrastructure label exists yet, and the “fully covered” starting assumption, since real Mapillary coverage hasn’t been measured. The question this answers is narrower but real: if coverage is missing the way the MAR-like mask assumes, do the correction methods actually recover the true mean?

MCAR mask (coverage unrelated to covariates)

coverage 35.0% · 361,891 of 1,034,146 points · true mean 51.08

MethodEstimate% error vs. true
Naive (covered points only)51.060.05%
IPW — logistic propensity51.120.06%
IPW — gradient-boosted propensity51.270.36%
Post-stratification51.060.05%

MAR-like mask (coverage tied to density + road class)

coverage 35.0% · 362,247 of 1,034,146 points · true mean 51.08

MethodEstimate% error vs. true
Naive (covered points only)61.7520.89%
IPW — logistic propensity55.298.24%
IPW — gradient-boosted propensity52.252.29%
Post-stratification56.5910.78%

Source: data/results/masking_experiment_results.json, generated by src/bias/masking_experiment.py. Full design notes in docs/masking_experiment_design.md.

Propensity model on real coverage

Not yet measured

src/bias/propensity_model.py is written and tested, but fitting it to actual imagery coverage (rather than the masking experiment’s simulated missingness) requires the Mapillary coverage measurement in /coverage, which does not exist yet.

see docs/data_sources.md