如何使用Python中的numpy.percentile()计算置信区间

4
一道作业问题要求我计算一个均值的置信区间。当我用传统方法和numpy.percentile()方法分别计算时,得到了不同的答案。
我认为我可能误解了何时以及如何使用np.percentile()方法。我的两个问题是: 1. 我是否使用错误 -- 错误的输入等。 2. 我是否在错误的地方使用 -- 应该用于引导CI而不是传统方法?
我已经通过传统公式和np.percentile()方法计算了CI。

price = np.random.normal(11427, 5845, 30)
# u = mean of orginal vector
# s = std of original vector
print(price)

[14209.99205723 7793.06283131 10403.87407888 10910.59681669 14427.87437741 4426.8122023 13890.22030853 5652.39284669 22436.9686157 9591.28194843 15543.24262609 11951.15170839 16242.64433138 3673.40741792 18962.90840397 11320.92073514 12984.61905211 8716.97883291 15539.80873528 19324.24734807 12507.9268783 11226.36772026 8869.27092532 9117.52393498 11786.21064418 11273.61893921 17093.20022578 10163.75037277 13962.10004709 17094.70579814]
(这是一组数字,无法确定具体意义,请提供更多上下文信息)
x_bar = np.mean(price) # mean of vector
s = np.std(price) # std of vector
n = len(price) # number of obs
z = 1.96 # for a 95% CI

lower = x_bar - (z * (s/math.sqrt(n)))
upper = x_bar + (z * (s/math.sqrt(n)))
med = np.median(price)

print(lower, med, upper)

10838.458908888499 11868.68117628698 13901.386475143861

翻译为中文是:

10838.458908888499 11868.68117628698 13901.386475143861

np.percentile(price, [2.5, 50, 97.5])

[ 4219.6258866 11868.68117629 20180.24569667]

ss.scoreatpercentile(price, [2.5, 50, 97.5])

[ 4219.6258866 11868.68117629 20180.24569667]

我期望lower、med和upper应该等于np.percentile()的输出。

虽然中位数相同,但上下限相差很大。

此外,scipy.stats.percentile给出的输出与numpy.percentile相同。

有什么想法吗?

谢谢!

编辑后显示价格向量。


请提供price数组。 - kmario23
@kmario23 我把它编辑成'显示'价格数组了。它是从DF的列中得出的,但我只是用其参数生成了一个随机正态向量。错误仍然存在,而且仍然相当大。任何帮助都将不胜感激! - SherbertTheCat
你可以在 https://stats.stackexchange.com/ 上获得比我更好的置信区间与百分位数的解释。 - danielR9
1个回答

2

置信区间和百分位不是同一回事。这两个东西的公式非常不同。

你拥有的样本数量会影响你的置信区间,但不会(很大程度上)改变百分位。

例如:

最初的回答

price = np.random.normal(0, 1, 10000)
print (np.percentile(price, [2.5, 50, 97.5])

提供

[-1.97681778  0.01808908  1.93659551]

最初的回答
而且
price = np.random.normal(0, 1, 100000000)
print (np.percentile(price, [2.5, 50, 97.5]))

给出的基本相同:

[-1.96012643  9.82108813e-05  1.96030460]

如果你大幅增加样本数量运行CI计算代码,置信区间将会缩小——因为现在你有95%的把握该分布的均值位于更小的范围内。

使用相同的两个价格数组(平均值=0,标准差=1),10个样本和10,000个样本的结果如下:

最初的回答:

-0.5051688819759096 0.17504324224822834 0.744716862363091 # 10 samples
-0.02645090158517636 -0.006759616493022626 0.012353106820212557 # 10000 samples

正如你所看到的,置信区间(CI)在样本数量更多时要小得多(这符合CI公式的预期!)

Original Answer翻译成"最初的回答"


谢谢你的回答!我把百分位数和置信区间搞混了。真是自己打自己的脸。再次感谢。 - SherbertTheCat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接