Saya memiliki data deret waktu bulanan, dan ingin melakukan peramalan dengan deteksi pencilan.
Ini adalah contoh kumpulan data saya:
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2006 7.55 7.63 7.62 7.50 7.47 7.53 7.55 7.47 7.65 7.72 7.78 7.81
2007 7.71 7.67 7.85 7.82 7.91 7.91 8.00 7.82 7.90 7.93 7.99 7.93
2008 8.46 8.48 9.03 9.43 11.58 12.19 12.23 11.98 12.26 12.31 12.13 11.99
2009 11.51 11.75 11.87 11.91 11.87 11.69 11.66 11.23 11.37 11.71 11.88 11.93
2010 11.99 11.84 12.33 12.55 12.58 12.67 12.57 12.35 12.30 12.67 12.71 12.63
2011 12.60 12.41 12.68 12.48 12.50 12.30 12.39 12.16 12.38 12.36 12.52 12.63
Saya telah merujuk prosedur dan metode analisis Timeseries menggunakan R , untuk melakukan serangkaian model perkiraan yang berbeda, namun tampaknya tidak akurat. Selain itu, saya juga tidak yakin bagaimana memasukkan tsoutliers ke dalamnya.
Saya sudah mendapat posting lain tentang pertanyaan saya tentang pemodelan dan prosedur arima dan di sini .
Jadi ini adalah kode saya saat ini, yang mirip dengan tautan no.1.
Kode:
product<-ts(product, start=c(1993,1),frequency=12)
#Modelling product Retail Price
#Training set
product.mod<-window(product,end=c(2012,12))
#Test set
product.test<-window(product,start=c(2013,1))
#Range of time of test set
period<-(end(product.test)[1]-start(product.test)[1])*12 + #No of month * no. of yr
(end(product.test)[2]-start(product.test)[2]+1) #No of months
#Model using different method
#arima, expo smooth, theta, random walk, structural time series
models<-list(
#arima
product.arima<-forecast(auto.arima(product.mod),h=period),
#exp smoothing
product.ets<-forecast(ets(product.mod),h=period),
#theta
product.tht<-thetaf(product.mod,h=period),
#random walk
product.rwf<-rwf(product.mod,h=period),
#Structts
product.struc<-forecast(StructTS(product.mod),h=period)
)
##Compare the training set forecast with test set
par(mfrow=c(2, 3))
for (f in models){
plot(f)
lines(product.test,col='red')
}
##To see its accuracy on its Test set,
#as training set would be "accurate" in the first place
acc.test<-lapply(models, function(f){
accuracy(f, product.test)[2,]
})
acc.test <- Reduce(rbind, acc.test)
row.names(acc.test)<-c("arima","expsmooth","theta","randomwalk","struc")
acc.test <- acc.test[order(acc.test[,'MASE']),]
##Look at training set to see if there are overfitting of the forecasting
##on training set
acc.train<-lapply(models, function(f){
accuracy(f, product.test)[1,]
})
acc.train <- Reduce(rbind, acc.train)
row.names(acc.train)<-c("arima","expsmooth","theta","randomwalk","struc")
acc.train <- acc.train[order(acc.train[,'MASE']),]
##Note that we look at MAE, MAPE or MASE value. The lower the better the fit.
Ini adalah plot perkiraan saya yang berbeda, yang tampaknya tidak terlalu dapat diandalkan / akurat, melalui perbandingan set tes merah, dan set "perkiraan" biru. Plot perkiraan berbeda
Keakuratan yang berbeda dari masing-masing model tes dan pelatihan
Test set
ME RMSE MAE MPE MAPE MASE ACF1 Theil's U
theta -0.07408833 0.2277015 0.1881167 -0.6037191 1.460549 0.2944165 0.1956893 0.8322151
expsmooth -0.12237967 0.2681452 0.2268248 -0.9823104 1.765287 0.3549976 0.3432275 0.9847223
randomwalk 0.11965517 0.2916008 0.2362069 0.8823040 1.807434 0.3696813 0.4529428 1.0626775
arima -0.32556886 0.3943527 0.3255689 -2.5326397 2.532640 0.5095394 0.2076844 1.4452932
struc -0.39735804 0.4573140 0.3973580 -3.0794740 3.079474 0.6218948 0.3841505 1.6767075
Training set
ME RMSE MAE MPE MAPE MASE ACF1 Theil's U
theta 2.934494e-02 0.2101747 0.1046614 0.30793753 1.143115 0.1638029 0.2191889194 NA
randomwalk 2.953975e-02 0.2106058 0.1050209 0.31049479 1.146559 0.1643655 0.2190857676 NA
expsmooth 1.277048e-02 0.2037005 0.1078265 0.14375355 1.176651 0.1687565 -0.0007393747 NA
arima 4.001011e-05 0.2006623 0.1079862 -0.03405395 1.192417 0.1690063 -0.0091275716 NA
struc 5.011615e-03 1.0068396 0.5520857 0.18206018 5.989414 0.8640550 0.1499843508 NA
Dari akurasi model, kita dapat melihat bahwa model yang paling akurat adalah model theta. Saya tidak yakin mengapa ramalan itu sangat tidak akurat, dan saya pikir salah satu alasannya adalah, saya tidak memperlakukan "pencilan" dalam kumpulan data saya, sehingga menghasilkan ramalan buruk untuk semua model.
Ini adalah plot outlier saya
output tsoutliers
ARIMA(0,1,0)(0,0,1)[12]
Coefficients:
sma1 LS46 LS51 LS61 TC133 LS181 AO183 AO184 LS185 TC186 TC193 TC200
0.1700 0.4316 0.6166 0.5793 -0.5127 0.5422 0.5138 0.9264 3.0762 0.5688 -0.4775 -0.4386
s.e. 0.0768 0.1109 0.1105 0.1106 0.1021 0.1120 0.1119 0.1567 0.1918 0.1037 0.1033 0.1040
LS207 AO237 TC248 AO260 AO266
0.4228 -0.3815 -0.4082 -0.4830 -0.5183
s.e. 0.1129 0.0782 0.1030 0.0801 0.0805
sigma^2 estimated as 0.01258: log likelihood=205.91
AIC=-375.83 AICc=-373.08 BIC=-311.19
Outliers:
type ind time coefhat tstat
1 LS 46 1996:10 0.4316 3.891
2 LS 51 1997:03 0.6166 5.579
3 LS 61 1998:01 0.5793 5.236
4 TC 133 2004:01 -0.5127 -5.019
5 LS 181 2008:01 0.5422 4.841
6 AO 183 2008:03 0.5138 4.592
7 AO 184 2008:04 0.9264 5.911
8 LS 185 2008:05 3.0762 16.038
9 TC 186 2008:06 0.5688 5.483
10 TC 193 2009:01 -0.4775 -4.624
11 TC 200 2009:08 -0.4386 -4.217
12 LS 207 2010:03 0.4228 3.746
13 AO 237 2012:09 -0.3815 -4.877
14 TC 248 2013:08 -0.4082 -3.965
15 AO 260 2014:08 -0.4830 -6.027
16 AO 266 2015:02 -0.5183 -6.442
Saya ingin tahu bagaimana saya bisa "menganalisis" lebih lanjut / meramalkan data saya, dengan kumpulan data yang relevan dan deteksi outlier, dll. Tolong bantu saya dalam perawatan outlier saya juga untuk melakukan peramalan saya juga.
Terakhir, saya ingin tahu bagaimana menggabungkan peramalan model yang berbeda bersama-sama, seperti dari apa yang @forecaster sebutkan di tautan no.1, menggabungkan model yang berbeda kemungkinan besar akan menghasilkan peramalan / prediksi yang lebih baik.
Diedit
Saya ingin memasukkan outlier dalam model lain dengan baik.
Saya sudah mencoba beberapa kode, mis.
forecast.ets( res$fit ,h=period,xreg=newxreg)
Error in if (object$components[1] == "A" & is.element(object$components[2], : argument is of length zero
forecast.StructTS(res$fit,h=period,xreg=newxreg)
Error in predict.Arima(object, n.ahead = h) : 'xreg' and 'newxreg' have different numbers of columns
Ada beberapa kesalahan yang dihasilkan, dan saya tidak yakin tentang kode yang benar untuk memasukkan outlier sebagai regressor. Lebih lanjut, bagaimana saya bekerja dengan thetaf atau rwf, karena tidak ada forecast.theta atau forecast.rwf?
Jawaban:
Jawaban ini juga terkait dengan poin 6 dan 7 dari pertanyaan Anda yang lain .
Pencilan dipahami sebagai pengamatan yang tidak dijelaskan oleh model, sehingga peran mereka dalam ramalan terbatas dalam arti bahwa keberadaan pencilan baru tidak akan diprediksi. Yang perlu Anda lakukan adalah memasukkan pencilan ini dalam persamaan perkiraan.
Dalam kasus outlier aditif (yang mempengaruhi pengamatan tunggal), variabel yang mengandung outlier ini hanya akan diisi dengan nol, karena outlier terdeteksi untuk pengamatan dalam sampel; dalam kasus pergeseran level (perubahan permanen dalam data), variabel akan diisi dengan variabel untuk menjaga perubahan dalam perkiraan.
Selanjutnya, saya menunjukkan cara mendapatkan perkiraan dalam R pada model ARIMA dengan outlier yang terdeteksi oleh 'tsoutliers'. Kuncinya adalah untuk mendefinisikan dengan benar argumen
newxreg
yang diteruskanpredict
.(Ini hanya untuk mengilustrasikan jawaban atas pertanyaan Anda tentang cara memperlakukan outlier ketika melakukan peramalan, saya tidak membahas masalah apakah model atau prakiraan yang dihasilkan adalah solusi terbaik.)
Edit
Fungsi
predict
seperti yang digunakan di atas menghasilkan prakiraan berdasarkan model ARIMA yang dipilih, ARIMA (2,0,0) yang disimpanres$fit
dan pencilan yang terdeteksires$outliers
,. Kami memiliki persamaan model seperti ini:tsoutliers
sumber
Menggunakan perangkat lunak yang saya telah membantu mengembangkan model yang masuk akal untuk 72 pengamatan Anda akan mencakup transformasi daya (log) karena varians kesalahan terkait dengan nilai yang diharapkan. Ini juga cukup jelas dari plot asli di mana mata dapat mendeteksi peningkatan varians di level yang lebih tinggi. dengan actual.fit/forecast dan plot final residual . Perhatikan batas kepercayaan yang lebih realistis dengan mempertimbangkan transformasi daya. Meskipun respons ini tidak menggunakan R, hal itu meningkatkan bar untuk apa model yang masuk akal menggunakan R mungkin termasuk.
sumber