43 votos

Detectar valores atípicos en series temporales (LS/AO/TC) usando el paquete tsoutliers en R. ¿Cómo representar los valores atípicos en formato de ecuación?

Comentarios: En primer lugar, me gustaría dar un gran agradecimiento al autor del nuevo paquete tsoutliers que implementa la detección de valores atípicos en series temporales de Chen y Liu publicado en la revista de la Asociación Estadounidense de Estadística en 1993 en el software de código abierto $R$.

El paquete detecta 5 tipos diferentes de valores atípicos de manera iterativa en datos de series temporales:

  1. Valores Atípicos Aditivos (AO)
  2. Valores Atípicos Innovadores (IO)
  3. Cambio de Nivel (LS)
  4. Cambio Temporal (TC)
  5. Cambio Estacional de Nivel (SLS)

Lo que es aún mejor es que este paquete implementa auto.arima de la paquete forecast por lo que la detección de valores atípicos es perfecta. Además, el paquete produce gráficos agradables para una mejor comprensión de los datos de series temporales.

A continuación están mis preguntas:

Intenté ejecutar algunos ejemplos usando este paquete y funcionó genial. Los valores atípicos aditivos y el cambio de nivel son intuitivos. Sin embargo, tengo 2 preguntas con respecto al manejo de valores atípicos de Cambio Temporal y Valores Atípicos Innovadores que no puedo entender.

Ejemplo de Valor Atípico de Cambio Temporal:

Considere el siguiente ejemplo:

library(tsoutliers)
library(expsmooth)
library(fma)

valor.atipico_pollo <- tsoutliers::tso(pollo,types = c("AO","LS","TC"),maxit.iloop=10)
valor.atipico_pollo
plot(valor.atipico_pollo)

El programa detecta correctamente un cambio de nivel y un cambio temporal en la siguiente ubicación.

Valores Atípicos:
  tipo ind tiempo coeficiente tstat
1   LS  12 1935   37.14 3.153
2   TC  20 1943   36.38 3.350

A continuación se muestra el gráfico y mis preguntas.

  • ¿Cómo escribir el cambio temporal en un formato de ecuación? (El cambio de nivel se puede escribir fácilmente como una variable binaria, en cualquier momento antes de 1935/Obs 12 es 0 y cualquier momento después de 1935 es 1.)

La ecuación para el cambio temporal en el manual del paquete y en el artículo se da como:

$$ L(B) = \frac{1} {1-\delta B} $$

donde $\delta$ es 0.7. Estoy teniendo dificultades para traducir esto al ejemplo anterior.

  • Mi segunda pregunta es sobre valores atípicos innovadores, nunca me he encontrado con un valor atípico innovador en la práctica. Cualquier ejemplo numérico o un ejemplo de caso sería muy útil.

valores atípicos

Editar: @Irishstat, la función tsoutliers hace un excelente trabajo al identificar valores atípicos y sugerir un modelo ARIMA apropiado. Mirando el conjunto de datos de Nile, vea a continuación la aplicación de auto.arima y luego la aplicación de tsoutliers (con los valores predeterminados que incluyen auto.arima):

auto.arima(Nile)
Serie: Nile 
ARIMA(1,1,1)                    

Coeficientes:
         ar1      ma1
      0.2544  -0.8741
s.e.  0.1194   0.0605

sigma^2 estimado como 19769:  log likelihood=-630.63
AIC=1267.25   AICc=1267.51   BIC=1275.04

Después de aplicar la función tsoutliers, identifica un valor atípico de cambio de nivel y un valor atípico aditivo y recomienda un orden ARIMA (0,0,0).

valores.atipicos_nile <- tso(Nile,types = c("AO","LS","TC"))
valores.atipicos_nile
Serie: Nile 
ARIMA(0,0,0) con media distinta de cero

Coeficientes:
      intercepción       LS29       AO43
      1097.7500  -242.2289  -399.5211
s.e.    22.6783    26.7793   120.8446

sigma^2 estimado como 14401:  log likelihood=-620.65
AIC=1249.29   AICc=1249.71   BIC=1259.71

Valores Atípicos:
  tipo ind tiempo coeficiente  tstat
1   LS  29 1899  -242.2 -9.045
2   AO  43 1913  -399.5 -3.306

introducir descripción de la imagen aquí

8 votos

Me alegra ver que encontraste útil el paquete, ¡gracias! Por cierto, he corregido un error tipográfico en la función que traza los resultados para que en la próxima versión del paquete el eje y cubra el rango tanto de la serie original como de la ajustada.

2 votos

En la última versión del paquete, la función tsoutliers ha sido renombrada como tso para evitar conflictos con una función del mismo nombre en el paquete forecast.

1 votos

@javlacalle Descargué la última paquete tsoutliers y todavía tiene tsoutliers en lugar de tso. No estoy seguro de cuándo se actualizará el paquete. Me alegra que tengamos diferentes nombres de funciones.

23voto

einverne Puntos 126

El cambio temporal, TC, es un tipo general de outlier. La ecuación dada en la documentación del paquete y la que escribiste es la ecuación que describe la dinámica de este tipo de outlier. Puedes generarlo mediante la función filter como se muestra a continuación. Es esclarecedor mostrarlo para varios valores de delta. Para $\delta=0$ el TC se desploma en un outlier aditivo; en el otro extremo, $\delta=1$, el TC es como un cambio de nivel.

tc <- rep(0, 50)
tc[20] <- 1
tc1 <- filter(tc, filter = 0, method = "recursive")
tc2 <- filter(tc, filter = 0.3, method = "recursive")
tc3 <- filter(tc, filter = 0.7, method = "recursive")
tc4 <- filter(tc, filter = 1, method = "recursive")
par(mfrow = c(2,2))
plot(tc1, main = "TC delta = 0")
plot(tc2, main = "TC delta = 0.3")
plot(tc3, main = "TC delta = 0.7")
plot(tc4, main = "TC delta = 1", type = "s")

cambio temporal

En tu ejemplo, puedes usar la función outliers.effects para representar los efectos de los outliers detectados en la serie observada:

# impulso unitario
m1 <- ts(outliers.effects(outlier.chicken$outliers, n = length(chicken), weights = FALSE))
tsp(m1) <- tsp(chicken)
# ponderado por los coeficientes estimados
m2 <- ts(outliers.effects(outlier.chicken$outliers, n = length(chicken), weights = TRUE))
tsp(m2) <- tsp(chicken)

El outlier innovacional, IO, es más peculiar. Contrariamente a los otros tipos de outliers considerados en tsoutliers, el efecto del IO depende del modelo seleccionado y de las estimaciones de parámetros. Este hecho puede ser problemático en series con muchos outliers. En las primeras iteraciones del algoritmo (donde el efecto de algunos de los outliers puede no haber sido detectado y ajustado) la calidad de las estimaciones del modelo ARIMA puede no ser lo suficientemente buena como para definir con precisión al IO. Además, a medida que el algoritmo avanza un nuevo modelo ARIMA puede ser seleccionado. Por lo tanto, es posible detectar un IO en una etapa preliminar con un modelo ARIMA pero eventualmente su dinámica está definida por otro modelo ARIMA elegido en la última etapa.

En este documento (1) se muestra que, en algunas circunstancias, la influencia de un IO puede aumentar a medida que la fecha de su ocurrencia se vuelve más distante en el pasado, lo cual es algo difícil de interpretar o asumir.

El IO tiene un potencial interesante ya que puede capturar outliers estacionales. Los otros tipos de outliers considerados en tsoutliers no pueden capturar patrones estacionales. Sin embargo, en algunos casos puede ser mejor buscar posibles cambios de nivel estacionales, SLS, en lugar de IO (como se muestra en el documento mencionado anteriormente).

El IO tiene una interpretación atractiva. A veces se entiende como un outlier aditivo que afecta al término de perturbación y luego se propaga en la serie de acuerdo con la dinámica del modelo ARIMA. En este sentido, el IO es como un outlier aditivo, ambos afectan a una sola observación pero el IO es un impulso en el término de perturbación mientras que el AO es un impulso agregado directamente a los valores generados por el modelo ARIMA o el proceso generador de datos. Ya sea que los outliers afecten a las innovaciones o estén fuera del término de perturbación puede ser motivo de discusión.

En la referencia anterior puedes encontrar algunos ejemplos de datos reales donde se detectan IO.


(1) Outliers estacionales en series temporales. Regina Kaiser y Agustín Maravall. Documento 20.II.2001.

0 votos

Gracias por la respuesta detallada. Realmente lo aprecio. Tengo algunas preguntas adicionales. ¿Existen ventajas en usar auto.arima, identificar el p,d,q y luego usar tsoutliers utilizando arima como tsmethod?

0 votos

También a veces cuando uso IO, obtengo el siguiente mensaje de advertencia; parado cuando se alcanzó 'maxit', también a veces obtengo la siguiente advertencia: En locate.outliers.oloop(y = y, fit = fit, types = types, cval = cval,  : parado cuando se alcanzó 'maxit'. ¿Hay alguna forma de evitarlo?

1 votos

El principal ventaja de usar forecast::auto.arima junto con tsoutliers es que todo se automatiza. Sin embargo, es recomendable ejecutar los procedimientos automáticos con opciones alternativas. Por ejemplo, primero puedes analizar la ACF o realizar pruebas de raíz unitaria y luego elegir un modelo ARIMA para pasar a tsoutliers. Si se encuentran valores atípicos para tu modelo propuesto, entonces puedes repetir el análisis para la serie ajustada. Es un proceso iterativo. El procedimiento automático proporciona una guía útil pero no necesariamente brinda la solución definitiva o única.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X