Eu tenho um conjunto de dados e gostaria de descobrir qual distribuição se ajusta melhor aos meus dados.
Eu usei a fitdistr()
função para estimar os parâmetros necessários para descrever a distribuição assumida (ou seja, Weibull, Cauchy, Normal). Usando esses parâmetros, posso realizar um Teste de Kolmogorov-Smirnov para estimar se meus dados de amostra são da mesma distribuição que minha distribuição assumida.
Se o valor-p for> 0,05, posso assumir que os dados da amostra são extraídos da mesma distribuição. Mas o valor-p não fornece nenhuma informação sobre a divindade do ajuste, não é?
Portanto, se o valor p dos meus dados de amostra for> 0,05 para uma distribuição normal e uma distribuição weibull, como posso saber qual distribuição se ajusta melhor aos meus dados?
Isto é basicamente o que eu fiz:
> mydata
[1] 37.50 46.79 48.30 46.04 43.40 39.25 38.49 49.51 40.38 36.98 40.00
[12] 38.49 37.74 47.92 44.53 44.91 44.91 40.00 41.51 47.92 36.98 43.40
[23] 42.26 41.89 38.87 43.02 39.25 40.38 42.64 36.98 44.15 44.91 43.40
[34] 49.81 38.87 40.00 52.45 53.13 47.92 52.45 44.91 29.54 27.13 35.60
[45] 45.34 43.37 54.15 42.77 42.88 44.26 27.14 39.31 24.80 16.62 30.30
[56] 36.39 28.60 28.53 35.84 31.10 34.55 52.65 48.81 43.42 52.49 38.00
[67] 38.65 34.54 37.70 38.11 43.05 29.95 32.48 24.63 35.33 41.34
# estimate shape and scale to perform KS-test for weibull distribution
> fitdistr(mydata, "weibull")
shape scale
6.4632971 43.2474500
( 0.5800149) ( 0.8073102)
# KS-test for weibull distribution
> ks.test(mydata, "pweibull", scale=43.2474500, shape=6.4632971)
One-sample Kolmogorov-Smirnov test
data: mydata
D = 0.0686, p-value = 0.8669
alternative hypothesis: two-sided
# KS-test for normal distribution
> ks.test(mydata, "pnorm", mean=mean(mydata), sd=sd(mydata))
One-sample Kolmogorov-Smirnov test
data: mydata
D = 0.0912, p-value = 0.5522
alternative hypothesis: two-sided
Os valores de p são 0,8669 para a distribuição Weibull e 0,5522 para a distribuição normal. Assim, posso assumir que meus dados seguem uma distribuição Weibull e uma distribuição normal. Mas qual função de distribuição descreve melhor meus dados?
Referindo- me a elevendollar , encontrei o seguinte código, mas não sei como interpretar os resultados:
fits <- list(no = fitdistr(mydata, "normal"),
we = fitdistr(mydata, "weibull"))
sapply(fits, function(i) i$loglik)
no we
-259.6540 -257.9268
I used the fitdistr() function
..... O que éfitdistr
função? Algo do Excel? Ou algo que você escreveu em C?Respostas:
Primeiro, aqui estão alguns comentários rápidos:
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çãodescdist
para obter algumas idéias sobre possíveis distribuições de candidatos.Agora vamos usar
descdist
: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:
Agora inspecione o ajuste para o normal:
E para o ajuste 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:
Simulação de teste de Kolmogorov-Smirnov
Usarei o procedimento de @ Aksakal explicado aqui para simular a estatística KS sob o valor nulo.
O ECDF das estatísticas KS simuladas tem a seguinte aparência:
Finalmente, nosso valor- usando a distribuição nula simulada das estatísticas KS é:p
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:
Acessório de distribuição automática com GAMLSS
gamlss
R
fitDist
type = "realline"
type = "realsplus"
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çãoWEI2
é 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.
fonte
gofstat
e o AIC. Não há consenso sobre qual é a melhor maneira de determinar a "melhor" distribuição. Eu gosto de métodos gráficos e da AIC.Os gráficos são principalmente uma boa maneira de ter uma idéia melhor da aparência dos seus dados. No seu caso, eu recomendaria plotar a função de distribuição cumulativa empírica (ecdf) contra os cdfs teóricos com os parâmetros obtidos em fitdistr ().
Fiz isso uma vez para os meus dados e também incluí os intervalos de confiança. Aqui está a foto que obtive usando ggplot2 ().
A linha preta é a função de distribuição cumulativa empírica e as linhas coloridas são cdfs de diferentes distribuições usando parâmetros que obtive usando o método de máxima verossimilhança. Pode-se ver facilmente que a distribuição exponencial e normal não se ajusta aos dados, porque as linhas têm uma forma diferente da ecdf e as linhas estão bem distantes da ecdf. Infelizmente, as outras distribuições são bastante próximas. Mas eu diria que a linha logNormal é a mais próxima da linha preta. Usando uma medida de distância (por exemplo, MSE), pode-se validar a suposição.
Se você tiver apenas duas distribuições concorrentes (por exemplo, escolhendo as que parecem se encaixar melhor na plotagem), poderá usar um Teste de Razão de Verossimilhança para testar quais distribuições se encaixam melhor.
fonte