Table consistency, VolDep progress

This commit is contained in:
2025-05-25 20:25:24 +02:00
parent e4021df6d2
commit bf246e2713
2 changed files with 107 additions and 87 deletions

View File

@@ -230,4 +230,9 @@
.zero-width { .zero-width {
display: inline-block; display: inline-block;
width: 0px; width: 0px;
}
.fa {
width: 1.25em;
text-align: center;
} }

189
index.qmd
View File

@@ -44,24 +44,23 @@ $$
$$ $$
::: :::
::: {style="font-size: 150%;"} <br/>
:::: {style="font-size: 150%;"}
<i class="fa fa-fw fa-rocket" style="color:var(--col_grey_9);"></i> &ensp; [Research Motivation](#motivation)
<i class="fa fa-fw fa-book" style="color:var(--col_grey_9);"></i> &ensp; Overview of the Thesis
<i class="fa fa-fw fa-code-merge" style="color:var(--col_grey_9);"></i> &ensp; Online Aggregation
<i class="fa fa-fw fa-fire-flame-simple" style="color:var(--col_grey_9);"></i> &ensp; Probabilistic Forecasting of European Carbon and Energy Prices
<i class="fa fa-fw fa-newspaper" style="color:var(--col_grey_9);"></i> &ensp; Contributions & Outlook
::: :::
<br>
[{{< fa bars-staggered >}}]{style="color: #404040;"} &ensp; [Introduction & Research Motivation](#motivation)
[{{< fa bars-staggered >}}]{style="color: #404040;"} &ensp; Overview of the Thesis
[{{< fa table >}}]{style="color: #404040;"} &ensp; Online Learning
[{{< fa circle-nodes >}}]{style="color: #404040;"} &ensp; Probabilistic Forecasting of European Carbon and Energy Prices
[{{< fa lightbulb >}}]{style="color: #404040;"} &ensp; Limitations
[{{< fa binoculars >}}]{style="color: #404040;"} &ensp; Contributions & Outlook
```{r, setup, include=FALSE} ```{r, setup, include=FALSE}
# Compile with: rmarkdown::render("crps_learning.Rmd") # Compile with: rmarkdown::render("crps_learning.Rmd")
library(latex2exp) library(latex2exp)
@@ -538,7 +537,7 @@ Using the CRPS, we can calculate time-adaptive weights $w_{t,k}$. However, what
\label{eq_boa_opt_conv} \label{eq_boa_opt_conv}
\end{equation} \end{equation}
`r fontawesome::fa("arrow-right", fill ="#000000")` Almost optimal w.r.t *convex aggregation* \eqref{eq_optp_conv} @wintenberger2017optimal. `r fontawesome::fa("arrow-right", fill ="#000000")` Almost optimal w.r.t. *convex aggregation* \eqref{eq_optp_conv} @wintenberger2017optimal.
The same algorithm satisfies that there exist a $C>0$ such that for $x>0$ it holds that The same algorithm satisfies that there exist a $C>0$ such that for $x>0$ it holds that
\begin{equation} \begin{equation}
@@ -550,7 +549,7 @@ The same algorithm satisfies that there exist a $C>0$ such that for $x>0$ it hol
if $Y_t$ is bounded, the considered loss $\ell$ is convex $G$-Lipschitz and weak exp-concave in its first coordinate. if $Y_t$ is bounded, the considered loss $\ell$ is convex $G$-Lipschitz and weak exp-concave in its first coordinate.
`r fontawesome::fa("arrow-right", fill ="#000000")` Almost optimal w.r.t *selection* \eqref{eq_optp_select} @gaillard2018efficient. `r fontawesome::fa("arrow-right", fill ="#000000")` Almost optimal w.r.t. *selection* \eqref{eq_optp_select} @gaillard2018efficient.
`r fontawesome::fa("arrow-right", fill ="#000000")` We show that this holds for QL under feasible conditions. `r fontawesome::fa("arrow-right", fill ="#000000")` We show that this holds for QL under feasible conditions.
@@ -579,7 +578,7 @@ for all $x_1,x_2 \in \mathbb{R}$ and $t>0$ that
\mathbb{E}\left[ \left. \left( \alpha(\ell'(x_1, Y_t)(x_1 - x_2))^{2}\right)^{1/\beta} \right|\mathcal{F}_{t-1}\right] \mathbb{E}\left[ \left. \left( \alpha(\ell'(x_1, Y_t)(x_1 - x_2))^{2}\right)^{1/\beta} \right|\mathcal{F}_{t-1}\right]
\end{align*} \end{align*}
`r fontawesome::fa("arrow-right", fill ="#000000")` Almost optimal w.r.t *selection* \eqref{eq_optp_select} @gaillard2018efficient. `r fontawesome::fa("arrow-right", fill ="#000000")` Almost optimal w.r.t. *selection* \eqref{eq_optp_select} @gaillard2018efficient.
::: :::
@@ -1247,12 +1246,8 @@ TTinit <- 1 ## without first, as all comb. are uniform
RQL <- apply(QL[1:KK, -c(1:TTinit), ], c(1, 3), mean) RQL <- apply(QL[1:KK, -c(1:TTinit), ], c(1, 3), mean)
dimnames(RQL) <- list(mnames, Qgrid) dimnames(RQL) <- list(mnames, Qgrid)
RQLm <- apply(RQL, c(1), mean, na.rm = TRUE) RQLm <- apply(RQL, c(1), mean, na.rm = TRUE)
# sort(RQLm - RQLm[K + 1])
## ##
qq <- apply(QL[1:KK, -c(1:TTinit), ], c(1, 2), mean) qq <- apply(QL[1:KK, -c(1:TTinit), ], c(1, 2), mean)
# t.test(qq[K + 1, ] - qq[K + 3, ])
# t.test(qq[K + 1, ] - qq[K + 4, ])
library(xtable) library(xtable)
Pall <- numeric(KK) Pall <- numeric(KK)
@@ -1290,12 +1285,13 @@ for (i.p in 1:MO) {
fblue <- round(approxfun(seq(crange[1], crange[2], length = length(cblue)), cblue)(pmin(xxx[, i.p], xmax)), 3) fblue <- round(approxfun(seq(crange[1], crange[2], length = length(cblue)), cblue)(pmin(xxx[, i.p], xmax)), 3)
tmp <- format(round(xxx[, i.p], 3), nsmall = 3) tmp <- format(round(xxx[, i.p], 3), nsmall = 3)
xxxx[, i.p] <- paste("\\cellcolor[rgb]{", fred, ",", fgreen, ",", fblue, "}", tmp, " {\\footnotesize (", Pallout[IDX[i.p]], ")}", sep = "") xxxx[, i.p] <- paste("\\cellcolor[rgb]{", fred, ",", fgreen, ",", fblue, "}", tmp, " {\\footnotesize (", Pallout[IDX[i.p]], ")}", sep = "")
table[, i.p] <- paste0(tmp, " (", Pallout[i.p], ")") table[, i.p] <- paste0(tmp, " (", Pallout[i.p], ")") # TODO: Improve here?
table_col[, i.p] <- rgb(fred, fgreen, fblue, maxColorValue = 1) table_col[, i.p] <- rgb(fred, fgreen, fblue, maxColorValue = 1)
} # i.p } # i.p
table_out <- kbl(table, align = rep("c", ncol(table)), bootstrap_options = c("condensed")) %>% table_out <- kbl(table, align = rep("c", ncol(table)), bootstrap_options = c("condensed")) %>%
kable_paper(full_width = TRUE) kable_paper(full_width = TRUE) %>%
row_spec(0:nrow(table), color = cols[9, "grey"])
for (j in 1:ncol(table)) { for (j in 1:ncol(table)) {
table_out <- table_out %>% table_out <- table_out %>%
@@ -1333,7 +1329,8 @@ for (i.p in 1:MO) {
} # i.p } # i.p
table_out2 <- kableExtra::kbl(table2, align = rep("c", ncol(table2)), bootstrap_options = c("condensed")) %>% table_out2 <- kableExtra::kbl(table2, align = rep("c", ncol(table2)), bootstrap_options = c("condensed")) %>%
kable_paper(full_width = TRUE) kable_paper(full_width = TRUE) %>%
row_spec(0:nrow(table2), color = cols[9, "grey"])
for (j in 1:ncol(table2)) { for (j in 1:ncol(table2)) {
table_out2 <- table_out2 %>% table_out2 <- table_out2 %>%
@@ -1623,7 +1620,7 @@ table_naive <- naive_table_df %>%
align = c("c", rep("c", ncol(naive_table_df) - 1)) align = c("c", rep("c", ncol(naive_table_df) - 1))
) %>% ) %>%
kable_paper(full_width = TRUE) %>% kable_paper(full_width = TRUE) %>%
row_spec(0:1, color = cols[10, "grey"]) %>% row_spec(0:1, color = cols[9, "grey"]) %>%
kable_styling(font_size = 16) kable_styling(font_size = 16)
@@ -1694,7 +1691,7 @@ table_performance <- performance_loss_tibble %>%
align = c("l", "l", rep("c", ncol(performance_loss_tibble)-2)) align = c("l", "l", rep("c", ncol(performance_loss_tibble)-2))
) %>% ) %>%
kable_paper(full_width = TRUE) %>% kable_paper(full_width = TRUE) %>%
row_spec(0:nrow(performance_loss_tibble), color = cols[10, "grey"]) row_spec(0:nrow(performance_loss_tibble), color = cols[9, "grey"])
# %% # %%
@@ -2214,23 +2211,33 @@ Berrisch, J., Pappert, S., Ziel, F., & Arsova, A. (2023). *Finance Research Lett
--- ---
## Motivation ## &nbsp;
:::: {.columns} :::: {.columns}
::: {.column width="48%"} ::: {.column width="48%"}
- Understanding European Allowances (EUA) dynamics is important ### Motivation
Understanding European Allowances (EUA) dynamics is important
for several fields: for several fields:
- - Portfolio & Risk Management,
- - Sustainability Planing <i class="fa fa-fw fa-chart-pie" style="color:var(--col_grey_9);"></i> Portfolio & Risk Management,
- - Political decisions
- - ... <i class="fa fa-fw fa-timeline" style="color:var(--col_grey_9);"></i> Sustainability Planing
<i class="fa fa-fw fa-handshake" style="color:var(--col_grey_9);"></i> Political decisions
EUA prices are obviously connected to the energy market EUA prices are obviously connected to the energy market
How can the dynamics be characterized? How can the dynamics be characterized?
Several Questions arise:
- Data (Pre)processing
- Modeling Approach
- Evaluation
::: :::
::: {.column width="2%"} ::: {.column width="2%"}
@@ -2239,13 +2246,25 @@ How can the dynamics be characterized?
::: {.column width="48%"} ::: {.column width="48%"}
</br> ### Data
- Several Questions arise: EUA, natural gas, Brent crude oil, coal
- - Data (Pre)processing March 15, 2010, until October 14, 2022
- - Modeling Approach
- - Evaluation Data was normalized w.r.t. $\text{CO}_2$ emissions
Emission-adjusted prices reflects one tonne of $\text{CO}_2$
We adjusted for inflation by Eurostat's HICP, excluding energy
Log transformation of the data to stabilize the variance
ADF Test: All series are stationary in first differences
Johansens likelihood ratio trace test suggests two cointegrating relationships (levels)
Johansens likelihood ratio trace test suggests no cointegrating relationships (logs)
::: :::
@@ -2253,24 +2272,6 @@ How can the dynamics be characterized?
## Data ## Data
- EUA, natural gas, Brent crude oil, coal
- March 15, 2010, until October 14, 2022
- Data was normalized w.r.t. $\text{CO}_2$ emissions
- Emission-adjusted prices reflects one tonne of $\text{CO}_2$
- We adjusted for inflation by Eurostat's HICP, excluding energy
- Log transformation of the data to stabilize the variance
- ADF Test: All series are stationary in first differences
- Johansens likelihood ratio trace test suggests two cointegrating relationships (levels)
- Johansens likelihood ratio trace test suggests no cointegrating relationships (logs)
## Data
```{r, echo=FALSE, fig.width = 12, fig.height = 6, fig.align="center", cache = TRUE} ```{r, echo=FALSE, fig.width = 12, fig.height = 6, fig.align="center", cache = TRUE}
readr::read_csv("assets/voldep/2022_10_14_eur_ref_co2_adj_hvpi_ex_nrg.csv") %>% readr::read_csv("assets/voldep/2022_10_14_eur_ref_co2_adj_hvpi_ex_nrg.csv") %>%
select(-EUR_USD, -hvpi_x_nrg) %>% select(-EUR_USD, -hvpi_x_nrg) %>%
@@ -2339,15 +2340,17 @@ readr::read_csv("assets/voldep/2022_10_14_eur_ref_co2_adj_hvpi_ex_nrg.csv") %>%
### GARCH: Generalized Autoregressive Conditional Heteroscedasticity ### GARCH: Generalized Autoregressive Conditional Heteroscedasticity
- Captures the variance dynamics - Captures dynamics in conditional variance
### Copula: Captures the dependence structure ### Copula: Captures the dependence structure
- Captures: conditional cross-sectional dependence structure - Captures: conditional cross-sectional dependencies
- Dependence allowed to vary over time - Dependence allowed to vary over time
## Modeling Approach: Overview ## Modeling Approach: Notation
<br/>
:::: {.columns} :::: {.columns}
@@ -2400,15 +2403,17 @@ We take $C$ as the $t$-copula
## Modeling Approach: Mean and Variance ## Modeling Approach: Mean and Variance
<br/>
:::: {.columns} :::: {.columns}
::: {.column width="48%"} ::: {.column width="48%"}
#### Individual marginal distributions: ### Individual marginal distributions:
$$\mathbf{F} = (F_1, \ldots, F_K)^{\intercal}$$ $$\mathbf{F} = (F_1, \ldots, F_K)^{\intercal}$$
#### Generalized non-central t-distributions ### Generalized non-central t-distributions
- To account for heavy tails - To account for heavy tails
- Time varying - Time varying
- expectation: $\boldsymbol{\mu}_t = (\mu_{1,t}, \ldots, \mu_{K,t})^{\intercal}$ - expectation: $\boldsymbol{\mu}_t = (\mu_{1,t}, \ldots, \mu_{K,t})^{\intercal}$
@@ -2425,7 +2430,7 @@ $$\mathbf{F} = (F_1, \ldots, F_K)^{\intercal}$$
::: {.column width="48%"} ::: {.column width="48%"}
#### VECM Model ### VECM Model
\begin{align} \begin{align}
\Delta \boldsymbol{\mu}_t = \Pi \boldsymbol{x}_{t-1} + \Gamma \Delta \boldsymbol{x}_{t-1} \nonumber \Delta \boldsymbol{\mu}_t = \Pi \boldsymbol{x}_{t-1} + \Gamma \Delta \boldsymbol{x}_{t-1} \nonumber
@@ -2433,7 +2438,7 @@ $$\mathbf{F} = (F_1, \ldots, F_K)^{\intercal}$$
where $\Pi = \alpha \beta^{\intercal}$ is the cointegrating matrix of rank $r$, $0 \leq r\leq K$. where $\Pi = \alpha \beta^{\intercal}$ is the cointegrating matrix of rank $r$, $0 \leq r\leq K$.
#### GARCH model ### GARCH model
\begin{align} \begin{align}
\sigma_{i,t}^2 = & \omega_i + \alpha^+_{i} (\epsilon_{i,t-1}^+)^2 + \alpha^-_{i} (\epsilon_{i,t-1}^-)^2 + \beta_i \sigma_{i,t-1}^2 \nonumber \sigma_{i,t}^2 = & \omega_i + \alpha^+_{i} (\epsilon_{i,t-1}^+)^2 + \alpha^-_{i} (\epsilon_{i,t-1}^-)^2 + \beta_i \sigma_{i,t-1}^2 \nonumber
@@ -2449,11 +2454,13 @@ Separate coefficients for positive and negative innovations to capture leverage
## Modeling Approach: Dependence ## Modeling Approach: Dependence
<br/>
:::: {.columns} :::: {.columns}
::: {.column width="48%"} ::: {.column width="48%"}
#### Time-varying dependence parameters ### Time-varying dependence parameters
\begin{align*} \begin{align*}
\Xi_{t} = & \Lambda\left(\boldsymbol{\xi}_{t}\right) \Xi_{t} = & \Lambda\left(\boldsymbol{\xi}_{t}\right)
@@ -2479,7 +2486,7 @@ $\Lambda(\cdot)$ is a link function
::: {.column width="48%"} ::: {.column width="48%"}
#### Maximum Likelihood Estimation ### Maximum Likelihood Estimation
All parameters can be estimated jointly. Using conditional independence: All parameters can be estimated jointly. Using conditional independence:
\begin{align*} \begin{align*}
@@ -2498,11 +2505,13 @@ The copula density $c$ can be derived analytically.
## Study Design and Evaluation ## Study Design and Evaluation
<br/>
:::: {.columns} :::: {.columns}
::: {.column width="48%"} ::: {.column width="48%"}
#### Rolling-window forecasting study ### Rolling-window forecasting study
- 3257 observations total - 3257 observations total
- Window size: 1000 days (~ four years) - Window size: 1000 days (~ four years)
@@ -2516,18 +2525,18 @@ We draw $2^{12}= 2048$ trajectories from the joint predictive distribution
::: :::
::: {.column width="2%"} ::: {.column width="4%"}
::: :::
::: {.column width="48%"} ::: {.column width="48%"}
#### Evaluation ### Evaluation
Forecasts are evaluated by the energy score (ES) Forecasts are evaluated by the energy score (ES)
\begin{align*} \begin{align*}
\text{ES}_t(F, \mathbf{x}_t) = \mathbb{E}_{F} \left(||\tilde{\mathbf{X}}_t - \mathbf{x}_t||_2\right) - \frac{1}{2} \mathbb{E}_F \left(||\tilde{\mathbf{X}}_t - \tilde{\mathbf{X}}_t'||_2 \right) \text{ES}_t(F, \mathbf{x}_t) = \mathbb{E}_{F} \left(||\tilde{\mathbf{X}}_t - \mathbf{x}_t||_2\right) - \\ \frac{1}{2} \mathbb{E}_F \left(||\tilde{\mathbf{X}}_t - \tilde{\mathbf{X}}_t'||_2 \right)
\end{align*} \end{align*}
where $\mathbf{x}_t$ is the observed $K$-dimensional realization and $\tilde{\mathbf{X}}_t$, respectively $\tilde{\mathbf{X}}_t'$ are independent random vectors distributed according to $F$ where $\mathbf{x}_t$ is the observed $K$-dimensional realization and $\tilde{\mathbf{X}}_t$, respectively $\tilde{\mathbf{X}}_t'$ are independent random vectors distributed according to $F$
@@ -2538,17 +2547,21 @@ For univariate cases the Energy Score becomes the Continuous Ranked Probability
:::: ::::
## Results
::: {.panel-tabset}
## Energy Scores ## Energy Scores
:::: {.columns} :::: {.columns}
::: {.column width="48%"} ::: {.column width="55%"}
Relative improvement in ES compared to $\text{RW}^{\sigma, \rho}$ Relative improvement in ES compared to $\text{RW}^{\sigma, \rho}$
Cellcolor: w.r.t test statistic of Diebold-Mariano test (testing wether the model outperformes the benchmark, greener = better). Cellcolor: w.r.t. test statistic of Diebold-Mariano test (testing wether the model outperformes the benchmark, greener = better).
```{r, echo=FALSE, results='asis', cache = TRUE} ```{r, echo=FALSE, results='asis', width = 'revert-layer', cache = TRUE}
load("assets/voldep/energy_df.Rdata") load("assets/voldep/energy_df.Rdata")
table_energy <- energy %>% table_energy <- energy %>%
kbl( kbl(
@@ -2571,8 +2584,8 @@ table_energy <- energy %>%
format = "html", format = "html",
align = c("l", rep("r", ncol(energy) - 1)) align = c("l", rep("r", ncol(energy) - 1))
) %>% ) %>%
kable_paper(full_width = FALSE) %>% kable_paper(full_width = TRUE) %>%
row_spec(0:nrow(energy), color = cols[10, "grey"]) row_spec(0:nrow(energy), color = cols[9, "grey"])
for (i in 2:ncol(energy)) { for (i in 2:ncol(energy)) {
bold_cells <- rep(FALSE, times = nrow(energy)) bold_cells <- rep(FALSE, times = nrow(energy))
@@ -2598,18 +2611,17 @@ for (i in 2:ncol(energy)) {
table_energy %>% table_energy %>%
kable_styling( kable_styling(
bootstrap_options = c("condensed"), bootstrap_options = c("condensed"),
full_width = TRUE,
font_size = 14 font_size = 14
) )
``` ```
::: :::
::: {.column width="2%"} ::: {.column width="4%"}
::: :::
::: {.column width="48%"} ::: {.column width="41%"}
- Benchmarks: - Benchmarks:
- $\text{RW}^{\sigma, \rho}$: Random walk with constant volatility and correlation - $\text{RW}^{\sigma, \rho}$: Random walk with constant volatility and correlation
@@ -2640,7 +2652,7 @@ table_energy %>%
::: :::
::: {.column width="2%"} ::: {.column width="4%"}
::: :::
@@ -2659,7 +2671,7 @@ table_crps <- crps %>%
# Dont replace any string, dataframe has to be valid latex code ... # Dont replace any string, dataframe has to be valid latex code ...
escape = FALSE, escape = FALSE,
format = "html", format = "html",
booktabs = TRUE, booktabs = FALSE,
align = c("l", rep("r", ncol(crps) - 1)) align = c("l", rep("r", ncol(crps) - 1))
) %>% ) %>%
kable_paper(full_width = FALSE) kable_paper(full_width = FALSE)
@@ -2683,7 +2695,8 @@ for (i in 2:ncol(crps)) {
} }
table_crps <- table_crps %>% table_crps <- table_crps %>%
add_header_above(c(" ", "EUA" = 3, "Oil" = 3, "NGas" = 3, "Coal" = 3)) add_header_above(c(" ", "EUA" = 3, "Oil" = 3, "NGas" = 3, "Coal" = 3)) %>%
row_spec(0:nrow(crps), color = cols[9, "grey"])
table_crps %>% table_crps %>%
kable_styling( kable_styling(
@@ -2718,13 +2731,12 @@ Conclusion: the Improvements seen before must be attributed to other parts of th
::: :::
::: {.column width="2%"} ::: {.column width="4%"}
::: :::
::: {.column width="68%"} ::: {.column width="68%"}
Improvement in RMSE score of selected models relative to $\textrm{RW}^{\sigma, \rho}_{}$ in % (higher = better). Colored according to the test statistic of a DM-Test comparing to $\textrm{RW}^{\sigma, \rho}_{}$ (greener means lower test statistic i.e., better performance compared to $\textrm{RW}^{\sigma, \rho}_{}$). Improvement in RMSE score of selected models relative to $\textrm{RW}^{\sigma, \rho}_{}$ in % (higher = better). Colored according to the test statistic of a DM-Test comparing to $\textrm{RW}^{\sigma, \rho}_{}$ (greener means lower test statistic i.e., better performance compared to $\textrm{RW}^{\sigma, \rho}_{}$).
```{r, echo=FALSE, results = 'asis', cache = TRUE} ```{r, echo=FALSE, results = 'asis', cache = TRUE}
@@ -2761,7 +2773,8 @@ for (i in 2:ncol(rmsq)) {
} }
table_rmsq <- table_rmsq %>% table_rmsq <- table_rmsq %>%
add_header_above(c(" ", "EUA" = 3, "Oil" = 3, "NGas" = 3, "Coal" = 3)) add_header_above(c(" ", "EUA" = 3, "Oil" = 3, "NGas" = 3, "Coal" = 3)) %>%
row_spec(0:nrow(rmsq), color = cols[9, "grey"])
table_rmsq %>% table_rmsq %>%
kable_styling( kable_styling(
@@ -2777,7 +2790,7 @@ table_rmsq %>%
## Evolution of Linear Dependence $\Xi$ ## Evolution of Linear Dependence $\Xi$
```{r, echo=FALSE, fig.width = 12, fig.height = 6, fig.align="center", cache = TRUE} ```{r, echo=FALSE, fig.width = 12, fig.height = 5.5, fig.align="center", cache = TRUE}
load("assets/voldep/plot_rho_df.Rdata") load("assets/voldep/plot_rho_df.Rdata")
ggplot() + ggplot() +
geom_line( geom_line(
@@ -2860,9 +2873,9 @@ ggplot() +
) )
``` ```
## Predictive Quantiles (Russian Invasion) ## Predictive Quantiles
```{r, echo=FALSE, fig.width = 12, fig.height = 6, fig.align="center", cache = TRUE} ```{r, echo=FALSE, fig.width = 12, fig.height = 5.5, fig.align="center", cache = TRUE}
load("assets/voldep/plot_quant_df.Rdata") load("assets/voldep/plot_quant_df.Rdata")
plot_quant_data %>% ggplot(aes(x = date, y = value)) + plot_quant_data %>% ggplot(aes(x = date, y = value)) +
@@ -2922,6 +2935,8 @@ plot_quant_data %>% ggplot(aes(x = date, y = value)) +
``` ```
::::
## Conclusion ## Conclusion
:::: {.columns} :::: {.columns}
@@ -2938,7 +2953,7 @@ Accounting for heteroscedasticity or stabilizing the variance via log transforma
::: :::
::: {.column width="2%"} ::: {.column width="4%"}
::: :::