17  🍫 Postre

“The existence of a problem in knowledge depends on the future being different from the past, while the possibility of a solution of the problem depends on the future being like the past.”
– Frank Knight

📅 Publicado 10 Junio 2018, Actualizado 10 Febrero 2022

El postre busca lograr lo que los anteriores no pudieron: estimar qué tan probable es que gane uno u otro candidato. Para hacer eso el postre le aplica una transformación sencillita al Plato Simple: en vez de servir dos recetas por candidato, se sirve un solo postre logístico para ambos. Esto genera un pronóstico probabilístico para la segunda vuelta.

¿Por qué hacerlo así? Porque según las encuestas la victoria es clara para Duque: todas coinciden en que el candidato de la coalición de derecha obtiene una mayor proporción de votos que su contrincante. Es más, el resultado del Plato Mixto, al que mejor le fue en la primera vuelta, si es aplicado a las encuestas que salieron después del 27 de mayo da como resultado que Duque obtendrá 51% de la votación, con un rango intervalo HPD de 95% de entre 46% y 57%, y Petro obtendría 37%, con un rango HPD de 95% entre 34% y 41%. Así que en vez de decir lo obvio, nos vamos por lo menos evidente, aunque sea más difícil de masticar.


Postre Logístico


Este postre recoge la probabilidad de que @IvanDuque sea presidente, estimada por el modelo que se describe abajo.

Estas probabilidades salen de sacar muchas simulaciones de cada uno de los parámetros del modelo estimado. El resultado es una densidad de la probabilidad de que Duque obtenga más de 50% de la votación. La distribución parece bimodal porque unas encuestas le dan menos de 50% de la votación a Duque, pero el grueso dice lo contrario: en 20% de las simulaciones el modelo estima que Duque gana con más o menos 53% de probabilidad.

Important

@IvanDuque tiene más o menos 65% de probabilidad de obtener más del 50% de la votación.

Ingredientes


Los únicos ingredientes de esta receta son las encuestas que han salido desde la primera vuelta. Como priors se toman los promedios y desviaciones estándar de cada candidato.

Receta


Este postre modela directamente las encuestas como una distribución binomial donde cada encuesta es un ensayo:

\[ N^{Duque}_i \sim \textrm{Binomial}(N_i, \pi^{Duque}_i) \] donde \(N_i\) es la muestra de cada encuesta y \(\pi^{Duque}_i\) es la proporción de la intención de voto para Iván Duque.

Ahora, la proporción de intención de voto para Duque \(\pi^{Duque}_i\) se determina a través de una función logística (log-link function) y, como es costumbre en este recetario, efectos aleatorios por encuestadora así:

\[\textrm{logit} (\pi^{Duque}_i) = \alpha_{encuestadora}\]

Preparación


Este es el postre completo, con los priors del caso:
\[ N^{Duque}_i \sim \textrm{Binomial}(N_i, \pi^{Duque}_i) \] \[\textrm{logit} (\pi^{Duque}_i) = \alpha_{encuestadora}\] \[\small\alpha_{encuestadora} \sim Normal(\alpha,\sigma) \] \[\small\alpha \sim Normal(50, 5) \] \[\small\sigma \sim HalfCauchy(0,5) \]

Estimación


Este es el modelo en el siempre espeluznante código de RStan:

Code
data{
    int<lower=1> N;
    int<lower=1> N_encuestadora;
    int id[N];
    int muestra_int_voto[N];
    int encuestadora[N];
}
parameters{
    vector[N_encuestadora] a;
    real<lower=0> s;
}
model{
    vector[N] p;
    s ~ cauchy( 0 , 5 );
    a ~ normal( 50 , 5 );
    a ~ normal( a , s );
    for ( i in 1:N ) {
        p[i] = a[encuestadora[i]];
    }
    id ~ binomial_logit( muestra_int_voto , p );
}
generated quantities{
    vector[N] p;
    real dev;
    dev = 0;
    for ( i in 1:N ) {
        p[i] = a[encuestadora[i]];
    }
    dev = dev + (-2)*binomial_logit_lpmf( id | muestra_int_voto , p );
}


Ahora meter el postre al horno de RStan:

Code
library(rstan)
options(mc.cores = parallel::detectCores())

postre_2018_logis_fit <- stan(file='logis.stan',
                  data=list(
                    N=7,
                    N_encuestadora=6,
                    muestra_int_voto=encuestas_postre_2018$muestra_int_voto,
                    encuestadora=encuestas_postre_2018$encuestadora,
                    id=encuestas_postre_2018$id),
                  control=list(adapt_delta=0.95),
                  iter=4000,
                  chains=4)


Con algo de trabajo, y a pesar de muchas divergencias iniciales en el muestreo, el postre no se quema y sale del horno.

Veámos cómo se comparan los parametros estimados con los datos observados:


Para terminar, vamos las densidades de los parámetros estimados usando bayesplot y lanzar shinystan:

Code
library(bayesplot)

color_scheme_set("orange")
mcmc_areas(as.matrix(postre_2018_logis_fit),
           prob=0.95,prob_outer = 0.99,
           point_est="mean",
           pars=vars(starts_with("p[")))


Ñapa: Estimación con map2stan


Además de la siempre abstrusa representación del código en RStan, en este postre incluyo una alternativa que de paso le hace bombo al paquete rethinking que preparó uno de los mejores cocineros: Richard McElreath.

La especificación del modelo en el código del paquete rethinking, que traduce a un lenguaje más amable el código de RStan, se ve así:

Code
library(rethinking)

# Modelo logístico en map2stan:
postre_map2stan <- map2stan(
  alist(
    #modelo
    id ~ dbinom(n,p),
    logit(p) <- a[encuestadora],
    #priors
    a[encuestadora] ~ dnorm(a,s),
    a ~ dnorm(50,5),
    s ~ dcauchy(0,5)
     ),
  data=encuestas_postre,
  control=list(adapt_delta=0.96),
  iter=4000, warmup=1000, chains=4, cores=2)



Referencias


Este proyecto de Pierre-Antoine Kremp, para las presidenciales en EEUU de 2016, fue la inspiración para estas recetas.

McElreath, R. (2015). Statistical Rethinking. Texts in Statistical Science. Bendito sea Richard McElreath por este texto.

Stan Development Team (2016) Stan Modeling Language: User’s Guide and Reference Manual. Version 2.14.0.

Gelman, A. (2006). Prior distributions for variance parameters in hierarchical models (comment on article by Browne and Draper). Bayesian analysis, 1(3), pp.515-534.

Linzer, D. A. (2013). Dynamic Bayesian forecasting of presidential elections in the states. Journal of the American Statistical Association, 108(501), 124-134.

Wickham, H., & Grolemund, G. (2016). R for data science: import, tidy, transform, visualize, and model data. O’Reilly Media, Inc.