Jak přizpůsobit model ARIMAX s R?

Mám čtyři různé časové řady hodinových měření:

  1. spotřeba tepla v domě
  2. Teplota mimo dům
  3. Sluneční záření
  4. Rychlost větru

Chci být schopen předpovědět spotřebu tepla uvnitř domu . Existuje jasný sezónní trend, a to jak na roční, tak na denní bázi. Protože existuje jasná korelace mezi různými řadami, chci je přizpůsobit pomocí modelu ARIMAX. To lze provést v R pomocí funkce arimax z balíčku TSA.

Snažil jsem se přečíst dokumentaci k této funkci a přečíst si funkce přenosu, ale zatím můj kód:

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) 

mi dává: zde zadejte popis obrázku

kde černá čára je skutečná naměřená data a zelená čára je můj srovnatelný model. Nejen, že to není dobrý model, ale zjevně něco není v pořádku.

Přiznám se, že moje znalost modelů ARIMAX a přenosových funkcí je omezená. Ve funkci arimax () (pokud jsem pochopil) je xtransf exogenní časová řada, kterou chci použít (pomocí přenosových funkcí) k předpovědi své hlavní časové řady. Jaký je ale rozdíl mezi xreg a xtransf?

Obecněji, co jsem udělal špatně? Chtěl bych mít lepší přilnavost, než jakou dosáhl od lm (heat ~ temp radi wind * time).

Úpravy: Na základě některých komentářů jsem odstranil přenos a místo toho přidal xreg:

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) 

kde dayy je „počet dní v roce“ a čas je hodina dne. Teplota je opět teplota venku. To mi dává následující výsledek:

sem zadejte popis obrázku

, což je lepší, ale zdaleka ne to, co jsem očekával.

Odpověď

Budete mít trochu potíže s modelováním série se 2 úrovněmi sezónnosti pomocí modelu ARIMA . Správné nastavení bude velmi záviset na správném nastavení věcí. Už jste uvažovali o jednoduchém lineárním modelu? Jsou mnohem rychlejší a snáze použitelné než modely ARIMA, a pokud pro různé úrovně sezónnosti používáte fiktivní proměnné, jsou často docela přesné.

  1. Předpokládám, že máte hodinová data, takže se ujistěte, že je váš objekt TS nastaven na frekvenci 24.
  2. Můžete modelovat další úrovně sezónnost pomocí fiktivních proměnných. Můžete například potřebovat sadu figurín 0/1 představujících měsíc roku.
  3. Zahrňte fiktivní proměnné do xreg argument, spolu s jakýmikoli proměnnými (jako temperatu re).
  4. Přizpůsobit model funkci arima v základně R. Tato funkce dokáže zpracovat modely ARMAX pomocí argumentu xreg.
  5. Vyzkoušejte funkce Arima a auto.arima v balíčku prognózy. auto.arima je hezké, protože automaticky najde dobré parametry pro váš model arima. Bude však trvat FOREVER, aby se vešel do vaší datové sady.
  6. Vyzkoušejte funkci tslm v balíčku arima pomocí fiktivních proměnných pro každou úroveň sezónnosti. To se vejde mnohem rychleji než model Arima a ve vaší situaci to může dokonce fungovat lépe.
  7. Pokud 4/5/6 nefunguje, POTOM si začněte dělat starosti s přenosovými funkcemi. Předtím se musíte plazit můžete chodit.
  8. Pokud plánujete předpovídat do budoucnosti, budete muset nejprve předpovědět své proměnné xreg. To je pro sezónní figuríny snadné, ale budete muset přemýšlet o tom, jak vytvořit dobré předpovědi počasí. Možná použít medián historických dat?

Zde je příklad toho, jak bych k tomu přistoupil:

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

Komentáře

  • Co je to funkce vybaveny (). Pokud to použiji, získám mnohem lepší výsledky než s predikcí (model10, newxreg = regParams).
  • @utdiscant: predict() se používá pro předpovědi, zatímco fitted() vrátí přizpůsobení modelu za historické období. Pokud chcete konkrétnější nápovědu, měli byste zveřejnit reprodukovatelný příklad s nějakým kódem.
  • @utdiscant: také, pokud použijete dayy jako xreg, riskujete přeplnění, protože máte pouze 24 pozorování denně. Pokud použijete měsíc v roce, můžete dosáhnout lepších výsledků předpovědi.
  • @utdiscant: Kromě toho vaše časové reference musí být fiktivní proměnné . Způsob, jakým to teď máte, je ten, že očekáváte, že heat se bude lineárně zvyšovat s hodinou dne, a poté skočíte zpět dolů, když se hodina vrátí na 1. Pokud používáte fiktivní proměnné, každá hodina dne získá ' vlastní efekt. Projděte můj ukázkový kód a věnujte zvláštní pozornost tomu, jak konstruuji svůj objekt xreg.
  • Jednou z nevýhod funkcí ARIMA v balíčcích stats a forecast je, že se nevejdou na funkce přenosu prober . Dokumentace funkce stats::arima uvádí následující: Pokud je zahrnut výraz xreg, lineární regrese (s konstantním výrazem if include.mean je pravda a není zde žádný rozdíl ) je vybaven modelem ARMA pro chybový termín. Takže pokud skutečně potřebujete přizpůsobit přenosové funkce, zdá se, že cesta TSA::arimax je cesta R.

Odpověď

Používám R k proveďte na chvíli předpovědi zatížení a mohu vám navrhnout, abyste použili balíček forecast a jeho neocenitelné funkce (například auto.arima).

Model ARIMA můžete vytvořit pomocí následujícího příkazu:

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

s y vaším předpovědním (I předpokládejme dayy), order pořadí vašeho modelu (s ohledem na sezónnost) a exogenous_data váš teplota, sluneční záření atd. Funkce auto.arima vám pomůže najít optimální pořadí modelů. Stručný výukový program o balíčku „forecast“ naleznete zde .

Komentáře

  • Předvídat je teplo (spotřeba tepla v domě).

Odpověď

I osobně nerozumím funkcím přenosu, ale myslím, že jste dostali xtransf a xreg obrácené. Alespoň v základně R arima je to xreg, které obsahuje vaše exogenní proměnné. Mám dojem, že přenosová funkce popisuje jak (zpožděná data ovlivňují budoucí hodnoty), nikoli co .

Zkusím použít xreg pro vaše exogenní proměnné, možná pomocí arima pokud arimax vyžaduje přenosovou funkci. Problém je v tom, že váš model je denně, ale vaše data mají obojí denní a roční sezónnost, a teď si nejsem jistý, jestli se o to postará první rozdíl (order=(*, 1, *)), nebo ne. (Určitě nevyhrajete magické celoroční předpovědi z modelu, který zohledňuje pouze denní sezónnost.)

PS Jaký je time který používáte váš lm? Doslova hodinový čas nebo číslo pozorování 1 nahoru? Myslím, že byste něco mohli získat pomocí modelu se smíšenými efekty (lmer v balíčku lme4), i když jsem nepřišel na to, zda to správně zohledňuje autokorelaci, která nastane v časové řadě. Pokud to není započítáno, což lm neudělá, můžete získat zajímavé řešení, ale váš koncept přesnosti vaší předpovědi bude příliš optimistický.

Komentáře

  • Mám hodinu měření i " den v roce " měření.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *