1 Introducción

La prolongación de la vida laboral es un fenómeno de creciente interés para los sistemas de protección social, las familias y el propio mercado de trabajo. Comprender qué factores influyen en la decisión —o necesidad— de seguir trabajando después de los 60 años permite diseñar políticas públicas que equilibren bienestar, sostenibilidad financiera y derecho a un retiro digno.

En esta actualización se incorporan nuevos predictores socioeconómicos provenientes del módulo RO01 del cuestionario de hogares EPHC —referido a transferencias y asistencia— con el fin de analizar el papel de (i) la recepción de ayuda alimentaria (food stamps o canastas básicas) y (ii) las transferencias monetarias procedentes del exterior (remesas) sobre la probabilidad de mantenerse ocupado.

# Instala los paquetes si no los tienes
# install.packages(c("tidyverse", "survey", "broom", "margins", "janitor", "ggplot2", "haven"))
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.0.4     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(survey)
## Cargando paquete requerido: grid
## Cargando paquete requerido: Matrix
## 
## Adjuntando el paquete: 'Matrix'
## 
## The following objects are masked from 'package:tidyr':
## 
##     expand, pack, unpack
## 
## Cargando paquete requerido: survival
## 
## Adjuntando el paquete: 'survey'
## 
## The following object is masked from 'package:graphics':
## 
##     dotchart
library(broom)
library(margins)
library(janitor)
## 
## Adjuntando el paquete: 'janitor'
## 
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
library(ggplot2)
library(haven)

#Marco metodológico

1.1 Especificación del modelo

Sea \(Y_i=1\) si la persona \(i\) (≥ 60 años) permanece ocupada y \(0\) en caso contrario. El modelo logístico ponderado con diseño complejo es

donde \(x_{ij}\) incluye los predictores tradicionales —edad quinquenal, sexo, zona, nivel educativo, estado civil, pobreza— y las nuevas variables:

\(\text{Alim}_i\) = 1 si recibe ayuda alimentaria (RO01A=1)

\(\text{Remesa}_i\) = 1 si recibe transferencias del extranjero (RO01E=1)

Los parámetros se estiman con svyglm() (familia quasibinomial), utilizando pesos de expansión y la estratificación urbana‑rural.

Hipótesis adicionales

H₅: Quienes reciben ayuda alimentaria presentan menor probabilidad de seguir ocupados, al reflejar una mayor vulnerabilidad.

H₆: Quienes reciben remesas tienen menor necesidad de permanecer en el mercado laboral y, por tanto, menor probabilidad de ocupación.

1.2 Fuente de datos

Los microdatos provienen de la Encuesta Permanente de Hogares Continua (EPHC) de los años 2022‑2024, publicados por el Instituto Nacional de Estadística (INE) https://www.ine.gov.py. El módulo RO01 se releva a todos los hogares y recoge distintas fuentes de transferencias.

1.3 Preparación de los datos

2 Cargar datos (supón formato .sav, .dta, .csv, ajusta según tu archivo real)

#library(data.table)

3 carga de la base con data.table

#data <- fread("G:/Mi unidad/EPHn/EPHCancual_vf.csv")
#dataorig <- read_dta("G:/Mi unidad/EPHn/EPHCancual_vf.dta")
# data <- read_sav("G:/Mi unidad/EPHn/EPHCancual_vf.sav")
# data <- read_csv("G:/Mi unidad/EPHn/EPHCancual_vf.csv")
# ephcanu=read.csv2("G:/Mi unidad/adultomayor/dbephc_combinado.csv", sep=",")
# ephvivi=read.csv2("G:/Mi unidad/adultomayor/dbephvivi_combinado.csv", sep=",")
# ## añadir valores del sml para cada año dado que en el año 2022 el valor del sml es 2550307 guaraníes y en el año 2023 es 2680373 guaraníes 2024 era de  2798309
# 
# sml=ifelse(ephcanu$trimestre==1, 2550307,
#            ifelse(ephcanu$trimestre==2, 2550307,
#                   ifelse(ephcanu$trimestre==3, 2680373,
#                          ifelse(ephcanu$trimestre==4, 2680373,
#                                 ifelse(ephcanu$trimestre==5, 2798309,
#                                        ifelse(ephcanu$trimestre==6, 2798309,
#                                               ifelse(ephcanu$trimestre==7, 2798309,
#                                                      ifelse(ephcanu$trimestre==8, 2798309,NA))))))))
# 
# 
# # Paso 2: Convertir a formato con fecha
# ephcanu <- ephcanu %>%
#   mutate(fecha = make_date(anio, 11, 1))
# 
# 
# ### Recodificación de variables
# 
# # Cargar la librería dplyr para facilitar las transformaciones
# library(dplyr)
# library(tidyverse)
# 
# # Suponiendo que tus datos están cargados en un data.frame llamado 'data'
# # Y asumiendo que has instalado y cargado la librería dplyr
# 
# ephcanurec <- ephcanu %>%
#   mutate(
#     area_desc = case_when(
#       area == 1 ~ "Urbano",
#       area == 6 ~ "Rural",
#       TRUE ~ as.character(area) # Manejo de valores inesperados
#     ),
#     dpto = case_when(
#       dpto == 0 ~ "Asunción",
#       dpto == 1 ~ "Concepción",
#       dpto == 2 ~ "San Pedro",
#       dpto == 3 ~ "Cordillera",
#       dpto == 4 ~ "Guairá",
#       dpto == 5 ~ "Caaguazú",
#       dpto == 6 ~ "Caazapá",
#       dpto == 7 ~ "Itapúa",
#       dpto == 8 ~ "Misiones",
#       dpto == 9 ~ "Paraguarí",
#       dpto == 10 ~ "Alto Paraná",
#       dpto == 11 ~ "Central",
#       dpto == 12 ~ "Ñeembucú",
#       dpto == 13 ~ "Amambay",
#       dpto == 14 ~ "Canindeyú",
#       dpto == 15 ~ "Pdte Hayes",
#       TRUE ~ as.character(dpto) # Manejo de valores inesperados
#     ),
#     relacionparen = case_when(
#       p03 == 1 ~ "Jefe/a",
#       p03 == 2 ~ "Esposo/a, compañero/a",
#       p03 == 3 ~ "Hijo/a",
#       p03 == 4 ~ "Hijastro/a",
#       p03 == 5 ~ "Nieto/a",
#       p03 == 6 ~ "Yerno/Nuera",
#       p03 == 7 ~ "Padre/Madre",
#       p03 == 8 ~ "Suegro/a",
#       p03 == 9 ~ "Otro pariente",
#       p03 == 10 ~ "No pariente",
#       p03 == 11 ~ "Personal doméstico",
#       p03 == 12 ~ "Familiar del personal doméstico",
#       TRUE ~ as.character(p03) # Manejo de valores inesperados
#     ),
# 
#     sexo = case_when(
#       p06 == 1 ~ "Hombres",
#       p06 == 6 ~ "Mujeres",
#       TRUE ~ as.character(p06) # Manejo de valores inesperados
#   ),
# 
#     estadocivil = case_when(
#       p09 == 1 ~ "Casado",
#       p09 == 2 ~ "Unido",
#       p09 == 3 ~ "Separado",
#       p09 == 4 ~ "Viudo",
#       p09 == 5 ~ "Soltero",
#       p09 == 6 ~ "Divorciado",
#       p09 == 9 ~ "NR", # No reportado o No responde
#       TRUE ~ as.character(p09) # Manejo de valores inesperados
#     ),
# 
# 
# cotizacaja = case_when(
#     b10 == 1 ~ "Si",
#     b10 == 6 ~ "No",
#     b10 == 9 ~ "NR", # No Responde
#     TRUE ~ as.character(b10) # Manejo de valores inesperados
#   ),
# 
# cualcaja = case_when(
#     b11 == 1 ~ "IPS",
#     b11 == 2 ~ "Caja Fiscal",
#     b11 == 3 ~ "Caja Bancaria",
#     b11 == 4 ~ "Caja Municipal",
#     b11 == 5 ~ "Caja Privada",
#     b11 == 6 ~ "Otra (especificar)",
#     b11 == 9 ~ "NR", # No Responde
#     TRUE ~ as.character(b11) # Manejo de valores inesperados
#   ),
# 
# catepea = case_when(
#     cate_pea == 1 ~ "Obrero público",
#     cate_pea == 2 ~ "Obrero privado",
#     cate_pea == 3 ~ "Empleador/patrón",
#     cate_pea == 4 ~ "Cuenta propia",
#     cate_pea == 5 ~ "Trabajador fam. no remun.",
#     cate_pea == 6 ~ "Doméstico/a",
#     cate_pea == 9 ~ "NR", # No Responde
#     TRUE ~ as.character(cate_pea) # Manejo de valores inesperados
#   ),
# 
# tipoocupa = case_when(
#     ocup_pea == 1 ~ "Miembros del Pod. Ejec., Legis. y Jud., pers. direct. de la Adm. púb. y de empresa",
#     ocup_pea == 2 ~ "Profesionales científicos e intelectuales",
#     ocup_pea == 3 ~ "Técnicos y profesionales de nivel medio",
#     ocup_pea == 4 ~ "Empleados de oficina",
#     ocup_pea == 5 ~ "Trabajadores de los servicios y vendedores de comercios y mercados",
#     ocup_pea == 6 ~ "Agricultores y trabajadores Agropecuarios y Pesqueros",
#     ocup_pea == 7 ~ "Oficiales, operarios y artesanos de artes mecánicas y de otros oficios",
#     ocup_pea == 8 ~ "Operadores de instalaciones y máquinas y montadores",
#     ocup_pea == 9 ~ "Trabajadores no calificados",
#     ocup_pea == 10 ~ "Fuerzas armadas",
#     ocup_pea == 99 ~ "NR", # No Responde
#     TRUE ~ as.character(ocup_pea) # Manejo de valores inesperados
#   ),
# 
# ramadesc = case_when(
#     rama_pea == 1 ~ "Agricultura, ganadería, caza y pesca",
#     rama_pea == 2 ~ "Industrias manufactureras",
#     rama_pea == 3 ~ "Electricidad, gas y agua",
#     rama_pea == 4 ~ "Construcciones",
#     rama_pea == 5 ~ "Comercio, restaurantes y hoteles",
#     rama_pea == 6 ~ "Transporte, almacenamiento y comunicaciones",
#     rama_pea == 7 ~ "Finanzas, seguros e inmuebles",
#     rama_pea == 8 ~ "Servicios comunales, sociales y personales",
#     rama_pea == 99 ~ "NR", # No Responde
#     TRUE ~ as.character(rama_pea) # Manejo de valores inesperados
#   ),
# 
#     sector = case_when(
#       rama_pea == 1 ~ 1,                    # Sector Primario: Agricultura, ganadería, caza y pesca
#       rama_pea == 2 | rama_pea == 4 ~ 2,     # Sector Secundario: Construcción + Industrias manufactureras
#       rama_pea %in% c(3, 5, 6, 7, 8) ~ 3,   # Sector Terciario: Resto
#       rama_pea == 99 ~ 99,                  # No reportado
#       TRUE ~ NA_real_                      # Asignar NA para otros valores
#     ),
# 
# situacionlab = case_when(
#     pead == 1 ~ "Otros ocupados",
#     pead == 2 ~ "Desocupados de 2ª ó más veces",
#     pead == 3 ~ "Inactivos",
#     pead == 4 ~ "Subocup. Visible",
#     pead == 6 ~ "Desocupados de 1ª vez",
#     pead == 9 ~ "NR", # No Responde
#     TRUE ~ as.character(pead) # Manejo de valores inesperados
#   ),
# 
# 
# 
# situacionlab2 = case_when(
#     peaa == 1 ~ "Ocupados",
#     peaa == 2 ~ "Desocupados",
#     peaa == 3 ~ "Inactivos",
#     peaa == 9 ~ "NR",
#       TRUE ~ as.character(peaa)
#   ),
# 
# informalidaddesc = case_when(
#     informalidad == 1 ~ "Ocupados informales no agropecuarios",
#     informalidad == 2 ~ "Ocupados formales no agropecuarios",
#     informalidad == 9 ~ "No Disponible",
#           TRUE ~ as.character(informalidad)
#   ),
# 
# trimestredesc = case_when(
#     trimestre == 1 ~ "2022Trim1",
#     trimestre == 2 ~ "2022Trim2",
#     trimestre == 3 ~ "2022Trim3",
#     trimestre == 4 ~ "2022Trim4",
#     trimestre == 5 ~ "2023Trim1",
#     trimestre == 6 ~ "2023Trim2",
#     trimestre == 7 ~ "2023Trim3",
#     trimestre == 8 ~ "2023Trim4",
#               TRUE ~ as.character(trimestre)
#   ),
# 
# edadquinquenal = case_when(
#     p02 >= 0 & p02 <= 4 ~ "0 a 4",
#     p02 >= 5 & p02 <= 9 ~ "5 a 9",
#     p02 >= 10 & p02 <= 14 ~ "10 a 14",
#     p02 >= 15 & p02 <= 19 ~ "15 a 19",
#     p02 >= 20 & p02 <= 24 ~ "20 a 24",
#     p02 >= 25 & p02 <= 29 ~ "25 a 29",
#     p02 >= 30 & p02 <= 34 ~ "30 a 34",
#     p02 >= 35 & p02 <= 39 ~ "35 a 39",
#     p02 >= 40 & p02 <= 44 ~ "40 a 44",
#     p02 >= 45 & p02 <= 49 ~ "45 a 49",
#     p02 >= 50 & p02 <= 54 ~ "50 a 54",
#     p02 >= 55 & p02 <= 59 ~ "55 a 59",
#     p02 >= 60 & p02 <= 64 ~ "60 a 64",
#     p02 >= 65 & p02 <= 69 ~ "65 a 69",
#     p02 >= 70 & p02 <= 74 ~ "70 a 74",
#     p02 >= 75 & p02 <= 79 ~ "75 a 79",
#     p02 >= 80 & p02 <= 84 ~ "80 a 84",
#                   TRUE ~ "85 y más"
# 
# ),
# 
# edaddecenio = case_when(
#     p02 >= 0 & p02 <= 9 ~ "0 a 9",
#     p02 >= 10 & p02 <= 19 ~ "10 a 19",
#     p02 >= 20 & p02 <= 29 ~ "20 a 29",
#     p02 >= 30 & p02 <= 39 ~ "30 a 39",
#     p02 >= 40 & p02 <= 49 ~ "40 a 49",
#     p02 >= 50 & p02 <= 59 ~ "50 a 59",
#     p02 >= 60 & p02 <= 69 ~ "60 a 69",
#     p02 >= 70 & p02 <= 79 ~ "70 a 79",
#     p02 >= 80 & p02 <= 89 ~ "80 a 89",
#                   TRUE ~ "90 y más"
# 
#   ),
# 
# tramoedad = case_when(
#     p02 >= 0 & p02 <= 13 ~ "Niños",
#     p02 >= 14 & p02 <= 29 ~ "Jóvenes",
#     p02 >= 30 & p02 <= 59 ~ "Adultos",
#     TRUE ~ "Adultos mayores",
#                           TRUE ~ as.character(p02)
#   ),
# 
# tramoedad2 = case_when(
#     p02 >= 0 & p02 <= 13 ~ "Niños",
#     p02 >= 14 & p02 <= 29 ~ "Jóvenes",
#     p02 >= 30 & p02 <= 64 ~ "Adultos",
#     TRUE ~ "Adultos mayores",
#                           TRUE ~ as.character(p02)
#   ),
# 
# nivelest = case_when(
#     anioest == 0 ~ "Sin instrucción",
#     anioest >= 1 & anioest <= 6 ~  "Primaria incompleta",
#     anioest >= 7 & anioest <= 12 ~"Primaria completa",
#     anioest >= 13 & anioest <= 18 ~ "Secundaria completa" ,
#     anioest == 99 ~  "No disponible",
#                           TRUE ~ as.character(anioest)
#   ),
# 
# nivelest2 = case_when(
#     anioest == 0 ~ "Sin instrucción",
#     anioest >= 1 & anioest <= 6 ~  "1 a 6 años",
#     anioest >= 7 & anioest <= 12 ~ "7 a 12 años",
#     anioest >= 13 & anioest <= 18 ~ "13 y más" ,
#     anioest == 99 ~  "No disponible",
#                           TRUE ~ as.character(anioest)
#   ),
# 
# aportacajajub=case_when(
#   b10== 1 ~ "Sí cotiza",
#     b10 == 6  ~ "No cotiza",
#     anioest == 99 ~  "No responde"
# ),
#     ingoc1SMLtramo = ifelse(e01aimde < 0.90 * sml, 0,
#       ifelse(e01aimde >= 0.90 * sml & e01aimde <= 1.1 * sml, 1,
#         ifelse(e01aimde > 1.1 * sml, 2, NA)
#       )),
# 
#     ingoc1SML_cat = factor(ingoc1SMLtramo,
#       levels = 0:2,
#       labels = c(
#         "Menos de 1 SML",
#         "1 SML",
#         "Más de 1"
#       )
#     )
#   )
# 
# 
# ephcanurec$sector = factor(ephcanurec$sector, levels = c(1, 2, 3, 99), labels = c("Primario", "Secundario", "Terciario", "No disponible"))
# 
# write.csv(ephcanurec, "G:/Mi unidad/adultomayor/ephcanurec.csv", row.names = FALSE)
# Cargar la base de datos
ephcanurec <- read.csv2("G:/Mi unidad/adultomayor/ephcanurec.csv", sep=",")

3.1 Limpieza y Recodificación

table(ephcanurec$edadquinquenal)
## 
##    0 a 4  10 a 14  15 a 19  20 a 24  25 a 29  30 a 34  35 a 39  40 a 44 
##    13670    15710    15073    13859    13802    13443    12229    11491 
##  45 a 49    5 a 9  50 a 54  55 a 59  60 a 64  65 a 69  70 a 74  75 a 79 
##     9121    16117     9013     8400     7934     6518     4466     3184 
##  80 a 84 85 y más 
##     1928     1703
# Filtros
data <- ephcanurec%>%
  filter(p02 >= 60,
         #anioes debe ser distitno de 99
         anioest < 99,
         p09 %in% c(1, 2, 3,4,5, 6),
         peaa %in% c(1, 2, 3),
         anio %in% c(2022, 2023, 2024)
         )
table(data$peaa)
## 
##     1     2     3 
## 11754   301 13662
# Variable dependiente
data <- data %>%
  mutate(adma = ifelse(peaa == 1, 1, 0), # 1 = Inactivo, 0 = Activo
         estcivil = ifelse(p09 %in% c(1,2), 1, 2)) # 1 = Casado/Unido, 2 = Soltero)
# Etiquetas (opcional, para tablas)
data$adma <- factor(data$adma, labels = c("No sigue ocupado", "Sigue ocupado"))
data$estcivil <- factor(data$estcivil, labels = c("Casado/Unido", "Soltero"))
data$nivelest <- factor(data$nivelest, labels = c("Sin instrucción","Primaria incompleta","Primaria completa", "Secundaria completa"))
data$edadquinquenal <- factor(data$edadquinquenal, labels = c("60 a 64", "65 a 69", "70 a 74", "75 a 79", "80 a 84", "85 y más"))
data$p06 <- factor(data$p06, labels = c("Hombre", "Mujer"))
data$area <- factor(data$area, labels = c("Urbano", "Rural"))
data$pobnopoi <- factor(data$pobnopoi, labels = c("Población no pobre", "Población pobre"))
data$sector <- factor(data$sector, labels = c("Sector privado", "Sector público", "Otros"))
data$anio <- factor(data$anio, labels = c("2022", "2023", "2024"))
table(data$adma)
## 
## No sigue ocupado    Sigue ocupado 
##            13963            11754

3.2 Análisis Descriptivo

# Tabla edad por actividad
data %>%
  group_by(adma) %>%
  summarise(mean_edad = mean(p02), sd_edad = sd(p02), min_edad = min(p02), max_edad = max(p02), N = n())
adma mean_edad sd_edad min_edad max_edad N
No sigue ocupado 72.77354 8.732582 60 106 13963
Sigue ocupado 66.77523 5.846909 60 97 11754
# Tabla cruzada actividad x estado civil
tabyl(data, adma, estcivil) %>% adorn_percentages("row") %>% adorn_pct_formatting()
adma Casado/Unido Soltero
No sigue ocupado 51.7% 48.3%
Sigue ocupado 68.3% 31.7%
# Histograma de edad por actividad
ggplot(data, aes(x = p02, fill = adma)) +
  geom_histogram(position = "dodge", bins = 15) +
  facet_wrap(~adma) +
  labs(title = "Distribución de Edad por Estado de Actividad", x = "Edad", y = "Frecuencia")

# Gráfico de barras actividad por estado civil
ggplot(data, aes(x = estcivil, fill = adma)) +
  geom_bar(position = "dodge") +
  labs(title = "Actividad por Estado Civil", x = "Estado Civil", y = "Frecuencia")

library(survey)
library(effects)
## Cargando paquete requerido: carData
## lattice theme set by effectsTheme()
## See ?effectsTheme for details.
# 1) Asegurarse de que las variables sean factors en el data frame de 2024
data24 <- data %>% 
  filter(anio == 2024) %>%
  mutate(
    tramoedad      = factor(edadquinquenal),
    factorexpand=as.numeric(fex2022),
    p06      = factor(p06, labels = c("Hombres","Mujeres")),
    area     = factor(area, labels = c("Urbano","Rural")),
    nivelest = factor(nivelest),
    pobnopoi = factor(pobnopoi)
  )
# 2) Redefinir el diseño con fex como peso
des24 <- svydesign(
  ids     = ~upm,
  strata  = ~area,
  weights = ~factorexpand,
  data    = data24,
  nest    = TRUE
)
# 3) Ajustar el modelo con interacción (sin factor() en la fórmula)
fit_inter <- svyglm(
  adma ~ tramoedad + p06 + area + nivelest * estcivil + pobnopoi,
  design = des24,
  family = quasibinomial()
)
library(effects)

eff <- allEffects(fit_inter)

plot(eff[["nivelest:estcivil"]],
     main      = "Interacción: Nivel educativo × Estado civil",
     multiline = TRUE)
Efecto de la edad (gq2)

Efecto de la edad (gq2)

plot(eff[["tramoedad"]],
     main      = "Efecto de Edad (gq2)",
     multiline = TRUE)
Efecto de la edad (gq2)

Efecto de la edad (gq2)

library(effects)

# 1) Extraer lista de efectos
eff_list <- allEffects(fit_inter)

# 2) Paleta y grosor de línea
palette_cols <- c("steelblue", "firebrick")
line_width   <- 2

# 3) Parámetros gráficos: un sólo plot por ventana
old_par <- par(no.readonly = TRUE)
on.exit(par(old_par))
par(mfrow = c(1,1), mar = c(4,4,2,1))

# 4) Bucle para graficar cada efecto por separado
for (nm in names(eff_list)) {
  ef <- eff_list[[nm]]
  
  # Etiqueta X según efecto
  xlab <- switch(nm,
    gq2                 = "Grupo etario (años)",
    p06                 = "Sexo",
    area                = "Zona",
    pobnopoi            = "Condición socioeconómica",
    nivelest            = "Nivel educativo",
    estcivil            = "Estado civil",
    nm
  )
  
  # Título automático
  main_tit <- paste0("Efecto — ", gsub(":", " × ", nm))
  
  # 5) Graficar sin ambigüedad en 'colors'
 g= plot(ef,
       multiline = TRUE,
       ci.style  = "bands",
       colors    = palette_cols,
       lwd       = line_width,
       xlab      = xlab,
       ylab      = "Probabilidad de inactividad",
       main      = main_tit)
}

g

names(data24)
##   [1] "upm"              "nvivi"            "nhoga"           
##   [4] "trimestre"        "anio"             "dpto"            
##   [7] "area"             "l02"              "p02"             
##  [10] "p03"              "p04"              "p04a"            
##  [13] "p04b"             "p05c"             "p05p"            
##  [16] "p05m"             "p06"              "p08d"            
##  [19] "p08m"             "p08a"             "p09"             
##  [22] "a01"              "a01a"             "a02"             
##  [25] "a03"              "a04"              "a04a"            
##  [28] "a04b"             "a05"              "a07"             
##  [31] "a08"              "a10"              "a11a"            
##  [34] "a11m"             "a11s"             "a12"             
##  [37] "a13rec"           "a14rec"           "a15"             
##  [40] "a16"              "a17a"             "a17m"            
##  [43] "a17s"             "a18"              "b01rec"          
##  [46] "b02rec"           "b03lu"            "b03ma"           
##  [49] "b03mi"            "b03ju"            "b03vi"           
##  [52] "b03sa"            "b03do"            "b04"             
##  [55] "b05"              "b06"              "b07a"            
##  [58] "b07m"             "b07s"             "b08"             
##  [61] "b09a"             "b09m"             "b09s"            
##  [64] "b10"              "b11"              "b12"             
##  [67] "b12a"             "b12b"             "b12c"            
##  [70] "b13"              "b14"              "b15"             
##  [73] "b16g"             "b16u"             "b16d"            
##  [76] "b16t"             "b17"              "b18ag"           
##  [79] "b18au"            "b18bg"            "b18bu"           
##  [82] "b19"              "b20g"             "b20u"            
##  [85] "b20d"             "b20t"             "b21"             
##  [88] "b22"              "b23"              "b24"             
##  [91] "b25"              "b26"              "b271"            
##  [94] "b272"             "b28"              "b29"             
##  [97] "b30"              "b31"              "c01rec"          
## [100] "c02rec"           "c03"              "c04"             
## [103] "c05"              "c06"              "c07"             
## [106] "c08"              "c09"              "c101"            
## [109] "c102"             "c11g"             "c11u"            
## [112] "c11d"             "c11t"             "c12"             
## [115] "c13ag"            "c13au"            "c13bg"           
## [118] "c13bu"            "c14"              "c14a"            
## [121] "c14b"             "c14c"             "c15"             
## [124] "c16rec"           "c17rec"           "c18"             
## [127] "c18a"             "c18b"             "c19"             
## [130] "d01"              "d02"              "d03"             
## [133] "d04"              "d05"              "e01a"            
## [136] "e01b"             "e01c"             "e01d"            
## [139] "e01e"             "e01f"             "e01g"            
## [142] "e01h"             "e01i"             "e01j"            
## [145] "e01k"             "e01l"             "e01m"            
## [148] "ed01"             "ed02"             "ed03"            
## [151] "ed0504"           "ed06c"            "ed08"            
## [154] "ed09"             "ed10"             "ed11f1"          
## [157] "ed11f1a"          "ed11gh1"          "ed11gh1a"        
## [160] "s01a"             "s01b"             "s02"             
## [163] "s03"              "s03a"             "s03b"            
## [166] "s03c"             "s04"              "s05"             
## [169] "s06"              "s07"              "s08"             
## [172] "s09"              "cate_pea"         "tama_pea"        
## [175] "ocup_pea"         "rama_pea"         "horab"           
## [178] "horabc"           "horabco"          "pead"            
## [181] "peaa"             "tipohoga"         "fex2022"         
## [184] "njef"             "ncon"             "npad"            
## [187] "nmad"             "anioest"          "ra06ya09"        
## [190] "e01aimde"         "e01bimde"         "e01cimde"        
## [193] "e01dde"           "e01ede"           "e01fde"          
## [196] "e01gde"           "e01hde"           "e01ide"          
## [199] "e01jde"           "e01kde"           "e01lde"          
## [202] "e01mde"           "e01kjde"          "e02bde"          
## [205] "ingrevasode"      "ipcm"             "pobrezai"        
## [208] "pobnopoi"         "quintili"         "decili"          
## [211] "quintiai"         "decilai"          "informalidad"    
## [214] "ingrealmuerzode"  "fecha"            "area_desc"       
## [217] "relacionparen"    "sexo"             "estadocivil"     
## [220] "cotizacaja"       "cualcaja"         "catepea"         
## [223] "tipoocupa"        "ramadesc"         "sector"          
## [226] "situacionlab"     "situacionlab2"    "informalidaddesc"
## [229] "trimestredesc"    "edadquinquenal"   "edaddecenio"     
## [232] "tramoedad"        "tramoedad2"       "nivelest"        
## [235] "nivelest2"        "aportacajajub"    "ingoc1SMLtramo"  
## [238] "ingoc1SML_cat"    "adma"             "estcivil"        
## [241] "factorexpand"
library(dplyr)

# 0) Asegúrate de que p02 sea numérico
if (!is.numeric(data24$p02)) {
  data24 <- data24 %>% 
    mutate(p02 = as.numeric(as.character(p02)))
}

# 1) Definir breaks y labels
breaks <- c(seq(0, 80, by = 5), Inf)
labels <- c(
  paste0(seq(0, 75, by = 5), " a ", seq(4, 79, by = 5)),
  "80 y más"
)
# breaks tiene longitud 18 → 17 intervalos
# labels tiene longitud 17

# 2) Crear gq2
data24 <- data24 %>%
  mutate(
    gq2 = cut(
      p02,
      breaks = breaks,
      labels = labels,
      right = FALSE,
      include.lowest = TRUE
    )
  )

# 3) Comprueba que hayas creado 17 niveles
levels(data24$gq2)
##  [1] "0 a 4"    "5 a 9"    "10 a 14"  "15 a 19"  "20 a 24"  "25 a 29" 
##  [7] "30 a 34"  "35 a 39"  "40 a 44"  "45 a 49"  "50 a 54"  "55 a 59" 
## [13] "60 a 64"  "65 a 69"  "70 a 74"  "75 a 79"  "80 y más"
library(survey)

# Asegúrate de que factorexpand sea numérico
data24$factorexpand <- as.numeric(data24$factorexpand)

# 4) Redefinir el diseño
des24 <- svydesign(
  ids     = ~upm,
  strata  = ~area,
  weights = ~factorexpand,
  data    = data24,
  nest    = TRUE
)

# 5) Ajustes desagregados por género
for (sexo in levels(data24$p06)) {
  cat("\n=== Género:", sexo, "===\n")
  fit_gen <- svyglm(
    adma ~ gq2 + area + nivelest + pobnopoi + estcivil,
    design = des24,
    family = quasibinomial(),
    subset = (p06 == sexo)
  )
  print(summary(fit_gen))
}
## 
## === Género: Hombres ===
## 
## Call:
## svyglm(formula = adma ~ gq2 + area + nivelest + pobnopoi + estcivil, 
##     design = des24, subset = (p06 == sexo), family = quasibinomial())
## 
## Survey design:
## svydesign(ids = ~upm, strata = ~area, weights = ~factorexpand, 
##     data = data24, nest = TRUE)
## 
## Coefficients:
##                             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                  0.47598    0.07745   6.146 9.93e-10 ***
## gq265 a 69                  -0.41853    0.07407  -5.651 1.88e-08 ***
## gq270 a 74                  -0.96343    0.08210 -11.735  < 2e-16 ***
## gq275 a 79                  -1.60711    0.09548 -16.833  < 2e-16 ***
## gq280 y más                 -2.55109    0.11824 -21.575  < 2e-16 ***
## areaRural                    0.63327    0.06428   9.851  < 2e-16 ***
## nivelestPrimaria incompleta -0.05664    0.07813  -0.725  0.46859    
## nivelestPrimaria completa    0.05346    0.10563   0.506  0.61283    
## nivelestSecundaria completa -0.43891    0.14712  -2.983  0.00289 ** 
## pobnopoiPoblación pobre     -0.46577    0.08286  -5.621 2.22e-08 ***
## estcivilSoltero             -0.35106    0.05908  -5.942 3.42e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for quasibinomial family taken to be 0.9999677)
## 
## Number of Fisher Scoring iterations: 4
## 
## 
## === Género: Mujeres ===
## 
## Call:
## svyglm(formula = adma ~ gq2 + area + nivelest + pobnopoi + estcivil, 
##     design = des24, subset = (p06 == sexo), family = quasibinomial())
## 
## Survey design:
## svydesign(ids = ~upm, strata = ~area, weights = ~factorexpand, 
##     data = data24, nest = TRUE)
## 
## Coefficients:
##                             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                  0.47598    0.07745   6.146 9.93e-10 ***
## gq265 a 69                  -0.41853    0.07407  -5.651 1.88e-08 ***
## gq270 a 74                  -0.96343    0.08210 -11.735  < 2e-16 ***
## gq275 a 79                  -1.60711    0.09548 -16.833  < 2e-16 ***
## gq280 y más                 -2.55109    0.11824 -21.575  < 2e-16 ***
## areaRural                    0.63327    0.06428   9.851  < 2e-16 ***
## nivelestPrimaria incompleta -0.05664    0.07813  -0.725  0.46859    
## nivelestPrimaria completa    0.05346    0.10563   0.506  0.61283    
## nivelestSecundaria completa -0.43891    0.14712  -2.983  0.00289 ** 
## pobnopoiPoblación pobre     -0.46577    0.08286  -5.621 2.22e-08 ***
## estcivilSoltero             -0.35106    0.05908  -5.942 3.42e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for quasibinomial family taken to be 0.9999677)
## 
## Number of Fisher Scoring iterations: 4

3.3 Interpretación de Resultados (Ejemplo)

La regresión logística estratificada por sexo revela que, en ambos hombres y mujeres de 60 años o más, cada avance a un tramo etario superior se asocia con una disminución sustancial de la probabilidad de permanecer activos (≈48 % menos para hombres y ≈43 % para mujeres por salto de categoría). La ruralidad incrementa la permanencia en la actividad económica, con un efecto más pronunciado en los hombres (OR≈2,8) y moderado en las mujeres (OR≈1,2). El nivel educativo no muestra diferencias significativas en los hombres, mientras que en las mujeres la escolaridad secundaria completa sugiere un aumento marginal de la probabilidad de actividad (OR≈1,5; p≈0,05). La condición de pobreza reduce de manera significativa la probabilidad de seguir ocupados en ambos sexos (OR≈0,52 para hombres y OR≈0,66 para mujeres). Finalmente, el estado civil influye únicamente en los hombres, donde los solteros presentan menor probabilidad de mantener la actividad (OR≈0,66), sin efecto estadístico en las mujeres. Estos hallazgos apuntan a la necesidad de políticas diferenciadas por género que consideren la interacción de edad, contexto rural, nivel socioeconómico y estado civil para fomentar la participación laboral de los adultos mayores.