MLE-fout in R: beginwaarde in ‘vmmin’ is niet eindig

Stel dat ik 2 data.frameobjecten heb:

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)

Ik wil MLE doen. Met df1is alles in orde:

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 

Maar als ik dezelfde taak met df2zou doen, zou ik een foutmelding krijgen:

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

Hoe kan ik het overwinnen?


Antwoord 1, autoriteit 100%

De waarde van Rwordt op een gegeven moment nul; het leidt tot een niet-eindige waarde van de functie die moet worden geminimaliseerd en geeft een fout terug.

Het gebruik van het argument log=TRUElost dit probleem beter op, zie functie LL3hieronder. Het volgende geeft enkele waarschuwingen, maar er wordt een resultaat geretourneerd, met parameterschattingen die dicht bij de werkelijke parameters liggen.

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 

Antwoord 2, autoriteit 96%

Ik had hetzelfde probleem bij het minimaliseren van een log-waarschijnlijkheidsfunctie. Na wat debuggen ontdekte ik dat het probleem in mijn startwaarden zat. Ze zorgden ervoor dat één specifieke matrix een determinant = 0 had, wat een fout veroorzaakte toen er een log van werd gemaakt. Daarom kon het geen “eindige” waarde vinden, maar dat was omdat de functie een fout terugstuurde naar optim.

Kortom: overweeg of uw functie geen fout retourneert wanneer u deze uitvoert met de startwaarden.

PS.: Marius Hofert heeft helemaal gelijk. Onderdruk nooit waarschuwingen.


Antwoord 3

bekende bug in R, bugzilla ID 17703. Notoir moeilijk te reproduceren.

Other episodes