The link below is for an article that was printed in the August 2001 edition of By the Numbers, the newsletter
of SABR's Statistical Analysis Committee, with minor modifications, about David Smyth's outstanding Base Runs method.
Below the link is some additional information about BsR.
Breaking Down BsR
It is sometimes useful to write a stat like Base Runs in rate form. It helps
greatly in making the Theoretical Team equations, for one thing, and it is also useful to be able to write BsR completely
in terms of BA, OBA, SLG, and HR/PA. To do this, you need to start with each component and divide it by PA. So,
A/PA, B/PA, C/PA, and D/PA. (Since I am using a basic version of Base Runs, you need PA=AB+W). You can call these,
resepectively, Runners On Base Average(ROBA), Advancement Factor(AF), 1-OBA, and HR/PA. Then
BsR/PA = ROBA*AF/(AF+1-OBA)+HR/PA
For the Basic version I use, these are the equations for each component:
ROBA = (H+W-HR)/(AB+W) = OBA-HR/PA
AF = (2*TB-H-4*HR+.05*W)*.78 = ((2*SLG-BA)*(1-OBA)/(1-BA)-4*HR/PA+.05*(OBA-BA)/(1-BA))*.78
1-OBA = 1-(H+W)/(AB+W)
HR/PA = HR/(AB+W)
In the Base Runs article linked above, I gave the equations that I use for each factor in this basic version. The
B multiplier is based on the composite MLB stats of 1946-1995. In this period, the average for each components are:
You can use these to put together the Theoretical Team factors. The TT concept, which I will not explain here in
every detail, is that since Base Runs(or Runs Created) is a run estimator devised for estimating team runs, there is an interactivity
between the values of the offensive events. As the offensive production increases, the value of each event goes up(with
the exception of the special case, HR). So applying BsR to Babe Ruth gives him an unfair advantage because he is not
playing on a team by himself; he is playing on a team with 8 other players. So the TT formula puts the the player on
a team with 8 average players. So, we assume that each player on the theroetical team gets the same number of PA as
our player. So the teams new A factor can be calculated as (A+LgROBA*PA*8), where A is the individual's A factor. So
you apply this technique to the B, C, and D terms, using the long term averages above(you really should have a seperate version
each year, but small changes in ROBA, AF, etc. don't significantly change the results of the formula).
Then, to see how much the player has helped this team, we compare him to a team of 8 average players in his number of
PA each. If we wanted to compare the player to the league average, we would compare him to 9 average players. If you
work all this out and simplify, you get this equation for TT BsR, which I like to call Individual Base Runs(IBR).
IBR = (A+2.42PA)(B+2.46PA)/(B+C+7.86PA)+HR-.76PA
Lest it seem as if I am taking credit for coming up with all of this, the pioneering TT work was done by Dave Tate and
Bill James, and the application of the TT concept to BsR was also the work of David Smyth.
Stolen Base BsR
It is useful and necassary to get some more categories into a Runs Created formula, and so here we'll put SB and CS in(this
is again based on Smyth's work). The other categories we could add, like SF, SH, and DP, I choose to ignore. For
one, they are very situation dependent and therefore I'm not 100% comfortable in including in an individual formula, and secondly
and more importantly, I am lazy and don't want to deal with them. Anyway, for BsR including SB:
A = H + W - HR - CS
B = (2*TB - H - 4*HR + .05*W +1.5*SB)*.76
C = AB-H
The IBR formula for the standard league is:
ROBA and AF are no longer the rate stats; I call these AROBA and AAF for "advanced". Anyway, the long term averages
.293 .323 .325
Here is a version of the BsR formula that you can use if you have all of the minor(SH, SF, DP, etc.) offensive stats. It
is not as clean and nice looking as the other versions on this page, but there needs to be more of a give-and-take between
the various events when you include the other stats. It is also not straightforward as to which events should be placed in
which factor(s). I took the convention that A is final baserunners; baserunners less those who we know have been thrown out
on the bases or taken out on a DP. Everything goes in B to balance everything out and produce good linear weights, while
C is batting outs. D remains home runs. There are other ways to define these terms and Smyth, TangoTiger, and Robert Dudek
have all done these in different ways then I have. There are certainly arguments to be made for all of the differnt approaches,
but a discussion of that will have to wait for another day.
A = H + W + HB - HR - CS - DP
B = .777S + 2.61D + 4.29T + 2.43HR + .03(W + HB - IW) - .747IW + 1.30SB + .13CS + 1.08SH + 1.81SF + .70DP -.04(AB-H)
C = AB - H + SH + SF
If you want to include strikeouts, they go in this B factor which is coupled with the A and C factors given above:
B = .781S + 2.61D + 4.28T + 2.42HR + .034(W + HB - IW) - .741IW + 1.29SB + .125CS + 1.07SH + 1.81SF +.69DP - .029(AB-H-K)
Finding the B Multiplier
The B multiplier is designed so that the BsR formula will produce the correct number of runs for the entity you are using.
This is because A as baserunners, C as outs, and D as Home Runs, all are straightforward and obvious formulas.
You can calculate, based on A, C, and D, the actual B factor required to equate BsR with R, by this formula: (R-D)*C/(A-R+D).
What can you do with the actual B value? For one thing, if you already have a set formula for B(ignoring the multiplier),
you can divide actual B by estimated B to get the correct multiplier. Another thing you can do is run a regression to
find weights for TB, H, etc. by using those stats to predict Actual B, or use other approaches like trial and error, etc.
All of these approaches had a role in finding the B component used in the official versions of BsR.
An alternate way to find B is to calculate Z=(R-D)/A, then B=Z*C/(1-Z). It is the same thing, and longer and more
complicated, but it is equivalent. (I include it because it was the way I did it until I took the time to work out the
algebra to derive the other formula).
Building the TT BsR Formula
Here are the technical steps to be building the TT formula. These are not very interesting for most people, but
hard core sabermetricians may find them useful(although hard core sabermetricians probably already know how to do it themselves):
IBR can be written as:
(A+X*PA)(B+Y*PA)/((B+Y*PA)+(C+Z*PA))+HR+T(PA)-(V)PA which simplifies too:
where X is the remainder of team ROBA
Y is the remainder of team AF
Z is the remainder of team 1-OBA
T is the remainder of team HRPA
V is the R/PA for the comparison lineup multiplied
by the number of players
in the comparison lineup
OK, since we always add the player to a team with 8 average playes:
X = LgROBA*8 Y = LgAF*8 Z=(1-LgOBA)*8 T
Depending on what baseline we use though, V will vary. For absolute runs, we compare the player to a team with
8 average hitters. For runs above average, we compare the player to a team with 9 average hitters. For runs above
replacement, we compare the player to a team with 8 average hitters plus one replacement level hitter. So, it is very
straightforward to find V for absolute: 8*LgBsR/PA. For average, V = 9*LgBsR/PA.
For replacment, we need to first set a replacement level, and then determine what ROBA, AF, OBA, and HRPA a replacement
player will have. I assume 25 batting outs(AB-H)/G, and use BsR/PA to calculate the R/G for the league. (BsR/PA)/(1-OBA)*25,
since BsR/O = (BsR/PA)/(1-OBA). (Keeping in mind that BsR/PA = ROBA*AF/(AF+1-OBA) + HRPA). Then, I assume
the replacement rate is 1 run/game below average, so I take that R/G, subtract 1, and divide by 25. This is the replacement
player's R/O. In the standard league we are using, the BsR/PA = .117, R/O = .173, and RepR/O(R/O for the replacement)
= .133. Then we need to find the value, X, by which the each component stat for the league(ROBA, AF, OBA, and HRPA)
needs to be deflated by for R/O to equal .133. We multiply each term in the BsR/O formula by X. This, when
simplified, gives this equation:
RAX^2/(1+X(A-O)+HX)/(1-OX) = Rep R/O
R is LgROBA, A is LgAF, O is LgOBA, and H is LgHRPA. I have no idea how to solve for X by hand, but my TI-83 calculator
will do it, and it gives .89 for the standard league(this will all vary based on the league offensive levels, and of course
how you personally choose to define replacement rate). Any way, we then multiply each component by .89 to find we expect
our replacement to hit:
So this gives him a BsR/PA of .095. We then calculate the V value for the replacement baseline as 8*LgBsR/PA+RepBsR/PA.
Here is a chart showing the values you need to fill in for the TT components at each baseline in the standard league:
Y Z T V
Absolute 2.42 2.46
5.40 .178 .937
Average " " "
Replacement " "
If you want to get more complex, there is something that we have failed to adress. That is that if you really add
a player to a team, he will change the number of PA everyone in the lineup gets. A player with a higher OBA than his
teammates will generate more PA; one with a lower one will generate less. In the TT formula above, we have held PA constant.
What if we let them vary? We can calculate the OBA the team would have with the player as 8/9*LgOBA+1/9*OBA. Call
this Q. Then, figure (1-LgOBA)/(1-Q). Call this PAR of PA-added ratio. Then, multiply every individual term(the
new A, the new B, the new C, and the new D), by PAR, and proceed as usual.
Is this worth it? Who knows. Some of these bells and whistles might wash out when you convert them to win
values. Maybe they don't. A straight linear system, though, might be correct, and it will help you keep your sanity.
Simplified TT BsR
What does all that do for you? Believe it or not, it leaves you with almost the same result you would have gotten
if you took 1/9 of the player's straight BsR and 8/9 of the player's linear BsR(based on the reference team). This is
for the absolute version only, but of course if you have the absolute RC figure, you can calculate the values above other
baselines without going through all the voodoo above.
Fundamental Structure of BsR
The fundamental structure of BsR is its key asset. That fundamental structure is based on the simple, undeniable
truth that runs scored = baserunners*% of baserunners who score + home runs. "Basrunners" does not include home runs.
Anyway, in BsR, the A factor represents baserunners and the D factor represents home runs. The % of baserunners who
score, which we'll call score rate, is estimated as B/(B+C), where B is advancement and C is outs.
Other run estimators are not backed up by a fundamental theory of how runs are scored. Runs Created's downfall
is its failure to account for the unique nature of the HR(that it always produces at least one run, and if it occurs by itself,
it will produce only one run). Static LW formulas fail to account for the fact taht the value of each event varies based
on the context. BsR is based on a true equation of how runs are scored. That does not mean, though, that BsR is
the one true correct run estiamtor by any stretch. The equation of B/(B+C) to estimate score rate has good empirical
accuracy, but also has been found to not work very well in some circumstances(such as OBA between .500 and .800--see Tango's
article on Primer about this). Maybe score rate should be estimated in a totally different way. But the structure
of the BsR equation is sound. If we want a better run estimator, we need a better estimator of score rate.
You can figure how a non-linear RC formula values each event in the context you are interested in(it can be the league,
a specific team, or even a hypothetical lineup of the same player over and over again). All you have to do is calculate
BsR for the entity, and then add one single, recompute BsR, and subtract the first figure. This is the value of one
additional single. Then you do the same with every other event, and you'll have LBsR. You have to be careful to
account for everywhere the event is involved; for example, a single not only adds a hit but also a Total Base and an At Bat.
If you run the LBsR for the long-term stats, you get these values:
LBsR = .48S+.81D+1.14T+1.50HR+.32W-.096(AB-H)
LBsR(sb) = .47S+.77D+1.07T+1.45HR+.33W+.23SB-.41CS-.093(AB-H)
Of course, you could add something other than one. You could subtract one, or add 10, or add 15. The further
you get away from 0, the more the results will vary. Adding 1000 singles will have a much different effect, even per
single, then adding 1 single. Really, as Tango has pointed out, we want to get as close to adding 0 singles as possible.
Adding .00001 singles changes the run enviornment and the values of the other events very little, and that is what we
are looking to do. It is sort of like a limit in calculus. Actually, I guess that's exactly what it is. We want
to find the limit of (new BsR minus old BsR) divided by X, as X approaches 0, where X is the number of the event that we are
adding. Somebody who knows a lot about calculus could probably tell me if I'm right about that, and if so, come up with
a formula to calculate the limit precisely instead of having to do trial and error in a spreadsheet.
I have included a spreadsheet which runs through this approach for the 1979 Pirates. You can change the data in
cells B2 to G2 to whatever you want to do this with other entities. Anyway, I show the LW generated by adding 10 of
each event, 1 of each event, .1 of each event, etc. and the same for -10, -1, -.1, etc. I have highlighted in pink the
positive and negative points at which the convergence, the limit, occurs. If you go past that(I put it at one ten-millionth,
10^-6), the values start fluctuating again. My suspicion is that this is because of the spreadsheet not having perfect
accuracy, internal rounding and the like, but I could be wrong. Anyway, you can see there is not a lot of difference.
The +10 weight for a Pirate single for instance is .4898824, the +1 is .4892998, and the limit is around .4892350. So
you really don't need to do that, but it is nice to illustrate the property.
Added 4/7/04: Using calculus, you can figure this precisely using partial derivatives. The value of the single
for instance is equal to the partial derivative of the BsR function with respect to singles. You can still do this even
if you don't know calculus, because the math works out simple with BsR. The formula winds up being:
Let A, B, C, and D be the respective total factors for the entity you are interested in. Let a, b, c, and d be
the A, B, C, and D coefficients of the event you are interested in. That's it. Thank goodness all of the formulas
for the pieces of BsR are linear.
There is a spreadsheet linked at the bottom that shows this. It is based on Tango's full BsR which is available
If you don't want to deal with a category, just set the coefficients to 0. You can change the coefficients for
the other events to use any BsR equation you want all with this spreadsheet. Of course you can also change the "#" column,
which is the frequency of the event for the dataset you're using. Enjoy.
Matching LW Values
Based on the formula above to calculate
the Linear Weight value of a certain event using BsR, you can also fix the B coefficients so that they produce desired LWs. For example, on my LW page there is the ERP formula that I use, based on 1951-1998
composite major league data. Suppose I want to force my BsR formula to produce
the same LW as are used in ERP. How do I go about doing this?
Well, first, I have to clearly define
which events are in the A, C, and D factors, and what coefficient they have there. For
my case, I will use S, D, T, HR, W, and O as the only events. S, D, T, and W
each have a coefficient of 1 in A; O has a coefficient of 1 in C; and HR has a coefficient of 1 in D.
Now, I we need to calculate the A, C,
and D factors for the entity I am working with(in my case, all teams 1951-1998). Then,
I use these to calculate what we will call B--the actual B value required for BsR to equal runs scored.
The formula for ActB is (R-D)*C/(A-R+D), where R is the actual runs scored we want to match.
So, now we have everything we need. a, b, c, and d are still the coefficient for the given event in the respective factors. And we can calculate b as:
B = ((B+C)^2*(L-d)-B^2*a-B*C*a+A*B*c)/(A*C)
So, let's look at my ERP equation. It is (TB+W+.5H-.3(AB-H))*.324, which
as LW for S, D, T, HR, W, O is .486, .81, 1.134, 1.458, .324, -.0972. The B that
I use for BsR((2TB-H-4HR+.05W)*.78) is:
B = .78S+2.34D+3.9T+2.34HR+.039W
Now, with all of this data, we can force
the LW values. When we do this(which you can do with the spreadsheet linked at
the bottom of the page, the same one that gives the actual LW values), it seems to give a result that's decent to .001 or
so. It might be rounding error, or it might be something else, but either way,
it's pretty close. So, to match the linear weight values I wanted, my B would
B = .833S+2.360D+3.888T+2.159HR+.0692W-.010(O)
Yes, the outs have to be included as
well. That's kind of cumbersome if you don't want outs in B, but it's necessary
to force the values. Are you sufficient confused yet? I am.
1979 Pirates LBsR
Linear Weights from Base Runs