Volver a proyectos
Volver
Econometría financieraArtículo técnico

Datos de panel de los clientes institucionales del BANHVI

Evaluación de la relación entre variables macroeconómicas y el desempeño financiero de las instituciones que conforman la cartera institucional del Banco Hipotecario de la Vivienda.

Autores: Henry Fabian Alvarado Vargas, José Andrés Castillo Azofeifa y Mario Alejandro Paniagua BarrantesUniversidad de Costa Rica2026
01

Objetivo del análisis

El estudio utiliza modelos de datos de panel para determinar la relación existente entre diferentes variables macroeconómicas y el desempeño financiero de las instituciones que forman parte de la cartera de clientes del Banco Hipotecario de la Vivienda, BANHVI.

Los modelos de panel combinan información de corte transversal de diferentes instituciones financieras con series de tiempo. Esta metodología permite trabajar con una mayor cantidad de observaciones, incrementar la variabilidad de los datos, reducir problemas de colinealidad y mejorar la eficiencia estadística de las estimaciones.

A partir de un ejercicio previo de clusterización, las instituciones fueron agrupadas en dos categorías:

  • Cooperativas.
  • Otras instituciones, conformadas principalmente por bancos y otras entidades financieras.

El período general de estudio comprende desde enero de 2016 hasta febrero de 2025. Sin embargo, para identificar relaciones estructurales y evitar que los resultados fueran dominados por eventos extraordinarios, se excluyó el período comprendido entre marzo de 2020 y diciembre de 2023, asociado con la crisis sanitaria COVID-19 y sus consecuencias económicas.

Después de esta exclusión, cada institución contó con 62 observaciones. Por tanto, se trabajó con paneles balanceados, porque cada institución tiene el mismo número de observaciones, y largos, porque la cantidad de períodos supera la cantidad de instituciones analizadas.

El propósito central fue identificar relaciones económicas estructurales entre el entorno macroeconómico y el desempeño financiero de las instituciones, sin que los resultados fueran determinados por shocks sistémicos atípicos.
02

Indicadores financieros analizados

Se seleccionaron tres variables dependientes relacionadas con eficiencia, liquidez, calidad de cartera y rentabilidad.

Indicador financieroInterpretación
Activo productivo de intermediación financiera / Pasivo con costoMide la eficiencia con la que la institución transforma los recursos captados en activos generadores de ingresos. También se relaciona con la liquidez y la capacidad de cumplir obligaciones.
Cartera al día y con atraso hasta 90 días / Cartera totalMide la proporción de la cartera que se mantiene al día o con atrasos inferiores a 90 días. Un valor mayor representa una mejor calidad de cartera.
Rentabilidad nominal / Patrimonio promedioMide la rentabilidad generada por el patrimonio de la institución. Una relación más alta implica una mayor rentabilidad para los propietarios.

Tabla. Indicadores financieros seleccionados para el análisis.

03

Variables macroeconómicas

Se utilizaron cinco indicadores macroeconómicos como variables independientes.

VariableDescripción y relevancia
Tasa Básica Pasiva (TBP)Representa el costo promedio de captación de recursos en colones y permite aproximar los efectos de la política monetaria sobre las instituciones financieras.
Tasa de desempleo (TDESP)Refleja la situación del mercado laboral y la capacidad de los hogares para solicitar y pagar financiamiento.
Índice de Precios al Consumidor (IPC)Mide la evolución de los precios, el poder adquisitivo y las condiciones inflacionarias de la economía.
Índice Mensual de Actividad Económica (IMAE)Mide mensualmente el dinamismo de la economía. Se utilizó el IMAE del régimen definitivo.
Índice de Confianza del Consumidor (ICC)Mide la percepción de los consumidores sobre su situación económica actual y futura, lo cual puede influir sobre el consumo y la demanda de crédito.

Tabla. Variables macroeconómicas utilizadas en los modelos.

04

Especificación del modelo de datos de panel

La fórmula general utilizada para las estimaciones fue:

Yit = αi + β1TBPt + β2IPCt + β3TDESPt + β4IMAEt + β5ICCt + uit

Donde:

  • αᵢ recoge las características estructurales no observadas de cada institución.
  • Las variables explicativas son macroeconómicas y comunes a todas las instituciones en cada período.
  • uᵢₜ es el término de error.

Estas especificaciones se estiman por separado para cada uno de los tres indicadores financieros seleccionados como variables dependientes:

  1. Activo productivo de intermediación financiera / Pasivo con costo, asociado con eficiencia y liquidez.
  2. Cartera al día y con atraso hasta 90 días / Cartera total, asociado con calidad de cartera.
  3. Rentabilidad nominal / Patrimonio promedio, asociado con rentabilidad sobre patrimonio.
05

Modelos con series originales

En esta primera etapa se utilizaron las series de tiempo originales. Los gráficos siguientes presentan la evolución de las variables macroeconómicas durante el período 2016-2025.

Gráfico 1. Tasa Básica Pasiva 2016-2025

Evolución de la Tasa Básica Pasiva entre 2016 y 2025
Fuente: elaboración propia con datos del BCCR (Costa Rica).

Gráfico 2. Índice de Precios al Consumidor 2016-2025

Evolución del Índice de Precios al Consumidor entre 2016 y 2025
Fuente: elaboración propia con datos del BCCR (Costa Rica).

Gráfico 3. Tasa de Desempleo 2016-2025

Evolución de la tasa de desempleo entre 2016 y 2025
Fuente: elaboración propia con datos del BCCR (Costa Rica).

Gráfico 4. Índice Mensual de Actividad Económica 2016-2025

Evolución del Índice Mensual de Actividad Económica entre 2016 y 2025
Fuente: elaboración propia con datos del BCCR (Costa Rica), año 2025.

Gráfico 5. Índice de Confianza del Consumidor 2016-2025

Evolución del Índice de Confianza del Consumidor entre 2016 y 2025
Fuente: elaboración propia con datos de la Escuela de Estadística de la Universidad de Costa Rica.
06

Pruebas de estacionariedad y colinealidad

Prueba Augmented Dickey-Fuller

La prueba Augmented Dickey-Fuller arrojó valores p superiores a 0,05 para todas las variables macroeconómicas. Por tanto, no fue posible rechazar la hipótesis nula de presencia de raíz unitaria. Esto confirma que las series originales son no estacionarias.

Colinealidad

La colinealidad entre las variables se evaluó mediante el Factor de Inflación de la Varianza, VIF, y la matriz de correlaciones.

El Índice de Confianza del Consumidor y la tasa de desempleo presentaron los valores VIF más elevados, cercanos a 5. Esto representa una colinealidad moderada, pero no lo suficientemente alta como para invalidar las regresiones.

Gráfico 6. Matriz de correlaciones – Series originales

Matriz de correlaciones de las variables macroeconómicas
Fuente: elaboración propia con datos del BCCR.

Para cada clúster se realizó una regresión utilizando el método de Efectos Fijos y otra utilizando el método de Efectos Aleatorios. Posteriormente, se realizó la prueba de Hausman para identificar cuál de los dos modelos se ajusta mejor con base en los datos disponibles.

La prueba de Hausman indicó en todos los casos la regresión por Efectos Aleatorios.

Las tablas siguientes muestran los coeficientes de las variables explicativas que poseen un p-value significativo a 0,05.

07

Resultados de los modelos con datos originales

Indicador: Activo Productivo de Intermediación Financiera / Pasivo con Costo

Tabla 1. Activo Productivo de Intermediación Financiera / Pasivo con Costo (Datos originales)

VariableCooperativasOtras instituciones
TBPN/A−0.00275506
IPC−0.004479810.00120851
IMAEN/A−0.00105387
ICCN/A−0.00048224
0.189730.075286

Fuente: elaboración propia. Modelo de Efectos Aleatorios.

En las cooperativas, el IPC fue la única variable significativa. Su coeficiente negativo indica que un aumento de la inflación se relaciona con una reducción de la razón entre activo productivo y pasivo con costo.

Esto sugiere que la inflación erosiona la eficiencia de intermediación financiera de las cooperativas, posiblemente como consecuencia de una menor demanda de crédito y una menor capacidad de canalizar los recursos captados hacia activos productivos.

En las otras instituciones, la TBP tiene un efecto negativo debido al encarecimiento del fondeo; el IPC presentó inicialmente un efecto levemente positivo; el IMAE tuvo una relación negativa; y el ICC presentó un efecto negativo de baja magnitud.

Los valores de R² son bajos en ambos clústeres. Por tanto, las variables macroeconómicas explican solo una parte limitada de la variación del indicador. Los resultados deben interpretarse como relaciones marginales y no como una explicación completa de su comportamiento.

Indicador: Cartera al día y con atraso hasta 90 días / Cartera Total

Tabla 2. Cartera al día y con atraso hasta 90 días / Cartera Total (Datos originales)

VariableCooperativasOtras instituciones
TBP−2.268794−0.845942
IPC0.2235930.142432
TDESPN/A−0.944492
0.15940.6122

Fuente: elaboración propia. Modelo de Efectos Aleatorios.

La calidad de la cartera de las cooperativas presenta una fuerte sensibilidad a la TBP. El coeficiente negativo de −2,268794 implica que el aumento de las tasas se asocia con una reducción importante de la proporción de cartera al día.

Esto evidencia que los deudores de las cooperativas son particularmente vulnerables a los incrementos en las tasas de interés.

El IPC presenta un coeficiente positivo. Sin embargo, esta relación no necesariamente implica una mejora real del riesgo de crédito. Puede estar relacionada con efectos nominales sobre los saldos y con una reducción de la demanda de financiamiento durante períodos inflacionarios.

En las otras instituciones también se identifica un efecto negativo de la TBP, aunque de menor magnitud. Además, la tasa de desempleo presenta un efecto negativo significativo, mostrando que el deterioro del mercado laboral reduce directamente la proporción de cartera al día.

  • Cooperativas: R² de 0,1594.
  • Otras instituciones: R² de 0,6122.

Esto indica que la calidad de cartera de las otras instituciones se encuentra considerablemente más vinculada con las condiciones macroeconómicas analizadas.

Indicador: Rentabilidad Nominal / Patrimonio Promedio

Tabla 3. Rentabilidad Nominal / Patrimonio Promedio (Datos originales)

VariableCooperativasOtras instituciones
TBP0.42391−0.780748
IPC−0.151782N/A
IMAEN/A−0.0593950
0.440910.067067

Fuente: elaboración propia. Modelo de Efectos Aleatorios.

En las cooperativas, el coeficiente positivo de la TBP indica que los aumentos en las tasas se relacionan con una mayor rentabilidad sobre el patrimonio. Esto podría producirse cuando el rendimiento de los activos se ajusta más rápidamente que el costo de los recursos captados, generando una ampliación de los márgenes financieros.

El IPC presenta un efecto negativo sobre la rentabilidad de las cooperativas. La inflación puede reducir la demanda de crédito y afectar la capacidad de las entidades para generar activos productivos e ingresos financieros.

En las otras instituciones, la TBP tiene un coeficiente negativo. Esto sugiere que el costo de fondeo aumenta más rápidamente que el rendimiento de los activos, comprimiendo los márgenes y la rentabilidad.

El IMAE también presenta un efecto negativo, aunque de menor magnitud. Una posible interpretación es que durante períodos de mayor actividad económica aumenta la competencia financiera y la presión sobre los márgenes.

El R² del modelo de cooperativas alcanza 0,44091, mostrando una capacidad explicativa relativamente importante. En las otras instituciones, el R² es de apenas 0,067067.

Este modelo asume que las particularidades no observadas de cada institución no se relacionan sistemáticamente con las variables independientes, sino que se comportan de manera aleatoria.

08

Prueba de heterocedasticidad de Breusch-Pagan

La prueba se formuló a partir de las siguientes hipótesis:

  • H₀: los errores tienen varianza constante.
  • H₁: la varianza de los errores depende de las variables X, por lo que existe heterocedasticidad.

Si el p-value resultante se ubica por debajo del nivel de significancia escogido de 0,05, se rechaza la hipótesis nula de homocedasticidad y se concluye la presencia de heterocedasticidad.

Tabla 4. Activo Productivo de Intermediación Financiera / Pasivo con Costo

GrupoEstadístico BPp-valueConclusión
Cooperativas24.3780.0001837Rechaza H₀ → hay heterocedasticidad
Otras instituciones1.56080.9059No se rechaza H₀ → homocedasticidad

Fuente: elaboración propia.

Tabla 5. Cartera al día y con atraso hasta 90 días / Cartera Total

GrupoEstadístico BPp-valueConclusión
Cooperativas7.56690.1818No se rechaza H₀ → homocedasticidad
Otras instituciones26.1470.00008355Rechaza H₀ → hay heterocedasticidad

Fuente: elaboración propia.

Tabla 6. Rentabilidad Nominal / Patrimonio Promedio

GrupoEstadístico BPp-valueConclusión
Cooperativas70.0211.015E-13Rechaza H₀ → hay heterocedasticidad
Otras instituciones6.73570.2411No se rechaza H₀ → homocedasticidad

Fuente: elaboración propia.

Los resultados muestran presencia de heterocedasticidad en al menos uno de los clústeres para cada indicador financiero. Esto justificó la aplicación de errores estándar robustos, con Driscoll-Kraay como método principal y Arellano como complemento.

09

Aplicación del modelo Driscoll-Kraay

El método Driscoll-Kraay corrige los errores estándar ante problemas de heterocedasticidad, autocorrelación temporal y dependencia entre instituciones.

La corrección no modifica los coeficientes estimados originalmente. Su función es recalcular los errores estándar, los valores t y los valores p, permitiendo determinar con mayor precisión cuáles relaciones son estadísticamente significativas.

Estos modelos se corren sobre la misma regresión de Efectos Aleatorios, por lo que conservan los coeficientes originales, pero presentan errores estándar, t-values y p-values diferentes.

Indicador: Activo Productivo de Intermediación Financiera / Pasivo con Costo

Tabla 7. Datos originales con ajuste Driscoll-Kraay

VariableCooperativasOtras instituciones
IPC−0.00447981−0.00120851
TDESP−0.00529603N/A
IMAEN/A0.00105387

Fuente: elaboración propia. Modelo de Efectos Aleatorios.

En las cooperativas se mantiene el efecto negativo del IPC. Esto confirma de manera robusta que la inflación se relaciona con una pérdida de eficiencia de intermediación.

Además, la tasa de desempleo se vuelve estadísticamente significativa y presenta un efecto negativo. El deterioro del mercado laboral también puede reducir la capacidad de las cooperativas para colocar recursos de manera eficiente.

En las otras instituciones, la TBP y el ICC dejan de ser significativos después de aplicar la corrección. El IPC aparece con un efecto negativo, mientras que el IMAE presenta un efecto positivo.

  • La inflación perjudica la eficiencia de intermediación.
  • Una mayor actividad económica puede mejorar moderadamente la relación entre activos productivos y pasivos con costo.

Indicador: Cartera al día y con atraso hasta 90 días / Cartera Total

Tabla 8. Datos originales con ajuste Driscoll-Kraay

VariableCooperativasOtras instituciones
TBP−2.268794−0.845942
IPC0.2235930.142432
TDESPN/A−0.944492

Fuente: elaboración propia. Modelo de Efectos Aleatorios.

Las variables significativas y sus coeficientes se mantienen respecto al modelo original. Esta estabilidad fortalece la conclusión de que la calidad de la cartera está estructuralmente relacionada con la política de tasas de interés, la inflación y las condiciones del mercado laboral.

Las cooperativas continúan mostrando una sensibilidad más alta frente a los aumentos en la TBP, mientras que la tasa de desempleo es especialmente relevante para las otras instituciones.

Este indicador presenta los resultados más estables después de aplicar los errores robustos.

Nota: en los anexos 17 y 18 del trabajo se pueden observar las salidas de los modelos con ajuste Driscoll-Kraay y Arellano para este indicador.

Indicador: Rentabilidad Nominal / Patrimonio Promedio

Tabla 9. Datos originales con ajuste Driscoll-Kraay

VariableCooperativasOtras instituciones
TBP0.42391−0.7807548
IPC−0.151782N/A
TDESP0.063372N/A
IMAEN/A−0.059395

Fuente: elaboración propia. Modelo de Efectos Aleatorios.

En las cooperativas se mantienen las relaciones principales: la TBP tiene un efecto positivo sobre la rentabilidad y el IPC tiene un efecto negativo.

Además, la tasa de desempleo se incorpora como una variable estadísticamente significativa. Según la interpretación presentada en el estudio, este resultado refleja la importancia de las condiciones del mercado laboral para la rentabilidad y las pérdidas crediticias de las cooperativas.

En las otras instituciones se mantienen el efecto negativo de la TBP y el efecto negativo del IMAE.

La estabilidad de los signos después de aplicar Driscoll-Kraay indica que estas relaciones son estructurales y no dependen únicamente de problemas en la estimación de los errores estándar.

10

Referencia y autoría del proyecto

El presente análisis forma parte del Trabajo Final de Investigación Aplicada titulado Evaluación de la solidez financiera de los clientes de la cartera institucional del BANHVI dentro del sistema financiero costarricense y sensibilización de la cartera ante escenarios macroeconómicos adversos, desarrollado para optar por el grado y título de Maestría Profesional en Riesgo y Finanzas de la Universidad de Costa Rica.

El Trabajo Final de Graduación fue elaborado por:

  • Henry Fabian Alvarado Vargas.
  • José Andrés Castillo Azofeifa.
  • Mario Alejandro Paniagua Barrantes.

Universidad de Costa Rica

Sistema de Estudios de Posgrado

Programa de Posgrado en Economía

Ciudad Universitaria Rodrigo Facio, Costa Rica

2026

Descripción del proyecto

La investigación tuvo como objetivo evaluar la solidez financiera de las instituciones que conforman la cartera institucional del Banco Hipotecario de la Vivienda, BANHVI, así como analizar la sensibilidad de sus principales indicadores financieros ante cambios y escenarios macroeconómicos adversos.

Alvarado Vargas, H. F., Castillo Azofeifa, J. A., & Paniagua Barrantes, M. A. (2026). Evaluación de la solidez financiera de los clientes de la cartera institucional del BANHVI dentro del sistema financiero costarricense y sensibilización de la cartera ante escenarios macroeconómicos adversos [Trabajo final de investigación aplicada de maestría, Universidad de Costa Rica].
11

Código fuente

Este apartado queda preparado para incorporar posteriormente el script completo utilizado en el análisis.

panel_banhvi.R
#Paquetes ==================
  install.packages(c("readxl", "dplyr", "plm", "lmtest", "sandwich", "tidyr", "stringr"), dependencies = TRUE)

  library(readxl)
  library(dplyr)
  library(tidyr)
  library(plm)
  library(lmtest)
  library(sandwich)
  library(stringr)

  # ================== Datos ==================
  ruta_archivo <- file.choose()
  df       <- read_excel(path = ruta_archivo, sheet = "Data")
  df_macro <- read_excel(path = ruta_archivo, sheet = "Data2")

  # ================== Limpieza de data ==================
  # 1) Normalizar nombres posibles de columnas macro (TPC, TBP, IPC, IMAE)
  normaliza_nombres <- function(tbl) {
    nm <- names(tbl)
    
    ren <- c(
      TPC   = intersect(nm, c("TPC","TPCoriginal","TPC_original","tpc")),
      TBP   = intersect(nm, c("TBP","TBPoriginal","TBP_original","tbp")),
      IPC   = intersect(nm, c("IPC","IPCoriginal","IPC_original","ipc")),
      IMAE  = intersect(nm, c("IMAE","IMAEoriginal","IMAE_original","imae")))
    
    for (k in names(ren)) {
      if (length(ren[[k]]) >= 1 && !(k %in% nm)) {
        tbl <- dplyr::rename(tbl, !!k := all_of(ren[[k]][1]))}} tbl}

  df_macro <- normaliza_nombres(df_macro)

  # 2) Fecha y llave mensual
  if (!inherits(df$Periodo, "Date"))    df$Periodo    <- as.Date(df$Periodo)
  if (!inherits(df_macro$Periodo, "Date")) df_macro$Periodo <- as.Date(df_macro$Periodo)

  df       <- df %>% mutate(Periodo_Mes = format(Periodo, "%Y-%m"))
  df_macro <- df_macro %>% mutate(Periodo_Mes = format(Periodo, "%Y-%m"))

  # 3) Revision de duplicados por mes, colapsamos por último valor no-NA
  macro_vars <- intersect(names(df_macro), c("TPC","TBP","IPC","IMAE"))
  df_macro_col <- df_macro %>%
    arrange(Periodo) %>%
    group_by(Periodo_Mes) %>%
    summarise(across(all_of(macro_vars), ~ dplyr::last(na.omit(.))), .groups = "drop")

  # 4) Convertir datos en numérico (por si vinieron como texto con símbolos)
  to_num <- function(x) {
    x <- as.character(x)
    x <- gsub("[^0-9,.-]", "", x)   # eliminar símbolos
    x <- gsub(",", ".", x)          # coma -> punto
    suppressWarnings(as.numeric(x))
  }
  df_macro_col <- df_macro_col %>%
    mutate(across(all_of(macro_vars), to_num))

  # Unir bases 
  df <- df %>%
    left_join(df_macro_col, by = "Periodo_Mes")

  # Etiquetar entidades por grupos
  df <- df %>%
    mutate(GRUPO = case_when(
      Entidad %in% c("COOCIQUE","COOPEALIANZA","COOPEANDE","COOPEMEP","COOPENAE","COOPECAJA") ~ "COOPERATIVAS",
      Entidad %in% c("BAC SAN JOSE","CATHAY","GRUPO MUTUAL","MUCAP","SCOTIABANK","POPULAR") ~ "OTROS",
      TRUE ~ NA_character_
    )) %>%
    filter(!is.na(GRUPO))

  # Renombramiento de indicadores financieros
  df_wide <- df %>%
    select(Entidad, Periodo, Indicador, Valor, all_of(macro_vars), GRUPO) %>%
    mutate(Indicador = case_when(
      Indicador == "Activo Productivo / Activo total" ~ "I1",
      Indicador == "Activo Productivo de Intermediación Financiera / Activo Productivo" ~ "I2",
      Indicador == "Activo Productivo de Intermediación Financiera/ Pasivo con Costo  1" ~ "I3",
      Indicador == "Captaciones a plazo con el público / Pasivo con costo" ~ "I4",
      Indicador == "Cartera al día y con atraso de hasta 90 días (excepto cobro judicial) / Activo Productivo" ~ "I5",
      Indicador == "Cartera al día y con atraso hasta 90 días/Cartera total" ~ "I6",
      Indicador == "Compromiso patrimonial" ~ "I7",
      Indicador == "Estimaciones sobre cartera de créditos / Cartera con atraso mayor a 90 días y cobro judicial" ~ "I8",
      Indicador == "Inversiones en títulos valores / Activo Productivo de Intermediación Financiera" ~ "I9",
      Indicador == "Morosidad mayor a 90 días y cobro judicial / Cartera Directa" ~ "I10",
      Indicador == "Obligaciones con entidades financieras del exterior / Pasivo con costo" ~ "I11",
      Indicador == "Obligaciones con entidades financieras del país / Pasivo con costo" ~ "I12",
      Indicador == "Pasivo con costo / Pasivo Total" ~ "I13",
      Indicador == "Rentabilidad nominal sobre Patrimonio Promedio" ~ "I14",
      Indicador == "Utilidad Operacional Bruta / Gastos de Administración  1" ~ "I15",
      TRUE ~ Indicador
    )) %>%
    pivot_wider(names_from = Indicador, values_from = Valor)


  # Paneles por grupo 
  # Asegurar clase Date
  if (!inherits(df_wide$Periodo, "Date")) df_wide$Periodo <- as.Date(df_wide$Periodo)

  # Quitar posibles duplicados, por Entidad y periodo
  df_wide <- df_wide %>% distinct(Entidad, Periodo, .keep_all = TRUE)

  df_coop  <- df_wide %>% filter(GRUPO == "COOPERATIVAS") %>% as.data.frame()
  df_otros <- df_wide %>% filter(GRUPO == "OTROS")         %>% as.data.frame()

  panel_coop  <- pdata.frame(df_coop,  index = c("Entidad","Periodo"))
  panel_otros <- pdata.frame(df_otros, index = c("Entidad","Periodo"))

  # Modelos (RE) con IMAE 
  cat("========= MODELOS PARA COOPERATIVAS (EFECTOS ALEATORIOS) =========\n")
  modelo_coop_I6  <- plm(I6  ~ TPC + TBP + IPC + IMAE, data = panel_coop,  model = "random", na.action = na.omit)
  modelo_coop_I14 <- plm(I14 ~ TPC + TBP + IPC + IMAE, data = panel_coop,  model = "random", na.action = na.omit)

  cat("\n========= MODELOS PARA OTROS (EFECTOS ALEATORIOS) =========\n")
  modelo_otros_I6  <- plm(I6  ~ TPC + TBP + IPC + IMAE, data = panel_otros, model = "random", na.action = na.omit)
  modelo_otros_I14 <- plm(I14 ~ TPC + TBP + IPC + IMAE, data = panel_otros, model = "random", na.action = na.omit)

  # Resúmen por indicadores
  cat("\n\n=========== RESÚMENES COMPLETOS DE LOS MODELOS ==========\n")

  modelos_coop  <- list(I6 = modelo_coop_I6,  I14 = modelo_coop_I14)
  modelos_otros <- list(I6 = modelo_otros_I6, I14 = modelo_otros_I14)

  cat("\n--- MODELOS COOPERATIVAS ---\n")
  for (nombre in names(modelos_coop)) {
    cat(paste0("\n\n>>> Modelo COOP: ", nombre, "\n"))
    print(summary(modelos_coop[[nombre]]))}

  cat("\n--- MODELOS OTROS ---\n")
  for (nombre in names(modelos_otros)) {
    cat(paste0("\n\n>>> Modelo OTROS: ", nombre, "\n"))
    print(summary(modelos_otros[[nombre]]))}



  ##============================================================================================
  # EFECTOS FIJOS - WITHIN
  library(plm)
  library(lmtest)
  library(sandwich)
  library(dplyr)

  # Reconstruir paneles desde df_wide 
  if (!inherits(df_wide$Periodo, "Date")) df_wide$Periodo <- as.Date(df_wide$Periodo)

  df_coop  <- df_wide %>%
    filter(GRUPO == "COOPERATIVAS") %>%
    distinct(Entidad, Periodo, .keep_all = TRUE) %>%
    as.data.frame()

  df_otros <- df_wide %>%
    filter(GRUPO == "OTROS") %>%
    distinct(Entidad, Periodo, .keep_all = TRUE) %>%
    as.data.frame()

  panel_coop  <- pdata.frame(df_coop,  index = c("Entidad", "Periodo"))
  panel_otros <- pdata.frame(df_otros, index = c("Entidad", "Periodo"))

  cat("========= EFECTOS FIJOS (INDIVIDUAL) - COOPERATIVAS =========\n")
  fe_coop_I6  <- plm(I6  ~ TPC + TBP + IPC + IMAE, data = panel_coop,
                    model = "within", effect = "individual", na.action = na.omit)
  fe_coop_I14 <- plm(I14 ~ TPC + TBP + IPC + IMAE, data = panel_coop,
                    model = "within", effect = "individual", na.action = na.omit)

  cat("\n========= EFECTOS FIJOS (INDIVIDUAL) - OTROS =========\n")
  fe_otros_I6  <- plm(I6  ~ TPC + TBP + IPC + IMAE, data = panel_otros,
                      model = "within", effect = "individual", na.action = na.omit)
  fe_otros_I14 <- plm(I14 ~ TPC + TBP + IPC + IMAE, data = panel_otros,
                      model = "within", effect = "individual", na.action = na.omit)

  # Resultados con errores estándar robustos (cluster por entidad)
  cat("\n--- Resultados COOPERATIVAS (robustos) ---\n")
  print(coeftest(fe_coop_I6,  vcov. = vcovHC(fe_coop_I6,  type = "HC1", cluster = "group")))
  print(coeftest(fe_coop_I14, vcov. = vcovHC(fe_coop_I14, type = "HC1", cluster = "group")))

  cat("\n--- Resultados OTROS (robustos) ---\n")
  print(coeftest(fe_otros_I6,  vcov. = vcovHC(fe_otros_I6,  type = "HC1", cluster = "group")))
  print(coeftest(fe_otros_I14, vcov. = vcovHC(fe_otros_I14, type = "HC1", cluster = "group")))






  #######======================================================================================================
  # HAUSMAN: FE vs RE Nota: esto es para evaluar que modelo Efectos fijos o aleatorios representa mejor el modelo
  library(plm)

  dictamen_haus <- function(test) {
    if (is.null(test$p.value) || is.na(test$p.value)) return("p-valor no disponible")
    if (test$p.value < 0.05) "Prefiere FE (RE inconsistente)" else "Prefiere RE (exogeneidad plausible)"}


  #H₀ (nula): RE es consistente (los efectos no observados de cada entidad no están correlacionados con los regresores). Si H₀ es cierta, RE es además más eficiente que FE.
  #H₁ (alternativa): uno de los modelos es inconsistente (típicamente, RE), por correlación entre efectos no observados y regresores → preferir FE.
  cat("\n================ HAUSMAN FE vs RE (phtest) ================\n")

  cat("\n--- COOPERATIVAS: I6 ---\n")
  haus_coop_I6 <- phtest(fe_coop_I6,  modelo_coop_I6)
  print(haus_coop_I6);  cat("Dictamen: ", dictamen_haus(haus_coop_I6),  "\n")

  cat("\n--- COOPERATIVAS: I14 ---\n")
  haus_coop_I14 <- phtest(fe_coop_I14, modelo_coop_I14)
  print(haus_coop_I14); cat("Dictamen: ", dictamen_haus(haus_coop_I14), "\n")

  cat("\n--- OTROS: I6 ---\n")
  haus_otros_I6 <- phtest(fe_otros_I6,  modelo_otros_I6)
  print(haus_otros_I6);  cat("Dictamen: ", dictamen_haus(haus_otros_I6),  "\n")

  cat("\n--- OTROS: I14 ---\n")
  haus_otros_I14 <- phtest(fe_otros_I14, modelo_otros_I14)
  print(haus_otros_I14); cat("Dictamen: ", dictamen_haus(haus_otros_I14), "\n")


  ###############==============================================================================================
  #REVISION ROBUSTA PARAVER SIGNIFICANCIA DE PANEL 
  # Hay o no efecto panel? (RE vs pooled)
  plmtest(modelo_coop_I6,  type="honda") 
  plmtest(modelo_coop_I14, type="honda")
  plmtest(modelo_otros_I6, type="honda")
  plmtest(modelo_otros_I14,type="honda")
  #Nota: explicacion Es un test LM (Honda) para saber si hay efectos de panel (individuales y/o de tiempo) o no.
  #H0: no hay efectos pooled OLS basta.
  #Si p < 0.05: hay efectos usa modelo de panel (RE o FE).

  #REVISION PARA VER SIGNIFICANCIA DE PANEL 

  pool_coop_I6  <- plm(I6  ~ TPC + TBP + IPC + IMAE, data=panel_coop,  model="pooling")
  pFtest(fe_coop_I6, pool_coop_I6)
  # Nota (pFtest FE vs pooled):
  # H0: sin efectos por entidad (pooled suficiente).
  # Resultado: F = 15.07 (df1 = 5, df2 = 572), p = 6.446e-14  -> Rechazo H0.
  # Conclusión: sí hay heterogeneidad entre entidades; pooled OLS no procede.
  #Si el resultado de esta prueba el Hausman es de p = 1, se usa RE.



  #====================================================================================================
  #Errores robustos
  library(lmtest); library(sandwich)
  coeftest(modelo_coop_I6,  vcov=function(x) vcovHC(x, method="arellano", type="HC1", cluster="group"))


  ##============================================================================================
  #Modelos con rezagos 
  library(plm)
  library(lmtest); library(sandwich)

  # Función corta para mostrar R²
  print_r2 <- function(modelo, etiqueta) {
    s <- summary(modelo)
    cat("\nR-cuadrado —", etiqueta, "\n")
    if (is.null(s$r.squared)) {
      cat("No disponible para este modelo.\n")
    } else {
      print(round(s$r.squared, 4))  # within / between / overall
    }
  }

  #=============================================================================================================================
  # COOPERATIVAS (RE) 
  # I6 con solo lag 2 en cada explicativa
  modelo_coop_I6_lag2 <- plm(
    I6 ~ plm::lag(TPC, 4) + plm::lag(TBP, 6) + plm::lag(IPC, 9) + plm::lag(IMAE, 6),
    data = panel_coop, model = "random", na.action = na.omit
  )
  print_r2(modelo_coop_I6_lag2, "COOP | I6 | lag2")
  coeftest(modelo_coop_I6_lag2, vcov = function(x) vcovHC(x, method="arellano", type="HC1", cluster="group"))

  # I14 con solo lag 2 en cada explicativa
  modelo_coop_I14_lag2 <- plm(
    I14 ~ plm::lag(TPC, 4) + plm::lag(TBP, 6) + plm::lag(IPC, 9) + plm::lag(IMAE, 6),
    data = panel_coop, model = "random", na.action = na.omit
  )
  print_r2(modelo_coop_I14_lag2, "COOP | I14 | lag2")
  coeftest(modelo_coop_I14_lag2, vcov = function(x) vcovHC(x, method="arellano", type="HC1", cluster="group"))



  #=============================================================================================================================
  #  OTROS (RE)
  # I6 con solo lag 2 en cada explicativa
  modelo_otros_I6_lag2 <- plm(
    I6 ~ plm::lag(TPC, 2) + plm::lag(TBP, 2) + plm::lag(IPC, 2) + plm::lag(IMAE, 2),
    data = panel_otros, model = "random", na.action = na.omit
  )
  print_r2(modelo_otros_I6_lag2, "OTROS | I6 | lag2")
  coeftest(modelo_otros_I6_lag2, vcov = function(x) vcovHC(x, method="arellano", type="HC1", cluster="group"))

  # I14 con solo lag 2 en cada explicativa
  modelo_otros_I14_lag2 <- plm(
    I14 ~ plm::lag(TPC, 2) + plm::lag(TBP, 2) + plm::lag(IPC, 2) + plm::lag(IMAE, 2),
    data = panel_otros, model = "random", na.action = na.omit
  )
  print_r2(modelo_otros_I14_lag2, "OTROS | I14 | lag2")
  coeftest(modelo_otros_I14_lag2, vcov = function(x) vcovHC(x, method="arellano", type="HC1", cluster="group"))




  ##============================================================================================
  # PRUEBAS DE LOS MODELOS

  #####Heterocedasticidad (Prueba de Breusch-Pagan modificada)
  bptest(modelo_coop_I6)
  bptest(modelo_otros_I6)
  #Autocorrelación serial (Prueba de Wooldridge)
  pwartest(modelo_coop_I6)   # Wooldridge test
  pwartest(modelo_otros_I6)
  # Errores robustos estándar
  coeftest(modelo_otros_I6, vcov = vcovHC(modelo_otros_I6, type = "HC1"))
  # Errores Driscoll-Kraay (si hay autocorrelación en panel)
  coeftest(modelo_otros_I6, vcov = vcovSCC(modelo_otros_I6))
  #Multicolinealidad (VIF
  # Modelo MCO para grupo "cooperativas" y cálculo de VIF
  ols_model_coop <- lm(I6 ~ TPC + TBP + IPC, data = filter(panel_data, GRUPO == "COOPERATIVAS"))
  vif(ols_model_coop)
  # Modelo MCO para grupo "OTROS bancos " y cálculo de VIF
  ols_model_otros <- lm(I6 ~ TPC + TBP + IPC, data = filter(panel_data, GRUPO == "OTROS"))
  vif(ols_model_otros)
Desplácese dentro del recuadro para consultar el script completo.