Schätzung der Verteilung anhand von Daten

12

Ich habe eine Stichprobe von Daten, die Rvon generiert wurden rnorm(50,0,1), daher nehmen die Daten offensichtlich eine normale Verteilung an. Allerdings Rnicht „kennt“ diese verteilungs Informationen über die Daten.

Gibt es eine Methode R, mit der sich abschätzen lässt, von welcher Verteilung meine Stichprobe stammt? Wenn nicht, werde ich die shapiro.testFunktion nutzen und so vorgehen.

James Highbright
quelle
Ich bin mir nicht sicher, ob ich das Ergebnis dieser Frage erkenne. Es ist wahr, wenn Sie nur einen Vektor von Zahlen in R haben, sind nicht viele Metadaten damit verbunden, aber warum würde Sie das stören? Warum würdest du das brauchen / was würdest du damit machen wollen? Angenommen, es hätte einen solchen Wert, wäre dies nur insoweit hilfreich, als Sie diesen Vektor an eine Funktion mit bestimmten Methoden für Gauß-Daten im Vergleich zu anderen übergeben würden. Ich kenne keine (obwohl ich kaum der erfahrenste R-Benutzer der Welt bin).
gung - Wiedereinsetzung von Monica
Wenn Sie nur testen möchten, ob eine bestimmte Stichprobe normal erscheint, ist der Shapiro-Wilk-Test eine gute Option (obwohl es sich lohnt, diese Frage und die dort gegebenen Antworten zu lesen ). Ich kann sehen, wie dies in einer Simulationsstudie zustande kommen könnte, aber ohne weitere Details zu der Studie ist es schwierig, eine nützliche Antwort zu geben.
gung - Wiedereinsetzung von Monica
Warum müssen Sie eine Verteilung für die Daten identifizieren? Automatische Verteilungswahl ist oft eine attraktive Idee, aber das macht es nicht zu einer guten Idee.
Glen_b

Antworten:

21

Es gibt die fitdistrFunktion im MASS-Paket oder einige der Funktionen im fitdistrplus-Paket . Hier einige Beispiele aus letzterem.

require(fitdistrplus)

set.seed(1)
dat <- rnorm(50,0,1)
f1 <- fitdist(dat,"norm")
f2 <- fitdist(dat,"logis")
f3 <- fitdist(dat,"cauchy")

so zum Beispiel

> f1
Fitting of the distribution ' norm ' by maximum likelihood 
Parameters:
      estimate Std. Error
mean 0.1004483 0.11639515
sd   0.8230380 0.08230325

und Sie können die Handlungen mit sehen

plotdist(dat,"norm",para=list(mean=f1$estimate[1],sd=f1$estimate[2]))
plotdist(dat,"logis",para=list(location=f2$estimate[1],scale=f2$estimate[2]))
plotdist(dat,"cauchy",para=list(location=f3$estimate[1],scale=f3$estimate[2]))

so sieht es als normalverteilung plausibel aus

Bildbeschreibung hier eingeben

aber auch vielleicht als logistische Verteilung (Sie benötigen eine größere Stichprobe, um sie in den Schwänzen zu unterscheiden)

Bildbeschreibung hier eingeben

Mit einem qqplot und Blick auf die CDF können Sie jedoch feststellen, dass dies wahrscheinlich keine Cauchy-Distribution ist

Bildbeschreibung hier eingeben

Henry
quelle
1
Vielen Dank Henry für einen schönen Überblick. Ich wurde gefragt, ob es Pakete gibt, die Daten aufnehmen und ausspucken, welche Distribution (und Parameter) am besten geeignet sind. Kennen Sie eine solche Funktionalität in einem der Pakete?
Roman Luštrik
3
fitdistLiefert Schätzungen der Parameter. Es gibt einige Hinweise, wie die Verteilung von Funktionen sein könnte, descdist(dat, boot = 1000)aber auch sie würden von einer größeren Stichprobe profitieren.
Henry
Keine dieser Funktionen löst das Problem, das Sie in Ihrer letzten Frage gestellt haben, wenn die Stichprobe nicht repräsentativ ist.
John
1
@Scott Kaiser: Das glaube ich nicht. fitdist()ist eine Funktion im fitdistrplus-Paket, und diese habe ich verwendet. Inzwischen fitdistr()ist eine Funktion im MASS-Paket und würde hier in dieser Form nicht funktionieren.
Henry
1
Ich habe nicht genug Punkte, um dies als Kommentar hinzuzufügen, aber als zusätzliche Anmerkung zu den Informationen im obigen Thread ist es auch möglich, einfach plot(f1)anstelle des plotdist(dat,"norm",para=list(mean=f1$estimate[1],sd=f1$estimate[2]))
verschachtelten anzurufen