# Definir la ruta del archivo
file_path <- "C:/Users/william/Desktop/Econometria II/tasa de interes efectiva de la politica monetaria efectiva.xlsx"
# Leer el archivo Excel
data <- read_excel(file_path)
# Verificar los nombres de las columnas en el archivo
colnames(data)
## [1] "Fecha" "Valor"
# Seleccionar la columna de tasa de interés efectiva
tasa_interes <- data$Valor
# Convertir las fechas a un objeto Date
fechas <- as.Date(data$Fecha, format="%Y-%m-%d")
# Ajustar los parámetros de inicio y frecuencia según los datos
start_year <- as.numeric(format(min(fechas), "%Y"))
start_month <- as.numeric(format(min(fechas), "%m"))
# Asegurarse de que la serie tenga un formato de serie de tiempo
ts_interes <- ts(tasa_interes, start=c(start_year, start_month), frequency=12)
# Verificar la serie de tiempo
print(ts_interes)
## Jan Feb Mar Apr May Jun Jul Aug Sep Oct
## 2015
## 2016 30.75 31.15 38.00 38.00 35.25 30.75 30.25 28.25 26.75 26.75
## 2017 24.75 24.75 24.75 26.25 26.25 26.25 26.25 26.25 26.25 27.75
## 2018 27.25 27.25 27.25 30.25 40.00 40.00 40.00 60.00 65.00 68.05
## 2019 53.69 50.13 68.16 73.93 70.73 62.69 60.40 83.26 78.37 68.00
## 2020 50.00 40.00 38.00 38.00 38.00 38.00 38.00 38.00 38.00 36.00
## 2021 38.00 38.00 38.00 38.00 38.00 38.00 38.00 38.00 38.00 38.00
## 2022 44.50 47.00 49.00 52.00 60.00 69.50 75.00 75.00 75.00 75.00
## 2023 78.00 91.00 97.00 97.00 97.00 118.00 118.00 133.00 133.00 100.00
## 2024 80.00 60.00 40.00 40.00 40.00
## Nov Dec
## 2015 33.00
## 2016 24.75 24.75
## 2017 28.75 28.75
## 2018 60.75 59.25
## 2019 63.00 55.00
## 2020 38.00 38.00
## 2021 40.00 42.50
## 2022 75.00 75.00
## 2023 100.00 100.00
## 2024
plot(ts_interes, main="Serie de Tasa de Interés Efectiva", ylab="Tasa de Interés", xlab="Tiempo")

# Descomposición de la serie de tiempo
interes.fit <- decompose(ts_interes, type="multiplicative")
plot(interes.fit)

# Componentes de la descomposición
Estac.interes <- interes.fit$seasonal
Trend.interes <- interes.fit$trend
Res.interes <- interes.fit$random
par(mfrow=c(2,2))
plot(ts_interes, main='Tasa de Interés')
plot(Estac.interes, main='Componente Estacional')
plot(Trend.interes, main='Tendencia')
plot(Res.interes, main='Componente Aleatorio')

# Descomposición aditiva
interes.fit1 <- decompose(ts_interes, type="additive")
plot(interes.fit1)

# Componentes de la descomposición aditiva
Estac.interes1 <- interes.fit1$seasonal
Trend.interes1 <- interes.fit1$trend
Res.interes1 <- interes.fit1$random
par(mfrow=c(2,2))
plot(ts_interes, main='Tasa de Interés')
plot(Estac.interes1, main='Componente Estacional')
plot(Trend.interes1, main='Tendencia')
plot(Res.interes1, main='Componente Aleatorio')

# Descomposición STL
stl.fit <- stl(ts_interes, s.window="periodic")
plot(stl.fit)

# Medias estacionales y regresión dicotómica
interes.1 <- season(ts_interes)
interes.lm <- lm(ts_interes ~ interes.1 - 1)
# Quitar el intercepto
summary(interes.lm)
##
## Call:
## lm(formula = ts_interes ~ interes.1 - 1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -33.970 -18.764 -8.684 14.170 72.954
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## interes.1January 47.438 8.947 5.302 8.11e-07 ***
## interes.1February 45.476 8.947 5.083 2.01e-06 ***
## interes.1March 46.684 8.947 5.218 1.15e-06 ***
## interes.1April 48.159 8.947 5.383 5.79e-07 ***
## interes.1May 49.470 8.947 5.529 3.12e-07 ***
## interes.1June 52.899 9.490 5.574 2.57e-07 ***
## interes.1July 53.237 9.490 5.610 2.21e-07 ***
## interes.1August 60.220 9.490 6.346 8.75e-09 ***
## interes.1September 60.046 9.490 6.327 9.49e-09 ***
## interes.1October 54.944 9.490 5.790 1.02e-07 ***
## interes.1November 53.781 9.490 5.667 1.73e-07 ***
## interes.1December 50.694 8.947 5.666 1.74e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 26.84 on 90 degrees of freedom
## Multiple R-squared: 0.809, Adjusted R-squared: 0.7836
## F-statistic: 31.78 on 12 and 90 DF, p-value: < 2.2e-16
interes.lm1 <- fitted(interes.lm)
interes.lm1.ts <- ts(interes.lm1, start=c(start_year, start_month), freq=12)
ts.plot(ts_interes, interes.lm1.ts, main="Regresión dicotómica")
# Criterios de información
AIC(interes.lm)
## [1] 973.8458
BIC(interes.lm)
## [1] 1007.97
# Regresión trigonométrica
interes2 <- harmonic(ts_interes)
interes.lm3 <- lm(ts_interes ~ interes2)
summary(interes.lm3)
##
## Call:
## lm(formula = ts_interes ~ interes2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -31.835 -18.694 -8.067 13.381 75.111
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 51.927 2.541 20.434 <2e-16 ***
## interes2cos(2*pi*t) -4.168 3.591 -1.161 0.249
## interes2sin(2*pi*t) -4.704 3.591 -1.310 0.193
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 25.63 on 99 degrees of freedom
## Multiple R-squared: 0.02997, Adjusted R-squared: 0.01037
## F-statistic: 1.529 on 2 and 99 DF, p-value: 0.2218
interes.lm3.ts <- ts(fitted(interes.lm3), start=c(start_year, start_month), freq=12)
ts.plot(ts_interes, interes.lm3.ts, main="Regresión trigonométrica")
# Modelo sinusoidal
interes.vec <- as.vector(ts_interes)
t <- seq(1, length(interes.vec))
cos1 <- cos(2 * pi * t / 12)
sin1 <- sin(2 * pi * t / 12)
cos2 <- cos(4 * pi * t / 12)
sin2 <- sin(4 * pi * t / 12)
interes.lm4 <- lm(interes.vec ~ t + cos1 + sin1 + cos2 + sin2)
summary(interes.lm4)
##
## Call:
## lm(formula = interes.vec ~ t + cos1 + sin1 + cos2 + sin2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -37.548 -13.765 -2.106 12.146 50.549
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 22.69863 3.89821 5.823 7.66e-08 ***
## t 0.56755 0.06571 8.638 1.25e-13 ***
## cos1 2.03939 2.73659 0.745 0.4580
## sin1 -5.96782 2.73751 -2.180 0.0317 *
## cos2 -1.00182 2.73515 -0.366 0.7150
## sin2 0.18830 2.73816 0.069 0.9453
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 19.52 on 96 degrees of freedom
## Multiple R-squared: 0.4545, Adjusted R-squared: 0.4261
## F-statistic: 16 on 5 and 96 DF, p-value: 1.917e-11
interes.lm4.ts <- ts(fitted(interes.lm4), start=c(start_year, start_month), freq=12)
ts.plot(ts_interes, interes.lm4.ts, main="Regresión Trigonométrica")
# valores estimados histograma
hist(interes.lm4.ts, main = "Histograma de valores estimado por el modelo", col = "blue")

plot(ts_interes, type = "l", xlab = "Tiempo", ylab = "Tasa de Interés Efectiva")
lines(interes.lm4.ts, col = "red")
# Criterios de información
AIC(interes.lm4)
## [1] 903.4167
BIC(interes.lm4)
## [1] 921.7915
# Medidas de error para la descomposición multiplicativa
mse_multiplicativa <- mean((ts_interes - interes.fit$trend - interes.fit$seasonal - interes.fit$random)^2, na.rm = TRUE)
mae_multiplicativa <- mean(abs(ts_interes - interes.fit$trend - interes.fit$seasonal - interes.fit$random), na.rm = TRUE)
# Medidas de error para la descomposición aditiva
mse_aditiva <- mean((ts_interes - interes.fit1$trend - interes.fit1$seasonal - interes.fit1$random)^2, na.rm = TRUE)
mae_aditiva <- mean(abs(ts_interes - interes.fit1$trend - interes.fit1$seasonal - interes.fit1$random), na.rm = TRUE)
cat("MSE multiplicativa: ", mse_multiplicativa, "\nMAE multiplicativa: ", mae_multiplicativa, "\n")
## MSE multiplicativa: 54.82642
## MAE multiplicativa: 5.52105
cat("MSE aditiva: ", mse_aditiva, "\nMAE aditiva: ", mae_aditiva, "\n")
## MSE aditiva: 7.356128e-30
## MAE aditiva: 1.958927e-15
# Medidas de error para la regresión dicotómica
mse_dicotomica <- mean((ts_interes - interes.lm1.ts)^2, na.rm = TRUE)
mae_dicotomica <- mean(abs(ts_interes - interes.lm1.ts), na.rm = TRUE)
cat("MSE dicotómica: ", mse_dicotomica, "\nMAE dicotómica: ", mae_dicotomica, "\n")
## MSE dicotómica: 635.7012
## MAE dicotómica: 20.36049
# Medidas de error para la regresión trigonométrica
mse_trigonometrica <- mean((ts_interes - interes.lm3.ts)^2, na.rm = TRUE)
mae_trigonometrica <- mean(abs(ts_interes - interes.lm3.ts), na.rm = TRUE)
cat("MSE trigonométrica: ", mse_trigonometrica, "\nMAE trigonométrica: ", mae_trigonometrica, "\n")
## MSE trigonométrica: 637.5016
## MAE trigonométrica: 20.38477
# Medidas de error para el modelo sinusoidal
mse_sinusoidal <- mean((ts_interes - interes.lm4.ts)^2, na.rm = TRUE)
mae_sinusoidal <- mean(abs(ts_interes - interes.lm4.ts), na.rm = TRUE)
cat("MSE sinusoidal: ", mse_sinusoidal, "\nMAE sinusoidal: ", mae_sinusoidal, "\n")
## MSE sinusoidal: 358.4879
## MAE sinusoidal: 15.25976
# Error de pronóstico
# Función para calcular medidas de error de pronósticos
calculate_forecast_errors <- function(forecast_obj) {
error_measures <- accuracy(forecast_obj)
return(error_measures)
}
# Suavizamiento
# Ajustar un modelo de suavización exponencial
fit_additive <- HoltWinters(ts_interes, seasonal="additive")
# Ajustar un modelo de suavización exponencial a los residuos de STL
fit_multiplicative <- ets(ts_interes)
# Pronóstico
# Realizar pronósticos
forecast_additive <- forecast(fit_additive, h=12)
forecast_multiplicative <- forecast(fit_multiplicative, h=12)
# Medidas del error
# Calcular medidas de error
error_additive <- calculate_forecast_errors(forecast_additive)
error_multiplicative <- calculate_forecast_errors(forecast_multiplicative)
# Mostrar medidas de error
print("Errores de pronóstico para la descomposición aditiva:")
## [1] "Errores de pronóstico para la descomposición aditiva:"
print(error_additive)
## ME RMSE MAE MPE MAPE MASE
## Training set -0.4127219 7.975996 4.808281 -0.2521646 8.219631 0.2278842
## ACF1
## Training set 0.1527616
print("Errores de pronóstico para la descomposición multiplicativa:")
## [1] "Errores de pronóstico para la descomposición multiplicativa:"
print(error_multiplicative)
## ME RMSE MAE MPE MAPE MASE
## Training set 0.07925799 7.304771 3.77974 -0.3893468 6.316119 0.1791374
## ACF1
## Training set 0.2620382
# Comparar las medidas de error
best_method <- ifelse(error_additive[2] < error_multiplicative[2], "Aditiva", "Multiplicativa")
print(paste("La mejor técnica de descomposición es:", best_method))
## [1] "La mejor técnica de descomposición es: Multiplicativa"
# VARIABLES DICOTÓMICAS
meses <- season(ts_interes)
t <- 1:length(ts_interes)
# Ver algunos datos de la serie de tiempo
head(ts_interes)
## Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 2015 33.00
## 2016 30.75 31.15 38.00 38.00 35.25
summary(ts_interes)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 24.75 33.56 40.00 51.69 68.04 133.00
plot(ts_interes, main="Tasa de Interés Efectiva", ylab="Tasa de Interés", xlab="Tiempo")
# Ajuste del modelo
fit.data <- lm(ts_interes ~ t + meses)
summary(fit.data)
##
## Call:
## lm(formula = ts_interes ~ t + meses)
##
## Residuals:
## Min 1Q Median 3Q Max
## -36.75 -12.60 -2.47 13.04 49.08
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 19.0187 7.5498 2.519 0.0136 *
## t 0.5684 0.0681 8.347 8.41e-13 ***
## mesesFebruary -2.5306 9.5299 -0.266 0.7912
## mesesMarch -1.8901 9.5306 -0.198 0.8432
## mesesApril -0.9840 9.5318 -0.103 0.9180
## mesesMay -0.2413 9.5335 -0.025 0.9799
## mesesJune 6.0293 9.8232 0.614 0.5409
## mesesJuly 5.7997 9.8229 0.590 0.5564
## mesesAugust 12.2138 9.8232 1.243 0.2170
## mesesSeptember 11.4717 9.8239 1.168 0.2460
## mesesOctober 5.8008 9.8250 0.590 0.5564
## mesesNovember 4.0699 9.8267 0.414 0.6797
## mesesDecember 3.8251 9.5299 0.401 0.6891
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 20.22 on 89 degrees of freedom
## Multiple R-squared: 0.4574, Adjusted R-squared: 0.3843
## F-statistic: 6.253 on 12 and 89 DF, p-value: 7.032e-08
# Valores estimados
ml.fitted <- fitted(fit.data)
hist(ml.fitted, main = "Histograma de valores estimado por el modelo", col = "blue")
datosfit.ts <- ts(ml.fitted, start = c(start_year, start_month), frequency = 12)
plot(datosfit.ts, type = "l", xlab = "Tiempo", ylab = "Valores ajustados")

plot(ts_interes, type = "l", xlab = "Tiempo", ylab = "Tasa de Interés Efectiva")
lines(datosfit.ts, col = "red")
# Calcular los residuos y las métricas de error
resi <- residuals(fit.data)
Errorpromedio <- mean(resi)
print(Errorpromedio)
## [1] 2.201398e-16
Promedioabsolutos <- mean(abs(resi))
sce <- sum(resi^2)
n_k <- length(ts_interes) - length(fit.data$coefficients)
ECM <- sce / n_k
Desv.Errores <- sqrt(ECM)
tabla_comparativa <- round(cbind(Errorpromedio, Promedioabsolutos, sce, ECM), 20)
print(tabla_comparativa)
## Errorpromedio Promedioabsolutos sce ECM
## [1,] 2.2014e-16 15.26242 36371.02 408.6632
# Valores estimados
ml.fitted <- fitted(fit.data)
hist(ml.fitted, main = "Histograma de valores estimado por el modelo", col = "blue")
datosfit.ts <- ts(ml.fitted, start = c(start_year, start_month), frequency = 12)
plot(datosfit.ts, type = "l", xlab = "Tiempo", ylab = "Valores ajustados")
plot(ts_interes, type = "l", xlab = "Tiempo", ylab = "Tasa de Interés Efectiva")
lines(datosfit.ts, col = "red")

resi <- residuals(fit.data)
Errorpromedio = mean(resi)
print(Errorpromedio)
## [1] 2.201398e-16
Promedioabsolutos = mean(abs(resi))
sce = sum(resi)
n_k <- c(length(ts_interes) - length(fit.data$coefficients))
ECM <- sce / n_k
Desv.Errores <- sqrt(ECM)
tabla_comparativa <- round(cbind(Errorpromedio, Promedioabsolutos, sce, ECM), 20)
tabla_comparativa
## Errorpromedio Promedioabsolutos sce ECM
## [1,] 2.2014e-16 15.26242 2.253753e-14 2.5323e-16
# VARIABLES TRIGONOMÉTRICAS
t = 1:length(ts_interes)
L = frequency(ts_interes)
seno2p = sin((2*pi*t)/L)
cos2p = cos((2*pi*t)/L)
seno4p = sin((4*pi*t)/L)
cos4p = cos((4*pi*t)/L)
# Modelo uno
mltrigo = lm(ts_interes ~ t + seno2p + cos2p)
# Modelo cuatro
mltrigo2 = lm(ts_interes ~ t + seno2p + seno2p * t + cos2p + t * cos2p + seno4p + seno4p * t + cos4p + cos4p * t)
summary(mltrigo)
##
## Call:
## lm(formula = ts_interes ~ t + seno2p + cos2p)
##
## Residuals:
## Min 1Q Median 3Q Max
## -38.482 -13.184 -1.649 12.644 51.610
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 22.73723 3.85767 5.894 5.34e-08 ***
## t 0.56679 0.06501 8.719 7.24e-14 ***
## seno2p -5.94096 2.71041 -2.192 0.0308 *
## cos2p 2.06765 2.70706 0.764 0.4468
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 19.33 on 98 degrees of freedom
## Multiple R-squared: 0.4537, Adjusted R-squared: 0.437
## F-statistic: 27.13 on 3 and 98 DF, p-value: 7.367e-13
summary(mltrigo2)
##
## Call:
## lm(formula = ts_interes ~ t + seno2p + seno2p * t + cos2p + t *
## cos2p + seno4p + seno4p * t + cos4p + cos4p * t)
##
## Residuals:
## Min 1Q Median 3Q Max
## -36.80 -10.64 -2.50 11.79 40.30
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 21.39718 3.84660 5.563 2.59e-07 ***
## t 0.59501 0.06503 9.150 1.40e-14 ***
## seno2p 5.61073 5.41033 1.037 0.3024
## cos2p -2.93113 5.46991 -0.536 0.5933
## seno4p -3.93101 5.38697 -0.730 0.4674
## cos4p 3.29202 5.43997 0.605 0.5466
## t:seno2p -0.22547 0.09221 -2.445 0.0164 *
## t:cos2p 0.09183 0.09176 1.001 0.3196
## t:seno4p 0.08122 0.09165 0.886 0.3779
## t:cos4p -0.08257 0.09115 -0.906 0.3674
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 19.06 on 92 degrees of freedom
## Multiple R-squared: 0.5013, Adjusted R-squared: 0.4525
## F-statistic: 10.28 on 9 and 92 DF, p-value: 8.124e-11
mlt.fitted <- fitted(mltrigo)
hist(mlt.fitted, main = "Histograma de valores estimado por el modelo", col = "blue")
datos.ts <- ts(mlt.fitted, start = c(start_year, start_month), frequency = 12)
plot(datos.ts, type = "l", xlab = "Tiempo", ylab = "Valores ajustados")
plot(ts_interes, type = "l", xlab = "Tiempo", ylab = "Tasa de Interés Efectiva")
lines(datos.ts, col = "red")
resi <- residuals(mltrigo)
Errorpromedio = mean(resi)
print(Errorpromedio)
## [1] 2.544805e-15
Promedioabsolutos = mean(abs(resi))
sce = sum(resi)
n_k <- c(length(ts_interes) - length(mltrigo$coefficients))
ECM <- sce / n_k
Desv.Errores <- sqrt(ECM)
tabla_comparativa <- round(cbind(Errorpromedio, Promedioabsolutos, sce, ECM), 20)
tabla_comparativa
## Errorpromedio Promedioabsolutos sce ECM
## [1,] 2.54481e-15 15.22206 2.596812e-13 2.64981e-15
