Multivariate Skew Normal


Hi guys,

I am having to adapt a multivariate normal model into a skew multivariate normal model. I note that a SMN pdf is not yet part of Stan, however it does make an appearance in the manual on page 346:

This reparameterization of a multivariate normal distribution in terms of standard normal variates can be extended to other multivariate distributions… such as the skew multivariate normal distribution.

Are there any examples or similar I might have missed to that would show what form of reparameterisation would be correct for a multivariate skew normal, it is definitely not obvious to me!




Yeah, I came across that article from a similar topic, however I found it rather opaque to understand what to extract from it unfortunately. Any pointers you can give me?

I think 5.1 is the relevant section, so would this be a correct way of reading their paper. I’ve mocked up a similar model on my workstation and been unable to convincing results, so I might be misunderstanding.

// Fitting a population of  K dimensional events to a multivariate skew normal
data {
    int<lower=2> K;
    int n_obs;
    vector[K] obs [n_obs];
parameters {
     vector[K] means;
     vector[K] sigmas;
     cholesky_factor_corr[K, K] correlation;
     vector[K] shapes;
transformed_parameters {
    matrix[K,K] cov;
    row_vector[K] offsets;

    cov = diag_pre_multiply(sigmas, correlation);           // From after Eq 10
    offsets = shape' *  diag_matrix(inv(sigmas));   // From Eq 10

model {
    for (i in 1:n_obs) {
        target += normal_lpdf(obs[i] | means, cov) + normal_lcdf(offsets * (obs[i] - means) | 0, 1);


I think it is

data {
  int<lower=0> N;
  int<lower=2> K;
  vector[K] Y[N];
parameters {
  vector[K] xi;
  vector<lower=0>[K] omega;
  vector[K] alpha;
  cholesky_factor_corr[K] L;
model {
  target += multi_normal_cholesky_lpdf(Y | xi, diag_pre_multiply(omega, L));
  for (i in 1:N)
    target += normal_lcdf(dot_product(alpha, (Y[i] - xi) ./ omega) | 0, 1);
  // priors  


Ah yes, this is a much better implementation! Thank you for the help!