Mathematical and Statistical Soundness¶
updatesupport is mathematically sound for a specific and explicit class of
audits:
finite retained refinement cells, fixed public projections, target functionals fixed after workflow compilation, and explicit admissible distribution classes.
In that setting the reported ambiguity interval is a well-defined partial-identification or sensitivity interval. It is not a confidence interval, not a causal identification result, and not a generic nonlinear functional optimizer.
For product positioning and lineage, see Positioning and lineage.
Two Boundaries Up Front¶
First, “hidden” means not publicly reported at the chosen reporting level. It does not mean unobserved, latent, unknowable, or missing from the analyst’s data. In the usual tabular workflow, hidden cells are retained finer cells that the analyst has observed or constructed but has chosen not to publish in the coarse public report. A better mnemonic is:
public = reported buckets
hidden = retained finer refinement inside those buckets
Second, every ambiguity number is relative to a declared refinement and a
declared admissible class Q. It is not an absolute bound on all ways the world
could differ, all omitted variables, or all possible unmodeled populations.
Changing the retained refinement columns, sparse-cell rule, target values, public
projection, or Q changes the mathematical problem and can change the bound.
The most important technical boundary is the aggregate target. The primary tabular contract compiles to a fixed linear plug-in target:
psi(q) = sum_d h(d) q(d)
where d ranges over retained finer cells, q(d) is retained-cell mass, and
h(d) is the supplied target value for retained cell d.
RatioTarget adds an explicit fixed linear-fractional contract for supported
solver backends. MomentTransformTarget adds fixed transforms of linear
moments, with current solver support for affine transforms. ProcedureTarget
adds a workflow contract for representation-dependent reporting procedures: the
procedure is compiled to a column or row metric for each representation, and the
finite problem then solves the compiled fixed target.
UncertainLinearTarget keeps the same fixed linear point-estimate target and
adds retained-cell estimator standard errors. Those standard errors do not
change the base transport optimization. They are used in the report layer to
widen the hidden-composition interval with endpoint-specific and conservative
estimator-uncertainty margins.
If the aggregate target is nonlinear in q or depends on the transported
distribution itself, it is not automatically covered by the current soundness
guarantee. Such a target needs an explicit reformulation or a dedicated
target-functional backend.
Core Object¶
The current mathematical object is finite.
Dis a finite retained refinement state space. These are the cells not shown in the public report, not necessarily unobserved cells.pi: D -> Omaps retained cells to public report buckets.h: D -> Ris a fixed retained-cell target value.qis a probability distribution overD.Qis the admissible class of retained-cell distributions.psi(q) = sum_d h(d) q(d)is the aggregate being audited.
The public law is the pushforward pi#q. For a fixed observed public law p,
the primary interval is:
lower = inf { psi(q) : q in Q, pi#q = p }
upper = sup { psi(q) : q in Q, pi#q = p }
ambiguity = upper - lower
This is the hidden-composition ambiguity conditional on:
the retained finite refinement support,
the supplied cell-level target values,
the public projection,
the chosen admissible set
Q.
Nothing in this definition says that D is the true complete state space. It
is the state space the audit has chosen to retain and stress. If substantively
important refinements are absent from D, the interval does not protect
against them.
Target Contract¶
The default target contract is:
retained cell d -> fixed scalar h(d)
aggregate -> q-weighted average of h(d)
This covers many common review metrics when expressed at the right unit:
rates,
means,
average scores,
expected loss rates,
default rates,
loss-given-default averages,
average treatment effects or uplift scores supplied by an external estimator.
The phrase “fixed scalar” matters. Once from_dataframe(...) compiles one
finite problem, updatesupport treats the retained-cell target values as
inputs.
It does not update them when q changes. If a ProcedureTarget is supplied,
procedure-aware workflows compile a fresh target for each public representation
or scenario before constructing that finite problem.
What Is Not Covered Automatically¶
Many useful targets are not fixed linear functionals in their native form. Those targets are not invalid, but they need explicit handling.
Ratio Targets¶
Some ratios can be made linear by choosing the right weight.
For example, expected loss rate can be written as an exposure-weighted mean:
EL rate = sum_i exposure_i * pd_i * lgd_i / sum_i exposure_i
If exposure defines the row or cell weight, the compiled target is the
exposure-weighted mean of pd * lgd, which is linear in the normalized
exposure distribution.
But an arbitrary ratio:
T(q) = numerator(q) / denominator(q)
is not the same thing unless the denominator is fixed by the chosen measure or the ratio has been deliberately reformulated. If the denominator can move under the hidden-composition stress test, the current linear interval is not a bound for the native ratio without additional math.
Moment Transforms¶
Targets like:
T(q) = g(E_q[a], E_q[b], E_q[c])
are nonlinear unless g is affine. Examples include squared means, calibrated
indices, nonlinear risk scores, and transformed moments.
The current library can audit a supplied scalar cell value such as
h(d) = g_d, but that is different from optimizing the global nonlinear
functional g(E_q[a], E_q[b], E_q[c]).
MomentTransformTarget makes this boundary explicit. If g is affine and the
target declares affine_coefficients, then:
g(E_q[m_1], ..., E_q[m_k])
= c + sum_j a_j E_q[m_j]
= sum_d (c + sum_j a_j m_j(d)) q(d)
so the target is a fixed linear target in equivalent retained-cell form. Those affine moment transforms support adequacy checks, interval solving, and public-fiber decomposition.
Non-affine moment transforms are supported only when the declared mathematical shape justifies the requested operation:
if
gis convex and a DCP-validcvxpy_transformis supplied, minimization is a convex problem and the lower endpoint can be exact;if
gis concave and a DCP-validcvxpy_transformis supplied, maximization is a convex-compatible problem and the upper endpoint can be exact;if
gis monotone in every bounded moment, the library can produce a conservative two-sided interval by optimizing each moment separately and applyinggto the monotone box corners.
Those monotone box endpoints may not be jointly attainable. The resulting
interval is therefore valid as a conservative bound, not necessarily a sharp
identified interval. Non-affine moment transforms also do not claim public
adequacy or additive public-fiber decomposition support, because retained-cell
point ranges of g(m(d)) are not, in general, the same object as variation in
g(E_q[m]).
Distributional Targets¶
Quantiles, tail probabilities at endogenous thresholds, Gini coefficients, AUC, KS statistics, top-decile shares, and approval-rate-at-threshold metrics are not fixed linear averages in general.
Some distributional targets can be bounded with specialized linear, convex, or mixed-integer formulations. The current public API does not claim those bounds.
Representation-Dependent Targets¶
The trickiest case is a target that changes when the public representation changes. Examples:
the analyst refits a model after adding a public bucket,
subgroup estimates are shrinkage-adjusted differently under a finer public table,
bins are recalibrated after refinement,
a public-cell estimator uses within-cell sample size or regularization,
a causal estimator recomputes effects after changing reported covariates.
Then the object is not one fixed psi(q). It is a reporting procedure:
public representation -> compiled target values -> reported aggregate
ProcedureTarget supports this as a workflow-level object. The compiler
receives a ProcedureTargetContext containing the public columns, hidden
columns, weights, sparse-cell threshold, and Q preset, then returns a concrete
column name or RowMetric. Each compiled finite problem is still a fixed-target
transport problem. Comparisons across refinements, sensitivity scenarios, or
frontier candidates are therefore procedure-comparison sensitivity analyses,
not transport intervals for one unchanged target.
Composition-Dependent Structural Targets¶
If the target value itself depends on the transported retained-cell distribution:
h = h(d, q)
then the aggregate is a nonlinear or equilibrium functional T(q), not
sum_d h(d) q(d). Examples include interference, capacity effects, market
equilibrium, feedback policies, or model outputs that change when portfolio
composition changes.
The current adequacy, fiber-range, witness, and refinement formulas do not apply directly to that setting.
Public Adequacy¶
For the current fixed linear target, a support or reporting partition S is
adequate when:
S#q1 = S#q2 implies psi(q1) = psi(q2)
for every admissible q1, q2 in Q.
Public adequacy is the special case where S is the public partition induced by
pi. If public adequacy is false, then at least one admissible hidden
composition shift preserves the public representation while changing the
linear aggregate target.
For a general nonlinear target T(q), the analogous condition would be:
S#q1 = S#q2 implies T(q1) = T(q2)
That is a different mathematical problem. The current least-support and
fiber-range shortcuts are not valid for arbitrary T.
Saturated Reweighting¶
The saturated preset fixes the observed public law and allows arbitrary
reweighting among retained cells inside each public fiber.
For the current fixed linear target, let:
range(o) = max_{d: pi(d)=o} h(d) - min_{d: pi(d)=o} h(d)
Then the observed-law saturated ambiguity is exactly:
sum_o p(o) range(o)
The lower endpoint puts each public bucket’s mass on the lowest-target retained cell in that bucket. The upper endpoint puts the same public mass on the highest-target retained cell. Because public buckets are disjoint and the public law is fixed, the bucket-level contributions add. This is why the report can decompose saturated ambiguity into public-fiber contributions:
contribution(o) = p(o) range(o)
ambiguity = sum_o contribution(o)
For saturated environments with an explicitly fixed public law, public fibers with zero admissible mass are irrelevant to adequacy. Target variation in a zero-mass public fiber cannot move the aggregate because no admissible distribution can place mass there.
Linear and Convex Backends¶
The finite linear backend uses scipy.optimize.linprog.
The simplex constraints are implicit:
q(d) >= 0andsum_d q(d) = 1.Public-law constraints are linear equalities.
User-supplied bounds and linear constraints are added directly.
The objective is the fixed linear target
sum_d h(d) q(d).Linear objectives over polytopes attain extrema at feasible optima, so the reported lower and upper values are the correct LP interval endpoints when the LP solves successfully.
The CVXPY backend currently generalizes the admissible set Q, not the target
functional.
The target objective remains linear in
q.Built-in and custom CVXPY constraints define a convex feasible set.
CVXPY solves the lower and upper optimization problems separately.
Dual diagnostics are KKT-style local sensitivity diagnostics for the solved problem; they are not causal explanations or global feature importance.
This distinction matters: CVXPY support does not mean that arbitrary nonlinear aggregate targets are currently supported. It means convex constraints on the admissible retained-cell distribution are supported for the same fixed linear target.
Parameterized CVXPY reuses the same symbolic problem while changing parameters such as a radius. Tests compare parameterized and standard CVXPY backends on the built-in divergence presets.
Meaning of the Q Presets¶
Each Q preset defines an explicit admissible retained-cell composition stress test.
preset |
admissible set |
|---|---|
|
only the observed retained-cell distribution |
|
fixed public law, arbitrary retained-cell reweighting inside public fibers |
|
fixed public law and |
|
fixed public law and `0.5 * |
|
fixed public law and |
|
fixed public law and |
|
fixed public law and transport cost from |
Here q0 is the observed retained-cell distribution. The presets do not
estimate which stress test is true. They make the stress test explicit and then
solve it exactly or numerically under that definition.
Tabular Statistical Semantics¶
from_dataframe(...) compiles rows into the finite linear target contract.
Hidden states are retained finer cells, meaning cells not shown in the public report.
The retained-cell target
h(d)is the weighted empirical mean of the target within retained celld.The observed retained-cell distribution
q0is the normalized retained cell weight.The observed public law is the pushforward of
q0.
This is statistically sound as a plug-in finite empirical analysis: the optimization treats the compiled cell means and weights as the inputs being audited.
It deliberately does not claim that those inputs are known without error. If cell means are estimated, modeled, survey-weighted, or causal-effect estimates, their standard errors, bootstrap intervals, survey-design uncertainty, or model uncertainty should be accounted for explicitly.
When retained-cell estimator standard errors are supplied through
target_standard_error=... or effect_standard_error=..., updatesupport
constructs an UncertainLinearTarget. The base interval remains:
lower = inf { sum_d mu(d) q(d) : q in Q, pi#q = p }
upper = sup { sum_d mu(d) q(d) : q in Q, pi#q = p }
where mu(d) is the retained-cell point estimate. The report then adds:
se(q) = sqrt(sum_d (se(d) q(d))^2)
assuming independent retained-cell target-estimation errors after compilation.
If lower and upper witness distributions are available, the report evaluates
se(q) at those endpoint witnesses and widens each endpoint by
confidence_multiplier * se(q).
The report also emits a conservative fixed-public-law outer interval using:
se_conservative = sqrt(sum_o (p(o) max_{d: pi(d)=o} se(d))^2)
This bound is deliberately wider when the retained cell that maximizes estimator standard error is not the same retained cell that maximizes or minimizes the point estimate. It is not an exact joint nonconvex solve over both retained-cell composition and target-estimation error. It is a transparent reporting adjustment that keeps statistical uncertainty and hidden-composition ambiguity visible as separate quantities.
When the selected Q backend is CVXPY-compatible, the report may also include an SOCP confidence-core diagnostic:
core_lower = sup { mu(q) - z se(q) : q in Q, pi#q = p }
core_upper = inf { mu(q) + z se(q) : q in Q, pi#q = p }
The lower-core problem is a concave maximization and the upper-core problem is a convex minimization, so both are disciplined convex/SOCP-compatible. This diagnostic computes the intersection of all composition-specific estimator-adjusted confidence bands. It is not an outer partial-identification interval. A nonempty core means every admissible retained-cell composition shares a common estimator-adjusted value range. An empty core means retained-cell composition shift can separate the estimator-adjusted bands.
The min_cell_weight option changes the retained finite support. That can make
reports less sensitive to one-off sparse cells, but it also changes the
estimand to the retained support. Data diagnostics report dropped cells,
dropped mass, missing category encoding, singleton public fibers, and
constant-target fibers so that this choice is visible.
Causal Inference Semantics¶
In causal workflows, updatesupport audits reported effects after a causal
estimator has produced row-level, subgroup-level, or retained-cell-level effect
values.
The library does not:
identify causal graphs,
choose adjustment sets,
estimate treatment effects,
prove ignorability,
correct interference, positivity, or measurement problems.
It does:
take supplied effect estimates as fixed
h(d)values,hold the public reporting distribution fixed,
stress retained-cell composition under the selected
Q,report how much the aggregate fixed-effect summary could move,
keep causal estimate, statistical uncertainty, hidden-composition ambiguity, and refinement recommendations separate.
If the causal estimator is refit under each representation, or if the effect function changes with the transported distribution, the current fixed-target interpretation no longer applies. That workflow should be documented as a procedure-level sensitivity analysis.
Refinements, Sensitivity, and Frontiers¶
Refinement recommendations are deterministic re-runs of the same fixed-target interval after promoting a candidate hidden column into the public representation. A candidate is ranked by:
baseline ambiguity - refined ambiguity
This is a reporting-stability recommendation. It is not a claim that the variable is causal, a confounder, or operationally worth collecting.
Sensitivity reports evaluate the same public representation across a grid of Q presets, sparse-cell thresholds, or retained refinement definitions. They summarize how conclusions change across declared scenarios. The grid is not a posterior distribution and does not assign probabilities to scenarios.
Public-representation frontier search compares candidate public bucket designs by public-cell count and ambiguity. Exhaustive search is exact over the declared candidate set. Greedy and beam search are heuristics; their reports include trace metadata so the user can see when a frontier is approximate.
If target values are recomputed for each candidate representation, frontier
results compare reporting procedures rather than one fixed target transported
over different public projections. ProcedureTarget makes that claim explicit
in report metadata.
Ratio Targets¶
RatioTarget(numerator, denominator) represents the fixed linear-fractional
functional:
psi(q) = sum_d n(d) q(d) / sum_d w(d) q(d)
The current ratio slice is intentionally narrow and explicit:
denominator values must be strictly positive on retained cells;
FiniteEnvironmentscan evaluate ratios directly on enumerated admissible distributions;PublicFiberSaturatedsolves fixed-public-law ratio extrema exactly with a Charnes-Cooper linear-program transform;CvxpyEnvironmentssolves local and fixed-public-law ratio extrema with CVXPY disciplined quasiconvex programming (solve(qcp=True));if the denominator is constant over the state space, the ratio reduces to a fixed linear target and can use the existing linear LP/CVXPY backends;
variable-denominator ratios under the finite-linear LP backend, parameterized CVXPY backend, or pairwise same-support-law global CVXPY problems without a fixed public law still raise
UnsupportedTargetError.
For a fixed public law p, the saturated ratio interval solves:
lower = inf { (n . q) / (w . q) : q in Q_sat, pi#q = p }
upper = sup { (n . q) / (w . q) : q in Q_sat, pi#q = p }
The Charnes-Cooper transform sets y = q / (w . q) and
tau = 1 / (w . q). The ratio objective becomes linear:
n . y
and the constraints become:
w . y = 1
sum_{d in pi^{-1}(o)} y_d = p_o tau
y >= 0, tau >= 0
This is a linear program, so the fixed-public saturated ratio interval is an exact partial-identification interval for the declared finite problem.
Ratio targets do not have the same additive public-fiber decomposition as linear targets. Reports therefore treat public-fiber tables for ratio targets as point-range diagnostics, not as additive shares of total ambiguity.
What Future Nonlinear Support Would Need¶
A sound nonlinear extension should make the target contract explicit, for example:
LinearTarget(h)
UncertainLinearTarget(mu, se) # linear point target with report-level SE widening
RatioTarget(numerator, denominator) # supported for finite/saturated Q
MomentTransformTarget(moments, transform) # affine, one-sided CVXPY, monotone boxes
CvxpyTarget(objective_builder)
Each target type would need its own adequacy condition, interval solver, witness
construction, report language, and tests. Affine moment transforms are already
reduced to fixed linear retained-cell target values; convex/concave moment
transforms expose only the DCP-compatible endpoint; monotone moment transforms
can expose conservative box bounds. Some remaining nonlinear targets are
convex or linear-fractional and can be solved cleanly. Some require
mixed-integer optimization or only admit conservative bounds.
Representation-dependent procedures are currently treated as scenario
comparisons through ProcedureTarget, not as a single transported nonlinear
functional.
Until a broader target-functional layer exists, unsupported nonlinear targets should either be:
reduced explicitly to a fixed linear plug-in target,
audited through externally computed scalar retained-cell values with the limitation stated,
kept out of the core soundness claim.
The current API includes guardrails for this boundary. UnsupportedTarget can
be used as an explicit marker for quantile, distributional, or other nonlinear
target objects that are not supported. Passing one into FiniteProblem or
from_dataframe(...) raises UnsupportedTargetError instead of silently
treating it as a linear target. Passing an uncompiled ProcedureTarget directly
to FiniteProblem also raises; pass it to from_dataframe(...) or a
procedure-aware workflow instead.
Implementation Checks¶
The test suite exercises the current mathematical contract directly:
saturated closed-form fiber-range formulas,
saturated ratio-target intervals via Charnes-Cooper LP,
affine moment-transform targets and capability guardrails for nonlinear moment transforms,
uncertain linear targets, including retained-cell standard-error aggregation estimator-uncertainty-aware report intervals, and SOCP confidence-core diagnostics,
procedure-target compilation and recompilation across tabular, report, and frontier workflows,
fixed public-law saturated witnesses and zero-mass public fibers,
finite-environment witness construction,
linear-program local and global transport intervals,
the line-segment no-least-support example,
CVXPY DQCP local/fixed-public-law ratio intervals,
CVXPY custom convex constraints,
TV, chi-square, KL, and Wasserstein budget presets,
parameterized CVXPY equivalence to standard CVXPY on the preset grid,
tabular compiler validation and diagnostics,
report/refinement/frontier structured outputs.
The code also validates distribution normalization, nonnegative weights, finite targets, public-law normalization, valid partition refinements, and nonnegative divergence radii/costs.
What Would Make a Claim Unsound¶
The reported interval can be misleading if:
a nonlinear target is silently interpreted as a fixed linear target,
a representation-dependent estimator is refit but described as one unchanged transported target rather than a
ProcedureTargetworkflow,the retained refinement space omits important relevant cells,
retained-cell target values are noisy but treated as exact without separate uncertainty reporting,
the chosen Q preset is not a plausible stress test for the application,
min_cell_weightdrops substantively important cells,public buckets encode post-treatment or otherwise inappropriate variables in a causal workflow,
greedy or beam frontier search is read as exhaustive.
These are modeling and interpretation risks, not undocumented behavior in the optimizer. The library is designed to make the finite support, target, public projection, Q preset, diagnostics, and limitations inspectable.
Bottom Line¶
updatesupport is sound for the question it currently asks:
Conditional on the finite retained support, fixed retained-cell target values, selected public representation, and explicit admissible retained-cell composition class, how much can the fixed linear aggregate move while the public distribution is held fixed?
That is a well-defined finite optimization problem. The core library solves it
by closed form, linear programming, or convex optimization depending on Q, and
reports the result separately from statistical and causal uncertainty.
If the aggregate target is nonlinear or representation-dependent, the project
should say so explicitly and either reformulate it as a fixed supported target,
use ProcedureTarget for procedure-comparison workflows, or add a dedicated
target-functional solver mode.