2013-04-12 29 views
8

Tôi có một vấn đề với fitdistr {} MASS chức năng trong R. Tôi có vector này:lỗi trong khi cố gắng để phù hợp với phân phối gamma với R fitdistr {} 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) 

và tôi muốn để phù hợp với sự phân bố gamma để dữ liệu với một lệnh:

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

nhưng tôi có lỗi như vậy:

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 

Vì vậy, tôi cố gắng với khởi tạo các thông số:

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

Đối tượng fitted.gamma được tạo ra nhưng khi in, tạo ra một lỗi:

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

Bạn có biết những gì đang xảy ra hoặc có thể biết một số chức năng R khác để phù hợp với sự phân bố đơn biến bởi MLE?

Cảm ơn trước vì bất kỳ trợ giúp hoặc phản hồi nào.

Kuba

Trả lời

9

Luôn vẽ đồ đạc của bạn trước tiên, bạn mở rộng quy mô rất xa.

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) 

Bây giờ bạn có thể quyết định những gì để làm với các nhân rộng

+0

Cảm ơn câu trả lời của bạn. Tôi thấy rằng việc thêm đối số "thấp hơn" với tỷ lệ thực hiện thủ thuật. Điều đó có nghĩa là trong khi tối ưu hóa các thông số gamma có tại một số giá trị âm? Khi nói đến mở rộng quy mô, tại sao cần phải mở rộng các giá trị (tham số tốc độ thấp)? Kuba – kuba

+0

Có, trong khi tối ưu hóa độ dốc, chúng tôi dễ dàng chạy vào các vùng dốc xấu cho một số mẫu. Gamma có thể không phải là bản phân phối phù hợp, chỉ cần cố gắng vẽ một vài ví dụ. Tuy nhiên, nhật ký (a) trông gần như bình thường ... –

+0

Cảm ơn rất nhiều sự giúp đỡ của bạn :) – kuba

1

Đối với dữ liệu phù hợp rõ sự phân bố gamma, nhưng là trên phạm vi sai (ví dụ, như thể nó đã được nhân/chia cho một lớn số), đây là một cách tiếp cận khác để phù hợp sự phân bố gamma:

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 
} 

cách sử dụng:

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

Các vấn đề liên quan