14 Computing One Dimensional Integrals
Definite and indefinite one dimensional integrals can be performed in Stan using the integrate_1d
function.
As an example, the normalizing constant of a left-truncated normal distribution is
\[ \int_a^\infty \frac{1}{\sqrt{2 \pi \sigma^2}} e^{-\frac{1}{2}\frac{(x - \mu)^2}{\sigma^2}} \]
To compute this integral in Stan, the integrand must first be defined as a Stan function (see the Stan Reference Manual chapter on User-Defined Functions for more information on coding user-defined functions).
real normal_density(real x, // Function argument
real xc, // Complement of function argument
// on the domain (defined later)
real[] theta, // parameters
real[] x_r, // data (real)
int[] x_i) { // data (integer)
real mu = theta[1];
real sigma = theta[2];
return 1 / (sqrt(2 * pi()) * sigma) * exp(-0.5 * ((x - mu) / sigma)^2);
}
This function is expected to return the value of the integrand evaluated at point x
. The argument xc
is used in definite integrals to avoid loss of precision near the limits of integration and is set to NaN when either limit is infinite (see the section on precision/loss in the chapter on Higher-Order Functions of the Stan Functions Reference for details on how to use this). The argument theta
is used to pass in arguments of the integral that are a function of the parameters in our model. The arguments x_r
and x_i
are used to pass in real and integer arguments of the integral that are not a function of our parameters.
The function defining the integrand must have exactly the argument types and return type of normal_density
above, though argument naming is not important. Even if x_r
and x_i
are unused in the integrand, they must be included in the function signature. This may require passing in zero-length arrays for data or a zero-length vector for parameters if the integral does not involve data or parameters.