Manejo de datos perdidos en series temporales

Imputación

En estadística, la imputación es el proceso de reemplazar los valores perdidos con valores sustitutos. El objetivo de la imputación es rellenar los valores perdidos con estimaciones (realizadas con el método de aprendizaje más apropiado para cada caso) de estos teniendo en cuenta las relaciones posibles entre las observaciones. Luego existen diversos métodos de imputación diferenciados en la forma de estimar los datos faltantes, cuya elección preferible vendrá dada por la naturaleza de la serie:

Métodos de imputación simples

  • Imputación mediante la media: se reemplazan los valores perdidos por la media de los valores observados.

  • Imputación mediante regresión: se estima una regresión de las observaciones existentes y se imputa cada valor perdido mediante la ecuación de regresión estimada.

  • Imputación mediante regresión estocástica: similar al enterior pero se imputa añadiendo a la predicción un valor residual para reestablecer la pérdida de variabilidad.

  • Imputación mediante médias móviles: se reemplazan las observaciones faltantes por los valores estimados mediante médias móviles.

  • Imputación por Last Observation Carried Forward (locf): reemplaza el dato perdido por la observacion que le precede.

  • Imputación por interpolación: se estiman los valores perdidos interpolando (uniendo de manera lineal, polinomial, etc.) el último valor válido antes del valor perdido y el primer valor válido después del valor perdido.

###Métodos de imputación basados en máxima verosimilitud

  • Imputación múltiple: consiste en realizar varias imputaciones de las observaciones faltantes para luego analizar los conjuntos de datos completados y combinar los resultados obtenidos para obtener una estimacion final. El análisis de imputación múltiple esta dividido en tres fases: fase de imputacion, fase de análisis y fase de puesta en común.

  • Imputación mediante el algoritmo EM (Expectation-Maximization): es un algoritmo importante para el análisis de datos faltantes. Es un método iterativo de dos pasos (esperanza y maximizacion) donde se comienza por reemplazar los datos ausentes por unos valores estimados y a continuación se procede a una primera estimación de los parámetros, para con estos parámetros volver a iniciar al primer paso y así sucesivamente hasta que la convergencia de los parámetros sea aceptable.

Métodos de imputación basados en machine learning

Imputación con K-Nearest Neighbor: se estiman los valores peridos con la media de los vecinos seleccionados.

  • Imputación con K-means
  • Imputación con máquinas de soporte vectorial

En el ámbito de la imputación, la imputación en series temporales univariantes es un reto adicional, debido a que la mayoría de algoritmos complejos están desarrollados para series temporales multivariantes ya que dependen de la correlación entre los inter-atributos para estimar los valores de los datos perdidos (imputación múltiple, EM, kNN, etc.), algo que no ocurre en el caso univariante (al ser un único atributo). Pero además de los métodos simples, también hay posibilidades adicionales más complejas para la imputación en series temporales univariantes:

  • Algoritmos multivariantes con datos retardados: consisten en emplear indirectamente los algoritmos de series multivariantes en series univariantes empleando el tiempo (variable implícita de una serie temporal) como un atributo más. La forma habitual de hacer esto es mediante lags (variables que toman el valor de otra variable en un instante de tiempo previo) y leads (toman el valor de otra variable en un instante de tiempo posterior).

  • Filtro de Kalman con modelos ARIMA de espacio de estados: todos los modelos ARIMA pueden ser reescritos (y estimados) como modelos en el espacio de estados. Estos modelos en el espacio de estados pueden entre otras muchas cosas estimar observaciones perdidas. Luego los principales beneficios de representar sistemas dinámicos en forma de espacio de estados es que el espacio de estados permite que las variables no observadas puedan ser incorporadas y estimadas junto con el modelo observable, y que además, estos modelos en el espacio de estados pueden ser analizados usando un algoritmo recursivo llamado filtro de Kalman (Kalman filter), que es usado, entre otras cosas, para determinar las estimaciones óptimas de los modelos en el espacio de estados.

data("AirPassengers")
AirPassengers
##      Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 1949 112 118 132 129 121 135 148 148 136 119 104 118
## 1950 115 126 141 135 125 149 170 170 158 133 114 140
## 1951 145 150 178 163 172 178 199 199 184 162 146 166
## 1952 171 180 193 181 183 218 230 242 209 191 172 194
## 1953 196 196 236 235 229 243 264 272 237 211 180 201
## 1954 204 188 235 227 234 264 302 293 259 229 203 229
## 1955 242 233 267 269 270 315 364 347 312 274 237 278
## 1956 284 277 317 313 318 374 413 405 355 306 271 306
## 1957 315 301 356 348 355 422 465 467 404 347 305 336
## 1958 340 318 362 348 363 435 491 505 404 359 310 337
## 1959 360 342 406 396 420 472 548 559 463 407 362 405
## 1960 417 391 419 461 472 535 622 606 508 461 390 432
serie=AirPassengers
serie[c(5,10,70,110,135)]<-NA
serie
##      Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 1949 112 118 132 129  NA 135 148 148 136  NA 104 118
## 1950 115 126 141 135 125 149 170 170 158 133 114 140
## 1951 145 150 178 163 172 178 199 199 184 162 146 166
## 1952 171 180 193 181 183 218 230 242 209 191 172 194
## 1953 196 196 236 235 229 243 264 272 237 211 180 201
## 1954 204 188 235 227 234 264 302 293 259  NA 203 229
## 1955 242 233 267 269 270 315 364 347 312 274 237 278
## 1956 284 277 317 313 318 374 413 405 355 306 271 306
## 1957 315 301 356 348 355 422 465 467 404 347 305 336
## 1958 340  NA 362 348 363 435 491 505 404 359 310 337
## 1959 360 342 406 396 420 472 548 559 463 407 362 405
## 1960 417 391  NA 461 472 535 622 606 508 461 390 432
library(ggfortify)
## Loading required package: ggplot2
autoplot(AirPassengers)

library(imputeTS)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
## Registered S3 methods overwritten by 'forecast':
##   method                 from     
##   autoplot.Arima         ggfortify
##   autoplot.acf           ggfortify
##   autoplot.ar            ggfortify
##   autoplot.bats          ggfortify
##   autoplot.decomposed.ts ggfortify
##   autoplot.ets           ggfortify
##   autoplot.forecast      ggfortify
##   autoplot.stl           ggfortify
##   autoplot.ts            ggfortify
##   fitted.ar              ggfortify
##   fortify.ts             ggfortify
##   residuals.ar           ggfortify
serie1=na_mean(serie)
serie1
##          Jan     Feb     Mar     Apr     May     Jun     Jul     Aug     Sep
## 1949 112.000 118.000 132.000 129.000 281.705 135.000 148.000 148.000 136.000
## 1950 115.000 126.000 141.000 135.000 125.000 149.000 170.000 170.000 158.000
## 1951 145.000 150.000 178.000 163.000 172.000 178.000 199.000 199.000 184.000
## 1952 171.000 180.000 193.000 181.000 183.000 218.000 230.000 242.000 209.000
## 1953 196.000 196.000 236.000 235.000 229.000 243.000 264.000 272.000 237.000
## 1954 204.000 188.000 235.000 227.000 234.000 264.000 302.000 293.000 259.000
## 1955 242.000 233.000 267.000 269.000 270.000 315.000 364.000 347.000 312.000
## 1956 284.000 277.000 317.000 313.000 318.000 374.000 413.000 405.000 355.000
## 1957 315.000 301.000 356.000 348.000 355.000 422.000 465.000 467.000 404.000
## 1958 340.000 281.705 362.000 348.000 363.000 435.000 491.000 505.000 404.000
## 1959 360.000 342.000 406.000 396.000 420.000 472.000 548.000 559.000 463.000
## 1960 417.000 391.000 281.705 461.000 472.000 535.000 622.000 606.000 508.000
##          Oct     Nov     Dec
## 1949 281.705 104.000 118.000
## 1950 133.000 114.000 140.000
## 1951 162.000 146.000 166.000
## 1952 191.000 172.000 194.000
## 1953 211.000 180.000 201.000
## 1954 281.705 203.000 229.000
## 1955 274.000 237.000 278.000
## 1956 306.000 271.000 306.000
## 1957 347.000 305.000 336.000
## 1958 359.000 310.000 337.000
## 1959 407.000 362.000 405.000
## 1960 461.000 390.000 432.000
serie_T=cbind(AirPassengers, serie1)
library(TSstudio)
ts_plot(serie_T, slider = T)

Imputación de valores perdidos mediante médias móviles:

na_ma(serie temporal, k)
- k: ventana de la média móvil
?na_ma
serie2=na_ma(serie, 3,weighting = "exponential")
serie2
##           Jan      Feb      Mar      Apr      May      Jun      Jul      Aug
## 1949 112.0000 118.0000 132.0000 129.0000 134.4286 135.0000 148.0000 148.0000
## 1950 115.0000 126.0000 141.0000 135.0000 125.0000 149.0000 170.0000 170.0000
## 1951 145.0000 150.0000 178.0000 163.0000 172.0000 178.0000 199.0000 199.0000
## 1952 171.0000 180.0000 193.0000 181.0000 183.0000 218.0000 230.0000 242.0000
## 1953 196.0000 196.0000 236.0000 235.0000 229.0000 243.0000 264.0000 272.0000
## 1954 204.0000 188.0000 235.0000 227.0000 234.0000 264.0000 302.0000 293.0000
## 1955 242.0000 233.0000 267.0000 269.0000 270.0000 315.0000 364.0000 347.0000
## 1956 284.0000 277.0000 317.0000 313.0000 318.0000 374.0000 413.0000 405.0000
## 1957 315.0000 301.0000 356.0000 348.0000 355.0000 422.0000 465.0000 467.0000
## 1958 340.0000 346.0000 362.0000 348.0000 363.0000 435.0000 491.0000 505.0000
## 1959 360.0000 342.0000 406.0000 396.0000 420.0000 472.0000 548.0000 559.0000
## 1960 417.0000 391.0000 437.5714 461.0000 472.0000 535.0000 622.0000 606.0000
##           Sep      Oct      Nov      Dec
## 1949 136.0000 125.3571 104.0000 118.0000
## 1950 158.0000 133.0000 114.0000 140.0000
## 1951 184.0000 162.0000 146.0000 166.0000
## 1952 209.0000 191.0000 172.0000 194.0000
## 1953 237.0000 211.0000 180.0000 201.0000
## 1954 259.0000 245.4286 203.0000 229.0000
## 1955 312.0000 274.0000 237.0000 278.0000
## 1956 355.0000 306.0000 271.0000 306.0000
## 1957 404.0000 347.0000 305.0000 336.0000
## 1958 404.0000 359.0000 310.0000 337.0000
## 1959 463.0000 407.0000 362.0000 405.0000
## 1960 508.0000 461.0000 390.0000 432.0000
serie_T2=cbind(AirPassengers, serie2)
library(TSstudio)
ts_plot(serie_T2, slider = T)

Imputación de valores perdidos mediante locf:

na_locf(serie temporal, option) *paquete imputeTS*

    - option: locf para reemplazar con la anterior, nocb para reemplazar con la posterior
    
na.locf(serie temporal, fromLast) *paquete zoo*

    - fromLast: valor a true para reemplazar con la posterior, en caso contrario con la anterior
serie2=AirPassengers
serie2[c(5,10,11,70,71,72,110,135)]<-NA
serie2
##      Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 1949 112 118 132 129  NA 135 148 148 136  NA  NA 118
## 1950 115 126 141 135 125 149 170 170 158 133 114 140
## 1951 145 150 178 163 172 178 199 199 184 162 146 166
## 1952 171 180 193 181 183 218 230 242 209 191 172 194
## 1953 196 196 236 235 229 243 264 272 237 211 180 201
## 1954 204 188 235 227 234 264 302 293 259  NA  NA  NA
## 1955 242 233 267 269 270 315 364 347 312 274 237 278
## 1956 284 277 317 313 318 374 413 405 355 306 271 306
## 1957 315 301 356 348 355 422 465 467 404 347 305 336
## 1958 340  NA 362 348 363 435 491 505 404 359 310 337
## 1959 360 342 406 396 420 472 548 559 463 407 362 405
## 1960 417 391  NA 461 472 535 622 606 508 461 390 432
library(imputeTS)
na_locf(serie2, option="locf")
##      Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 1949 112 118 132 129 129 135 148 148 136 136 136 118
## 1950 115 126 141 135 125 149 170 170 158 133 114 140
## 1951 145 150 178 163 172 178 199 199 184 162 146 166
## 1952 171 180 193 181 183 218 230 242 209 191 172 194
## 1953 196 196 236 235 229 243 264 272 237 211 180 201
## 1954 204 188 235 227 234 264 302 293 259 259 259 259
## 1955 242 233 267 269 270 315 364 347 312 274 237 278
## 1956 284 277 317 313 318 374 413 405 355 306 271 306
## 1957 315 301 356 348 355 422 465 467 404 347 305 336
## 1958 340 340 362 348 363 435 491 505 404 359 310 337
## 1959 360 342 406 396 420 472 548 559 463 407 362 405
## 1960 417 391 391 461 472 535 622 606 508 461 390 432

Imputación de valores perdidos mediante interpolación:

na_interpolation(serie temporal, option) paquete imputeTS

- option: "linear" "spline" (polinomial) o "stine"

na.approx(serie temporal) paquete zoo

na.interp(serie temporal) paquete forescast

serie3=AirPassengers
serie3[c(5,10,70,110,135)]<-NA
serie3
##      Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 1949 112 118 132 129  NA 135 148 148 136  NA 104 118
## 1950 115 126 141 135 125 149 170 170 158 133 114 140
## 1951 145 150 178 163 172 178 199 199 184 162 146 166
## 1952 171 180 193 181 183 218 230 242 209 191 172 194
## 1953 196 196 236 235 229 243 264 272 237 211 180 201
## 1954 204 188 235 227 234 264 302 293 259  NA 203 229
## 1955 242 233 267 269 270 315 364 347 312 274 237 278
## 1956 284 277 317 313 318 374 413 405 355 306 271 306
## 1957 315 301 356 348 355 422 465 467 404 347 305 336
## 1958 340  NA 362 348 363 435 491 505 404 359 310 337
## 1959 360 342 406 396 420 472 548 559 463 407 362 405
## 1960 417 391  NA 461 472 535 622 606 508 461 390 432
serie31=na_interpolation(serie3, option='spline')
serie31
##           Jan      Feb      Mar      Apr      May      Jun      Jul      Aug
## 1949 112.0000 118.0000 132.0000 129.0000 127.4370 135.0000 148.0000 148.0000
## 1950 115.0000 126.0000 141.0000 135.0000 125.0000 149.0000 170.0000 170.0000
## 1951 145.0000 150.0000 178.0000 163.0000 172.0000 178.0000 199.0000 199.0000
## 1952 171.0000 180.0000 193.0000 181.0000 183.0000 218.0000 230.0000 242.0000
## 1953 196.0000 196.0000 236.0000 235.0000 229.0000 243.0000 264.0000 272.0000
## 1954 204.0000 188.0000 235.0000 227.0000 234.0000 264.0000 302.0000 293.0000
## 1955 242.0000 233.0000 267.0000 269.0000 270.0000 315.0000 364.0000 347.0000
## 1956 284.0000 277.0000 317.0000 313.0000 318.0000 374.0000 413.0000 405.0000
## 1957 315.0000 301.0000 356.0000 348.0000 355.0000 422.0000 465.0000 467.0000
## 1958 340.0000 352.7670 362.0000 348.0000 363.0000 435.0000 491.0000 505.0000
## 1959 360.0000 342.0000 406.0000 396.0000 420.0000 472.0000 548.0000 559.0000
## 1960 417.0000 391.0000 419.6960 461.0000 472.0000 535.0000 622.0000 606.0000
##           Sep      Oct      Nov      Dec
## 1949 136.0000 113.4799 104.0000 118.0000
## 1950 158.0000 133.0000 114.0000 140.0000
## 1951 184.0000 162.0000 146.0000 166.0000
## 1952 209.0000 191.0000 172.0000 194.0000
## 1953 237.0000 211.0000 180.0000 201.0000
## 1954 259.0000 218.5514 203.0000 229.0000
## 1955 312.0000 274.0000 237.0000 278.0000
## 1956 355.0000 306.0000 271.0000 306.0000
## 1957 404.0000 347.0000 305.0000 336.0000
## 1958 404.0000 359.0000 310.0000 337.0000
## 1959 463.0000 407.0000 362.0000 405.0000
## 1960 508.0000 461.0000 390.0000 432.0000
serie_T3=cbind(AirPassengers, serie31)
ts_plot(serie_T3)

Imputación de valores perdidos mediante filtro de Kalman en modelos en el espacio de estados o estructurales:

na_kalman(serie temporal, model, smooth)

    - model: modelo usado al que se le aplica el filtro de Kalman. Puede ser "auto.arima" para usar una representación en el espacio de estados de los modelos ARIMA, o "StructTS" para usar un modelo estructural ajustado por máxima verosimilitud.
serie4=AirPassengers
serie4[c(5,10,70,110,135)]<-NA
serie4
##      Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 1949 112 118 132 129  NA 135 148 148 136  NA 104 118
## 1950 115 126 141 135 125 149 170 170 158 133 114 140
## 1951 145 150 178 163 172 178 199 199 184 162 146 166
## 1952 171 180 193 181 183 218 230 242 209 191 172 194
## 1953 196 196 236 235 229 243 264 272 237 211 180 201
## 1954 204 188 235 227 234 264 302 293 259  NA 203 229
## 1955 242 233 267 269 270 315 364 347 312 274 237 278
## 1956 284 277 317 313 318 374 413 405 355 306 271 306
## 1957 315 301 356 348 355 422 465 467 404 347 305 336
## 1958 340  NA 362 348 363 435 491 505 404 359 310 337
## 1959 360 342 406 396 420 472 548 559 463 407 362 405
## 1960 417 391  NA 461 472 535 622 606 508 461 390 432
serie41=na_kalman(serie4, model="auto.arima", smooth=TRUE)
serie41
##           Jan      Feb      Mar      Apr      May      Jun      Jul      Aug
## 1949 112.0000 118.0000 132.0000 129.0000 108.1638 135.0000 148.0000 148.0000
## 1950 115.0000 126.0000 141.0000 135.0000 125.0000 149.0000 170.0000 170.0000
## 1951 145.0000 150.0000 178.0000 163.0000 172.0000 178.0000 199.0000 199.0000
## 1952 171.0000 180.0000 193.0000 181.0000 183.0000 218.0000 230.0000 242.0000
## 1953 196.0000 196.0000 236.0000 235.0000 229.0000 243.0000 264.0000 272.0000
## 1954 204.0000 188.0000 235.0000 227.0000 234.0000 264.0000 302.0000 293.0000
## 1955 242.0000 233.0000 267.0000 269.0000 270.0000 315.0000 364.0000 347.0000
## 1956 284.0000 277.0000 317.0000 313.0000 318.0000 374.0000 413.0000 405.0000
## 1957 315.0000 301.0000 356.0000 348.0000 355.0000 422.0000 465.0000 467.0000
## 1958 340.0000 314.3055 362.0000 348.0000 363.0000 435.0000 491.0000 505.0000
## 1959 360.0000 342.0000 406.0000 396.0000 420.0000 472.0000 548.0000 559.0000
## 1960 417.0000 391.0000 462.9994 461.0000 472.0000 535.0000 622.0000 606.0000
##           Sep      Oct      Nov      Dec
## 1949 136.0000 121.8279 104.0000 118.0000
## 1950 158.0000 133.0000 114.0000 140.0000
## 1951 184.0000 162.0000 146.0000 166.0000
## 1952 209.0000 191.0000 172.0000 194.0000
## 1953 237.0000 211.0000 180.0000 201.0000
## 1954 259.0000 231.6318 203.0000 229.0000
## 1955 312.0000 274.0000 237.0000 278.0000
## 1956 355.0000 306.0000 271.0000 306.0000
## 1957 404.0000 347.0000 305.0000 336.0000
## 1958 404.0000 359.0000 310.0000 337.0000
## 1959 463.0000 407.0000 362.0000 405.0000
## 1960 508.0000 461.0000 390.0000 432.0000
modelo_imputacion= arima(AirPassengers, order = c(1,1,0))$model
na_kalman(serie4, model = modelo_imputacion, smooth = T)
##           Jan      Feb      Mar      Apr      May      Jun      Jul      Aug
## 1949 112.0000 118.0000 132.0000 129.0000 130.2489 135.0000 148.0000 148.0000
## 1950 115.0000 126.0000 141.0000 135.0000 125.0000 149.0000 170.0000 170.0000
## 1951 145.0000 150.0000 178.0000 163.0000 172.0000 178.0000 199.0000 199.0000
## 1952 171.0000 180.0000 193.0000 181.0000 183.0000 218.0000 230.0000 242.0000
## 1953 196.0000 196.0000 236.0000 235.0000 229.0000 243.0000 264.0000 272.0000
## 1954 204.0000 188.0000 235.0000 227.0000 234.0000 264.0000 302.0000 293.0000
## 1955 242.0000 233.0000 267.0000 269.0000 270.0000 315.0000 364.0000 347.0000
## 1956 284.0000 277.0000 317.0000 313.0000 318.0000 374.0000 413.0000 405.0000
## 1957 315.0000 301.0000 356.0000 348.0000 355.0000 422.0000 465.0000 467.0000
## 1958 340.0000 352.9699 362.0000 348.0000 363.0000 435.0000 491.0000 505.0000
## 1959 360.0000 342.0000 406.0000 396.0000 420.0000 472.0000 548.0000 559.0000
## 1960 417.0000 391.0000 421.9507 461.0000 472.0000 535.0000 622.0000 606.0000
##           Sep      Oct      Nov      Dec
## 1949 136.0000 117.1545 104.0000 118.0000
## 1950 158.0000 133.0000 114.0000 140.0000
## 1951 184.0000 162.0000 146.0000 166.0000
## 1952 209.0000 191.0000 172.0000 194.0000
## 1953 237.0000 211.0000 180.0000 201.0000
## 1954 259.0000 224.4335 203.0000 229.0000
## 1955 312.0000 274.0000 237.0000 278.0000
## 1956 355.0000 306.0000 271.0000 306.0000
## 1957 404.0000 347.0000 305.0000 336.0000
## 1958 404.0000 359.0000 310.0000 337.0000
## 1959 463.0000 407.0000 362.0000 405.0000
## 1960 508.0000 461.0000 390.0000 432.0000