2016-06-10 4 views
3

IFehler in Optim(): für eine univariate Funktion für die globale Mindest Suche

Die Funktion ist die Likelihood-Funktion von negativen binominal eine Funktion in R optimieren können, wenn ich versuche, nur mu Parameter zu schätzen. Dies sollte kein Problem sein, da die Funktion eindeutig nur einen Punkt hat. Aber ich kann das wünschenswerte Ergebnis nicht erreichen.

Die Funktion wird optmized ist:

EMV <- function(data, par) { 

    Mi <- par 
    Phi <- 2 
    N <- NROW(data) 

    Resultado <- log(Mi/(Mi + Phi))*sum(data) + N*Phi*log(Phi/(Mi + Phi)) 
    return(Resultado) 
} 

Daten ein Vektor von negativen binomialen Variablen mit Parametern 2 und 2

data <- rnegbin(10000, mu = 2, theta = 2) 

Wenn ich die Funktion mu als Variable mit folgenden Eigenschaften Parzelle ist Code:

x <- seq(0.1, 100, 0.02) 
z <- EMV(data,0.1) 
for (aux in x) {z <- rbind(z, EMV(data,aux))} 
z <- z[2:NROW(z)] 
plot(x,z) 

Ich bekomme die folgende Kurve:

Generated Curve

und der maximale Wert von z zu Parameterwert schließen -> 2

x[which.max(z)] 

Aber die Optimierung funktioniert nicht mit BFGS

Error in optim(par = theta, fn = EMV, data = data, method = "BFGS") : 
non-finite finite-difference value [1] 

Und geht nicht zum richtigen Wert mit SANN, zum Beispiel:

$par 
[1] 5.19767e-05 

$value 
[1] -211981.8 

$counts 
function gradient 
    10000  NA 

$convergence 
[1] 0 

$message 
NULL 

Die Fragen sind:

  1. Was mache ich falsch?
  2. Gibt es eine Möglichkeit zu sagen optim, dass der Parameter größer als 0 sein sollte?
  3. Gibt es eine Möglichkeit zu sagen optim, dass ich die Funktion maximieren möchte? (Ich fürchte, die optim versucht, auf einen sehr kleinen Wert zu minimieren und wird, wo Funktion kleinste Werte zurückgibt)
+0

Danke. Ich habe 'optim (par = Theta, fn = EMV, Daten = Daten, Methode = "Brent", low = 0, upper = 1E5) 'und ich bekomme 1E5 als Ergebnis. Es scheint, das Optimum minimiert die Funktion im Intervall. – Nizam

+0

Bitte formulieren Sie Ihren Kommentar als Antwort, die ich gerne annehmen würde. Danke vielmals. – Nizam

+0

Sicher ... Nimm dir Zeit. Mein Problem wurde bereits gelöst. – Nizam

Antwort

3

Minimierung oder Maximierung?

Obwohl ?optim sagt es Maximierung zu tun, aber das ist in einer Halterung, so Minimierung ist Standard:

fn: A function to be minimized (or maximized) ... 

Wenn wir also eine Zielfunktion maximieren wollen, müssen wir eine -1 vermehren es und dann minimieren Sie es. Dies ist eine ziemlich häufige Situation. In der Statistik wollen wir oft eine maximale logarithmische Wahrscheinlichkeit finden, um optim() zu verwenden, haben wir keine andere Wahl, als die negative logarithmische Wahrscheinlichkeit zu minimieren.

Welche Methode verwenden?

Wenn wir nur eine 1D-Minimierung durchführen, sollten wir die Methode "Brent" verwenden. Diese Methode ermöglicht es uns, eine untere Grenze und eine obere Grenze der Suchregion anzugeben. Die Suche beginnt von einer Grenze und sucht nach der anderen, bis sie das Minimum erreicht oder die Grenze erreicht. Eine solche Spezifikation kann Ihnen helfen, Ihre Parameter einzuschränken. Zum Beispiel möchten Sie nicht mu kleiner als 0 sein, dann nur lower = 0 setzen.

Wenn wir zu 2D oder höheren Dimensionen wechseln, sollten wir auf "BFGS" zurückgreifen. Wenn wir in diesem Fall einen unserer Parameter, z. B. a, als positiv festlegen möchten, müssen wir die Protokollumwandlung log_a = log(a) vornehmen und unsere Zielfunktion unter Verwendung von log_a neu parametrisieren. Jetzt ist log_a frei von Beschränkungen. Dasselbe gilt, wenn wir mehrere Parameter als positiv festlegen möchten.

Wie kann ich den Code ändern?

EMV <- function(data, par) { 

    Mi <- par 
    Phi <- 2 
    N <- NROW(data) 

    Resultado <- log(Mi/(Mi + Phi))*sum(data) + N*Phi*log(Phi/(Mi + Phi)) 
    return(-1 * Resultado) 
} 

optim(par = theta, fn = EMV, data = data, method = "Brent", lower = 0, upper = 1E5) 
0

Die Hilfedatei für optim sagt: „Standardmäßig optim führt Minimierung, aber es wird maximiert, wenn die Kontrolle $ fnscale ist negativ. " Wenn Sie also entweder Ihre Funktionsausgabe mit -1 multiplizieren oder die Eingabe des Steuerobjekts ändern, sollten Sie die richtige Antwort erhalten.

Verwandte Themen