我正在尝试将泊松连续误差条放在我用matplotlib制作的直方图上,但我似乎无法找到一个numpy函数,它会给出95%置信区间假设泊松数据。理想情况下,解决方案不依赖于scipy,但任何事情都可行。这样的功能存在吗?我发现了很多关于自举的内容,但在我看来这似乎有些过分。
答案 0 :(得分:8)
我最终根据some properties I found on Wikipedia编写了自己的函数。
def poisson_interval(k, alpha=0.05):
"""
uses chisquared info to get the poisson interval. Uses scipy.stats
(imports in function).
"""
from scipy.stats import chi2
a = alpha
low, high = (chi2.ppf(a/2, 2*k) / 2, chi2.ppf(1-a/2, 2*k + 2) / 2)
if k == 0:
low = 0.0
return low, high
这会返回连续(而非离散)边界,这在我的字段中更为标准。
答案 1 :(得分:7)
使用scipy.stats.poisson
和interval
方法:
>>> 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])
答案 2 :(得分:1)
这个问题在天文学(我的领域!)中出现了很多,本文是这些置信区间的首选参考:Gehrels 1980
对于具有泊松统计量的任意置信区间,它有很多数学,但是对于双侧95%置信区间(对应于2-sigma高斯置信区间,或者在此上下文中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来得到那些。
请参阅论文,了解这些公式对于您所需的置信区间的准确性,但对于大多数实际应用来说,这些应该足够准确。