Bagaimana cara melakukan peramalan dengan deteksi outlier di R? - Prosedur dan Metode analisis deret waktu


16

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 Ramalan 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

Plot outliers Pencilan

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?


1
Mungkin Anda harus mengambil pendekatan lain untuk mendapatkan bantuan karena pengeditan ulang terus-menerus tampaknya tidak berfungsi
IrishStat

Saya setuju dengan @irishstat, kedua jawaban di bawah ini memberikan jawaban langsung untuk pertanyaan Anda, dan tampaknya hanya mendapat sedikit perhatian.
peramal

Coba baca dokumentasi fungsi khusus yang memberi Anda kesalahan, ETS dan thetaf tidak memiliki kemampuan untuk menangani regressor.
peramal

Jawaban:


7

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 newxregyang diteruskan predict.

(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.)

require(tsoutliers)
x <- c(
  7.55,  7.63,  7.62,  7.50,  7.47,  7.53,  7.55,  7.47,  7.65,  7.72,  7.78,  7.81,
  7.71,  7.67,  7.85,  7.82,  7.91,  7.91,  8.00,  7.82,  7.90,  7.93,  7.99,  7.93,
  8.46,  8.48,  9.03,  9.43, 11.58, 12.19, 12.23, 11.98, 12.26, 12.31, 12.13, 11.99,
 11.51, 11.75, 11.87, 11.91, 11.87, 11.69, 11.66, 11.23, 11.37, 11.71, 11.88, 11.93,
 11.99, 11.84, 12.33, 12.55, 12.58, 12.67, 12.57, 12.35, 12.30, 12.67, 12.71, 12.63,
 12.60, 12.41, 12.68, 12.48, 12.50, 12.30, 12.39, 12.16, 12.38, 12.36, 12.52, 12.63)
x <- ts(x, frequency=12, start=c(2006,1))
res <- tso(x, types=c("AO","LS","TC"))

# define the variables containing the outliers for
# the observations outside the sample
npred <- 12 # number of periods ahead to forecast 
newxreg <- outliers.effects(res$outliers, length(x) + npred)
newxreg <- ts(newxreg[-seq_along(x),], start = c(2012, 1))

# obtain the forecasts
p <- predict(res$fit, n.ahead=npred, newxreg=newxreg)

# display forecasts
plot(cbind(x, p$pred), plot.type = "single", ylab = "", type = "n", ylim=c(7,13))
lines(x)
lines(p$pred, type = "l", col = "blue")
lines(p$pred + 1.96 * p$se, type = "l", col = "red", lty = 2)  
lines(p$pred - 1.96 * p$se, type = "l", col = "red", lty = 2)  
legend("topleft", legend = c("observed data", 
  "forecasts", "95% confidence bands"), lty = c(1,1,2,2), 
  col = c("black", "blue", "red", "red"), bty = "n")

perkiraan

Edit

Fungsi predictseperti yang digunakan di atas menghasilkan prakiraan berdasarkan model ARIMA yang dipilih, ARIMA (2,0,0) yang disimpan res$fitdan pencilan yang terdeteksi res$outliers,. Kami memiliki persamaan model seperti ini:

yt=j=1mωjL.j(B)sayat(tj)+θ(B)ϕ(B)α(B)ϵt,ϵtNsayaD(0,σ2),

L.jjtsoutlierssayat


jadi apa yang Anda lakukan adalah menambahkan pencilan ke dalam argumen "newxreg". Apakah ini disebut regressor? Bisakah saya tahu penggunaan regressor? Selain itu, melalui penggunaan regressor dalam fungsi "prediksi", apakah masih menggunakan ARIMA? atau metode peramalan yang berbeda? Terima kasih banyak atas bantuan Anda dalam penggunaan tsoutliers. = D
Ted

Apakah mungkin untuk memasukkan outlier sebagai regressor untuk digunakan dalam peramalan dalam model lain juga? seperti Basic Structural Model, Theta, Random Walk, dll?
Ted

@Ted Ya, perkiraan didasarkan pada model ARMA. Saya telah mengedit jawaban saya dengan beberapa perincian tentang ini.
javlacalle

Anda dapat memasukkan variabel regressor yang mengandung efek seperti perubahan level, outlier aditif, ... dalam model lain juga, misalnya, jalan acak, model deret waktu struktural, ... Jika Anda bertanya bagaimana menggunakan beberapa perangkat lunak untuk melakukan itu, Anda mungkin harus menanyakannya di posting lain dan mempertimbangkan apakah pertanyaannya lebih cocok untuk situs lain seperti stackoverflow .
javlacalle

Oh oke. Pertanyaan lain adalah, tahukah Anda jika ada perbedaan antara menggunakan prediksi dan perkiraan ? Jika ada, apa bedanya
Ted

2

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. masukkan deskripsi gambar di sinidengan actual.fit/forecast masukkan deskripsi gambar di sinidan plot finalmasukkan deskripsi gambar di sini 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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.