Come adattare un modello ARIMAX con R?

Ho quattro diverse serie temporali di misurazioni orarie:

  1. Il consumo di calore allinterno di una casa
  2. La temperatura fuori casa
  3. La radiazione solare
  4. La velocità del vento

Voglio essere in grado di prevedere il consumo di calore allinterno della casa . Cè una chiara tendenza stagionale, sia su base annuale che su base giornaliera. Poiché esiste una chiara correlazione tra le diverse serie, desidero adattarle utilizzando un modello ARIMAX. Questo può essere fatto in R, usando la funzione arimax dal pacchetto TSA.

Ho provato a leggere la documentazione su questa funzione e a leggere le funzioni di trasferimento, ma finora il mio codice:

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 dà: inserisci la descrizione dellimmagine qui

dove la linea nera è leffettiva dati misurati e la linea verde è il mio modello montato in confronto. Non solo non è un buon modello, ma chiaramente qualcosa non va.

Ammetto che la mia conoscenza dei modelli ARIMAX e delle funzioni di trasferimento è limitata. Nella funzione arimax (), (per quanto ho capito), xtransf è la serie temporale esogena che voglio utilizzare (utilizzando le funzioni di trasferimento) per prevedere le mie serie temporali principali. Ma qual è veramente la differenza tra xreg e xtransf?

Più in generale, cosa ho fatto di sbagliato? Vorrei essere in grado di ottenere un adattamento migliore di quello ottenuto da lm (heat ~ temp radi wind * time).

Modifiche: In base ad alcuni commenti, ho rimosso il trasferimento e ho aggiunto 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) 

dove dayy è il “numero del giorno dellanno” e lora è lora del giorno. Temp è di nuovo la temperatura esterna. Questo mi dà il seguente risultato:

inserisci qui la descrizione dellimmagine

che è migliore, ma non proprio quello che mi aspettavo di vedere.

Risposta

Avrai qualche problema a modellare una serie con 2 livelli di stagionalità utilizzando un modello ARIMA . Il corretto funzionamento dipende in gran parte dallimpostazione corretta delle cose. Hai già considerato un modello lineare semplice? Sono molto più veloci e facili da adattare rispetto ai modelli ARIMA e se utilizzi variabili fittizie per i diversi livelli di stagionalità, lo sono spesso abbastanza accurato.

  1. Immagino che tu abbia dati orari, quindi assicurati che il tuo oggetto TS sia impostato con una frequenza di 24.
  2. Puoi modellare altri livelli di stagionalità utilizzando variabili fittizie. Ad esempio, potresti volere un set di 0/1 manichini che rappresentano il mese dellanno.
  3. Includi le variabili fittizie in xreg argomento, insieme a eventuali covariate (come temperatu re).
  4. Adatta il modello con la funzione arima in base R. Questa funzione può gestire i modelli ARMAX tramite luso dellargomento xreg.
  5. Prova le funzioni Arima e auto.arima nel pacchetto di previsione. auto.arima è carino perché troverà automaticamente dei buoni parametri per il tuo modello arima. Tuttavia, ci vorrà SEMPRE per adattarsi al tuo set di dati.
  6. Prova la funzione tslm nel pacchetto arima, utilizzando variabili fittizie per ogni livello di stagionalità. Questo si adatterà molto più velocemente del modello Arima e potrebbe anche funzionare meglio nella tua situazione.
  7. Se 4/5/6 non funziona, ALLORA inizia a preoccuparti delle funzioni di trasferimento. Devi eseguire la scansione prima puoi camminare.
  8. Se hai intenzione di fare previsioni per il futuro, dovrai prima prevedere le tue variabili xreg. Questo è facile per i manichini stagionali, ma dovrai pensare a come creare un buone previsioni del tempo. Forse utilizzare la mediana dei dati storici?

Ecco un esempio di come mi avvicinerei a questo:

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

Commenti

  • Cosè la funzione fitting (). Se lo uso, ottengo risultati molto migliori rispetto a Forecast (model10, newxreg = regParams).
  • @utdiscant: predict() viene utilizzato per la previsione, mentre fitted() restituisce ladattamento del modello nel periodo storico. Se vuoi un aiuto più specifico, dovresti pubblicare un esempio riproducibile con un po di codice.
  • @utdiscant: inoltre, se usi dayy come xreg, corri il rischio di overfitting, poiché hai solo 24 osservazioni al giorno. Potresti ottenere risultati di previsione migliori se utilizzi il mese dellanno.
  • @utdiscant: inoltre, i tuoi xreg basati sul tempo devono essere variabili fittizie . Il modo in cui lo hai modellato ora è che ti aspetti che heat aumenti linearmente con lora del giorno e poi torni indietro quando lora torna a 1. Se utilizzi variabili fittizie, lora del giorno avrà leffetto '. Esegui il mio codice di esempio e presta molta attenzione a come costruisco il mio oggetto xreg.
  • Uno svantaggio delle funzioni ARIMA nei pacchetti stats e forecast è che non si adattano alle funzioni di trasferimento prober . La documentazione della funzione stats::arima dichiara quanto segue: Se viene incluso un termine xreg, una regressione lineare (con un termine costante se include.mean è vero e non ci sono differenze ) è dotato di un modello ARMA per il termine di errore. Quindi, se hai effettivamente bisogno di adattare le funzioni di trasferimento, sembra che la funzione TSA::arimax sia la strada da percorrere R.

Risposta

Ho “utilizzato R per carica la previsione per un po e posso suggerirti di utilizzare il pacchetto forecast e le sue funzioni inestimabili (come auto.arima).

Puoi creare un modello ARIMA con il seguente comando:

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

con y la tua previsione e (I supponi dayy), order lordine del tuo modello (considerando la stagionalità) e exogenous_data il tuo temperatura, radiazione solare, ecc. La funzione auto.arima ti aiuta a trovare lordine ottimale del modello. Puoi trovare un breve tutorial sul pacchetto “forecast” qui .

Commenti

  • Ciò che deve essere previsto è il calore (il consumo di calore della casa).

Risposta

I personalmente non capisco le funzioni di trasferimento, ma penso che tu abbia invertito xtransf e xreg. Almeno in R “s base arima è xreg che contiene le tue variabili esogene. Ho limpressione che una funzione di trasferimento descriva come (i dati ritardati influiscono sui valori futuri) piuttosto che cosa .

Proverei a utilizzare xreg per le tue variabili esogene, magari utilizzando arima se arimax richiede una funzione di trasferimento. Il problema è che il tuo modello è quotidiano, ma i tuoi dati hanno entrambi stagionalità giornaliera e annuale, e in questo momento non sono sicuro se una prima differenza (il order=(*, 1, *)) si occuperà di questo o meno. (Certamente non otterrai previsioni magiche per tutto lanno da un modello che considera solo la stagionalità giornaliera.)

PS Qual è il time che utilizzi in il tuo lm? Ora dellorologio letterale o un numero di osservazione 1-up? Penso che potresti ottenere qualcosa utilizzando un modello a effetti misti (lmer nel lme4 pacchetto), anche se non ho capito se farlo correttamente spiega lautocorrelazione che si verificherà in una serie temporale. Se non viene preso in considerazione, cosa che un lm non tiene, potresti ottenere una corrispondenza interessante, ma il tuo concetto di quanto sia precisa la tua previsione sarà troppo ottimistico.

Commenti

  • Ho sia lora della misurazione che il " giorno dellanno " della misurazione.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *