2010-08-16 1 views
28

Как конвертировать из Z-distribution (standard normal distribution, Gaussian distribution) в p-value? Мне еще предстоит найти магическую функцию в Scipy's stats module, но нужно быть там.Преобразование Z-балла (значение Z, стандартная оценка) в p-значение для нормального распределения в Python

+0

Я начал один здесь http://statsandprobability.codeplex.com/ – user123976

ответ

30

Я хотел функцию выживания (верхняя вероятность хвоста) нормальное распределение немного лучше, потому что название функции более информативно:

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

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

нормального распределения «норма» является одной из примерно 90 распределений в scipy.stats

norm.sf, также вызывает соответствующую функцию в scipy.special как описано в примере gotgenes

небольшое преимущество функции выживания, НФ: числовая точность должна быть лучше для квантилей, близких к 1, чем с использованием cdf

8

Aha! Я нашел: scipy.special.ndtr! Это также похоже на значение scipy.stats.stats.zprob (это всего лишь указатель на ndtr).

В частности, учитывая одномерный numpy.array экземпляр z_scores, можно получить р-значения, как

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

или альтернативно

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

Strange терминологии, "Z-распределение" вместо "нормальной кривой". Z-score Я бы назвал стандартное отклонение в этом контексте. –

+0

Ну, Z-распределение == «стандартное нормальное распределение» == 'N (0, 1)'. Тем не менее, ваш вопрос хорошо принят. Я обновил вопрос, чтобы отразить различную терминологию для тех же понятий. – gotgenes

12

Я думаю, что кумулятивная функция распределения (cdf) предпочтительнее функции выжившего. Функция оставшегося в живых определяется как 1-cdf и может неправильно сообщать предположения, которые использует языковая модель для направленных процентилей. Кроме того, функция процентных точек (ppf) является обратной величиной cdf, что очень удобно.

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

Из формулы:

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

Это не лучшее решение; он не векторизован, как приведенный выше ответ. – hlin117

+1

Вы можете получить векторизованную версию, просто заменив 'math.erf' и' math.sqrt' на 'erf' и' sqrt' из scipy. – NullSpace