Time Series Forecasting
This is a follow-up to the introduction to time series analysis, but focused more on forecasting rather than analysis.
Simple Moving Average
Simple moving average can be calculated using ma()
from forecast
sm <- ma(ts, order=12) # 12 month moving average
lines(sm, col="red") # plot
Exponential Smoothing
Simple, Double and Triple exponential smoothing can be performed using the HoltWinters() function. There are multiple implementations of the Holt Winters method – hw()
{forecast} and ets()
.
library(forecast)
# Simple exponential smoothing: Level Only
model <- hw(trainingData, initial = “optimal”, h=(forecastPeriodLen), beta=NULL, gamma=NULL) # h is the no. periods to forecast
# Double Exponential smoothing: Level and Trend components
model <- hw(trainingData, initial = “optimal”, h=(forecastPeriodLen), gamma=NULL)
# Holt Winters: Level, Trend and Seasonality
model <- hw(trainingData, initial = “optimal”, h=(forecastPeriodLen))
plot(model)
accuracy(model) # calculate accuracy measures
ARIMA
The forecast package offers auto.arima() function to fit ARIMA models. It can also be manually fit using Arima(). A caveat with ARIMA models in R is that it does not have the functionality to fit long seasonality of more than 350 periods eg: 365 days for daily data or 24 hours for 15 sec data.
# Fit and forecast with auto.arima()
autoArimaFit <- auto.arima(tsData)
plot(forecast(autoArimaFit, h=20))
# Fit and forecast with Arima()
arimaFit <- Arima(tsData,order=c(3,1,0))
plot(forecast(arimafit,h=20))
How To Forecast ARIMA Models With Long Seasonality (Greater Than 350 Periods)?
Upon plotting your Arima() forecast, you find a more or less flat forecast, it could be because of long seasonality. In such case, you can feed in the seasonality as an external regressor through the ‘xreg’ argument.
Fit <- Arima(tsData,order=c(3,1,0)) # fit Arima model
Fit <- auto.arima(tsData, seasonal=FALSE, xreg=fourier(tsData,4)) # fit auto.arima model
plot(forecast(Fit,h=20))
pred <- predict (Fit, newxreg=newXregVar) # alternate way to forecast
plot(forecast(fit, h=h, xreg=fourierf(tsData,4,h))) # h is number of forecasts
If you are using a numeric vector as an external regressor (xreg), make sure you change it to a data.frame() before feeding it as an xreg parameter to auto.arima(). You can also use multiple external regressors by binding them together as a data.frame().
Some Useful External Regressors For Arima() and auto.arima()
Any dataframe with as many rows as length of ts data can be used as ‘xreg’ argument. A couple of common ‘xreg’s that are used to model seasonal effects are below.
Xreg1 <- seasonaldummy(tsData) # creates dummy binary variable for each period in a season.
Xreg2 <- model.matrix(~ as.factor(weekday) + 0)) # weekday could be a monthday, hour-of-day, holiday indicator etc ..
How To Model Time Series With Complex Seasonality Pattern?
Use the tbats() in forecast package. Time series with multiple-seasonality can be modelled with this method. Since this is a computationally intensive procedure, the in-built parallel processing facility may be leveraged.
tbatsFit <- tbats(tsData, use.parallel=TRUE, num.cores = 2) # fit tbats model
plot(forecast(fit)) # plot
components <- tbats.components(tbatsFit)
plot(components)
How To Find Confidence Intervals For My Forecasts?
The predict() function has the facility. By providing the argument ‘prediction.interval=TRUE’ and ‘level = n’, the prediction intervals for a given confidence is calculated. Below is a general format of the code.
model <- HoltWinters(TS) predict(model, 50, prediction.interval = TRUE, level= 0.99) # prediction.interval = TRUE
More Useful Functions Related To Time Series
Functions | Description |
---|---|
accuracy() | accuracy measures of forecast |
BoxCox, invBoxCox() | Box-Cox transformation |
decompose() | Decompose time series data into components |
dm.test() | Diebold-Mariano test compares the forecast accuracy |
monthdays() | number of days in seasonal series |
na.interp() | interpolate missing values |
seasadj() | Remove the seasonal components from a time series |
seasonaldummy() | create matrix of seasonal indicator variables |
seasonplot() | Plot seasonal effects |