Ho quattro diverse serie temporali di misurazioni orarie:
- Il consumo di calore allinterno di una casa
- La temperatura fuori casa
- La radiazione solare
- 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à:
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:
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.
- Immagino che tu abbia dati orari, quindi assicurati che il tuo oggetto TS sia impostato con una frequenza di 24.
- Puoi modellare altri livelli di stagionalità utilizzando variabili fittizie. Ad esempio, potresti volere un set di 0/1 manichini che rappresentano il mese dellanno.
- Includi le variabili fittizie in
xreg
argomento, insieme a eventuali covariate (come temperatu re). - Adatta il modello con la funzione arima in base R. Questa funzione può gestire i modelli ARMAX tramite luso dellargomento
xreg
. - 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.
- 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.
- Se 4/5/6 non funziona, ALLORA inizia a preoccuparti delle funzioni di trasferimento. Devi eseguire la scansione prima puoi camminare.
- 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
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.
predict()
viene utilizzato per la previsione, mentrefitted()
restituisce ladattamento del modello nel periodo storico. Se vuoi un aiuto più specifico, dovresti pubblicare un esempio riproducibile con un po di codice.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.stats
eforecast
è che non si adattano alle funzioni di trasferimento prober . La documentazione della funzionestats::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 funzioneTSA::arimax
sia la strada da percorrereR
.