Laden Sie das benötigte Paket.
library(ggplot2)
library(MASS)
Generieren Sie 10.000 Zahlen, die an die Gammaverteilung angepasst sind.
x <- round(rgamma(100000,shape = 2,rate = 0.2),1)
x <- x[which(x>0)]
Zeichnen Sie die Wahrscheinlichkeitsdichtefunktion, vorausgesetzt, wir wissen nicht, an welche Verteilung x angepasst ist.
t1 <- as.data.frame(table(x))
names(t1) <- c("x","y")
t1 <- transform(t1,x=as.numeric(as.character(x)))
t1$y <- t1$y/sum(t1[,2])
ggplot() +
geom_point(data = t1,aes(x = x,y = y)) +
theme_classic()
Aus dem Diagramm können wir lernen, dass die Verteilung von x der Gammaverteilung sehr ähnlich ist. Daher verwenden wir sie fitdistr()
im Paket MASS
, um die Parameter für Form und Geschwindigkeit der Gammaverteilung zu erhalten.
fitdistr(x,"gamma")
## output
## shape rate
## 2.0108224880 0.2011198260
## (0.0083543575) (0.0009483429)
Zeichnen Sie den tatsächlichen Punkt (schwarzer Punkt) und das angepasste Diagramm (rote Linie) im selben Diagramm. Hier ist die Frage: Schauen Sie sich zuerst das Diagramm an.
ggplot() +
geom_point(data = t1,aes(x = x,y = y)) +
geom_line(aes(x=t1[,1],y=dgamma(t1[,1],2,0.2)),color="red") +
theme_classic()
Ich habe zwei Fragen:
Die realen Parameter sind
shape=2
,rate=0.2
und die Parameter, mit denen ich die Funktionfitdistr()
abrufe, sindshape=2.01
,rate=0.20
. Diese beiden sind fast gleich, aber warum das angepasste Diagramm nicht gut zum tatsächlichen Punkt passt, muss etwas im angepassten Diagramm nicht stimmen, oder die Art und Weise, wie ich das angepasste Diagramm und die tatsächlichen Punkte zeichne, ist völlig falsch. Was soll ich tun? ?Nachdem ich die Parameter des Modells erhalte ich schaffen, in welcher Weise ich das Modell zu bewerten, so etwas wie RSS (Restquadratsumme) für lineares Modell oder den p-Wert
shapiro.test()
,ks.test()
und anderen Test?
Ich bin arm an statistischen Kenntnissen. Könnten Sie mir bitte helfen?
ps: Ich habe viele Male in Google, Stackoverflow und CV gesucht, aber nichts im Zusammenhang mit diesem Problem gefunden
h <- hist(x, 1000, plot = FALSE); t1 <- data.frame(x = h$mids, y = h$density)
.density
Funktion ist nützlich.Antworten:
Frage 1
Die Art und Weise, wie Sie die Dichte von Hand berechnen, scheint falsch zu sein. Es ist nicht erforderlich, die Zufallszahlen aus der Gammaverteilung zu runden. Wie @Pascal feststellte, können Sie ein Histogramm verwenden, um die Dichte der Punkte zu zeichnen. Im folgenden Beispiel verwende ich die Funktion
density
, um die Dichte zu schätzen und als Punkte zu zeichnen. Ich präsentiere die Anpassung sowohl mit den Punkten als auch mit dem Histogramm:Hier ist die Lösung, die @Pascal bereitgestellt hat:
Frage 2
Um die Passform zu beurteilen, empfehle ich das Paket
fitdistrplus
. Hier erfahren Sie, wie Sie zwei Verteilungen anpassen und ihre Anpassungen grafisch und numerisch vergleichen können. Der Befehlgofstat
druckt verschiedene Kennzahlen aus, z. B. AIC, BIC und einige Gof-Statistiken wie KS-Test usw. Diese werden hauptsächlich zum Vergleichen von Anpassungen verschiedener Verteilungen verwendet (in diesem Fall Gamma gegenüber Weibull). Weitere Informationen finden Sie in meiner Antwort hier :@NickCox weist zu Recht darauf hin, dass das QQ-Diagramm (oberes rechtes Feld) das beste einzelne Diagramm zum Beurteilen und Vergleichen von Anpassungen ist. Angepasste Dichten sind schwer zu vergleichen. Der Vollständigkeit halber füge ich auch die anderen Grafiken hinzu.
quelle
fitdistrplus
undgofstat
in Ihrem Ansewer