| 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()`).
