pacman::p_load(dplyr, ggplot2, naniar, tseries, corrplot, patchwork, readxl, psych, maps, sf, rnaturalearth, rnaturalearthdata, stringi, scales, dlookr, DataExplorer, tidyr, knitr, RColorBrewer, plotly, forecast, tseries, openxlsx, vars, lmtest)
library(openxlsx)
df <- read.xlsx("HOTELES-BD.xlsx", sheet ="HOTELES")
kable(head(df))
| AÑO | MES | Cuartos_Disponibles | Cuartos_Disponibles_Promedio | Cuartos_Ocupados | Cuartos_Registrados | Densidad_Ocupación | Derrama_Economica_Est_mdp | Estadia_Promedio | Imp_Hospedaje | Turistas_Noche_Ext | Turistas_Noche_Nac | %Ocupacion_Hoteles | Llegada_Tur_Ext | Llegada_Tur_Nac |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2004 | 1 | 285891 | 9142 | 134696 | 293105 | 1.501604 | 316.5167 | 2.125116 | NA | 35742 | 166518 | 0.4711446 | 14725 | 80451 |
| 2004 | 2 | 267473 | 9143 | 129500 | 274195 | 1.486286 | 345.1886 | 1.858844 | NA | 33262 | 159212 | 0.4841610 | 15841 | 87704 |
| 2004 | 3 | 289049 | 9317 | 154239 | 293105 | 1.576326 | 442.6492 | 1.957151 | NA | 38217 | 204914 | 0.5336085 | 18465 | 105762 |
| 2004 | 4 | 276364 | 9205 | 138065 | 283650 | 1.607808 | 377.4937 | 1.972139 | NA | 28712 | 193270 | 0.4995766 | 13567 | 98992 |
| 2004 | 5 | 289222 | 9322 | 170326 | 293105 | 1.608674 | 464.8694 | 1.933724 | NA | 42037 | 231962 | 0.5889109 | 18876 | 122819 |
| 2004 | 6 | 280401 | 9346 | 141969 | 283650 | 1.508153 | 386.5217 | 1.866298 | NA | 39146 | 174965 | 0.5063070 | 18032 | 96693 |
# Nulos Totales
sum(is.na(df))
## [1] 132
# Nulos por Columna
gg_miss_var(df)
summary(df)
## AÑO MES Cuartos_Disponibles
## Min. :2004 Min. : 1.00 Min. :259707
## 1st Qu.:2009 1st Qu.: 3.75 1st Qu.:346570
## Median :2014 Median : 6.50 Median :373090
## Mean :2014 Mean : 6.50 Mean :391909
## 3rd Qu.:2019 3rd Qu.: 9.25 3rd Qu.:430070
## Max. :2024 Max. :12.00 Max. :543182
##
## Cuartos_Disponibles_Promedio Cuartos_Ocupados Cuartos_Registrados
## Min. : 9142 Min. : 26308 Min. :264740
## 1st Qu.:11568 1st Qu.:168867 1st Qu.:350052
## Median :12205 Median :203002 Median :381920
## Mean :12874 Mean :219182 Mean :395936
## 3rd Qu.:14115 3rd Qu.:275674 3rd Qu.:432078
## Max. :17522 Max. :382072 Max. :543182
##
## Densidad_Ocupación Derrama_Economica_Est_mdp Estadia_Promedio
## Min. :0.000 Min. : 103.5 Min. :1.606
## 1st Qu.:1.450 1st Qu.: 541.9 1st Qu.:1.910
## Median :1.515 Median : 718.4 Median :2.020
## Mean :1.543 Mean : 909.2 Mean :2.041
## 3rd Qu.:1.600 3rd Qu.:1089.8 3rd Qu.:2.160
## Max. :2.080 Max. :3016.2 Max. :3.050
##
## Imp_Hospedaje Turistas_Noche_Ext Turistas_Noche_Nac %Ocupacion_Hoteles
## Min. : 1635935 Min. : 3728 Min. : 37093 Min. :0.05811
## 1st Qu.: 6492250 1st Qu.: 37498 1st Qu.:209590 1st Qu.:0.48184
## Median :10329255 Median : 53826 Median :257928 Median :0.57719
## Mean :10509451 Mean : 56497 Mean :285699 Mean :0.55791
## 3rd Qu.:13543490 3rd Qu.: 71226 3rd Qu.:361718 3rd Qu.:0.65404
## Max. :24075522 Max. :143049 Max. :557430 Max. :0.80457
## NA's :132
## Llegada_Tur_Ext Llegada_Tur_Nac
## Min. : 1176 Min. : 12021
## 1st Qu.:18874 1st Qu.:106026
## Median :27516 Median :123694
## Mean :28754 Mean :139067
## 3rd Qu.:37404 3rd Qu.:172872
## Max. :65790 Max. :315672
##
colnames(df)
## [1] "AÑO" "MES"
## [3] "Cuartos_Disponibles" "Cuartos_Disponibles_Promedio"
## [5] "Cuartos_Ocupados" "Cuartos_Registrados"
## [7] "Densidad_Ocupación" "Derrama_Economica_Est_mdp"
## [9] "Estadia_Promedio" "Imp_Hospedaje"
## [11] "Turistas_Noche_Ext" "Turistas_Noche_Nac"
## [13] "%Ocupacion_Hoteles" "Llegada_Tur_Ext"
## [15] "Llegada_Tur_Nac"
plot_histogram(df)
plot_normality(df)
library(dplyr)
# Define columnas a transformar
cols_log <- c( "Cuartos_Disponibles_Promedio",
"Densidad_Ocupación",
"Estadia_Promedio")
# Crear las columnas transformadas y agregarlas al dataframe original
df_log <- df %>%
mutate(across(all_of(cols_log), ~ log(. + 1), .names = "{.col}_log"))
colnames(df_log)
## [1] "AÑO" "MES"
## [3] "Cuartos_Disponibles" "Cuartos_Disponibles_Promedio"
## [5] "Cuartos_Ocupados" "Cuartos_Registrados"
## [7] "Densidad_Ocupación" "Derrama_Economica_Est_mdp"
## [9] "Estadia_Promedio" "Imp_Hospedaje"
## [11] "Turistas_Noche_Ext" "Turistas_Noche_Nac"
## [13] "%Ocupacion_Hoteles" "Llegada_Tur_Ext"
## [15] "Llegada_Tur_Nac" "Cuartos_Disponibles_Promedio_log"
## [17] "Densidad_Ocupación_log" "Estadia_Promedio_log"
df_log <- df_log[, !(names(df_log) %in% cols_log)]
colnames(df_log)
## [1] "AÑO" "MES"
## [3] "Cuartos_Disponibles" "Cuartos_Ocupados"
## [5] "Cuartos_Registrados" "Derrama_Economica_Est_mdp"
## [7] "Imp_Hospedaje" "Turistas_Noche_Ext"
## [9] "Turistas_Noche_Nac" "%Ocupacion_Hoteles"
## [11] "Llegada_Tur_Ext" "Llegada_Tur_Nac"
## [13] "Cuartos_Disponibles_Promedio_log" "Densidad_Ocupación_log"
## [15] "Estadia_Promedio_log"
# Gráfico de dispersión
plot_histogram(df_log)
summary(df_log)
## AÑO MES Cuartos_Disponibles Cuartos_Ocupados
## Min. :2004 Min. : 1.00 Min. :259707 Min. : 26308
## 1st Qu.:2009 1st Qu.: 3.75 1st Qu.:346570 1st Qu.:168867
## Median :2014 Median : 6.50 Median :373090 Median :203002
## Mean :2014 Mean : 6.50 Mean :391909 Mean :219182
## 3rd Qu.:2019 3rd Qu.: 9.25 3rd Qu.:430070 3rd Qu.:275674
## Max. :2024 Max. :12.00 Max. :543182 Max. :382072
##
## Cuartos_Registrados Derrama_Economica_Est_mdp Imp_Hospedaje
## Min. :264740 Min. : 103.5 Min. : 1635935
## 1st Qu.:350052 1st Qu.: 541.9 1st Qu.: 6492250
## Median :381920 Median : 718.4 Median :10329255
## Mean :395936 Mean : 909.2 Mean :10509451
## 3rd Qu.:432078 3rd Qu.:1089.8 3rd Qu.:13543490
## Max. :543182 Max. :3016.2 Max. :24075522
## NA's :132
## Turistas_Noche_Ext Turistas_Noche_Nac %Ocupacion_Hoteles Llegada_Tur_Ext
## Min. : 3728 Min. : 37093 Min. :0.05811 Min. : 1176
## 1st Qu.: 37498 1st Qu.:209590 1st Qu.:0.48184 1st Qu.:18874
## Median : 53826 Median :257928 Median :0.57719 Median :27516
## Mean : 56497 Mean :285699 Mean :0.55791 Mean :28754
## 3rd Qu.: 71226 3rd Qu.:361718 3rd Qu.:0.65404 3rd Qu.:37404
## Max. :143049 Max. :557430 Max. :0.80457 Max. :65790
##
## Llegada_Tur_Nac Cuartos_Disponibles_Promedio_log Densidad_Ocupación_log
## Min. : 12021 Min. :9.121 Min. :0.0000
## 1st Qu.:106026 1st Qu.:9.356 1st Qu.:0.8961
## Median :123694 Median :9.410 Median :0.9223
## Mean :139067 Mean :9.448 Mean :0.9304
## 3rd Qu.:172872 3rd Qu.:9.555 3rd Qu.:0.9555
## Max. :315672 Max. :9.771 Max. :1.1249
##
## Estadia_Promedio_log
## Min. :0.9578
## 1st Qu.:1.0682
## Median :1.1053
## Mean :1.1105
## 3rd Qu.:1.1506
## Max. :1.3987
##
plot_correlation(df_log)
## Warning: Removed 28 rows containing missing values or values outside the scale range
## (`geom_text()`).
# 1. Selecciona solo las columnas numéricas
df_numerico <- df_log[sapply(df_log, is.numeric)]
# 2. Calcula la matriz de correlación
matriz_cor <- cor(df_numerico, use = "pairwise.complete.obs")
corrplot( matriz_cor,
method = "color", # Mapa de calor
type = "upper", # Solo triángulo superior
addCoef.col = "black", # Mostrar coeficientes en color negro
number.cex = 0.6, # Tamaño del número
tl.cex = 0.35, # Tamaño de las etiquetas
tl.col = "black", # Color del texto
diag = FALSE # Oculta la diagonal (1s)
)
# Calcular la matriz de correlación
correlaciones <- cor(df_numerico, use = "pairwise.complete.obs")
# Extraer las correlaciones con %Ocupacion_Hoteles
cor_ocupacion <- correlaciones["Derrama_Economica_Est_mdp", ]
cor_ocupacion <- cor_ocupacion[!names(cor_ocupacion) %in% "Derrama_Economica_Est_mdp"]
df_cor <- data.frame(
Variable = names(cor_ocupacion),
Correlacion = cor_ocupacion
) %>%
arrange(desc(abs(Correlacion))) %>%
mutate(Variable = factor(Variable, levels = Variable))
ggplot(df_cor, aes(x = Variable, y = Correlacion)) +
geom_bar(stat = "identity", fill = "steelblue") +
coord_flip() +
geom_text(aes(label = round(Correlacion, 2)), hjust = ifelse(df_cor$Correlacion > 0, -0.1, 1.1)) +
labs(
title = "Correlación con Derrama_Economica_Est_mdp",
y = "Coeficiente de correlación",
x = ""
) +
theme_minimal()
df_log <- df_log[!is.na(df_log$"Derrama_Economica_Est_mdp"), ]
derrama_ts <- ts(df_log$"Derrama_Economica_Est_mdp", start = c(2004, 1), end = c(2024, 12), frequency = 12)
plot(derrama_ts, type = "l", col = "darkgreen", lwd = 2,
xlab = "Año", ylab = "Derrama Económica",
main = "Serie Temporal de Derrama_Economica_Est_mdp")
length(derrama_ts)
## [1] 252
frequency(derrama_ts)
## [1] 12
end(derrama_ts)
## [1] 2024 12
decomposition <- decompose(derrama_ts)
plot(decomposition)
descomp_stl <- stl(derrama_ts, s.window = "periodic")
plot(descomp_stl)
boxplot(derrama_ts ~ cycle(derrama_ts),
xlab = "Mes", ylab = "Derrama",
main = "Estacionalidad mensual", col = "lightblue")
# Autocorrelación y autocorrelación parcial
acf(derrama_ts, main="Autocorrelation - Derrama Económica")
pacf(derrama_ts, main="Partial Autocorrelation -Derrama Económica") #aplicar 1 o 2
adf_ocupacion <- adf.test(df_log$"Derrama_Economica_Est_mdp")
print(adf_ocupacion)
##
## Augmented Dickey-Fuller Test
##
## data: df_log$Derrama_Economica_Est_mdp
## Dickey-Fuller = -1.9306, Lag order = 6, p-value = 0.605
## alternative hypothesis: stationary
# Aucotorrelación serial
lgunj_box_result <- Box.test(derrama_ts, lag = 5, type = "Ljung-Box")
lgunj_box_result
##
## Box-Ljung test
##
## data: derrama_ts
## X-squared = 983.29, df = 5, p-value < 2.2e-16
nsdiffs(derrama_ts)
## [1] 0
derrama_diff <- diff(derrama_ts) # Diferencia (d = 1)
adf.test(derrama_diff) #Ya es estacionaria, por ende no se aplica d
## Warning in adf.test(derrama_diff): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: derrama_diff
## Dickey-Fuller = -6.4941, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary
mod1 <- arima(derrama_diff, order = c(1, 0, 0)) # d = 0 porque ya la serie está diferenciada
summary(mod1) #p-value = 2.2e-16 → muy menor a 0.05, los residuos no se comportan como ruido blanco → el modelo no está capturando completamente la estructura de la serie.
##
## Call:
## arima(x = derrama_diff, order = c(1, 0, 0))
##
## Coefficients:
## ar1 intercept
## -0.1075 7.6542
## s.e. 0.0637 9.6332
##
## sigma^2 estimated as 28547: log likelihood = -1643.7, aic = 3293.4
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.001449583 168.9576 118.4086 210.444 249.2255 0.6696299
## ACF1
## Training set -0.03787776
checkresiduals(mod1)
##
## Ljung-Box test
##
## data: Residuals from ARIMA(1,0,0) with non-zero mean
## Q* = 230.01, df = 23, p-value < 2.2e-16
##
## Model df: 1. Total lags used: 24
#ar1-> coeficiente bajo, lo que sugiere una débil autocorrelación temporal directa.
modelo_auto <- auto.arima(derrama_ts)
summary(modelo_auto)
## Series: derrama_ts
## ARIMA(2,1,0)(0,0,2)[12]
##
## Coefficients:
## ar1 ar2 sma1 sma2
## -0.1440 -0.2517 0.2315 0.2043
## s.e. 0.0616 0.0657 0.0683 0.0633
##
## sigma^2 = 23305: log likelihood = -1617.03
## AIC=3244.06 AICc=3244.3 BIC=3261.69
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 7.723387 151.1387 97.70522 -2.637469 13.8319 0.4266687
## ACF1
## Training set 0.0003630307
checkresiduals(modelo_auto)
##
## Ljung-Box test
##
## data: Residuals from ARIMA(2,1,0)(0,0,2)[12]
## Q* = 40.37, df = 20, p-value = 0.004484
##
## Model df: 4. Total lags used: 24
#p-value = 0.004484 → menor a 0.05, lo que indica presencia de autocorrelación en los residuos
#No captura tan bien la estacionalidad
library(forecast)
# Lista para guardar resultados
resultados <- list()
modelos_validos <- data.frame()
# Rangos de parámetros (ajústalos si quieres más o menos combinaciones)
for (p in 0:2) {
for (d in 1:1) {
for (q in 0:2) {
for (P in 0:2) {
for (D in 0:1) {
for (Q in 0:2) {
orden <- c(p, d, q)
orden_estacional <- c(P, D, Q)
try({
modelo <- arima(derrama_ts,
order = orden,
seasonal = list(order = orden_estacional, period = 12),
method = "ML")
aic_val <- AIC(modelo)
modelos_validos <- rbind(modelos_validos, data.frame(
p, d, q, P, D, Q,
AIC = aic_val
))
key <- paste0("(", p, ",", d, ",", q, ")(", P, ",", D, ",", Q, ")[12]")
resultados[[key]] <- modelo
}, silent = TRUE)
}
}
}
}
}
}
## Warning in log(s2): NaNs produced
## Warning in log(s2): NaNs produced
## Warning in log(s2): NaNs produced
## Warning in log(s2): NaNs produced
## Warning in arima(derrama_ts, order = orden, seasonal = list(order =
## orden_estacional, : possible convergence problem: optim gave code = 1
# Ordenar por AIC
modelos_validos <- modelos_validos[order(modelos_validos$AIC), ]
head(modelos_validos, 5)
## p d q P D Q AIC
## 143 2 1 2 0 1 1 3054.344
## 144 2 1 2 0 1 2 3055.413
## 149 2 1 2 1 1 1 3055.552
## 155 2 1 2 2 1 1 3055.905
## 156 2 1 2 2 1 2 3057.343
mod_sugerido <- arima(derrama_ts, order = c(2,1,2), seasonal = list(order = c(0,1,1), period = 12), transform.pars = FALSE)
summary(mod_sugerido)
##
## Call:
## arima(x = derrama_ts, order = c(2, 1, 2), seasonal = list(order = c(0, 1, 1),
## period = 12), transform.pars = FALSE)
##
## Coefficients:
## ar1 ar2 ma1 ma2 sma1
## -0.0019 -1.0062 -0.0692 0.9063 -1.0000
## s.e. 0.0066 0.0114 0.0350 0.0279 0.0772
##
## sigma^2 estimated as 17409: log likelihood = -1521.12, aic = 3054.24
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 4.716493 128.4957 73.48511 -2.065164 10.35313 0.6143497
## ACF1
## Training set -0.05029193
checkresiduals(mod_sugerido)
##
## Ljung-Box test
##
## data: Residuals from ARIMA(2,1,2)(0,1,1)[12]
## Q* = 24.764, df = 19, p-value = 0.1685
##
## Model df: 5. Total lags used: 24
#Ljung-Box:
#p-value = 0.1685 > 0.05 → no hay autocorrelación significativa en los residuos.
# Buen indicio de que el modelo capta bien la estructura de la serie
#Captura adecuadamente la tendencia y estacionalidad.
variables_log <- c( "MES", "AÑO",
"Cuartos_Disponibles", "Cuartos_Ocupados", "Cuartos_Registrados", "Derrama_Economica_Est_mdp", "Imp_Hospedaje", "Turistas_Noche_Ext", "Turistas_Noche_Nac", "%Ocupacion_Hoteles", "Llegada_Tur_Ext", "Llegada_Tur_Nac", "Cuartos_Disponibles_Promedio_log", "Densidad_Ocupación_log", "Estadia_Promedio_log"
)
variables_log <- setdiff(variables_log, c("Imp_Hospedaje", "MES", "AÑO"))
for (var in variables_log) {
cat("\n--------------------------------------------------\n")
cat("ADF test for:", var, "\n")
serie <- ts(df_log[[var]], start = c(2004, 1), frequency = 12)
print(adf.test(serie))
}
##
## --------------------------------------------------
## ADF test for: Cuartos_Disponibles
##
## Augmented Dickey-Fuller Test
##
## data: serie
## Dickey-Fuller = -1.5393, Lag order = 6, p-value = 0.7698
## alternative hypothesis: stationary
##
##
## --------------------------------------------------
## ADF test for: Cuartos_Ocupados
##
## Augmented Dickey-Fuller Test
##
## data: serie
## Dickey-Fuller = -2.5579, Lag order = 6, p-value = 0.3409
## alternative hypothesis: stationary
##
##
## --------------------------------------------------
## ADF test for: Cuartos_Registrados
##
## Augmented Dickey-Fuller Test
##
## data: serie
## Dickey-Fuller = -1.5222, Lag order = 6, p-value = 0.777
## alternative hypothesis: stationary
##
##
## --------------------------------------------------
## ADF test for: Derrama_Economica_Est_mdp
##
## Augmented Dickey-Fuller Test
##
## data: serie
## Dickey-Fuller = -1.9306, Lag order = 6, p-value = 0.605
## alternative hypothesis: stationary
##
##
## --------------------------------------------------
## ADF test for: Turistas_Noche_Ext
##
## Augmented Dickey-Fuller Test
##
## data: serie
## Dickey-Fuller = -2.7931, Lag order = 6, p-value = 0.2419
## alternative hypothesis: stationary
##
##
## --------------------------------------------------
## ADF test for: Turistas_Noche_Nac
##
## Augmented Dickey-Fuller Test
##
## data: serie
## Dickey-Fuller = -2.8091, Lag order = 6, p-value = 0.2351
## alternative hypothesis: stationary
##
##
## --------------------------------------------------
## ADF test for: %Ocupacion_Hoteles
##
## Augmented Dickey-Fuller Test
##
## data: serie
## Dickey-Fuller = -2.6893, Lag order = 6, p-value = 0.2856
## alternative hypothesis: stationary
##
##
## --------------------------------------------------
## ADF test for: Llegada_Tur_Ext
##
## Augmented Dickey-Fuller Test
##
## data: serie
## Dickey-Fuller = -3.0551, Lag order = 6, p-value = 0.1315
## alternative hypothesis: stationary
##
##
## --------------------------------------------------
## ADF test for: Llegada_Tur_Nac
##
## Augmented Dickey-Fuller Test
##
## data: serie
## Dickey-Fuller = -2.243, Lag order = 6, p-value = 0.4735
## alternative hypothesis: stationary
##
##
## --------------------------------------------------
## ADF test for: Cuartos_Disponibles_Promedio_log
##
## Augmented Dickey-Fuller Test
##
## data: serie
## Dickey-Fuller = -2.4867, Lag order = 6, p-value = 0.3709
## alternative hypothesis: stationary
##
##
## --------------------------------------------------
## ADF test for: Densidad_Ocupación_log
## Warning in adf.test(serie): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: serie
## Dickey-Fuller = -4.1695, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary
##
##
## --------------------------------------------------
## ADF test for: Estadia_Promedio_log
##
## Augmented Dickey-Fuller Test
##
## data: serie
## Dickey-Fuller = -3.2396, Lag order = 6, p-value = 0.08173
## alternative hypothesis: stationary
series_diferenciadas <- list()
for (var in variables_log) {
serie <- ts(df_log[[var]], start = c(2004, 1), frequency = 12)
adf_result <- tryCatch(adf.test(serie), error = function(e) NULL)
if (!is.null(adf_result) && adf_result$p.value > 0.05) {
# No es estacionaria → aplicar diff y renombrar con _diff
serie_diff <- diff(serie)
series_diferenciadas[[paste0(var, "_diff")]] <- serie_diff
} else {
# Es estacionaria → mantener nombre original (recortada por consistencia)
series_diferenciadas[[var]] <- window(serie, start = c(2004, 2))
}
}
## Warning in adf.test(serie): p-value smaller than printed p-value
# Aplicar la prueba ADF a todas las series diferenciadas
for (nombre in names(series_diferenciadas)) {
cat("\n--------------------------------------------------\n")
cat("ADF test for:", nombre, "\n")
print(adf.test(series_diferenciadas[[nombre]]))
}
##
## --------------------------------------------------
## ADF test for: Cuartos_Disponibles_diff
## Warning in adf.test(series_diferenciadas[[nombre]]): p-value smaller than
## printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: series_diferenciadas[[nombre]]
## Dickey-Fuller = -8.3798, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary
##
##
## --------------------------------------------------
## ADF test for: Cuartos_Ocupados_diff
## Warning in adf.test(series_diferenciadas[[nombre]]): p-value smaller than
## printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: series_diferenciadas[[nombre]]
## Dickey-Fuller = -6.7058, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary
##
##
## --------------------------------------------------
## ADF test for: Cuartos_Registrados_diff
## Warning in adf.test(series_diferenciadas[[nombre]]): p-value smaller than
## printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: series_diferenciadas[[nombre]]
## Dickey-Fuller = -8.2225, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary
##
##
## --------------------------------------------------
## ADF test for: Derrama_Economica_Est_mdp_diff
## Warning in adf.test(series_diferenciadas[[nombre]]): p-value smaller than
## printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: series_diferenciadas[[nombre]]
## Dickey-Fuller = -6.4941, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary
##
##
## --------------------------------------------------
## ADF test for: Turistas_Noche_Ext_diff
## Warning in adf.test(series_diferenciadas[[nombre]]): p-value smaller than
## printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: series_diferenciadas[[nombre]]
## Dickey-Fuller = -6.649, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary
##
##
## --------------------------------------------------
## ADF test for: Turistas_Noche_Nac_diff
## Warning in adf.test(series_diferenciadas[[nombre]]): p-value smaller than
## printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: series_diferenciadas[[nombre]]
## Dickey-Fuller = -7.4223, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary
##
##
## --------------------------------------------------
## ADF test for: %Ocupacion_Hoteles_diff
## Warning in adf.test(series_diferenciadas[[nombre]]): p-value smaller than
## printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: series_diferenciadas[[nombre]]
## Dickey-Fuller = -7.0613, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary
##
##
## --------------------------------------------------
## ADF test for: Llegada_Tur_Ext_diff
## Warning in adf.test(series_diferenciadas[[nombre]]): p-value smaller than
## printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: series_diferenciadas[[nombre]]
## Dickey-Fuller = -6.3763, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary
##
##
## --------------------------------------------------
## ADF test for: Llegada_Tur_Nac_diff
## Warning in adf.test(series_diferenciadas[[nombre]]): p-value smaller than
## printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: series_diferenciadas[[nombre]]
## Dickey-Fuller = -7.367, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary
##
##
## --------------------------------------------------
## ADF test for: Cuartos_Disponibles_Promedio_log_diff
## Warning in adf.test(series_diferenciadas[[nombre]]): p-value smaller than
## printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: series_diferenciadas[[nombre]]
## Dickey-Fuller = -7.6481, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary
##
##
## --------------------------------------------------
## ADF test for: Densidad_Ocupación_log
## Warning in adf.test(series_diferenciadas[[nombre]]): p-value smaller than
## printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: series_diferenciadas[[nombre]]
## Dickey-Fuller = -4.1607, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary
##
##
## --------------------------------------------------
## ADF test for: Estadia_Promedio_log_diff
## Warning in adf.test(series_diferenciadas[[nombre]]): p-value smaller than
## printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: series_diferenciadas[[nombre]]
## Dickey-Fuller = -8.6448, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary
labels(series_diferenciadas)
## [1] "Cuartos_Disponibles_diff"
## [2] "Cuartos_Ocupados_diff"
## [3] "Cuartos_Registrados_diff"
## [4] "Derrama_Economica_Est_mdp_diff"
## [5] "Turistas_Noche_Ext_diff"
## [6] "Turistas_Noche_Nac_diff"
## [7] "%Ocupacion_Hoteles_diff"
## [8] "Llegada_Tur_Ext_diff"
## [9] "Llegada_Tur_Nac_diff"
## [10] "Cuartos_Disponibles_Promedio_log_diff"
## [11] "Densidad_Ocupación_log"
## [12] "Estadia_Promedio_log_diff"
df_log[2, ]
## AÑO MES Cuartos_Disponibles Cuartos_Ocupados Cuartos_Registrados
## 2 2004 2 267473 129500 274195
## Derrama_Economica_Est_mdp Imp_Hospedaje Turistas_Noche_Ext Turistas_Noche_Nac
## 2 345.1886 NA 33262 159212
## %Ocupacion_Hoteles Llegada_Tur_Ext Llegada_Tur_Nac
## 2 0.484161 15841 87704
## Cuartos_Disponibles_Promedio_log Densidad_Ocupación_log Estadia_Promedio_log
## 2 9.120853 0.9107899 1.050417
df_diff <- as.data.frame(series_diferenciadas)
df_diff[1, ]
## Cuartos_Disponibles_diff Cuartos_Ocupados_diff Cuartos_Registrados_diff
## 1 -18418 -5196 -18910
## Derrama_Economica_Est_mdp_diff Turistas_Noche_Ext_diff
## 1 28.67197 -2480
## Turistas_Noche_Nac_diff X.Ocupacion_Hoteles_diff Llegada_Tur_Ext_diff
## 1 -7306 0.01301642 1116
## Llegada_Tur_Nac_diff Cuartos_Disponibles_Promedio_log_diff
## 1 7253 0.0001093673
## Densidad_Ocupación_log Estadia_Promedio_log_diff
## 1 0.9107899 -0.08905393
# 1. Mantener solo MES y AÑO de df_log (recortado)
df_log2 <- df_log[-1, c("MES", "AÑO", "Densidad_Ocupación_log")]
# 2. Eliminar de df_diff las columnas que ya existen en df_log2
cols_existentes <- intersect(names(df_log2), names(df_diff))
df_diff_filtrado <- df_diff[, !(names(df_diff) %in% cols_existentes)]
# 3. Unir MES, AÑO y las series diferenciadas
df_final <- bind_cols(df_log2, df_diff_filtrado)
#aqui inserto el scale?
#df_final
df_final <- df_final[df_final$AÑO >= 2015, ]
correlaciones <- cor(df_final, use = "complete.obs")
round(correlaciones, 2) # para ver mejor los valores
## MES AÑO Densidad_Ocupación_log
## MES 1.00 0.00 0.09
## AÑO 0.00 1.00 0.47
## Densidad_Ocupación_log 0.09 0.47 1.00
## Cuartos_Disponibles_diff 0.15 0.00 0.07
## Cuartos_Ocupados_diff -0.09 0.01 0.00
## Cuartos_Registrados_diff 0.17 0.00 0.07
## Derrama_Economica_Est_mdp_diff -0.10 0.04 0.18
## Turistas_Noche_Ext_diff 0.09 -0.01 0.11
## Turistas_Noche_Nac_diff -0.03 -0.01 0.12
## X.Ocupacion_Hoteles_diff -0.15 0.01 -0.03
## Llegada_Tur_Ext_diff 0.13 -0.01 0.07
## Llegada_Tur_Nac_diff 0.10 0.01 0.10
## Cuartos_Disponibles_Promedio_log_diff 0.12 -0.01 -0.09
## Estadia_Promedio_log_diff -0.29 -0.02 0.04
## Cuartos_Disponibles_diff
## MES 0.15
## AÑO 0.00
## Densidad_Ocupación_log 0.07
## Cuartos_Disponibles_diff 1.00
## Cuartos_Ocupados_diff 0.27
## Cuartos_Registrados_diff 0.99
## Derrama_Economica_Est_mdp_diff 0.24
## Turistas_Noche_Ext_diff 0.14
## Turistas_Noche_Nac_diff 0.30
## X.Ocupacion_Hoteles_diff -0.06
## Llegada_Tur_Ext_diff 0.23
## Llegada_Tur_Nac_diff 0.25
## Cuartos_Disponibles_Promedio_log_diff 0.33
## Estadia_Promedio_log_diff 0.03
## Cuartos_Ocupados_diff
## MES -0.09
## AÑO 0.01
## Densidad_Ocupación_log 0.00
## Cuartos_Disponibles_diff 0.27
## Cuartos_Ocupados_diff 1.00
## Cuartos_Registrados_diff 0.23
## Derrama_Economica_Est_mdp_diff 0.76
## Turistas_Noche_Ext_diff 0.55
## Turistas_Noche_Nac_diff 0.90
## X.Ocupacion_Hoteles_diff 0.94
## Llegada_Tur_Ext_diff 0.54
## Llegada_Tur_Nac_diff 0.86
## Cuartos_Disponibles_Promedio_log_diff 0.27
## Estadia_Promedio_log_diff -0.06
## Cuartos_Registrados_diff
## MES 0.17
## AÑO 0.00
## Densidad_Ocupación_log 0.07
## Cuartos_Disponibles_diff 0.99
## Cuartos_Ocupados_diff 0.23
## Cuartos_Registrados_diff 1.00
## Derrama_Economica_Est_mdp_diff 0.22
## Turistas_Noche_Ext_diff 0.11
## Turistas_Noche_Nac_diff 0.28
## X.Ocupacion_Hoteles_diff -0.10
## Llegada_Tur_Ext_diff 0.20
## Llegada_Tur_Nac_diff 0.23
## Cuartos_Disponibles_Promedio_log_diff 0.27
## Estadia_Promedio_log_diff 0.02
## Derrama_Economica_Est_mdp_diff
## MES -0.10
## AÑO 0.04
## Densidad_Ocupación_log 0.18
## Cuartos_Disponibles_diff 0.24
## Cuartos_Ocupados_diff 0.76
## Cuartos_Registrados_diff 0.22
## Derrama_Economica_Est_mdp_diff 1.00
## Turistas_Noche_Ext_diff 0.45
## Turistas_Noche_Nac_diff 0.85
## X.Ocupacion_Hoteles_diff 0.69
## Llegada_Tur_Ext_diff 0.37
## Llegada_Tur_Nac_diff 0.74
## Cuartos_Disponibles_Promedio_log_diff 0.18
## Estadia_Promedio_log_diff 0.15
## Turistas_Noche_Ext_diff
## MES 0.09
## AÑO -0.01
## Densidad_Ocupación_log 0.11
## Cuartos_Disponibles_diff 0.14
## Cuartos_Ocupados_diff 0.55
## Cuartos_Registrados_diff 0.11
## Derrama_Economica_Est_mdp_diff 0.45
## Turistas_Noche_Ext_diff 1.00
## Turistas_Noche_Nac_diff 0.49
## X.Ocupacion_Hoteles_diff 0.52
## Llegada_Tur_Ext_diff 0.89
## Llegada_Tur_Nac_diff 0.44
## Cuartos_Disponibles_Promedio_log_diff 0.13
## Estadia_Promedio_log_diff -0.07
## Turistas_Noche_Nac_diff
## MES -0.03
## AÑO -0.01
## Densidad_Ocupación_log 0.12
## Cuartos_Disponibles_diff 0.30
## Cuartos_Ocupados_diff 0.90
## Cuartos_Registrados_diff 0.28
## Derrama_Economica_Est_mdp_diff 0.85
## Turistas_Noche_Ext_diff 0.49
## Turistas_Noche_Nac_diff 1.00
## X.Ocupacion_Hoteles_diff 0.81
## Llegada_Tur_Ext_diff 0.43
## Llegada_Tur_Nac_diff 0.91
## Cuartos_Disponibles_Promedio_log_diff 0.23
## Estadia_Promedio_log_diff 0.11
## X.Ocupacion_Hoteles_diff
## MES -0.15
## AÑO 0.01
## Densidad_Ocupación_log -0.03
## Cuartos_Disponibles_diff -0.06
## Cuartos_Ocupados_diff 0.94
## Cuartos_Registrados_diff -0.10
## Derrama_Economica_Est_mdp_diff 0.69
## Turistas_Noche_Ext_diff 0.52
## Turistas_Noche_Nac_diff 0.81
## X.Ocupacion_Hoteles_diff 1.00
## Llegada_Tur_Ext_diff 0.47
## Llegada_Tur_Nac_diff 0.79
## Cuartos_Disponibles_Promedio_log_diff 0.17
## Estadia_Promedio_log_diff -0.07
## Llegada_Tur_Ext_diff Llegada_Tur_Nac_diff
## MES 0.13 0.10
## AÑO -0.01 0.01
## Densidad_Ocupación_log 0.07 0.10
## Cuartos_Disponibles_diff 0.23 0.25
## Cuartos_Ocupados_diff 0.54 0.86
## Cuartos_Registrados_diff 0.20 0.23
## Derrama_Economica_Est_mdp_diff 0.37 0.74
## Turistas_Noche_Ext_diff 0.89 0.44
## Turistas_Noche_Nac_diff 0.43 0.91
## X.Ocupacion_Hoteles_diff 0.47 0.79
## Llegada_Tur_Ext_diff 1.00 0.45
## Llegada_Tur_Nac_diff 0.45 1.00
## Cuartos_Disponibles_Promedio_log_diff 0.13 0.20
## Estadia_Promedio_log_diff -0.29 -0.21
## Cuartos_Disponibles_Promedio_log_diff
## MES 0.12
## AÑO -0.01
## Densidad_Ocupación_log -0.09
## Cuartos_Disponibles_diff 0.33
## Cuartos_Ocupados_diff 0.27
## Cuartos_Registrados_diff 0.27
## Derrama_Economica_Est_mdp_diff 0.18
## Turistas_Noche_Ext_diff 0.13
## Turistas_Noche_Nac_diff 0.23
## X.Ocupacion_Hoteles_diff 0.17
## Llegada_Tur_Ext_diff 0.13
## Llegada_Tur_Nac_diff 0.20
## Cuartos_Disponibles_Promedio_log_diff 1.00
## Estadia_Promedio_log_diff 0.07
## Estadia_Promedio_log_diff
## MES -0.29
## AÑO -0.02
## Densidad_Ocupación_log 0.04
## Cuartos_Disponibles_diff 0.03
## Cuartos_Ocupados_diff -0.06
## Cuartos_Registrados_diff 0.02
## Derrama_Economica_Est_mdp_diff 0.15
## Turistas_Noche_Ext_diff -0.07
## Turistas_Noche_Nac_diff 0.11
## X.Ocupacion_Hoteles_diff -0.07
## Llegada_Tur_Ext_diff -0.29
## Llegada_Tur_Nac_diff -0.21
## Cuartos_Disponibles_Promedio_log_diff 0.07
## Estadia_Promedio_log_diff 1.00
corrplot(correlaciones, method = "color", type = "upper", tl.cex = 0.7)
library(caret)
## Loading required package: lattice
# Detectar columnas con alta correlación
cor_matriz <- cor(df_final, use = "complete.obs")
columnas_a_remover <- findCorrelation(cor_matriz, cutoff = 0.9)
# Ver nombres de columnas altamente correlacionadas
names(df_final)[columnas_a_remover]
## [1] "Cuartos_Ocupados_diff" "Turistas_Noche_Nac_diff"
## [3] "Cuartos_Disponibles_diff"
sum(is.na(df_final$Derrama_Económica_Est_mdp_diff))
## [1] 0
which(is.na(df_final$Derrama_Económica_Est_mdp_diff))
## integer(0)
y <- ts(df_final$Derrama_Economica_Est_mdp, start = c(2015, 1), frequency = 12)
#colnames(df_final)
variables_explicativas <- c(
"Turistas_Noche_Ext_diff", "X.Ocupacion_Hoteles_diff",
"Cuartos_Disponibles_Promedio_log_diff", "Estadia_Promedio_log_diff",
"Cuartos_Registrados_diff", "Llegada_Tur_Nac_diff", "Densidad_Ocupación_log"
)
#quitar por "Cuartos_Ocupados_diff" "Turistas_Noche_Nac_diff" "Cuartos_Disponibles_diff"
# Se elimina 'Llegada_Tur_Ext_diff' por baja significancia estadística en el modelo SARIMAX y alto VIF (> 6)
df_mod <- dplyr::select(df_final, any_of(variables_explicativas))
df_mod<- scale(df_mod)
df_mod<-as.data.frame(df_mod)
colnames(df_mod) <- variables_explicativas
df_xreg <- as.matrix(df_mod)
str(df_xreg) # debe ser matriz
## num [1:120, 1:7] -0.1382 -0.4421 0.3212 -0.0441 0.6258 ...
## - attr(*, "dimnames")=List of 2
## ..$ : chr [1:120] "132" "133" "134" "135" ...
## ..$ : chr [1:7] "Turistas_Noche_Ext_diff" "X.Ocupacion_Hoteles_diff" "Cuartos_Disponibles_Promedio_log_diff" "Estadia_Promedio_log_diff" ...
is.matrix(df_xreg) # debe ser TRUE
## [1] TRUE
nrow(df_xreg) == length(y)
## [1] TRUE
modelo_auto <- auto.arima(y,
xreg = df_xreg,
seasonal = TRUE,
stepwise = FALSE, # más preciso pero más lento
approximation = FALSE) # evita simplificaciones
summary(modelo_auto)
## Series: y
## Regression with ARIMA(1,0,0) errors
##
## Coefficients:
## ar1 Turistas_Noche_Ext_diff X.Ocupacion_Hoteles_diff
## -0.1414 22.6080 57.2796
## s.e. 0.0919 14.8124 25.2778
## Cuartos_Disponibles_Promedio_log_diff Estadia_Promedio_log_diff
## -3.6413 63.5477
## s.e. 12.6979 12.3166
## Cuartos_Registrados_diff Llegada_Tur_Nac_diff Densidad_Ocupación_log
## 21.6393 121.1275 22.4672
## s.e. 16.1136 24.5629 10.9122
##
## sigma^2 = 17283: log likelihood = -751.59
## AIC=1521.18 AICc=1522.82 BIC=1546.27
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 13.69782 127.0059 66.73884 -122.2026 165.0345 0.3852888
## ACF1
## Training set -0.01119577
checkresiduals(modelo_auto)
##
## Ljung-Box test
##
## data: Residuals from Regression with ARIMA(1,0,0) errors
## Q* = 10.121, df = 23, p-value = 0.9905
##
## Model df: 1. Total lags used: 24
df_xreg <- as.matrix(df_mod)
modelo_sarimax1 <- arima(y,
order = c(2, 1, 2),
seasonal = list(order = c(0, 1, 1), period = 12),
xreg = df_xreg)
summary(modelo_sarimax1)
##
## Call:
## arima(x = y, order = c(2, 1, 2), seasonal = list(order = c(0, 1, 1), period = 12),
## xreg = df_xreg)
##
## Coefficients:
## ar1 ar2 ma1 ma2 sma1 Turistas_Noche_Ext_diff
## -0.4693 0.0395 -0.6480 -0.3520 -0.7573 26.4362
## s.e. 0.6245 0.1460 0.6197 0.6185 0.0997 14.9165
## X.Ocupacion_Hoteles_diff Cuartos_Disponibles_Promedio_log_diff
## 35.1200 -6.2700
## s.e. 33.8893 24.0422
## Estadia_Promedio_log_diff Cuartos_Registrados_diff Llegada_Tur_Nac_diff
## 51.2862 26.6755 147.8364
## s.e. 14.4874 58.7853 32.9268
## Densidad_Ocupación_log
## 27.6836
## s.e. 13.5786
##
## sigma^2 estimated as 17936: log likelihood = -684.3, aic = 1394.6
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 3.173671 126.4641 63.74363 -882.4353 947.4504 0.2558476
## ACF1
## Training set -0.01119028
checkresiduals(modelo_sarimax1)
##
## Ljung-Box test
##
## data: Residuals from ARIMA(2,1,2)(0,1,1)[12]
## Q* = 11.514, df = 19, p-value = 0.9053
##
## Model df: 5. Total lags used: 24
# Extraer los coeficientes del modelo
coeficientes <- coef(modelo_sarimax1)
# Ordenar los coeficientes de mayor a menor valor absoluto
coef_ordenados <- sort(coeficientes, decreasing = TRUE)
# Mostrar la lista ordenada
print(coef_ordenados)
## Llegada_Tur_Nac_diff Estadia_Promedio_log_diff
## 147.83636835 51.28616856
## X.Ocupacion_Hoteles_diff Densidad_Ocupación_log
## 35.11997364 27.68356139
## Cuartos_Registrados_diff Turistas_Noche_Ext_diff
## 26.67553838 26.43620005
## ar2 ma2
## 0.03947154 -0.35203585
## ar1 ma1
## -0.46926976 -0.64796092
## sma1 Cuartos_Disponibles_Promedio_log_diff
## -0.75730834 -6.27001640
colnames(modelo_sarimax1$xreg) # debe darte las 7 columnas
## NULL
# Ordenar por valor absoluto
coef_ordenados_abs <- coeficientes[order(abs(coeficientes), decreasing = TRUE)]
# Mostrar la lista ordenada por valor absoluto
print(coef_ordenados_abs)
## Llegada_Tur_Nac_diff Estadia_Promedio_log_diff
## 147.83636835 51.28616856
## X.Ocupacion_Hoteles_diff Densidad_Ocupación_log
## 35.11997364 27.68356139
## Cuartos_Registrados_diff Turistas_Noche_Ext_diff
## 26.67553838 26.43620005
## Cuartos_Disponibles_Promedio_log_diff sma1
## -6.27001640 -0.75730834
## ma1 ar1
## -0.64796092 -0.46926976
## ma2 ar2
## -0.35203585 0.03947154
var_data <- cbind(
y, # variable dependiente diferenciada ->Derrama_Economica_Est_mdp_diff
df_mod # regresores ya diferenciados
)
# Convertir a formato ts
var_data_ts <- ts(var_data, start = c(2015,1), frequency = 12)
lag_selection <-VARselect(var_data_ts, lag.max = 12, type = "const")
print(lag_selection$selection)
## AIC(n) HQ(n) SC(n) FPE(n)
## 12 12 1 12
optimal_lag <- lag_selection$selection["AIC(n)"]
colnames(var_data_ts)
## [1] "y"
## [2] "df_mod.Turistas_Noche_Ext_diff"
## [3] "df_mod.X.Ocupacion_Hoteles_diff"
## [4] "df_mod.Cuartos_Disponibles_Promedio_log_diff"
## [5] "df_mod.Estadia_Promedio_log_diff"
## [6] "df_mod.Cuartos_Registrados_diff"
## [7] "df_mod.Llegada_Tur_Nac_diff"
## [8] "df_mod.Densidad_Ocupación_log"
print(colnames(var_data_ts))
## [1] "y"
## [2] "df_mod.Turistas_Noche_Ext_diff"
## [3] "df_mod.X.Ocupacion_Hoteles_diff"
## [4] "df_mod.Cuartos_Disponibles_Promedio_log_diff"
## [5] "df_mod.Estadia_Promedio_log_diff"
## [6] "df_mod.Cuartos_Registrados_diff"
## [7] "df_mod.Llegada_Tur_Nac_diff"
## [8] "df_mod.Densidad_Ocupación_log"
modelo_var <- VAR(var_data_ts, p = 2 , type = "const")
summary(modelo_var)
##
## VAR Estimation Results:
## =========================
## Endogenous variables: y, df_mod.Turistas_Noche_Ext_diff, df_mod.X.Ocupacion_Hoteles_diff, df_mod.Cuartos_Disponibles_Promedio_log_diff, df_mod.Estadia_Promedio_log_diff, df_mod.Cuartos_Registrados_diff, df_mod.Llegada_Tur_Nac_diff, df_mod.Densidad_Ocupación_log
## Deterministic variables: const
## Sample size: 118
## Log Likelihood: -1452.622
## Roots of the characteristic polynomial:
## 0.9181 0.7448 0.7448 0.6608 0.6608 0.6601 0.6601 0.5684 0.5684 0.5372 0.449 0.449 0.4268 0.3926 0.3926 0.1518
## Call:
## VAR(y = var_data_ts, p = 2, type = "const")
##
##
## Estimation results for equation y:
## ==================================
## y = y.l1 + df_mod.Turistas_Noche_Ext_diff.l1 + df_mod.X.Ocupacion_Hoteles_diff.l1 + df_mod.Cuartos_Disponibles_Promedio_log_diff.l1 + df_mod.Estadia_Promedio_log_diff.l1 + df_mod.Cuartos_Registrados_diff.l1 + df_mod.Llegada_Tur_Nac_diff.l1 + df_mod.Densidad_Ocupación_log.l1 + y.l2 + df_mod.Turistas_Noche_Ext_diff.l2 + df_mod.X.Ocupacion_Hoteles_diff.l2 + df_mod.Cuartos_Disponibles_Promedio_log_diff.l2 + df_mod.Estadia_Promedio_log_diff.l2 + df_mod.Cuartos_Registrados_diff.l2 + df_mod.Llegada_Tur_Nac_diff.l2 + df_mod.Densidad_Ocupación_log.l2 + const
##
## Estimate Std. Error t value
## y.l1 -0.05002 0.14882 -0.336
## df_mod.Turistas_Noche_Ext_diff.l1 9.81700 30.27907 0.324
## df_mod.X.Ocupacion_Hoteles_diff.l1 33.54755 61.84128 0.542
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l1 20.36902 24.32815 0.837
## df_mod.Estadia_Promedio_log_diff.l1 -17.24789 29.20953 -0.590
## df_mod.Cuartos_Registrados_diff.l1 -75.57681 39.35969 -1.920
## df_mod.Llegada_Tur_Nac_diff.l1 -58.25172 62.50863 -0.932
## df_mod.Densidad_Ocupación_log.l1 17.53137 55.85365 0.314
## y.l2 -0.16953 0.14623 -1.159
## df_mod.Turistas_Noche_Ext_diff.l2 -55.42984 25.77825 -2.150
## df_mod.X.Ocupacion_Hoteles_diff.l2 87.99856 46.16892 1.906
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l2 -2.52216 22.19049 -0.114
## df_mod.Estadia_Promedio_log_diff.l2 -58.58740 22.09072 -2.652
## df_mod.Cuartos_Registrados_diff.l2 -21.63811 40.93749 -0.529
## df_mod.Llegada_Tur_Nac_diff.l2 -90.52716 50.31616 -1.799
## df_mod.Densidad_Ocupación_log.l2 20.66233 53.92195 0.383
## const 14.28693 18.43296 0.775
## Pr(>|t|)
## y.l1 0.73746
## df_mod.Turistas_Noche_Ext_diff.l1 0.74644
## df_mod.X.Ocupacion_Hoteles_diff.l1 0.58868
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l1 0.40442
## df_mod.Estadia_Promedio_log_diff.l1 0.55618
## df_mod.Cuartos_Registrados_diff.l1 0.05766 .
## df_mod.Llegada_Tur_Nac_diff.l1 0.35361
## df_mod.Densidad_Ocupación_log.l1 0.75426
## y.l2 0.24906
## df_mod.Turistas_Noche_Ext_diff.l2 0.03392 *
## df_mod.X.Ocupacion_Hoteles_diff.l2 0.05949 .
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l2 0.90973
## df_mod.Estadia_Promedio_log_diff.l2 0.00929 **
## df_mod.Cuartos_Registrados_diff.l2 0.59827
## df_mod.Llegada_Tur_Nac_diff.l2 0.07498 .
## df_mod.Densidad_Ocupación_log.l2 0.70238
## const 0.44011
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## Residual standard error: 197.7 on 101 degrees of freedom
## Multiple R-Squared: 0.3593, Adjusted R-squared: 0.2578
## F-statistic: 3.54 on 16 and 101 DF, p-value: 4.879e-05
##
##
## Estimation results for equation df_mod.Turistas_Noche_Ext_diff:
## ===============================================================
## df_mod.Turistas_Noche_Ext_diff = y.l1 + df_mod.Turistas_Noche_Ext_diff.l1 + df_mod.X.Ocupacion_Hoteles_diff.l1 + df_mod.Cuartos_Disponibles_Promedio_log_diff.l1 + df_mod.Estadia_Promedio_log_diff.l1 + df_mod.Cuartos_Registrados_diff.l1 + df_mod.Llegada_Tur_Nac_diff.l1 + df_mod.Densidad_Ocupación_log.l1 + y.l2 + df_mod.Turistas_Noche_Ext_diff.l2 + df_mod.X.Ocupacion_Hoteles_diff.l2 + df_mod.Cuartos_Disponibles_Promedio_log_diff.l2 + df_mod.Estadia_Promedio_log_diff.l2 + df_mod.Cuartos_Registrados_diff.l2 + df_mod.Llegada_Tur_Nac_diff.l2 + df_mod.Densidad_Ocupación_log.l2 + const
##
## Estimate Std. Error t value
## y.l1 0.0001017 0.0006742 0.151
## df_mod.Turistas_Noche_Ext_diff.l1 -0.4295308 0.1371792 -3.131
## df_mod.X.Ocupacion_Hoteles_diff.l1 0.6524279 0.2801716 2.329
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l1 0.1472701 0.1102185 1.336
## df_mod.Estadia_Promedio_log_diff.l1 -0.1451311 0.1323336 -1.097
## df_mod.Cuartos_Registrados_diff.l1 0.1411626 0.1783189 0.792
## df_mod.Llegada_Tur_Nac_diff.l1 -0.4352172 0.2831950 -1.537
## df_mod.Densidad_Ocupación_log.l1 0.2047211 0.2530447 0.809
## y.l2 -0.0002312 0.0006625 -0.349
## df_mod.Turistas_Noche_Ext_diff.l2 -0.1644198 0.1167882 -1.408
## df_mod.X.Ocupacion_Hoteles_diff.l2 0.2910355 0.2091680 1.391
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l2 -0.2669448 0.1005339 -2.655
## df_mod.Estadia_Promedio_log_diff.l2 -0.0736970 0.1000819 -0.736
## df_mod.Cuartos_Registrados_diff.l2 0.2134988 0.1854671 1.151
## df_mod.Llegada_Tur_Nac_diff.l2 -0.3104334 0.2279571 -1.362
## df_mod.Densidad_Ocupación_log.l2 -0.1431480 0.2442931 -0.586
## const 0.0044344 0.0835104 0.053
## Pr(>|t|)
## y.l1 0.88036
## df_mod.Turistas_Noche_Ext_diff.l1 0.00228 **
## df_mod.X.Ocupacion_Hoteles_diff.l1 0.02187 *
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l1 0.18450
## df_mod.Estadia_Promedio_log_diff.l1 0.27538
## df_mod.Cuartos_Registrados_diff.l1 0.43043
## df_mod.Llegada_Tur_Nac_diff.l1 0.12747
## df_mod.Densidad_Ocupación_log.l1 0.42040
## y.l2 0.72788
## df_mod.Turistas_Noche_Ext_diff.l2 0.16225
## df_mod.X.Ocupacion_Hoteles_diff.l2 0.16716
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l2 0.00921 **
## df_mod.Estadia_Promedio_log_diff.l2 0.46321
## df_mod.Cuartos_Registrados_diff.l2 0.25239
## df_mod.Llegada_Tur_Nac_diff.l2 0.17629
## df_mod.Densidad_Ocupación_log.l2 0.55920
## const 0.95776
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## Residual standard error: 0.8959 on 101 degrees of freedom
## Multiple R-Squared: 0.3176, Adjusted R-squared: 0.2095
## F-statistic: 2.938 on 16 and 101 DF, p-value: 0.0005279
##
##
## Estimation results for equation df_mod.X.Ocupacion_Hoteles_diff:
## ================================================================
## df_mod.X.Ocupacion_Hoteles_diff = y.l1 + df_mod.Turistas_Noche_Ext_diff.l1 + df_mod.X.Ocupacion_Hoteles_diff.l1 + df_mod.Cuartos_Disponibles_Promedio_log_diff.l1 + df_mod.Estadia_Promedio_log_diff.l1 + df_mod.Cuartos_Registrados_diff.l1 + df_mod.Llegada_Tur_Nac_diff.l1 + df_mod.Densidad_Ocupación_log.l1 + y.l2 + df_mod.Turistas_Noche_Ext_diff.l2 + df_mod.X.Ocupacion_Hoteles_diff.l2 + df_mod.Cuartos_Disponibles_Promedio_log_diff.l2 + df_mod.Estadia_Promedio_log_diff.l2 + df_mod.Cuartos_Registrados_diff.l2 + df_mod.Llegada_Tur_Nac_diff.l2 + df_mod.Densidad_Ocupación_log.l2 + const
##
## Estimate Std. Error t value
## y.l1 0.0003040 0.0006585 0.462
## df_mod.Turistas_Noche_Ext_diff.l1 -0.0567689 0.1339721 -0.424
## df_mod.X.Ocupacion_Hoteles_diff.l1 0.2454273 0.2736215 0.897
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l1 -0.0523090 0.1076418 -0.486
## df_mod.Estadia_Promedio_log_diff.l1 -0.1266084 0.1292398 -0.980
## df_mod.Cuartos_Registrados_diff.l1 0.0325329 0.1741500 0.187
## df_mod.Llegada_Tur_Nac_diff.l1 -0.3582105 0.2765743 -1.295
## df_mod.Densidad_Ocupación_log.l1 0.1208923 0.2471288 0.489
## y.l2 -0.0006325 0.0006470 -0.978
## df_mod.Turistas_Noche_Ext_diff.l2 -0.1282040 0.1140579 -1.124
## df_mod.X.Ocupacion_Hoteles_diff.l2 -0.1960909 0.2042779 -0.960
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l2 -0.1786048 0.0981835 -1.819
## df_mod.Estadia_Promedio_log_diff.l2 -0.1850295 0.0977421 -1.893
## df_mod.Cuartos_Registrados_diff.l2 0.1411601 0.1811311 0.779
## df_mod.Llegada_Tur_Nac_diff.l2 0.0291417 0.2226277 0.131
## df_mod.Densidad_Ocupación_log.l2 0.0267599 0.2385818 0.112
## const -0.0045253 0.0815580 -0.055
## Pr(>|t|)
## y.l1 0.6453
## df_mod.Turistas_Noche_Ext_diff.l1 0.6727
## df_mod.X.Ocupacion_Hoteles_diff.l1 0.3719
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l1 0.6281
## df_mod.Estadia_Promedio_log_diff.l1 0.3296
## df_mod.Cuartos_Registrados_diff.l1 0.8522
## df_mod.Llegada_Tur_Nac_diff.l1 0.1982
## df_mod.Densidad_Ocupación_log.l1 0.6258
## y.l2 0.3306
## df_mod.Turistas_Noche_Ext_diff.l2 0.2637
## df_mod.X.Ocupacion_Hoteles_diff.l2 0.3394
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l2 0.0719 .
## df_mod.Estadia_Promedio_log_diff.l2 0.0612 .
## df_mod.Cuartos_Registrados_diff.l2 0.4376
## df_mod.Llegada_Tur_Nac_diff.l2 0.8961
## df_mod.Densidad_Ocupación_log.l2 0.9109
## const 0.9559
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## Residual standard error: 0.8749 on 101 degrees of freedom
## Multiple R-Squared: 0.3219, Adjusted R-squared: 0.2145
## F-statistic: 2.996 on 16 and 101 DF, p-value: 0.0004188
##
##
## Estimation results for equation df_mod.Cuartos_Disponibles_Promedio_log_diff:
## =============================================================================
## df_mod.Cuartos_Disponibles_Promedio_log_diff = y.l1 + df_mod.Turistas_Noche_Ext_diff.l1 + df_mod.X.Ocupacion_Hoteles_diff.l1 + df_mod.Cuartos_Disponibles_Promedio_log_diff.l1 + df_mod.Estadia_Promedio_log_diff.l1 + df_mod.Cuartos_Registrados_diff.l1 + df_mod.Llegada_Tur_Nac_diff.l1 + df_mod.Densidad_Ocupación_log.l1 + y.l2 + df_mod.Turistas_Noche_Ext_diff.l2 + df_mod.X.Ocupacion_Hoteles_diff.l2 + df_mod.Cuartos_Disponibles_Promedio_log_diff.l2 + df_mod.Estadia_Promedio_log_diff.l2 + df_mod.Cuartos_Registrados_diff.l2 + df_mod.Llegada_Tur_Nac_diff.l2 + df_mod.Densidad_Ocupación_log.l2 + const
##
## Estimate Std. Error t value
## y.l1 -0.0001720 0.0007607 -0.226
## df_mod.Turistas_Noche_Ext_diff.l1 0.0883128 0.1547821 0.571
## df_mod.X.Ocupacion_Hoteles_diff.l1 0.0984947 0.3161234 0.312
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l1 0.0089289 0.1243618 0.072
## df_mod.Estadia_Promedio_log_diff.l1 0.0673797 0.1493147 0.451
## df_mod.Cuartos_Registrados_diff.l1 -0.1569981 0.2012008 -0.780
## df_mod.Llegada_Tur_Nac_diff.l1 -0.1080665 0.3195347 -0.338
## df_mod.Densidad_Ocupación_log.l1 -0.3284221 0.2855155 -1.150
## y.l2 -0.0005744 0.0007475 -0.768
## df_mod.Turistas_Noche_Ext_diff.l2 0.1783384 0.1317746 1.353
## df_mod.X.Ocupacion_Hoteles_diff.l2 -0.1508551 0.2360086 -0.639
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l2 -0.0402611 0.1134344 -0.355
## df_mod.Estadia_Promedio_log_diff.l2 0.0433497 0.1129245 0.384
## df_mod.Cuartos_Registrados_diff.l2 -0.4040944 0.2092663 -1.931
## df_mod.Llegada_Tur_Nac_diff.l2 0.3760009 0.2572087 1.462
## df_mod.Densidad_Ocupación_log.l2 0.2886107 0.2756409 1.047
## const 0.0135229 0.0942265 0.144
## Pr(>|t|)
## y.l1 0.8215
## df_mod.Turistas_Noche_Ext_diff.l1 0.5696
## df_mod.X.Ocupacion_Hoteles_diff.l1 0.7560
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l1 0.9429
## df_mod.Estadia_Promedio_log_diff.l1 0.6528
## df_mod.Cuartos_Registrados_diff.l1 0.4370
## df_mod.Llegada_Tur_Nac_diff.l1 0.7359
## df_mod.Densidad_Ocupación_log.l1 0.2527
## y.l2 0.4440
## df_mod.Turistas_Noche_Ext_diff.l2 0.1790
## df_mod.X.Ocupacion_Hoteles_diff.l2 0.5241
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l2 0.7234
## df_mod.Estadia_Promedio_log_diff.l2 0.7019
## df_mod.Cuartos_Registrados_diff.l2 0.0563 .
## df_mod.Llegada_Tur_Nac_diff.l2 0.1469
## df_mod.Densidad_Ocupación_log.l2 0.2976
## const 0.8862
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## Residual standard error: 1.011 on 101 degrees of freedom
## Multiple R-Squared: 0.1325, Adjusted R-squared: -0.00493
## F-statistic: 0.9641 on 16 and 101 DF, p-value: 0.501
##
##
## Estimation results for equation df_mod.Estadia_Promedio_log_diff:
## =================================================================
## df_mod.Estadia_Promedio_log_diff = y.l1 + df_mod.Turistas_Noche_Ext_diff.l1 + df_mod.X.Ocupacion_Hoteles_diff.l1 + df_mod.Cuartos_Disponibles_Promedio_log_diff.l1 + df_mod.Estadia_Promedio_log_diff.l1 + df_mod.Cuartos_Registrados_diff.l1 + df_mod.Llegada_Tur_Nac_diff.l1 + df_mod.Densidad_Ocupación_log.l1 + y.l2 + df_mod.Turistas_Noche_Ext_diff.l2 + df_mod.X.Ocupacion_Hoteles_diff.l2 + df_mod.Cuartos_Disponibles_Promedio_log_diff.l2 + df_mod.Estadia_Promedio_log_diff.l2 + df_mod.Cuartos_Registrados_diff.l2 + df_mod.Llegada_Tur_Nac_diff.l2 + df_mod.Densidad_Ocupación_log.l2 + const
##
## Estimate Std. Error t value
## y.l1 3.005e-04 7.091e-04 0.424
## df_mod.Turistas_Noche_Ext_diff.l1 -8.462e-03 1.443e-01 -0.059
## df_mod.X.Ocupacion_Hoteles_diff.l1 2.869e-02 2.947e-01 0.097
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l1 -6.006e-03 1.159e-01 -0.052
## df_mod.Estadia_Promedio_log_diff.l1 -1.119e-01 1.392e-01 -0.804
## df_mod.Cuartos_Registrados_diff.l1 -1.312e-01 1.876e-01 -0.700
## df_mod.Llegada_Tur_Nac_diff.l1 -3.814e-01 2.979e-01 -1.280
## df_mod.Densidad_Ocupación_log.l1 -4.999e-03 2.661e-01 -0.019
## y.l2 3.829e-05 6.968e-04 0.055
## df_mod.Turistas_Noche_Ext_diff.l2 -1.425e-01 1.228e-01 -1.160
## df_mod.X.Ocupacion_Hoteles_diff.l2 5.248e-01 2.200e-01 2.385
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l2 2.231e-02 1.057e-01 0.211
## df_mod.Estadia_Promedio_log_diff.l2 -2.886e-01 1.053e-01 -2.742
## df_mod.Cuartos_Registrados_diff.l2 -2.669e-01 1.951e-01 -1.368
## df_mod.Llegada_Tur_Nac_diff.l2 -3.308e-01 2.398e-01 -1.380
## df_mod.Densidad_Ocupación_log.l2 -8.990e-02 2.569e-01 -0.350
## const -1.537e-02 8.783e-02 -0.175
## Pr(>|t|)
## y.l1 0.67267
## df_mod.Turistas_Noche_Ext_diff.l1 0.95335
## df_mod.X.Ocupacion_Hoteles_diff.l1 0.92263
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l1 0.95878
## df_mod.Estadia_Promedio_log_diff.l1 0.42348
## df_mod.Cuartos_Registrados_diff.l1 0.48581
## df_mod.Llegada_Tur_Nac_diff.l1 0.20333
## df_mod.Densidad_Ocupación_log.l1 0.98505
## y.l2 0.95629
## df_mod.Turistas_Noche_Ext_diff.l2 0.24890
## df_mod.X.Ocupacion_Hoteles_diff.l2 0.01893 *
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l2 0.83329
## df_mod.Estadia_Promedio_log_diff.l2 0.00723 **
## df_mod.Cuartos_Registrados_diff.l2 0.17435
## df_mod.Llegada_Tur_Nac_diff.l2 0.17077
## df_mod.Densidad_Ocupación_log.l2 0.72717
## const 0.86146
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## Residual standard error: 0.9422 on 101 degrees of freedom
## Multiple R-Squared: 0.2333, Adjusted R-squared: 0.1118
## F-statistic: 1.92 on 16 and 101 DF, p-value: 0.02664
##
##
## Estimation results for equation df_mod.Cuartos_Registrados_diff:
## ================================================================
## df_mod.Cuartos_Registrados_diff = y.l1 + df_mod.Turistas_Noche_Ext_diff.l1 + df_mod.X.Ocupacion_Hoteles_diff.l1 + df_mod.Cuartos_Disponibles_Promedio_log_diff.l1 + df_mod.Estadia_Promedio_log_diff.l1 + df_mod.Cuartos_Registrados_diff.l1 + df_mod.Llegada_Tur_Nac_diff.l1 + df_mod.Densidad_Ocupación_log.l1 + y.l2 + df_mod.Turistas_Noche_Ext_diff.l2 + df_mod.X.Ocupacion_Hoteles_diff.l2 + df_mod.Cuartos_Disponibles_Promedio_log_diff.l2 + df_mod.Estadia_Promedio_log_diff.l2 + df_mod.Cuartos_Registrados_diff.l2 + df_mod.Llegada_Tur_Nac_diff.l2 + df_mod.Densidad_Ocupación_log.l2 + const
##
## Estimate Std. Error t value
## y.l1 -0.0003475 0.0004370 -0.795
## df_mod.Turistas_Noche_Ext_diff.l1 0.0803960 0.0889241 0.904
## df_mod.X.Ocupacion_Hoteles_diff.l1 -0.1182697 0.1816165 -0.651
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l1 0.3737593 0.0714473 5.231
## df_mod.Estadia_Promedio_log_diff.l1 -0.0709077 0.0857830 -0.827
## df_mod.Cuartos_Registrados_diff.l1 -1.1227338 0.1155922 -9.713
## df_mod.Llegada_Tur_Nac_diff.l1 0.2280838 0.1835764 1.242
## df_mod.Densidad_Ocupación_log.l1 0.1139350 0.1640319 0.695
## y.l2 0.0002265 0.0004295 0.527
## df_mod.Turistas_Noche_Ext_diff.l2 0.0096331 0.0757060 0.127
## df_mod.X.Ocupacion_Hoteles_diff.l2 0.2537447 0.1355896 1.871
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l2 0.0714770 0.0651694 1.097
## df_mod.Estadia_Promedio_log_diff.l2 0.0686445 0.0648764 1.058
## df_mod.Cuartos_Registrados_diff.l2 -0.4908386 0.1202259 -4.083
## df_mod.Llegada_Tur_Nac_diff.l2 0.0194906 0.1477693 0.132
## df_mod.Densidad_Ocupación_log.l2 -0.1481316 0.1583589 -0.935
## const 0.0045826 0.0541342 0.085
## Pr(>|t|)
## y.l1 0.4284
## df_mod.Turistas_Noche_Ext_diff.l1 0.3681
## df_mod.X.Ocupacion_Hoteles_diff.l1 0.5164
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l1 9.15e-07 ***
## df_mod.Estadia_Promedio_log_diff.l1 0.4104
## df_mod.Cuartos_Registrados_diff.l1 3.85e-16 ***
## df_mod.Llegada_Tur_Nac_diff.l1 0.2169
## df_mod.Densidad_Ocupación_log.l1 0.4889
## y.l2 0.5991
## df_mod.Turistas_Noche_Ext_diff.l2 0.8990
## df_mod.X.Ocupacion_Hoteles_diff.l2 0.0642 .
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l2 0.2753
## df_mod.Estadia_Promedio_log_diff.l2 0.2925
## df_mod.Cuartos_Registrados_diff.l2 8.92e-05 ***
## df_mod.Llegada_Tur_Nac_diff.l2 0.8953
## df_mod.Densidad_Ocupación_log.l2 0.3518
## const 0.9327
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## Residual standard error: 0.5807 on 101 degrees of freedom
## Multiple R-Squared: 0.7065, Adjusted R-squared: 0.66
## F-statistic: 15.19 on 16 and 101 DF, p-value: < 2.2e-16
##
##
## Estimation results for equation df_mod.Llegada_Tur_Nac_diff:
## ============================================================
## df_mod.Llegada_Tur_Nac_diff = y.l1 + df_mod.Turistas_Noche_Ext_diff.l1 + df_mod.X.Ocupacion_Hoteles_diff.l1 + df_mod.Cuartos_Disponibles_Promedio_log_diff.l1 + df_mod.Estadia_Promedio_log_diff.l1 + df_mod.Cuartos_Registrados_diff.l1 + df_mod.Llegada_Tur_Nac_diff.l1 + df_mod.Densidad_Ocupación_log.l1 + y.l2 + df_mod.Turistas_Noche_Ext_diff.l2 + df_mod.X.Ocupacion_Hoteles_diff.l2 + df_mod.Cuartos_Disponibles_Promedio_log_diff.l2 + df_mod.Estadia_Promedio_log_diff.l2 + df_mod.Cuartos_Registrados_diff.l2 + df_mod.Llegada_Tur_Nac_diff.l2 + df_mod.Densidad_Ocupación_log.l2 + const
##
## Estimate Std. Error t value
## y.l1 0.0002855 0.0006499 0.439
## df_mod.Turistas_Noche_Ext_diff.l1 -0.0203390 0.1322338 -0.154
## df_mod.X.Ocupacion_Hoteles_diff.l1 0.3165780 0.2700713 1.172
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l1 0.0467999 0.1062451 0.440
## df_mod.Estadia_Promedio_log_diff.l1 0.0190259 0.1275629 0.149
## df_mod.Cuartos_Registrados_diff.l1 -0.3115633 0.1718904 -1.813
## df_mod.Llegada_Tur_Nac_diff.l1 -0.2694825 0.2729857 -0.987
## df_mod.Densidad_Ocupación_log.l1 -0.1033694 0.2439223 -0.424
## y.l2 -0.0011926 0.0006386 -1.867
## df_mod.Turistas_Noche_Ext_diff.l2 -0.1833526 0.1125780 -1.629
## df_mod.X.Ocupacion_Hoteles_diff.l2 0.1702573 0.2016275 0.844
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l2 0.0071810 0.0969096 0.074
## df_mod.Estadia_Promedio_log_diff.l2 -0.1218834 0.0964739 -1.263
## df_mod.Cuartos_Registrados_diff.l2 0.0860113 0.1787809 0.481
## df_mod.Llegada_Tur_Nac_diff.l2 -0.0311730 0.2197392 -0.142
## df_mod.Densidad_Ocupación_log.l2 0.2107951 0.2354863 0.895
## const 0.0097419 0.0804998 0.121
## Pr(>|t|)
## y.l1 0.6614
## df_mod.Turistas_Noche_Ext_diff.l1 0.8781
## df_mod.X.Ocupacion_Hoteles_diff.l1 0.2439
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l1 0.6605
## df_mod.Estadia_Promedio_log_diff.l1 0.8817
## df_mod.Cuartos_Registrados_diff.l1 0.0729 .
## df_mod.Llegada_Tur_Nac_diff.l1 0.3259
## df_mod.Densidad_Ocupación_log.l1 0.6726
## y.l2 0.0647 .
## df_mod.Turistas_Noche_Ext_diff.l2 0.1065
## df_mod.X.Ocupacion_Hoteles_diff.l2 0.4004
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l2 0.9411
## df_mod.Estadia_Promedio_log_diff.l2 0.2094
## df_mod.Cuartos_Registrados_diff.l2 0.6315
## df_mod.Llegada_Tur_Nac_diff.l2 0.8875
## df_mod.Densidad_Ocupación_log.l2 0.3728
## const 0.9039
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## Residual standard error: 0.8636 on 101 degrees of freedom
## Multiple R-Squared: 0.3592, Adjusted R-squared: 0.2577
## F-statistic: 3.538 on 16 and 101 DF, p-value: 4.918e-05
##
##
## Estimation results for equation df_mod.Densidad_Ocupación_log:
## ==============================================================
## df_mod.Densidad_Ocupación_log = y.l1 + df_mod.Turistas_Noche_Ext_diff.l1 + df_mod.X.Ocupacion_Hoteles_diff.l1 + df_mod.Cuartos_Disponibles_Promedio_log_diff.l1 + df_mod.Estadia_Promedio_log_diff.l1 + df_mod.Cuartos_Registrados_diff.l1 + df_mod.Llegada_Tur_Nac_diff.l1 + df_mod.Densidad_Ocupación_log.l1 + y.l2 + df_mod.Turistas_Noche_Ext_diff.l2 + df_mod.X.Ocupacion_Hoteles_diff.l2 + df_mod.Cuartos_Disponibles_Promedio_log_diff.l2 + df_mod.Estadia_Promedio_log_diff.l2 + df_mod.Cuartos_Registrados_diff.l2 + df_mod.Llegada_Tur_Nac_diff.l2 + df_mod.Densidad_Ocupación_log.l2 + const
##
## Estimate Std. Error t value
## y.l1 0.0004198 0.0004089 1.027
## df_mod.Turistas_Noche_Ext_diff.l1 -0.0222007 0.0831987 -0.267
## df_mod.X.Ocupacion_Hoteles_diff.l1 0.0822871 0.1699232 0.484
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l1 0.0387753 0.0668472 0.580
## df_mod.Estadia_Promedio_log_diff.l1 0.1775459 0.0802599 2.212
## df_mod.Cuartos_Registrados_diff.l1 -0.1236136 0.1081498 -1.143
## df_mod.Llegada_Tur_Nac_diff.l1 -0.0777135 0.1717569 -0.452
## df_mod.Densidad_Ocupación_log.l1 0.6288656 0.1534708 4.098
## y.l2 -0.0006223 0.0004018 -1.549
## df_mod.Turistas_Noche_Ext_diff.l2 -0.1736957 0.0708317 -2.452
## df_mod.X.Ocupacion_Hoteles_diff.l2 0.5551492 0.1268597 4.376
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l2 0.1172959 0.0609735 1.924
## df_mod.Estadia_Promedio_log_diff.l2 -0.0667030 0.0606994 -1.099
## df_mod.Cuartos_Registrados_diff.l2 0.0139838 0.1124852 0.124
## df_mod.Llegada_Tur_Nac_diff.l2 -0.2831997 0.1382553 -2.048
## df_mod.Densidad_Ocupación_log.l2 0.2577714 0.1481630 1.740
## const 0.0059286 0.0506488 0.117
## Pr(>|t|)
## y.l1 0.3071
## df_mod.Turistas_Noche_Ext_diff.l1 0.7901
## df_mod.X.Ocupacion_Hoteles_diff.l1 0.6292
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l1 0.5632
## df_mod.Estadia_Promedio_log_diff.l1 0.0292 *
## df_mod.Cuartos_Registrados_diff.l1 0.2557
## df_mod.Llegada_Tur_Nac_diff.l1 0.6519
## df_mod.Densidad_Ocupación_log.l1 8.44e-05 ***
## y.l2 0.1246
## df_mod.Turistas_Noche_Ext_diff.l2 0.0159 *
## df_mod.X.Ocupacion_Hoteles_diff.l2 2.95e-05 ***
## df_mod.Cuartos_Disponibles_Promedio_log_diff.l2 0.0572 .
## df_mod.Estadia_Promedio_log_diff.l2 0.2744
## df_mod.Cuartos_Registrados_diff.l2 0.9013
## df_mod.Llegada_Tur_Nac_diff.l2 0.0431 *
## df_mod.Densidad_Ocupación_log.l2 0.0849 .
## const 0.9070
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## Residual standard error: 0.5433 on 101 degrees of freedom
## Multiple R-Squared: 0.7418, Adjusted R-squared: 0.7008
## F-statistic: 18.13 on 16 and 101 DF, p-value: < 2.2e-16
##
##
##
## Covariance matrix of residuals:
## y
## y 39100.316
## df_mod.Turistas_Noche_Ext_diff 77.369
## df_mod.X.Ocupacion_Hoteles_diff 120.563
## df_mod.Cuartos_Disponibles_Promedio_log_diff 45.028
## df_mod.Estadia_Promedio_log_diff 7.501
## df_mod.Cuartos_Registrados_diff 7.277
## df_mod.Llegada_Tur_Nac_diff 115.881
## df_mod.Densidad_Ocupación_log 32.896
## df_mod.Turistas_Noche_Ext_diff
## y 77.36909
## df_mod.Turistas_Noche_Ext_diff 0.80255
## df_mod.X.Ocupacion_Hoteles_diff 0.41128
## df_mod.Cuartos_Disponibles_Promedio_log_diff 0.12551
## df_mod.Estadia_Promedio_log_diff -0.07432
## df_mod.Cuartos_Registrados_diff 0.02762
## df_mod.Llegada_Tur_Nac_diff 0.30264
## df_mod.Densidad_Ocupación_log 0.15585
## df_mod.X.Ocupacion_Hoteles_diff
## y 1.206e+02
## df_mod.Turistas_Noche_Ext_diff 4.113e-01
## df_mod.X.Ocupacion_Hoteles_diff 7.655e-01
## df_mod.Cuartos_Disponibles_Promedio_log_diff 1.775e-01
## df_mod.Estadia_Promedio_log_diff -1.143e-01
## df_mod.Cuartos_Registrados_diff -1.248e-02
## df_mod.Llegada_Tur_Nac_diff 6.288e-01
## df_mod.Densidad_Ocupación_log -8.434e-04
## df_mod.Cuartos_Disponibles_Promedio_log_diff
## y 45.0282578
## df_mod.Turistas_Noche_Ext_diff 0.1255103
## df_mod.X.Ocupacion_Hoteles_diff 0.1774561
## df_mod.Cuartos_Disponibles_Promedio_log_diff 1.0217309
## df_mod.Estadia_Promedio_log_diff -0.0006832
## df_mod.Cuartos_Registrados_diff 0.3614287
## df_mod.Llegada_Tur_Nac_diff 0.2217742
## df_mod.Densidad_Ocupación_log -0.0469314
## df_mod.Estadia_Promedio_log_diff
## y 7.5006422
## df_mod.Turistas_Noche_Ext_diff -0.0743232
## df_mod.X.Ocupacion_Hoteles_diff -0.1142525
## df_mod.Cuartos_Disponibles_Promedio_log_diff -0.0006832
## df_mod.Estadia_Promedio_log_diff 0.8878145
## df_mod.Cuartos_Registrados_diff 0.0233441
## df_mod.Llegada_Tur_Nac_diff -0.2856205
## df_mod.Densidad_Ocupación_log 0.1404504
## df_mod.Cuartos_Registrados_diff
## y 7.277284
## df_mod.Turistas_Noche_Ext_diff 0.027622
## df_mod.X.Ocupacion_Hoteles_diff -0.012476
## df_mod.Cuartos_Disponibles_Promedio_log_diff 0.361429
## df_mod.Estadia_Promedio_log_diff 0.023344
## df_mod.Cuartos_Registrados_diff 0.337236
## df_mod.Llegada_Tur_Nac_diff 0.053276
## df_mod.Densidad_Ocupación_log -0.009171
## df_mod.Llegada_Tur_Nac_diff
## y 115.88111
## df_mod.Turistas_Noche_Ext_diff 0.30264
## df_mod.X.Ocupacion_Hoteles_diff 0.62877
## df_mod.Cuartos_Disponibles_Promedio_log_diff 0.22177
## df_mod.Estadia_Promedio_log_diff -0.28562
## df_mod.Cuartos_Registrados_diff 0.05328
## df_mod.Llegada_Tur_Nac_diff 0.74573
## df_mod.Densidad_Ocupación_log 0.08728
## df_mod.Densidad_Ocupación_log
## y 32.8963885
## df_mod.Turistas_Noche_Ext_diff 0.1558528
## df_mod.X.Ocupacion_Hoteles_diff -0.0008434
## df_mod.Cuartos_Disponibles_Promedio_log_diff -0.0469314
## df_mod.Estadia_Promedio_log_diff 0.1404504
## df_mod.Cuartos_Registrados_diff -0.0091706
## df_mod.Llegada_Tur_Nac_diff 0.0872827
## df_mod.Densidad_Ocupación_log 0.2952083
##
## Correlation matrix of residuals:
## y
## y 1.00000
## df_mod.Turistas_Noche_Ext_diff 0.43676
## df_mod.X.Ocupacion_Hoteles_diff 0.69689
## df_mod.Cuartos_Disponibles_Promedio_log_diff 0.22528
## df_mod.Estadia_Promedio_log_diff 0.04026
## df_mod.Cuartos_Registrados_diff 0.06337
## df_mod.Llegada_Tur_Nac_diff 0.67863
## df_mod.Densidad_Ocupación_log 0.30619
## df_mod.Turistas_Noche_Ext_diff
## y 0.43676
## df_mod.Turistas_Noche_Ext_diff 1.00000
## df_mod.X.Ocupacion_Hoteles_diff 0.52474
## df_mod.Cuartos_Disponibles_Promedio_log_diff 0.13860
## df_mod.Estadia_Promedio_log_diff -0.08805
## df_mod.Cuartos_Registrados_diff 0.05310
## df_mod.Llegada_Tur_Nac_diff 0.39120
## df_mod.Densidad_Ocupación_log 0.32020
## df_mod.X.Ocupacion_Hoteles_diff
## y 0.696887
## df_mod.Turistas_Noche_Ext_diff 0.524736
## df_mod.X.Ocupacion_Hoteles_diff 1.000000
## df_mod.Cuartos_Disponibles_Promedio_log_diff 0.200660
## df_mod.Estadia_Promedio_log_diff -0.138593
## df_mod.Cuartos_Registrados_diff -0.024556
## df_mod.Llegada_Tur_Nac_diff 0.832217
## df_mod.Densidad_Ocupación_log -0.001774
## df_mod.Cuartos_Disponibles_Promedio_log_diff
## y 0.2252821
## df_mod.Turistas_Noche_Ext_diff 0.1386039
## df_mod.X.Ocupacion_Hoteles_diff 0.2006600
## df_mod.Cuartos_Disponibles_Promedio_log_diff 1.0000000
## df_mod.Estadia_Promedio_log_diff -0.0007173
## df_mod.Cuartos_Registrados_diff 0.6157259
## df_mod.Llegada_Tur_Nac_diff 0.2540695
## df_mod.Densidad_Ocupación_log -0.0854537
## df_mod.Estadia_Promedio_log_diff
## y 0.0402575
## df_mod.Turistas_Noche_Ext_diff -0.0880496
## df_mod.X.Ocupacion_Hoteles_diff -0.1385934
## df_mod.Cuartos_Disponibles_Promedio_log_diff -0.0007173
## df_mod.Estadia_Promedio_log_diff 1.0000000
## df_mod.Cuartos_Registrados_diff 0.0426628
## df_mod.Llegada_Tur_Nac_diff -0.3510251
## df_mod.Densidad_Ocupación_log 0.2743454
## df_mod.Cuartos_Registrados_diff
## y 0.06337
## df_mod.Turistas_Noche_Ext_diff 0.05310
## df_mod.X.Ocupacion_Hoteles_diff -0.02456
## df_mod.Cuartos_Disponibles_Promedio_log_diff 0.61573
## df_mod.Estadia_Promedio_log_diff 0.04266
## df_mod.Cuartos_Registrados_diff 1.00000
## df_mod.Llegada_Tur_Nac_diff 0.10624
## df_mod.Densidad_Ocupación_log -0.02906
## df_mod.Llegada_Tur_Nac_diff
## y 0.6786
## df_mod.Turistas_Noche_Ext_diff 0.3912
## df_mod.X.Ocupacion_Hoteles_diff 0.8322
## df_mod.Cuartos_Disponibles_Promedio_log_diff 0.2541
## df_mod.Estadia_Promedio_log_diff -0.3510
## df_mod.Cuartos_Registrados_diff 0.1062
## df_mod.Llegada_Tur_Nac_diff 1.0000
## df_mod.Densidad_Ocupación_log 0.1860
## df_mod.Densidad_Ocupación_log
## y 0.306192
## df_mod.Turistas_Noche_Ext_diff 0.320195
## df_mod.X.Ocupacion_Hoteles_diff -0.001774
## df_mod.Cuartos_Disponibles_Promedio_log_diff -0.085454
## df_mod.Estadia_Promedio_log_diff 0.274345
## df_mod.Cuartos_Registrados_diff -0.029065
## df_mod.Llegada_Tur_Nac_diff 0.186026
## df_mod.Densidad_Ocupación_log 1.000000
serial.test(modelo_var, lags.pt = 12, type = "PT.asymptotic")
##
## Portmanteau Test (asymptotic)
##
## data: Residuals of VAR object modelo_var
## Chi-squared = 766.94, df = 640, p-value = 0.0003958
# VAR con serie diferenciada
y_diff <- ts(df_final$Derrama_Economica_Est_mdp_diff, start = c(2015,1), frequency = 12)
var_ts2 <- ts(cbind(y_diff, df_mod), start = c(2015,1), frequency = 12)
modelo_var2 <- VAR(var_ts2, p = optimal_lag)
serial.test(modelo_var2, lags.pt = 12, type = "PT.asymptotic")
##
## Portmanteau Test (asymptotic)
##
## data: Residuals of VAR object modelo_var2
## Chi-squared = 1318.8, df = 0, p-value < 2.2e-16
AIC(modelo_sarimax1)
## [1] 1394.597
BIC(modelo_sarimax1)
## [1] 1429.344
logLik(modelo_sarimax1)
## 'log Lik.' -684.2986 (df=13)
AIC(modelo_var)
## [1] 3177.244
BIC(modelo_var)
## [1] 3554.057
logLik(modelo_var)
## 'log Lik.' -1452.622 (df=136)
AIC(modelo_auto)
## [1] 1521.182
BIC(modelo_auto)
## [1] 1546.269
logLik(modelo_auto)
## 'log Lik.' -751.5908 (df=9)
library(car)
## Loading required package: carData
##
## Attaching package: 'car'
## The following object is masked from 'package:psych':
##
## logit
## The following object is masked from 'package:dplyr':
##
## recode
# Calcular VIF correctamente
modelo_vif <- lm(rep(1, nrow(df_mod)) ~ ., data = df_mod)
vif(modelo_vif)
## Turistas_Noche_Ext_diff X.Ocupacion_Hoteles_diff
## 1.460450 4.536625
## Cuartos_Disponibles_Promedio_log_diff Estadia_Promedio_log_diff
## 1.149146 1.138083
## Cuartos_Registrados_diff Llegada_Tur_Nac_diff
## 1.572715 4.282152
## Densidad_Ocupación_log
## 1.097790
# Paso 1: asegurar que df_xreg sea una matriz numérica con nombres
df_xreg <- as.matrix(df_xreg)
stopifnot(is.matrix(df_xreg), is.numeric(df_xreg))
# Paso 2: crear base futura (última fila repetida)
n_periodos <- 36
future_xreg <- matrix(rep(df_xreg[nrow(df_xreg), ], n_periodos),
nrow = n_periodos, byrow = TRUE)
# Paso 3: aplicar crecimiento acumulado del 2%
growth <- (1.02)^(1:n_periodos)
future_xreg <- sweep(future_xreg, 1, growth, `*`)
# Paso 4: restaurar los nombres de columnas
colnames(future_xreg) <- colnames(df_xreg)
# Paso 5: verificar todo antes del forecast
stopifnot(
is.matrix(future_xreg),
is.numeric(future_xreg),
identical(colnames(df_xreg), colnames(future_xreg)),
ncol(df_xreg) == ncol(future_xreg)
)
str(modelo_sarimax1$xreg)
## NULL
str(future_xreg)
## num [1:36, 1:7] -1.33 -1.36 -1.38 -1.41 -1.44 ...
## - attr(*, "dimnames")=List of 2
## ..$ : NULL
## ..$ : chr [1:7] "Turistas_Noche_Ext_diff" "X.Ocupacion_Hoteles_diff" "Cuartos_Disponibles_Promedio_log_diff" "Estadia_Promedio_log_diff" ...
identical(colnames(modelo_sarimax1$xreg), colnames(future_xreg))
## [1] FALSE
ncol(modelo_sarimax1$xreg) == ncol(future_xreg)
## logical(0)
colnames(df_xreg)
## [1] "Turistas_Noche_Ext_diff"
## [2] "X.Ocupacion_Hoteles_diff"
## [3] "Cuartos_Disponibles_Promedio_log_diff"
## [4] "Estadia_Promedio_log_diff"
## [5] "Cuartos_Registrados_diff"
## [6] "Llegada_Tur_Nac_diff"
## [7] "Densidad_Ocupación_log"
colnames(future_xreg)
## [1] "Turistas_Noche_Ext_diff"
## [2] "X.Ocupacion_Hoteles_diff"
## [3] "Cuartos_Disponibles_Promedio_log_diff"
## [4] "Estadia_Promedio_log_diff"
## [5] "Cuartos_Registrados_diff"
## [6] "Llegada_Tur_Nac_diff"
## [7] "Densidad_Ocupación_log"
colnames(modelo_sarimax1$xreg)
## NULL
de años 2024, 2025, y 2026?
Bajo el escenario optimista, el modelo SARIMAX proyecta que:
2025: La derrama económica promediaría unos 2 135 mdp al mes. Esto implicaría un repunte muy fuerte respecto al último dato observado, gracias al impulso combinado de variables como la llegada de turistas nacionales, la ocupación hotelera y la estadía promedio.
2026: Ese promedio decae hasta alrededor de 1 118 mdp mensuales. Sigue siendo positivo, pero refleja que el “efecto arrastre” de las variables explicativas pierde fuerza: laTendencia de crecimiento ya no resulta tan vigorosa como en 2025.
2027: La media mensual cae hasta unos –980 mdp, es decir, la proyección se vuelve negativa: incluso en el mejor de los casos, el modelo anticipa que la derrama puede contraerse.
Aun en el mejor de los casos (la parte alta de la banda del pronóstico grafica azul), la derrama proyectada permanece negativa y con un patrón estacional marcado, lo que puede sugerir la necesidad de implemenetar medidas de corto plazo (por ej. campañas específicas, ofertas puntuales, etc.) para poder suavizar la tendencia a la baja y reducir la incertidumbre sobre los meses más críticos, ya que el pronóstico base, muestra iniciar en torno a –100 mdp en enero 2025 y va descendiendo mes a mes hasta cerca de –700 mdp a finales de 2027.
# 1) Predecir con SARIMAX
res_pred <- predict(
modelo_sarimax1,
n.ahead = n_periodos,
newxreg = future_xreg,
se.fit = TRUE
)
pred <- res_pred$pred
se <- res_pred$se
# 2) Construir forecast_df arrancando en enero 2025
ultimo_num <- as.numeric(tail(time(y), 1))
periodo_ym <- as.yearmon(ultimo_num + seq(1/12, n_periodos/12, by = 1/12))
forecast_df <- data.frame(
Periodo = as.Date(periodo_ym),
Pesimista = pred - 1.96 * se,
Real = pred,
Optimo = pred + 1.96 * se
)
# 3) Dibujar sólo el pronóstico desde 2025
ggplot(forecast_df, aes(x = Periodo)) +
geom_ribbon(aes(ymin = Pesimista, ymax = Optimo),
fill = "lightblue", alpha = 0.4) +
geom_line(aes(y = Real), color = "blue", size = 1) +
geom_point(aes(y = Real), color = "blue", size = 2) +
scale_x_date(
date_breaks = "3 months",
date_labels = "%b %Y",
limits = as.Date(c("2025-01-01", max(forecast_df$Periodo)))
) +
labs(
title = "Pronóstico Mensual de Derrama Económica (mdp)",
subtitle = "Sólo la parte de forecast desde enero 2025",
x = "Mes",
y = "Derrama Económica"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
## 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.
## Don't know how to automatically pick scale for object of type <ts>. Defaulting
## to continuous.
## Don't know how to automatically pick scale for object of type <ts>. Defaulting
## to continuous.
## Don't know how to automatically pick scale for object of type <ts>. Defaulting
## to continuous.
library(dplyr)
library(tidyr)
library(ggplot2)
df_long <- forecast_df %>%
dplyr::select(Periodo, Pesimista, Real, Optimo) %>%
pivot_longer(
cols = c(Pesimista, Real, Optimo),
names_to = "Escenario",
values_to = "Delta"
)
ggplot(df_long, aes(x = Periodo, y = Delta, color = Escenario, linetype = Escenario)) +
geom_line(size = 1) +
geom_point(size = 2) +
scale_color_manual(
values = c(
"Optimo" = "darkgreen", # <-- sin acento, coincide con tu columna
"Real" = "blue",
"Pesimista" = "red"
)
) +
scale_linetype_manual(
values = c(
"Optimo" = "dashed",
"Real" = "solid",
"Pesimista" = "dotted"
)
) +
scale_x_date(
date_breaks = "2 months",
date_labels = "%b\n%Y"
) +
labs(
title = "Pronóstico Mensual de ΔDerrama Económica (mdp)",
subtitle = "Picos y valles mes a mes en un solo gráfico",
x = "Mes",
y = "Cambio mensual estimado (mdp)",
color = "Escenario",
linetype = "Escenario"
) +
theme_minimal() +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(face = "bold"),
plot.subtitle = element_text(size = 10),
legend.position = "bottom"
)
# 1) Construir la tabla mensual de diferencias ΔDerrama
tabla_diffs <- forecast_df %>%
dplyr::select(Periodo, Pesimista, Real, Optimo) %>%
dplyr::rename(
`Δ Pesimista` = Pesimista,
`Δ Real` = Real,
`Δ Óptimo` = Optimo
)
# 2) Imprimir la tabla completa en consola
print(tabla_diffs)
## Periodo Δ Pesimista Δ Real Δ Óptimo
## 1 2025-01-01 -339.4860 -74.35111 190.783789
## 2 2025-02-01 -530.3056 -263.89927 2.507008
## 3 2025-03-01 -504.4744 -236.51080 31.452811
## 4 2025-04-01 -601.3710 -333.31363 -65.256238
## 5 2025-05-01 -637.7973 -369.53241 -101.267481
## 6 2025-06-01 -571.7906 -303.56226 -35.333911
## 7 2025-07-01 -545.1704 -276.89927 -8.628086
## 8 2025-08-01 -639.4751 -371.22173 -102.968394
## 9 2025-09-01 -712.1512 -443.88416 -175.617123
## 10 2025-10-01 -586.4596 -318.20361 -49.947659
## 11 2025-11-01 -556.6123 -288.34324 -20.074194
## 12 2025-12-01 -731.2923 -463.03961 -194.786881
## 13 2026-01-01 -441.9326 -164.85420 112.224232
## 14 2026-02-01 -610.9425 -333.91466 -56.886802
## 15 2026-03-01 -599.7246 -322.50713 -45.289692
## 16 2026-04-01 -690.4421 -413.27101 -136.099964
## 17 2026-05-01 -732.4805 -455.26896 -178.057424
## 18 2026-06-01 -665.9028 -388.70923 -111.515643
## 19 2026-07-01 -642.1644 -364.95901 -87.753617
## 20 2026-08-01 -737.5454 -460.34748 -183.149571
## 21 2026-09-01 -812.3346 -535.12991 -257.925233
## 22 2026-10-01 -688.2479 -411.05196 -133.856052
## 23 2026-11-01 -660.3391 -383.12970 -105.920288
## 24 2026-12-01 -836.8296 -559.63844 -282.447306
## 25 2027-01-01 -549.4319 -263.39083 22.650253
## 26 2027-02-01 -720.3400 -434.37951 -148.419056
## 27 2027-03-01 -711.1340 -424.96496 -138.795895
## 28 2027-04-01 -803.8584 -517.74747 -231.636496
## 29 2027-05-01 -847.9695 -561.81213 -275.654769
## 30 2027-06-01 -783.4923 -497.35627 -211.220278
## 31 2027-07-01 -761.9040 -475.75426 -189.604512
## 32 2027-08-01 -859.4736 -573.33267 -287.191733
## 33 2027-09-01 -936.4984 -650.34951 -364.200623
## 34 2027-10-01 -814.6889 -528.55030 -242.411668
## 35 2027-11-01 -789.1072 -502.95254 -216.797891
## 36 2027-12-01 -967.9656 -681.83218 -395.698749
# — Primero recreamos fc_levels dentro del mismo chunk —
last_nivel <- as.numeric(tail(derrama_ts, 1))
fc_levels <- forecast_df %>%
mutate(
Nivel_Pes = last_nivel + cumsum(Pesimista),
Nivel_Real = last_nivel + cumsum(Real),
Nivel_Opt = last_nivel + cumsum(Optimo),
Año = as.integer(format(Periodo, "%Y"))
)
# — Ahora sí calculamos el resumen anual —
resumen_niveles <- fc_levels %>%
group_by(Año) %>%
summarise(
`Promedio Óptimo (mdp/mes)` = round(mean(Nivel_Opt, na.rm=TRUE), 0)
)
print(resumen_niveles)
## # A tibble: 3 × 2
## Año `Promedio Óptimo (mdp/mes)`
## <int> <dbl>
## 1 2025 2135
## 2 2026 1118
## 3 2027 -980
# 1) Agrupar por año y promediar el Δ Óptimo
resumen_anual <- tabla_diffs %>%
dplyr::mutate(Año = as.integer(format(Periodo, "%Y"))) %>%
dplyr::group_by(Año) %>%
dplyr::summarise(
`Promedio Óptimo (mdp/mes)` = round(mean(`Δ Óptimo`, na.rm = TRUE), 0)
)
# 2) Imprimir el resumen anual en consola
print(resumen_anual)
## # A tibble: 3 × 2
## Año `Promedio Óptimo (mdp/mes)`
## <int> <dbl>
## 1 2025 -44
## 2 2026 -122
## 3 2027 -223
un aumento o disminución sobre la(s) principal(es) variable(s) de interés? Visualizar el tipo de relación de dichas variable control sobre la(s) principal(es) variable(s) de interés.
Para el periodo 2023–2024, estas son las variables de control que explican la variación (diff) de la Derrama Económica, ordenadas por magnitud de coeficiente en el SARIMAX:
Coeficiente: +147.84 | Correlación (r): ≈ 0.54 | Tipo de relación: Fuerte y positiva
Estadia_Promedio_log_diff : Un aumento relativo del 1 % en la estadía promedio (capturado por la diferencia logarítmica) se asocia con un incremento de ≈ 51.3 mdp en la derrama. Coeficiente: +51.29 | Correlación (r): ≈ 0.62 | Tipo de relación: Muy positiva
X.Ocupacion_Hoteles_diff : Un incremento de 1 punto porcentual en la ocupación hotelera se asocia con un aumento de ≈ 35.1 mdp en la derrama. Coeficiente: +35.12 | Correlación (r): ≈ 0.56 | Tipo de relación: Fuerte y positiva
Densidad_Ocupación_log : Un aumento relativo del 1 % en la densidad de ocupación (capturado por la diferencia logarítmica) se asocia con un incremento de ≈ 27.7 mdp en la derrama. Coeficiente: +27.68 | Correlación (r): ≈ 0.18 | Tipo de relación: Débil y positiva
Cuartos_Registrados_diff : Un incremento de 1 unidad en la diferencia de cuartos registrados (p.ej. 1 × 10³ cuartos) se asocia con un aumento de ≈ 26.7 mdp en la derrama. Coeficiente: +26.68 | Correlación (r): ≈ 0.24 | Tipo de relación: Débil a moderada y positiva
Turistas_Noche_Ext_diff : Un incremento de 1 unidad en la diferencia de noches de turistas extranjeros (p.ej. 1 × 10³ noches) se asocia con un aumento de ≈ 26.4 mdp en la derrama. Coeficiente: +26.44 | Correlación (r): ≈ 0.30 | Tipo de relación: Moderada y positiva
Cuartos_Disponibles_Promedio_log_diff : Un aumento relativo del 1 % en los cuartos disponibles promedio (capturado por la diferencia logarítmica) se asocia con una disminución de ≈ 6.27 mdp en la derrama. Coeficiente: –6.27 | Correlación (r): ≈ 0.14 | Tipo de relación: Muy débil y negativa
summary(modelo_sarimax1)$coef
## ar1 ar2
## -0.46926976 0.03947154
## ma1 ma2
## -0.64796092 -0.35203585
## sma1 Turistas_Noche_Ext_diff
## -0.75730834 26.43620005
## X.Ocupacion_Hoteles_diff Cuartos_Disponibles_Promedio_log_diff
## 35.11997364 -6.27001640
## Estadia_Promedio_log_diff Cuartos_Registrados_diff
## 51.28616856 26.67553838
## Llegada_Tur_Nac_diff Densidad_Ocupación_log
## 147.83636835 27.68356139
# Extraer todos los coeficientes
coef_sarimax <- summary(modelo_sarimax1)$coef
# Filtrar solo los coeficientes cuyas variables están en tus explicativas (df_xreg)
coef_explicativas <- coef_sarimax[names(coef_sarimax) %in% colnames(df_xreg)]
# Convertir a data frame y ordenar por valor absoluto (descendente)
library(tibble)
library(dplyr)
tabla_coef <- tibble(
Variable = names(coef_explicativas),
Coeficiente = as.numeric(coef_explicativas)
) %>%
mutate(Coef_Abs = abs(Coeficiente)) %>%
arrange(desc(Coef_Abs))
# Mostrar tabla
print(tabla_coef)
## # A tibble: 7 × 3
## Variable Coeficiente Coef_Abs
## <chr> <dbl> <dbl>
## 1 Llegada_Tur_Nac_diff 148. 148.
## 2 Estadia_Promedio_log_diff 51.3 51.3
## 3 X.Ocupacion_Hoteles_diff 35.1 35.1
## 4 Densidad_Ocupación_log 27.7 27.7
## 5 Cuartos_Registrados_diff 26.7 26.7
## 6 Turistas_Noche_Ext_diff 26.4 26.4
## 7 Cuartos_Disponibles_Promedio_log_diff -6.27 6.27
# Filtrar años 2023 y 2024
df_plot <- df_final[df_final$AÑO %in% c(2023, 2024), ]
# Iterar sobre cada variable explicativa
for (var in variables_explicativas) {
# Calcular correlación
r <- cor(df_plot[[var]], df_plot$Derrama_Economica_Est_mdp_diff, use = "complete.obs")
r_label <- paste0("r = ", round(r, 2))
# Crear gráfico
p <- ggplot(df_plot, aes_string(x = var, y = "Derrama_Economica_Est_mdp_diff")) +
geom_point() +
geom_smooth(method = "lm", se = FALSE, color = "blue") +
ggtitle(paste("Relación entre", var, "y Derrama Económica (2023-2024)", r_label)) +
xlab(var) +
ylab("Derrama Económica Estimada (Diff)")
print(p)
}
## Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
## ℹ Please use tidy evaluation idioms with `aes()`.
## ℹ See also `vignette("ggplot2-in-packages")` for more information.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
## `geom_smooth()` using formula = 'y ~ x'
# 3. Calcular matriz de correlación
cor_matrix <- cor(df_plot, use = "complete.obs")
# 4. Extraer correlaciones con la variable dependiente
correlaciones <- cor_matrix["Derrama_Economica_Est_mdp_diff", -1]
# 5. Convertir a tabla ordenada
tabla_correlacion <- data.frame(
Variable = names(correlaciones),
Coef_de_Correlacion = as.numeric(correlaciones)
) %>%
arrange(desc(abs(Coef_de_Correlacion))) # Sin espacios en el nombre
# 6. Mostrar
print(tabla_correlacion)
## Variable Coef_de_Correlacion
## 1 Derrama_Economica_Est_mdp_diff 1.00000000
## 2 Turistas_Noche_Nac_diff 0.79822271
## 3 Cuartos_Ocupados_diff 0.72349499
## 4 X.Ocupacion_Hoteles_diff 0.63461937
## 5 Estadia_Promedio_log_diff 0.55427282
## 6 Llegada_Tur_Nac_diff 0.54112254
## 7 Turistas_Noche_Ext_diff 0.38504745
## 8 Cuartos_Disponibles_diff 0.27940090
## 9 Cuartos_Registrados_diff 0.22377855
## 10 Densidad_Ocupación_log 0.22192337
## 11 Llegada_Tur_Ext_diff 0.17178725
## 12 AÑO -0.09284935
## 13 Cuartos_Disponibles_Promedio_log_diff 0.08655315
control significativas sobre la(s) principal(es) variable(s) de interés?
Llegada de turistas nacionales es el factor más determinante
Un aumento del 75 % en la variable Llegada_Tur_Nac_diff se traduce en un incremento aproximado de 110.9 mdp en la derrama.
Incluso un 25 % extra de llegadas nacionales aporta casi 37 mdp. → Implica que campañas o políticas orientadas a atraer turistas nacionales tendrán el retorno más alto en derrama económica.
Estadía promedio y ocupación hotelera, segundos motores importantes
Estadia_Promedio_log_diff: +75 % ⇒ +38.5 mdp
X.Ocupacion_Hoteles_diff (porcentaje de ocupación): +75 % ⇒ +26.3 mdp → Alargar la estancia media y mantener alta la ocupación optimiza significativamente la derrama.
# Definir incrementos a simular
incrementos <- c(0.25, 0.50, 0.75)
# Crear tabla de impactos desde tabla_coef
impactos <- data.frame()
for (i in 1:nrow(tabla_coef)) {
var <- tabla_coef$Variable[i]
coef <- tabla_coef$Coeficiente[i]
for (inc in incrementos) {
efecto <- coef * inc
impactos <- rbind(impactos, data.frame(
Variable = var,
Incremento = paste0("+", inc * 100, "%"),
Impacto_Pronosticado = round(efecto, 3)
))
}
}
# Ordenar por magnitud del impacto
impactos$Impacto_Abs <- abs(impactos$Impacto_Pronosticado)
impactos <- impactos[order(-impactos$Impacto_Abs), ]
impactos <- subset(impactos, select = -Impacto_Abs)
# Mostrar tabla
print(impactos)
## Variable Incremento Impacto_Pronosticado
## 3 Llegada_Tur_Nac_diff +75% 110.877
## 2 Llegada_Tur_Nac_diff +50% 73.918
## 6 Estadia_Promedio_log_diff +75% 38.465
## 1 Llegada_Tur_Nac_diff +25% 36.959
## 9 X.Ocupacion_Hoteles_diff +75% 26.340
## 5 Estadia_Promedio_log_diff +50% 25.643
## 12 Densidad_Ocupación_log +75% 20.763
## 15 Cuartos_Registrados_diff +75% 20.007
## 18 Turistas_Noche_Ext_diff +75% 19.827
## 8 X.Ocupacion_Hoteles_diff +50% 17.560
## 11 Densidad_Ocupación_log +50% 13.842
## 14 Cuartos_Registrados_diff +50% 13.338
## 17 Turistas_Noche_Ext_diff +50% 13.218
## 4 Estadia_Promedio_log_diff +25% 12.822
## 7 X.Ocupacion_Hoteles_diff +25% 8.780
## 10 Densidad_Ocupación_log +25% 6.921
## 13 Cuartos_Registrados_diff +25% 6.669
## 16 Turistas_Noche_Ext_diff +25% 6.609
## 21 Cuartos_Disponibles_Promedio_log_diff +75% -4.703
## 20 Cuartos_Disponibles_Promedio_log_diff +50% -3.135
## 19 Cuartos_Disponibles_Promedio_log_diff +25% -1.568
knitr::kable(impactos, caption = "Impacto estimado por incremento en variables explicativas")
| Variable | Incremento | Impacto_Pronosticado | |
|---|---|---|---|
| 3 | Llegada_Tur_Nac_diff | +75% | 110.877 |
| 2 | Llegada_Tur_Nac_diff | +50% | 73.918 |
| 6 | Estadia_Promedio_log_diff | +75% | 38.465 |
| 1 | Llegada_Tur_Nac_diff | +25% | 36.959 |
| 9 | X.Ocupacion_Hoteles_diff | +75% | 26.340 |
| 5 | Estadia_Promedio_log_diff | +50% | 25.643 |
| 12 | Densidad_Ocupación_log | +75% | 20.763 |
| 15 | Cuartos_Registrados_diff | +75% | 20.007 |
| 18 | Turistas_Noche_Ext_diff | +75% | 19.827 |
| 8 | X.Ocupacion_Hoteles_diff | +50% | 17.560 |
| 11 | Densidad_Ocupación_log | +50% | 13.842 |
| 14 | Cuartos_Registrados_diff | +50% | 13.338 |
| 17 | Turistas_Noche_Ext_diff | +50% | 13.218 |
| 4 | Estadia_Promedio_log_diff | +25% | 12.822 |
| 7 | X.Ocupacion_Hoteles_diff | +25% | 8.780 |
| 10 | Densidad_Ocupación_log | +25% | 6.921 |
| 13 | Cuartos_Registrados_diff | +25% | 6.669 |
| 16 | Turistas_Noche_Ext_diff | +25% | 6.609 |
| 21 | Cuartos_Disponibles_Promedio_log_diff | +75% | -4.703 |
| 20 | Cuartos_Disponibles_Promedio_log_diff | +50% | -3.135 |
| 19 | Cuartos_Disponibles_Promedio_log_diff | +25% | -1.568 |
Justificación de la elección de SARIMAX:
AIC y BIC más bajos: Obtiene los valores más reducidos (AIC = 1394.60, BIC = 1429.34), señal de mejor equilibrio entre ajuste y complejidad.
Log-Likelihood superior: Presenta la verosimilitud más alta (–684.30 frente a –751.59 y –1452.62), indicando un ajuste más fino de la distribución real de los datos.
RMSE mínimo: Con 126.46, es el menor error de predicción frente a 127.01 (AutoARIMA) y 323.43 (VAR), lo que conlleva mayor precisión en los pronósticos.
Residuos como ruido blanco: El test de Ljung–Box en los residuos de SARIMAX arroja p-value > 0.05, confirmando ausencia de autocorrelación remanente y cumplimiento de supuestos.
Captura de estacionalidad y regresores externos: Incorpora de forma explícita tanto términos estacionales como variables explicativas («xreg»), modelando más completamente las dinámicas de tendencia y ciclos del sector Hospitalidad (Hotelera)
# Extraer métricas del modelo SARIMAX
aic_val <- AIC(modelo_sarimax1)
bic_val <- BIC(modelo_sarimax1)
loglik_val <- logLik(modelo_sarimax1)
# Si quieres RMSE (opcional, si tienes valores reales y predichos)
library(Metrics)
##
## Attaching package: 'Metrics'
## The following objects are masked from 'package:caret':
##
## precision, recall
## The following object is masked from 'package:forecast':
##
## accuracy
rmse_val <- rmse(df_plot$Derrama_Economica_Est_mdp_diff, fitted(modelo_sarimax1))
# Crear tabla resumen
tabla_metricas <- data.frame(
Métrica = c("AIC", "BIC", "Log-Likelihood", "RMSE"),
Valor = c(aic_val, bic_val, loglik_val, rmse_val)
)
print(tabla_metricas)
## Métrica Valor
## 1 AIC 1394.5973
## 2 BIC 1429.3441
## 3 Log-Likelihood -684.2986
## 4 RMSE 308.5369
library(Metrics)
# SARIMAX
aic_sarimax <- AIC(modelo_sarimax1)
bic_sarimax <- BIC(modelo_sarimax1)
loglik_sarimax <- logLik(modelo_sarimax1)
rmse_sarimax <- rmse(y, fitted(modelo_sarimax1))
# AutoARIMA
aic_auto <- AIC(modelo_auto)
bic_auto <- BIC(modelo_auto)
loglik_auto <- logLik(modelo_auto)
rmse_auto <- rmse(y, fitted(modelo_auto))
# VAR
# Ajustar predicciones del VAR
library(vars)
aic_var <- AIC(modelo_var)
bic_var <- BIC(modelo_var)
loglik_var <- logLik(modelo_var)
rmse_var <- rmse(y, fitted(modelo_var)[, "y"])
## Warning in `-.default`(actual, predicted): longer object length is not a
## multiple of shorter object length
aic_var2 <- AIC(modelo_var2)
bic_var2 <- BIC(modelo_var2)
loglik_var2 <- logLik(modelo_var2)
rmse_var2 <- rmse(y, fitted(modelo_var2)[, "y_diff"])
## Warning in `-.default`(actual, predicted): longer object length is not a
## multiple of shorter object length
# Comparar en una tabla
tabla_comparativa <- data.frame(
Modelo = c("SARIMAX", "AutoARIMA", "VAR", "VAR2"),
AIC = c(aic_sarimax, aic_auto, aic_var, aic_var2),
BIC = c(bic_sarimax, bic_auto, bic_var, bic_var2),
LogLikelihood = c(loglik_sarimax, loglik_auto, loglik_var, loglik_var2),
RMSE = c(rmse_sarimax, rmse_auto, rmse_var, rmse_var2)
)
# Mostrar tabla con dos decimales
tabla_comparativa[] <- lapply(tabla_comparativa, function(x) if(is.numeric(x)) round(x, 2) else x)
print(tabla_comparativa)
## Modelo AIC BIC LogLikelihood RMSE
## 1 SARIMAX 1394.60 1429.34 -684.30 126.46
## 2 AutoARIMA 1521.18 1546.27 -751.59 127.01
## 3 VAR 3177.24 3554.06 -1452.62 323.43
## 4 VAR2 1510.71 3592.05 20.64 251.16