14.5 Modelo programando en STAN
El código presenta la implementación de un modelo multinomial logístico de área de respuesta utilizando el lenguaje de programación STAN
. En este modelo, se asume que la variable de respuesta en cada dominio sigue una distribución multinomial. Se asume que los parámetros que rigen la relación entre las variables predictoras y la variable de respuesta son diferentes en cada dominio y se modelan como efectos aleatorios.
La sección de functions define una función auxiliar llamada pred_theta()
, que se utiliza para predecir los valores de la variable de respuesta en los dominios no observados. La sección de data
contiene las variables de entrada del modelo, incluyendo el número de dominios, el número de categorías de la variable de respuesta, las estimaciones directas de la variable de respuesta en cada dominio, las covariables observadas en cada dominio y las covariables correspondientes a los dominios no observados.
La sección de parameters define los parámetros desconocidos del modelo, incluyendo la matriz de parámetros beta, que contiene los coeficientes que relacionan las covariables con la variable de respuesta en cada categoría. También se incluyen los desviaciones estándar de los efectos aleatorios.
En la sección de transformed parameters se define el vector de parámetros theta
, que contiene las probabilidades de pertenencia a cada categoría de la variable de respuesta en cada dominio. Se utilizan los efectos aleatorios para ajustar los valores de theta
en cada dominio.
En la sección de model se define la estructura del modelo y se incluyen las distribuciones a priori para los parámetros desconocidos. En particular, se utiliza una distribución normal para los coeficientes de la matriz beta. Finalmente, se calcula la función de verosimilitud de la distribución multinomial para las estimaciones directas de la variable de respuesta en cada dominio.
La sección de generated quantities se utiliza para calcular las predicciones de la variable de respuesta en los dominios no observados utilizando la función auxiliar definida previamente.
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 y_tilde[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> sigma2_u1; // random effects standard deviations
real<lower=0> sigma2_u2; // random effects standard deviations
real
vector[D] u1;
vector[D] u2;// declare L_u to be the Choleski factor of a 2x2 correlation matrix
}
transformed parameters {// vector de parámetros;
simplex[P] theta[D];
real num[D, P];
real den[D];<lower=0> sigma_u1; // random effects standard deviations
real<lower=0> sigma_u2; // random effects standard deviations
real= sqrt(sigma2_u1);
sigma_u1 = sqrt(sigma2_u2);
sigma_u2
for(d in 1:D){
1] = 1;
num[d, 2] = exp(X_obs[d, ] * beta[1, ]' + u1[d]) ;
num[d, num[d, 3] = exp(X_obs[d, ] * beta[2, ]' + u2[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 {~ normal(0, sigma_u1);
u1 ~ normal(0, sigma_u2);
u2 ~ inv_gamma(0.0001, 0.0001);
sigma2_u1 ~ inv_gamma(0.0001, 0.0001);
sigma2_u2
for(p in 2:P){
for(k in 1:K){
-1, k] ~ normal(0, 10000);
beta[p
}
}
for(d in 1:D){
+= multinomial_lpmf(y_tilde[d, ] | theta[d, ]);
target
}
}
generated quantities {
matrix[D1,P] theta_pred;= pred_theta(X_pred, P, beta);
theta_pred }