5.4 Modelos multiparamétricos
- La distribución normal univariada que tiene dos parámetros: la media \(\theta\) y la varianza \(\sigma^2\).
- La distribución multinomial cuyo parámetro es un vector de probabilidades \(\boldsymbol{\theta}\).
5.4.1 Modelo de unidad: Normal con media y varianza desconocida
Supongamos que se dispone de realizaciones de un conjunto de variables independientes e idénticamente distribuidas \(Y_1,\cdots,Y_n\sim N(\theta,\sigma^2)\). Cuando se desconoce tanto la media como la varianza de la distribución es necesario plantear diversos enfoques y situarse en el más conveniente, según el contexto del problema. En términos de la asignación de las distribuciones previas para \(\theta\) y \(\sigma^2\) es posible:
- Suponer que la distribución previa \(p(\theta)\) es independiente de la distribución previa \(p(\sigma^2)\) y que ambas distribuciones son informativas.
- Suponer que la distribución previa \(p(\theta)\) es independiente de la distribución previa \(p(\sigma^2)\) y que ambas distribuciones son no informativas.
- Suponer que la distribución previa para \(\theta\) depende de \(\sigma^2\) y escribirla como \(p(\theta \mid \sigma^2)\), mientras que la distribución previa de \(\sigma^2\) no depende de \(\theta\) y se puede escribir como \(p(\sigma^2)\).
La distribución previa para el parámetro \(\theta\) será
\[ \begin{equation*} \theta \sim Normal(0,10000) \end{equation*} \]
Y la distribución previa para el parámetro \(\sigma^2\) será
\[ \begin{equation*} \sigma^2 \sim IG(0.0001,0.0001) \end{equation*} \]
La distribución posterior condicional de \(\theta\) es
\[ \begin{equation} \theta \mid \sigma^2,\mathbf{Y} \sim Normal(\mu_n,\tau_n^2) \end{equation} \]
En donde las expresiones para \(\mu_n\) y \(\tau_n^2\) están dados previamente.
En el siguiente enlace enconará el libro: Modelos Bayesianos con R y STAN donde puede profundizar en el desarrollo matemático de los resultados anteriores.
Obejtivo
Estimar el ingreso medio de las personas, es decir,
\[ \bar{Y} = \frac{\sum_Uy_i}{N} \] donde, \(y_i\) es el ingreso de las personas. El estimador de \(\bar{Y}\) esta dado por \[ \hat{\bar{Y}} = \frac{\sum_{s}w_{i}y_{i}}{\sum_s{w_i}} \] y obtener \(\widehat{Var}\left(\hat{\bar{Y}}\right)\).
5.4.1.1 Práctica en STAN
Sea \(Y\) el logaritmo del ingreso
<- encuesta %>%
dataNormal transmute(dam_ee,
logIngreso = log(ingcorte +1)) %>%
filter(dam_ee == 1)
Creando código de STAN
data {<lower=0> n;
int
real y[n];
}
parameters {
real sigma;
real theta;
}
transformed parameters {
real sigma2;= pow(sigma, 2);
sigma2
}
model {~ normal(theta, sigma);
y ~ normal(0, 1000);
theta ~ inv_gamma(0.001, 0.001);
sigma2
}
generated quantities {// vector de longitud n
real ypred[n]; for(kk in 1:n){
= normal_rng(theta,sigma);
ypred[kk]
} }
Preparando el código de STAN
<- "Recursos/Día2/Sesion1/Data/modelosStan/5NormalMeanVar.stan" NormalMeanVar
Organizando datos para STAN
<- list(n = nrow(dataNormal),
sample_data y = dataNormal$logIngreso)
Para ejecutar STAN
en R tenemos la librería rstan
options(mc.cores = parallel::detectCores())
<- stan(
model_NormalMedia file = NormalMeanVar,
data = sample_data,
verbose = FALSE,
warmup = 500,
iter = 1000,
cores = 4
)
saveRDS(model_NormalMedia,"Recursos/Día2/Sesion1/0Recursos/Normal/model_NormalMedia2.rds")
<-
model_NormalMedia readRDS("Recursos/Día2/Sesion1/0Recursos/Normal/model_NormalMedia2.rds")
La estimación del parámetro \(\theta\) y \(\sigma^2\) es:
<- summary(model_NormalMedia,
tabla_Nor2 pars = c("theta", "sigma2", "sigma"))$summary
%>% tba() tabla_Nor2
mean | se_mean | sd | 2.5% | 25% | 50% | 75% | 97.5% | n_eff | Rhat | |
---|---|---|---|---|---|---|---|---|---|---|
theta | 9.0991 | 3e-04 | 0.0099 | 9.0801 | 9.0924 | 9.0989 | 9.1057 | 9.1189 | 1569.114 | 1.0002 |
sigma2 | 0.6318 | 2e-04 | 0.0108 | 0.6101 | 0.6244 | 0.6314 | 0.6392 | 0.6531 | 1935.498 | 0.9991 |
sigma | 0.7948 | 2e-04 | 0.0068 | 0.7811 | 0.7902 | 0.7946 | 0.7995 | 0.8081 | 1935.196 | 0.9991 |
<- as.array(model_NormalMedia, pars = "theta")
posterior_theta mcmc_dens_chains(posterior_theta) +
(mcmc_areas(posterior_theta) ) /
mcmc_trace(posterior_theta)
<- as.array(model_NormalMedia, pars = "sigma2")
posterior_sigma2 mcmc_dens_chains(posterior_sigma2) +
(mcmc_areas(posterior_sigma2) ) /
mcmc_trace(posterior_sigma2)
<- as.array(model_NormalMedia, pars = "sigma")
posterior_sigma mcmc_dens_chains(posterior_sigma) +
(mcmc_areas(posterior_sigma) ) /
mcmc_trace(posterior_sigma)
<- as.array(model_NormalMedia, pars = "ypred") %>%
y_pred_B as_draws_matrix()
<- sample(nrow(y_pred_B), 100)
rowsrandom <- y_pred_B[rowsrandom, ]
y_pred2 ppc_dens_overlay(y = as.numeric(exp(dataNormal$logIngreso)-1), y_pred2) + xlim(0,240000)
5.4.2 Modelo Multinomial
En esta sección discutimos el modelamiento bayesiano de datos provenientes de una distribución multinomial que corresponde a una extensión multivariada de la distribución binomial. Suponga que \(\textbf{Y}=(Y_1,\ldots,Y_p)'\) es un vector aleatorio con distribución multinomial, así, su distribución está parametrizada por el vector \(\boldsymbol{\theta}=(\theta_1,\ldots,\theta_p)'\) y está dada por la siguiente expresión
\[ \begin{equation} p(\mathbf{Y} \mid \boldsymbol{\theta})=\binom{n}{y_1,\ldots,y_p}\prod_{i=1}^p\theta_i^{y_i} \ \ \ \ \ \theta_i>0 \texttt{ , } \sum_{i=1}^py_i=n \texttt{ y } \sum_{i=1}^p\theta_i=1 \end{equation} \] Donde
\[ \begin{equation*} \binom{n}{y_1,\ldots,y_p}=\frac{n!}{y_1!\cdots y_p!}. \end{equation*} \]
Como cada parámetro \(\theta_i\) está restringido al espacio \(\Theta=[0,1]\), entonces es posible asignar a la distribución de Dirichlet como la distribución previa del vector de parámetros. Por lo tanto la distribución previa del vector de parámetros \(\boldsymbol{\theta}\), parametrizada por el vector de hiperparámetros \(\boldsymbol{\alpha}=(\alpha_1,\ldots,\alpha_p)'\), está dada por
\[ \begin{equation} p(\boldsymbol{\theta} \mid \boldsymbol{\alpha})=\frac{\Gamma(\alpha_1+\cdots+\alpha_p)}{\Gamma(\alpha_1)\cdots\Gamma(\alpha_p)} \prod_{i=1}^p\theta_i^{\alpha_i-1} \ \ \ \ \ \alpha_i>0 \texttt{ y } \sum_{i=1}^p\theta_i=1 \end{equation} \]
La distribución posterior del parámetro \(\boldsymbol{\theta}\) sigue una distribución \(Dirichlet(y_1+\alpha_1,\ldots,y_p+\alpha_p)\)
Obejtivo
Sea \(N_1\) el número de personas ocupadas, \(N_2\) Número de personas desocupadas, \(N_3\) es el número de personas inactivas en la población y \(N = N_1 +N_2 + N_3\). Entonces el objetivo es estimar el vector de parámetros \(\boldsymbol{P}=\left(P_{1},P_{2},P_{3}\right)\), con \(P_{k}=\frac{N_{k}}{N}\), para \(k=1,2,3\),
El estimador de \(\boldsymbol{P}\) esta dado por \[ \hat{\boldsymbol{P}} =\left(\hat{P}_{1},\hat{P}_{2},\hat{P}_{3}\right) \] donde, \[ \hat{P}_{k} = \frac{\sum_{s}w_{i}y_{ik}}{\sum_s{w_i}} = \frac{\hat{N}_k}{\hat{N}} \] y \(y_{ik}\) toma el valor 1 cuando la \(i-ésima\) persona responde la \(k-ésima\) categoría (Ocupado o Desocupado o Inactivo). Además, obtener \(\widehat{Var}\left(\hat{P}_{k}\right)\).
5.4.2.1 Práctica en STAN
Sea \(Y\) condición de actividad laboral
<- encuesta %>% filter(condact3 %in% 1:3) %>%
dataMult transmute(
empleo = as_factor(condact3)) %>%
group_by(empleo) %>% tally() %>%
mutate(theta = n/sum(n))
tba(dataMult)
empleo | n | theta |
---|---|---|
Ocupado | 33047 | 0.5267 |
Desocupado | 2371 | 0.0378 |
Inactivo | 27324 | 0.4355 |
donde 1 corresponde a Ocupado, 2 son los Desocupado y 3 son Inactivo
Creando código de STAN
data {<lower=0> k; // Número de cátegoria
int// Número de exitos
int y[k]; // Parámetro de las distribción previa
vector[k] alpha;
}
parameters {
simplex[k] theta;
}
transformed parameters {// Tasa de desocupación
real delta; = theta[2]/ (theta[2] + theta[1]); // (Desocupado)/(Desocupado + Ocupado)
delta
}
model {~ multinomial(theta);
y ~ dirichlet(alpha);
theta
}
generated quantities {
int ypred[k];= multinomial_rng(theta, sum(y));
ypred }
Preparando el código de STAN
<- "Recursos/Día2/Sesion1/Data/modelosStan/6Multinom.stan" Multinom
Organizando datos para STAN
<- list(k = nrow(dataMult),
sample_data y = dataMult$n,
alpha = c(0.5, 0.5, 0.5))
Para ejecutar STAN
en R tenemos la librería rstan
options(mc.cores = parallel::detectCores())
<- stan(
model_Multinom file = Multinom,
data = sample_data,
verbose = FALSE,
warmup = 500,
iter = 1000,
cores = 4
)saveRDS(model_Multinom, "Recursos/Día2/Sesion1/0Recursos/Multinomial/model_Multinom.rds")
<- readRDS("Recursos/Día2/Sesion1/0Recursos/Multinomial/model_Multinom.rds") model_Multinom
La estimación del parámetro \(\theta\) y \(\delta\) es:
<- summary(model_Multinom, pars = c("delta", "theta"))$summary
tabla_Mul1 %>% tba() tabla_Mul1
mean | se_mean | sd | 2.5% | 25% | 50% | 75% | 97.5% | n_eff | Rhat | |
---|---|---|---|---|---|---|---|---|---|---|
delta | 0.0670 | 0 | 0.0013 | 0.0644 | 0.0661 | 0.0670 | 0.0679 | 0.0695 | 1414.051 | 1.0014 |
theta[1] | 0.5268 | 0 | 0.0019 | 0.5231 | 0.5255 | 0.5268 | 0.5280 | 0.5305 | 1692.834 | 0.9989 |
theta[2] | 0.0378 | 0 | 0.0008 | 0.0363 | 0.0373 | 0.0378 | 0.0383 | 0.0393 | 1379.738 | 1.0018 |
theta[3] | 0.4354 | 0 | 0.0019 | 0.4317 | 0.4341 | 0.4354 | 0.4367 | 0.4392 | 1633.676 | 0.9997 |
<- as.array(model_Multinom, pars = "theta[1]")
posterior_theta1 mcmc_dens_chains(posterior_theta1) +
(mcmc_areas(posterior_theta1) ) /
mcmc_trace(posterior_theta1)
<- as.array(model_Multinom, pars = "theta[2]")
posterior_theta2 mcmc_dens_chains(posterior_theta2) +
(mcmc_areas(posterior_theta2) ) /
mcmc_trace(posterior_theta2)
<- as.array(model_Multinom, pars = "theta[3]")
posterior_theta3 mcmc_dens_chains(posterior_theta3) +
(mcmc_areas(posterior_theta3) ) /
mcmc_trace(posterior_theta3)
<- as.array(model_Multinom, pars = "delta")
posterior_delta mcmc_dens_chains(posterior_delta) +
(mcmc_areas(posterior_delta) ) /
mcmc_trace(posterior_delta)
La imagen es muy pesada no se carga al repositorio.
<- nrow(dataMult)
n <- as.array(model_Multinom, pars = "ypred") %>%
y_pred_B as_draws_matrix()
<- sample(nrow(y_pred_B), 100)
rowsrandom <- y_pred_B[rowsrandom, 1:n]
y_pred2 ppc_dens_overlay(y = as.numeric(dataMult$n), y_pred2)