discussion_1

Author

Sam Kuhn

Read data

Use FRED API to extract monthly advanced retail sales data (in millions of dollars)

library(tidyverse)
library(fpp3)
library(fredr)
retail_sales <- fredr(
  series_id = "RSXFSN",
  observation_start = as.Date("1990-01-01"),
  observation_end = as.Date("2023-10-01"),
  frequency = "m", # quarterly
  units = "lin"
)

Create time series tsibble

retail_sales <- retail_sales |> 
  select(date, value) |> 
  mutate(date = yearmonth(date)) |> 
  as_tsibble()
Using `date` as index variable.

Plot

retail_sales |> 
  ggplot(aes(date, value)) +
  geom_line(linewidth = 1.25) +
  ggthemes::theme_economist() +
  scale_x_yearmonth(
    breaks = scales::breaks_width("5 years"),
    labels = scales::label_date_short()
  ) +
  scale_y_continuous(
    breaks = scales::breaks_width(75000),
    labels = scales::label_dollar()
  ) +
  labs(
    title = "Advanced retail sales",
    subtitle = "Monthly, seasonally adjusted"
  )

Decompositions

decomp <- retail_sales |> 
  model(
    additive = classical_decomposition(value, type = "additive"),
    mult = classical_decomposition(value, type = "multiplicative")
  )
decomp_metrics <- decomp |> components()

Plot

Additive decomposition

decomp |> 
  components() |> 
  filter(.model == "additive") |> 
  autoplot()
Warning: Removed 6 rows containing missing values (`geom_line()`).

Multiplicative decomposition

decomp |> 
  components() |> 
  filter(.model == "mult") |> 
  autoplot()
Warning: Removed 6 rows containing missing values (`geom_line()`).

Residuals

Mean Absolute error: Actual value - seasonally adjusted value.

Additive model MAE: 587.21

Multiplicative model MAE: 445.73

res <- decomp_metrics |> 
  tibble() |> 
  group_by(.model) |> 
  mutate(
    residual = (value - season_adjust)
  ) |> 
  summarise(mae = MAE(residual))
res
# A tibble: 2 × 2
  .model      mae
  <chr>     <dbl>
1 additive 15061.
2 mult     15138.

Plot actual vs. seasonally adjusted

decomp_metrics |> 
  filter(.model == "additive") |> 
  pivot_longer(c("value", "season_adjust"), names_to = "metric") |> 
  ggplot(aes(date, value, color = metric, alpha = .5)) +
  geom_line(linewidth = 1.25) +
  labs(
    title = "Actual vs. seasonally adjusted data, advanced retail sales",
    subtitle = "Additive decomposition"
  ) +
  ggthemes::theme_economist()

decomp_metrics |> 
  filter(.model == "mult") |> 
  pivot_longer(c("value", "season_adjust"), names_to = "metric") |> 
  ggplot(aes(date, value, color = metric, alpha = .25)) +
  geom_line(linewidth = 1.25) +
  labs(
    title = "Actual vs. seasonally adjusted data, advanced retail sales",
    subtitle = "Additive decomposition"
  ) +
  ggthemes::theme_economist()