使用带有向量参数的`bbmle:mle2`(已经使用`optim`工作)

时间:2017-07-25 10:42:57

标签: r optimization regression mle

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

我们定义Poisson分布(或任何自定义分布)的负对数似然:

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

在上面的代码中,beta是我想要估算的参数向量,z是模型/设计矩阵,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)

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

如果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参数是“与optim兼容”的前进方向。任何提示将不胜感激。

另外,有没有办法将zx参数传递给我的对数似然函数,以更优雅的方式传递给mle2,就像我在{{1}中所做的那样}}?

1 个答案:

答案 0 :(得分:3)

我认为主要问题是您需要提供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可以更加轻松地实现Poisson回归等功能,这可能会有所帮助:

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*