Cargue el paquete necesario.
library(ggplot2)
library(MASS)
Genera 10,000 números ajustados a la distribución gamma.
x <- round(rgamma(100000,shape = 2,rate = 0.2),1)
x <- x[which(x>0)]
Dibuje la función de densidad de probabilidad, se supone que no sabemos a qué distribución se ajusta x.
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()
A partir del gráfico, podemos aprender que la distribución de x es muy parecida a la distribución gamma, por lo que la utilizamos fitdistr()
en un paquete MASS
para obtener los parámetros de forma y velocidad de distribución gamma.
fitdistr(x,"gamma")
## output
## shape rate
## 2.0108224880 0.2011198260
## (0.0083543575) (0.0009483429)
Dibuje el punto real (punto negro) y el gráfico ajustado (línea roja) en el mismo diagrama, y esta es la pregunta, primero mire el diagrama.
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()
Tengo dos preguntas:
Los parámetros son reales
shape=2
,rate=0.2
y los parámetros que utilizo la funciónfitdistr()
de conseguir sonshape=2.01
,rate=0.20
. Estos dos son casi iguales, pero por qué el gráfico ajustado no se ajusta bien al punto real, debe haber algo mal en el gráfico ajustado, o la forma en que dibujo el gráfico ajustado y los puntos reales es totalmente incorrecta, ¿qué debo hacer? ?Después de obtener el parámetro del modelo que establezco, ¿de qué manera evalúo el modelo, algo como RSS (suma cuadrada residual) para el modelo lineal, o el valor p de
shapiro.test()
,ks.test()
y otra prueba?
Soy pobre en conocimiento estadístico, ¿podrían ayudarme amablemente?
PD: Tengo búsquedas en Google, stackoverflow y CV muchas veces, pero no encontré nada relacionado con este problema
h <- hist(x, 1000, plot = FALSE); t1 <- data.frame(x = h$mids, y = h$density)
.density
función es útil.Respuestas:
Pregunta 1
La forma de calcular la densidad a mano parece incorrecta. No hay necesidad de redondear los números aleatorios de la distribución gamma. Como señaló @Pascal, puede usar un histograma para trazar la densidad de los puntos. En el siguiente ejemplo, uso la función
density
para estimar la densidad y trazarla como puntos. Presento el ajuste tanto con los puntos como con el histograma:Aquí está la solución que proporcionó @Pascal:
Pregunta 2
Para evaluar la bondad del ajuste, recomiendo el paquete
fitdistrplus
. Así es como se puede usar para ajustar dos distribuciones y comparar sus ajustes de forma gráfica y numérica. El comandogofstat
imprime varias medidas, como AIC, BIC y algunas estadísticas de gof como la prueba KS, etc. Estas se utilizan principalmente para comparar ajustes de diferentes distribuciones (en este caso, gamma versus Weibull). Puede encontrar más información en mi respuesta aquí :@NickCox informa con razón que QQ-Plot (panel superior derecho) es el mejor gráfico individual para juzgar y comparar ajustes. Las densidades ajustadas son difíciles de comparar. Incluyo los otros gráficos también en aras de la integridad.
fuente
fitdistrplus
ygofstat
en su respuesta