Sei sulla pagina 1di 16

Universidad Nacional Autónoma de México

Facultad de Ciencias

Proyecto de Series de Tiempo

Fecha de entrega: 28 de mayo de 2018


Proyecto de Series de tiempo
La base de datos utilizada para llevar a cabo el análisis de la serie de tiempo es BJsales.lead, la
cual, es la serie de tiempo de ventas BJsales que contiene 150 observaciones.

Para llevar a cabo el análisis correspondiente se cargan las siguientes paqueterı́as:

> library(astsa)
> library(forecast)
> library(nortest)
> library(stats)

Ahora, se le asigna a la variable llamada ventas la serie de tiempo y se grafica.

> ventas <- BJsales.lead


> plot(ventas)
14
13
12
ventas

11
10

0 50 100 150

Time

Al observar la gráfica se puede decir que no tiene tendencia y/o estacionalidad al tener cambios
constantes, es decir, no se repite ningun patrón en cierto periodo de tiempo; además, no presenta

1
una tendencia creciente o decreciente en el tiempo.

Por lo anterior, se aplica la prueba siguiente:


> BoxCox.lambda(ventas, method="loglik", lower=0)
[1] 1.35
La prueba arroja el resultado λ = 1.35, que es diferente de cero, y, de esa manera, no se hace una
modificación en los datos para poder cambiar el comportamiento de la varianza al no presentar cam-
bios considerables en el tiempo.

Un aspecto importante es que la serie de tiempo sea estacionaria, es decir, que la media y varianza
sean constantes en el tiempo, y esto se refleja gráficamente tomando en cuenta que los valores de la
serie tienden a oscilar alrededor de una media constante y la variabilidad con respecto a esa media
también permanece constante en el tiempo.

Una manera de saber si la serie es estacionaria es graficando el correlograma de la serie de tiempo y


observar el comportamiento que presenta.
> acf(ventas)

Series ventas
1.0
0.8
0.6
ACF

0.4
0.2
0.0
−0.2

0 5 10 15 20

Lag

2
Observando la gráfica se puede decir que la serie no es estacionaria, ya que presenta una tendencia
aparentemente lineal en el tiempo que decrece y por los valores que salen de las bandas de confianza.

Por lo anterior, se tiene que es necesario corregir el problema de no estacionariedad de la serie y


esto se hace considerando las diferencias entre las observaciones que forman parte de la serie de
tiempo; para poder realizarlo se empleará la función dif f , la cual requiere como parámetros la serie
de tiempo, el rezago, que en este caso se toma como uno al no haber estacionalidad en la serie, y el
número de veces que se van a aplicar las diferencias, que en este caso van a ser 4 tomando en cuenta la
gráfica de la serie de tiempo, de la que se puede deducir que tiene relación con un polinomio de grado 4.

De esa manera, se le asigna a la variable ventas 2 la función dif f y se grafica.


> ventas_2 = diff(ventas, diff = 4)
> plot(ventas_2)
4
2
ventas_2

0
−2
−4

0 50 100 150

Time

Observando la gráfica se puede decir que no presenta alguna tendencia y que la varianza es constante.
En este caso, nuevamente se grafica el correlograma
> acf(ventas_2)

3
Series ventas_2

1.0
0.5
ACF

0.0
−0.5

0 5 10 15 20

Lag

De la gráfica se puede observar que se encuentran valores dentro de las bandas de confianza, además
de ya no presentar una tendencia lineal; es por ello que, por las gráficas, se puede decir que la serie
de tiempo ya es estacionaria, pero para poder corroborar este hecho se puede aplicar la prueba de
autocorrelación y la prueba de estacionalidad de library(tseries) o library(stats) tomando un nivel
de significancia del 95% de la siguiente manera:

ˆ Prueba de autocorrelacion
Tomando:

H0 : Las autocorrelaciones no son independientes


vs
H1 : Las autocorrelaciones son independientes

Se aplica la prueba.
> Box.test(ventas_2,type="Ljung-Box")

Box-Ljung test

4
data: ventas_2
X-squared = 99.756, df = 1, p-value < 2.2e-16

En este caso, se tiene que el p − value es cercano a cero, es decir, se rechaza la hipótesis nula,
y, de esa manera, las autocorrelaciones son independientes y la serie de tiempo es estacionaria.

ˆ Prueba de estacionalidad
Tomando:

H0 : La serie de tiempo no es estacionaria


vs
H1 : La serie de tiempo es estacionaria

Se aplica la prueba.

> PP.test(ventas_2)

Phillips-Perron Unit Root Test

data: ventas_2
Dickey-Fuller = -90.165, Truncation lag parameter = 4, p-value = 0.01

Como el p − value < 0.05 se rechaza la hipótesis nula, por lo que, la serie de tiempo es
estacionaria.

Por las gráficas y las pruebas realizadas se puede concluir que la serie de tiempo es estacionaria.

Como la serie de tiempo es estacionaria se puede ajustar un modelo ARM A(p, q), en este caso, lo
primero que se debe hacer es encontrar los parámetros del modelo; esto se puede hacer a partir de
las gráficas de la función de autocorrelación y la función de autocorrelación parcial de la siguiente
manera:

ˆ Función de autocorrelación
Se grafica la función

> acf(ventas_2)

5
Series ventas_2

1.0
0.5
ACF

0.0
−0.5

0 5 10 15 20

Lag

A partir de la gráfica se toman como parámetros los valores o lineas que salen de las bandas de
confianza, en este caso son 9, por lo que q = 9 que corresponde a un modelo M A(9), además
se toma como el valor máximo para este parámetro.

– Función de autocorrelación parcial


Se grafica la función
> pacf(ventas_2)

6
Series ventas_2

0.2
0.0
−0.2
Partial ACF

−0.4
−0.6
−0.8

5 10 15 20

Lag

A partir de la gráfica se toman como parámetros los valores o lineas que salen de las
bandas de confianza, en este caso son 4, por lo que p = 4 que corresponde a un modelo
AR(4), además se toma como el valor máximo para este parámetro.

Por lo anterior, se consideran los parámetros q = 9, q = 4, p = 4 y p = 2, esto para poder hacer


combinaciones y con ello encontrar el mejor modelo que ajusta a la serie de tiempo basándonos
en el valor AIC; los modelos que se van a tomar son: ARM A(4, 9), ARM A(4, 4), ARM A(2, 9)
y ARM A(2, 4). Se desarrollan de la siguiente manera:

– ARM A(4, 9)
Se obtiene el AIC
> m1 <- arima(ventas_2, order=c(4,0,9))
> m1
Call:
arima(x = ventas_2, order = c(4, 0, 9))

Coefficients:

7
ar1 ar2 ar3 ar4 ma1 ma2 ma3 ma4
-1.2288 -0.6056 -0.0161 0.138 -2.1246 0.6974 0.7072 0.1958
s.e. NaN NaN 0.1139 NaN NaN NaN 0.2142 NaN
ma5 ma6 ma7 ma8 ma9 intercept
-0.4343 -0.2701 0.0973 0.2588 -0.1266 0e+00
s.e. NaN NaN NaN NaN NaN 1e-04

sigma^2 estimated as 0.0873: log likelihood = -41.11, aic = 112.21


En este caso AIC = 112.21.

– ARM A(4, 4)
Se obtiene el AIC
> m2 <- arima(ventas_2, order=c(4,0,4))
> m2
Call:
arima(x = ventas_2, order = c(4, 0, 4))

Coefficients:
ar1 ar2 ar3 ar4 ma1 ma2 ma3 ma4
-1.0952 -0.5898 -0.3106 -0.0555 -2.2869 1.1907 0.4981 -0.4013
s.e. NaN 0.1046 0.1306 0.0860 0.0598 0.1425 0.2040 0.1031
intercept
0e+00
s.e. 1e-04

sigma^2 estimated as 0.08778: log likelihood = -40.87, aic = 101.73


En este caso AIC = 101.73.

– ARM A(2, 9)
Se obtiene el AIC
> m3 <- arima(ventas_2, order=c(2,0,9))
> m3
Call:
arima(x = ventas_2, order = c(2, 0, 9))

Coefficients:
ar1 ar2 ma1 ma2 ma3 ma4 ma5 ma6
-1.4291 -0.7511 -1.9716 0.2534 1.1021 0.3960 -1.3691 0.7700
s.e. NaN 0.0673 0.1544 NaN 0.1562 0.3077 0.2150 0.2445
ma7 ma8 ma9 intercept
-0.3316 0.2668 -0.1160 0e+00
s.e. 0.2342 0.2496 0.1093 1e-04

sigma^2 estimated as 0.0842: log likelihood = -38.8, aic = 103.61

8
En este caso AIC = 103.61.

– ARM A(2, 4)
Se obtiene el AIC
> m4 <- arima(ventas_2, order=c(2,0,4))
> m4
Call:
arima(x = ventas_2, order = c(2, 0, 4))

Coefficients:
ar1 ar2 ma1 ma2 ma3 ma4 intercept
-1.0958 -0.2943 -2.1987 0.837 0.9487 -0.5866 0e+00
s.e. NaN 0.0740 NaN NaN NaN NaN 1e-04

sigma^2 estimated as 0.09194: log likelihood = -43.6, aic = 103.2


En este caso AIC = 103.2.

Por los resultados obtenidos se elige el modelo ARM A(4, 4) como el mejor, al tener el menor
AIC con valor 101.73. Ahora, al tener el mejor modelo se puede obtener la predicción, en este
caso se va a obtener para 24 periodos y se va a graficar junto con la serie de tiempo de la
siguiente manera:

> prediccion <- predict(m2,n.ahead=24)


> plot(ventas_2,xlim=c(100,180), ylim=c(-4,4),ylab="Xt", xlab="tiempo")
> lines(prediccion$pred, col='red', lty=2)
> points(prediccion$pred,col='red')

9
4
2
Xt

0
−2
−4

100 120 140 160 180

tiempo

En este caso, se puede ver que la predicción sigue la misma tendencia que la serie de tiempo y
se puede decir que las ventas no presentarán cambios.

Otro análisis que se puede realizar es el análisis de residuales, esto a partir del mejor modelo
obtenido ARM A(4, 4), para realizarlo se grafican los residuales y el correlograma de la siguiente
manera:

> plot(m2$residuals)

10
0.5
m2$residuals

0.0
−0.5

0 50 100 150

Time

> acf(m2$residuals)

11
Series m2$residuals

1.0
0.8
0.6
ACF

0.4
0.2
0.0
−0.2

0 5 10 15 20

Lag

Se puede ver que se comportan como un ruido blanco, es decir, como estacionarios; en cuanto
al correlograma se puede decir que los errores no están correlacionados entre si.

Ahora, lo que se va a probar es si distribuyen N (0, 1), esto se puede hacer a partir de un
histograma y el cálculo del qqplot que considera los cuartiles de una distribución estandar vs
los cuantiles muestrales.

> hist(m2$residuals)

12
Histogram of m2$residuals

40
30
Frequency

20
10
0

−1.0 −0.5 0.0 0.5

m2$residuals

> qqnorm(m2$residuals); qqline(as.vector(m1$residuals), col='blue')

13
Normal Q−Q Plot

0.5
Sample Quantiles

0.0
−0.5

−2 −1 0 1 2

Theoretical Quantiles

En cuanto al histograma se puede observar que tiene parecido con la distribución normal, para
el qqplot se tiene que la mayorı́a de los puntos están sobre la linea, aunque en los extremos hay
algunos que se alejan, sin embargo se puede decir que si pueden distribuir como normal.

Para comprobarlo se aplica la Prueba de Normalidad de Anserson-Darling, tomando:

H0 : Los residuales distribuyen N (0, 1)


vs
H1 : Los residuales no distribuyen N (0, 1)

De la siguiente manera:

> ad.test(m2$residuals)

Anderson-Darling normality test

data: m2$residuals
A = 0.19401, p-value = 0.8915

14
Tomando un nivel de significancia de 95%, se tiene que el p − value > 0.05 y ,de esa manera,
no se rechaza H0 y se concluye que los residuales distribuyen N (0, 1). Tomando en cuenta que
los residuales distribuyen N (0.1) se pueden obtener los intervalos de confianza:

> UL <- prediccion$pred + 1.96*prediccion$se


> LL <- prediccion$pred - 1.96*prediccion$se

Y se grafican:

> plot(ventas_2,xlim=c(100,180), ylim=c(-5,5),ylab="Xt", xlab="t")


> lines(prediccion$pred, col='red', lty=2)
> points(prediccion$pred,col='red')
> lines(UL, col='blue', lty=2)
> lines(LL, col='blue', lty=2)
4
2
Xt

0
−2
−4

100 120 140 160 180

15

Potrebbero piacerti anche