Проблемы с установкой бревна Pearson III с отрицательной шкалой - PullRequest
0 голосов
/ 06 марта 2020

Я хотел бы выполнить регистрацию соответствия Pearson III некоторым точкам данных, которые есть в R. Я следовал этим рекомендациям ссылка . Но я сталкиваюсь с проблемой, когда моя асимметрия (g) отрицательна (и, конечно, параметр "scale" также отрицателен, потому что "sign (g)" в вычислении масштаба). Распределение из "FAdist" не работает с отрицательным параметром масштаба, мне это нужно для начальных значений для "fitdist" (из fitdistrplus). Некоторые страницы говорят, что параметры формы и масштаба являются положительными только в Pearson III (или обобщают гамма-распределение), а на других нет идей. Код:

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 голосов
/ 06 марта 2020

Я уже решаю проблему. Я использовал пакет "PearsonDS" вместо "FAdist" для вычисления журнала Pearson III, почему? потому что последние принимают отрицательные значения асимметрии (g) и, следовательно, отрицательные значения параметра «масштаб» (если вы посмотрите документацию PearsonDS в Pearson III, они добавляют абсолютное значение в аргумент). Мне пришлось внести небольшие изменения в уравнение Пирсона III, чтобы правильно работать с пакетом «fitdistrplus» (чтобы подогнать распределение к образцам данных):

Окончательный код правильный (ВАЖНО: ДАННЫЕ ДОЛЖНЫ БЫТЬ ОРИГИНАЛЬНЫМИ ЗНАЧЕНИЯ, НЕ ЖУРНАЛ (ДАННЫЕ), НО СРЕДСТВО, VAR И G ОНИ ДОЛЖНЫ ВЫЧИСЛЯТЬСЯ С ЖУРНАЛОМ (ДАННЫЕ):

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 )
...