Comment convertir un Z-score à p-value? Je dois encore trouver la fonction magique dans Scipy's stats
module pour ce faire, mais il faut être là.Convertir Z-score (valeur Z, score standard) en valeur p pour la distribution normale en Python
Répondre
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
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)
terminologie étrange, "Z-distribution" au lieu de "courbe normale". Z-score J'appellerais probablement aussi l'écart-type dans ce contexte. –
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
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
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)))
J'ai commencé une ici http://statsandprobability.codeplex.com/ – user123976