9.1 Modelo de Fay Herriot de variable respuesta beta.
El modelo beta-logístico fue inicialmente considerado por Jiang y Lahiri (2006b) para un enfoque EBP en uno de sus ejemplos ilustrativos para estimar medias de dominio de población finita.
El modelo Fay Herriot beta-logístico estaría dado por las siguientes expresiones \[ \begin{eqnarray*} \hat{p}_{d} \mid P_d & \sim & beta(a_d, b_d)\\ \end{eqnarray*} \] La función del enlace es \[ \begin{eqnarray*} logit(P_{d}) \mid \boldsymbol{\beta}, \sigma^2_u & \sim & N(\boldsymbol{x}_d^T\boldsymbol{\beta},\sigma^2_u)\\ \end{eqnarray*} \] Los parámetros \(a_d\) y \(b_d\) son estimados así: \[ \begin{eqnarray*} a_d &=& P_d \times \phi_d\\ b_d &=& (1 - P_d) \times \phi_d\\ \end{eqnarray*} \] donde
\[\phi_d = \frac{n_d}{\widehat{DEFF}_d} -1 = n_{d,efecctivo} -1\]
Las distribuciones previas para \(\boldsymbol{\beta}\) y \(\sigma^2_u\)
\[ \begin{eqnarray*} \beta_k &\sim& N(0, 10000)\\ \sigma^2_u &\sim& IG(0.0001,0.0001) \end{eqnarray*} \]
9.1.1 Procedimiento de estimación
Lectura de la base de datos que resultó en el paso anterior y selección de las columnas de interés
library(tidyverse)
library(magrittr)
<- readRDS("Recursos/Día3/Sesion2/Data/base_FH_2018.rds") %>%
base_FH select(dam2, pobreza, n_eff_FGV)
Lectura de las covariables, las cuales son obtenidas previamente. Dado la diferencia entre las escalas de las variables es necesario hacer un ajuste a estas.
<- readRDS("Recursos/Día3/Sesion2/Data/statelevel_predictors_df_dam2.rds") %>%
statelevel_predictors_df mutate_at(.vars = c("luces_nocturnas",
"cubrimiento_cultivo",
"cubrimiento_urbano",
"modificacion_humana",
"accesibilidad_hospitales",
"accesibilidad_hosp_caminado"),
function(x) as.numeric(scale(x)))
Uniendo las dos bases de datos.
<- full_join(base_FH,statelevel_predictors_df, by = "dam2" )
base_FH tba(base_FH[,1:8] %>% head(10))
dam2 | pobreza | n_eff_FGV | modificacion_humana | accesibilidad_hospitales | accesibilidad_hosp_caminado | cubrimiento_cultivo | cubrimiento_urbano |
---|---|---|---|---|---|---|---|
00101 | 0.2225 | 332.3384 | 3.6127 | -1.1835 | -1.5653 | -1.1560 | 7.2782 |
00201 | 0.1822 | 28.0165 | -0.0553 | 0.4449 | 0.2100 | 0.0684 | -0.0682 |
00206 | 0.3366 | 44.7971 | 0.5157 | -0.1468 | -0.1811 | 1.1894 | -0.1191 |
00301 | 0.4266 | 125.6580 | 0.1364 | 0.5744 | 1.1660 | 0.2836 | -0.1721 |
00302 | 0.4461 | 261.0000 | -0.5103 | 0.2531 | 1.0880 | -0.5047 | -0.3326 |
00303 | 0.5587 | 75.7938 | -0.6591 | 0.6249 | 1.2229 | 0.1100 | -0.3174 |
00304 | 0.5406 | 154.4069 | -0.5573 | 1.4586 | 2.7337 | -0.8314 | -0.2399 |
00401 | 0.3359 | 105.4750 | 0.3979 | -0.0833 | -0.4490 | -0.7770 | 0.1784 |
00402 | 0.1496 | 59.6357 | -0.3661 | -0.0114 | -0.2863 | -0.5372 | -0.2723 |
00403 | 0.4644 | 197.2378 | -1.0446 | 0.4542 | 0.5702 | -0.4029 | -0.4017 |
Seleccionando las covariables para el modelo.
<- c(
names_cov "sexo2" ,
"anoest2" ,
"anoest3",
"anoest4",
"edad2" ,
"edad3" ,
"edad4" ,
"edad5" ,
"tasa_desocupacion" ,
"luces_nocturnas" ,
"cubrimiento_cultivo" ,
"alfabeta"
)
9.1.2 Preparando los insumos para STAN
- Dividir la base de datos en dominios observados y no observados
Dominios observados.
<- base_FH %>% filter(!is.na(pobreza)) data_dir
Dominios NO observados.
<-
data_syn %>% anti_join(data_dir %>% select(dam2))
base_FH tba(data_syn[,1:8] %>% slice(1:10))
dam2 | pobreza | n_eff_FGV | modificacion_humana | accesibilidad_hospitales | accesibilidad_hosp_caminado | cubrimiento_cultivo | cubrimiento_urbano |
---|---|---|---|---|---|---|---|
00202 | NA | NA | -0.3758 | 0.0000 | 0.1482 | -0.2345 | -0.2855 |
00203 | NA | NA | -0.9259 | 0.5732 | -0.1402 | -0.5511 | -0.3822 |
00204 | NA | NA | -1.3166 | 1.1111 | 0.4438 | -0.5027 | -0.3835 |
00205 | NA | NA | -0.7474 | 2.1155 | 1.2271 | -0.5838 | -0.3345 |
00207 | NA | NA | 1.7368 | -0.7648 | -0.4861 | 0.7170 | -0.0609 |
00208 | NA | NA | -0.5942 | 0.3212 | -0.1697 | -0.3627 | -0.3044 |
00209 | NA | NA | -1.5280 | 3.0192 | 1.9428 | -0.8078 | -0.4046 |
00210 | NA | NA | -1.0038 | 0.5778 | 0.2678 | -0.4900 | -0.3898 |
00305 | NA | NA | -0.8480 | 1.5047 | 3.2004 | -0.8621 | -0.3140 |
00404 | NA | NA | -0.5678 | 1.0735 | 0.9856 | -1.1497 | -0.3840 |
- Definir matriz de efectos fijos.
## Dominios observados
<- data_dir[,names_cov]
Xdat
## Dominios no observados
<- data_syn[,names_cov] Xs
- Creando lista de parámetros para
STAN
<- list(
sample_data N1 = nrow(Xdat), # Observados.
N2 = nrow(Xs), # NO Observados.
p = ncol(Xdat), # Número de regresores.
X = as.matrix(Xdat), # Covariables Observados.
Xs = as.matrix(Xs), # Covariables NO Observados
y = as.numeric(data_dir$pobreza),
phi = data_dir$n_eff_FGV - 1
)
- Compilando el modelo en
STAN
library(rstan)
<- "Recursos/Día3/Sesion2/Data/modelosStan/16FH_beta_logitc.stan"
fit_FH_beta_logitic options(mc.cores = parallel::detectCores())
<- stan(
model_FH_beta_logitic file = fit_FH_beta_logitic,
data = sample_data,
verbose = FALSE,
warmup = 500,
iter = 1000,
cores = 4
)saveRDS(model_FH_beta_logitic, file = "Recursos/Día3/Sesion2/Data/model_FH_beta_logitic.rds")
<- readRDS("Recursos/Día3/Sesion2/Data/model_FH_beta_logitic.rds") model_FH_beta_logitic
9.1.2.1 Resultados del modelo para los dominios observados.
En este código, se cargan las librerías bayesplot
, posterior
y patchwork
, que se utilizan para realizar gráficos y visualizaciones de los resultados del modelo.
A continuación, se utiliza la función as.array()
y as_draws_matrix()
para extraer las muestras de la distribución posterior del parámetro theta
del modelo, y se seleccionan aleatoriamente 100 filas de estas muestras utilizando la función sample()
, lo que resulta en la matriz y_pred2.
Finalmente, se utiliza la función ppc_dens_overlay()
de bayesplot
para graficar una comparación entre la distribución empírica de la variable observada pobreza en los datos (data_dir$pobreza
) y las distribuciones predictivas posteriores simuladas para la misma variable (y_pred2
). La función ppc_dens_overlay()
produce un gráfico de densidad para ambas distribuciones, lo que permite visualizar cómo se comparan.
library(bayesplot)
library(patchwork)
library(posterior)
<- as.array(model_FH_beta_logitic, pars = "theta") %>%
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(data_dir$pobreza), y_pred2)
Análisis gráfico de la convergencia de las cadenas de \(\sigma^2_u\).
<- as.array(model_FH_beta_logitic, pars = "sigma2_u")
posterior_sigma2_u mcmc_dens_chains(posterior_sigma2_u) +
(mcmc_areas(posterior_sigma2_u) ) /
mcmc_trace(posterior_sigma2_u)
# traceplot(model_FH_beta_logitic, pars = "sigma2_u",inc_warmup = TRUE)
Estimación del FH de la pobreza en los dominios observados.
<- summary(model_FH_beta_logitic,pars = "theta")$summary %>%
theta_FH data.frame()
%<>% mutate(pred_beta_logit = theta_FH$mean,
data_dir pred_beta_logit_EE = theta_FH$sd,
Cv_pred = pred_beta_logit_EE/pred_beta_logit)
Estimación del FH de la pobreza en los dominios NO observados.
<- summary(model_FH_beta_logitic,pars = "thetapred")$summary %>%
theta_FH_pred data.frame()
<- data_syn %>%
data_syn mutate(pred_beta_logit = theta_FH_pred$mean,
pred_beta_logit_EE = theta_FH_pred$sd,
Cv_pred = pred_beta_logit_EE/pred_beta_logit)
9.1.2.2 Mapa de pobreza
El mapa muestra el nivel de pobreza en diferentes áreas de Colombia, basado en dos variables, pobreza
y pred_beta_logit
.
Primero, se cargan los paquetes necesarios sp
, sf
y tmap.
Luego, se lee la información de los datos en R y se combinan utilizando la función rbind()
.
library(sp)
library(sf)
library(tmap)
<- rbind(data_dir, data_syn) %>%
data_map select(dam2, pobreza, pred_beta_logit, pred_beta_logit_EE,Cv_pred )
## Leer Shapefile del país
<- read_sf("Recursos/Día3/Sesion2/Shape/DOM_dam2.shp") %>%
ShapeSAE rename(dam2 = id_dominio) %>%
mutate(dam2 = str_pad(
string = dam2,
width = 5,
pad = "0"
))
<- tm_shape(ShapeSAE %>%
mapa left_join(data_map, by = "dam2"))
<- c(0,0.15, 0.3, 0.45, 0.6, 1)
brks_lp tmap_options(check.and.fix = TRUE)
<-
Mapa_lp + tm_polygons(
mapa c("pobreza", "pred_beta_logit"),
breaks = brks_lp,
title = "Mapa de pobreza",
palette = "YlOrRd",
colorNA = "white"
)
tmap_save(
Mapa_lp,"Recursos/Día3/Sesion2/0Recursos/Beta.PNG",
width = 2000,
height = 1500,
asp = 0
)
Mapa_lp
9.1.2.3 Mapa del coeficiente de variación.
Ahora, se crea un segundo mapa temático (tmap) llamado Mapa_cv. Utiliza la misma estructura del primer mapa (mapa) creado anteriormente y agrega una capa utilizando la función tm_polygons(). El mapa representa la variable Cv_pred, utilizando una paleta de colores llamada “YlOrRd” y establece el título del mapa con el parámetro title. La función tm_layout() establece algunos parámetros de diseño del mapa, como la relación de aspecto (asp). Finalmente, el mapa Mapa_cv se muestra en la consola de R.
<-
Mapa_cv + tm_polygons(
mapa c("Cv_pred"),
title = "Mapa de pobreza(cv)",
palette = "YlOrRd",
colorNA = "white"
)
tmap_save(
Mapa_cv,"Recursos/Día3/Sesion2/0Recursos/Beta_cv.PNG",
width = 2000,
height = 1500,
asp = 0
)
Mapa_cv