Elo
A sequential rating. Every team starts at 1500. For each match, the two alliances play as the mean of their members' ratings, and the expected result comes from the standard logistic curve:
expected_red = 1 / (1 + 10 ^ ((rating_blue - rating_red) / 400)) actual = 1 if red won, 0.5 if tied, 0 if red lost change = K x (actual - expected) with K = 32 every red member: rating += change every blue member: rating -= change
The 400 is what makes a 400-point gap mean roughly a 10:1 expected win ratio — it is the constant that defines the scale, not a tuned parameter. K = 32 is how far one match can move a rating, and it is a choice: higher reacts faster and is noisier, lower is stabler and slower to notice a team improving.
Alliances use the mean rather than the sum so ratings stay on the familiar ~1500 scale and a two-team alliance stays comparable to the one-team entries that appear in some elimination records. Every member takes the same update — the model cannot tell which partner was responsible.
Matches are replayed in order. Where a match has no scheduled time — which is every elimination match, since those are not pre-scheduled — the order falls back to event date plus round, instance and match number, which within an event is the exact order rather than an approximation.
What Elo can and cannot tell you
Unlike OPR it carries across events, which is what makes it the default ordering of the teams table. But it only links events that share teams. Your catalog currently has 27 separate pools; ratings in different pools never exchanged information, so comparing across them compares independent random walks. A team outside the main pool is flagged on its own page.
Elo is zero-sum — every point won is a point lost — so the mean across all 3672 rated teams is 1500 by construction, with a standard deviation of 71. Observed range 1198 to 1883, median 1490.
OPR, DPR and CCWM
These separate a team from its partners, which win rate and average score cannot do. Each alliance in a match is one equation — the sum of its members' ratings should equal its score — and the whole event is solved at once by least squares:
A x = s A = one row per alliance, 1 where a team played
x = the per-team rating being solved for
s = that alliance's score -> OPR
s = the opposing alliance's score -> DPR
CCWM = OPR - DPR
OPR is what a team contributed to its own alliance's score. DPR is what it allowed the opposition — lower is better. CCWM is the difference, and it is the one to lead with.
Why DPR earns its place: at your Mall of America event the undefeated winner ranked only 6th on OPR. Their scoring was ordinary; what made them unbeatable was holding opponents near zero. Only DPR sees that, and CCWM put them 1st. OPR and DPR correlate at just −0.28 there, so DPR is not OPR mirrored.
Read them as rankings, not quantities
At that event the fit was R² 0.343 — residual RMS 29.96 points against a score spread of 36.95. So it explains about a third of score variance, and each team's figure rests on roughly five alliances. DPR can come out slightly negative; a team cannot cause negative opponent points, that is the fit overshooting. And a team playing pure defense suppresses rather than scores, so it reads as low OPR and low DPR.
They are only comparable within one event. Teams at different events never shared a match, so the systems are separate and sit on unrelated scales. The teams table shows an average across a team's events as a rough guide; the per-event figures on a team page are the real numbers.
Event importance
A judgement dressed as a number. The weights are a choice, not a measurement, which is why the three parts are shown under every score as level/size/strength instead of being collapsed into one opaque figure.
| Component | Weight | What it reads |
|---|---|---|
| Level | 45% | The event's own classification from the API — World 100, National 85, Signature 75, Regional 60, State 50, Other 20 |
| Field size | 25% | Registered teams, log-scaled against a reference of 120 so the gap between 10 and 30 counts more than between 90 and 110 |
| Field strength | 30% | Mean Elo of registered teams that have one, needing at least 3 rated teams |
When field strength is unknown, the weights are renormalised over what is known rather than scoring the event as weak. Otherwise the column would measure how much data we happen to have, and every upcoming event would sink below every past one for reasons unrelated to importance. A · in the strength slot means exactly that.
Known problem with the strength term
The Elo-to-score mapping runs 1400 → 0 and 1800 → 100. Those numbers were chosen, not derived, and measuring shows they are badly calibrated.
| Aggregate over 472 rated fields | Min | Median | Max | Span | Of the 400-point scale |
|---|---|---|---|---|---|
| Mean Elo of a field (used now) | 1438 | 1505 | 1669 | 231 | 58% |
| Mean Elo of a field's top 10 | 1438 | 1549 | 1760 | 323 | 81% |
Every field mean in your catalog falls between 1438 and 1669 — a 231-point span inside a 400-point scale. So the strength component can only ever produce values in a narrow band, and contributes close to a constant for every event. It is currently a poor discriminator, and that is a calibration fault, not a property of the data.
The cause is that Elo is zero-sum: a large field contains its weak teams alongside its strong ones, so the mean regresses to 1500 no matter who attends. Ranking by the top of a field instead gives 1.4× the spread, and calibrating the endpoints to the observed range rather than to round numbers would use the whole scale.
Smaller rules worth knowing
| Number | How it works |
|---|---|
| Record and win rate | Only from matches with both scores recorded. A team with none shows “—”, never 0–0–0, which would read as “played and never won”. |
| Team OPR/DPR/CCWM in the teams table | Averaged across that team's events, not their best — OPR rests on about five matches per event, so a best-of mostly measures which event was noisiest in their favour. |
| Allies | Sorted by elimination partnerships first. A qualification partner is a random draw; an elimination partner was chosen in alliance selection. The record shown is the pair's record in matches they played together. |
| Event grade | Derived from the grades of registered teams, never from the event name — checked against known rosters, names were wrong or silent about 45% of the time. Called for a grade at 90% or more of one grade, otherwise “Blended”. |
| Match dates | Exact where the schedule has a time. Every elimination match lacks one, so those show the event's date range in italics. |
| Regions | The US is split into seven regions and everywhere else grouped by country, mirroring who a team actually competes against. The whole United States is selectable too, above its regions in the menu — its count is the sum of them, including the “Other” bucket that catches an unrecognised state. |
| Elimination bracket | Derived from matches, never stored, so it cannot disagree with them. Series are decided by which set of teams won more games, not by alliance colour. |
| Programs | VEX V5 and the other program keep separate catalogs. Team numbers are reused between them, so one table keyed by number would merge two different teams into one record. |
472 of 1160 events currently have enough rated teams for the strength term to fire at all.