Esta clase retoma los conceptos de estimación puntual,
estimación por intervalos de confianza y prueba de hipótesis
vistos en la Unidad de Inferencia Estadística, y los aplica sobre una
base de datos real de finanzas públicas provinciales (Provincias
argentinas, panel id-Year, 480 observaciones),
con variables como:
pb_pbg: Resultado Primario sobre el PBG (Producto Bruto
Geográfico)transf_ing: Transferencias nacionales sobre ingresos
totalestransf_tax: Transferencias tributarias sobre ingresos
totalesdeuda_pbg: Stock de deuda pública sobre el PBGinv_pbg: Inversión pública sobre el PBGd_inv_pbg: Variación de la inversión pública sobre el
PBGpb_tendencia: Componente de tendencia del resultado
primariopb_mejora_pct: Variable de mejora porcentual del
resultado primariofiscal_consolidation: indicador (0/1) de proceso de
consolidación fiscalEl objetivo pedagógico es que cada pregunta económica (“¿el resultado fue equilibrado en promedio?”, “¿las transferencias son en promedio positivas?”, etc.) se traduzca en un par de hipótesis estadísticas (H0 y H1), se elija el estadístico de prueba adecuado, se calcule y se interprete el resultado — y en paralelo se construya el intervalo de confianza asociado, mostrando la relación directa entre ambos procedimientos.
Nota para quien dicta la clase: el bloque de carga de datos intenta leer la base real. Si no encuentra un archivo, genera una base simulada con la misma estructura de columnas que la de la captura de pantalla (
Clase_6), solo para que el documento pueda compilarse de punta a punta como demostración. Reemplazarruta_datospor la ubicación real del archivo (.csv,.xlsx,.dta,.rds) antes de dictar la clase.
# Paquetes necesarios
paquetes <- c("tidyverse", "readxl", "haven", "scales", "broom")
instalar <- paquetes[!(paquetes %in% installed.packages()[,"Package"])]
if(length(instalar)) install.packages(instalar)
library(tidyverse)
library(scales)
library(broom)
ruta_datos <- "base_fiscal_provincias.csv" # <-- CAMBIAR por la ruta real
if (file.exists(ruta_datos)) {
ext <- tools::file_ext(ruta_datos)
base <- switch(ext,
"csv" = read_csv(ruta_datos),
"xlsx" = readxl::read_excel(ruta_datos),
"dta" = haven::read_dta(ruta_datos),
"rds" = readRDS(ruta_datos),
stop("Formato de archivo no soportado")
)
} else {
# --- Base simulada SOLO para que el script corra de punta a punta ---
# Calibrada de forma laxa a partir de los valores observados en pantalla.
# Reemplazar apenas se tenga la base real.
set.seed(2026)
provincias <- paste("Provincia", 1:24)
anios <- 2004:2023
base <- expand_grid(Provinces = provincias, Year = anios) %>%
mutate(
id = as.integer(factor(Provinces)),
`Investment (millons of pesos)` = round(rgamma(n(), shape = 4, scale = 250), 0),
`Primary Balance` = round(rnorm(n(), mean = -50, sd = 900), 0),
transf_ing = pmin(pmax(rnorm(n(), 0.55, 0.08), 0.2), 0.9),
transf_tax = pmin(pmax(rnorm(n(), 0.58, 0.07), 0.2), 0.9),
`Borrowing (millones de pesos)` = pmax(round(rnorm(n(), 800, 1800), 0), 0),
deflactor_2004 = round(1 + (Year - 2004) * 0.35 + rnorm(n(), 0, 0.2), 2),
inv_pbg = pmax(rnorm(n(), 0.012, 0.006), 0),
pb_pbg = rnorm(n(), mean = -0.001, sd = 0.012),
deuda_pbg = pmax(rnorm(n(), 0.05, 0.04), 0),
d_inv_pbg = rnorm(n(), 0, 0.003),
pb_tendencia = pb_pbg + rnorm(n(), 0, 0.003),
pb_mejora_pct = rnorm(n(), 0.02, 0.05),
fiscal_consolidation = rbinom(n(), 1, 0.35)
)
message("AVISO: no se encontró '", ruta_datos, "'. Se generó una base simulada de demostración.")
}
glimpse(base)
## Rows: 480
## Columns: 16
## $ Provinces <chr> "Provincia 1", "Provincia 1", "Provinc…
## $ Year <int> 2004, 2005, 2006, 2007, 2008, 2009, 20…
## $ id <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ `Investment (millons of pesos)` <dbl> 1135, 443, 199, 591, 1125, 1423, 712, …
## $ `Primary Balance` <dbl> 126, 724, -657, -1546, 301, 347, 1106,…
## $ transf_ing <dbl> 0.5887278, 0.6168339, 0.6200118, 0.449…
## $ transf_tax <dbl> 0.5706476, 0.5693967, 0.5430611, 0.524…
## $ `Borrowing (millones de pesos)` <dbl> 0, 0, 586, 0, 2541, 0, 0, 1026, 660, 0…
## $ deflactor_2004 <dbl> 1.18, 1.14, 1.65, 2.07, 2.63, 2.95, 3.…
## $ inv_pbg <dbl> 0.007747041, 0.020134489, 0.009041484,…
## $ pb_pbg <dbl> -1.161474e-02, 6.613970e-03, 4.231051e…
## $ deuda_pbg <dbl> 0.1428754189, 0.0256343010, 0.05832660…
## $ d_inv_pbg <dbl> -4.214679e-03, 8.826514e-04, 7.484858e…
## $ pb_tendencia <dbl> -0.0055630103, 0.0079331393, 0.0075282…
## $ pb_mejora_pct <dbl> -0.069725628, 0.080648327, 0.010323340…
## $ fiscal_consolidation <int> 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0,…
base %>%
summarise(across(c(pb_pbg, transf_ing, transf_tax, deuda_pbg, inv_pbg, d_inv_pbg),
list(media = ~mean(.x, na.rm = TRUE),
de = ~sd(.x, na.rm = TRUE),
n = ~sum(!is.na(.x))),
.names = "{.col}_{.fn}"))
Para una muestra aleatoria \(X_1, \dots, X_n\) de una población con media \(\mu\) desconocida, y varianza desconocida, usamos el estadístico:
\[ t = \frac{\bar{X} - \mu_0}{S / \sqrt{n}} \sim t_{n-1} \]
\[ \bar{X} \pm t_{n-1,\, \alpha/2} \cdot \frac{S}{\sqrt{n}} \]
Regla práctica: si \(\mu_0\) no cae dentro del IC de \((1-\alpha)\), se rechaza \(H_0: \mu=\mu_0\) al nivel \(\alpha\) en una prueba bilateral. Esta equivalencia se explota en los ejemplos siguientes para que el estudiante vea ambos procedimientos “hablando de lo mismo”.
En todos los casos usamos \(\alpha = 0.05\).
Pregunta económica: se sostiene que el resultado
primario (pb_pbg) de las provincias estuvo, en promedio, en
equilibrio (ni superávit ni déficit sistemático).
Hipótesis:
\[H_0: \mu_{pb\_pbg} = 0 \qquad \text{vs.} \qquad H_1: \mu_{pb\_pbg} \neq 0\]
Es una prueba bilateral porque “equilibrado” implica igualdad a cero en ambos sentidos.
pb <- base$pb_pbg %>% na.omit()
test_pb <- t.test(pb, mu = 0, alternative = "two.sided", conf.level = 0.95)
test_pb
##
## One Sample t-test
##
## data: pb
## t = -0.24981, df = 479, p-value = 0.8028
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## -0.001207260 0.000934917
## sample estimates:
## mean of x
## -0.0001361714
Lectura del resultado:
tidy(test_pb) %>% select(estimate, statistic, p.value, conf.low, conf.high)
ggplot(base, aes(x = pb_pbg)) +
geom_histogram(aes(y = after_stat(density)), bins = 30, fill = "#2C77B0", alpha = 0.6, color = "white") +
geom_density(color = "#0B3D5C", linewidth = 1) +
geom_vline(xintercept = 0, color = "black", linetype = "dashed", linewidth = 0.8) +
geom_vline(xintercept = mean(pb), color = "firebrick", linewidth = 1) +
annotate("text", x = 0, y = Inf, label = "H0: mu = 0", vjust = 2, hjust = -0.05) +
annotate("text", x = mean(pb), y = Inf, label = "media muestral", vjust = 4, hjust = -0.05, color = "firebrick") +
labs(title = "Distribución del Resultado Primario / PBG",
subtitle = "Línea negra: valor de H0 (0). Línea roja: media muestral",
x = "Resultado primario / PBG", y = "Densidad") +
theme_minimal(base_size = 12)
Pregunta económica: las provincias reciben transferencias nacionales y se espera que, en promedio, ese componente sea positivo (naturalmente lo es por construcción contable, pero sirve como ejemplo de prueba unilateral).
Hipótesis:
\[H_0: \mu_{transf\_ing} \le 0 \qquad \text{vs.} \qquad H_1: \mu_{transf\_ing} > 0\]
ti <- base$transf_ing %>% na.omit()
test_ti <- t.test(ti, mu = 0, alternative = "greater", conf.level = 0.95)
test_ti
##
## One Sample t-test
##
## data: ti
## t = 148.34, df = 479, p-value < 2.2e-16
## alternative hypothesis: true mean is greater than 0
## 95 percent confidence interval:
## 0.5419679 Inf
## sample estimates:
## mean of x
## 0.5480569
Decisión: con un p-valor de <2e-16, se
rechaza \(H_0\): hay
evidencia de que, en promedio, transf_ing es mayor a
cero.
ggplot(base, aes(x = transf_ing)) +
geom_histogram(bins = 30, fill = "#2E8B57", alpha = 0.7, color = "white") +
geom_vline(xintercept = 0, linetype = "dashed") +
geom_vline(xintercept = mean(ti), color = "firebrick", linewidth = 1) +
labs(title = "Transferencias sobre ingresos totales",
subtitle = "Prueba unilateral H0: mu <= 0 vs H1: mu > 0",
x = "transf_ing", y = "Frecuencia") +
theme_minimal(base_size = 12)
Hipótesis:
\[H_0: \mu_{deuda\_pbg} = 0 \qquad \text{vs.} \qquad H_1: \mu_{deuda\_pbg} \neq 0\]
deuda <- base$deuda_pbg %>% na.omit()
test_deuda <- t.test(deuda, mu = 0, alternative = "two.sided", conf.level = 0.95)
test_deuda
##
## One Sample t-test
##
## data: deuda
## t = 32.328, df = 479, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## 0.04985364 0.05630618
## sample estimates:
## mean of x
## 0.05307991
Decisión: p-valor <2e-16 → se rechaza \(H_0\): el nivel de endeudamiento provincial es (o no) estadísticamente distinto de cero.
ggplot(base, aes(y = deuda_pbg, x = "")) +
geom_boxplot(fill = "#D9822B", alpha = 0.6, width = 0.3) +
geom_hline(yintercept = 0, linetype = "dashed") +
geom_hline(yintercept = mean(deuda), color = "firebrick") +
labs(title = "Deuda pública / PBG", x = "", y = "deuda_pbg") +
theme_minimal(base_size = 12)
calcular_ic <- function(x, nombre){
x <- na.omit(x)
t <- t.test(x)
tibble(variable = nombre,
media = mean(x),
li = t$conf.int[1],
ls = t$conf.int[2])
}
ics <- bind_rows(
calcular_ic(base$pb_pbg, "pb_pbg"),
calcular_ic(base$transf_ing, "transf_ing"),
calcular_ic(base$deuda_pbg, "deuda_pbg")
)
ics
ggplot(ics, aes(x = variable, y = media)) +
geom_pointrange(aes(ymin = li, ymax = ls), color = "#2C77B0", linewidth = 1, size = 0.8) +
geom_hline(yintercept = 0, linetype = "dashed", color = "gray30") +
labs(title = "Intervalos de confianza al 95% para la media",
subtitle = "Línea punteada: valor de referencia (0)",
x = "", y = "Valor estimado") +
theme_minimal(base_size = 12)
Interpretación general: en el 95% de las muestras
repetidas, un intervalo construido de esta manera contendrá al verdadero
valor poblacional de la media. Nótese que para pb_pbg y
deuda_pbg la conclusión del IC es consistente con la prueba
bilateral de las secciones 3 y 5 (cae o no cae el cero dentro del
intervalo).
\[H_0: \mu_{inv\_pbg} \le 0.01 \qquad H_1: \mu_{inv\_pbg} > 0.01\]
inv <- na.omit(base$inv_pbg)
test_inv <- t.test(inv, mu = 0.01, alternative = "greater")
test_inv
##
## One Sample t-test
##
## data: inv
## t = 5.8673, df = 479, p-value = 4.135e-09
## alternative hypothesis: true mean is greater than 0.01
## 95 percent confidence interval:
## 0.01113832 Inf
## sample estimates:
## mean of x
## 0.01158294
ggplot(base, aes(x = inv_pbg)) +
geom_histogram(bins = 30, fill = "#7A4EA6", alpha = 0.7, color = "white") +
geom_vline(xintercept = 0.01, linetype = "dashed") +
geom_vline(xintercept = mean(inv), color = "firebrick") +
labs(title = "Inversión pública / PBG", subtitle = "H0: mu <= 0.01 vs H1: mu > 0.01",
x = "inv_pbg", y = "Frecuencia") +
theme_minimal(base_size = 12)
Conclusión: p-valor 4.14e-09 → se rechaza \(H_0\).
transf_tax)
igualan a las transferencias sobre ingresos (transf_ing)? —
prueba de dos muestras apareadasComo ambas variables están medidas en las mismas provincias-año, corresponde una prueba t apareada sobre la diferencia.
\[H_0: \mu_{transf\_tax} - \mu_{transf\_ing} = 0 \qquad H_1: \mu_{transf\_tax} - \mu_{transf\_ing} \neq 0\]
pares <- base %>% select(transf_tax, transf_ing) %>% drop_na()
test_par <- t.test(pares$transf_tax, pares$transf_ing, paired = TRUE)
test_par
##
## Paired t-test
##
## data: pares$transf_tax and pares$transf_ing
## t = 6.5163, df = 479, p-value = 1.828e-10
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
## 0.02153394 0.04012726
## sample estimates:
## mean difference
## 0.0308306
pares %>%
mutate(diferencia = transf_tax - transf_ing) %>%
ggplot(aes(x = diferencia)) +
geom_histogram(bins = 30, fill = "#C0392B", alpha = 0.7, color = "white") +
geom_vline(xintercept = 0, linetype = "dashed") +
labs(title = "Diferencia transf_tax - transf_ing (por provincia-año)",
x = "Diferencia", y = "Frecuencia") +
theme_minimal(base_size = 12)
Conclusión: p-valor 1.83e-10 → se rechaza la igualdad de medias.
fiscal_consolidation = 1 es distinta del 50%?Ejemplo de prueba de hipótesis para una proporción.
\[H_0: p = 0.5 \qquad H_1: p \neq 0.5\]
exitos <- sum(base$fiscal_consolidation == 1, na.rm = TRUE)
n_total <- sum(!is.na(base$fiscal_consolidation))
test_prop <- prop.test(x = exitos, n = n_total, p = 0.5, correct = FALSE)
test_prop
##
## 1-sample proportions test without continuity correction
##
## data: exitos out of n_total, null probability 0.5
## X-squared = 43.2, df = 1, p-value = 4.942e-11
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.3086744 0.3937074
## sample estimates:
## p
## 0.35
tibble(categoria = c("Consolidación = 1", "Consolidación = 0"),
proporcion = c(exitos/n_total, 1 - exitos/n_total)) %>%
ggplot(aes(x = categoria, y = proporcion, fill = categoria)) +
geom_col(width = 0.5) +
geom_hline(yintercept = 0.5, linetype = "dashed") +
scale_y_continuous(labels = percent) +
scale_fill_manual(values = c("#2C77B0", "#B0B0B0")) +
labs(title = "Proporción de años con consolidación fiscal", x = "", y = "Proporción") +
theme_minimal(base_size = 12) + theme(legend.position = "none")
IC al 95% para la proporción: [0.309 ; 0.394]. Conclusión: p-valor 4.94e-11.
\[H_0: \mu_{pb\_pbg,\, \le 2015} = \mu_{pb\_pbg,\, > 2015} \qquad H_1: \text{distintas}\]
base_periodos <- base %>%
mutate(periodo = ifelse(Year <= 2015, "2004-2015", "2016 en adelante")) %>%
drop_na(pb_pbg)
test_periodos <- t.test(pb_pbg ~ periodo, data = base_periodos)
test_periodos
##
## Welch Two Sample t-test
##
## data: pb_pbg by periodo
## t = 0.3789, df = 407.36, p-value = 0.705
## alternative hypothesis: true difference in means between group 2004-2015 and group 2016 en adelante is not equal to 0
## 95 percent confidence interval:
## -0.001769936 0.002615137
## sample estimates:
## mean in group 2004-2015 mean in group 2016 en adelante
## 3.286892e-05 -3.897318e-04
ggplot(base_periodos, aes(x = periodo, y = pb_pbg, fill = periodo)) +
geom_boxplot(alpha = 0.7) +
geom_hline(yintercept = 0, linetype = "dashed") +
labs(title = "Resultado primario / PBG por período", x = "", y = "pb_pbg") +
theme_minimal(base_size = 12) + theme(legend.position = "none")
Conclusión: p-valor 0.705 → se no rechaza la igualdad de medias entre períodos.
Para que los estudiantes repliquen el procedimiento de las secciones 3 a 7 con otras variables de la misma base. Se sugiere pedirles que en cada caso: (i) planteen \(H_0\) y \(H_1\), (ii) elijan el estadístico y la prueba (uni o bilateral), (iii) calculen el p-valor y el IC, (iv) hagan un gráfico, (v) redacten la conclusión en términos económicos.
d_inv_pbg: ¿la variación de la
inversión pública sobre el PBG fue, en promedio, positiva? (\(H_0: \mu \le 0\) vs \(H_1: \mu > 0\)).pb_mejora_pct: ¿la mejora porcentual
del resultado primario superó, en promedio, el 1%? (\(H_0: \mu \le 0.01\) vs \(H_1: \mu > 0.01\)).pb_tendencia: construir el IC del 95%
y compararlo con el de pb_pbg (sección 6). ¿Son
consistentes?Borrowing (millones de pesos): ¿el
endeudamiento promedio de las provincias con
fiscal_consolidation = 1 es distinto del de las que tienen
fiscal_consolidation = 0? (prueba de dos muestras
independientes, análoga a 7.4).transf_tax: construir un IC del 90%
(en lugar de 95%) y discutir cómo cambia la amplitud del intervalo al
modificar el nivel de confianza.filter(Provinces == "...")) y repetir el test de la
sección 3 solo para esa serie temporal. Discutir por qué el tamaño de
muestra (\(n\)) afecta la potencia de
la prueba.Este .Rmd está pensado para conocerse en
RStudio (no en la consola de R sola), porque la
publicación a RPubs se hace desde ahí:
Clase_Inferencia_Estadistica.Rmd)
en RStudio.ruta_datos en el primer chunk de código para
que apunte a la base real..html con
todo el contenido, código y gráficos.Este paso requiere una sesión interactiva de RStudio vinculada a una cuenta de RPubs; no puede hacerse solo con el
.Rmd/script por sí solo desde afuera de RStudio.