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.
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)
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).
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")
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)
df %>%
select(resultado, deudanac, deudaext, deseq_vertical) %>%
GGally::ggpairs(title = "Relaciones y correlaciones entre variables")
par(mfrow = c(2,2))
plot(mod_multiple)
par(mfrow = c(1,1))
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
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
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")
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")
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")
}
.Rmd en RStudio.guardar_csv <- TRUE para exportar
los datos simulados a CSV.