seasonal adjustment on the fly extension for ggplot2
R
Switch branches/tags
Nothing to show
Clone or download

README.md

ggseas R package

seasonal adjustment on the fly extension for ggplot2

Convenience functions that let you easily do seasonal adjustment on the fly with ggplot.

Depends on the seasonal package to give you access to X13-SEATS-ARIMA.

Travis-CI Build Status CRAN version CRAN RStudio mirror downloads

Installation

Install the stable version the usual way from CRAN:

install.packages("ggseas")

or the latest version (bugs and all) from GitHub:

devtools::install_github("ellisp/ggseas/pkg")

Usage - seasonal adjustment on the fly

So far there are three types of seasonal adjustment possible to be incorporated into a usual ggplot() command, substituting for where you'd normally have geom_line().

X13-SEATS-ARIMA

library(ggseas)
# make demo data with the convenience "time series to data.frame" function tsdf()
ap_df <- tsdf(AirPassengers)

# SEATS with defaults
ggplot(ap_df, aes(x = x, y = y)) +
   geom_line(colour = "grey80") +
   stat_seas() +
   ggtitle("SEATS seasonal adjustment - international airline passengers") +
   ylab("International airline passengers per month")
## Calculating starting date of 1949 from the data.
## Calculating frequency of 12 from the data.

plot of chunk unnamed-chunk-3

# X11 with no outlier treatment
ggplot(ap_df, aes(x = x, y = y)) +
   geom_line(colour = "grey80") +
   stat_seas(x13_params = list(x11 = "", outlier = NULL)) +
   ggtitle("X11 seasonal adjustment - international airline passengers") +
   ylab("International airline passengers per month")
## Calculating starting date of 1949 from the data.
## Calculating frequency of 12 from the data.

plot of chunk unnamed-chunk-3

ggplot(ldeaths_df, aes(x = YearMon, y = deaths, colour = sex)) +
   geom_point(colour = "grey50") +
   geom_line(colour = "grey50") +
   facet_wrap(~sex) +
   stat_seas(size = 2) +
   ggtitle("Seasonally adjusted lung deaths in the UK 1974 - 1979") +
   ylab("Deaths") +
   xlab("(light grey shows original data;\ncoloured line is seasonally adjusted)") +
   theme(legend.position = "none")
## Calculating starting date of 1974 from the data.
## Calculating frequency of 12 from the data.
## Calculating starting date of 1974 from the data.
## Calculating frequency of 12 from the data.

plot of chunk unnamed-chunk-3

STL (LOESS-based decomposition)

# periodic if fixed seasonality; doesn't work well:
ggplot(ap_df, aes(x = x, y = y)) +
   geom_line(colour = "grey80") +
   stat_stl(s.window = "periodic")
## Calculating frequency of 12 from the data.

plot of chunk unnamed-chunk-4

# seasonality varies a bit over time, works better:
ggplot(ap_df, aes(x = x, y = y)) +
   geom_line(colour = "grey80") +
   stat_stl(s.window = 7)
## Calculating frequency of 12 from the data.

plot of chunk unnamed-chunk-4

Classical decomposition

# default additive decomposition (doesn't work well in this case!):
ggplot(ap_df, aes(x = x, y = y)) +
   geom_line(colour = "grey80") +
   stat_decomp()
## Calculating frequency of 12 from the data.

plot of chunk unnamed-chunk-5

# multiplicative decomposition, more appropriate:
ggplot(ap_df, aes(x = x, y = y)) +
   geom_line(colour = "grey80") +
   stat_decomp(type = "multiplicative")
## Calculating frequency of 12 from the data.

plot of chunk unnamed-chunk-5

Usage - seasonal decomposition on the fly

From version 0.2.0 I introduce a summary graphic decomposition, similar to what you'd get with plot(stats::decompose(x)), but in the ggplot2 environment. As well as allowing ggplot2 look and feel of plots, you can also map a variable to the colour (or color) aesthetic, to allow two difference decompositions on the same graphic.

ggsdc(ap_df, aes(x = x, y = y), method = "decompose") +
   geom_line()
## Calculating frequency of 12 from the data.
## Warning: Removed 6 rows containing missing values (geom_path).

plot of chunk unnamed-chunk-6

ggsdc(ap_df, aes(x = x, y = y), method = "stl", s.window = 7) +
   labs(x = "", y = "Air passenger numbers") +
   geom_point()
## Calculating frequency of 12 from the data.

plot of chunk unnamed-chunk-6

ggsdc(ldeaths_df, aes(x = YearMon, y = deaths, colour = sex), method = "seas") +
      geom_line()
## Calculating starting date of 1974 from the data.
## Calculating frequency of 12 from the data.
## Calculating starting date of 1974 from the data.
## Calculating frequency of 12 from the data.

plot of chunk unnamed-chunk-6

library(scales) # for label= comma
serv <- subset(nzbop, Account == "Current account" & 
                  Category %in% c("Services; Exports total", "Services; Imports total"))

ggsdc(serv, aes(x = TimePeriod, y = Value, colour = Category),
      method = "seas", start = c(1971, 2), frequency = 4) +
   geom_line() +
   scale_y_continuous("NZ$ millions\ndecomposition by X13-SEATS-ARIMA", label = comma) +
   labs(x = "") +
   ggtitle("New Zealand services balance of payments -\ngreater seasonality in exports than imports") +
   theme_light()

plot of chunk unnamed-chunk-6

Coming in 0.5.0 - control facet titles during seasonal decomposition on the fly

   ggsdc(serv, aes(x = TimePeriod, y = Value, colour = Category),
         method = "stl", s.window = 7, frequency = 4,
         facet.titles = c("The original series", "The underlying trend", "Regular seasonal patterns", "All the randomness left")) +
      geom_line()

plot of chunk unnamed-chunk-7