大的不完全 Beta 函数的对数α , βα,β

机器算法验证 r 贝塔分布
2022-03-18 19:15:46

R 的函数pbeta应该计算不完全正则化 Beta 函数。如果标志log=TRUE作为参数传递,则返回结果的对数。

我发现以下数字错误。评估:

pbeta(0.5555555, 1925.74, 33.7179, log=TRUE)

return -Inf,这显然是错误的。正确的结果是(使用 Mathematica 计算):

logI0.5555555(1925.74,33.7179)=994.767594138466967

对于我测试过的所有其他值,pbeta给出正确答案。我检查了源代码,pbeta但无法查明错误。

我需要一种精确的方法来计算大值的不完全 Beta 函数的对数(大约数千)。有人可以建议修复或解决方法吗?或者也许是一个不同的图书馆?α,βpbeta

R 错误报告: https ://bugs.r-project.org/bugzilla3/show_bug.cgi?id=16332

1个回答

Beta不完全函数可以借助高斯超几何函数写成: 并且分布的 CDF 包中提供了高斯超几何函数的良好实现——Gnu 科学库的特殊函数的包装器。因此,您可以像这样编写 log-CDF:

Bx(a,b)=1axa(1x)bF(a+b,1,a+1,x)
Beta(a,b)x
Bx(a,b)/B(a,b).
gsl

library(gsl)
logpbeta <- function(x,a,b) log(hyperg_2F1(a+b,1,a+1,x)) + a*log(x)+b*log(1-x)-log(a) - lbeta(a,b)

对于您的示例,它给出了与 Mathematica 相同的结果:

> logpbeta(0.5555555, 1925.74, 33.7179)
[1] -994.7676

我不知道结果在哪个范围内的参数是正确的。而且我还没有在 GNU 参考手册中找到答案。

请注意,您获得的零pbeta似乎​​是由于对的评估,然后是对数转换:Bx(a,b)

> x <- 0.5555555 
> a <- 1925.74
> b <- 33.7179
> log(hyperg_2F1(a+b,1,a+1,x)*x^a*(1-x)^b/a)
[1] -Inf
> hyperg_2F1(a+b,1,a+1,x)
[1] 2.298761
> x^a*(1-x)^b/a
[1] 0