3.2 Partially known parameters
In some situations, such as when a multivariate probability function
has partially observed outcomes or parameters, it will be necessary to
create a vector mixing known (data) and unknown (parameter) values.
This can be done in Stan by creating a vector or array in the
transformed parameters
block and assigning to it.
The following example involves a bivariate covariance matrix in which the variances are known, but the covariance is not.
data {
int<lower=0> N;
array[N] vector[2] y;
real<lower=0> var1;
real<lower=0> var2;
}transformed data {
real<lower=0> max_cov = sqrt(var1 * var2);
real<upper=0> min_cov = -max_cov;
}parameters {
vector[2] mu;
real<lower=min_cov, upper=max_cov> cov;
}transformed parameters {
matrix[2, 2] Sigma;
1, 1] = var1;
Sigma[1, 2] = cov;
Sigma[2, 1] = cov;
Sigma[2, 2] = var2;
Sigma[
}model {
y ~ multi_normal(mu, Sigma); }
The variances are defined as data in variables var1
and
var2
, whereas the covariance is defined as a parameter in
variable cov
. The \(2 \times 2\) covariance matrix Sigma
is defined as a transformed parameter, with the variances assigned to
the two diagonal elements and the covariance to the two off-diagonal
elements.
The constraint on the covariance declaration ensures that the
resulting covariance matrix sigma
is positive definite. The
bound, plus or minus the square root of the product of the variances,
is defined as transformed data so that it is only calculated once.
The vectorization of the multivariate normal is critical for
efficiency here. The transformed parameter Sigma
could be
defined as a local variable within the model block if
it does not need to be included in the sampler’s output.