गुम मूल्यों को लागू करने के लिए auto.arima का उपयोग कैसे करें


12

मेरे पास कई लापता मूल्यों के साथ एक चिड़ियाघर श्रृंखला है। मैंने पढ़ा है कि auto.arimaइन लापता मूल्यों को लागू कर सकता है? क्या कोई मुझे सिखा सकता है कि यह कैसे करना है? आपका बहुत बहुत धन्यवाद!

यह मैंने कोशिश की है, लेकिन सफलता के बिना:

fit <- auto.arima(tsx)
plot(forecast(fit))

Javlacalle और मेरे जवाब के नीचे के रूप में: मैंने इनको imputeTS पैकेज में लागू किया। फ़ंक्शन को na.kalman कहा जाता है और कलामन एक ARIMA मॉडल के राज्य-अंतरिक्ष रूप को चौरसाई करता है
आंकड़े 10007

जवाबों:


25

सबसे पहले, इस बात से अवगत forecastरहें कि आउट-ऑफ-सैंपल भविष्यवाणियों की गणना करता है, लेकिन आप इन-सैंपल अवलोकनों में रुचि रखते हैं।

कलमन फ़िल्टर लापता मानों को संभालता है। इस प्रकार आप ARIMA मॉडल के स्टेट स्पेस फॉर्म को उसके द्वारा दिए गए आउटपुट से ले सकते हैं forecast::auto.arimaया stats::arimaपास कर सकते हैं KalmanRun

संपादित करें (आंकड़े 10007 के उत्तर पर आधारित कोड में फिक्स करें )

पिछले संस्करण में मैंने मनाया श्रृंखला से संबंधित फ़िल्टर्ड राज्यों का कॉलम लिया था, हालांकि मुझे पूरे मैट्रिक्स का उपयोग करना चाहिए और अवलोकन समीकरण के संबंधित मैट्रिक्स ऑपरेशन करना चाहिए, yt=Zαt। (टिप्पणियों के लिए @ आंकड़े 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,]

कलमन फिल्टर के माध्यम से लापता टिप्पणियों से निपटना कभी-कभी श्रृंखला के एक्सट्रपलेशन के रूप में व्याख्या किया जाता है; जब कलमैन चिकनी का उपयोग किया जाता है, तो कहा जाता है कि लापता टिप्पणियों को मनाया श्रृंखला में प्रक्षेप द्वारा भरा जाना है।


हाय Javlacalle, आपकी मदद के लिए बहुत बहुत धन्यवाद। क्या मैं पूछ सकता हूं कि क्या समय श्रृंखला के लिए कोई शर्त है या यह किसी के लिए भी लागू हो सकती है? आप इन कमांड लाइनों के बारे में थोड़ा समझा सकते हैं? tmp <- जो (फिट होmodelZ == 1) आईडी <- ifelse (लंबाई (tmp) == 1, tmp [1], tmp [2])
user3730957

मैंने फिर से जाँच makeARIMAकी कि राज्य अंतरिक्ष फार्म के मेट्रिक्स को कैसे परिभाषित करता है और मैं कहूंगा कि इसके द्वारा लिया गया कॉलम idसही है। अवलोकन समीकरण में वेक्टर को इस प्रकार परिभाषित किया makeARIMAगया है: Z <- c(1, rep.int(0, r - 1L), Delta)जहां Deltaएक वेक्टर है जिसमें विभेदक फ़िल्टर के गुणांक होते हैं। यदि कोई अलग-अलग फिल्टर नहीं है (यानी, एक एआरएमए मॉडल length(tmp)==1) , तो id1 होना चाहिए; अन्यथा पहला कॉलम विभेदित श्रृंखला से संबंधित है, जबकि Zमान 1 पर लेने वाला अगला तत्व संबंधित हैyt1सूचकांक जो लिया जाना चाहिए।
13

1
@ user3730957 मैंने इस समस्या को अनुक्रमण के साथ ठीक करते हुए अपना उत्तर अपडेट किया है।
javlacalle

2

यहाँ मेरा समाधान होगा:

# Take AirPassengers as example
data <- AirPassengers

# Set missing values
data[c(44,45,88,90,111,122,129,130,135,136)] <- NA


missindx <- is.na(data)

arimaModel <- auto.arima(data)
model <- arimaModel$model

#Kalman smoothing
kal <- KalmanSmooth(data, model, nit )
erg <- kal$smooth  

for ( i in 1:length(model$Z)) {
       erg[,i] = erg[,i] * model$Z[i]
}
karima <-rowSums(erg)

for (i in 1:length(data)) {
  if (is.na(data[i])) {
    data[i] <- karima[i]
  }
}
#Original TimeSeries with imputed values
print(data)

@ जवालासेल:

अपनी पोस्ट के लिए Thx, बहुत दिलचस्प!

मेरे पास आपके समाधान के लिए दो प्रश्न हैं, आशा है कि आप मेरी मदद कर सकते हैं:

  1. आप KalmanSmooth के बजाय KalmanRun का उपयोग क्यों करते हैं? मैंने पढ़ा कि कलमनरून को एक्सट्रपलेशन माना जाता है, जबकि चिकनी अनुमान होगा।

  2. मुझे भी आपकी आईडी नहीं मिलती। आप .Z में सभी घटकों का उपयोग क्यों नहीं करते? उदाहरण के लिए मेरा मतलब है .Z 1, 0,0,0,0,1, -1 -> 7 मान देता है। इसका मतलब होगा .smooth (आपके मामले में KalmanRun राज्यों के लिए) मुझे 7 कॉलम देता है। जैसा कि मैं लगभग कॉलम को समझता हूं जो 1 या -1 मॉडल में जाते हैं।

    बता दें कि AirPass में पंक्ति संख्या 5 गायब है। फिर मैं पंक्ति 5 का योग इस तरह से लूंगा: मैं कॉलम 1 से मान जोड़ूंगा (क्योंकि Z ने 1 दिया), मैं कॉलम 2-4 नहीं जोड़ूंगा (क्योंकि Z 0 कहता है), मैं कॉलम 5 जोड़ूंगा और मैं कॉलम 7 का नकारात्मक मान जोड़ें (क्योंकि Z कहते हैं -1)

    क्या मेरा समाधान गलत है? या वे दोनों ठीक हैं? क्या आप शायद मुझे आगे समझा सकते हैं?


मैं आपके उत्तर के दूसरे भाग को अपने स्वयं के उत्तर के बजाय @ Javlacalle की पोस्ट पर टिप्पणियों के रूप में पोस्ट करने की सलाह दूंगा।
पैट्रिक कूलोमबे

कोशिश की ... लेकिन यह कहते हैं कि मैं टिप्पणी करने के लिए 50 प्रतिष्ठा है
आँकड़े 20007
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.