Ответ 1
Получение приблизительной оценки методом моментов (совпадение среднего масштаба = форма * шкала и дисперсия = форма * шкала ^ 2) мы имеем
mean <- 1255
var <- 2.79e7
shape = mean^2/var ## 0.056
scale = var/mean ## 22231
Теперь создайте некоторые данные из этого дистрибутива:
set.seed(101)
x = rgamma(1e4,shape,scale=scale)
summary(x)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 0.00 0.06 1258.00 98.26 110600.00
MASS::fitdistr(x,"gamma") ## error
Я сильно подозреваю, что проблема заключается в том, что базовый вызов optim
предполагает, что параметры (форма и масштаб, форма и скорость) имеют примерно такую же величину, какими они не являются. Вы можете обойти это, масштабируя свои данные:
(m <- MASS::fitdistr(x/2e4,"gamma")) ## works fine
## shape rate
## 0.0570282411 0.9067274280
## (0.0005855527) (0.0390939393)
fitdistr
дает параметр скорости, а не параметр масштаба: чтобы вернуться к требуемому параметру формы, инвертировать и повторно масштабировать...
1/coef(m)["rate"]*2e4 ## 22057
Кстати, тот факт, что квантили симулированных данных не очень хорошо соответствуют вашим данным (например, медиана x
= 0,06 против медианы 199 в ваших данных), предположили, что ваши данные могут не соответствовать Гамма все это хорошо - например могут быть некоторые выбросы, влияющие на среднее и дисперсию больше, чем квантили?
PS выше Я использовал встроенную оценку "гамма" в fitdistr
вместо использования dgamma
: со стартовыми значениями, основанными на методе моментов, и масштабированием данных на 2e4, это работает (хотя это дает предупреждение о NaNs produced
, если мы не укажем lower
)
m2 <- MASS::fitdistr(x/2e4,dgamma,
start=list(shape=0.05,scale=1), lower=c(0.01,0.01))