使用 mmedist 或 fitdist(with mme) 误差估计 Frechet 分布的参数

Estimate parameters of Frechet distribution using mmedist or fitdist(with mme) error

我是 R 的新手,如果您能看看下面的代码,我将不胜感激。我正在尝试使用 mmedist(我也尝试了调用 mmedist 的 fitdist)来估计 Frechet 分布(或逆 weibull)的形状参数,但似乎出现以下错误:

Error in mmedist(data, distname, start = start, fix.arg = fix.arg, ...) : the empirical moment function must be defined.

我使用的代码如下:

require(actuar)
library(fitdistrplus)
library(MASS)
#values
n=100
scale = 1
shape=3
# simulate a sample
data_fre = rinvweibull(n, shape, scale)
memp=minvweibull(c(1,2), shape=3, rate=1, scale=1)
# estimating the parameters
para_lm = mmedist(data_fre,"invweibull",start=c(shape=3,scale=1),order=c(1,2),memp = "memp")

请注意,我多次尝试更改代码以查看我的错误是否在语法上,但我总是得到相同的错误。

我知道文档中的范例。我也试过了,但没有运气。请注意,为了使该方法起作用,力矩的阶数必须小于形状参数(即形状)。

示例如下:

require(actuar)
#simulate a sample
x4  <-  rpareto(1000, 6, 2)

#empirical raw moment
memp  <-  function(x, order)
    ifelse(order == 1, mean(x), sum(x^order)/length(x))


#fit
mmedist(x4, "pareto", order=c(1, 2), memp="memp", 
    start=c(shape=10, scale=10), lower=1, upper=Inf)

提前感谢您的帮助。

您需要对 mmedist 的源代码进行重大更改 -- 我建议您复制代码,并创建您自己的函数 foo_mmedist

  1. 您需要做的第一个更改是 mmedist 的第 94 行:

    if (!exists("memp", mode = "function")) 
    

    该行检查 "memp" 是否是一个存在的函数,而不是你实际传递的参数是否作为一个函数存在。

    if (!exists(as.character(expression(memp)), mode = "function"))

  2. 第二个,正如我已经指出的,与 optim 例程实际上调用 funobj 调用 DIFF2 的事实有关,后者调用(参见第 112 行)用户提供的 memp 函数,在你的例子中 minvweibull 有两个参数 -- obs,它解析为 dataorder,但是因为minvweibull 没有将数据作为第一个参数,这失败了。
    正如帮助页面告诉您的那样,这是预料之中的:

    memp A function implementing empirical moments, raw or centered but has to be consistent with distr argument. This function must have two arguments : as a first one the numeric vector of the data and as a second the order of the moment returned by the function.

如何解决这个问题?从 moments 包中传递函数 moment。这是完整的代码(假设您已进行上述更改,并创建了一个名为 foo_mmedist 的新函数):

# values
n = 100
scale = 1
shape = 3

# simulate a sample
data_fre = rinvweibull(n, shape, scale)

# estimating the parameters
para_lm = foo_mmedist(data_fre, "invweibull",
                  start= c(shape=5,scale=2), order=c(1, 2), memp = moment)

您可以检查是否按预期进行了优化:

> para_lm$estimate
   shape    scale 
2.490816 1.004128 

但是请注意,这实际上简化为采用超定矩法的粗略方法,我不确定这在理论上是否合适。