library(dygraphs)
library(readxl)
library(tseries) #Modelos Arma y prueba Dickey-Fuller
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(lmtest) #Análsis de los coeficientes ARIMA
## Warning: package 'lmtest' was built under R version 4.2.3
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
Índice_de_residencia <- read_excel("Índice de residencia.xlsx")
# Convertimos los datos a una serie de tiempo.
rsdn = Índice_de_residencia
rsdn_ts = ts(rsdn, start = c(2005,1), frequency = 12)
# Realizamos distintas gráficas para visualizar el comportamiento de los datos y poder comprobar si son estacionarios.
### Gráfica de serie de tiempo
rsdn_tsg = dygraph(rsdn_ts, main = "Índice de inversión en construcción residencial (2005 - 2020)", xlab = "Año", ylab = "Índice")%>% dyRangeSelector()
dyOptions(rsdn_tsg, colors = c("purple", "red"), fillGraph = TRUE, drawPoints = TRUE, pointSize = 2, strokeWidth = 2)
# Graficamos un histograma
hist(rsdn_ts, main = "Índice de inversión en construcción residencial (2005 - 2020)")
# Hacemos un gráfico de densidad.
density = plot(density(rsdn_ts), main = "Índice de inversión en construcción residencial (2005 - 2020)")
# Hacemos un gráfico qqplot
qqnorm(rsdn_ts)
qqline(rsdn_ts)
# Ahora graficamos la serie de tiempo original y la primera y segunda diferencia.
par(mfrow=c(2,2))
plot(diff(rsdn_ts), type = "l", main = "Primera diferencia")
plot(diff(diff(rsdn_ts)), type = "l", main = "Segunda diferencia")
plot(rsdn_ts, type = "l", main = "Serie de tiempo original")
# Realizamos una prueba estadística para saber si los datos son estacionarios.
#H0:La serie es no estacionaria: tiene raíz unitaria
#H1:La serie es estacionaria: no tiene raíz unitaria
adf.test(rsdn_ts) #pvalue=0.2134 NO ESTACIONARIA
##
## Augmented Dickey-Fuller Test
##
## data: rsdn_ts
## Dickey-Fuller = -3.0151, Lag order = 5, p-value = 0.1519
## alternative hypothesis: stationary
#pvalue<=0.05 rechazo Ho
#pvalue> 0.05 acepto Ho
# Graficamos una ACF y PACF.
acf(rsdn_ts,main="Índice de inversión en construcción residencial ACF")$acf
## , , 1
##
## [,1]
## [1,] 1.00000000
## [2,] 0.63864695
## [3,] 0.59441919
## [4,] 0.56755811
## [5,] 0.46916655
## [6,] 0.46168937
## [7,] 0.41651854
## [8,] 0.42350290
## [9,] 0.30849806
## [10,] 0.34740819
## [11,] 0.30921623
## [12,] 0.22686425
## [13,] 0.34412044
## [14,] 0.21349827
## [15,] 0.18530562
## [16,] 0.20506050
## [17,] 0.13986225
## [18,] 0.15042046
## [19,] 0.10614492
## [20,] 0.18184548
## [21,] 0.07616669
## [22,] 0.11183402
## [23,] 0.08513407
pacf(rsdn_ts,main="Índice de inversión en construcción residencial PACF")
# Ahora se calculan las primeras diferencias y se almacenan en una nueva variable.
rsdn_ts_dif = diff(rsdn_ts)
# En segundo lugar se aplica de nuevo el test Dickey-Fuller.
adf.test(rsdn_ts_dif)
## Warning in adf.test(rsdn_ts_dif): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: rsdn_ts_dif
## Dickey-Fuller = -7.9028, Lag order = 5, p-value = 0.01
## alternative hypothesis: stationary
# En tercer lugar graficamos la ACF y PACF para la serie de tiempo con primeras diferencias y observamos su comportamiento.
boxplot(rsdn_ts_dif,horizontal = TRUE)
acf(rsdn_ts_dif,main="Índice de inversión en construcción residencial ACF en primera diferencia")$acf
## , , 1
##
## [,1]
## [1,] 1.00000000
## [2,] -0.45115696
## [3,] -0.01892595
## [4,] 0.10949533
## [5,] -0.13756637
## [6,] 0.05359479
## [7,] -0.07529687
## [8,] 0.16867853
## [9,] -0.21099281
## [10,] 0.10276574
## [11,] 0.06062137
## [12,] -0.28665040
## [13,] 0.35006129
## [14,] -0.13632250
## [15,] -0.04799627
## [16,] 0.10964296
## [17,] -0.10620795
## [18,] 0.08154105
## [19,] -0.17473608
## [20,] 0.25913595
## [21,] -0.19858390
## [22,] 0.08717181
## [23,] 0.03568926
pacf(rsdn_ts_dif,main="Índice de inversión en construcción residencial PACF en primera diferencia")
ARIMA
# Procedemos a estimar el modelo MA (2) con una diferencia. Es decir, un ARIMA(0,1,2)
#Modelo MA2
MA2<-arima(rsdn_ts,c(0,1,2))
MA2_1 = arima(rsdn_ts, c(0,1,1))
summary(MA2)
## Length Class Mode
## coef 2 -none- numeric
## sigma2 1 -none- numeric
## var.coef 4 -none- numeric
## mask 2 -none- logical
## loglik 1 -none- numeric
## aic 1 -none- numeric
## arma 7 -none- numeric
## residuals 181 ts numeric
## call 3 -none- call
## series 1 -none- character
## code 1 -none- numeric
## n.cond 1 -none- numeric
## nobs 1 -none- numeric
## model 10 -none- list
summary(MA2_1)
## Length Class Mode
## coef 1 -none- numeric
## sigma2 1 -none- numeric
## var.coef 1 -none- numeric
## mask 1 -none- logical
## loglik 1 -none- numeric
## aic 1 -none- numeric
## arma 7 -none- numeric
## residuals 181 ts numeric
## call 3 -none- call
## series 1 -none- character
## code 1 -none- numeric
## n.cond 1 -none- numeric
## nobs 1 -none- numeric
## model 10 -none- list
coeftest(MA2)#No se utiliza la función autoarima debido a que al modificar el modelo, su único coeficiente fue significativo.
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ma1 -0.620081 0.073314 -8.4579 <2e-16 ***
## ma2 -0.022036 0.081528 -0.2703 0.7869
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
coeftest(MA2_1)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ma1 -0.629929 0.064708 -9.735 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#Pruebas a los Residuales del mejor modelo
RE<-residuals(MA2_1)
par(mfrow=c(1,2))
acf(RE,main='ACF Residuales de MA(1) con una diferencia',xlab='Retardos')
pacf(RE,main='PACF Residuales de MA(1) con una diferencia',xlab='Retardos')
#Pruebas a los Residuales al cuadrado del mejor modelo
RE2<-RE^2
#par(mfrow=c(1,2))
acf(RE2,main='ACF Residuales de MA (2) con una diferencia al cuadrado',xlab='Retardos')
pacf(RE2,main='PACF Residuales de MA (2) con una diferencia cuadrado',xlab='Retardos')
# Realizamos la prueba de normalidad Shapiro Wilk test
#H0:La distribución es normal
#H1:La distribución no es normal
shapiro.test(RE)
##
## Shapiro-Wilk normality test
##
## data: RE
## W = 0.99248, p-value = 0.4746
#pvalue<=0.05 rechazo Ho
#pvalue> 0.05 acepto Ho
#Buscamos valores más grandes a 0.05 en el pvalue para
#Afirmar que los residuos provienen de una distribución normal
##supuestos del error: ho= ruido balco; h1: los errores cuadrados estan relacioandos
Box.test(RE,1,type="Ljung") # VERIFICA QUE LOS RESIDUOS SE COMPORTAN COMO RUIDO BLANCO
##
## Box-Ljung test
##
## data: RE
## X-squared = 0.00796, df = 1, p-value = 0.9289
Box.test(RE2,1,type="Ljung")
##
## Box-Ljung test
##
## data: RE2
## X-squared = 1.9756, df = 1, p-value = 0.1599