
Data
Every number on the site, downloadable
Research prototype: not for health or regulatory decisions.
Files
What you can download
- Model summary5 KB/data/summary.json
Map models, their inputs, fit-to-target scores, grid bounds, windows and station locations.
models.{id}.test_metrics.{no2,o3}.{r2,rmse,mae}; feature_columns; bbox; train_window; test_window; forecast_window; stations[]; model_version; units
- Grid cells113 KB/data/cells.geojson
The 348 grid cells as polygons.
properties.grid_id, row, col, center_lat, center_lon
- Backtest, LSTM1.4 MB/data/backtest/improved.json
Hourly predictions and training-target values for January–March 2026 at the 10 cells with both targets. Also linear.json, rf.json, xgboost.json.
rows[].{grid_id, t (UTC, the hour predicted), no2_true, no2_pred, o3_true, o3_pred} in µg/m³
- /data/cell_metrics/improved.json
Fit-to-target R², RMSE and MAE per cell. One file per model.
metrics[].{grid_id, n_no2, n_o3, r2_no2, rmse_no2, mae_no2, r2_o3, rmse_o3, mae_o3}
- /data/forecast/improved/daily.json
Daily mean of the next-hour estimates for every cell, April 1 to October 5, 2026. One folder per model (improved = LSTM).
days[]; cells[].{grid_id, no2[], o3[]} in µg/m³
- /data/forecast/improved/cells/R0026_C0003.json
Hourly next-hour estimates for one cell (4,512 hours; each value is for the hour it is stamped with). One file per cell per model.
start (UTC), step_hours, count, no2[], o3[] in µg/m³
- EPA check results53 KB/data/validation/atlas.json
Every EPA-check score by configuration, model and cell, with persistence; site locations; Taylor statistics; dataset coverage.
no2.configs[]; o3; models.{deployed,best}; aqs_sites[]; detail.{taylor,cells}; alignment_fix[]; unmonitored_check
- /data/validation/nowcast_skill.json
Next-hour estimates for April 1 – October 5, 2026 scored against EPA/AirNow readings per site and month, with persistence and climatology on the same hours.
pollutants.{no2,o3}.{avg_cell, pooled, per_cell, monthly}.{lstm, linear, rf, xgboost, persistence, climatology}; excluded_cells; lstm_beats_persistence_cells
| File | Size | What it holds | Main fields |
|---|---|---|---|
| Model summary /data/summary.json | 5 KB | Map models, their inputs, fit-to-target scores, grid bounds, windows and station locations. | models.{id}.test_metrics.{no2,o3}.{r2,rmse,mae}; feature_columns; bbox; train_window; test_window; forecast_window; stations[]; model_version; units |
| Grid cells /data/cells.geojson | 113 KB | The 348 grid cells as polygons. | properties.grid_id, row, col, center_lat, center_lon |
| Backtest, LSTM /data/backtest/improved.json | 1.4 MB | Hourly predictions and training-target values for January–March 2026 at the 10 cells with both targets. Also linear.json, rf.json, xgboost.json. | rows[].{grid_id, t (UTC, the hour predicted), no2_true, no2_pred, o3_true, o3_pred} in µg/m³ |
| Backtest error per cell, LSTM /data/cell_metrics/improved.json | 2 KB | Fit-to-target R², RMSE and MAE per cell. One file per model. | metrics[].{grid_id, n_no2, n_o3, r2_no2, rmse_no2, mae_no2, r2_o3, rmse_o3, mae_o3} |
| Next-hour estimates, daily means, LSTM /data/forecast/improved/daily.json | 724 KB | Daily mean of the next-hour estimates for every cell, April 1 to October 5, 2026. One folder per model (improved = LSTM). | days[]; cells[].{grid_id, no2[], o3[]} in µg/m³ |
| Next-hour estimates, hourly, one cell /data/forecast/improved/cells/R0026_C0003.json | 47 KB | Hourly next-hour estimates for one cell (4,512 hours; each value is for the hour it is stamped with). One file per cell per model. | start (UTC), step_hours, count, no2[], o3[] in µg/m³ |
| EPA check results /data/validation/atlas.json | 53 KB | Every EPA-check score by configuration, model and cell, with persistence; site locations; Taylor statistics; dataset coverage. | no2.configs[]; o3; models.{deployed,best}; aqs_sites[]; detail.{taylor,cells}; alignment_fix[]; unmonitored_check |
| EPA check on new data, April–October /data/validation/nowcast_skill.json | 25 KB | Next-hour estimates for April 1 – October 5, 2026 scored against EPA/AirNow readings per site and month, with persistence and climatology on the same hours. | pollutants.{no2,o3}.{avg_cell, pooled, per_cell, monthly}.{lstm, linear, rf, xgboost, persistence, climatology}; excluded_cells; lstm_beats_persistence_cells |
Using it
Before you use the numbers
- These are model estimates from a research prototype, not measurements and not official air quality data.
- Check each number's kind of evidence on the validation page. Skill has only been shown near monitors.
- Every estimate is for the next hour from the latest readings; there is no multi-day forecast.
- In the backtest files, the “true” values are the model's , not independent measurements.
Cite
Chivukula, S., Friberg, M. D., & Delgado, R. (2026). Protecting our Great Water: LSTM estimates of NO₂ and O₃ over the Chesapeake Bay, checked against EPA AQS monitors [Software and data]. https://protectingourgreatwater.com
Source data
- Pandora · Pandonia Global Network (NASA / ESA)
- AERONET · NASA Goddard
- EPA AQS · U.S. Environmental Protection Agency
- TEMPO · NASA / Smithsonian Astrophysical Observatory
- TROPOMI · ESA / Copernicus Sentinel-5P
- VIIRS · NASA / NOAA
- ERA5 · ECMWF / Copernicus Climate Change Service
- AirNow · U.S. EPA (preliminary readings for April–October 2026, used as model inputs and to check the estimates)
Changelog
What changed, and when
- Added a second EPA check on new data: next-hour estimates for April 1 – October 5, 2026, scored against EPA and AirNow readings. The LSTM beats persistence for both pollutants.
- Replaced the April–December forecast, which rolled the model forward for months with no new readings and fell below a seasonal-average baseline after the first day, with those next-hour estimates.
- Added a contact address and licenses (MIT for code, CC BY 4.0 for data).
- EPA-check wording corrected: the scored monitors' earlier readings are part of training, so the check tests a new time period, not a new place.
- Monitors are now labelled with EPA's own site names (e.g. Lake Montebello, Baltimore); several earlier labels were wrong. Six AERONET station positions on the map were corrected to the coordinates in their data files.
- Added the original model with a per-site statistical calibration to the validation story (fit on 2018–2025, scored on Jan–Mar 2026).
- EPA-check scores corrected for a one-hour misalignment between predictions and monitor readings, which had inflated every model that used EPA inputs.
- Map switched to the best validated run, o3_surface_v1 (surface O₃ in µg/m³ instead of a Dobson-unit column).
- Backtest timestamps shifted to the hour predicted (they were one hour early).
- Retired the earlier P_A_V and Full model data.
- Map moved to the boundary-layer- and land-use-aware model (extended_v2_lur_only).