Ich habe einen Datensatz und möchte herausfinden, welche Verteilung am besten zu meinen Daten passt.
Ich habe die fitdistr()
Funktion verwendet, um die notwendigen Parameter zur Beschreibung der angenommenen Verteilung abzuschätzen (z. B. Weibull, Cauchy, Normal). Mit diesen Parametern kann ich einen Kolmogorov-Smirnov-Test durchführen, um abzuschätzen, ob meine Probendaten aus derselben Verteilung stammen wie meine angenommene Verteilung.
Wenn der p-Wert> 0,05 ist, kann ich davon ausgehen, dass die Probendaten aus derselben Verteilung stammen. Der p-Wert gibt aber keine Auskunft über die Anpassungsgöttlichkeit, oder?
Wenn der p-Wert meiner Beispieldaten für eine Normalverteilung und eine Weibullverteilung> 0,05 ist, wie kann ich dann herausfinden, welche Verteilung besser zu meinen Daten passt?
Dies ist im Grunde das, was ich getan habe:
> mydata
[1] 37.50 46.79 48.30 46.04 43.40 39.25 38.49 49.51 40.38 36.98 40.00
[12] 38.49 37.74 47.92 44.53 44.91 44.91 40.00 41.51 47.92 36.98 43.40
[23] 42.26 41.89 38.87 43.02 39.25 40.38 42.64 36.98 44.15 44.91 43.40
[34] 49.81 38.87 40.00 52.45 53.13 47.92 52.45 44.91 29.54 27.13 35.60
[45] 45.34 43.37 54.15 42.77 42.88 44.26 27.14 39.31 24.80 16.62 30.30
[56] 36.39 28.60 28.53 35.84 31.10 34.55 52.65 48.81 43.42 52.49 38.00
[67] 38.65 34.54 37.70 38.11 43.05 29.95 32.48 24.63 35.33 41.34
# estimate shape and scale to perform KS-test for weibull distribution
> fitdistr(mydata, "weibull")
shape scale
6.4632971 43.2474500
( 0.5800149) ( 0.8073102)
# KS-test for weibull distribution
> ks.test(mydata, "pweibull", scale=43.2474500, shape=6.4632971)
One-sample Kolmogorov-Smirnov test
data: mydata
D = 0.0686, p-value = 0.8669
alternative hypothesis: two-sided
# KS-test for normal distribution
> ks.test(mydata, "pnorm", mean=mean(mydata), sd=sd(mydata))
One-sample Kolmogorov-Smirnov test
data: mydata
D = 0.0912, p-value = 0.5522
alternative hypothesis: two-sided
Die p-Werte betragen 0,8669 für die Weibull-Verteilung und 0,5522 für die Normalverteilung. Somit kann ich davon ausgehen, dass meine Daten sowohl einer Weibull- als auch einer Normalverteilung folgen. Aber welche Verteilungsfunktion beschreibt meine Daten besser?
In Bezug auf elevendollar habe ich den folgenden Code gefunden, weiß aber nicht, wie ich die Ergebnisse interpretieren soll:
fits <- list(no = fitdistr(mydata, "normal"),
we = fitdistr(mydata, "weibull"))
sapply(fits, function(i) i$loglik)
no we
-259.6540 -257.9268
I used the fitdistr() function
..... Was istfitdistr
Funktion? Etwas aus Excel? Oder etwas, das Sie selbst in C geschrieben haben?Antworten:
Hier sind zunächst einige kurze Kommentare:
Aber lasst uns etwas erforschen. Ich werde das exzellente
fitdistrplus
Paket verwenden, das einige nette Funktionen für die Verteilungsanpassung bietet. Wir werden die Funktion nutzendescdist
, um einige Ideen über mögliche Verteilungskandidaten zu erhalten.Jetzt können wir verwenden
descdist
:Die Kurtosis und die quadratische Schiefe Ihrer Probe werden als blauer Punkt mit der Bezeichnung "Beobachtung" aufgezeichnet. Es scheint, dass mögliche Verteilungen die Weibull-, Lognormal- und möglicherweise die Gamma-Verteilung umfassen.
Passen wir eine Weibull-Verteilung und eine Normalverteilung an:
Überprüfen Sie nun die Passform für den Normalfall:
Und für die Weibull-Passform:
Beide sehen gut aus, aber gemessen am QQ-Plot sieht der Weibull vielleicht ein bisschen besser aus, besonders an den Schwänzen. Dementsprechend ist der AIC der Weibull-Anpassung im Vergleich zur normalen Anpassung niedriger:
Kolmogorov-Smirnov-Testsimulation
Ich werde die hier erläuterte Prozedur von @ Aksakal verwenden , um die KS-Statistik unter der Null zu simulieren.
Das ECDF der simulierten KS-Statistik sieht folgendermaßen aus:
Schließlich ist unser Wert unter Verwendung der simulierten Nullverteilung der KS-Statistik:p
Dies bestätigt unsere grafische Schlussfolgerung, dass die Probe mit einer Weibull-Verteilung kompatibel ist.
Wie hier erläutert , können wir Bootstrapping verwenden, um dem geschätzten Weibull-PDF oder -CDF punktweise Konfidenzintervalle hinzuzufügen:
Automatische Verteilungsanpassung mit GAMLSS
Dask k=2 k log(n) für den BIC.
gamlss
Paket fürR
bietet die Möglichkeit, viele verschiedene Distributionen auszuprobieren und die "besten" gemäß GAIC (dem verallgemeinerten Akaike-Informationskriterium) auszuwählen. Die Hauptfunktion istfitDist
. Eine wichtige Option in dieser Funktion ist die Art der ausprobierten Verteilungen. Zum Beispiel werden bei der Einstellungtype = "realline"
alle implementierten Verteilungen ausprobiert, die für die gesamte reale Linie definiert sind, wohingegentype = "realsplus"
nur Verteilungen ausprobiert werden, die für die reale positive Linie definiert sind. Eine weitere wichtige Option ist der Parameter , der die Strafe für den GAIC darstellt. Im folgenden Beispiel habe ich den Parameter was bedeutet, dass die "beste" Verteilung gemäß dem klassischen AIC ausgewählt wird. Sie können auf einen beliebigen einstellen , zLaut AIC
WEI2
passt die Weibull-Verteilung (genauer gesagt eine spezielle Parametrisierung davon) am besten zu den Daten. Die genaue Parametrisierung der VerteilungWEI2
wird in detaillierten diesem Dokument auf Seite 279. Lassen Sie sich den Sitz kontrollieren , indem sie in einem an den Residuen sucht Wurm Grundstück (im Grunde ein de-tendierte QQ-Plot):Wir erwarten, dass die Residuen nahe der mittleren horizontalen Linie liegen und zu 95% zwischen der oberen und der unteren gepunkteten Kurve liegen, die als 95% -Punkt-Konfidenzintervalle fungieren. In diesem Fall erscheint mir das Wurmdiagramm gut, was darauf hinweist, dass die Weibull-Verteilung angemessen ist.
quelle
gofstat
und dem AIC. Es besteht kein Konsens darüber, wie die "beste" Verteilung am besten ermittelt werden kann. Ich mag grafische Methoden und den AIC.Diagramme sind meistens eine gute Möglichkeit, um eine bessere Vorstellung davon zu bekommen, wie Ihre Daten aussehen. In Ihrem Fall würde ich empfehlen, die empirische kumulative Verteilungsfunktion (ecdf) gegen die theoretischen cdfs mit den Parametern zu plotten, die Sie von fitdistr () erhalten haben.
Ich habe das einmal für meine Daten gemacht und auch die Konfidenzintervalle berücksichtigt. Hier ist das Bild, das ich mit ggplot2 () bekommen habe.
Die schwarze Linie ist die empirische kumulative Verteilungsfunktion und die farbigen Linien sind cdfs aus verschiedenen Verteilungen unter Verwendung von Parametern, die ich unter Verwendung der Maximum-Likelihood-Methode erhalten habe. Man kann leicht erkennen, dass die Exponential- und Normalverteilung nicht gut zu den Daten passen, da die Linien eine andere Form als das ecdf haben und die Linien ziemlich weit vom ecdf entfernt sind. Leider sind die anderen Bezirke ziemlich nah. Aber ich würde sagen, dass die logNormal-Linie der schwarzen Linie am nächsten ist. Mit einem Entfernungsmaß (zum Beispiel MSE) könnte man die Annahme validieren.
Wenn Sie nur zwei konkurrierende Verteilungen haben (zum Beispiel diejenigen auswählen, die am besten in die Darstellung passen), können Sie mit einem Likelihood-Ratio-Test testen, welche Verteilungen besser passen .
quelle