2013-04-12 7 views
8

У меня есть проблема с fitdistr {} MASS функции в R. У меня есть этот вектор:Ошибки при попытке соответствовать гамма-распределение с R fitdistr {МАССОВЫХ}

a <- c(26,73,84,115,123,132,159,207,240,241,254,268,272,282,300,302,329,346,359,367,375,378, 384,452,475,495,503,531,543,563,594,609,671,687,691,716,757,821,829,885,893,968,1053,1081,1083,1150,1205,1262,1270,1351,1385,1498,1546,1565,1635,1671,1706,1820,1829,1855,1873,1914,2030,2066,2240,2413,2421,2521,2586,2727,2797,2850,2989,3110,3166,3383,3443,3512,3515,3531,4068,4527,5006,5065,5481,6046,7003,7245,7477,8738,9197,16370,17605,25318,58524) 

, и я хочу, чтобы соответствовать гамма-распределение для данные с помощью команды:

fitted.gamma <- fitdistr(a, "gamma") 

, но у меня есть такая ошибка:

Error in optim(x = c(26, 73, 84, 115, 123, 132, 159, 207, 240, 241, 254, : 
non-finite finite-difference value [1] 
In addition: Warning messages: 
1: In densfun(x, parm[1], parm[2], ...) : NaNs produced 
2: In densfun(x, parm[1], parm[2], ...) : NaNs produced 
3: In densfun(x, parm[1], parm[2], ...) : NaNs produced 
4: In densfun(x, parm[1], parm[2], ...) : NaNs produced 

Так что я попытался с инициализацией параметры:

(fitted.gamma <- fitdistr(a, "gamma", start=list(1,1))) 

Объект fitted.gamma создается, но при печати, создает ошибку:

Error in dn[[2L]] : subscript out of bounds 

Вы знаете, что происходит, или, может быть, знаете, некоторые другие функции R, чтобы соответствовать одномерные распределения по MLE?

Заранее благодарим за любую помощь или ответ.

Kuba

ответ

9

Всегда построить ваш материал первым, вы масштабирование далеко offfffffff.

library(MASS) 
a <- c(26,73,84,115,123,132,159,207,240,241,254,268,272,282,300,302,329,346,359,367,375,378, 384,452,475,495,503,531,543,563,594,609,671,687,691,716,757,821,829,885,893,968,1053,1081,1083,1150,1205,1262,1270,1351,1385,1498,1546,1565,1635,1671,1706,1820,1829,1855,1873,1914,2030,2066,2240,2413,2421,2521,2586,2727,2797,2850,2989,3110,3166,3383,3443,3512,3515,3531,4068,4527,5006,5065,5481,6046,7003,7245,7477,8738,9197,16370,17605,25318,58524) 
## Ooops, rater wide 
plot(hist(a)) 
fitdistr(a/10000,"gamma") # gives warnings 
# No warnings 
fitted.gamma <- fitdistr(a/10000, dgamma, start=list(shape = 1, rate = 0.1),lower=0.001) 

Теперь вы можете решить, что делать с масштабированием

+0

Спасибо за ваш ответ. Я вижу, что добавление «нижнего» аргумента с масштабированием сделало трюк. Означает ли это, что при оптимизации параметров гаммы в некоторых точках отрицательные значения? Когда дело доходит до масштабирования, почему необходимо масштабировать значения (параметр скорости низкий)? Kuba – kuba

+0

Да, при оптимизации градиента мы легко сталкиваемся с плохими областями градиента для некоторых образцов. Гамма, возможно, не является правильным распределением, просто попробуйте сделать несколько примеров. Однако log (a) выглядит почти нормально ... –

+0

Большое спасибо за вашу помощь :) – kuba

1

Для данных, которые явно фитируется гамма-распределение, но в неправильном масштабе (то есть, как если бы она была умноженной/делится на большое номер), вот альтернативный подход к установке гамма-распределение:

fitgamma <- function(x) { 
    # Equivalent to `MASS::fitdistr(x, densfun = "gamma")`, where x are first rescaled to 
    # the appropriate scale for a gamma distribution. Useful for fitting the gamma distribution to 
    # data which, when multiplied by a constant, follows this distribution 
    if (!requireNamespace("MASS")) stop("Requires MASS package.") 

    fit <- glm(formula = x ~ 1, family = Gamma) 
    out <- MASS::fitdistr(x * coef(fit), "gamma") 
    out$scaling_multiplier <- unname(coef(fit)) 
    out 
} 

Использование:

set.seed(40) 
test <- rgamma(n = 100, shape = 2, rate = 2)*50000 
fitdistr(test, "gamma") # fails 
dens_fit <- fitgamma(test) # successs 
curve(dgamma(x, 2, 2), to = 5) # true distribution 
curve(dgamma(x, dens_fit$estimate['shape'], dens_fit$estimate['rate']), add=TRUE, col=2) # best guess 
lines(density(test * dens_fit$scaling_multiplier), col = 3) 

plot of density