Estimando la distribución a partir de datos

12

Tengo una muestra de datos generados Rpor rnorm(50,0,1), por lo que los datos obviamente adquieren una distribución normal. Sin embargo, Rno "conoce" esta información de distribución sobre los datos.

¿Existe algún método Rque pueda estimar de qué tipo de distribución proviene mi muestra? Si no, usaré la shapiro.testfunción y procederé de esa manera.

James Highbright
fuente
No estoy seguro de reconocer el resultado de esta pregunta. Es cierto que si solo tienes un vector de números en R, no hay muchos metadatos asociados, pero ¿por qué te molestaría eso? ¿Por qué necesitarías eso / qué querrías hacer con él? Suponga que sí, solo sería útil en la medida en que pasara ese vector a una función con métodos específicos para datos gaussianos versus otros. No conozco ninguno (aunque no soy el usuario R más experto del mundo).
gung - Restablece a Monica
Si solo desea probar si alguna muestra dada parece normal, la prueba de Shapiro-Wilk es una opción decente (aunque vale la pena leer esta pregunta y las respuestas dadas allí). Puedo ver cómo esto podría surgir en un estudio de simulación, pero sin más detalles sobre el estudio, es difícil dar una respuesta útil.
gung - Restablecer Monica
¿Por qué necesita identificar una distribución para los datos? La elección distribucional automática suele ser una idea atractiva, pero eso no la convierte en una buena idea.
Glen_b: reinstala a Monica el

Respuestas:

21

Existe la fitdistrfunción en el paquete MASS o algunas de las funciones en el paquete fitdistrplus . Aquí hay algunos ejemplos de esto último.

require(fitdistrplus)

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

así por ejemplo

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

y puedes ver las parcelas con

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]))

entonces parece plausible como una distribución normal

ingrese la descripción de la imagen aquí

pero también quizás como una distribución logística (necesitará una muestra más grande para distinguirlos en las colas)

ingrese la descripción de la imagen aquí

aunque con un qqplot y mirando el CDF se puede decir que probablemente esta no sea una distribución de Cauchy

ingrese la descripción de la imagen aquí

Enrique
fuente
1
Gracias Henry por una hermosa descripción. Me preguntaron si hay algún paquete que tome datos y escupe qué distribución (y parámetros) escupe mejor. ¿Conoce alguna de estas funcionalidades en alguno de los paquetes?
Roman Luštrik
3
fitdistproporciona estimaciones de parámetros. Hay algunas pistas sobre cuál podría ser la distribución de funciones tales como, descdist(dat, boot = 1000)pero también se beneficiarían de una muestra más grande.
Henry
Ninguna de estas funciones resolverá el problema que planteó en su última pregunta cuando la muestra no es representativa.
John
1
@ Scott Kaiser: No lo creo. fitdist()es una función en el paquete fitdistrplus, y esto es lo que estaba usando. Mientras tanto, fitdistr()es una función en el paquete MASS, y no funcionaría aquí de esta forma.
Henry
1
No tengo suficientes puntos para agregar esto como un comentario, pero solo como una nota adicional a la información proporcionada en el hilo anterior, también es posible llamar simplemente en plot(f1)lugar de los más complicadosplotdist(dat,"norm",para=list(mean=f1$estimate[1],sd=f1$estimate[2]))
swestenb