在尝试进行回归时,我在使用
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
中所做的那样?
我认为主要问题是您需要提供
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*
如果
claim
遵循非标准分布怎么办?我如何仍然对这种非标准分布的参数采用线性模型,避免命名它们?