我想执行Pearson III的日志,以适应我的一些数据点。但是,每当我尝试它时,我都会收到错误消息,我真的不知道该怎么做。我或许应该补充说,我几天前只使用R,所以,我不是它的专家。
重要的代码部分,没有导入内容的部分是这样的:
pIIIpars<-list(shape=1, location=1, scale=1)
dPIII<-function(x, shape, location, scale) PearsonDS::dpearsonIII(x, shape=1, location=1, scale=1, params=pIIIpars, log=FALSE)
pPIII<-function(q, shape, location, scale) PearsonDS::ppearsonIII(q, shape=1, location=1, scale=1, params=pIIIpars, lower.tail = TRUE, log.p = FALSE)
qPIII<-function(p, shape, location, scale) PearsonDS::qpearsonIII(p, shape=1, location=1, scale=1, params=pIIIpars, lower.tail = TRUE, log.p = FALSE)
fitPIII<-fitdistrplus::fitdist(flowdata3$OEP, distr="PIII", method="mle", start=list("shape"=5000, "location"=5000, "scale"=5000))
summary(fitPIII)
plot(fitPIII)
我正在使用PearsonDS软件包来定义Log Pearson III发行版和fitdistrplus来进行拟合。
我总是得到的错误信息是:
[1] "Error in optim(par = vstart, fn = fnobj, fix.arg = fix.arg, obs = data, : \n function cannot be evaluated at initial parameters\n"
attr(,"class")
[1] "try-error"
attr(,"condition")
<simpleError in optim(par = vstart, fn = fnobj, fix.arg = fix.arg, obs = data, ddistnam = ddistname, hessian = TRUE, method = meth, lower = lower, upper = upper, ...): function cannot be evaluated at initial parameters>
Error in fitdistrplus::fitdist(flowdata3$OEP, distr = "PIII", method = "mle", :
the function mle failed to estimate the parameters,
with the error code 100
我发现错误消息,它只是;如果这不是传递初始值的正确方法,那是什么? 有人有想法吗?
干杯, 罗伯特
答案 0 :(得分:3)
以下示例遵循Kite(2004)并匹配他的结果。
# Annual maximum discharge data for the St Mary River at Stillwater Nova Scotia (Kite, 2004)
# PIII fit to the logs of the discharges
StMary <- c(565,294,303,569,232,405,228,232,394,238,524,368,464,411,368,487,394,
337,385,351,518,365,515,280,289,255,334,456,479,334,394,348,428,337,
311,453,328,564,527,510,371,824,292,345,442,360,371,544,552,651,190,
202,405,583,725,232,974,456,289,348,564,479,303,603,514,377,318,342,
593,378,255,292)
LStMary <- log(StMary)
m <- mean(LStMary)
v <- var(LStMary)
s <- sd(LStMary)
g <- e1071::skewness(LStMary, type=1)
# Correct the sample skew for bias using the recommendation of
# Bobee, B. and R. Robitaille (1977). "The use of the Pearson Type 3 and Log Pearson Type 3 distributions revisited."
# Water Resources Reseach 13(2): 427-443, as used by Kite
n <- length(StMary)
g <- g*(sqrt(n*(n-1))/(n-2))*(1+8.5/n)
# We will use method of moment estimates as starting values for the MLE search
my.shape <- (2/g)^2
my.scale <- sqrt(v)/sqrt(my.shape)
my.location <- m-sqrt(v * my.shape)
my.param <- list(shape=my.shape, scale=my.scale, location=my.location)
dPIII<-function(x, shape, location, scale) PearsonDS::dpearsonIII(x, shape, location, scale, log=FALSE)
pPIII<-function(q, shape, location, scale) PearsonDS::ppearsonIII(q, shape, location, scale, lower.tail = TRUE, log.p = FALSE)
qPIII<-function(p, shape, location, scale) PearsonDS::qpearsonIII(p, shape, location, scale, lower.tail = TRUE, log.p = FALSE)
fitdistrplus::fitdist(LStMary, distr="PIII", method="mle", start=my.param)
另请注意,MLE估算可能并不总是适用。见风筝(2004,p119)。他引用了Matalas和Wallis(1973)的观点,他指出,如果样本偏差很小,那么解决方案是我不可能的。你可以在矩量估计器的方法中看到,因为当g变为零时,形状参数会爆炸。
Kite,G。W.(2004)水文频率和风险分析。水资源出版物
Matalas,N。C.和J. R. Wallis(1973)。 “Eureka!它适合Pearson Type 3发行版。”水资源研究9(2):281-289。
答案 1 :(得分:0)
如果数据正偏斜,则上述代码将起作用,即长右尾。但是,如果要将数据拟合为负偏态分布,则需要将my.scale乘以偏度系数的符号。
参见第24页的公式(8),(9)和(10) 确定洪水流量和频率的准则 公告17 可在 https://acwi.gov/hydrology/Frequency/b17c/
所以将my.scale的行修改为 my.scale&lt; - sqrt(v)/ sqrt(my.shape)* sign(g)
如果不修改比例,则起始值通常不会导致拟合函数收敛。