Ошибка MLE в R: начальное значение в 'vmmin' не является конечным

Предположим, у меня есть 2 объекта data.frame:

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)

Я хочу сделать МЛЭ. С df1 все ок:

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 

Но если бы я сделал ту же задачу с df2, я бы получил ошибку:

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

Как я могу преодолеть это?


r mle
person BiXiC    schedule 24.06.2014    source источник
comment
Не воспроизводимо. Пожалуйста, измените определение df1 и df2.   -  person    schedule 24.06.2014


Ответы (3)


В какой-то момент значение R становится равным нулю; это приводит к неконечному значению минимизируемой функции и возвращает ошибку.

Использование аргумента log=TRUE лучше решает эту проблему, см. функцию LL3 ниже. Следующее дает некоторые предупреждения, но возвращается результат с оценками параметров, близкими к истинным параметрам.

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 
person javlacalle    schedule 24.06.2014
comment
LL3 <- function(a, b, mu, sigma) { suppressWarnings(-sum(dnorm(df3$y - a- b * df3$x, mu, sigma, log=TRUE))) } может работать с предупреждениями. - person BiXiC; 24.06.2014
comment
«Работать» с предупреждениями путем их подавления — плохая идея. На самом деле, очень плохой. - person Marius Hofert; 26.11.2014

У меня была такая же проблема при минимизации функции логарифмического правдоподобия. После некоторой отладки я обнаружил, что проблема была в моих начальных значениях. Они заставили одну конкретную матрицу иметь определитель = 0, что вызвало ошибку при снятии журнала. Следовательно, он не мог найти никакого «конечного» значения, но это было потому, что функция вернула ошибку в optim.

Итог: подумайте, не возвращает ли ваша функция ошибку, когда вы запускаете ее, используя начальные значения.

PS: Мариус Хоферт совершенно прав. Никогда не подавляйте предупреждения.

person Douglas K    schedule 07.09.2015
comment
Это не новый вопрос, это верный (хотя и общий) совет по решению проблемы, который мне просто помог. - person Molx; 22.05.2016

известная ошибка в R, bugzilla ID 17703. Общеизвестно, что ее трудно воспроизвести.

person robin hankin    schedule 18.05.2020