如何将一组数据拟合到 R 中的帕累托分布?

机器算法验证 r 帕累托分布
2022-01-30 08:50:49

假设有以下数据:

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

想要一种简单的方法来将此(以及其他几个数据集)拟合到帕累托分布。理想情况下,它将输出匹配的理论值,不太理想的是参数。

2个回答

好吧,如果你有一个来自帕累托分布(其中是下界参数,而是形状参数),那么它的对数似然样本是:X1,...,Xnm>0α>0mα

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

这是的单调递增,因此最大化器是与观察到的数据一致的最大值。由于参数定义了帕累托分布的支持下限,因此最优值为mm

m^=miniXi

这不依赖于接下来,使用普通的微积分技巧,的 MLE必须满足αα

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

一些简单的代数告诉我们的 MLE是α

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

在许多重要的意义上(例如最佳渐近效率,因为它达到了 Cramer-Rao 下界),这是将数据拟合到帕累托分布的最佳方法。下面的 R 代码计算给定数据集的 MLE 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

编辑:根据@cardinal 和我下面的评论,我们还可以注意到的样本平均值的倒数,这恰好发生在呈指数分布。因此,如果我们可以访问可以拟合指数分布的软件(这更有可能,因为它似乎出现在许多统计问题中),那么可以通过以这种方式转换数据集并对其进行拟合来完成对 Pareto 分布的拟合到变换尺度上的指数分布。 α^log(Xi/m^)

您可以使用包中fitdist提供的功能fitdistrplus

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