Simpson 2016 - Matern SPDE and GMRF Representation

Summary

Matern Gaussian fields with integer are stationary solutions of . A finite-element discretisation on a triangulation gives sparse precision matrices (a Gaussian Markov random field); for the weights satisfy . Neumann boundary conditions () inflate variance near the boundary.

Overview

The SPDE approach (Lindgren, Rue & Lindstrom 2011) provides the basis and joint law of used in the off-grid likelihood. It reproduces classical CAR models on a regular lattice (Whittle 1954, 1963: second-order CAR converges to Matern with ).

Main Content

Matern covariance (Sec. 5)

For ,

the modified Bessel function of the second kind, smoothness, inverse range, scale; the normalisation is chosen to match the SPDE (5). Equivalently with marginal variance .

SPDE representation (eq. 5)

, with (the printed text says , apparently a typo; the consistent relation is ), , spatial white noise.

Finite-element weights for (eq. 6)

Piecewise linear on a triangular mesh: , with sparse (diagonal, lumped), , . The matrix is sparse, so is a GMRF (for the precision is , still sparse); computation scales with sparsity not with .

Details:

  • Boundary: set (Neumann, no flux); this approximately doubles the variance near the boundary (Lindgren et al. 2011, Thm 1). Dirichlet conditions (fixed value) reduce it. Boundary modelling in point-process work is barely studied (Wood et al. 2008 for smoothing).
  • Meshing: regular triangulation, refined where points are dense; coarser in unsampled regions but with gradual size transition, and keep nodes inside holes so the field behaves.
  • Extensions: non-stationary, anisotropic, multivariate, spatio-temporal (Cameletti 2013; Fuglstad 2015).
  • Priors: independent on in all examples.

Examples

Matern correlation values

gives the exponential kernel ; : (many software packages instead use ).

import numpy as np
from scipy.special import kv, gamma
def matern(h, nu, kappa, sigma2=1.0):
    h = np.maximum(h, 1e-12); x = kappa*h
    return sigma2*(2**(1-nu)/gamma(nu))*x**nu*kv(nu, x)
h = np.array([0.1, 1., 3.]); print(matern(h, .5, 1.), np.exp(-h))              # nu=1/2 equals exponential
print(matern(h, 1.5, 1.), (1+h)*np.exp(-h))                                   

(Both pairs agree: with the Matern-3/2 correlation is .)

Connections

See Also

Simpson 2016 - Going Off Grid - Overview