texto
Los dastos provienen de https://datos.hacienda.gov.py/data/nomina/descargas
# librerias a usar
#
# install.packages("dplyr")
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.3
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(tidyr)
## Warning: package 'tidyr' was built under R version 4.3.3
library(readr)
## Warning: package 'readr' was built under R version 4.3.3
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
library(lubridate)
## Warning: package 'lubridate' was built under R version 4.3.3
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
library(stringr)
## Warning: package 'stringr' was built under R version 4.3.3
library(data.table)
## Warning: package 'data.table' was built under R version 4.3.3
##
## Attaching package: 'data.table'
## The following objects are masked from 'package:lubridate':
##
## hour, isoweek, mday, minute, month, quarter, second, wday, week,
## yday, year
## The following objects are masked from 'package:dplyr':
##
## between, first, last
# # Descarga de los datos desde https://datos.hacienda.gov.py/odmh-core/rest/nomina/datos/nomina_2013-01.zip
#
# download.file("https://datos.hacienda.gov.py/odmh-core/rest/nomina/datos/nomina_2013-01.zip", destfile = "G:/Mi unidad/Classroom/Big Data Sudameris/datosFP/nomina_2013-01.zip")
#
# # descomprimir el archivo
#
# unzip("G:/Mi unidad/Classroom/Big Data Sudameris/datosFP/nomina_2013-01.zip", exdir = "G:/Mi unidad/Classroom/Big Data Sudameris/datosFP/nomina_2013-01")
# Cargar librería
library(readr)
# Leer CSV con solo esos campos y especificando la codificación con `locale`
ruta_csv <- "I:/Mi unidad/articuloMuestreo/nomina_2025-04.csv"
fp <- read_csv(ruta_csv, col_types = cols(), locale = locale(encoding = "Latin1"))
# Mostrar nombres de columnas para confirmar
print(colnames(fp))
## [1] "anio" "mes"
## [3] "codigoNivel" "descripcionNivel"
## [5] "codigoEntidad" "descripcionEntidad"
## [7] "codigoPrograma" "descripcionPrograma"
## [9] "codigoSubprograma" "descripcionSubprograma"
## [11] "codigoProyecto" "descripcionProyecto"
## [13] "codigoUnidadResponsable" "descripcionUnidadResponsable"
## [15] "codigoObjetoGasto" "conceptoGasto"
## [17] "fuenteFinanciamiento" "linea"
## [19] "codigoPersona" "nombres"
## [21] "apellidos" "sexo"
## [23] "discapacidad" "codigoCategoria"
## [25] "cargo" "horasCatedra"
## [27] "fechaIngreso" "tipoPersonal"
## [29] "lugar" "montoPresupuestado"
## [31] "montoDevengado" "mesCorte"
## [33] "anioCorte" "fechaCorte"
## [35] "nivelAbr" "entidadAbr"
## [37] "programaAbr" "subprogramaAbr"
## [39] "proyectoAbr" "unidadAbr"
# Definir campos de interés
campodeinteres <- c(
"anio",
"mes",
"descripcionNivel",
"descripcionEntidad",
"sexo",
"codigoPersona",
"tipoPersonal",
"montoPresupuestado"
)
# Cargar librería dplyr para realizar operaciones de agrupación
library(dplyr)
# Filtrar solo las columnas de interés
fpfil <- fp[, campodeinteres]
# Calcular el salario total por códigoPersona, anio y mes
fppers <- fpfil %>%
group_by(codigoPersona,sexo, descripcionNivel,descripcionEntidad, anio, mes) %>%
summarise(salario_total = sum(montoPresupuestado, na.rm = TRUE)) %>%
ungroup()
## `summarise()` has grouped output by 'codigoPersona', 'sexo',
## 'descripcionNivel', 'descripcionEntidad', 'anio'. You can override using the
## `.groups` argument.
# Mostrar las primeras filas del resultado
head(fppers)
## # A tibble: 6 × 7
## codigoPersona sexo descripcionNivel descripcionEntidad anio mes
## <chr> <chr> <chr> <chr> <dbl> <dbl>
## 1 00E4D153DFF8CD F 23-ENTES AUTÓNOMOS Y AUTÁ… 032-SECRETARIA NA… 2025 4
## 2 01361698BFAE2B F 12-PODER EJECUTIVO 001-PRESIDENCIA D… 2025 4
## 3 01ADA3880BB1A1 M 12-PODER EJECUTIVO 001-PRESIDENCIA D… 2025 4
## 4 01EC7A3035BB31 M 23-ENTES AUTÓNOMOS Y AUTÁ… 032-SECRETARIA NA… 2025 4
## 5 029895AECA69C7 M 12-PODER EJECUTIVO 001-PRESIDENCIA D… 2025 4
## 6 02FAC3C824ACCD M 12-PODER EJECUTIVO 001-PRESIDENCIA D… 2025 4
## # ℹ 1 more variable: salario_total <dbl>
# Calcular la proporción de mujeres en la función pública
#
proporcion_mujeres <- fppers %>%
filter(sexo == "F") %>%
summarise(proporcion = n() / nrow(fppers)) # Proporción de mujeres
# Calcular el salario total promedio mensual
salario_promedio_mensual <- fppers %>%
summarise(salario_promedio = mean(salario_total, na.rm = TRUE)) # Promedio de salario total mensual
# Calcular el tamaño de la población (total de registros)
tamano_poblacion <- nrow(fppers)
# Crear una tabla con los resultados
tabla_parametros <- tibble(
Proporcion_mujeres = proporcion_mujeres$proporcion,
Salario_promedio_mensual = salario_promedio_mensual$salario_promedio,
Tamano_poblacion = tamano_poblacion
)
# Mostrar la tabla
tabla_parametros
## # A tibble: 1 × 3
## Proporcion_mujeres Salario_promedio_mensual Tamano_poblacion
## <dbl> <dbl> <int>
## 1 0.524 7077586. 279152
# Cargar la librería xtable para generar código LaTeX
library(xtable)
## Warning: package 'xtable' was built under R version 4.3.3
# Crear la tabla de parámetros (ya calculada previamente)
tabla_parametros <- tibble(
Proporcion_mujeres = proporcion_mujeres$proporcion,
Salario_promedio_mensual = salario_promedio_mensual$salario_promedio,
Tamano_poblacion = tamano_poblacion
)
# Generar el código LaTeX de la tabla
tabla_latex <- xtable(tabla_parametros, caption = "Parámetros Poblacionales")
# Guardar el código LaTeX en un archivo .tex
cat(toString(tabla_latex), file = "I:/Mi unidad/articuloMuestreo/tabla_parametros.tex")
# Mostrar el código LaTeX
print(tabla_latex)
## % latex table generated in R 4.3.1 by xtable 1.8-4 package
## % Tue Jun 17 19:02:37 2025
## \begin{table}[ht]
## \centering
## \begin{tabular}{rrrr}
## \hline
## & Proporcion\_mujeres & Salario\_promedio\_mensual & Tamano\_poblacion \\
## \hline
## 1 & 0.52 & 7077586.11 & 279152 \\
## \hline
## \end{tabular}
## \caption{Parámetros Poblacionales}
## \end{table}
# Definir los parámetros
nivel_confianza <- 0.95
z <- qnorm(1 - (1 - nivel_confianza) / 2) # Valor crítico Z para un nivel de confianza del 95%
p <- proporcion_mujeres$proporcion # Proporción de mujeres calculada previamente
E <- 0.05 # Margen de error (5%)
# Calcular el tamaño muestral mínimo (n)
n_min <- (z^2 * p * (1 - p)) / E^2
n_min <- ceiling(n_min) # Redondear al siguiente número entero
# Crear una tabla con los resultados
tabla_tamano_muestral <- tibble(
Nivel_confianza = nivel_confianza,
Valor_Z = z,
Proporcion_mujeres = p,
Margen_error = E,
Tamano_muestral_minimo = n_min
)
# Mostrar la tabla
tabla_tamano_muestral
## # A tibble: 1 × 5
## Nivel_confianza Valor_Z Proporcion_mujeres Margen_error Tamano_muestral_minimo
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0.95 1.96 0.524 0.05 384
# Generar la tabla LaTeX con los resultados del tamaño muestral
tabla_latex_muestra <- xtable(tabla_tamano_muestral, caption = "Cálculo del Tamaño Muestral para Estimar la Proporción de Mujeres")
# Guardar el código LaTeX en un archivo .tex
cat(toString(tabla_latex_muestra), file = "I:/Mi unidad/articuloMuestreo/tabla_tamano_muestral.tex")
# Mostrar la tabla LaTeX en la consola
print(tabla_latex_muestra)
## % latex table generated in R 4.3.1 by xtable 1.8-4 package
## % Tue Jun 17 19:02:37 2025
## \begin{table}[ht]
## \centering
## \begin{tabular}{rrrrrr}
## \hline
## & Nivel\_confianza & Valor\_Z & Proporcion\_mujeres & Margen\_error & Tamano\_muestral\_minimo \\
## \hline
## 1 & 0.95 & 1.96 & 0.52 & 0.05 & 384.00 \\
## \hline
## \end{tabular}
## \caption{Cálculo del Tamaño Muestral para Estimar la Proporción de Mujeres}
## \end{table}
# Definir los parámetros
nivel_confianza <- 0.95
z <- qnorm(1 - (1 - nivel_confianza) / 2) # Valor crítico Z para un nivel de confianza del 95%
sigma <- 2000000 # Suponiendo una desviación estándar de 100,000 Gs (este valor es un ejemplo, puedes usar otro valor estimado)
E <- 200000 # Margen de error de 200,000 Gs
# Calcular el tamaño muestral mínimo (n) para la media
n_min_media <- (z^2 * sigma^2) / E^2
n_min_media <- ceiling(n_min_media) # Redondear al siguiente número entero
# Crear una tabla con los resultados
tabla_tamano_muestral_media <- tibble(
Nivel_confianza = nivel_confianza,
Valor_Z = z,
Desviacion_estandar = sigma,
Margen_error = E,
Tamano_muestral_minimo = n_min_media
)
# Mostrar la tabla
tabla_tamano_muestral_media
## # A tibble: 1 × 5
## Nivel_confianza Valor_Z Desviacion_estandar Margen_error
## <dbl> <dbl> <dbl> <dbl>
## 1 0.95 1.96 2000000 200000
## # ℹ 1 more variable: Tamano_muestral_minimo <dbl>
# Generar la tabla LaTeX con los resultados del tamaño muestral
tabla_latex_media <- xtable(tabla_tamano_muestral_media, caption = "Cálculo del Tamaño Muestral para Estimar la Media Poblacional con Error de Estimación de 200,000 Gs")
# Guardar el código LaTeX en un archivo .tex
cat(toString(tabla_latex_media), file = "I:/Mi unidad/articuloMuestreo/tabla_tamano_muestral_media_200000gs.tex")
# Mostrar la tabla LaTeX en la consola
print(tabla_latex_media)
## % latex table generated in R 4.3.1 by xtable 1.8-4 package
## % Tue Jun 17 19:02:38 2025
## \begin{table}[ht]
## \centering
## \begin{tabular}{rrrrrr}
## \hline
## & Nivel\_confianza & Valor\_Z & Desviacion\_estandar & Margen\_error & Tamano\_muestral\_minimo \\
## \hline
## 1 & 0.95 & 1.96 & 2000000.00 & 200000.00 & 385.00 \\
## \hline
## \end{tabular}
## \caption{Cálculo del Tamaño Muestral para Estimar la Media Poblacional con Error de Estimación de 200,000 Gs}
## \end{table}
# Definir el tamaño muestral mínimo para la proporción (calculado previamente)
n_min_proporcion <- n_min # Este valor proviene del cálculo del tamaño muestral para la proporción
# Paso 1: Seleccionar aleatoriamente 5 niveles de 'descripcionEntidad'
set.seed(123) # Fijar la semilla para reproducibilidad
niveles_seleccionados <- sample(unique(fppers$descripcionEntidad), 5)
# Paso 2: Inicializar una lista para almacenar los casos seleccionados
muestra_seleccionada <- data.frame()
# Paso 3: Para cada nivel seleccionado, tomar los casos de manera proporcional
# Primero, dividir el tamaño muestral entre los 5 niveles seleccionados
casos_por_nivel <- rep(floor(n_min_proporcion / 5), 5) # Dividir el tamaño muestral de manera equitativa
# Si el número total de casos seleccionados es menor que el tamaño muestral mínimo, ajustar el último nivel
casos_por_nivel[5] <- casos_por_nivel[5] + (n_min_proporcion - sum(casos_por_nivel))
# Paso 4: Seleccionar los primeros 'casos_por_nivel[i]' casos dentro de cada nivel
for (i in 1:length(niveles_seleccionados)) {
nivel <- niveles_seleccionados[i]
# Filtrar los datos para este nivel
casos_nivel <- fppers %>% filter(descripcionEntidad == nivel)
# Tomar los primeros 'casos_por_nivel[i]' casos
muestra_nivel <- head(casos_nivel, casos_por_nivel[i])
# Agregar la muestra al dataframe de la muestra seleccionada
muestra_seleccionada <- rbind(muestra_seleccionada, muestra_nivel)
}
# Paso 5: Estimar la proporción de mujeres en la muestra seleccionada
proporcion_mujeres_muestra <- sum(muestra_seleccionada$sexo == "F") / nrow(muestra_seleccionada)
# Mostrar los resultados de la proporción de mujeres en la muestra
proporcion_mujeres_muestra
## [1] 0.4154303
# Mostrar la muestra seleccionada
head(muestra_seleccionada)
## # A tibble: 6 × 7
## codigoPersona sexo descripcionNivel descripcionEntidad anio mes
## <chr> <chr> <chr> <chr> <dbl> <dbl>
## 1 1003432 M 11-PODER LEGISLATIVO 003-CÁMARA DE DIPUTADOS 2025 4
## 2 1003520 F 11-PODER LEGISLATIVO 003-CÁMARA DE DIPUTADOS 2025 4
## 3 1003874 M 11-PODER LEGISLATIVO 003-CÁMARA DE DIPUTADOS 2025 4
## 4 1004786 F 11-PODER LEGISLATIVO 003-CÁMARA DE DIPUTADOS 2025 4
## 5 1017322 M 11-PODER LEGISLATIVO 003-CÁMARA DE DIPUTADOS 2025 4
## 6 1017918 M 11-PODER LEGISLATIVO 003-CÁMARA DE DIPUTADOS 2025 4
## # ℹ 1 more variable: salario_total <dbl>
# Crear una tabla de resumen con la cantidad de casos, la proporción de mujeres y el promedio de montoPresupuestado
tabla_resumen <- muestra_seleccionada %>%
group_by(descripcionEntidad) %>%
summarise(
Total_Casos = n(),
Mujeres = sum(sexo == "F"),
Proporcion_Mujeres = Mujeres / Total_Casos,
Promedio_Monto = mean(salario_total, na.rm = TRUE)
) %>%
arrange(desc(Proporcion_Mujeres)) # Ordenar por la proporción de mujeres
tabla_resumen
## # A tibble: 5 × 5
## descripcionEntidad Total_Casos Mujeres Proporcion_Mujeres Promedio_Monto
## <chr> <int> <int> <dbl> <dbl>
## 1 001-CORTE SUPREMA DE JU… 76 42 0.553 7960050.
## 2 031-AUTORIDAD REGULADOR… 29 12 0.414 10067287
## 3 004-CONSEJO DE LA MAGIS… 76 30 0.395 8838864.
## 4 039-DIRECCIÓN NACIONAL … 80 30 0.375 7196092.
## 5 003-CÁMARA DE DIPUTADOS 76 26 0.342 10330304.
# Generar la tabla LaTeX
tabla_latex_resumen <- xtable(tabla_resumen, caption = "Resumen de la Muestra Seleccionada por Conveniencia")
# Guardar el código LaTeX de la tabla de resumen en un archivo .tex
cat(toString(tabla_latex_resumen), file = "I:/Mi unidad/articuloMuestreo/tabla_resumen_muestra.tex")
# Mostrar la tabla LaTeX en la consola
print(tabla_latex_resumen)
## % latex table generated in R 4.3.1 by xtable 1.8-4 package
## % Tue Jun 17 19:02:38 2025
## \begin{table}[ht]
## \centering
## \begin{tabular}{rlrrrr}
## \hline
## & descripcionEntidad & Total\_Casos & Mujeres & Proporcion\_Mujeres & Promedio\_Monto \\
## \hline
## 1 & 001-CORTE SUPREMA DE JUSTICIA & 76 & 42 & 0.55 & 7960049.58 \\
## 2 & 031-AUTORIDAD REGULADORA RADIOLÓGICA Y NUCLEAR & 29 & 12 & 0.41 & 10067287.00 \\
## 3 & 004-CONSEJO DE LA MAGISTRATURA & 76 & 30 & 0.39 & 8838863.88 \\
## 4 & 039-DIRECCIÓN NACIONAL DE MIGRACIONES & 80 & 30 & 0.38 & 7196091.84 \\
## 5 & 003-CÁMARA DE DIPUTADOS & 76 & 26 & 0.34 & 10330303.95 \\
## \hline
## \end{tabular}
## \caption{Resumen de la Muestra Seleccionada por Conveniencia}
## \end{table}
# Calcular el promedio muestral de montoPresupuestado
promedio_muestral <- mean(muestra_seleccionada$salario_total, na.rm = TRUE)
# Calcular la desviación estándar muestral
desviacion_muestral <- sd(muestra_seleccionada$salario_total, na.rm = TRUE)
# Asumir o calcular el promedio poblacional (si no está calculado, usa un valor estimado)
# Suponiendo que el promedio poblacional se conoce o se ha calculado previamente
promedio_poblacional <- mean(fppers$salario_total, na.rm = TRUE) # Promedio de toda la población
# Calcular el tamaño de la muestra
tamano_muestra <- nrow(muestra_seleccionada)
# Calcular el tamaño de la población (total de registros en la población completa)
tamano_poblacion <- nrow(fppers)
# Crear la tabla de resumen
tabla_resumen_media <- tibble(
Promedio_Muestral = promedio_muestral,
Promedio_Poblacional = promedio_poblacional,
Desviacion_Estandar_Muestral = desviacion_muestral,
Tamano_Muestra = tamano_muestra,
Tamano_Poblacion = tamano_poblacion
)
tabla_resumen_media
## # A tibble: 1 × 5
## Promedio_Muestral Promedio_Poblacional Desviacion_Estandar_Mu…¹ Tamano_Muestra
## <dbl> <dbl> <dbl> <int>
## 1 8692757. 7077586. 6831918. 337
## # ℹ abbreviated name: ¹Desviacion_Estandar_Muestral
## # ℹ 1 more variable: Tamano_Poblacion <int>
# Generar la tabla LaTeX
tabla_latex_resumen_media <- xtable(tabla_resumen_media, caption = "Resumen de la Estimación de la Media Poblacional")
# Guardar el código LaTeX de la tabla de resumen en un archivo .tex
cat(toString(tabla_latex_resumen_media), file = "tabla_resumen_media_comparacion.tex")
# Mostrar la tabla LaTeX en la consola
print(tabla_latex_resumen_media)
## % latex table generated in R 4.3.1 by xtable 1.8-4 package
## % Tue Jun 17 19:02:38 2025
## \begin{table}[ht]
## \centering
## \begin{tabular}{rrrrrr}
## \hline
## & Promedio\_Muestral & Promedio\_Poblacional & Desviacion\_Estandar\_Muestral & Tamano\_Muestra & Tamano\_Poblacion \\
## \hline
## 1 & 8692757.25 & 7077586.11 & 6831918.44 & 337 & 279152 \\
## \hline
## \end{tabular}
## \caption{Resumen de la Estimación de la Media Poblacional}
## \end{table}
# Generar la tabla LaTeX
tabla_latex_resumen_media <- xtable(tabla_resumen_media, caption = "Resumen de la Estimación de la Media Poblacional")
# Guardar el código LaTeX de la tabla de resumen en un archivo .tex
cat(toString(tabla_latex_resumen_media), file = "tabla_resumen_media.tex")
# Mostrar la tabla LaTeX en la consola
print(tabla_latex_resumen_media)
## % latex table generated in R 4.3.1 by xtable 1.8-4 package
## % Tue Jun 17 19:02:38 2025
## \begin{table}[ht]
## \centering
## \begin{tabular}{rrrrrr}
## \hline
## & Promedio\_Muestral & Promedio\_Poblacional & Desviacion\_Estandar\_Muestral & Tamano\_Muestra & Tamano\_Poblacion \\
## \hline
## 1 & 8692757.25 & 7077586.11 & 6831918.44 & 337 & 279152 \\
## \hline
## \end{tabular}
## \caption{Resumen de la Estimación de la Media Poblacional}
## \end{table}
## ------------------------------------------------------------------
## Réplica del muestreo 10 000 veces y distribución de las estimaciones
## ------------------------------------------------------------------
library(purrr) # para map_dfr
## Warning: package 'purrr' was built under R version 4.3.3
##
## Attaching package: 'purrr'
## The following object is masked from 'package:data.table':
##
## transpose
library(ggplot2) # para las gráficas
n_replicaciones <- 1000 # número de réplicas
prop_est <- numeric(n_replicaciones)
media_est <- numeric(n_replicaciones)
set.seed(123) # reproducibilidad
for (i in seq_len(n_replicaciones)) {
# 1. Seleccionar cinco niveles de 'descripcionEntidad'
niveles_i <- sample(unique(fppers$descripcionEntidad), 5)
# 2. Definir el número de casos por nivel (muestreo por conveniencia)
casos_i <- rep(floor(n_min_proporcion / 5), 5)
casos_i[5] <- casos_i[5] + (n_min_proporcion - sum(casos_i))
# 3. Extraer los primeros casos de cada nivel y combinarlos
muestra_i <- map2_dfr(
niveles_i, casos_i,
~ fppers %>%
filter(descripcionEntidad == .x) %>%
slice_head(n = .y)
)
# 4. Guardar las estimaciones
prop_est[i] <- mean(muestra_i$sexo == "F", na.rm = TRUE)
media_est[i] <- mean(muestra_i$salario_total, na.rm = TRUE)
}
## -----------------------------------------------------------
## Crear intervalos (clases) y contar frecuencias
## -----------------------------------------------------------
library(dplyr)
library(ggplot2)
# ── 1. Definir cortes de clase ──────────────────────────────
# Para la proporción usaremos intervalos de ancho 0.02;
# para la media muestral emplearemos cortes cada 100 000 Gs.
breaks_prop <- seq(0, 1, by = 0.02)
breaks_media <- seq(floor(min(media_est) / 1e5) * 1e5,
ceiling(max(media_est) / 1e5) * 1e5,
by = 1e5)
# ── 2. Construir la tabla de frecuencias ────────────────────
tabla_prop <- data.frame(Proporcion = prop_est) |>
mutate(Clase = cut(Proporcion, breaks = breaks_prop, include.lowest = TRUE)) |>
count(Clase)
tabla_media <- data.frame(Media = media_est) |>
mutate(Clase = cut(Media, breaks = breaks_media, include.lowest = TRUE)) |>
count(Clase)
# ── 3. Gráfico de barras con las frecuencias por intervalo ──
ggplot(tabla_prop, aes(x = Clase, y = n)) +
geom_col(fill = "steelblue") +
labs(title = "Proporción de mujeres – Frecuencias por intervalo",
x = "Intervalo de proporción", y = "Frecuencia") +
theme_minimal(base_size = 12) +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5))
ggplot(tabla_media, aes(x = Clase, y = n)) +
geom_col(fill = "darkorange") +
labs(title = "Media muestral del salario – Frecuencias por intervalo",
x = "Intervalo de media (Gs)", y = "Frecuencia") +
theme_minimal(base_size = 12) +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5))
## ------------------------------------------------------------------
## 10 000 IC para la proporción y la media ─ Cobertura empírica
## ------------------------------------------------------------------
n_rep <- 1000
z_975 <- 1.96
n_prop <- n_min_proporcion # tamaño de cada réplica p̂
n_media <- n_min_media # tamaño de cada réplica x̄
# vectores de resultados
prop_hat <- numeric(n_rep)
media_hat <- numeric(n_rep)
ic_prop_lo <- numeric(n_rep)
ic_prop_hi <- numeric(n_rep)
ic_media_lo <- numeric(n_rep)
ic_media_hi <- numeric(n_rep)
set.seed(321)
for (i in seq_len(n_rep)) {
# -------- muestreo por conveniencia (mismo esquema que antes) ----
niv_i <- sample(unique(fppers$descripcionEntidad), 5)
k_i <- rep(floor(n_prop / 5), 5); k_i[5] <- k_i[5] + (n_prop - sum(k_i))
samp_i <- purrr::map2_dfr(
niv_i, k_i,
~ fppers |>
filter(descripcionEntidad == .x) |>
slice_head(n = .y)
)
## ---------- proporción de mujeres y su IC -----------------------
p_hat <- mean(samp_i$sexo == "F")
se_p <- sqrt(p_hat * (1 - p_hat) / n_prop)
ic_prop_lo[i] <- p_hat - z_975 * se_p
ic_prop_hi[i] <- p_hat + z_975 * se_p
prop_hat[i] <- p_hat
## ---------- media salarial y su IC ------------------------------
x_bar <- mean(samp_i$salario_total, na.rm = TRUE)
s_x <- sd (samp_i$salario_total, na.rm = TRUE)
se_x <- s_x / sqrt(n_media)
ic_media_lo[i] <- x_bar - z_975 * se_x
ic_media_hi[i] <- x_bar + z_975 * se_x
media_hat[i] <- x_bar
}
# ------------------------------------------------------------------
# Coberturas empíricas
# ------------------------------------------------------------------
p_real <- p # proporción poblacional verdadera
x_real <- promedio_poblacional # media poblacional verdadera
cover_prop <- mean(ic_prop_lo <= p_real & ic_prop_hi >= p_real) * 100
cover_media <- mean(ic_media_lo <= x_real & ic_media_hi >= x_real) * 100
cobertura <- tibble(
Estimador = c("Proporción", "Media"),
Cobertura = c(cover_prop, cover_media)
)
cobertura
## # A tibble: 2 × 2
## Estimador Cobertura
## <chr> <dbl>
## 1 Proporción 46.6
## 2 Media 35
## ------------------------------------------------------------------
## Visualización tipo "cortina" para 500 IC de cada estimador
## ------------------------------------------------------------------
library(ggplot2)
# ------- preparar datos para la proporción ------------------------
plot_prop <- tibble(
idx = seq_len(500),
lo = ic_prop_lo[1:500],
hi = ic_prop_hi [1:500],
cover = factor(if_else(lo <= p_real & hi >= p_real, "Sí", "No"),
levels = c("Sí", "No"))
)
ggplot(plot_prop, aes(y = idx, x = lo, xend = hi, colour = cover)) +
geom_segment(size = 1.2) +
geom_vline(xintercept = p_real, linetype = "dashed") +
scale_colour_manual(values = c("Sí" = "forestgreen", "No" = "firebrick")) +
labs(title = "Intervalos de confianza (500 réplicas) – Proporción de mujeres",
x = "Proporción", y = "Réplicas", colour = "Contiene\nvalor real") +
theme_minimal(base_size = 11) +
theme(legend.position = "bottom")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
# ------- preparar datos para la media -----------------------------
plot_media <- tibble(
idx = seq_len(500),
lo = ic_media_lo[1:500],
hi = ic_media_hi [1:500],
cover = factor(if_else(lo <= x_real & hi >= x_real, "Sí", "No"),
levels = c("Sí", "No"))
)
ggplot(plot_media, aes(y = idx, x = lo, xend = hi, colour = cover)) +
geom_segment(size = 1.2) +
geom_vline(xintercept = x_real, linetype = "dashed") +
scale_colour_manual(values = c("Sí" = "royalblue", "No" = "darkorange2")) +
labs(title = "Intervalos de confianza (500 réplicas) – Media salarial",
x = "Salario total (Gs)", y = "Réplicas", colour = "Contiene\nvalor real") +
theme_minimal(base_size = 11) +
theme(legend.position = "bottom")