सबसे पहले, इस बात से अवगत forecast
रहें कि आउट-ऑफ-सैंपल भविष्यवाणियों की गणना करता है, लेकिन आप इन-सैंपल अवलोकनों में रुचि रखते हैं।
कलमन फ़िल्टर लापता मानों को संभालता है। इस प्रकार आप ARIMA मॉडल के स्टेट स्पेस फॉर्म को उसके द्वारा दिए गए आउटपुट से ले सकते हैं forecast::auto.arima
या stats::arima
पास कर सकते हैं KalmanRun
।
संपादित करें (आंकड़े 10007 के उत्तर पर आधारित कोड में फिक्स करें )
पिछले संस्करण में मैंने मनाया श्रृंखला से संबंधित फ़िल्टर्ड राज्यों का कॉलम लिया था, हालांकि मुझे पूरे मैट्रिक्स का उपयोग करना चाहिए और अवलोकन समीकरण के संबंधित मैट्रिक्स ऑपरेशन करना चाहिए, yटी= जेडαटी। (टिप्पणियों के लिए @ आंकड़े 10007 के लिए धन्यवाद।) नीचे मैं तदनुसार कोड और भूखंड को अपडेट करता हूं।
मैं ts
इसके बजाय एक नमूना श्रृंखला के रूप में एक वस्तु का उपयोग करता हूं zoo
, लेकिन यह समान होना चाहिए:
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
आप परिणाम (पूरी श्रृंखला के लिए और पूरे वर्ष के लिए नमूना के बीच में लापता टिप्पणियों के साथ) की साजिश कर सकते हैं:
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))
आप उसी उदाहरण को दोहरा सकते हैं जैसे कि कलमन फ़िल्टर के बजाय कलमन चिकना का उपयोग कर। बस आपको इन पंक्तियों को बदलना होगा:
kr <- KalmanSmooth(x, fit$model)
y[i] <- kr$smooth[i,]
कलमन फिल्टर के माध्यम से लापता टिप्पणियों से निपटना कभी-कभी श्रृंखला के एक्सट्रपलेशन के रूप में व्याख्या किया जाता है; जब कलमैन चिकनी का उपयोग किया जाता है, तो कहा जाता है कि लापता टिप्पणियों को मनाया श्रृंखला में प्रक्षेप द्वारा भरा जाना है।