web-dev-qa-db-ja.com

Pythonの正規分布のZスコア(Z値、標準スコア)をp値に変換します

ZスコアZ分布(標準正規分布、ガウス分布) から に変換する方法p-valueScipyのstatsモジュール でこれを行うための魔法の機能をまだ見つけていませんが、そこにある必要があります。

48
gotgenes

関数名の方が情報量が多いため、正規分布の生存関数(上限確率)が少し好きです。

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

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

正規分布「ノルム」は、scipy.statsの約90の分布の1つです。

norm.sfは、getgenesの例のように、scipy.specialの対応する関数も呼び出します。

生存関数の小さな利点、sf:cdfを使用するよりも1に近い分位数の数値精度が良い

41
Josef

累積分布関数(cdf)は生存関数よりも好ましいと思います。生存関数は1-cdfとして定義されており、言語モデルが方向パーセンタイルに使用する仮定を不適切に伝達する場合があります。また、パーセンテージポイント関数(ppf)はcdfの逆関数であり、非常に便利です。

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

あぁ!私はそれを見つけました: scipy.special.ndtr !これもscipy.stats.stats.zprobの下にもあるようです(これはndtrへの単なるポインタです)。

具体的には、1次元numpy.arrayインスタンスz_scoresが与えられると、p値を次のように取得できます。

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

または代わりに

p_values = scipy.special.ndtr(-z_scores)
10
gotgenes

式から:

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)))
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)関数は、intro/AP stats bookのzスコアテーブルから描画されたp値の値を生成します。

1
Vivek Gopalan