EINLEITUNG : Ich habe eine Liste von mehr als 30.000 ganzzahligen Werten im Bereich von 0 bis einschließlich 47, z. B. [0,0,0,0,..,1,1,1,1,...,2,2,2,2,...,47,47,47,...]
aus einer kontinuierlichen Verteilung. Die Werte in der Liste sind nicht unbedingt in der richtigen Reihenfolge, aber die Reihenfolge spielt für dieses Problem keine Rolle.
PROBLEM : Basierend auf meiner Verteilung möchte ich den p-Wert (die Wahrscheinlichkeit, größere Werte zu sehen) für einen bestimmten Wert berechnen. Wie Sie sehen können, nähert sich der p-Wert für 0 beispielsweise 1 und der p-Wert für höhere Zahlen tendiert zu 0.
Ich weiß nicht, ob ich Recht habe, aber um Wahrscheinlichkeiten zu bestimmen, muss ich meine Daten an eine theoretische Verteilung anpassen, die für die Beschreibung meiner Daten am besten geeignet ist. Ich gehe davon aus, dass eine Art Fit-Test erforderlich ist, um das beste Modell zu ermitteln.
Gibt es eine Möglichkeit, eine solche Analyse in Python ( Scipy
oder Numpy
) zu implementieren ? Könnten Sie Beispiele vorstellen?
Danke dir!
quelle
Antworten:
Verteilungsanpassung mit Summe der quadratischen Fehler (SSE)
Dies ist eine Aktualisierung und Änderung der Antwort von Saullo , die die vollständige Liste der aktuellen
scipy.stats
Verteilungen verwendet und die Verteilung mit der geringsten SSE zwischen dem Histogramm der Verteilung und dem Histogramm der Daten zurückgibt.Beispielanpassung
Unter Verwendung des El Niño-Datensatzes von
statsmodels
werden die Verteilungen angepasst und Fehler ermittelt. Die Verteilung mit dem geringsten Fehler wird zurückgegeben.Alle Distributionen
Best Fit Distribution
Beispielcode
quelle
density=True
anstelle vonnormed=True
innp.histogram()
. ^^.plot()
Methoden rückgängig machen , um zukünftige Verwirrung zu vermeiden. ^^from scipy.stats._continuous_distns import _distn_names
. Sie können danngetattr(scipy.stats, distname)
für jedendistname
in _distn_names` so etwas wie verwenden. Nützlich, da die Distributionen mit verschiedenen SciPy-Versionen aktualisiert werden.ax = data.plot(kind='hist', bins=50, normed=True, alpha=0.5, color=list(matplotlib.rcParams['axes.prop_cycle'])[1]['color'])
In SciPy 0.12.0 sind 82 Verteilungsfunktionen implementiert . Sie können testen, wie einige von ihnen mit ihrer
fit()
Methode zu Ihren Daten passen . Überprüfen Sie den Code unten für weitere Details:Verweise:
- Anpassungsverteilungen, Anpassungsgüte, p-Wert. Ist das mit Scipy (Python) möglich?
- Verteiler mit Scipy
Und hier eine Liste mit den Namen aller in Scipy 0.12.0 (VI) verfügbaren Verteilungsfunktionen:
quelle
normed = True
beim Zeichnen des Histogramms? Sie würden mehrfach nichtpdf_fitted
durch dassize
, nicht wahr?from scipy.stats._continuous_distns import _distn_names
. Sie können danngetattr(scipy.stats, distname)
für jedendistname
in _distn_names` so etwas wie verwenden. Nützlich, da die Distributionen mit verschiedenen SciPy-Versionen aktualisiert werden.fit()
Die von @Saullo Castro erwähnte Methode liefert Maximum-Likelihood-Schätzungen (MLE). Die beste Verteilung für Ihre Daten ist diejenige, die Ihnen die höchste gibt. Sie kann auf verschiedene Arten ermittelt werden: z1, diejenige, die Ihnen die höchste Protokollwahrscheinlichkeit gibt.
2, derjenige, der Ihnen die kleinsten AIC-, BIC- oder BICc-Werte liefert (siehe Wiki: http://en.wikipedia.org/wiki/Akaike_information_criterion) , kann grundsätzlich als Protokollwahrscheinlichkeit angesehen werden, die an die Anzahl der Parameter angepasst ist, als Verteilung mit mehr Es wird erwartet, dass die Parameter besser passen.
3, diejenige, die die Bayes'sche hintere Wahrscheinlichkeit maximiert. (siehe Wiki: http://en.wikipedia.org/wiki/Posterior_probability )
Wenn Sie bereits eine Verteilung haben, die Ihre Daten beschreiben sollte (basierend auf den Theorien in Ihrem speziellen Bereich) und sich daran halten möchten, überspringen Sie natürlich den Schritt der Ermittlung der am besten passenden Verteilung.
scipy
Es wird keine Funktion zum Berechnen der Protokollwahrscheinlichkeit mitgeliefert (obwohl die MLE-Methode bereitgestellt wird), aber der Hardcode 1 ist einfach: Siehe Sind die integrierten Wahrscheinlichkeitsdichtefunktionen von "scipy.stat.distributions" langsamer als die von einem Benutzer bereitgestellten?quelle
scipy
AFAICU, Ihre Verteilung ist diskret (und nichts als diskret). Daher sollte es für Ihre Zwecke ausreichen, nur die Frequenzen verschiedener Werte zu zählen und zu normalisieren. Ein Beispiel, um dies zu demonstrieren:
Somit ist die Wahrscheinlichkeit, Werte zu sehen, die höher sind als
1
einfach (gemäß der komplementären kumulativen Verteilungsfunktion (ccdf) :Bitte beachten Sie, dass ccdf eng mit der Überlebensfunktion (sf) verwandt ist , aber auch mit diskreten Verteilungen definiert ist , während sf nur für zusammenhängende Verteilungen definiert ist.
quelle
Es klingt für mich nach einem Problem der Wahrscheinlichkeitsdichteschätzung.
Siehe auch http://jpktd.blogspot.com/2009/03/using-gaussian-kernel-density.html .
quelle
Probieren Sie die
distfit
Bibliothek aus.pip install distfit
Beachten Sie, dass in diesem Fall alle Punkte aufgrund der gleichmäßigen Verteilung von Bedeutung sind. Sie können bei Bedarf mit dist.y_pred filtern.
quelle
Mit OpenTURNS würde ich die BIC-Kriterien verwenden, um die beste Verteilung auszuwählen, die zu solchen Daten passt. Dies liegt daran, dass dieses Kriterium den Verteilungen mit mehr Parametern keinen allzu großen Vorteil verschafft. Wenn eine Verteilung mehr Parameter enthält, ist es für die angepasste Verteilung einfacher, näher an den Daten zu sein. Darüber hinaus ist Kolmogorov-Smirnov in diesem Fall möglicherweise nicht sinnvoll, da ein kleiner Fehler in den gemessenen Werten einen großen Einfluss auf den p-Wert hat.
Um den Prozess zu veranschaulichen, lade ich die El-Nino-Daten, die 732 monatliche Temperaturmessungen von 1950 bis 2010 enthalten:
Mit der
GetContinuousUniVariateFactories
statischen Methode ist es einfach, die 30 integrierten univariaten Verteilungsfabriken abzurufen. Anschließend gibt dieBestModelBIC
statische Methode das beste Modell und den entsprechenden BIC-Score zurück.welche druckt:
Um die Anpassung grafisch mit dem Histogramm zu vergleichen, verwende ich die
drawPDF
Methoden der besten Verteilung.Dies erzeugt:
Weitere Details zu diesem Thema finden Sie im BestModelBIC- Dokument. Es wäre möglich, die Scipy-Distribution in die SciPyDistribution oder sogar in ChaosPy-Distributionen mit ChaosPyDistribution aufzunehmen , aber ich denke, dass das aktuelle Skript die meisten praktischen Zwecke erfüllt.
quelle
Verzeihen Sie mir, wenn ich Ihre Bedürfnisse nicht verstehe, aber wie wäre es, wenn Sie Ihre Daten in einem Wörterbuch speichern, in dem Schlüssel die Zahlen zwischen 0 und 47 sind und die Anzahl der Vorkommen der zugehörigen Schlüssel in Ihrer ursprünglichen Liste bewertet werden?
Somit ist Ihre Wahrscheinlichkeit p (x) die Summe aller Werte für Schlüssel größer als x geteilt durch 30000.
quelle