Kuinka sovittaa ARIMAX-malli R: n kanssa?

Minulla on neljä erilaista tunneittaista aikasarjaa:

  1. talon lämmönkulutus
  2. Lämpötila talon ulkopuolella
  3. Auringon säteily
  4. Tuulen nopeus

Haluan pystyä ennustamaan talon lämmönkulutuksen . Sekä vuosittain että päivittäin on selkeä kausitrendi. Koska eri sarjojen välillä on selkeä korrelaatio, haluan sovittaa ne ARIMAX-mallilla. Tämä voidaan tehdä R: ssä käyttämällä paketin TSA funktiota arimax.

Yritin lukea tämän toiminnon ohjeet ja lukea siirtofunktiot, mutta toistaiseksi koodini:

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) 

antaa minulle: kirjoita kuvan kuvaus tähän

missä musta viiva on todellinen mitattu data, ja vihreä viiva on sovitettu mallini verrattuna. Se ei ole vain hyvä malli, mutta selvästikin jokin on vialla.

Myönnän, että tietoni ARIMAX-malleista ja siirtotoiminnoista on rajallinen. Funktiossa arimax () (sikäli kuin olen ymmärtänyt) xtransf on eksogeeninen aikasarja, jota haluan käyttää (siirtofunktioiden avulla) ennustamaan pääaikasarjani. Mutta mitä eroa on xreg: n ja xtransfin välillä?

Mitä olen tehnyt väärin? Haluaisin pystyä saamaan paremman istuvuuden kuin mitä saavutetaan lm: llä (lämpö ~ temp radi tuuli * aika).

Muokkaukset: Joidenkin kommenttien perusteella poistin siirron ja lisäsin sen sijaan 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) 

missä päiväpäivä on ”vuoden lukupäivä” ja aika on päivän tunti. Lämpötila on jälleen ulkona oleva lämpötila. Tämä antaa minulle seuraavan tuloksen:

kirjoita kuvan kuvaus tähän

mikä on parempi, mutta ei melkein mitä odotin näkevän.

vastaus

Sinulla on hieman vaikeuksia mallintaa sarjaa kahdella kausitasolla ARIMA-mallilla Tämän oikeuden saaminen riippuu suuresti siitä, miten asiat asetetaan oikein. Oletko harkinnut yksinkertaista lineaarista mallia? Ne ovat paljon nopeampi ja helpompi sovittaa kuin ARIMA-mallit, ja jos käytät nuken muuttujia eri kausitasoille, ne ovat usein melko tarkkoja.

  1. Oletan, että sinulla on tuntitietoja, joten varmista, että TS-objektisi on määritetty taajuudella 24.
  2. Voit mallintaa muita kausiluonteisuus käyttämällä nukkumuuttujia. Saatat esimerkiksi haluta asettaa 0/1 -nuket, jotka edustavat vuoden kuukautta.
  3. Sisällytä nuken muuttujat xreg argumentti yhdessä kaikkien kovariaattien kanssa (kuten temperatu
  4. Sovita malli arima-funktioon tukiasemaan R. Tämä toiminto voi käsitellä ARMAX-malleja xreg -argumentin avulla.
  5. Kokeile ennustepaketin Arima – ja auto.arima -funktioita. auto.arima on mukava, koska se löytää automaattisesti hyvät parametrit arima-mallillesi. Siihen kestää kuitenkin ikuisesti, että se mahtuu tietojoukkoosi.
  6. Kokeile arima-paketin tslm-funktiota käyttämällä nuken muuttujia jokaiselle kausitasolle. Tämä sopii paljon nopeammin kuin Arima-malli, ja se voi jopa toimia paremmin tilanteessasi.
  7. Jos 4/5/6 ei toimi, aloita sitten huolta siirtotoiminnoista. Sinun on indeksoitava ennen voit kävellä.
  8. Jos aiot ennustaa tulevaisuuteen, sinun on ensin ennustettava xreg-muuttujat. Tämä on helppoa kausiluonteisille nukkeille, mutta sinun on mietittävä, kuinka tehdä hyvät sääennusteet. Ehkä käyttää historiallisten tietojen mediaania?

Tässä on esimerkki siitä, miten lähestyisin tätä:

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

kommentit

  • Mikä on fit () -toiminto. Jos käytän sitä, saan paljon parempia tuloksia kuin ennustamalla (malli10, newxreg = regParams).
  • @utdiscant: ennustamiseen käytetään predict(), kun taas div id = ”642d145ff7”>

palauttaa mallin sovituksen historialliseen ajanjaksoon. Jos haluat tarkempaa apua, sinun on lähetettävä toistettava esimerkki koodilla.

  • @utdiscant: Jos käytät dayyä xreg: ksi, sinulla on vaarana ylikunto, koska sinulla on vain 24 havaintoa. päivässä. Saatat saada parempia ennustetuloksia, jos käytät vuoden kuukautta.
  • @utdiscant: Aikaperusteisten xreg-tiedostojesi on lisäksi oltava nuken muuttujia . Se, miten se on nyt mallinnettu, on se, että odotat heat: n kasvavan lineaarisesti vuorokaudenajan kanssa ja sitten hypätä takaisin alas, kun tunti palaa arvoon 1. Jos käytät nuken muuttujia, kukin Päivän tunti saa sen ’ oman vaikutuksen. Suorita esimerkkikoodini läpi ja kiinnitä huomiota siihen, miten rakennan xreg-objektini.
  • ARIMA-funktioiden yksi haittapuoli stats – ja forecast -paketeissa on, että ne eivät sovi koettimen siirtofunktioihin . Funktion stats::arima dokumentaatiossa sanotaan seuraava: Jos xreg-termi sisältyy, lineaarinen regressio (vakiotermillä, jos include.mean on tosi ja ei ole eroa ) on varustettu ARMA-mallilla virhetermille. Joten jos sinun on todella sovitettava siirtofunktioita, näyttää siltä, että TSA::arimax -toiminto on oikea tapa mennä sisään R.
  • Vastaa

    Olen käyttänyt R tee kuormanennuste jonkin aikaa ja voin ehdottaa, että käytät forecast -pakettia ja sen korvaamattomia toimintoja (kuten auto.arima).

    Voit rakentaa ARIMA-mallin seuraavalla komennolla:

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

    ennusteella y Oletetaan, että dayy), order mallisi järjestys (kausiluonteisuus huomioon ottaen) ja exogenous_data lämpötila, auringon säteily jne. Funktio auto.arima auttaa löytämään optimaalisen mallijärjestyksen. Löydät lyhyen opetusohjelman ennustepaketista täältä .

    Kommentit

    • Ennakoitava on lämpö (talon lämmönkulutus).

    Vastaus

    I henkilökohtaisesti älä ymmärrä siirtofunktioita, mutta luulen, että xtransf ja xreg ovat päinvastaiset. Ainakin R: n perustassa arima eksogeeniset muuttujat sisältävät xreg. Minusta tuntuu, että siirtofunktio kuvaa miten (viivästyneet tiedot vaikuttavat tuleviin arvoihin) eikä mitä .

    Yritän käyttää xreg eksogeeniset muuttujat, ehkä käyttämällä arima, jos arimax vaatii siirtofunktion. Ongelmana on, että mallisi on päivittäin, mutta tiedoissasi on molempia päivittäinen ja vuosittainen kausiluonteisuus, enkä ole tällä hetkellä varma, huolehtiiko ensimmäinen ero (order=(*, 1, *)) vai ei. (Et varmasti saa maagisia ennusteita mallista, joka ottaa huomioon vain päivittäisen kausiluonteisuuden.)

    PS Mikä on time, jota käytät lm? Kirjaimellinen kellonaika tai 1-up-tarkkailunumero? Luulen, että voisit saada jotain käyttämällä sekoitettua mallia (lmer lme4 -paketissa), vaikka en ole selvittänyt, otetaanko oikeaan aikaan huomioon aikasarjassa esiintyvä autokorrelaatio. Jos sitä ei oteta huomioon, jota lm ei, saatat saada mielenkiintoisen sopivuuden, mutta käsityksesi ennustesi tarkkuudesta on aivan liian optimistinen.

    Kommentit

    • Minulla on sekä mittaustunti että vuoden ” päivä ” mittauksesta.

    Vastaa

    Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *