对数对数皮尔逊III具有负比例的问题

时间:2020-03-06 07:15:26

标签: r distribution gamma-distribution

我想对R上的某些数据点进行对数Pearson III拟合。我遵循此准则 link。但是,当我的偏度(g)为负(并且参数“ scale”当然也为负,因为比例计算中的“ sign(g)”)时,我遇到了一个问题。来自“ FAdist”的分布不适用于负比例参数,我需要此来获取“ fitdist”(来自fitdistrplus)的起始值。有些页面说参数形状和比例仅在皮尔逊三世(或广义伽马分布)中为正,而其他方面则为正,我用完了点子。代码是:

library(fitdistrplus)
library(FAdist)
library(e1071) 
#data
df <-(92.8, 53.2, 112.0, 164.0, 132.0,  69.9, 140.0,  48.3, 123.0 ,24.6, 179.0,  55.1,  31.3,  17.0, 111.0,  35.4, 133.0, 505.0, 303.0, 121.5, 203.0, 198.0, 250.0, 232.0, 185.0, 222.0, 191.0, 238.0,  53.0, 121.0, 106.4, 347.3, 186.4,  89.1, 131.4 ,53.2, 252.6)
# log of df
df<-log(df)
#Pearson 3 Sample moments
 m <- mean(df)
v <- var(df)
s <- sd(df)
g <- e1071::skewness(df, type=1)
n <- length(df)
#Pearson 3 Parameter estimation
my.shape <- (2/g)^2
my.scale <- sqrt(v)/sqrt(my.shape)*sign(g) # modified as recommended by Carl Schwarz, this is negative =(
my.thres <- m-(my.shape*my.scale)
# All parameter together
my.param <- list(shape=my.shape, scale=my.scale, thres=my.thres )
# fit dist from the "fitdistrplus" and "lgamma3" from "FAdist"
q.p3 <- fitdist(data = caudales,distr = "lgamma3", start = my.param)

请给我以下内容

fitdist(data = df,distr =“ lgamma3”,start = my.param,错误: 函数mle无法估计参数, 错误代码为100

1 个答案:

答案 0 :(得分:0)

我已经解决了问题。我使用软件包“ PearsonDS”而不是“ FAdist”来计算对数pearson III,为什么?因为后者接受偏度(g)的负值,并因此接受“ scale”参数的负值(如果您查看Pearson III中PearsonDS的文档,则会在参数中添加一个绝对值)。我必须对Pearson III的方程式做一些改动,才能与“ fitdistrplus”软件包配合使用(以适合样本数据的分布):

最终代码是正确的(重要:数据必须是原始值,而不是LOG(DATA)),但均值,VAR和G需要与LOG(DATA)计算出来:

library(FAdist); library(fitdistrplus)
library("e1071")
library(PearsonDS)
load("data")
## PP for precipitation
pp <- as.numeric(data$pp)
## IMPORTANT : DATA MUST BE THE ORIGINAL VALUES NOT THE LOG(DATA)
data <- (pp)
m <- mean(log(data))
v <- var(log(data))
s <- sd(log(data))
g <- e1071::skewness(log(data), type=1)
n <- length(data)
#g <- g*(sqrt(n*(n-1))/(n-2))*(1+8.5/n)
my.shape <- (2/g)^2
my.scale <- (sqrt(v/my.shape))*sign(g) # modified as recommended by Carl Schwarz
my.thres <- m-my.shape*my.scale
#load functions
dlPIII<-function(x, shape, location, scale) {PearsonDS::dpearsonIII(log(x), shape, location, scale, log=FALSE)/x}
plPIII<-function(q, shape, location, scale) {PearsonDS::ppearsonIII(log(q), shape, location, scale, lower.tail = TRUE, log.p = FALSE)}
qlPIII<-function(p, shape, location, scale) {exp(PearsonDS::qpearsonIII(p, shape, location, scale, lower.tail = TRUE, log.p = FALSE))}
# Fit the distribution
f.pl3 <- fitdist(data, distr="lPIII", method="mle", start=list(shape=my.shape,location=my.thres ,scale=my.scale )