Primero, aquí hay algunos comentarios rápidos:
- Los valores de una prueba de Kolmovorov-Smirnov (prueba KS) con parámetros estimados serán bastante erróneos. Desafortunadamente, no puede ajustar una distribución y luego usar los parámetros estimados en una prueba de Kolmogorov-Smirnov para analizar su muestra.p
- Su muestra nunca seguirá exactamente una distribución específica. Entonces, incluso si sus valores de la prueba KS fueran válidos y , solo significaría que no puede descartar que sus datos sigan esta distribución específica. Otra formulación sería que su muestra sea compatible con una determinada distribución. Pero la respuesta a la pregunta "¿Mis datos siguen exactamente la distribución xy?" es siempre nop>0.05
- El objetivo aquí no puede ser determinar con certeza qué distribución sigue su muestra. El objetivo es lo que @whuber (en los comentarios) llama descripciones aproximadas parsimoniosas de los datos. Tener una distribución paramétrica específica puede ser útil como modelo de los datos.
Pero hagamos un poco de exploración. Usaré el excelente fitdistrplus
paquete que ofrece algunas funciones agradables para el ajuste de distribución. Utilizaremos la función descdist
para obtener algunas ideas sobre posibles distribuciones de candidatos.
library(fitdistrplus)
library(logspline)
x <- c(37.50,46.79,48.30,46.04,43.40,39.25,38.49,49.51,40.38,36.98,40.00,
38.49,37.74,47.92,44.53,44.91,44.91,40.00,41.51,47.92,36.98,43.40,
42.26,41.89,38.87,43.02,39.25,40.38,42.64,36.98,44.15,44.91,43.40,
49.81,38.87,40.00,52.45,53.13,47.92,52.45,44.91,29.54,27.13,35.60,
45.34,43.37,54.15,42.77,42.88,44.26,27.14,39.31,24.80,16.62,30.30,
36.39,28.60,28.53,35.84,31.10,34.55,52.65,48.81,43.42,52.49,38.00,
38.65,34.54,37.70,38.11,43.05,29.95,32.48,24.63,35.33,41.34)
Ahora usemos descdist
:
descdist(x, discrete = FALSE)
La curtosis y el sesgo al cuadrado de su muestra se representa como un punto azul llamado "Observación". Parece que las posibles distribuciones incluyen la distribución Weibull, Lognormal y posiblemente la distribución Gamma.
Ajustemos una distribución de Weibull y una distribución normal:
fit.weibull <- fitdist(x, "weibull")
fit.norm <- fitdist(x, "norm")
Ahora inspeccione el ajuste para lo normal:
plot(fit.norm)
Y para el ajuste Weibull:
plot(fit.weibull)
Ambos se ven bien, pero a juzgar por el QQ-Plot, el Weibull puede verse un poco mejor, especialmente en las colas. En consecuencia, el AIC del ajuste Weibull es más bajo en comparación con el ajuste normal:
fit.weibull$aic
[1] 519.8537
fit.norm$aic
[1] 523.3079
Simulación de prueba de Kolmogorov-Smirnov
Usaré el procedimiento de @ Aksakal explicado aquí para simular la estadística KS bajo nulo.
n.sims <- 5e4
stats <- replicate(n.sims, {
r <- rweibull(n = length(x)
, shape= fit.weibull$estimate["shape"]
, scale = fit.weibull$estimate["scale"]
)
estfit.weibull <- fitdist(r, "weibull") # added to account for the estimated parameters
as.numeric(ks.test(r
, "pweibull"
, shape= estfit.weibull$estimate["shape"]
, scale = estfit.weibull$estimate["scale"])$statistic
)
})
El ECDF de las estadísticas KS simuladas es el siguiente:
plot(ecdf(stats), las = 1, main = "KS-test statistic simulation (CDF)", col = "darkorange", lwd = 1.7)
grid()
Finalmente, nuestro valor usando la distribución nula simulada de las estadísticas KS es:p
fit <- logspline(stats)
1 - plogspline(ks.test(x
, "pweibull"
, shape= fit.weibull$estimate["shape"]
, scale = fit.weibull$estimate["scale"])$statistic
, fit
)
[1] 0.4889511
Esto confirma nuestra conclusión gráfica de que la muestra es compatible con una distribución de Weibull.
Como se explica aquí , podemos usar bootstrapping para agregar intervalos de confianza puntuales al PDF o CDF Weibull estimado:
xs <- seq(10, 65, len=500)
true.weibull <- rweibull(1e6, shape= fit.weibull$estimate["shape"]
, scale = fit.weibull$estimate["scale"])
boot.pdf <- sapply(1:1000, function(i) {
xi <- sample(x, size=length(x), replace=TRUE)
MLE.est <- suppressWarnings(fitdist(xi, distr="weibull"))
dweibull(xs, shape=MLE.est$estimate["shape"], scale = MLE.est$estimate["scale"])
}
)
boot.cdf <- sapply(1:1000, function(i) {
xi <- sample(x, size=length(x), replace=TRUE)
MLE.est <- suppressWarnings(fitdist(xi, distr="weibull"))
pweibull(xs, shape= MLE.est$estimate["shape"], scale = MLE.est$estimate["scale"])
}
)
#-----------------------------------------------------------------------------
# Plot PDF
#-----------------------------------------------------------------------------
par(bg="white", las=1, cex=1.2)
plot(xs, boot.pdf[, 1], type="l", col=rgb(.6, .6, .6, .1), ylim=range(boot.pdf),
xlab="x", ylab="Probability density")
for(i in 2:ncol(boot.pdf)) lines(xs, boot.pdf[, i], col=rgb(.6, .6, .6, .1))
# Add pointwise confidence bands
quants <- apply(boot.pdf, 1, quantile, c(0.025, 0.5, 0.975))
min.point <- apply(boot.pdf, 1, min, na.rm=TRUE)
max.point <- apply(boot.pdf, 1, max, na.rm=TRUE)
lines(xs, quants[1, ], col="red", lwd=1.5, lty=2)
lines(xs, quants[3, ], col="red", lwd=1.5, lty=2)
lines(xs, quants[2, ], col="darkred", lwd=2)
#-----------------------------------------------------------------------------
# Plot CDF
#-----------------------------------------------------------------------------
par(bg="white", las=1, cex=1.2)
plot(xs, boot.cdf[, 1], type="l", col=rgb(.6, .6, .6, .1), ylim=range(boot.cdf),
xlab="x", ylab="F(x)")
for(i in 2:ncol(boot.cdf)) lines(xs, boot.cdf[, i], col=rgb(.6, .6, .6, .1))
# Add pointwise confidence bands
quants <- apply(boot.cdf, 1, quantile, c(0.025, 0.5, 0.975))
min.point <- apply(boot.cdf, 1, min, na.rm=TRUE)
max.point <- apply(boot.cdf, 1, max, na.rm=TRUE)
lines(xs, quants[1, ], col="red", lwd=1.5, lty=2)
lines(xs, quants[3, ], col="red", lwd=1.5, lty=2)
lines(xs, quants[2, ], col="darkred", lwd=2)
#lines(xs, min.point, col="purple")
#lines(xs, max.point, col="purple")
Distribución automática con GAMLSS
El gamlss
paquete R
ofrece la posibilidad de probar muchas distribuciones diferentes y seleccionar la "mejor" según el GAIC (el criterio de información generalizado de Akaike). La función principal es fitDist
. Una opción importante en esta función es el tipo de distribuciones que se prueban. Por ejemplo, la configuración type = "realline"
probará todas las distribuciones implementadas definidas en toda la línea real, mientras type = "realsplus"
que solo intentará las distribuciones definidas en la línea positiva real. Otra opción importante es el parámetro , que es la penalización para el GAIC. En el ejemplo a continuación, configuro el parámetro que significa que la "mejor" distribución se selecciona de acuerdo con el AIC clásico. Puede configurar para cualquier cosa que desee, comokk=2klog(n) para el BIC.
library(gamlss)
library(gamlss.dist)
library(gamlss.add)
x <- c(37.50,46.79,48.30,46.04,43.40,39.25,38.49,49.51,40.38,36.98,40.00,
38.49,37.74,47.92,44.53,44.91,44.91,40.00,41.51,47.92,36.98,43.40,
42.26,41.89,38.87,43.02,39.25,40.38,42.64,36.98,44.15,44.91,43.40,
49.81,38.87,40.00,52.45,53.13,47.92,52.45,44.91,29.54,27.13,35.60,
45.34,43.37,54.15,42.77,42.88,44.26,27.14,39.31,24.80,16.62,30.30,
36.39,28.60,28.53,35.84,31.10,34.55,52.65,48.81,43.42,52.49,38.00,
38.65,34.54,37.70,38.11,43.05,29.95,32.48,24.63,35.33,41.34)
fit <- fitDist(x, k = 2, type = "realplus", trace = FALSE, try.gamlss = TRUE)
summary(fit)
*******************************************************************
Family: c("WEI2", "Weibull type 2")
Call: gamlssML(formula = y, family = DIST[i], data = sys.parent())
Fitting method: "nlminb"
Coefficient(s):
Estimate Std. Error t value Pr(>|t|)
eta.mu -24.3468041 2.2141197 -10.9962 < 2.22e-16 ***
eta.sigma 1.8661380 0.0892799 20.9021 < 2.22e-16 ***
Según la AIC, la distribución de Weibull (más específicamente WEI2
, una parametrización especial de la misma) se ajusta mejor a los datos. La parametrización exacta de la distribución WEI2
se detalla en este documento en la página 279. Inspeccionemos el ajuste observando los residuos en un diagrama de gusanos (básicamente un diagrama QQ de tendencia):
Esperamos que los residuos estén cerca de la línea horizontal media y que el 95% de ellos se encuentren entre las curvas punteadas superior e inferior, que actúan como intervalos de confianza puntuales del 95%. En este caso, el diagrama de gusanos me parece bien, lo que indica que la distribución de Weibull es adecuada.