如何在lmomco函数的帮助下为R中的fitdistr函数定义自己的分布 [英] how to define your own distribution for fitdistr function in R with the help of lmomco function
问题描述
我想定义自己的分布,以便与fitdistrplus函数配合使用,以适应从现在起称为月的每月降水量数据。我正在使用 lmomco功能来帮助我定义分布,但无法使其正常运行。例如,我正在定义通用的极值(gev)分布,如下所示:
I would like to define my own distributions to use with the fitdistrplus function to fit my monthly precipitation data from now on refered as "month". I am using the "lmomco" function to help me define the distributions, but cannot manage to make it work. For example, I am defining the generalized extreme value (gev) distribution like the following:
dgev<-pdfgev #functions which are included in lmomco
pgev<-cdfgev
qgev<-quagev
fitdistrplus需要参数 start,该参数由所需分布的初始参数值组成,我按以下方式估算这些初始值:
Since "fitdistrplus" needs the argument "start", which consists of the initial parameter values for the desired distribution, I am estimating these initial values as the following:
lmom=lmoms(month,nmom=5) #from lmomco package
para=pargev(lmom, checklmom=TRUE)
现在,我终于尝试使用 fitdist函数将月拟合为gev分布:
Now, I finally try using the "fitdist" function to fit "month" to the gev distribution as:
fitgev <- fitdist(month, "gev", start=para[2]) #fitdistrplus
我收到类似下面的错误。在 lmomco的帮助下定义哪种分布都没有关系,我会得到相同的错误。有人可以提示我我做错了什么吗?谢谢!
I get an error like the one below. It does not matter which distribution I define with the help of "lmomco", I get the same error. Could someone give me a hint on what am I doing wrong? Thanks!
fitgev <- fitdist(month, "gev", start=para[2])
[1] "Error in dgev(c(27.6, 97.9, 100.6, 107.3, 108.5, 109, 112.4, 120.9, 137.8, : \n unused arguments (para.xi = 196.19347977195, para.alpha = 91.9579520442104, para.kappa = -0.00762962879097294)\n"
attr(,"class")
[1] "try-error"
attr(,"condition")
<simpleError in dgev(c(27.6, 97.9, 100.6, 107.3, 108.5, 109, 112.4, 120.9, 137.8, 138.4, 144.7, 156.8, 163.1, 168.9, 169.1, 171.4, 176.1, 177.1, 178.8, 178.9, 187.2, 190.2, 190.5, 190.8, 191.2, 193.1, 195.2, 198.5, 199.8, 201.7, 206.9, 213.4, 220.7, 240, 253.5, 254.5, 256.1, 256.4, 257.5, 258.3, 261.5, 263.7, 264.7, 279.1, 284.2, 313.1, 314.7, 319.4, 321.6, 328.9, 330.1, 332.2, 358.3, 366.8, 367.9, 403.5, 424.1, 425.9, 457.3, 459.7, 468, 497.1, 508.5, 547.1), para.xi = 196.19347977195, para.alpha = 91.9579520442104, para.kappa = -0.00762962879097294): unused arguments (para.xi = 196.19347977195, para.alpha = 91.9579520442104, para.kappa = -0.00762962879097294)>
Error in fitdist(month, "gev", start = para[2]) :
the function mle failed to estimate the parameters,
with the error code 100
推荐答案
fitdist
期望具有命名参数的密度/分布函数。
fitdist
is expecting a density/distribution function with named arguments.
library("lmomco")
library("fitdistrplus")
## reproducible:
month <- c(27.6, 97.9, 100.6, 107.3, 108.5,
109, 112.4, 120.9, 137.8)
设置:
lmom <- lmoms(month,nmom=5) #from lmomco package
para <- pargev(lmom, checklmom=TRUE)
dgev <- pdfgev #functions which are included in lmomco
pgev <- cdfgev
fitgev <- fitdist(month, "gev", start=para[[2]])
## Error in mledist(data, distname, start, fix.arg, ...) :
## 'start' must specify names which are arguments to 'distr'
我们需要重新定义 dgev
并增加一些管道,这将使 fitdist
和 pdfgev
happy:
It turns out we need to redefine dgev
with several additional bits of plumbing that will make both fitdist
and pdfgev
happy:
dgev <- function(x,xi,alpha,kappa) {
pdfgev(x,list(type="gev",para=c(xi,alpha,kappa),source="pargev"))
}
fitgev <- fitdist(month, "gev", start=para[[2]])
## Fitting of the distribution ' gev ' by maximum likelihood
## Parameters:
## estimate Std. Error
## xi -25.587734 NA
## alpha 75.009842 NA
## kappa 1.593815 NA
这篇关于如何在lmomco函数的帮助下为R中的fitdistr函数定义自己的分布的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!