2017-02-12 1 views
0

Ich arbeite an einem Maximum-Likelihood-Schätzer, und einer der Parameter wird mit der Digamma-Funktion geschätzt. Ich versuche, Uniroot zu verwenden, um die Gleichung zu lösen, bin aber dazu nicht in der Lage. Hier ist mein Code:Wurzeln der Digamma-Funktion in 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) 

Dies erzeugt den folgenden Fehler:

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 

Der erste Fehler Art von Sinn macht, auf der Kurve basiert, aber die zweite hat mir stecken. Es ist durchaus möglich, dass ich missverstände, wie man die Wurzeln der Digamma-Funktion findet, oder dass es ein numerisches Paket (vielleicht Rootsolve?) In R gibt, das helfen könnte. Ich bin mir nicht sicher, was ich hier vermisse - alle Tipps wären willkommen. Vielen Dank!

+1

'gamma (0)' ist nicht definiert. – MichaelChirico

+1

... und auch Ihre 'dig (0)' gibt 'NaN' zurück. Von der Kurve aus ist es ziemlich klar, dass es im (0,10) Intervall keine Wurzel gibt, also verstehe nicht, warum du 'uniroot' verwendest. – nicola

Antwort

1

sich das folgende

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, danke für dieses Beispiel - ich hätte es überprüfen sollen Ich finde, dass dig Wurzeln in den Intervallen hat (-1, 0) und (0, + Inf) Gibt es eine Möglichkeit, offene Intervalle an Uniroot zu übergeben? – sqlck

+0

Einfach in den Intervallen laufen lassen – MichaelChirico

+0

@sqlck Can Du erklärst, warum dig eine Wurzel hat (0, + inf)? Ich verstehe das nicht. Ich sehe das auf (-1, 0). –