运行mle2函数时出错(bbmle)

时间:2017-11-01 20:53:13

标签: r mle

从R中的mle2()包运行bbmle函数时收到以下错误:

  

一些参数在边界上:基于Hessian的方差 - 协方差计算可能不可靠

我试图了解这是由于我的数据有问题还是正确调用该功能的问题。不幸的是,我无法发布我的真实数据,因此我使用了相同样本大小的类似工作示例。

我使用的自定义dAction函数是softmax函数。优化必须有上限和下限,所以我使用的是L-BFGS-B方法。

library(bbmle)
set.seed(3939)

### Reproducible data
dat1 <- rnorm(30, mean = 3, sd = 1)
dat2 <- rnorm(30, mean = 3, sd = 1)
dat1[c(1:3, 5:14, 19)] <- 0
dat2[c(4, 15:18, 20:22, 24:30)] <- 0

### Data variables
x <- sample(1:12, 30, replace = TRUE)
pe <- dat1
ne <- dat2

### Likelihood
dAction <- function(x, a, b, t, pe, ne, log = FALSE) {
  u <- exp(((x - (a * ne) - (b * pe)) / t))
  prob <- u / (1 + u)

  if(log) return(prob) else return(-sum(log(prob)))
}

### Fit
fit <- mle2(dAction,
            start = list(a = 0.1, b = 0.1, t = 0.1),
            data = list(x = x, pe = pe, ne = ne),
            method = "L-BFGS-B",
            lower = c(a = 0.1, b = 0.1, t = 0.1),
            upper = c(a = 10, b = 1, t = 10))

Warning message:
In mle2(dAction, start = list(a = 0.1, b = 0.1, t = 0.1), data = list(x = x,  :
  some parameters are on the boundary: variance-covariance calculations based on Hessian may be unreliable

以下是summary()的结果:

summary(fit)
Maximum likelihood estimation

Call:
mle2(minuslogl = dAction, start = list(a = 0.1, b = 0.1, t = 0.1), 
    method = "L-BFGS-B", data = list(x = x, pe = pe, ne = ne), 
    lower = c(a = 0.1, b = 0.1, t = 0.1), upper = c(a = 10, b = 1, 
        t = 10))

Coefficients:
  Estimate Std. Error z value Pr(z)
a      0.1         NA      NA    NA
b      0.1         NA      NA    NA
t      0.1         NA      NA    NA

-2 log L: 0.002048047 

Warning message:
In sqrt(diag(object@vcov)) : NaNs produced

置信区间的结果

confint(fit)
Profiling...

  2.5 %    97.5 %
a    NA 1.0465358
b    NA 0.5258828
t    NA 1.1013322

Warning messages:
1: In sqrt(diag(object@vcov)) : NaNs produced
2: In .local(fitted, ...) :
  Non-positive-definite Hessian, attempting initial std err estimate from diagonals

1 个答案:

答案 0 :(得分:1)

我不完全理解你问题的背景,但是:

问题(无论是否真正的问题在很大程度上取决于我不理解的上述背景)与你的约束有关。如果我们在没有约束的情况下进行拟合:

### Fit
fit <- mle2(dAction,
            start = list(a = 0.1, b = 0.1, t = 0.1),
            data = list(x = x, pe = pe, ne = ne))
            ## method = "L-BFGS-B",
            ## lower = c(a = 0.1, b = 0.1, t = 0.1),
            ## upper = c(a = 10, b = 1, t = 10))

我们得到的系数低于你的界限。

coef(fit)
         a          b          t 
0.09629301 0.07724332 0.02405173 

如果这是正确的,至少有一个约束将是活动的(即当我们适应下界时,我们的参数中至少有一个会达到界限 - 事实上,它们全部都是)。当拟合在边界上时,用于计算置信区间(Wald区间)的最简单机制不起作用。但是,这不会影响您在上面报告的配置文件置信区间估算值。这些都是正确的 - 下限报告为NA,因为置信下限位于边界(如果您愿意,可以将它们替换为0.1)。

如果你没有想到最合适的边界,那我就不知道发生了什么,也许是数据问题。

您的对数似然函数没有错,但它有点混乱,因为您有一个log参数,在log=FALSE(默认值)时返回负对数可能性以及log=TRUE。在我意识到这一点之前,我重新编写了该函数(我还通过尽可能在对数刻度上进行计算使其在数值上更加稳定)。

dAction <- function(x, a, b, t, pe, ne) {
  logu <- (x - (a * ne) - (b * pe)) / t
  lprob <- logu - log1p(exp(logu))
  return(-sum(lprob))
}