Jeg har fire forskjellige tidsserier av timemålinger:
- Varmeforbruket inne i et hus
- Temperaturen utenfor huset
- Solstrålingen
- Vindhastigheten
Jeg ønsker å kunne forutsi varmeforbruket inne i huset . Det er en klar sesongmessig trend, både på årsbasis og på daglig basis. Siden det er en klar sammenheng mellom de forskjellige seriene, vil jeg passe dem ved hjelp av en ARIMAX-modell. Dette kan gjøres i R, ved hjelp av funksjonen arimax fra pakken TSA.
Jeg prøvde å lese dokumentasjonen på denne funksjonen, og å lese meg opp på overføringsfunksjoner, men så langt, koden min:
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)
gir meg:
der den svarte linjen er den faktiske målte data, og den grønne linjen er min tilpassede modell i sammenligning. Ikke bare er det ikke en god modell, men det er helt klart noe galt.
Jeg vil innrømme at min kunnskap om ARIMAX-modeller og overføringsfunksjoner er begrenset. I funksjonen arimax (), (så vidt jeg har forstått), er xtransf den eksogene tidsserien som jeg vil bruke (ved hjelp av overføringsfunksjoner) for å forutsi mine viktigste tidsserier. Men hva er egentlig forskjellen mellom xreg og xtransf?
Mer generelt, hva har jeg gjort galt? Jeg vil gjerne kunne få en bedre passform enn den som oppnås fra lm (varme ~ temp radi vind * tid).
Redigeringer: Basert på noen av kommentarene, fjernet jeg overføringen, og la til xreg i stedet:
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)
hvor daglig er «antall dag i året», og tid er timen på dagen. Temp er igjen temperaturen utenfor. Dette gir meg følgende resultat:
som er bedre, men ikke i det minste det jeg forventet å se.
Svar
Du kommer til å ha litt problemer med å modellere en serie med to sesongnivåer ved hjelp av en ARIMA-modell . Å få dette riktig er veldig avhengig av å sette opp ting riktig. Har du vurdert en enkel lineær modell ennå? De er mye raskere og lettere å passe enn ARIMA-modeller, og hvis du bruker dummyvariabler for de forskjellige sesongnivåene dine, er de ofte ganske nøyaktig.
- Jeg antar at du har data per time, så sørg for at TS-objektet ditt er satt opp med frekvensen 24.
- Du kan modellere andre nivåer av sesongmessighet ved hjelp av dummyvariabler. Du vil for eksempel kanskje ha et sett med 0/1 dummies som representerer året i året.
- Inkluder dummyvariablene i
xreg
argument, sammen med eventuelle kovariater (som temperaturu re). - Tilpass modellen med arima-funksjonen i base R. Denne funksjonen kan håndtere ARMAX-modeller ved bruk av
xreg
-argumentet. - Prøv funksjonene Arima og auto.arima i prognosepakken. auto.arima er hyggelig fordi det automatisk finner gode parametere for din arima-modell. Det vil imidlertid ta FOREVER å passe inn i datasettet ditt.
- Prøv tslm-funksjonen i arima-pakken, og bruk dummyvariabler for hvert sesongnivå. Dette vil passe mye raskere enn Arima-modellen, og kan til og med fungere bedre i din situasjon.
- Hvis 4/5/6 ikke fungerer, så begynn å bekymre deg for overføringsfunksjoner. Du må krype før du kan gå.
- Hvis du planlegger å prognose inn i fremtiden, må du først prognose xreg-variablene dine. Dette er enkelt for sesongmessige dummies, men du må tenke på hvordan du kan lage en gode værmeldinger. Kanskje bruke medianen av historiske data?
Her er et eksempel på hvordan jeg vil nærme meg dette:
#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),]
Kommentarer
Svar
Jeg har brukt R til gjør lasteprognosering en stund, og jeg kan foreslå at du bruker forecast
-pakken og dens uvurderlige funksjoner (som auto.arima
).
Du kan bygge en ARIMA-modell med følgende kommando:
model = arima(y, order, xreg = exogenous_data)
med y
ditt prediktand (I antar at dayy
), order
rekkefølgen på modellen din (med tanke på sesongmessighet) og exogenous_data
din temperatur, solstråling, etc. Funksjonen auto.arima
hjelper deg med å finne den optimale modellrekkefølgen. Du kan finne en kort veiledning om `prognose» pakke her .
Kommentarer
- Det som skal forutsies er varme (husets varmeforbruk).
Svar
I personlig forstår ikke overføringsfunksjoner, men jeg tror du fikk reversert xtransf
og xreg
. I det minste i R «s base arima
er det xreg
som inneholder dine eksogene variabler. Det er mitt inntrykk at en overføringsfunksjon beskriver hvordan (forsinkede data påvirker fremtidige verdier) i stedet for hva .
Jeg prøver å bruke xreg
for dine eksogene variabler, kanskje ved å bruke arima
hvis arimax
krever en overføringsfunksjon. Problemet er at modellen din er daglig, men dataene dine har begge daglig og årlig sesongmessighet, og jeg er ikke sikker akkurat nå om en første forskjell (order=(*, 1, *)
) vil ta seg av det eller ikke. (Du vil absolutt ikke få magiske helårsprognoser ut av en modell som bare vurderer daglig sesongmessighet.)
PS Hva er time
du bruker i din lm
? Bokstavelig klokketid eller et 1-opp observasjonsnummer? Jeg tror du kan få noe ved å bruke en modell med blandet effekt (lmer
i lme4
-pakken), selv om jeg ikke har funnet ut om det å gjøre det riktig står for autokorrelasjonen som vil skje i en tidsserie. Hvis ikke lm
ikke blir redegjort for det, kan det hende du får en interessant passform, men konseptet ditt med hvor presis spådommen din er, vil være altfor optimistisk.
Kommentarer
- Jeg har både målingens time og " året i året " av målingen.
predict()
brukes til prognoser, mensfitted()
returnerer modelltilpasningen over den historiske perioden. Hvis du vil ha mer spesifikk hjelp, bør du legge ut et reproduserbart eksempel med litt kode.heat
vil øke lineært med timen på dagen, og deretter hoppe ned igjen når timen går tilbake til 1. Hvis du bruker dummyvariabler, vil hver time på dagen vil få det ' sin egen effekt. Gjennom eksempelkoden min, og vær nøye med hvordan jeg konstruerer xreg-objektet mitt.stats
ogforecast
er at de ikke passer til funksjoner for proberoverføring . Dokumentasjonen forstats::arima
-funksjonen oppgir følgende: Hvis en xreg-term er inkludert, er en lineær regresjon (med en konstant term hvis include.mean er sant og det er ingen forskjell ) er utstyrt med en ARMA-modell for feiluttrykket. Så hvis du faktisk trenger å passe på overføringsfunksjoner, virker det som omTSA::arimax
-funksjonen er veien å gå iR
.