Comment puis-je adapter un ensemble de données à une distribution de Pareto dans R?

22

Disons, disons, les données suivantes:

8232302  684531  116857   89724   82267   75988   63871   
  23718    1696     436     439     248     235

Vous voulez un moyen simple d'adapter cela (et plusieurs autres jeux de données) à une distribution de Pareto. Idéalement, il produirait les valeurs théoriques correspondantes, moins idéalement les paramètres.

Felix
la source
Qu'entend-on par «correspondance des valeurs théoriques»? Les attentes des statistiques de commande compte tenu des estimations des paramètres? Ou autre chose?
Glen_b -Reinstate Monica

Réponses:

33

Eh bien, si vous avez un échantillon d'une distribution de Pareto avec les paramètres et (où est le paramètre de limite inférieure et est le paramètre de forme), la probabilité logarithmique de cela l'échantillon est: m > 0 α > 0 m αX1,...,Xnm>0α>0mα

nlog(α)+nαlog(m)(α+1)i=1nlog(Xi)

il s'agit d'une augmentation monotone de , de sorte que le maximiseur est la plus grande valeur cohérente avec les données observées. Puisque le paramètre définit la borne inférieure du support pour la distribution de Pareto, l'optimum estmmm

m^=miniXi

qui ne dépend pas de . Ensuite, en utilisant des astuces de calcul ordinaires, le MLE pour doit satisfaireααα

nα+nlog(m^)i=1nlog(Xi)=0

une algèbre simple nous dit que le MLE de estα

α^=ni=1nlog(Xi/m^)

Dans de nombreux sens importants (par exemple, efficacité asymptotique optimale en ce qu'elle atteint la limite inférieure de Cramer-Rao), c'est la meilleure façon d'ajuster les données à une distribution de Pareto. Le code R ci - dessous calcule le MLE pour un ensemble de données, X.

pareto.MLE <- function(X)
{
   n <- length(X)
   m <- min(X)
   a <- n/sum(log(X)-log(m))
   return( c(m,a) ) 
}

# example. 
library(VGAM)
set.seed(1)
z = rpareto(1000, 1, 5) 
pareto.MLE(z)
[1] 1.000014 5.065213

Edit: Sur la base du commentaire de @cardinal et I ci-dessous, nous pouvons également noter que est l'inverse de la moyenne de l'échantillon des , ce qui arrive à ont une distribution exponentielle. Par conséquent, si nous avons accès à un logiciel qui peut s'adapter à une distribution exponentielle (ce qui est plus probable, car il semble se produire dans de nombreux problèmes statistiques), l'ajustement d'une distribution de Pareto peut être accompli en transformant l'ensemble de données de cette manière et en l'adaptant à une distribution exponentielle à l'échelle transformée. log(Xi/ m )α^log(Xi/m^)

Macro
la source
3
(+1) Nous pouvons écrire les choses de façon un peu plus suggestive en notant que est distribué de façon exponentielle avec le taux . à partir de cela et de l'invariance des MLE en transformation, nous concluons immédiatement que , où nous remplaçons par dans cette dernière expression. Cela indique également comment nous pourrions utiliser un logiciel standard pour adapter un Pareto même si aucune option explicite n'est disponible. alpha alpha = 1 / ˉ Y m mYi=log(Xi/m)αα^=1/Y¯mm^
cardinal
@cardinal - Donc, est l'inverse de la moyenne de l'échantillon des , qui se trouvent avoir une distribution exponentielle. Comment cela nous aide-t-il? log(Xi/ m )α^log(Xi/m^)
Macro
2
Salut, macro. Le point que j'essayais de faire était que le problème d'estimation des paramètres d'un Pareto peut être (essentiellement) réduit à celui de l'estimation du taux d'une exponentielle: via la transformation ci-dessus, nous pouvons convertir nos données et problème en un (peut-être) plus familier et extrayez immédiatement la réponse (en supposant que nous, ou notre logiciel, savons déjà quoi faire avec un échantillon d'exponentielles).
cardinal
Comment puis-je mesurer l'erreur de ce type d'ajustement?
emanuele
@emanuele, la variance approximative d'un MLE est l'inverse de la matrice d'informations du pêcheur, qui vous obligera à calculer au moins une dérivée de la log-vraisemblance. Ou, vous pouvez utiliser une sorte de rééchantillonnage bootstrap pour estimer l'erreur standard.
Macro
8

Vous pouvez utiliser la fitdistfonction fournie dans le fitdistrpluspackage:

library(MASS)
library(fitdistrplus)
library(actuar)

# suppose data is in dataPar list
fp <- fitdist(dataPar, "pareto", start=list(shape = 1, scale = 500))
#the mle parameters will be stored in fp$estimate
akashrajkn
la source
Cela devrait-il être library(fitdistrplus)?
Sean
1
@Sean oui, éditant la réponse en conséquence
Kevin L Keys
Notez que l'appel à library(actuar)est requis pour que cela fonctionne.
jsta
Que représente fp $ estimation ["forme"] dans ce cas? Est-ce peut-être l'alpha estimé? Ou bêta?
Albert Hendriks