我找到了这个网站:as suggested here,用于计算超几何分布的置信区间,该区间链接到维基百科的Clopper-Pearson区间部分:http://www.cluster-text.com/confidence_interval.php
我现在想知道如何在Python中进行相同的计算。我假设在"句子"下面有两个大的表达式。 "β分布又与F分布有关,因此Clopper-Pearson区间的第三个公式可以使用F分位数来编写:"是下边界和上边界。出于某种原因,该公式似乎并不关心人口规模......
维基百科中的公式称为F函数,我认为它是scipy.stats.f中的一些函数。我写了一个程序来尝试所有这些,我发现使用stats.f.ppf作为"神秘的" F函数可以获得最佳效果。
我设法编写的函数给出了与网站给出的结果非常接近的结果,但结果并不完全(可能是因为人口规模被忽略)。我需要做些什么来解决这个问题并获得正确的置信区间?例如:根据网站,如果人口规模是80,样本大小是16,你找到8个成功,95%置信区间是(27.5,72.5)。但是,我的功能给出了(24.651011149057535,75.348988850942462)。相当接近,但并不完全。我在代码中包含了另外两个例子。
这是我的代码。我已经包括了(可能是愚蠢的)暴力试图找到正确使用的F函数。 [我不是专业的程序员,也不是专业的统计员......我尽我所能,但很难]
from scipy import stats
def hypergeom_ci(population_size, sample_size, successes, p):
n = sample_size
x = successes
alpha = 1-p
lower = (1+(n-x+1)/(x*F(alpha/2, 2*x, 2*(n-x+1))))**(-1)
upper = (1+(n-x)/((x+1)*F(1-alpha/2, 2*(x+1), 2*(n-x))))**(-1)
return 100 * lower, 100 * upper
population_size, sample_size, successes, p = 80, 16, 8, 0.95
for pk in dir(stats.f): # Try all functions in stats.f and print results
try:
F = eval('stats.f.'+pk)
print(pk, hypergeom_ci(population_size, sample_size, successes, p), sep=' -> ')
except:
pass
pk = 'ppf' # I found that stats.f.ppf gives the closest and most reasonable results
F = eval('stats.f.'+pk)
attempts = [(population_size, sample_size, successes, p), (1000000, 70, 8, 0.95), (8883, 70, 8, 0.92)]
h3 = (5.583699200720477, 20.17336485421592)
h1 = (27.5, 72.5)
h2 = (5.0654, 21.2824)
sitegives = [h1, h2, h3] # Answers given by the calculator at http://www.cluster-text.com/confidence_interval.php
for trial, answer in zip(attempts, sitegives):
print(trial, hypergeom_ci(*trial), answer)
答案 0 :(得分:0)
这不是直接的答案,但我制作了一个程序包,用于计算超几何分布的置信区间。仍然有一些问题,因此,如果使用它,请谨慎使用。
Github:https://github.com/KeisukeNagakawa/cisim/blob/master/README.rst
PyPI:https://pypi.org/project/cisim/
我也想要您所描述的确切解决方案。