Quiz 3
Se va a hacer un análisis de outliers para la serie de pasajeros, primero se hace un análisis descriptivos de la serie.
data(AirPassengers)
plot(AirPassengers)Con esta gráfica se sospecha que la serie tiene estacionalidad y se observa que tiene varianza no constante y tendencia, se hace una transformación logarítimica para estabilizar la varianza.
lAirpassengers=log(AirPassengers)
plot(lAirpassengers)Ahora se hace la prube a de Dickey - Fuller para detectar estacionalidad
tseries::adf.test(lAirpassengers,k=12)
Augmented Dickey-Fuller Test
data: lAirpassengers
Dickey-Fuller = -1.5325, Lag order = 12, p-value = 0.7711
alternative hypothesis: stationary
Como el p valor es mayor al nivel de significancia no se rechaza la hipótesis nula, por lo tanto hay suficiente evidencia de que los datos son no estacionarios, se ajusta un modelo SARIMA.
dlAirpassengers=diff(lAirpassengers,lag=1)
par(mfrow=c(2,1))
plot(lAirpassengers, ylab = 'datos transformados')
plot(dlAirpassengers, ylab = 'datos diferenciados')tseries::adf.test(dlAirpassengers,k = 15)
Augmented Dickey-Fuller Test
data: dlAirpassengers
Dickey-Fuller = -3.3376, Lag order = 15, p-value = 0.0678
alternative hypothesis: stationary
Al hacer el test nuevamente no se rechaza la hipótesis nula, todavía se debería hacer otra diferenciación.
monthplot(dlAirpassengers)Con este gráfico se observa que todavía existe estacionalidad, se ejecuta nsdiff() para revisar si los datos requieren otra diferenciación todavía,
nsdiffs(dlAirpassengers)[1] 1
El resultado muestra que todavía falta una diferenciación, una vez estabilizada la varianza y eliminada la estacionariedad, se hace un gráfico de autocorrelación y autocorrelación parcial.
DdlAirpassengers=diff(dlAirpassengers,lag=12)
acf(dlAirpassengers) pacf(dlAirpassengers,lag.max = 48)Ajuste del Modelo
Dados los gráficos anteriores se escoge un modelo SARIMA(2, 1, 3)(0, 1, 1)
modelo = Arima(AirPassengers, c(1, 1, 4),seasonal = list(order = c(0, 1, 1), period = 12),lambda = 0)
# 1 diferenciación y transformación logarítmica
coeftest(modelo)
z test of coefficients:
Estimate Std. Error z value Pr(>|z|)
ar1 0.944009 0.048220 19.5773 < 2.2e-16 ***
ma1 -1.373330 0.147916 -9.2845 < 2.2e-16 ***
ma2 0.447062 0.165070 2.7083 0.006763 **
ma3 -0.222342 0.184917 -1.2024 0.229214
ma4 0.148623 0.104568 1.4213 0.155228
sma1 -0.553486 0.077168 -7.1725 7.365e-13 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
modeloSeries: AirPassengers
ARIMA(1,1,4)(0,1,1)[12]
Box Cox transformation: lambda= 0
Coefficients:
ar1 ma1 ma2 ma3 ma4 sma1
0.9440 -1.3733 0.4471 -0.2223 0.1486 -0.5535
s.e. 0.0482 0.1479 0.1651 0.1849 0.1046 0.0772
sigma^2 = 0.00134: log likelihood = 247.06
AIC=-480.11 AICc=-479.2 BIC=-459.98
Se quitan los parámetros no significativos,
modeloref = Arima(AirPassengers, c(1, 1, 4),seasonal = list(order = c(0, 1, 1), period = 12),lambda = 0, fixed = c(NA, NA, NA, 0, 0, NA))
# 1 diferenciación y transformación logarítmica
coeftest(modeloref)
z test of coefficients:
Estimate Std. Error z value Pr(>|z|)
ar1 0.900474 0.090944 9.9014 < 2.2e-16 ***
ma1 -1.356290 0.105940 -12.8024 < 2.2e-16 ***
ma2 0.341780 0.111878 3.0549 0.002251 **
sma1 -0.552876 0.077086 -7.1722 7.38e-13 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
modelorefSeries: AirPassengers
ARIMA(1,1,4)(0,1,1)[12]
Box Cox transformation: lambda= 0
Coefficients:
ar1 ma1 ma2 ma3 ma4 sma1
0.9005 -1.3563 0.3418 0 0 -0.5529
s.e. 0.0909 0.1059 0.1119 0 0 0.0771
sigma^2 = 0.001295: log likelihood = 246.02
AIC=-482.04 AICc=-481.56 BIC=-467.67
Análisis de residuales
res = modeloref$residuals
plot(res)Los residuos no presentan tendencia y están alrededor de 0, sin embargo se observa que hay datos alejados de la media, estos podrían ser outliers.
acf(res)acf(res^2)Se observa que los residuos se comportan como un ruido blanco, es decir, se cumple nuestro supuesto.
Los residuos al cuadrado se comportan bien, es decir, no hay varianza condicional no constante.
Box.test(res, lag=12 , type = "Ljung-Box", fitdf = 2)
Box-Ljung test
data: res
X-squared = 8.7911, df = 10, p-value = 0.552
No se rechaza la hipótesis de no autocorrelación.
tseries::jarque.bera.test(res)
Jarque Bera Test
data: res
X-squared = 11.501, df = 2, p-value = 0.003182
Se rechaza la hipótesis nula, no hay evidencia suficiente para asegurar que los errores provengan de una dsitribución normal.
hist(res)plot(cum,type="l",ylim=c(min(LI),max(LS)),xlab="t",ylab="",main="CUSUM")
lines(LS,type="S",col="red")
lines(LI,type="S",col="red")plot(cumq,type="l",xlab="t",ylab="",main="CUSUMSQ")
lines(LQS,type="S",col="red")
lines(LQI,type="S",col="red")Se observa que el gráfico cumsum al cuadrado se sale de los intervalos.
Outliers
coef= coefs2poly(modelo)
coef$arcoefs
[1] 1.9440085 -0.9440085 0.0000000 0.0000000 0.0000000 0.0000000
[7] 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 1.0000000
[13] -1.9440085 0.9440085
$macoefs
[1] -1.37333015 0.44706158 -0.22234178 0.14862298 0.00000000 0.00000000
[7] 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 -0.55348580
[13] 0.76011874 -0.24744224 0.12306302 -0.08226071
attr(,"class")
[1] "ArimaPars"
outliers= locate.outliers(res, coef)
outliers type ind coefhat tstat
1 AO 29 0.08213950 4.231479
2 AO 38 0.06854757 3.531259
3 AO 62 -0.07744486 -3.989274
4 AO 135 -0.09934798 -4.510079
5 LS 24 0.07523411 3.623006
6 LS 54 -0.08606390 -4.144449
Se encuentra un outlier de tipo aditivo en la observación 29, 38, 62 y de tipo cambio de nivel en las observacion 24 y 54.
n=length(AirPassengers)
xreg = outliers.effects(outliers, n)modelo1 = Arima(AirPassengers, c(1, 1, 2),seasonal = list(order = c(0, 1, 1), period = 12),lambda = 0, xreg = xreg)
coeftest(modelo1)
z test of coefficients:
Estimate Std. Error z value Pr(>|z|)
ar1 -0.465964 0.350626 -1.3289 0.1838655
ma1 0.145309 0.345804 0.4202 0.6743348
ma2 -0.036408 0.187405 -0.1943 0.8459598
sma1 -0.448477 0.086118 -5.2077 1.912e-07 ***
AO29 0.090749 0.020400 4.4486 8.644e-06 ***
AO38 0.067881 0.020034 3.3883 0.0007032 ***
AO62 -0.066747 0.019994 -3.3384 0.0008426 ***
AO135 -0.103743 0.022575 -4.5955 4.317e-06 ***
LS24 0.081188 0.024084 3.3710 0.0007490 ***
LS54 -0.103198 0.023905 -4.3170 1.582e-05 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
modelo1Series: AirPassengers
Regression with ARIMA(1,1,2)(0,1,1)[12] errors
Box Cox transformation: lambda= 0
Coefficients:
ar1 ma1 ma2 sma1 AO29 AO38 AO62 AO135
-0.4660 0.1453 -0.0364 -0.4485 0.0907 0.0679 -0.0667 -0.1037
s.e. 0.3506 0.3458 0.1874 0.0861 0.0204 0.0200 0.0200 0.0226
LS24 LS54
0.0812 -0.1032
s.e. 0.0241 0.0239
sigma^2 = 0.0008681: log likelihood = 279.83
AIC=-537.66 AICc=-535.44 BIC=-506.03
modelo1ref = Arima(AirPassengers, c(1, 1, 2),seasonal = list(order = c(0, 1, 1), period = 12),lambda = 0, xreg = xreg, fixed = c(0, 0, 0, NA, NA, NA, NA, NA, NA, NA))
coeftest(modelo1ref)
z test of coefficients:
Estimate Std. Error z value Pr(>|z|)
sma1 -0.446800 0.098109 -4.5541 5.261e-06 ***
AO29 0.104292 0.018250 5.7145 1.101e-08 ***
AO38 0.059098 0.018196 3.2479 0.0011627 **
AO62 -0.069066 0.018166 -3.8020 0.0001436 ***
AO135 -0.105709 0.021122 -5.0047 5.594e-07 ***
LS24 0.080245 0.026085 3.0762 0.0020963 **
LS54 -0.089974 0.025458 -3.5342 0.0004091 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
modelo1refSeries: AirPassengers
Regression with ARIMA(1,1,2)(0,1,1)[12] errors
Box Cox transformation: lambda= 0
Coefficients:
ar1 ma1 ma2 sma1 AO29 AO38 AO62 AO135 LS24 LS54
0 0 0 -0.4468 0.1043 0.0591 -0.0691 -0.1057 0.0802 -0.0900
s.e. 0 0 0 0.0981 0.0183 0.0182 0.0182 0.0211 0.0261 0.0255
sigma^2 = 0.0009409: log likelihood = 272.99
AIC=-529.99 AICc=-528.81 BIC=-506.99
resi_analisis= residuals(modelo1ref)
coef_analisis= coefs2poly(modelo1ref)
outliers_analisis= locate.outliers(resi_analisis,coef_analisis)
outliers_analisis[1] type ind coefhat tstat
<0 rows> (or 0-length row.names)
Ya no hay outliers en el modelo.
res = modelo1ref$residuals
plot(res)Box.test(res, lag=12 , type = "Ljung-Box", fitdf = 2)
Box-Ljung test
data: res
X-squared = 25.96, df = 10, p-value = 0.003795
tseries::jarque.bera.test(res)
Jarque Bera Test
data: res
X-squared = 0.43247, df = 2, p-value = 0.8055
No se rechaza la hipótesis nula, por lo tanto aun evindecia para segurar que los datos provienen de una distribución normal.
hist(res)plot(cum,type="l",ylim=c(min(LI),max(LS)),xlab="t",ylab="",main="CUSUM")
lines(LS,type="S",col="red")
lines(LI,type="S",col="red")plot(cumq,type="l",xlab="t",ylab="",main="CUSUMSQ")
lines(LQS,type="S",col="red")
lines(LQI,type="S",col="red")Se observa que el gráfico cumsum al cuadrado se comporta mejor después de la eliminación de los outliers.