Reporte de Reproducibilidad

Radiografía de la Cohesión Social en Chile 2016-2023.

Autores/as
Afiliación

Nicolás Outerbridge

Departamento de Sociología, Universidad de Chile

Vicente Rojas

Departamento de Sociología, Universidad de Chile

Fecha de publicación

7 de mayo de 2026

1 Selección de artículo/reporte

La Radiografia de La Cohesion Social En Chile 2016-2023 (2024) es un estudio longitudinal realizado por el Centro de Estudios de Conflicto y Cohesión Social (COES) que busca caracterizar la estabilidad y el cambio en las opiniones, actitudes y conductas de la población urbana chilena a lo largo de siete años. El análisis se organiza en tres ejes principales: la calidad de los vínculos sociales (confianza, trato digno y aceptación de la diversidad), el sentido de pertenencia (identificación y confianza institucional) y el bien común (solidaridad y participación cívica).

Para garantizar la precisión del seguimiento temporal, el estudio utiliza un filtro de atrición cero, analizando exclusivamente a las 2.073 personas que completaron todas las olas de medición correspondientes a su grupo: 1.303 individuos de la muestra original (7 olas) y 770 de la muestra de refresco (5 olas). Entre los hallazgos destacados, el reporte examina variables como la confianza en Carabineros, el sexismo, las actitudes hacia la migración y la percepción de justicia social, cruzándolas con datos sociodemográficos como sexo, edad y nivel educacional.

Considerando que el COES suele ser proyectado como un estándar en cuanto a calidad de investigación y transparencia de datos, resulta de particular interés para nosotros realizar un análisis de reproducibilidad de este estudio. Este proceso es fundamental para validar la consistencia de los hallazgos reportados y asegurar la suficiencia de los criterios técnicos y de rigor metodológico.

2 Evaluación de reproducibilidad

  • Disponibilidad de datos: Si bien el informe Radiografia de La Cohesion Social En Chile 2016-2023 (2024) no ofrece descarga directa de las bases de datos dentro del documento, estas son fácilmente accesibles mediante una búsqueda rápida en la web. La fuente de información de este reporte es el Estudio Longitudinal Social de Chile (ELSOC), desarrollado por el Centro de Estudios de Conflicto y Cohesión Social (COES). La institución mantiene un firme compromiso con la transparencia y el uso público de su información; por ello las bases de datos de las siete olas que componen el estudio están disponibles de manera abierta para el público general en los repositorios digitales de su sitio web.

  • Disponibilidad de código: El documento de la Radiografía de la Cohesión Social no proporciona código utilizado para el procesamiento y análisis de los datos. Si bien en general COES mantiene un compromiso con los principios de ciencia abierta, para esta publicacion en particular no se encuentra el codigo utilizado para el procesamiento de los datos y la generación de los resultados presentados en el informe. Este tampoco se encuentra disponible en los repositorios de github de los investigadores señalados como autores; sin embargo, pudimos acceder a el mediante el contacto directo con el investigador principal.

  • Documentación: El reporte de la Radiografía de la Cohesión Social incluye una descripción del método y del filtro muestral utilizados para su elaboración. El documento especifica con precisión el diseño de la muestra, las variables seleccionadas y los criterios aplicados para cada análisis. Esta transparencia metodológica pareciera ser, en primera instancia, suficiente para que contando únicamente con la base de datos del estudio (ELSOC), se pueda replicar el procesamiento de la información y obtener los mismos resultados presentados en el informe.

  • Transparencia: El estudio se presenta como un trabajo financiado por fondos públicos a través de la ANID y ejecutado por el COES bajo el patrocinio de prestigiosas universidades. El reporte identifica claramente al equipo académico y técnico responsable, además del marco conceptual del Ministerio de Desarrollo Social. No obstante, cabe señalar que el documento no incluye una declaración explícita de conflictos de interés.

3 Análisis reproducible

A continuación, nos proponemos replicar el apartado de “Confianza en las instituciones”. Este bloque se compone de cuatro indicadores: confianza en el Congreso Nacional, en el Poder Judicial, en los Partidos Políticos y en Carabineros.

Para cada uno de estos indicadores se presentan dos visualizaciones: un gráfico de barras que muestra la distribución de respuestas de la última observación disponible (Ola 7 para la muestra original y Ola 5 para la muestra de refresco) y una serie temporal que ilustra la evolución de las respuestas a lo largo de las distintas mediciones.

3.1 Resultados a reproducir

Congreso nacional Congreso nacional serie temporal Poder judicial Poder judicial serie temporal Partidos politicos Partidos politicos serie temporal Carabineros Carabineros serie temporal

Las categorias presentes en los graficos de barra y serie temporal corresponden a “Nada”, “Poca” y “Algo, bastante o mucha” confianza.

3.2 Proceso de reproducción

Para la reproducción de los análisis de interés, se realizó una lectura minuciosa del documento con el fin de identificar los aspectos metodológicos reportados para el procesamiento. Asimismo, se rastreó la disponibilidad del código en los perfiles de GitHub de los investigadores que declaran autoría en el estudio. Al no encontrar el material en dichos repositorios y ante la imposibilidad de reproducir los resultados con precisión, se contactó directamente al investigador principal para solicitar acceso al código utilizado en el procesamiento de los datos y la generación de los resultados.

No fue posible reproducir el estudio sin el código original debido a la falta de especificación en ciertos aspectos del procesamiento; concretamente, el estudio utiliza ponderadores por diseño muestral que no se encuentran detallados en el informe. Sin embargo, una vez obtenido el acceso al código, se logró comprender el flujo de trabajo y replicar los hallazgos con exactitud.

En los siguientes apartados se presenta la replicación realizada tras acceder al codigo. Por otro lado, en la sección de anexos (ver Sección 7.1), se incluye el intento de reproducción llevado a cabo utilizando únicamente la información disponible en el documento publicado.

3.2.1 Filtrado de la muestra

Se procuró replicar el método de filtrado de la muestra definido en el estudio: individuos que participaron en las siete olas de la muestra original y aquellos que completaron las cinco olas de la muestra de refresco; es decir, sujetos sin atrición a lo largo de sus respectivos seguimientos.

A partir de lo señalado en el documento, tras el filtrado se debería obtener una muestra de 1.303 individuos para la muestra original y 770 para la de refresco. Sin embargo, al aplicar los criterios descritos y tras probar diversos métodos de limpieza, se obtuvo consistentemente una muestra de 1.176 individuos para la muestra original y 661 para la de refresco.

Es probable que, para efectos del etiquetado en el informe, los autores hayan mantenido las cifras de una edición previa que utilizaba una versión anterior de los datos. Esta hipótesis se refuerza al notar que el n informado es idéntico al de estudios que utilizan solo hasta la Ola 6, omitiendo así la atrición esperada al añadir una nueva ola al estudio longitudinal. Refuerza esta tesis el hecho de que la totalidad de los gráficos pudo ser reproducida con éxito utilizando la muestra de 1.176 y 661 individuos, lo que sugiere que el procesamiento de los datos y la generación de resultados se realizó efectivamente con este grupo, a pesar de lo declarado en el texto del informe.

Tras acceder posteriormente al código original, se constató que el procesamiento incluía ciertos ponderadores por diseño muestral no especificados en el documento. Esta omisión imposibilita la reproducibilidad, ya que sin el código, la replicación exacta de los resultados habría sido imposible.

3.2.2 Procesamiento

En primer lugar, se cargaron las librerías necesarias y la base de datos original del estudio ELSOC. Posteriormente, se procedió a replicar el filtrado especificado en el documento: individuos que completaron la totalidad de las olas según su grupo; es decir, aquellos con participación en las siete olas de la muestra original (Muestra 1) y en las cinco de la muestra de refresco (Muestra 2).

Para validar la consistencia del filtro, se aplicaron tres métodos de conteo equivalentes de forma independiente: el primero basado en group_by(idencuesta) y n(), el segundo en n_distinct(ola) y un tercero restringido a individuos sin atrición (tipo_atricion == 1). Cada método se comprobó con su propio conteo de casos. Según lo documentado en el estudio, este procedimiento debería arrojar 1.303 individuos para la muestra original y 770 para la de refresco. Sin embargo, tras aplicar estos filtros, se obtuvo consistentemente una muestra de 1.176 y 661 individuos, respectivamente, lo que confirma una discrepancia mencionada anteriormente.

En cuanto al tratamiento de casos perdidos en las variables de confianza (c05_07, c05_05, c05_02 y c05_03), se replicaron los procedimientos del código original: los valores menores a 1 se recodificaron como NS/NR. Para la generación de gráficos, tanto las categorías NS/NR como los valores NA se excluyeron antes del cálculo de proporciones; de este modo, los porcentajes se interpretan exclusivamente sobre el total de respuestas válidas. Para esto, se utilizó la misma función case_when definida en el codigo original para recodificar las variables de confianza en tres categorías: “Nada”, “Poca” y “Algo, bastante o mucha”. Esta recodificación se aplicó tanto para el gráfico de barras (última observación) como para la serie temporal.

La revisión directa del código original muestra que, para los gráficos, se utiliza un único ponderador: ponderador02. En términos simples, este ponderador asigna a cada persona un “peso estadístico” para que la muestra represente mejor a la población: un peso mayor a 1 hace que ese caso influya más en el resultado y un peso menor a 1 hace que influya menos. Además, el código usa segmento_disenno y estrato_disenno como parte del diseño muestral. segmento_disenno agrupa a las personas que vienen del mismo bloque o tramo de muestreo, y estrato_disenno separa la muestra en grupos parecidos antes de hacer los cálculos. Por eso, una categoría puede verse más alta no solo por tener más casos, sino también porque quienes están en esa categoría tienen, en promedio, pesos más altos. En conjunto, el ponderador y estas dos variables hacen que las frecuencias y porcentajes reportados en los gráficos sean ponderados y no conteos crudos.

Show the code
library(tidyverse)
library(haven)
library(survey)
load("input/data/original/ELSOC_Long_2016_2023.RData")

# seleccionar individuos que completaron su respectiva muestra completa
# muestra 1: participaron en las 7 olas (n == 7)
# muestra 2: participaron en las 5 olas (n == 5)

# metodo 1: agrupar por idencuesta y contar filas válidas por persona
elsoc_selected_full_m1 <- elsoc_long_2016_2023 %>%
  filter(!is.na(ola)) %>%
  group_by(idencuesta) %>%
  filter((first(muestra) == 1 & n() == 7) | (first(muestra) == 2 & n() == 5)) %>%
  ungroup()

# Conteo método 1
elsoc_selected_full_m1 %>%
  distinct(idencuesta, muestra) %>%
  count(muestra, name = "personas")
# A tibble: 2 × 2
  muestra personas
    <dbl>    <int>
1       1     1176
2       2      661
Show the code
# metodo 2: contar olas distintas por persona y muestra
elsoc_selected_full_m2 <- elsoc_long_2016_2023 %>%
  filter(!is.na(ola)) %>%
  distinct(idencuesta, muestra, ola) %>%
  group_by(idencuesta, muestra) %>%
  summarise(n_olas = n_distinct(ola), .groups = "drop") %>%
  filter((muestra == 1 & n_olas == 7) | (muestra == 2 & n_olas == 5))

# conteo metodo 2
elsoc_selected_full_m2 %>%
  count(muestra, name = "personas")
# A tibble: 2 × 2
  muestra personas
    <dbl>    <int>
1       1     1176
2       2      661
Show the code
# Mmetodo: mismo filtro, pero restringiendo a individuos sin atrición (tipo_atricion == 1)
elsoc_selected_full <- elsoc_long_2016_2023 %>%
  filter(tipo_atricion == 1, !is.na(ola)) %>%
  group_by(idencuesta) %>%
  filter((first(muestra) == 1 & n() == 7) | (first(muestra) == 2 & n() == 5)) %>%
  ungroup()

# conteo metodo 3 (sin atrición)
elsoc_selected_full %>%
  distinct(idencuesta, muestra) %>%
  count(muestra, name = "personas")
# A tibble: 2 × 2
  muestra personas
    <dbl>    <int>
1       1     1176
2       2      661
Show the code
# Definición de niveles y paletas de colores
conf_levels <- c("Nada", "Poca", "Algo, bastante o mucha")
conf_bar_palette <- c("Nada" = "#9BD44C", "Poca" = "#4D7DD1", "Algo, bastante o mucha" = "#7633A5")
conf_line_palette <- c("Nada" = "#7AD151", "Poca" = "#2A9AB7", "Algo, bastante o mucha" = "#440154")

# funcion para hacer recode
rec_conf <- function(x) {
  case_when(
    !is.na(x) & x < 1 ~ "NS/NR",
    x == 1 ~ "Nada",
    x == 2 ~ "Poca",
    x %in% 3:5 ~ "Algo, bastante o mucha",
    TRUE ~ NA_character_
  )
}

# Función para construir diseño muestral
build_design <- function(data) {
  svydesign(ids = ~segmento_disenno, weights = ~ponderador02, 
            strata = ~estrato_disenno, data = data, nest = TRUE)
}

# Función para graficar confianza: gráfico de barras (última observación)
plot_conf_bar_weighted <- function(data, value_col, title, subtitle) {
  plot_data <- data %>%
    filter(!is.na(ola)) %>%
    mutate(conf = rec_conf(.data[[value_col]])) %>%
    filter(!is.na(conf), conf != "NS/NR")

  t <- as.data.frame(svytable(~conf, design = build_design(plot_data))) %>%
    mutate(conf = as.character(conf)) %>%
    filter(!is.na(conf)) %>%
    mutate(prop = round(Freq / sum(Freq, na.rm = TRUE), 2),
           pct_label = scales::percent(prop, accuracy = .1),
           conf = factor(conf, levels = conf_levels))

  ggplot(t, aes(x = conf, y = prop, fill = conf, label = pct_label)) +
    geom_col(width = 0.35) +
    geom_text(vjust = -0.4, size = 4) +
    scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
    scale_fill_manual(values = conf_bar_palette) +
    labs(title = title, subtitle = subtitle, x = NULL, y = NULL) +
    theme_minimal(base_size = 12) +
    theme(panel.grid.major.x = element_blank(),
          panel.grid.minor = element_blank(),
          legend.position = "none",
          plot.title = element_text(color = "#1676D2", face = "bold", hjust = 0.5),
          plot.subtitle = element_text(hjust = 0.5))
}

# Función para graficar confianza: serie temporal
plot_conf_long_weighted <- function(data, value_col, title, subtitle) {
  plot_data <- data %>%
    filter(!is.na(ola)) %>%
    mutate(conf = rec_conf(.data[[value_col]])) %>%
    filter(!is.na(conf), conf != "NS/NR")

  t <- as.data.frame(svytable(~conf + ola, design = build_design(plot_data))) %>%
    mutate(ola = as.numeric(as.character(ola))) %>%
    mutate(conf = as.character(conf)) %>%
    filter(!is.na(conf), conf != "NS/NR") %>%
    group_by(ola) %>%
    mutate(prop = Freq / sum(Freq, na.rm = TRUE)) %>%
    ungroup() %>%
    drop_na(prop) %>%
    mutate(conf = factor(conf, levels = conf_levels))

  ggplot(t, aes(x = ola, y = prop, color = conf, group = conf, label = scales::percent(prop, accuracy = 1))) +
    geom_line(linewidth = 0.8) +
    geom_point(size = 2) +
    geom_text(vjust = -0.5, size = 3) +
    scale_x_continuous(breaks = 1:7, labels = c("2016", "2017", "2018", "2019", "2021", "2022", "2023")) +
    scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
    scale_color_manual(values = conf_line_palette) +
    labs(title = title, subtitle = subtitle, x = NULL, y = NULL, color = NULL) +
    theme_minimal(base_size = 12) +
    theme(panel.grid.major.x = element_blank(),
          panel.grid.minor = element_blank(),
          legend.position = "top",
          plot.title = element_text(color = "#1676D2", face = "bold", hjust = 0))
}

3.2.3 Reproducción

A pesar de no haber alcanzado el tamaño muestral del estudio original, se procedió a la generación de los gráficos de barra y series de tiempo para medir el grado de confianza en las instituciones, utilizando la submuestra resultante tras aplicar el filtro de no atrición. No obstante, tras el análisis del código proporcionado por los investigadores del COES, se identificó la aplicación de ponderadores por diseño muestral no especificados en la metodología documentada. Esta omisión técnica representa un obstáculo crítico para la reproducibilidad, ya que, en ausencia del código fuente original, la replicación exacta de los resultados habría sido imposible.

En los gráficos de barra, el procedimiento parte por filtrar a las personas sin atrición y quedarse con su última ola observada usando group_by(idencuesta), slice_max(order_by = ola, n = 1) y ungroup(). Después, la variable de confianza se recodifica con rec_conf(), se elimina la categoría NS/NR, y se construye el diseño muestral con svydesign() usando segmento_disenno como conglomerado, ponderador02 como peso y estrato_disenno como estrato. Con ese diseño, se calcula svytable(~conf, ...), se transforma el resultado a tabla con as.data.frame(), se calculan proporciones con mutate(prop = ...), se ordenan las categorías con factor(), y finalmente se grafica con ggplot() usando geom_col() y geom_text().

En los gráficos longitudinales, el flujo es muy parecido, pero en vez de resumir a la última ola se conserva toda la serie temporal de cada persona. Se recodifica la confianza con rec_conf(), se elimina NS/NR, se arma el mismo diseño muestral con svydesign(), y luego se calcula svytable(~conf + ola, ...). Después se convierte el resultado a formato tabular con as.data.frame(), se transforma ola a número con as.numeric(as.character(ola)), se ordenan las categorías con factor(), y se calcula la proporción dentro de cada ola con group_by(ola) y mutate(prop = Freq / sum(Freq, na.rm = TRUE)). Como paso final, se limpian faltantes con drop_na(prop) y se grafica con ggplot() usando geom_line(), geom_point() y geom_text(). En esta parte no se usa pivot_longer; el código trabaja directamente con las tablas que devuelve svytable().

Show the code
ell_tmp <- elsoc_selected_full %>%  # base sin atricion para la muestra final
  filter(tipo_atricion == 1) %>%  # conserva solo casos con seguimiento completo
  filter(!is.na(ola)) %>%  # descarta registros sin ola
  group_by(idencuesta) %>%  # trabaja persona por persona
  slice_max(order_by = ola, n = 1, with_ties = FALSE) %>%  # toma la ultima ola observada
  ungroup() %>%
  mutate(conf = rec_conf(c05_07))  # recodifica la confianza en 3 categorias

ell.svy <- svydesign(ids = ~segmento_disenno,  # conglomerado de muestreo
                     weights = ~ponderador02,  # ponderador expandido
                     strata = ~estrato_disenno,  # estrato del disenio
                     data = ell_tmp,
                     nest = TRUE)
t <- as.data.frame(svytable(~conf, design = ell.svy)) %>%  # conteo ponderado por categoria
  mutate(conf = as.character(conf)) %>%
  filter(!is.na(conf), conf != "NS/NR") %>%  # excluye faltantes y no sabe/no responde
  mutate(prop = round(Freq / sum(Freq, na.rm = TRUE), 2),
    pct_label = scales::percent(prop, accuracy = .1)) %>%
  mutate(conf = factor(conf, levels = conf_levels))  # fija el orden de las barras

ggplot(t, aes(x = conf, y = prop, fill = conf, label = pct_label)) +
  geom_col(width = 0.35) +
  geom_text(vjust = -0.4, size = 4) +
  scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
  scale_fill_manual(values = conf_bar_palette) +
  labs(title = "Grado de confianza: En el Congreso Nacional (última obs)",
       subtitle = "Ponderado por diseño muestral",
       x = NULL,
       y = NULL) +
  theme_minimal(base_size = 12) +
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor = element_blank(),
        legend.position = "none",
        plot.title = element_text(color = "#1676D2", face = "bold", hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))

Final — Congreso (barra, última observación)
Show the code
ell_tmp <- elsoc_selected_full %>% filter(tipo_atricion == 1) %>%  # conserva la submuestra sin atricion
  mutate(conf = rec_conf(c05_07))  # recodifica la confianza para todas las olas

ell.svy <- svydesign(ids = ~segmento_disenno,  # conglomerado de muestreo
                     weights = ~ponderador02,  # ponderador expandido
                     strata = ~estrato_disenno,  # estrato del disenio
                     data = ell_tmp,
                     nest = TRUE)
t <- as.data.frame(svytable(~conf + ola, design = ell.svy)) %>%  # conteos ponderados por ola y categoria
  mutate(ola = as.numeric(as.character(ola))) %>%
  mutate(conf = as.character(conf)) %>%
  filter(!is.na(conf), conf != "NS/NR") %>%  # elimina valores no validos
  group_by(ola) %>%
  mutate(prop = Freq / sum(Freq, na.rm = TRUE)) %>%  # calcula proporciones dentro de cada ola
  ungroup() %>%
  drop_na(prop) %>%
  mutate(conf = factor(conf, levels = conf_levels))  # mantiene el orden de la serie

ggplot(t, aes(x = ola, y = prop, color = conf, group = conf, label = scales::percent(prop, accuracy = 1))) +
  geom_line(linewidth = 0.8) +
  geom_point(size = 2) +
  geom_text(vjust = -0.5, size = 3) +
  scale_x_continuous(breaks = 1:7, labels = c("2016", "2017", "2018", "2019", "2021", "2022", "2023")) +
  scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
  scale_color_manual(values = conf_line_palette) +
  labs(title = "Grado de confianza: En el Congreso Nacional (serie)",
       subtitle = "Ponderado por diseño muestral",
       x = NULL,
       y = NULL,
       color = NULL) +
  theme_minimal(base_size = 12) +
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor = element_blank(),
        legend.position = "top",
        plot.title = element_text(color = "#1676D2", face = "bold", hjust = 0))

Final — Congreso (serie temporal)
Show the code
ell_tmp <- elsoc_selected_full %>%  # base sin atricion para la muestra final
  filter(tipo_atricion == 1) %>%  # conserva solo casos con seguimiento completo
  filter(!is.na(ola)) %>%  # descarta registros sin ola
  group_by(idencuesta) %>%  # trabaja persona por persona
  slice_max(order_by = ola, n = 1, with_ties = FALSE) %>%  # toma la ultima ola observada
  ungroup() %>%
  mutate(conf = rec_conf(c05_05))  # recodifica la confianza en 3 categorias

ell.svy <- svydesign(ids = ~segmento_disenno,  # conglomerado de muestreo
                     weights = ~ponderador02,  # ponderador expandido
                     strata = ~estrato_disenno,  # estrato del disenio
                     data = ell_tmp,
                     nest = TRUE)
t <- as.data.frame(svytable(~conf, design = ell.svy)) %>%  # conteo ponderado por categoria
  mutate(conf = as.character(conf)) %>%
  filter(!is.na(conf), conf != "NS/NR") %>%  # excluye faltantes y no sabe/no responde
  mutate(prop = round(Freq / sum(Freq, na.rm = TRUE), 2),
    pct_label = scales::percent(prop, accuracy = .1)) %>%
  mutate(conf = factor(conf, levels = conf_levels))  # fija el orden de las barras

ggplot(t, aes(x = conf, y = prop, fill = conf, label = pct_label)) +
  geom_col(width = 0.35) +
  geom_text(vjust = -0.4, size = 4) +
  scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
  scale_fill_manual(values = conf_bar_palette) +
  labs(title = "Grado de confianza: En el Poder Judicial (última obs)",
       subtitle = "Ponderado por diseño muestral",
       x = NULL,
       y = NULL) +
  theme_minimal(base_size = 12) +
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor = element_blank(),
        legend.position = "none",
        plot.title = element_text(color = "#1676D2", face = "bold", hjust = 0.5))

Final — Poder Judicial (barra, última observación)
Show the code
ell_tmp_full <- elsoc_selected_full %>%  # conserva toda la serie sin atricion
  filter(tipo_atricion == 1, !is.na(ola)) %>%
  mutate(conf = rec_conf(c05_05))  # recodifica la confianza para todas las olas

ell.svy_full <- svydesign(ids = ~segmento_disenno,  # conglomerado de muestreo
                          weights = ~ponderador02,  # ponderador expandido
                          strata = ~estrato_disenno,  # estrato del disenio
                          data = ell_tmp_full,
                          nest = TRUE)

# Conteos ponderados por categoría (svytable excluye NA en la variable de interés)
t_counts <- as.data.frame(svytable(~conf + ola, design = ell.svy_full))  # conteos ponderados por categoria y ola

t <- t_counts %>%
  mutate(ola = as.numeric(as.character(ola))) %>%
  mutate(conf = as.character(conf)) %>%
  filter(!is.na(conf), conf != "NS/NR") %>%  # elimina categorias no validas
  group_by(ola) %>%
  mutate(prop = Freq / sum(Freq, na.rm = TRUE)) %>%  # calcula proporciones por ola
  ungroup() %>%
  drop_na(prop) %>%
  mutate(conf = factor(conf, levels = conf_levels))  # fija el orden de la serie

ggplot(t, aes(x = ola, y = prop, color = conf, group = conf, label = scales::percent(prop, accuracy = 1))) +
  geom_line(linewidth = 0.8) +
  geom_point(size = 2) +
  geom_text(vjust = -0.5, size = 3) +
  scale_x_continuous(breaks = 1:7, labels = c("2016", "2017", "2018", "2019", "2021", "2022", "2023")) +
  scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
  scale_color_manual(values = conf_line_palette) +
  labs(title = "Grado de confianza: En el Poder Judicial (serie)",
       subtitle = "Ponderado por diseño muestral",
       x = NULL,
       y = NULL,
       color = NULL) +
  theme_minimal(base_size = 12) +
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor = element_blank(),
        legend.position = "top",
        plot.title = element_text(color = "#1676D2", face = "bold", hjust = 0))

Final — Poder Judicial (serie temporal)
Show the code
ell_tmp <- elsoc_selected_full %>%  # base sin atricion para la muestra final
  filter(tipo_atricion == 1) %>%  # conserva solo casos con seguimiento completo
  filter(!is.na(ola)) %>%  # descarta registros sin ola
  group_by(idencuesta) %>%  # trabaja persona por persona
  slice_max(order_by = ola, n = 1, with_ties = FALSE) %>%  # toma la ultima ola observada
  ungroup() %>%
  mutate(conf = rec_conf(c05_02))  # recodifica la confianza en 3 categorias

ell.svy <- svydesign(ids = ~segmento_disenno,  # conglomerado de muestreo
                     weights = ~ponderador02,  # ponderador expandido
                     strata = ~estrato_disenno,  # estrato del disenio
                     data = ell_tmp,
                     nest = TRUE)
t <- as.data.frame(svytable(~conf, design = ell.svy)) %>%  # conteo ponderado por categoria
  mutate(conf = as.character(conf)) %>%
  filter(!is.na(conf), conf != "NS/NR") %>%  # excluye faltantes y no sabe/no responde
  mutate(prop = round(Freq / sum(Freq, na.rm = TRUE), 2),
    pct_label = scales::percent(prop, accuracy = .1)) %>%
  mutate(conf = factor(conf, levels = conf_levels))  # fija el orden de las barras

ggplot(t, aes(x = conf, y = prop, fill = conf, label = pct_label)) +
  geom_col(width = 0.35) +
  geom_text(vjust = -0.4, size = 4) +
  scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
  scale_fill_manual(values = conf_bar_palette) +
  labs(title = "Grado de confianza: En los Partidos Políticos (última obs)",
       subtitle = "Ponderado por diseño muestral",
       x = NULL,
       y = NULL) +
  theme_minimal(base_size = 12) +
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor = element_blank(),
        legend.position = "none",
        plot.title = element_text(color = "#1676D2", face = "bold", hjust = 0.5))

Final — Partidos (barra, última observación)
Show the code
ell_tmp_full <- elsoc_selected_full %>%  # conserva toda la serie sin atricion
  filter(tipo_atricion == 1, !is.na(ola)) %>%
  mutate(conf = rec_conf(c05_02))  # recodifica la confianza para todas las olas

ell.svy_full <- svydesign(ids = ~segmento_disenno,  # conglomerado de muestreo
                          weights = ~ponderador02,  # ponderador expandido
                          strata = ~estrato_disenno,  # estrato del disenio
                          data = ell_tmp_full,
                          nest = TRUE)

t_counts <- as.data.frame(svytable(~conf + ola, design = ell.svy_full))

t <- t_counts %>%
  mutate(ola = as.numeric(as.character(ola))) %>%
  mutate(conf = as.character(conf)) %>%
  filter(!is.na(conf), conf != "NS/NR") %>%  # elimina categorias no validas
  group_by(ola) %>%
  mutate(prop = Freq / sum(Freq, na.rm = TRUE)) %>%  # calcula proporciones por ola
  ungroup() %>%
  drop_na(prop) %>%
  mutate(conf = factor(conf, levels = conf_levels))  # fija el orden de la serie

ggplot(t, aes(x = ola, y = prop, color = conf, group = conf, label = scales::percent(prop, accuracy = 1))) +
  geom_line(linewidth = 0.8) +
  geom_point(size = 2) +
  geom_text(vjust = -0.5, size = 3) +
  scale_x_continuous(breaks = 1:7, labels = c("2016", "2017", "2018", "2019", "2021", "2022", "2023")) +
  scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
  scale_color_manual(values = conf_line_palette) +
  labs(title = "Grado de confianza: En los Partidos Políticos (serie)",
       subtitle = "Ponderado por diseño muestral",
       x = NULL,
       y = NULL,
       color = NULL) +
  theme_minimal(base_size = 12) +
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor = element_blank(),
        legend.position = "top",
        plot.title = element_text(color = "#1676D2", face = "bold", hjust = 0))

Final — Partidos (serie temporal)
Show the code
ell_tmp <- elsoc_selected_full %>%  # base sin atricion para la muestra final
  filter(tipo_atricion == 1) %>%  # conserva solo casos con seguimiento completo
  filter(!is.na(ola)) %>%  # descarta registros sin ola
  group_by(idencuesta) %>%  # trabaja persona por persona
  slice_max(order_by = ola, n = 1, with_ties = FALSE) %>%  # toma la ultima ola observada
  ungroup() %>%
  mutate(conf = rec_conf(c05_03))  # recodifica la confianza en 3 categorias

ell.svy <- svydesign(ids = ~segmento_disenno,  # conglomerado de muestreo
                     weights = ~ponderador02,  # ponderador expandido
                     strata = ~estrato_disenno,  # estrato del disenio
                     data = ell_tmp,
                     nest = TRUE)
t <- as.data.frame(svytable(~conf, design = ell.svy)) %>%  # conteo ponderado por categoria
  mutate(conf = as.character(conf)) %>%
  filter(!is.na(conf), conf != "NS/NR") %>%  # excluye faltantes y no sabe/no responde
  mutate(prop = round(Freq / sum(Freq, na.rm = TRUE), 2),
    pct_label = scales::percent(prop, accuracy = .1)) %>%
  mutate(conf = factor(conf, levels = conf_levels))  # fija el orden de las barras

ggplot(t, aes(x = conf, y = prop, fill = conf, label = pct_label)) +
  geom_col(width = 0.35) +
  geom_text(vjust = -0.4, size = 4) +
  scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
  scale_fill_manual(values = conf_bar_palette) +
  labs(title = "Grado de confianza: En Carabineros (última obs)",
       subtitle = "Ponderado por diseño muestral",
       x = NULL,
       y = NULL) +
  theme_minimal(base_size = 12) +
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor = element_blank(),
        legend.position = "none",
        plot.title = element_text(color = "#1676D2", face = "bold", hjust = 0.5))

Final — Carabineros (barra, última observación)
Show the code
ell_tmp_full <- elsoc_selected_full %>% filter(tipo_atricion == 1, !is.na(ola)) %>%  # conserva toda la serie sin atricion
  mutate(conf = rec_conf(c05_03))  # recodifica la confianza para todas las olas

ell.svy_full <- svydesign(ids = ~segmento_disenno,  # conglomerado de muestreo
                          weights = ~ponderador02,  # ponderador expandido
                          strata = ~estrato_disenno,  # estrato del disenio
                          data = ell_tmp_full,
                          nest = TRUE)

# Conteos ponderados por categoría y ola.
t_counts <- as.data.frame(svytable(~conf + ola, design = ell.svy_full))

t <- t_counts %>%
  mutate(ola = as.numeric(as.character(ola))) %>%
  mutate(conf = as.character(conf)) %>%
  filter(!is.na(conf), conf != "NS/NR") %>%  # elimina categorias no validas
  group_by(ola) %>%
  mutate(prop = Freq / sum(Freq, na.rm = TRUE)) %>%  # calcula proporciones por ola
  ungroup() %>%
  drop_na(prop) %>%
  mutate(conf = factor(conf, levels = conf_levels))  # fija el orden de la serie

ggplot(t, aes(x = ola, y = prop, color = conf, group = conf, label = scales::percent(prop, accuracy = 1))) +
  geom_line(linewidth = 0.8) +
  geom_point(size = 2) +
  geom_text(vjust = -0.5, size = 3) +
  scale_x_continuous(breaks = 1:7, labels = c("2016", "2017", "2018", "2019", "2021", "2022", "2023")) +
  scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
  scale_color_manual(values = conf_line_palette) +
  labs(title = "Grado de confianza: En Carabineros (serie)",
       subtitle = "Ponderado por diseño muestral",
       x = NULL,
       y = NULL,
       color = NULL) +
  theme_minimal(base_size = 12) +
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor = element_blank(),
        legend.position = "top",
        plot.title = element_text(color = "#1676D2", face = "bold", hjust = 0))

Final — Carabineros (serie temporal)

4 Conclusiones

El proceso de replicación de este informe da cuenta de una brecha evidente entre la disponibilidad de datos y la reproducibilidad efectiva. Si bien el COES cumple con estándares de apertura al facilitar el acceso a las bases del ELSOC, la ausencia de una documentación exhaustiva sobre el tratamiento de valores perdidos y la especificación de los ponderadores de diseño constituye una barrera para la reproducción técnica. De hecho, no fue posible replicar con exactitud los resultados originales; se observaron diferencias que, aunque no superan el punto porcentual por categoría, podrían sugerir distintos criterios de redondeo que deberían ser (pero no lo son) fácilmente identificables en el código. A esto se suma una inconsistencia en el reporte del tamaño muestral, donde el error en el etiquetado parece deberse a la falta de actualización entre versiones del estudio, este error podria inducir eventualmente a errores en la validación de la atrición.

Asimismo, el proceso evidenció que la transparencia no debiese limitarse a la disponibilidad del código, sino también a su legibilidad. Nos topamos primero con una barrera de acceso; el hecho de que el código no estuviera disponible en repositorios públicos y requiera el contacto directo con los autores contradice parcialmente la practicas de transparencia. La dependencia a la gestión individual de los investigadores podría entorpecer el escrutinio inmediato de los resultados por parte de la comunidad científica.

Por otro lado, se identificó una barrera de inteligibilidad. Aun tras obtener el código, este presenta una estructura poco intuitiva y escasa documentación, lo que obligó a la mediación de herramientas de inteligencia artificial para descifrar su funcionamiento. En conjunto, a partir de estas barreras, concluimos que sin un acceso abierto y una documentación metodológica clara, el compromiso con la transparencia que el mismo COES promueve corre riesgo de no cumplirse en la práctica.

5 Recomendaciones

Para fortalecer los estándares de reproducibilidad de futuras investigaciones, recomendamos transitar hacia un modelo de transparencia proactiva que elimine las barreras de acceso. Se recomienda la adopción sistemática de repositorios públicos, como GitHub para garantizar la disponibilidad permanente del código sin depender de la comunicación directa con los autores. Ademas, consideramos que la apertura de archivos debe ir acompañada de una documentación técnica que detalle explícitamente los criterios de ponderación por diseño muestral y el tratamiento de casos perdidos, asegurando que el reporte guarde consistencia con aquello reportado. Finalmente, recomendariamos el desarrollo de manuales complementarios o archivos README que expliciten la estructura del procesamiento. Este enfoque no solo facilitaría el escrutinio independiente, sino que tambien evitaria la necesidad de recurrir a herramientas externas de interpretación.

6 Referencias

Radiografia de La Cohesion Social En Chile 2016-2023. (2024). COES.

7 Apéndice

7.1 Anexos de reproducción: Intento sin acceso al código

Los siguientes chunks corresponden a las versiones de reproducción utilizadas en los intentos de reproduccion previos a poder acceder al codigo; por lo que no se contaba con la información sobre el tratamiento de casos perdidos ni la ponderación por diseño muestral, lo que se traduce en resultado en algunos casos levemente diferente de los resultados del informe.

Esto da cuenta de que la informacion con respecto al analisis en la publicacion no es suficiente para lograr una reproducción fiel.

Poder Judicial Barra

Show the code
ell_tmp <- elsoc_long_2016_2023 %>%
  filter(tipo_atricion == 1) %>%
  filter((muestra == 1 & ola <= 6) | (muestra == 2 & ola <= 4)) %>%
  group_by(idencuesta) %>%
  filter((first(muestra) == 1 & n() == 6) | (first(muestra) == 2 & n() == 4)) %>%
  ungroup() %>%
  filter(ola == 6) %>%
  mutate(conf = case_when(
    c05_07 == 1 ~ "Nada",
    c05_07 == 2 ~ "Poca",
    c05_07 %in% 3:5 ~ "Algo, bastante o mucha",
    TRUE ~ NA_character_
  )) %>%
  filter(!is.na(conf))

ell.svy <- svydesign(ids = ~segmento_disenno,
                     weights = ~ponderador02,
                     strata = ~estrato_disenno,
                     data = ell_tmp,
                     nest = TRUE)
t <- as.data.frame(svytable(~conf, design = ell.svy)) %>%
  filter(!is.na(conf)) %>%
  mutate(prop = Freq / sum(Freq),
         pct_label = paste0(floor(prop * 100), "%"),
         conf = factor(conf, levels = c("Nada", "Poca", "Algo, bastante o mucha")))

ggplot(t, aes(x = conf, y = prop, fill = conf, label = pct_label)) +
  geom_col(width = 0.35) +
  geom_text(vjust = -0.4, size = 4) +
  scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
  scale_fill_manual(values = c("Nada" = "#9BD44C", "Poca" = "#4D7DD1", "Algo, bastante o mucha" = "#7633A5")) +
  labs(title = "Grado de confianza: En el Congreso Nacional",
       subtitle = "Submuestra hasta ola 6/4 sin atrición (ponderado)",
       x = NULL,
       y = NULL) +
  theme_minimal(base_size = 12) +
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor = element_blank(),
        legend.position = "none",
        plot.title = element_text(color = "#1676D2", face = "bold", hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5),
        axis.text.x = element_text(size = 11),
        axis.text.y = element_text(size = 10))

Grado de confianza en el Congreso Nacional 2023 con filtro hasta ola 6/4

Congreso nacional long

Show the code
ell_tmp <- elsoc_selected_full %>% filter(tipo_atricion == 1) %>%
  mutate(conf = case_when(
    c05_07 == 1 ~ "Nada",
    c05_07 == 2 ~ "Poca",
    c05_07 %in% 3:5 ~ "Algo, bastante o mucha",
    TRUE ~ NA_character_
  )) %>% filter(!is.na(conf))

ell.svy <- svydesign(ids = ~segmento_disenno,
                     weights = ~ponderador02,
                     strata = ~estrato_disenno,
                     data = ell_tmp,
                     nest = TRUE)
t <- as.data.frame(svytable(~conf + ola, design = ell.svy)) %>%
  mutate(ola = as.numeric(as.character(ola))) %>%
  group_by(ola) %>%
  mutate(prop = Freq / sum(Freq, na.rm = TRUE)) %>%
  ungroup() %>%
  mutate(conf = factor(conf, levels = c("Nada", "Poca", "Algo, bastante o mucha")))

ggplot(t, aes(x = ola, y = prop, color = conf, group = conf, label = scales::percent(prop, accuracy = 1))) +
  geom_line(linewidth = 0.8) +
  geom_point(size = 2) +
  geom_text(vjust = -0.5, size = 3) +
  scale_x_continuous(breaks = 1:7, labels = c("2016", "2017", "2018", "2019", "2021", "2022", "2023")) +
  scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
  scale_color_manual(values = c("Nada" = "#7AD151", "Poca" = "#2A9AB7", "Algo, bastante o mucha" = "#440154")) +
  labs(title = "Grado de confianza: El Congreso Nacional",
       subtitle = "Muestra 1 y 2 sin atrición; ponderado por diseño muestral",
       x = NULL,
       y = NULL,
       color = NULL) +
  theme_minimal(base_size = 12) +
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor = element_blank(),
        legend.position = "top",
        plot.title = element_text(color = "#1676D2", face = "bold", hjust = 0),
        plot.subtitle = element_text(hjust = 0),
        axis.text.x = element_text(size = 10),
        axis.text.y = element_text(size = 10))

Evolución del grado de confianza en el Congreso Nacional con filtro 7/5

Congreso nacional long

Show the code
data_full <- elsoc_selected_full %>%
  filter(tipo_atricion == 1, !is.na(ola)) %>%
  mutate(conf_congreso = case_when(
    c05_07 == 1 ~ "Nada",
    c05_07 == 2 ~ "Poca",
    c05_07 %in% 3:5 ~ "Algo, bastante o mucha",
    TRUE ~ NA_character_
  ))

# Diseño ponderado sobre la muestra completa (incluye NA en conf)
ell.svy_full <- svydesign(ids = ~segmento_disenno, weights = ~ponderador02, data = data_full)

# Conteos ponderados por categoría (svytable excluye NA en la variable de interés)
t_counts <- as.data.frame(svytable(~conf_congreso + ola, design = ell.svy_full))
# Totales ponderados por ola (incluye todos los registros)
t_totals <- as.data.frame(svytable(~ola, design = ell.svy_full)) %>% rename(total = Freq)

t <- t_counts %>% left_join(t_totals, by = "ola") %>%
  mutate(ola = as.numeric(as.character(ola)),
         prop = Freq / total) %>%
  ungroup() %>%
  mutate(conf_congreso = factor(conf_congreso, levels = c("Nada", "Poca", "Algo, bastante o mucha"))) %>%
  filter(!is.na(conf_congreso))

ggplot(t, aes(x = ola, y = prop, color = conf_congreso, group = conf_congreso, label = scales::percent(prop, accuracy = 1))) +
  geom_line(linewidth = 0.8) +
  geom_point(size = 2) +
  geom_text(vjust = -0.5, size = 3) +
    scale_x_continuous(breaks = 1:7, labels = c("2016", "2017", "2018", "2019", "2021", "2022", "2023")) +
  scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
  scale_color_manual(values = c("Nada" = "#7AD151", "Poca" = "#2A9AB7", "Algo, bastante o mucha" = "#440154")) +
  labs(title = "Grado de confianza: El Congreso Nacional",
      subtitle = "Muestra 1 y 2 sin atrición; NA excluidos del porcentaje",
       x = NULL,
       y = NULL,
       color = NULL) +
  theme_minimal(base_size = 12) +
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor = element_blank(),
        legend.position = "top",
        plot.title = element_text(color = "#1676D2", face = "bold", hjust = 0),
        plot.subtitle = element_text(hjust = 0),
        axis.text.x = element_text(size = 10),
        axis.text.y = element_text(size = 10))

Evolución del grado de confianza en el Congreso Nacional con filtro 7/5

Confianza en poder judicial barra

Show the code
plot_data <- elsoc_selected_full %>%
  filter(tipo_atricion == 1) %>%
  filter(!is.na(ola)) %>%
  group_by(idencuesta) %>%
  slice_max(order_by = ola, n = 1, with_ties = FALSE) %>%
  ungroup() %>%
  mutate(conf = rec_conf(c05_05)) %>%
  filter(!is.na(conf), conf != "NS/NR")

t <- as.data.frame(svytable(~conf, design = build_design(plot_data))) %>%
  mutate(conf = as.character(conf)) %>%
  filter(!is.na(conf)) %>%
  mutate(prop = round(Freq / sum(Freq, na.rm = TRUE), 2),
         pct_label = scales::percent(prop, accuracy = .1),
         conf = factor(conf, levels = conf_levels))

ggplot(t, aes(x = conf, y = prop, fill = conf, label = pct_label)) +
  geom_col(width = 0.35) +
  geom_text(vjust = -0.4, size = 4) +
  scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
  scale_fill_manual(values = conf_bar_palette) +
  labs(title = "Grado de confianza: En el poder judicial (última ola respondida)",
       subtitle = "Muestra 1 (7 olas) y muestra 2 (5 olas) sin atrición",
       x = NULL,
       y = NULL) +
  theme_minimal(base_size = 12) +
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor = element_blank(),
        legend.position = "none",
        plot.title = element_text(color = "#1676D2", face = "bold", hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))

Grado de confianza en el poder judicial 2023 con datos sin atrición

Confianza en poder judicial long

Show the code
plot_data <- elsoc_selected_full %>% filter(tipo_atricion == 1) %>%
  mutate(conf = rec_conf(c05_05)) %>%
  filter(!is.na(conf), conf != "NS/NR")

t <- as.data.frame(svytable(~conf + ola, design = build_design(plot_data))) %>%
  mutate(ola = as.numeric(as.character(ola))) %>%
  mutate(conf = as.character(conf)) %>%
  filter(!is.na(conf), conf != "NS/NR") %>%
  group_by(ola) %>%
  mutate(prop = Freq / sum(Freq, na.rm = TRUE)) %>%
  ungroup() %>%
  drop_na(prop) %>%
  mutate(conf = factor(conf, levels = conf_levels))

ggplot(t, aes(x = ola, y = prop, color = conf, group = conf, label = scales::percent(prop, accuracy = 1))) +
  geom_line(linewidth = 0.8) +
  geom_point(size = 2) +
  geom_text(vjust = -0.5, size = 3) +
  scale_x_continuous(breaks = 1:7, labels = c("2016", "2017", "2018", "2019", "2021", "2022", "2023")) +
  scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
  scale_color_manual(values = conf_line_palette) +
  labs(title = "Grado de confianza: El Poder Judicial",
       subtitle = "Muestra 1 y 2 sin atrición; ponderado por diseño muestral",
       x = NULL,
       y = NULL,
       color = NULL) +
  theme_minimal(base_size = 12) +
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor = element_blank(),
        legend.position = "top",
        plot.title = element_text(color = "#1676D2", face = "bold", hjust = 0))

Evolución del grado de confianza en el poder judicial con muestra 1 y 2 sin atrición

Confianza en partidos politicos barra

Show the code
plot_data <- elsoc_selected_full %>%
  filter(tipo_atricion == 1) %>%
  filter(!is.na(ola)) %>%
  group_by(idencuesta) %>%
  slice_max(order_by = ola, n = 1, with_ties = FALSE) %>%
  ungroup() %>%
  mutate(conf = rec_conf(c05_02)) %>%
  filter(!is.na(conf), conf != "NS/NR")

t <- as.data.frame(svytable(~conf, design = build_design(plot_data))) %>%
  mutate(conf = as.character(conf)) %>%
  filter(!is.na(conf)) %>%
  mutate(prop = round(Freq / sum(Freq, na.rm = TRUE), 2),
         pct_label = scales::percent(prop, accuracy = .1),
         conf = factor(conf, levels = conf_levels))

ggplot(t, aes(x = conf, y = prop, fill = conf, label = pct_label)) +
  geom_col(width = 0.35) +
  geom_text(vjust = -0.4, size = 4) +
  scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
  scale_fill_manual(values = conf_bar_palette) +
  labs(title = "Grado de confianza: En los partidos políticos (última ola respondida)",
       subtitle = "Muestra 1 (7 olas) y muestra 2 (5 olas) sin atrición",
       x = NULL,
       y = NULL) +
  theme_minimal(base_size = 12) +
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor = element_blank(),
        legend.position = "none",
        plot.title = element_text(color = "#1676D2", face = "bold", hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))

Grado de confianza en los partidos políticos 2023 con datos sin atrición

Confianza en partidos politicos Long

Show the code
plot_data <- elsoc_selected_full %>% filter(tipo_atricion == 1) %>%
  mutate(conf = rec_conf(c05_02)) %>%
  filter(!is.na(conf), conf != "NS/NR")

t <- as.data.frame(svytable(~conf + ola, design = build_design(plot_data))) %>%
  mutate(ola = as.numeric(as.character(ola))) %>%
  mutate(conf = as.character(conf)) %>%
  filter(!is.na(conf), conf != "NS/NR") %>%
  group_by(ola) %>%
  mutate(prop = Freq / sum(Freq, na.rm = TRUE)) %>%
  ungroup() %>%
  drop_na(prop) %>%
  mutate(conf = factor(conf, levels = conf_levels))

ggplot(t, aes(x = ola, y = prop, color = conf, group = conf, label = scales::percent(prop, accuracy = 1))) +
  geom_line(linewidth = 0.8) +
  geom_point(size = 2) +
  geom_text(vjust = -0.5, size = 3) +
  scale_x_continuous(breaks = 1:7, labels = c("2016", "2017", "2018", "2019", "2021", "2022", "2023")) +
  scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
  scale_color_manual(values = conf_line_palette) +
  labs(title = "Grado de confianza: Los Partidos Políticos",
       subtitle = "Muestra 1 y 2 sin atrición; ponderado por diseño muestral",
       x = NULL,
       y = NULL,
       color = NULL) +
  theme_minimal(base_size = 12) +
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor = element_blank(),
        legend.position = "top",
        plot.title = element_text(color = "#1676D2", face = "bold", hjust = 0))

Evolución de confianza en partidos políticos (c05_02) 2016-2023, sin atrición

Confianza en carabineros barra.

Show the code
plot_data <- elsoc_long_2016_2023 %>% filter(tipo_atricion == 1, muestra == 1, ola == 7) %>%
  mutate(conf = rec_conf(c05_03)) %>%
  filter(!is.na(conf), conf != "NS/NR")

t <- as.data.frame(svytable(~conf, design = build_design(plot_data))) %>%
  mutate(conf = as.character(conf)) %>%
  filter(!is.na(conf)) %>%
  mutate(prop = round(Freq / sum(Freq, na.rm = TRUE), 2),
         pct_label = scales::percent(prop, accuracy = .1),
         conf = factor(conf, levels = conf_levels))

ggplot(t, aes(x = conf, y = prop, fill = conf, label = pct_label)) +
  geom_col(width = 0.35) +
  geom_text(vjust = -0.4, size = 4) +
  scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
  scale_fill_manual(values = conf_bar_palette) +
  labs(title = "Grado de confianza: En Carabineros 2023",
       subtitle = "Solo muestra 1, ola 7",
       x = NULL,
       y = NULL) +
  theme_minimal(base_size = 12) +
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor = element_blank(),
        legend.position = "none",
        plot.title = element_text(color = "#1676D2", face = "bold", hjust = 0.5))

Grado de confianza en Carabineros 2023 con muestra 1, ola 7

Confianza en carabineros long

Show the code
plot_data <- elsoc_selected_full %>% filter(tipo_atricion == 1) %>%
  mutate(conf = rec_conf(c05_03)) %>%
  filter(!is.na(conf), conf != "NS/NR")

t <- as.data.frame(svytable(~conf + ola, design = build_design(plot_data))) %>%
  mutate(ola = as.numeric(as.character(ola))) %>%
  mutate(conf = as.character(conf)) %>%
  filter(!is.na(conf), conf != "NS/NR") %>%
  group_by(ola) %>%
  mutate(prop = Freq / sum(Freq, na.rm = TRUE)) %>%
  ungroup() %>%
  drop_na(prop) %>%
  mutate(conf = factor(conf, levels = conf_levels))

ggplot(t, aes(x = ola, y = prop, color = conf, group = conf, label = scales::percent(prop, accuracy = 1))) +
  geom_line(linewidth = 0.8) +
  geom_point(size = 2) +
  geom_text(vjust = -0.5, size = 3) +
  scale_x_continuous(breaks = 1:7, labels = c("2016", "2017", "2018", "2019", "2021", "2022", "2023")) +
  scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
  scale_color_manual(values = conf_line_palette) +
  labs(title = "Grado de confianza: Los Carabineros",
       subtitle = "Muestra 1 y 2 sin atrición; ponderado por diseño muestral",
       x = NULL,
       y = NULL,
       color = NULL) +
  theme_minimal(base_size = 12) +
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor = element_blank(),
        legend.position = "top",
        plot.title = element_text(color = "#1676D2", face = "bold", hjust = 0))

Evolución del grado de confianza en Carabineros con muestra 1 y 2 sin atrición

7.2 Código original

Show the code
library(survey)
library(ggplot2)
library(tidyverse)
library(ggrepel)
library(sjlabelled)
library(languageserver)
library(Hmisc)

# 1. Cargar base de datos elsoc 2016-2022 para extraer los labels

load("/Users/gustavoahumada/Dropbox/ELSOC2023/tareas/propuesta_RCS2023/bases/ELSOC_Long.RData")
#load("C:/Users/aigon/Dropbox/Proyectos/Datos ELSOC/Datos/ELSOC_Long.RData")

ell <- elsoc_long_2016_2022; elsoc_long_2016_2022 <- NULL

# 1.a.  en variables_vector escribir las variables que van a ser usadas para la RCS (incluyendo sociodemograficas
# las que deben estar juntas, idealmente al inicio o al final del vector)

variables_vector <- c("c02", "c03", "t01", "c35_01", "c35_02", "c35_03",
                      "c35_04", "g01_04", "r09","r12_03","r12_04","r16", 
                      "c32_01", "t02_02", "c05_02", "c05_03","c05_05", "c05_07",
                      "c18_09", "c04", "c07_02", "c08_02", "c09_04",
                      "c10_01", "c10_02", "c10_03","c37_05",
                      "m0_sexo", "m0_edad", "m01", "d01_01", "c15","r05_02",
                      "r06","r07","r08")



labels_list <- list()
min_values_list <- list()
labels_list_2 <- list()

# 1.b se extraen los labels y otros valores más

for (i in 1:length(variables_vector)) {
  vector <- variables_vector[[i]]
  vector_labels <- c()
  vector_labels_2 <- c()
  vector_min_values <- c()
  for (var in vector) {
    if (var %in% names(ell)) {
      vector_labels <- c(vector_labels, Hmisc::label(ell[[var]]))
      min_value <- min(ell[[var]][ell[[var]] > 0], na.rm = TRUE)
      vector_min_values <- c(vector_min_values, min_value)
      vector_labels_2 <- c(vector_labels_2,attr(ell[[var]],"labels"))
    }
  }
  labels_list[[i]] <- vector_labels
  names(labels_list)[i] <- vector
  min_values_list[[i]] <- vector_min_values
  labels_list_2[[i]] <- vector_labels_2
}

labels_list[["c35_01"]] <- "Frecuencia: Trato respetuoso en servicios de salud a clase social subjetiva de la persona"
labels_list[["c35_02"]] <- "Frecuencia: Trato respetuoso en el trabajo a clase social subjetiva de la persona"
labels_list[["c35_03"]] <- "Frecuencia: Trato respetuoso por Carabineros a clase social subjetiva de la persona"
labels_list[["c35_04"]] <- "Frecuencia: Trato respetuoso por personas de clase alta a clase social subjetiva de la peresona"

labels_list[["g01_04"]] <- "Grado de acuerdo: Sexismo hacia las mujeres"


# 2. Cargar base de datos consolidada

ell_23 <- readRDS("/Users/gustavoahumada/Dropbox/ELSOC2023/tareas/propuesta_RCS2023/bases/ELSOC_Long_2016_2023.rds")

load("/Users/gustavoahumada/Dropbox/ELSOC2023/tareas/propuesta_RCS2023/bases/Perfiles.RData")

#load("C:/Users/aigon/Dropbox/ELSOC2023/Otros/Perfiles.RData")
#ell_23 <- readRDS("C:/Users/aigon/Dropbox/ELSOC2023/tareas/propuesta_RCS2023/bases/ELSOC_Long_2016_2023.rds")

# 2.a Hacer las recodificaciones correspondientes

perfiles <- perfiles %>% mutate(pp_3 = factor(pp_3, levels = c("Votante Habitual",
                                                               "Votante Reactivo",
                                                               "No Votante")))
norte <- c(1,2,15,3,4)
centro <- c(5,6,7,16)
sur <- c(8,9,10,11,12)
rm <- 13


ell_23 <- ell_23 %>% filter(tipo_atricion == 1) %>% left_join(perfiles, by = "idencuesta") %>% 
  as_label(m0_sexo,estrato) %>%
  mutate(across(c(c07_01, c07_02, c07_03, c07_04, c07_05, c07_06, c07_07, c07_08, c08_02, c08_04),
                ~ifelse(. < 1, 0, .)),
         across(c(c02, c03, t01, c35_01, c35_02, c35_03,
                  c35_04, g01_03, g01_04, r05_02, r06, r07, r08, r09, r12_03, r12_04, r16,
                  c32_01, t02_02, c05_02, c05_05, c05_07,
                  c18_09, c04, c07_02, c08_02, c09_04,
                  c10_01, c10_02, c10_03, c37_05),
                ~ifelse(. < 1, 0, .)),
         m0_sexo = factor(m0_sexo, labels = c("Hombre","Mujer")),
         c02_var = factor(car::recode(c02, recodes = "0=0; 1 = 1; 2 = 2; 3 = 3"),
                          levels = c(0,3,2,1),
                          labels = c ("NS/NR",
                                      "Depende",
                                      "Casi siempre hay que tener cuidado al tratar con las personas",
                                      "Casi siempre se puede confiar en las personas")),
         c03_var = factor(car::recode(c03, recodes = "0=0; 1 = 1; 2 = 2; 3 = 3"),
                          levels = c(0,3,2,1),
                          labels = c ("NS/NR","Depende",
                                      "La mayoria de las veces se preocupan solo de si mismas",
                                      "La mayoria de las veces tratan de ayudar a los demas"
                                      )),
         c04_var = factor(car::recode(c04, recodes = "0=0; 1 = 1; 2 = 2; 3 = 3"),
                          levels = c(0,3,1,2),
                          labels = c ("NS/NR","Depende",
                                      "La mayoria de la gente intentaria aprovecharse",
                                      "La mayoria de la gente trataria de ser justa"
                                      )),
         t01_var = factor(car::recode(t01, recodes = "0=0; 1 = 1; 2:3 = 2; 4:5 = 3"),
                          levels = 0:3,
                          labels = c("NS/NR","Muy poco",
                                     "Poco o algo",
                                     "Bastante o mucho")),
         c35_01_var = factor(car::recode(c35_01, recodes = "0=0; 1 = 1; 2:3 = 2; 4:5 = 3"),
                             levels = 0:3,
                             labels = c("NS/NR","Nunca o casi nunca",
                                        "A veces",
                                        "Casi siempre o siempre")),
         c35_02_var = factor(car::recode(c35_02, recodes = "0=0; 1 = 1; 2:3 = 2; 4:5 = 3"),
                             levels = 0:3,
                             labels = c("NS/NR","Nunca o casi nunca",
                                        "A veces",
                                        "Casi siempre o siempre")),
         c35_03_var = factor(car::recode(c35_03, recodes = "0=0; 1 = 1; 2:3 = 2; 4:5 = 3"),
                             levels = 0:3,
                             labels = c("NS/NR","Nunca o casi nunca",
                                        "A veces",
                                        "Casi siempre o siempre")),
         c35_04_var = factor(car::recode(c35_04, recodes = "0=0; 1 = 1; 2:3 = 2; 4:5 = 3"),
                             levels = 0:3,
                             labels = c("NS/NR","Nunca o casi nunca",
                                        "A veces",
                                        "Casi siempre o siempre")),
         g01_04_var = factor(car::recode(g01_04, recodes = "0= 0; 1:2 = 1; 3 = 2; 4:5 = 3"),
                             levels = 0:3,
                             labels = c("NS/NR","Totalmente en desacuerdo o en desacuerdo",
                                        "Ni de acuerdo ni en desacuerdo",
                                        "De acuerdo o totalmente de acuerdo")),
         r09_var = factor(car::recode(r09, recodes = "0=0; 1 = 1; 2:3 = 2; 4:5 = 3"),
                          levels = 0:3,
                          labels = c("NS/NR","Muy poco o nada",
                                     "Poco o algo",
                                     "Bastante o mucho")),
         r12_03_var = factor(car::recode(r12_03, recodes = "0=0; 1:2 = 1; 3 = 2; 4:5 = 3"),
                             levels = 0:3,
                             labels = c("NS/NR","Totalmente en desacuerdo o en desacuerdo",
                                        "Ni en desacuerdo ni de acuerdo",
                                        "De acuerdo o totalmente de acuerdo")),
         r12_04_var = factor(car::recode(r12_04, recodes = "0=0; 1:2 = 1; 3 = 2; 4:5 = 3"),
                             levels = 0:3,
                             labels = c("NS/NR","Totalmente en desacuerdo o en desacuerdo",
                                        "Ni en desacuerdo ni de acuerdo",
                                        "De acuerdo o totalmente de acuerdo")),
         r16_var = factor(car::recode(r16, recodes = "0=0; 1:2 = 1; 3 = 2; 4:5 = 3"),
                          levels = 0:3,
                          labels = c("NS/NR","Nada de confianza o poca confianza",
                                     "Algo de confianza",
                                     "Bastante confianza o mucha confianza")),
         c32_01_var = factor(car::recode(c32_01, recodes = "0=0; 1:2 = 1; 3 = 2; 4:5 = 3"),
                             levels = 0:3,
                             labels = c("NS/NR","Totalmente en desacuerdo o en desacuerdo",
                                        "Ni en desacuerdo ni de acuerdo",
                                        "De acuerdo o totalmente de acuerdo")),
         t02_02_var = factor(car::recode(t02_02, recodes = "0=0; 1:2 = 1; 3 = 2; 4:5 = 3"),
                             levels = 0:3,
                             labels = c("NS/NR","Totalmente en desacuerdo o en desacuerdo",
                                        "Ni de acuerdo ni en desacuerdo",
                                        "De acuerdo o totalmente de acuerdo")),
         c05_02_var = factor(car::recode(c05_02, recodes = "0= 0; 1 = 1; 2 = 2; 3:5 = 3"),
                             levels = 0:3,
                             labels = c("NS/NR","Nada",
                                        "Poca",
                                        "Algo, bastante o mucha")),
         c05_03_var = factor(car::recode(c05_03, recodes = "0= 0; 1 = 1; 2 = 2; 3:5 = 3"),
                             levels = 0:3,
                             labels = c("NS/NR","Nada",
                                        "Poca",
                                        "Algo, bastante o mucha")),
         c05_05_var = factor(car::recode(c05_05, recodes = "0= 0; 1 = 1; 2 = 2; 3:5 = 3"),
                             levels = 0:3,
                             labels = c("NS/NR","Nada",
                                        "Poca",
                                        "Algo, bastante o mucha")),
         c05_07_var = factor(car::recode(c05_07, recodes = "0= 0; 1 = 1; 2 = 2; 3:5 = 3"),
                             levels = 0:3,
                             labels = c("NS/NR","Nada",
                                        "Poca",
                                        "Algo, bastante o mucha")),
         c18_09_var = factor(car::recode(c18_09, recodes = "0=0; 1:2 = 1; 3 = 2; 4:5 = 3"),
                             levels = 0:3,
                             labels = c("NS/NR","Totalmente en desacuerdo o en desacuerdo",
                                        "Ni en desacuerdo ni de acuerdo",
                                        "De acuerdo o totalmente de acuerdo")),
         c07_02_var = factor(car::recode(c07_02, recodes = "0 = 0; 1 = 1; 2:3 = 2"),
                             levels = 0:2,
                             labels = c ("NS/NR","Nunca lo hizo",
                                         "Lo hizo una o más de dos veces")),
         c08_02_var = factor(car::recode(c08_02, recodes = "0 = 0; 1 = 1; 2 = 2; 3:5 = 3"),
                             levels = 0:3,
                             labels = c("NS/NR",
                                        "Nunca", "Casi nunca",
                                        "A veces, frecuentemente o muy frecuentemente")),
         c09_04_var = factor(car::recode(c09_04, recodes = "0=0; 1:2 = 1; 3 = 2; 4:5 = 3"),
                             levels = 0:3,
                             labels = c("NS/NR","Nada o casi nada dispuesto",
                                        "Algo dispuesto",
                                        "Bastante o totalmente dispuesto")),
         c10_01_var = factor(car::recode(c10_01, recodes = "0 = 0; 1:2 = 1; 3 = 2; 4:5 = 3"),
                             levels = 0:3,
                             labels = c("NS/NR","Totalmente en desacuerdo o en desacuerdo",
                                        "Ni en desacuerdo ni de acuerdo",
                                        "De acuerdo o totalmente de acuerdo")),
         c10_02_var = factor(car::recode(c10_02, recodes = "0 = 0; 1:2 = 1; 3 = 2; 4:5 = 3"),
                             levels = 0:3,
                             labels = c("NS/NR","Totalmente en desacuerdo o en desacuerdo",
                                        "Ni en desacuerdo ni de acuerdo",
                                        "De acuerdo o totalmente de acuerdo")),
         c10_03_var = factor(car::recode(c10_03, recodes = "0 = 0; 1:2 = 1; 3 = 2; 4:5 = 3"),
                             levels = 0:3,
                             labels = c("NS/NR","Totalmente en desacuerdo o en desacuerdo",
                                        "Ni en desacuerdo ni de acuerdo",
                                        "De acuerdo o totalmente de acuerdo")),
         c37_05_var = factor(car::recode(c37_05, recodes = "0 = 0; 1:2 = 1; 3 = 2; 4:5 = 3"),
                             levels = 0:3,
                             labels = c("NS/NR","Totalmente en desacuerdo o en desacuerdo",
                                        "Ni en desacuerdo ni de acuerdo",
                                        "De acuerdo o totalmente de acuerdo")),
         estrato_rec = factor(case_when(
           estrato %in% c("Gran Santiago","Gran Valparaiso","Gran Concepcion","Ciudades Grandes (+ 100.000 hab)") ~ "Ciudades Grandes (+ 100.000 hab)",
           estrato == "Ciudades Medianas" ~ "Ciudades Medianas (+ 30.000 hab)",
           estrato == "Ciudades Pequennias" ~ "Ciudades Pequeñas (+ 10.000 hab)")),
         zona_rec = factor(case_when(
           region_cod %in% norte ~ "Norte",
           region_cod %in% centro ~ "Centro",
           region_cod %in% sur ~ "Sur",
           region_cod %in% rm ~ "RM"
         )),
         zona_rec_var = factor(case_when(
           region_cod %in% norte ~ "Norte",
           region_cod %in% centro ~ "Centro",
           region_cod %in% sur ~ "Sur",
           region_cod %in% rm ~ "RM"
         ))
  )


# calculo promedio variables
ell_23 <- ell_23 %>%
  mutate(across(c(c07_01, c07_02, c07_04, c07_05, c07_06, c07_07, c07_08, c08_02)),
         across(c(t11_01, t11_02, t11_04)), across(c(g01_03, g01_04))) %>% rowwise() %>%
  mutate(promedio_solidaridad = mean(c(c07_01, c07_02, c07_04, c07_05, c07_06, c07_07, c07_08),
                                     na.rm = TRUE)) %>%
  mutate(promedio_solidaridad = round(promedio_solidaridad)) %>% 
  mutate(promedio_solidaridad = factor(car::recode(promedio_solidaridad, "0 = 0 ; 1 = 1; 2:3 = 2"),
                                       levels = 0:2,
                                       labels = c("NS/NR" , "Nunca lo hizo", "Lo hizo una o más de dos veces"))) %>%
  mutate(sdd_primaria = mean(c(c07_01, c07_03),na.rm = TRUE)) %>% 
  mutate(sdd_primaria = round(sdd_primaria)) %>%
  mutate(sdd_primaria = factor(car::recode(sdd_primaria, "0 = 0 ; 1 = 1; 2:3 = 2"),
                               levels = 0:2,
                               labels = c("NS/NR" , "Nunca lo hizo", "Lo hizo una o más de dos veces"))) %>% 
  mutate(pro_soc = mean(c(c07_02, c07_04, c07_05),na.rm=TRUE)) %>%
  mutate(pro_soc = round(pro_soc)) %>%
  mutate(pro_soc = factor(car::recode(pro_soc, "0 = 0 ; 1 = 1; 2:3 = 2"),
                          levels = 0:2,
                          labels = c("NS/NR" , "Nunca lo hizo", "Lo hizo una o más de dos veces"))) %>%
  mutate(apoyo_soc = mean(c(c07_06, c07_07, c07_08),na.rm=TRUE)) %>%
  mutate(apoyo_soc = round(apoyo_soc)) %>%
  mutate(apoyo_soc = factor(car::recode(apoyo_soc, "0 = 0 ; 1 = 1; 2:3 = 2"),
                            levels = 0:2,
                            labels = c("NS/NR" , "Nunca lo hizo", "Lo hizo una o más de dos veces"))) %>%
  mutate(sexismo = mean(c(g01_03,g01_04),na.rm=T)) %>%
  mutate(sexismo = round(sexismo)) %>%
  mutate(sexismo = factor(car::recode(sexismo, "0 = 0 ; 1:2 = 1; 3 = 2; 4:5 = 3"),
                          levels = 0:3,
                          labels = c("NS/NR" , "Bajo nivel", "Nivel medio","Alto nivel")))
  

# 2.b a los promedios se les da un label (aunque es un paso que puede saltarse)

Hmisc::label(ell_23$promedio_solidaridad) <- "Promedio de Comportamiento Pro-Social"
Hmisc::label(ell_23$sdd_primaria) <- "Promedio de Sociabilidad Primaria"
Hmisc::label(ell_23$pro_soc) <- "Promedio de Comportamiento Pro-social"
Hmisc::label(ell_23$apoyo_soc) <- "Promedio de Apoyo Social"

Hmisc::label(ell_23$sexismo) <- "Promedio de sexismo"



# ajustar variables
ell_23 <- ell_23 %>%
  mutate(c15 = replace(c15, c15 < 0, -1),
         m01 = replace(m01, m01 < 0, 0),
         c33 = replace (c33, c33 < 0, 0),
         d01_01 = replace(d01_01, d01_01 < 0, -1),
         t09_02 = replace(t09_02, t09_02 < 0, 0),
         t10 = replace(t10, t10 < 0, 0))

ell_23 <- ell_23 %>%
  mutate(c15_nf  = factor(car::recode(c15, recodes = "-1 = 0; 0:4 = 1; 5 = 2; 6:10 = 3; 11:12 = 4"),
                          levels = 0:4,
                          labels = c("NS/NR", "Izquierda", "Centro", "Derecha", "Independiente/Ninguno")),
         educ_nf = factor(car::recode(m01, recodes = "0=0 ; 1:3 = 1; 4:5 = 2; 6:7 = 3; 8:10 = 4"),
                          levels = 0:4,
                          labels = c("NS/NR", "Básica", "Media", "Técnica", "Universitaria")),
         clase_nf = factor(car::recode(c33, recodes = "0 = 0; 1:2 = 1; 3 = 2; 4:5 = 3"),
                           levels = 0:3,
                           labels = c("NS/NR", "Clase baja", "Clase media", "Clase alta")),
         clase_nf2 = factor(car::recode(d01_01, recodes = "-1 = 0; 0:3 = 1; 4:6 = 2; 7:10 = 3"),
                            levels = 0:3,
                            labels = c("NS/NR", "Clase baja", "Clase media", "Clase alta")),
         edad_nf = factor(car::recode(m0_edad, "18:29 = 1; 30:49 = 2; 50:64 = 3; 65:150 = 4"),
                          levels = 1:4,
                          labels = c("18-29 años", "30-49 años", "50-64 años", "65 o más años")),
         cont_mig_nf = factor(car::recode(r05_02, recodes = "0= 0; 1 = 1; 2:5 = 2"),
                             levels = 0:2,
                             labels = c("NS/NR","Ninguno",
                                        "Algunos, bastantes o muchos")),
         frec_cont_nf = factor(car::recode(r06, recodes = "0=0; 1:2 = 1; 3 = 2; 4:5 = 3"),
                          levels = 0:3,
                          labels = c("NS/NR",
                                     "Baja frecuencia de contacto",
                                     "Mediana frecuencia de contacto",
                                     "Alta frecuencia de contacto")),
         cont_pos_nf = factor(car::recode(r07, recodes = "0=0; 1:2 = 1; 3 = 2; 4:5 = 3"),
                          levels = 0:3,
                          labels = c("NS/NR",
                                     "Muy poco amistosa o Poco amistosa",
                                     "Ni amistosa ni no amistosa",
                                     "Bastante amistosa o muy amistosa")),
         frec_cont_neg_nf = factor(car::recode(r08, recodes = "0=0; 1 = 1; 2:3 = 2; 4:5 = 3"),
                                   levels = 0:3,
                                   labels = c("NS/NR",
                                              "Baja frecuencia de contacto negativo",
                                              "Mediana frecuencia de contacto negativo",
                                              "Alta frecuencia de contacto negativo"))
  )

# asignacion escala izquierda-derecha
rango_conteo <- ell_23 %>%
  group_by(idencuesta) %>%
  summarise(
    count_1 = sum(c15 == -1, na.rm = TRUE),
    count_0_4 = sum(c15 %in% c(0:4), na.rm = TRUE),
    count_5 = sum(c15 == 5, na.rm = TRUE),
    count_6_10 = sum(c15 %in% c(6:10), na.rm = TRUE),
    count_11 = sum(c15 == 11, na.rm = TRUE),
    count_12 = sum(c15 == 12, na.rm = TRUE),
  )

ell_23 <- ell_23 %>%
  left_join(rango_conteo, by = "idencuesta") %>%
  mutate(
    c15 = case_when(
      count_1 >= 4 ~ 0,
      count_0_4 >= 4 ~ 1,
      count_5 >= 4 ~ 2,
      count_6_10 >= 4 ~ 3,
      count_11 >= 4 ~ 4,
      count_12 >= 4 ~ 5,
      TRUE ~ 4
    ))

# asignacion variables a ano base (2018) o promedio
ell_23 <- ell_23 %>%
  group_by(idencuesta) %>%
  mutate(m0_edad = ifelse(any(ola == 3), m0_edad[ola == 3], NA),
         educ = ifelse(any(ola == 3), m01[ola == 3], NA),
         clase = mean(c33, na.rm = TRUE),
         c33 = ifelse(any(ola == 3), c33[ola == 3], NA),
         d01_01 = ifelse(any(ola == 3), d01_01[ola == 3], NA),
         r16 = ifelse(any(ola == 4), r16[ola == 4], NA),
         r05_02 = ifelse(any(ola == 3), r05_02[ola == 3], NA),
         r06 = ifelse(any(ola == 3), r06[ola == 3], NA),
         r07 = ifelse(any(ola == 3), r07[ola == 3], NA),
         r08 = ifelse(any(ola == 3), r08[ola == 3], NA),
         t09_02 = ifelse(any(ola == 3), t09_02[ola == 3], NA),
         t10 = ifelse(any(ola == 3), t10[ola == 3], NA),
         zona_rec = ifelse(any(ola == 3), zona_rec[ola == 3], NA)) %>%
  ungroup()


# recodificar variables
ell_23 <- ell_23 %>%
  mutate(c15 = factor(car::recode(c15, recodes = "1 = 1; 2 = 2; 3 = 3; 4:5 = 4"),
                      levels = 1:4,
                      labels = c("Izquierda", "Centro", "Derecha", "Independiente/Ninguno")),
         educ = factor(car::recode(educ, recodes = "0 = 0; 1:3 = 1; 4:5 = 2; 6:7 = 3; 8:10 = 4"),
                       levels = 0:4,
                       labels = c("NS/NR", "Básica", "Media", "Técnica", "Universitaria")),
         c33 = factor(car::recode(c33, recodes = "0 = 0; 1:2 = 1; 3 = 2; 4:5 = 3"),
                      levels = 0:3,
                      labels = c("NS/NR", "Clase baja", "Clase media", "Clase alta")),
         clase = factor(car::recode(clase, recodes = "0 = 0; 1:2.5 = 1; 2.75:3.5 = 2; 3.75:5 = 3"),
                        levels = 0:3,
                        labels = c("NS/NR", "Clase baja", "Clase media", "Clase alta")),
         d01_01 = factor(car::recode(d01_01, recodes = "-1 = 0; 0:3 = 1; 4:6 = 2; 7:10 = 3"),
                         levels = 0:3,
                         labels = c("NS/NR", "Clase baja", "Clase media", "Clase alta")),
         m0_edad = factor(car::recode(m0_edad, "18:29 = 1; 30:49 = 2; 50:64 = 3; 65:150 = 4"),
                          levels = 1:4,
                          labels = c("18-29 años", "30-49 años", "50-64 años", "65 o más años")),
         r16 = factor(car::recode(r16, recodes = "0=0; 1:2 = 1; 3 = 2; 4:5 = 3"),
                          levels = 0:3,
                          labels = c("NS/NR","Nada de confianza o poca confianza",
                                     "Algo de confianza",
                                     "Bastante confianza o mucha confianza")),
         r05_02 = factor(car::recode(r05_02, recodes = "0= 0; 1 = 1; 2:5 = 2"),
                             levels = 0:2,
                             labels = c("NS/NR","Ninguno",
                                        "Algunos, bastantes o muchos")),
         r06 = factor(car::recode(r06, recodes = "0=0; 1:2 = 1; 3 = 2; 4:5 = 3"),
                          levels = 0:3,
                          labels = c("NS/NR",
                                     "Alta frecuencia de contacto",
                                     "Mediana frecuencia de contacto",
                                     "Baja frecuencia de contacto")),
         r07 = factor(car::recode(r07, recodes = "0=0; 1:2 = 1; 3 = 2; 4:5 = 3"),
                          levels = 0:3,
                          labels = c("NS/NR","Muy poco amistosa o Poco amistosa",
                                     "Ni amistosa ni no amistosa",
                                     "Bastante amistosa o muy amistosa")),
         r08 = factor(car::recode(r08, recodes = "0=0; 1 = 1; 2:3 = 2; 4:5 = 3"),
                          levels = 0:3,
                          labels = c("NS/NR",
                                     "Alta frecuencia de contacto negativo",
                                     "Mediana frecuencia de contacto negativo",
                                     "Baja frecuencia de contacto negativo")),
         t09_02 = factor(car::recode(t09_02, recodes = "0=0; 1:2 = 1; 3 = 2; 4:5 = 3"),
                      levels = 0:3,
                      labels = c("NS/NR","Nunca o pocas veces",
                                 "Algunas veces",
                                 "Muchas veces o siempre")),
         t10 = factor(car::recode(t10, recodes = "0=0; 1:2 = 1; 3 = 2; 4:5 = 3"),
                         levels = 0:3,
                         labels = c("NS/NR","Muy inseguro o inseguro",
                                    "Ni seguro ni inseguro",
                                    "Seguro o muy seguro")),
         zona_rec = factor(car::recode(zona_rec, recodes = "1 = 1; 2 = 2; 3 = 3; 4 = 4"),
                      levels = 1:4,
                      labels = c("Norte",
                                 "Centro",
                                 "Sur", "RM"))
         
  )


ell_23 <- ell_23 %>%
  mutate(
    ola = case_when(
      ola == 1 ~ 2016,
      ola == 2 ~ 2017,
      ola == 3 ~ 2018,
      ola == 4 ~ 2019,
      ola == 5 ~ 2021,
      ola == 6 ~ 2022,
      ola == 7 ~ 2023
    ) 
  )

cor(with(ell_23,cbind(g01_03,g01_04)),use="complete.obs")
library(psych)
alpha(with(ell_23,cbind(g01_03,g01_04)))
aux <- ell_23 %>%
  select(c05_03, c35_03) %>%
  filter(c05_03 != "NS/NR", c35_03 != "NS/NR") %>%
  mutate(across(everything(), as.numeric))
aux <- ell %>% select(c05_03, c35_03) %>%
  filter(c05_03 > 0, c35_03 > 0)
cor(aux) 

# 3. pasar base de datos consolidada a formato svy()

ell.svy <- svydesign(ids = ~segmento_disenno,weights = ~ponderador02,
                     data = ell_23,nest = TRUE,strata = ~estrato_disenno)

# 4. se crean vectores con las variables que van a ser usadas para la RCS

# 4.a. El primer vector llamado variables debe ir hasta la primera variable sociodemografica, en este caso m0_sexo

variables <- variables_vector[1:which(variables_vector=="m0_sexo")-1]

# 4.b. se renombran los vectores de la manera en la cual fueron recodificados (a todos menos a t11_01 se les añade _var)

variables <- ifelse(variables != "t11_01",paste(variables,"var",sep="_"),variables)

# 4.c se añade la variable creada llamada promedio_solidaridad

variables <- c("sdd_primaria","pro_soc","apoyo_soc","sexismo",variables)
variables_sd <- c("m0_sexo","edad_nf","educ_nf","clase_nf2","c15_nf","cont_mig_nf",
                  "frec_cont_nf","cont_pos_nf","frec_cont_neg_nf") # Para graficar las variables sociodemograficas sin fijar


# 4.d  se crea un vector con las variables sociodemograficas fijadas, y se crea un segundo vector llamado combined_vars donde se 
# combinan todas las variables junto con el signo +

variables_cruce <- c("m0_sexo","m0_edad","educ","d01_01","c15","pp_3",
                    "t09_02", "t10", "zona_rec", "cont_mig_nf",
                     "frec_cont_nf","cont_pos_nf","frec_cont_neg_nf") # Para hacer los cruces con las variables sociodemogarficas fijadas

combined_vars <- as.vector(outer(variables, variables_cruce[1:9], paste, sep = "+"))
combined_vars <- c(combined_vars,as.vector(outer(c("r09_var","r12_03_var",
                                                   "r12_04_var","r16_var","c37_05_var"),
                                                 c("cont_mig_nf",
                                                   "frec_cont_nf","cont_pos_nf",
                                                   "frec_cont_neg_nf"),paste,sep="+")))

# Se crean listas para guardar los graficos

graficos <- list()
graficos_sd <- list()
graficos_cruces <- list()

titulos <- c(label(ell_23$sdd_primaria)[1],label(ell_23$pro_soc)[1],
             label(ell_23$apoyo_soc)[1],label(ell_23$sexismo)[1],
             unlist(labels_list)[1:27])
titulos_sd <- unlist(labels_list)[28:36] # Hay que agregar titulo para el perfil de votantes 
                                        # Si es que se quiere graficar a lo largo del tiempo

# Se calculan los graficos


for (i in 1:length(variables)){
  var <- variables[i]
  
  t <- as.data.frame(svytable(as.formula(paste("~", var, "+ ola")), design=ell.svy))
  t <- t %>% group_by(ola) %>% mutate(prop = round(Freq/sum(Freq,na.rm=T),2)) %>%
    ungroup() %>% filter(get(var) != "NS/NR") %>% drop_na(prop)
  
  grafico <- ggplot(t,aes(x = ola, y = prop,color= .data[[var]],
                          group = .data[[var]],
                          label = scales::percent(prop, accuracy = .1))) + 
    theme_bw() +
    geom_point(size = 1.75) +
    geom_line(linewidth=1) +
    scale_y_continuous(labels = scales::percent,limits = c(0, 1)) +
    ylab(label = NULL) +
    xlab(label = NULL) +
    scale_color_viridis_d(begin = .0, end = .8, option = 'viridis',direction = -1) +
    geom_text_repel(size = 4, nudge_y = .01) +
    theme(plot.caption = element_text(hjust = 0),
          legend.position = 'top',
          legend.title = element_blank(),
          axis.text.x = element_text(size = 10,
                                     face = "bold"), # Tamaño de letra para el eje x
          axis.text.y = element_text(size = 10,
                                     face = "bold"),
          legend.text = element_text(size = 12),
          strip.text = element_text(size = 12)) +
    ggtitle(titulos[i], subtitle = "Porcentaje que responde...") +
    labs(caption = 'Fuente: ELSOC 2016-2023.\nNota: Se consideran observaciones de individuos sin atrición entre olas. N=12.749 (2.076 individuos).\nNo se grafican las categorías NS/NR.')
  if(i == length(variables)){
    for(j in 1:length(variables_sd)){
      var_sd <- variables_sd[j]
      t_sd <- as.data.frame(svytable(as.formula(paste("~", var_sd, "+ ola")), design=ell.svy))
      t_sd <- t_sd %>% group_by(ola) %>% mutate(prop = round(Freq/sum(Freq,na.rm=T),2)) %>%
        ungroup() %>% filter(get(var_sd) != "NS/NR") %>% drop_na(prop)
      
      grafico_sd <-  ggplot(t_sd,aes(x = ola, y = prop,color= .data[[var_sd]],
                                     group = .data[[var_sd]],
                                     label = scales::percent(prop, accuracy = .1))) + 
        theme_bw() +
        geom_point(size = 1.75) +
        geom_line(linewidth=1) +
        scale_y_continuous(labels = scales::percent,limits = c(0, 1)) +
        ylab(label = NULL) +
        xlab(label = NULL) +
        scale_color_viridis_d(begin = .0, end = .8, option = 'viridis') +
        geom_text_repel(size = 4, nudge_y = .01) +
        theme(plot.caption = element_text(hjust = 0),
              legend.position = 'top',
              legend.title = element_blank(),
              axis.text.x = element_text(size = 10,
                                         face = "bold"), # Tamaño de letra para el eje x
              axis.text.y = element_text(size = 10,
                                         face = "bold"),
              legend.text = element_text(size = 12),
              strip.text = element_text(size = 12)) +
        ggtitle(titulos_sd[j], subtitle = "Porcentaje que responde...") +
        labs(caption = 'Fuente: ELSOC 2016-2023.\nNota: Se consideran observaciones de individuos sin atrición entre olas. N=12.749 (2.076 individuos).\nNo se grafican las categorías NS/NR.')
      
      graficos_sd[[j]] <- grafico_sd
      names(graficos_sd)[j] <- var_sd
    }
  }
  graficos[[i]] <- grafico
  names(graficos)[i] <- var
}

# 5. se multiplican los titulos de los graficos según la cantidad de variables de cruce (sociodemograficas)

titulos_rep <- rep(titulos,length(variables_cruce[1:9]))
titulos_rep <- c(titulos_rep,rep(unlist(labels_list)[c(9:12,27)],4))

# 6. se crea un vector para poder filtrar las categorias de los cruces que interesan ser graficadas,
# en este vector pueden sobrar categorias, pero no pueden faltar dado que de lo contrario el grafico no se calculará

categorias_grafico <- c("Lo hizo una o más de dos veces", # Comportamiento prosocial
                        "Casi siempre se puede confiar en las personas", # Confianza social 1
                        "La mayoria de las veces tratan de ayudar a los demas", # Confianza social 2
                        "La mayoria de la gente trataria de ser justa", # Confianza social 3
                        "Bastante o mucho",
                        "De acuerdo o totalmente de acuerdo",
                        "De acuerdo o Totalmente de acuerdo",
                        "Lo hizo una o más de dos veces",
                        "Bastante o totalmente dispuesto",
                        "Siempre o muchas veces",
                        "Algo, bastante o mucha",
                        "Algunos, bastantes o muchos",
                        "Bastante amistosa o muy amistosa",
                        "Bastante confianza o mucha confianza",
                        "A veces, frecuentemente o muy frecuentemente",
                        "Casi siempre o siempre",
                        "Bastantes o muchos",
                        "Algunos, bastantes o muchos",
                        "Bastante o mucho",
                        "Alta frecuencia",
                        "Alto nivel")



# Se calculan los graficos de cruce

t_cruce <- as.data.frame(svytable(~sexismo+educ+ola, design=ell.svy))

variable_cruce <- colnames(t_cruce[2])
variable <- colnames(t_cruce[1])

t_cruce <- t_cruce %>% group_by(ola, .data[[variable_cruce]]) %>% 
  mutate(prop = round(Freq/sum(Freq,na.rm=T),2)) %>%
  ungroup() %>% arrange(ola) %>% filter(.data[[variable]] != "NS/NR") %>%
  filter(.data[[variable_cruce]] != "NS/NR") %>%
  filter(.data[[variable]] %in% categorias_grafico)

ggplot(t_cruce,aes(y=prop,x=ola,color=.data[[variable]],
                   group=.data[[variable]],
                   label=scales::percent(prop,accuarcy=.1))) + 
  theme_bw() +
  geom_point(size = 1.75) +
  geom_line(linewidth = 1) +
  scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
  facet_wrap(as.formula(paste("~", variable_cruce))) +
  ylab(label = NULL) + xlab(label = NULL) +
  scale_color_viridis_d(begin = .0, end = .8, option = 'viridis') +
  geom_text_repel(size = 4, nudge_y = .01) +
  theme(plot.caption = element_text(hjust = 0),
        legend.position = 'top',
        legend.title = element_blank(),
        axis.text.x = element_text(size = 10,
                                   face = "bold"), # Tamaño de letra para el eje x
        axis.text.y = element_text(size = 10),
        legend.text = element_text(size = 12),
        strip.text = element_text(size = 12))

for (j in 1:length(combined_vars)){
  c_vars <- combined_vars[j]
  t_cruce <- as.data.frame(svytable(as.formula(paste("~",c_vars,"+ola")),
                                    design = ell.svy))
  variable_cruce <- colnames(t_cruce[2])
  variable <- colnames(t_cruce[1])
  t_cruce <- t_cruce %>% group_by(ola, .data[[variable_cruce]]) %>% 
    mutate(prop = round(Freq/sum(Freq,na.rm=T),2)) %>%
    ungroup() %>% arrange(ola) %>% filter(.data[[variable]] != "NS/NR") %>%
    filter(.data[[variable_cruce]] != "NS/NR")
  
  t_cruce <- t_cruce %>% drop_na(prop) %>% filter(.data[[variable]] %in% categorias_grafico)
  
  grafico_cruce <- ggplot(t_cruce,aes(y=prop,x=ola,color=.data[[variable]],
                                      group=.data[[variable]],
                                      label=scales::percent(prop,accuarcy=.1))) + 
    theme_bw() +
    geom_point(size = 1.75) +
    geom_line(linewidth = 1) +
    scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
    facet_wrap(as.formula(paste("~", variable_cruce))) +
    ylab(label = NULL) + xlab(label = NULL) +
    scale_color_viridis_d(begin = .0, end = .8, option = 'viridis') +
    geom_text_repel(size = 4, nudge_y = .01) +
    theme(plot.caption = element_text(hjust = 0),
          legend.position = 'top',
          legend.title = element_blank(),
          axis.text.x = element_text(size = 10,
                                     face = "bold"), # Tamaño de letra para el eje x
          axis.text.y = element_text(size = 10),
          legend.text = element_text(size = 12),
          strip.text = element_text(size = 12)) +
    ggtitle(titulos_rep[j], subtitle = 'Porcentaje que responde...') +
    labs(caption = 'Fuente: ELSOC 2016-2023.\nNota: Se consideran observaciones de individuos sin atrición entre olas. N=12.749 (2.076 individuos).')
  
  graficos_cruces[[j]] <- grafico_cruce
  names(graficos_cruces)[j] <- paste(variable_cruce,variable,sep="_")
}

t <- as.data.frame(svytable(~pp_3,design = ell.svy))
t <- t %>% mutate(prop = round(Freq/sum(Freq,na.rm=T),2)) %>% drop_na(prop) %>% 
  ggplot(.,aes(x=pp_3,y=prop,color=pp_3,fill=pp_3,
               label=scales::percent(prop,accuarcy=.1))) +
  theme_bw() +
  geom_bar(stat="identity") +
  scale_y_continuous(labels = scales::percent,limits = c(0,1)) +
  geom_col(position = 'dodge') + 
  geom_text(position = position_dodge(width = .9),    # move to center of bars
            vjust = -0.5,size = 4) +
  ylab(label = NULL) + xlab(label = NULL) +
  scale_color_viridis_d(begin = .0, end = .8, option = 'viridis') +
  scale_fill_viridis_d(begin = .0, end = .8, option = 'viridis') +
  theme(plot.caption = element_text(hjust = 0),
        legend.position = 'top',
        legend.title = element_blank(),
        axis.text.x = element_text(size = 10,
                                   face = "bold"), # Tamaño de letra para el eje x
        axis.text.y = element_text(size = 10),
        legend.text = element_text(size = 12),
        strip.text = element_text(size = 12)) +
  ggtitle("Tipo de votante") +
  labs(caption = 'Fuente: ELSOC 2016-2023.\nNota: Se consideran observaciones de individuos sin atrición entre olas. N=12.749 (2.076 individuos).')

t

graficos_sd[[10]] <- t
names(graficos_sd)[10] <- "pp_3"

t <- as.data.frame(svytable(~c15_nf + ola, design=ell.svy))
t <- t %>% group_by(ola) %>% 
  mutate(prop = round(Freq/sum(Freq,na.rm=T),2)) %>% drop_na(prop) %>%
  filter(c15_nf != "NS/NR") %>%
  ggplot(.,aes(x=ola,y=prop,color=c15_nf,fill=c15_nf,
               label=scales::percent(prop,accuarcy=.1))) +
  theme_bw() +
  geom_bar(stat = "identity",
           aes(fill=c15_nf,color=c15_nf)) + 
  scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
  ylab(label = NULL) + xlab(label = NULL) +
  scale_color_viridis_d(begin = .0, end = .8, option = 'viridis',direction =1) +
  scale_fill_viridis_d(begin = .0, end = .8, option = 'viridis',direction=1) +
  theme(plot.caption = element_text(hjust = 0),
        legend.position = 'top',
        legend.title = element_blank(),
        axis.text.x = element_text(size = 10, face = "bold"),
        axis.text.y = element_text(size = 10),
        legend.text = element_text(size = 12),
        strip.text = element_text(size = 12)) +
  geom_text(data = function(x) { group_by(.data = x, ola, c15_nf) %>%
      summarise(prop = sum(prop, na.rm = TRUE), idencuesta = 1) %>%
      ungroup()},
      aes(label = scales::percent(prop, accuracy = .1)),
      position = position_stack(vjust = .5),
      show.legend = FALSE,
      size = 4,
      color = rep(c('white', 'white','black','black'),7)) +
  ggtitle("Identificación Ideológica",
          subtitle = "Porcentaje que responde...") +
  labs(caption = 'Fuente: ELSOC 2016-2023.\nNota: Se consideran observaciones de individuos sin atrición entre olas. N=12.749 (2.076 individuos).\nNo se grafican las categorías NS/NR.')

graficos_sd[[11]] <- t
names(graficos_sd)[11] <- "c15_nf_bar"

# Sexo "","","","","c15_nf"

t <- as.data.frame(svytable(~m0_sexo + ola, design=ell.svy))
t <- t %>% group_by(ola) %>% 
  mutate(prop = round(Freq/sum(Freq,na.rm=T),2)) %>% drop_na(prop) %>%
  filter(m0_sexo != "NS/NR") %>%
  ggplot(.,aes(x=ola,y=prop,color=m0_sexo,fill=m0_sexo,
               label=scales::percent(prop,accuarcy=.1))) +
  theme_bw() +
  geom_bar(stat = "identity",
           aes(fill=m0_sexo,color=m0_sexo)) + 
  scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
  ylab(label = NULL) + xlab(label = NULL) +
  scale_color_viridis_d(begin = .0, end = .8, option = 'viridis') +
  scale_fill_viridis_d(begin = .0, end = .8, option = 'viridis') +
  theme(plot.caption = element_text(hjust = 0),
        legend.position = 'top',
        legend.title = element_blank(),
        axis.text.x = element_text(size = 10, face = "bold"),
        axis.text.y = element_text(size = 10),
        legend.text = element_text(size = 12),
        strip.text = element_text(size = 12)) +
  geom_text(data = function(x) { group_by(.data = x, ola, m0_sexo) %>%
      summarise(prop = sum(prop, na.rm = TRUE), idencuesta = 1) %>%
      ungroup()},
      aes(label = scales::percent(prop, accuracy = .1)),
      position = position_stack(vjust = .5),
      show.legend = FALSE,
      size = 4,
      color = rep(c('white','black'),7)) +
  ggtitle("Sexo del entrevistado",
          subtitle = "Porcentaje que responde...") +
  labs(caption = 'Fuente: ELSOC 2016-2023.\nNota: Se consideran observaciones de individuos sin atrición entre olas. N=12.749 (2.076 individuos).\nNo se grafican las categorías NS/NR.')

graficos_sd[[length(graficos_sd)+1]] <- t
names(graficos_sd)[length(graficos_sd)] <- "sexo_nf_bar"

# EDAD

t <- as.data.frame(svytable(~edad_nf + ola, design=ell.svy))
t <- t %>% group_by(ola) %>% 
  mutate(prop = round(Freq/sum(Freq,na.rm=T),2)) %>% drop_na(prop) %>%
  filter(edad_nf != "NS/NR") %>%
  ggplot(.,aes(x=ola,y=prop,color=edad_nf,fill=edad_nf,
               label=scales::percent(prop,accuarcy=.1))) +
  theme_bw() +
  geom_bar(stat = "identity",
           aes(fill=edad_nf,color=edad_nf)) + 
  scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
  ylab(label = NULL) + xlab(label = NULL) +
  scale_color_viridis_d(begin = .0, end = .8, option = 'viridis') +
  scale_fill_viridis_d(begin = .0, end = .8, option = 'viridis') +
  theme(plot.caption = element_text(hjust = 0),
        legend.position = 'top',
        legend.title = element_blank(),
        axis.text.x = element_text(size = 10, face = "bold"),
        axis.text.y = element_text(size = 10),
        legend.text = element_text(size = 12),
        strip.text = element_text(size = 12)) +
  geom_text(data = function(x) { group_by(.data = x, ola, edad_nf) %>%
      summarise(prop = sum(prop, na.rm = TRUE), idencuesta = 1) %>%
      ungroup()},
      aes(label = scales::percent(prop, accuracy = .1)),
      position = position_stack(vjust = .5),
      show.legend = FALSE,
      size = 4,
      color = rep(c('white','white','black','black'),7)) +
  ggtitle("Edad del entrevistado",
          subtitle = "Porcentaje que responde...") +
  labs(caption = 'Fuente: ELSOC 2016-2023.\nNota: Se consideran observaciones de individuos sin atrición entre olas. N=12.749 (2.076 individuos).\nNo se grafican las categorías NS/NR.')

graficos_sd[[length(graficos_sd)+1]] <- t
names(graficos_sd)[length(graficos_sd)] <- "edad_nf_bar"

# EDUCACION

t <- as.data.frame(svytable(~educ_nf + ola, design=ell.svy))
t <- t %>% group_by(ola) %>% 
  mutate(prop = round(Freq/sum(Freq,na.rm=T),2)) %>% drop_na(prop) %>%
  filter(educ_nf != "NS/NR") %>%
  ggplot(.,aes(x=ola,y=prop,color=educ_nf,fill=educ_nf,
               label=scales::percent(prop,accuarcy=.1))) +
  theme_bw() +
  geom_bar(stat = "identity",
           aes(fill=educ_nf,color=educ_nf)) + 
  scale_y_continuous(labels = scales::percent, limits = c(0, 1.01)) +
  ylab(label = NULL) + xlab(label = NULL) +
  scale_color_viridis_d(begin = .0, end = .8, option = 'viridis') +
  scale_fill_viridis_d(begin = .0, end = .8, option = 'viridis') +
  theme(plot.caption = element_text(hjust = 0),
        legend.position = 'top',
        legend.title = element_blank(),
        axis.text.x = element_text(size = 10, face = "bold"),
        axis.text.y = element_text(size = 10),
        legend.text = element_text(size = 12),
        strip.text = element_text(size = 12)) +
  geom_text(data = function(x) { group_by(.data = x, ola, educ_nf) %>%
      summarise(prop = sum(prop, na.rm = TRUE), idencuesta = 1) %>%
      ungroup()},
      aes(label = scales::percent(prop, accuracy = .1)),
      position = position_stack(vjust = .5),
      show.legend = FALSE,
      size = 4,
      color = rep(c('white','white','black','black'),7)) +
  ggtitle("Educación del entrevistado",
          subtitle = "Porcentaje que responde...") +
  labs(caption = 'Fuente: ELSOC 2016-2023.\nNota: Se consideran observaciones de individuos sin atrición entre olas. N=12.749 (2.076 individuos).\nNo se grafican las categorías NS/NR.')

graficos_sd[[length(graficos_sd)+1]] <- t
names(graficos_sd)[length(graficos_sd)] <- "educacion_nf_bar"

# EDUCACION

t <- as.data.frame(svytable(~clase_nf2 + ola, design=ell.svy))
t <- t %>% group_by(ola) %>% 
  mutate(prop = round(Freq/sum(Freq,na.rm=T),2)) %>% drop_na(prop) %>%
  filter(clase_nf2 != "NS/NR") %>%
  ggplot(.,aes(x=ola,y=prop,color=clase_nf2,fill=clase_nf2,
               label=scales::percent(prop,accuarcy=.1))) +
  theme_bw() +
  geom_bar(stat = "identity",
           aes(fill=clase_nf2,color=clase_nf2)) + 
  scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
  ylab(label = NULL) + xlab(label = NULL) +
  scale_color_viridis_d(begin = .0, end = .8, option = 'viridis') +
  scale_fill_viridis_d(begin = .0, end = .8, option = 'viridis') +
  theme(plot.caption = element_text(hjust = 0),
        legend.position = 'top',
        legend.title = element_blank(),
        axis.text.x = element_text(size = 10, face = "bold"),
        axis.text.y = element_text(size = 10),
        legend.text = element_text(size = 12),
        strip.text = element_text(size = 12)) +
  geom_text(data = function(x) { group_by(.data = x, ola, clase_nf2) %>%
      summarise(prop = sum(prop, na.rm = TRUE), idencuesta = 1) %>%
      ungroup()},
      aes(label = scales::percent(prop, accuracy = .1)),
      position = position_stack(vjust = .5),
      show.legend = FALSE,
      size = 4,
      color = rep(c('white','white','black'),7)) +
  ggtitle("Clase social subjetiva del entrevistado",
          subtitle = "Porcentaje que responde...") +
  labs(caption = 'Fuente: ELSOC 2016-2023.\nNota: Se consideran observaciones de individuos sin atrición entre olas. N=12.749 (2.076 individuos).\nNo se grafican las categorías NS/NR.')

graficos_sd[[length(graficos_sd)+1]] <- t
names(graficos_sd)[length(graficos_sd)] <- "clase_nf_bar"

# ZONA

t <- as.data.frame(svytable(~zona_rec_var + ola, design=ell.svy))
t <- t %>% group_by(ola) %>% 
  mutate(prop = round(Freq/sum(Freq,na.rm=T),2),
         zona_rec_var = factor(zona_rec_var,levels = c("Norte","Centro","Sur","RM"))) %>% 
  drop_na(prop) %>% 
  filter(zona_rec_var != "NS/NR") %>% 
  ggplot(.,aes(x=ola,y=prop,color=zona_rec_var,fill=zona_rec_var,
               label=scales::percent(prop,accuarcy=.1))) +
  theme_bw() +
  geom_bar(stat = "identity",
           aes(fill=zona_rec_var,color=zona_rec_var)) + 
  scale_y_continuous(labels = scales::percent, limits = c(0, 1.01)) +
  ylab(label = NULL) + xlab(label = NULL) +
  scale_color_viridis_d(begin = .0, end = .8, option = 'viridis') +
  scale_fill_viridis_d(begin = .0, end = .8, option = 'viridis') +
  theme(plot.caption = element_text(hjust = 0),
        legend.position = 'top',
        legend.title = element_blank(),
        axis.text.x = element_text(size = 10, face = "bold"),
        axis.text.y = element_text(size = 10),
        legend.text = element_text(size = 12),
        strip.text = element_text(size = 12)) +
  geom_text(data = function(x) { group_by(.data = x, ola, zona_rec_var) %>%
      summarise(prop = sum(prop, na.rm = TRUE), idencuesta = 1) %>%
      ungroup()},
      aes(label = scales::percent(prop, accuracy = .1)),
      position = position_stack(vjust = .5),
      show.legend = FALSE,
      size = 4,
      color = rep(c('white','white','black','black'),7)) +
  ggtitle("Zona geografica del entrevistado",
          subtitle = "Porcentaje que responde...") +
  labs(caption = 'Fuente: ELSOC 2016-2023.\nNota: Se consideran observaciones de individuos sin atrición entre olas. N=12.749 (2.076 individuos).\nNo se grafican las categorías NS/NR.')

t

graficos_sd[[length(graficos_sd)+1]] <- t
names(graficos_sd)[length(graficos_sd)] <- "zona_nf_bar"

t <- as.data.frame(svytable(~c05_03_var+c35_03_var+ola,
                            design = ell.svy))

t <- t %>% group_by(ola,c35_03_var) %>% 
  mutate(prop = round(Freq/sum(Freq,na.rm=T),2)) %>%
  ungroup() %>% arrange(ola) %>% filter(c05_03_var != "NS/NR") %>%
  filter(c35_03_var != "NS/NR") %>% 
  filter(c05_03_var %in% categorias_grafico) %>%
  mutate(c35_03_var = factor(c35_03_var,labels=c("Nunca o casi nunca \ntrato justo",
                                                  "A veces \ntrato justo",
                                                  "Siempre o casi siempre \ntrato justo"))) %>%
  ggplot(.,aes(y=prop,x=ola,color=c05_03_var,
                     group=c05_03_var,
                     label=scales::percent(prop,accuarcy=.1))) + 
  theme_bw() +
  geom_point(size = 1.75) +
  geom_line(linewidth = 1) +
  scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
  facet_wrap(~c35_03_var) +
  ylab(label = NULL) + xlab(label = NULL) +
  scale_color_viridis_d(begin = .0, end = .8, option = 'viridis',direction = 1) +
  geom_text_repel(size = 4, nudge_y = .01) +
  theme(plot.caption = element_text(hjust = 0),
        legend.position = 'top',
        legend.title = element_blank(),
        axis.text.x = element_text(size = 10,
                                   face = "bold"), # Tamaño de letra para el eje x
        axis.text.y = element_text(size = 10),
        legend.text = element_text(size = 12),
        strip.text = element_text(size = 12)) +
  ggtitle(labels_list[["c05_03"]], 
          subtitle = 'Porcentaje que responde...') +
  labs(caption = 'Fuente: ELSOC 2016-2023.\nNota: Se consideran observaciones de individuos sin atrición entre olas. N=12.749 (2.076 individuos).')

t

graficos_cruces[[length(graficos_cruces)+1]] <- t
names(graficos_cruces)[length(graficos_cruces)] <- "c35_03_c05_03"

# Poder judicial: se replica el mismo filtro y conteo usados en index.qmd

t <- ell_23 %>% 
  filter(tipo_atricion == 1) %>%
  filter(!is.na(ola)) %>%
  group_by(idencuesta) %>%
  slice_max(order_by = ola, n = 1, with_ties = FALSE) %>%
  ungroup() %>%
  drop_na(c05_05) %>%
  mutate(conf_judicial = case_when(
    c05_05 == 1 ~ "Nada",
    c05_05 == 2 ~ "Poca",
    c05_05 %in% 3:5 ~ "Algo, bastante o mucha",
    TRUE ~ NA_character_
  )) %>%
  filter(!is.na(conf_judicial)) %>%
  count(conf_judicial) %>%
  mutate(prop = n / sum(n),
         pct_label = paste0(floor(prop * 100), "%"),
         conf_judicial = factor(conf_judicial, levels = c("Nada", "Poca", "Algo, bastante o mucha"))) %>%
  ggplot(aes(x = conf_judicial, y = prop, fill = conf_judicial, label = pct_label)) +
  geom_col(width = 0.35) +
  geom_text(vjust = -0.4, size = 4) +
  scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
  scale_fill_manual(values = c("Nada" = "#9BD44C", "Poca" = "#4D7DD1", "Algo, bastante o mucha" = "#7633A5")) +
  labs(title = "Grado de confianza: En el poder judicial (última ola respondida)",
       subtitle = "Muestra 1 (7 olas) y muestra 2 (5 olas) sin atrición",
       x = NULL,
       y = NULL) +
  theme_minimal(base_size = 12) +
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor = element_blank(),
        legend.position = "none",
        plot.title = element_text(color = "#1676D2", face = "bold", hjust = 0.5),
        axis.text.x = element_text(size = 10),
        axis.text.y = element_text(size = 10))

t

graficos_sd[[length(graficos_sd)+1]] <- t
names(graficos_sd)[length(graficos_sd)] <- "c05_05_bar_index"

t <- ell_23 %>% 
  filter(tipo_atricion == 1, !is.na(ola)) %>% 
  drop_na(c05_05) %>% 
  mutate(conf_judicial = case_when(
    c05_05 == 1 ~ "Nada",
    c05_05 == 2 ~ "Poca",
    c05_05 %in% 3:5 ~ "Algo, bastante o mucha",
    TRUE ~ NA_character_
  )) %>% 
  filter(!is.na(conf_judicial)) %>% 
  count(ola, conf_judicial) %>% 
  group_by(ola) %>% 
  mutate(prop = n / sum(n)) %>% 
  ungroup() %>% 
  mutate(conf_judicial = factor(conf_judicial, levels = c("Nada", "Poca", "Algo, bastante o mucha"))) %>% 
  ggplot(aes(x = ola, y = prop, color = conf_judicial, group = conf_judicial, label = scales::percent(prop, accuracy = 1))) +
  geom_line(linewidth = 0.8) +
  geom_point(size = 2) +
  geom_text(vjust = -0.5, size = 3) +
  scale_x_continuous(breaks = 1:7, labels = c("2016", "2017", "2018", "2019", "2021", "2022", "2023")) +
  scale_y_continuous(labels = scales::percent, limits = c(0, 1)) +
  scale_color_manual(values = c("Nada" = "#7AD151", "Poca" = "#2A9AB7", "Algo, bastante o mucha" = "#440154")) +
  labs(title = "Grado de confianza: El Poder Judicial",
       subtitle = "Muestra 1 y 2 sin atrición; NA excluidos del porcentaje",
       x = NULL,
       y = NULL,
       color = NULL) +
  theme_minimal(base_size = 12) +
  theme(panel.grid.major.x = element_blank(),
        panel.grid.minor = element_blank(),
        legend.position = "top",
        plot.title = element_text(color = "#1676D2", face = "bold", hjust = 0),
        plot.subtitle = element_text(hjust = 0),
        axis.text.x = element_text(size = 10),
        axis.text.y = element_text(size = 10))

t

graficos[["c05_05_var"]] <- t

# Se guradan los graficos

# Modificacion de graficos

graficos_sd[["frec_cont_nf"]] <- graficos_sd[["frec_cont_nf"]] + scale_color_viridis_d(begin = .0, end = .8, 
                                                                                            option = 'viridis',
                                                                                            direction = -1) 

graficos_sd[["frec_cont_neg_nf"]] <- graficos_sd[["frec_cont_neg_nf"]] + scale_color_viridis_d(begin = .0, end = .8, 
                                                                                           option = 'viridis',
                                                                                           direction = -1)

graficos_sd[["cont_pos_nf"]] <- graficos_sd[["cont_pos_nf"]] + scale_color_viridis_d(begin = .0, end = .8, 
                                                                                               option = 'viridis',
                                                                                               direction = -1)

output_dir <- "/Users/gustavoahumada/Dropbox/ELSOC2023/tareas/propuesta_RCS2023/resultados/graficos_lineas/nuevos_graficos2"
#output_dir <- "C:/Users/aigon/Dropbox/ELSOC2023/tareas/propuesta_RCS2023/resultados/graficos_lineas/nuevos_graficos2"


for (i in seq_along(graficos)) {
  file_name <- paste(output_dir,paste0(names(graficos)[i],".png"),sep="/")
  tryCatch({
    ggsave(file_name, graficos[[i]], width = 12, height = 7)
  }, error = function(e) {})
}

for (i in seq_along(graficos_sd)) {
  file_name <- paste(output_dir,paste0(names(graficos_sd)[i],".png"),sep="/")
  tryCatch({
    ggsave(file_name, graficos_sd[[i]], width = 10, height = 7)
  }, error = function(e) {})
}

for (i in seq_along(graficos_cruces)) {
  file_name <- paste(output_dir,paste0(names(graficos_cruces)[i],".png"),sep="/")
  tryCatch({
    ggsave(file_name, graficos_cruces[[i]], width = 10, height = 7)
  }, error = function(e) {})
}