Tout d'abord, voici quelques commentaires rapides:
- p
- p> 0,05
- L’objectif ici ne peut pas être de déterminer avec certitude la répartition de votre échantillon. L'objectif est ce que @whuber (dans les commentaires) appelle des descriptions approximatives parcimonieuses des données. Avoir une distribution paramétrique spécifique peut être utile en tant que modèle des données.
Mais faisons de l'exploration. Je vais utiliser l'excellent fitdistrplus
paquet qui offre quelques fonctions intéressantes pour l'ajustement de la distribution. Nous utiliserons cette fonction descdist
pour obtenir des idées sur les distributions de candidats possibles.
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)
Maintenant, utilisons descdist
:
descdist(x, discrete = FALSE)
Le kurtosis et l'asymétrie au carré de votre échantillon sont représentés par un point bleu appelé "Observation". Il semble que les distributions possibles incluent la distribution de Weibull, Lognormal et éventuellement la distribution Gamma.
Adaptons une distribution de Weibull et une distribution normale:
fit.weibull <- fitdist(x, "weibull")
fit.norm <- fitdist(x, "norm")
Maintenant, vérifiez l'ajustement pour la normale:
plot(fit.norm)
Et pour la coupe Weibull:
plot(fit.weibull)
Les deux ont l'air bien, mais à en juger par le QQ-Plot, le Weibull est peut-être un peu mieux, surtout au niveau des queues. De même, l’AIC de l’ajustement de Weibull est inférieur à l’ajustement normal:
fit.weibull$aic
[1] 519.8537
fit.norm$aic
[1] 523.3079
Simulation de test de Kolmogorov-Smirnov
Je vais utiliser la procédure de @ Aksakal expliquée ici pour simuler la statistique KS sous le zéro.
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
)
})
Le fichier ECDF des statistiques KS simulées se présente comme suit:
plot(ecdf(stats), las = 1, main = "KS-test statistic simulation (CDF)", col = "darkorange", lwd = 1.7)
grid()
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
Cela confirme notre conclusion graphique selon laquelle l'échantillon est compatible avec une distribution de Weibull.
Comme expliqué ici , nous pouvons utiliser l’amorçage pour ajouter des intervalles de confiance ponctuels au fichier PDF ou CDF estimé de Weibull:
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")
Raccord de distribution automatique avec GAMLSS
gamlss
R
fitDist
type = "realline"
type = "realsplus"
kk = 2kbûche( n )
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 ***
Selon l'AIC, la distribution de Weibull (plus précisément WEI2
, une paramétrisation spéciale de celle-ci) correspond le mieux aux données. La paramétrisation exacte de la distribution WEI2
est détaillée dans ce document à la page 279. Inspectons l'ajustement en examinant les résidus dans un graphe de vers (en gros, un graphe QQ hors tension):
Nous nous attendons à ce que les résidus soient proches de la ligne horizontale médiane et à 95% d'entre eux se situent entre les courbes pointillées supérieure et inférieure, qui agissent comme des intervalles de confiance ponctuels à 95%. Dans ce cas, le tracé du ver me semble bien indiquer que la distribution de Weibull est un ajustement adéquat.