Hoe monteer je een ARIMAX-model met R?

Ik heb vier verschillende tijdreeksen van uurmetingen:

  1. Het warmteverbruik in een huis
  2. De temperatuur buiten het huis
  3. De zonnestraling
  4. De windsnelheid

Ik wil het warmteverbruik in huis kunnen voorspellen . Er is een duidelijke seizoenstrend, zowel op jaarbasis als op dagelijkse basis. Omdat er een duidelijke correlatie is tussen de verschillende series, wil ik ze passen met behulp van een ARIMAX-model. Dit kan worden gedaan in R, met behulp van de functie arimax uit het pakket TSA.

Ik heb geprobeerd de documentatie over deze functie te lezen en de overdrachtsfuncties te lezen, maar tot nu toe mijn code:

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) 

geeft me: voer hier de beschrijving van de afbeelding in

waar de zwarte lijn de werkelijke is gemeten gegevens, en de groene lijn is mijn gepaste model in vergelijking. Het is niet alleen geen goed model, maar er is duidelijk iets mis.

Ik geef toe dat mijn kennis van ARIMAX-modellen en overdrachtsfuncties beperkt is. In de functie arimax (), (voor zover ik heb begrepen), is xtransf de exogene tijdreeks die ik wil gebruiken (met behulp van overdrachtsfuncties) om mijn belangrijkste tijdreeks te voorspellen. Maar wat is het verschil tussen xreg en xtransf eigenlijk?

Meer in het algemeen, wat heb ik fout gedaan? Ik zou graag een betere pasvorm willen krijgen dan degene die wordt bereikt met lm (heat ~ temp radi wind * tijd).

Bewerkingen: Op basis van enkele opmerkingen heb ik transfer verwijderd en in plaats daarvan xreg toegevoegd:

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) 

waarbij dayy het “nummer van de dag van het jaar” is en de tijd het uur van de dag. Temp is weer de temperatuur buiten. Dit geeft me het volgende resultaat:

voer hier een beeldbeschrijving in

wat beter is, maar lang niet wat ik verwachtte te zien.

Antwoord

Je zult een beetje moeite hebben met het modelleren van een serie met 2 seizoensniveaus met behulp van een ARIMA-model . Om dit goed te doen, hangt sterk af van het correct instellen van de zaken. Heeft u al een eenvoudig lineair model overwogen? Ze zijn veel sneller en gemakkelijker aan te passen dan ARIMA-modellen, en als u dummyvariabelen gebruikt voor uw verschillende seizoensniveaus, zijn dat vaak behoorlijk nauwkeurig.

  1. Ik ga ervan uit dat je gegevens per uur hebt, dus zorg ervoor dat je TS-object is ingesteld met een frequentie van 24.
  2. Je kunt andere niveaus van seizoensgebondenheid met behulp van dummy-variabelen. U wilt bijvoorbeeld een set van 0/1 dummys die de maand van het jaar vertegenwoordigen.
  3. Neem de dummy-variabelen op in de xreg argument, samen met eventuele covariaten (zoals temperatu re).
  4. Pas het model aan met de arima-functie in basis R. Deze functie kan ARMAX-modellen verwerken door het gebruik van het xreg argument.
  5. Probeer de functies Arima en auto.arima in het prognosepakket. auto.arima is leuk omdat het automatisch goede parameters voor je arima-model zal vinden. Het zal echter ALTIJD duren om in uw dataset te passen.
  6. Probeer de tslm-functie in het arima-pakket, gebruikmakend van dummy-variabelen voor elk seizoensniveau. Dit past veel sneller dan het Arima-model en werkt mogelijk zelfs beter in jouw situatie.
  7. Als 4/5/6 niet werkt, begin dan je zorgen te maken over overdrachtsfuncties. Je moet eerst kruipen u kunt lopen.
  8. Als u van plan bent om in de toekomst te voorspellen, moet u eerst uw xreg-variabelen voorspellen. Dit is gemakkelijk voor seizoensdummys, maar u zult moeten nadenken over hoe u een goede weersvoorspellingen. Misschien de mediaan van historische gegevens gebruiken?

Hier is een voorbeeld van hoe ik dit zou aanpakken:

#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),] 

Opmerkingen

  • Wat is de fitting () functie. Als ik dat gebruik, krijg ik veel betere resultaten dan met predict (model10, newxreg = regParams).
  • @utdiscant: predict() wordt gebruikt voor prognoses, terwijl fitted() retourneert de aanpassing van het model over de historische periode. Als je meer specifieke hulp wilt, moet je een reproduceerbaar voorbeeld met wat code posten.
  • @utdiscant: ook, als je dayy als xreg gebruikt, loop je het risico van overfitting, aangezien je maar 24 observaties hebt per dag. U krijgt wellicht betere voorspellingsresultaten als u maand van het jaar gebruikt.
  • @utdiscant: Bovendien moeten uw op tijd gebaseerde xregs dummy-variabelen zijn. De manier waarop u het nu heeft gemodelleerd, is dat u verwacht dat heat lineair toeneemt met het uur van de dag, en dan weer omlaag springt wanneer het uur terugkeert naar 1. Als u dummy-variabelen gebruikt, uur van de dag krijgt het ' eigen effect. Loop door mijn voorbeeldcode en let goed op hoe ik mijn xreg-object construeer.
  • Een nadeel van de ARIMA-functies in de stats – en forecast -pakketten is dat ze niet passen bij prober-overdrachtsfuncties . De documentatie van de stats::arima -functie vermeldt het volgende: Als een xreg-term is opgenomen, een lineaire regressie (met een constante term als include.mean waar is en er geen verschil is ) is uitgerust met een ARMA-model voor de foutterm. Dus als je daadwerkelijk overdrachtsfuncties moet passen, lijkt het erop dat de functie TSA::arimax de juiste keuze is voor R.

Answer

Ik heb R gebruikt om laad de prognose een tijdje en ik kan je aanraden om forecast pakket en zijn onschatbare functies (zoals auto.arima) te gebruiken.

U kunt een ARIMA-model bouwen met het volgende commando:

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

met y uw voorspelling en (ik stel dayy), order de volgorde van uw model (rekening houdend met seizoensinvloeden) en exogenous_data uw temperatuur, zonnestraling, etc. De functie auto.arima helpt u de optimale modelvolgorde te vinden. Je kunt hier een korte tutorial vinden over `forecast” package hier .

Reacties

  • Wat moet worden voorspeld is warmte (het warmteverbruik van het huis).

Antwoord

I persoonlijk begrijp de overdrachtsfuncties niet, maar ik denk dat je de xtransf en xreg hebt omgekeerd. In R “s basis arima is het xreg die uw exogene variabelen bevat. Ik heb de indruk dat een overdrachtsfunctie hoe (vertraagde gegevens beïnvloeden toekomstige waarden) in plaats van wat .

Ik “zou proberen xreg te gebruiken voor uw exogene variabelen, misschien door arima te gebruiken als arimax een overdrachtsfunctie vereist. Het probleem is dat uw model dagelijks is, maar uw gegevens bevatten beide dagelijkse en jaarlijkse seizoensgebondenheid, en ik “weet op dit moment niet zeker of een eerste verschil (de order=(*, 1, *)) daar wel of niet voor zal zorgen. (U zult zeker “geen magische voorspellingen voor het hele jaar krijgen uit een model dat alleen rekening houdt met dagelijkse seizoensinvloeden.)

PS Wat is de time die u gebruikt in jouw lm? Letterlijke kloktijd of een waarnemingsgetal van 1 omhoog? Ik denk dat je iets kunt krijgen door een gemengd effectmodel te gebruiken (lmer in het lme4 pakket), hoewel ik “niet weet of dit correct doet de autocorrelatie verklaart die zal optreden in een tijdreeks. Als er geen rekening mee wordt gehouden, wat een lm niet doet, zou je een interessante match kunnen krijgen, maar je concept van hoe nauwkeurig je voorspelling is, zal veel te optimistisch zijn.

Opmerkingen

  • Ik heb zowel het uur van de meting als de " dag van het jaar " van de meting.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *