Cum se potrivește un model ARIMAX cu R?

Am patru serii de timp diferite de măsurători orare:

  1. Consumul de căldură din interiorul unei case
  2. Temperatura în afara casei
  3. Radiația solară
  4. Viteza vântului

Vreau să pot prevedea consumul de căldură din interiorul casei . Există o tendință sezonieră clară, atât anual, cât și zilnic. Deoarece există o corelație clară între diferitele serii, vreau să le potrivesc folosind un model ARIMAX. Acest lucru se poate face în R, folosind funcția arimax din pachetul TSA.

Am încercat să citesc documentația despre această funcție și să citesc despre funcțiile de transfer, dar până acum, codul meu:

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) 

îmi oferă: introduceți descrierea imaginii aici

unde linia neagră este actuala date măsurate, iar linia verde este modelul meu potrivit în comparație. Nu numai că nu este un model bun, dar în mod clar ceva nu este în regulă.

Recunosc că cunoștințele mele despre modelele ARIMAX și funcțiile de transfer sunt limitate. În funcția arimax (), (din câte am înțeles), xtransf este seria de timp exogenă pe care vreau să o folosesc (folosind funcțiile de transfer) pentru a prezice seriile mele principale de timp. Dar care este diferența dintre xreg și xtransf?

Mai general, ce am greșit? Aș dori să pot obține o potrivire mai bună decât cea obținută de la lm (heat ~ temp radi wind * time).

Modificări: Pe baza unora dintre comentarii, am eliminat transferul și am adăugat în schimb xreg:

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) 

unde dayy este „ziua numărului anului”, iar ora este ora zilei. Temp este din nou temperatura din exterior. Acest lucru îmi dă următorul rezultat:

introduceți descrierea imaginii aici

ceea ce este mai bun, dar nu aproape ceea ce mă așteptam să văd.

Răspuns

Veți avea un pic de probleme la modelarea unei serii cu 2 nivele de sezonalitate folosind un model ARIMA . Obținerea acestui drept depinde în mare măsură de setarea corectă a lucrurilor. Ați luat în considerare un model liniar simplu? Acestea sunt mult mai rapide și mai ușor de adaptat decât modelele ARIMA și, dacă utilizați variabile fictive pentru diferitele dvs. niveluri de sezonalitate, acestea sunt adesea destul de precisă.

  1. Presupun că aveți date orare, deci asigurați-vă că obiectul TS este configurat cu o frecvență de 24.
  2. Puteți modela alte niveluri de sezonalitate folosind variabile fictive. De exemplu, s-ar putea să doriți un set de fictive 0/1 care să reprezinte luna anului.
  3. Includeți variabilele fictive în xreg argument, împreună cu orice covariabil (cum ar fi temperatu re).
  4. Montați modelul cu funcția arima în baza R. Această funcție poate gestiona modelele ARMAX prin utilizarea argumentului xreg.
  5. Încercați funcțiile Arima și auto.arima din pachetul de prognoză. auto.arima este frumos, deoarece va găsi automat parametri buni pentru modelul dvs. arima. Cu toate acestea, va fi nevoie de FOREVER pentru a se încadra în setul de date.
  6. Încercați funcția tslm din pachetul arima, folosind variabile inactiv pentru fiecare nivel de sezonalitate. Acest lucru se va potrivi mult mai repede decât modelul Arima și poate chiar să funcționeze mai bine în situația dvs.
  7. Dacă 4/5/6 nu funcționează, ATUNCI începeți să vă faceți griji cu privire la funcțiile de transfer. Trebuie să vă târâți înainte puteți merge pe jos.
  8. Dacă intenționați să prognozați în viitor, va trebui mai întâi să vă prognozați variabilele xreg. Acest lucru este ușor pentru manechinele sezoniere, dar va trebui să vă gândiți cum să faceți un prognoze meteo bune. Poate folosiți mediana datelor istorice?

Iată un exemplu despre cum aș aborda acest lucru:

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

Comentarii

  • Care este funcția potrivită (). Dacă îl folosesc, obțin rezultate mult mai bune decât cu predict (model10, newxreg = regParams).
  • @utdiscant: predict() este utilizat pentru prognoză, în timp ce fitted() returnează modelul potrivit pe perioada istorică. Dacă doriți ajutor mai specific, ar trebui să postați un exemplu reproductibil cu un anumit cod.
  • @utdiscant: de asemenea, dacă utilizați dayy ca xreg, aveți riscul de a se supra-monta, deoarece aveți doar 24 de observații pe zi. S-ar putea să obțineți rezultate mai bune de prognozare dacă utilizați luna anului.
  • @utdiscant: În plus, xreg-urile dvs. bazate pe timp trebuie să fie variabile fictive . Modul în care îl aveți modelat acum este că vă așteptați ca heat să crească liniar cu ora din zi și apoi să sară înapoi când ora revine la 1. Dacă utilizați variabile fictive, fiecare ora zilei va avea propriul efect '. Rulați prin exemplul meu de cod și acordați o atenție deosebită modului în care îmi construiesc obiectul xreg.
  • Un dezavantaj al funcțiilor ARIMA din pachetele stats și forecast este că acestea nu se potrivesc funcțiilor de transfer prober . Documentația funcției stats::arima precizează următoarele: Dacă este inclus un termen xreg, o regresie liniară (cu un termen constant dacă include.mean este adevărat și nu există diferențieri ) este echipat cu un model ARMA pentru termenul de eroare. Deci, dacă de fapt trebuie să potriviți funcțiile de transfer, pare că funcția TSA::arimax este calea de parcurs R.

Răspuns

Am folosit R la încărcați prognozele pentru o vreme și vă pot sugera să utilizați pachetul forecast și funcțiile sale neprețuite (cum ar fi auto.arima).

Puteți crea un model ARIMA cu următoarea comandă:

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

cu y predicția dvs. (I să presupunem dayy), order ordinea modelului dvs. (având în vedere sezonalitatea) și exogenous_data temperatura, radiația solară etc. Funcția auto.arima vă ajută să găsiți ordinea optimă a modelului. Puteți găsi un scurt tutorial despre pachetul „prognoză” aici .

Comentarii

  • Ceea ce trebuie prevăzut este căldura (consumul de căldură al casei).

Răspuns

I personal nu înțelegeți funcțiile de transfer, dar cred că ați inversat xtransf și xreg. Cel puțin în baza R „s arima xreg conține variabilele dvs. exogene. Am impresia că o funcție de transfer descrie cum (datele întârziate afectează valorile viitoare), mai degrabă decât ce .

Aș încerca să folosesc xreg pentru variabilele dvs. exogene, probabil folosind arima dacă arimax solicită o funcție de transfer. Problema este că modelul dvs. este zilnic, dar datele dvs. au ambele zilnic și anual, și nu sunt sigur acum dacă o primă diferență (order=(*, 1, *)) va avea sau nu grijă de asta. (Cu siguranță nu veți obține previziuni magice pe tot parcursul anului dintr-un model care ia în considerare doar sezonalitatea zilnică.)

PS Care este time în care utilizați lm? Ora literală a ceasului sau un număr de observare de 1-up? Cred că ați putea obține ceva folosind un model cu efect mixt (lmer în pachetul lme4), deși nu mi-am dat seama dacă acest lucru este corect pentru conturile corelării automate care va avea loc într-o serie de timp. Dacă nu este luat în considerare, ceea ce nu face lm, este posibil să obțineți o potrivire interesantă, dar conceptul dvs. despre cât de precisă este predicția dvs. va fi mult prea optimist. > Comentarii

  • Am atât ora măsurării, cât și ziua " a anului " al măsurării.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *