Stel dat ik 2 data.frame
objecten 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 df1
is 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 df2
zou 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 R
wordt 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=TRUE
lost dit probleem beter op, zie functie LL3
hieronder. 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.