Minulla on neljä erilaista tunneittaista aikasarjaa:
- talon lämmönkulutus
- Lämpötila talon ulkopuolella
- Auringon säteily
- 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:
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:
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.
- Oletan, että sinulla on tuntitietoja, joten varmista, että TS-objektisi on määritetty taajuudella 24.
- Voit mallintaa muita kausiluonteisuus käyttämällä nukkumuuttujia. Saatat esimerkiksi haluta asettaa 0/1 -nuket, jotka edustavat vuoden kuukautta.
- Sisällytä nuken muuttujat
xreg
argumentti yhdessä kaikkien kovariaattien kanssa (kuten temperatu - Sovita malli arima-funktioon tukiasemaan R. Tämä toiminto voi käsitellä ARMAX-malleja
xreg
-argumentin avulla. - 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.
- 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.
- Jos 4/5/6 ei toimi, aloita sitten huolta siirtotoiminnoista. Sinun on indeksoitava ennen voit kävellä.
- 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
palauttaa mallin sovituksen historialliseen ajanjaksoon. Jos haluat tarkempaa apua, sinun on lähetettävä toistettava esimerkki koodilla.
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.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.
predict()
, kun taas div id = ”642d145ff7”>