Errors while trying to set gamma distribution using R fitdistr {MASS}

I have a problem with the fitdistr {MASS} function in R. I have this vector:

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) 

and I want to adjust the gamma distribution to the data using the command:

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

but I have this error:

 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 

So, I tried with parameter initialization:

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

The object installed by .gamma is created, but an error is generated when printing:

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

Do you know what is going on, or maybe you know some other R functions for one-dimensional distributions using MLE?

Thanks in advance for any help or answer.

Kuba

+8
r gamma-distribution
source share
2 answers

Always create your materials first, you scale far ahead.

 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) 

Now you can decide what to do with scaling

+9
source share

For data that clearly matches the gamma distribution but is on the wrong scale (i.e., as if it was multiplied / divided by a large amount), here is an alternative approach to adjusting the gamma distribution:

 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 } 

Using:

 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) 

density graph

+1
source share

All Articles