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"
)discussion_1
Read data
Use FRED API to extract monthly advanced retail sales data (in millions of dollars)
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()