El filtro de Hodrick-Prescott (HP) es un método usado en macroeconomía para separar una serie temporal en dos partes:

Tendencia (movimiento de largo plazo)

Ciclo (fluctuaciones alrededor de la tendencia)

Carga de Datos

library(readxl)
library(dplyr)

PIB_CA <- read_excel("D:/MAE118/Portafolio de actividades/datos_PIB_trim_CA.xlsx",
                     skip = 5)


colnames(PIB_CA) <- c("Fecha", "Costa_Rica", "El_Salvador", "Guatemala",
                      "Honduras", "Nicaragua", "Republica_Dominicana", "Panama")

PIB_CA <- PIB_CA %>% mutate(across(-Fecha, as.character))
PIB_CA <- PIB_CA %>% mutate(across(-Fecha, ~na_if(.x, "--")))
PIB_CA <- PIB_CA %>% mutate(across(-Fecha, as.numeric))
PIB_CA <- PIB_CA %>% filter(!is.na(Fecha))

Costa Rica

Implementación Personalizada

Periodo: 1990-I – 2024-II

library(dplyr)
library(mFilter)

pais <- "Costa_Rica"

data_pais <- PIB_CA %>% filter(!is.na(.data[[pais]]))

# Crear serie trimestral 
trimestres <- c("I"=1, "II"=2, "III"=3, "IV"=4)
primer <- strsplit(data_pais$Fecha[1], "-")[[1]]

PIB_ts <- ts(
  data_pais[[pais]],
  start = c(as.numeric(primer[1]), trimestres[toupper(primer[2])]),
  frequency = 4
)

# Filtro HP
hp_result <- hpfilter(PIB_ts, freq = 1600)
trend <- hp_result$trend
cycle <- hp_result$cycle

# Gráfico
periodo <- paste(data_pais$Fecha[1], "-", data_pais$Fecha[nrow(data_pais)])

plot(PIB_ts, type = "l",
     main = paste("Filtro HP -", gsub("_"," ", pais), "\nPeriodo:", periodo),
     ylab = "PIB", xlab = "Tiempo")

lines(hp_result$trend, col = "red", lwd = 2)

legend("topleft",
       legend = c("PIB Original", "Tendencia (HP)"),
       col = c("black", "red"), lty = 1, lwd = 2)

plot(cycle, type = "l", main = "Componente Ciclico", ylab = "Ciclo", xlab = "Tiempo")

Implementación más rápida

plot(hp_result,ask = FALSE)

El Salvador

Implementación Personalizada

Periodo: 1990-I – 2024-II

library(dplyr)
library(mFilter)

pais <- "El_Salvador"

data_pais <- PIB_CA %>% filter(!is.na(.data[[pais]]))

# Crear serie trimestral 
trimestres <- c("I"=1, "II"=2, "III"=3, "IV"=4)
primer <- strsplit(data_pais$Fecha[1], "-")[[1]]

PIB_ts <- ts(
  data_pais[[pais]],
  start = c(as.numeric(primer[1]), trimestres[toupper(primer[2])]),
  frequency = 4
)

# Filtro HP
hp_result <- hpfilter(PIB_ts, freq = 1600)
trend <- hp_result$trend
cycle <- hp_result$cycle

# Gráfico
periodo <- paste(data_pais$Fecha[1], "-", data_pais$Fecha[nrow(data_pais)])

plot(PIB_ts, type = "l",
     main = paste("Filtro HP -", gsub("_"," ", pais), "\nPeriodo:", periodo),
     ylab = "PIB", xlab = "Tiempo")

lines(hp_result$trend, col = "red", lwd = 2)

legend("topleft",
       legend = c("PIB Original", "Tendencia (HP)"),
       col = c("black", "red"), lty = 1, lwd = 2)

plot(cycle, type = "l", main = "Componente Ciclico", ylab = "Ciclo", xlab = "Tiempo")

Implementación más rápida

plot(hp_result,ask = FALSE)

Guatemala

Implementación Personalizada

Periodo: 1990-I – 2024-II

library(dplyr)
library(mFilter)

pais <- "Guatemala"

data_pais <- PIB_CA %>% filter(!is.na(.data[[pais]]))

# Crear serie trimestral 
trimestres <- c("I"=1, "II"=2, "III"=3, "IV"=4)
primer <- strsplit(data_pais$Fecha[1], "-")[[1]]

PIB_ts <- ts(
  data_pais[[pais]],
  start = c(as.numeric(primer[1]), trimestres[toupper(primer[2])]),
  frequency = 4
)

# Filtro HP
hp_result <- hpfilter(PIB_ts, freq = 1600)
trend <- hp_result$trend
cycle <- hp_result$cycle

# Gráfico
periodo <- paste(data_pais$Fecha[1], "-", data_pais$Fecha[nrow(data_pais)])

plot(PIB_ts, type = "l",
     main = paste("Filtro HP -", gsub("_"," ", pais), "\nPeriodo:", periodo),
     ylab = "PIB", xlab = "Tiempo")

lines(hp_result$trend, col = "red", lwd = 2)

legend("topleft",
       legend = c("PIB Original", "Tendencia (HP)"),
       col = c("black", "red"), lty = 1, lwd = 2)

plot(cycle, type = "l", main = "Componente Ciclico", ylab = "Ciclo", xlab = "Tiempo")

Implementación más rápida

plot(hp_result, ask = FALSE)

Honduras

Implementación Personalizada

Periodo: 1990-I – 2024-II

library(dplyr)
library(mFilter)

pais <- "Honduras"

data_pais <- PIB_CA %>% filter(!is.na(.data[[pais]]))

# Crear serie trimestral 
trimestres <- c("I"=1, "II"=2, "III"=3, "IV"=4)
primer <- strsplit(data_pais$Fecha[1], "-")[[1]]

PIB_ts <- ts(
  data_pais[[pais]],
  start = c(as.numeric(primer[1]), trimestres[toupper(primer[2])]),
  frequency = 4
)

# Filtro HP
hp_result <- hpfilter(PIB_ts, freq = 1600)
trend <- hp_result$trend
cycle <- hp_result$cycle

# Gráfico
periodo <- paste(data_pais$Fecha[1], "-", data_pais$Fecha[nrow(data_pais)])

plot(PIB_ts, type = "l",
     main = paste("Filtro HP -", gsub("_"," ", pais), "\nPeriodo:", periodo),
     ylab = "PIB", xlab = "Tiempo")

lines(hp_result$trend, col = "red", lwd = 2)

legend("topleft",
       legend = c("PIB Original", "Tendencia (HP)"),
       col = c("black", "red"), lty = 1, lwd = 2)

plot(cycle, type = "l", main = "Componente Ciclico", ylab = "Ciclo", xlab = "Tiempo")

Implementación más rápida

plot(hp_result, ask = FALSE)

Nicaragua

Implementación Personalizada

Periodo: 1990-I – 2024-II

library(dplyr)
library(mFilter)

pais <- "Nicaragua"

data_pais <- PIB_CA %>% filter(!is.na(.data[[pais]]))

# Crear serie trimestral 
trimestres <- c("I"=1, "II"=2, "III"=3, "IV"=4)
primer <- strsplit(data_pais$Fecha[1], "-")[[1]]

PIB_ts <- ts(
  data_pais[[pais]],
  start = c(as.numeric(primer[1]), trimestres[toupper(primer[2])]),
  frequency = 4
)

# Filtro HP
hp_result <- hpfilter(PIB_ts, freq = 1600)
trend <- hp_result$trend
cycle <- hp_result$cycle

# Gráfico
periodo <- paste(data_pais$Fecha[1], "-", data_pais$Fecha[nrow(data_pais)])

plot(PIB_ts, type = "l",
     main = paste("Filtro HP -", gsub("_"," ", pais), "\nPeriodo:", periodo),
     ylab = "PIB", xlab = "Tiempo")

lines(hp_result$trend, col = "red", lwd = 2)

legend("topleft",
       legend = c("PIB Original", "Tendencia (HP)"),
       col = c("black", "red"), lty = 1, lwd = 2)

plot(cycle, type = "l", main = "Componente Ciclico", ylab = "Ciclo", xlab = "Tiempo")

Implementación más rápida

plot(hp_result, ask = FALSE)

República Dominicana

Implementación Personalizada

Periodo: 1990-I – 2024-II

library(dplyr)
library(mFilter)

pais <- "Republica_Dominicana"

data_pais <- PIB_CA %>% filter(!is.na(.data[[pais]]))

# Crear serie trimestral 
trimestres <- c("I"=1, "II"=2, "III"=3, "IV"=4)
primer <- strsplit(data_pais$Fecha[1], "-")[[1]]

PIB_ts <- ts(
  data_pais[[pais]],
  start = c(as.numeric(primer[1]), trimestres[toupper(primer[2])]),
  frequency = 4
)

# Filtro HP
hp_result <- hpfilter(PIB_ts, freq = 1600)
trend <- hp_result$trend
cycle <- hp_result$cycle

# Gráfico
periodo <- paste(data_pais$Fecha[1], "-", data_pais$Fecha[nrow(data_pais)])

plot(PIB_ts, type = "l",
     main = paste("Filtro HP -", gsub("_"," ", pais), "\nPeriodo:", periodo),
     ylab = "PIB", xlab = "Tiempo")

lines(hp_result$trend, col = "red", lwd = 2)

legend("topleft",
       legend = c("PIB Original", "Tendencia (HP)"),
       col = c("black", "red"), lty = 1, lwd = 2)

plot(cycle, type = "l", main = "Componente Ciclico", ylab = "Ciclo", xlab = "Tiempo")

Implementación más rápida

plot(hp_result, ask = FALSE)

Panamá

Implementación Personalizada

Periodo: 1990-I – 2024-II

library(dplyr)
library(mFilter)

pais <- "Panama"

data_pais <- PIB_CA %>% filter(!is.na(.data[[pais]]))

# Crear serie trimestral 
trimestres <- c("I"=1, "II"=2, "III"=3, "IV"=4)
primer <- strsplit(data_pais$Fecha[1], "-")[[1]]

PIB_ts <- ts(
  data_pais[[pais]],
  start = c(as.numeric(primer[1]), trimestres[toupper(primer[2])]),
  frequency = 4
)

# Filtro HP
hp_result <- hpfilter(PIB_ts, freq = 1600)
trend <- hp_result$trend
cycle <- hp_result$cycle

# Gráfico
periodo <- paste(data_pais$Fecha[1], "-", data_pais$Fecha[nrow(data_pais)])

plot(PIB_ts, type = "l",
     main = paste("Filtro HP -", gsub("_"," ", pais), "\nPeriodo:", periodo),
     ylab = "PIB", xlab = "Tiempo")

lines(hp_result$trend, col = "red", lwd = 2)

legend("topleft",
       legend = c("PIB Original", "Tendencia (HP)"),
       col = c("black", "red"), lty = 1, lwd = 2)

plot(cycle, type = "l", main = "Componente Ciclico", ylab = "Ciclo", xlab = "Tiempo")

Implementación más rápida

plot(hp_result, ask = FALSE)