nstat.extras.spatial — Spatial & spatiotemporal point processes
The Python-only spatial / spatiotemporal point-process companion to
nstat. It turns a spatial point pattern into a posterior rate map
with credible bands (log-Gaussian Cox process by the Laplace
approximation), provides a tensor-product B-spline log-rate basis
that drops into nstat.glm.fit_poisson_glm, exposes the inhomogeneous
second-order goodness-of-fit suite a homogeneous K-function cannot
give for a non-stationary neural field (with four published
edge-correction modes), and implements the discrete-time-rescaling KS
correction that fixes a real bug in the naive time-rescaling test at
finite bin width.
It has no MATLAB counterpart and therefore no parity/manifest.yml
entry — it lives in the opt-in extras/ namespace precisely so the core
nstat MATLAB-parity contract is preserved. See the
methods roadmap “Spatial point
processes” tier.
Install
The core — lgcp, spatial_gof, marked_gof — needs only the
already-present numpy / scipy. No extra to install.
The optional heavier bridges each have their own group (deliberately
not rolled into [all-extras], like [dynamax]/[clusterless]):
pip install nstat-toolbox[spatial-gp] # heavier GP path: lgcp_fit(backend="gpflow")
pip install nstat-toolbox[hawkes] # multivariate Hawkes via tick
pip install nstat-toolbox[dpp] # DPP sampling via DPPy
The DPP eigen-sampler has a dependency-free NumPy fallback
(dpp_bridge.sample_l_ensemble) — the [dpp] group is only for the
broader DPPy sampler catalogue.
API
LGCP rate map (pure NumPy/SciPy)
Symbol |
Notes |
|---|---|
|
Bins events, places a Matern GP prior on |
|
Basis-projected LGCP: penalized Poisson IRLS on the B-spline coefficient vector with a |
|
Matern GP prior ( |
|
|
|
the posterior-mean rate / a callable |
Inhomogeneous second-order goodness-of-fit (pure NumPy/SciPy)
Symbol |
Notes |
|---|---|
|
SOIRS-reweighted |
|
inhomogeneous |
|
variance-stabilized |
|
empty-space |
|
Monte-Carlo global-rank envelope (Myllymäki et al. 2017) → |
|
inhomogeneous cross |
|
cross pair correlation |
Edge corrections
pair_correlation, k_inhom, and l_function accept an edge_correction
keyword selecting one of four published modes. The default
("epanechnikov") is the original SOIRS estimator and is bit-identical
to the pre-keyword behaviour. The other three require a rectangular
domain = ((xlo, xhi), (ylo, yhi)).
Mode |
Reference |
Notes |
|---|---|---|
|
Stoyan & Stoyan 1994 |
Default; the SOIRS Epanechnikov-kernel estimator already shipped. Output is bit-identical to omitting the kwarg. |
|
Ripley 1976, 1977 |
Per pair |
|
Ohser 1983 |
Weight each pair by ` |
|
Baddeley-Rubak-Turner 2015 §7.4 |
Restrict the focal event set per radius to events with boundary-distance ≥ |
B-spline log-rate basis (pure NumPy/SciPy)
Symbol |
Notes |
|---|---|
|
|
|
tensor-product |
|
frozen dataclass; |
The 2-D design matrix is a valid x argument to
nstat.glm.fit_poisson_glm; a smooth penalty can be added later by
augmenting the IRLS Hessian with rho * basis.gram().
Marked / discrete-time-rescaling goodness-of-fit (pure NumPy/SciPy)
Symbol |
Notes |
|---|---|
|
runs the time axis BOTH uncorrected and discrete-time-corrected, plus the mark axis via |
|
naive |
|
|
|
per-channel rescaling for a finite (channel) mark space (Gerhard-Haslinger-Pipa 2011) |
|
runs the per-channel test and the population coupling test ( |
Marked-pattern second-order diagnostics (pure NumPy/SciPy)
For a single labelled point pattern (one mark per event), the mark correlation function and mark variogram test whether the marks are independent of the geometry of the pattern.
Symbol |
Notes |
|---|---|
|
Kernel mark correlation |
|
Kernel mark variogram `γ_m(r) = ½ E[(m_i − m_j)² |
Both estimators return NaN at lags where the Epanechnikov kernel
weight sums to zero (no pairs in support) — never a silent zero.
Rescaled-time autocorrelation (independence diagnostic)
The discrete-time-rescaling KS test checks the marginal distribution
of the rescaled variates (Unif(0,1)) but is blind to serial dependence
(Brown et al. 2002). rescaled_acf returns the lag autocorrelation
of the normal-score-transformed uniforms z_j = Φ⁻¹(u_j) and an
asymptotic Bartlett band (Andersen 1997; Truccolo et al. 2005) — a
complement to, not a replacement for, the marginal KS test.
Symbol |
Notes |
|---|---|
|
|
Smoothed point-process residuals
Symbol |
Notes |
|---|---|
|
Convolves the per-bin residual |
LGCP Bartlett density from pair correlation
Symbol |
Notes |
|---|---|
|
Hankel-zero transform of |
For an LGCP driven by a Gaussian log-rate field of covariance C(r),
the population pair correlation is g(r) = exp(C(r)) (Møller,
Syversveen & Waagepetersen 1998), so the Bartlett density of the
empirical g(r) can be compared to the closed-form transform of
exp(C(r)) − 1 for parametric covariance families (Matérn, Gaussian).
Cluster Cox processes (pure NumPy/SciPy)
Three canonical cluster Cox processes — homogeneous Poisson parents
with Poisson(μ) offspring counts scattered by an offspring kernel.
They are the discrete-burst counterpart to the smoothly-varying
log-Gaussian Cox process in lgcp
and the natural targets for the minimum-contrast estimator below.
Symbol |
Notes |
|---|---|
|
Thomas (1949): isotropic Gaussian offspring displacement of standard deviation |
|
Matérn (1986): offspring uniform on the disc of radius |
|
Neyman & Scott (1958): generic cluster Cox with a user-supplied |
|
Closed form |
|
|
|
Parent buffer |
|
Parent buffer |
|
Generic dispatcher; |
Minimum-contrast estimation (Diggle 2013 §6.2.1)
Symbol |
Notes |
|---|---|
|
Minimises |
|
Fits |
|
Same shape for |
|
Frozen dataclass: |
fit_thomas / fit_matern_cluster build the empirical g(r) with
pair_correlation(..., edge_correction="border") (Baddeley-Rubak-Turner
2015 §7.4), so they handle the small-r NaN band correctly without
extra plumbing.
Gibbs interaction processes (pure NumPy/SciPy)
Inhibitory or interactive point patterns whose Papangelou conditional
intensity factors into a log-linear form — fit via the Berman-Turner
device (Baddeley-Rubak-Turner 2015 §13.5) by reformulating
pseudo-likelihood as a weighted Poisson GLM and delegating to
nstat.glm.fit_poisson_glm.
Companion to the cluster-Cox attractive models above.
Symbol |
Notes |
|---|---|
|
Strauss (1975): pairwise interaction |
|
The |
|
Baddeley-van Lieshout (1995): higher-order Widom-Rowlinson interaction on the union of |
|
Metropolis birth-death sampler with conditional-intensity acceptance. Defaults match Møller-Waagepetersen 2003 §10.4 mixing recommendations. |
|
Dart-throwing rejection; raises |
|
Berman-Turner fit. Uses the equivalent |
|
Frozen dataclass: |
pseudo_likelihood_fit emits UserWarning("data appears clustered; consider fit_thomas") when the unclipped Strauss γ estimate exceeds
1, then clips to the valid (0, 1] interval. For AreaInteractionProcess,
both the simulator and the fitter require R ≥ 2 · pixel_size to keep
the discretised disc-union integrals well-defined.
The hardcore intensity estimator is upward-biased (median ≈ 40% at
small R for the dart-throwing simulator): the intercept-only GLM
over-attributes activity to unexcluded quadrature area. The
Baddeley-Rubak-Turner 2015 §13.4 analytical correction
β̂ / (1 − π R² λ̂) closes the gap but is not applied automatically
— check the test docstring in
tests/extras/test_spatial_pseudo_likelihood.py for the bias
characterisation if you need calibrated intensity recovery.
Hawkes EM declustering (pure NumPy/SciPy)
Pure-NumPy single-realisation EM for the univariate Hawkes process with
an exponential triggering kernel (Veen-Schoenberg 2008; Marsan-Lengliné
2008). The algorithm exploits the branching-structure interpretation
of the Hawkes process: every event is either spontaneous (parent = self,
rate mu) or triggered by an earlier event j (kernel
alpha * exp(-beta * (t_i - t_j))). The E-step assigns soft
responsibilities p_ii and p_ij from those rate weights; the M-step
maximises the resulting Q(theta) in closed form for mu, alpha, and
beta — no inner numerical optimisation. This is the methodological
opposite of the optional tick-backed hawkes_bridge.fit_hawkes_exp,
which fits a multivariate Hawkes by SGD-style maximum-likelihood without
recovering the latent parent assignments.
Symbol |
Notes |
|---|---|
|
Frozen dataclass. |
|
Fits the Hawkes via Veen-Schoenberg EM. Raises on empty input, unsorted event times, or |
|
Frozen dataclass: |
|
Ogata-thinning Hawkes simulator on |
Memory caveat. The implementation materialises the full
(N, N) time-difference matrix, so memory cost is O(N^2) — fine up
to N ≈ 5000 in dense NumPy, beyond which the tick-backed
hawkes_bridge.fit_hawkes_exp (multivariate, stochastic-gradient inner
loop) is the better choice even for the univariate case.
Identifiability caveat. The Hawkes log-likelihood is only weakly
identified between the kernel amplitude alpha and decay beta on a
single realisation — alpha and beta trade off along an iso-alpha/beta
ridge. The branching ratio alpha/beta exposed via
HawkesEMResult.branching_ratio is by far the tightest summary; prefer
it to the individual parameters when reporting recovered structure.
SBM-prior multivariate Hawkes EM (pure NumPy)
Latent-block extension of the Veen-Schoenberg branching-responsibilities
EM (Linderman, Adams & Pillow 2014). Where em_hawkes_exponential
fits a single univariate Hawkes with (mu, alpha, beta), the SBM
prior pools N processes into K latent communities and fits the
K x K block-coupling matrix A plus a shared exponential decay
beta and per-process baseline rates mu. Pure NumPy; no [hawkes]
dep; built for N up to ~30 and total events up to ~5000.
The block-coupling matrix A is per-(sender, receiver) pair, so for
the multivariate process to be sub-critical the spectral radius of
A * diag(K_counts) / beta (or equivalently A_pair / beta where
A_pair[m, n] = A[z_m, z_n]) must be below 1. The simulator enforces
this; configurations failing it raise ValueError("super-critical: spectral radius of A/beta = ...").
Symbol |
Notes |
|---|---|
|
Frozen dataclass. Validates |
|
Hard-EM with closed-form |
|
Frozen dataclass: |
|
Multivariate Ogata thinning with multiplicative-decay state updates. Raises on super-critical configurations. |
Permutation caveat. Block labels are arbitrary; only the
partition matters. Recovery tests should compare z_hat to ground
truth up to label permutation — scipy.optimize.linear_sum_assignment
on the (negative) confusion matrix is the convenient Hungarian
alignment.
Cost. Per EM iteration the dominant work is the O(N^2 * avg_events^2) build of R (re-done only when beta changes), plus
O(N * total_events * K) per greedy z sweep. For N <= 30 and total
events <= 5000 the whole fit finishes in seconds. For larger
problems prefer the tick-backed multivariate
hawkes_bridge.fit_hawkes_exp.
Optional bridges (lazy import; raise an install hint if the dep is absent)
Symbol |
Backend |
Group |
|---|---|---|
|
|
|
|
NumPy (no dep) |
— |
|
|
|
|
|
|
Spatiotemporal wave analysis (pure NumPy/SciPy)
Bartlett (frequency × wave-vector) spectrum of a Hawkes triggering
matrix and a top-N wave-peak detector — Python-only, no [hawkes]
needed (despite living alongside fit_hawkes_exp). Companion to
Daley & Vere-Jones (2003) §8.4 / Bacry-Mastromatteo-Muzy (2015).
Symbol |
Notes |
|---|---|
|
|
|
|
|
Greedy descending-power sort + Chebyshev non-max suppression; masks DC ` |
|
Frozen dataclass; `speed = 2pifreq / |
Gotchas
Plug-in bias (read this). The reweighted
g/K/global_envelopeestimators are honest only whenlambda_hatis held out — an intensity fit to the same pattern has already absorbed some clustering, which deflates the statistic and shrinks the envelope below nominal coverage (Shaw, Møller & Waagepetersen 2021). Use a smoother fit to a disjoint fold (on synthetic data, the known field plays this role).LGCPResult.intensity_fn()is convenient but is a plug-in.Discrete-time correction is mandatory at finite Δ. A KS test on the bin-summed compensator (
uncorrected_rescaled) false-rejects a correct model with biasO(λ̄Δ). Always usecorrected_rescaled/marked_time_rescaling(average severalrngdraws, or use a Monte-Carlo reference band).Per-channel passing is necessary, not sufficient. A coupling-blind fit can pass every per-channel KS while the joint model is wrong (the multivariate time-rescaling theorem).
pair_correlationis planar (d=2).lgcp_fit/k_inhomwork in generald, but theg(r)ring normalization assumes the plane.
Recipe
import numpy as np
from nstat.extras.spatial import lgcp_fit, pair_correlation, global_envelope
rng = np.random.default_rng(0)
# Synthetic place field on the unit square (thinned inhomogeneous Poisson).
mu, peak = np.array([0.45, 0.55]), 900.0
Sinv = np.linalg.inv(np.array([[0.045, 0.008], [0.008, 0.035]]))
def loglam(X):
d = X - mu
return np.log(peak) - 0.5 * np.einsum("ni,ij,nj->n", d, Sinv, d)
n = rng.poisson(peak); P = rng.uniform(0, 1, (n, 2))
pts = P[rng.uniform(0, 1, n) < np.exp(loglam(P)) / peak]
# LGCP rate map with a 90% credible band (wider where data thin out).
res = lgcp_fit(pts, ((0, 1), (0, 1)), grid=20)
mean, lo, hi = res.rate_map(level=0.90)
# Held-out SOIRS-reweighted g(r) + global-rank envelope (use the KNOWN
# field as the held-out intensity; on real data use a disjoint-fold smoother).
def lam_at(X): return np.exp(loglam(X))
r = np.linspace(0.03, 0.18, 12)
g = pair_correlation(pts, lam_at, r, domain=((0, 1), (0, 1)), bw=0.04)
env = global_envelope(pts, lam_at, r, n_sim=199, domain=((0, 1), (0, 1)))
print("g(r) ~ 1:", round(float(np.nanmean(g)), 2), "| inside envelope:", env.inside)
Basis-projected LGCP (cheap at large grids):
import numpy as np
from nstat.extras.spatial import lgcp_fit_glm, MaternPrior
from nstat.extras.spatial.basis import BSplineBasis2D
rng = np.random.default_rng(2)
# Same single-bump pattern as above.
mu, peak = np.array([0.45, 0.55]), 900.0
Sinv = np.linalg.inv(np.array([[0.045, 0.008], [0.008, 0.035]]))
def loglam(X):
d = X - mu
return np.log(peak) - 0.5 * np.einsum("ni,ij,nj->n", d, Sinv, d)
n = rng.poisson(peak); P = rng.uniform(0, 1, (n, 2))
pts = P[rng.uniform(0, 1, n) < np.exp(loglam(P)) / peak]
# 64x64 cell grid, 10x10 cubic B-spline basis with a Matern-5/2 prior on
# the coefficient vector. Dominant solve is O(K^3) = O(100^3), not O(M^3).
G = 64
gx = np.linspace(0, 1, G); gy = np.linspace(0, 1, G)
basis = BSplineBasis2D.from_grid(gx, gy, n_knots=10)
prior = MaternPrior(nu=2.5, length_scale=0.18, marginal_var=1.0)
res = lgcp_fit_glm(pts, ((0, 1), (0, 1)), basis, prior, grid=G)
mean, lo, hi = res.rate_map(level=0.90)
Bartlett wave-vector spectrum of a Hawkes triggering matrix:
import numpy as np
from nstat.extras.spatial import bartlett_spectrum, detect_wave_peaks
# 4 electrodes on a unit grid; toy positive-excitation adjacency.
pos = np.array([[0, 0], [1, 0], [0, 1], [1, 1]], dtype=float)
adj = 0.05 * np.ones((4, 4))
f = np.linspace(0.5, 5.0, 16)
kx = np.linspace(-2.0, 2.0, 9)
ky = np.linspace(-2.0, 2.0, 9)
KX, KY = np.meshgrid(kx, ky, indexing="ij")
k = np.stack([KX.ravel(), KY.ravel()], axis=1)
S = bartlett_spectrum(adj, pos, f, k, decay=1.0) # (Nf, Nk)
peaks = detect_wave_peaks(S, f, k, n_peaks=3)
print("speeds (pos-unit / s):", peaks.speed)
print("directions (rad):", peaks.direction)
Discrete-time-rescaling KS:
import numpy as np
from nstat.extras.spatial import marked_time_rescaling
rng = np.random.default_rng(1)
n_bins, Delta = 6000, 0.020
p_k = np.clip(6.0 * Delta * (1 + 0.5 * np.sin(np.linspace(0, 8*np.pi, n_bins))), 0, 1)
spike_bins = np.flatnonzero(rng.uniform(size=n_bins) < p_k)
res = marked_time_rescaling(spike_bins, None, p_k, n_draws=25, rng=rng)
print("uncorrected rejects:", not res.inside_uncorrected,
"| corrected passes:", res.inside_corrected)
Examples and notebooks
End-to-end demonstrations of the basis-projected LGCP path live in
examples/paper/example06_place_fields_glm_basis.py
with a companion walkthrough notebook
notebooks/PlaceFieldGLMBasis.ipynb.
The example fits a synthetic place field with BSplineBasis2D /
MaternPrior / lgcp_fit_glm, evaluates the inhomogeneous second-order
diagnostics pair_correlation / k_inhom / l_function under each of
the four edge_correction modes, and renders the posterior rate map
with credible bands.
The spatiotemporal wave path is demonstrated by
examples/paper/example07_spatiotemporal_hawkes_waves.py
with the companion notebook
notebooks/HawkesWaveAnalysis.ipynb.
Both scripts build a small electrode-array Hawkes triggering matrix,
compute its bartlett_spectrum, run detect_wave_peaks to surface a
WaveAnalysisResult (speeds and directions), and use
reconstruct_kernel to visualize the parametric exponential kernel
underlying the fit.
The full encoding-then-decoding loop on real spikes lives in
examples/paper/example08_real_place_cells.py
with the companion notebook
notebooks/RealPlaceCellDecoding.ipynb.
The script loads Animal 1 of the figshare paper dataset, fits a
4-cell B-spline Poisson GLM on the training half, decodes position
with the PPAF on the held-out half, and runs pair_correlation plus
global_envelope (Ripley isotropic) and the population
rescaled_acf (Bartlett band) as a held-out goodness-of-fit suite.
The multitype cross-correlation pipeline is exercised by
notebooks/MultitypeCrossK.ipynb,
which contrasts an independent two-type Poisson labelling with a
Thomas-clustered shared-parent labelling under cross_k_inhom and
cross_pair_correlation (Baddeley-Moller-Waagepetersen 2000).
The cluster-Cox + Gibbs catalogue is exercised end-to-end by two
companion synthetic demo scripts and one walkthrough notebook.
examples/extras/spatial_cluster_cox_demo.py
simulates a Thomas and a Matérn-cluster process on the unit square and
recovers (sigma, lambda_p) / (R, lambda_p) via fit_thomas and
fit_matern_cluster — the minimum-contrast (Diggle 2013 §6.2.1)
estimators built on the SOIRS border-corrected pair correlation; the
mean offspring count mu is then recovered post-hoc from `n / (lambda_p
|W|)
because second-order statistics do not identify it. [examples/extras/spatial_gibbs_demo.py](../../examples/extras/spatial_gibbs_demo.py) simulates a Strauss (gamma = 0.4), a hard-core, and an area-interaction (eta = 4.0) process via the Metropolis birth-death chain (Geyer 1999) and the dart-throwing rejection sampler, then recovers their parameters withpseudo_likelihood_fit— the Berman-Turner (1992) device routing throughnstat.glm.fit_poisson_glm. The hard-core demo deliberately usesbeta = 60to land in the numerical envelope where the intercept-only GLM converges and the documented upward bias onbeta_hat` (BRT-2015 §13.4) is visible.
The companion walkthrough notebook
notebooks/SpatialClusterAndGibbs.ipynb
runs both halves in one place — six processes, two estimators, a single
recovery table — so the attractive (cluster-Cox) and repulsive (Gibbs)
catalogues can be inspected side-by-side.
Scope
Feature |
Status |
|---|---|
LGCP Laplace rate map + log-normal credible band |
shipped (NumPy) |
Basis-projected LGCP ( |
shipped (NumPy) |
Inhomogeneous |
shipped (NumPy) |
Discrete-time-rescaling correction + marked / multivariate KS |
shipped (NumPy) |
DPP eigen-sampler ( |
shipped (NumPy fallback) + DPPy bridge |
Multivariate Hawkes |
|
Bartlett spectrum + wave-peak detection of a fitted Hawkes adjacency |
shipped (NumPy) |
Heavier variational GP for the LGCP |
optional |
Auto-Poisson / SPDE-GMRF estimators |
not in scope |
References
Møller J, Syversveen AR, Waagepetersen RP (1998). Log Gaussian Cox processes. Scandinavian Journal of Statistics 25(3):451-482.
Rasmussen CE, Williams CKI (2006). Gaussian Processes for Machine Learning, Algorithm 3.1.
Diggle PJ, Moraga P, Rowlingson B, Taylor BM (2013). Spatial and spatio-temporal log-Gaussian Cox processes. Statistical Science 28(4):542-563.
Wood SN (2017). Generalized Additive Models: An Introduction with R. Chapman & Hall/CRC, 2nd ed.
de Boor C (1978). A Practical Guide to Splines. Springer.
Eilers PHC, Marx BD (1996). Flexible Smoothing with B-splines and Penalties. Statistical Science 11(2):89-121.
Ripley BD (1976). The second-order analysis of stationary point processes. J. Appl. Probab. 13(2):255-266.
Ripley BD (1977). Modelling spatial patterns. JRSS-B 39(2):172-212.
Ohser J (1983). On estimators for the reduced second moment measure of point processes. Math. Operationsforsch. Statist., Ser. Statist. 14(1):63-71.
Baddeley A, Rubak E, Turner R (2015). Spatial Point Patterns: Methodology and Applications with R. CRC Press.
Baddeley AJ, Møller J, Waagepetersen R (2000). Non- and semi-parametric estimation of interaction in inhomogeneous point patterns. Statistica Neerlandica 54(3):329.
Myllymäki M, Mrkvička T, Grabarnik P, Seijo H, Hahn U (2017). Global envelope tests for spatial processes. JRSS-B 79(2):381.
Shaw T, Møller J, Waagepetersen R (2021). Globally intensity-reweighted estimators for K- and pair correlation functions. ANZJS 63(1):93.
Haslinger R, Pipa G, Brown E (2010). Discrete time rescaling theorem. Neural Computation 22(10):2477.
Thomas M (1949). A generalization of Poisson’s binomial limit for use in ecology. Biometrika 36(1/2):18.
Matérn B (1986). Spatial Variation (2nd ed.). Springer Lecture Notes in Statistics 36.
Neyman J, Scott EL (1958). Statistical approach to problems of cosmology. J. R. Stat. Soc. B 20(1):1.
Møller J, Waagepetersen RP (2003). Statistical Inference and Simulation for Spatial Point Processes. Chapman & Hall.
Diggle PJ (2013). Statistical Analysis of Spatial and Spatio-Temporal Point Patterns (3rd ed.). CRC.
Gerhard F, Haslinger R, Pipa G (2011). Applying the multivariate time-rescaling theorem to neural population models. Neural Computation 23(6):1452.
Kulesza A, Taskar B (2012). Determinantal Point Processes for Machine Learning. FnT in ML 5(2-3):123.
Bacry E, Bompaire M, Gaïffas S, Poulsen S (2018). tick: a Python library for statistical learning. JMLR 18(214):1.
Bacry E, Mastromatteo I, Muzy J-F (2015). Hawkes processes in finance. Market Microstructure and Liquidity 1(1):1550005.
Daley DJ, Vere-Jones D (2003). An Introduction to the Theory of Point Processes, Vol. I, §8.4 — Bartlett spectrum.
Hansen NR, Reynaud-Bouret P, Rivoirard V (2015). Lasso and probabilistic inequalities for multivariate point processes. Bernoulli 21(1):83.
Schlather M (2001). On the second-order characteristics of marked point processes. Bernoulli 7(1):99-117.
Stoyan D, Stoyan H (1994). Fractals, Random Shapes and Point Fields: Methods of Geometrical Statistics. Wiley.
Cressie N, Hawkins DM (1980). Robust estimation of the variogram, I. Journal of the IAMG 12(2):115-125.
Illian J, Penttinen A, Stoyan H, Stoyan D (2008). Statistical Analysis and Modelling of Spatial Point Patterns. Wiley.
Brown EN, Barbieri R, Ventura V, Kass RE, Frank LM (2002). The time-rescaling theorem and its application to neural spike train data analysis. Neural Computation 14(2):325-346.
Andersen PK (1997). Statistical Models Based on Counting Processes. Springer.
Truccolo W, Eden UT, Fellows MR, Donoghue JP, Brown EN (2005). A point process framework for relating neural spiking activity to spiking history, neural ensemble, and extrinsic covariate effects. Journal of Neurophysiology 93(2):1074-1089.
Bartlett MS (1964). The spectral analysis of two-dimensional point processes. Biometrika 51(3-4):299-311.
Stein ML (1999). Interpolation of Spatial Data: Some Theory for Kriging. Springer.
Veen A, Schoenberg FP (2008). Estimation of space-time branching process models in seismology using an EM-type algorithm. JASA 103(482):614-624.
Marsan D, Lengliné O (2008). Extending earthquakes’ reach through cascading. Science 319(5866):1076-1079.
Linderman SW, Adams RP, Pillow JW (2014). Discovering latent network structure in point process data. NeurIPS.