2010-08-16 13 views

Répondre

30

I comme la fonction de survie (probabilité de queue supérieure) de la distribution normale un peu mieux, parce que 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 « norme » est l'un d'environ 90 distributions en scipy.stats

norm.sf appelle également la fonction correspondante dans scipy.special comme dans gotgenes exemple

petit avantage de la fonction de survie, sf: la précision numérique devrait être meilleure pour les quantiles proches de 1 que l'utilisation du cdf

8

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é un unidimensionnel numpy.array exemple z_scores, on peut obtenir les valeurs p comme

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

ou en variante

p_values = scipy.special.ndtr(-z_scores) 
+0

terminologie étrange, "Z-distribution" au lieu de "courbe normale". Z-score J'appellerais probablement aussi l'écart-type dans ce contexte. –

+0

Eh bien, la distribution Z == "distribution normale standard" == 'N (0, 1)'. Cela dit, votre point est bien pris. J'ai mis à jour la question pour refléter la terminologie différente pour les mêmes concepts. – gotgenes

12

Je pense que la fonction de distribution cumulative (cdf) est préférée à la fonction de survivant. La fonction de survivant est définie comme 1-cdf et peut communiquer de façon incorrecte les hypothèses que le modèle de langage utilise pour les percentiles directionnels. En outre, la fonction de point de pourcentage (ppf) est l'inverse de la 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 
1

De 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))) 
+0

Ce n'est pas la meilleure solution; ce n'est pas vectorisé comme la réponse ci-dessus. – hlin117

+1

Vous pouvez obtenir une version vectorisée simplement en remplaçant 'math.erf' et' math.sqrt' par 'erf' et' sqrt' de scipy. – NullSpace