R para finanzas y economía

Análisis de series temporales con R (III): Autocorrelación

4.3
(12)

Siguiendo con el tema de series temporales y el análisis de estacionariedad y raíces unitarias, en esta entrada vamos a tratar el concepto de la autocorrelación, cómo calcular la función de autocorrelación (ACF) y autocorrelación parcial (PACF) en el lenguaje de  programación R así como graficar un correlograma.

¿Qué es la autocorrelación en las series temporales?

Es un término estadístico que se utiliza para describir la presencia o ausencia de correlación en los datos de las series temporales, indicando, si las observaciones pasadas influyen en las actuales.

Por tanto, se puede decir que la autocorrelación hace referencia cuando los valores que toman una variable en el tiempo no son independientes entre sí, sino que un valor determinado depende de los valores anteriores.

El problema de la autocorrelación se denomina también frecuentemente de “correlación serial”.

Para medir la autocorrelación se suele usar:

  • La función de autocorrelación
  • La función de autocorrelación parcial

La función de autocorrelación (ACF)

  • Mide la correlación entre dos variables separadas por k periodos.
  • Mide el grado de asociación lineal que existe entre dos variables del mismo proceso estocástico.

La función de autocorrelación parcial (PACF)

  • Mide la correlación entre dos variables separadas por k periodos cuando no se considera la dependencia creada por los retardos intermedios existentes entre ambas.
  • Mide la autocorrelación que existe entre dos variables separadas k períodos descontando los posibles efectos debidos a variables intermedias.

La función ACF es usada para identificar el proceso de media móvil (MA) en un modelo ARIMA; mientras que la función PACF se usa para identificar los valores de la parte del proceso autoregresivo (AR).

Los gráficos generados a partir de estas funciones se denominan correlogramas, los cuales contienen bandas con un intervalo de confianza del 95%.

Vamos a trabajar con el dataset “lynx” que viene por defecto en R.

Este dataset contiene el número de linces atrapados cada año en Canadá, entre los períodos de 1821 y 1934.

data(lynx)

Linces <- lynx
class(Linces)
## [1] "ts"
head(Linces)
## [1]  269  321  585  871 1475 2821
plot(Linces)

plot of chunk unnamed-chunk-27

Aplicamos ACF:

acf(Linces, lag.max =20, plot =F)
## 
## Autocorrelations of series 'Linces', by lag
## 
##      0      1      2      3      4      5      6      7      8      9 
##  1.000  0.711  0.214 -0.189 -0.433 -0.502 -0.400 -0.148  0.218  0.501 
##     10     11     12     13     14     15     16     17     18     19 
##  0.514  0.283 -0.029 -0.303 -0.450 -0.461 -0.346 -0.098  0.223  0.426 
##     20 
##  0.404

Donde “lag.max” indica el número máximo de retardos para el cual se calculará.

Para ver el gráfico:

acf(Linces, lag.max =20, plot =T)

plot of chunk unnamed-chunk-29

En este caso, se omite la primera barra ya que corresponde a la autocorrelación con la misma observación, retraso/lag =0. Por ende, la segunda y tercera barra son significativas.

Si miramos la función de autocorrelación parcial:

pacf(Linces, lag.max =20, plot =F)
## 
## Partial autocorrelations of series 'Linces', by lag
## 
##      1      2      3      4      5      6      7      8      9     10 
##  0.711 -0.588 -0.039 -0.250 -0.094 -0.052  0.119  0.301  0.055 -0.081 
##     11     12     13     14     15     16     17     18     19     20 
## -0.089 -0.040 -0.099 -0.014 -0.113 -0.108 -0.006  0.116 -0.016 -0.018

Graficamos:

pacf(Linces, lag.max =20, plot =T)

plot of chunk unnamed-chunk-31

En este otro caso, la primera barra corresponde al primer retraso. La primera barra es entonces muy significativa, la segunda también pero en otro sentido al ser negativa.

Si comparamos lo anterior, con unos datos generados aleatoriamente y que tienen una distribución normal, (con media y varianza constantes) podemos observar que las funciones tanto ACF y PACF no son significativas:

datos <- ts(rnorm(800))
plot(datos)

plot of chunk unnamed-chunk-32

acf(datos, lag.max = 20, plot=T)

plot of chunk unnamed-chunk-33

pacf(datos, lag.max =20, plot =T)

plot of chunk unnamed-chunk-33

Para para aprender más casos prácticos de R para finanzas, ve a la página de finanzas cuantitativas.

¿Te ha parecido útil? ¡Puntúa esta entrada!

¡Haz clic en una estrella para puntuar!

Promedio de puntuación 4.3 / 5. Recuento de votos: 12

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.

4 Comments

  • Reply
    Robert Jaffer Tejeda Rodriguez
    21 junio, 2020 at 4:39 am

    Hola. es posible que puedas indicar como hacer en Rstudio una simulación de una serie ARIMA con el método de monte carlo para analizar su estacionariedad .

  • Reply
    Johnny Alvarez
    7 febrero, 2019 at 9:02 pm

    Hola Conney, excelente explicación, he buscado por muchos lugares para entender estas funciones y ahora lo tengo muy claro, muchas gracias por eso, un consulta, usted tiene algun tutorial como estos pero para completar el modelo ARIMA? o sea ya lo has casi terminado, pero me encantaría ver la predicción hecha con el modelo. Gracias

  • Reply
    sergio
    30 marzo, 2018 at 8:18 pm

    buen articulo
    como hago para que una variable sea definida como una serie de tiempo “ts”?

    • Reply
      Conney Marulanda López
      31 marzo, 2018 at 11:56 am

      Hola Sergio!

      Gracias por tu comentario.

      La función ts() convierte un objeto a serie temporal, tal y como lo hago en la entrada, cuando genero una serie de datos aleatorios:

      datos <- ts(rnorm(800))

      Con esto, hago que esos datos sean de tipo "time series".

      Hay que tener presente que con ts(), necesitamos que los datos estén distribuidos de manera regular en la escala temporal utilizada, por ejemplo, si trabajamos con datos diarios, necesitamos que siempre haya un dato por día. Si este no es el caso y la serie temporal se compone de observaciones distribuidas de manera irregular en el tiempo, se deberá utilizar la función zoo().

      Los principales argumentos de la función ts() son:
      - data, equivale al vector o matriz de los valores de la serie temporal.
      - start, corresponde a la fecha de la primera observación.
      - end, corresponde a la fecha de la última observación. Se especifica de la misma manera que "start".
      - frequency, equivale al número de observaciones por unidad de tiempo.
      - class, por defecto es "ts" utilizado para una sola serie temporal, si se trabaja con varias series temporales c("mts", "ts", "matrix").

      Si retomamos el ejemplo anterior y quisiéramos construir una serie temporal de datos mensuales, con inicio en agosto de 1950:

      datos <- ts(rnorm(800), start=c(1950,8), frequency=12)

      Espero haberte ayudado. Cualquier duda o pregunta no dudes en escribir.

      Saludos,

      Conney

Leave a Reply

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.