使用 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
。
您需要做的第一个更改是 mmedist
的第 94 行:
if (!exists("memp", mode = "function"))
该行检查 "memp" 是否是一个存在的函数,而不是你实际传递的参数是否作为一个函数存在。
if (!exists(as.character(expression(memp)), mode = "function"))
第二个,正如我已经指出的,与 optim
例程实际上调用 funobj
调用 DIFF2
的事实有关,后者调用(参见第 112 行)用户提供的 memp
函数,在你的例子中 minvweibull
有两个参数 -- obs
,它解析为 data
和 order
,但是因为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
但是请注意,这实际上简化为采用超定矩法的粗略方法,我不确定这在理论上是否合适。
我是 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
。
您需要做的第一个更改是
mmedist
的第 94 行:if (!exists("memp", mode = "function"))
该行检查 "memp" 是否是一个存在的函数,而不是你实际传递的参数是否作为一个函数存在。
if (!exists(as.character(expression(memp)), mode = "function"))
第二个,正如我已经指出的,与
optim
例程实际上调用funobj
调用DIFF2
的事实有关,后者调用(参见第 112 行)用户提供的memp
函数,在你的例子中minvweibull
有两个参数 --obs
,它解析为data
和order
,但是因为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
但是请注意,这实际上简化为采用超定矩法的粗略方法,我不确定这在理论上是否合适。