R中MLE错误:'vmmin'中的初始值不是有限的。

17

假设我有两个 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的定义方式。 - user3710546
3个回答

8
< p > 在某些时候,< code > R 的值会变为零;这导致要最小化的函数的值变为非有限值并返回错误。 < / p > < p > 使用参数< code > log = TRUE 可以更好地处理此问题,请参见下面的< code > LL3 函数。以下内容会给出一些警告,但会返回结果,并且参数估计值接近真实参数。 < / p >
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 <- function(a, b, mu, sigma) { 可以处理警告的suppressWarnings(-sum(dnorm(df3$y - a- b * df3$x, mu, sigma, log=TRUE))) } - BiXiC
10
压制警告信息来解决问题是个糟糕的主意,实际上非常糟糕。 - Marius Hofert

8
我在最小化对数似然函数时遇到了同样的问题。经过一些调试,我发现问题出在我的起始值上。它们导致一个特定的矩阵的行列式为0,在对其取对数时引发错误。因此,它无法找到任何“有限”的值,但这是因为该函数向optim返回了一个错误。
总之:请考虑在使用起始值运行函数时是否会返回错误。
PS.:Marius Hofert完全正确。永远不要忽略警告。

1
这不是一个新问题,而是一个有效的(虽然是普遍的)解决问题的提示,正好帮助了我。 - Molx

1
已知 R 中的一个 bug,bugzilla ID 17703。非常难以重现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接