A calibration is run forwards — known standards in, response out — and used backwards, response in, unknown out. Everyone reports the backwards number by fitting a curve and inverting it. The fit is an assumption, and it is never priced. This computes what the standards allow instead, under assumptions stated one at a time, and puts the published answer inside it.
The envelope is decided: it is what the standards and the stated assumption force, in closed form, and it is drawn solid. The published curve is chosen — an argmin of a fitting criterion over a family nobody derived from the data — and it is drawn dotted. Where a reading is over range and no admissible curve bounds it, there is no mark at all and the void is drawn, because "over range" is a fact about the ladder rather than a number to interpolate.
Standing is not confidence. A dotted line here is not less precise — it is often far more precise, which is exactly the problem. It is precise because something other than the data chose it. Width is drawn separately, as an extent, so the two never collapse into one channel.
The dial runs from monotone only — more analyte, more signal, which nobody disputes about a calibration and nobody uses either — through a local smoothness claim, to join the dots, which is linear interpolation between neighbouring standards and what a great many laboratories do by hand. The parametric fit sits past the end of the dial. The gap between the last rung and the fit is what the functional form is buying.
NIST Statistical Reference Datasets — Pontius. 40 observations, 20 loads applied twice. Each load was applied twice, so repeatability is measured rather than asserted: pooled s = 2.147e-4.
Published example standard curve, rat IL-6 sandwich ELISA (Abbexa abx155737). Absorbance at 450 nm, zero standard included. There are no replicates, so the error budget is an assertion — 8% CV with a 0.01 OD floor — and it stays a control on this page rather than a constant buried in the code.
The honest interval is 150,000 lb wide — exactly the ladder spacing. Without a functional form you can say which two calibration points you are between, and nothing finer.
On a fine ladder with small noise the functional form buys nothing: linear interpolation lands on the reported precision. That precision was earned by the experiment, not by the model.
The opposite conclusion. The tightest claim available without a functional form is still 3.6 times wider than the four-parameter fit reports. On a coarse ladder the model is doing the work.
That pair is the point. The method does not say everyone is overconfident. It says you can tell which case you are in, and by how much — and the two cases look identical until somebody computes the set. Both reports are competent, both are standard practice, and one of them is carried almost entirely by a choice of curve.
A curve is admissible when it passes within the stated error of every standard and its slope stays in [m, M]. Every standard then bounds the curve from both sides through the slope limits, so the extreme admissible curves are a minimum and a maximum of straight lines:
U(x) = min i [ hi i + (x ≥ x i ? M(x − x i) : −m(x i − x)) ] L(x) = max i [ lo i + (x ≥ x i ? m(x − x i) : −M(x i − x)) ]
Both are nondecreasing, so reading backwards is a bisection rather than a search, and it is exact to machine precision. No linear program, no sampling, nothing to tune.
A global slope band is the wrong assertion for a curve that bends. On the assay the secants between adjacent standards already span sixteen-fold, so "the slope lies between the smallest and largest secant" constrains nothing and tightening it changes nothing. The claim people actually make is local: between two adjacent standards the response does not wander far from the line joining them. At t = 0 that is linear interpolation. The bound used is an outer one — each endpoint taken with its own error bar independently — so it is conservative, wider than the truth and never narrower, which is the direction an argument like this has to err in.
The page runs the file the tests run. envelope.js is inlined verbatim behind a four-line require shim, so the curve the slider draws comes out of the same 8399 bytes that 24 tests exercise, and out of the same function that rendered this page on disk.
| assuming | from | to | width | vs reported ± |
|---|---|---|---|---|
| a load cell, calibrated at NIST — reading 1.15 | ||||
| monotone only | 1,500,000 | 1,650,000 | 150,000 lb | 132× |
| wander ≤ ±200% | 1,526,759 | 1,627,154 | 100,396 lb | 88× |
| wander ≤ ±100% | 1,540,138 | 1,615,732 | 75,593 lb | 67× |
| wander ≤ ±50% | 1,553,517 | 1,604,309 | 50,791 lb | 45× |
| wander ≤ ±25% | 1,564,221 | 1,595,171 | 30,950 lb | 27× |
| wander ≤ ±10% | 1,572,978 | 1,587,694 | 14,715 lb | 13× |
| wander ≤ ±5% | 1,576,607 | 1,584,727 | 8120 lb | 7.1× |
| wander ≤ ±2% | 1,578,853 | 1,582,807 | 3954 lb | 3.5× |
| join the dots | 1,580,276 | 1,581,463 | 1187 lb | 1.0× |
| a rat IL-6 assay, calibrated on a dilution ladder — reading 0.9 | ||||
| monotone only | 12.50 | 25.00 | 12.50 pg/mL | 7.8× |
| wander ≤ ±200% | 13.19 | 24.28 | 11.09 pg/mL | 7.0× |
| wander ≤ ±100% | 13.55 | 23.93 | 10.37 pg/mL | 6.5× |
| wander ≤ ±50% | 13.93 | 23.58 | 9.657 pg/mL | 6.1× |
| wander ≤ ±25% | 14.23 | 23.31 | 9.079 pg/mL | 5.7× |
| wander ≤ ±10% | 14.48 | 21.66 | 7.175 pg/mL | 4.5× |
| wander ≤ ±5% | 14.58 | 21.04 | 6.456 pg/mL | 4.1× |
| wander ≤ ±2% | 14.65 | 20.71 | 6.057 pg/mL | 3.8× |
| join the dots | 14.70 | 20.50 | 5.802 pg/mL | 3.6× |
node playground/curveset/envelope.test.js # the mathematics node playground/curveset/make-page-data.js # the record node playground/build.js