# Inverse Lognormal CDF

We use this function in our likelihood model, but it’s unavailable in the Stan function library. If someone needs this function in the meantime, this is a user-defined function for calculating it (where x is the vector of input values, m is the mu parameter, and s is the sigma parameter):

``````functions {

//custom function for lognormal inverse CDF
row_vector logncdfinv(row_vector x, real m, real s) {

int sz;												    //declaring size variable
sz = size(x);											//calculating size variable
row_vector[sz] y;										//declaring return variable
y = exp( s .* sqrt(2) .* inv_erfc( -2 .* x + 2 ) + m ); //calculating result

return y;											    //returning result

}

``````

Note: can be fairly easily rewritten to accept real values instead of a row vector of values by declaring x as a real instead of a row vector in the input, getting rid of the two lines declaring and calculating sz, and declaring y as a real instead of a row vector.

3 Likes

Thanks @Corey.Plate. Maybe a candidate for @spinkney’s GitHub - spinkney/helpful_stan_functions?

1 Like

The inverse cdfs are slowly making their way into Stan. They’ll be called `_qf` for quantile functions. You can now also overload function signatures to have different types so you could specify one for a vector x, another with row vector x, real x, array real x, etc. Similarly you can make overloads for m and s.

I might rewrite that function as a one liner.

``````vector log_normal_qf(vector x, real m, real s) {
return exp( s * sqrt(2) * inv_erfc( -2 * x + 2 ) + m );
}
``````

But I like having the explicit size declaration of int N = rows(x) to show what the expected output size is without inspecting the function.

3 Likes