Menggabungkan auto.arima () dan ets () dari paket perkiraan

8

Saya telah menggunakan fungsi ets () dan auto.arima () dari paket perkiraan untuk memperkirakan sejumlah besar rangkaian waktu univariat. Saya telah menggunakan fungsi berikut untuk memilih antara 2 metode, tapi saya bertanya-tanya apakah CrossValidated punya ide yang lebih baik (atau kurang naif) untuk peramalan otomatis.

auto.ts <- function(x,ic="aic") {
    XP=ets(x, ic=ic) 
    AR=auto.arima(x, ic=ic)

    if (get(ic,AR)<get(ic,XP)) {
        model<-AR
    }
    else {
        model<-XP
    }
        model
}

/ edit: Bagaimana dengan fungsi ini?

auto.ts <- function(x,ic="aic",holdout=0) {
    S<-start(x)[1]+(start(x)[2]-1)/frequency(x) #Convert YM vector to decimal year
    E<-end(x)[1]+(end(x)[2]-1)/frequency(x)
    holdout<-holdout/frequency(x) #Convert holdout in months to decimal year
    fitperiod<-window(x,S,E-holdout) #Determine fit window

    if (holdout==0) {
        testperiod<-fitperiod
    }
    else {
        testperiod<-window(x,E-holdout+1/frequency(x),E) #Determine test window
    }

    XP=ets(fitperiod, ic=ic)
    AR=auto.arima(fitperiod, ic=ic)

    if (holdout==0) {
        AR_acc<-accuracy(AR)
        XP_acc<-accuracy(XP)
    }
    else {
        AR_acc<-accuracy(forecast(AR,holdout*frequency(x)),testperiod)
        XP_acc<-accuracy(forecast(XP,holdout*frequency(x)),testperiod)
    }

    if (AR_acc[3]<XP_acc[3]) { #Use MAE
        model<-AR
    }
    else {
        model<-XP
    }
    model
}

"Ketidaksepakatan" adalah jumlah periode yang ingin Anda gunakan sebagai sampel uji. Fungsi ini kemudian menghitung jendela fit dan jendela uji berdasarkan parameter ini. Kemudian menjalankan fungsi auto.arima dan ets pada jendela pas, dan memilih yang dengan MAE terendah di jendela tes. Jika ketidaksamaan sama dengan 0, itu menguji kecocokan in-sample.

Apakah ada cara untuk memperbarui model yang dipilih secara otomatis dengan set data lengkap, setelah itu dipilih?

Zach
sumber

Jawaban:

15

Kemungkinan dari dua kelas model, dan karenanya nilai-nilai AIC, tidak dapat dibandingkan karena asumsi inisialisasi yang berbeda. Jadi fungsi Anda tidak valid. Saya sarankan Anda mencoba dua kelas model pada seri Anda dan melihat mana yang memberikan perkiraan out-of-sample terbaik.

Rob Hyndman
sumber
Saya telah mengedit pertanyaan saya untuk memasukkan fungsi yang saya tulis untuk melakukan itu. Apakah fungsi baru saya masuk akal?
Zach
Jika holdout = 0, itu menggunakan insample fit yang akan mendukung model dengan lebih banyak parameter. Tetapi jika holdout> 0, itu masuk akal, meskipun Anda perlu sampel holdout yang cukup besar untuk metode untuk memilih model terbaik dengan andal. Secara umum, saya akan memilih model yang akan digunakan berdasarkan pertimbangan lain daripada hanya mempertimbangkan kinerja perkiraan out-of-sample pada sampel holdout pendek dari satu seri. Misalnya, Anda dapat mempertimbangkan kinerja out-of-sample di seluruh rangkaian seri (bukan satu seri sekaligus), dan pilih kelas model terbaik dengan cara itu.
Rob Hyndman
terima kasih atas sarannya, saya akan mulai bergerak ke arah itu. Dalam kasus di mana ketidaksepakatan saya sama dengan nol, bagaimana jika saya memperkenalkan semacam penalti untuk parameter?
Zach
1
Seperti yang saya katakan, gunakan kinerja out-of-sample pada serangkaian seri besar. Anda tidak dapat dengan mudah membandingkan kinerja dalam-sampel dari dua kelas model.
Rob Hyndman
Ok, terima kasih atas semua sarannya. Saya akan menggunakan kinerja out-of-sample pada seluruh ansambel untuk memilih kelas model.
Zach