将Z-score(Z值,标准分数)转换为Python中正态分布的p值

时间:2010-08-16 19:35:16

标签: python statistics scipy

如何将Z-scoreZ-distribution (standard normal distribution, Gaussian distribution)转换为p-value?我还没有找到Scipy's stats module中的神奇功能来做到这一点,但必须有一个。

7 个答案:

答案 0 :(得分:38)

我喜欢正态分布的生存函数(上尾概率)好一点,因为函数名称更具信息性:

p_values = scipy.stats.norm.sf(abs(z_scores)) #one-sided

p_values = scipy.stats.norm.sf(abs(z_scores))*2 #twosided

正态分布“norm”是scipy.stats中大约90个发行版之一

norm.sf也在scipy.special中调用相应的函数,如在gotgenes示例中那样

生存函数的小优势,sf:对于接近1的分位数,数值精度应优于使用cdf

答案 1 :(得分:24)

我认为累积分布函数(cdf)优于幸存者函数。幸存者函数被定义为1-cdf,并且可能不正确地传达语言模型用于方向百分位数的假设。此外,百分点函数(ppf)是cdf的倒数,这非常方便。

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

答案 2 :(得分:10)

啊哈!我找到了它:scipy.special.ndtr!这似乎也在scipy.stats.stats.zprob之下(这只是ndtr的指针。)

具体而言,给定一维numpy.array实例z_scores,可以获得p值

p_values = 1 - scipy.special.ndtr(z_scores)

或者

p_values = scipy.special.ndtr(-z_scores)

答案 3 :(得分:4)

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

它可用于应用 逆累积分布函数 inv_cdf ,也称为分位数函数百分点函数)和 累积分布函数 cdf):

NormalDist().inv_cdf(0.95)
# 1.6448536269514715
NormalDist().cdf(1.64)
# 0.9494974165258963

答案 4 :(得分:3)

从公式:

import numpy as np
import scipy.special as scsp
def z2p(z):
    """From z-score return p-value."""
    return 0.5 * (1 + scsp.erf(z / np.sqrt(2)))

答案 5 :(得分:1)

p_value = scipy.stats.norm.pdf(abs(z_score_max)) #one-sided test 
p_value = scipy.stats.norm.pdf(abs(z_score_max))*2 # two - sided test

python中的概率密度函数(pdf)函数产生值p值,这些值是从intro / AP统计书中的z得分表中得出的。

答案 6 :(得分:0)

对于Scipy爱好者来说,这是一个棘手的老问题,但却是相关的,我们不仅可以使用正态分布,还可以使用其他分布,因此这里是一些其他分布的解决方案:

def get_p_value_normal(z_score: float) -> float:
    """get p value for normal(Gaussian) distribution 

    Args:
        z_score (float): z score

    Returns:
        float: p value
    """
    return round(norm.sf(z_score), decimal_limit)


def get_p_value_t(z_score: float) -> float:
    """get p value for t distribution 

    Args:
        z_score (float): z score

    Returns:
        float: p value
    """
    return round(t.sf(z_score), decimal_limit)


def get_p_value_chi2(z_score: float) -> float:
    """get p value for chi2 distribution 

    Args:
        z_score (float): z score

    Returns:
        float: p value
    """
    return round(chi2.ppf(z_score, df), decimal_limit)