scipy isf 中的异常行为

Unexpected behavior in scipy isf

我正在使用 scipy 的统计模块来尝试确定上尾概率达到某个小值的分布值,但我得到了一些非常不切实际的结果。例如:

我将 beta 分布拟合到归一化相关系数的平方数组以进行信号匹配操作(相关系数始终介于 -1 和 1 之间,因此它的平方介于 0 和 1 之间)。使用

import scipy, numpy as np
bd=scipy.beta.fit(np.square(data),floc=0,fscale=1) #fitted beta dist

这给了我 beta 分布参数 (0.42119596435034012, 16939.046996018118, 0, 1) 数据数组大约有 300 万个元素。

现在,当我绘制分布图时,很明显分布的大部分区域在 x 轴上非常接近 0

import matplotlib.pyplot as plt
x=x=np.linspace(0,1,num=1000000)
plt.plot(x,scipy.stats.beta.pdf(x,betaparams[0],betaparams[1]))
plt.xlim([0,.0001])

现在,当我尝试找到保留一些上尾概率的 x 值时,我遇到了一些意外行为。例如

for expon in [-1,-2,-3,-4,-5,-6,-7,-8,-9,-10]:
    print (expon,scipy.stats.beta.isf(10**expon,betaparams[0],betaparams[1]))

产量:

(-1, 6.9580465891063448e-05)
(-2, 0.00018124328968143608)
(-3, 0.00030250611696189104)
(-4, 0.00042796070123291116)
(-5, 0.0005557482540313166)
(-6, 0.00068501413697673774)
(-7, 0.99999966996999767)
(-8, 0.99999996699699967)
(-9, 0.99999999669970008)
(-10, 0.99999999966997)

很明显,scipy 返回了 10**-7 左右的较差估计值。我的问题是为什么,为什么它会默默地表达这种行为,以及如何解决它。

谢谢

这似乎是 scipy.special.btdtri 中的一个错误,它应该计算 beta 分布的分位数。也许您可以提交错误报告。

>>> from scipy import special
>>> special.btdtri (betaparams[0],betaparams[1], 1-1e-6)
0.00068501413697504238
>>> special.btdtri (betaparams[0],betaparams[1], 1-1e-7)
0.99999966996999767

我不知道 btdtri 是在哪里定义的。

编辑:作为记录,这里是 SciPy 错误报告:https://github.com/scipy/scipy/issues/4677