Algoritmo simple para la detección de valores atípicos en línea de una serie temporal genérica

88

Estoy trabajando con una gran cantidad de series de tiempo. Estas series temporales son básicamente mediciones de red que se realizan cada 10 minutos, y algunas de ellas son periódicas (es decir, el ancho de banda), mientras que otras no (es decir, la cantidad de tráfico de enrutamiento).

Me gustaría un algoritmo simple para hacer una "detección de valores atípicos" en línea. Básicamente, quiero mantener en la memoria (o en el disco) todos los datos históricos para cada serie de tiempo, y quiero detectar cualquier valor atípico en un escenario en vivo (cada vez que se captura una nueva muestra). ¿Cuál es la mejor manera de lograr estos resultados?

Actualmente estoy usando un promedio móvil para eliminar algo de ruido, pero ¿qué sigue? Cosas simples como la desviación estándar, loco, ... contra todo el conjunto de datos no funciona bien (no puedo asumir que las series temporales son estacionarias), y me gustaría algo más "preciso", idealmente un cuadro negro como:

double outlier_detection (vector doble *, valor doble);

donde vector es la matriz de doble que contiene los datos históricos, y el valor de retorno es el puntaje de anomalía para el nuevo "valor" de la muestra.

gianluca
fuente
1
Solo por claridad, aquí está la pregunta original sobre SO: stackoverflow.com/questions/3390458/…
Matt Parker
1
Creo que deberíamos alentar a los carteles a publicar enlaces como parte de la pregunta si han publicado la misma pregunta en otro sitio de SE.
Sí, tienes toda la razón. La próxima vez mencionaré que el mensaje está en cruz.
gianluca
También le sugiero que consulte los otros enlaces relacionados en el lado derecho de la página. Esta es una pregunta popular y ha surgido en una variedad de preguntas anteriormente. Si no son satisfactorios, lo mejor es actualizar su pregunta sobre los detalles de su situación.
Andy W
Buena captura, @Andy! Combinemos esta pregunta con la otra.
whuber

Respuestas:

75

Aquí hay una función R simple que encontrará valores atípicos de series temporales (y opcionalmente los mostrará en una gráfica). Manejará series temporales estacionales y no estacionales. La idea básica es encontrar estimaciones sólidas de la tendencia y los componentes estacionales y restarlos. Luego encuentre valores atípicos en los residuos. La prueba para valores atípicos residuales es la misma que para el diagrama de caja estándar: se supone que los puntos superiores a 1.5 IQR por encima o por debajo de los cuartiles superior e inferior son valores atípicos. El número de IQR por encima / debajo de estos umbrales se devuelve como un "puntaje" atípico. Por lo tanto, la puntuación puede ser cualquier número positivo y será cero para los no atípicos.

Me doy cuenta de que no está implementando esto en R, pero a menudo encuentro que una función R es un buen lugar para comenzar. Entonces la tarea es traducir esto a cualquier idioma que se requiera.

tsoutliers <- function(x,plot=FALSE)
{
    x <- as.ts(x)
    if(frequency(x)>1)
        resid <- stl(x,s.window="periodic",robust=TRUE)$time.series[,3]
    else
    {
        tt <- 1:length(x)
        resid <- residuals(loess(x ~ tt))
    }
    resid.q <- quantile(resid,prob=c(0.25,0.75))
    iqr <- diff(resid.q)
    limits <- resid.q + 1.5*iqr*c(-1,1)
    score <- abs(pmin((resid-limits[1])/iqr,0) + pmax((resid - limits[2])/iqr,0))
    if(plot)
    {
        plot(x)
        x2 <- ts(rep(NA,length(x)))
        x2[score>0] <- x[score>0]
        tsp(x2) <- tsp(x)
        points(x2,pch=19,col="red")
        return(invisible(score))
    }
    else
        return(score)
}
Rob Hyndman
fuente
+1 de mi parte, excelente. Entonces, ¿el rango intercuartil> 1.5 X es la definición consensuada de un valor atípico para series dependientes del tiempo? Sería bueno tener una referencia independiente de la escala.
Doug
La prueba atípica está en los residuos, por lo que es de esperar que la dependencia del tiempo sea pequeña. No conozco un consenso, pero los diagramas de caja a menudo se usan para la detección de valores atípicos y parecen funcionar razonablemente bien. Hay mejores métodos si alguien quisiera hacer la función un poco más elegante.
Rob Hyndman el
Realmente gracias por su ayuda, realmente lo aprecio. Ahora estoy bastante ocupado en el trabajo, pero voy a probar un enfoque como el suyo lo antes posible, y volveré con mis consideraciones finales sobre este tema. Solo pensé: en su función, por lo que veo, tengo que especificar manualmente la frecuencia de la serie temporal (al construirla), y el componente de estacionalidad se considera solo cuando la frecuencia es mayor que 1. ¿Hay una manera sólida? lidiar con esto automáticamente?
gianluca
1
Sí, he asumido que la frecuencia es conocida y especificada. Existen métodos para estimar la frecuencia automáticamente, pero eso complicaría considerablemente la función. Si necesita estimar la frecuencia, intente hacer una pregunta por separado, ¡y probablemente le daré una respuesta! Pero necesita más espacio del que tengo disponible en un comentario.
Rob Hyndman
2
@ Marcin, te recomiendo que lo apuñes tú mismo. Tal vez pegue su solución en gist.github.com y publique una pregunta SO cuando haya terminado, para que otros verifiquen su trabajo.
Ken Williams
27

Una buena solución tendrá varios ingredientes, que incluyen:

  • Use una ventana móvil resistente y suave para eliminar la no estacionariedad.

  • Vuelva a expresar los datos originales para que los residuos con respecto a la suavidad se distribuyan aproximadamente simétricamente. Dada la naturaleza de sus datos, es probable que sus raíces cuadradas o logaritmos den residuales simétricos.

  • Aplique métodos de gráfico de control, o al menos pensamiento de gráfico de control, a los residuos.

En lo que respecta al último, el pensamiento de la tabla de control muestra que los umbrales "convencionales" como 2 SD o 1.5 veces el IQR más allá de los cuartiles funcionan mal porque activan demasiadas señales falsas fuera de control. Las personas generalmente usan 3 SD en el trabajo de la tabla de control, por lo que 2.5 (o incluso 3) veces el IQR más allá de los cuartiles sería un buen punto de partida.

He esbozado más o menos la naturaleza de la solución de Rob Hyndman al mismo tiempo que le agrego dos puntos principales: la necesidad potencial de volver a expresar los datos y la sabiduría de ser más conservador al señalar un valor atípico. Sin embargo, no estoy seguro de que Loess sea bueno para un detector en línea, porque no funciona bien en los puntos finales. En su lugar, puede usar algo tan simple como un filtro de mediana móvil (como en el suavizado resistente de Tukey). Si los valores atípicos no vienen en ráfagas, puede usar una ventana estrecha (5 puntos de datos, tal vez, que se descompondrán solo con una explosión de 3 o más valores atípicos dentro de un grupo de 5).

Una vez que haya realizado el análisis para determinar una buena reexpresión de los datos, es poco probable que necesite cambiar la reexpresión. Por lo tanto, su detector en línea realmente solo necesita hacer referencia a los valores más recientes (la última ventana) porque no utilizará los datos anteriores. Si tiene series de tiempo realmente largas, podría ir más allá para analizar la autocorrelación y la estacionalidad (como las fluctuaciones diarias o semanales recurrentes) para mejorar el procedimiento.

whuber
fuente
3
Esta es una respuesta extraordinaria para el análisis práctico. Nunca hubiera pensado que era necesario probar 3 IQR más allá de los cuartiles.
John Robertson
3
@John, 1.5 IQR es la recomendación original de Tukey para los bigotes más largos en un diagrama de caja y 3 IQR es su recomendación para marcar puntos como "valores atípicos" (un riff en una frase popular de los años 60). Esto está integrado en muchos algoritmos de diagrama de caja. La recomendación se analiza teóricamente en Hoaglin, Mosteller y Tukey, Understanding Robust and Exploratory Data Analysis.
whuber
Esto confirma los datos de series temporales que he estado tratando de analizar. Ventana promedio y también una ventana de desviaciones estándar. ((x - avg) / sd)> 3 parecen ser los puntos que quiero marcar como valores atípicos. Bueno, al menos advertir como valores atípicos, señalo cualquier valor superior a 10 SD como valores atípicos de error extremo. El problema con el que me encuentro es ¿cuál es la longitud ideal de una ventana? Estoy jugando con cualquier cosa entre 4-8 puntos de datos.
Josh Peak
1
@Neo Su mejor opción puede ser experimentar con un subconjunto de sus datos y confirmar sus conclusiones con pruebas en el resto. También podría realizar una validación cruzada más formal (pero se necesita un cuidado especial con los datos de series temporales debido a la interdependencia de todos los valores).
whuber
17

(Esta respuesta respondió a una pregunta duplicada (ahora cerrada) en Detección de eventos pendientes , que presentó algunos datos en forma gráfica).


La detección de valores atípicos depende de la naturaleza de los datos y de lo que esté dispuesto a asumir sobre ellos. Los métodos de uso general se basan en estadísticas sólidas. El espíritu de este enfoque es caracterizar la mayor parte de los datos de una manera que no esté influenciada por valores atípicos y luego señalar cualquier valor individual que no se ajuste a esa caracterización.

Debido a que esta es una serie temporal, agrega la complicación de la necesidad de (re) detectar valores atípicos de manera continua. Si esto se va a hacer a medida que se desarrolla la serie, entonces solo se nos permite usar datos más antiguos para la detección, ¡no datos futuros! Además, como protección contra las muchas pruebas repetidas, nos gustaría utilizar un método que tenga una tasa muy baja de falsos positivos.

Estas consideraciones sugieren ejecutar una prueba atípica de ventana móvil simple y robusta sobre los datos . Hay muchas posibilidades, pero una simple, fácil de entender e implementar, se basa en un MAD en ejecución: desviación media absoluta de la mediana. Esta es una medida de variación muy sólida dentro de los datos, similar a una desviación estándar. Un pico periférico sería de varios MAD o más que la mediana.

Rx=(1,2,,n)n=1150y

# Parameters to tune to the circumstances:
window <- 30
threshold <- 5

# An upper threshold ("ut") calculation based on the MAD:
library(zoo) # rollapply()
ut <- function(x) {m = median(x); median(x) + threshold * median(abs(x - m))}
z <- rollapply(zoo(y), window, ut, align="right")
z <- c(rep(z[1], window-1), z) # Use z[1] throughout the initial period
outliers <- y > z

# Graph the data, show the ut() cutoffs, and mark the outliers:
plot(x, y, type="l", lwd=2, col="#E00000", ylim=c(0, 20000))
lines(x, z, col="Gray")
points(x[outliers], y[outliers], pch=19)

Aplicado a un conjunto de datos como la curva roja ilustrada en la pregunta, produce este resultado:

Trama

Los datos se muestran en rojo, la ventana de 30 días de mediana + 5 * umbrales MAD en gris, y los valores atípicos, que son simplemente esos valores de datos por encima de la curva gris, en negro.

(El umbral solo se puede calcular comenzando al final de la ventana inicial. Para todos los datos dentro de esta ventana inicial, se usa el primer umbral: es por eso que la curva gris es plana entre x = 0 yx = 30).

Los efectos de cambiar los parámetros son (a) aumentar el valor de windowtenderá a suavizar la curva gris y (b) aumentar thresholdaumentará la curva gris. Sabiendo esto, uno puede tomar un segmento inicial de los datos e identificar rápidamente los valores de los parámetros que mejor separan los picos periféricos del resto de los datos. Aplique estos valores de parámetros para verificar el resto de los datos. Si una gráfica muestra que el método está empeorando con el tiempo, eso significa que la naturaleza de los datos está cambiando y los parámetros pueden necesitar un nuevo ajuste.

Observe lo poco que supone este método sobre los datos: no tienen que distribuirse normalmente; no necesitan exhibir ninguna periodicidad; ni siquiera tienen que ser no negativos. Todo lo que supone es que los datos se comportan de manera razonablemente similar a lo largo del tiempo y que los picos periféricos son visiblemente más altos que el resto de los datos.


Si a alguien le gustaría experimentar (o comparar alguna otra solución con la que se ofrece aquí), aquí está el código que utilicé para producir datos como los que se muestran en la pregunta.

n.length <- 1150
cycle.a <- 11
cycle.b <- 365/12
amp.a <- 800
amp.b <- 8000

set.seed(17)
x <- 1:n.length
baseline <- (1/2) * amp.a * (1 + sin(x * 2*pi / cycle.a)) * rgamma(n.length, 40, scale=1/40)
peaks <- rbinom(n.length, 1,  exp(2*(-1 + sin(((1 + x/2)^(1/5) / (1 + n.length/2)^(1/5))*x * 2*pi / cycle.b))*cycle.b))
y <- peaks * rgamma(n.length, 20, scale=amp.b/20) + baseline
whuber
fuente
Esta es una solución realmente interesante y agradezco que pueda implementarla sin usar R (solo usando JavaScript simple en una aplicación web). ¡Gracias!
hgoebl
5

Supongo que el modelo sofisticado de series temporales no funcionará para usted debido al tiempo que lleva detectar los valores atípicos utilizando esta metodología. Por lo tanto, aquí hay una solución alternativa:

  1. Primero establezca una línea de base de patrones de tráfico 'normales' para un año basado en el análisis manual de datos históricos que tenga en cuenta la hora del día, día de la semana vs fin de semana, mes del año, etc.

  2. Use esta línea base junto con algún mecanismo simple (por ejemplo, promedio móvil sugerido por Carlos) para detectar valores atípicos.

Es posible que también desee revisar la literatura de control de procesos estadísticos para algunas ideas.


fuente
1
Sí, esto es exactamente lo que estoy haciendo: hasta ahora dividí manualmente la señal en períodos, de modo que para cada uno de ellos puedo definir un intervalo de confianza dentro del cual se supone que la señal es estacionaria, y por lo tanto puedo usar métodos estándar como como desviación estándar, ... El verdadero problema es que no puedo decidir el patrón esperado para todas las señales que tengo que analizar, y es por eso que estoy buscando algo más inteligente.
gianluca
Aquí hay una idea: Paso 1: Implementar y estimar un modelo genérico de series de tiempo sobre una base única basada en datos históricos. Esto se puede hacer sin conexión. Paso 2: use el modelo resultante para detectar valores atípicos. Paso 3: con cierta frecuencia (¿quizás cada mes?), Vuelva a calibrar el modelo de serie temporal (esto se puede hacer sin conexión) para que su detección de valores atípicos en el paso 2 no se salga demasiado del ritmo con los patrones de tráfico actuales. ¿Funcionaría eso para tu contexto?
Sí, esto podría funcionar. Estaba pensando en un enfoque similar (volver a calcular la línea de base cada semana, que puede ser intensiva en la CPU si tiene cientos de series de tiempo univariadas para analizar). Por cierto, la verdadera pregunta difícil es "¿cuál es el mejor algoritmo de estilo blackbox para modelar una señal completamente genérica, considerando el ruido, la estimación de tendencias y la estacionalidad?". AFAIK, cada enfoque en la literatura requiere una fase de "ajuste de parámetros" realmente difícil, y el único método automático que encontré es un modelo ARIMA de Hyndman ( robjhyndman.com/software/forecast ). ¿Me estoy perdiendo de algo?
gianluca
Tenga en cuenta que no soy demasiado vago para investigar estos parámetros, el punto es que estos valores deben establecerse de acuerdo con el patrón esperado de la señal, y en mi escenario no puedo suponer nada.
gianluca
Los modelos ARIMA son modelos clásicos de series temporales que se pueden usar para ajustar datos de series temporales. Le animo a explorar la aplicación de los modelos ARIMA. Podrías esperar a que Rob esté en línea y quizás él intervenga con algunas ideas.
5

Ajuste estacionalmente los datos para que un día normal parezca más plano. Puede tomar la muestra de hoy a las 5:00 pm y restar o dividir el promedio de los 30 días anteriores a las 5:00 pm. Luego mire más allá de N desviaciones estándar (medidas usando datos preajustados) para valores atípicos. Esto podría hacerse por separado para las "estaciones" semanales y diarias.

James Roth
fuente
Nuevamente, esto funciona bastante bien si se supone que la señal tiene una estacionalidad como esa, pero si uso una serie de tiempo completamente diferente (es decir, el tiempo promedio de ida y vuelta del TCP a lo largo del tiempo), este método no funcionará (ya que sería mejor manejar eso con una media global simple y desviación estándar usando una ventana deslizante que contiene datos históricos).
gianluca
1
A menos que esté dispuesto a implementar un modelo de serie de tiempo general (que trae sus contras en términos de latencia, etc.), soy pesimista de que encontrará una implementación general que, al mismo tiempo, sea lo suficientemente simple como para funcionar para todo tipo de series de tiempo.
Otro comentario: sé que una buena respuesta podría ser "para que pueda estimar la periodicidad de la señal y decidir el algoritmo que usará de acuerdo con ella", pero no encontré una solución realmente buena para este otro problema (jugué un bit con análisis espectral usando DFT y análisis de tiempo usando la función de autocorrelación, pero mis series de tiempo contienen mucho ruido y tales métodos dan algunos resultados locos la mayor parte del tiempo)
gianluca
Un comentario a su último comentario: es por eso que estoy buscando un enfoque más genérico, pero necesito una especie de "recuadro negro" porque no puedo suponer nada sobre la señal analizada y, por lo tanto, no puedo crear el "mejor conjunto de parámetros para el algoritmo de aprendizaje".
gianluca
@gianluca Como ha indicado, la estructura ARIMA subyacente puede enmascarar la anomalía. La formulación incorrecta de posibles causas como variables de la hora del día, día de la semana, efectos de vacaciones, etc. también puede enmascarar la anomalía. La respuesta es bastante clara: necesita tener una buena ecuación para detectar efectivamente las anomalías. Para citar a Bacon, "Quien conozca los caminos de la Naturaleza notará más fácilmente sus desviaciones y, por otro lado, quien conozca sus desviaciones describirá con mayor precisión sus caminos".
IrishStat
3

Una alternativa al enfoque esbozado por Rob Hyndman sería utilizar el pronóstico de Holt-Winters . Las bandas de confianza derivadas de Holt-Winters se pueden usar para detectar valores atípicos. Aquí hay un documento que describe cómo usar Holt-Winters para "Detección de comportamiento aberrante en series de tiempo para monitoreo de red". Una implementación para RRDTool se puede encontrar aquí .

Peter Prettenhofer
fuente
2

El análisis espectral detecta la periodicidad en series de tiempo estacionarias. El enfoque de dominio de frecuencia basado en la estimación de densidad espectral es un enfoque que recomendaría como su primer paso.

Si durante ciertos períodos la irregularidad significa un pico mucho más alto que el típico para ese período, entonces la serie con tales irregularidades no sería estacionaria y el análisis espectral no sería apropiado. Pero suponiendo que haya identificado el período que tiene las irregularidades, debería poder determinar aproximadamente cuál sería la altura máxima normal y luego establecer un umbral en algún nivel por encima de ese promedio para designar los casos irregulares.

Michael Chernick
fuente
2
¿Podría explicar cómo esta solución detectaría "irregularidades locales"? Presentar un ejemplo trabajado sería extremadamente útil. (Para ser honesto, te sugiero que hagas esto porque al realizar dicho ejercicio creo que descubrirás que tu sugerencia no es efectiva para la detección de valores atípicos. Pero podría estar equivocado ...)
whuber
1
@whuber El análisis espectral solo identificará dónde están todos los picos. El siguiente paso sería ajustar un modelo de serie yime usando términos seno y coseno con las frecuencias determinadas a partir del análisis espectral y las amplitudes estimadas a partir de los datos. Si las irregularidades significan picos con amplitudes muy altas, entonces creo que un umbral en la amplitud sería apropiado. Si las irregularidades locales significan que durante un período la amplitud a veces es significativamente mayor que otra, entonces la serie no es estacionaria y el análisis espectral no sería apropiado.
Michael Chernick
1
No sigo la conclusión sobre la falta de estacionariedad. Por ejemplo, la suma de una forma de onda sinusoidal regular y un proceso marcado de punto de Poisson sería estacionaria, pero no presentaría ninguna de las periodicidades que busca. Sin embargo, encontrará algunos picos fuertes en el periodograma, pero no le dirán nada relevante a los picos de datos irregulares introducidos por el componente del proceso de Poisson.
whuber
1
Una serie temporal estacionaria tiene una media constante. Si el pico de un componente periódico puede cambiar con el tiempo, puede reducir la media para cambiar con el tiempo y, por lo tanto, los seires no serían estacionarios.
Michael Chernick
2

Como se trata de datos de series temporales, un filtro exponencial simple http://en.wikipedia.org/wiki/Exponential_smoothing suavizará los datos. Es un filtro muy bueno ya que no necesita acumular puntos de datos antiguos. Comparar todos los recién suavizada valor de datos con su unsmoothed valor. Una vez que la desviación excede un cierto umbral predefinido (dependiendo de lo que creas que es un valor atípico en tus datos), entonces tu valor atípico se puede detectar fácilmente.

En CI hará lo siguiente para una muestra de 16 bits en tiempo real (creo que esto se encuentra en algún lugar aquí <Explicación - https://dsp.stackexchange.com/questions/378/what-is-the-best-first-order -iir-aproximación-a-un-filtro-promedio-móvil >)

#define BITS2 2     //< This is roughly = log2( 1 / alpha ), depending on how smooth you want your data to be

short Simple_Exp_Filter(int new_sample) 
{static int filtered_sample = 0;
long local_sample = sample << 16; /*We assume it is a 16 bit sample */
filtered_sample += (local_sample - filtered_sample) >> BITS2;   
return (short) ((filtered_sample+0x8000) >> 16); //< Round by adding .5 and truncating.   
}


int main()
{
newly_arrived = function_receive_new_sample();
filtered_sample = Simple_Exp_Filter(newly_arrived);
if (abs(newly_arrived - filtered_sample)/newly_arrived > THRESHOLD)
    {
    //AN OUTLIER HAS BEEN FOUND
    }
 return 0;   
}
AyodeleO
fuente
1

Puede usar la desviación estándar de las últimas N mediciones (debe elegir un N adecuado). Un buen puntaje de anomalía sería cuántas desviaciones estándar es una medición del promedio móvil.

Carlos Accioly
fuente
Gracias por su respuesta, pero ¿qué sucede si la señal presenta una alta estacionalidad (es decir, muchas mediciones de red se caracterizan por un patrón diario y semanal al mismo tiempo, por ejemplo, noche vs día o fin de semana vs días laborables)? Un enfoque basado en la desviación estándar no funcionará en ese caso.
gianluca
Por ejemplo, si obtengo una nueva muestra cada 10 minutos, y estoy haciendo una detección atípica del uso de ancho de banda de red de una empresa, básicamente a las 6 p.m., esta medida caerá (se espera un patrón totalmente normal), y fallará una desviación estándar calculada sobre una ventana deslizante (porque seguramente activará una alerta). Al mismo tiempo, si la medida cae a las 4 p.m. (desviando de la línea de base habitual), este es un valor atípico real.
gianluca
1

lo que hago es agrupar las mediciones por hora y día de la semana y comparar las desviaciones estándar de eso. Todavía no se corrige para cosas como vacaciones y temporada de verano / invierno, pero es correcto la mayor parte del tiempo.

La desventaja es que realmente necesita recopilar aproximadamente un año de datos para tener suficiente para que stddev comience a tener sentido.

Aleksandar Ivanisevic
fuente
Gracias, eso es exactamente lo que estaba tratando de evitar (tener muchas muestras como línea de base), porque me gustaría un enfoque realmente reactivo (por ejemplo, detección en línea, tal vez "sucio", después de 1-2 semanas de línea de base)
gianluca
0

Sugiero el siguiente esquema, que debería ser implementable en un día más o menos:

Formación

  • Recolecta tantas muestras como puedas guardar en la memoria
  • Eliminar valores atípicos obvios utilizando la desviación estándar para cada atributo
  • Calcule y almacene la matriz de correlación y también la media de cada atributo
  • Calcule y almacene las distancias de Mahalanobis de todas sus muestras

Cálculo de "valores atípicos":

Para la muestra única de la que desea saber su "atípica":

  • Recupere las medias, la matriz de covarianza y las distancias de Mahalanobis del entrenamiento
  • Calcule la distancia de Mahalanobis "d" para su muestra
  • Devuelve el percentil en el que cae "d" (usando las distancias de Mahalanobis desde el entrenamiento)

Ese será su puntaje atípico: 100% es un valor atípico extremo.


PD. Al calcular la distancia de Mahalanobis , use la matriz de correlación, no la matriz de covarianza. Esto es más robusto si las medidas de la muestra varían en unidad y número.

Ytsen de Boer
fuente
0

Para el caso en que uno tiene que calcular los valores atípicos rápidamente, uno podría usar la idea de Rob Hyndman y Mahito Sugiyama ( https://github.com/BorgwardtLab/sampling-outlier-detection , library (spoutlier), function qsp) para calcular los valores atípicos de la siguiente manera:

library(spoutlier)
rapidtsoutliers <- function(x,plot=FALSE,seed=123)
{
    set.seed(seed)
    x <- as.numeric(x)
    tt <- 1:length(x)
    qspscore <- qsp(x)
    limit <- quantile(qspscore,prob=c(0.95))
    score <- pmax((qspscore - limit),0)
    if(plot)
    {
        plot(x,type="l")
        x2 <- ts(rep(NA,length(x)))
        x2[score>0] <- x[score>0]
        tsp(x2) <- tsp(x)
        points(x2,pch=19,col="red")
        return(invisible(score))
    }
    else
        return(score)
}
orgesleka
fuente
0

La detección de anomalías requiere la construcción de una ecuación que describa la expectativa. La detección de intervención está disponible en un entorno no causal y causal. Si uno tiene una serie de predictores como el precio, las cosas pueden complicarse un poco. Otras respuestas aquí no parecen tener en cuenta la causa asignable atribuible a series de predictores especificadas por el usuario como el precio y, por lo tanto, pueden ser defectuosas. La cantidad vendida puede depender del precio, quizás precios anteriores y tal vez la cantidad vendida en el pasado. La base para la detección de anomalías (pulsos, pulsos estacionales, cambios de nivel y tendencias de hora local) se encuentra en https://pdfs.semanticscholar.org/09c4/ba8dd3cc88289caf18d71e8985bdd11ad21c.pdf

IrishStat
fuente
El enlace no funciona, ¿podría arreglarlo? Gracias
Pankaj Joshi
hecho ..................
IrishStat