# --- [Cargar librerías y paquetes necesarios] ---
# Función que instala y carga automáticamente los paquetes requeridos
load_or_install <- function(packages) {
for (pkg in packages) {
if (!require(pkg, character.only = TRUE, quietly = TRUE)) {
install.packages(pkg, dependencies = TRUE)
library(pkg, character.only = TRUE)
message(paste("✅ Paquete instalado y cargado:", pkg))
} else {
message(paste("✔ Paquete ya disponible:", pkg))
}
}
}
# Lista actualizada de librerías utilizadas en la tesis
paquetes_necesarios <- c(
"tidyverse", # incluye dplyr, ggplot2, tidyr, readr, etc.
"readxl", # leer archivos Excel
"openxlsx", # leer y escribir Excel
"lubridate", # manejo de fechas
"scales", # formateo de ejes y porcentajes
"janitor", # limpiar nombres de columnas
"stringr", # manipulación de texto
"forcats", # manejo de factores
"data.table", # eficiencia en manejo de grandes datos
"knitr", # generación de reportes
"kableExtra", # tablas estéticas para reportes
"ggthemes", # temas visuales para ggplot2
"plotly", # gráficos interactivos
"broom", # conversión de resultados a data frames
"car", # pruebas estadísticas complementarias
"psych", # análisis descriptivo y psicométrico
"splm", # modelos de panel espacial
"spdep", # dependencias espaciales
"rlang", # gestión interna de entornos R
"ggpubr", # gráficos estadísticos listos para publicación
"lmtest", # pruebas de hipótesis y diagnóstico de modelos
"nortest", # pruebas de normalidad adicionales
"sp", # manejo de objetos espaciales
"urca", # pruebas de raíz unitaria (ADF, PP, etc.)
"spData", # conjuntos de datos espaciales
"plm", # modelos de panel
"sandwich", # estimadores robustos de varianza
"stargazer"
)
# Ejecutar instalación y carga
load_or_install(paquetes_necesarios)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.1 ✔ stringr 1.5.2
## ✔ ggplot2 4.0.0 ✔ tibble 3.3.0
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.1.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
## ✔ Paquete ya disponible: tidyverse
##
## ✔ Paquete ya disponible: readxl
##
## ✔ Paquete ya disponible: openxlsx
##
## ✔ Paquete ya disponible: lubridate
##
##
## Adjuntando el paquete: 'scales'
##
##
## The following object is masked from 'package:purrr':
##
## discard
##
##
## The following object is masked from 'package:readr':
##
## col_factor
##
##
## ✔ Paquete ya disponible: scales
##
##
## Adjuntando el paquete: 'janitor'
##
##
## The following objects are masked from 'package:stats':
##
## chisq.test, fisher.test
##
##
## ✔ Paquete ya disponible: janitor
##
## ✔ Paquete ya disponible: stringr
##
## ✔ Paquete ya disponible: forcats
##
##
## Adjuntando el paquete: '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
##
##
## The following object is masked from 'package:purrr':
##
## transpose
##
##
## ✔ Paquete ya disponible: data.table
##
## ✔ Paquete ya disponible: knitr
##
##
## Adjuntando el paquete: 'kableExtra'
##
##
## The following object is masked from 'package:dplyr':
##
## group_rows
##
##
## ✔ Paquete ya disponible: kableExtra
##
## ✔ Paquete ya disponible: ggthemes
##
##
## Adjuntando el paquete: 'plotly'
##
##
## The following object is masked from 'package:ggplot2':
##
## last_plot
##
##
## The following object is masked from 'package:stats':
##
## filter
##
##
## The following object is masked from 'package:graphics':
##
## layout
##
##
## ✔ Paquete ya disponible: plotly
##
## ✔ Paquete ya disponible: broom
##
##
## Adjuntando el paquete: 'car'
##
##
## The following object is masked from 'package:dplyr':
##
## recode
##
##
## The following object is masked from 'package:purrr':
##
## some
##
##
## ✔ Paquete ya disponible: car
##
##
## Adjuntando el paquete: 'psych'
##
##
## The following object is masked from 'package:car':
##
## logit
##
##
## The following objects are masked from 'package:scales':
##
## alpha, rescale
##
##
## The following objects are masked from 'package:ggplot2':
##
## %+%, alpha
##
##
## ✔ Paquete ya disponible: psych
##
## ✔ Paquete ya disponible: splm
##
## To access larger datasets in this package, install the spDataLarge
## package with: `install.packages('spDataLarge',
## repos='https://nowosad.github.io/drat/', type='source')`
##
## Linking to GEOS 3.13.0, GDAL 3.10.1, PROJ 9.5.1; sf_use_s2() is TRUE
##
## ✔ Paquete ya disponible: spdep
##
##
## Adjuntando el paquete: 'rlang'
##
##
## The following object is masked from 'package:data.table':
##
## :=
##
##
## The following objects are masked from 'package:purrr':
##
## %@%, flatten, flatten_chr, flatten_dbl, flatten_int, flatten_lgl,
## flatten_raw, invoke, splice
##
##
## ✔ Paquete ya disponible: rlang
##
## ✔ Paquete ya disponible: ggpubr
##
##
## Adjuntando el paquete: 'zoo'
##
##
## The following objects are masked from 'package:data.table':
##
## yearmon, yearqtr
##
##
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
##
##
## ✔ Paquete ya disponible: lmtest
##
## ✔ Paquete ya disponible: nortest
##
## ✔ Paquete ya disponible: sp
##
## ✔ Paquete ya disponible: urca
##
## ✔ Paquete ya disponible: spData
##
##
## Adjuntando el paquete: 'plm'
##
##
## The following object is masked from 'package:data.table':
##
## between
##
##
## The following objects are masked from 'package:dplyr':
##
## between, lag, lead
##
##
## ✔ Paquete ya disponible: plm
##
## ✔ Paquete ya disponible: sandwich
##
##
## Please cite as:
##
##
## Hlavac, Marek (2022). stargazer: Well-Formatted Regression and Summary Statistics Tables.
##
## R package version 5.2.3. https://CRAN.R-project.org/package=stargazer
##
##
## ✔ Paquete ya disponible: stargazer
# Configuración global para reportes
options(scipen = 16) # evita notación científica
theme_set(theme_minimal()) # tema base para ggplot
# Importar los archivo
pibe_2018 <- read_excel("DATOS LIMPIOS TESIS.xlsx", sheet = "PIBE precios 2018")
deuda_2018 <- read_excel("DATOS LIMPIOS TESIS.xlsx", sheet = "Deuda_p2018")
ip_2018 <- read_excel(
"DATOS LIMPIOS TESIS.xlsx",
sheet = "IP_2018",
range = "A1:O33"
)
# Crear vector con los estados de análisis
estados_foco <- c(
"Baja California Sur", "Chiapas", "Ciudad de México", "Colima",
"Estado de México", "Hidalgo", "Nuevo León", "Puebla", "San Luis Potosí", "Tlaxcala", "Veracruz","Zacatecas"
)
## Tablas reducidas
# Filtrar solo los estados de interés
pibe_2018_red <- pibe_2018 %>%
filter(Estado %in% estados_foco)
deuda_2018_red <- deuda_2018 %>%
filter(Estado %in% estados_foco)
# Renombrar columnas anuales para identificarlas
names(pibe_2018_red)[-1] <- paste0("PIB_", names(pibe_2018_red)[-1])
names(deuda_2018_red)[-1] <- paste0("Deuda_", names(deuda_2018_red)[-1])
# Verifica que cambió correctamente
head(pibe_2018_red)
## # A tibble: 6 × 15
## Estado PIB_2010 PIB_2011 PIB_2012 PIB_2013 PIB_2014 PIB_2015 PIB_2016 PIB_2017
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Baja … 138669. 144956. 147270. 145216. 147614. 156072. 163095. 170784.
## 2 Colima 125596. 133676. 135600. 133729. 135091. 141029. 140705. 150360.
## 3 Chiap… 355979. 361270. 370237. 360621. 374691. 364001. 369919. 359734.
## 4 Ciuda… 3125717. 3231440. 3332209. 3363394. 3412110. 3503520. 3571368. 3646318.
## 5 Hidal… 358637. 366544. 379811. 379720. 397901. 413909. 418466. 416409.
## 6 Estad… 1773210. 1852646. 1911402. 1923372. 1966749. 2007572. 2058753. 2166132.
## # ℹ 6 more variables: PIB_2018 <dbl>, PIB_2019 <dbl>, PIB_2020 <dbl>,
## # PIB_2021 <dbl>, PIB_2022 <dbl>, PIB_2023 <dbl>
head(deuda_2018_red)
## # A tibble: 6 × 15
## Estado Deuda_2010 Deuda_2011 Deuda_2012 Deuda_2013 Deuda_2014 Deuda_2015
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Baja Califo… 2923. 2523. 2278. 3241. 2944. 2718.
## 2 Colima 1951. 3205. 2943. 3647. 3392. 3932.
## 3 Chiapas 11621. 18945. 20724. 25587. 24017. 21619.
## 4 Ciudad de M… 69656. 72483. 73172. 75238. 77113. 79609.
## 5 Hidalgo 6928. 6115. 5391. 6012. 6210. 7998.
## 6 Estado de M… 54400. 51776. 51894. 49520. 46983. 47361.
## # ℹ 8 more variables: Deuda_2016 <dbl>, Deuda_2017 <dbl>, Deuda_2018 <dbl>,
## # Deuda_2019 <dbl>, Deuda_2020 <dbl>, Deuda_2021 <dbl>, Deuda_2022 <dbl>,
## # Deuda_2023 <dbl>
# Ahora une las tablas
datos_2018 <- left_join(pibe_2018_red, deuda_2018_red, by = "Estado")
# Listar nombres finales
names(datos_2018)
## [1] "Estado" "PIB_2010" "PIB_2011" "PIB_2012" "PIB_2013"
## [6] "PIB_2014" "PIB_2015" "PIB_2016" "PIB_2017" "PIB_2018"
## [11] "PIB_2019" "PIB_2020" "PIB_2021" "PIB_2022" "PIB_2023"
## [16] "Deuda_2010" "Deuda_2011" "Deuda_2012" "Deuda_2013" "Deuda_2014"
## [21] "Deuda_2015" "Deuda_2016" "Deuda_2017" "Deuda_2018" "Deuda_2019"
## [26] "Deuda_2020" "Deuda_2021" "Deuda_2022" "Deuda_2023"
datos_2018 <- datos_2018 %>%
mutate(across(matches("PIB_|Deuda_"), as.numeric))
summary(datos_2018)
## Estado PIB_2010 PIB_2011 PIB_2012
## Length:12 Min. : 121829 Min. : 125891 Min. : 128975
## Class :character 1st Qu.: 182557 1st Qu.: 184160 1st Qu.: 187791
## Mode :character Median : 376220 Median : 391326 Median : 408703
## Mean : 816705 Mean : 845296 Mean : 874897
## 3rd Qu.:1149151 3rd Qu.:1175365 3rd Qu.:1219025
## Max. :3125717 Max. :3231440 Max. :3332209
## PIB_2013 PIB_2014 PIB_2015 PIB_2016
## Min. : 128121 Min. : 130496 Min. : 137054 Min. : 139168
## 1st Qu.: 183427 1st Qu.: 195305 1st Qu.: 199972 1st Qu.: 203265
## Median : 414989 Median : 428968 Median : 446967 Median : 462161
## Mean : 875189 Mean : 893754 Mean : 916210 Mean : 930748
## 3rd Qu.:1208737 3rd Qu.:1222883 3rd Qu.:1244232 3rd Qu.:1230626
## Max. :3363394 Max. :3412110 Max. :3503520 Max. :3571368
## PIB_2017 PIB_2018 PIB_2019 PIB_2020
## Min. : 143920 Min. : 147753 Min. : 147877 Min. : 135083
## 1st Qu.: 208122 1st Qu.: 217446 1st Qu.: 209275 1st Qu.: 195965
## Median : 478326 Median : 488213 Median : 471829 Median : 432595
## Mean : 957660 Mean : 980955 Mean : 976483 Mean : 888259
## 3rd Qu.:1226894 3rd Qu.:1249686 3rd Qu.:1269702 3rd Qu.:1164230
## Max. :3646318 Max. :3694575 Max. :3679917 Max. :3293855
## PIB_2021 PIB_2022 PIB_2023 Deuda_2010
## Min. : 143213 Min. : 146642 Min. : 148529 Min. : 0
## 1st Qu.: 208960 1st Qu.: 213292 1st Qu.: 216925 1st Qu.: 2680
## Median : 454077 Median : 482023 Median : 508268 Median : 9490
## Mean : 941131 Mean : 975171 Mean :1008475 Mean :20811
## 3rd Qu.:1237391 3rd Qu.:1263648 3rd Qu.:1300937 3rd Qu.:35405
## Max. :3496056 Max. :3650378 Max. :3806102 Max. :69656
## Deuda_2011 Deuda_2012 Deuda_2013 Deuda_2014
## Min. : 75.91 Min. : 58.69 Min. : 0 Min. : 0
## 1st Qu.: 4571.44 1st Qu.: 4779.14 1st Qu.: 5421 1st Qu.: 5303
## Median : 9880.27 Median : 9492.03 Median : 9581 Median :10231
## Mean :22744.34 Mean :24719.55 Mean :25790 Mean :26286
## 3rd Qu.:41274.44 3rd Qu.:50742.04 3rd Qu.:49962 3rd Qu.:47806
## Max. :72483.03 Max. :73172.01 Max. :75238 Max. :78102
## Deuda_2015 Deuda_2016 Deuda_2017 Deuda_2018
## Min. : 39.02 Min. : 0 Min. : 0 Min. : 35.75
## 1st Qu.: 4872.39 1st Qu.: 4746 1st Qu.: 4159 1st Qu.: 4074.58
## Median : 9787.18 Median : 9235 Median : 8496 Median : 7996.55
## Mean :26563.60 Mean :26304 Mean :25835 Mean :25558.22
## 3rd Qu.:49047.42 3rd Qu.:48263 3rd Qu.:48165 3rd Qu.:47337.30
## Max. :79609.32 Max. :79648 Max. :81156 Max. :81726.52
## Deuda_2019 Deuda_2020 Deuda_2021 Deuda_2022
## Min. : 41.73 Min. : 15.05 Min. : 0 Min. : 0
## 1st Qu.: 3897.20 1st Qu.: 4071.69 1st Qu.: 3614 1st Qu.: 3517
## Median : 7549.54 Median : 6654.69 Median : 5641 Median : 5163
## Mean :24736.58 Mean :24743.50 Mean :24649 Mean :24781
## 3rd Qu.:43633.76 3rd Qu.:43486.63 3rd Qu.:43766 3rd Qu.:42353
## Max. :82212.50 Max. :81279.53 Max. :85005 Max. :84115
## Deuda_2023
## Min. : 0
## 1st Qu.: 3212
## Median : 4694
## Mean :24311
## 3rd Qu.:42726
## Max. :81938
# --- Calcular correlaciones PIB-Deuda por año ---
anos <- 2010:2023
resultados_cor_abs <- data.frame(
Año = anos,
Correlación = NA,
p_valor = NA,
N = NA
)
for (i in anos) {
pib_col <- paste0("PIB_", i)
deuda_col <- paste0("Deuda_", i)
# Verifica que existan las columnas
if (pib_col %in% names(datos_2018) && deuda_col %in% names(datos_2018)) {
# Extrae los vectores
x <- as.numeric(datos_2018[[deuda_col]]) # X → variable independiente
y <- as.numeric(datos_2018[[pib_col]]) # Y → variable dependiente
# Elimina pares con NA
ok <- complete.cases(x, y)
# Aplica test de correlación si hay al menos 3 observaciones válidas
if (sum(ok) >= 3) {
test <- cor.test(x[ok], y[ok], method = "pearson")
resultados_cor_abs[resultados_cor_abs$Año == i, "Correlación"] <- test$estimate
resultados_cor_abs[resultados_cor_abs$Año == i, "p_valor"] <- test$p.value
resultados_cor_abs[resultados_cor_abs$Año == i, "N"] <- sum(ok)
}
}
}
print(resultados_cor_abs)
## Año Correlación p_valor N
## 1 2010 0.9688472 0.0000002193072 12
## 2 2011 0.9537220 0.0000015464257 12
## 3 2012 0.9129016 0.0000340558567 12
## 4 2013 0.8930050 0.0000920461449 12
## 5 2014 0.8805096 0.0001564604018 12
## 6 2015 0.8865119 0.0001221899030 12
## 7 2016 0.8792905 0.0001642565001 12
## 8 2017 0.8854634 0.0001277061175 12
## 9 2018 0.8934088 0.0000903856861 12
## 10 2019 0.9122269 0.0000353543301 12
## 11 2020 0.9074943 0.0000455965273 12
## 12 2021 0.9273350 0.0000141104384 12
## 13 2022 0.9178704 0.0000256067498 12
## 14 2023 0.9129056 0.0000340481639 12
##¿Por que no son relevantes los resultados anteriores?
#Al trabajar con valores absolutos las diferentes escalas de la economía ocultan las diferencias, las entidades con mayores economías tienen deudas más grandes y se respeta la situación para el caso contrario.Por eso debaría usar logaritmos para tener una visión proporcional
#debido a que tlaxcala tiene endeudamiento 0 durante varios periodos y es relevante mantenerlo es necesario hacer un ligero ajuste
datos_log <- datos_2018 %>%
mutate(
across(starts_with("PIB_"), ~log(.), .names = "ln_{.col}"),
across(starts_with("Deuda_"), ~log(. + 1), .names = "ln_{.col}")
)
# Calcular las diferencias (crecimientos)
for (i in 2011:2023) {
col_pib_t <- paste0("ln_PIB_", i)
col_pib_t1 <- paste0("ln_PIB_", i - 1)
col_deuda_t <- paste0("ln_Deuda_", i)
col_deuda_t1 <- paste0("ln_Deuda_", i - 1)
datos_log[[paste0("dln_PIB_", i)]] <- datos_log[[col_pib_t]] - datos_log[[col_pib_t1]]
datos_log[[paste0("dln_Deuda_", i)]] <- datos_log[[col_deuda_t]] - datos_log[[col_deuda_t1]]
}
# Confirmar que no hay NA o -Inf
summary(select(datos_log, starts_with("ln_")))
## ln_PIB_2010 ln_PIB_2011 ln_PIB_2012 ln_PIB_2013
## Min. :11.71 Min. :11.74 Min. :11.77 Min. :11.76
## 1st Qu.:12.10 1st Qu.:12.12 1st Qu.:12.13 1st Qu.:12.11
## Median :12.84 Median :12.88 Median :12.92 Median :12.93
## Mean :13.06 Mean :13.10 Mean :13.13 Mean :13.12
## 3rd Qu.:13.94 3rd Qu.:13.96 3rd Qu.:14.00 3rd Qu.:13.99
## Max. :14.96 Max. :14.99 Max. :15.02 Max. :15.03
## ln_PIB_2014 ln_PIB_2015 ln_PIB_2016 ln_PIB_2017
## Min. :11.78 Min. :11.83 Min. :11.84 Min. :11.88
## 1st Qu.:12.17 1st Qu.:12.20 1st Qu.:12.22 1st Qu.:12.24
## Median :12.97 Median :13.01 Median :13.04 Median :13.07
## Mean :13.15 Mean :13.18 Mean :13.19 Mean :13.22
## 3rd Qu.:14.00 3rd Qu.:14.01 3rd Qu.:14.00 3rd Qu.:13.99
## Max. :15.04 Max. :15.07 Max. :15.09 Max. :15.11
## ln_PIB_2018 ln_PIB_2019 ln_PIB_2020 ln_PIB_2021
## Min. :11.90 Min. :11.90 Min. :11.81 Min. :11.87
## 1st Qu.:12.29 1st Qu.:12.25 1st Qu.:12.18 1st Qu.:12.24
## Median :13.09 Median :13.06 Median :12.97 Median :13.02
## Mean :13.25 Mean :13.24 Mean :13.15 Mean :13.21
## 3rd Qu.:14.00 3rd Qu.:14.02 3rd Qu.:13.93 3rd Qu.:13.99
## Max. :15.12 Max. :15.12 Max. :15.01 Max. :15.07
## ln_PIB_2022 ln_PIB_2023 ln_Deuda_2010 ln_Deuda_2011
## Min. :11.90 Min. :11.91 Min. : 0.000 Min. : 4.343
## 1st Qu.:12.27 1st Qu.:12.28 1st Qu.: 7.880 1st Qu.: 8.410
## Median :13.08 Median :13.13 Median : 9.132 Median : 9.148
## Mean :13.24 Mean :13.27 Mean : 8.525 Mean : 9.095
## 3rd Qu.:14.01 3rd Qu.:14.04 3rd Qu.:10.450 3rd Qu.:10.618
## Max. :15.11 Max. :15.15 Max. :11.151 Max. :11.191
## ln_Deuda_2012 ln_Deuda_2013 ln_Deuda_2014 ln_Deuda_2015
## Min. : 4.089 Min. : 0.000 Min. : 0.000 Min. : 3.689
## 1st Qu.: 8.441 1st Qu.: 8.577 1st Qu.: 8.550 1st Qu.: 8.485
## Median : 9.119 Median : 9.151 Median : 9.231 Median : 9.188
## Mean : 9.111 Mean : 8.851 Mean : 8.849 Mean : 9.164
## 3rd Qu.:10.834 3rd Qu.:10.819 3rd Qu.:10.774 3rd Qu.:10.799
## Max. :11.201 Max. :11.228 Max. :11.266 Max. :11.285
## ln_Deuda_2016 ln_Deuda_2017 ln_Deuda_2018 ln_Deuda_2019
## Min. : 0.000 Min. : 0.000 Min. : 3.604 Min. : 3.755
## 1st Qu.: 8.458 1st Qu.: 8.332 1st Qu.: 8.313 1st Qu.: 8.263
## Median : 9.131 Median : 9.047 Median : 8.982 Median : 8.921
## Mean : 8.842 Mean : 8.786 Mean : 9.043 Mean : 9.010
## 3rd Qu.:10.781 3rd Qu.:10.781 3rd Qu.:10.765 3rd Qu.:10.682
## Max. :11.285 Max. :11.304 Max. :11.311 Max. :11.317
## ln_Deuda_2020 ln_Deuda_2021 ln_Deuda_2022 ln_Deuda_2023
## Min. : 2.776 Min. : 0.000 Min. : 0.000 Min. : 0.000
## 1st Qu.: 8.311 1st Qu.: 8.192 1st Qu.: 8.164 1st Qu.: 8.073
## Median : 8.795 Median : 8.636 Median : 8.547 Median : 8.450
## Mean : 8.926 Mean : 8.601 Mean : 8.595 Mean : 8.525
## 3rd Qu.:10.679 3rd Qu.:10.681 3rd Qu.:10.644 3rd Qu.:10.653
## Max. :11.306 Max. :11.350 Max. :11.340 Max. :11.314
#Generamos pruebas de correlación
# Crear una tabla vacía donde guardar resultados
resultados_cor <- data.frame(
Año = integer(),
Correlación = numeric(),
P_value = numeric(),
IC_inf = numeric(),
IC_sup = numeric(),
Significativo = character(),
stringsAsFactors = FALSE
)
# Calcular correlaciones año a año
for (i in 2011:2023) {
col_pib <- paste0("dln_PIB_", i)
col_deuda <- paste0("dln_Deuda_", i)
# Filtrar observaciones válidas
df_temp <- datos_log[!is.na(datos_log[[col_pib]]) & !is.na(datos_log[[col_deuda]]), ]
# Ejecutar prueba de correlación
test <- cor.test(df_temp[[col_pib]], df_temp[[col_deuda]])
# Guardar resultados esenciales
resultados_cor <- rbind(
resultados_cor,
data.frame(
Año = i,
Correlación = round(test$estimate, 3),
P_value = round(test$p.value, 4),
IC_inf = round(test$conf.int[1], 3),
IC_sup = round(test$conf.int[2], 3),
Significativo = ifelse(test$p.value < 0.05, "Sí", "No")
)
)
}
# Mostrar tabla ordenada
print(resultados_cor)
## Año Correlación P_value IC_inf IC_sup Significativo
## cor 2011 -0.239 0.4537 -0.715 0.388 No
## cor1 2012 0.017 0.9570 -0.562 0.585 No
## cor2 2013 -0.051 0.8745 -0.607 0.539 No
## cor3 2014 0.726 0.0075 0.262 0.918 Sí
## cor4 2015 0.316 0.3174 -0.315 0.753 No
## cor5 2016 0.014 0.9649 -0.564 0.583 No
## cor6 2017 0.307 0.3321 -0.324 0.749 No
## cor7 2018 0.013 0.9683 -0.565 0.582 No
## cor8 2019 -0.590 0.0435 -0.869 -0.024 Sí
## cor9 2020 -0.007 0.9836 -0.578 0.569 No
## cor10 2021 -0.119 0.7132 -0.648 0.488 No
## cor11 2022 -0.151 0.6395 -0.667 0.463 No
## cor12 2023 0.223 0.4862 -0.402 0.706 No
# Ejemplo para el ultimo año
año <- 2023
col_pib <- paste0("dln_PIB_", año)
col_deuda <- paste0("dln_Deuda_", año)
ggplot(datos_log, aes(x = !!sym(col_deuda), y = !!sym(col_pib))) +
geom_point(size = 3, color = "#2E86C1", alpha = 0.7) +
geom_smooth(method = "lm", se = FALSE, color = "red") +
labs(
title = paste("Relación entre crecimiento del PIB y crecimiento de la deuda - Año", año),
x = "Δln(Deuda) (crecimiento de la deuda)",
y = "Δln(PIB) (crecimiento económico)"
) +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

datos_panel <- datos_log %>%
select(Estado, starts_with("dln_PIB_"), starts_with("dln_Deuda_")) %>%
pivot_longer(
cols = -Estado,
names_to = c(".value", "Año"),
names_pattern = "dln_(PIB|Deuda)_(\\d+)"
) %>%
mutate(Año = as.integer(Año))
#Tlaxcala esta dominando el eje X por lo que voy a eliminarlo de la grafica
datos_panel_plot <- datos_panel %>%
filter(Estado != "Tlaxcala")
#Graficando todos los años y Estados
ggplot(datos_panel, aes(x = Deuda, y = PIB)) +
geom_point(aes(color = Estado), alpha = 0.7, size = 2) +
geom_smooth(method = "lm", se = FALSE, color = "black", linewidth = 1) +
labs(
title = "Relación entre crecimiento del PIB y crecimiento de la deuda (2011–2023)",
subtitle = "12 entidades federativas mexicanas",
x = "Crecimiento de la deuda (Δln Deuda)",
y = "Crecimiento económico (Δln PIB)"
) +
theme_minimal() +
theme(legend.position = "bottom")

#interactivo
p <- ggplot(datos_panel_plot, aes(x = Deuda, y = PIB, color = Estado)) +
geom_point(alpha = 0.8, size = 2) +
geom_smooth(method = "lm", se = FALSE, color = "black") +
labs(
title = "Crecimiento del PIB vs Deuda (2011–2023), Sin tlaxcala",
x = "Δln(Deuda)",
y = "Δln(PIB)"
) +
theme_minimal()
ggplotly(p)
p_global <- ggplot(datos_panel_plot, aes(x = Deuda, y = PIB)) +
geom_point(aes(color = Estado), alpha = 0.75, size = 2) +
geom_smooth(method = "lm", formula = y ~ x, se = FALSE, color = "black", linewidth = 1) +
labs(
title = "Relación entre crecimiento del PIB y crecimiento de la deuda (2011–2023)",
subtitle = "11 entidades federativas mexicanas (sin Tlaxcala por escala)",
x = "Crecimiento de la deuda (Δln Deuda)",
y = "Crecimiento económico (Δln PIB)"
) +
theme_minimal() +
theme(legend.position = "bottom")
print(p_global)

#facetado por años
ggplot(datos_panel_plot, aes(x = Deuda, y = PIB, color = Estado)) +
geom_point(alpha = 0.7, size = 2) +
geom_smooth(method = "lm", se = FALSE, color = "black") +
facet_wrap(~Año, scales = "free") +
labs(
title = "Relación entre Δln(PIB) y Δln(Deuda) por año",
subtitle = "Sin Tlaxcala",
x = "Crecimiento de la deuda (Δln Deuda)",
y = "Crecimiento económico (Δln PIB)"
) +
theme_light() +
theme(legend.position = "none")

# facetado por entidad
ggplot(datos_panel, aes(x = Deuda, y = PIB)) +
geom_point(color = "#2E86C1", alpha = 0.7, linewidth = 2) +
geom_smooth(method = "lm", se = FALSE, color = "red") +
facet_wrap(~Estado, scales = "free") +
labs(
title = "Relación entre crecimiento de la deuda y del PIB por entidad (2011–2023)",
x = "Crecimiento de la deuda (Δln Deuda)",
y = "Crecimiento económico (Δln PIB)"
) +
theme_minimal()
## Warning in geom_point(color = "#2E86C1", alpha = 0.7, linewidth = 2): Ignoring
## unknown parameters: `linewidth`

# Histograma y QQ plot
ggqqplot(datos_panel$PIB, title = "QQ-Plot crecimiento del PIB")

ggqqplot(datos_panel$Deuda, title = "QQ-Plot crecimiento de la deuda")

# Prueba de Shapiro-Wilk
shapiro.test(datos_panel$PIB)
##
## Shapiro-Wilk normality test
##
## data: datos_panel$PIB
## W = 0.89836, p-value = 0.000000006414
shapiro.test(datos_panel$Deuda)
##
## Shapiro-Wilk normality test
##
## data: datos_panel$Deuda
## W = 0.41321, p-value < 0.00000000000000022
#Confirmamos con otras pruebas
ad.test(datos_panel$PIB) # Anderson-Darling
##
## Anderson-Darling normality test
##
## data: datos_panel$PIB
## A = 4.5672, p-value = 0.00000000002253
lillie.test(datos_panel$PIB) # Lilliefors
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: datos_panel$PIB
## D = 0.14348, p-value = 0.00000002434
#Todos los test rechazan la normalidad
#Dada la no normalidad de la muestra se podría optar por modelos no parametricos como ANOVA, sin embargo
#Al ser de un analisis de tipo panel puedo comparar que los residuos sean normales,
#Aunque las variables no lo sean.
pdim(datos_panel)
## Balanced Panel: n = 12, T = 13, N = 156
# Efectivamente es un panel balanceado, con N=12, T=13 y N=156
adf_pib <- ur.df(datos_panel$PIB, type = "drift", lags = 1)
summary(adf_pib)
##
## ###############################################
## # Augmented Dickey-Fuller Test Unit Root Test #
## ###############################################
##
## Test regression drift
##
##
## Call:
## lm(formula = z.diff ~ z.lag.1 + 1 + z.diff.lag)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.164166 -0.015254 0.004413 0.023907 0.092128
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.018386 0.003771 4.876 0.00000272 ***
## z.lag.1 -1.172075 0.114228 -10.261 < 0.0000000000000002 ***
## z.diff.lag 0.158097 0.080227 1.971 0.0506 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.04113 on 151 degrees of freedom
## Multiple R-squared: 0.5184, Adjusted R-squared: 0.512
## F-statistic: 81.28 on 2 and 151 DF, p-value: < 0.00000000000000022
##
##
## Value of test-statistic is: -10.2608 52.6425
##
## Critical values for test statistics:
## 1pct 5pct 10pct
## tau2 -3.46 -2.88 -2.57
## phi1 6.52 4.63 3.81
#“De acuerdo con la prueba ADF (Augmented Dickey–Fuller), la serie del crecimiento del PIB (∆ln PIB) presenta un valor estadístico de −10.26, menor al valor crítico al 5% (−2.88). En consecuencia, se rechaza la hipótesis nula de raíz unitaria, concluyendo que la serie es estacionaria en niveles. Esto implica que las fluctuaciones en el crecimiento económico no presentan una tendencia persistente en el tiempo y son apropiadas para su inclusión en modelos econométricos de panel.”
# 1. Verifica normalidad de RESIDUOS, no variables
modelo_fe_resi <- plm(PIB ~ Deuda, data = datos_panel, model = "within")
residuos <- resid(modelo_fe_resi)
shapiro.test(residuos)
##
## Shapiro-Wilk normality test
##
## data: residuos
## W = 0.87693, p-value = 0.0000000004594
pdata <- pdata.frame(datos_panel, index = c("Estado", "Año"))
## Modelo de Efectos Fijos (DENTRO)
modelo_fe <- plm(PIB ~ Deuda, data = pdata, model = "within")
summary(modelo_fe)
## Oneway (individual) effect Within Model
##
## Call:
## plm(formula = PIB ~ Deuda, data = pdata, model = "within")
##
## Balanced Panel: n = 12, T = 13, N = 156
##
## Residuals:
## Min. 1st Qu. Median 3rd Qu. Max.
## -0.178378 -0.012260 0.006007 0.023010 0.098931
##
## Coefficients:
## Estimate Std. Error t-value Pr(>|t|)
## Deuda 0.0025605 0.0044773 0.5719 0.5683
##
## Total Sum of Squares: 0.2557
## Residual Sum of Squares: 0.25511
## R-Squared: 0.0022819
## Adj. R-Squared: -0.081443
## F-statistic: 0.327062 on 1 and 143 DF, p-value: 0.56829
bptest(modelo_fe)
##
## studentized Breusch-Pagan test
##
## data: modelo_fe
## BP = 0.33662, df = 1, p-value = 0.5618
pbgtest(modelo_fe)
##
## Breusch-Godfrey/Wooldridge test for serial correlation in panel models
##
## data: PIB ~ Deuda
## chisq = 78.303, df = 13, p-value = 0.00000000002299
## alternative hypothesis: serial correlation in idiosyncratic errors
pcdtest(modelo_fe)
##
## Pesaran CD test for cross-sectional dependence in panels
##
## data: PIB ~ Deuda
## z = 20.564, p-value < 0.00000000000000022
## alternative hypothesis: cross-sectional dependence
## Objetos eliminados: i, x, y
## used (Mb) gc trigger (Mb) max used (Mb)
## Ncells 4342808 232.0 7178482 383.4 7178482 383.4
## Vcells 7701099 58.8 14786712 112.9 10740491 82.0
## Objetos actuales en el entorno:
## [1] "adf_pib" "anos" "año"
## [4] "col_deuda" "col_deuda_t" "col_deuda_t1"
## [7] "col_pib" "col_pib_t" "col_pib_t1"
## [10] "datos_2018" "datos_log" "datos_panel"
## [13] "datos_panel_plot" "deuda_2018" "deuda_2018_red"
## [16] "deuda_col" "df_temp" "estados_foco"
## [19] "existentes" "ip_2018" "load_or_install"
## [22] "modelo_fe" "modelo_fe_resi" "objetos_a_eliminar"
## [25] "ok" "p" "p_global"
## [28] "paquetes_necesarios" "pdata" "pib_col"
## [31] "pibe_2018" "pibe_2018_red" "residuos"
## [34] "resultados_cor" "resultados_cor_abs" "test"
# El modelo de efectos fijos muestra que existe un crecimiento practicamente nulo del PIB
# ademas de no ser estadisticamente significativo, por lo que no se puede rechazar que el
# el crecimiento de la deuda no afecta en el crecimiento economico.
#El modelo de efectos fijos viola algunos supuestos de auto correlación serial (hay inercia)
#y dependencia cruzada, es decir entre los estados (tambien logico)
# --- Errores robustos Driscoll–Kraay ---
res_robust_dk <- coeftest(modelo_fe, vcov = vcovSCC(modelo_fe, type = "HC0"))
print(res_robust_dk)
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## Deuda 0.0025605 0.0022472 1.1394 0.2564
# --- Errores robustos Arellano (por entidad) ---
res_robust_arellano <- coeftest(modelo_fe, vcov = vcovHC(modelo_fe, type = "HC1", cluster = "group"))
print(res_robust_arellano)
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## Deuda 0.0025605 0.0014084 1.8181 0.07114 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# --- Generar errores robustos ---
se_clasico <- sqrt(diag(vcov(modelo_fe)))
se_dk <- sqrt(diag(vcovSCC(modelo_fe, type = "HC0")))
se_arellano <- sqrt(diag(vcovHC(modelo_fe, type = "HC1", cluster = "group")))
# --- Tabla comparativa con Stargazer ---
p_values <- c(0.568, 0.256, 0.071)
stargazer(modelo_fe, modelo_fe, modelo_fe,
type = "text",
se = list(se_clasico, se_dk, se_arellano),
column.labels = c("Clásico", "Driscoll–Kraay", "Arellano"),
dep.var.labels = "Crecimiento del PIB (∆ln)",
covariate.labels = "Crecimiento de la deuda (∆ln)",
digits = 4,
add.lines = list(c("p-value", p_values)),
model.numbers = FALSE,
header = FALSE)
##
## ==============================================================
## Dependent variable:
## --------------------------------
## Crecimiento del PIB (∆ln)
## Clásico Driscoll–Kraay Arellano
## --------------------------------------------------------------
## Crecimiento de la deuda (∆ln) 0.0026 0.0026 0.0026*
## (0.0045) (0.0022) (0.0014)
##
## --------------------------------------------------------------
## p-value 0.568 0.256 0.071
## Observations 156 156 156
## R2 0.0023 0.0023 0.0023
## Adjusted R2 -0.0814 -0.0814 -0.0814
## F Statistic (df = 1; 143) 0.3271 0.3271 0.3271
## ==============================================================
## Note: *p<0.1; **p<0.05; ***p<0.01