Estimando a distribuição a partir de dados

12

Eu tenho uma amostra de dados gerados Rpor rnorm(50,0,1), então os dados obviamente assumem uma distribuição normal. No entanto, Rnão "conhece" essas informações distributivas sobre os dados.

Existe um método para Restimar que tipo de distribuição minha amostra vem? Caso contrário, usarei a shapiro.testfunção e procederei dessa maneira.

James Highbright
fonte
Não sei se reconheço o resultado dessa pergunta. É verdade que se você apenas possui um vetor de números em R, não há muitos metadados associados a ele, mas por que isso o incomodaria? Por que você precisaria disso / o que gostaria de fazer com isso? Suponha que existisse, seria útil apenas na medida em que você passasse esse vetor para uma função com métodos específicos para dados gaussianos versus outros. Não conheço nenhum (embora eu dificilmente seja o usuário R mais experiente do mundo).
gung - Restabelece Monica
Se você quiser apenas testar se alguma amostra parece normal, o teste Shapiro-Wilk é uma opção decente (embora valha a pena ler esta pergunta e as respostas dadas lá). Eu posso ver como isso pode surgir em um estudo de simulação, mas sem mais detalhes sobre o estudo, é difícil dar uma resposta útil.
gung - Restabelece Monica
Por que você precisa identificar uma distribuição para os dados? A escolha distributiva automática geralmente é uma ideia atraente, mas isso não a torna uma boa ideia.
Glen_b -Reinstala Monica

Respostas:

21

Existe a fitdistrfunção no pacote MASS ou algumas das funções no pacote fitdistrplus . Aqui estão alguns exemplos deste último.

require(fitdistrplus)

set.seed(1)
dat <- rnorm(50,0,1)
f1 <- fitdist(dat,"norm")
f2 <- fitdist(dat,"logis")
f3 <- fitdist(dat,"cauchy")

então por exemplo

> f1
Fitting of the distribution ' norm ' by maximum likelihood 
Parameters:
      estimate Std. Error
mean 0.1004483 0.11639515
sd   0.8230380 0.08230325

e você pode ver as parcelas com

plotdist(dat,"norm",para=list(mean=f1$estimate[1],sd=f1$estimate[2]))
plotdist(dat,"logis",para=list(location=f2$estimate[1],scale=f2$estimate[2]))
plotdist(dat,"cauchy",para=list(location=f3$estimate[1],scale=f3$estimate[2]))

então parece plausível como uma distribuição normal

insira a descrição da imagem aqui

mas também talvez como uma distribuição logística (você precisará de uma amostra maior para distingui-los nas caudas)

insira a descrição da imagem aqui

embora com um qqplot e olhando para o CDF, você possa dizer que essa provavelmente não é uma distribuição Cauchy

insira a descrição da imagem aqui

Henry
fonte
1
Obrigado Henry por uma adorável visão geral. Me perguntaram se existem pacotes que coletam dados e cospem qual distribuição (e parâmetros) cospem melhor. Você conhece alguma dessas funcionalidades em qualquer um dos pacotes?
Roman Luštrik 30/03/12
3
fitdistfornece estimativas de parâmetros. Existem algumas dicas sobre o que a distribuição pode ser de funções como, descdist(dat, boot = 1000)mas elas também se beneficiariam de uma amostra maior.
Henry
Nenhuma dessas funções resolverá o problema que você colocou na sua última pergunta quando a amostra não é representativa.
John
1
@ Scott Kaiser: Acho que não. fitdist()é uma função no pacote fitdistrplus, e é isso que eu estava usando. Enquanto isso, fitdistr()é uma função no pacote MASS e não funcionaria aqui neste formulário.
Henry
1
Não tenho pontos suficientes para adicionar isso como um comentário, mas, como uma observação adicional às informações fornecidas no tópico acima, também é possível simplesmente chamar, em plot(f1)vez do mais complicadoplotdist(dat,"norm",para=list(mean=f1$estimate[1],sd=f1$estimate[2]))
swestenb