Introducing Dredge: A play-by-play derived metric

May 11, 2016; Oakland, CA, USA; Golden State Warriors guard Stephen Curry (30) hoists the MVP trophy before game five of the second round of the NBA Playoffs against the Portland Trail Blazers at Oracle Arena. Mandatory Credit: Kyle Terada-USA TODAY Sports
May 11, 2016; Oakland, CA, USA; Golden State Warriors guard Stephen Curry (30) hoists the MVP trophy before game five of the second round of the NBA Playoffs against the Portland Trail Blazers at Oracle Arena. Mandatory Credit: Kyle Terada-USA TODAY Sports /

I’ve been experimenting with a play-by-play metric for a long time, hinting about it here and there and providing beta results, but I’ve never fully published the numbers before. With a wild free agency period winding down during the dead summer period, I thought now was the appropriate time to make a few last tweaks and finish it. This is a statistical plus-minus metric in the same family as BPM or others like Nylon’s own DRE, but the difference with Dredge is that it uses the full breadth of the available stats found in play-by-play logs. There are many metrics out there, but most are outdated and metrics are still important as baseline value measures. The box score is limited and its earth has been scarred from repeated excavations. We have 20 years of play-by-play data, and it’s time we fully unleash its power.


The model setup is pretty basic: I’m trying to predict 15-year RAPM with a bevy of stats, from the simple, like minutes per game, to the advanced, like versions of usage rate. The 15-year RAPM model is used as the dependent variable because it’s not directly influenced by the very independent variables I’m using to predict it, and in a large enough sample its issues with noise and collinearity are reduced. That is the standard way to construct an SPM, by the way. I also dropped players with fewer than 3000 total possessions and weighed everyone by possessions too, so that, say, Kevin Garnett has more weight in the model than Anthony Davis. If you want to read more about my model philosophy and a description of some of the stats I used, this twopart article is still relevant. Note, however, that the aforementioned article was for a SportVU metric (and one that is no longer possible because shotlogs and other stats have been taken away by the league.) But the model construction is extremely similar.

More from FanSided

The final model was chosen after careful consideration of the variables used and out-of-sample testing to verify the validity of the results. I was hesitant at including a variety of interaction variables — separate variables combined in ungodly ways, basically, like REB%*AST% — because of the fear I was overfitting the model, but the results were more predictive out-of-sample by a significant amount. The same was true of the team adjustment I used and some mean reversion, which I applied in the same manner as I had done with the HBox metric. Since the sample data ranges from 2001 to 2015, I have seasons 1997 to 2000, as well as 2016, available for testing. For that earlier period, you can see how the metric performs compared to a couple of stalwarts: basketball-reference’s BPM and ESPN’s PER. Stats from the metrics were used from a previous season to predict a team’s rating the following season, where the difference is calculated by root-mean squared-error and weighed by the amount of minutes given to new players. Dredge performs well there, even though one of its most important variables, offensive fouls drawn, was not available in that time period[1.]. This is true even when the other metrics use mean reversion too, which helps with low minute players. The zero metric sets every player at 0, while the team adjustment one gives equal weight for every teammate based on the team’s rating. That is the standard benchmark any halfway useful metric should beat easily[2.].

rmse dredge
rmse dredge /

And if you’re wondering, since the model was tested only up until 2015, Dredge outperformed BPM in predicting 2016 as well.

Finally, the name is derived from the fact that I used the glmnet function in the program R, as I’m using a net to “dredge” variables from play-by-play logs — we have enough acronyms in the NBA world.

The Variables

For some transparency and utility, I’ve provided the coefficients for a simple version of the model (i.e. no convoluted interaction variables.) Everything is an advanced stat or in the form of per 100 possessions. Note that the following model is not a predictive model and is merely being used to express pertinent variables and their worth. These are variables I’ve experimented with for a while now; the discoveries are pretty old but I have not seen them all discussed before publicly.

MPG: 0.132
Minutes per game is an old standard for an SPM, and it does well because of something simple: better players generally play more minutes. Also, players themselves perform better when given reliable and longer stretches in games.

PtsOverAvg100: 0.872
This stat is efficiency but it’s combined with volume too. You can view it historically here.

Shot%: 2.24
Shot% is my version of usage% (sorry Neil Paine); it’s usage but without turnovers. The scale is from 0 to 1, so a coefficient of 2.24 is significant but not overwhelming. It can also be viewed historically here.

UnAstShot%: 0.841
Since players get credit for assists, they should get more credit for unassisted shots. Thus, the product of unassisted FGM% and shot% has a little bit of power in my versions of Dredge, even when the interaction variables are used. Point guards have the highest unassisted rates.

Ast100: 0.0580
Assists by themselves have very little value, which is probably a surprise to people unfamiliar with SPM’s. BPM, for example, does not even use assists by themselves in the final model.

AstDunksLayups100: 0.352
There is, however, one version of assists to do well: assists that lead to dunks or layups. Empirically, this states that our current method of tallying assists is incorrect because assists that lead to jump shots should not be lumped in with assists that lead to shots at the rim. Steve Nash, by the way, had one of the highest rates of dunk/layup assists to total assists during his magical Phoenix Suns run. Additional note: I tried including three-pointers because, you know, a three-pointer is an additional point, but it did not hold up to testing.

assists layups dunks
assists layups dunks /

TOV100: -0.407
Turnovers are self-explanatory. This is one of Chris Paul’s best attributes, by the way, because he has roughly one entire turnover less than other players with his assist rate.

StolenTOV100: -0.083799117
Since steals are very valuable and even have value for offenses, it follows that stolen turnovers should be penalized more than other turnovers. However, in the linear model stolen turnovers, for whatever reason, had a lower coefficient than in the fuller models. From my own research, it appears stolen turnovers have twice the negative power of all other turnovers. This should probably appear in the defensive section, however, as most of its value is there — a stolen turnover leads to a fast break frequently.

3FGA100: 0.0376
This is just three-point field goals attempted; it’s a simple spacing effect. You can read more about spacing here.

3FGA100PosAdj: 0.0126
Technically, this is an interaction variable, but I’ve used it so long I’m confident in it. The formula is 3PAper100Poss*(Position+3) where position is on the scale of 1 to 5. I also adjust position with height, which gave better results overall.

PFsDrawn100: 0.0846
Here’s a non-box score stat with some value — fouls drawn. Free throws attempted doesn’t go far enough because there’s value in drawing fouls in other situations too, of course. Note that the plus/minus dependent variable used for this model probably underrates fouls drawn because a player’s team doesn’t fully reap the benefits of drawing a foul until the penalty is finally reached, at which point the player might be on the bench.

OREB%: 3.87
For the last pure offensive variable, there’s offensive rebound rate. The scale is from 0 to 1

Stl100: 1.33
Steals were one of the big finds from statistical plus/minus models. They’re highly valuable. If you split by offense and defense, additionally, about 0.25 of that value goes to offense and the rest to defense. Steals lead to better offensive opportunities because defenses are not set.

OffFoulsDrawn100: 1.22
Here’s one of my favorite discoveries, and it’s made it into other models: drawing an offensive foul, which includes more than just turnovers. In fact, if you split the fouls by charges and non-charges, non-charges were more valuable. This is perhaps a good proxy for physical, “gritty” defenders or just guys who are more active on defense. Note that three of the players with the highest career rates are three of the most prominent “no-stats all-stars:” Shane Battier, Nick Collison, and Jason Collins. Unfortunately, offensive fouls are only available for 2006 to the present, plus the 2001 season, strangely.

BLK100: 0.236
Blocks are like assists to offense: in their pure form, they’re highly overrated.

Russells100: 0.445
One reason blocks are overrated is that they often are just rebounded by the offense and lead to a basket anyway. Thus, I “created” the Russell, which is a block that the defense recovers. You can read more about block types here.

Blocked0to5Ft100: 0.523
Blocks at the rim were the most valuable, which makes sense — that’s where the highest FG% is. Big men usually have higher rates of blocked shots at the rim, and this is a half-decent proxy for rim protection (it’s much better than just pure blocks.) Blocking a three-point shot did not, however, test well, by the way.

DefGoaltends100: -2.75
Here’s one of my most interesting discoveries[3.]. And yes, that coefficient means a defensive goaltend is worth nearly negative three points per 100 possessions. In more complex models, the coefficient drops to a “mere” -1.5. For direct impact, goaltending obviously gifts the opponent a couple of points, but there’s a chance the shot was going to go in anyway. I think the stat is also a proxy for guys who chase blocks at the expense of good defense and may also penalize the huge, athletic guys who show up on the box score but make a few mistakes on the court. The player with the highest rate (minimum of 3000 minutes in my 2001-15 data-set), by far, is JaVale McGee at 0.94 per 100 possessions, and he’s followed by Samuel Dalembert, Joel Przybilla, Dwight Howard, Bismack Biyombo, and Tyrus Thomas. A couple of those guys were really good defenders — Joel “the Vanilla Gorilla” Pryzbilla and Dwight Howard — so this isn’t a perfect indication of defensive prowess. But it’s an important addition because at the very least players should be debited for giving the opponent those points directly, and the recently retired Lord Tim Duncan has the lowest rate ever for a player with a significant amount of blocks. He had 3020 career blocks to 15 total goaltending violations — and yeah, that’s less than one per season.

blocks goaltends (1)
blocks goaltends (1) /

TechsFlgs100: 1.25
For an esoteric variable no one would think is valuable, it’s hard to beat this one: total technical and flagrant fouls per 100 possessions. Originally, I included it because I thought it would make sense to penalize guys for giving the opponent a free foul shot, but oddly enough it’s positive and worth about the same as a steal. The value remained high even in more advanced models. I would like to christen this variable the “Rasheed,” as his Ruthian stats here are unbreakable — 41 in 2001 — and no one has a higher career rate either. I realize how bizarre it is that such a negative stat has a positive correlation[4.], but this a proxy for, well, feisty defenders and guys who fight hard in the paint, from Anthony Mason and Jerome Kersey to Karl Malone and Larry Sanders. Like a few other defensive stats I’ve found, the biggest positive is simply being active on defense, and being active means you’ll find yourself in more situations where you can pick up a technical foul. And, remember, model don’t lie.

PTS_FB100: -0.0499
This is fast break points per 100 possessions, as defined by This has a small effect, but I believe this punishes serial gambling defenders and superstars who pick up a large number of steals but have few responsibilities on offense. Corey Brewer is the prime example of the former, and Russell Westbrook is an example of the latter. I will note, however, that fast break points have a positive correlation for an offense-only metric, so the effect is even greater on defense. I do wonder if this says anything about guys who create steals but don’t finish fast breaks. Will the model overrate them or is that a good attribute?

DREB%: 6.48
Lastly, there’s defensive rebound rate. This is one variable that needs a transformation because of the nonlinear nature of the variable (i.e. your rebounds go down when you switch to a team with many other good rebounders) and because not all rebounds are the same. Splitting rebounds by FGs and 3PG’s, for example, is a good start. And, yes, defensive rebounds are found to be more valuable in this model than offensive, but direct comparisons can’t be made to, say, BPM because BPM uses rebounds in the interaction term AST%*REB%.

There’s one variable that didn’t show up in the simple linear model but has in other iterations, and I’ll be nice and share it: loose ball fouls per 100 possessions. Like offensive fouls drawn and technical fouls, it’s a proxy for hustle or grittiness, perhaps. Even though it’s a foul, it signifies that a player is fighting for a loose ball, which is a positive act and a sign that a player is, well, actually trying. The coefficient is low, usually around 0.33, but it’s something to consider. The rate league leaders include ferocious rebounders, like Danny Fortson and Jeff Foster, to defensive players with high reputations like Alonzo Mourning and Dikembe Mutombo — and, of course, Nick Collison is among the leaders as well. Luckily, the NBA is now tracking loose balls recovered, not just fouls, so that could become one of the more valuable and interesting defensive stats out there.

The last steps are a team adjustment and a mean reversion, which done in the same manner as HBox. Basically, the players are adjusted so their sum ratings equal a team’s own rating, and I also adjust team ratings for three-point and free throw defensive luck.

The Numbers

In the embedded sortable table, you have access to Dredge for every player from 1997 to 2016. In time, this table will be expanded to include other variables as well. The highest rating belongs to 2016 Stephen Curry, unsurprisingly, which aligns with the results from many other advanced stats. Most of the other top marks are taken by LeBron James and Kevin Durant, twin exemplars of efficiency and all-around play. And despite a lack of gaudy box score stats, Kawhi Lenoard is ranked sixth in Dredge. If you’re looking for other top seasons from a few legends, Kevin Garnett’s highly regarded 2004 season is below Leonard and a hair above Tim Duncan’s 2002 MVP season. Duncan, in turn, is ahead of Shaquille O’Neal’s legendary 2000 season. Dwyane Wade and Chris Paul, both from 2009, follow closely behind. The 1997 version of Michael Jordan has a high rating, but he’s not that close to the top.

Version: 1.0

Since we’re all more familiar with the 2016 season right now, let me break down the numbers from that season. Curry, Leonard, and Durant are at the top, of course, with some of the best ratings ever, but Kyle Lowry is fourth. This would surprise most fans who are not familiar with advanced stats. Lowry kills it in subtle ways, and he does one thing this model uniquely loves: he draws a ton of offensive fouls, especially for a star. There aren’t too many other surprises near the top of the leaderboard with a couple exceptions. One is that Russell Westbrook, who has some of the most extreme stats you’ll ever see, is merely ninth. While his usage rate is sky-high, he was near the average in league efficiency and had a high rate of turnovers that became steals. Kemba Walker’s efficiency wasn’t grand either, but he’s surprisingly high because he drew even more offensive fouls than Lowry.

More from Nylon Calculus

For some validation at the superstar level, the highest rated players by MVP index (read more about it here) season-by-season align fairly well with the actual MVP winners: there’s Karl Malone in 1998; Shaquille O’Neal in 2000; Tim Duncan in 2002; Kevin Garnett in 2004; LeBron James in 2009; 2010, and 2012; Kevin Durant in 2014; and finally Stephen Curry in 2015 and 2016. There were minor disagreements in most other seasons: Malone over Michael Jordan by a hair in 1997; David Robinson in 1999 over Karl Malone; Dirk Nowitzki in 2003 over Duncan; then the turnaround of Duncan over Nowitzki in 2007; and Kevin Durant over LeBron in 2013. None of those are outrageous, and the seasons with large disparities between who won MVP and the MVP index leaders aren’t surprising: the model has Shaq over Allen Iverson in 2001; Kevin Garnett over Steve Nash in 2005; LeBron James over Nash in 2006; Chris Paul over Kobe Bryant in 2008; and LeBron over Derrick Rose in 2011. Those are the most contentious MVP votes in recent history, and I believe the results are strong enough at least at the superstar level to be plausible. But there are still a few curious findings.

The Overlooked Bo Outlaw

One of the strengths of this metric is that is goes all the way back to the period of 1997 to 2000, where we have few advanced stats. The top rated players there by Dredge are usually all-stars or highly regarded players except for … Bo Outlaw. Only Tim Duncan, Eddie Jones, Karl Malone, Alonzo Mourning, David Robinson, and Shaquille O’Neal outranked him in 2000, for example. I imagine most NBA fans don’t even know who he is anymore. He was an athletic 6′ 8″ frontcourt player with one of the ugliest free throw shots you’ll ever see and a high rate of activity on defense. As an undrafted player, think of him as a lite version of Ben Wallace — he had a large number of steals for a big man and pursued a lot of loose balls. He had a surprisingly high number of assists for a player of his type in his prime too, and he was efficient as well. He performed well in plus/minus stats too, like in RAPM. If he had played today he would have been more appreciated.

Super Mario

The model is designed to overrate no player more than Mario Chalmers. He’s the perfect candidate. He’s a high three-point volume point guard with a few assists who nets a large number of steals and offensive fouls drawn. He even has a high number of loose ball fouls. Let it be known that no model is perfect and defense is still largely uncharted, where Mario’s turnover creation is valuable but he stalls elsewhere. But we should reconsider his worth because it’s been shown consistently that guys who net a lot of turnovers are generally very good on defense. And he’s really good at navigating tubes and rescuing princesses.

Brent Barry: The Secret Superstar of 2002

There are only a handful of players with higher ratings in 2002 than Brent Barry: Tim Duncan, Shaq, Dirk, and Ben Wallace. I assume this will surprise people, but he was a wing player with a high number of assists, rebounds, and steal who was one of the best shooters of his era. In fact, he had one of the most efficient seasons ever in 2002, and it looks even better when you adjust for the low league-wide efficient of that dead-ball era. He received no high honors during his career, but what he did on the court was undeniably valuable and he has no red flags like ball-hogging or awful defense either. So when you’re next gifted with an NBA broadcast featuring Brent “Bones” Barry, appreciate that he did play at a high level few others have, even for just one brief season and the fact that few others recognize it.


This metric is by no means complete, and I’ll be updating it periodically. There’s still a lot of information to add, but the metric is stable enough now that I can share it. We have access to two decades of play-by-play data, which spans an entire generation, and it’s time we start using its full capabilities. The box score contains little and advanced stats should be available for more than just the SportVU era. Let’s not forget the past and learn from the full weight of history.

[1. Dredge still outperforms the other metrics even when mean reversion is used, which means you regress all the stats to -2 based on minutes played. For example, a player with only 1 minute played will have a rating of -2 while one with 3000 minutes will be regressed toward -2 only lightly.]

[2. Win Shares performed horribly, so much so that I worry it’s an error I did not catch. But others have found its weak predictive power when looking at data with players in new situations, although it’s not as bad as Wins Produced.]

[3. Unfortunately, I don’t know how accurate goaltending totals are in the 90’s. The 1997 season, in particular, has a very low rate of goatlending violations: 249 for the entire regular season while now the annual totals range from 500 to 700.]

[4. If you’re wondering if a player who picks up a technical foul doesn’t get “blamed” in the plus/minus model, I’ll note that the standard for fouls is to include those points in the stint before any substitutions occur, so the fouls are awarded when the player who fouled is still in the lineup.]

Next: Russell Westbrook is fixin' to win MVP