Python scipy.stats.norm.interval返回inf

Python scipy.stats.norm.interval返回inf,python,scipy.stats,Python,Scipy.stats,我有一堆数据点和一个模型,我现在想计算我能排除模型的置信水平 我从一个卡方值和一个自由度的值开始 使用scipy,我一直在尝试的是: from scipy.stats import chi2 from scipy.stats import norm chisq = 74.1 df = 21 #degrees of freedom cdf = chi2.cdf(chisq, df,scale=1) sigma = norm.interval(cdf) 这会产生我想要的输出(5.5西格玛置信度

我有一堆数据点和一个模型,我现在想计算我能排除模型的置信水平

我从一个卡方值和一个自由度的值开始

使用scipy,我一直在尝试的是:

from scipy.stats import chi2
from scipy.stats import norm

chisq = 74.1
df = 21 #degrees of freedom

cdf = chi2.cdf(chisq, df,scale=1)
sigma = norm.interval(cdf)
这会产生我想要的输出(5.5西格玛置信度),但对于更高的chi^2值则失败

在我看来,问题在于scipy使用的数据类型的精度。对于chi^2值334.7(和相同的自由度数),chi^2.cdf产生1.0,这反过来使norm.interval return-inf/inf。这最好返回16.1 sigma置信度

我找到了一种使用mpmath获得cdf更高精度的方法:

import mpmath

mpmath.mp.dps = 200 # decimal digits of precision

def cdf(x,k):
    x,k = mpmath.mpf(x), mpmath.mpf(k)
    return mpmath.gammainc(k/2, 0, x/2, regularized=True)
但是,问题仍然存在,因为似乎scipy.stats.norm.interval将输入四舍五入为1.0

是否有一种方法可以通过更改norm.interval使用的数据类型来规避此问题,或者是否有其他方法/包可以使用任意精度输入计算正态分布的端点