Как конвертировать из Z-distribution (standard normal distribution, Gaussian distribution) в p-value? Мне еще предстоит найти магическую функцию в Scipy's stats
module, но нужно быть там.Преобразование Z-балла (значение Z, стандартная оценка) в p-значение для нормального распределения в Python
ответ
Я хотел функцию выживания (верхняя вероятность хвоста) нормальное распределение немного лучше, потому что название функции более информативно:
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
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)
Strange терминологии, "Z-распределение" вместо "нормальной кривой". Z-score Я бы назвал стандартное отклонение в этом контексте. –
Ну, Z-распределение == «стандартное нормальное распределение» == 'N (0, 1)'. Тем не менее, ваш вопрос хорошо принят. Я обновил вопрос, чтобы отразить различную терминологию для тех же понятий. – gotgenes
Я думаю, что кумулятивная функция распределения (cdf) предпочтительнее функции выжившего. Функция оставшегося в живых определяется как 1-cdf и может неправильно сообщать предположения, которые использует языковая модель для направленных процентилей. Кроме того, функция процентных точек (ppf) является обратной величиной cdf, что очень удобно.
>>> import scipy.stats as st
>>> st.norm.ppf(.95)
1.6448536269514722
>>> st.norm.cdf(1.64)
0.94949741652589625
Из формулы:
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)))
Я начал один здесь http://statsandprobability.codeplex.com/ – user123976