In [67]:
from scipy.special import betaln as lbeta
from scipy.stats import beta as beta_dist, norm as norm_dist
from numpy import log, exp
In [113]:
def probability_B_beats_A_evan(α_A, β_A, α_B, β_B):
total = 0.0
for i in range(α_B):
total += exp(lbeta(α_A+i, β_B+β_A) - log(β_B+i) - lbeta(1+i, β_B) - lbeta(α_A, β_A))
return total
In [114]:
def probability_B_beats_A_mc(α_A, β_A, α_B, β_B, N=1000000):
p_A = beta_dist.rvs(α_A, β_A, size=N)
p_B = beta_dist.rvs(α_B, β_B, size=N)
return (p_B>p_A).mean()
In [115]:
def beta_mean(a, b):
return a/(a+b)
def beta_var(a, b):
return a*b/((a+b)**2*(a+b+1))
In [116]:
def probability_B_beats_A(α_A, β_A, α_B, β_B):
mu = beta_mean(α_A, β_A) - beta_mean(α_B, β_B)
sigma = (beta_var(α_A, β_A) + beta_var(α_B, β_B))**.5
return norm_dist.cdf(0, mu, sigma)
In [121]:
α_A, β_A, α_B, β_B = 21, 200, 31, 200
print(probability_B_beats_A_evan(α_A, β_A, α_B, β_B))
print(probability_B_beats_A(α_A, β_A, α_B, β_B))
In [122]:
%%timeit
probability_B_beats_A_evan(α_A, β_A, α_B, β_B)
In [123]:
%%timeit
probability_B_beats_A(α_A, β_A, α_B, β_B)