library(tidyverse)
library(janitor)
library(survey)
library(broom)
library(modelsummary)
library(scales)
library(kableExtra)

# Paleta de colores coherente para todo el documento
col_blue  <- "#2C6FAC"
col_red   <- "#C0392B"
col_amber <- "#E67E22"
col_green <- "#27AE60"

pal_eu    <- c("#C0392B", "#E67E22", "#2C6FAC")
pal_trade <- c("#C0392B", "#E67E22", "#27AE60")

# Etiquetas legibles para el coefficient plot
var_labels <- c(
  "econ_worse_c"                 = "Evaluación económica (peor →)",
  "pro_eu_c"                     = "Pro-integración europea",
  "trade_liberal_c"              = "Pro-liberalización comercial",
  "ideology_lr_c"                = "Ideología (izq. → der.)",
  "political_interest_c"         = "Interés político",
  "age_c"                        = "Edad",
  "female"                       = "Mujer",
  "education_3cat_c"             = "Nivel educativo",
  "econ_worse_c:pro_eu_c"        = "Evaluación econ. × Pro-UE",
  "econ_worse_c:trade_liberal_c" = "Evaluación econ. × Liberal comercio"
)

level_order <- rev(c(
  "Evaluación económica (peor →)",
  "Pro-integración europea",
  "Pro-liberalización comercial",
  "Ideología (izq. → der.)",
  "Interés político",
  "Edad",
  "Mujer",
  "Nivel educativo",
  "Evaluación econ. × Pro-UE",
  "Evaluación econ. × Liberal comercio"
))

pal_models <- c(
  "Base"                = "#555555",
  "Economía × UE"       = col_blue,
  "Economía × comercio" = col_green
)

pal_vote <- c(
  "Voto: Economía × UE"       = col_blue,
  "Voto: Economía × comercio" = col_green
)

1 Planteamiento del problema

Este trabajo analiza si la integración europea y las actitudes hacia la apertura económica modifican la lógica de rendición de cuentas económica entre los votantes españoles. El punto de partida es la tesis de Hellwig, según la cual, cuando los ciudadanos perciben que los gobiernos nacionales están constreñidos por fuerzas económicas externas, la evaluación del desempeño económico pierde peso en la decisión política y aumentan otras dimensiones de evaluación. En el caso español, el argumento se adapta al contexto de gobernanza multinivel de la Unión Europea: si parte de la política económica se percibe como condicionada por estructuras supranacionales, el castigo o premio al gobierno nacional por el desempeño económico puede debilitarse.

La pregunta de investigación es: ¿la integración europea y la apertura económica debilitan el vínculo entre evaluación económica nacional y apoyo al gobierno en España?

La hipótesis principal es que una evaluación negativa de la economía reduce la probabilidad de aprobar al gobierno, pero que este efecto será menor entre quienes apoyan más la integración europea o la liberalización comercial.

2 Carga de datos

La base de datos está en formato CSV con separador de punto y coma. La codificación puede requerir ISO-8859-1 para leer correctamente nombres con acentos.

ruta_ees <- "C:/Users/gari4/OneDrive/Escritorio/UC3M clases/2cuatri UC3M/Rendicion_cuentas_proyecto/data-raw/ZA8868_v1-0-0.csv"

ees_raw <- readr::read_delim(
  file = ruta_ees,
  delim = ";",
  locale = readr::locale(encoding = "ISO-8859-1"),
  show_col_types = FALSE,
  trim_ws = TRUE
) %>%
  clean_names()

dim(ees_raw)
## [1] 25904   184
names(ees_raw)[1:30]
##  [1] "za_nr"          "version"        "doi"            "year"          
##  [5] "resp_id"        "country"        "countrycode"    "country_alpha2"
##  [9] "d3"             "d4"             "d4_age"         "d8"            
## [13] "d2"             "q1a"            "q1a_oth"        "q1a_recoded"   
## [17] "q1a_ees"        "q1an"           "q2"             "q3"            
## [21] "q4"             "q5"             "q6"             "q6_oth"        
## [25] "q6_recoded"     "q6_ees"         "q6n"            "q7"            
## [29] "q8"             "q8_oth"

3 Auditoría inicial

Antes de recodificar, se verifica que España esté correctamente identificada y se revisa el tamaño de la submuestra.

ees_raw %>%
  count(country_alpha2, countrycode, country, sort = TRUE)
ees_spain_raw <- ees_raw %>%
  filter(country_alpha2 == "ES")

nrow(ees_spain_raw)
## [1] 1026

4 Funciones de limpieza

En las variables sustantivas del cuestionario, los códigos 96, 97, 98 y 99 no representan respuestas válidas. En las variables de partidos hay códigos especiales adicionales; por eso se tratan de forma separada.

na_q <- function(x) {
  x <- as.numeric(x)
  ifelse(x %in% c(96, 97, 98, 99), NA_real_, x)
}

valid_0_10 <- function(x) {
  x <- as.numeric(x)
  ifelse(x >= 0 & x <= 10, x, NA_real_)
}

valid_1_5 <- function(x) {
  x <- as.numeric(x)
  ifelse(x >= 1 & x <= 5, x, NA_real_)
}

valid_1_4 <- function(x) {
  x <- as.numeric(x)
  ifelse(x >= 1 & x <= 4, x, NA_real_)
}

5 Códigos de partidos para España

Para España, se trabaja principalmente con q6_recoded, que armoniza los códigos partidistas. El bloque de gobierno nacional en 2024 se codifica como PSOE y Sumar. Se excluyen los votos en blanco/nulos, no respuesta y no aplicables cuando la variable dependiente sea voto partidista.

party_codes_spain <- tibble::tribble(
  ~party_code, ~party,
  72401, "PP",
  72402, "PSOE",
  72403, "Vox",
  72404, "Ahora Repúblicas",
  72405, "Sumar",
  72406, "Se Acabó La Fiesta",
  72407, "Podemos",
  72408, "Junts",
  72409, "CEUS",
  72410, "PACMA",
  72411, "Ciudadanos"
)

party_codes_spain %>%
  kbl(col.names = c("Código", "Partido"), align = "rl") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "left"
  )
Código Partido
72401 PP
72402 PSOE
72403 Vox
72404 Ahora Repúblicas
72405 Sumar
72406 Se Acabó La Fiesta
72407 Podemos
72408 Junts
72409 CEUS
72410 PACMA
72411 Ciudadanos

6 Recodificación analítica

La variable q4 mide aprobación del gobierno. La variable q14 mide evaluación retrospectiva de la economía nacional en comparación con 12 meses antes, donde valores más altos indican una evaluación más negativa. La variable q17 mide apoyo a profundizar la integración europea. La variable q12_1 mide liberalización comercial frente a proteccionismo; en el cuestionario, 0 equivale a estar plenamente a favor de la liberalización comercial y 10 a estar plenamente a favor de proteger a productores domésticos. Por claridad interpretativa, se construye trade_liberal, donde valores altos indican mayor apoyo a la liberalización comercial.

ees_spain <- ees_spain_raw %>%
  mutate(
    weight = as.numeric(weight2),

    gov_approve = case_when(
      q4 == 1 ~ 1,
      q4 == 2 ~ 0,
      TRUE ~ NA_real_
    ),

    econ_worse = case_when(
      q14 %in% 1:5 ~ as.numeric(q14),
      TRUE ~ NA_real_
    ),

    pro_eu = valid_0_10(q17),

    protectionism = valid_0_10(q12_1),
    trade_liberal = 10 - protectionism,

    redistribution_support = case_when(
      q12_2 %in% 0:10 ~ 10 - as.numeric(q12_2),
      TRUE ~ NA_real_
    ),

    same_sex_marriage_support = case_when(
      q12_3 %in% 0:10 ~ 10 - as.numeric(q12_3),
      TRUE ~ NA_real_
    ),

    immigration_open = valid_0_10(q12_4),

    climate_priority = case_when(
      q12_5 %in% 0:10 ~ 10 - as.numeric(q12_5),
      TRUE ~ NA_real_
    ),

    ideology_lr = valid_0_10(q10),

    political_interest = case_when(
      q15 == 1 ~ 4,
      q15 == 2 ~ 3,
      q15 == 3 ~ 2,
      q15 == 4 ~ 1,
      TRUE ~ NA_real_
    ),

    age = as.numeric(d4_age),
    female = case_when(
      d3 == 2 ~ 1,
      d3 == 1 ~ 0,
      TRUE ~ NA_real_
    ),

    education_3cat = case_when(
      edu_rec %in% 1:3 ~ as.numeric(edu_rec),
      TRUE ~ NA_real_
    ),

    urban = case_when(
      d8 == 1 ~ 1,
      d8 == 2 ~ 2,
      d8 == 3 ~ 3,
      TRUE ~ NA_real_
    ),

    standard_living = case_when(
      d11 %in% 1:7 ~ as.numeric(d11),
      TRUE ~ NA_real_
    ),

    voted_incumbent_ep = case_when(
      q6_recoded %in% c(72402, 72405) ~ 1,
      q6_recoded %in% c(91, 96, 98) ~ NA_real_,
      !is.na(q6_recoded) ~ 0,
      TRUE ~ NA_real_
    ),

    party_voted_ep = case_when(
      q6_recoded %in% party_codes_spain$party_code ~ as.character(q6_recoded),
      q6_recoded == 90 ~ "Other party",
      q6_recoded == 91 ~ "Blank or null vote",
      q6_recoded == 96 ~ "Did not vote / not applicable",
      q6_recoded == 98 ~ "Don't know / don't remember",
      TRUE ~ NA_character_
    )
  ) %>%
  left_join(
    party_codes_spain %>% mutate(party_voted_ep = as.character(party_code)),
    by = "party_voted_ep"
  ) %>%
  mutate(
    party = if_else(is.na(party), party_voted_ep, party),

    econ_worse_c         = econ_worse      - mean(econ_worse,      na.rm = TRUE),
    pro_eu_c             = pro_eu          - mean(pro_eu,          na.rm = TRUE),
    trade_liberal_c      = trade_liberal   - mean(trade_liberal,   na.rm = TRUE),
    ideology_lr_c        = ideology_lr     - mean(ideology_lr,     na.rm = TRUE),
    age_c                = age             - mean(age,             na.rm = TRUE),
    political_interest_c = political_interest - mean(political_interest, na.rm = TRUE),
    education_3cat_c     = education_3cat  - mean(education_3cat,  na.rm = TRUE),
    standard_living_c    = standard_living - mean(standard_living, na.rm = TRUE)
  )

7 Revisión de valores después de limpiar

ees_spain %>%
  summarise(
    n                    = n(),
    gov_approve_valid    = sum(!is.na(gov_approve)),
    econ_valid           = sum(!is.na(econ_worse)),
    pro_eu_valid         = sum(!is.na(pro_eu)),
    trade_valid          = sum(!is.na(trade_liberal)),
    vote_incumbent_valid = sum(!is.na(voted_incumbent_ep))
  ) %>%
  kbl(col.names = c("N total", "Aprobación gov.", "Evaluación econ.",
                    "Pro-UE", "Liberal comercio", "Voto incumbente")) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
N total Aprobación gov. Evaluación econ. Pro-UE Liberal comercio Voto incumbente
1026 970 1004 958 942 750
ees_spain %>%
  count(party, sort = TRUE)

8 Análisis descriptivo

# Gradiente de color: verde (mejor) a rojo (peor)
econ_colors <- c("1" = col_green, "2" = "#82C882",
                 "3" = col_amber, "4" = "#E08060", "5" = col_red)

ees_spain %>%
  filter(!is.na(econ_worse)) %>%
  ggplot(aes(x = factor(econ_worse), fill = factor(econ_worse), weight = weight)) +
  geom_bar(color = "white", width = 0.7) +
  scale_fill_manual(values = econ_colors, guide = "none") +
  scale_y_continuous(expand = expansion(mult = c(0, 0.05))) +
  labs(
    title    = "Evaluación retrospectiva de la economía en España",
    subtitle = "Distribución ponderada de encuestados (EES 2024)",
    x        = "Evaluación económica (1 = mucho mejor → 5 = mucho peor)",
    y        = "Frecuencia ponderada",
    caption  = "Fuente: European Election Study 2024."
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title    = element_text(face = "bold"),
    plot.subtitle = element_text(color = "grey40"),
    panel.grid.major.x = element_blank()
  )

La figura muestra la distribución de la evaluación económica retrospectiva. Esta variable es el núcleo empírico de la rendición de cuentas económica: si los ciudadanos responsabilizan al gobierno por el desempeño económico, una evaluación negativa debería asociarse con menor aprobación gubernamental.

ees_spain %>%
  filter(!is.na(pro_eu)) %>%
  ggplot(aes(x = pro_eu, weight = weight)) +
  geom_histogram(binwidth = 1, boundary = -0.5,
                 fill = col_blue, color = "white") +
  scale_x_continuous(breaks = 0:10) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.05))) +
  labs(
    title    = "Actitudes hacia la integración europea en España",
    subtitle = "Distribución ponderada de encuestados (EES 2024)",
    x        = "0 = la integración ya ha ido demasiado lejos · 10 = debe profundizarse",
    y        = "Frecuencia ponderada",
    caption  = "Fuente: European Election Study 2024."
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title    = element_text(face = "bold"),
    plot.subtitle = element_text(color = "grey40"),
    panel.grid.major.x = element_blank()
  )

La figura permite observar la distribución de preferencias hacia la integración europea. En este trabajo, esta variable se interpreta como una aproximación al grado de aceptación de la gobernanza supranacional. No mide directamente la percepción de restricciones al margen de maniobra nacional, pero permite adaptar la tesis de Hellwig al contexto europeo.

ees_spain %>%
  filter(!is.na(trade_liberal)) %>%
  ggplot(aes(x = trade_liberal, weight = weight)) +
  geom_histogram(binwidth = 1, boundary = -0.5,
                 fill = col_green, color = "white") +
  scale_x_continuous(breaks = 0:10) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.05))) +
  labs(
    title    = "Apoyo a la liberalización comercial en España",
    subtitle = "Distribución ponderada de encuestados (EES 2024)",
    x        = "0 = proteccionismo · 10 = liberalización comercial",
    y        = "Frecuencia ponderada",
    caption  = "Fuente: European Election Study 2024."
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title    = element_text(face = "bold"),
    plot.subtitle = element_text(color = "grey40"),
    panel.grid.major.x = element_blank()
  )

La figura resume la orientación de los encuestados frente a la apertura comercial. A diferencia de la variable de integración europea, esta dimensión se aproxima de manera más directa a las actitudes frente a la globalización económica.

9 Diseño muestral

Se usa Weight2 porque ajusta por género, edad, urbanización, región y educación. Para modelos logísticos con pesos de encuesta se utiliza svyglm con familia quasibinomial.

analysis_gov <- ees_spain %>%
  filter(
    !is.na(gov_approve),
    !is.na(econ_worse_c),
    !is.na(pro_eu_c),
    !is.na(trade_liberal_c),
    !is.na(ideology_lr_c),
    !is.na(political_interest_c),
    !is.na(age_c),
    !is.na(female),
    !is.na(education_3cat_c),
    !is.na(weight)
  )

design_gov <- svydesign(
  ids     = ~1,
  weights = ~weight,
  data    = analysis_gov
)

10 Modelos de aprobación del gobierno

m1_base <- svyglm(
  gov_approve ~ econ_worse_c + pro_eu_c + trade_liberal_c + ideology_lr_c +
    political_interest_c + age_c + female + education_3cat_c,
  design = design_gov,
  family = quasibinomial()
)

m2_eu_interaction <- svyglm(
  gov_approve ~ econ_worse_c * pro_eu_c + trade_liberal_c + ideology_lr_c +
    political_interest_c + age_c + female + education_3cat_c,
  design = design_gov,
  family = quasibinomial()
)

m3_trade_interaction <- svyglm(
  gov_approve ~ econ_worse_c * trade_liberal_c + pro_eu_c + ideology_lr_c +
    political_interest_c + age_c + female + education_3cat_c,
  design = design_gov,
  family = quasibinomial()
)
coef_gov <- bind_rows(
  tidy(m1_base,              conf.int = TRUE) |> mutate(model = "Base"),
  tidy(m2_eu_interaction,    conf.int = TRUE) |> mutate(model = "Economía × UE"),
  tidy(m3_trade_interaction, conf.int = TRUE) |> mutate(model = "Economía × comercio")
) |>
  filter(term != "(Intercept)") |>
  mutate(
    term_label = var_labels[term],
    term_label = factor(term_label, levels = level_order),
    model      = factor(model, levels = c("Base", "Economía × UE", "Economía × comercio"))
  )

ggplot(coef_gov, aes(x = estimate, y = term_label, color = model, shape = model)) +
  geom_vline(xintercept = 0, linetype = "dashed", color = "grey60", linewidth = 0.6) +
  geom_pointrange(
    aes(xmin = conf.low, xmax = conf.high),
    position  = position_dodge(width = 0.6),
    linewidth = 0.7,
    size      = 0.4
  ) +
  scale_color_manual(values = pal_models) +
  scale_shape_manual(values = c("Base" = 16, "Economía × UE" = 17, "Economía × comercio" = 15)) +
  labs(
    title    = "Modelos de aprobación del gobierno",
    subtitle = "Coeficientes logísticos ponderados (svyglm, quasibinomial) · IC 95%",
    x        = "Coeficiente estimado (escala log-odds)",
    y        = NULL,
    color    = "Modelo",
    shape    = "Modelo",
    caption  = "Fuente: EES 2024. Línea discontinua = 0."
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title         = element_text(face = "bold"),
    plot.subtitle      = element_text(color = "grey40"),
    legend.position    = "bottom",
    panel.grid.minor   = element_blank(),
    panel.grid.major.y = element_line(color = "grey92")
  )

Ver tabla completa de coeficientes
Base Economía × UE Economía × comercio
(Intercept) -0.932*** -0.939*** -0.929***
(0.134) (0.136) (0.134)
econ_worse_c -1.142*** -1.137*** -1.138***
(0.102) (0.102) (0.101)
pro_eu_c 0.105** 0.103** 0.104**
(0.037) (0.037) (0.037)
trade_liberal_c -0.049 -0.048 -0.047
(0.038) (0.038) (0.037)
ideology_lr_c -0.360*** -0.360*** -0.363***
(0.041) (0.041) (0.043)
political_interest_c 0.082 0.076 0.083
(0.118) (0.118) (0.118)
age_c -0.017* -0.016* -0.016*
(0.007) (0.007) (0.007)
female 0.488* 0.487* 0.480*
(0.198) (0.198) (0.197)
education_3cat_c -0.017 -0.018 -0.015
(0.111) (0.111) (0.111)
econ_worse_c × pro_eu_c -0.024
(0.032)
econ_worse_c × trade_liberal_c 0.016
(0.035)
Num.Obs. 853 853 853
R2 0.368 0.369 0.368
R2 Adj. 0.362 0.362 0.362
F 23.226 21.305 21.255
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001

11 Probabilidades predichas: interacción economía e integración europea

mean_vals <- analysis_gov %>%
  summarise(
    trade_liberal_c      = 0,
    ideology_lr_c        = 0,
    political_interest_c = 0,
    age_c                = 0,
    female               = mean(female,        na.rm = TRUE),
    education_3cat_c     = 0,
    econ_mean            = mean(econ_worse,    na.rm = TRUE),
    pro_eu_mean          = mean(pro_eu,        na.rm = TRUE),
    trade_mean           = mean(trade_liberal, na.rm = TRUE)
  )

new_eu <- expand_grid(
  econ_worse = 1:5,
  pro_eu     = c(0, 5, 10)
) %>%
  mutate(
    econ_worse_c         = econ_worse - mean_vals$econ_mean,
    pro_eu_c             = pro_eu     - mean_vals$pro_eu_mean,
    trade_liberal_c      = 0,
    ideology_lr_c        = 0,
    political_interest_c = 0,
    age_c                = 0,
    female               = mean_vals$female,
    education_3cat_c     = 0
  )

pred_eu <- predict(m2_eu_interaction, newdata = new_eu, type = "response", se.fit = TRUE)

plot_eu <- new_eu %>%
  mutate(
    pred  = as.numeric(pred_eu),
    se    = sqrt(as.numeric(attr(pred_eu, "var"))),
    lower = pmax(0, pred - 1.96 * se),
    upper = pmin(1, pred + 1.96 * se),

    pro_eu_label = factor(
      pro_eu,
      levels = c(0, 5, 10),
      labels = c(
        "Ha ido demasiado lejos",
        "Posición intermedia",
        "Debe profundizarse"
      )
    )
  )

ggplot(plot_eu, aes(x = econ_worse, y = pred,
                    color = pro_eu_label, linetype = pro_eu_label,
                    fill  = pro_eu_label)) +
  geom_ribbon(aes(ymin = lower, ymax = upper), alpha = 0.12, color = NA) +
  geom_line(linewidth = 1) +
  geom_point(size = 2.5) +
  scale_color_manual(values = pal_eu) +
  scale_fill_manual(values  = pal_eu) +
  scale_linetype_manual(values = c("solid", "dashed", "dotdash")) +
  scale_x_continuous(breaks = 1:5,
                     labels = c("1\nMucho\nmejor", "2", "3", "4",
                                "5\nMucho\npeor")) +
  scale_y_continuous(labels = percent_format(accuracy = 1), limits = c(0, 1)) +
  labs(
    title    = "Aprobación del gobierno según evaluación económica e integración europea",
    subtitle = "Probabilidades predichas con IC 95% · Resto de variables en su media",
    x        = "Evaluación económica retrospectiva",
    y        = "Pr(aprobación del gobierno)",
    color    = "Posición sobre la UE",
    linetype = "Posición sobre la UE",
    fill     = "Posición sobre la UE",
    caption  = "Fuente: EES 2024. Modelo logístico ponderado (svyglm, quasibinomial)."
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title    = element_text(face = "bold"),
    plot.subtitle = element_text(color = "grey40"),
    legend.position = "bottom",
    panel.grid.minor = element_blank()
  )

Si la pendiente de la evaluación económica es más plana entre quienes apoyan más la integración europea, ello sería consistente con la adaptación de la tesis de Hellwig: la evaluación del gobierno nacional dependería menos del desempeño económico cuando el votante acepta más la gobernanza supranacional. Si las pendientes son similares, la evidencia sugeriría que la integración europea no altera de manera clara el vínculo entre economía y aprobación gubernamental.

12 Probabilidades predichas: interacción economía y liberalización comercial

new_trade <- expand_grid(
  econ_worse   = 1:5,
  trade_liberal = c(0, 5, 10)
) %>%
  mutate(
    econ_worse_c         = econ_worse    - mean_vals$econ_mean,
    trade_liberal_c      = trade_liberal - mean_vals$trade_mean,
    pro_eu_c             = 0,
    ideology_lr_c        = 0,
    political_interest_c = 0,
    age_c                = 0,
    female               = mean_vals$female,
    education_3cat_c     = 0
  )

pred_trade <- predict(m3_trade_interaction, newdata = new_trade, type = "response", se.fit = TRUE)

plot_trade <- new_trade %>%
  mutate(
    pred  = as.numeric(pred_trade),
    se    = sqrt(as.numeric(attr(pred_trade, "var"))),
    lower = pmax(0, pred - 1.96 * se),
    upper = pmin(1, pred + 1.96 * se),

    trade_label = factor(
      trade_liberal,
      levels = c(0, 5, 10),
      labels = c(
        "Proteccionismo",
        "Posición intermedia",
        "Liberalización comercial"
      )
    )
  )

ggplot(plot_trade, aes(x = econ_worse, y = pred,
                       color = trade_label, linetype = trade_label,
                       fill  = trade_label)) +
  geom_ribbon(aes(ymin = lower, ymax = upper), alpha = 0.12, color = NA) +
  geom_line(linewidth = 1) +
  geom_point(size = 2.5) +
  scale_color_manual(values = pal_trade) +
  scale_fill_manual(values  = pal_trade) +
  scale_linetype_manual(values = c("solid", "dashed", "dotdash")) +
  scale_x_continuous(breaks = 1:5,
                     labels = c("1\nMucho\nmejor", "2", "3", "4",
                                "5\nMucho\npeor")) +
  scale_y_continuous(labels = percent_format(accuracy = 1), limits = c(0, 1)) +
  labs(
    title    = "Aprobación del gobierno según evaluación económica y apertura comercial",
    subtitle = "Probabilidades predichas con IC 95% · Resto de variables en su media",
    x        = "Evaluación económica retrospectiva",
    y        = "Pr(aprobación del gobierno)",
    color    = "Posición comercial",
    linetype = "Posición comercial",
    fill     = "Posición comercial",
    caption  = "Fuente: EES 2024. Modelo logístico ponderado (svyglm, quasibinomial)."
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title    = element_text(face = "bold"),
    plot.subtitle = element_text(color = "grey40"),
    legend.position = "bottom",
    panel.grid.minor = element_blank()
  )

13 Modelo alternativo: voto al bloque gubernamental en las elecciones europeas

Este modelo se usa como análisis de robustez, porque se aproxima más directamente a la lógica electoral. La variable dependiente toma valor 1 si la persona votó por PSOE o Sumar en las elecciones europeas de 2024, y 0 si votó por otro partido. Se excluyen no votantes, votos blancos/nulos y no respuestas.

analysis_vote <- ees_spain %>%
  filter(
    !is.na(voted_incumbent_ep),
    !is.na(econ_worse_c),
    !is.na(pro_eu_c),
    !is.na(trade_liberal_c),
    !is.na(ideology_lr_c),
    !is.na(political_interest_c),
    !is.na(age_c),
    !is.na(female),
    !is.na(education_3cat_c),
    !is.na(weight)
  )

design_vote <- svydesign(
  ids     = ~1,
  weights = ~weight,
  data    = analysis_vote
)

m4_vote_eu <- svyglm(
  voted_incumbent_ep ~ econ_worse_c * pro_eu_c + trade_liberal_c + ideology_lr_c +
    political_interest_c + age_c + female + education_3cat_c,
  design = design_vote,
  family = quasibinomial()
)

m5_vote_trade <- svyglm(
  voted_incumbent_ep ~ econ_worse_c * trade_liberal_c + pro_eu_c + ideology_lr_c +
    political_interest_c + age_c + female + education_3cat_c,
  design = design_vote,
  family = quasibinomial()
)
coef_vote <- bind_rows(
  tidy(m4_vote_eu,    conf.int = TRUE) |> mutate(model = "Voto: Economía × UE"),
  tidy(m5_vote_trade, conf.int = TRUE) |> mutate(model = "Voto: Economía × comercio")
) |>
  filter(term != "(Intercept)") |>
  mutate(
    term_label = var_labels[term],
    term_label = factor(term_label, levels = level_order),
    model      = factor(model, levels = c("Voto: Economía × UE", "Voto: Economía × comercio"))
  )

ggplot(coef_vote, aes(x = estimate, y = term_label, color = model, shape = model)) +
  geom_vline(xintercept = 0, linetype = "dashed", color = "grey60", linewidth = 0.6) +
  geom_pointrange(
    aes(xmin = conf.low, xmax = conf.high),
    position  = position_dodge(width = 0.5),
    linewidth = 0.7,
    size      = 0.4
  ) +
  scale_color_manual(values = pal_vote) +
  scale_shape_manual(values = c("Voto: Economía × UE" = 17, "Voto: Economía × comercio" = 15)) +
  labs(
    title    = "Modelos de voto al bloque gubernamental (robustez)",
    subtitle = "Coeficientes logísticos ponderados (svyglm, quasibinomial) · IC 95%",
    x        = "Coeficiente estimado (escala log-odds)",
    y        = NULL,
    color    = "Modelo",
    shape    = "Modelo",
    caption  = "Fuente: EES 2024. Línea discontinua = 0."
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title         = element_text(face = "bold"),
    plot.subtitle      = element_text(color = "grey40"),
    legend.position    = "bottom",
    panel.grid.minor   = element_blank(),
    panel.grid.major.y = element_line(color = "grey92")
  )

Ver tabla completa de coeficientes
&nbsp;Voto gobierno: economía × UE &nbsp;Voto gobierno: economía × comercio
(Intercept) -1.069*** -1.069***
(0.155) (0.157)
econ_worse_c -0.710*** -0.718***
(0.108) (0.106)
pro_eu_c 0.086* 0.086*
(0.042) (0.041)
trade_liberal_c 0.077+ 0.071
(0.045) (0.046)
ideology_lr_c -0.429*** -0.426***
(0.043) (0.043)
political_interest_c -0.398* -0.398*
(0.156) (0.155)
age_c -0.011 -0.011
(0.007) (0.007)
female 0.491* 0.502*
(0.213) (0.214)
education_3cat_c -0.323* -0.323*
(0.127) (0.127)
econ_worse_c × pro_eu_c 0.004
(0.036)
econ_worse_c × trade_liberal_c -0.030
(0.041)
Num.Obs. 679 679
R2 0.334 0.334
R2 Adj. 0.325 0.325
F 18.496 18.522
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001

14 Interpretación esperada

El análisis debe leerse en dos niveles. Primero, el coeficiente de econ_worse_c indica si una peor evaluación económica se asocia con menor aprobación del gobierno o menor voto al bloque gubernamental. Segundo, los términos de interacción indican si ese vínculo cambia según las actitudes hacia la integración europea o la liberalización comercial. Un término de interacción positivo, en un modelo donde econ_worse reduce la aprobación, sugeriría que el castigo económico se atenúa entre quienes apoyan más la UE o la apertura comercial. Un término no significativo sugeriría que la evaluación económica opera de manera relativamente uniforme entre grupos.

15 Conclusión provisional

Este diseño no replica de forma mecánica el modelo de Hellwig, porque la EES 2024 no contiene una pregunta directa sobre el margen de maniobra nacional frente a la globalización. Sin embargo, permite una adaptación empírica razonable para España: la integración europea y la liberalización comercial se usan como aproximaciones a la aceptación de restricciones supranacionales y apertura económica. El análisis evalúa si esas actitudes moderan la relación entre evaluación económica y apoyo al gobierno, que es el mecanismo central de la rendición de cuentas económica.

16 Tests de robustez

16.1 Multicolinealidad

Los factores de inflación de la varianza (VIF) se calculan sobre versiones logísticas no ponderadas, usadas exclusivamente como herramienta de diagnóstico. Valores cercanos a 1 indican ausencia de colinealidad problemática; el umbral convencional de alerta se sitúa en VIF > 5.

Tabla R1. Factores de inflación de la varianza (VIF). Umbral convencional: VIF > 5.
VIF por modelo
Variable Economía × UE Economía × comercio
Evaluación económica (peor →) 1.105 1.105
Pro-integración europea 1.085 1.078
Pro-liberalización comercial 1.052 1.065
Ideología (izq. → der.) 1.078 1.095
Interés político 1.080 1.079
Edad 1.089 1.094
Mujer 1.059 1.063
Nivel educativo 1.042 1.042
Evaluación econ. × Pro-UE 1.015 NA
Evaluación econ. × Liberal comercio NA 1.045

Todos los VIF se sitúan en torno a 1, muy por debajo del umbral de 5. No hay indicios de multicolinealidad que pueda distorsionar los coeficientes o sus errores estándar.

16.2 Errores estándar robustos (HC3)

Como comprobación adicional, se reestiman los modelos con errores estándar robustos de tipo HC3. La comparación con los errores del modelo ponderado principal permite evaluar si la inferencia es sensible a posibles heteroscedasticidades.

Tabla R2. Errores estándar robustos HC3 en modelos logísticos auxiliares. †p<0.10, p<0.05, p<0.01, p<0.001.
Variable Estimación EE robusto Estadístico t p-valor
Modelo: Evaluación económica × Integración europea
Evaluación económica (peor →) -1.147*** (0.101) -11.36 < 0.001
Pro-integración europea 0.093* (0.036) 2.57 0.010
Pro-liberalización comercial -0.058 (0.038) -1.52 0.129
Ideología (izq. → der.) -0.357*** (0.040) -8.81 < 0.001
Interés político 0.001 (0.120) 0.01 0.993
Edad -0.016* (0.007) -2.19 0.028
Mujer 0.496* (0.197) 2.52 0.012
Nivel educativo -0.016 (0.111) -0.14 0.887
Evaluación econ. × Pro-UE -0.031 (0.032) -0.95 0.342
Modelo: Evaluación económica × Liberalización comercial
Evaluación económica (peor →) -1.151*** (0.101) -11.43 < 0.001
Pro-liberalización comercial -0.057 (0.038) -1.49 0.135
Pro-integración europea 0.095** (0.037) 2.59 0.010
Ideología (izq. → der.) -0.358*** (0.041) -8.65 < 0.001
Interés político 0.009 (0.119) 0.08 0.937
Edad -0.016* (0.007) -2.19 0.029
Mujer 0.489* (0.196) 2.49 0.013
Nivel educativo -0.013 (0.112) -0.11 0.910
Evaluación econ. × Liberal comercio 0.012 (0.036) 0.34 0.735

16.3 Interpretación de los diagnósticos

Los diagnósticos de multicolinealidad no muestran problemas relevantes en los modelos estimados. Todos los factores de inflación de la varianza se ubican alrededor de 1, muy por debajo de los umbrales convencionales de 5 o 10. Esto indica que las variables independientes, incluyendo los términos de interacción, no presentan una correlación suficientemente alta como para distorsionar la estimación de los coeficientes o inflar sus errores estándar.

Como prueba adicional de robustez, se estimaron versiones logísticas auxiliares con errores estándar robustos HC3. Los resultados son consistentes con los modelos principales: la evaluación económica retrospectiva mantiene un efecto negativo y estadísticamente significativo sobre la aprobación del gobierno, mientras que las interacciones entre evaluación económica e integración europea, así como entre evaluación económica y liberalización comercial, no resultan significativas. Por tanto, la conclusión sustantiva no cambia al usar errores estándar robustos: existe evidencia de rendición de cuentas económica, pero no evidencia suficiente de que las actitudes hacia la Unión Europea o la apertura comercial moderen el castigo económico al gobierno.