Hi all! In this section, we will explore some basic times series.
Special thanks to NUS ISS for teaching the codes.
Download TimesSeriesMen.csv here
Times Series - ts()
# read data and store to tsm
tsm <- read.csv("TimeSeriesMen.csv", stringsAsFactors = FALSE)
str(tsm)
## 'data.frame': 120 obs. of 12 variables:
## $ date : chr "1/1/1989" "2/1/1989" "3/1/1989" "4/1/1989" ...
## $ men : num 11358 10606 16999 6564 6608 ...
## $ women : num 16579 18236 43394 30908 28702 ...
## $ jewel : num 10776 10822 22846 11103 16067 ...
## $ mail : int 7978 8290 8029 7752 8685 7847 7881 8121 7811 8706 ...
## $ page : int 73 88 65 85 74 87 79 72 83 111 ...
## $ phone : int 34 29 24 20 17 30 28 27 35 25 ...
## $ print : num 22294 27426 27979 28950 22642 ...
## $ service: int 20 20 26 22 21 23 22 20 15 20 ...
## $ YEAR_ : int 1989 1989 1989 1989 1989 1989 1989 1989 1989 1989 ...
## $ MONTH_ : int 1 2 3 4 5 6 7 8 9 10 ...
## $ DATE_ : chr "Jan-89" "Feb-89" "Mar-89" "Apr-89" ...
# create a time series call men, freq of 12 months.
men <- ts(tsm$men, frequency = 12, start = c(1989,1))
# plot
plot(men, lwd = 2, col = "blue", main = "Men Series")

# similarly
women <- ts(tsm$women, frequency = 12, start = c(1989,1))
jewel <- ts(tsm$jewel, frequency = 12, start = c(1989,1))
par(mfrow = c(1,2))
plot(women, lwd = 2, col = "green3", main = "Women Series")
plot(jewel, lwd = 2, col = "red", main = "Jewel Series")

par(mfrow = c(1,1))
# Comparing
plot(men, lwd = 2, col = "blue")
lines(jewel, lwd = 2, col = "red")

plot(men, lwd = 2, col = "blue")
lines(0.75*(women-15000), lwd =2, col = "green")

Holt-Winters - HoltWinters()
# Holt Winters Addditive
fitHWA <- HoltWinters(men, seasonal = "additive")
fitHWA
## Holt-Winters exponential smoothing with trend and additive seasonal component.
##
## Call:
## HoltWinters(x = men, seasonal = "additive")
##
## Smoothing parameters:
## alpha: 0.004152723
## beta : 0.4349592
## gamma: 0
##
## Coefficients:
## [,1]
## a 22287.9136
## b 132.5304
## s1 423.6983
## s2 -3722.2834
## s3 -2116.2092
## s4 -798.1288
## s5 -2058.7850
## s6 -2127.7738
## s7 -2523.7142
## s8 -1469.6505
## s9 184.1891
## s10 1409.7529
## s11 1878.7212
## s12 10920.1833
plot(fitHWA, lwd = 2, main = "Holt Winters Additive")

# Auto Cross Variance and Correlation Function - acf
acf(residuals(fitHWA), 24, lwd = 2, col = "blue")
# Box-Ljung test
Box.test(residuals(fitHWA), lag = 12, type = "Ljung")
##
## Box-Ljung test
##
## data: residuals(fitHWA)
## X-squared = 14.738, df = 12, p-value = 0.2561
# forecast
library(forecast)

f <- forecast(fitHWA, h = 12, level = c(80,95))
plot(f, lwd = 1, col = "green3")

# accuracy
accuracy(f)
## ME RMSE MAE MPE MAPE MASE
## Training set 325.7033 3534.413 2313.992 -5.742507 18.67779 0.642404
## ACF1
## Training set 0.05592869
# Holt Winters Multiplicative
fitHWM <- HoltWinters(men, seasonal = "multiplicative")
fitHWM
## Holt-Winters exponential smoothing with trend and multiplicative seasonal component.
##
## Call:
## HoltWinters(x = men, seasonal = "multiplicative")
##
## Smoothing parameters:
## alpha: 0.00361763
## beta : 0.2455624
## gamma: 0.07278723
##
## Coefficients:
## [,1]
## a 2.184028e+04
## b 1.190637e+02
## s1 1.017983e+00
## s2 7.876398e-01
## s3 8.425741e-01
## s4 9.055215e-01
## s5 8.703500e-01
## s6 8.560653e-01
## s7 8.317946e-01
## s8 9.497353e-01
## s9 9.717868e-01
## s10 1.133625e+00
## s11 1.129739e+00
## s12 1.849141e+00
plot(fitHWM, lwd = 2, main = "Holt Winters Multiplicative")

# Auto Cross Variance and Correlation Function - acf
acf(residuals(fitHWM), 24, lwd = 2, col = "blue")

# Box-Ljung test
Box.test(residuals(fitHWM), lag = 12, type = "Ljung")
##
## Box-Ljung test
##
## data: residuals(fitHWM)
## X-squared = 17.543, df = 12, p-value = 0.1303
# forecast
library(forecast)
f <- forecast(fitHWM, h = 12, level = c(80,95))
plot(f, lwd = 1, col = "green3")

# accuracy
accuracy(f)
## ME RMSE MAE MPE MAPE MASE
## Training set 298.1092 3537.055 2308.113 -4.958027 18.78873 0.6407718
## ACF1
## Training set 0.08713956
Error Trend Seasonality - ets()
# ETS
fitE <- ets(men)
fitE
## ETS(M,A,M)
##
## Call:
## ets(y = men)
##
## Smoothing parameters:
## alpha = 0.0394
## beta = 0.0037
## gamma = 1e-04
##
## Initial states:
## l = 11599.5462
## b = 35.3159
## s=1.6666 1.0477 1.082 1.0212 0.9791 0.852
## 0.918 0.8819 0.8468 0.8998 0.8671 0.9378
##
## sigma: 0.2158
##
## AIC AICc BIC
## 2553.219 2559.219 2600.607
plot(fitE, lwd = 1, col = "red")

acf(residuals(fitE), 24, lwd = 2, col = "blue")

Box.test(residuals(fitE), lag = 12, type = "Ljung")
##
## Box-Ljung test
##
## data: residuals(fitE)
## X-squared = 9.6485, df = 12, p-value = 0.6468
Arima with Regressors
# splitting data set into train & test
train <- subset(tsm, YEAR_ != 1998)
test <- subset(tsm, YEAR_ == 1998)
xregtrain <- train[c(5,6,7,8,9)]
xregtest <- test[c(5,6,7,8,9)]
men_train <- ts(train$men, frequency = 12, start = c(1989,1))
men_test <- ts(test$men, frequency = 12, start = c(1998,1))
TrainArimaReg <- auto.arima(men_train, xreg = xregtrain)
TrainArimaReg
## Series: men_train
## Regression with ARIMA(0,0,1)(1,0,0)[12] errors
##
## Coefficients:
## ma1 sar1 intercept mail page phone print
## 0.1309 0.3351 -20945.860 1.8392 19.7837 373.1267 0.1727
## s.e. 0.0935 0.1003 2995.366 0.2086 19.2173 41.0745 0.0713
## service
## -23.8064
## s.e. 39.5992
##
## sigma^2 estimated as 6826800: log likelihood=-999.58
## AIC=2017.15 AICc=2018.99 BIC=2041.29
fTestArimaReg <- forecast.Arima(TrainArimaReg, xreg = xregtrain)
Box.test(residuals(fTestArimaReg), lag = 12, type = "Ljung")
##
## Box-Ljung test
##
## data: residuals(fTestArimaReg)
## X-squared = 8.1743, df = 12, p-value = 0.7714
accuracy(fTestArimaReg, men)
## ME RMSE MAE MPE MAPE MASE
## Training set -29.0428 2514.182 1795.227 -2.46764 12.33812 0.5130855
## Test set 11738.4411 12171.368 11738.441 52.81488 52.81488 3.3549099
## ACF1 Theil's U
## Training set 0.01336445 NA
## Test set -0.25024289 2.043187
plot(fTestArimaReg, lwd = 2, col = "green3")
lines(men_test, lwd = 2, col = "red")
