What is the most efficient way to allow a user to pass a custom function to the likelihood?
Here is one way I have done it.
extractValue <- function(x, y){
if(!is.null(x)) return(x)
return(y)
}
mycars_bayeslm <- function(sd_prior = NULL, beta_priors = NULL){
dprior_sd <- extractValue(sd_prior, function(x){dgamma(1, 1, log = TRUE)})
dprior_beta <- extractValue(sd_prior, function(x){sum(dnorm(0, 10, log = TRUE))})
parinit <- list(beta = c(0,0), sd = 5)
negll <- function(pars){
getAll(cars, pars)
-sum(dnorm(dist, beta[1] + beta[2] * speed, sd, log = TRUE)) - dprior_sd(sd) - dprior_beta(beta)
}
obj <- MakeADFun(negll, parinit)
return(obj)
}
obj1 <- mycars_bayeslm()
obj2 <- mycars_bayeslm(sd_prior = function(x){dnorm(x[1], 1, 10, log = TRUE)})
If I am not explicit about returning a scalar, then it does not work, which is minorly annoying.
obj3 <- mycars_bayeslm(sd_prior = function(x){dnorm(x, 1, 10, log = TRUE)})
Does anyone have a better solution? Any suggestions? Thanks so much.