Massey Ratings

Overview

The Massey method is the least-squares counterpart to the Colley Matrix Method. Introduced by Kenneth Massey in 1997 and used as one of the computer rankings in the college-football Bowl Championship Series, it fits every competitor a rating such that the difference between two ratings is a least-squares estimate of the margin by which one would beat the other. Like Colley it solves a single linear system over the whole match history rather than nudging ratings after each game, so it is bias free: the ratings depend only on the set of results, not on the order they were played in.

Where Colley produces win-percentage-like ratings bounded to [0, 1], Massey produces zero-mean ratings on a signed margin scale. Roughly half of them are negative, and r_a - r_b reads directly as a predicted margin.

How It Works

Massey’s method builds the linear system

\[M\,r = p\]

where \(M = D - A\) is the match graph’s Laplacian – \(D_{ii}\) is the number of games played by competitor \(i\) and \(A_{ij}\) is the number of games between \(i\) and \(j\) – and \(p_i\) is competitor \(i\)’s cumulative margin.

Because every row of \(M\) sums to zero, the matrix is singular by construction: adding a constant to every rating leaves the system unchanged. The standard fix is applied here: the last row of \(M\) is replaced with all ones and the last entry of \(p\) with zero, which adds the constraint

\[\sum_i r_i = 0\]

and makes the solution unique on a connected schedule. As with Colley, the fit is recomputed over the connected group of competitors after each recorded result, and the expected score between two competitors is a logistic function of their rating difference:

\[E_a = \frac{1}{1 + e^{-s\,(r_a - r_b)}}\]

with a class-configurable scale \(s\) (default 2.0).

Margins

beat / lost_to / tied accept the common optional scores payload – the two competitors’ scores in the argument order of the call. When it is supplied, this is genuine margin-of-victory Massey, the form used in college-football rankings, where a 35-3 win counts for more than a 7-6 win: the margin a game contributes is self_score - competitor_score.

from elote import MasseyCompetitor

team_a, team_b = MasseyCompetitor(), MasseyCompetitor()

team_a.beat(team_b, scores=(35, 3))          # +32 for A, -32 for B
# The same game recorded from the loser's side -- scores stay in caller order:
# team_b.lost_to(team_a, scores=(3, 35))

Through an arena the pair is always given in (a, b) order, whichever competitor won, together with an explicit outcome so the two can be checked for agreement:

from elote import LambdaArena, MasseyCompetitor

arena = LambdaArena(lambda a, b: True, base_competitor=MasseyCompetitor)
arena.matchup("Team A", "Team B", outcome=1.0, scores=(35, 3))
arena.matchup("Team A", "Team C", outcome=0.0, scores=(7, 24))   # C won, order unchanged

When scores is omitted the implementation falls back to unit margins: a win contributes +1 to the winner’s cumulative margin and -1 to the loser’s. A draw contributes 0 either way – the payload for a draw must have two equal scores – while still counting as a game played for both. Unit-margin Massey is a close relative of Colley on a signed scale: both use only who beat whom, and neither can be gamed by running up the score.

Scores must be non-negative and finite, and must agree with the result being recorded; anything else raises ValueError before either competitor is touched.

Advantages

  • Order Independent: the ratings depend only on the set of results, not the schedule order.

  • Interpretable Differences: a rating difference is a predicted margin, not just an ordering.

  • Well Grounded: a clean least-squares interpretation with a unique zero-mean solution.

  • Self-Normalizing: the ratings of a connected group always sum to zero.

Limitations

  • Recomputes Globally: like Colley and Bradley-Terry, each result re-solves the whole connected group, which is more expensive than Elo’s constant-time update for very large populations.

  • Scores Are Optional: margin-of-victory Massey needs a score for every game. Where scores are unavailable the fit falls back to unit margins, which discards exactly the information the classical method is built on.

  • Negative Ratings: ratings are zero mean, which is unfamiliar next to a 1500-centered chess scale (_minimum_rating is therefore -inf for this system).

  • Connectivity Needed: groups of competitors that never play each other cannot be compared, and are rated independently of one another.

Implementation in Elote

Elote implements Massey Ratings through the MasseyCompetitor class:

from elote import MasseyCompetitor

# Every competitor starts at 0.0
team_a = MasseyCompetitor()
team_b = MasseyCompetitor()
team_c = MasseyCompetitor()

# Get win probability
print(f"Team A win probability: {team_a.expected_score(team_b):.2%}")

# Record results; the whole connected group is re-solved after each one
team_a.beat(team_b)
team_a.beat(team_c)
team_b.beat(team_c)

print(f"Team A: {team_a.rating:.3f}")   # 0.667
print(f"Team B: {team_b.rating:.3f}")   # 0.000
print(f"Team C: {team_c.rating:.3f}")   # -0.667

Customization

Key parameters:

  • initial_rating: starting rating value (default: 0.0).

  • expected_score_scale: class-level logistic scale used by expected_score (default: 2.0), settable with MasseyCompetitor.configure_class(expected_score_scale=...).

Real-World Applications

  • College Football: one of the computer polls used in the BCS era.

  • Sports Rankings: any competition where a predicted margin is more useful than a bare ordering.

  • Tournament Seeding: producing an order-independent ranking from recorded results.

References

  1. Massey, K. (1997). “Statistical Models Applied to the Rating of Sports Teams”. Bluefield College undergraduate honors thesis. https://masseyratings.com/theory/massey97.pdf

  2. Langville, A. N., & Meyer, C. D. (2012). Who’s #1? The Science of Rating and Ranking, chapter 2. Princeton University Press.