r - Using `bbmle:mle2` with vector parameters (already works using `optim`) -
i having trouble using bbmle:mle2
function when trying regression. illustrate problem, have come toy example.
we define minus log-likelihood poisson distribution (or custom distribution):
ll <- function(beta, z, x){ -sum(stats::dpois(x, lambda = exp(z %*% beta), log = true)) }
in code above, beta
parameter vector estimate, z
model/design matrix , x
variable of interest.
i generate random data work with:
set.seed(2) age <- round(exp(rnorm(5000, mean = 2.37, sd = 0.78) - 1)) claim <- rpois(5000, lambda = 0.07
i can use optim
regression. here intercept
model:
z1 <- model.matrix(claim ~ 1) optim(par = 0, fn = ll, z = z1, x = claim)
here intercept + age
model:
z2 <- model.matrix(claim ~ age) optim(par = c(0, 0), fn = ll, z = z2, x = claim)
the way large number of different models can assessed quite easy, 1 has specify model matrix. how can made work mle2
function bbmle
package?
i can it, if beta
one-dimensional:
mle2(minuslogl = function(beta){ ll(beta = beta, z = z1, x = claim) }, start = list(beta = 0))
but if beta
vector, run problems:
mle2( minuslogl = function(beta){ ll(beta = beta, z = z2, x = claim) }, start = list(beta = c(0, 0)), vecpar = t, parnames = colnames(z2) )
i cannot syntax right , cannot find examples in documentation or vignettes me. problem surely beta
vector now. documentation suggests using vecpar = t
argument way forward "compatibility optim
". tips appreciated.
also, there way pass z
, x
arguments in log-likelihood function in more elegant way mle2
have done in optim
?
i think main problem need provide start
atomic vector (not list).
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 )
it might know can implement poisson regression more in bbmle
formula interface , parameters
argument:
mle2(claim~dpois(exp(loglambda)), ## use log link/exp inverse-link data=data.frame(claim,age), ## need specify data frame parameters=list(loglambda~age), ## linear model loglambda start=list(loglambda=0)) ## start values *intercept*
Comments
Post a Comment