Carregue o pacote necessário.
library(ggplot2)
library(MASS)
Gere 10.000 números ajustados à distribuição gama.
x <- round(rgamma(100000,shape = 2,rate = 0.2),1)
x <- x[which(x>0)]
Desenhe a função densidade de probabilidade, supondo que não sabemos em qual distribuição x se encaixa.
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 do gráfico, podemos aprender que a distribuição de x é semelhante à distribuição gama, então usamos fitdistr()
no pacote MASS
para obter os parâmetros de forma e taxa de distribuição gama.
fitdistr(x,"gamma")
## output
## shape rate
## 2.0108224880 0.2011198260
## (0.0083543575) (0.0009483429)
Desenhe o ponto real (ponto preto) e o gráfico ajustado (linha vermelha) no mesmo gráfico, e aqui está a pergunta, verifique primeiro o gráfico.
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()
Eu tenho duas perguntas:
Os parâmetros reais são
shape=2
,rate=0.2
e os parâmetros que usam a funçãofitdistr()
para obter sãoshape=2.01
,rate=0.20
. Esses dois são praticamente os mesmos, mas por que o gráfico ajustado não se encaixa bem no ponto real, deve haver algo errado no gráfico ajustado, ou a maneira como eu desenho o gráfico ajustado e os pontos reais está totalmente errada, o que devo fazer ?Depois eu recebo o parâmetro do modelo I estabelecer, de que maneira eu avaliar o modelo, algo como RSS (soma de quadrados residual) para o modelo linear, ou o valor de p
shapiro.test()
,ks.test()
e outro teste?
Eu sou pobre em conhecimento estatístico, você poderia me ajudar?
ps: tenho pesquisado no Google, stackoverflow e CV muitas vezes, mas não encontrei nada relacionado a esse problema
h <- hist(x, 1000, plot = FALSE); t1 <- data.frame(x = h$mids, y = h$density)
.density
função é útil.Respostas:
Questão 1
O modo como você calcula a densidade manualmente parece errado. Não há necessidade de arredondar os números aleatórios da distribuição gama. Como o @Pascal observou, você pode usar um histograma para plotar a densidade dos pontos. No exemplo abaixo, eu uso a função
density
para estimar a densidade e plotá-la como pontos. Apresento o ajuste tanto com os pontos quanto com o histograma:Aqui está a solução que o @Pascal forneceu:
Questão 2
Para avaliar a qualidade do ajuste, recomendo o pacote
fitdistrplus
. Aqui está como ele pode ser usado para ajustar duas distribuições e comparar seus ajustes graficamente e numericamente. O comandogofstat
imprime várias medidas, como AIC, BIC e algumas estatísticas estatísticas, como o Teste KS, etc. Elas são usadas principalmente para comparar ajustes de diferentes distribuições (neste caso gama versus Weibull). Mais informações podem ser encontradas na minha resposta aqui :A @NickCox recomenda, com razão, que o QQ-Plot (painel superior direito) é o melhor gráfico individual para avaliar e comparar ajustes. Densidades ajustadas são difíceis de comparar. Eu incluo os outros gráficos também por uma questão de integridade.
fonte
fitdistrplus
egofstat
em sua ansewer