bbmle的NaN错误

时间:2019-03-06 21:16:39

标签: r nan mle

该问题与我之前的问题here和论文A New Generalization of Linear Exponential Distribution: Theory and Application中介绍的数据集有关。对于这些数据,采用Ben Bolker提出的代码,我们有

library(stats4)
library(bbmle)

x <- scan(textConnection("115 181 255 418 441 461 516 739 743 789
807 865 924 983 1024 1062 1063 1165 1191 1222 1222 1251 1277 1290 1357 1369 1408 1455 1478 1549 1578 1578 1599 1603 1605 1696 1735 1799 1815 1852"))

dd  <- data.frame(x)

dLE <- function(x,lambda,theta,log=TRUE){
    r <- log(lambda+theta*x)-(lambda*x+(theta/2)*x^2)
    if (log) return(r) else return(exp(r))
}

svec <- list(lambda=0.0009499,theta=0.000002)
m1 <- mle2( x ~ dLE(lambda,theta),
      data=dd,
      start=svec,
      control=list(parscale=unlist(svec)))
coef(m1)

返回ml的几个错误(产生的NaN)和值,与本文表2中给出的值完全不同。为什么会这样,如何纠正呢?

1 个答案:

答案 0 :(得分:2)

经过一番探索,我认为该论文只是有错误的结果。我从optim()获得的结果所产生的结果看上去比论文中报告的结果要好得多。我总会想念一些东西;我建议您与通讯作者联系。

(警告不一定是问题-它们表示优化器尝试了一些组合,导致沿途记录负数,这并不意味着最终结果是错误的-但我同意,总是这样一个解决警告的好主意,以防万一,它们以某种方式弄乱了结果。)

初步

library(bbmle)
## load data, in a format as similar to original table
## as possible (looking for typos)
x <- scan(textConnection("115 181 255 418 441 461 516 739 743 789
                          807 865 924 983 1024 1062 1063 1165 1191 1222
                         1222 1251 1277 1290 1357 1369 1408 1455 1478 1549
                         1578 1578 1599 1603 1605 1696 1735 1799 1815 1852"))
dd  <- data.frame(x)  
## parameters listed in table 2
svec <- list(lambda=9.499e-4,theta=2e-6)

功能

## PDF (as above)
dLE <- function(x,lambda,theta,log=TRUE){
    r <- log(lambda+theta*x)-(lambda*x+(theta/2)*x^2)
    if (log) return(r) else return(exp(r))
}
## CDF (for checking)    
pLE <- function(x,lambda,theta) {
    1-exp(-(lambda*x+(theta/2)*x^2))
}

拟合模型

我使用了method="L-BFGS-B",因为它使设置参数的下界更加容易(这避免了警告)。

m1 <- mle2( x ~ dLE(lambda,theta),
      data=dd,
      start=svec,
      control=list(parscale=unlist(svec)),
      method="L-BFGS-B",
      lower=c(0,0))

结果

coef(m1)
##      lambda        theta 
## 0.000000e+00 1.316733e-06 
-logLik(m1)  ## 305.99 (much better than 335, reported in the paper)

让我们仔细检查一下是否可以从论文中复制该图:

enter image description here

png("SO55032275.png")
par(las=1)
plot(ecdf(dd$x),col="red")
with(svec,curve(pLE(x,lambda,theta),add=TRUE,col=1))
with(as.list(coef(m1)),curve(pLE(x,lambda,theta),add=TRUE,col=3,lty=2))
legend("topleft",col=c(2,1,3),lty=c(NA,1,3),pch=c(16,NA,NA),
       c("ecdf","paper (lam=9e-4, th=2e-6)","ours (lam=0, th=1.3e-6)"))
dev.off()

enter image description here

使用纸张参数绘制的ecdf和CDF匹配;使用此处估计的参数绘制的CDF效果要好得多(实际上,与本文报道的KLE拟合相比,它看起来更好,对数似然率也更低)。我得出的结论是,本文的适用性严重错误。