Jag har fyra olika tidsserier av timmätningar:
- Värmeförbrukningen i ett hus
- Temperaturen utanför huset
- Solstrålningen
- 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:
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:
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.
- Jag antar att du har timdata, så se till att ditt TS-objekt är inställt med frekvensen 24.
- 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.
- Inkludera dummyvariablerna i
xreg
argument, tillsammans med eventuella kovariater (som temperaturu re). - Passa modellen med arima-funktionen i bas R. Denna funktion kan hantera ARMAX-modeller genom att använda argumentet
xreg
. - 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.
- 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.
- Om 4/5/6 inte fungerar, börja sedan oroa dig för överföringsfunktioner. Du måste krypa innan du kan gå.
- 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
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.
predict()
används för prognoser, medanfitted()
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.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.stats
ochforecast
är att de inte passar proberöverföringsfunktioner . Dokumentationen förstats::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 attTSA::arimax
-funktionen är vägen att gå iR
.