我在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)
提前感谢您的帮助。
答案 0 :(得分:2)
您需要对mmedist
的来源进行非平凡的更改 - 我建议您复制代码,然后自行创建foo_mmedist
。
您需要进行的第一项更改是mmedist
的第94行:
if (!exists("memp", mode = "function"))
该行检查“memp”是否是一个存在的函数,而不是您实际传递的参数是否作为函数存在。
if (!exists(as.character(expression(memp)), mode = "function"))
正如我已经指出的那样,第二个问题涉及optim
例程实际调用funobj
调用DIFF2
的事实,调用memp
(见第112行)用户提供的minvweibull
函数,obs
在您的情况下有两个参数 - data
,可解析为order
和minvweibull
,但自moment
起}不会将数据作为第一个参数,这会失败
这是预期的,因为帮助页面告诉您:
memp实现经验时刻的功能,原始的或集中的但是 必须与分配论证一致。 此功能必须具备 两个参数:作为第一个数据的数字向量和作为 第二个函数返回的时刻顺序。
你怎么解决这个问题?从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}}
然而,请注意,这实际上减少了做出超定时刻方法的粗略方式,并且不确定这在理论上是否合适。