Convertir Z-score (valeur Z, score standard) en p-valeur pour la distribution normale en Python

Comment convertir un Z-score de la Z-distribution (distribution normale standard, distribution Gaussienne) pour un p valeur? Je n'ai pas encore trouvé la fonction magique dans le module stats de Scipy pour ce faire, mais il faut être là.

33
demandé sur gotgenes 2010-08-16 23:35:15

4 réponses

J'aime un peu mieux la fonction de survie (Probabilité de queue supérieure) de la distribution normale, car le nom de la fonction est plus informatif:

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

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

Distribution normale "norm" est l'une des quelque 90 distributions de scipy.les statistiques

Norme.sf appelle également la fonction correspondante dans scipy.spécial comme dans l'exemple gotgenes

Petit avantage de la fonction de survie, sf: la précision numérique devrait être meilleure pour les quantiles proches de 1 que d'utiliser le cdf

31
répondu Josef 2015-03-12 22:48:59

Je pense que la fonction de distribution cumulative (cdf) est préférée à la fonction survivor. La fonction survivor est définie comme 1-cdf et peut communiquer incorrectement les hypothèses que le modèle linguistique utilise pour les percentiles directionnels. En outre, la fonction de point de pourcentage (ppf) est l'inverse du cdf, ce qui est très pratique.

>>> import scipy.stats as st
>>> st.norm.ppf(.95)
1.6448536269514722
>>> st.norm.cdf(1.64)
0.94949741652589625
17
répondu Myles Baker 2014-01-01 18:25:16

Aha! Je l'ai trouvé: scipy.special.ndtr! Cela semble également être sous scipy.stats.stats.zprob (qui est juste un pointeur vers ndtr).

Plus précisément, étant donné une instance unidimensionnelle numpy.array z_scores, on peut obtenir les valeurs p comme

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

Ou alternativement

p_values = scipy.special.ndtr(-z_scores)
8
répondu gotgenes 2010-08-16 20:54:38

De la Formule:

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)))
1
répondu Arnaldo P. Figueira Figueira 2017-10-03 19:30:27