Hvordan monteres en ARIMAX-model med R?

Jeg har fire forskellige tidsserier af timemålinger:

  1. Varmeforbruget inde i et hus
  2. Temperaturen uden for huset
  3. Solstrålingen
  4. Vindhastigheden

Jeg vil være i stand til at forudsige varmeforbruget inde i huset . Der er en klar sæsonbestemt tendens, både på årsbasis og på daglig basis. Da der er en klar sammenhæng mellem de forskellige serier, vil jeg tilpasse dem ved hjælp af en ARIMAX-model. Dette kan gøres i R ved hjælp af funktionen arimax fra pakken TSA.

Jeg forsøgte at læse dokumentationen om denne funktion og læse om overførselsfunktioner, men indtil videre min kode:

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) 

giver mig: indtast billedebeskrivelse her

hvor den sorte linje er den aktuelle målte data, og den grønne linje er min tilpassede model i sammenligning. Ikke kun er det ikke en god model, men tydeligt er der noget galt.

Jeg vil indrømme, at min viden om ARIMAX-modeller og overførselsfunktioner er begrænset. I funktionen arimax (), (så vidt jeg har forstået), er xtransf den eksogene tidsserie, som jeg vil bruge (ved hjælp af overførselsfunktioner) til at forudsige mine vigtigste tidsserier. Men hvad er egentlig forskellen mellem xreg og xtransf?

Mere generelt, hvad har jeg gjort forkert? Jeg vil gerne have en bedre pasform end den, der opnås ved lm (varme ~ temp radi vind * tid).

Redigeringer: Baseret på nogle af kommentarerne fjernede jeg overførslen og tilføjede 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 dagligt er “årets antal dag”, og tiden er dagen på dagen. Temp er igen temperaturen udenfor. Dette giver mig følgende resultat:

indtast billedbeskrivelse her

hvilket er bedre, men ikke nær hvad jeg forventede at se.

Svar

Du har lidt problemer med at modellere en serie med 2 sæsonniveauer ved hjælp af en ARIMA-model . At få dette til at gå, afhænger meget af at indstille tingene korrekt. Har du overvejet en simpel lineær model endnu? De er meget hurtigere og lettere at tilpasse end ARIMA-modeller, og hvis du bruger dummyvariabler til dine forskellige sæsonbetingede niveauer ofte ret nøjagtige.

  1. Jeg antager, at du har timedata, så sørg for at dit TS-objekt er opsat med en frekvens på 24.
  2. Du kan modellere andre niveauer af sæsonbestemthed ved hjælp af dummyvariabler. Du kan f.eks. have et sæt 0/1 dummies, der repræsenterer årets måned.
  3. Inkluder dummyvariablerne i xreg argument sammen med eventuelle covariater (som temperaturu re).
  4. Tilpas modellen med arima-funktionen i base R. Denne funktion kan håndtere ARMAX-modeller ved hjælp af argumentet xreg.
  5. Prøv funktionerne Arima og auto.arima i prognosepakken. auto.arima er pænt, fordi det automatisk finder gode parametre til din arima-model. Det tager dog FOREVER at passe ind i dit datasæt.
  6. Prøv tslm-funktionen i arima-pakken ved hjælp af dummy-variabler for hvert sæsonniveau. Dette passer meget hurtigere end Arima-modellen og fungerer måske endda bedre i din situation.
  7. Hvis 4/5/6 ikke fungerer, så begynd at bekymre dig om overføringsfunktioner. Du skal kravle før du kan gå.
  8. Hvis du planlægger at forudsige fremtiden, skal du først forudsige dine xreg-variabler. Dette er let for sæsonbetonede dummies, men du bliver nødt til at tænke over, hvordan man laver en gode vejrudsigter. Brug måske medianen af historiske data?

Her er et eksempel på, hvordan jeg ville nærme mig 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

  • Hvad er funktionen monteret (). Hvis jeg bruger det, får jeg langt bedre resultater end med forudsigelse (model10, newxreg = regParams).
  • @utdiscant: predict() bruges til prognoser, mens fitted() returnerer modelpasningen i den historiske periode. Hvis du vil have mere specifik hjælp, skal du sende et reproducerbart eksempel med en kode.
  • @utdiscant: også, hvis du bruger dayy som en xreg, risikerer du at overmontere, da du kun har 24 observationer Per dag. Du får muligvis bedre prognoseresultater, hvis du bruger måned af året.
  • @utdiscant: Desuden skal dine tidsbaserede xregs være dummyvariabler . Den måde, du har det modelleret på nu, er at du forventer, at heat stiger lineært med timen på dagen og derefter hopper tilbage, når timen vender tilbage til 1. Hvis du bruger dummyvariabler, hver time på dagen får det ' s egen effekt. Kør igennem min eksempelkode, og vær opmærksom på, hvordan jeg konstruerer mit xreg-objekt.
  • Én ulempe ved ARIMA-funktionerne i stats og forecast -pakkerne er, at de ikke passer til proberoverføringsfunktioner . Dokumentationen for stats::arima -funktionen angiver følgende: Hvis der er inkluderet et xreg-udtryk, er en lineær regression (med en konstant term, hvis include.mean er sand, og der er ingen forskel ) er udstyret med en ARMA-model til fejludtrykket. Så hvis du faktisk har brug for at overføre overføringsfunktioner, ser det ud til, at TSA::arimax -funktionen er vejen at gå i R.

Svar

Jeg har brugt R til udfør belastningsprognoser et stykke tid, og jeg kan foreslå dig at bruge forecast -pakken og dens uvurderlige funktioner (som auto.arima).

Du kan opbygge en ARIMA-model med følgende kommando:

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

med y din forudsigelse (I Antag at dayy), order rækkefølgen af din model (i betragtning af sæsonbestemthed) og exogenous_data din temperatur, solstråling osv. Funktionen auto.arima hjælper dig med at finde den optimale modelrækkefølge. Du kan finde en kort vejledning om `prognose” pakke her .

Kommentarer

  • Hvad der forudsiges er varme (husets varmeforbrug).

Svar

I personligt forstår jeg ikke overførselsfunktioner, men jeg tror, du fik xtransf og xreg omvendt. I det mindste i R “s base arima er det xreg, der indeholder dine eksogene variabler. Det er mit indtryk, at en overføringsfunktion beskriver hvordan (forsinkede data påvirker fremtidige værdier) snarere end hvad .

Jeg prøver at bruge xreg til dine eksogene variabler, måske ved hjælp af arima hvis arimax kræver en overføringsfunktion. Problemet er, at din model er daglig, men dine data har begge daglig og årlig sæsonbestemthed, og jeg er ikke sikker på lige nu, om en første forskel (order=(*, 1, *)) tager sig af det eller ej. (Du får bestemt ikke magiske helårsprognoser ud af en model, der kun tager højde for daglig sæsonbestemthed.)

PS Hvad er time, som du bruger i dit lm? Bogstavelig tid eller et 1-op observationsnummer? Jeg tror du kunne få noget ved at bruge en model med blandet effekt (lmer i lme4 -pakken), selvom jeg ikke har fundet ud af, om det korrekt udgør den autokorrelation, der vil opstå i en tidsserie. Hvis der ikke tages højde for det, hvilket en lm ikke gør, kan du få en interessant tilpasning, men dit koncept for, hvor præcis din forudsigelse er, vil være alt for optimistisk.

Kommentarer

  • Jeg har både målingens time og " årets dag " af målingen.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *