Bagaimana cara memasang model ARIMAX dengan R?

33

Saya memiliki empat seri pengukuran waktu yang berbeda:

  1. Konsumsi panas di dalam rumah
  2. Suhu di luar rumah
  3. Radiasi matahari
  4. Kecepatan angin

Saya ingin dapat memprediksi konsumsi panas di dalam rumah. Ada tren musiman yang jelas, baik secara tahunan, dan setiap hari. Karena ada korelasi yang jelas antara seri yang berbeda, saya ingin memasangnya dengan menggunakan model ARIMAX. Ini dapat dilakukan dalam R, menggunakan fungsi arimax dari paket TSA.

Saya mencoba membaca dokumentasi tentang fungsi ini, dan membaca tentang fungsi transfer, tetapi sejauh ini, kode saya:

regParams = ts.union(ts(dayy))
transferParams = ts.union(ts(temp))
model10 = arimax(heat,order=c(2,1,1),seasonal=list(order=c(0,1,1),period=24),xreg=regParams,xtransf=transferParams,transfer=list(c(1,1))
pred10 = predict(model10, newxreg=regParams)

memberi saya: masukkan deskripsi gambar di sini

di mana garis hitam adalah data yang diukur sebenarnya, dan garis hijau adalah model yang cocok saya sebagai perbandingan. Bukan hanya itu bukan model yang baik, tetapi jelas ada sesuatu yang salah.

Saya akan mengakui bahwa pengetahuan saya tentang model-ARIMAX dan fungsi transfer terbatas. Dalam fungsi arimax (), (sejauh yang saya mengerti), xtransf adalah deret waktu eksogen yang ingin saya gunakan (menggunakan fungsi transfer) untuk memprediksi deret waktu utama saya. Tapi apa sebenarnya perbedaan antara xreg dan xtransf?

Secara umum, apa yang telah saya lakukan salah? Saya ingin bisa mendapatkan yang lebih baik daripada yang dicapai dari lm (panas ~ temp radi wind * time).

Suntingan: Berdasarkan beberapa komentar, saya menghapus transfer, dan menambahkan xreg sebagai gantinya:

regParams = ts.union(ts(dayy), ts(temp), ts(time))
model10 = arimax(heat,order=c(2,1,1),seasonal=list(order=c(0,1,1),period=24),xreg=regParams)

di mana dayy adalah "angka hari dalam setahun", dan waktu adalah jam dalam sehari. Temp adalah suhu di luar. Ini memberi saya hasil berikut:

masukkan deskripsi gambar di sini

mana yang lebih baik, tetapi tidak hampir seperti yang saya harapkan.

utdiscant
sumber

Jawaban:

34

Anda akan mengalami sedikit kesulitan memodelkan seri dengan 2 tingkat musiman menggunakan model ARIMA. Melakukan ini dengan benar akan sangat tergantung pada pengaturan segalanya dengan benar. Sudahkah Anda mempertimbangkan model linier sederhana? Mereka jauh lebih cepat dan lebih mudah masuk daripada model ARIMA, dan jika Anda menggunakan variabel dummy untuk tingkat musiman berbeda, seringkali lebih akurat.

  1. Saya berasumsi Anda memiliki data per jam, jadi pastikan objek TS Anda diatur dengan frekuensi 24.
  2. Anda bisa memodelkan level musiman lainnya menggunakan variabel dummy. Misalnya, Anda mungkin menginginkan satu set 0/1 boneka yang mewakili bulan dalam setahun.
  3. Sertakan variabel dummy dalam xregargumen, bersama dengan kovariat apa pun (seperti suhu).
  4. Sesuaikan model dengan fungsi arima di basis R. Fungsi ini dapat menangani model ARMAX melalui penggunaan xregargumen.
  5. Coba fungsi Arima dan auto.arima dalam paket perkiraan. auto.arima bagus karena secara otomatis akan menemukan parameter yang baik untuk model arima Anda. Namun, perlu SELAMANYA agar sesuai dengan dataset Anda.
  6. Coba fungsi tslm dalam paket arima, menggunakan variabel dummy untuk setiap tingkat musiman. Ini akan cocok jauh lebih cepat daripada model Arima, dan bahkan dapat bekerja lebih baik dalam situasi Anda.
  7. Jika 4/5/6 tidak berfungsi, MAKA mulai khawatir tentang fungsi transfer. Anda harus merangkak sebelum bisa berjalan.
  8. Jika Anda berencana untuk meramalkan ke masa depan, Anda harus terlebih dahulu memperkirakan variabel xreg Anda. Ini mudah untuk boneka musiman, tetapi Anda harus memikirkan cara membuat prakiraan cuaca yang bagus. Mungkin menggunakan median data historis?

Berikut adalah contoh bagaimana saya akan mendekati ini:

#Setup a fake time series
set.seed(1)
library(lubridate)
index <- ISOdatetime(2010,1,1,0,0,0)+1:8759*60*60
month <- month(index)
hour <- hour(index)
usage <- 1000+10*rnorm(length(index))-25*(month-6)^2-(hour-12)^2
usage <- ts(usage,frequency=24)

#Create monthly dummies.  Add other xvars to this matrix
xreg <- model.matrix(~as.factor(month))[,2:12]
colnames(xreg) <- c('Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')

#Fit a model
library(forecast)
model <- Arima(usage, order=c(0,0,0), seasonal=list(order=c(1,0,0), period=24), xreg=xreg)
plot(usage)
lines(fitted(model),col=2)

#Benchmark against other models
model2 <- tslm(usage~as.factor(month)+as.factor(hour))
model3 <- tslm(usage~as.factor(month))
model4 <- rep(mean(usage),length(usage))

#Compare the 4 models
library(plyr) #for rbind.fill
ACC <- rbind.fill(  data.frame(t(accuracy(model))),
                    data.frame(t(accuracy(model2))),
                    data.frame(t(accuracy(model3))),
                    data.frame(t(accuracy(model4,usage)))
                )
ACC <- round(ACC,2)
ACC <- cbind(Type=c('Arima','LM1','Monthly Mean','Mean'),ACC)
ACC[order(ACC$MAE),]
Zach
sumber
Apa fungsi yang dipasang (). Jika saya menggunakannya, saya mendapatkan hasil yang jauh lebih baik daripada dengan prediksi (model10, newxreg = regParams).
utdiscant
@utdiscant: predict()digunakan untuk perkiraan, sambil fitted()mengembalikan model yang cocok selama periode historis. Jika Anda ingin bantuan yang lebih spesifik, Anda harus memposting contoh yang dapat direproduksi dengan beberapa kode.
Zach
@utdiscant: juga, jika Anda menggunakan dayy sebagai xreg, Anda berisiko overfitting, karena Anda hanya memiliki 24 pengamatan per hari. Anda mungkin mendapatkan hasil perkiraan yang lebih baik jika Anda menggunakan bulan dalam setahun.
Zach
@utdiscant: Selanjutnya, xregs berbasis waktu Anda harus berupa variabel dummy . Cara Anda memodelkannya sekarang adalah Anda berharap heatakan meningkat secara linear dengan jam sehari, dan kemudian melompat kembali ketika jam kembali ke 1. Jika Anda menggunakan variabel dummy, setiap jam dalam sehari akan mendapatkan efeknya sendiri. Jalankan melalui kode contoh saya, dan perhatikan bagaimana saya membangun objek xreg saya.
Zach
Salah satu kelemahan fungsi ARIMA dalam paket statsdan forecastadalah bahwa mereka tidak cocok dengan fungsi transfer prober. Dokumentasi stats::arimafungsi menyatakan sebagai berikut: Jika istilah xreg disertakan, regresi linier (dengan suku konstanta jika include. Berarti benar dan tidak ada perbedaan) dilengkapi dengan model ARMA untuk istilah kesalahan. Jadi, jika Anda benar-benar harus menyesuaikan fungsi transfer sepertinya TSA::arimaxfungsi adalah cara untuk masuk R.
Christoffer
8

Saya telah menggunakan R untuk melakukan prakiraan beban untuk sementara waktu dan saya dapat menyarankan Anda untuk menggunakan forecastpaket dan fungsinya yang tak ternilai (seperti auto.arima).

Anda dapat membangun model ARIMA dengan perintah berikut:

model = arima(y, order, xreg = exogenous_data)

dengan yprediksi Anda dan (saya kira dayy), orderurutan model Anda (mempertimbangkan musim) dan exogenous_datasuhu Anda, radiasi matahari, dll. Fungsi ini auto.arimamembantu Anda menemukan urutan model yang optimal. Anda dapat menemukan tutorial singkat tentang paket `ramalan 'di sini .

Matteo De Felice
sumber
Yang diprediksi adalah panas (konsumsi panas rumah).
utdiscant
3

Saya pribadi tidak mengerti fungsi transfer, tapi saya pikir Anda dapat xtransfdan xregmembalikkannya. Setidaknya dalam basis R, arimaitu xregberisi variabel eksogen Anda. Ini kesan saya bahwa fungsi transfer menjelaskan bagaimana (data yang tertinggal mempengaruhi nilai masa depan) daripada apa .

Saya akan mencoba menggunakan xreguntuk variabel eksogen Anda, mungkin menggunakan arimajika arimaxmenuntut fungsi transfer. Masalahnya adalah bahwa model Anda setiap hari, tetapi data Anda memiliki musiman harian dan tahunan, dan saya tidak yakin sekarang apakah perbedaan pertama order=(*, 1, *)akan mengatasi hal itu atau tidak. (Anda tentu tidak akan mendapatkan ramalan sepanjang tahun ajaib dari model yang hanya mempertimbangkan musiman harian.)

PS Apa timeyang Anda gunakan di Anda lm? Waktu jam literal atau angka pengamatan 1-up? Saya pikir Anda bisa mendapatkan sesuatu dengan menggunakan model efek-campuran ( lmerdalam lme4paket), meskipun saya belum menemukan apakah melakukan hal itu dengan benar bertanggung jawab atas autokorelasi yang akan terjadi dalam rangkaian waktu. Jika tidak diperhitungkan, dan yang lmtidak, Anda mungkin mendapatkan kecocokan yang menarik, tetapi konsep Anda tentang seberapa akurat prediksi Anda akan terlalu optimis.

Wayne
sumber
Saya memiliki jam pengukuran, dan "hari dalam setahun" pengukuran.
utdiscant