2014-06-24 27 views
8

Angenommen, ich habe 2 data.frame Objekte:MLE Fehler in R: Anfangswert in 'vmmin' ist nicht endlich

df1 <- data.frame(x = 1:100) 
df1$y <- 20 + 0.3 * df1$x + rnorm(100) 
df2 <- data.frame(x = 1:200000) 
df2$y <- 20 + 0.3 * df2$x + rnorm(200000) 

Ich möchte MLE tun. Mit df1 alles in Ordnung ist:

LL1 <- function(a, b, mu, sigma) { 
    R = dnorm(df1$y - a- b * df1$x, mu, sigma) 
    -sum(log(R)) 
} 
library(stats4) 
mle1 <- mle(LL1, start = list(a = 20, b = 0.3, sigma=0.5), 
     fixed = list(mu = 0)) 

> mle1 
Call: 
mle(minuslogl = LL1, start = list(a = 20, b = 0.3, sigma = 0.5), 
fixed = list(mu = 0)) 

Coefficients: 
     a   b   mu  sigma 
23.89704180 0.07408898 0.00000000 3.91681382 

Aber wenn ich die gleiche Aufgabe mit df2 tun würde, würde ich einen Fehler erhalten:

LL2 <- function(a, b, mu, sigma) { 
    R = dnorm(df2$y - a- b * df2$x, mu, sigma) 
    -sum(log(R)) 
} 
mle2 <- mle(LL2, start = list(a = 20, b = 0.3, sigma=0.5), 
       fixed = list(mu = 0)) 
Error in optim(start, f, method = method, hessian = TRUE, ...) : 
    initial value in 'vmmin' is not finite 

Wie kann ich es zu überwinden?

+0

Nicht reproduzierbar. Bitte ändern Sie, wie 'df1' und' df2' definiert sind. –

+0

Versuchen Sie diese Variante – BiXiC

Antwort

4

Der Wert von R wird irgendwann Null; es führt zu einem nicht endlichen Wert der zu minimierenden Funktion und gibt einen Fehler zurück.

Mit dem Argument wird dieses Problem besser behandelt, siehe Funktion LL3 unten. Im Folgenden werden einige Warnungen angezeigt, aber es wird ein Ergebnis zurückgegeben, wobei die Parameterschätzungen nahe an den wahren Parametern liegen.

require(stats4) 
set.seed(123) 
e <- rnorm(200000) 
x <- 1:200000 
df3 <- data.frame(x) 
df3$y <- 20 + 0.3 * df3$x + e 
LL3 <- function(a, b, mu, sigma) { 
    -sum(dnorm(df3$y - a- b * df3$x, mu, sigma, log=TRUE)) 
} 
mle3 <- mle(LL3, start = list(a = 20, b = 0.3, sigma=0.5), 
    fixed = list(mu = 0)) 
Warning messages: 
1: In dnorm(df3$y - a - b * df3$x, mu, sigma, log = TRUE) : NaNs produced 
2: In dnorm(df3$y - a - b * df3$x, mu, sigma, log = TRUE) : NaNs produced 
3: In dnorm(df3$y - a - b * df3$x, mu, sigma, log = TRUE) : NaNs produced 
4: In dnorm(df3$y - a - b * df3$x, mu, sigma, log = TRUE) : NaNs produced 
5: In dnorm(df3$y - a - b * df3$x, mu, sigma, log = TRUE) : NaNs produced 
6: In dnorm(df3$y - a - b * df3$x, mu, sigma, log = TRUE) : NaNs produced 
7: In dnorm(df3$y - a - b * df3$x, mu, sigma, log = TRUE) : NaNs produced 
8: In dnorm(df3$y - a - b * df3$x, mu, sigma, log = TRUE) : NaNs produced 

> mle3 
Call: 
mle(minuslogl = LL3, start = list(a = 20, b = 0.3, sigma = 0.5), 
    fixed = list(mu = 0)) 

Coefficients: 
     a   b  mu  sigma 
19.999166 0.300000 0.000000 1.001803 
+1

'LL3 <- Funktion (a, b, mu, Sigma) { suppressWarns (-sum (dnorm (df3 $ y - a- b * df3 $ x, mu, sigma, log = WAHR))) } 'kann mit Warnungen umgehen. – BiXiC

+5

Es ist eine schlechte Idee, mit Warnungen umzugehen, indem man sie unterdrückt. Eigentlich ein sehr schlechter. –

4

Ich hatte das gleiche Problem bei der Minimierung einer Log-Likelihood-Funktion. Nach einigem Debugging stellte ich fest, dass das Problem in meinen Startwerten lag. Sie verursachten, dass eine bestimmte Matrix eine Determinante = 0 hatte, was einen Fehler verursachte, wenn ein Protokoll davon gemacht wurde. Daher konnte es keinen "endlichen" Wert finden, aber das war, weil die Funktion einen Fehler zu optim zurückliefert.

Bottomline: Überlegen Sie, ob Ihre Funktion keinen Fehler zurückgibt, wenn Sie sie mit den Startwerten ausführen.

PS .: Marius Hobert hat völlig recht. Niemals Warnungen unterdrücken.

+0

Das ist keine neue Frage, das ist ein gültiger (wenn auch allgemeiner) Tipp zur Lösung des Problems, der mir einfach nur geholfen hat. – Molx