Molina 2015 - Bayesian Fay-Herriot, Surprise Maps and Variance Functions (Concept Note)

Summary

Concept note, no raw source: it extends the frequentist FH model of Molina & Marhuenda (2015) to the full-Bayes version used in the PyMC example E112 (county child poverty), adding uncertainty in , a logit link, estimated variances, and “surprise” maps. Literature: Fay & Herriot (1979, JASA); Rao & Molina (2015, Small Area Estimation, 2nd ed.); Gelman et al. (BDA3, eight-schools); Wolter and Fay-Herriot on generalised variance functions.

Overview

EBLUP plugs in and ignores its uncertainty (hence MSE corrections). A hierarchical Bayes (HB) FH puts priors on and and returns full posteriors of for any area-level question.

Main Content

Hierarchical Bayes FH

; ; , (or half-Cauchy). Posterior of given is , so the EBLUP is its mean.

Logit variant (proportions). For a rate with direct estimate and margin of error, model with so shrinkage respects . Counties with zero direct poverty and zero variance are left-censored data: use a split likelihood (censored term for zeros, Normal for positive) rather than discarding them (E112’s “censored zeros”).

Variances are estimates. FH assumes known. ACS margins of error are themselves noisy; a generalised variance function (GVF) smooths them: , or treat published variances as Gamma data with a model for the mean (E112 does the latter). Two independent surveys of the same year (ACS 2014-18 vs 2019-23) test whether stated margins of error are calibrated: standardised differences should be .

Surprise map

Map the standardised departure of a posterior from its prior-model expectation, e.g. or . It highlights areas that are unusual given their covariates and sampling noise, rather than areas that merely have noisy estimates. Posterior-predictive checks (mixed predictive checks that resample the area effect) calibrate it.

Examples

PyMC sketch (untested)

import pymc as pm
with pm.Model():
    beta = pm.Normal("beta", 0, 2, shape=X.shape[1])
    A = pm.HalfNormal("A", 1.0)
    u = pm.Normal("u", 0, 1, shape=D)
    logit_p = X @ beta + A * u              # non-centred
    p = pm.Deterministic("p", pm.math.sigmoid(logit_p))
    pos = y > 0
    pm.Normal("y_pos", p[pos], sigma=se[pos], observed=y[pos])
    # zeros: left-censored at 0 (illustrative)
pm.Potential("y_zero", pm.logcdf(pm.Normal.dist(p[~pos], se[~pos]), 0.0).sum())
Quantities: shrinkage $\gamma_d=A^2/(A^2+\psi_d)$ on the link scale; surprise = posterior probability that $p_d$ exceeds a threshold. ^ex-pymc-fh

Connections

Marketing: geo-level lift with unequal standard errors is the same model with the geo SE. See Hierarchical Models; poststratified small-area estimates in Poststratification; shrinkage vs multiple comparisons in Partial Pooling as Multiple Comparisons Correction.

See Also

Molina 2015 - Fay-Herriot Area-Level Model and EBLUP