View source on GitHub
The third version of the Open Projections -- Campanella -- offers a minor update on Version 2 (Blyleven).
The big change is playing time projections. PA/BF are weighted at 0.9955^daysAgo, which heavily favors playing time in the most recent seasons. PA/BF from minor league and spring training games are not counted at all (i.e. weighted at 0).
In order to receive a projection, a player must have at least 11% of the projected PA/BF of the highest projected player. (For this check, PA/BF at any level are counted.) Version 3.0 had the threshold set at 10%, but some NL pitchers were able to sneak a batting projection at that cutoff.
All batters receive a base playing time projection of 400 PA. The batter with the most projected PA is adjusted to 725 PA, and everyone else is scaled accordingly between the min and max.
The pitcher with the most projected BF is adjusted to 850 BF, and everyone else is scaled accordingly. RP below 200 BF are increased by 200, and SP below 400 BF are increased by 400.
The focus of the second iteration of the Open Projections—called Blyleven—is separate weightings and regressions for each component stat in the projection.
We know that some stats (strikeouts, for example) can be projected based on relatively small, recent sample. Other stats (like hits) require a bigger sample and more regression.
This is not a new idea. I'm guessing that this is typical of most closed projection systems. For example:
So, not new, but I'd still guess it's the next best upgrade for the Open Projections.
Stats for each game are weighted by recency, so that more recent games are more influential in the projection. The weighting is n^daysAgo, where n is a decay rate specific to each stat. (See Aparicio below for additional background and discussion.)
Each stat is weighted separately, depending on how much information is gained by the most recent data. SO are most affected by recent data, followed by walks, SB, and HR. Everything else receives the default weighting from Aparicio (0.9994).
Pitching stats most biased towards the recent data are SO, then H, and SV/HLD. BB and W/QS slightly favor recent stats, while the rest receive the default 0.9990 from Aparicio.
Note: These numbers were not created by an especially rigorous process. They were simply what worked well for projecting past seasons, alongside my own expectations. There is room to improve here.
Weighting for minor leagues and spring training are unchanged from Aparicio v1.2.
Unlike Aparicio, each projected stat in Blyleven is subject to an individualized amount of regression.
There has been a ton of research done in this area:
These studies were used to inform the Blyleven projections, although their different methodologies sometimes yield differing results, and some stats (e.g. SV) were never studied. The final regression amounts were the result of a bit of trial and error. As with the weighting for past results, there ought to be plenty of room for improvement.
For batters, each stat was combined with the following PAs of the league average performance:
Pitching regression is comparable to hitting, although a player's starts are regressed toward the league average starter, relief appearances toward the league average reliever.
For pitchers, one extra step is added for Blyleven, borrowing (yet another) idea from the Marcels.
The kwERA is calculated for each pitcher, and then converted to kwER. ER are replaced by a simple average of their previous ER projection and their kwER projection.
Playing time projections are unchanged from Aparicio v1.1.
We're finished! Our Blyleven projections are completed. There's still a lot of room for improvement, but it should be another step in the right direction.
The inaugural version 1 of the Open Projections—named Aparicio—starts with daily game logs for the past 2000 days (roughly the past six years). By working with daily stats, we are able to build projections for any point in time. A player's projection will gradually shift everyday as the new day's stats are collected and old stats fall out of the projection.
Aparicio includes game data for every level of professional baseball, from Rookie leagues to MLB. It even includes spring training and postseason. We're going to throw everything in the mix and try to filter out the most valuable data.
Stats for each game are weighted by recency, so that more recent games are more influential in the projection. Batting stats are weighted at 0.9994^daysAgo. This means that yesterday's games receive almost full weighting (99.4%), while a game from three years ago counts for about half as much (0.9994^1095 = 51.8%).
Pitching stats are weighted at 0.999^daysAgo. Weighting for both batting and pitching are ideas taken from Tom Tango and are comparable to the yearly weights used by Marcel. (See the discussion of New PECOTA.)
Spring Training and exhibition games receive a weighting of 45%, a number which comes from Neil Paine's study of spring training stats. (See Neil's When Spring Training Matters and the follow-up discussion by Tom Tango.) Notice this considers the most recent Spring Training as roughly equivalent to MLB performances from three years ago.
No adjustment is made to postseason stats, which are counted the same as the regular season.
For minor league stats, each component receives a separate weight for each level of minor league ball. For this, I did a rough reverse engineering of Clay Davenport's Davenport Translations for 2019. For stats not available in DTs, I approximated with a similar stat (e.g. SV for HLD, BB for HBP). With Version 1.2, I re-ran the Davenport Translation numbers from 2021 and updated the minor league factors.
A more advanced approach would adjust for various minor league park factors and year-by-year changes in league quality. But this is enough to get us started.
After each player's stats have been weighted, we roll them up into a single statline. Now it's time to regress.
Our regression component will amount to 15% of the PA (or, for pitchers, BF) for the player with the most PA/BF in the sample. For comparison, Marcel uses 1200 PA for its regression. A fixed number of PA, however, doesn't deal well with longer and shorter season lengths (e.g. the shortened season of 2020), so we want to instead use a percentage of PA. With Marcel, a top-of-the-lineup hitter might get 700 PA over the three years Marcel considers. That player would have 8400 PA after Marcel's weighting, and 1200 PA of regression would be about 14% of the total. That's what we are trying to match with our 15% regression.
The regression will be based on the average stats from our universe of players. Before we find the average, though, we discard any players who accumulated less than 10% of the largest number of PA/BF in our set. This clears out pitchers who are hitting, hitters who are pitching, etc. (Question: Should we try to find the average from only MLB stats (i.e. true league average), rather than the average from our universe of players at every level?)
The statline for this average player is added to each player's projected stats.
For now, playing time projections are kept simple. Every batter's stats are adjusted to exactly 650 PA. Version 1.0 also adjusted every pitcher to 650 BF, but this created obviously unrealistic projections for RP. Version 1.1 tweaks pitcher playing time by setting RP at 250 BF and SP at 800 BF. Pitchers in a mixed role fall in between those two numbers. For example, a pitcher who starts half of his games would be projected halfway between 250 and 800 at 525 BF.
We're finished! Our Aparicio projections are completed. Hopefully you can see the many ways that this can still be improved, but it gives us a good starting point.