Hur passar jag en ARIMAX-modell med R?

Jag har fyra olika tidsserier av timmätningar:

  1. Värmeförbrukningen i ett hus
  2. Temperaturen utanför huset
  3. Solstrålningen
  4. Vindhastigheten

Jag vill kunna förutsäga värmeförbrukningen inuti huset . Det finns en tydlig säsongsutveckling, både på årsbasis och dagligen. Eftersom det finns en tydlig korrelation mellan de olika serierna vill jag passa dem med en ARIMAX-modell. Detta kan göras i R, med funktionen arimax från paketet TSA.

Jag försökte läsa dokumentationen om den här funktionen och läsa upp överföringsfunktioner, men hittills har min kod:

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) 

ger mig: ange bildbeskrivning här

där den svarta linjen är den faktiska uppmätta data, och den gröna linjen är min anpassade modell i jämförelse. Inte bara är det inte en bra modell utan helt klart något är fel.

Jag kommer att erkänna att min kunskap om ARIMAX-modeller och överföringsfunktioner är begränsad. I funktionen arimax (), (såvitt jag har förstått) är xtransf den exogena tidsserien som jag vill använda (med hjälp av överföringsfunktioner) för att förutsäga mina huvudsakliga tidsserier. Men vad är egentligen skillnaden mellan xreg och xtransf?

Mer generellt, vad har jag gjort fel? Jag skulle vilja kunna få en bättre passform än den som uppnås från lm (värme ~ temp radi vind * tid).

Ändringar: Baserat på några av kommentarerna tog jag bort överföringen och lade till xreg istället:

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) 

där dagligt är ”årets nummerdag” och tiden är timmen på dagen. Temp är återigen temperaturen utanför. Detta ger mig följande resultat:

ange bildbeskrivning här

vilket är bättre, men inte alls vad jag förväntade mig att se.

Svar

Du kommer att ha lite problem med att modellera en serie med två säsongsnivåer med en ARIMA-modell . Att få det här är mycket beroende av att sätta upp saker korrekt. Har du funderat på en enkel linjär modell än? De är mycket snabbare och lättare att passa än ARIMA-modeller, och om du använder dummyvariabler för dina olika säsongsnivåer är de ofta ganska exakt.

  1. Jag antar att du har timdata, så se till att ditt TS-objekt är inställt med frekvensen 24.
  2. Du kan modellera andra nivåer av säsongsanvändning med dummyvariabler. Du kanske till exempel vill ha en uppsättning 0/1 dummies som representerar årets månad.
  3. Inkludera dummyvariablerna i xreg argument, tillsammans med eventuella kovariater (som temperaturu re).
  4. Passa modellen med arima-funktionen i bas R. Denna funktion kan hantera ARMAX-modeller genom att använda argumentet xreg.
  5. Prova funktionerna Arima och auto.arima i prognospaketet. auto.arima är trevligt eftersom det automatiskt hittar bra parametrar för din arima-modell. Det tar emellertid FOREVER att passa in i din dataset.
  6. Testa tslm-funktionen i arima-paketet med dummyvariabler för varje säsongsnivå. Detta passar mycket snabbare än Arima-modellen och kan till och med fungera bättre i din situation.
  7. Om 4/5/6 inte fungerar, börja sedan oroa dig för överföringsfunktioner. Du måste krypa innan du kan gå.
  8. Om du planerar att prognostisera i framtiden måste du först prognostisera dina xreg-variabler. Det här är lätt för säsongsdummor, men du måste tänka på hur man gör en bra väderprognoser. Kanske använda medianen av historiska data?

Här är ett exempel på hur jag skulle närma mig detta:

#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

  • Vad är funktionen fit (). Om jag använder det får jag bättre resultat än med förutsäga (modell10, newxreg = regParams).
  • @utdiscant: predict() används för prognoser, medan fitted() returnerar modellpassningen under den historiska perioden. Om du vill ha mer specifik hjälp bör du lägga upp ett reproducerbart exempel med lite kod.
  • @utdiscant: om du använder dayy som en xreg riskerar du att överanpassa, eftersom du bara har 24 observationer per dag. Du kan få bättre prognosresultat om du använder månad på året.
  • @utdiscant: Dessutom måste dina tidsbaserade xregs vara dummyvariabler . Så som du har modellerat det nu är att du förväntar dig att heat ska öka linjärt med timmen på dagen och sedan hoppa tillbaka när timmen återgår till 1. Om du använder dummyvariabler, vardera timme på dagen får den ' sin egen effekt. Gå igenom min exempelkod och var noga med hur jag konstruerar mitt xreg-objekt.
  • En nackdel med ARIMA-funktionerna i paketen stats och forecast är att de inte passar proberöverföringsfunktioner . Dokumentationen för stats::arima -funktionen anger följande: Om en xreg-term inkluderas är en linjär regression (med en konstant term om include.mean är sant och det finns ingen skillnad ) är utrustad med en ARMA-modell för felterm. Så om du faktiskt behöver passa överföringsfunktioner verkar det som att TSA::arimax -funktionen är vägen att gå i R.

Svar

Jag har använt R för att gör laddprognoser ett tag och jag kan föreslå att du använder forecast paketet och dess ovärderliga funktioner (som auto.arima).

Du kan bygga en ARIMA-modell med följande kommando:

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

med y din förutsägelse (I antar att dayy), order ordningen på din modell (med tanke på säsongsmässighet) och exogenous_data din temperatur, solstrålning etc. Funktionen auto.arima hjälper dig att hitta den optimala modellordningen. Du hittar en kort handledning om `prognos” -paket här .

Kommentarer

  • Det som kan förutses är värme (husets värmeförbrukning).

Svar

I personligen förstår jag inte överföringsfunktioner, men jag tror att du fick xtransf och xreg omvänd. Åtminstone i R: s bas arima är det xreg som innehåller dina exogena variabler. Det är mitt intryck att en överföringsfunktion beskriver hur (fördröjda data påverkar framtida värden) snarare än vad .

Jag skulle försöka använda xreg för dina exogena variabler, kanske med arima om arimax kräver en överföringsfunktion. Problemet är att din modell är dagligen, men dina data har båda dagliga och årliga säsongsvariationer, och jag är inte säker just nu om en första skillnad (order=(*, 1, *)) tar hand om det eller inte. (Du kommer säkert inte att få magiska helårsprognoser ur en modell som bara tar hänsyn till daglig säsongsvariation.)

PS Vad är time som du använder i din lm? Bokstavlig klocktid eller ett 1-upp observationsnummer? Jag tror att du kan få något genom att använda en modell med blandad effekt (lmer i lme4 -paketet, även om jag inte har tänkt ut om jag gör det korrekt för den autokorrelation som kommer att ske i en tidsserie. Om det inte redovisas, vilket en lm inte gör, kan du få en intressant passning, men din uppfattning om hur exakt din förutsägelse är blir alldeles för optimistisk.

Kommentarer

  • Jag har både mätningstimmarna och " årets dag " av mätningen.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *