2010-11-27 13 views
26

Ich bin kein Statistiker (eher ein forschender Webentwickler), aber ich habe in diesen Tagen viel über scipy und R gehört. Aus Neugier wollte ich diese Frage stellen (obwohl es den Experten hier albern vorkommen könnte), weil ich mir der Fortschritte in diesem Bereich nicht sicher bin und wissen möchte, wie Menschen ohne einen soliden statistischen Hintergrund mit diesen Problemen umgehen.Daten an Verteilungen anpassen?

Angesichts einer Reihe von realen Zahlen aus einem Experiment, lassen Sie uns sagen, sie gehören zu einer der vielen Distributionen da draußen (wie Weibull, Erlang, Cauchy, Exponential usw.), gibt es automatisierte Wege, das richtige zu finden Verteilung und die Verteilungsparameter für die Daten? Gibt es irgendwelche guten Tutorials, die mich durch den Prozess führen?

reales Szenario: Zum Beispiel lassen Sie uns sagen, dass ich eine kleine Umfrage gestartet und aufgezeichneten Informationen darüber, wie viele Menschen eine Person spricht jeden Tag für 300 Leute sagen, und ich habe die folgenden Informationen:

1 10 
2 5 
3 20 
... 
... 

wo XY sagt mir, dass Person X mit Y Menschen während des Zeitraums der Umfrage sprach. Jetzt möchte ich die Informationen der 300 Leute in ein Modell einbauen. Die Frage läuft darauf hinaus, gibt es irgendwelche automatisierten Möglichkeiten, die richtigen Verteilungs- und Verteilungsparameter für diese Daten herauszufinden, oder wenn nicht, gibt es eine gute Schritt-für-Schritt-Prozedur, um dasselbe zu erreichen?

+7

Sie haben es versäumt, den wichtigsten Teil Ihrer Frage zu beschreiben - was möchten Sie mit dem Modell machen? – hadley

+3

Diese Frage wäre besser geeignet für die [stats.se] (http://stats.stackexchange.com/) – csgillespie

+1

Eh, ich bin bereit zu erlauben, dass er nicht ansprechen muss, was er mit dem parametrischen Modell tun würde. Auch das einfache Arbeiten mit synthetischen Daten, die aus einem adäquaten parametrischen Modell generiert wurden, reicht aus, um eine solche Frage zu stellen. Der Bootstrap ist wunderbar, aber Sie müssen die Daten behalten oder versenden. – Iterator

Antwort

37

Dies ist eine komplizierte Frage, und es gibt keine perfekten Antworten. Ich werde versuchen, Ihnen einen Überblick über die wichtigsten Konzepte zu geben und Sie in die Richtung einer nützlichen Lektüre zu diesem Thema zu führen.

Angenommen, Sie haben eine eindimensionale Menge von Daten und Sie haben eine endliche Menge von Wahrscheinlichkeitsverteilungsfunktionen, von denen Sie glauben, dass die Daten daraus generiert wurden. Sie können jede Verteilung unabhängig betrachten und versuchen, Parameter zu finden, die Ihren Daten angemessen sind. Es gibt zwei Methoden für die Parameter für eine Wahrscheinlichkeitsverteilungsfunktion angegebenen Daten einstellen:

  1. Least Squares
  2. Maximum Likelihood

Nach meiner Erfahrung Maximum Likelihood in den letzten Jahren wurde bevorzugt, obwohl dies nicht in jedem Bereich der Fall sein.

Hier ist ein konkretes Beispiel dafür, wie Parameter in R. zu schätzen eine Reihe von zufälligen Punkten Betrachten aus einer Gaußschen Verteilung mit einem Mittelwert von 0 und eine Standardabweichung von 1 erzeugt:

x = rnorm(n = 100, mean = 0, sd = 1) 

Es sei angenommen, dass Sie die Daten kennen wurden mit einem Gauß-Prozess generiert, aber Sie haben die Parameter für die Gauß-Funktion vergessen (oder nie gewusst!). Sie möchten die Daten verwenden, um angemessene Schätzungen für den Mittelwert und die Standardabweichung zu erhalten. In R gibt es eine Standard-Bibliothek, die diese sehr einfach macht:

library(MASS) 
params = fitdistr(x, "normal") 
print(params) 

Dies gab mir die folgende Ausgabe:

 mean   sd  
    -0.17922360 1.01636446 
(0.10163645) (0.07186782) 

Diejenigen, ziemlich nah an der richtigen Antwort sind, und die Zahlen in Klammern sind Konfidenzintervalle um die Parameter. Denken Sie daran, dass Sie jedes Mal, wenn Sie eine neue Menge von Punkten generieren, eine neue Antwort für die Schätzungen erhalten.

Mathematisch verwendet dies eine maximale Wahrscheinlichkeit, um sowohl den Mittelwert als auch die Standardabweichung des Gauß-Werts zu schätzen. Wahrscheinlichkeit bedeutet (in diesem Fall) "Wahrscheinlichkeit von Daten gegeben Werte der Parameter." Maximale Wahrscheinlichkeit bedeutet "die Werte der Parameter, die die Wahrscheinlichkeit der Erzeugung meiner Eingabedaten maximieren." Maximum-Likelihood-Schätzung ist der Algorithmus zum Finden der Werte der Parameter, die die Wahrscheinlichkeit des Erzeugens der Eingabedaten maximieren, und für einige Verteilungen kann er numerical optimization Algorithmen beinhalten. In R wird die meiste Arbeit von fitdistr erledigt, die in bestimmten Fällen optim aufrufen.

Sie können das Log-Likelihood von Ihren Parametern wie folgt extrahieren:

print(params$loglik) 
[1] -139.5772 

Es ist häufiger mit dem Log-Likelihood zu arbeiten, anstatt Wahrscheinlichkeit Rundungsfehler zu vermeiden. Die Schätzung der gemeinsamen Wahrscheinlichkeit Ihrer Daten beinhaltet das Multiplizieren von Wahrscheinlichkeiten, die alle kleiner als 1 sind. Selbst für eine kleine Menge von Daten nähert sich die gemeinsame Wahrscheinlichkeit sehr schnell 0, und das Hinzufügen der logarithmischen Wahrscheinlichkeiten Ihrer Daten entspricht der Multiplikation der Wahrscheinlichkeiten. Die Wahrscheinlichkeit wird maximiert, wenn sich die Log-Likelihood an 0 annähert und somit mehr negative Zahlen zu Ihren Daten passen.

Mit solchen Computertools können Parameter für jede Verteilung einfach geschätzt werden. Stellen Sie sich dieses Beispiel vor:

Die exponentielle Verteilung erzeugt keine negativen Zahlen, also entfernte ich sie in der ersten Zeile.Das Ausgangssignal (die stochastischen ist) sah wie folgt aus:

[1] "fitting parameters for normal" 
     mean   sd  
    0.72021836 0.54079027 
(0.07647929) (0.05407903) 
     Length Class Mode 
estimate 2  -none- numeric 
sd  2  -none- numeric 
n  1  -none- numeric 
loglik 1  -none- numeric 
[1] -40.21074 
[1] "fitting parameters for exponential" 
    rate 
    1.388468 
(0.196359) 
     Length Class Mode 
estimate 1  -none- numeric 
sd  1  -none- numeric 
n  1  -none- numeric 
loglik 1  -none- numeric 
[1] -33.58996 

Die exponentielle Verteilung tatsächlich etwas wahrscheinlicher diese Daten als die Normalverteilung erzeugt haben soll, wahrscheinlich weil die exponentielle Verteilung muss nicht jede Wahrscheinlichkeitsdichte zuweisen zu negativen Zahlen.

Alle diese Schätzungsprobleme werden schlechter, wenn Sie versuchen, Ihre Daten an mehrere Distributionen anzupassen. Distributionen mit mehr Parametern sind flexibler, sodass sie Ihre Daten besser als Distributionen mit weniger Parametern anpassen. Außerdem sind einige Verteilungen Sonderfälle anderer Verteilungen (z. B. ist der Exponential ein Spezialfall des Gamma). Aus diesem Grund ist es sehr üblich, Vorwissen zu verwenden, um Ihre Auswahlmodelle auf eine Untergruppe aller möglichen Modelle zu beschränken.

Ein Trick, um einige Probleme bei der Parameterschätzung zu umgehen, besteht darin, eine Menge Daten zu generieren und einige der Daten für cross-validation auszulassen. Um die Anpassung der Parameter an die Daten zu validieren, lassen Sie einige Daten aus Ihrer Schätzprozedur heraus und messen Sie dann die Wahrscheinlichkeit jedes Modells in den ausgelassenen Daten.

+0

+1 @James, ausgezeichnet. Hättest du einen Link oder zwei für 2D-Distributionen (neben normalen)? – denis

+1

Wenn Sie die Annahme treffen, dass Ihre Wahrscheinlichkeitsverteilungen Gauß sind, reduziert sich die Maximum-Likelihood-Zielfunktion auf eine (gewichtete) Funktion der kleinsten Quadrate (d. H. Kleinste Quadrate sind ein Sonderfall maximaler Wahrscheinlichkeit). –

+0

Wie vergleichen Sie in der Kreuzvalidierung den Likelihood-Wert eines anderen Modells mit den "ausgelassenen" Daten? I.e. Gibt es einen statistischen Test, der Likelihood-Werte annimmt und angibt, dass ein Modell besser passt? – Jacob

2

Ich bin kein Wissenschaftler, aber wenn Sie es mit einem Bleistift ein Papier tun würden, wäre der naheliegende Weg, einen Graphen zu machen, dann vergleichen Sie den Graphen mit einem einer bekannten Standard-Verteilung.

Gehen Sie weiter mit diesem Gedanken, "Vergleichen" sucht, ob die Kurven einer Standard-Verteilung und Ihre ähnlich sind.

Trigonometrie, Tangenten ... wäre mein letzter Gedanke.

ich kein Experte bin, nur eine weitere bescheidene Web Developer =)

+4

Ich bin ein Wissenschaftler, und Ihre Idee, ein Diagramm Ihrer Daten zu konstruieren und es mit bekannten Distributionen zu vergleichen, ist ein wirklich gutes - es ist die Grundlage sowohl der maximalen Wahrscheinlichkeit als auch der kleinsten Quadrate. Der Unterschied zwischen den beiden ist, wie sie die Anpassungsgüte zwischen Ihren Daten und den Verteilungen bewerten, aber beide basieren auf Ihrer intuitiv attraktiven Idee. :) –

-4

Für das, was es wert ist, scheint es, wie Sie bei der Poisson-Verteilung sehen möchten.

3

Sie möchten im Wesentlichen Ihre realen Daten mit einer Reihe theoretischer Verteilungen vergleichen. Es gibt die Funktion qqnorm() in der Basis R, die dies für die Normalverteilung tun wird, aber ich bevorzuge die probplot Funktion in e1071, mit der Sie andere Distributionen testen können. Hier ist ein Codeausschnitt, der Ihre realen Daten gegen jede der theoretischen Verteilungen, die wir in die Liste einfügen, darstellt. Wir verwenden plyr, um durch die Liste zu gehen, aber es gibt mehrere andere Möglichkeiten, die Liste zu durchlaufen.

library("plyr") 
library("e1071") 

realData <- rnorm(1000) #Real data is normally distributed 

distToTest <- list(qnorm = "qnorm", lognormal = "qlnorm", qexp = "qexp") 

#function to test real data against list of distributions above. Output is a jpeg for each distribution. 
testDist <- function(x, data){ 
    jpeg(paste(x, ".jpeg", sep = "")) 
    probplot(data, qdist = x) 
    dev.off() 
    } 

l_ply(distToTest, function(x) testDist(x, realData)) 
+0

Können Sie mir sagen, ob es möglich ist, die "Negative Binomial" -Distribution auch in die Testliste aufzunehmen? Ich habe versucht, aber bin mir nicht sicher, wie man etwas mit einem Platz setzt, d.h. der Verweis auf Rs Website sagt, dass ich "Negatives Binomial" setzen muss, bin aber nicht sicher, wie man dieses zur Liste hinzufügt. – Legend

5

Dies ist wahrscheinlich ein bisschen allgemeiner als Sie brauchen, aber könnte Ihnen etwas geben, um weiterzumachen.

Eine Möglichkeit zur Schätzung einer Wahrscheinlichkeitsdichtefunktion aus Zufallsdaten ist die Verwendung einer Edgeworth- oder Butterworth-Erweiterung. Diese Approximationen verwenden Dichtefunktionseigenschaften, die als cumulants bekannt sind (die unverzerrten Schätzer sind die) und drücken die Dichtefunktion als eine Störung aus einer Gauß'schen Verteilung aus.

Diese beiden haben einige ziemlich schwerwiegende Schwächen, wie das Erzeugen von divergenten Dichtefunktionen oder sogar Dichtefunktionen, die in einigen Regionen negativ sind. Einige Leute finden sie jedoch nützlich für stark gruppierte Daten oder als Ausgangspunkt für weitere Schätzungen oder für stückweise geschätzte Dichtefunktionen oder als Teil einer Heuristik.

M. G. Kendall und A. Stuart, Die fortgeschrittene Theorie der Statistik, vol. 1, Charles Griffin, 1963, war die vollständigste Referenz, die ich dafür fand, mit einer satten ganzen Seite, die dem Thema gewidmet ist; die meisten anderen Texte hatten höchstens einen Satz oder listeten die Ausdehnung in den Augenblicken statt der Kumulanten auf, was ein wenig nutzlos ist. Viel Glück bei der Suche nach einer Kopie, aber ich musste meinen Universitätsbibliothekar auf eine Reise ins Archiv schicken ... aber das war Jahre her, vielleicht wird das Internet heute hilfreicher sein.

Die allgemeinste Form Ihrer Frage ist das Thema eines Feldes als nichtparametrischer Dichteschätzung bekannt, wo gegeben:

  • Daten von einem Zufallsprozess mit einer unbekannten Verteilung und
  • Einschränkungen für den zugrunde liegenden Prozess

... Sie erstellen eine Dichtefunktion, die am ehesten die Daten erzeugt hat. (Realistischerweise erstellen Sie eine Methode zur Berechnung einer Annäherung an diese Funktion an einem beliebigen Punkt, die Sie für weitere Arbeiten verwenden können, z. B. Vergleichen der Dichtefunktionen aus zwei Gruppen von Zufallsdaten, um zu sehen, ob sie aus demselben stammen könnten verarbeiten).

Persönlich hatte ich jedoch wenig Glück bei der Verwendung von nicht-parametrischen Dichte-Schätzung für etwas Nützliches, aber wenn Sie eine stetige Versorgung mit geistiger Gesundheit haben, sollten Sie sich damit befassen.

10

Werfen Sie einen Blick auf fitdistrplus (http://cran.r-project.org/web/packages/fitdistrplus/index.html).

auf ein paar schnelle Dinge zu beachten:

  • Versuchen Sie, die Funktion descdist, die eine graphische Darstellung der Skew gegen Kurtosis der Daten liefert und zeigt auch einige gemeinsame Verteilungen.
  • fitdist können Sie alle Distributionen anpassen, die Sie in Bezug auf Dichte und CDF definieren können.
  • Sie können dann gofstat verwenden, die die KS- und AD-Statistiken berechnet, die die Entfernung der Anpassung von den Daten messen.
+0

Es ist drei Jahre her, dass ich diese Frage gestellt habe, und mir ist jetzt klar, dass Ihre vier Zeilen viele nützliche Informationen enthalten. Ich schaute genauer hin und sah "descdist". Können Sie bitte erläutern, wie 'descdist' zusammen mit' fitdist' und 'gofstat' verwendet werden kann, um eine Analyse formell darzustellen? Ich wäre sehr dankbar, wenn Sie mich zumindest auf ein bestehendes Tutorial hinweisen könnten, wie Sie dies formell tun können. Vielen Dank für Ihre Zeit! – Legend

+0

@Ramnath, braucht jemand Ihre Hilfe hier. – aloha

+0

Ich untersuche diese Funktionen auch, hast du schon ein Tutorial gefunden? – Uis234