Primeiro, aqui estão alguns comentários rápidos:
- Os valores de um teste de Kolmovorov-Smirnov (teste KS) com parâmetros estimados estarão completamente errados. Infelizmente, você não pode ajustar apenas uma distribuição e, em seguida, usar os parâmetros estimados em um teste de Kolmogorov-Smirnov para testar sua amostra.p
- Sua amostra nunca seguirá exatamente uma distribuição específica. Portanto, mesmo que seus valores- do KS-Test sejam válidos e , isso significa apenas que você não pode descartar que seus dados seguem essa distribuição específica. Outra formulação seria que sua amostra é compatível com uma certa distribuição. Mas a resposta para a pergunta "Meus dados seguem exatamente a distribuição xy?" é sempre não.p> 0,05
- O objetivo aqui não pode ser determinar com certeza qual distribuição sua amostra segue. O objetivo é o que @whuber (nos comentários) chama de descrições aproximadas parcimoniosas dos dados. Ter uma distribuição paramétrica específica pode ser útil como modelo dos dados.
Mas vamos fazer alguma exploração. Usarei o excelente fitdistrplus
pacote que oferece algumas funções interessantes para o ajuste da distribuição. Usaremos a função descdist
para obter algumas idéias sobre possíveis distribuições 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)
Agora vamos usar descdist
:
descdist(x, discrete = FALSE)
A curtose e assimetria quadrada da sua amostra são marcadas como um ponto azul chamado "Observação". Parece que as possíveis distribuições incluem a distribuição Weibull, Lognormal e possivelmente a gama.
Vamos ajustar uma distribuição Weibull e uma distribuição normal:
fit.weibull <- fitdist(x, "weibull")
fit.norm <- fitdist(x, "norm")
Agora inspecione o ajuste para o normal:
plot(fit.norm)
E para o ajuste Weibull:
plot(fit.weibull)
Ambos parecem bons, mas julgados pelo QQ-Plot, o Weibull talvez pareça um pouco melhor, especialmente nas caudas. Do mesmo modo, o AIC do ajuste Weibull é menor em comparação ao ajuste normal:
fit.weibull$aic
[1] 519.8537
fit.norm$aic
[1] 523.3079
Simulação de teste de Kolmogorov-Smirnov
Usarei o procedimento de @ Aksakal explicado aqui para simular a estatística KS sob o valor 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
)
})
O ECDF das estatísticas KS simuladas tem a seguinte aparência:
plot(ecdf(stats), las = 1, main = "KS-test statistic simulation (CDF)", col = "darkorange", lwd = 1.7)
grid()
Finalmente, nosso valor- usando a distribuição nula simulada das estatísticas KS é: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
Isso confirma nossa conclusão gráfica de que a amostra é compatível com uma distribuição Weibull.
Conforme explicado aqui , podemos usar o bootstrapping para adicionar intervalos de confiança pontuais ao PDF ou 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")
Acessório de distribuição automática com GAMLSS
gamlss
R
fitDist
type = "realline"
type = "realsplus"
kk = 2kregistro( 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 ***
Segundo a AIC, a distribuição Weibull (mais especificamente WEI2
, uma parametrização especial dela) se ajusta melhor aos dados. A parametrização exata da distribuição WEI2
é detalhada neste documento na página 279. Vamos inspecionar o ajuste observando os resíduos em um gráfico de sem - fim (basicamente um gráfico de QQ descendente):
Esperamos que os resíduos fiquem próximos da linha horizontal média e 95% deles fiquem entre as curvas pontilhadas superior e inferior, que atuam como intervalos de confiança de 95% no sentido dos pontos. Nesse caso, o gráfico de worms parece bom para mim, indicando que a distribuição Weibull é um ajuste adequado.