İlk olarak, forecastörnek dışı tahminleri hesapladığını unutmayın, ancak örnek içi gözlemlerle ilgileniyorsunuz.
Kalman filtresi eksik değerleri işler. Böylece ARIMA modelinin durum uzayı biçimini döndürülen çıktıdan alabilir forecast::auto.arimaya stats::arimada adresine aktarabilirsiniz KalmanRun.
Düzenle (istatistiklere göre cevaba göre kodu düzeltin0007)
Önceki bir versiyonda, gözlemlenen serilerle ilgili filtrelenmiş durumların sütununu aldım, ancak tüm matrisi kullanmalı ve gözlem denkleminin karşılık gelen matris işlemini yapmalıyım, yt= Zαt. (Yorumlar için @ stats0007 sayesinde.) Aşağıda kodu güncelleyip buna göre çizim yapıyorum.
Bunun tsyerine bir örnek serisi olarak bir nesne kullanın zoo, ancak aynı olmalıdır:
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
Sonucu çizebilirsiniz (tüm seri için ve tüm yıl boyunca numunenin ortasında eksik gözlemlerle):
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))

Aynı örneği Kalman filtresi yerine Kalman daha pürüzsüz kullanarak tekrarlayabilirsiniz. Değiştirmeniz gereken tek şey şu satırlar:
kr <- KalmanSmooth(x, fit$model)
y[i] <- kr$smooth[i,]
Kalman filtresi aracılığıyla eksik gözlemlerle başa çıkmak bazen serinin ekstrapolasyonu olarak yorumlanır; Kalman daha pürüzsüz kullanıldığında, eksik gözlemlerin gözlemlenen seride enterpolasyon ile doldurulduğu söylenir.