【问题标题】:MLE error in R: initial value in 'vmmin' is not finiteR 中的 MLE 错误:“vmmin”中的初始值不是有限的
【发布时间】:2014-06-24 10:03:08
【问题描述】:

假设我有 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)

我想做 MLE。 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

我该如何克服它?

【问题讨论】:

  • 不可重现。请更改 df1df2 的定义方式。

标签: r mle


【解决方案1】:

当最小化对数似然函数时,我遇到了同样的问题。经过一些调试,我发现问题出在我的起始值上。它们导致一个特定矩阵的行列式 = 0,这在获取日志时会导致错误。因此,它找不到任何“有限”值,但那是因为该函数向 optim 返回了一个错误。

底线:考虑您的函数在使用起始值运行时是否没有返回错误。

PS.:Marius Hofert 完全正确。永远不要隐藏警告。

【讨论】:

  • 这不是一个新问题,这是解决问题的有效(即使是一般性)提示,恰好帮助了我。
【解决方案2】:

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 

【讨论】:

  • LL3 &lt;- function(a, b, mu, sigma) { suppressWarnings(-sum(dnorm(df3$y - a- b * df3$x, mu, sigma, log=TRUE))) } 可以处理警告。
  • 通过抑制警告来“处理”警告是一个坏主意。实际上,这是一个非常糟糕的结果。
【解决方案3】:

R 中的已知错误,bugzilla ID 17703。众所周知,难以重现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 2020-01-29
    • 2015-09-03
    相关资源
    最近更新 更多