使用带向量参数的 `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*
我在尝试进行回归时使用 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*