scipy 如何使用norm.ppf()?

c7rzv4ha  于 2022-11-10  发布在  其他
关注(0)|答案(5)|浏览(569)

我不明白如何正确使用这个功能,有人能给我解释一下吗?
假设我有:

  • 平均值为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%等......见下图),但当我有一个平均值和一个标准差时,我真的很困惑如何使用该函数。

frebpwbc

frebpwbc1#

方法norm.ppf()接受一个百分比,并返回该百分比值的标准差乘数。
它相当于密度图上的“单尾检验”。
来自科学统计规范:

  • ppf(q,loc=0,scale=1)百分点函数(cdf的倒数-百分位数)。*
    标准正态分布

代码:

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

返回 * 标准正态分布 * 上 * 单尾检验 * 的95%显著性区间(即正态分布的特殊情况,其中平均值为0,标准差为1)。

我们的示例

为了计算OP提供的示例的值,我们的95%显著性区间位于该值(对于 * 单尾检验 *),我们将用途:

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

这将返回一个值(用作 “标准差乘数”),如果我们的数据为正态分布,则该值标记95%的数据点所在的位置。

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

如果我们需要计算“双尾检验”(即我们关心的值大于 * 和小于 * 的平均值),那么我们需要拆分显著性(即我们的α值)*,因为我们仍然使用单尾 * 的计算方法。拆分为两半表示显著性水平分配给两个尾部。95%的显著性水平具有5%的α值;将5%的alpha值在两个尾部分开,得到2.5%。从100%中取2.5%,得到97.5%作为显著性水平的输入。
因此,如果我们关注的是均值两侧的值,我们的代码将输入.975来表示双尾的95%显著性水平:

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

误差幅度

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

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=':')
qmelpv7a

qmelpv7a2#

James关于norm.ppf返回一个“标准差乘数”的说法是错误的。这让人感觉很贴切,因为当人们搜索norm.ppf时,他的帖子是谷歌搜索结果的第一名。
'norm.ppf'是'norm.cdf'的反函数。在本例中,它只返回95%百分点处的值。不涉及“标准差乘数”。
这里有一个更好的答案:How to calculate the inverse of the normal cumulative distribution function in python?

h5qlskok

h5qlskok3#

你可以直接用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是样本的标准差,不是样本均值的抽样分布的标准差,所以,scale中的norm.ppf将被指定为scale = 4.1532 / np.sqrt(50),这是抽样分布的标准差的估计量。
(The抽样分布的标准差的值等于population standard deviation / np.sqrt(sample size)。这里,我们不知道总体的标准差,并且样本量大于30,所以sample standard deviation / np.sqrt(sample size)可以作为一个很好的估计量)。
误差幅度可以用(upper_of_interval - lower_of_interval) / 2计算。

h4cxqtbf

h4cxqtbf4#

计算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()
fiei3ece

fiei3ece5#

正如其他答案所指出的,norm.ppf(1-alpha)返回由传递给它的参数所指定的正态分布的(1-alpha)x100百分位数的值。例如,在OP中,它返回正态分布的第95百分位数,平均值为172.78,标准差为4.15。
如果你要找一个函数,它返回的值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

相关问题