在scipy(scipy.stats.ncx2,scipy.special.chndtr)中实现非中心卡方分布对于非中心性参数的大值是不准确的。例如。考虑
from scipy.stats import ncx2
print(ncx2.cdf(1200,2,1000))
print(ncx2.cdf(1500,2,1000))
print(ncx2.cdf(2000,2,1000))
print(ncx2.cdf(5000,2,1000))
产生
0.998604279948
0.999933004449
0.999933004449
0.999933004449
scipy的实现基于Abramowitz和Stegun的公式26.4.25,数学函数手册(1966) (见https://github.com/scipy/scipy/blob/master/scipy/special/cdflib/cdfchn.f)。
有更快,更准确的算法来实现这个功能,特别是对于大的非中心性。例如,R显然使用丁(1992)(见http://stat.ethz.ch/R-manual/R-devel/library/stats/html/Chisquare.html)。我想知道是否有人知道替代实现是否可用作标准python库的一部分?
答案 0 :(得分:0)
回答我自己的问题,以防它对某人有用:可以使用rpy2从python访问非中心卡方分布的R实现,如下所示(适应上面的例子):
import rpy2.robjects as ro
from rpy2.robjects.packages import importr
stats = importr('stats')
print(stats.pchisq(1200,2,1000)[0])
print(stats.pchisq(1500,2,1000)[0])
print(stats.pchisq(2000,2,1000)[0])
print(stats.pchisq(5000,2,1000)[0])
输出
0.998663933426865
1.0
1.0
1.0