Multivariate Skew Normal

#1

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!

Cheers

#2

#3

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);
}
}``````

#4

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
}
``````

#5

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