gum_validate — SPC uncertainty op

• Data kinds: table × table → table

• Call: import fullseye as fs; fs.ledger.gum_validate(guf, mcm, ndig=2) (to call the implementation directly, import spc; spc.gum_validate(guf, mcm, ndig=2); from the registry, opsspc.get("gum_validate"))

Usage

Validate the propagation-law result against the Monte Carlo result (table).

*guf* is the return of gum_expanded (called with estimate to produce an interval), *mcm* is the return of gum_monte_carlo. The procedure follows clause 8.1.3 of the standard:

1. Build the numerical tolerance delta corresponding to u(y). Writing z in the form c x 10^l (c an integer of *ndig* digits), delta = 0.5 x 10^l.

2. Compute dlow = |y - U - y_low| and dhigh = |y + U - y_high| -- what is compared are the endpoints of the coverage interval, not U itself.

3. If both are at most delta, the propagation law is taken as validated for that instance.

★ Do not confuse "it agreed" with "it should have agreed". What this op returns is agreement as seen at *ndig* digits, not truth. Raising *ndig* makes the same numbers disagree -- measured (additive model, rectangular inputs, endpoint difference 0.04):

ndig=1 -> delta 0.5 agree

ndig=2 -> delta 0.05 agree (barely)

ndig=3 -> delta 0.005 disagree

So ndig is "how many digits you claim", and strengthen the claim and the propagation law fails validation. The default 2 is the upper side of the values the standard calls typical (1 or 2).

★★ When the output is symmetric, comparing endpoints is inherently stricter than comparing widths. The width of the shortest interval W(a) = F(a+w) - F(a) becomes a flat valley at the centre of a symmetric distribution with W' = 0 and small curvature, so the width is determined accurately but the argmin (position) is not. Measured on a 4-component additive model (normal) with 12 seeds each:

n sd of half-width sd of interval centre ratio

200,000 0.0054 0.0284 5.2

1,000,000 0.0035 0.0146 4.1

5,000,000 0.0011 0.0114 10.0

★ This applies only to symmetric (or nearly symmetric) outputs. For skewed outputs the optimum is uniquely and strongly determined, so the position also converges normally at 1/sqrt(n) -- measuring a sum of squares (strong skew) the same way gives a ratio of position sd / width sd of 1.0 (both at n=200,000 and at n=1,000,000). Monte Carlo lands straight on the published values in the standard's comparison loss example for that reason.

Therefore, when dlow / dhigh are large and the output is symmetric, it is often not an error of the propagation law but the jitter of Monte Carlo's position finding. Even with normal inputs, which should agree exactly in theory, ndig=3 (delta=0.005) at n=5,000,000 passes in only 2 of 5 runs.

★ The interval estimator itself has no bias. Against the exact solution for 1 normal component (half-width 1.959964) the measured bias shrinks from −0.0060 at n=50,000 to −0.000008 at n=5,000,000, and the standard deviation also follows 1/sqrt(n) (0.0086 → 0.0009).

★ The standard recommends running the validation Monte Carlo to a precision of delta/5; the number of trials is about M >= 10^4 / (1 - p) (2 x 10^5 for 95 %).

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_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_expanded · gum_monte_carlo

Same category (uncertainty)

gum_standard_uncertainty · gum_propagate · gum_expanded · gum_monte_carlo


*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.