gum_expanded — SPC uncertainty op

• Data kinds: table → table

• Call: import fullseye as fs; fs.ledger.gum_expanded(table, u='u', sensitivity='sensitivity', dof='dof', level=0.95, correlation=None, estimate=None, lower_bound=None, upper_bound=None) (to call the implementation directly, import spc; spc.gum_expanded(table, u='u', sensitivity='sensitivity', dof='dof', level=0.95, correlation=None, estimate=None, lower_bound=None, upper_bound=None); from the registry, opsspc.get("gum_expanded"))

• GPU: none (CPU reference implementation only)

Usage

Welch-Satterthwaite effective degrees of freedom, coverage factor k and expanded uncertainty U (table).

nu_eff = u_c^4 / sum_i (c_i u_i)^4 / nu_i U = k u_c, k = t_{p}(floor(nu_eff))

★ There are 3 exact properties usable as a gate:

• With only 1 component, nu_eff == nu (exact).

• nu_eff >= min_i nu_i always holds. Proof: sum u_i^4/nu_i <= (1/nu_min) sum u_i^4 <= (1/nu_min)(sum u_i^2)^2. If the effective degrees of freedom fall below those of the smallest component, the computation is broken.

• If all degrees of freedom are infinite, k converges to the quantile of the normal distribution (1.959964 at 95 %).

For infinite degrees of freedom (known constants and the like) put numpy.inf.

★★ Degrees of freedom with correlation. Welch-Satterthwaite (GUM G.4.1) assumes independent inputs; applied as is to a u_c that contains correlation terms it inflates the degrees of freedom (two equal components, nu=4 each, r=+1 give nu_eff=32 -- more than the budget's total of 8). With negative correlation it collapses below 1 instead. So when *correlation* has a non-zero off-diagonal entry, the components linked by non-zero correlation are merged into one group, and Welch-Satterthwaite is built from the group variance w_g' R_g w_g (w = c u) and the group's degrees of freedom min_{i in g} nu_i::

nu_eff = u_c^4 / sum_g (w_g' R_g w_g)^2 / min_{i in g} nu_i

Rationale: for correlated components estimated from the same measurements (a Wishart covariance with a common nu), the estimator of the combined variance is exactly sigma^2 chi^2_nu / nu, so the effective degrees of freedom are nu itself whatever r is (consistent with Willink, *Metrologia* 44:340, 2007, whose generalised Welch-Satterthwaite gives nu for two equal components with r=+1). When components with different degrees of freedom are correlated the minimum is taken -- a rule of this implementation that leans to the safe side (a larger k), not a formula of the standard. If every correlation is 0 (or the matrix is the identity) every group has one component and the value equals the classical formula.

References (sample data, literature)

• Sample-data catalog (download URLs / licences) — 2-D uses skimage.data (BSD/public domain) plus synthetic images; 3-D lists download URLs for real data sources (Stanford, PDS, …).

• Operator provenance and references — the sources of the research/methods this op family came from.

• The canonical algorithm (author, year) and its uses are named in the family usage guide above.

Runnable examples (verified samples that actually call this op)

• poc_light_section_step_weld_floor — py -3.11 examples/poc_light_section_step_weld_floor.py

• poc_measurement_system_analysis — py -3.11 examples/poc_measurement_system_analysis.py

Ops the type connects to (they accept table as input)

msa_anova_table · msa_gauge_rr · msa_bias_linearity · msa_attribute_agreement · gum_standard_uncertainty · gum_propagate · gum_monte_carlo · gum_validate

Same category (uncertainty)

gum_standard_uncertainty · gum_propagate · gum_monte_carlo · gum_validate


*Provenance: spc.py — SPC operator registry. This per-op note is generated by tools/opdocs.py md (do not hand-edit).*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.