Mám čtyři různé časové řady hodinových měření:
- spotřeba tepla v domě
- Teplota mimo dům
- Sluneční záření
- Rychlost větru
Chci být schopen předpovědět spotřebu tepla uvnitř domu . Existuje jasný sezónní trend, a to jak na roční, tak na denní bázi. Protože existuje jasná korelace mezi různými řadami, chci je přizpůsobit pomocí modelu ARIMAX. To lze provést v R pomocí funkce arimax z balíčku TSA.
Snažil jsem se přečíst dokumentaci k této funkci a přečíst si funkce přenosu, ale zatím můj kód:
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ává:
kde černá čára je skutečná naměřená data a zelená čára je můj srovnatelný model. Nejen, že to není dobrý model, ale zjevně něco není v pořádku.
Přiznám se, že moje znalost modelů ARIMAX a přenosových funkcí je omezená. Ve funkci arimax () (pokud jsem pochopil) je xtransf exogenní časová řada, kterou chci použít (pomocí přenosových funkcí) k předpovědi své hlavní časové řady. Jaký je ale rozdíl mezi xreg a xtransf?
Obecněji, co jsem udělal špatně? Chtěl bych mít lepší přilnavost, než jakou dosáhl od lm (heat ~ temp radi wind * time).
Úpravy: Na základě některých komentářů jsem odstranil přenos a místo toho přidal 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)
kde dayy je „počet dní v roce“ a čas je hodina dne. Teplota je opět teplota venku. To mi dává následující výsledek:
, což je lepší, ale zdaleka ne to, co jsem očekával.
Odpověď
Budete mít trochu potíže s modelováním série se 2 úrovněmi sezónnosti pomocí modelu ARIMA . Správné nastavení bude velmi záviset na správném nastavení věcí. Už jste uvažovali o jednoduchém lineárním modelu? Jsou mnohem rychlejší a snáze použitelné než modely ARIMA, a pokud pro různé úrovně sezónnosti používáte fiktivní proměnné, jsou často docela přesné.
- Předpokládám, že máte hodinová data, takže se ujistěte, že je váš objekt TS nastaven na frekvenci 24.
- Můžete modelovat další úrovně sezónnost pomocí fiktivních proměnných. Můžete například potřebovat sadu figurín 0/1 představujících měsíc roku.
- Zahrňte fiktivní proměnné do
xreg
argument, spolu s jakýmikoli proměnnými (jako temperatu re). - Přizpůsobit model funkci arima v základně R. Tato funkce dokáže zpracovat modely ARMAX pomocí argumentu
xreg
. - Vyzkoušejte funkce Arima a auto.arima v balíčku prognózy. auto.arima je hezké, protože automaticky najde dobré parametry pro váš model arima. Bude však trvat FOREVER, aby se vešel do vaší datové sady.
- Vyzkoušejte funkci tslm v balíčku arima pomocí fiktivních proměnných pro každou úroveň sezónnosti. To se vejde mnohem rychleji než model Arima a ve vaší situaci to může dokonce fungovat lépe.
- Pokud 4/5/6 nefunguje, POTOM si začněte dělat starosti s přenosovými funkcemi. Předtím se musíte plazit můžete chodit.
- Pokud plánujete předpovídat do budoucnosti, budete muset nejprve předpovědět své proměnné xreg. To je pro sezónní figuríny snadné, ale budete muset přemýšlet o tom, jak vytvořit dobré předpovědi počasí. Možná použít medián historických dat?
Zde je příklad toho, jak bych k tomu přistoupil:
#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),]
Komentáře
Odpověď
Používám R k proveďte na chvíli předpovědi zatížení a mohu vám navrhnout, abyste použili balíček forecast
a jeho neocenitelné funkce (například auto.arima
).
Model ARIMA můžete vytvořit pomocí následujícího příkazu:
model = arima(y, order, xreg = exogenous_data)
s y
vaším předpovědním (I předpokládejme dayy
), order
pořadí vašeho modelu (s ohledem na sezónnost) a exogenous_data
váš teplota, sluneční záření atd. Funkce auto.arima
vám pomůže najít optimální pořadí modelů. Stručný výukový program o balíčku „forecast“ naleznete zde .
Komentáře
- Předvídat je teplo (spotřeba tepla v domě).
Odpověď
I osobně nerozumím funkcím přenosu, ale myslím, že jste dostali xtransf
a xreg
obrácené. Alespoň v základně R arima
je to xreg
, které obsahuje vaše exogenní proměnné. Mám dojem, že přenosová funkce popisuje jak (zpožděná data ovlivňují budoucí hodnoty), nikoli co .
Zkusím použít xreg
pro vaše exogenní proměnné, možná pomocí arima
pokud arimax
vyžaduje přenosovou funkci. Problém je v tom, že váš model je denně, ale vaše data mají obojí denní a roční sezónnost, a teď si nejsem jistý, jestli se o to postará první rozdíl (order=(*, 1, *)
), nebo ne. (Určitě nevyhrajete magické celoroční předpovědi z modelu, který zohledňuje pouze denní sezónnost.)
PS Jaký je time
který používáte váš lm
? Doslova hodinový čas nebo číslo pozorování 1 nahoru? Myslím, že byste něco mohli získat pomocí modelu se smíšenými efekty (lmer
v balíčku lme4
), i když jsem nepřišel na to, zda to správně zohledňuje autokorelaci, která nastane v časové řadě. Pokud to není započítáno, což lm
neudělá, můžete získat zajímavé řešení, ale váš koncept přesnosti vaší předpovědi bude příliš optimistický.
Komentáře
- Mám hodinu měření i " den v roce " měření.
predict()
se používá pro předpovědi, zatímcofitted()
vrátí přizpůsobení modelu za historické období. Pokud chcete konkrétnější nápovědu, měli byste zveřejnit reprodukovatelný příklad s nějakým kódem.heat
se bude lineárně zvyšovat s hodinou dne, a poté skočíte zpět dolů, když se hodina vrátí na 1. Pokud používáte fiktivní proměnné, každá hodina dne získá ' vlastní efekt. Projděte můj ukázkový kód a věnujte zvláštní pozornost tomu, jak konstruuji svůj objekt xreg.stats
aforecast
je, že se nevejdou na funkce přenosu prober . Dokumentace funkcestats::arima
uvádí následující: Pokud je zahrnut výraz xreg, lineární regrese (s konstantním výrazem if include.mean je pravda a není zde žádný rozdíl ) je vybaven modelem ARMA pro chybový termín. Takže pokud skutečně potřebujete přizpůsobit přenosové funkce, zdá se, že cestaTSA::arimax
je cestaR
.