【问题标题】:Estimate parameters of Frechet distribution using mmedist or fitdist(with mme) error使用 mmedist 或 fitdist(with mme) 误差估计 Frechet 分布的参数
【发布时间】:2015-01-18 23:47:07
【问题描述】:

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

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)

提前感谢您的帮助。

【问题讨论】:

    标签: r distribution


    【解决方案1】:

    您需要对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 函数,@ 987654330@ 在您的情况下带有两个参数 - obs,解析为 dataorder,但由于 minvweibull 不将数据作为第一个参数,因此失败。
      正如帮助页面告诉您的那样,这是意料之中的:

      memp 实现经验矩的函数,原始或居中但 必须与 distr 参数一致。 此功能必须有 两个参数:第一个是数据的数字向量,一个是 第二个函数返回的时刻的顺序。

    你怎么能解决这个问题?从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 
    

    但是请注意,这实际上简化为一种粗略的方式来执行超定矩量法,并且不确定这在理论上是否合适。

    【讨论】:

    • 无法真正解释这有多大帮助!工作完美。抱歉,我花了这么长时间才回答,并感谢您的即时回复。关于您的最后评论,请注意,除了它可能没有理论上的意义之外,至少我正在熟悉 R..Again.. 谢谢。
    • @mata 欣赏它。请随时投票和/或接受答案。 :)
    • 已经尝试过了,但它一直在抱怨我需要 15 声望。让我知道是否有另一种方法可以为此提供反馈。谢谢
    猜你喜欢
    • 2019-08-18
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 2021-02-28
    • 2019-01-31
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多