web-dev-qa-db-fra.com

Comment générer des distributions données, moyennes, SD, biais et kurtosis dans R?

Est-il possible de générer des distributions en R pour lesquelles la moyenne, l'écart-type et le kurtosis sont connus? Jusqu'à présent, il semble que la meilleure solution serait de créer des nombres aléatoires et de les transformer en conséquence . S'il existe un package conçu pour générer des distributions spécifiques qui pourraient être adaptées, je ne l'ai pas encore trouvé . Merci.

34
Aaron B

Il y a une distribution Johnson dans le paquet SuppDists. Johnson vous donnera une distribution qui correspond aux moments ou aux quantiles. D'autres commentaires sont corrects que 4 moments ne font pas une distribution. Mais Johnson va certainement essayer. 

Voici un exemple d’ajustement d’un Johnson à des exemples de données:

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

L'intrigue finale ressemble à ceci:

enter image description here

Vous pouvez voir un peu de la question que d'autres soulignent sur la façon dont 4 moments ne capturent pas complètement une distribution. 

Bonne chance! 

EDIT Comme le soulignait Hadley dans les commentaires, l’ajustement Johnson semble aller à l’écart. J'ai fait un test rapide et ajusté la distribution Johnson en utilisant moment="quant" qui correspond à la distribution Johnson en utilisant 5 quantiles au lieu de 4 moments. Les résultats sont bien meilleurs:

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

Qui produit les éléments suivants:

enter image description here

Quelqu'un a une idée pourquoi Johnson semble biaisé lorsqu'il est en forme en utilisant des moments? 

32
JD Long

C'est une question intéressante, qui n'a pas vraiment de bonne solution. Je présume que même si vous ne connaissez pas les autres moments, vous avez une idée de ce à quoi devrait ressembler la distribution. Par exemple, c'est unimodal.

Il existe différentes manières de résoudre ce problème:

  1. Supposons une distribution sous-jacente et des moments de match. Il existe de nombreux packages R standard pour cela. Un inconvénient est que la généralisation multivariée peut ne pas être claire.

  2. Approximations de point de selle. Dans cet article:

    Gillespie, C.S. et Renshaw, E. Une approximation améliorée du point de selle.Biosciences mathématiques, 2007.

    Nous cherchons à récupérer un fichier pdf/pmf lorsque nous ne disposons que des premiers instants. Nous avons constaté que cette approche fonctionne lorsque l'asymétrie n'est pas trop grande. 

  3. Expansion Laguerre:

    Mustapha, H. et Dimitrakopoulosa, R. Expansions de Laguerre généralisées des densités de probabilité multivariées avec des moments . Informatique et mathématiques avec applications, 2010. 

    Les résultats de cet article semblent plus prometteurs, mais je ne les ai pas codés.

12
csgillespie

Cette question a été posée il y a plus de 3 ans. J'espère donc que ma réponse ne viendra pas trop tard. 

Il est un moyen d'identifier de manière unique une distribution lorsque vous connaissez certains moments. De cette façon est la méthode de Maximum Entropy. La distribution qui résulte de cette méthode est la distribution qui maximise votre ignorance sur la structure de la distribution, compte tenu de ce que vous savez. Toute autre distribution comportant également les moments que vous avez spécifiés, mais non la distribution MaxEnt, suppose implicitement plus de structure que ce que vous avez entré. La fonction à maximiser est l’entropie d’information de Shannon, $ S [p (x)] = -\int p (x) log p(x) dx $. Connaître la moyenne, SD, asymétrie et kurtosis, se traduit par des contraintes sur les premier, deuxième, troisième et quatrième moments de la distribution, respectivement.

Le problème est alors de maximiser S sous réserve des contraintes suivantes: 1) $\int x p(x) dx = "premier moment" $, 2) $\int x ^ 2 p(x) dx = "second moment" $, 3) ... et ainsi de suite

Je recommande le livre "Harte, J., Maximum d'entropie et d'écologie: une théorie de l'abondance, de la distribution et de l'énergétique (Oxford University Press, New York, 2011)".

Voici un lien qui tente d'implémenter cela dans R: https://stats.stackexchange.com/questions/21173/max-entropy-solver-in-r -

7
agomez137

Je conviens que vous avez besoin d'une estimation de la densité pour reproduire toute distribution. Cependant, si vous avez des centaines de variables, comme cela est typique dans une simulation de Monte Carlo, vous devrez faire un compromis. 

Une approche suggérée est la suivante:

  1. Utilisez la transformation de Fleishman pour obtenir le coefficient pour l'inclinaison et le kurtosis donnés. Fleishman prend l'inclinaison et le kurtosis et vous donne les coefficients
  2. Générer N variables normales (moyenne = 0, std = 1)
  3. Transformer les données en (2) avec les coefficients de Fleishman pour transformer les données normales en biais et en kurtosis donnés
  4. À cette étape, utilisez les données de l'étape (3) et transformez-les en la moyenne et l'écart type (std) souhaités à l'aide de new_data = moyenne souhaitée + (données de l'étape 3) * std

Les données résultantes de l'étape 4 auront la moyenne, la std, l'asymétrie et le kurtosis souhaités.

Mises en garde:

  1. Fleishman ne fonctionnera pas pour toutes les combinaisons d'asymétrie et de kurtois
  2. Les étapes ci-dessus supposent des variables non corrélées. Si vous souhaitez générer des données corrélées, vous aurez besoin d’une étape avant la transformation de Fleishman. 
3
user1998794

Une solution pour vous pourrait être la bibliothèque PearsonDS. Il vous permet d'utiliser une combinaison des quatre premiers moments avec la restriction que kurtosis> asymétrie ^ 2 + 1.

Pour générer 10 valeurs aléatoires à partir de cette distribution, essayez:

library("PearsonDS")
moments <- c(mean = 0,variance = 1,skewness = 1.5, kurtosis = 4)
rpearson(10, moments = moments)
3
Josh W

Ces paramètres ne définissent pas réellement complètement une distribution. Pour cela, vous avez besoin d'une densité ou d'une fonction de distribution équivalente.

2
David Heffernan

La méthode de l'entropie est une bonne idée, mais si vous avez les échantillons de données, vous utilisez plus d'informations que l'utilisation des moments! Ainsi, un moment en forme est souvent moins stable. Si vous ne disposez pas de plus d'informations sur l'apparence de la distribution, alors l'entropie est un bon concept, mais si vous avez plus d'informations, par exemple, sur le support, alors utilisez-le! Si vos données sont asymétriques et positives, alors utilisez un modèle lognormal est une bonne idée. Si vous savez aussi que la queue supérieure est finie, n'utilisez pas la distribution log-normale, mais peut-être la distribution bêta à 4 paramètres. Si rien n’est connu sur les caractéristiques de l’assistance ou de l’aide, alors un modèle log-normal mis à l’échelle et décalé convient parfaitement. Si vous avez besoin de plus de flexibilité en ce qui concerne le kurtosis, alors par ex. un logT avec mise à l'échelle + décalage est souvent correct. Cela peut également vous aider si vous savez que l'ajustement doit être presque normal. Si c'est le cas, utilisez un modèle incluant la distribution normale (souvent le cas de toute façon), sinon vous pouvez par exemple. utilisez une distribution généralisée sécante-hyperbolique. Si vous voulez faire tout cela, le modèle présentera à un moment donné des cas différents, et vous devez vous assurer qu'il n'y a pas de lacunes ni d'effets de transition médiocres.

1
user32038

Comme @David et @Carl ont écrit ci-dessus, plusieurs packages sont dédiés à la génération de distributions différentes, voir par exemple. la vue des tâches de distributions de probabilités sur CRAN .

Si vous êtes intéressé par la théorie (comment dessiner un échantillon de nombres correspondant à une distribution spécifique avec les paramètres donnés), il vous suffit de rechercher les formules appropriées, par ex. voyez la distribution gamma sur Wiki , et créez un système qualité simple avec les paramètres fournis pour calculer l’échelle et la forme.

Voir un exemple concret ici , où j’ai calculé les paramètres alpha et bêta d’une distribution bêta requise en fonction de la moyenne et de l’écart type.

0
daroczig