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.
01 · Sources
- VIIRS night lights
- MODIS NDVI
- PSA small-area estimates
- Municipal boundaries
02 · Pipeline
- Earth Engine zonal statistics
- GitHub Actions, offline training
03 · Rust core
- Command-line build of read models
- Map tiles + per-municipality files
04 · Serving
- Static map (MapLibre GL)
- WebAssembly what-if
- Cloudflare Worker API
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.