1. ホーム
  2. r

[解決済み] エラーコード 100 r で fitdist を使用して exp 分布を適合させる。

2022-02-17 22:58:30

質問

自分のデータに指数分布を当てはめようとしていますが、以下のようなエラーが発生します。

"Error in fitdist(x41, "exp", method = "mle") : 
  the function mle failed to estimate the parameters, 
                with the error code 100"

私はmmeを試しましたが、mleを持つ他の分布を持っているので、指数分布のmleも必要です。もう何日も行き詰っています。どなたか助けてください。

私のデータはこのようなものです。

2795.5
304.6833
2786.45
5897.75
4381.367
1178.1
351.3167
109.85
459.6167
13.26667
0.033333
846.3833
3698.45
1527.1
94.31667
15.01667
271.8833
473

これは私のコードです

ExpMle41 <- fitdist(x41, "exp", method="mle") 
ExpMle41
plot(ExpMle41)

何かお手伝いいただけることがあれば、ぜひお願いします。ありがとうございます。

解決方法は?

これを想定して fitdist から fitdistrplus パッケージで、あなたのエラーを複製することができます。

> fitdist(x41, "exp", method="mle")
<simpleError in optim(par = vstart, fn = fnobj, fix.arg = fix.arg, obs = data,     gr = gradient, ddistnam = ddistname, hessian = TRUE, method = meth,     lower = lower, upper = upper, ...): non-finite finite-difference value [1]>
Error in fitdist(x41, "exp", method = "mle") : 
  the function mle failed to estimate the parameters, 
                with the error code 100

しかし、あなたのデータには大きな数字が含まれています......すべてを1/4に縮小してみると......。

> fitdist(x41/10000, "exp", method="mle")
Fitting of the distribution ' exp ' by maximum likelihood 
Parameters:
     estimate Std. Error
rate   7.1417   1.683315

さて、うまくいったようですね。もう少し規模を小さくしてみましょう。

> fitdist(x41/1000, "exp", method="mle")
Fitting of the distribution ' exp ' by maximum likelihood 
Parameters:
     estimate Std. Error
rate  0.71417  0.1683312

そうですね。1000で割ると効果がありますね。続けてみよう。

> fitdist(x41/100, "exp", method="mle")
Fitting of the distribution ' exp ' by maximum likelihood 
Parameters:
     estimate Std. Error
rate 0.071417 0.01682985

順調です。

> fitdist(x41/10, "exp", method="mle")
Fitting of the distribution ' exp ' by maximum likelihood 
Parameters:
      estimate  Std. Error
rate 0.0071417 0.001649523

つまり、データを1/10にスケーリングするとうまくいき、推定値とSEがどのようにスケーリングされるかがわかるのです。もう一歩踏み込んでみましょう。

> fitdist(x41/1, "exp", method="mle")
<simpleError in optim(par = vstart, fn = fnobj, fix.arg = fix.arg, obs = data,     gr = gradient, ddistnam = ddistname, hessian = TRUE, method = meth,     lower = lower, upper = upper, ...): non-finite finite-difference value [1]>
Error in fitdist(x41/1, "exp", method = "mle") : 
  the function mle failed to estimate the parameters, 
                with the error code 100

クランチ 根本的なアルゴリズムに数値安定性の問題があるようだ。もし、データを指数関数的に処理するのであれば、無限大と区別がつかないような値になるのかもしれません。例えば

> exp(x41)
 [1]           Inf 2.100274e+132           Inf           Inf           Inf
 [6]           Inf 3.757545e+152  5.096228e+47 4.064401e+199  5.776191e+05
[11]  1.033895e+00           Inf           Inf           Inf  9.145540e+40
[16]  3.323969e+06 1.195135e+118 2.638092e+205

しかし、10倍にすれば、数学は対応できる、ほぼ(E+256!!)。

> exp(x41/10)
 [1] 2.552833e+121  1.706977e+13 1.032728e+121 1.367817e+256 1.907002e+190
 [6]  1.459597e+51  1.809216e+15  5.898273e+04  9.139021e+19  3.768462e+00
[11]  1.003339e+00  5.727429e+36 4.184491e+160  2.094645e+66  1.247731e+04
[16]  4.489166e+00  6.423056e+11  3.484408e+20