In an earlier post, I explained how to code custom distributions for use in modeling using the programming language Stan. Expanding upon that post, here, I’ll demonstrate how we code a function to generate random values from those distributions.

One direct approach just involves a bit of algebra. As in the earlier post, I’ll again use the three-parameter Weibull distribution. Generally, in the first step, we can set the CDF of the distribution equal to a random value from, say, a uniform distribution \(u \in [0, 1]\), like so:

\[ u = F(\cdot) \] and then solve for the data parameter we want to be generated. Let’s do this for the three-parameter Weibull:

And the log of the above CDF is,

\[ u = 1 - \exp(-\eta (x - \theta)^\lambda) \] Then, to solve for \(x\), we can take the log of each side and rearrange1,

\[ x = \left( \frac{\log(1 - u)}{-\eta} \right)^{\lambda^{-1}} + \theta \]

To code a function that generates a random value from that custom distribution, we can write a function inside the function block as before.

functions {

  real weibull_rng(real eta, real lambda, real theta) {
      real u = uniform_rng(0, 1.0);
      return ( log(1 - u) / -eta ) ^ inv(lambda) + theta;
  }

}

Keep coding, stay curious!


  1. My favorite book to refresh on basic algebra here is Simmons, George F. Precalculus Mathematics in a Nutshell. Geometry, Algebra, Trigonometry. Eugene OR: Resource Publications, 1987.↩︎