Beta 二项式和 Beta 分布的 alpha 和 beta 估计

use*_*890 3 python beta r parameterization scipy

我正在尝试将我的数据拟合到 beta 二项式分布并估计 alpha 和 beta 形状参数。对于此分布,先验值取自 beta 分布。Python 没有用于 beta-binomial 的 fit 函数,但它有用于 beta 的函数。python beta 拟合和 R beta 二项式拟合很接近,但系统性地关闭。

回复:

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
Run Code Online (Sandbox Code Playgroud)

Python:

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)
Run Code Online (Sandbox Code Playgroud)

我已经这样做了很多次,似乎 python 系统地比 R 结果低一点。我想知道这是我的输入错误还是计算方式的不同?

Ben*_*ker 5

您的问题是拟合 Beta 二项式模型与拟合值等于比率的 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")
Run Code Online (Sandbox Code Playgroud)

拟合β二项式模型:

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 
Run Code Online (Sandbox Code Playgroud)

这与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 
Run Code Online (Sandbox Code Playgroud)

这适合您的 Python 测试版结果。(我敢肯定,如果您曾经VGAM安装过 Beta 版,您也会得到相同的答案。)