2016-11-06 2 views
0

Я ищу функцию для вычисления CDF для многомерного нормального распределения. Я обнаружил, что scipy.stats.multivariate_normal есть только метод для вычисления PDF (для образца x), но не CDF multivariate_normal.pdf(x, mean=mean, cov=cov)Многомерный нормальный CDF в Python

Я ищу то же самое, но вычислить ВПР, что-то вроде: multivariate_normal.cdf(x, mean=mean, cov=cov), но, к сожалению multivariate_normal Безразлично У меня есть метод cdf.

Единственное, что я нашел это: Multivariate Normal CDF in Python using scipy , но данный способ scipy.stats.mvn.mvnun(lower, upper, means, covar) не брать пробу x в качестве параметра, так что я не вижу, как использовать его, чтобы иметь что-то подобное тому, что я сказал выше.

+1

Start [это] (http://statsmodels.sourceforge.net/stable/generated /statsmodels.sandbox.distributions.extras.mvnormcdf.html#statsmodels.sandbox.distributions.extras.mvnormcdf). Это высококачественная библиотека (если вы ее не знакомы) – sascha

+0

@sascha тот же вопрос, который я задал для 'scipy.stats.mvn.mvnun', также применим к тому, который вы указали в этой ссылке. – eLearner

+0

Итак, что именно вы хотите? Вы хотите * приспосабливать * распределение к точкам? – sascha

ответ

0

CDF некоторого распределения фактически является интегралом по PDF этого дистрибутива. Таким образом, вам нужно предоставить функцию с границами интеграла.

То, что большинство людей, когда они просят p_value некоторой точки по отношению к некоторому распределению является:

что шанс получить эти значения или выше, учитывая это распределение?

Обратите внимание на область, помеченную красным цветом - это не точка, а интеграл от некоторой точки, начиная:

enter image description here

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

from sys import maxsize 

def mvn_p_value(x, mu, cov_matrix): 
    upper_bounds = np.array([maxsize] * x.size) # make an upper bound the size of your vector 
    p_value = scipy.stats.mvn.mvnun(x, upper_bounds, mu, cov_matrix)[1] 
    if 0.5 < p_value: # this inversion is used for two-sided statistical testing 
     p_value = 1 - p_value 
    return p_value 
Смежные вопросы