How Team Ratings Are Computed

The Team Rankings come from the debate-rankings pipeline (src/main.py), which fits a ballot-level Bradley-Terry model to every decided round of the season at once. The results are written to output/<prefix>full_rankings.csv and output/<prefix>field_statistics.csv, which the site reads through debate-rankings-adapter.

Fitting the whole season together means the order rounds were debated in does not matter: a round in September counts the same as one in February, and a team's rating reflects everyone it has beaten and lost to, weighted by how strong those opponents turned out to be.

The model

Each team (or LD debater) gets a skill θ on the logit scale. The probability that the aff wins a ballot is

\[
P(\text{aff wins}) = \frac{1}{1 + e^{-(\theta_{\text{aff}} - \theta_{\text{neg}} + \beta)}}
\]

where β is one shared side term that soaks up any field-wide aff or neg advantage, so a team isn't credited for drawing the favored side.

Side balancing, prelims and elims apart

One side term isn't enough on its own, because side bias differs by round type: prelim sides are assigned, while in elims a coin-flip winner or the higher seed picks the side, so the aff can win well over half of elims in a field whose prelims are close to even. Before the fit, every ballot is weighted so that aff and neg each carry exactly half the ballot weight, separately in prelims and in elims:

\[
w_{\text{aff}} = \frac{A + N}{2A}, \qquad w_{\text{neg}} = \frac{A + N}{2N}
\]

where A and N are the aff and neg ballots of that round type. The favored side's ballots weigh less than 1 and the other side's more, and the round type's total weight is unchanged — so a team that won a run of elims on the favored side isn't over-credited, and one that won on the disfavored side gets its due. β then absorbs whatever side effect is left. If a round type has no ballots on one side, its weights stay 1.

What counts as data

  • Ballots, not just rounds. When a round lists panel votes, each ballot is its own comparison — a 3–0 is stronger evidence than a 2–1. Rounds without votes count as one ballot for the winner.
  • Majors count double. Ballots at the tournaments marked as majors have a likelihood weight of 2, on top of the side weight above.
  • Byes, forfeits and undecided rounds are skipped for the rating, though they still count toward the raw win rates.

The prior

The fit adds a ridge penalty of 1.0 on every skill — equivalent to a N(0, 1) prior. Teams with only a few ballots are pulled toward the field average, and an unbeaten team still gets a finite rating instead of running off to infinity. A team with no decided rounds sits exactly at the prior: field average, standard error 1.

From skill to the CSV columns

Skills are reported on the familiar Elo scale, where 1500 is the field average and 400 points is 10:1 odds:

ColumnFormula
Rating1500 + (400 / ln 10) × θ
Deviation(400 / ln 10) × SE(θ) — the skill's standard error in rating points
Adjusted RatingRating − 2 × Deviation — what the rank is sorted on
MatchesDecided rounds debated (aff + neg)
Aff Rating Advantage(400 / ln 10) × β — rating points the aff side is still worth, field-wide, after side balancing
Aff / Neg Side Weightw_aff, w_neg for prelim ballots
Aff / Neg Elim Side Weightw_aff, w_neg for elim ballots

Adjusted Rating is a conservative estimate: a lightly tested team with a high point estimate can't outrank a similarly rated, well-established one.

The win probability between two entries, ignoring side, is

\[
P(A \text{ beats } B) = \frac{1}{1 + 10^{(R_B - R_A)/400}}
\]

On this site

The site shows every rating 1000 points lower and divided by 8, then clamped to 0–109 (RATING_OFFSET, RATING_DIVISOR, RATING_MIN and RATING_MAX in debate-rankings-adapter). That puts the top handful of teams in each event around 100 and the weakest teams at or near 0. The shift and scale keep ranks and win probabilities unchanged; the clamp only ties the few teams past either end. The aff rating advantage, being a difference, is only divided by 8.

Ratings are shown with at least two digits (07, not 7). The leading digits, 0 through 10, are the team's tier and are shaded from gold at the top tier down to gray at the bottom, so the tier boundaries stand out as you scroll down the table.