24.2 Reparameterizations
Reparameterizations may be implemented directly using the transformed parameters block or just in the model block.
Beta and Dirichlet priors
The beta and Dirichlet distributions may both be reparameterized from a vector of counts to use a mean and total count.
Beta distribution
For example, the Beta distribution is parameterized by two positive
count parameters \(\alpha, \beta > 0\). The following example
illustrates a hierarchical Stan model with a vector of parameters
theta
are drawn i.i.d. for a Beta distribution whose
parameters are themselves drawn from a hyperprior distribution.
parameters {
real<lower=0> alpha;
real<lower=0> beta;
// ...
}model {
alpha ~ ...
beta ~ ...for (n in 1:N) {
theta[n] ~ beta(alpha, beta);
}// ...
}
It is often more natural to specify hyperpriors in terms of transformed parameters. In the case of the Beta, the obvious choice for reparameterization is in terms of a mean parameter \[ \phi = \alpha / (\alpha + \beta) \] and total count parameter \[ \lambda = \alpha + \beta. \] Following @[GelmanEtAl:2013, Chapter 5] the mean gets a uniform prior and the count parameter a Pareto prior with \(p(\lambda) \propto \lambda^{-2.5}\).
parameters {
real<lower=0, upper=1> phi;
real<lower=0.1> lambda;
// ...
}transformed parameters {
real<lower=0> alpha = lambda * phi;
real<lower=0> beta = lambda * (1 - phi);
// ...
}model {
1, 1); // uniform on phi, could drop
phi ~ beta(0.1, 1.5);
lambda ~ pareto(for (n in 1:N) {
theta[n] ~ beta(alpha, beta);
}// ...
}
The new parameters, phi
and lambda
, are declared in the
parameters block and the parameters for the Beta distribution,
alpha
and beta
, are declared and defined in the
transformed parameters block. And If their values are not of interest,
they could instead be defined as local variables in the model as
follows.
model {
real alpha = lambda * phi
real beta = lambda * (1 - phi);
// ...
for (n in 1:N) {
theta[n] ~ beta(alpha, beta);
}// ...
}
With vectorization, this could be expressed more compactly and efficiently as follows.
model {
1 - phi));
theta ~ beta(lambda * phi, lambda * (// ...
}
If the variables alpha
and beta
are of interest, they
can be defined in the transformed parameter block and then used in the
model.
Jacobians not necessary
Because the transformed parameters are being used, rather than given a
distribution, there is no need to apply a Jacobian adjustment for the
transform. For example, in the beta distribution example,
alpha
and beta
have the correct posterior distribution.
Dirichlet priors
The same thing can be done with a Dirichlet, replacing the mean for the Beta, which is a probability value, with a simplex. Assume there are \(K > 0\) dimensions being considered (\(K=1\) is trivial and \(K=2\) reduces to the beta distribution case). The traditional prior is
parameters {
vector[K] alpha;
array[N] simplex[K] theta;
// ...
}model {
// ...
alpha ~ for (n in 1:N) {
theta[n] ~ dirichlet(alpha);
} }
This provides essentially \(K\) degrees of freedom, one for each
dimension of alpha
, and it is not obvious how to specify a
reasonable prior for alpha
.
An alternative coding is to use the mean, which is a simplex, and a total count.
parameters {
simplex[K] phi;
real<lower=0> kappa;
array[N] simplex[K] theta;
// ...
}transformed parameters {
vector[K] alpha = kappa * phi;
// ...
}model {
// ...
phi ~ // ...
kappa ~ for (n in 1:N) {
theta[n] ~ dirichlet(alpha);
}// ...
}
Now it is much easier to formulate priors, because phi
is the
expected value of theta
and kappa
(minus K
) is
the strength of the prior mean measured in number of prior observations.
Transforming unconstrained priors: probit and logit
If the variable \(u\) has a \(\textsf{uniform}(0, 1)\) distribution, then \(\operatorname{logit}(u)\) is distributed as \(\textsf{logistic}(0, 1)\). This is because inverse logit is the cumulative distribution function (cdf) for the logistic distribution, so that the logit function itself is the inverse CDF and thus maps a uniform draw in \((0, 1)\) to a logistically-distributed quantity.
Things work the same way for the probit case: if \(u\) has a \(\textsf{uniform}(0, 1)\) distribution, then \(\Phi^{-1}(u)\) has a \(\textsf{normal}(0, 1)\) distribution. The other way around, if \(v\) has a \(\textsf{normal}(0, 1)\) distribution, then \(\Phi(v)\) has a \(\textsf{uniform}(0, 1)\) distribution.
In order to use the probit and logistic as priors on variables
constrained to \((0, 1)\), create an unconstrained variable and
transform it appropriately. For comparison, the following Stan
program fragment declares a \((0, 1)\)-constrained parameter
theta
and gives it a beta prior, then uses it as a parameter in
a distribution (here using foo
as a placeholder).
parameters {
real<lower=0, upper=1> theta;
// ...
}model {
theta ~ beta(a, b);// ...
y ~ foo(theta);// ...
}
If the variables a
and b
are one, then this imposes
a uniform distribution theta
. If a
and b
are
both less than one, then the density on theta
has a U shape,
whereas if they are both greater than one, the density of theta
has an inverted-U or more bell-like shape.
Roughly the same result can be achieved with unbounded parameters that are probit or inverse-logit-transformed. For example,
parameters {
real theta_raw;
// ...
}transformed parameters {
real<lower=0, upper=1> theta = inv_logit(theta_raw);
// ...
}model {
theta_raw ~ logistic(mu, sigma);// ...
y ~ foo(theta);// ...
}
In this model, an unconstrained parameter theta_raw
gets a
logistic prior, and then the transformed parameter theta
is
defined to be the inverse logit of theta_raw
. In this
parameterization, inv_logit(mu)
is the mean of the implied
prior on theta
. The prior distribution on theta
will be
flat if sigma
is one and mu
is zero, and will be
U-shaped if sigma
is larger than one and bell shaped if
sigma
is less than one.
When moving from a variable in \((0, 1)\) to a simplex, the same trick may be performed using the softmax function, which is a multinomial generalization of the inverse logit function. First, consider a simplex parameter with a Dirichlet prior.
parameters {
simplex[K] theta;
// ...
}model {
theta ~ dirichlet(a);// ...
y ~ foo(theta); }
Now a
is a vector with K
rows, but it has the same shape
properties as the pair a
and b
for a beta; the beta
distribution is just the distribution of the first component of a
Dirichlet with parameter vector \([a b]^{\top}\). To formulate an
unconstrained prior, the exact same strategy works as for the beta.
parameters {
vector[K] theta_raw;
// ...
}transformed parameters {
simplex[K] theta = softmax(theta_raw);
// ...
}model {
theta_raw ~ multi_normal_cholesky(mu, L_Sigma); }
The multivariate normal is used for convenience and efficiency with
its Cholesky-factor parameterization. Now the mean is controlled by
softmax(mu)
, but we have additional control of covariance
through L_Sigma
at the expense of having on the order of \(K^2\)
parameters in the prior rather than order \(K\). If no covariance is
desired, the number of parameters can be reduced back to \(K\) using a
vectorized normal distribution as follows.
theta_raw ~ normal(mu, sigma);
where either or both of mu
and sigma
can be vectors.