Primero, tenga en cuenta que forecast
calcula las predicciones fuera de la muestra, pero le interesan las observaciones dentro de la muestra.
El filtro de Kalman maneja los valores faltantes. Por lo tanto, puede tomar la forma de espacio de estado del modelo ARIMA a partir de la salida devuelta por forecast::auto.arima
o stats::arima
y pasarla a KalmanRun
.
Editar (corregir en el código según la respuesta de stats0007)
yt= Zαt
Utilizo un ts
objeto como una serie de muestra en lugar de zoo
, pero debería ser lo mismo:
require(forecast)
# sample series
x0 <- x <- log(AirPassengers)
y <- x
# set some missing values
x[c(10,60:71,100,130)] <- NA
# fit model
fit <- auto.arima(x)
# Kalman filter
kr <- KalmanRun(x, fit$model)
# impute missing values Z %*% alpha at each missing observation
id.na <- which(is.na(x))
for (i in id.na)
y[i] <- fit$model$Z %*% kr$states[i,]
# alternative to the explicit loop above
sapply(id.na, FUN = function(x, Z, alpha) Z %*% alpha[x,],
Z = fit$model$Z, alpha = kr$states)
y[id.na]
# [1] 4.767653 5.348100 5.364654 5.397167 5.523751 5.478211 5.482107 5.593442
# [9] 5.666549 5.701984 5.569021 5.463723 5.339286 5.855145 6.005067
Puede trazar el resultado (para toda la serie y para todo el año con observaciones faltantes en el medio de la muestra):
par(mfrow = c(2, 1), mar = c(2.2,2.2,2,2))
plot(x0, col = "gray")
lines(x)
points(time(x0)[id.na], x0[id.na], col = "blue", pch = 19)
points(time(y)[id.na], y[id.na], col = "red", pch = 17)
legend("topleft", legend = c("true values", "imputed values"),
col = c("blue", "red"), pch = c(19, 17))
plot(time(x0)[60:71], x0[60:71], type = "b", col = "blue",
pch = 19, ylim = range(x0[60:71]))
points(time(y)[60:71], y[60:71], col = "red", pch = 17)
lines(time(y)[60:71], y[60:71], col = "red")
legend("topleft", legend = c("true values", "imputed values"),
col = c("blue", "red"), pch = c(19, 17), lty = c(1, 1))
Puede repetir el mismo ejemplo utilizando el suavizador de Kalman en lugar del filtro de Kalman. Todo lo que necesitas cambiar son estas líneas:
kr <- KalmanSmooth(x, fit$model)
y[i] <- kr$smooth[i,]
Tratar las observaciones faltantes por medio del filtro de Kalman a veces se interpreta como extrapolación de la serie; Cuando se utiliza el Kalman Smooth, se dice que las observaciones faltantes se completan por interpolación en la serie observada.