Heath 2015 - Regression-Based EVPPI (GAM and Gaussian Process)

Summary

Oakley and Strong et al. rewrite the inner conditional expectation of Eq. (1) as a regression: . Fitting with a GAM or a Gaussian process to the PSA sample gives EVPPI for any subset from a five-step recipe with no extra model runs. The paper judges this “the best method for calculating the EVPPI efficiently”.

Overview

Because is a function of only, the noisy simulated values are unbiased observations of it at the points . Any flexible smoother then estimates the inner expectation; the noise is the contribution of given .

Main Content

Regression model for the inner expectation

The are “observed covariates” and the “observed response”, simulations.

Regression EVPPI estimator (Strong et al. 2014)

Fit for each option and let be the fitted values. Then

The five steps: (1) sample ; (2) compute ; (3) regress each on ; (4) take fitted values; (5) apply the formula. Strong et al. supply R code with GAM (spline smoothers; gam chooses basis dimension automatically) and Gaussian process regression (a specific structure with analytic results, so no user-supplied model).

Implementations. R functions of Strong et al., the web app SAVI (Sheffield Accelerated Value of Information) with standardised graphics and tables, and the R package BCEA.

Properties. GAM: negligible cost for one parameter; user must specify interaction structure for larger subsets; “mathematically unstable for larger subsets of parameters ()“. GP: feasible for large subsets, but compute is proportional to for a PSA of size ; an extension using geostatistics (INLA/SPDE, ref. [20]) is “being investigated”.

Examples

Verified toy example (run in this session): option 0 has , option 1 has with independent standard normals, . A degree-5 polynomial regression stands in for the GAM.

import numpy as np
from scipy import stats
rng = np.random.default_rng(1); S = 200_000
phi, psi = rng.normal(size=S), rng.normal(size=S)
NB = np.stack([np.zeros(S), 0.3 + 0.5*phi + 0.5*psi])
base = NB.mean(1).max()
evpi = NB.max(0).mean() - base                     # 0.1575 (analytic 0.1571)
g = np.stack([np.polyval(np.polyfit(phi, NB[t], 5), phi) for t in range(2)])
evppi = g.max(0).mean() - g.mean(1).max()          # 0.0845 (analytic 0.0843)

Analytic values use with and (EVPI) or (EVPPI).

PyMC-style sketch (untested): draw the posterior with pm.sample, compute net-benefit arrays from idata.posterior, then call a GP/GAM regression (e.g. pm.gp.Marginal or pygam) on the chosen parameter column; the five-step formula above is pure NumPy on the fitted values.

Connections

  • Estimating EVPPI is a regression of decision value on a parameter, so it inherits regression pathologies (extrapolation at tails, overfit with small ); report to 1-2 decimals as the paper advises.
  • Marketing: with posterior draws from an MMM, run this for each channel’s response parameters to rank where better data pays; this is the decision-oriented complement of a sensitivity analysis.
  • GP regression machinery: Gaussian Process Regression, and for large Hilbert Space Gaussian Processes.

See Also