Skip to content

Estimation Variance VOI

evppi_var and evsi_var value information by the reduction in uncertainty about a declared model output. They do not value a changed decision and are not aliases for decision-focused EVPPI/EVSI or Sobol sensitivity indices.

For a scalar target g(theta):

EVPPI_var(S) = Var(g(theta)) - E[Var(g(theta) | theta_S)]
EVSI_var(d) = Var(g(theta)) - E_Y[Var(g(theta) | Y, d)]

The experimental runtime supports scalar population variance. The specification still records vector component units and an explicit covariance functional, but vector execution fails closed until scientific review approves the scalarization policy.

from voiage.contracts.estimation import (
ConditioningSpec,
EstimationTargetSpec,
EstimationVarianceSpec,
EstimatorAssuranceSpec,
SamplingModelSpec,
)
from voiage.methods.estimation import evppi_var, evsi_var
specification = EstimationVarianceSpec(
method_id="evppi_var",
target=EstimationTargetSpec(
target_id="net_cases",
shape="scalar",
component_units=("count",),
covariance_functional="variance",
),
prior_model_id="enumerable_prior",
conditioning=ConditioningSpec(
parameter_subset=("risk_state",),
sigma_field="sigma_risk_state",
averaging_convention="empirical_reference",
),
estimator=EstimatorAssuranceSpec(
estimator_id="discrete_conditioning",
seed=17,
bootstrap_replicates=128,
convergence_threshold=1.0,
),
)
result = evppi_var(
[0.0, 2.0, 1.0, 3.0],
["a", "a", "b", "b"],
specification=specification,
)
evsi_specification = EstimationVarianceSpec(
method_id="evsi_var",
target=specification.target,
prior_model_id="study_prior",
sampling_model=SamplingModelSpec(
design_id="binary-study",
likelihood_id="binary-likelihood",
conditioning_sigma_field="sigma_observation",
averaging_convention="prior_predictive",
),
estimator=EstimatorAssuranceSpec(
estimator_id="enumerated-posterior-variance",
seed=17,
),
)
evsi_result = evsi_var(
[-2.0, 0.0, 2.0],
[0.0, 3.0],
[0.9, 0.1],
specification=evsi_specification,
)

The result includes current and expected posterior variance, raw and clipped reduction, relative reduction, bootstrap uncertainty, convergence diagnostics, units and replay provenance. specification_digest binds the scientific specification, while input_digest binds the actual target samples, grouping labels, posterior variances and predictive probabilities used in the run. A zero prior variance yields absolute reduction zero and relative reduction None. Negative finite-sample estimates remain visible in raw_reduction while the reported absolute reduction is clipped at zero.

The result JSON Schema is a portable structural check, not a complete scientific validator. Consumers must also validate results with voiage.contracts.estimation.EstimationVarianceResult; that governed semantic layer checks scalar covariance-functional equality and derives the required squared units from the declared target. Schema-only acceptance must not be reported as a valid estimation-variance result.

Use voiage calculate-estimation-variance SPECIFICATION.json DATA.json for the CLI. The specification follows specs/estimation-variance/v1/input.schema.json; the separate runtime data file contains target_samples and conditioning_groups for evppi_var, or prior_target_samples, posterior_variances and aligned predictive_probabilities for evsi_var. Predictive probabilities must be finite, nonnegative and sum to one within the estimator’s declared numerical tolerance; the runtime does not silently normalize arbitrary positive weights. The runtime-data structure is published as specs/estimation-variance/v1/runtime-data.schema.json.

This surface is experimental for planned v1.2.0. Scientific review, protected hosted checks, merge and release remain separate gates.