将 `bbmle:mle2` 与向量参数一起使用(已经可以使用 `optim`)

问题描述 投票:0回答:2

在尝试进行回归时,我在使用

bbmle:mle2
函数时遇到一些问题。为了说明我的问题,我想出了一个玩具示例。

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

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
兼容”的前进方向。任何提示将不胜感激。

另外,有没有办法以更优雅的方式将我的对数似然函数中的

z
x
参数传递给
mle2
,就像我在
optim
中所做的那样?

r optimization regression mle
2个回答
5
投票

我认为主要问题是您需要提供

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*

0
投票

如果

claim
遵循非标准分布怎么办?我如何仍然对这种非标准分布的参数采用线性模型,避免命名它们?

© www.soinside.com 2019 - 2024. All rights reserved.