Prediction of custom family in distributional modelling context

Please also provide the following information in addition to your question:

  • Operating System: Ubuntu 18.04.1
  • brms Version: 2.5.0

Hello!

I fitted a serie of models using the following reparametrization of gamma distribution :

## Define the new family of distribution
gamma2 <- custom_family(
  "gamma2", dpars = c("mu", "phi"),
  links = c("log", "log"), lb = c(0, 0),
  type = "real"
)

## Reparametrize the gamma
stan_funs <- "
  real gamma2_lpdf(real y, real mu, real phi) {
    return gamma_lpdf(y | mu * mu / phi, mu / phi);
  }
  real gamma2_rng(real mu, real phi) {
    return gamma_rng(mu * mu / phi, mu / phi);
  }
"

Because I used this formulation to fit both simple and distributional models, I twicked the predict function like this :

predict_gamma2 <- function(i, draws, ...) {
  if(is.vector(draws$dpars$phi)){
    mu <- draws$dpars$mu[, i]
    phi <- draws$dpars$phi
    y <- draws$data$Y[i]
    gamma2_rng(mu, phi)
  }
  else{
    mu <- draws$dpars$mu[, i]
    phi <- draws$dpars$phi[, i]
    y <- draws$data$Y[i]
    gamma2_rng(mu, phi)
  }
}

Predict function worked perfectly this spring, but returns now the following error message :

pred <- posterior_predict(models[[trait_prep[1]]], newdata = NewD, robust = T,  allow_new_levels = T)

Error in gamma2_rng(mu, phi) : Expecting a single value: [extent=4000].

Do you have any idea what happen??

Thank you!
Lucas

Your information is not sufficient to answer this question with certainty, but have you tried calling

expose_functions(<your model>, vectorize = TRUE)

If this does not solve your problem, please provide a minimal reproducible example.

Oh my god, so true, I forgot the “vectorize” argument!

Thank you!!