在尝试进行回归时,我在使用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
兼容”的前进方向。任何提示将不胜感激。
另外,有没有办法将z
和x
参数传递给我的对数似然函数,以更优雅的方式传递给mle2
,就像我在{{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*