Trước tiên, hãy lưu ý rằng forecast
tính toán các dự đoán ngoài mẫu nhưng bạn quan tâm đến các quan sát trong mẫu.
Bộ lọc Kalman xử lý các giá trị bị thiếu. Do đó, bạn có thể lấy dạng không gian trạng thái của mô hình ARIMA từ đầu ra được trả về bởi forecast::auto.arima
hoặc stats::arima
và chuyển nó sang KalmanRun
.
Chỉnh sửa (sửa mã dựa trên câu trả lời của stats0007)
yt= Zαt
Tôi sử dụng một ts
đối tượng như một chuỗi mẫu thay vì zoo
, nhưng nó phải giống nhau:
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
Bạn có thể vẽ kết quả (cho toàn bộ chuỗi và cho cả năm với các quan sát bị thiếu ở giữa mẫu):
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))
Bạn có thể lặp lại ví dụ tương tự bằng cách sử dụng bộ lọc Kalman mượt mà thay vì bộ lọc Kalman. Tất cả bạn cần thay đổi là những dòng này:
kr <- KalmanSmooth(x, fit$model)
y[i] <- kr$smooth[i,]
Xử lý các quan sát bị thiếu bằng bộ lọc Kalman đôi khi được hiểu là ngoại suy của chuỗi; khi Kalman mượt mà hơn được sử dụng, các quan sát bị thiếu được cho là được lấp đầy bằng phép nội suy trong chuỗi quan sát.