Este documento está pensado para que cualquier alumno pueda ejecutarlo en otra computadora sin depender de archivos externos.
Simula un conjunto de datos, instala/carga las librerías necesarias y genera regresiones (simples y múltiples) y análisis de asociación cualitativa (χ²) con gráficos.

1 0) Instalación y carga de paquetes

pkgs <- c("tidyverse", "broom", "GGally", "scales", "janitor", "gt", "purrr")
instalar <- setdiff(pkgs, rownames(installed.packages()))
if(length(instalar)) install.packages(instalar, repos = "https://cran.rstudio.com/")
invisible(lapply(pkgs, library, character.only = TRUE))

theme_set(theme_minimal(base_size = 13))
update_geom_defaults("point", list(alpha = 0.85))
set.seed(1234)

2 1) Simulación reproducible del conjunto de datos

Creamos una base que imita variables económicas provinciales:
- resultado (continua),
- deudanac, deudaext (niveles de deuda),
- deseq_vertical (desequilibrio vertical),
- Bancos_privatizados (0/1),
- X_regalias_sobre_IFC (proporción),
- reestructuracion (0/1).

N <- 800
id <- rep(1:20, each = N/20)                 # 20 provincias
año <- rep(1996:(1996 + N/20 - 1), 20)       # años balanceados

# Resultado fiscal centrado en 0 con dispersión moderada
resultado <- rnorm(N, 0, 0.2)

# Deudas con leves dependencias de 'resultado' para que haya señal
deudanac <- abs(rnorm(N, 0.15 + 0.15*(resultado < 0), 0.08))
deudaext <- abs(rnorm(N, 0.25, 0.10))

# Desequilibrio vertical y regalías
deseq_vertical <- pmin(pmax(rnorm(N, 0.45, 0.06), 0.25), 0.65)
X_regalias_sobre_IFC <- pmin(rgamma(N, shape = 2, rate = 20), 0.35)

# Bancos privatizados (0/1)
Bancos_privatizados <- rbinom(N, 1, 0.4)

# Probabilidad de reestructuración según covariables (modelo latente)
linpred <- -1 + 4*deudanac + 1.5*deudaext - 2*resultado + 0.7*Bancos_privatizados + 1.2*X_regalias_sobre_IFC
p_reest <- plogis(linpred - mean(linpred))            # centramos para proporción razonable
reestructuracion <- rbinom(N, 1, p_reest)

df <- tibble(
  id, año, reestructuracion, resultado, deudanac, deudaext,
  deseq_vertical, Bancos_privatizados, X_regalias_sobre_IFC
)

glimpse(df)
## Rows: 800
## Columns: 9
## $ id                   <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ año                  <int> 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2…
## $ reestructuracion     <int> 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0…
## $ resultado            <dbl> -0.24141315, 0.05548585, 0.21688824, -0.46913954,…
## $ deudanac             <dbl> 0.21808538, 0.03898795, 0.14606231, 0.44487686, 0…
## $ deudaext             <dbl> 0.22506733, 0.12781014, 0.24274604, 0.38649012, 0…
## $ deseq_vertical       <dbl> 0.4081399, 0.4510810, 0.4392417, 0.4109947, 0.348…
## $ Bancos_privatizados  <int> 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0…
## $ X_regalias_sobre_IFC <dbl> 0.06909836, 0.13584662, 0.09311789, 0.09559109, 0…

Nota docente: esta simulación permite que los gráficos/regresiones muestren relaciones interpretables (señales y significancias no triviales).

3 2) Regresión lineal simple

Modelo: \( \text{resultado} = \beta_0 + \beta_1 \cdot \text{deudanac} + \varepsilon \).

mod_simple <- lm(resultado ~ deudanac, data = df)
summary(mod_simple)
## 
## Call:
## lm(formula = resultado ~ deudanac, data = df)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.70919 -0.09938 -0.00018  0.08856  0.67822 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  0.24615    0.01402   17.56   <2e-16 ***
## deudanac    -1.09815    0.05568  -19.72   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1643 on 798 degrees of freedom
## Multiple R-squared:  0.3277, Adjusted R-squared:  0.3269 
## F-statistic:   389 on 1 and 798 DF,  p-value: < 2.2e-16
ggplot(df, aes(deudanac, resultado)) +
  geom_point() +
  geom_smooth(method = "lm", se = TRUE) +
  labs(title = "Regresión lineal simple",
       subtitle = "resultado ~ deudanac",
       x = "Deuda nacional (relativa)", y = "Resultado fiscal")

4 3) Regresión lineal múltiple

Modelo: \( \text{resultado} \sim \text{deudanac} + \text{deudaext} + \text{deseq\_vertical} + \text{Bancos\_privatizados} + \text{X\_regalias\_sobre\_IFC} \).

mod_multiple <- lm(resultado ~ deudanac + deudaext + deseq_vertical +
                     Bancos_privatizados + X_regalias_sobre_IFC,
                   data = df)

broom::tidy(mod_multiple)
broom::glance(mod_multiple)

4.0.1 3.1) Matriz de relaciones y correlaciones

df %>% 
  select(resultado, deudanac, deudaext, deseq_vertical) %>%
  GGally::ggpairs(title = "Relaciones y correlaciones entre variables")

4.0.2 3.2) Diagnóstico visual del modelo

par(mfrow = c(2,2))
plot(mod_multiple)

par(mfrow = c(1,1))

5 4) Asociación entre cualitativas: Tabla de contingencia y test χ²

Usamos reestructuracion (0/1) y Bancos_privatizados (0/1).

tab_chi <- table(Reestructuracion = df$reestructuracion,
                 Bancos = df$Bancos_privatizados)
tab_chi
##                 Bancos
## Reestructuracion   0   1
##                0 257 123
##                1 215 205

5.1 4.1) Test de independencia y Cramér’s V

chi <- chisq.test(tab_chi, correct = FALSE)
chi
## 
##  Pearson's Chi-squared test
## 
## data:  tab_chi
## X-squared = 22.293, df = 1, p-value = 2.341e-06
chisq  <- unname(chi$statistic); Ntot <- sum(tab_chi)
r <- nrow(tab_chi); c <- ncol(tab_chi)
cramer_v <- sqrt(chisq/(Ntot*min(r-1, c-1)))
cramer_v
## [1] 0.1669319

5.2 4.2) Barras apiladas por grupo (proporciones)

as.data.frame(tab_chi) %>%
  rename(Reestructuracion = Reestructuracion, Bancos = Bancos, Frecuencia = Freq) %>%
  group_by(Bancos) %>%
  mutate(prop = Frecuencia / sum(Frecuencia)) %>%
  ggplot(aes(Bancos, prop, fill = Reestructuracion)) +
  geom_col(position = "fill") +
  geom_text(aes(label = scales::percent(prop, accuracy = 1)),
            position = position_fill(vjust = 0.5), color = "white", size = 3) +
  scale_y_continuous(labels = scales::percent) +
  labs(title = "Reestructuración vs Bancos privatizados",
       x = "Bancos privatizados (0 = No, 1 = Sí)", y = "Porcentaje dentro del grupo",
       fill = "Reestructuración")

5.3 4.3) Heatmap de residuos estandarizados (construcción robusta)

df_std <- chi$stdres
if (is.null(rownames(df_std))) rownames(df_std) <- rownames(tab_chi)
if (is.null(colnames(df_std))) colnames(df_std) <- colnames(tab_chi)

res_df <- tibble(
  Reestructuracion = rep(rownames(df_std), times = ncol(df_std)),
  Bancos = rep(colnames(df_std), each = nrow(df_std)),
  resid = as.vector(df_std)
)

ggplot(res_df, aes(Bancos, Reestructuracion, fill = resid)) +
  geom_tile() +
  geom_text(aes(label = sprintf('%.2f', resid)), size = 3) +
  scale_fill_gradient2(low = "steelblue", mid = "white", high = "tomato", midpoint = 0) +
  labs(title = "Residuos estandarizados del χ²",
       fill = "Residuo std")

6 5) Guardar los datos simulados (opcional)

Para compartirlos con la clase como CSV.

# Cambiar a TRUE si se quiere guardar un CSV local
guardar_csv <- FALSE
if (isTRUE(guardar_csv)) {
  readr::write_csv(df, "datos_reestructuracion_demo.csv")
  message("Archivo guardado: datos_reestructuracion_demo.csv")
}

6.1 Cómo usar este documento

  1. Abrir el .Rmd en RStudio.
  2. Ejecutar el primer chunk para instalar/cargar paquetes.
  3. Hacer Knit → HTML.
  4. (Opcional) Activar guardar_csv <- TRUE para exportar los datos simulados a CSV.