## ----setup, include = FALSE---------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)

## ----message=FALSE, warning=FALSE---------------------------------------------
# Load the package
require(AddiVortes)

# Separate predictors (X) and the response variable (Y)
X_Boston <- as.matrix(Boston[, 1:13])
Y_Boston <- as.numeric(as.matrix(Boston[, 14]))

## -----------------------------------------------------------------------------
n <- length(Y_Boston)

# Set a seed for reproducibility
set.seed(1025)

# Create a training set containing 5/6 of the data
TrainSet <- sort(sample.int(n, 5 * n / 6))

# The remaining data will be our test set
TestSet <- setdiff(1:n, TrainSet)

## -----------------------------------------------------------------------------
# Run the AddiVortes algorithm on the training data
results <- AddiVortes(
  y = Y_Boston[TrainSet],
  x = X_Boston[TrainSet, ],
  m = 200,
  totalMCMCIter = 2000,
  mcmcBurnIn = 500,
  nu = 6,
  q = 0.85,
  k = 3,
  sd = 0.8,
  Omega = 3,
  LambdaRate = 25,
  InitialSigma = "Linear",
  showProgress = FALSE
)

## -----------------------------------------------------------------------------
# Generate predictions on the test set
preds <- predict(results,
  X_Boston[TestSet, ],
  showProgress = FALSE
)

# The RMSE is contained in the results object
cat("In-Sample RMSE:", results$inSampleRmse, "\n")

# Calculate the Root Mean Squared Error (RMSE) for the test set
rmse <- sqrt(mean((Y_Boston[TestSet] - preds)^2))
cat("Test Set RMSE:", rmse, "\n")

## ----fig.width=6, fig.height=6, fig.align='center'----------------------------
# Plot true values vs. predicted values
plot(Y_Boston[TestSet],
  preds,
  xlab = "True Values",
  ylab = "Predicted Values",
  main = "AddiVortes Predictions vs True Values",
  xlim = range(c(Y_Boston[TestSet], preds)),
  ylim = range(c(Y_Boston[TestSet], preds)),
  pch = 19, col = "darkblue"
)

# Add the line of equality (y = x) for reference
abline(a = 0, b = 1, col = "darkred", lwd = 2)

# Get quantile predictions to create error bars/intervals
preds_quantile <- predict(results,
  X_Boston[TestSet, ],
  "quantile",
  showProgress = FALSE
)

# Add error segments for each prediction
for (i in seq_len(nrow(preds_quantile))) {
  segments(Y_Boston[TestSet][i], preds_quantile[i, 1],
    Y_Boston[TestSet][i], preds_quantile[i, 2],
    col = "darkblue", lwd = 1
  )
}
legend("topleft",
  legend = c("Prediction", "y=x Line", "95% Interval"),
  col = c("darkblue", "darkred", "darkblue"),
  lty = 1, pch = c(19, NA, NA), lwd = 2
)

