By | August 29, 2021
[This article was first published on R on Rob J Hyndman, and kindly contributed to R-bloggers]. (Anda dapat melaporkan masalah tentang konten di halaman ini di sini)


Ingin berbagi konten Anda di R-blogger? klik di sini jika Anda memiliki blog, atau di sini jika tidak.

NS tsoutliers() fungsi dalam ramalan cuaca paket untuk R berguna untuk mengidentifikasi anomali dalam deret waktu. Namun, itu tidak didokumentasikan dengan baik di mana pun. Posting ini dimaksudkan untuk mengisi celah itu.

Fungsi dimulai sebagai jawaban di CrossValidated dan kemudian ditambahkan ke ramalan cuaca paket karena saya pikir itu mungkin berguna untuk orang lain. Sejak itu telah diperbarui dan dibuat lebih andal.

Prosedur menguraikan deret waktu menjadi komponen tren, musiman, dan sisa:
[y_t = T_t + S_t + R_t.]

Komponen musiman bersifat opsional, dan mungkin berisi beberapa pola musiman yang sesuai dengan periode musiman dalam data. Idenya adalah pertama-tama menghilangkan musim dan tren apa pun dalam data, dan kemudian menemukan outlier dalam seri sisanya, (R_t).

Untuk data yang diamati lebih sering daripada setiap tahun, kami menggunakan pendekatan yang kuat untuk memperkirakan (T_t) dan (NS) dengan terlebih dahulu menerapkan metode MSTL ke data. MSTL akan memperkirakan komponen musiman secara iteratif.

Kemudian kekuatan musiman diukur dengan menggunakan
[F_s = 1-frac{text{Var}(y_t – hat{T}_t – hat{S}_t)}{text{Var}(y_t – hat{T}_t)}.]

Jika (F_s>0.6), seri yang disesuaikan secara musiman dihitung:
[y_t^* = y_t – hat{S}_t.]

Ambang batas kekuatan musiman digunakan di sini karena perkiraan (hat{S}_t) kemungkinan akan overfitted dan sangat bising jika musim yang mendasarinya terlalu lemah (atau tidak ada), berpotensi menutupi setiap outlier dengan menyerapnya ke dalam komponen musiman.

Jika (F_s le 0.6 ), atau jika data diamati setiap tahun atau lebih jarang, kita cukup mengatur (y_t^*=y_t).

Selanjutnya, kami memperkirakan kembali komponen tren dari (y_t^*) nilai-nilai. Untuk deret waktu non-musiman seperti data tahunan, ini diperlukan karena kami tidak memiliki estimasi tren dari dekomposisi STL. Tetapi bahkan jika kita memiliki menghitung dekomposisi STL, kami mungkin tidak menggunakannya jika (F_s le 0.6 ).

Komponen tren (T_t) diperkirakan dengan menerapkan super halus Friedman (via supsmu()) ke (y_t^*) data. Fungsi ini telah diuji pada banyak data dan cenderung bekerja dengan baik pada berbagai masalah.

Kami mencari outlier dalam perkiraan sisa seri
[hat{R}_t = y^*_t – hat{T}_t.]

Jika (Q1) menunjukkan persentil ke-25 dan (Q3) menunjukkan persentil ke-75 dari nilai sisa, maka rentang interkuartil didefinisikan sebagai (IQR = Q3-Q1). Pengamatan diberi label sebagai outlier jika kurang dari (Q1 – 3kali IQR) atau lebih besar dari (Q3 + 3kali IQR). Ini adalah definisi yang digunakan oleh Tukey (1977, p44) dalam proposal boxplot aslinya untuk nilai-nilai “jauh”.

Jika nilai-nilai sisanya terdistribusi normal, maka kemungkinan suatu pengamatan diidentifikasi sebagai outlier adalah kira-kira 1 dalam 427000.

Setiap outlier yang diidentifikasi dengan cara ini diganti dengan nilai interpolasi linier menggunakan pengamatan tetangga, dan prosesnya diulang.

Contoh: Data emas

Data harga emas berisi harga emas pagi harian dalam dolar AS dari 1 Januari 1985 hingga 31 Maret 1989. Data tersebut diberikan kepada saya oleh klien yang ingin saya memperkirakan harga emas. (Saya mengatakan kepadanya bahwa hampir tidak mungkin untuk mengalahkan perkiraan yang naif). Datanya ditunjukkan di bawah ini.

library(fpp2)
autoplot(gold)

Ada periode nilai yang hilang, dan satu outlier yang jelas yaitu sekitar $100 lebih besar dari yang diharapkan. Ini hanya salah ketik, dengan seseorang mengetik 593,70 daripada 493,70. Mari kita lihat apakah tsoutliers() fungsi dapat menemukannya.

tsoutliers(gold)
## $index
## [1] 770
## 
## $replacements
## [1] 495

Benar saja, itu mudah ditemukan dan penggantian yang disarankan (diinterpolasi secara linier) mendekati nilai sebenarnya.

NS tsclean() fungsi menghapus outlier yang diidentifikasi dengan cara ini, dan menggantinya (dan nilai yang hilang) dengan penggantian yang diinterpolasi secara linier.

autoplot(tsclean(gold), series="clean", color='red', lwd=0.9) +
  autolayer(gold, series="original", color='gray', lwd=1) +
  geom_point(data = tsoutliers(gold) %>% as.data.frame(), 
             aes(x=index, y=replacements), col='blue') +
  labs(x = "Day", y = "Gold price ($US)")

Titik biru menunjukkan penggantian outlier, garis merah menunjukkan penggantian nilai yang hilang.