# Time Series and Forecasting

R has extensive facilities for analyzing time series data. This section describes the creation of a time series, seasonal decomposition, modeling with exponential and ARIMA models, and forecasting with the forecast package.

## Creating a time series

The **ts()** function will convert a numeric vector into an R time series object. The format is **ts(***vector*, **start=, end=, frequency=)** where start and end are the times of the first and last observation and frequency is the number of observations per unit time (1=annual, 4=quartly, 12=monthly, etc.).

```
# save a numeric vector containing 72 monthly observations
# from Jan 2009 to Dec 2014 as a time series object
myts <- ts(myvector, start=c(2009, 1), end=c(2014, 12), frequency=12)
# subset the time series (June 2014 to December 2014)
myts2 <- window(myts, start=c(2014, 6), end=c(2014, 12))
# plot series
plot(myts)
```

## Seasonal Decomposition

A time series with additive trend, seasonal, and irregular components can be decomposed using the **stl()** function. Note that a series with multiplicative effects can often by transformed into series with additive effects through a log transformation (i.e., *newts* <- **log(***myts***)**).

```
# Seasonal decomposition
fit <- stl(myts, s.window="period")
plot(fit)
# additional plots
monthplot(myts)
library(forecast)
seasonplot(myts)
```

## Exponential Models

Both the **HoltWinters()** function in the base installation, and the **ets()** function in the forecast package, can be used to fit exponential models.

```
# simple exponential - models level
fit <- HoltWinters(myts, beta=FALSE, gamma=FALSE)
# double exponential - models level and trend
fit <- HoltWinters(myts, gamma=FALSE)
# triple exponential - models level, trend, and seasonal components
fit <- HoltWinters(myts)
# predictive accuracy
library(forecast)
accuracy(fit)
# predict next three future values
library(forecast)
forecast(fit, 3)
plot(forecast(fit, 3))
```

## ARIMA Models

The **arima()** function can be used to fit an autoregressive integrated moving averages model. Other useful functions include:

lag(ts, k) |
lagged version of time series, shifted back k observations |

diff(ts, differences= d) |
difference the time series d times |

ndiffs(ts) |
Number of differences required to achieve stationarity (from the forecast package) |

acf(ts) |
autocorrelation function |

pacf(ts) |
partial autocorrelation function |

adf.test(ts) |
Augemented Dickey-Fuller test. Rejecting the null hypothesis suggests that a time series is stationary (from the tseries package) |

Box.test(x, type="Ljung-Box") |
Pormanteau test that observations in vector or time series x are independent |

Note that the forecast package has somewhat nicer versions of **acf()** and **pacf()** called **Acf()** and Pacf() respectively.

```
# fit an ARIMA model of order P, D, Q
fit <- arima(myts, order=c(p, d, q)
# predictive accuracy
library(forecast)
accuracy(fit)
# predict next 5 observations
library(forecast)
forecast(fit, 5)
plot(forecast(fit, 5))
```

## Automated Forecasting

The forecast package provides functions for the automatic selection of exponential and ARIMA models. The **ets()** function supports both additive and multiplicative models. The auto.arima() function can handle both seasonal and nonseasonal ARIMA models. Models are chosen to maximize one of several fit criteria.

```
library(forecast)
# Automated forecasting using an exponential model
fit <- ets(myts)
# Automated forecasting using an ARIMA model
fit <- auto.arima(myts)
```

## Going Further

There are many good online resources for learning time series analysis with R. These include A little book of R for time series by Avril Chohlan and DataCamp's manipulating time series in R course by Jeffrey Ryan.