2016-11-06 5 views
0

Ich bin auf der Suche nach einer Funktion, um die CDF für eine multivariate Normalverteilung zu berechnen. Ich habe festgestellt, dass scipy.stats.multivariate_normal nur eine Methode, die PDF-Datei zu berechnen (für eine Probe x), aber nicht der CDF multivariate_normal.pdf(x, mean=mean, cov=cov)Multivariate normale CDF in Python

ich für die gleiche Sache suchen, aber die CDF zu berechnen, so etwas wie: multivariate_normal.cdf(x, mean=mean, cov=cov), aber leider multivariate_normal doesn habe keine cdf-Methode.

Das einzige, was ich fand, ist dies: Multivariate Normal CDF in Python using scipy aber das vorgestellte Verfahren scipy.stats.mvn.mvnun(lower, upper, means, covar) keine Probe x als Parameter übernimmt, so dass ich nicht wirklich sehen, wie es zu benutzen, etwas ähnliches zu haben, was ich sagte, über.

+1

starten Überprüfung [diese] (http://statsmodels.sourceforge.net/stable/generated /statsmodels.sandbox.distributions.extras.mvnormcdf.html#statsmodels.sandbox.distributions.extras.mvnormcdf). Es ist eine qualitativ hochwertige Bibliothek (wenn Sie nicht damit vertraut sind) – sascha

+0

@sascha die gleiche Frage, die ich für 'scipy.stats.mvn.mvnun' gefragt habe, gilt auch für eine, die Sie in diesem Link angegeben haben. – eLearner

+0

Also was genau willst du? Sie möchten * eine Verteilung an Punkte * anpassen? – sascha

Antwort

0

Die CDF einer Verteilung ist eigentlich ein Integral über das PDF dieser Verteilung. In diesem Fall müssen Sie die Funktion mit den Grenzen des Integrals versehen.

Was die meisten Leute meinen, wenn sie für einen P_Value von einem gewissen Punkt in Relation zu einem gewissen Verteilung fragen:

was ist die Chance, diese Werte zu bekommen oder höher diese Verteilung gegeben?

Hinweis der Bereich rot markiert - es ist nicht ein Punkt, sondern ein integraler ab einem gewissen Punkt an:

enter image description here

Dementsprechend müssen Sie Ihren Punkt als die untere Grenze setzen, + inf (oder einige willkürlich hoch genug Wert) als obere Grenze und liefern die Mittel und Kovarianzmatrix Sie bereits haben:

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