There has been quite a lot of discussion thus far about the USAU ranking algorithm, yet I don’t feel the algorithm has been broken down in a transparent everyman’s way. I set out to do this below, followed by suggesting a solution to what I consider to be the most important flaw in the current algorithm (Nerds: the concavity of the 400/x element). I’ll finish with some further insights and issues that have been brought up in the past.

I should probably qualify myself before starting. I care about the algorithm because I’m a co-captain of Sub Zero and have an interest in improving/understanding everything related to our sport. Our 16th-place ranking on August 29th influenced me to figure out how the rankings actually work. I’m not trying to manipulate things to favor Sub Zero, which really wouldn’t even be possible since there is a 0% chance anything I say here will change this year’s rankings. I don’t think anything should be changed this year anyway.

Away from the field, I am a 4th year Biostatistics PhD student at the University of Minnesota and I recently passed my qualifying exam, so I don’t entirely suck at this stuff. A large component of my education is basically mathematical (or statistical) interpretation, which is what I’m trying to do here. I’m not an expert on ranking algorithms, and before this new device was put into place, I hadn’t really thought at all about how to develop a ranking. Over Labor Day weekend I spent a lot of time thinking about the algorithm and these are my insights.

**USAU Rankings Algorithm Breakdown**

I want to begin by saying the current algorithm does a fine job: it spits out quite reasonable rankings and I think our sport is all the better for it. Size bids and growth bids make for a less competitive nationals, so current algorithm is better than what we had before. That being said, the current algorithm has been aptly criticized on this site and is definitely in need of some improvements. The improvements I suggest here would not drastically shift the rankings, but would likely flip a handful of teams and at the extreme move a team a few spots up or down. But when the difference between 17th and 16th is so important, these minor shifts can really be meaningful.

So how does the current algorithm really work and what is wrong/controversial about it? We have probably all read the details on the USAU site, but recall that the algorithm uses the following construction: game_PR = opp_PR 400/x, where x=max(2/3,2.5*(ls/ws)2), ls and ws denote the losing and winning score, respectively, and the last element is added for the winner and subtracted for the loser. Your PR is then a weighted average of all the individual game_PRscores. I’m not going to go into the weighting scheme here, I’ll stick to the equation above.

The opp_PR piece allows your ranking to reflect your strength of schedule, a component that isn’t going to change much once the game begins. Yes, the worse you beat a team, the lower their PR will get and vice versa for a loss, but this change is averaged over all their other games and as the number of games accumulate, your current game matters less and less to your opponent’s PR. Figuring out exactly how much your current game will change your opponent’s PR can be done, but because of the weighting it gets convoluted pretty quick.

Thinking about it simply, if you beat a team in their 10th game of the season and they get the maximum 600 subtracted from their game_PR, this 600 is averaged over those ten games and their PR will drop by about 60 points, so you’ve effectively only gained 540 points for that one win. The point is that the opp_PRreflects strength of schedule, is relatively constant in the current game but slightly reduces your gross gain/loss.

Lastly, this component is what moves teams around when they are at home practicing: if a team’s collective strength of schedule goes up, they too will go up and vice versa. So when you are at home, root for the teams you’ve played and root against those you haven’t. This is an essential component to the algorithm, but once you’ve decided on your schedule for the year, you have very little control over it.

Once a game has begun, the 400/x piece is what your team can control. We can write this algorithm generally as game_PR = opp_PR PR_pts, calling the latter component of the algorithm the PR_ptscomponent. This component is responsible for distributing PR_ptsbased on the who won, what that winning score was and the margin of victory.

This component can have any form, though some are more sensible than other. In the current construction, the 400/xpiece is tough to understand on it’s own, but if you just start plugging in possible game scores it’s mechanics become quite clear. We have the luxury of knowing that the score at the end of a frisbee game will be one of a relatively small discrete set of pairs. So lets just look at how the PR_ptsare distributed across the likely game scores under the current construction:

Table 1a

Ls\Ws | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |

16 | — | — | — | — | — | — | — | — | — | 180.63 |

15 | — | — | — | — | — | — | — | — | 182.04 | 205.51 |

14 | — | — | — | — | — | — | — | 183.67 | 208.98 | — |

13 | — | — | — | — | — | — | 185.56 | 213.02 | — | — |

12 | — | — | — | — | — | 187.78 | 217.78 | 250.00 | — | — |

11 | — | — | — | — | 190.41 | 223.47 | 259.17 | 297.52 | — | — |

10 | — | — | — | 193.60 | 230.40 | 270.40 | 313.60 | 360.00 | — | — |

9 | — | — | 197.53 | 239.01 | 284.44 | 333.83 | 387.16 | 444.44 | — | — |

8 | — | 202.50 | 250.00 | 302.50 | 360.00 | 422.50 | 490.00 | 562.50 | — | — |

7 | 208.98 | 264.49 | 326.53 | 395.10 | 470.20 | 551.84 | 600.00 | 600.00 | — | — |

6 | 284.44 | 360.00 | 444.44 | 537.78 | 600.00 | 600.00 | 600.00 | 600.00 | — | — |

5 | 409.60 | 518.40 | 600.00 | 600.00 | 600.00 | 600.00 | 600.00 | 600.00 | — | — |

4 | 600.00 | 600.00 | 600.00 | 600.00 | 600.00 | 600.00 | 600.00 | 600.00 | — | — |

So if your team wins 15-12, you get 250 PR points!! Since x=max(2/3,2.5*(ls/ws)2), the 2/3is what caps the PR_ptsat 600 (400*3/2 = 600). This is what I refer to a the mercy threshold, once a team has a enough breaks, any additional breaks don’t get them any additional gain in the rankings. This is one of my critiques of the current construction: the mercy threshold is saying a team that loses 15-7 is equivalent to a team that loses 15-0. This is a loss of information and since we only have about 15 games from which to derive rankings, we want to minimize any losses of information.

Another thing to note in the above table is that winning on universe is always worth about 185 PR points. The last thing to note, for a given winning score, the marginal value of a break is increasing as the game gets less close until the mercy threshold kicks in. This pops out if we look directly at how the marginal value of a break changes:

Table 1b

Change\Ws | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |

15vs16 | — | — | — | — | — | — | — | — | — | 24.89 |

14vs15 | — | — | — | — | — | — | — | — | 26.94 | — |

13vs14 | — | — | — | — | — | — | — | 29.34 | — | — |

12vs13 | — | — | — | — | — | — | 32.22 | 36.98 | — | — |

11vs12 | — | — | — | — | — | 35.69 | 41.40 | 47.52 | — | — |

10vs11 | — | — | — | — | 39.99 | 46.93 | 54.43 | 62.48 | — | — |

9vs10 | — | — | — | 45.41 | 54.04 | 63.43 | 73.56 | 84.44 | — | — |

8vs9 | — | — | 52.47 | 63.49 | 75.56 | 88.67 | 102.84 | 118.06 | — | — |

7vs8 | — | 61.99 | 76.53 | 92.60 | 110.20 | 129.34 | 110.00 | 37.50 | — | — |

6vs7 | 75.46 | 95.51 | 117.91 | 142.68 | 129.80 | 48.16 | 0.00 | 0.00 | — | — |

5vs6 | 125.16 | 158.40 | 155.56 | 62.22 | 0.00 | 0.00 | 0.00 | 0.00 | — | — |

4vs5 | 190.40 | 81.60 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | — | — |

Looking at a winning score of 15, we see that a team would gain 29.34 PR points by winning by 2 instead 1. Notice how these marginal values are increasing as the margin of victory increases, which means that the value of breaks is increasing as the game gets less competitive. I find this to be counter-intuitive and against the way our sport actually functions. In reality, breaks when games are closer are more valuable and the larger your lead, the less valuable another break becomes.

What is absurd about the above table is that you’ll notice there are ‘super’ breaks sitting out there right before the 600 threshold kicks in. The break that pushes a game to 15-8 rather than 15-9 is worth an astonishing 118.06 PR points. Recall, the break that prevents universe point is only worth 29.34 PR points (~25% of the value). Then, because of the mercy threshold, the marginal value of a break drops sharply. For instance, the break that pushes a game to 15-7 versus 15-8 is only worth 37.5 PR points (~33% of the ‘super’ break’s value). There is no possible rationale for this value structure. If a team were smart, they would throw out a universe point line whenever they have the opportunity or are in jeopardy of getting the ‘super’ break. Recall that the break that wins you the game is only worth about ~185 PR points. Getting ‘super broken’ wipes out ~66% of the value a previous universe point win.

The above table is what I find to be the most glaring issue with the current algorithm. Under the current algorithm, the most important thing a team can do is win games…which is what we want. But under the current algorithm the solid wins (e.g., 15-14 through about 15-9) are severely undervalued. The most undervalued games are the 2 point wins, wins that are hard fought and often the best of the weekend. The flip side is the close losses are not as detrimental to a team, but looking at the loss side of things it has a more emotional interpretation to say the 15-8 loss is unreasonable punished. Thankfully, as I mentioned before, the PR_ptscomponent can have any form so we can easily fix it.

**My Suggested Fix**

I take a hybrid approach. I assign universe point wins in regulation or any game to <15 points a 200 PR point value. This slightly increases the value of winning relative to the current algorithm. For games to 15 points that go to overtime, I give slightly less of a bonus because I believe a long game to 15 that goes to OT shows that the two teams are very evenly matched. As such, I drop the value of an OT win. I also stick with the maximum of 600 PR points, but instead of using a mercy threshold, which is a blatant loss of information, I distribute the 400 PR points so that the value of each additional break is decreasing by a constant 20%.

Mathematically, we can redefine the PR_ptscomponent for a game that ends in regulation as, PR_pts= UnivseWinPts+(TotalPts-UnivseWinPts)*(1-p-(1-p)diff)/(1-p-(1-p)ws), where UnivseWinPtsis the PR point value of a universe point win, TotalPtsis the total PR points to be distributed or the maximum number of possible PR points in one game, diffis the margin of victory and wsstill denotes the winning score. To complete the allocation, we assign reasonable amounts of PR points for a game to 15 that ends in OT. The pcomponent is the percent by which the value of and additional break is decreasing. This formula and its properties are derived from a truncated Geometric(p)distribution. The fraction involving p is given by (F(diff-1) – F(0))/(F(ws-1) – F(0)where F(x)is the cumulative distribution function of a Geometric(p) random variable. Other nice allocation schemes could be derived in the same manner by switching the distribution.

If we want the scale of the PR rankings to stay the same, we should assign 600 total points and to keep the value of a universe point win similar we give 200 points. Lastly, letting the value of additional breaks decrease by 20% we get the following fix for the current PR_ptsconstruction: PR_pts= 200 + 400*(.8-.8diff)/(.8-.8ws).

Enough math. Let’s look at the points allotted for various final scores and the marginal gain for each break under my suggested construction.

Table 2a

Ls\Ws | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |

16 | — | — | — | — | — | — | — | — | — | 50.00 |

15 | — | — | — | — | — | — | — | — | 100.00 | 100.00 |

14 | — | — | — | — | — | — | — | 200.00 | 150.00 | — |

13 | — | — | — | — | — | — | 200.00 | 283.68 | — | — |

12 | — | — | — | — | — | 200.00 | 284.65 | 350.62 | — | — |

11 | — | — | — | — | 200.00 | 285.90 | 352.38 | 404.18 | — | — |

10 | — | — | — | 200.00 | 287.52 | 354.63 | 406.56 | 447.02 | — | — |

9 | — | — | 200.00 | 289.62 | 357.53 | 409.60 | 449.90 | 481.30 | — | — |

8 | — | 200.00 | 292.40 | 361.32 | 413.54 | 453.59 | 484.57 | 508.72 | — | — |

7 | 200.00 | 296.13 | 366.32 | 418.68 | 458.35 | 488.77 | 512.31 | 530.66 | — | — |

6 | 301.23 | 373.03 | 425.46 | 464.57 | 494.20 | 516.92 | 534.50 | 548.21 | — | — |

5 | 382.21 | 434.55 | 472.77 | 501.28 | 522.88 | 539.44 | 552.26 | 562.24 | — | — |

4 | 447.00 | 483.77 | 510.62 | 530.65 | 545.82 | 557.46 | 566.46 | 573.48 | — | — |

3 | 498.83 | 523.14 | 540.90 | 554.14 | 564.17 | 571.87 | 577.82 | 582.46 | — | — |

2 | 540.29 | 554.64 | 565.12 | 572.93 | 578.86 | 583.40 | 586.91 | 589.65 | — | — |

1 | 573.46 | 579.84 | 584.50 | 587.97 | 590.60 | 592.62 | 594.18 | 595.40 | — | — |

0 | 600.00 | 600.00 | 600.00 | 600.00 | 600.00 | 600.00 | 600.00 | 600.00 | — | — |

I somewhat arbitrarily set the value of OT wins, but I think they are very reasonable. We see that my construction can still distinguish between a team that gets beat 15-6 and a team that gets beat 15-0. There are not abrupt changes anymore and this is in line with reality. Lets look at the marginal values of breaks:

Table 2b

Change\Ws | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |

16vs15 | — | — | — | — | — | — | — | — | — | 50.00 |

15vs14 | — | — | — | — | — | — | — | — | 50.00 | — |

14vs13 | — | — | — | — | — | — | — | 83.68 | — | — |

13vs12 | — | — | — | — | — | — | 84.65 | 66.94 | — | — |

12vs11 | — | — | — | — | — | 85.90 | 67.72 | 53.56 | — | — |

11vs10 | — | — | — | — | 87.52 | 68.72 | 54.18 | 42.84 | — | — |

10vs9 | — | — | — | 89.62 | 70.01 | 54.98 | 43.34 | 34.28 | — | — |

9vs8 | — | — | 92.40 | 71.70 | 56.01 | 43.98 | 34.67 | 27.42 | — | — |

8vs7 | — | 96.13 | 73.92 | 57.36 | 44.81 | 35.19 | 27.74 | 21.94 | — | — |

7vs6 | 101.23 | 76.90 | 59.14 | 45.89 | 35.85 | 28.15 | 22.19 | 17.55 | — | — |

6vs5 | 80.98 | 61.52 | 47.31 | 36.71 | 28.68 | 22.52 | 17.75 | 14.04 | — | — |

5vs4 | 64.79 | 49.22 | 37.85 | 29.37 | 22.94 | 18.02 | 14.20 | 11.23 | — | — |

4vs3 | 51.83 | 39.37 | 30.28 | 23.49 | 18.35 | 14.41 | 11.36 | 8.99 | — | — |

3vs2 | 41.46 | 31.50 | 24.22 | 18.80 | 14.68 | 11.53 | 9.09 | 7.19 | — | — |

2vs1 | 33.17 | 25.20 | 19.38 | 15.04 | 11.75 | 9.22 | 7.27 | 5.75 | — | — |

1vs0 | 26.54 | 20.16 | 15.50 | 12.03 | 9.40 | 7.38 | 5.82 | 4.60 | — | — |

Each break is worth 20% less than the last, and if you want faster decay in value just increase p. There are no ‘super breaks’ and solid wins are no longer undervalued. This is easier to understand too.

These changes would take very little time for USAU to make and they wouldn’t in any way sacrifice the work they’ve already done on the algorithm. These changes wouldn’t drastically change the rankings but I think they would give slightly better rankings. I’ll prove this by running my proposed algorithm and the current algorithm on the Labor Day results from this past weekend:

**Algorithm Comparisons on Labor Day Results**

Table 3

Teams | My PR | My Rank | USAU PR | USAU Rank |

Sockeye | 1287.22 | 1 | 1248.30 | 1 |

DW | 1282.45 | 2 | 1247.10 | 2 |

Revolver | 1215.26 | 3 | 1196.53 | 3 |

Bravo | 1168.50 | 4 | 1178.70 | 4 |

Chain | 1151.02 | 5 | 1115.71 | 6 |

Rhino | 1142.01 | 6 | 1130.63 | 5 |

Machine | 959.07 | 7 | 983.09 | 7 |

Furious | 919.23 | 8 | 935.09 | 8 |

Madison | 909.31 | 9 | 900.91 | 9 |

Ring | 802.24 | 10 | 848.70 | 10 |

Boost | 726.73 | 11 | 739.15 | 11 |

Southpaw | 710.50 | 12 | 725.69 | 12 |

Madcow | 691.75 | 13 | 713.02 | 13 |

Don’t pay too much attention to the actual PR values. You shouldn’t compare these values across different algorithms and especially not to the current PR’s in the USAU site. What you can pay attention to is the actual ranking and the distance between teams. Regarding the ranking, my algorithm and the current USAU algorithm agree quite closely, which is encouraging. However, my algorithm ranks Chain above Rhino and in the USAU algorithm has them flipped. This flip occurs because Chain had a bunch of 15-11 wins, which are undervalued by the current algorithm; Rhino had a couple more wins that hit the ‘super break’ with lots of value relative to the breaks before it. Chain also beat Rhino 15-9, so in this case I’d argue my algorithm is outperforming the current one.

Another thing to note is in the current algorithm: Sockeye and Doublewide are essentially indistinguishable. In my algorithm Sockeye has a wider lead over Doublewide. This happens for the same reason cited above, Sockeye’s wins are in the 15-11 range, which are undervalued whereas Doublewide had a couple more wins where they hit the ‘super’ break to boost their rating. Again, I think my algorithm has a better outcome here with Sockeye clearly leading Doublewide in the rankings.

**Random Other Issues and Insights**

I’ll finish with a quick suggestion for forfeits, convergence, and communication lines. I suggest a team that forfeits gets 606’d as the lingo goes (though it is really 600’d). The winning team gets the maximum benefit and the forfeitures get maximum pain. Under my proposed changes, all a team would need to do is score a single point and they would be better off not forfeiting, and even if they don’t score a goal the outcome is the same. I doubt anyone would forfeit a sanctioned game again under my system.

Convergence of the algorithms is not terribly concerning when you consider the common round robin approach to tournament formats. What is a little concerning is the rumor that USAU only runs 20 iterations. My algorithm did converge (as well as the USAU algorithm) in 18 iterations on the Labor Day results, but there is no reason that the algorithm shouldn’t be run to convergence. Convergence means there is no substantial change in the rankings on subsequent iterations. This can be done by running the algorithm until the absolute sum of the changes over an iteration are <1 or some other small value. I’m not too concerned about this as 20 iterations seems to be reasonable, and I’d bet that USAU is running this thing until convergence anyway.

The last issue that could potentially cause problems is the lack of communication lines between cohorts of teams. For simplicity, lets say a cohort of tier 2 teams never plays a sanctioned game against a team that has played a sanctioned game against a tier 1 team (or a game against a team that played a gam against a team who played a tier 1 team, and so on). In this case, the algorithm has no way to distinguish the relative strength of the two cohorts. This is a possibility, though right now nearly all the sanctioned tournaments draw a couple of tier 1 teams. Though if sanctioned tournaments become more widespread a tier requirement might be in line, otherwise the top teams would need to make sure and get some games against the lower teams to prove their superiority.

The other potential issue, which lingered in the college series for a few weeks (I call it the Michigan State effect), is if cohort 1 and cohort 2 only have 1 game connecting them (or only 1 line of communication) and that game/communication line has an upset (e.g., Michigan State over Oregon), the algorithm is going to push the winning cohort above the losing. This is what it should do, but if there are few communication lines between cohorts of teams some funky stuff can result from an unlikely upset. Because of these two potential issues, I think more and more sanctioning is the best way to go and teams should try/be required to attend two levels of tournaments as this happens.

I’d love to get feedback on some of this stuff and keep the discussion going. I hope you have a better understanding of the mechanics of the USAU algorithm. Don’t be too angry with it, it works alright as it stands and I believe it is a step in the right direction. These changes I suggest here would continue to improve the system and I hope they are well received.

Comments Policy:At Skyd, we value all legitimate contributions to the discussion of ultimate. However, please ensure your input is respectful. Hateful, slanderous, or disrespectful comments will be deleted. For grammatical, factual, and typographic errors, instead of leaving a comment, please e-mail our editors directly at editors [at] skydmagazine.com.