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
我正在使用 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