Simpson 2016 - Off-Grid Poisson-Form Likelihood

Summary

With a finite basis , the LGCP log-likelihood becomes : the sum over points is exact and only the integral needs a -node quadrature. This is the log-likelihood of independent Poisson variables with pseudo-observations, so it fits standard latent-Gaussian machinery (INLA).

Overview

The key idea is to separate (i) the Gaussian field model and (ii) the likelihood approximation.

Main Content

Finite-dimensional field (eq. 2)

, multivariate Gaussian, linearly independent deterministic basis functions. Special cases: process convolution (Higdon 1998), predictive processes (Banerjee et al. 2008) and fixed-rank kriging (Cressie & Johannesson 2008) with correlated weights, and SPDE models (Lindgren et al. 2011) with compactly supported piecewise-linear .

Poisson-form likelihood (eq. 3-4)

For a quadrature rule ,

Define , and pseudo-observations . Then : conditionally independent Poisson variables with means .

Why. The term is exact because is continuous; the integral is replaced by a weighted sum of . Weight-zero pseudo-points give factors (the term). Related to Baddeley & Turner (2000), who used one point per cell for pseudo-likelihoods; here the integration scheme is designed carefully (Thm 1: error governed by quadrature order).

Integration scheme on a triangular mesh: dual-cell midpoint rule (nodes, weights the dual cell volumes; second order on a regular grid, first order on irregular meshes), or Gaussian rules per triangle.

Examples

Numerical check of eq. 3 on a 1-D LGCP

Setup: domain , piecewise-linear hat basis on nodes, quadrature = trapezoid with nodes. The code shows that the exact data term plus quadrature integral reproduces the Poisson-form likelihood.

import numpy as np
rng = np.random.default_rng(0)
n = 15; nodes = np.linspace(0, 1, n); z = rng.normal(0, 1, n).cumsum() * 0.3
phi = lambda s: np.maximum(0, 1 - np.abs(s[:, None] - nodes[None, :]) * (n - 1))   # hat functions
Z = lambda s: phi(s) @ z
pts = np.sort(rng.uniform(0, 1, 12))                 # observed points
sq = np.linspace(0, 1, 200); w = np.full(200, 1 / 199); w[[0, -1]] /= 2   # trapezoid
A1, A2 = phi(sq), phi(pts)
ll_direct = -(w * np.exp(Z(sq))).sum() + Z(pts).sum()
eta = np.concatenate([np.exp(A1 @ z), np.exp(A2 @ z)]); alpha = np.concatenate([w, np.zeros(len(pts))])
y = np.concatenate([np.zeros(len(sq)), np.ones(len(pts))])
ll_pois = (y * np.log(eta) - alpha * eta).sum()
print(ll_direct, ll_pois)   # identical

In PyMC: pass pseudo-data to pm.Poisson(mu=alpha*eta, observed=y), equivalent to pm.Potential with the explicit form.

Connections

See Also

Simpson 2016 - Going Off Grid - Overview