如何使用norm.ppf()函数?

24
我不理解如何正确使用此功能,请有人解释一下吗?
假设我有:
- 均值为172.7815 - 标准偏差为4.1532 - N = 50(50个样本)
当我被要求使用norm.ppf()计算(95%)误差边界时,代码是否如下所示?
norm.ppf(0.95, loc=172.78, scale=4.15)

还是看起来像这样吗?

norm.ppf(0.95, loc=0, scale=1)

因为我知道它计算的是置信区间(95%,97.5%等)右侧曲线的面积(请参见下面的图像),但当我有均值和标准差时,我真的很困惑如何使用该函数。

输入图像描述


在许多情况下,如此答案所解释的那样,逆生存函数norm.isf()更加直观。 - cottontail
5个回答

34
norm.ppf()方法接受一个百分比,并返回该百分比所在值的标准偏差乘数。它相当于密度图上的“单尾检验”。
来自于scipy.stats.norm: ppf(q, loc=0, scale=1) 百分点函数(cdf的反函数—百分位数)。 标准正态分布 代码:
norm.ppf(0.95, loc=0, scale=1)
返回结果为:返回一个标准正态分布(即均值为0,标准差为1的正态分布)上进行单尾检验的95%置信区间。
我们的例子: 要计算OP提供的例子中95%显著性区间所在的值(针对单尾检验),我们将使用:
norm.ppf(0.95, loc=172.7815, scale=4.1532)

这将返回一个值(作为“标准差乘数”),标记了如果我们的数据是正态分布,95%的数据点将被包含在其中的位置。

要获得确切的数字,我们将取norm.ppf()输出并乘以我们所讨论的分布的标准差。

双尾检验:如果我们需要计算“双尾检验”(即我们关注比我们的平均值更大和更小的值),那么我们需要拆分显着性水平(即我们的α值),因为我们仍然使用单侧计算方法。拆分一半符号表示显着性水平被分配到两个尾部。 95%的显着性水平具有5%的α值; 将5%的α值分配给两侧返回2.5%。从100%中减去2.5%,将97.5%作为输入用于显着性水平。

因此,如果我们关心平均值两侧的值,我们的代码将输入0.975来表示覆盖两个尾部的95%显着性水平:

norm.ppf(0.975, loc=172.7815, scale=4.1532)

误差范围

误差范围是在使用样本统计量估计总体参数时使用的显著性水平。我们希望生成95%置信区间,使用双尾输入norm.ppf(),因为我们关心的值既可能比平均值大也可能比它小:

ppf = norm.ppf(0.975, loc=172.7815, scale=4.1532)

接下来,我们将取ppf并乘以标准差,得到区间值:

interval_value = std * ppf

最后,我们将通过从均值中加减区间值来标记置信区间:

lower_95 = mean - interval_value
upper_95 = mean + interval_value

绘制一条垂直线的图表:

_ = plt.axvline(lower_95, color='r', linestyle=':')
_ = plt.axvline(upper_95, color='r', linestyle=':')

1
这里的均值放在loc中,标准差放在scale中,这些是样本的均值和标准差还是总体参数? - kikatuso
1
@kikatuso 上面的例子接收样本值。将样本值输入误差边界函数中以估计样本代表总体参数的置信度。因此,将样本值输入函数中,输出误差边界。用户使用输出来评估样本代表总体的程度(即用户应该对样本与总体的一致性有多少“信心”-因此可以将样本的假设投射回总体等)。希望这可以帮助您!抱歉回复晚了! - jameshollisandrew
ppf()的文档说明它是cdf的反函数。因此,它应该采用cdf的分数并返回相当于它的数据值。这可能很简单--我不明白为什么要用矩的术语来定义它?是否有替代方案?实际上,我需要在柯西分布中使用它,而矩并未定义。 - shaunc

17

詹姆斯声称norm.ppf返回“标准差乘数”是错误的。由于他的文章是搜索norm.ppf时谷歌排名最高的结果,因此这一点感觉很重要。

'norm.ppf'是'norm.cdf'的反函数。在例子中,它只是返回95%百分位数处的值。没有涉及“标准差乘数”的概念。

更好的回答在这里: 如何在Python中计算正态累积分布函数的反函数?


2
这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案 - PM 77-1
7
重申一下,最高票答案是不正确的。这很重要,因为当人们搜索“norm.ppf”时,该线程仍然是谷歌的首选结果。如果你真的尝试阅读和理解,我的帖子实际上确实回答了问题,并提供了一个更详细解释的参考。引用@PM77-1提供的链接:“一般来说,真正重要的信息应该被纳入到回答中”。 - sekwjlwf

3
您可以直接使用norm.ppf来计算置信区间,而无需计算误差边界。
upper_of_interval = norm.ppf(0.975, loc=172.7815, scale=4.1532/np.sqrt(50))
lower_of_interval = norm.ppf(0.025, loc=172.7815, scale=4.1532/np.sqrt(50))

4.1532是样本标准差,而不是样本均值的抽样分布标准差。因此,在norm.ppf中,scale将被指定为scale = 4.1532 / np.sqrt(50),这是抽样分布标准差的估计值。

(抽样分布标准差的值等于总体标准差 / np.sqrt(样本容量)。在这里,我们不知道总体标准差,样本大小大于30,因此可以使用样本标准差 / np.sqrt(样本容量)作为很好的估计值)。

误差范围可用以下公式计算:(置信区间上限 - 置信区间下限) / 2

说明norm.ppf()中的2.5和97.5的图像


0

正如其他答案所指出的那样,norm.ppf(1-alpha) 返回由传递给它的参数指定的正态分布的 (1-alpha)x100 百分位数值。例如,在 OP 中,它返回平均值为 172.78,标准差为 4.15 的正态分布的第 95 个百分位数。

如果您正在寻找一个函数,该函数返回与 alpha 相关的正态分布上的相同值(第 N 个百分位数),则有反函数 survival functionnorm.isf(alpha),它告诉您数字在哪里,使得 (1-alpha) 在其上方。

from scipy.stats import norm
alpha = 0.05
v1 = norm.isf(alpha)
v2 = norm.ppf(1-alpha)
np.isclose(v1, v2)     # True

0

计算95%分位数的金额,并绘制一条垂直线和带有该金额注释的标注

mean=172.7815
std=4.1532
N = 50

results=norm.rvs(mean,std, size=N)
pct_5 = norm.ppf(.95,mean,std)
plt.hist(results,bins=10)
plt.axvline(pct_5)
plt.annotate(pct_5,xy=(pct_5,6))
plt.show()

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