Se desea estimar la proporción de votantes a FdT, JxC y FIT (a diputados nacionales) a nivel nacional respecto al total de votos válidos para las elecciones de 14 Noviembre 2021 mediante una muestra aleatoria estratificada de tamaño total n=120 mesas. El marco de muestreo se construirá a partir de la tabla MESAS ESCRUTADAS Cierre.csv (tablas publicadas por la DNE).

library(readr)
library(tidyverse)
library(data.table)
library(janitor)
library(survey)
library(sampling)
library(dplyr)
library(tidyr)
current_directory <- getwd()

base = read_csv('./MESAS_ESCRUTADAS_Cierre.csv')

1. Construir a partir del archivo dado el marco de muestreo (El marco de muestreo debería ser una tabla de mesas electorales, cada una con el total de votos a cada partido y el total de votos válidos)

#Se agrupan los votos blancos bajo el nombre de agrupación "BLANCOS"

base$Agrupacion <- ifelse(base$tipoVoto == 'blancos', 'BLANCOS', base$Agrupacion)


# Se definen las agrupaciones políticas

Agrupacion_ <-c("JUNTOS POR EL CAMBIO", 
                "FRENTE DE TODOS", 
                "FRENTE DE IZQUIERDA Y DE TRABAJADORES - UNIDAD", "BLANCOS")

# Se definen los valores de los votos válidos
votos_v<-c("positivo", "blancos")


# Se adapta la base para el análisis de las consignas

base_m <- base %>%
  filter(Cargo == "DIPUTADOS NACIONALES" & 
         tipoVoto %in% votos_v) %>%
  mutate(
    Agrupacion = case_when(
      Agrupacion %in% c("JUNTOS", "JUNTOS POR EL CAMBIO") ~ "JUNTOS POR EL CAMBIO",
      TRUE ~ Agrupacion
    ),
    codigo_pw = str_c(Mesa, "_", IdDistrito, "_", IdSeccion)
  ) %>%
  group_by(codigo_pw) %>%
  mutate(votos_v = sum(votos))


# Se crea el marco de muestreo
marco_m<-base_m%>%
  ungroup()%>%
  filter(Agrupacion %in% c(Agrupacion_))%>%
  select(Mesa, Distrito, codigo_pw, Cargo, Agrupacion, votos, electores, votos_v, tipoVoto)%>%
  pivot_wider(names_from = Agrupacion, values_from = votos, values_fill = 0)


# 2. Estratificar el marco según la variable Zona: CABA, Pcia de Buenos Aires, NEA-NOA, Resto. La muestra se asignará por estrato en forma proporcional. Dentro de cada estrato el diseño será una MAS de mesas (en general las mesas electorales tienen igual cantidad de electores. Verificarlo


#Se definen las regiones
# unique(base$Distrito)

nea_noa <- c("Chaco", "Corrientes", "Formosa", "Misiones", "Catamarca", "Jujuy", "Santiago del Estero", "Tucumán", "La Rioja", "Salta")
pba <- c("Buenos Aires")
caba <- c("Ciudad Autónoma de Buenos Aires")

marco_m<-marco_m%>%
  mutate(
    region=case_when(
      Distrito %in% nea_noa ~"NEA-NOA",
      Distrito %in% pba ~"PBA",
      Distrito %in% caba ~"CABA", 
      TRUE ~ "Resto"))

# Se define el tamaño de la muestra
tam_muestra<-120

# Se crea una tabla con las proporciones de mesas, por region
estratos <- marco_m%>%
  ungroup()%>%
  tabyl(region)%>%
  mutate(casos_para_muestra = round(percent * tam_muestra, digits = 0))

4. Seleccionar con sampling una muestra

#En primera instancia se ordeno el marco de muestreo por estrato
marco_m <-  marco_m[order(marco_m$region),]


identificador_m <- strata(marco_m, 
                               stratanames = c("region"),
                               size=estratos$casos_para_muestra,
                               description=TRUE,
                               method = "srswor")
## Stratum 1 
## 
## Population total and number of selected units: 14668 9 
## Stratum 2 
## 
## Population total and number of selected units: 42441 26 
## Stratum 3 
## 
## Population total and number of selected units: 72490 44 
## Stratum 4 
## 
## Population total and number of selected units: 68538 42 
## Number of strata  4 
## Total number of selected units 121
#Se recuperan los datos del marco de muestreo
muestra_sampling <- getdata(marco_m, identificador_m)
muestra_sampling

3. Datos poblacionales a estimar

# Se suman los votos por agrupación política y los votos válidos en la muestra estratificada
suma_v_v <- colSums(marco_m[, c("JUNTOS POR EL CAMBIO", "FRENTE DE TODOS", "FRENTE DE IZQUIERDA Y DE TRABAJADORES - UNIDAD", "BLANCOS")])


# Se calculan las proporciones

prop <- suma_v_v[c("JUNTOS POR EL CAMBIO", "FRENTE DE TODOS", "FRENTE DE IZQUIERDA Y DE TRABAJADORES - UNIDAD", "BLANCOS")] / sum(suma_v_v[c("JUNTOS POR EL CAMBIO", "FRENTE DE TODOS", "FRENTE DE IZQUIERDA Y DE TRABAJADORES - UNIDAD", "BLANCOS")])


# Se crea una tabla para poder graficar la información de las proporciones
tabla_graf <- data.frame(
  Agrupacion = c("JxC", "FDT", "FIT","BLANCOS"),
  Proporcion = prop
)

gg <- ggplot(tabla_graf, aes(x = Agrupacion, y = Proporcion, fill = Agrupacion)) +
  geom_bar(stat = "identity") +
  theme_minimal() +
  labs(title = "Proporción de Votos por Agrupacion", x = "Agrupacion", y = "Proporción de Votos") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))


gg + geom_text(aes(label = sprintf("%.2f%%", Proporcion*100), vjust = 0.5), size = 6)

5. Se Calculan con survey las tres estimaciones buscadas, junto a sus CV, IC(90%) y deff.

# En primer lugar calculo el factor de expansion utilizando la probabilidad de selección calculada 
muestra_sampling$pondera <- 1/muestra_sampling$Prob

muestra_sampling<-muestra_sampling%>%
  left_join(estratos, by = "region")

diseno_muestral <- svydesign(id=~1, 
                            strata = ~region,
                            weights = ~pondera,  
                            data=muestra_sampling,
                            fpc = ~n)
diseno_muestral
## Stratified Independent Sampling design
## svydesign(id = ~1, strata = ~region, weights = ~pondera, data = muestra_sampling, 
##     fpc = ~n)
colnames(muestra_sampling)
##  [1] "Mesa"                                          
##  [2] "Distrito"                                      
##  [3] "codigo_pw"                                     
##  [4] "Cargo"                                         
##  [5] "electores"                                     
##  [6] "votos_v"                                       
##  [7] "tipoVoto"                                      
##  [8] "BLANCOS"                                       
##  [9] "JUNTOS POR EL CAMBIO"                          
## [10] "FRENTE DE TODOS"                               
## [11] "FRENTE DE IZQUIERDA Y DE TRABAJADORES - UNIDAD"
## [12] "region"                                        
## [13] "ID_unit"                                       
## [14] "Prob"                                          
## [15] "Stratum"                                       
## [16] "pondera"                                       
## [17] "n"                                             
## [18] "percent"                                       
## [19] "casos_para_muestra"
estimacion_fdt<-svytotal(x = ~`FRENTE DE TODOS`, design = diseno_muestral, CV=TRUE, deff=TRUE)
estimacion_jxc<-svytotal(x = ~`JUNTOS POR EL CAMBIO`, design = diseno_muestral, CV=TRUE, deff=TRUE)
estimacion_fit<-svytotal(x = ~`FRENTE DE IZQUIERDA Y DE TRABAJADORES - UNIDAD`, design = diseno_muestral, CV=TRUE, deff=TRUE)

confint(estimacion_fdt, level = 0.9)
##                       5 %    95 %
## `FRENTE DE TODOS` 6150762 8773493
confint(estimacion_jxc, level = 0.9)
##                            5 %    95 %
## `JUNTOS POR EL CAMBIO` 5765241 8682259
confint(estimacion_fit, level = 0.9)
##                                                       5 %    95 %
## `FRENTE DE IZQUIERDA Y DE TRABAJADORES - UNIDAD` 962865.3 1522876
# Cálculo y obtención del total de votos válidos
total_votos_v <- function(design) {
  svytotal(~votos_v, design)
}

# Cálculo e impresión de las estimaciones en porcentajes con error estándar
calcular_estimaciones_porcentaje <- function(design, variable, total_votos_v) {
  # Se calcula la estimacion total para la variable
  estimacion_total <- svytotal(x = ~get(variable), design = design, CV = TRUE, deff = TRUE)

  # Se calcula el porcentaje
  porcentaje <- coef(estimacion_total) / coef(total_votos_v) * 100

  # Se calcula el error estandar del porcentaje
  error_estandar <- SE(estimacion_total) / coef(total_votos_v) * 100

  # Se calcula el intervalo de confianza
  ic <- confint(estimacion_total, level = 0.9) / coef(total_votos_v) * 100

  # Se imprimen los resultados
  cat("Estimaciones para", variable, ":\n")
  cat("Porcentaje Estimado:", porcentaje, "%\n")
  cat("Error Estándar del Estimador:", error_estandar, "%\n")
  cat("Intervalo de Confianza al 90%:", ic, "%\n")
  cat("Efecto de Diseño (deff):", attr(estimacion_total, "deff"), "\n\n")
}

# Se calcula el total de votos validos
total_votos_v <- total_votos_v(diseno_muestral)

# Se llama a la funcion para cada partido con los porcentajes
calcular_estimaciones_porcentaje(diseno_muestral, "FRENTE DE TODOS", total_votos_v)
## Estimaciones para FRENTE DE TODOS :
## Porcentaje Estimado: 15.37564 %
## Error Estándar del Estimador: 1.642734 %
## Intervalo de Confianza al 90%: 12.67358 18.0777 %
## Efecto de Diseño (deff): 0.9090744
calcular_estimaciones_porcentaje(diseno_muestral, "JUNTOS POR EL CAMBIO", total_votos_v)
## Estimaciones para JUNTOS POR EL CAMBIO :
## Porcentaje Estimado: 14.88447 %
## Error Estándar del Estimador: 1.827059 %
## Intervalo de Confianza al 90%: 11.87922 17.88971 %
## Efecto de Diseño (deff): 0.8289214
calcular_estimaciones_porcentaje(diseno_muestral, "FRENTE DE IZQUIERDA Y DE TRABAJADORES - UNIDAD", total_votos_v)
## Estimaciones para FRENTE DE IZQUIERDA Y DE TRABAJADORES - UNIDAD :
## Porcentaje Estimado: 2.560923 %
## Error Estándar del Estimador: 0.3507599 %
## Intervalo de Confianza al 90%: 1.983975 3.137872 %
## Efecto de Diseño (deff): 0.9121359

6. Qué tamaño de aproximado de muestra es necesario si se desea estimar esas proporciones de forma que el error de muestreo (desvío standard del estimador) para los tres estimadores sea inferior a 0.2%??

# Se definen valores
Z <- 1.645  # Valor crítico para un nivel de confianza del 90%
E <- 0.002  # Error de muestreo deseado (0.2%)

# Proporciones estimadas para cada partido
p_fdt <- 0.307567  # Proporción para FRENTE DE TODOS
p_jxc <- 0.3106755  # Proporción para JUNTOS POR EL CAMBIO
p_fit <- 0.04906338  # Proporción para FRENTE DE IZQUIERDA Y DE TRABAJADORES - UNIDAD

# Se calcula tamaño de la muestra
tamano_muestra <- function(p) {
  n <- (Z^2 * p * (1 - p)) / E^2
  return(n)
}

# Se calculan de tamaños de muestra para cada partido
#Tamaño muestra fdt
n_fdt <- tamano_muestra(p_fdt)
#Tamaño muestra fdt
n_fdt
## [1] 144075.2
#Tamaño muestra Jxc
n_jxc <- tamano_muestra(p_jxc)
#Tamaño muestra fdt
n_jxc
## [1] 144878
#Tamaño muestra Fit
n_fit <- tamano_muestra(p_fit)
#Tamaño muestra fdt
n_fit
## [1] 31563.19
# Obtener el máximo de los tres tamaños de muestra
maximo <- max(n_fdt, n_jxc, n_fit)
maximo
## [1] 144878