How to get fitted values on the response scale for truncated 'asym_laplace' models

Dear all,

I’m using a truncated quantile (median) regression (using asym_laplace) of the type

bf(Y | trunc(lb = 0) ~ 1 + x + (1 | id1) + (1 + x | id2), quantile = 0.5),

and would like to get conditional effects via marginal_effects. brms tells me

Error: Fitted values on the respone scale not yet implemented for truncated 'asym_laplace' models.

My question: How difficult and effortful would it be (for me?) to properly implement that functionality and how would I approach this? And if it’s too difficult and effortful, is there a workaround I can use to create the kind of data marginal_effects is producing?


  • Operating System: macOS 10.14.6
  • brms Version: 2.10.0

What you need is mainly a formula for the mean of a truncated asymmetric laplace distribution.

I wasn’t able to find a closed-form formula online, but I found a numerical solution based on this paper: (see p. 3)

dtrunc <- function(x,
                   a = -Inf,
                   b = Inf,
  tt <- rep(0, length(x))
  g <- get(paste("d", spec, sep = ""), mode = "function")
  G <- get(paste("p", spec, sep = ""), mode = "function")
  tt[x >= a & x <= b] <-
    g(x[x >= a & x <= b], ...) / (G(b, ...) - G(a, ...))

extrunc <- function(spec, a = -Inf, b = Inf, ...)
  f <- function(x)
    x * dtrunc(x, spec, a = a, b = b, ...)
  return(integrate(f, lower = a, upper = b)$value)

This then seems to work with brms’s dasym_laplace and pasym_laplace

extrunc("asym_laplace", mu = 1, a = 0) 

This approach seems generic enough to support any kind of truncated distributions that brms already supports in a non-truncated way.

Looking at vignette("brms_customfamilies") it seems to me that the quick fix would be to add a function fitted_trunc_asym_laplace in fitted.R.

fitted_trunc_asym_laplace <- function(draws, lb, ub) {

Or would it make more sense to replace dasym_laplace, pasym_laplace, qasym_laplace, and rasym_laplace in distributions.R with versions that can handle truncation? Or is this irrelevant for postprocessing?

Computing the truncated density is not a problem and brms does that already for arbitary models

The remaining problem is the truncated mean. Of course numerical integration, as done in extrunc is always a brute force solution but remember that this needs to be done for each single posterior draws of each single observation, which will be highly inefficient.

OK. Then simply focussing on the use case of me creating a workaround (where I accept the inefficiency of the numerical approach), that is, not a general solution for brms, would it be sufficient to implement it in

fitted_trunc_asym_laplace <- function(draws, lb, ub) {


Yes it should be sufficient.

1 Like