Twitter: @nelsonamayad
Publicación: 20-05-2018
Última actualización: 20-05-2018.

“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


Durante las últimas semanas han salido algunos pronósticos para la primera vuelta del 27 de mayo. Este es un calentao de esos pronósticos hechos en días anteriores, así sea para eviar el predecible “el resultado siempre es obvio cuando se conoce”. Como de costumbre, cada ingrediente es abierto y reproducible hasta donde su cocinero lo permite.

No cualquier lista o proporción de votos es un pronóstico. Si escudriñando una lista cualquiera no resulta nada más que un “me parece que así va a ser”, esa lista no cuenta. Esto, por ejemplo, no es un pronóstico. #LaPollaporlaPrimeraVuelta que se hace en Twitter tampoco vale. La tiranía metodológica no es capricho ni arbitrariedad: simplemente no tiene sentido atribuirle nada más que suerte a alguien que se gana la lotería por escoger un número entre billones posibles. De eso no se aprende nada.

Todo lo demás vale mientras resulte en un punto o intervalo por candidato. No importa la metodología que se utilice mientras haya un documento verificable que la describa, ese documento esté en línea y sea de acceso público. Los pronósticos se pueden basar en encuestas, elecciones pasadas, alianzas políticas, en el clima, clicks en una página o en cualquier otra cosa mientras cumplan con las tres características anteriores.

Buen provecho y acuérdese de votar por el que le de la gana.


El calentao


Este calentao incluye todos los pronósticos que encontré. El primer ingrediente es una referencia: Encuestas, un promedio simple de la intención de voto, para cada candidato, entre todas las 18 encuestas que han salido desde las elecciones legislativas de marzo 11 de 2017. Los otros ingredientes son estimaciones puntuales, intervalos, o puntos e intervalos, dependiendo de lo que cada cocinero haya revelado.

library(tidyverse)
library(RCurl)

# 1. Base: promedio de las encuestas
encuestas <- read.csv(text=getURL("https://raw.githubusercontent.com/nelsonamayad/Elecciones-presidenciales-2018/master/Elecciones%202018/encuestas2018.csv"))
encuestas <- encuestas %>% filter(n>26) %>% select(ivan_duque,gustavo_petro,sergio_fajardo,german_vargas_lleras,humberto_delacalle) %>% gather(candidato, int_voto)
encuestas <- encuestas %>% group_by(candidato) %>% summarize(int_voto=mean(int_voto) %>% format(digits=0))
encuestas <- tribble(~fecha,~candidato,~int_voto,
                "2018-05-19","Iván Duque",37,
                "2018-05-19","Gustavo Petro",27,
                "2018-05-19","Sergio Fajardo",13,
                "2018-05-19","Germán Vargas Lleras",8,
                "2018-05-19","Humberto de la Calle",3)
encuestas$fuente <- "18 Encuestas"

# 2. Cifras y Conceptos
cyc <- tribble(~fecha, ~candidato, ~int_voto_max,~int_voto_min,
               "2018-04-04","Iván Duque",37.7,37.2,
               "2018-04-04","Gustavo Petro",17.4,15.7,
               "2018-04-04","Sergio Fajardo",13.3,12.8,
               "2018-04-04","Germán Vargas Lleras",21.0,18.2,
               "2018-04-04","Humberto de la Calle",6.3,5.9,
               "2018-04-18","Iván Duque",36.4,35.6,
               "2018-04-18","Gustavo Petro",18.9,17,
               "2018-04-18","Sergio Fajardo",12.4,12.3,
               "2018-04-18","Germán Vargas Lleras",23.8,20.9,
               "2018-04-18","Humberto de la Calle",5.1,4.8,
               "2018-04-18","Iván Duque",36.9,33.7,
               "2018-04-18","Gustavo Petro",21.6,20.8,
               "2018-04-18","Sergio Fajardo",14.2,11.3,
               "2018-04-18","Germán Vargas Lleras",24.1,20.8,
               "2018-04-18","Humberto de la Calle",5.1,3.3,
               "2018-05-16","Iván Duque",36.9,32.9,
               "2018-05-16","Gustavo Petro",19.9,16.8,
               "2018-05-16","Sergio Fajardo",15.5,12.6,
               "2018-05-16","Germán Vargas Lleras",23.5,20.3,
               "2018-05-16","Humberto de la Calle",5,3.4,
               "2018-05-20","Iván Duque",37.2,33.7,
               "2018-05-20","Gustavo Petro",20.8,18.1,
               "2018-05-20","Sergio Fajardo",17.3,14.6,
               "2018-05-20","Germán Vargas Lleras",21.7,19,
               "2018-05-20","Humberto de la Calle",4.7,3.5
               )
cyc <- cyc %>% mutate(int_voto=(int_voto_max+int_voto_min)*0.5)
cyc$fuente <- "Cifras y Conceptos" 

# 3. El País
elpais <- tribble(~fecha,~candidato,~int_voto,
                  "2018-05-19","Sergio Fajardo",15.8,
                  "2018-05-19","Gustavo Petro",27,
                  "2018-05-19","Iván Duque",37,
                  "2018-05-19","Humberto de la Calle",3,
                  "2018-05-19","Germán Vargas Lleras",10.5)
elpais$fuente <- "El País"
  
# 4. ANIF
anif <- tribble(~fecha,~candidato,~int_voto,
      "2018-05-07","Iván Duque",(5/17)*100,
      "2018-05-07","Germán Vargas Lleras",(4.5/17)*100,
      "2018-05-07","Gustavo Petro",(3.2/17)*100,
      "2018-05-07","Sergio Fajardo",(2.3/17)*100,
      "2018-05-07","Humberto de la Calle",(1/17)*100)

anif$fuente <- "ANIF"

# 5. Recetas propias
recetas <- tribble(~fecha, ~candidato,~fuente,~int_voto,~int_voto_max,~int_voto_min,
    "2018-05-20","Sergio Fajardo","Simple",12.4,16.8,6.7,
    "2018-05-20","Gustavo Petro","Simple",26.4,32.2,23.5,
    "2018-05-20","Iván Duque","Simple",38.3,42.2,34.0,
    "2018-05-20","Humberto de la Calle","Simple",3.2,4.5,1.7,
    "2018-05-20","Germán Vargas Lleras","Simple",7.5,12.4,5.4,
    "2018-05-20","Sergio Fajardo","Mixta",13.1,16.9,8.9,
    "2018-05-20","Gustavo Petro","Mixta",26.8,31.0,23.5,
    "2018-05-20","Iván Duque","Mixta",38.1,41.9,34.2,
    "2018-05-20","Humberto de la Calle","Mixta",3.0,5.2,2.1,
    "2018-05-20","Germán Vargas Lleras","Mixta",7.5,11.1,5.7)

# Preparar calentao
calentao <- bind_rows(encuestas,recetas,cyc %>% filter(fecha==as.Date("2018-05-20")),anif,elpais)
calentao <- calentao %>% mutate(candidato=factor(candidato,levels=c("Humberto de la Calle","Germán Vargas Lleras","Sergio Fajardo","Gustavo Petro","Iván Duque")))
## Warning: Removed 15 rows containing missing values (geom_errorbar).

Estas son algunas generalidades del calentao:


Recetas propias


Estos son los resultados de las últimas estimaciones de las recetas bayesianas Simple y Mixta. En cada caso, el resultado es un promedio de la distribución posterior de los parámetros, así como su HPDI de 90%. No alcancé a terminar la receta multinomial, así que quedaron solo estas dos.

library(tidyverse)

recetas <- recetas %>% mutate(candidato=factor(candidato,levels=c("Humberto de la Calle","Germán Vargas Lleras","Sergio Fajardo","Gustavo Petro","Iván Duque")))

# Grafica
ggplot(recetas, aes(x=candidato, group=candidato, color=candidato))+
  geom_errorbar(aes(ymax=int_voto_max, ymin=int_voto_min),width=0.5)+
  geom_point(aes(y=int_voto, shape=candidato), size=5)+
  theme(legend.position="none",
        axis.title.y = element_text(size=10),
        axis.title.x = element_text(size=10),
        panel.background=element_rect(fill="white",color="white"),text = element_text(size=15))+
  labs(x="",y="\nPromedios e intervalos HPD de 90%", title="Pronóstico recetas propias", subtitle="Modelos bayesianos propios basados en encuestas",caption="\nFuente: @nelsonamayad")+
  scale_color_manual(values=c("red4","red2","green4","gold2","orangered")) +
  scale_fill_manual(values=c("red4","red2","green4","gold2","orangered"))+
  scale_y_continuous(limits = c(0,50),breaks=c(10,20,30,40,50))+   coord_flip()+
  facet_wrap(~fuente)

Los huevos de Cifras y Conceptos


El polémico pronóstico de Cifras y Conceptos es el ingrediente más creativo del calentao. Trata de hacer algo que ningún otro intentó: modelar el sesgo, que parece comparten todas las encuestas, de subestimar la movilización de votos que pueden hacer las estructuras políticas. Ésta es la metodología que utilizan para generar los intervalos de pronóstico por candidato. A pesar de que publicaron la metodología tarde, y no se animaron a mostrar la cocina completa, este ingrediente es el que más me gusta.

Abajo va una reproducción de todas las actualizaciones de los intervalos que ha producido Cifras y Conceptos:

library(tidyverse)
cyc <- cyc %>% mutate(candidato=factor(candidato,levels=c("Iván Duque","Germán Vargas Lleras","Gustavo Petro","Sergio Fajardo","Humberto de la Calle")))

# Grafica
ggplot(cyc, aes(x=fecha, group=candidato, color=candidato))+
  geom_linerange(aes(ymax=int_voto_max, ymin=int_voto_min))+
  geom_line(aes(y=int_voto_max))+
  geom_line(aes(y=int_voto_min))+
  #Texto
  theme(legend.position="right",
        legend.title = element_blank(),
        legend.key=element_blank(),
        axis.title.y = element_text(size=10),
        axis.title.x = element_text(size=10),
        panel.background=element_rect(fill="white",color="white"),text = element_text(size=15))+
scale_y_continuous(limits = c(0,40),breaks=c(10,20,30,40))+  labs(x="",y="Intervalos estimados",title="Pronóstico Cifras y Conceptos",subtitle="Modelo basado en encuestas y alianzas políticas",caption="Fuente: Cifras y Conceptos")+
  scale_color_manual(values=c("orangered","red2","gold2","green4","red4")) +
  scale_fill_manual(values=c("orangered","red2","gold2","green4","red4"))

El chicharrón de El País


Desde el periódico El País, @JorgeGalindo y @kikollan publicaron el 19 de mayo un cálculo con base en las encuestas y múltiples asteríscos metodológicos.

El cálculo hace muchos supuestos de ponderación pero no los muestra, y aunque describen lo que hacen, esa transparencia a medias no me gusta. De todas maneras ahí está.

library(tidyverse)

elpais <- elpais %>% mutate(candidato=factor(candidato,levels=c("Humberto de la Calle","Germán Vargas Lleras","Sergio Fajardo","Gustavo Petro","Iván Duque")))

# Grafica
ggplot(elpais,aes(x=candidato,color=candidato))+
  geom_point(aes(y=int_voto,shape=candidato),size=4)+
  geom_text(aes(y=int_voto,label=format(int_voto,digits=0)),vjust=-1)+
  theme(legend.position="none",
        axis.title.y = element_text(size=10),
        axis.title.x = element_text(size=10),
        panel.background=element_rect(fill="white",color="white"),text = element_text(size=15))+
scale_y_continuous(limits = c(0,50),breaks=c(10,20,30,40,50))+  labs(x="",y="% votos pronosticados",title="Pronóstico El País",subtitle="Promedio de encuestas",caption="Fuente: El País")+
  scale_color_manual(values=c("red4","red2","green4","gold2","orangered")) +
  scale_fill_manual(values=c("red4","red2","green4","gold2","orangered"))+
  coord_flip()