15.2 Modelo programando en STAN
El código se divide en varios bloques:
El primer bloque especifica las funciones que se utilizarán en el modelo. En este caso, solo hay una función llamada
pred_theta
, que toma una matriz de covariables, un número de categorías y una matriz de parámetros beta y devuelve una matriz de parámetrostheta
.El segundo bloque define los datos de entrada que se utilizarán en el modelo. Se especifica el número de dominios, categorías y regresores, y se proporcionan las matrices de datos observados y covariables observadas.
El tercer bloque especifica los parámetros del modelo. En este caso, se incluyen la matriz de parámetros beta, las desviaciones estándar de los efectos aleatorios, la matriz de correlación de los efectos aleatorios y la matriz de efectos aleatorios.
El cuarto bloque transforma los parámetros para asegurar que los efectos aleatorios tengan la matriz de correlación deseada y calcula los parámetros
theta
.El quinto bloque define el modelo. En este caso, se incluye una distribución previa para los parámetros beta, las desviaciones estándar y la matriz de correlación, así como la verosimilitud de la distribución multinomial para los datos observados.
El sexto bloque genera las cantidades posteriores a partir de los parámetros estimados. En este caso, se incluye la matriz de parámetros theta para los datos de predicción y la matriz de correlación de los efectos aleatorios.
functions {pred_theta(matrix Xp, int p, matrix beta){
matrix = rows(Xp);
int D1
real num1[D1, p];
real den1[D1];
matrix[D1,p] theta_p;
for(d in 1:D1){
1] = 1;
num1[d, 2] = exp(Xp[d, ] * beta[1, ]' ) ;
num1[d, num1[d, 3] = exp(Xp[d, ] * beta[2, ]' ) ;
= sum(num1[d, ]);
den1[d]
}
for(d in 1:D1){
for(i in 2:p){
= num1[d, i]/den1[d];
theta_p[d, i]
}1] = 1/den1[d];
theta_p[d,
}
return theta_p ;
}
}
data {<lower=1> D; // número de dominios
int<lower=1> P; // categorías
int<lower=1> K; // cantidad de regresores
int// matriz de datos
int hat_y[D, P]; // matriz de covariables
matrix[D, K] X_obs; <lower=1> D1; // número de dominios
int// matriz de covariables
matrix[D1, K] X_pred;
}
parameters {-1, K] beta;// matriz de parámetros
matrix[P<lower=0>[P-1] sigma_u; // random effects standard deviations
vector// declare L_u to be the Choleski factor of a 2x2 correlation matrix
-1] L_u;
cholesky_factor_corr[P-1, D] z_u;
matrix[P
}
transformed parameters {// vector de parámetros;
simplex[P] theta[D];
real num[D, P];
real den[D];// this transform random effects so that they have the correlation
// matrix specified by the correlation matrix above
-1, D] u; // random effect matrix
matrix[P= diag_pre_multiply(sigma_u, L_u) * z_u;
u
for(d in 1:D){
1] = 1;
num[d, 2] = exp(X_obs[d, ] * beta[1, ]' + u[1, d]) ;
num[d, num[d, 3] = exp(X_obs[d, ] * beta[2, ]' + u[2, d]) ;
= sum(num[d, ]);
den[d]
}
for(d in 1:D){
for(p in 2:P){
= num[d, p]/den[d];
theta[d, p]
}1] = 1/den[d];
theta[d,
}
}
model {~ lkj_corr_cholesky(1); // LKJ prior for the correlation matrix
L_u to_vector(z_u) ~ normal(0, 10000);
~ inv_gamma(0.0001, 0.0001);
sigma_u
for(p in 2:P){
for(k in 1:K){
-1, k] ~ normal(0, 10000);
beta[p
}
}
for(d in 1:D){
+= multinomial_lpmf(hat_y[d, ] | theta[d, ]);
target
}
}
generated quantities {
matrix[D1,P] theta_pred;2, 2] Omega;
matrix[= L_u * L_u'; // so that it return the correlation matrix
Omega
theta_pred = pred_theta(X_pred, P, beta);
}