ARIMAX modeline R nasıl takılır?


33

Dört farklı zaman aralığında saatlik ölçümlerim var:

  1. Bir evin içindeki ısı tüketimi
  2. Evin dışındaki sıcaklık
  3. Güneş radyasyonu
  4. Rüzgar hızı

Evin içindeki ısı tüketimini tahmin edebilmek istiyorum. Hem yıllık bazda hem de günlük bazda net bir mevsimsel eğilim vardır. Farklı seriler arasında açık bir ilişki olduğu için, onlara bir ARIMAX modeli kullanarak yerleştirmek istiyorum. Bu, TSA paketindeki arimax işlevini kullanarak R'de yapılabilir.

Bu fonksiyonla ilgili belgeleri okumaya ve transfer fonksiyonlarını okumaya çalıştım ama şu ana kadar kodum:

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)

bana verir: görüntü tanımını buraya girin

siyah çizgi gerçek ölçülen veri, yeşil çizgi ise benim takılı modelim. Sadece iyi bir model değil, aynı zamanda açıkça bir şeyler yanlış.

ARIMAX modelleri ve transfer fonksiyonları hakkındaki bilgilerimin sınırlı olduğunu kabul edeceğim. Arimax () işlevinde (anladığım kadarıyla), xtransf, ana zaman serilerimi tahmin etmek için kullanmak istediğim (transfer işlevlerini kullanarak) kullandığım eksojen zaman serisidir. Fakat xreg ve xtransf arasındaki fark gerçekten nedir?

Daha genel olarak yanlış ne yaptım? Lm'den (sıcağa / sıcağa) yayılan rüzgâr süresi * ile elde edilenden daha iyi bir uyum elde etmek isterim .

Düzenlemeler: Yorumlardan bazılarına göre aktarımı kaldırdım ve bunun yerine xreg ekledim:

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)

günlük "yılın numarası günü" dür ve saat günün saatidir. Sıcaklık tekrar dışarıdaki sıcaklıktır. Bu bana şu sonucu verir:

görüntü tanımını buraya girin

hangisi daha iyi, ama neredeyse görmeyi umduğum gibi değil.

Yanıtlar:


34

Bir ARIMA modeli kullanarak 2 mevsimsellik seviyesine sahip bir seriyi modellemek için biraz sorun yaşayacaksınız. Bunu doğru yapmak, işleri doğru şekilde düzenlemeye büyük ölçüde bağlı. Henüz basit bir lineer model düşündünüz mü? ARIMA modellerine göre çok daha hızlı ve sığdırlar ve farklı mevsimsellik seviyeleriniz için yapay değişkenler kullanıyorsanız, genellikle oldukça hassastırlar.

  1. Saatlik verileriniz olduğunu farz ediyorum, bu nedenle TS nesnenizin 24 frekansla ayarlandığından emin olun.
  2. Sahte değişkenleri kullanarak diğer mevsimsellik seviyelerini modelleyebilirsiniz. Örneğin, yılın ayını temsil eden bir dizi 0/1 aptal isteyebilirsiniz.
  3. Sahte değişkenleri, xregdeğişkenlerin yanı sıra (sıcaklık gibi) argümana dahil edin .
  4. Modeli, R tabanına arima işleviyle yerleştirin. Bu işlev, ARMAX modellerini xreg argüman .
  5. Arima ve auto.arima'yı deneyinTahmin paketinde işlevlerini . auto.arima güzel çünkü arima modeliniz için otomatik olarak iyi parametreleri bulacak. Ancak, veri kümenize uyması SADECE sürer.
  6. Her bir mevsimsellik seviyesi için kukla değişkenleri kullanarak arima paketindeki tslm işlevini deneyin. Bu, Arima modelinden çok daha hızlı bir şekilde sığacaktır ve sizin durumunuzda daha iyi çalışabilir.
  7. 4/5/6 işe yaramazsa THEN, transfer fonksiyonları hakkında endişelenmeye başlar. Yürümeden önce sürünmelisin.
  8. Geleceği tahmin etmeyi planlıyorsanız, öncelikle xreg değişkenlerinizi tahmin etmeniz gerekecektir. Bu mevsimsel aptallar için kolaydır, ancak iyi bir hava durumu tahminini nasıl yapacağınızı düşünmeniz gerekir. Belki de tarihsel verilerin medyanını kullanabilirsin?

İşte buna nasıl yaklaşacağımın bir örneği:

#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),]

Fitted () işlevi nedir. Bunu kullanırsam, tahmin etmekten daha iyi sonuçlar elde ederim (model10, newxreg = regParams).
utdiscant

@utdiscant: Öngörü predict()için kullanılırken fitted()tarihi döneme uygun modeli döndürür. Daha spesifik yardım istiyorsanız, bazı kodlarla tekrarlanabilir bir örnek göndermelisiniz.
Zach

@utdiscant: ayrıca, eğer günlük olarak bir xreg kullanırsanız, günde sadece 24 gözleminiz olduğu için fazla abartma riskiyle karşı karşıya kalırsınız. Yılın ayı kullanıyorsanız daha iyi tahmin sonuçları alabilirsiniz.
Zach

@utdiscant: Ayrıca, zamana dayalı xregs'in sahte değişkenler olması gerekir . Şimdi modellenmesini sağladığın gibi heat, günün saatiyle doğrusal olarak artacağını ve saat 1'e döndüğünde geriye doğru zıplayacağını tahmin ediyorsun . Eğer kukla değişkenler kullanırsan, günün her saati kendi etkisine sahip olacak. Örnek kodumu çalıştırın ve xreg nesnemi nasıl oluşturduğuma dikkat edin.
Zach

ARIMA fonksiyonlarının statsve forecastpaketlerindeki bir dezavantajı, prober transfer fonksiyonlarına uymamalarıdır. stats::arimaİşlevin belgelenmesi aşağıdakileri ifade eder: Bir xreg terimi eklenirse, bir doğrusal regresyon (include.mean doğruysa sabit bir terim ile ve fark yok), hata terimi için bir ARMA modeli ile donatılmıştır. Yani, aslında transfer fonksiyonlarına uymanız gerekiyorsa, TSA::arimaxfonksiyon içeri girmenin yoludur R.
Christoffer

8

Bir süredir yük tahminini yapmak için R'yi kullanıyorum ve forecastpaketi ve paha biçilmez işlevlerini kullanmanızı öneririz auto.arima.

Aşağıdaki komutu kullanarak bir ARIMA modeli oluşturabilirsiniz:

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

ile y senin predictand (herhalde dayy), ordermodelinizin (dikkate mevsimsellik) ve sırası exogenous_datavb fonksiyonu sizin sıcaklık, güneş radyasyonu, auto.arimaoptimal modeli sırasını bulmak için yardımcı olur. Burada 'tahmini' paketi hakkında kısa bir öğretici bulabilirsiniz .


Tahmin edilmesi gereken, ısıdır (evin ısı tüketimi).
utdiscant

3

Ben şahsen transfer fonksiyonlarını anlamıyorum ama ne var düşünmek xtransfve xregtersine çevirdi. R'ın tabanında En azından arimaöyle xregolduğunu da eksojen değişkenler içeriyor. Bir aktarım işlevinin neyi değil de (gecikmeli verilerin gelecekteki değerleri nasıl etkilediğini) tanımladığı izlenimim .

xregDış değişkenleriniz için kullanmayı deneyebilirim , belki de bir aktarma işlevi arimaisterse arimax. Sorun şu ki modeliniz günlük, ancak verileriniz hem günlük hem de yıllık mevsimsellikten oluşuyor ve şu anda ilk farkın ( order=(*, 1, *)) bununla ilgilenip ilgilenmeyeceğinden emin değilim. (Sadece günlük mevsimselliği dikkate alan bir modelden yıl boyunca büyülü tahminler almayacaksınız.)

PS timeSizde ne kullanıyorsunuz lm? Hazır bilgi saati veya 1-yukarı gözlem numarası? Bence karışık etkili bir model kullanarak bir şeyler bulabilirsin lmer.lme4 bunu yaparken doğru bir zaman serisinde oluşacak otokorelasyon hesapları olmadığını anladım değil de, paketin). Eğer hesaba katılmamışsa, hangisi lmdeğilse, ilginç bir form yakalayabilirsiniz, ancak tahmininizin ne kadar kesin olduğu konusundaki konseptiniz çok iyimser olacaktır.


Hem ölçüm saati hem de ölçümün "yılın günü" var.
utdiscant
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.