Paso1: Preparación del espacio de trabajo
rm(list = ls())
graphics.off()

options(encoding = "UTF-8")
Sys.setlocale("LC_ALL", "en_US.UTF-8")
## [1] "LC_COLLATE=en_US.UTF-8;LC_CTYPE=en_US.UTF-8;LC_MONETARY=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=en_US.UTF-8"
setwd("C:/Users/Hp/OneDrive/Escritorio/Macroeconometría aplicada en R/Sesión 1 - Introducción/Modulo 1 - Macroeconometría Aplicada - Tarea 1")

install.packages("stats")
## Warning: package 'stats' is in use and will not be installed
library(haven)
## Warning: package 'haven' was built under R version 4.4.2
library (readxl)
## Warning: package 'readxl' was built under R version 4.4.1
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.1
library(tibble)
## Warning: package 'tibble' was built under R version 4.4.3
library(tsibble)
## Warning: package 'tsibble' was built under R version 4.4.3
## Registered S3 method overwritten by 'tsibble':
##   method               from 
##   as_tibble.grouped_df dplyr
## 
## Adjuntando el paquete: 'tsibble'
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, union
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.4.2
## Warning: package 'lubridate' was built under R version 4.4.1
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter()       masks stats::filter()
## ✖ lubridate::interval() masks tsibble::interval()
## ✖ dplyr::lag()          masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(stats)
Paso2: Cargar la base de datos y limpiar
#2.1 Importar la base de datos
imae_nic <- read_xlsx("IMAE Nicaragua.xlsx")

#2.2 Pasar los meses a numerico
#2.2.1 Hacer una lista de meses 

#Nota: Esto se hace porque la base de datos del BCN solo provee los meses en string
Meses_es <- c("Ene", "Feb", "Mar", "Abr", "May", "Jun",
              "Jul", "Ago", "Sep", "Oct", "Nov", "Dic")

#2.2.2 Hacer match con función make_date de lubridate (tidyverse)
imae_nic <- imae_nic %>%
  mutate(
    Mes_num = match(Mes, Meses_es),
    Date = lubridate::make_date(year = Año, month = Mes_num, day = 1)
  )

#2.3 Crear los trimestres
imae_nic <- imae_nic %>%
  mutate(
    Trimestre = paste0("T", quarter(Date), "-", year(Date))
  )

imae_nic <- imae_nic %>%
  mutate(
    Trimestre_v2 = paste0("T", quarter(Date))
  )

#2.4 Pasar trimestre a numerico (creo que esto se podia hacer desde antes)
imae_nic <- imae_nic %>%
  mutate(Trimestre_num = as.integer(str_remove(Trimestre_v2, "T")))
Paso3: Visualizar serie original - IMAE en niveles y comparado - área gris
## Solo IMAE - Agricultura
## Forma 1: Con área gris
ggplot(imae_nic, aes(x = Date, y = imae_nic$Agricultura)) +
  geom_area(fill = "#023743FF", alpha = 0.2) +
  geom_line()+
  geom_point(size=1.5, color="#72874EFF")+
  labs (title= "Serie original de IMAE-Agricultura de 2006 a 2025",
        y ="IMAE precios constantes 2006",
        x = "Año")+
  theme_classic()
## Warning: Use of `imae_nic$Agricultura` is discouraged.
## ℹ Use `Agricultura` instead.
## Use of `imae_nic$Agricultura` is discouraged.
## ℹ Use `Agricultura` instead.
## Use of `imae_nic$Agricultura` is discouraged.
## ℹ Use `Agricultura` instead.

## Todos los IMAES

imae_largo <- imae_nic %>%
  pivot_longer(
    cols = c(`IMAE Agregado`, Agricultura, Construcción, Comercio, 
             `Hoteles y restaurantes`, `Intermediación financiera`, Mineria),
    names_to = "Actividad",
    values_to = "Valor"
  )


crisis_df <- tibble(
  inicio = as.Date(c("2008-01-01", "2009-01-01", "2018-04-01", "2020-03-01")),
  fin    = as.Date(c("2008-12-31", "2009-12-31", "2018-12-31", "2020-12-31")),
  evento = c("Crisis financiera", "Crisis de no pago", "Crisis sociopolítica", "COVID-19")
) %>%
  mutate(
    x = inicio + (fin - inicio) / 2,
    y = Inf
  )


## gráfico con etiquetas de crisis"
# 2. Gráfico
ggplot(imae_largo, aes(x = Date, y = Valor)) +
  geom_rect(data = crisis_df,
            aes(xmin = inicio, xmax = fin, ymin = -Inf, ymax = Inf, fill = evento),
            inherit.aes = FALSE,
            alpha = 0.5) +  
  #geom_area(fill = "#023743FF", alpha = 0.2) +
  geom_line(color="#72874EFF") +
  #geom_point(size = 1, color = "black") +
  facet_wrap(~ Actividad, scales = "free_y", ncol = 2) +
  scale_fill_manual(
    values = c(
      "Crisis financiera" = "#476F84FF",
      "Crisis de no pago" = "#72874EFF",
      "Crisis sociopolítica" = "#2471A3",
      "COVID-19" = "#FED789FF"
    ) 
  ) +
  guides(fill = guide_legend(title = "Eventos históricos")) +
  labs(
    title = "Serie original del IMAE por actividad (2006–2025)",
    x = "Año",
    y = "IMAE precios constantes 2006",
    caption = "Fuente: Estadísticas del Banco Central de Nicaragua"
  ) +
  theme_classic() +
  theme(legend.position = "bottom")

ggsave("Serie mensual de IMAE por actividad precios constantes 2006.pdf")
## Saving 7 x 5 in image
Paso3: Visualizar serie original - IMAE en niveles y comparado - graph 2
## Forma 2: Gráfica por meses para ver mas claramente las caidas en trimestres (componente estacional)
ggplot(imae_nic, aes(x = Mes_num, y = Agricultura, group = Año, color = Año)) +
  geom_line(size = 0.5) +
  geom_point(color="black")+
  scale_x_continuous(breaks = 1:12, labels = Meses_es) +
  scale_color_gradient(low = "#023743FF", high = "#72874EFF") +  # azul oscuro a rojo suave
  labs(
    title = "Serie mensual de IMAE-Agricultura por año (2006–2025)",
    x = "Mes",
    y = "IMAE precios constantes 2006",
    color = "Año"
  ) +
  theme_classic()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

##Notas y observaciones: Hay un claro patron de caidas y 
##subidas en la actividad mensual agricola conforme con su estacionalidad

ggplot(imae_largo, aes(x = Mes_num, y = Valor, group = Año, color = Año)) +
  geom_line(size = 0.5) +
  geom_point(color = "black", size = 1) +
  scale_x_continuous(breaks = 1:12, labels = Meses_es) +
  scale_color_gradient(low = "#023743FF", high = "#72874EFF") +
  facet_wrap(~ Actividad, scales = "free_y", ncol = 2) +
  labs(
    title = "Evolución mensual del IMAE por actividad (2006–2025)",
    x = "Mes",
    y = "IMAE precios constantes 2006",
    color = "Año",
    caption ="Fuente: Estadísticas del Banco Central de Nicaragua"
  ) +
  theme_classic()

Paso3: Visualizar serie original - IMAE en niveles y comparado - graph 3
## Forma 3: Usando facet_wrap para dividir por año
ggplot(imae_nic, aes(x = Año, y = Construcción)) +
  geom_area(fill = "#023743FF", alpha = 0.2) +
  geom_line()+
  geom_point(size=1.5, color="#72874EFF")+
  labs (title= "Serie original de IMAE-Agricultura de 2006 a 2025",
        y ="IMAE precios constantes 2006",
        x = "Año")+
  facet_wrap(~Mes_num, scales = "free")+
  theme_classic()

Paso4: Descomponer la serie en sus componentes (Todos los IMAES - método decompose - método clasico)
imae_nic <- imae_nic %>%
  arrange(Año, Mes_num)

# Paso 2: Seleccionar columnas de actividades
actividades <- c("IMAE Agregado","Agricultura", "Construcción", "Comercio", "Hoteles y restaurantes", "Intermediación financiera", "Mineria")

# Paso 3: Crear lista de series temporales (ts) para cada actividad
series_ts <- imae_nic %>%
  select(all_of(actividades)) %>%
  map(~ ts(.x, start = c(min(imae_nic$Año), 1), frequency = 12))

# Paso 4: Aplicar decompose() a cada serie
series_decomp <- map(series_ts, ~ decompose(.x, type = "additive"))

plot(series_decomp$Agricultura)

plot(series_decomp$`Intermediación financiera`)

plot(series_decomp$Comercio)

plot(series_decomp$Construcción)

plot(series_decomp$`Hoteles y restaurantes`)

plot(series_decomp$Mineria)

plot(series_decomp$`IMAE Agregado`)

amplitud_estacional <- max(series_decomp$Construcción$seasonal) - min(series_decomp$Construcción$seasonal)
print(amplitud_estacional)
## [1] 19.42647
Paso4: Descomponer la serie en sus componentes (Todos los IMAES - método decompose - método clasico)
## Nota: Crear función para transformar una serie decomposed en data frame largo
decomp_to_df <- function(decomp_obj, nombre_actividad) {
  data.frame(
    Fecha = time(decomp_obj$x),
    Observado = decomp_obj$x,
    Tendencia = decomp_obj$trend,
    Estacional = decomp_obj$seasonal,
    Aleatorio = decomp_obj$random
  ) %>%
    pivot_longer(-Fecha, names_to = "Componente", values_to = "Valor") %>%
    mutate(Actividad = nombre_actividad)
}

df_decomp_largos <- imap_dfr(series_decomp, decomp_to_df)

##Nota: En este gráfico ir cambiando la actividad

df_decomp_largos %>%
  filter(Actividad == "Mineria") %>%
  ggplot(aes(x = Fecha, y = Valor)) +
  #geom_point(color="#2471A3", size=1)+
  geom_line(color = "#72874EFF") +
  facet_wrap(~Componente, scales = "free_y", ncol = 1) +
  theme_classic() +
  labs(
    title = "Descomposición de la serie: Minería",
    x = "Tiempo", y = NULL
  ) +
  theme(plot.title = element_text(hjust = 0.5, size=10))+
  labs(
    x= "Años",
    caption= "Fuente: Estadísticas del Banco Central de Nicaragua"
  )
## Warning: Removed 12 rows containing missing values or values outside the scale range
## (`geom_line()`).

Paso5: Obtener las series ajustadas estacionalmente y comparar
ajustada_agri <- series_decomp$Agricultura$x - series_decomp$Agricultura$seasonal

df_ajustada_agri <- ajustada_agri

##Nota: grafico opción 1 para comparar

plot(series_decomp$Agricultura$x, col = "gray", main = "Original vs Ajustada")
lines(ajustada_agri, col = "blue")
legend("topleft", legend = c("Original", "Ajustada"), col = c("gray", "blue"), lty = 1)

##Nota: gráfico opción 2 para comparar

# Crear vector de fechas mensual desde enero 2006
fechas <- seq.Date(from = as.Date("2006-01-01"), by = "month", length.out = length(series_decomp$Agricultura$x))

crear_df_ajustada <- function(nombre_actividad) {
  x <- series_decomp[[nombre_actividad]]$x
  seasonal <- series_decomp[[nombre_actividad]]$seasonal
  ajustada <- x - seasonal
  
  tibble(
    Fecha = fechas,
    Actividad = nombre_actividad,
    Original = as.numeric(x),
    Ajustada = as.numeric(ajustada)
  )
}

df_todas_actividades <- map_dfr(names(series_decomp), crear_df_ajustada)

df_todas_largo <- df_todas_actividades %>%
  pivot_longer(cols = c("Original", "Ajustada"), names_to = "Tipo", values_to = "Valor")

df_filtrado <- df_todas_largo %>%
  filter(Actividad != "IMAE Agregado")

actividades_parte1 <- c("Agricultura", "Construcción")
actividades_parte2 <- c("Comercio", "Hoteles y restaurantes")
actividades_parte3 <- c("Intermediación financiera", "Mineria")


ggplot(df_filtrado %>% filter(Actividad %in% actividades_parte1),
       aes(x = Fecha, y = Valor, color = Tipo)) +
  geom_line(size = 1) +
  facet_wrap(~ Actividad, scales = "free_y", ncol = 1) +
  scale_color_manual(values = c("Original" = "grey", "Ajustada" = "#023743FF")) +
  labs(
    title = "Serie original vs ajustada estacionalmente - Parte 1",
    subtitle = "Actividades: Agricultura y Construcción",
    x = "Año",
    y = "IMAE (precios constantes 2006)",
    color = "Serie",
    caption = "Fuente: Estadísticas del Banco Central de Nicaragua"
  ) +
  theme_classic() +
  theme(legend.position = "bottom")

ggplot(df_filtrado %>% filter(Actividad %in% actividades_parte2),
       aes(x = Fecha, y = Valor, color = Tipo)) +
  geom_line(size = 1) +
  facet_wrap(~ Actividad, scales = "free_y", ncol = 1) +
  scale_color_manual(values = c("Original" = "grey", "Ajustada" = "#023743FF")) +
  labs(
    title = "Serie original vs ajustada estacionalmente - Parte 2",
    subtitle = "Actividades: Comercio y Hoteles y restaurantes",
    x = "Año",
    y = "IMAE (precios constantes 2006)",
    color = "Serie",
    caption = "Fuente: Estadísticas del Banco Central de Nicaragua"
  ) +
  theme_classic() +
  theme(legend.position = "bottom")

ggplot(df_filtrado %>% filter(Actividad %in% actividades_parte3),
       aes(x = Fecha, y = Valor, color = Tipo)) +
  geom_line(size = 1) +
  facet_wrap(~ Actividad, scales = "free_y", ncol = 1) +
  scale_color_manual(values = c("Original" = "grey", "Ajustada" = "#023743FF")) +
  labs(
    title = "Serie original vs ajustada estacionalmente - Parte 3",
    subtitle = "Actividades: Intermediación financiera y Mineria",
    x = "Año",
    y = "IMAE (precios constantes 2006)",
    color = "Serie",
    caption = "Fuente: Estadísticas del Banco Central de Nicaragua"
  ) +
  theme_classic() +
  theme(legend.position = "bottom")

Paso6: Transformar las series y comparar
# Crear variaciones para la serie ajustada y original
# Excluir IMAE Agregado y ordenar por fecha
df_variaciones <- df_todas_actividades %>%
  filter(Actividad != "IMAE Agregado") %>%
  arrange(Actividad, Fecha) %>%
  group_by(Actividad) %>%
  mutate(
    Variacion_mensual_original = Original - lag(Original, 1),
    Variacion_mensual_ajustada = Ajustada - lag(Ajustada, 1),
    Variacion_anual_original   = Original - lag(Original, 12),
    Variacion_anual_ajustada   = Ajustada - lag(Ajustada, 12)
  ) %>%
  ungroup()

# Convertir a formato largo para graficar variaciones mensuales
df_vm_largo <- df_variaciones %>%
  pivot_longer(
    cols = starts_with("Variacion_mensual"),
    names_to = "Tipo",
    values_to = "Valor"
  )

# Graficar
ggplot(df_vm_largo, aes(x = Fecha, y = Valor, color = Tipo)) +
  geom_line() +
  facet_wrap(~ Actividad, scales = "free_y", ncol = 2) +
  scale_color_manual(values = c(
    "Variacion_mensual_original" = "grey",
    "Variacion_mensual_ajustada" = "#023743FF"
  )) +
  labs(
    title = "Variación mensual del IMAE por actividad",
    x = "Fecha", y = "Δ mensual (IMAE)",
    color = "Tipo de serie",
    caption = "Fuente: Elaboración propia con datos del BCN"
  ) +
  theme_classic() +
  theme(legend.position = "bottom")
## Warning: Removed 2 rows containing missing values or values outside the scale range
## (`geom_line()`).

# Convertir a formato largo para graficar variaciones interanuales
df_va_largo <- df_variaciones %>%
  pivot_longer(
    cols = starts_with("Variacion_anual"),
    names_to = "Tipo",
    values_to = "Valor"
  )

# Graficar
ggplot(df_va_largo, aes(x = Fecha, y = Valor, color = Tipo)) +
  geom_line() +
  facet_wrap(~ Actividad, scales = "free_y", ncol = 2) +
  scale_color_manual(values = c(
    "Variacion_anual_original" = "grey",
    "Variacion_anual_ajustada" = "#023743FF"
  )) +
  labs(
    title = "Variación interanual del IMAE por actividad",
    x = "Fecha", y = "Δ12 (IMAE)",
    color = "Tipo de serie",
    caption = "Fuente: Elaboración propia con datos del BCN"
  ) +
  theme_classic() +
  theme(legend.position = "bottom")
## Warning: Removed 24 rows containing missing values or values outside the scale range
## (`geom_line()`).