Hi Everyone,
I have developed a hierarchical Beta bivariate mixture model with gaussian copula. And I need it to constrain it so that the only possible values are in between .01, and .99. However, it does not work. Can someone sense why?
Model below.
functions {
real gaussian_copula_density(real u_x, real u_y, real rho) {
real constrained_u_x = fmin(fmax(u_x, 1e-10), 1 - 1e-10);
real constrained_u_y = fmin(fmax(u_y, 1e-10), 1 - 1e-10);
real constrained_rho = fmin(fmax(rho, -0.999), 0.999);
real rho_sq = square(constrained_rho);
real one_m_rho_sq = 1 - rho_sq;
real z_x = inv_Phi(constrained_u_x);
real z_y = inv_Phi(constrained_u_y);
real log_term1 = -log(2 * pi()) - 0.5 * log1m(rho_sq);
real log_term2 = -0.5 * (square(z_x) + square(z_y) - 2 * constrained_rho * z_x * z_y) / one_m_rho_sq;
real copula_density = exp(log_term1 + log_term2);
return fmax(copula_density, 1e-12);
}
}
data {
int<lower=1> K;
int<lower=1> N;
int<lower=1> I;
array[I, N] real<lower=0> y;
array[I, N] real<lower=0> x;
array[I, K] real<lower=0> alphax;
array[I, K] real<lower=0> betax;
array[I, K] real<lower=0> alphay;
array[I, K] real<lower=0> betay;
array[I] row_vector<lower=0.04>[K] theta;
array[I, K] real<lower=-1, upper=1> rho;
}
transformed data {
real w_min = 0.01;
real w_max = 1 - (K-1) * w_min;
}
parameters {
row_stochastic_matrix[I, K] v;
}
transformed parameters {
row_stochastic_matrix[I, K] w = w_min + w_max * v;
}
model {
for (i in 1:I) {
v[i] ~ dirichlet(theta[i]);
}
for (i in 1:I) {
for (n in 1:N) {
row_vector[K] log_w = log(w[i]);
row_vector[K] lps = log_w;
for (k in 1:K) {
real beta_x = beta_lpdf(x[i, n] | alphax[i, k], betax[i, k]);
real beta_y = beta_lpdf(y[i, n] | alphay[i, k], betay[i, k]);
real u_x = beta_cdf(x[i, n] | alphax[i, k], betax[i, k]);
real u_y = beta_cdf(y[i, n] | alphay[i, k], betay[i, k]);
real copula_density = gaussian_copula_density(u_x, u_y, rho[i, k]);
lps[k] += beta_x + beta_y + log(copula_density);
}
target += log_sum_exp(lps);
}
}
}
generated quantities {
array[I, N] real x_rep;
array[I, N] real y_rep;
array[I, N] real log_lik;
array[I, N, K] real w_prob;
for (i in 1:I) {
for (n in 1:N) {
vector[K] ps;
vector[K] lps;
for (k in 1:K) {
real beta_x = beta_lpdf(x[i, n] | alphax[i, k], betax[i, k]);
real beta_y = beta_lpdf(y[i, n] | alphay[i, k], betay[i, k]);
real u_x = beta_cdf(x[i, n] | alphax[i, k], betax[i, k]);
real u_y = beta_cdf(y[i, n] | alphay[i, k], betay[i, k]);
real copula_density = gaussian_copula_density(u_x, u_y, rho[i, k]);
lps[k] = log(w[i, k]) + beta_x + beta_y + log(copula_density);
ps[k] = w[i, k] * exp(beta_x + beta_y) * copula_density;
}
ps = ps / sum(ps);
log_lik[i, n] = log_sum_exp(lps);
for (k in 1:K) {
w_prob[i, n, k] = ps[k];
}
int comp = categorical_rng(ps);
x_rep[i, n] = beta_rng(alphax[i, comp], betax[i, comp]);
y_rep[i, n] = beta_rng(alphay[i, comp], betay[i, comp]);
}
}
}