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

时间:2015-01-18 13:43:34

标签: r distribution

我在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)

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您需要对mmedist的来源进行非平凡的更改 - 我建议您复制代码,然后自行创建foo_mmedist

  1. 您需要进行的第一项更改是mmedist的第94行:

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

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

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

  2. 正如我已经指出的那样,第二个问题涉及optim例程实际调用funobj调用DIFF2的事实,调用memp(见第112行)用户提供的minvweibull函数,obs在您的情况下有两个参数 - data,可解析为orderminvweibull,但自moment起}不会将数据作为第一个参数,这会失败 这是预期的,因为帮助页面告诉您:

      

    memp实现经验时刻的功能,原始的或集中的但是   必须与分配论证一致。 此功能必须具备   两个参数:作为第一个数据的数字向量和作为   第二个函数返回的时刻顺序。

  3. 你怎么解决这个问题?从moments包中传递函数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 
    

    您可以按预期检查优化是否已发生:

    {{1}}

    然而,请注意,这实际上减少了做出超定时刻方法的粗略方式,并且不确定这在理论上是否合适。