Functions to compute rating and ranking using Massey method.


rank_massey(cr_data, keep_rating = FALSE, ties = c("average", "first",
  "last", "random", "max", "min"), round_digits = 7)



Competition results in format ready for as_longcr().


Whether to keep rating column in ranking output.


Value for ties in round_rank().


Value for round_digits in round_rank().


rate_massey() returns a tibble with columns player (player identifier) and rating_massey (Massey rating). The sum of all ratings should be equal to 0. Bigger value indicates better player performance.

rank_massey() returns a tibble with columns player, rating_massey (if keep_rating = TRUE) and ranking_massey (Massey ranking computed with round_rank()).


This rating method was initially designed for games between two players. There will be an error if in cr_data there is a game not between two players. Convert input competition results manually or with to_pairgames() from comperes package.

It is assumed that score is numeric and higher values are better for the player.

Computation is done based only on the games between players of interest (see Players). Note that all those players should be present in cr_data because otherwise there will be an error during solving linear system described below. Message is given if there are players absent in cr_data.

The outline of Massey rating method is as follows:

  1. Compute Massey matrix: diagonal elements are equal to number of games played by certain player, off-diagonal are equal to minus number of common games played. This matrix will be the matrix of system of linear equations (SLE).

  2. Compute right-hand side of SLE as cumulative score differences of players, i.e. sum of all scores for the player minus sum of all scores against the player.

  3. Make adjustment for solvability of SLE. Modify the last row of Massey matrix so that all its cells are equal to 1. Also change the last cell in right-hand side to 0. This adjustment ensures that sum of all outcome ratings will be 0.

  4. Solve the SLE. The solution is the Massey rating.


comperank offers a possibility to handle certain set of players. It is done by having player column (in longcr format) as factor with levels specifying all players of interest. In case of factor the result is returned only for players from its levels. Otherwise - for all present players.


Kenneth Massey (1997) Statistical models applied to the rating of sports teams. Bachelor’s thesis, Bluefield College.


#> # A tibble: 5 x 2 #> player rating_massey #> <chr> <dbl> #> 1 Duke -24.8 #> 2 Miami 18.2 #> 3 UNC -8. #> 4 UVA -3.4 #> 5 VT 18
#> # A tibble: 5 x 2 #> player ranking_massey #> <chr> <dbl> #> 1 Duke 5 #> 2 Miami 1 #> 3 UNC 4 #> 4 UVA 3 #> 5 VT 2
rank_massey(ncaa2005, keep_rating = TRUE)
#> # A tibble: 5 x 3 #> player rating_massey ranking_massey #> <chr> <dbl> <dbl> #> 1 Duke -24.8 5 #> 2 Miami 18.2 1 #> 3 UNC -8. 4 #> 4 UVA -3.4 3 #> 5 VT 18 2