Keep in mind that there’s no hyperparameter tuning in these examples. Hyperparameter tuning must be used in practice. Looking for `reticulate`

and `rpy2`

experts to discuss speedups for this R package (port from the stable Python version) installation and loading. There’s still room for improvement in this R port, especially in terms of data structure (a data structure that would handle time series not as matrices) choices.

```
%load_ext rpy2.ipython
```

```
The rpy2.ipython extension is already loaded. To reload it, use:
%reload_ext rpy2.ipython
```

```
!pip install nnetsauce
```

```
%%R
# 0 - packages -----
utils::install.packages(c("reticulate",
"remotes",
"forecast",
"fpp2"))
remotes::install_github("Techtonique/nnetsauce_r") # slow here
library("reticulate")
library("nnetsauce")
library("fpp2")
```

```
%%R
# 1 - data -----
set.seed(123)
X <- fpp2::uschange
idx_train <- 1:floor(0.8*nrow(X))
X_train <- X[idx_train, ]
X_test <- X[-idx_train, ]
```

```
%%R
# 2 - model fitting ---
obj_MTS <- nnetsauce::MTS(sklearn$linear_model$BayesianRidge(),
lags = 1L) # use a Bayesian model for uncertainty quantification
obj_DeepMTS <- nnetsauce::DeepMTS(sklearn$linear_model$ElasticNet(),
lags = 1L,
replications=100L,
kernel='gaussian') # use Kernel density for uncertainty quantification
obj_MTS$fit(X_train)
obj_DeepMTS$fit(X_train)
```

```
%%R
# 3 - model predictions ---
preds_MTS <- obj_MTS$predict(h = nrow(X_test),
level = 95,
return_std = TRUE)
preds_DeepMTS <- obj_DeepMTS$predict(h=nrow(X_test),
level = 95)
```

```
100%|██████████| 100/100 [00:00<00:00, 3510.91it/s]
100%|██████████| 100/100 [00:00<00:00, 5638.11it/s]
```

```
%%R
# 4 - Graph ---
par(mfrow=c(2, 4))
for (series_id in c(2, 3, 4, 5))
{
plot(1:nrow(X_test), X_test[, series_id],
main = paste0("MTS (Bayesian) -- \n", colnames(fpp2::uschange)[series_id]),
type='l', ylim = c(min(preds_MTS$lower[, series_id]),
max(preds_MTS$upper[, series_id])))
lines(preds_MTS$lower[, series_id], col="blue", lwd=2)
lines(preds_MTS$upper[, series_id], col="blue", lwd=2)
lines(preds_MTS$mean[, series_id], col="red", lwd=2)
}
for (series_id in c(2, 3, 4, 5))
{
plot(1:nrow(X_test), X_test[, series_id],
main = paste0("DeepMTS (KDE) -- \n", colnames(fpp2::uschange)[series_id]),
type='l', ylim = c(min(preds_DeepMTS$lower[, series_id]),
max(preds_DeepMTS$upper[, series_id])))
lines(preds_DeepMTS$lower[, series_id], col="blue", lwd=2)
lines(preds_DeepMTS$upper[, series_id], col="blue", lwd=2)
lines(preds_DeepMTS$mean[, series_id], col="red", lwd=2)
}
```

In this figure, KDE stands for Kernel Density Estimation. Prediction intervals are depicted as a blue line, and mean forecast as a red line. The true value is depicted as a black line. Again, keep in mind that every model is used with its default hyperparameters, and hyperparameters’ tuning will give a different result.

**Visualizing predictive simulations for DeepMTS**

```
%%R
par(mfrow=c(2, 2))
matplot(preds_DeepMTS$sims[[1]], type='l', col=1:4, lwd=2, lty=1, ylim=c(-40, 40))
matplot(preds_DeepMTS$sims[[25]], type='l', col=1:4, lwd=2, lty=1, ylim=c(-40, 40))
matplot(preds_DeepMTS$sims[[50]], type='l', col=1:4, lwd=2, lty=1, ylim=c(-40, 40))
matplot(preds_DeepMTS$sims[[100]], type='l', col=1:4, lwd=2, lty=1, ylim=c(-40, 40))
```