Jeg har fire forskellige tidsserier af timemålinger:
- Varmeforbruget inde i et hus
- Temperaturen uden for huset
- Solstrålingen
- 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:
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:
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.
- Jeg antager, at du har timedata, så sørg for at dit TS-objekt er opsat med en frekvens på 24.
- 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.
- Inkluder dummyvariablerne i
xreg
argument sammen med eventuelle covariater (som temperaturu re). - Tilpas modellen med arima-funktionen i base R. Denne funktion kan håndtere ARMAX-modeller ved hjælp af argumentet
xreg
. - 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.
- 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.
- Hvis 4/5/6 ikke fungerer, så begynd at bekymre dig om overføringsfunktioner. Du skal kravle før du kan gå.
- 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
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.
predict()
bruges til prognoser, mensfitted()
returnerer modelpasningen i den historiske periode. Hvis du vil have mere specifik hjælp, skal du sende et reproducerbart eksempel med en kode.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.stats
ogforecast
-pakkerne er, at de ikke passer til proberoverføringsfunktioner . Dokumentationen forstats::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, atTSA::arimax
-funktionen er vejen at gå iR
.