2011-01-26 15 views
32

¿Es posible generar distribuciones en R para las que se conoce la media, desviación estándar, desviación y curtosis? Hasta ahora, parece que la mejor ruta sería crear números aleatorios y transformarlos en consecuencia. Si hay un paquete diseñado para generar distribuciones específicas que podrían adaptarse, aún no lo he encontrado. GraciasCómo generar distribuciones dadas, media, desviación estándar, sesgo y curtosis en R?

+3

Como se ha señalado los no describen de forma única una distribución. Incluso si define todos los momentos, no está garantizado que defina de manera única una distribución. Creo que debes explicar qué es exactamente lo que intentas hacer. ¿Por qué estás tratando de hacer esto? ¿Puedes poner más restricciones que permitan definir una distribución? – Dason

+0

Ah sí, queremos distribuciones continuas, unimodales en una sola dimensión. Las distribuciones resultantes eventualmente se transformarán numéricamente como una forma de probar una variación de la teoría de nicho a través de la simulación. –

+2

En Cross Validated (stats.SE) lo siguiente está relacionado de alguna manera y puede ser de interés para los lectores aquí: [¿Cómo simular datos que satisfacen restricciones específicas tales como tener media específica y desviación estándar?] (Http: //stats.stackexchange .com/q/30303/7290) – gung

Respuesta

30

Hay una distribución de Johnson en el paquete SuppDists. Johnson le dará una distribución que coincida con momentos o cuantiles. Otros comentarios son correctos de que 4 momentos no hace una distribución. Pero Johnson ciertamente lo intentará.

He aquí un ejemplo de montaje de un Johnson a algunos datos de muestra:

require(SuppDists) 

## make a weird dist with Kurtosis and Skew 
a <- rnorm(5000, 0, 2) 
b <- rnorm(1000, -2, 4) 
c <- rnorm(3000, 4, 4) 
babyGotKurtosis <- c(a, b, c) 
hist(babyGotKurtosis , freq=FALSE) 

## Fit a Johnson distribution to the data 
## TODO: Insert Johnson joke here 
parms<-JohnsonFit(babyGotKurtosis, moment="find") 

## Print out the parameters 
sJohnson(parms) 

## add the Johnson function to the histogram 
plot(function(x)dJohnson(x,parms), -20, 20, add=TRUE, col="red") 

La trama último se ve así:

enter image description here

Se puede ver un poco de la cuestión de que otros señalan sobre cómo 4 momentos no capturan completamente una distribución.

¡Buena suerte!

EDIT Como Hadley señaló en los comentarios, el ajuste de Johnson se ve apagado. Hice una prueba rápida y ajustó la distribución de Johnson usando moment="quant" que se ajusta a la distribución de Johnson utilizando 5 cuantiles en lugar de los 4 momentos. Los resultados se ven mucho mejor:

parms<-JohnsonFit(babyGotKurtosis, moment="quant") 
plot(function(x)dJohnson(x,parms), -20, 20, add=TRUE, col="red") 

que produce lo siguiente:

enter image description here

Alguien tiene alguna idea de por qué Johnson parece sesgada cuando se ajuste utilizando momentos?

+2

Algo se ve mal con esa curva: un simple cambio de posición mejoraría sustancialmente – hadley

+0

Acepto. Cuando tenga un poco de tiempo, puedo profundizar un poco. –

1

Esos parámetros realmente no definen completamente una distribución. Para eso necesitas una densidad o una función de distribución equivalente.

0

Como @David y @Carl escribieron anteriormente, hay varios paquetes dedicados a generar diferentes distribuciones, véase p. the Probability distributions Task View on CRAN.

Si le interesa la teoría (cómo dibujar una muestra de números que se ajustan a una distribución específica con los parámetros dados), simplemente busque las fórmulas adecuadas, p. ver el gamma distribution on Wiki, y crear un sistema de calidad simple con los parámetros proporcionados para calcular la escala y la forma.

Vea un ejemplo concreto here, donde calculé los parámetros alfa y beta de una distribución beta requerida en base a la media y la desviación estándar.

+0

¿Podría especificar por qué obtuve el voto a favor? – daroczig

12

Esta es una pregunta interesante, que realmente no tiene una buena solución. Supongo que, aunque no conozca los otros momentos, tiene una idea de cómo debería ser la distribución. Por ejemplo, es unimodal.

Hay

diferentes maneras de abordar este problema:

  1. asumir una distribución y los partidos subyacentes momentos.Hay muchos paquetes R estándar para hacer esto. Una desventaja es que la generalización multivariante puede ser poco clara.

  2. aproximaciones Saddlepoint. En el presente trabajo:

    Gillespie, C. S. y Renshaw, E. An improved saddlepoint approximation.Mathematical Biosciences, 2007.

    Nos fijamos en la recuperación de un pdf/PMF cuando se administra sólo los primeros momentos. Descubrimos que este enfoque funciona cuando la asimetría no es demasiado grande.

  3. expansiones de Laguerre:

    Mustapha, H. y Dimitrakopoulosa, R. Generalized Laguerre expansions of multivariate probability densities with moments. Computadoras & Matemáticas con aplicaciones, 2010.

    Los resultados en este documento parecen más prometedores, pero no los he codificado.

3

Acepto que necesita una estimación de densidad para replicar cualquier distribución. Sin embargo, si tiene cientos de variables, como es típico en una simulación de Monte Carlo, debería tener un compromiso.

Un enfoque propuesto es el siguiente:

  1. Uso del Fleishman transformación para obtener el coeficiente para el sesgo y la curtosis dado. Fleishman toma la oblicuidad y kurtosis y le da los coeficientes
  2. Generar variables normales N (media = 0, std = 1)
  3. transformar los datos en (2) con los coeficientes de Fleishman para transformar los datos normales a la inclinación dada y curtosis
  4. En este paso, los datos de uso a partir de la etapa (3) y la transforman a la media deseada y la desviación estándar (std) usando new_data = media deseada + (datos procedentes de la etapa 3) std * deseada

Los datos resultantes del Paso 4 tendrán la media deseada, estándar, sesgo y curtosis.

Advertencias:

  1. Fleishman no funcionará para todas las combinaciones de asimetría y kurtois
  2. los pasos anteriores asumen las variables no correlacionadas. Si desea generar datos correlacionados, necesitará un paso antes de la transformación de Fleishman
+0

Hay una implementación R de esto? –

7

Esta pregunta se formuló hace más de 3 años, por lo que espero que mi respuesta no llegue demasiado tarde.

No es una manera única de identificar una distribución al conocer algunos de los momentos. De esa manera es el método de Maximum Entropy. La distribución que resulta de este método es la distribución que maximiza su ignorancia sobre la estructura de la distribución, dado lo que sabe. Cualquier otra distribución que también tenga los momentos que haya especificado pero que no sea la distribución de MaxEnt está implícitamente asumiendo una estructura mayor a la que ingresó. Lo funcional para maximizar es la entropía de información de Shannon, $ S [p (x)] = - \ int p (x) log p (x) dx $.Conocer la media, desviación estándar, asimetría y curtosis, se traduce como restricciones en el primer, segundo, tercer y cuarto momento de la distribución, respectivamente.

El problema es entonces para maximizar S sujeto a las limitaciones: 1) $ \ int xp (x) dx = $ "primer momento", 2) $ \ int x^2 p (x) dx = "segundo momento" $, 3) ... y así sucesivamente

Recomiendo el libro "Harte, J., Máxima Entropía y Ecología: Una Teoría de la Abundancia, Distribución y Energética (Oxford University Press, New York, 2011) ".

Aquí hay un enlace que trata de implementar esto en R: https://stats.stackexchange.com/questions/21173/max-entropy-solver-in-r

Cuestiones relacionadas