概率转换为z值及其反向转换

103

我如何计算 p值z分数,反之亦然?

例如,如果我的 p 值为 0.95,则应返回 1.96

我在 scipy 中看到了一些函数,但它们仅对数组运行 z 测试。

我可以访问 numpy、statsmodel、pandas 和 scipy(我想)。

4个回答

190
>>> import scipy.stats as st
>>> st.norm.ppf(.95)
1.6448536269514722
>>> st.norm.cdf(1.64)
0.94949741652589625

默认Python概率

正如其他用户所指出的,Python默认计算左/下尾概率。如果您想确定包括分布95%的密度点,则必须采取另一种方法:

>>>st.norm.ppf(.975)
1.959963984540054
>>>st.norm.ppf(.025)
-1.960063984540054

两点之间的密度


38
对于像我一样,对于请求返回1.96的函数产生短暂困惑但接受的答案返回1.64的人来说,区别在于1.96是内部包含95%数据的z得分(忽略两个尾巴),而st.norm.ppf()返回的是那个z得分,使得95%的数据低于它(仅忽略上尾巴)。 - R.M.
48
如果你想从0.95得到1.96,你需要利用正态分布对称的事实,并将你忽略的数量除以二,只考虑上尾部被忽略的部分:st.norm.ppf(1-(1-0.95)/2) == 1.959963984540054 - 这是基本统计知识,但我只是想让它更加明确。 - R.M.
2
有人能告诉我用了什么Python代码来绘制上面的图表吗? - bobthebuilder
4
@bobthebuilder Womp womp!这张图实际上是使用R语言的tigerstats包(具体地说是pnormGC函数)生成的。 - Myles Baker

24

从Python 3.8开始,标准库提供了NormalDist对象作为statistics模块的一部分。

它可用于获取正态曲线下x%面积(忽略两个尾部)所对应的zscore

我们可以在标准正态分布上使用inv_cdf(反累积分布函数)和cdf(累积分布函数)相互转换:

from statistics import NormalDist

NormalDist().inv_cdf((1 + 0.95) / 2.)
# 1.9599639845400536
NormalDist().cdf(1.9599639845400536) * 2 - 1
# 0.95

在此维基百科部分可找到“(1 + 0.95) / 2.”公式的解释。


6
如果您对T检验感兴趣,可以做类似的事情:
- 当数据遵循正态分布,总体标准差sigma已知且样本量大于30时,使用Z统计量(Z-score)。Z-Score告诉您结果离平均值有多少个标准差。使用以下公式计算z-score: z_score = (xbar - mu) / sigma
- 当数据遵循正态分布,总体标准差(sigma)未知但样本标准差(s)已知或可计算且样本量小于30时,使用T统计量(T-score),又称为学生T分布。T-Score告诉您结果离平均值有多少个标准差。使用以下公式计算t-score: t_score = (xbar - mu) / (s/sqrt(n))
总结:如果样本量大于30,则z分布和t分布基本相同,两者都可以使用。如果总体标准差可用且样本量大于30,则可以使用T分布(T-distribution)以总体标准差代替样本标准差。
测试统计数据表如下:
统计测试 | 查找表格 | 查找值 | 临界值 | 正态分布 | 总体标准差(sigma) | 样本量 --- | --- | --- | --- | --- | --- | --- Z统计量(Z-score) | Z表 | z-score | 在特定置信水平下的z-critical | 是 | 已知 | >30 T统计量(T-score) | T表 | t-score | 在特定置信水平下的t-critical | 是 | 未知 | <30



Python百分点函数被用来计算特定置信水平下的临界值:

  • z-临界值 = stats.norm.ppf(1 - alpha) (使用alpha=alpha/2适用于双侧)
  • t-临界值 = stats.t.ppf(alpha/numOfTails, ddof)

代码

import numpy as np
from scipy import stats


# alpha to critical
alpha = 0.05
n_sided = 2 # 2-sided test
z_crit = stats.norm.ppf(1-alpha/n_sided)
print(z_crit) # 1.959963984540054

# critical to alpha
alpha = stats.norm.sf(z_crit) * n_sided
print(alpha) # 0.05

0

Z分数转概率:

enter image description here

下面的代码片段将z-score的绝对值的负数映射到标准正态分布的cdf,并乘以2。这将给出在此处图片中阴影区域1 +区域2的概率:
import numpy as np
from scipy.stats import norm 


norm(0, 1).cdf(-np.absolute(zscore)) * 2 

参考资料:https://mathbitsnotebook.com/Algebra2/Statistics/STzScores.html


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