Code
source("../common_functions.R")
Chapter 1
This is the overview of the chapter 4. I will add info from the index file here. I will filter from there to what will go here. My goal is to first have the website have a map of the concepts in time series. I want to first avoid doing it by chapters since it seperates topics and limit my learning to that lesson. Bigger picture first.
the following does the multiplicative model
# Set random seed for reproducibility
set.seed(123)
# Set parameters & initialize vectors
num_years <- 10
n <- 12 * num_years
sigma <- .75
a <- 0.03
b <- 1
c <- 0.5
trend <- seasonal <- x_t <- rep(0,n)
time_seq <- seq(1,n)
# Generate correlated error terms
w <- rnorm(n + 4, 0.2, 0.1) # Changed to a mean of 1 and sd of 0.03
z = w + lead(w,1) + lead(w,2) + lead(w,3) + lead(w,4)
z = head(z, n)
# Get date
year_seq <- lubridate::year(today()) - num_years + (time_seq - 1) %/% 12
month_seq <- (time_seq - 1) %% 12 + 1
date_seq <- ymd(paste0(year_seq,"-",month_seq,"-01"))
# Get data
for (t in 1:n) {
trend[t] <- exp(a * t)
seasonal[t] <- exp( b * sin(t / 12 * 2 * pi * 1) + c * cos(t / 12 * 2 * pi * 3) + 1 )
x_t[t] <- trend[t] * seasonal[t] * z[t] # Note R's definition of the mult. model
}
x_df <- data.frame(x_t = x_t, trend = trend, seasonal = seasonal)
start_year <- lubridate::year(today()) - num_years
start_date <- lubridate::ymd(paste0(start_year,"-01-01"))
# start_date <- lubridate::ymd("1958-01-01")
date_seq <- seq(start_date,
start_date + months(nrow(x_df)-1),
by = "1 months")
x_df_ts <- x_df |>
mutate(
date = date_seq,
month = tsibble::yearmonth(date)
) |>
select(date, month, trend, seasonal, x_t) |>
as_tsibble(index = month)
Date | Month | Trend, $$m_t$$ | Seasonal, $$s_t$$ | Data, $$x_t$$ |
---|---|---|---|---|
2014-01-01 | 2014 Jan | 1.03 | 4.482 | 5.065 |
2014-02-01 | 2014 Feb | 1.062 | 3.92 | 5.512 |
2014-03-01 | 2014 Mar | 1.094 | 7.389 | 11.266 |
2014-04-01 | 2014 Apr | 1.127 | 10.655 | 13.348 |
2014-05-01 | 2014 May | 1.162 | 4.482 | 5.391 |
2014-06-01 | 2014 Jun | 1.197 | 1.649 | 1.93 |
⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
2023-11-01 | 2023 Nov | 35.517 | 1.649 | 39.853 |
2023-12-01 | 2023 Dec | 36.598 | 4.482 | 121.366 |
trend_plot <- ggplot(x_df_ts, aes(x=month, y=trend)) +
geom_line() +
labs(
title="Plot of Trend",
x="Month",
y="Trend"
) +
theme(plot.title = element_text(hjust = 0.5))
seasonal_plot <- ggplot(x_df_ts, aes(x=month, y=seasonal)) +
geom_line() +
labs(
title="Plot of Seasonal Effect",
x="Month",
y="Seasonal"
) +
theme(plot.title = element_text(hjust = 0.5))
error_plot <- ggplot(x_df_ts, aes(x = month, y = x_t / trend / seasonal)) +
geom_line() +
labs(
title="Plot of Random Error Term",
x="Month",
y="Random"
) +
theme(plot.title = element_text(hjust = 0.5))
x_plot <- ggplot(x_df_ts, aes(x=month, y=x_t)) +
geom_line() +
labs(
title="Plot of Simulated Time Series",
x="Month",
y="x_t"
) +
theme(plot.title = element_text(hjust = 0.5))
x_plot <- x_plot + labs(title = "True (Simulated) Values", x = NULL)
trend_plot <- trend_plot + labs(title = NULL, x = NULL)
seasonal_plot <- seasonal_plot + labs(title = NULL, x = NULL)
error_plot <- error_plot + labs(title = NULL)
x_plot / trend_plot / seasonal_plot / error_plot
Random Error Term (Error Plot): \[ e_t = \frac{x_t}{m_t \cdot s_t} \]
Trend: \[ m_t = e^{a \cdot t} \]
Seasonal: \[ s_t = e^{b \cdot \sin\left(\frac{2 \pi t}{12}\right) + c \cdot \cos\left(\frac{6 \pi t}{12}\right) + 1} \]
Combined Time Series (Multiplicative Model): \[ x_t = m_t \cdot s_t \cdot z_t \]