scipy中非中心卡方分布实现的准确性

时间:2018-04-11 08:16:54

标签: python scipy

在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库的一部分?

1 个答案:

答案 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