0. Introducción

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 totales
  • transf_tax: Transferencias tributarias sobre ingresos totales
  • deuda_pbg: Stock de deuda pública sobre el PBG
  • inv_pbg: Inversión pública sobre el PBG
  • d_inv_pbg: Variación de la inversión pública sobre el PBG
  • pb_tendencia: Componente de tendencia del resultado primario
  • pb_mejora_pct: Variable de mejora porcentual del resultado primario
  • fiscal_consolidation: indicador (0/1) de proceso de consolidación fiscal

El 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. Reemplazar ruta_datos por 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)

1. Carga y exploración de la base

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}"))

2. Marco teórico breve (recordatorio)

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} \]

  • Prueba de hipótesis: contrastamos \(H_0: \mu = \mu_0\) (o \(\mu \le \mu_0\) / \(\mu \ge \mu_0\)) contra \(H_1\), calculamos el estadístico \(t\) observado y lo comparamos con el valor crítico \(t_{n-1, \alpha}\) (o miramos el p-valor).
  • Intervalo de confianza del \((1-\alpha)100\%\) para \(\mu\):

\[ \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\).


3. Ejemplo resuelto 1 — ¿El resultado primario estuvo, en promedio, equilibrado?

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)
  • Media muestral: -10^{-4}
  • Estadístico t: -0.25 con 479 grados de libertad
  • p-valor: 0.803
  • Decisión: si p-valor < 0.05 se rechaza \(H_0\): el resultado primario promedio es estadísticamente distinto de cero (no hay equilibrio fiscal sistemático). Si p-valor ≥ 0.05, no hay evidencia para rechazar el equilibrio.
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)


4. Ejemplo resuelto 2 — ¿Las transferencias sobre ingresos son mayores a cero?

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)


5. Ejemplo resuelto 3 — ¿La deuda sobre el PBG es distinta de cero?

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)


6. Intervalos de confianza (95%) para las tres variables

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).


7. Ejercicios adicionales resueltos (otras variables)

7.1 Inversión pública sobre el PBG: ¿supera el 1%?

\[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\).

7.2 ¿Las transferencias tributarias (transf_tax) igualan a las transferencias sobre ingresos (transf_ing)? — prueba de dos muestras apareadas

Como 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.

7.3 Consolidación fiscal: ¿la proporción de años con 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.

7.4 ¿Cambió el resultado primario promedio antes y después de 2015? — comparación de dos medias independientes

\[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.


8. Ejercicios propuestos para resolver en clase / TP

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.

  1. 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\)).
  2. 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\)).
  3. pb_tendencia: construir el IC del 95% y compararlo con el de pb_pbg (sección 6). ¿Son consistentes?
  4. 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).
  5. 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.
  6. Desafío: elegir una provincia particular (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.

9. Cómo publicar este documento en RPubs

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í:

  1. Abrir este archivo (Clase_Inferencia_Estadistica.Rmd) en RStudio.
  2. Ajustar ruta_datos en el primer chunk de código para que apunte a la base real.
  3. Hacer clic en “Knit” (arriba del editor) y elegir Knit to HTML. Esto genera el archivo .html con todo el contenido, código y gráficos.
  4. Una vez generado el documento HTML, en la ventana de vista previa (Viewer) aparece un botón “Publish” (ícono azul, arriba a la derecha de la vista previa).
  5. Al presionarlo, seleccionar “RPubs” como destino.
  6. Si es la primera vez, RStudio va a pedir crear una cuenta gratuita en https://rpubs.com/ (o iniciar sesión si ya se tiene una).
  7. Completar título y descripción del documento y confirmar. RStudio sube el HTML y devuelve la URL pública para compartir con los estudiantes.

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.