Négy különböző óránkénti mérésem van:
- Egy ház belsejében a hőfogyasztás
- A házon kívüli hőmérséklet
- A napsugárzás
- A szél sebessége
Szeretném megjósolni a házon belüli hőfogyasztást . Világos szezonális trend figyelhető meg, mind éves szinten, mind napi szinten. Mivel egyértelmű összefüggés van a különböző sorozatok között, szeretnék illeszteni őket egy ARIMAX-modell segítségével. Ezt R-ben lehet megtenni, a TSA csomag arimax függvényének felhasználásával.
Megpróbáltam elolvasni ennek a függvénynek a dokumentációját és az átviteli függvényeket, de eddig a kódom:
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)
megadja:
ahol a fekete vonal a tényleges mért adatok, és a zöld vonal az összehasonlított modellem. Nem csak nem jó modell, de nyilvánvalóan valami nincs rendben.
Elismerem, hogy az ARIMAX modellekről és az átviteli funkciókról korlátozott ismereteim vannak. Az arimax () függvényben (amennyire megértettem) az xtransf az az exogén idősor, amelyet használni szeretnék (átviteli függvényekkel) a fő idősorom megjóslásához. De mi a különbség valójában az xreg és az xtransf között?
Általánosabban véve mit csináltam rosszul? Szeretnék jobb illeszkedést szerezni, mint az lm (hő ~ temp rádió szél * idő) által elért illeszkedés.
Szerkesztések: Néhány megjegyzés alapján eltávolítottam az átvitelt, és helyette hozzáadtam az xreg-et:
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)
ahol napos az “év számnapja”, az idő pedig a nap órája. A hőmérséklet ismét a kinti hőmérséklet. Ez a következő eredményt adja:
ami jobb, de közel sem olyan, mint amilyet vártam.
Válasz
Kicsit nehézségekbe ütközik 2 szezonalitású sorozat ARIMA modell használatával történő modellezése . Ennek a jognak a megszerzése nagyban függ a dolgok helyes beállításától. Gondolt már egy egyszerű lineáris modellre? Sokkal gyorsabbak és könnyebben illeszthetők, mint az ARIMA modellek, és ha dummy változókat használ a különböző szezonalitás szintekhez, gyakran elég pontos.
- Feltételezem, hogy óránkénti adataid vannak, ezért győződj meg arról, hogy a TS objektumod 24-es frekvenciával van beállítva.
- Modellezhetsz más szintű szezonalitás dummy változók használatával. Például 0/1-es próbabábu-készletet szeretne használni, amely az év hónapját képviseli.
- A dummy változókat foglalja bele a
xreg
érv, minden kovariánssal együtt (mint a temperatu re). - Illessze be a modellt az R bázis arima függvényével. Ez a függvény képes kezelni az ARMAX modelleket az
xreg
argumentum használatával. - Próbálja ki az előrejelzési csomag Arima és auto.arima funkcióit. Az auto.arima kedves, mert automatikusan megtalálja az arima modell jó paramétereit. Mindazonáltal MINDIG kell, hogy elférjen az adatkészleten.
- Próbálja ki az arima csomag tslm függvényét, a szezonalitás minden szintjének dummy változókkal. Ez sokkal gyorsabban illeszkedik, mint az Arima modell, és még jobban is működhet az Ön helyzetében.
- Ha a 4/5/6 nem működik, AKKOR kezdjen aggódni az átviteli funkciók miatt. Mielőtt feltérképezné sétálhat.
- Ha a jövőre tervez előrejelzést, akkor először meg kell előrejeleznie az xreg változókat. Ez a szezonális bábuk számára könnyű, de el kell gondolkodnia azon, hogyan készítsen egy jó időjárás-előrejelzés. Esetleg használja a történelmi adatok mediánját?
Íme egy példa arra, hogyan közelíteném meg ezt:
#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),]
Megjegyzések
Válasz
R-t használtam végezze el egy ideig a terhelés előrejelzését, és azt tudom javasolni, hogy használja a forecast
csomagot és annak felbecsülhetetlen funkcióit (például auto.arima
).
ARIMA modellt a következő paranccsal készíthet:
model = arima(y, order, xreg = exogenous_data)
a y
paranccsal tegyük fel, hogy dayy
), order
a modell sorrendje (figyelembe véve a szezonalitást) és exogenous_data
hőmérséklet, napsugárzás stb. A auto.arima
függvény segít megtalálni az optimális modell sorrendet. Az `előrejelzés« csomagról egy rövid bemutató található itt .
Megjegyzések
- Az előrejelzés a hő (a ház hőfogyasztása).
Válasz
I személyesen nem érti az átviteli függvényeket, de szerintem megfordította a xtransf
és xreg
elemeket. Legalábbis az R “bázis arima
xreg
tartalmazza az exogén változókat. Az a benyomásom, hogy egy átviteli függvény leírja a hogyan (a lemaradt adatok befolyásolják a jövőbeli értékeket), nem pedig a mi re.
Megpróbálnám használni a xreg
exogén változói, esetleg a arima
használatával, ha a arimax
átviteli függvényt igényel. A probléma az, hogy a modellje napi, de az adatai mindkettőben vannak napi és éves szezonalitás, és jelenleg nem vagyok biztos abban, hogy az első különbség (a order=(*, 1, *)
) gondoskodik-e erről vagy sem. (Biztosan nem fog varázslatos, egész éves előrejelzéseket kapni egy olyan modellből, amely csak a napi szezonalitást veszi figyelembe.)
PS Mi az a time
, amelyet használ a lm
? Szó szerinti óraidő vagy 1-szeres megfigyelési szám? Azt hiszem, vegyes hatású modell használatával (lmer
a lme4
csomagban), bár még nem jöttem rá, hogy ennek helyes elvégzése figyelembe veszi-e az idősorokban bekövetkező autokorrelációt. Ha ezt nem számolják el, amit egy lm
nem tesz meg, érdekes illeszkedést kaphat, de az elképzelése, hogy mennyire pontos az előrejelzése, túl optimista lesz.
Megjegyzések
- Megvan mind a mérés órája, mind az év " napja " a mérés.
predict()
az előrejelzéshez, míg afitted()
visszaadja a modell illeszkedését a történelmi időszakra. Ha konkrétabb segítségre van szüksége, akkor tegyen közzé egy megismételhető példát valamilyen kóddal.heat
lineárisan növekszik a nap órájával, majd visszaugrik, amikor az óra 1-re tér vissza. Ha dummy változókat használsz, mindegyik a nap órája megkapja ' saját hatását. Futtassa át a példakódomat, és gondosan figyeljen arra, hogy miként szerkesztem az xreg objektumomat.stats
ésforecast
csomagokban az, hogy nem felelnek meg a prober átviteli függvényeknek . Astats::arima
függvény dokumentációja a következőket állítja: Ha xreg tag szerepel, akkor lineáris regressziót (állandó taggal, ha az true.mean igaz, és nincs különbség ) egy ARMA modellel van felszerelve a hibakifejezéshez. Tehát, ha valóban át kell alakítanunk az átviteli függvényeket, úgy tűnik, hogy aTSA::arimax
függvény aR
.