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.B — Point process model (TMTPP)

Generative model: events arrive in time according to an intensity λ(t)\lambda(t), each carries a mark Q∼f(Q)Q \sim f(Q), and each is observed with probability Pd(Q;satellite)P_d(Q; \text{satellite}). The “thinned marked temporal point process” (TMTPP) is the mathematical object on which everything else at Tier V is built — see [daley2003,daleyVereJones2008] for foundations.

The full mathematical derivation lives in the TMTPP theory page. This page gives the architectural view: the components, their interfaces, and where they plug into the rest of plumax.


The three components

Temporal — λ(t)\lambda(t) (events / second)

The intensity function tells you how rapidly events arrive at time tt. Examples from the catalogue in 02_intensity_zoo.md:

λ(t)  =  λ0(homogeneous Poisson; baseline)\lambda(t) \;=\; \lambda_0 \qquad \text{(homogeneous Poisson; baseline)}
λ(t)  =  λ0+Asin⁡ ⁣(2πtTday+φ)(solar-heated tank cycles)\lambda(t) \;=\; \lambda_0 + A \sin\!\left(\frac{2\pi t}{T_\text{day}} + \varphi\right) \qquad \text{(solar-heated tank cycles)}
λ(t)  =  λ0⋅1[t>topen](valve fails open at known time)\lambda(t) \;=\; \lambda_0 \cdot \mathbb{1}[t > t_\text{open}] \qquad \text{(valve fails open at known time)}
λ(t)  =  λ0 exp⁡(−t/τ)(pressure-relief blowdown)\lambda(t) \;=\; \lambda_0\, \exp(-t/\tau) \qquad \text{(pressure-relief blowdown)}
λ(t)  =  μ+∑ti<tα exp⁡ ⁣(−β(t−ti))(Hawkes; self-exciting, event-driven clustering)\lambda(t) \;=\; \mu + \sum_{t_i < t} \alpha\, \exp\!\bigl(-\beta(t - t_i)\bigr) \qquad \text{(Hawkes; self-exciting, event-driven clustering)}
log⁡λ(t)  ∼  GP(μ,K)(log-Gaussian Cox process; environmentally-driven clustering)\log \lambda(t) \;\sim\; \mathcal{GP}(\mu, K) \qquad \text{(log-Gaussian Cox process; environmentally-driven clustering)}

13 deterministic kernels currently implemented in plumax.population.intensity (catalogued in the intensity zoo); LGCP is the v1.5 next kernel — it’s the natural model when clustering is environmental rather than self-exciting.

Each kernel is an equinox.Module exposing the same __call__(t) → λ and sample_priors() interface. Adding a new kernel is a one-file PR.

Marks — f(Q)f(Q) (probability density on kg/s)

The mark distribution gives the size of an event conditional on it happening.

Mark families — form and operational fit.

FamilyFormWhen to use
LognormalQ∼LN⁡(μ,σ2)Q \sim \operatorname{LN}(\mu, \sigma^{2})single-class facility populations
Pure power-lawf(Q)∝Q−αf(Q) \propto Q^{-\alpha} for Q>QminQ > Q_\text{min}baseline only; over-emphasises the tail
Lognormal-ParetoLN⁡(μ,σ2)\operatorname{LN}(\mu, \sigma^{2}) body, Pareto⁡(α,Qbreak)\operatorname{Pareto}(\alpha, Q_\text{break}) tailv1 default — Cusworth 2021 / Sherwin 2024 operational standard
Mixture-of-lognormals∑kπk⋅LN⁡(μk,σk2)\sum_k \pi_k \cdot \operatorname{LN}(\mu_k, \sigma_k^{2})multi-class facility populations (wells + tanks + pipelines)

QminQ_\text{min} (power-law) and QbreakQ_\text{break} (lognormal-Pareto) are themselves parameters.

The mark distribution is what Tier V actually wants to recover — it’s the population-scale answer to “how big are the leaks at this kind of facility?”

Detection thinning — Pd(Q;satellite)P_d(Q; \text{satellite}) (probability)

Not every event is observed. Each satellite has a probability of detection that depends on the leak size, viewing geometry, surface, and atmospheric state.

The operational form in the methane literature is the Hill function (Cusworth 2021, Sherwin 2024):

Pd(Q)  =  11+(Q50/Q)kP_d(Q) \;=\; \frac{1}{1 + (Q_{50}/Q)^{k}}

where Q50Q_{50} is the leak size at which detection probability is 0.5 and kk controls the steepness.

POD calibration uncertainty — hierarchical prior

Per-instrument controlled-release campaigns (Sherwin et al. 2024) deliver a posterior on (Q50,k)(Q_{50}, k), not a point. v1 default: hierarchical prior carrying calibration-campaign uncertainty:

Q50,inst∼LogNormal⁡(log⁡Q50,pub,σQ50,pub2),kinst∼LogNormal⁡(log⁡kpub,σk,pub2)Q_{50,\text{inst}} \sim \operatorname{LogNormal}(\log Q_{50,\text{pub}}, \sigma^{2}_{Q_{50},\text{pub}}), \qquad k_\text{inst} \sim \operatorname{LogNormal}(\log k_\text{pub}, \sigma^{2}_{k,\text{pub}})

This is the middle ground between (a) hard-coding published values (biased when those are uncertain) and (b) full joint inference (cleanest but identifiability concern with λ\lambda). v2 promotes to joint inference when basin data warrants.

10 POD models currently in plumax.population.pod, described visually in the POD gallery. Variants:


TMTPP likelihood — canonical form

For a set of detected events with per-event posteriors {p(Q∣observationi)}i=1n\{p(Q \mid \text{observation}_i)\}_{i=1}^{n} and detection times {ti}\{t_i\} over a window [0,T][0, T]:

log⁡L(λ,f,Pd∣data)  =  ∑i ⁣[log⁡λ(ti)  +  log⁡ ⁣ ⁣∫Pd(Q) Li(Q) f(Q) dQ]  −  ∫0Tλ(t) ⁣ ⁣∫Pd(Q) f(Q) dQ dt\log L(\lambda, f, P_d \mid \text{data}) \;=\; \sum_{i} \!\Bigl[ \log \lambda(t_i) \;+\; \log\!\!\int P_d(Q)\, L_i(Q)\, f(Q)\, \mathrm{d}Q \Bigr] \;-\; \int_{0}^{T} \lambda(t) \!\!\int P_d(Q)\, f(Q)\, \mathrm{d}Q\, \mathrm{d}t

The first sum scores each detected event under: (a) the temporal intensity at the detection time, and (b) the integrated mark contribution that combines the per-event likelihood with the population mark distribution and the satellite POD. The second integral is the expected number of events that would have been detected under the model — subtracts the right amount so the posterior is consistent.

Practical evaluation

The mark integral ∫Pd(Q) Li(Q) f(Q) dQ\int P_d(Q)\, L_i(Q)\, f(Q)\, \mathrm{d}Q is computed via the importance-weighted Monte Carlo estimator from 06a § Mark likelihood:

∫Pd(Q) Li(Q) f(Q) dQ  ≈  1S ∑sPd(Qi(s))⋅f(Qi(s))πper-event(Qi(s))\int P_d(Q)\, L_i(Q)\, f(Q)\, \mathrm{d}Q \;\approx\; \frac{1}{S}\, \sum_{s} P_d(Q_i^{(s)}) \cdot \frac{f(Q_i^{(s)})}{\pi_\text{per-event}(Q_i^{(s)})}

with samples Qi(s)∼p(Q∣observationi)Q_i^{(s)} \sim p(Q \mid \text{observation}_i) and πper-event(Q)\pi_\text{per-event}(Q) the per-event prior used at Tier I–IV. The 1/πper-event1 / \pi_\text{per-event} factor is the importance weight; without it the population fit double-counts the per-event prior.

Point-regime simplification

When per-event posteriors are tightly concentrated (CV⁡<20%\operatorname{CV} < 20\%) and ff is smooth on that scale, the importance-weighted MC reduces to the Point regime of 06a:

log⁡Lpoint  =  ∑i ⁣[log⁡λ(ti)+log⁡f(Qi)+log⁡Pd(Qi)]  −  ∫0Tλ(t) ⁣ ⁣∫Pd(Q) f(Q) dQ dt\log L_\text{point} \;=\; \sum_{i} \!\Bigl[ \log \lambda(t_i) + \log f(Q_i) + \log P_d(Q_i) \Bigr] \;-\; \int_{0}^{T} \lambda(t) \!\!\int P_d(Q)\, f(Q)\, \mathrm{d}Q\, \mathrm{d}t

This is the form implemented in plumax.population.fitting.pod_powerlaw_model (to be rebuilt on xtremax.point_processes.ThinningProcess over a MarkedTemporalPointProcess under #106). It’s the simplification, not the canonical form — explicit regime selection per 06a § Regime selection rule decides when it’s safe to use.

Numerical stability of the integrated thinned-rate term

The integral ∫Pd(Q) f(Q) dQ\int P_d(Q)\, f(Q)\, \mathrm{d}Q over heavy-tailed ff (power-law tail, Pareto) and saturating PdP_d (Hill) must not be evaluated by naive quadrature in linear QQ — the heavy tail underflows.


Where it plugs into plumax

TMTPP inputs.

InputSource
(ti,instrument_idi,per-event payload)(t_i, \text{instrument\_id}_i, \text{per-event payload}) per detection06_tier5a_instantaneous.md — Tier V.A adapter
Per-event Li(Q)L_i(Q) (samples + πper-event,logpdf\pi_\text{per-event,logpdf})Tiers I–IV inversion + posterior export
Per-instrument POD calibration (Q50,pub,σQ50,pub,kpub,σk,pub)(Q_{50,\text{pub}}, \sigma_{Q_{50},\text{pub}}, k_\text{pub}, \sigma_{k,\text{pub}})Sherwin 2024 / Cusworth 2021 / Kamdar IMEO controlled-release campaigns; alternatively joint inference with the population
Per-instrument overpass coverage (for the integrated rate)06a § Non-detection events — catalog ingest

TMTPP outputs.

OutputConsumer
Posterior λ(t)\lambda(t)06_tier5c_persistency.md — wait times, dispatch windows
Posterior f(Q)f(Q)06_tier5d_total_emission.md — total mass under POD-thinning correction
Per-instrument POD posterior (Q50,k)inst(Q_{50}, k)_\text{inst}instrument-design and cross-mission calibration questions; multi-satellite fusion (06d)
Joint (λ,f,Pd)(\lambda, f, P_d) posteriorsensitivity studies, satellite-tasking optimisation

Population vs. per-source — the v1 commitment

The TMTPP fits aggregate the population. Two distinct framings:

Both have library support; the choice is driven by the scientific question, not by the methodology. Inventory totals (06d) use across-population; dispatch decisions for a known leak history (06c) use per-source.


Module layout

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

ConcernModuleStatus
Intensity registry — deterministic + Hawkesplumax.population.intensity (13 kernels)🚧 — deterministic kernels in tree; Hawkes ☐ #115
Intensity registry — log-Gaussian Cox processplumax.population.point_process.fit_lgcp☐ v1.5 #115
Mark registryplumax.population.marks☐ #109 — power-law only (inline in plumax.population.fitting); lognormal, lognormal-Pareto, mixture-of-lognormals pending
POD models Pd(⋅)P_d(\cdot) (Hill + variants)plumax.population.pod (10 models)✓ in tree (logistic / probit / cloglog GLM family)
POD time-of-day binning (v1 time-varying POD)plumax.population.pod.InstrumentPOD.tod_bins☐ #110
POD continuous Pd(Q,t)P_d(Q, t) (v2)plumax.population.pod.continuous_t☐ v2
Hierarchical POD calibration priorplumax.population.pod.calibration_prior☐ #110
Homogeneous Poisson rate (closed-form Gamma-Poisson)plumax.population.point_process.fit_poisson_rate🚧 — pure-NumPy conjugate posterior on λ landed
Inhomogeneous log-linear intensity (NUTS)plumax.population.point_process.fit_inhomogeneous_intensity🚧 — log λ = β₀ + β·covariates fit landed; LGCP still v1.5
TMTPP likelihood — point regimeplumax.population.fitting.pod_powerlaw_model✓ in tree; xtremax ThinningProcess rebuild ☐ #106
TMTPP likelihood — full importance-corrected regimeplumax.population.fitting.tmtpp_iw_model☐ #108 — consumes population.importance
Numerical integration helpers (log-space Gauss-Hermite, Pareto IS)plumax.population.integrate☐ #108
Hawkes / self-exciting kernelplumax.population.point_process.fit_hawkes☐ #115 — beyond the existing kernels
Spatial extension (Cox process)plumax.population.spatial☐ — v2; ties to Tier III’s S(x,t)S(\mathbf{x},t)

Validation strategy


Open questions