【问题标题】:Error when running mle2 function (bbmle)运行 mle2 函数时出错 (bbmle)
【发布时间】:2022-05-12 05:39:03
【问题描述】:

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

一些参数在边界上:基于 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

【问题讨论】:

    标签: r mle


    【解决方案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))
    }
    

    【讨论】:

    • 我正在遵循论文中描述的模型。在本文中,a、b 和 t 的估计值在我上面指定的上下限范围内以 0.1 为单位离散化。变量的真正下限实际上是 0,但是当我在函数中输入它时出现错误。所以我决定将下限向上移动到下一个单位,即 0.1。所以小于 0.1 的值并不完全出乎意料......但我不确定如何处理离散化输出而不是舍入到最接近的 0.1。如果我这样做,a、b 和 t 将具有相同的值。
    • 很难知道没有更多信息。离散化的真正目的是什么?是否只是出于计算原因(例如,他们在网格上搜索,或者下游计算的一部分涉及对一个体积进行积分,或者......)?您的数据是否与那里的单位/范围相同?能给个参考吗?
    • 我在自己的数据上无限制地运行了函数(没有离散化)并得到了类似的结果。 a、b 和 t 的估计值非常接近边界,如果我通过我的原始函数(在对数转换之前)运行它,它会为 uprob &lt;- u / (1+ u) 产生一个非常大的值,因此渐近接近 1。概率对于绝对不正确的一切,它只是 1。我知道这现在已经超出了我的问题范围,但我会很感激任何关于从这里去哪里的建议。感谢您的时间和帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    • 2020-12-31
    相关资源
    最近更新 更多