Skip to content
Status: Planned

LGU Lights

Poverty estimates for every Philippine city and municipality from night lights and vegetation, built on my published research.

Demo when live

Screenshot when it goes live.

Problem

Official poverty estimates for the Philippines’ 1,600+ cities and municipalities come from the Philippine Statistics Authority’s small-area estimates, released every few years (2012, 2015, 2018, 2021, 2023). Between releases, and after the latest one, there is no municipal number. Most earlier satellite-based work for the country is cross-sectional: one map for one year.

Approach

  • Features: yearly statistics per city and municipality from VIIRS night-time lights and vegetation indices (MODIS NDVI), computed in Google Earth Engine and cross-checked with an independent zonal-statistics run.
  • Labels: the PSA small-area estimates, with the standard error each one publishes, joined on the official geographic code. Models use the VIIRS era, 2012–2023; the 2006 and 2009 rounds are shown as history only.
  • Model: the recurrent network (GRU) from my published research, compared with area-level and gradient-boosting models in leave-year-out backtests. Training runs offline in GitHub Actions; the Rust core runs the trained weights.
  • In the browser: the same Rust core, compiled to WebAssembly, recomputes a municipality instantly for “what if” sliders, which are labelled as hypothetical.
  • Uncertainty first: official estimates are shown with their intervals beside the model and its backtest error. The few labelled years per municipality and the 2018 methodology change are stated, not hidden.
  • Languages: English and Japanese, with captions first.

Paper link: coming soon.

Architecture

Standard pattern: a hexagonal (ports and adapters) core with materialised read models, delivered as a static Jamstack site. Customisations: one Rust core with three driving adapters (a command-line tool in GitHub Actions, WebAssembly in the browser, and a Rust API on Cloudflare Workers), so every number is computed by the same code; the map tiles and per-municipality files are prebuilt and served from GitHub Pages, with a Hugging Face fallback.

  1. 01 · Sources

    • VIIRS night lights
    • MODIS NDVI
    • PSA small-area estimates
    • Municipal boundaries
  2. 02 · Pipeline

    • Earth Engine zonal statistics
    • GitHub Actions, offline training
  3. 03 · Rust core

    • Command-line build of read models
    • Map tiles + per-municipality files
  4. 04 · Serving

    • Static map (MapLibre GL)
    • WebAssembly what-if
    • Cloudflare Worker API
LGU Lights data flow (decided, not built yet). Dashed boxes are external sources; the outlined box is what visitors use.

Where it stands

Planned. The architecture is decided, and a one-day measurement spike checked it with real numbers (tile sizes, WebAssembly speed, the Worker’s size), adjusting the tile layout on the way. There is no app yet; building is next.

Known limitations, stated up front: only a few labelled years per municipality in the VIIRS era (2012, 2015, 2018, 2021, 2023), so the model is trained on a panel and says so; and the PSA changed its method in 2018 and some boundaries have changed since, so years are not strictly comparable.