Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Tier V — Source population & forecasting

Forward model: thinned marked temporal point process (TMTPP) over emission events, with per-event marks drawn from Tier I–IV posteriors and per-event detection thinning by per-satellite POD models.

This tier sits above the per-event physics tiers. Tiers I–IV answer “what’s the emission rate from this plume right now?” — single overpass, single source. Tier V answers a different family of questions:

Inventory and forecasting are co-equal products of Tier V — not just totals. The inverted intensity λ(t)\lambda(t) directly powers operational forecasts (dispatch windows, occurrence probabilities); see Persistency.

Sub-pages:


TMTPP foundations — the three-term log-likelihood

The full population log-likelihood has three terms (derived in 06b; foundations in [daley2003,daleyVereJones2008]):

log⁡L  =  ∑i∈Dlog⁡p(detectedi∣f,λ,Pd)⏟mark contribution  +  ∑i∈Dlog⁡λ(ti)⏟detection-time intensity  −  ∫0Tλ(t)[∫Pd(Q) f(Q) dQ]dt⏟integrated thinned rate\log L \;=\; \underbrace{\sum_{i \in \mathcal{D}} \log p(\text{detected}_i \mid f, \lambda, P_d)}_{\text{mark contribution}} \;+\; \underbrace{\sum_{i \in \mathcal{D}} \log \lambda(t_i)}_{\text{detection-time intensity}} \;-\; \underbrace{\int_{0}^{T} \lambda(t) \left[ \int P_d(Q)\, f(Q)\, \mathrm{d}Q \right] \mathrm{d}t}_{\text{integrated thinned rate}}

The third term is what makes λ\lambda and PdP_d jointly identifiable — without it the two trade off.

Mark contribution and the soft-observation framing

The per-event posterior from Tiers I–IV is a soft observation of the (unknown) true mark QiQ_i. This is the same Bayesian-deconvolution / errors-in-variables structure used in measurement-error regression. The per-event mark contribution is:

p(detectedi∣f,λ,Pd)  =  ∫Pd(Q) Li(Q) f(Q) dQp(\text{detected}_i \mid f, \lambda, P_d) \;=\; \int P_d(Q)\, L_i(Q)\, f(Q)\, \mathrm{d}Q

where Li(Q)=p(observationi∣Q)L_i(Q) = p(\text{observation}_i \mid Q) is the per-event likelihood, not the posterior. In sample-based practice (per-event posterior samples Qi(s)∼p(Q∣observationi)Q_i^{(s)} \sim p(Q \mid \text{observation}_i)):

p(detectedi∣f,λ,Pd)  ≈  1S ∑s=1S Pd(Qi(s)) f(Qi(s))πper-event(Qi(s))p(\text{detected}_i \mid f, \lambda, P_d) \;\approx\; \frac{1}{S}\, \sum_{s=1}^{S}\, P_d(Q_i^{(s)})\, \frac{f(Q_i^{(s)})}{\pi_\text{per-event}(Q_i^{(s)})}

with πper-event(Q)\pi_\text{per-event}(Q) the per-event prior used at Tier I–IV. The ratio f/πper-eventf / \pi_\text{per-event} is the importance weight that re-points the per-event posterior at the population mark distribution.

This is the central math of cross-tier inference. Currently the prototype in plumax.population.fitting summarises per-event posteriors to point estimates before the population fit, side-stepping the importance correction. Formalising this is the v1 deliverable for 06_tier5a_instantaneous.md.


How the cycle adapts at population scale

The six-step cycle still applies, but the objects change:

Six-step cycle adaptation: Tier I–IV (per event) vs. Tier V (population).

StepTier I–IV (per event)Tier V (population)
1 — Simple modelForward physics (plume / PDE / RTM)Generative TMTPP: λ(t)\lambda(t) + mark f(Q)f(Q) + POD Pd(⋅)P_d(\cdot)
2 — Model-based inferenceMAP / MCMC over source paramsNumPyro NUTS over (λ params,mark params,POD params)(\lambda \text{ params}, \text{mark params}, \text{POD params}). Cheap at O(104)O(10^{4}) events (minutes); hours-to-days at O(106)O(10^{6}) events (national catalog)
3 — Model emulatorFNO / neural ODE on the PDESkip when NUTS fits in budget. Optionally a normalising flow over the population posterior for repeated re-fits or sensitivity studies
4 — Emulator-based inferencePDE-free 4D-VarVariational fit (numpyro.infer.SVI) or flow-based posterior approximation; required at national catalog scale
5 — Amortized predictorPer-overpass QQ predictor(basin tile,history window)→(\text{basin tile}, \text{history window}) \to posterior over (λ,f(Q),total mass,next-event time)(\lambda, f(Q), \text{total mass}, \text{next-event time}) conditioned on per-event evidence and met-region context
6 — ImproveBetter physicsSpatial point process (links to Tier III); multi-satellite fusion; varying-coefficient POD (per-(basin, season, scene class) hierarchy); non-Poisson clustering (Hawkes / Cox)

Tile definition: an H3 hex-resolution-7 cell (~5 km²) for sub-basin work, or a basin polygon for inventory accounting. History window: 30–365 days, hierarchical prior on the cutoff.

Varying-coefficient POD: PdP_d parameters indexed by (basin,season,scene class)(\text{basin}, \text{season}, \text{scene class}) with hierarchical shrinkage to the global POD. Captures regional / seasonal detection differences without inflating parameter count.


Cross-tier interface — the load-bearing contract

Payload schema

Every per-event posterior consumed by Tier V must carry:

Per-event posterior payload — fields, types, notes.

FieldTypeNotes
posterior_samples(S,) array of QQ drawsOR posterior_summary for Gaussian shorthand
posterior_summary(μlog⁡Q,σlog⁡Q)(\mu_{\log Q}, \sigma_{\log Q})lognormal quick form when full samples are too heavy
per_event_prior_logpdfcallable Q→log⁡π(Q)Q \to \log \pi(Q)required for the importance correction; without it the population fit is biased
instrument_idstrdispatch into per-instrument POD
t_detectionfloat (UTC seconds)for λ(t)\lambda(t)
x0_posterior(μxy,Σxy)(\boldsymbol{\mu}_{xy}, \boldsymbol{\Sigma}_{xy})for spatial Cox-process upgrade
qualitydictconfidence flags from the Tier I–IV quality bitmask

Independence assumption — the v1 caveat

The factorised likelihood above assumes detections at different overpasses are independent. Two overpasses of the same physical leak (e.g. GHGSat then TROPOMI two days later) violate this.


Validation strategy


Module layout

The formerly standalone methane_pod library (intensity and POD registries, missing-mass simulator, NUTS fitter) now lives in tree under plumax.population. Generic point-process machinery — compensators, thinning samplers, Hawkes, goodness-of-fit — is meant to come from xtremax.point_processes rather than be re-implemented here (#106); only the methane-domain primitives stay in plumax.

Tier V module layout — concern, target module, status.

ConcernModuleStatus
Intensity registry λ(t)\lambda(t)plumax.population.intensity (13 kernels)✓ in tree; xtremax generative layer ☐ #106
POD registry Pd(⋅)P_d(\cdot)plumax.population.pod (10 models)✓ in tree
Missing-mass MC simulatorplumax.population.paradox✓ in tree
NUTS fitterplumax.population.fitting (POD-modified power law)✓ in tree; importance-correction integration ☐ #108
Per-event posterior summariserplumax.population.catalog (PerEventPosterior.samples)☐ #107
Per-event prior recall (πper-event\pi_\text{per-event} lookup)plumax.population.catalog (PerEventPosterior.prior_logpdf)☐ #107 — required for importance weighting
Importance-weight calculatorplumax.population.importance☐ #108
Multi-satellite POD unionplumax.population.pod.pod_union☐ #110
Catalog schema (in-memory cross-tier)plumax.population.catalog (EmissionEvent / EmissionCatalog)🚧 — in-memory Gaussian-summary catalog landed; CSV / parquet ingest #111
Real-data CSV ingestionplumax.population.ingest☐ #111
Population SBC harnessplumax.population.validation☐ #114
Importance-weight ESS diagnosticplumax.population.importance.ess_report☐ #108
Per-event-prior swap-out testplumax.population.validation.prior_swap_test☐ #114
Spatial Cox-process extension (v2)plumax.population.spatial☐ v2 (temporal LGCP first: #115)

The plumax.population subpackage holds the v1 core (catalog, size_distribution, point_process) and the methane-domain primitives ported from the former methane_pod library (intensity, pod, paradox, fitting). The port is self-contained; the remaining part of #106 is to rebuild the generative machinery on a git-pinned dependency on xtremax.point_processes (which already covers intensities, compensators, thinning samplers, Hawkes, marked processes, a ThinningProcess whose retention function is exactly Pd(Q)P_d(Q), goodness-of-fit and survival / wait-time primitives). xtremax is not yet a declared dependency. The remaining rows are tracked under the Tier V epic #75.


Tier III’s distributed source field S(x,t)S(\mathbf{x},t) is exactly a spatial inhomogeneous Poisson rate at the population level — temporally aggregated, this is the spatial intensity of a Cox process over emission events. The v2 spatial extension of Tier V is the same mathematical object Tier III already inverts at the per-event timescale, just averaged over a longer horizon. The two tiers should share the parameterisation: a Matérn GP prior on log⁡S(x,t)\log S(\mathbf{x},t) plays the role of both Tier III’s source-field prior and Tier V.v2’s spatial Cox-process intensity.

This isn’t a coincidence — it’s why plumax’s tier structure works: the same mathematical objects appear at different scales.


Status snapshot


Open questions