2017-02-12 4 views
0

私は最尤推定量に取り組んでおり、パラメータの1つはdigamma関数を使って推定されています。私はunirootを使用して方程式を解くことを試みていますが、そうすることはできません。ここに私のコードは次のとおりです。digimma関数のルーツR

dig = function(alpha){ 
    digamma(2 + alpha) - digamma(alpha) - (1/(2+alpha)) + (2/(2+alpha)) 
} 

curve(dig, from = 0, to = 10) 
uniroot(dig, lower = 0, upper = 10) 

これは、次のエラーを生成します。

Error in uniroot(dig, lower = 0, upper = 10) : f.lower = f(lower) is NA 
In addition: Warning messages: 
1: In digamma(alpha) : NaNs produced 
2: In digamma(alpha) : NaNs produced 

最初のエラーは、ソートの曲線に基づいて理にかなっているが、2番目は私がこだわっています。私はdigamma関数のルーツを見つける方法を誤解している可能性があります。あるいは、数値パッケージ(多分rootsolve?)がRに役立つかもしれません。私がここで何が欠けているかわからない - ヒントをいただければ幸いです。ありがとう!

+1

を検討 – MichaelChirico

+1

...また 'dig(0)'は 'NaN'を返します。カーブからは、(0,10)の区間に根がないことは明らかですので、なぜunirootを使用しているのか分かりません。 – nicola

答えて

1

`ガンマ(0)`定義されていない。以下

curve(dig, from = 0.01, to = 10) 
uniroot(dig, lower = 0.01, upper = 10) 

enter image description here

Error in uniroot(dig, lower = 0.01, upper = 10) : f() values at end points not of opposite sign

+0

MichaelChirico、この例に感謝します。 (-1、0)と(0、+ Inf)に根を持つことが判明しました。unirotに開かれた間隔を渡す方法はありますか? – sqlck

+0

間隔で別々に実行してください – MichaelChirico

+0

@sqlck Can (0、+ inf)に根があるのはなぜですか?私はそれを理解していません。(-1、0)を参照してください。 –