我正在尝试将我的数据拟合到beta二项分布并估计alpha和beta形状参数。对于此分布,先验取自beta分布。 Python没有beta-binomial的拟合函数,但它适用于beta。 python beta拟合和R beta二项式拟合是接近但系统性的。
R:
library("VGAM")
x = c(222,909,918,814,970,346,746,419,610,737,201,865,573,188,450,229,629,708,250,508)
y = c(2,18,45,11,41,38,22,7,40,24,34,21,49,35,31,44,20,28,39,17)
fit=vglm(cbind(y, x) ~ 1, betabinomialff, trace = TRUE)
Coef(fit)
shape1 shape2
1.736093 26.870768
蟒:
import scipy.stats
import numpy as np
x = np.array([222,909,918,814,970,346,746,419,610,737,201,865,573,188,450,229,629,708,250,508], dtype=float)
y = np.array([2,18,45,11,41,38,22,7,40,24,34,21,49,35,31,44,20,28,39,17])
scipy.stats.beta.fit((y)/(x+y), floc=0, fscale=1)
(1.5806623978910086, 24.031893492546242, 0, 1)
我已经多次这样做了,似乎python系统性地比R结果略低。我想知道这是我输入错误还是计算方式不同?
答案 0 :(得分:4)
您的问题是,拟合β二项式模型与使用等于比率的值拟合Beta模型不同。我将使用bbmle
包来说明这一点,它会将类似的模型与VGAM
相匹配(但我更熟悉它)。
预赛:
library("VGAM") ## for dbetabinom.ab
x <- c(222,909,918,814,970,346,746,419,610,737,
201,865,573,188,450,229,629,708,250,508)
y <- c(2,18,45,11,41,38,22,7,40,24,34,21,49,35,31,44,20,28,39,17)
library("bbmle")
适合beta-binomial模型:
mle2(y~dbetabinom.ab(size=x+y,shape1,shape2),
data=data.frame(x,y),
start=list(shape1=2,shape2=30))
## Coefficients:
## shape1 shape2
## 1.736046 26.871526
这与您引用的VGAM
结果或多或少完全吻合。
现在使用相同的框架来代替Beta模型:
mle2(y/(x+y) ~ dbeta(shape1,shape2),
data=data.frame(x,y),
start=list(shape1=2,shape2=30))
## Coefficients:
## shape1 shape2
## 1.582021 24.060570
这适合您的Python,beta-fit结果。 (我确定如果您使用VGAM
来符合Beta版,那么您也可以获得相同的答案。)
答案 1 :(得分:0)
您可以将conjugate_prior
包用于python
请参阅代码以了解硬币翻转示例:
from conjugate_prior import BetaBinomial
heads = 95
tails = 105
prior_model = BetaBinomial() #Uninformative prior
updated_model = prior_model.update(heads, tails)
credible_interval = updated_model.posterior(0.45, 0.55)
print ("There's {p:.2f}% chance that the coin is fair".format(p=credible_interval*100))
predictive = updated_model.predict(50, 50)
print ("The chance of flipping 50 Heads and 50 Tails in 100 trials is {p:.2f}%".format(p=predictive*100))
代码来自here