Python 带numpy的泊松置信区间

Python 带numpy的泊松置信区间,python,math,numpy,statistics,scipy,Python,Math,Numpy,Statistics,Scipy,我试图把泊松连续误差条放在我用matplotlib制作的直方图上,但我似乎找不到一个numpy函数,它可以给我一个95%的置信区间,假设泊松数据。理想情况下,解决方案不依赖于scipy,但任何东西都可以工作。这样的功能存在吗?我发现了很多关于自举的东西,但在我的例子中这似乎有点过分 使用,以及间隔方法: >>> scipy.stats.poisson.interval(0.95, [10, 20, 30]) (array([ 4., 12., 20.]), array([

我试图把泊松连续误差条放在我用matplotlib制作的直方图上,但我似乎找不到一个numpy函数,它可以给我一个95%的置信区间,假设泊松数据。理想情况下,解决方案不依赖于scipy,但任何东西都可以工作。这样的功能存在吗?我发现了很多关于自举的东西,但在我的例子中这似乎有点过分

使用,以及
间隔
方法:

>>> scipy.stats.poisson.interval(0.95, [10, 20, 30])
(array([  4.,  12.,  20.]), array([ 17.,  29.,  41.]))
尽管计算非整数值的泊松分布意义有限,但可以计算OP要求的准确置信区间,具体操作如下:

>>> data = np.array([10, 20, 30])
>>> scipy.stats.poisson.interval(0.95, data)
(array([  4.,  12.,  20.]), array([ 17.,  29.,  41.]))
>>> np.array(scipy.stats.chi2.interval(.95, 2 * data)) / 2 - 1
array([[  3.7953887 ,  11.21651959,  19.24087402],
       [ 16.08480345,  28.67085357,  40.64883744]])

也可以使用
ppf
方法:

>>> data = np.array([10, 20, 30])
>>> scipy.stats.poisson.ppf([0.025, 0.975], data[:, None])
array([[  4.,  17.],
       [ 12.,  29.],
       [ 20.,  41.]])
但由于分布是离散的,返回值将是整数,置信区间不会精确跨越95%:

>>> scipy.stats.poisson.ppf([0.025, 0.975], 10)
array([  4.,  17.])
>>> scipy.stats.poisson.cdf([4, 17], 10)
array([ 0.02925269,  0.98572239])

最后,我编写了自己的函数


这将返回连续(而不是离散)边界,这在我的领域中更为标准

这个问题在天文学(我的领域!)中经常出现,本文是这些置信区间的参考:

对于具有泊松统计的任意置信区间,它有很多数学知识,但对于双边95%置信区间(对应于2西格玛高斯置信区间,或本文中的S=2),给出了测量N个事件时置信上限和置信下限的一些简单分析公式

upper = N + 2. * np.sqrt(N + 1) + 4. / 3.
lower = N * (1. - 1. / (9. * N) - 2. / (3. * np.sqrt(N))) ** 3.
我已经把它们放在Python格式中了。您所需要的只是numpy或您喜欢的其他平方根模块。请记住,这些将为您提供事件的上限和下限,而不是+/-值。你只要从这两个值中减去N就可以得到


请参考本文,了解这些公式在您需要的置信区间中的准确性,但对于大多数实际应用而言,这些公式应足够精确

你知道获得精确返回值的方法吗?@Shep刚刚在我的答案中添加了一个基于卡方检验的方法版本,但使用了
区间
。@Jaime精确公式不正确。例如,对于较小的k值,它返回负值。这并不等同于Shep的答案,其中chi2.ppf是用$2*k$和$2*k+2$计算的。感谢您对@firelynx的编辑。这样更容易阅读。因为我做的科学多于软件工程,所以我经常忘记遵守PEP8。
upper = N + 2. * np.sqrt(N + 1) + 4. / 3.
lower = N * (1. - 1. / (9. * N) - 2. / (3. * np.sqrt(N))) ** 3.