🥑 Ajiaco

encuestas
dirichlet
probabilístico
regresión
stan
bayesplot

Después de muchos intentos, por fin un modelo probabilístico para la primera vuelta

“Today’s posterior is tomorrow’s prior”
– Dennis Lindley

📅 Publicado 1 Mayo 2022, Última actualización 21 Mayo 2022

Un plato completo para la primera vuelta

Después de varios intentos, por fin sale un plato que cocina la primera vuelta completa –con todos los candidatos juntos. El Ajiaco toma las encuestas como ingredientes para estimar simuláneamente la proporción de votos para cada candidato, proyecta la incertidumbre que hay en cada votación, y mantiene las proporciones acotadas para que nunca sumen menos de cero o más de cien por ciento.

La receta usa fórmulas complicadas y algunos ingredientes inusuales, como el ajiaco que simboliza. Abajo se describen todos los detalles para estimar y replicar el Ajiaco, e incluso usarlo para propagar la incertidumbre de otros escenarios. Siéntase libre de saltarse cualquier paso de la preparación y solo ver el plato servido –aunque se recomienda ver también la gráfica al final, que es la mejor de todas.

Una ventaja adicional del Ajiaco es que, al modelar las proporciones de votos de todos los candidatos, también servirá para analizar el elusivo residual que incluye a los que van a votar en blanco, los que no sabe por quién votar y a los no responden las encuestas con la verdad.

Todos los domingos antes de las elecciones habrá una actualización del Ajiaco con las encuestas que vayan saliendo, así que estén atentos a actualizaciones para ver la más reciente preparación.


Ajiaco servido

Según esta estimación del Ajiaco basada en 27 encuestas disponibles, Gustavo Petro obtendría 36% de la votación, seguido por Federico Gutierrez con 24%. Rodolfo Hernández sigue con 14% y Sergio Fajardo con 8%. El Ajiaco estimó a Ingrid Betancourt con 1-2% hasta el 20 de mayo, con la adhesión a la campaña de Rodolfo Hernández. Por último, el Ajiaco, por construcción, también estima un residuo que incluye la intención por otros candidatos, los que dicen que van a votar en blanco y los indecisos. Este residuo es de más o menos 14%, e incluye 2-2.5% para otros candidatos y 9-12% de indecisos.

El Ajiaco servido incluye la mediana de la distribución posterior estimada para todos los candidatos, así como intervalos que representan al rango entre el percentil 10 y 90 para el parámetro de cada candidato.

Ya que el modelo depende de lo que vaya saliendo en las encuestas, cada estimación del modelo arroja resultados diferentes. Eso refleja solamente el hecho de incorporar nueva información, y que debe hacerse con base a lo que salga en todas las encuestas, jamás en lo que salga en una sola.

Resultados del Ajiaco

Ingredientes

El Ajiaco es el primero modelo generativo para la primera vuelta. El plato produce estimaciones para todos los candidatos simuláneamente. La maravilla de los modelos bayesianos es que son capaces de representar el fenómeno que buscan describir, condicionando el modelo a las observaciones, pero también lo pueden simular: pueden recrear lo que se busca observar.

Gracias a esta capacidad generativa, lo que hace al Ajiaco un buen plato es propagar la incertidumbre que se encuestra en sus ingredientes (las encuestas). Así, aunque los ingredientes no sean los mejores ya que las encuestas son imperfectas y ruidosas, el Ajiaco convierte la incertidumbre que hay en todas las encuestas juntas en incertidumbre sobre la votación estimada para cada candidato.

Para preparar el Ajiaco se necesitan las proporciones de votación para cada candidato. Según esta preparación, el modelo utiliza como priors para la estimación de cada parámetro la proporción de votos promedio en el momento t de cada estimación \(\mu_{t}\) que han registrado las encuestas para cada candidato. Esta no es la única forma: el Ajiaco también puede utilizar otro promedio, como un promedio ponderado donde las más recientes pesen relativamente más, u otras ponderaciones siempre y cuando todas las proporciones sumen 100%.

Priors por candidato
Candidato $\mu_{t}$ $\mu[ponderado]_{t}$
Gustavo Petro 36.9 37.7
Federico Gutierrez 25.3 25.4
Rodolfo Hernandez 12.7 13.8
Sergio Fajardo 8.0 7.3
1 Fecha: 2022-05-21
2 Encuestas disponibles: 27
Lo que sigue es algo técnico, siéntase libre de saltárselo

Receta

El Ajiaco está inspirado en modelos de decisión discreta. Interpreta el apoyo que recibirá un candidato en las elecciones como un reflejo, imperfecto, de la intención de voto en las encuestas en cada momento t. Funciona de la siguiente manera.

La distribución de votos para cada candidato se determina con base en una función multinomial, donde cada ensayo es una encuesta, cada candidato es una posibible opción y la probabilidad de que se seleccione algun candidato \(\theta_{candidato}\) se determina con base en las proporciones de apoyo que reportan las encuestas. Cada encuesta entra dentro de la función multinomial como resultado de una distribución Dirichlet, cuyo único parámetro \(\alpha\) recoge al mismo tiempo todas las proporciones de votos estimadas por las encuestas para cada candidato1. La distribución posterior es Dirichlet, ya que las funciones Dirichlet y multinomial son conjugates.

Ya que estos modelos están acotados a representar proporciones que siempre deben sumar 100%, el Ajiaco incluye un parámetro para los indecisos, tanto en la distribución multinomial como la Dirichlet. De esta forma, el modelo transforma las encuestas en incertidumbre sin resultados absurdos como intervalos de credibilidad negativos o mayores a 100%.

Estos son las 3 partes que se necesitan para construir el Ajiaco:

\[eleccion_{t} \sim Multinomial(\theta_{t})\]

\[\small \theta_{t} \sim Dirichlet(\alpha_{t})\]

\[\small\alpha_{t} \sim c(\mu_{Petro},\mu_{Gutierrez},\mu_{Fajardo},\mu_{Hernandez},\mu_{Betancourt},\mu_{Resto})\]

Datos

Para pronosticar con Ajiaco hay que simular las elecciones.

Comenzamos por resumir los parámetros que irán en la función Dirichlet como priors, que se basan en el promedio ponderado por el tiempo de las intenciones de voto en las encuestas (entre más reciente la encuesta, más pesa en el promedio). Luego simulamos 10 000 ensayos de la función multinomial y los resumimos con una mediana para cada parámetro. Esto es equivalente a simular 10 000 encuestas de intención de voto conociendo más o menos cuál es la probabilidad de seleccionar a cada candidato.

Código
library(tidyverse)

ajiaco_priors <- tibble(
  gp = ajiaco_encuestas$promedio_ponderado_t[2],
  fg = ajiaco_encuestas$promedio_ponderado_t[1],
  sf = ajiaco_encuestas$promedio_ponderado_t[4],
  rh = ajiaco_encuestas$promedio_ponderado_t[3]) %>%
  dplyr::mutate(rest = 100-rowSums(across(where(is.numeric)))) %>%
  dplyr::mutate(across(everything(),~./100))

# Simulacion numero de encuestas 
ajiaco_n_encuestas <- 1e2
ajiaco_ensayos <- 1e5

# Simulacion de resultados de encuestas
ajiaco_multinomial <- rmultinom(ajiaco_ensayos, ajiaco_n_encuestas,ajiaco_priors) %>%
  t() %>%
  tibble::as_tibble() %>%
  dplyr::summarise(across(everything(),median))

Estimación

Esta es la receta para el Ajiaco en Stan:

Código
data {
  int<lower = 1> ajiaco_n_encuestas; //Numero de encuestas
  int<lower = 0,upper = ajiaco_n_encuestas> ajiaco_priors[5]; //Numero de candidatos/opciones
}
parameters {
  simplex[5] theta; //Simplex que condensa las proporciones para que siempre sumen 100%
}
model {
  target += dirichlet_lpdf(theta | rep_vector(2, 5)); // Prior Dirichlet
  
  target += multinomial_lpmf(ajiaco_priors | theta); //Likelihood multinomial
}
generated quantities{
  int pred[5] = multinomial_rng(theta, 100);
}

Ahora a cocinar Ajiaco en RStan:

Código
library(rstan)
options(mc.cores = parallel::detectCores())

# Datos ####
ajiaco_data <- list(
  ajiaco_n_encuestas = ajiaco_n_encuestas,
  ajiaco_priors = c(ajiaco_multinomial$gp,
                    ajiaco_multinomial$fg,
                    ajiaco_multinomial$sf,
                    ajiaco_multinomial$rh,
                    ajiaco_multinomial$rest)
)

# Estimacion ####
ajiaco_fit <- stan(file = "ajiaco_model.stan",
                   data = ajiaco_data,
                   control=list(adapt_delta=0.95),
                   iter=1e4,
                   chains=4,
                   cores=4,
                   seed=332211)

El Ajiaco electoral se cocina rápido. Todas las cadenas se portan bien. La distribución de cada parámetro se concentra en la proporción que viene de las encuestas rápidamente, y con tantas encuestas simuladas se ve muy claro.

Ajiaco: Parámetros vs Observaciones

Ajiaco: Parámetros vs Observaciones

Lo mejor del Ajiaco es que estima probabilidades para todos los niveles de votación de cada candidato. La distribución posterior para cada candidato es una densidadad completa para cada nivel de votación. Si usted quisiera saber cuál es la probabilidad de que Petro obtenga más de 40% de la votación, o cuál es la probabilidad que Fajardo saque más de 15%, pregúnteselo al Ajiaco.

Shinystan

El Ajiaco es mejor en shinystan.
En la consola de R: shinystan::launch_shinystan(ajiaco_fit)

Ajiaco: Densidades posteriores

Ñapa: Simulación de las elecciones usando 🥑 Ajiaco

El Ajiaco se puede usar con un ingrediente adicional para simular unas elecciones: el censo electoral. Según la registraduría hay 39 millones votantes elegibles, y con históricos de participación de cerca de casi 50%, hay más o menos una masa electoral de 19.5 millones de votantes.

Cocinemos el Ajiaco con esa masa electoral para ver cuántos votos obtendría cada candidato, y comparemos con los votos que tuvieron en las consultas del 13 de marzo.

Código
library(rstan)
library(bayesplot)

# Censo electoral y tasa participacion 54% ####
censo <- 39002239
votantes_simulacion <- 0.5*censo

# Modelo ####
ajiaco_simulacion <- "
data {
  int<lower = 1> ajiaco_n_encuestas;
  int<lower = 0,upper = ajiaco_n_encuestas> ajiaco_priors[5];
}
parameters {
  simplex[5] theta;
}
model {
  target += dirichlet_lpdf(theta | rep_vector(2, 5));
  
  target += multinomial_lpmf(ajiaco_priors | theta); 
}
generated quantities{
  int pred[5] = multinomial_rng(theta, 19501120);
}

"

# Estimacion ####
ajiaco_simulacion_fit <- stan(model_code = ajiaco_simulacion,
                              data = ajiaco_data,
                              control=list(adapt_delta=0.95),
                              iter=1e4,
                              chains=4,
                              cores=4,
                              seed=332211)
Simulacion del Ajiaco con censo electoral (Millones de votos)
Candidato Votos Ajiaco Votos Consulta Total Consulta
Gustavo Petro 7.07 4.45 5.52
Federico Gutierrez 4.76 2.14 3.95
Resto (Otros, Blanco e Indecisos) 3.16
Rodolfo Hernandez 2.79
Sergio Fajardo 1.55 0.72 2.15
50% del censo electoral 19.50
1 Fecha: 2022-05-21
2 Aunque nadie lee estas notas: Esto es una simulación, no la realidad

Simulación del Ajiaco vs Consultas

Notas

  1. Por esta razón el Ajiaco no incluye a los candidatos con menos de 1% de intención de voto, y posiblemente en una futura estimación también excluya a la candidata del partido Oxígeno Verde.↩︎