2013-04-12 15 views
8

持つガンマ分布に合うようにしようと私は、このベクトルを持つR.におけるfitdistr {MASS}機能に問題が持っている間:エラー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) 

を、私はにガンマ分布に合うようにしたいです

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?

ご協力いただきありがとうございます。

クバ

答えて

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

+0

はい、グラディエントの最適化中に、いくつかのサンプルでは勾配の悪い領域に簡単に入ります。ガンマは正しい分布ではないかもしれませんが、いくつかの例をプロットしようとします。しかし、ログ(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

関連する問題