norm.ppf()
方法接受一个百分比,并返回该百分比所在值的标准偏差乘数。它相当于密度图上的“单尾检验”。norm.ppf(0.95, loc=0, scale=1)
返回结果为:返回一个标准正态分布(即均值为0,标准差为1的正态分布)上进行单尾检验的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=':')
詹姆斯声称norm.ppf
返回“标准差乘数”是错误的。由于他的文章是搜索norm.ppf时谷歌排名最高的结果,因此这一点感觉很重要。
'norm.ppf'是'norm.cdf'的反函数。在例子中,它只是返回95%百分位数处的值。没有涉及“标准差乘数”的概念。
更好的回答在这里: 如何在Python中计算正态累积分布函数的反函数?
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(1-alpha)
返回由传递给它的参数指定的正态分布的 (1-alpha)x100
百分位数值。例如,在 OP 中,它返回平均值为 172.78,标准差为 4.15 的正态分布的第 95 个百分位数。
如果您正在寻找一个函数,该函数返回与 alpha
相关的正态分布上的相同值(第 N 个百分位数),则有反函数 survival function,norm.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
计算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()
norm.isf()
更加直观。 - cottontail