6

以下は私のコードです:

library(fitdistrplus)

s <- c(11, 4, 2, 9, 3, 1, 2, 2, 3, 2, 2, 5, 8,3, 15, 3, 9, 22, 0, 4, 10, 1, 9, 10, 11,
 2, 8, 2, 6, 0, 15, 0 , 2, 11, 0, 6, 3, 5, 0, 7, 6, 0, 7, 1, 0, 6, 4, 1, 3, 5,
 2, 6, 0, 10, 6, 4, 1, 17, 0, 1, 0, 6, 6, 1, 5, 4, 8, 0, 1, 1, 5, 15, 14, 8, 1,
 3, 2, 9, 4, 4, 1, 2, 18, 0, 0, 10, 5, 0, 5, 0, 1, 2, 0, 5, 1, 1, 2, 3, 7)

o <- fitdist(s, "gamma", method = "mle")
summary(o)
plot(o)

そしてエラーは言う:

fitdist(s, "gamma", method = "mle") のエラー: 関数 mle はパラメーターの推定に失敗しました。エラー コード 100 が返されました

4

2 に答える 2

5

ガンマ分布では、形状パラメーターが正確に 1.0 (つまり、指数分布 - 以下を参照) でない限り、ゼロ値は許可されません (0 の応答に対して、尤度はゼロに評価され、対数尤度は無限になります)。 .. これは統計的/数学的な問題であり、プログラミングの問題ではありません。ゼロ値について何か賢明なことを見つける必要があります。アプリケーションにとって何が理にかなっているかに応じて、(たとえば)

  • テストする別のディストリビューションを選択する
  • ゼロ値を除外 ( fitdist(s[s>0], ...))
  • ゼロ値を適切なゼロ以外の値に設定します (fitdist(replace(s,which(s==0),0.1),...)

これらのうちどれが最適かは、アプリケーションによって異なります


@Sandipan Deyの最初の答え(データセットにゼロを残す)は理にかなっているように見えますが、実際には1に等しい形状パラメータで行き詰まります.

o <- fitdist(s, "exp", method = "mle")

@Sandipanのコードと同じ答えを返します(ガンマ分布で推定されたスケールパラメーター= 4.626262の逆数であるレート= 0.2161572を推定することを除いて-これはパラメーター化の単なる変更です)。ガンマの代わりに指数関数を当てはめることを選択した場合、それは問題ありませんが、偶然ではなく、意図的に行う必要があります...

ゼロを含む近似が期待どおりに機能しない可能性があることを示すために、独自の負の対数尤度関数を作成し、各ケースの尤度曲面を表示します。

mfun <- function(sh,sc,dd=s) {
  -sum(dgamma(dd,shape=sh,scale=sc,log=TRUE))
}

library(emdbook)  ## for curve3d() helper function

ゼロを含むサーフェス:

cc1 <- curve3d(mfun(x,y),
      ## set up "shape" limits" so we evaluate
      ## exactly shape=1.000 ...
        xlim=c(0.55,3.55),
        n=c(41,41),
        ylim=c(2,5),
        sys3d="none")


png("gammazero1.png")
with(cc1,image(x,y,z))
dev.off()

ここに画像の説明を入力

この場合、サーフェスはshape=1 (つまり、指数分布) でのみ定義されます。白い領域は無限の対数尤度を表します。shape=1 が最適であるということではなく、それが唯一の適合であるということです...

ゼロ除外サーフェス:

cc2 <- curve3d(mfun(x,y,dd=s[s>0]),
               ## set up "shape" limits" so we evaluate
               ## exactly shape=1.000 ...
               xlim=c(0.55,3.55),
               n=c(41,41),
               ylim=c(2,5),
               sys3d="none")


png("gammazero2.png")
with(cc2,image(x,y,z))
with(cc2,contour(x,y,z,add=TRUE))
abline(v=1.0,lwd=2,lty=2)
dev.off()

ここに画像の説明を入力

于 2018-08-25T20:39:51.220 に答える