Incremental and Global Fit Are Two Different Products
elote ships twelve rating systems and they divide cleanly into two groups that happen to share an interface.
Incremental systems keep a running number and nudge it after each result. Elo, Glicko, Glicko-2, DWZ, ECF, TrueSkill. A result arrives, both ratings move a little, the result is forgotten.
Global fit systems keep the whole match graph and re-solve it. Colley, Massey, Keener, Bradley-Terry, Whole-History Rating. A result arrives, it joins the pile, and every rating in the connected component is recomputed from scratch.
They are usually presented as a list of alternatives with different accuracy numbers. They are better understood as two different products, and the differences that matter are not the accuracy.
They disagree about what a rating is
Take 500 games, feed them to each system, then feed the same 500 games in a shuffled order and compare:
| system | family | order-independent | ratings that differ |
|---|---|---|---|
| Elo | incremental | no | 220 of 231 |
| Glicko | incremental | no | 220 of 231 |
| DWZ | incremental | no | 220 of 231 |
| Colley | global fit | yes | 0 of 231 |
| Massey | global fit | yes | 0 of 231 |
| Bradley-Terry | global fit | yes | 0 of 231 |
Not “slightly different”. Ninety-five percent of the incremental ratings change when you shuffle the order, and not one of the global-fit ratings does.
This follows directly from what each family is computing. A global fit asks: given all these results, what set of ratings best explains them? Order is not in the question, so it cannot be in the answer. An incremental system asks: given what I believed a moment ago and this new result, what should I believe now? Order is the entire mechanism.
Which means a global-fit rating is a statement about the season and an incremental rating is a state that a sequence of results left behind. Both are useful. They are not the same object, and only one of them is reproducible from the data alone.
There is a practical corner of this worth knowing: because Glicko models elapsed time, it refuses out-of-order results outright rather than silently mis-weighting them, raising rather than accepting a match dated before a competitor’s last recorded activity. Global-fit systems have nothing to object to.
They disagree about beginners
The bigger difference shows up in cold start. Here is accuracy broken out by how many games the less experienced of the two competitors had already played, over eight seasons of college football:

| system | 0-3 games | 4-8 | 9-20 | 21-50 | 51+ |
|---|---|---|---|---|---|
| Massey | 0.8722 | 0.8195 | 0.7642 | 0.6820 | 0.6617 |
| Colley | 0.8383 | 0.8195 | 0.7330 | 0.6815 | 0.6505 |
| Glicko | 0.7932 | 0.8174 | 0.7294 | 0.7013 | 0.6734 |
| Elo | 0.7143 | 0.7510 | 0.7275 | 0.6871 | 0.6680 |
At three games or fewer, Massey beats Elo by sixteen points. By fifty games the ordering has reversed.
That crossover is the whole story of the two families. A newcomer with two games has almost no information attached to them directly, but a global fit does not only use information attached to them: it uses the fact that they lost to a team that beat a team that lost to Alabama, propagated through the entire graph. An incremental system cannot do that. It has a running number that has been nudged twice from a default, and two nudges is not much.
Once a competitor has fifty games of their own, that advantage is gone, and the incremental systems’ ability to weight recent form more heavily starts to win instead.
Read the absolute numbers with care: games involving inexperienced competitors are usually mismatches, so accuracy is high in those columns for everyone. It is the gaps within a column that carry the meaning.
They disagree about cost
| system | family | walk-forward accuracy | compute |
|---|---|---|---|
| Glicko-2 | incremental | 0.7153 | <1s |
| Glicko | incremental | 0.7073 | <1s |
| Massey | global fit | 0.7058 | 9s |
| Elo | incremental | 0.6923 | <1s |
| Colley | global fit | 0.6948 | 11s |
| Bradley-Terry | global fit | 0.6992 | 298s |
An incremental update is O(1): two numbers move. A global fit re-solves a linear system or runs an iterative fit over the connected component, and it does that every time a result arrives. On 7,400 games that is the difference between a millisecond and five minutes.
If ratings are being served live, that gap is the decision, and no accuracy difference in this table is going to outweigh it.
Choosing
Incremental when results arrive continuously and ratings are read constantly. It is cheap, it tracks form, and recency is free because the mechanism is recency. This is the right default for a ladder, a matchmaker, or anything with an established population.
Global fit when the population is thin, when new competitors keep arriving, or when the rating is a judgement rather than a forecast. It is dramatically better on newcomers, it is reproducible from the data with no dependence on processing order, and that reproducibility is worth real money the first time someone asks why a rating changed.
And know which question you are asking. If two people can run your rating system on the same results and get different numbers, you picked an incremental system, and that is fine as long as it was on purpose.
Running it
from elote import group_by_period, walk_forward, MasseyCompetitor, EloCompetitor
periods = group_by_period(rows)
for cls in (EloCompetitor, MasseyCompetitor):
print(cls.__name__, walk_forward(cls, periods, warmup=23).accuracy)
pip install elote==1.3.2.
Stay in the loop
Get notified when I publish new posts. No spam, unsubscribe anytime.