// latent_factors.stan data { int n; // number of observations int p; // number of grid points array[n] vector[p] X; // data matrix int k; // number of latent factors real a; real b; } parameters { vector[p] Sigma; // diagonal Sigma matrix[p, k] Lambda; // factor loadings } transformed parameters{ matrix[p, p] Omega = Lambda * Lambda' + diag_matrix(Sigma); } model { Sigma ~ inv_gamma(a,b); X ~ multi_normal(rep_vector(0, p), Omega); }