gum_propagate — SPC uncertainty op

• Data kinds: table → table

• Call: import fullseye as fs; fs.ledger.gum_propagate(table, u='u', sensitivity='sensitivity', correlation=None) (to call the implementation directly, import spc; spc.gum_propagate(table, u='u', sensitivity='sensitivity', correlation=None); from the registry, opsspc.get("gum_propagate"))

Usage

Law of propagation of uncertainty (GUM 5.2, with correlations) (table).

u_c^2 = sum_i (c_i u_i)^2 + 2 sum_{i<j} c_i c_j u_i u_j r_ij

*table* is a table with columns *u* (standard uncertainty) and *sensitivity* (sensitivity coefficient c_i = df/dx_i). Passing an (n, n) correlation matrix as *correlation* includes the correlation terms.

★ A closed form usable as a gate: for f = x y, c_x = y / c_y = x, so u_c/|f| = sqrt((u_x/x)^2 + (u_y/y)^2) -- the root sum of squares of the relative uncertainties. For 2 components with correlation r = +1 it matches u_c = |c1 u1 + c2 u2|| exactly, and for r = -1 it is |c1 u1 - c2 u2| (cancellation). Without correlation the sum of contributions closes exactly to u_c^2.

★★ The direction of the error from ignoring correlation is not fixed. "Treating them as independent underestimates" is often said, but it is false. Measuring on the standard's worked example (voltage, current and phase difference -> resistance and reactance simultaneously, all 3 quantities correlated) with the correlation dropped:

u_c(R) 0.0702 -> 0.1945 2.8x overestimate

u_c(X) 0.2961 -> 0.2009 underestimate

u_c(Z) 0.2367 -> 0.2041 underestimate

On the same 1 data set the direction flips depending on the quantity -- it is decided by the product of the sign of the sensitivity coefficient and the sign of the correlation, so it is obvious in a sense, but if you omit the correlation thinking "it errs on the safe side", you end up reporting an uncertainty nearly 3x too large for R.

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

Same category (uncertainty)

gum_standard_uncertainty · gum_expanded · 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.