অনুপস্থিত মানগুলিকে বোঝাতে কীভাবে অটো.রিমা ব্যবহার করবেন


12

আমার অনেক চিড়িয়াখানা সিরিজ রয়েছে যার সাথে অনেকগুলি মূল্য আছে। আমি পড়েছি যে auto.arimaএই অনুপস্থিত মানগুলি বোঝাতে পারে? কেউ আমাকে কীভাবে এটি শিখাতে পারেন? অনেক ধন্যবাদ!

এটি আমি চেষ্টা করেছি, তবে সাফল্য ছাড়াই:

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

জাভালাকলে এবং আমার উত্তর নীচে একটি সংযোজন হিসাবে: আমি ইম্পিউটিটিএস প্যাকেজে এদিকে বাস্তবায়ন করেছি। ফাংশনটি না.ক্লাম্যান নামে পরিচিত এবং কলম্যান একটি আরিমা মডেলটির রাজ্য-স্থানের ফর্মটিতে স্মুথ করে
stats0007

উত্তর:


25

প্রথমে সচেতন থাকুন যে forecastনমুনা বহির্ভূত পূর্বাভাসগুলি গণনা করে তবে আপনি নমুনা পর্যবেক্ষণে আগ্রহী।

কলম্যান ফিল্টার অনুপস্থিত মানগুলি পরিচালনা করে। সুতরাং আপনি আউটপুট দ্বারা ফিরে থেকে Arima মডেল রাষ্ট্র স্থান আকার নিতে পারে forecast::auto.arimaবা stats::arimaতা পাস KalmanRun

সম্পাদনা করুন (stats0007 দ্বারা উত্তরের ভিত্তিতে কোডটি ঠিক করুন )

পূর্ববর্তী সংস্করণে আমি পর্যবেক্ষিত সিরিজের সাথে সম্পর্কিত ফিল্টার হওয়া রাজ্যের কলামটি নিয়েছি, তবে আমার সম্পূর্ণ ম্যাট্রিক্সটি ব্যবহার করা উচিত এবং পর্যবেক্ষণের সমীকরণের সংশ্লিষ্ট ম্যাট্রিক্স অপারেশন করা উচিত, । (মন্তব্যের জন্য @ stats0007 কে ধন্যবাদ)) নীচে আমি কোডটি আপডেট করি এবং সে অনুযায়ী প্লট করি।yt=Zαt

আমি এর 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,]

কলম্যান ফিল্টারের মাধ্যমে নিখোঁজ পর্যবেক্ষণগুলি নিয়ে কাজ করার বিষয়টি কখনও কখনও সিরিজের এক্সট্রোপোলেশন হিসাবে ব্যাখ্যা করা হয়; যখন কলমান স্মুথ ব্যবহার করা হয়, অনুপস্থিত পর্যবেক্ষণগুলি পর্যবেক্ষণ করা সিরিজের অন্তরঙ্গকরণ দ্বারা পূরণ করা হবে বলে জানা যায়।


হাই জাভালাক্যাল, আপনার সহায়তার জন্য আপনাকে অনেক ধন্যবাদ আমি জিজ্ঞাসা করতে পারি যে টাইম সিরিজের জন্য কোনও শর্ত আছে বা এটি কোনওটির জন্য আবেদন করতে পারে? আপনি এই কমান্ড লাইন সম্পর্কে কিছুটা ব্যাখ্যা করতে পারেন? tmp <- যা (ফিট জেড == 1) আইডি <- ifelse (দৈর্ঘ্য (tmp) == 1, tmp [1], tmp [2])model
ব্যবহারকারী 3730957

আমি আবার যাচাই করেছিলাম কীভাবে makeARIMAরাজ্য স্পেস ফর্মের ম্যাট্রিকগুলি সংজ্ঞায়িত করা হয় এবং আমি বলতে পারি যে নেওয়া কলামটি idসঠিক। পর্যবেক্ষণ সমীকরণের ভেক্টরটিকে এটি makeARIMAহিসাবে সংজ্ঞায়িত করা হয়: Z <- c(1, rep.int(0, r - 1L), Delta)যেখানে Deltaপৃথক পৃথক ফিল্টারের সহগগুলি সমন্বিত ভেক্টর রয়েছে। যদি কোনও পৃথক পৃথক ফিল্টার না থাকে (যেমন, একটি এআরএমএ মডেল, length(tmp)==1) তবে id1 হওয়া উচিত; অন্যথায় প্রথম কলামটি পার্থক্যযুক্ত সিরিজের সাথে সম্পর্কিত, যখন Z1 মানটি গ্রহণের পরবর্তী উপাদানটি সাথে সম্পর্কিত , যে সূচকটি নেওয়া উচিত। yt1
জাভলাকলে

1
@ ব্যবহারকারী 3730957 আমি এই উত্তরটিকে ইন্ডেক্সিংয়ের সাথে সমাধান করে আমার উত্তর আপডেট করেছি।
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. আপনি কলমানস্মুর পরিবর্তে কলম্যানরুন ব্যবহার করেন কেন? আমি পড়েছি কলম্যানরুনকে এক্সট্রা পোলেশন হিসাবে বিবেচনা করা হয়, তবে মসৃণতা অনুমানযোগ্য হবে।

  2. আমিও আপনার আইডি অংশ পাই না। আপনি .Z তে সমস্ত উপাদান কেন ব্যবহার করবেন না? উদাহরণস্বরূপ আমি বোঝাতে চাইছি .Z 1, 0,0,0,0,1, -1 -> 7 টি মান দেয়। এর অর্থ হবে .সাগম (আপনার ক্ষেত্রে কলম্যানরুন রাজ্যের ক্ষেত্রে) আমাকে 7 টি কলাম দেয়। আমি যেমন বুঝতে পারি এলিল কলামগুলি যা 1 বা -1 মডেলটিতে যায়।

    ধরা যাক 5 নম্বর সারিটি এয়ারপাসে অনুপস্থিত। তারপরে আমি 5 টি সারির যোগফলটি এইভাবে নিয়ে যাব: আমি কলাম 1 থেকে মান যুক্ত করব (কারণ জেড 1 দিয়েছে), আমি কলাম 2-4 যোগ করব না (কারণ জেড 0 বলে), আমি কলাম 5 যুক্ত করব এবং আমি করব column কলামের নেতিবাচক মান যুক্ত করুন (কারণ জেড -১ বলেছেন)

    আমার সমাধান কি ভুল? না তারা উভয় ঠিক আছে? আপনি সম্ভবত আমাকে আরও ব্যাখ্যা করতে পারেন?


আমি আপনার উত্তরের দ্বিতীয় অংশটি আপনার নিজের উত্তরের পরিবর্তে @ জাভ্যালাকলের পোস্টে মন্তব্য হিসাবে পোস্ট করার পরামর্শ দিচ্ছি।
প্যাট্রিক কৌলম্বে

চেষ্টা করেছেন ... তবে এটিতে মন্তব্য করার জন্য আমার 50 টি খ্যাতি থাকতে হবে
stats0007
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.