Live demo

A stream, two models, and a fat-finger button. The forecasters are the skaters JavaScript twin; the baseline is a port of river's recommended pipeline.

A signal x drives a target y. Both models predict y one step ahead, then learn, then move on. They see the same data.

So the baseline has more history to work with. Press a button to corrupt a reading (six to ten sigma, as in the benchmark study). The baseline divides by a running mean and deviation, so the bad tick reaches the model at full size and skews those running statistics for a while. The fronted model sees a surprise value, which is capped near 7. On clean data the baseline is slightly ahead, by the amount the papers page reports.

river-style pipeline, running MAE
ice-skaters fronted, running MAE
fronted error as share of baseline

The target, and what the forecaster expected

actual y forecaster's expectation ▲ corrupted reading

The surprise z of each arriving y

Near zero when the value was expected, capped at ±7.03 however extreme the reading.

Running MAE, last 400 ticks

river-style pipeline ice-skaters fronted

Both models run at their defaults and see identical observations. The corruption you inject is measurement error on the observed values, not on the truth the errors are scored against. Source: this page and docs/js/ice-skaters/index.mjs, dependency-free ES modules.