使用带向量参数的 `bbmle:mle2`(已经可以使用 `optim`)

Using `bbmle:mle2` with vector parameters (already works using `optim`)

我在尝试进行回归时使用 bbmle:mle2 函数时遇到了一些问题。为了说明我的问题,我想出了一个玩具示例。

我们为泊松分布(或任何自定义分布)定义负对数似然:

LL <- function(beta, z, x){
  -sum(stats::dpois(x, lambda = exp(z %*% beta), log = TRUE))
}

在上面的代码中,beta 是我想估计的参数向量,z 是一个 model/design 矩阵,x 是我感兴趣的变量。

然后我生成一些随机数据来处理:

set.seed(2)
age <- round(exp(rnorm(5000, mean = 2.37, sd = 0.78) - 1))
claim <- rpois(5000, lambda = 0.07

我可以轻松地使用 optim 进行回归。这是 intercept 唯一的型号:

z1 <- model.matrix(claim ~ 1)
optim(par = 0, fn = LL, z = z1, x = claim)

这里是 intercept + age 型号:

z2 <- model.matrix(claim ~ age)
optim(par = c(0, 0), fn = LL, z = z2, x = claim)

评估大量不同模型的方法非常简单,只需指定模型矩阵即可。如何使其与 bbmle 包中的 mle2 函数一起使用?

我可以做到,如果beta是一维的:

mle2(minuslogl = function(beta){ LL(beta = beta, z = z1, x = claim) },
  start = list(beta = 0))

但是如果beta是一个向量,那么我运行就陷入了问题:

mle2(
  minuslogl = function(beta){ LL(beta = beta, z = z2, x = claim) },
  start = list(beta = c(0, 0)),
  vecpar = T,
  parnames = colnames(z2)
  )

我无法获得正确的语法,也无法在文档或插图中找到任何示例来帮助我。问题肯定是 beta 现在是一个向量。文档建议使用 vecpar = T 参数是 "compatibility with optim" 的前进方向。任何提示将不胜感激。

此外,有没有一种方法可以像我在 optim?

我认为主要问题是您需要提供 start 作为原子向量(而不是列表)。

 library(bbmle)
 LL2 <- function(beta) {
     LL(beta, z = z2, x = claim)
 }
 parnames(LL2) <- colnames(z2)
 mle2(
   minuslogl = LL2 ,
     start = setNames(c(0,0),colnames(z2)),
     vecpar = TRUE
  )

知道您可以在 bbmle 中使用公式界面和 parameters 参数更轻松地实现泊松回归之类的东西可能会有所帮助:

mle2(claim~dpois(exp(loglambda)),     ## use log link/exp inverse-link
     data=data.frame(claim,age),      ## need to specify as data frame
     parameters=list(loglambda~age),  ## linear model for loglambda
     start=list(loglambda=0))         ## start values for *intercept*