Chargez le package nécessaire.
library(ggplot2)
library(MASS)
Générez 10 000 nombres adaptés à la distribution gamma.
x <- round(rgamma(100000,shape = 2,rate = 0.2),1)
x <- x[which(x>0)]
Dessinez la fonction de densité de probabilité, supposant que nous ne savons pas à quelle distribution x correspond.
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()
À partir du graphique, nous pouvons apprendre que la distribution de x est assez similaire à la distribution gamma, nous utilisons donc fitdistr()
dans le package MASS
pour obtenir les paramètres de forme et de taux de distribution gamma.
fitdistr(x,"gamma")
## output
## shape rate
## 2.0108224880 0.2011198260
## (0.0083543575) (0.0009483429)
Dessinez le point réel (point noir) et le graphique ajusté (ligne rouge) dans le même tracé, et voici la question, veuillez d'abord regarder le tracé.
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()
J'ai deux questions:
Les paramètres réels sont
shape=2
,rate=0.2
et les paramètres que j'utilise la fonctionfitdistr()
pour obtenir sontshape=2.01
,rate=0.20
. Ces deux sont presque les mêmes, mais pourquoi le graphique ajusté ne correspond pas bien au point réel, il doit y avoir quelque chose de mal dans le graphique ajusté, ou la façon dont je dessine le graphique ajusté et les points réels est totalement erronée, que dois-je faire ?Après avoir obtenu le paramètre du modèle que j'établis, de quelle manière j'évalue le modèle, quelque chose comme RSS (somme carrée résiduelle) pour le modèle linéaire, ou la valeur de p de
shapiro.test()
,ks.test()
et un autre test?
Je suis pauvre en connaissances statistiques, pourriez-vous bien vouloir m'aider?
ps: J'ai fait des recherches dans Google, stackoverflow et CV plusieurs fois, mais je n'ai rien trouvé en rapport avec ce problème
h <- hist(x, 1000, plot = FALSE); t1 <- data.frame(x = h$mids, y = h$density)
.density
fonction est utile.Réponses:
question 1
La façon dont vous calculez la densité à la main semble incorrecte. Il n'est pas nécessaire d'arrondir les nombres aléatoires de la distribution gamma. Comme l'a noté @Pascal, vous pouvez utiliser un histogramme pour tracer la densité des points. Dans l'exemple ci-dessous, j'utilise la fonction
density
pour estimer la densité et la représenter sous forme de points. Je présente l'ajustement à la fois avec les points et avec l'histogramme:Voici la solution fournie par @Pascal:
question 2
Pour évaluer la qualité de l'ajustement, je recommande le package
fitdistrplus
. Voici comment il peut être utilisé pour ajuster deux distributions et comparer leurs ajustements graphiquement et numériquement. La commandegofstat
affiche plusieurs mesures, telles que l'AIC, le BIC et certaines statistiques de gof telles que le test KS, etc. Elles sont principalement utilisées pour comparer les ajustements de différentes distributions (dans ce cas, gamma par rapport à Weibull). Plus d'informations peuvent être trouvées dans ma réponse ici :@NickCox indique à juste titre que le QQ-Plot (panneau supérieur droit) est le meilleur graphique unique pour juger et comparer les ajustements. Les densités ajustées sont difficiles à comparer. J'inclus également les autres graphiques par souci d'exhaustivité.
la source
fitdistrplus
etgofstat
dans votre réponse