Author: Robert Reyes, Applied Mathematics Major at UCLA, Normal Cornbelters Baseball Analytics Intern

0. Overview of KCL fWAR

Wins Above Replacement (WAR) is one of the most important stats that sabermetrics has introduced. It aims to measure how many wins a player is worth to their team by comparing them to a “replacement player,” or a “minor league free agent or very poor MLB bench player” (Slowinski, FanGraphs). Fangraphs has a walkthrough of how to calculate fWAR, or FanGraphs’s version of WAR, on their website. However, there are a couple of areas of the fWAR calculation that are either incalculable given the level of data available for the KCL or not necessary for the KCL. Thus, I have made substitutions in the areas that could not be calculated or omitted certain parts that did not make sense to be included for the KCL. I then also scaled each section to match a full MLB season in order to produce numbers that are more familiar to baseball fans. FanGraphs’s fWAR formula is (Batting Runs + Baserunning Runs + Fielding Runs + Positional Adjustment + League Adjustment +Replacement Runs) / (Runs Per Win). Because the KCL is one league, for our purposes we will omit League Adjustment and instead say fWAR = (Batting Runs + Baserunning Runs + Fielding Runs + Positional Adjustment + Replacement Runs) / (Runs Per Win). I will now go into depth about how to calculate each section of the fWAR equation, and the changes I made to suit the KCL with the justifications for each change. I will also show the calculations for one player, Logan Van Heuklon (Merchants), as he has played in the most games and in a variety of positions, making him a good case study. I will also show the calculations for Davey Fitzpatrick (Ground Sloths) for a couple of equations for fielders that are not also catchers, as Van Heuklon plays catcher as well as in the field.

1. Batting Runs

The Fangraphs website lists the formula for Batting Runs as wRAA + (lgR/PA – (PF×lgR/PA))×PA + (lgR/PA – (AL or NL non-pitcher wRC/PA))×PA, where (lgR/PA – (PF×lgR/PA))×PA + (lgR/PA – (AL or NL non-pitcher wRC/PA))×PA is park and league adjustments to wRAA (weighted Runs Above Average). However, because the KCL is one league with the same field, that entire part can be omitted and reduced to Batting Runs = wRAA. 

1.1 wRAA

wRAA is wRAA = ((wOBA – league wOBA) / wOBA scale) × PA, where the wOBA scale is league OBP / league wOBA, and wOBA = (0.690×BB + 0.722×HBP + 0.888×1B + 1.271×2B + 1.616×3B + 2.101×HR) / (AB + BB – IBB + SF + HBP). However, since the KCL is a college league, I have decided to use weights used to calculate college players’ WAR. Also, the KCL only has had 2 IBBs, so I have left that part out here and in further calculations as it does not affect results almost at all. Thus, for the KCL, wOBA = (0.76×BB + 0.77×HBP + 0.97×X1B + 1.36×X2B + 1.71×3B + 2.11×HR)/(AB + BB + SF + HBP). Also, FanGraphs has a the following scale on their website for wRAA:

Above Average10
Below Average-5
Table 1.1: FanGraphs Weighted Runs Above Average (wRAA) Scale

Thus, the equation for wRAA I have used is 3×((wOBA – league wOBA) / wOBA_scale)×PA in order to have the KCL wRAA values match the scale given. 

1.2 Logan Van Heuklon’s Batting Runs

Now, for Logan Van Heuklon’s calculation, we will need his stats, the league wOBA, and the league OBP. Logan Van Heuklon has had 17 BBs, 2 HBP, 21 1Bs, 2 2Bs, 0 3Bs, 0 HRs, 73 ABs, 0 SFs, and 92 PAs. The league wOBA is ≈0.3721, and the league OBP is ≈0.3835. Thus, the wOBA scale is ≈1.0306, and we can now plug in all the numbers to the formula to get his wRAA, which is 9.6631 (from exact calculations).

2. Baserunning Runs

The FanGraphs website has the formula for Baserunning Runs as UBR + wSB + wGDP. UBR stands for Ultimate Base Running, which is a video-measured statistic on how a baserunner’s running affects the run expectancy in certain situations. However, this is impossible to do without the use of video replay, and because that level of data is unavailable for the KCL, I have left that part out of the calculation.

2.1 wGDP

FanGraphs also does not list a formula for wGDP, but says that they try to reward hitters for not hitting into a double play. Therefore, I have come up with my own equation to represent wGDP, -30×(GIDP/league GIDP) + 0.02×AB. Basically, I calculated what percentage of double plays in the league belonged to each player, while also giving credit to those with more at-bats because having 1 GIDP in 50 ABs is better than having 1 GIDP in 2 ABs. I then added weights to each part (-30 and 0.02) in order to get similar results to the table FanGraphs provided for wGDP.

Above Average1
Below Average-0.5
Poor -1
Table 2.1: FanGraphs Weighted Grounded into Double Plays (wGDP) Scale

2.2 wSB

FanGraphs does have a formula for wSB, which is SB×runSB + CS×runCS – lgwSB×(1B + BB + HBP), where runSB is .2 (the expected run value of a stolen base), runCS is = -2×RunsPerOut + 0.075 (the expected run value of being caught stealing), and lgwSB = (lgSB×runSB + lgCS×runCS) / (lg1B + lgBB + lgHBP). Thus, the formula for Baserunning Runs is now simply wSB + wGDP. This correlates perfectly with FanGraphs scale for Baserunning Runs. 

Above Average2
Below Average-2
Table 2.2: FanGraphs Baserunning Runs(BsR) Scale

2.3 Logan Van Heuklon’s Baserunning Runs

Now that we have both wSB and wGDP defined, we can calculate Logan Van Heuklon’s Baserunning Runs. First, we will calculate his wSB. Van Heuklon has 6 SB, 1 CS, 17 BBs, 2 HBP, and 21 1Bs. The league has 195 SB, 35 CS, 555 1Bs, 466 BBs, and 105 HBP, and the value for RunsPerOut is ≈0.2381 (total runs divided by total outs). Now we can plug in values to find wSB. First, runCS is ≈-0.5512, which means the league wSB (lgwSB) is ≈0.0174 by plugging in the values. Now, we can solve for Van Heuklon’s wSB, which is -0.0488 (from exact calculations). Now, to calculate wGDP, we need Van Heuklon’s GIDP, ABs, and the league’s GIDP. Van Heuklon has grounded into 1 double play in 73 ABs, and the league has grounded into 35 double plays, so plugging in those numbers we get 0.6029. Now, we add his wSB and wGDP together to get 0.5540, which is Van Heuklon’s Baserunning Runs.

3. Fielding Runs

The FanGraphs website lists UZR, or Ultimate Zone Rating, as the way they track how fielding contributes to run prevention and then spits out a number for how many Fielding Runs a player is worth. They have a different calculation for catches that includes stolen bases, blocking, and framing. However, all of these calculations use video to track them, and the KCL does not have the capability to do this. Thus, I have created my own formulas for both non-catchers and catchers. 

3.1 Non-catcher Fielding Runs

For non-catchers, I have based my formula on FPCT+, a statistic created by fellow intern Cade Nelson, as a basis. To learn more about FPCT+, go to Cade’s article on the Kernelytics Blog section of the Cornbelters’ website. The gist of FPCT+ is it takes a player’s fielding percentage and “normalizes and compares it to the entire league” (Nelson). To summarize the calculations, you take a player’s fielding percentage and divide it by the league’s fielding percentage and then multiply by 100. A number above 100 means the player is an above-average fielder, and a number below 100 means a player is a below-average fielder. For Fielding Runs, instead of using 100, I have used 120 and then subtracted 117 to better scale values with the chart given by FanGraphs. Also, I have added 0.005×TC to reward players who have had more chances with similar percentages. For example, someone with a 100% fielding percentage with 5 TC might not be worth a similar fielder with a 100% fielding percentage and 105 TC. Again, the 0.005 number is chosen to better match the chart given.  

Defensive AbilityUZR
Gold Glove Caliber15
Above Average5
Below Average-5
Table 3.1: FanGraphs Ultimate Zone Rating (UZR) Scale

Admittedly, just relying on fielding percentage does not do the best job of separating out good fielders from bad ones. For example, someone with no errors but also consistently slow reaction times might actually contribute to fewer outs than someone with 2 errors but extremely fast reaction times. Slow reaction times, or slow reads, do not count as errors although they may result in situations where an out should have been recorded but was not. However, for the KCL, fielding percentage is the only way we can measure fielding impact, so we will have to proceed with this imperfect formula.

3.2 Catcher Fielding Runs

For catchers, I have used a different formula to account for factors important specifically to catchers. Because we have no available data for pitch framing, I have omitted that from the catcher’s formula. Thus, it includes stolen bases and caught stealing, passed balls, pickoffs, and general fielding. My formula for catchers Fielding Runs is 2[(cCS%/league cCS% – 1 – 0.2×cSB + (-1.75)×runCS×cCS) – (cPB/league cPB + 0.25×cPB – 0.0175×cINN) + (cPIK/league cPIK + 1×cPIK)] + (FPCT/lgFPCT – 1 + .001×(TC)). Now, this formula looks complicated, but it is actually pretty easy to understand once broken down part by part. A c before a stat is referring to a catcher. For example, cCS is runners caught stealing by a catcher while CS is the times a runner was caught stealing. 

3.2.1 Stolen Bases and Caught Stealing

For stolen bases and caught stealing, (cCS%/league cCS% – 1 – 0.2×cSB + (-1.75)×runCS×cCS) is just taking a catcher’s caught stealing percentage and dividing it by the league’s catchers’ caught stealing percentage and then normalizing it, and then subtracting .02 for every stolen base allowed and adding back (-1)×1.75×runCS for every stolen base (remember, runCS was negative and we want it to be positive here, hence multiplying by -1). The last part should be familiar as we dealt with a stolen base being worth .2 runs and a caught stealing being worth runCS amount of runs in the baserunner section. I have used the same run values here, except I have increased the importance of caught stealing by multiplying it by 1.75 because it is much harder to catch a runner stealing as a catcher than to be caught as a runner. 

3.2.2 Passed Balls

For passed balls, – (cPB/league cPB + 0.25×cPB – 0.0175×cINN) takes the number of passed balls allowed and divides it by the number of passed balls in the league. It then further subtracts 0.25 times each passed ball and then gives credit by adding back 0.0175 times the amount of innings a catcher has caught (remember, the sign on the outside is negative so it flips the signs on the inside). Basically, it creates a sort of passed balls percentage where from there a catcher loses credit for allowing more passed balls but gains back credit for each inning caught. Therefore, someone with 2 passed balls in 50 innings gets more credit than someone with 2 passed balls in 20 innings but less credit than someone with 1 passed ball in 50 innings.

3.2.3 Pickoffs

Then, for pickoffs, (cPIK/league cPIK + 1×cPIK) is simply creating a pickoff percentage by dividing the catcher’s pickoffs by total catcher pickoffs and then giving credit for each pickoff. Because caught stealing percentage, passed balls allowed, and pickoffs are the main ways catchers add value, I have multiplied this entire part by 2 to increase its importance. 

3.2.4 Fielding Percentage

However, catcher fielding is still important, so to calculate that I’ve added (FPCT/lgFPCT – 1 + .001×(TC)). This is similar to the calculation for a non-catcher’s Fielding Runs, but smaller because it is less of what defines a good catcher than what defines a good fielder. The weights from here and everywhere else are chosen for this purpose (defining a good catcher) as well as to match the scale above for fielding runs.

3.3 Logan Van Heuklon’s Fielding Runs

Now, Logan Van Heuklon is an interesting case because he plays catcher, first base, and DH. However, because we have no way of separating out which fielding plays of his comes when he is catching and which come when he is at first, we will treat him simply as a catcher (I do the same for any player who both catches and plays elsewhere in the field). We will deal with the potential fallout from this in the position adjustment section. Now, Van Heuklon has a caught stealing rate of ≈19.2%, 21 stolen bases allowed, 5 runners caught stealing, 4 passed balls, and 1 pickoff in 67.1 innings caught with a fielding percentage of ≈96.7% and 123 total chances. The league has a caught stealing rate of ≈15.2%, 26 passed balls, 2 pickoffs, and a fielding percentage of ≈ 95.72%, and the runCS value is ≈-0.5512. Thus, using the calculation from 3.2.1, we get ≈0.8776, from 3.2.2 we get ≈0.0245, from 3.2.3 we get 1.5, and from 3.2.4 we get ≈0.1332. Totaling these up, we get 2(.8776 + 0.0245 + 1.5) + 0.1332 which equals his Fielding runs of 4.9515 (from exact calculations).

3.4 Davey Fitzpatrick

Because Logan Van Heuklon falls under the catcher calculation of fielding runs for reasons explained above, I wanted to show an example for the formula in 3.1. Thus, I will use Davey Fitzpatrick’s Fielding Runs as an example. All we need to calculate Fitzpatrick’s Fielding Runs is his FPCT, the league’s FPCT, and Fitzpatrick’s total chances. Fitzpatrick has a fielding percentage of ≈98.7% from 75 TC, and the league has a fielding percentage of ≈95.72%. Thus, plugging the numbers in, Fitzpatrick has a Fielding Run value of 7.1152 (from exact calculations).

4. Positional Adjustment

Per the FanGraphs website, positional adjustment “is necessary for putting all defensive positions on the same scale” (Slowinski, FanGraphs). Because fielding runs are friendlier to first basemen, DHs, and the corner outfielders while harsher on middle infielders, catchers, centerfielders, and third basemen, we need to balance it out by adding positional adjustments. 

4.1 Formula

To calculate the adjustments, FanGraphs takes the number of innings played divided by total innings in a game divided by the number of games in a season and then multiplies by a positional constant. Because innings per position are not given and KCL players often stay in the same fielding position the whole game, my calculation is simply games played divided by total games (29) times the positional constant. The positional constants are as follows: 

Figure 4.1: Positional Constant Adjustments

However, you will remember that for catchers, we have scored their fielding as if they were simply a catcher. Most catchers, when not catching, play either first base or DH. A DH does not yield any fielding runs, so it does not matter how we have scored a catcher’s fielding when they play DH. A first baseman, however, does yield fielding runs, so we must adjust how we score a player who both catches and plays first. Because we have not given these players the fielding credit of a first baseman and only credited them as a catcher, we will limit the negative adjustment from -12.5 runs to -1 run as they have not had a chance to benefit from the higher fielding values of a first baseman. Thus, they should have a much smaller correction.

4.2 Logan Van Heuklon’s Positional Adjustment

Van Heuklon falls into the special category talked about above, so we will use the alternate first baseman positional constant when calculating his adjustment. Van Heuklon has played 10 games at catcher, 6 at first base, 1 at third base (a negligible amount so we do not attempt to fix the adjustment as we did at first base), and 9 at DH. Thus, the equation becomes 12.5×(10/29) – 1×(6/29) + 2.5×(1/29) – 17.5×(9/29) which equals -1.2414, Van Heuklon’s Positional Adjustment.

4.3 Davey Fitzpatrick’s Positional Adjustment

Again, because Logan Van Heuklon also plays catcher, his first base positional adjustment uses the catcher adjustment for first basemen I created. Thus, I wanted to show an example without this change, so I will again use Davey Fitzpatrick. Fitzpatrick has played 14 games at first base, 5 games at third base, and 2 at DH. Because he does not play catcher, we use the original -12.5 positional constant for his games at first base. His Positional Adjustment is then -12.5×(14/29) + 2.5(5/29) – 17.5(2/29), which equals -6.8103.

5. Runs Per Win

Per FanGraphs, Runs per Win is “the value that allows us to convert runs to wins” (Slowinski, FanGraphs). Basically, it converts all the runs above average a player has and turns them into wins above average. It is a constant that is applied both to Replacement Runs and the final WAR equation.

5.1 Equation and Constant

FanGraphs mentions that there are a lot of different calculations for Runs per Win, including a popular version called the Pythagpat. FanGraphs offers a simplified version that they say is within 0.02 runs per win from the Pythagpat calculation, and this is the version I went with. The equation is simple: innings in a game×(total runs scored/total innings pitched)×1.5 + 3. For the KCL, this constant comes out to 12.

6. Replacement Runs

Batting, Baserunning, and Fielding Runs all compare players to the average player. However, to establish Wins Above Replacement, we need to adjust from an average player to a replacement player. An average player has the value of a player with about half the league being better than him and half the league being worse. We want to scale this down so the player we are using as a comparison has the value of a player worse than almost all players in the league, or a player who could be replaced easily with no harm done to the team. Average players have value as they cannot be easily replaced without hurting the team, while replacement players do not have much value because they can be replaced at no cost to the team. We must account for this in our WAR calculations, so we add replacement runs to adjust this difference. We then scale it by plate appearance because more plate appearances mean more value over a replacement player with the same amount of plate appearances. The reason we do this is that the more you play for a team, the more you positively impact your team’s performance compared to a replacement player who played all those games. Thus, you add more value over a replacement player the more you play, so players with more plate appearances add more value, which is why we scale by PAs.

6.1 Formula

The formula given for Replacement Runs is also fairly straightforward. The FanGraphs equation is (570×(MLB games/2430))×(Runs per Win/lgPA)×PA. However, because this is for an MLB season, we must change the first part. The MLB games must be changed to KCL games, and 2430 must be changed to 58 as there are 2430 total games in an MLB season and 58 in the KCL season. Now, the 570 comes from a little more complicated place. FanGraphs believes a team of replacement-level players could win about 29.7% of its games in a year, or about 47 games in an MLB season. Now, multiply that by all 30 teams, and you get about 1430. This means that there are 2430 – 1430 = 1000 games above a replacement team to be “won.” They give position players 57% of those wins and pitchers 43%, thus creating 570 wins available for position players. Therefore, for the KCL, I have taken 29.7% of the season to be about 9 games, so 36 for all 4 teams, meaning there are about 22 games left to be “won above replacement” From there, 57% for the position players leaves about 12 WAR. Thus, the formula boils down to (12×(KCL games/58))×(Runs per Win/lgPA)×PA.

6.2 Logan Van Heuklon’s Replacement Runs

When I calculated WAR, 54 of the KCL games were done, the Runs per Win constant was 12, the league had 3473 PAs, and Van Heuklon had 92 plate appearances. Thus, plugging these numbers in, Van Heuklon’s Replacement Runs value is 3.5515.

7. fWAR

7.1 Formula Restated

Now, it is time to calculate fWAR. I have gone through each part in depth and the calculations behind each part. Now, all we have to do is put the parts together. Remembering from the very beginning part (0), our fWAR formula is simply (Batting Runs(1) + Baserunning Runs(2) + Fielding Runs(3) + Positional Adjustment(4) + Replacement Runs(6)) / (Runs Per Win(5)), where each portion has the individual calculations listed in the parts above.

7.2 Logan Van Heuklon’s fWAR

Going back to each section, we can get the pieces for Van Heuklon’s fWAR, and then simply add up the pieces and divide by Runs per Win. Van Heukon’s Batting Runs is 9.6631 (1.2), Baserunning Runs is 0.5540 (2.3), Fielding Runs is 4.9515 (3.3), Positional Adjustment is -1.2414 (4.2), and Replacement Runs is 3.5515 (6.2), and the Runs per win is 12 (5.1). Thus, putting this all together, Van Heuklon’s fWAR is 1.4566.

8. Conclusion

Player WAR is one of the most important and interesting advanced statistics there is in baseball. I have based my WAR calculation on FanGraphs’s calculation (fWAR), and then made adjustments to fit the KCL. I have laid out both FanGraphs formulas and my adjustments and reasoning behind them here and provided a case study in Merchants player Logan Van Heuklon to walk through calculating my KCL version of fWAR. When Van Heuklon did not apply to certain formulas as he is a catcher, I instead showed the calculations for the Ground Sloth’s Davey Fitzpatrick. I will use these fWAR calculations to help determine the league MVP in a future article, so stay tuned for that, as that article should be coming soon. If you have any further questions, feel free to contact me at I am happy to answer any questions you might have on this process!

9. Acknowledgments

First off, I would like to thank the Normal Cornbelters organization for providing me with this opportunity to work with the KCL and get access to all the data in order for me to complete this project as well as encourage me throughout the process. I would also like to thank my fellow Analytics Team members Cade Nelson, Clark Heideman, Ian Thompson, Jacob Hallowell, Jeff Brover, Matt Bowerman, and Christian Taylor for helping collect statistics for each game and also providing encouragement. Special thanks to Cade Nelson for creating his FPCT+ article (again, go check it out on the Kernelytics Blog section of the Normal Cornbelters website if you have not already) and sharing it with me. Also special thanks to Jeff Brover for providing the games per position for each player and for letting me talk through my adjustments out loud, as well as posting this article to the website. Finally, thank you to FanGraphs for providing a walkthrough of their fWAR calculation with all the formulas they use so I could use that as a basis.

10. Sources

Frey, Robert. “Collegiate Linear Weights.” Medium, Medium, 26 May 2020,

Nelson, Cade. “Creation of the FPCT+ Statistic.” Normal Cornbelters, 8 June 2022,

Slowinski, Piper. “Catcher Defense.” Sabermetrics Library, FanGraphs,

Slowinski, Piper. “Replacement Level.” Sabermetrics Library, FanGraphs,

Slowinski, Piper. “UZR.” Sabermetrics Library, FanGraphs,,to%20deal%20with%20odd%20quirks%20in%20certain%20ballparks.

Slowinski, Piper. “WAR for Position Players.” Sabermetrics Library, FanGraphs,

Slowinski, Piper. “wOBA.” Sabermetrics Library, FanGraphs,

Slowinski, Piper. “wRAA.” Sabermetrics Library, FanGraphs,

Weinberg, Neil. “BsR.” Sabermetrics Library, FanGraphs,

Weinberg, Neil. “wGDP.” Sabermetrics Library, FanGraphs, 


  1. Palmira Reyes on July 13, 2022 at 12:18 pm

    Very informative. The breakdown of wins and adjustments was helpful and comprehensive.

  2. Renald Gregoire on July 14, 2022 at 6:07 pm

    WOW! Please don’t give me any homework on this subject. Pepere

  3. Adam Kramer on July 18, 2022 at 10:13 pm

    I am incredibly impresseed by the depth of this article. The Kernelytics Blog is really going above and beyong with these analytics. Very impressive. Great job Robert Reyes.

Leave a Comment