Title: | Hierarchical Bayesian Vector Autoregression |
---|---|
Description: | Estimation of hierarchical Bayesian vector autoregressive models following Kuschnig & Vashold (2021) <doi:10.18637/jss.v100.i14>. Implements hierarchical prior selection for conjugate priors in the fashion of Giannone, Lenza & Primiceri (2015) <doi:10.1162/REST_a_00483>. Functions to compute and identify impulse responses, calculate forecasts, forecast error variance decompositions and scenarios are available. Several methods to print, plot and summarise results facilitate analysis. |
Authors: | Nikolas Kuschnig [aut, cre] , Lukas Vashold [aut] , Nirai Tomass [ctb], Michael McCracken [dtc], Serena Ng [dtc] |
Maintainer: | Nikolas Kuschnig <[email protected]> |
License: | GPL-3 | file LICENSE |
Version: | 1.0.5 |
Built: | 2024-11-12 21:04:13 UTC |
Source: | https://github.com/nk027/bvar |
Estimation of hierarchical Bayesian vector autoregressive models following Kuschnig & Vashold (2021). Implements hierarchical prior selection for conjugate priors in the fashion of Giannone, Lenza & Primiceri (2015) <doi:10.1162/REST_a_00483>. Functions to compute and identify impulse responses, calculate forecasts, forecast error variance decompositions and scenarios are available. Several methods to print, plot and summarise results facilitate analysis.
Maintainer: Nikolas Kuschnig [email protected] (ORCID)
Authors:
Lukas Vashold (ORCID)
Other contributors:
Nirai Tomass [contributor]
Michael McCracken [data contributor]
Serena Ng [data contributor]
Giannone, D. and Lenza, M. and Primiceri, G. E. (2015) Prior Selection for Vector Autoregressions. The Review of Economics and Statistics, 97:2, 436-451, doi:10.1162/REST_a_00483.
Kuschnig, N. and Vashold, L. (2021) BVAR: Bayesian Vector Autoregressions with Hierarchical Prior Selection in R. Journal of Statistical Software, 14, 1-27, doi:10.18637/jss.v100.i14.
Useful links:
Allows the creation of dummy observation priors for bv_priors
.
See the Details section for information on common dummy priors.
bv_dummy(mode = 1, sd = 1, min = 0.0001, max = 5, fun) bv_soc(mode = 1, sd = 1, min = 0.0001, max = 50) bv_sur(mode = 1, sd = 1, min = 0.0001, max = 50)
bv_dummy(mode = 1, sd = 1, min = 0.0001, max = 5, fun) bv_soc(mode = 1, sd = 1, min = 0.0001, max = 50) bv_sur(mode = 1, sd = 1, min = 0.0001, max = 50)
mode , sd
|
Numeric scalar. Mode / standard deviation of the parameter. Note that the mode of psi is set automatically by default, and would need to be provided as vector. |
min , max
|
Numeric scalar. Minimum / maximum allowed value. Note that for psi these are set automatically or need to provided as vectors. |
fun |
Function taking Y, lags and the prior's parameter par to generate and return a named list with elements X and Y (numeric matrices). |
Dummy priors are often used to "reduce the importance of the deterministic
component implied by VARs estimated conditioning on the initial
observations" (Giannone, Lenza and Primiceri, 2015, p. 440).
One such prior is the sum-of-coefficients (SOC) prior, which imposes the
notion that a no-change forecast is optimal at the beginning of a time
series. Its key parameter controls the tightness - i.e. for
low values the model is pulled towards a form with as many unit roots as
variables and no cointegration.
Another such prior is the single-unit-root (SUR) prior, that allows for
cointegration relationships in the data. It pushes variables either towards
their unconditional mean or towards the presence of at least one unit root.
These priors are implemented via Theil mixed estimation, i.e. by adding
dummy-observations on top of the data matrix. They are available via the
functions
bv_soc
and bv_sur
.
Returns a named list of class bv_dummy
for
bv_priors
.
bv_soc()
: Sum-of-coefficients dummy prior
bv_sur()
: Single-unit-root dummy prior
Giannone, D. and Lenza, M. and Primiceri, G. E. (2015) Prior Selection for Vector Autoregressions. The Review of Economics and Statistics, 97:2, 436-451, doi:10.1162/REST_a_00483.
# Create a sum-of-coefficients prior add_soc <- function(Y, lags, par) { soc <- if(lags == 1) {diag(Y[1, ]) / par} else { diag(colMeans(Y[1:lags, ])) / par } Y_soc <- soc X_soc <- cbind(rep(0, ncol(Y)), matrix(rep(soc, lags), nrow = ncol(Y))) return(list("Y" = Y_soc, "X" = X_soc)) } soc <- bv_dummy(mode = 1, sd = 1, min = 0.0001, max = 50, fun = add_soc) # Create a single-unit-root prior add_sur <- function(Y, lags, par) { sur <- if(lags == 1) {Y[1, ] / par} else { colMeans(Y[1:lags, ]) / par } Y_sur <- sur X_sur <- c(1 / par, rep(sur, lags)) return(list("Y" = Y_sur, "X" = X_sur)) } sur <- bv_dummy(mode = 1, sd = 1, min = 0.0001, max = 50, fun = add_sur) # Add the new custom dummy priors bv_priors(hyper = "auto", soc = soc, sur = sur)
# Create a sum-of-coefficients prior add_soc <- function(Y, lags, par) { soc <- if(lags == 1) {diag(Y[1, ]) / par} else { diag(colMeans(Y[1:lags, ])) / par } Y_soc <- soc X_soc <- cbind(rep(0, ncol(Y)), matrix(rep(soc, lags), nrow = ncol(Y))) return(list("Y" = Y_soc, "X" = X_soc)) } soc <- bv_dummy(mode = 1, sd = 1, min = 0.0001, max = 50, fun = add_soc) # Create a single-unit-root prior add_sur <- function(Y, lags, par) { sur <- if(lags == 1) {Y[1, ] / par} else { colMeans(Y[1:lags, ]) / par } Y_sur <- sur X_sur <- c(1 / par, rep(sur, lags)) return(list("Y" = Y_sur, "X" = X_sur)) } sur <- bv_dummy(mode = 1, sd = 1, min = 0.0001, max = 50, fun = add_sur) # Add the new custom dummy priors bv_priors(hyper = "auto", soc = soc, sur = sur)
Provide forecast settings to predict.bvar
. Allows adjusting
the horizon of forecasts, and for setting up conditional forecasts. See the
Details section for further information.
bv_fcast(horizon = 12, cond_path = NULL, cond_vars = NULL)
bv_fcast(horizon = 12, cond_path = NULL, cond_vars = NULL)
horizon |
Integer scalar. Horizon for which to compute forecasts. |
cond_path |
Optional numeric vector or matrix used for conditional
forecasts. Supply variable path(s) on which forecasts are conditioned on.
Unrestricted future realisations should be filled with |
cond_vars |
Optional character or numeric vector. Used to subset cond_path to specific variable(s) via name or position. Not needed when cond_path is constructed for all variables. |
Conditional forecasts are calculated using the algorithm by Waggoner and Zha (1999). They are set up by imposing a path on selected variables.
Returns a named list of class bv_fcast
with options for
bvar
or predict.bvar
.
Waggoner, D. F., & Zha, T. (1999). Conditional Forecasts in Dynamic Multivariate Models. Review of Economics and Statistics, 81:4, 639-651, doi:10.1162/003465399558508.
# Set forecast-horizon to 20 time periods for unconditional forecasts bv_fcast(horizon = 20) # Define a path for the second variable (in the initial six periods). bv_fcast(cond_path = c(1, 1, 1, 1, 1, 1), cond_var = 2) # Constrain the paths of the first and third variables. paths <- matrix(NA, nrow = 10, ncol = 2) paths[1:5, 1] <- 1 paths[1:10, 2] <- 2 bv_fcast(cond_path = paths, cond_var = c(1, 3))
# Set forecast-horizon to 20 time periods for unconditional forecasts bv_fcast(horizon = 20) # Define a path for the second variable (in the initial six periods). bv_fcast(cond_path = c(1, 1, 1, 1, 1, 1), cond_var = 2) # Constrain the paths of the first and third variables. paths <- matrix(NA, nrow = 10, ncol = 2) paths[1:5, 1] <- 1 paths[1:10, 2] <- 2 bv_fcast(cond_path = paths, cond_var = c(1, 3))
Provides settings for the computation of impulse responses to
bvar
, irf.bvar
or fevd.bvar
. Allows
setting the horizon for which impulse responses should be computed, whether
or not forecast error variance decompositions (FEVDs) should be included
as well as if and what kind of identification should be used. See the Details
section for further information on identification. Identification can be
achieved via Cholesky decomposition, sign restrictions (Rubio-Ramirez,
Waggoner and Zha, 2010), and zero and sign restrictions (Arias,
Rubio-Ramirez and Waggoner, 2018).
bv_irf( horizon = 12, fevd = FALSE, identification = TRUE, sign_restr = NULL, sign_lim = 1000 )
bv_irf( horizon = 12, fevd = FALSE, identification = TRUE, sign_restr = NULL, sign_lim = 1000 )
horizon |
Integer scalar. The horizon for which impulse responses (and FEVDs) should be computed. Note that the first period corresponds to impacts i.e. contemporaneous effects. |
fevd |
Logical scalar. Whether or not forecast error variance decompositions should be calculated. |
identification |
Logical scalar. Whether or not the shocks used for
calculating impulses should be identified. Defaults to |
sign_restr |
Elements inform about expected impacts
of certain shocks. Can be either |
sign_lim |
Integer scalar. Maximum number of tries to find suitable matrices to for fitting sign or zero and sign restrictions. |
Identification can be performed via Cholesky decomposition, sign restrictions, or zero and sign restrictions. The algorithm for generating suitable sign restrictions follows Rubio-Ramirez, Waggoner and Zha (2010), while the one for zero and sign restrictions follows Arias, Rubio-Ramirez and Waggoner (2018). Note the possiblity of finding no suitable zero/sign restrictions.
Returns a named list of class bv_irf
with options for
bvar
, irf.bvar
or fevd.bvar
.
Rubio-Ramirez, J. F. and Waggoner, D. F. and Zha, T. (2010) Structural Vector Autoregressions: Theory of Identification and Algorithms for Inference. The Review of Economic Studies, 77, 665-696, doi:10.1111/j.1467-937X.2009.00578.x. Arias, J.E. and Rubio-Ramirez, J. F. and Waggoner, D. F. (2018) Inference Based on Structural Vector Autoregressions Identifiied with Sign and Zero Restrictions: Theory and Applications. Econometrica, 86, 2, 685-720, doi:10.3982/ECTA14468.
# Set impulse responses to a horizon of 20 time periods and enable FEVD # (Identification is performed via Cholesky decomposition) bv_irf(horizon = 20, fevd = TRUE) # Set up structural impulse responses using sign restrictions signs <- matrix(c(1, NA, NA, -1, 1, -1, -1, 1, 1), nrow = 3) bv_irf(sign_restr = signs) # Set up structural impulse responses using zero and sign restrictions zero_signs <- matrix(c(1, 0, NA, -1, 1, 0, -1, 1, 1), nrow = 3) bv_irf(sign_restr = zero_signs) # Prepare to estimate unidentified impulse responses bv_irf(identification = FALSE)
# Set impulse responses to a horizon of 20 time periods and enable FEVD # (Identification is performed via Cholesky decomposition) bv_irf(horizon = 20, fevd = TRUE) # Set up structural impulse responses using sign restrictions signs <- matrix(c(1, NA, NA, -1, 1, -1, -1, 1, 1), nrow = 3) bv_irf(sign_restr = signs) # Set up structural impulse responses using zero and sign restrictions zero_signs <- matrix(c(1, 0, NA, -1, 1, 0, -1, 1, 1), nrow = 3) bv_irf(sign_restr = zero_signs) # Prepare to estimate unidentified impulse responses bv_irf(identification = FALSE)
Function to provide settings for the Metropolis-Hastings step in
bvar
. Options include scaling the inverse Hessian that is
used to draw parameter proposals and automatic scaling to achieve certain
acceptance rates.
bv_metropolis( scale_hess = 0.01, adjust_acc = FALSE, adjust_burn = 0.75, acc_lower = 0.25, acc_upper = 0.45, acc_change = 0.01 ) bv_mh( scale_hess = 0.01, adjust_acc = FALSE, adjust_burn = 0.75, acc_lower = 0.25, acc_upper = 0.45, acc_change = 0.01 )
bv_metropolis( scale_hess = 0.01, adjust_acc = FALSE, adjust_burn = 0.75, acc_lower = 0.25, acc_upper = 0.45, acc_change = 0.01 ) bv_mh( scale_hess = 0.01, adjust_acc = FALSE, adjust_burn = 0.75, acc_lower = 0.25, acc_upper = 0.45, acc_change = 0.01 )
scale_hess |
Numeric scalar or vector. Scaling parameter, determining
the range of hyperparameter draws. Should be calibrated so a reasonable
acceptance rate is reached. If provided as vector the length must equal
the number of hyperparameters (one per variable for |
adjust_acc |
Logical scalar. Whether or not to further scale the variability of parameter draws during the burn-in phase. |
adjust_burn |
Numeric scalar. How much of the burn-in phase should be used to scale parameter variability. See Details. |
acc_lower , acc_upper
|
Numeric scalar. Lower (upper) bound of the target
acceptance rate. Required if adjust_acc is set to |
acc_change |
Numeric scalar. Percent change applied to the Hessian
matrix for tuning acceptance rate. Required if adjust_acc is set to
|
Note that adjustment of the acceptance rate by scaling the parameter draw variability can only be done during the burn-in phase, as otherwise the resulting draws do not feature the desirable properties of a Markov chain. After the parameter draws have been scaled, some additional draws should be burnt.
Returns a named list of class bv_metropolis
with options for
bvar
.
# Increase the scaling parameter bv_mh(scale_hess = 1) # Turn on automatic scaling of the acceptance rate to [20%, 40%] bv_mh(adjust_acc = TRUE, acc_lower = 0.2, acc_upper = 0.4) # Increase the rate of automatic scaling bv_mh(adjust_acc = TRUE, acc_lower = 0.2, acc_upper = 0.4, acc_change = 0.1) # Use only 50% of the burn-in phase to adjust scaling bv_mh(adjust_acc = TRUE, adjust_burn = 0.5)
# Increase the scaling parameter bv_mh(scale_hess = 1) # Turn on automatic scaling of the acceptance rate to [20%, 40%] bv_mh(adjust_acc = TRUE, acc_lower = 0.2, acc_upper = 0.4) # Increase the rate of automatic scaling bv_mh(adjust_acc = TRUE, acc_lower = 0.2, acc_upper = 0.4, acc_change = 0.1) # Use only 50% of the burn-in phase to adjust scaling bv_mh(adjust_acc = TRUE, adjust_burn = 0.5)
Provide settings for the Minnesota prior to bv_priors
. See the
Details section for further information.
bv_minnesota( lambda = bv_lambda(), alpha = bv_alpha(), psi = bv_psi(), var = 10000000, b = 1 ) bv_mn( lambda = bv_lambda(), alpha = bv_alpha(), psi = bv_psi(), var = 10000000, b = 1 ) bv_lambda(mode = 0.2, sd = 0.4, min = 0.0001, max = 5) bv_alpha(mode = 2, sd = 0.25, min = 1, max = 3) bv_psi(scale = 0.004, shape = 0.004, mode = "auto", min = "auto", max = "auto")
bv_minnesota( lambda = bv_lambda(), alpha = bv_alpha(), psi = bv_psi(), var = 10000000, b = 1 ) bv_mn( lambda = bv_lambda(), alpha = bv_alpha(), psi = bv_psi(), var = 10000000, b = 1 ) bv_lambda(mode = 0.2, sd = 0.4, min = 0.0001, max = 5) bv_alpha(mode = 2, sd = 0.25, min = 1, max = 3) bv_psi(scale = 0.004, shape = 0.004, mode = "auto", min = "auto", max = "auto")
lambda |
List constructed via |
alpha |
List constructed via |
psi |
List with elements scale, shape of the prior
as well as mode and optionally min and max. The length
of these needs to match the number of variables (i.e. columns) in the data.
By default mode is set automatically to the square-root of the
innovations variance after fitting an |
var |
Numeric scalar with the prior variance on the model's constant. |
b |
Numeric scalar, vector or matrix with the prior mean. A scalar is
applied to all variables, with a default value of 1. Consider setting it to
0 for growth rates. A vector needs to match the number of variables (i.e.
columns) in the data, with a prior mean per variable. If provided, a matrix
needs to have a column per variable ( |
mode , sd
|
Numeric scalar. Mode / standard deviation of the parameter. Note that the mode of psi is set automatically by default, and would need to be provided as vector. |
min , max
|
Numeric scalar. Minimum / maximum allowed value. Note that for psi these are set automatically or need to provided as vectors. |
scale , shape
|
Numeric scalar. Scale and shape parameters of a Gamma distribution. |
Essentially this prior imposes the hypothesis, that individual variables
all follow random walk processes. This parsimonious specification typically
performs well in forecasts of macroeconomic time series and is often used as
a benchmark for evaluating accuracy (Kilian and Lütkepohl, 2017).
The key parameter is (lambda), which controls
the tightness of the prior. The parameter
(alpha)
governs variance decay with increasing lag order, while
(psi) controls the prior's standard deviation on lags of variables
other than the dependent.
The Minnesota prior is often refined with additional priors, trying to
minimise the importance of conditioning on initial observations. See
bv_dummy
for more information on such priors.
Returns a list of class bv_minnesota
with options for
bvar
.
bv_lambda()
: Tightness of the Minnesota prior
bv_alpha()
: Variance decay with increasing lag order
bv_psi()
: Prior standard deviation on other lags
Kilian, L. and Lütkepohl, H. (2017). Structural Vector Autoregressive Analysis. Cambridge University Press, doi:10.1017/9781108164818
# Adjust alpha and the Minnesota prior variance. bv_mn(alpha = bv_alpha(mode = 0.5, sd = 1, min = 1e-12, max = 10), var = 1e6) # Optionally use a vector as shorthand bv_mn(alpha = c(0.5, 1, 1e-12, 10), var = 1e6) # Only adjust lambda's standard deviation bv_mn(lambda = bv_lambda(sd = 2)) # Provide prior modes for psi (for a VAR with three variables) bv_mn(psi = bv_psi(mode = c(0.7, 0.3, 0.9)))
# Adjust alpha and the Minnesota prior variance. bv_mn(alpha = bv_alpha(mode = 0.5, sd = 1, min = 1e-12, max = 10), var = 1e6) # Optionally use a vector as shorthand bv_mn(alpha = c(0.5, 1, 1e-12, 10), var = 1e6) # Only adjust lambda's standard deviation bv_mn(lambda = bv_lambda(sd = 2)) # Provide prior modes for psi (for a VAR with three variables) bv_mn(psi = bv_psi(mode = c(0.7, 0.3, 0.9)))
Function to provide priors and their parameters to bvar
. Used
for adjusting the parameters treated as hyperparameters, the Minnesota prior
and adding various dummy priors through the ellipsis parameter.
Note that treating (psi) as a hyperparameter in a
model with many variables may lead to very low acceptance rates and thus
hinder convergence.
bv_priors(hyper = "auto", mn = bv_mn(), ...)
bv_priors(hyper = "auto", mn = bv_mn(), ...)
hyper |
Character vector. Used to specify the parameters to be treated
as hyperparameters. May also be set to |
mn |
List of class |
... |
Optional lists of class |
Returns a named list of class bv_priors
with options for
bvar
.
# Extend the hyperparameters to the full Minnesota prior bv_priors(hyper = c("lambda", "alpha", "psi")) # Alternatively # bv_priors("full") # Add a dummy prior via `bv_dummy()` # Re-create the single-unit-root prior add_sur <- function(Y, lags, par) { sur <- if(lags == 1) {Y[1, ] / par} else { colMeans(Y[1:lags, ]) / par } Y_sur <- sur X_sur <- c(1 / par, rep(sur, lags)) return(list("Y" = Y_sur, "X" = X_sur)) } sur <- bv_dummy(mode = 1, sd = 1, min = 0.0001, max = 50, fun = add_sur) # Add the new prior bv_priors(hyper = "auto", sur = sur)
# Extend the hyperparameters to the full Minnesota prior bv_priors(hyper = c("lambda", "alpha", "psi")) # Alternatively # bv_priors("full") # Add a dummy prior via `bv_dummy()` # Re-create the single-unit-root prior add_sur <- function(Y, lags, par) { sur <- if(lags == 1) {Y[1, ] / par} else { colMeans(Y[1:lags, ]) / par } Y_sur <- sur X_sur <- c(1 / par, rep(sur, lags)) return(list("Y" = Y_sur, "X" = X_sur)) } sur <- bv_dummy(mode = 1, sd = 1, min = 0.0001, max = 50, fun = add_sur) # Add the new prior bv_priors(hyper = "auto", sur = sur)
Used to estimate hierarchical Bayesian Vector Autoregression (VAR) models in
the fashion of Giannone, Lenza and Primiceri (2015).
Priors are adjusted and added via bv_priors
.
The Metropolis-Hastings step can be modified with bv_mh
.
bvar( data, lags, n_draw = 10000L, n_burn = 5000L, n_thin = 1L, priors = bv_priors(), mh = bv_mh(), fcast = NULL, irf = NULL, verbose = TRUE, ... )
bvar( data, lags, n_draw = 10000L, n_burn = 5000L, n_thin = 1L, priors = bv_priors(), mh = bv_mh(), fcast = NULL, irf = NULL, verbose = TRUE, ... )
data |
Numeric matrix or dataframe. Note that observations are expected to be ordered from earliest to latest, and variables in the columns. |
lags |
Integer scalar. Lag order of the model. |
n_draw , n_burn
|
Integer scalar. The number of iterations to (a) cycle through and (b) burn at the start. |
n_thin |
Integer scalar. Every n_thin'th iteration is stored. For a given memory requirement thinning reduces autocorrelation, while increasing effective sample size. |
priors |
Object from |
mh |
Object from |
fcast |
Object from |
irf |
Object from |
verbose |
Logical scalar. Whether to print intermediate results and progress. |
... |
Not used. |
The model can be expressed as:
See Kuschnig and Vashold (2021) and Giannone, Lenza and Primiceri (2015)
for further information.
Methods for a bvar
object and its derivatives can be used to:
predict and analyse scenarios;
evaluate shocks and the variance of forecast errors;
visualise forecasts and impulse responses, parameters and residuals;
retrieve coefficents and the variance-covariance matrix;
calculate fitted and residual values;
Note that these methods generally work by calculating quantiles from the
posterior draws. The full posterior may be retrieved directly from the
objects. The function str
can be very helpful for this.
Returns a list of class bvar
with the following elements:
beta
- Numeric array with draws from the posterior of the VAR
coefficients. Also see coef.bvar
.
sigma
- Numeric array with draws from the posterior of the
variance-covariance matrix. Also see vcov.bvar
.
hyper
- Numeric matrix with draws from the posterior of the
hierarchically treated hyperparameters.
ml
- Numeric vector with the marginal likelihood (with respect
to the hyperparameters), that determines acceptance probability.
optim
- List with outputs of optim
,
which is used to find starting values for the hyperparameters.
prior
- Prior settings from bv_priors
.
call
- Call to the function. See match.call
.
meta
- List with meta information. Includes the number of
variables, accepted draws, number of iterations, and data.
variables
- Character vector with the column names of
data. If missing, variables are named iteratively.
explanatories
- Character vector with names of explanatory
variables. Formatting is akin to: "FEDFUNDS-lag1"
.
fcast
- Forecasts from predict.bvar
.
irf
- Impulse responses from irf.bvar
.
Nikolas Kuschnig, Lukas Vashold
Giannone, D. and Lenza, M. and Primiceri, G. E. (2015) Prior Selection for Vector Autoregressions. The Review of Economics and Statistics, 97:2, 436-451, doi:10.1162/REST_a_00483.
Kuschnig, N. and Vashold, L. (2021) BVAR: Bayesian Vector Autoregressions with Hierarchical Prior Selection in R. Journal of Statistical Software, 14, 1-27, doi:10.18637/jss.v100.i14.
bv_priors
; bv_mh
;
bv_fcast
; bv_irf
;
predict.bvar
; irf.bvar
; plot.bvar
;
# Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate a BVAR using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 1000L, n_burn = 200L, verbose = FALSE) # Calculate and store forecasts and impulse responses predict(x) <- predict(x, horizon = 8) irf(x) <- irf(x, horizon = 8, fevd = FALSE) ## Not run: # Check convergence of the hyperparameters with a trace and density plot plot(x) # Plot forecasts and impulse responses plot(predict(x)) plot(irf(x)) # Check coefficient values and variance-covariance matrix summary(x) ## End(Not run)
# Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate a BVAR using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 1000L, n_burn = 200L, verbose = FALSE) # Calculate and store forecasts and impulse responses predict(x) <- predict(x, horizon = 8) irf(x) <- irf(x, horizon = 8, fevd = FALSE) ## Not run: # Check convergence of the hyperparameters with a trace and density plot plot(x) # Plot forecasts and impulse responses plot(predict(x)) plot(irf(x)) # Check coefficient values and variance-covariance matrix summary(x) ## End(Not run)
Methods to convert parameter and/or coefficient draws from bvar
to coda's mcmc
(or mcmc.list
)
format for further processing.
as.mcmc.bvar( x, vars = NULL, vars_response = NULL, vars_impulse = NULL, chains = list(), ... ) as.mcmc.bvar_chains( x, vars = NULL, vars_response = NULL, vars_impulse = NULL, chains = list(), ... )
as.mcmc.bvar( x, vars = NULL, vars_response = NULL, vars_impulse = NULL, chains = list(), ... ) as.mcmc.bvar_chains( x, vars = NULL, vars_response = NULL, vars_impulse = NULL, chains = list(), ... )
x |
A |
vars |
Character vector used to select variables. Elements are matched
to hyperparameters or coefficients. Coefficients may be matched based on
the dependent variable (by providing the name or position) or the
explanatory variables (by providing the name and the desired lag). See the
example section for a demonstration. Defaults to |
vars_response , vars_impulse
|
Optional character or integer vectors used to select coefficents. Dependent variables are specified with vars_response, explanatory ones with vars_impulse. See the example section for a demonstration. |
chains |
List with additional |
... |
Other parameters for |
Returns a coda mcmc
(or
mcmc.list
) object.
library("coda") # Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate two BVARs using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 750L, n_burn = 250L, verbose = FALSE) y <- bvar(data, lags = 1, n_draw = 750L, n_burn = 250L, verbose = FALSE) # Convert the hyperparameter lambda as.mcmc(x, vars = c("lambda")) # Convert coefficients for the first dependent, use chains in method as.mcmc(structure(list(x, y), class = "bvar_chains"), vars = "CPIAUCSL") # Convert the coefs of variable three's first lag, use in the generic as.mcmc(x, vars = "FEDFUNDS-lag1", chains = y) # Convert hyperparameters and constant coefficient values for variable 1 as.mcmc(x, vars = c("lambda", "CPI", "constant")) # Specify coefficent values to convert in alternative way as.mcmc(x, vars_impulse = c("FED", "CPI"), vars_response = "UNRATE")
library("coda") # Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate two BVARs using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 750L, n_burn = 250L, verbose = FALSE) y <- bvar(data, lags = 1, n_draw = 750L, n_burn = 250L, verbose = FALSE) # Convert the hyperparameter lambda as.mcmc(x, vars = c("lambda")) # Convert coefficients for the first dependent, use chains in method as.mcmc(structure(list(x, y), class = "bvar_chains"), vars = "CPIAUCSL") # Convert the coefs of variable three's first lag, use in the generic as.mcmc(x, vars = "FEDFUNDS-lag1", chains = y) # Convert hyperparameters and constant coefficient values for variable 1 as.mcmc(x, vars = c("lambda", "CPI", "constant")) # Specify coefficent values to convert in alternative way as.mcmc(x, vars_impulse = c("FED", "CPI"), vars_response = "UNRATE")
Retrieves coefficient / variance-covariance values from Bayesian VAR models
generated with bvar
. Note that coefficients are available for
every stored draw and one may retrieve (a) credible intervals via the
conf_bands argument, or (2) means via the type argument.
## S3 method for class 'bvar' coef( object, type = c("quantile", "mean"), conf_bands = 0.5, companion = FALSE, ... ) ## S3 method for class 'bvar' vcov(object, type = c("quantile", "mean"), conf_bands = 0.5, ...)
## S3 method for class 'bvar' coef( object, type = c("quantile", "mean"), conf_bands = 0.5, companion = FALSE, ... ) ## S3 method for class 'bvar' vcov(object, type = c("quantile", "mean"), conf_bands = 0.5, ...)
object |
A |
type |
Character scalar. Whether to return quantile or mean values. Note that conf_bands is ignored for mean values. |
conf_bands |
Numeric vector of confidence bands to apply.
E.g. for bands at 5%, 10%, 90% and 95% set this to |
companion |
Logical scalar. Whether to retrieve the companion matrix of
coefficients. See |
... |
Not used. |
Returns a numeric array of class bvar_coefs
or
bvar_vcovs
at the specified values.
# Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate a BVAR using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 1000L, n_burn = 200L, verbose = FALSE) # Get coefficent values at the 10%, 50% and 90% quantiles coef(x, conf_bands = 0.10) # Only get the median of the variance-covariance matrix vcov(x, conf_bands = 0.5)
# Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate a BVAR using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 1000L, n_burn = 200L, verbose = FALSE) # Get coefficent values at the 10%, 50% and 90% quantiles coef(x, conf_bands = 0.10) # Only get the median of the variance-covariance matrix vcov(x, conf_bands = 0.5)
Calculates the companion matrix for Bayesian VARs generated via
bvar
.
companion(object, ...) ## Default S3 method: companion(object, ...) ## S3 method for class 'bvar' companion(object, type = c("quantile", "mean"), conf_bands = 0.5, ...)
companion(object, ...) ## Default S3 method: companion(object, ...) ## S3 method for class 'bvar' companion(object, type = c("quantile", "mean"), conf_bands = 0.5, ...)
object |
A |
... |
Not used. |
type |
Character scalar. Whether to return quantile or mean values. Note that conf_bands is ignored for mean values. |
conf_bands |
Numeric vector of confidence bands to apply.
E.g. for bands at 5%, 10%, 90% and 95% set this to |
Returns a numeric array/matrix of class bvar_comp
with the
VAR's coefficents in companion form at the specified values.
# Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate a BVAR using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 1000L, n_burn = 200L, verbose = FALSE) # Get companion matrices for confidence bands at 10%, 50% and 90% companion(x, conf_bands = 0.10)
# Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate a BVAR using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 1000L, n_burn = 200L, verbose = FALSE) # Get companion matrices for confidence bands at 10%, 50% and 90% companion(x, conf_bands = 0.10)
Calculates densities of hyperparameters or coefficient draws from Bayesian
VAR models generated via bvar
. Wraps standard
density
outputs into a list
.
## S3 method for class 'bvar' density(x, vars = NULL, vars_response = NULL, vars_impulse = NULL, ...) ## S3 method for class 'bvar_density' plot(x, mar = c(2, 2, 2, 0.5), mfrow = c(length(x), 1), ...) independent_index(var, n_vars, lag)
## S3 method for class 'bvar' density(x, vars = NULL, vars_response = NULL, vars_impulse = NULL, ...) ## S3 method for class 'bvar_density' plot(x, mar = c(2, 2, 2, 0.5), mfrow = c(length(x), 1), ...) independent_index(var, n_vars, lag)
x |
A |
vars |
Character vector used to select variables. Elements are matched
to hyperparameters or coefficients. Coefficients may be matched based on
the dependent variable (by providing the name or position) or the
explanatory variables (by providing the name and the desired lag). See the
example section for a demonstration. Defaults to |
vars_response , vars_impulse
|
Optional character or integer vectors used to select coefficents. Dependent variables are specified with vars_response, explanatory ones with vars_impulse. See the example section for a demonstration. |
... |
|
mar |
Numeric vector. Margins for |
mfrow |
Numeric vector. Rows for |
var , n_vars , lag
|
Integer scalars. Retrieve the position of lag lag of variable var given n_vars total variables. |
Returns a list with outputs of density
.
# Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate a BVAR using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 1000L, n_burn = 200L, verbose = FALSE) # Get densities of the hyperparameters density(x) # Plot them plot(density(x)) # Only get the densities associated with dependent variable 1 density(x, vars_response = "CPI") # Check out the constant's densities plot(density(x, vars_impulse = 1)) # Get the densities of variable three's first lag density(x, vars = "FEDFUNDS-lag1") # Get densities of lambda and the coefficients of dependent variable 2 density(x, vars = c("lambda", "UNRATE"))
# Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate a BVAR using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 1000L, n_burn = 200L, verbose = FALSE) # Get densities of the hyperparameters density(x) # Plot them plot(density(x)) # Only get the densities associated with dependent variable 1 density(x, vars_response = "CPI") # Check out the constant's densities plot(density(x, vars_impulse = 1)) # Get the densities of variable three's first lag density(x, vars = "FEDFUNDS-lag1") # Get densities of lambda and the coefficients of dependent variable 2 density(x, vars = c("lambda", "UNRATE"))
Calculates fitted or residual values for Bayesian VAR models generated with
bvar
.
## S3 method for class 'bvar' fitted(object, type = c("quantile", "mean"), conf_bands = 0.5, ...) ## S3 method for class 'bvar' residuals(object, type = c("quantile", "mean"), conf_bands = 0.5, ...) ## S3 method for class 'bvar_resid' plot(x, vars = NULL, mar = c(2, 2, 2, 0.5), ...)
## S3 method for class 'bvar' fitted(object, type = c("quantile", "mean"), conf_bands = 0.5, ...) ## S3 method for class 'bvar' residuals(object, type = c("quantile", "mean"), conf_bands = 0.5, ...) ## S3 method for class 'bvar_resid' plot(x, vars = NULL, mar = c(2, 2, 2, 0.5), ...)
object |
A |
type |
Character scalar. Whether to return quantile or mean values. Note that conf_bands is ignored for mean values. |
conf_bands |
Numeric vector of confidence bands to apply.
E.g. for bands at 5%, 10%, 90% and 95% set this to |
... |
Not used. |
x |
Object of class |
vars |
Character vector used to select variables. Elements are matched
to hyperparameters or coefficients. Coefficients may be matched based on
the dependent variable (by providing the name or position) or the
explanatory variables (by providing the name and the desired lag). See the
example section for a demonstration. Defaults to |
mar |
Numeric vector. Margins for |
Returns a numeric array of class bvar_fitted
or
bvar_resid
at the specified values.
# Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate a BVAR using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 1000L, n_burn = 200L, verbose = FALSE) # Get fitted values and adjust confidence bands to 10%, 50% and 90% fitted(x, conf_bands = 0.10) # Get the residuals of variable 1 resid(x, vars = 1) ## Not run: # Get residuals and plot them plot(residuals(x)) ## End(Not run)
# Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate a BVAR using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 1000L, n_burn = 200L, verbose = FALSE) # Get fitted values and adjust confidence bands to 10%, 50% and 90% fitted(x, conf_bands = 0.10) # Get the residuals of variable 1 resid(x, vars = 1) ## Not run: # Get residuals and plot them plot(residuals(x)) ## End(Not run)
FRED-MD and FRED-QD are large macroeconomic databases, containing monthly
and quarterly time series that are frequently used in the literature. They
are intended to facilitate the reproduction of empirical work and simplify
data related tasks.
Included datasets are provided as is - transformation codes are available
in system.file("fred_trans.rds", package = "BVAR")
. These can be
applied automatically with fred_transform
.
fred_qd fred_md
fred_qd fred_md
A data.frame
object with dates as rownames.
An object of class data.frame
with 777 rows and 118 columns.
The versions of FRED-MD and FRED-QD that are provided here are licensed under a modified ODC-BY 1.0 license that can be found in the provided LICENSE file. The provided versions are subset to variables that are either in public domain or for which we were given permission to use. For further details see McCracken and Ng (2016) or https://research.stlouisfed.org/econ/mccracken/fred-databases/. We would like to thank Michael McCracken and Serena Ng, Adrienne Brennecke and the Federal Reserve Bank of St. Louis for creating, updating and making available the datasets and many of the contained time series. We also thank all other owners of included time series that permitted their use.
https://research.stlouisfed.org/econ/mccracken/fred-databases/
McCracken, M. W. and Ng, S. (2016) FRED-MD: A Monthly Database for Macroeconomic Research. Journal of Business & Economic Statistics, 34:4, 574-589, doi:10.1080/07350015.2015.1086655. McCracken, M. W., & Ng, S. (2020). FRED-QD: A Quarterly Database for Macroeconomic Research w26872. National Bureau of Economic Research.
Apply transformations given by FRED-MD or FRED-QD and generate rectangular
subsets. See fred_qd
for information on data and the Details
section for information on the transformations. Call without arguments to
retrieve available codes / all FRED suggestions.
fred_transform( data, type = c("fred_qd", "fred_md"), codes, na.rm = TRUE, lag = 1L, scale = 100 ) fred_code(vars, type = c("fred_qd", "fred_md"), table = FALSE)
fred_transform( data, type = c("fred_qd", "fred_md"), codes, na.rm = TRUE, lag = 1L, scale = 100 ) fred_code(vars, type = c("fred_qd", "fred_md"), table = FALSE)
data |
A |
type |
Character scalar. Whether data stems from the FRED-QD or the FRED-MD database. |
codes |
Integer vector. Transformation code(s) to apply to data. Overrides automatic lookup of transformation codes. |
na.rm |
Logical scalar. Whether to subset to rows without any
|
lag |
Integer scalar. Number of lags to apply when taking differences.
See |
scale |
Numeric scalar. Scaling to apply to log differences. |
vars |
Character vector. Names of the variables to look for. |
table |
Logical scalar. Whether to return a table of matching transformation codes instead of just the codes. |
FRED-QD and FRED-MD include a transformation code for every variable. All
codes are provided in system.file("fred_trans.csv", package = "BVAR")
.
The transformation codes are as follows:
1
- no transformation;
2
- first differences - ;
3
- second differences - ;
4
- log transformation - ;
5
- log differences -
;
6
- log second differences -
;
7
- percent change differences -
;
Note that the transformation codes of FRED-MD and FRED-QD may differ for the same series.
fred_transform
returns a data.frame
object with
applied transformations. fred_code
returns transformation
codes, or a data.frame
of matching transformation codes.
# Transform a subset of FRED-QD fred_transform(fred_qd[, c("GDPC1", "INDPRO", "FEDFUNDS")]) # Get info on transformation codes for unemployment variables fred_code("UNRATE", table = TRUE) # Get the transformation code for GDPC1 fred_code("GDPC1", type = "fred_qd") # Transform all of FRED-MD ## Not run: fred_transform(fred_md, type = "fred_md") ## End(Not run)
# Transform a subset of FRED-QD fred_transform(fred_qd[, c("GDPC1", "INDPRO", "FEDFUNDS")]) # Get info on transformation codes for unemployment variables fred_code("UNRATE", table = TRUE) # Get the transformation code for GDPC1 fred_code("GDPC1", type = "fred_qd") # Transform all of FRED-MD ## Not run: fred_transform(fred_md, type = "fred_md") ## End(Not run)
Function to compute a historical variance decomposition of a VAR.
## S3 method for class 'bvar' hist_decomp(x, type = c("mean", "quantile"), ...) hist_decomp(x, ...) ## Default S3 method: hist_decomp(x, ...)
## S3 method for class 'bvar' hist_decomp(x, type = c("mean", "quantile"), ...) hist_decomp(x, ...) ## Default S3 method: hist_decomp(x, ...)
x |
A |
type |
Character scalar. Whether to use median or mean values. |
... |
Not used. |
Returns a numerical array (time, variable, shock) with the results of the historical decomposition.
# Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate a BVAR using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 600L, n_burn = 100L, verbose = FALSE) # Compute historical decomposition hist_decomp(x, type = "mean")
# Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate a BVAR using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 600L, n_burn = 100L, verbose = FALSE) # Compute historical decomposition hist_decomp(x, type = "mean")
Retrieves / calculates impulse response functions (IRFs) and/or forecast
error variance decompositions (FEVDs) for Bayesian VARs generated via
bvar
. If the object is already present and no settings are
supplied it is simply retrieved, otherwise it will be calculated ex-post.
Note that FEVDs require the presence / calculation of IRFs.
To store the results you may want to assign the output using the setter
function (irf(x) <- irf(x)
). May also be used to update
confidence bands.
## S3 method for class 'bvar' irf(x, ..., conf_bands, n_thin = 1L, verbose = FALSE) ## S3 method for class 'bvar' fevd(x, ..., conf_bands, n_thin = 1L) irf(x, ...) ## Default S3 method: irf(x, ...) irf(x) <- value fevd(x, ...) ## Default S3 method: fevd(x, ...) fevd(x) <- value ## S3 method for class 'bvar_irf' summary(object, vars_impulse = NULL, vars_response = NULL, ...)
## S3 method for class 'bvar' irf(x, ..., conf_bands, n_thin = 1L, verbose = FALSE) ## S3 method for class 'bvar' fevd(x, ..., conf_bands, n_thin = 1L) irf(x, ...) ## Default S3 method: irf(x, ...) irf(x) <- value fevd(x, ...) ## Default S3 method: fevd(x, ...) fevd(x) <- value ## S3 method for class 'bvar_irf' summary(object, vars_impulse = NULL, vars_response = NULL, ...)
x , object
|
A |
... |
A |
conf_bands |
Numeric vector of confidence bands to apply.
E.g. for bands at 5%, 10%, 90% and 95% set this to |
n_thin |
Integer scalar. Every n_thin'th draw in x is used to calculate, others are dropped. |
verbose |
Logical scalar. Whether to print intermediate results and progress. |
value |
A |
vars_impulse , vars_response
|
Optional numeric or character vector.
Used to subset the summary method's outputs to certain variables by position
or name (must be available). Defaults to |
Returns a list of class bvar_irf
including IRFs and optionally
FEVDs at desired confidence bands. The fevd
method only returns a
the nested bvar_fevd
object.
The summary method returns a numeric array of impulse responses at the
specified confidence bands.
# Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate a BVAR using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 600L, n_burn = 100L, verbose = FALSE) # Compute + store IRF with a longer horizon, no identification and thinning irf(x) <- irf(x, bv_irf(horizon = 24L, identification = FALSE), n_thin = 5L) # Update the confidence bands of the IRFs irf(x, conf_bands = c(0.01, 0.05, 0.1)) # Recalculate with sign restrictions provided via the ellipsis irf(x, sign_restr = matrix(c(1, NA, NA, -1, 1, -1, -1, 1, 1), nrow = 3)) # Recalculate with zero and sign restrictions provided via the ellipsis irf(x, sign_restr = matrix(c(1, 0, 1, NA, 1, 1, -1, -1, 1), nrow = 3)) # Calculate the forecast error variance decomposition fevd(x) # Get a summary of the saved impulse response function summary(x) # Limit the summary to responses of variable #2 summary(x, vars_response = 2L)
# Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate a BVAR using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 600L, n_burn = 100L, verbose = FALSE) # Compute + store IRF with a longer horizon, no identification and thinning irf(x) <- irf(x, bv_irf(horizon = 24L, identification = FALSE), n_thin = 5L) # Update the confidence bands of the IRFs irf(x, conf_bands = c(0.01, 0.05, 0.1)) # Recalculate with sign restrictions provided via the ellipsis irf(x, sign_restr = matrix(c(1, NA, NA, -1, 1, -1, -1, 1, 1), nrow = 3)) # Recalculate with zero and sign restrictions provided via the ellipsis irf(x, sign_restr = matrix(c(1, 0, 1, NA, 1, 1, -1, -1, 1), nrow = 3)) # Calculate the forecast error variance decomposition fevd(x) # Get a summary of the saved impulse response function summary(x) # Limit the summary to responses of variable #2 summary(x, vars_response = 2L)
Calculates the log-likelihood of Bayesian VAR models generated with
bvar
.
## S3 method for class 'bvar' logLik(object, ...)
## S3 method for class 'bvar' logLik(object, ...)
object |
A |
... |
Not used. |
Returns an object of class logLik
.
# Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate a BVAR using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 1000L, n_burn = 200L, verbose = FALSE) # Calculate the log-likelihood logLik(x)
# Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate a BVAR using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 1000L, n_burn = 200L, verbose = FALSE) # Calculate the log-likelihood logLik(x)
Wrapper for bvar
to simplify parallel computation via
parLapply
. Make sure to properly start and stop the
provided cluster.
par_bvar( cl, n_runs = length(cl), data, lags, n_draw = 10000L, n_burn = 5000L, n_thin = 1L, priors = bv_priors(), mh = bv_mh(), fcast = NULL, irf = NULL )
par_bvar( cl, n_runs = length(cl), data, lags, n_draw = 10000L, n_burn = 5000L, n_thin = 1L, priors = bv_priors(), mh = bv_mh(), fcast = NULL, irf = NULL )
cl |
A |
n_runs |
The number of parallel runs to calculate. Defaults to the length of cl, i.e. the number of registered nodes. |
data |
Numeric matrix or dataframe. Note that observations are expected to be ordered from earliest to latest, and variables in the columns. |
lags |
Integer scalar. Lag order of the model. |
n_draw , n_burn
|
Integer scalar. The number of iterations to (a) cycle through and (b) burn at the start. |
n_thin |
Integer scalar. Every n_thin'th iteration is stored. For a given memory requirement thinning reduces autocorrelation, while increasing effective sample size. |
priors |
Object from |
mh |
Object from |
fcast |
Object from |
irf |
Object from |
Returns a list of class bvar_chain
with bvar
objects.
library("parallel") cl <- makeCluster(2L) # Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # A singular run using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 1000L, n_burn = 200L, verbose = FALSE) # Two parallel runs y <- par_bvar(cl, n_runs = 2, data = data, lags = 1, n_draw = 1000L, n_burn = 200L) stopCluster(cl) # Plot lambda for all of the runs ## Not run: plot(x, type = "full", vars = "lambda", chains = y) # Convert the hyperparameter lambda to a coda mcmc.list object coda::as.mcmc(y, vars = "lambda") ## End(Not run)
library("parallel") cl <- makeCluster(2L) # Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # A singular run using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 1000L, n_burn = 200L, verbose = FALSE) # Two parallel runs y <- par_bvar(cl, n_runs = 2, data = data, lags = 1, n_draw = 1000L, n_burn = 200L) stopCluster(cl) # Plot lambda for all of the runs ## Not run: plot(x, type = "full", vars = "lambda", chains = y) # Convert the hyperparameter lambda to a coda mcmc.list object coda::as.mcmc(y, vars = "lambda") ## End(Not run)
Method to plot trace and densities of coefficient, hyperparameter and
marginal likelihood draws obtained from bvar
. Several types of
plot are available via the argument type, including traces, densities,
plots of forecasts and impulse responses.
## S3 method for class 'bvar' plot( x, type = c("full", "trace", "density", "irf", "fcast"), vars = NULL, vars_response = NULL, vars_impulse = NULL, chains = list(), mar = c(2, 2, 2, 0.5), ... )
## S3 method for class 'bvar' plot( x, type = c("full", "trace", "density", "irf", "fcast"), vars = NULL, vars_response = NULL, vars_impulse = NULL, chains = list(), mar = c(2, 2, 2, 0.5), ... )
x |
A |
type |
A string with the type of plot desired. The default option
|
vars |
Character vector used to select variables. Elements are matched
to hyperparameters or coefficients. Coefficients may be matched based on
the dependent variable (by providing the name or position) or the
explanatory variables (by providing the name and the desired lag). See the
example section for a demonstration. Defaults to |
vars_response , vars_impulse
|
Optional character or integer vectors used to select coefficents. Dependent variables are specified with vars_response, explanatory ones with vars_impulse. See the example section for a demonstration. |
chains |
List of |
mar |
Numeric vector. Margins for |
... |
Other graphical parameters for |
Returns x invisibly.
bvar
; plot.bvar_fcast
;
plot.bvar_irf
.
# Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate a BVAR using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 1000L, n_burn = 200L, verbose = FALSE) # Plot full traces and densities plot(x) # Only plot the marginal likelihood's trace plot(x, "trace", "ml") # Access IRF and forecast plotting functions plot(x, type = "irf", vars_response = 2) plot(x, type = "fcast", vars = 2)
# Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate a BVAR using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 1000L, n_burn = 200L, verbose = FALSE) # Plot full traces and densities plot(x) # Only plot the marginal likelihood's trace plot(x, "trace", "ml") # Access IRF and forecast plotting functions plot(x, type = "irf", vars_response = 2) plot(x, type = "fcast", vars = 2)
Plotting method for forecasts obtained from predict.bvar
.
Forecasts of all or a subset of the available variables can be plotted.
## S3 method for class 'bvar_fcast' plot( x, vars = NULL, col = "#737373", t_back = 1, area = FALSE, fill = "#808080", variables = NULL, orientation = c("vertical", "horizontal"), mar = c(2, 2, 2, 0.5), ... )
## S3 method for class 'bvar_fcast' plot( x, vars = NULL, col = "#737373", t_back = 1, area = FALSE, fill = "#808080", variables = NULL, orientation = c("vertical", "horizontal"), mar = c(2, 2, 2, 0.5), ... )
x |
A |
vars |
Optional numeric or character vector. Used to subset the plot to
certain variables by position or name (must be available). Defaults to
|
col |
Character vector. Colour(s) of the lines delineating credible
intervals. Single values will be recycled if necessary. Recycled HEX color
codes are varied in transparency if not provided (e.g. "#737373FF"). Lines
can be bypassed by setting this to |
t_back |
Integer scalar. Number of observed datapoints to plot ahead of the forecast. |
area |
Logical scalar. Whether to fill the credible intervals using
|
fill |
Character vector. Colour(s) to fill the credible intervals with. See col for more information. |
variables |
Optional character vector. Names of all variables in the
object. Used to subset and title. Taken from |
orientation |
String indicating the orientation of the plots. Defaults
to |
mar |
Numeric vector. Margins for |
... |
Other graphical parameters for |
Returns x invisibly.
# Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate a BVAR using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 1000L, n_burn = 200L, verbose = FALSE) # Store predictions ex-post predict(x) <- predict(x) # Plot forecasts for all available variables plot(predict(x)) # Subset to variables in positions 1 and 3 via their name plot(predict(x), vars = c("CPI", "FED")) # Subset via position, increase the plotted forecast horizon and past data plot(predict(x, horizon = 20), vars = c(1, 3), t_back = 10) # Adjust confidence bands and the plot's orientation plot(predict(x, conf_bands = 0.25), orientation = "h") # Draw areas inbetween the confidence bands and skip drawing lines plot(predict(x), col = "transparent", area = TRUE) # Plot a conditional forecast (with a constrained second variable). plot(predict(x, cond_path = c(1, 1, 1, 1, 1, 1), cond_var = 2))
# Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate a BVAR using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 1000L, n_burn = 200L, verbose = FALSE) # Store predictions ex-post predict(x) <- predict(x) # Plot forecasts for all available variables plot(predict(x)) # Subset to variables in positions 1 and 3 via their name plot(predict(x), vars = c("CPI", "FED")) # Subset via position, increase the plotted forecast horizon and past data plot(predict(x, horizon = 20), vars = c(1, 3), t_back = 10) # Adjust confidence bands and the plot's orientation plot(predict(x, conf_bands = 0.25), orientation = "h") # Draw areas inbetween the confidence bands and skip drawing lines plot(predict(x), col = "transparent", area = TRUE) # Plot a conditional forecast (with a constrained second variable). plot(predict(x, cond_path = c(1, 1, 1, 1, 1, 1), cond_var = 2))
Plotting method for impulse responses obtained from irf.bvar
.
Impulse responses of all or a subset of the available variables can be
plotted.
## S3 method for class 'bvar_irf' plot( x, vars_response = NULL, vars_impulse = NULL, col = "#737373", area = FALSE, fill = "#808080", variables = NULL, mar = c(2, 2, 2, 0.5), ... )
## S3 method for class 'bvar_irf' plot( x, vars_response = NULL, vars_impulse = NULL, col = "#737373", area = FALSE, fill = "#808080", variables = NULL, mar = c(2, 2, 2, 0.5), ... )
x |
A |
vars_impulse , vars_response
|
Optional numeric or character vector. Used
to subset the plot's impulses / responses to certain variables by position
or name (must be available). Defaults to |
col |
Character vector. Colour(s) of the lines delineating credible
intervals. Single values will be recycled if necessary. Recycled HEX color
codes are varied in transparency if not provided (e.g. "#737373FF"). Lines
can be bypassed by setting this to |
area |
Logical scalar. Whether to fill the credible intervals using
|
fill |
Character vector. Colour(s) to fill the credible intervals with. See col for more information. |
variables |
Optional character vector. Names of all variables in the
object. Used to subset and title. Taken from |
mar |
Numeric vector. Margins for |
... |
Other graphical parameters for |
Returns x invisibly.
# Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate a BVAR using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 1000L, n_burn = 200L, verbose = FALSE) # Store IRFs ex-post irf(x) <- irf(x) # Plot impulse responses for all available variables plot(irf(x)) # Subset to impulse variables in positions 2 and 3 via their name plot(irf(x), vars_impulse = c(2, 3)) # Subset via position and increase the plotted IRF horizon plot(irf(x, horizon = 20), vars_impulse = c("UNRATE", "FED")) # Adjust confidence bands and subset to one response variables plot(irf(x, conf_bands = 0.25), vars_response = "CPI") # Draw areas inbetween the confidence bands and skip drawing lines plot(irf(x), col = "transparent", area = TRUE) # Subset to a specific impulse and response plot(irf(x), vars_response = "CPI", vars_impulse = "FED")
# Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate a BVAR using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 1000L, n_burn = 200L, verbose = FALSE) # Store IRFs ex-post irf(x) <- irf(x) # Plot impulse responses for all available variables plot(irf(x)) # Subset to impulse variables in positions 2 and 3 via their name plot(irf(x), vars_impulse = c(2, 3)) # Subset via position and increase the plotted IRF horizon plot(irf(x, horizon = 20), vars_impulse = c("UNRATE", "FED")) # Adjust confidence bands and subset to one response variables plot(irf(x, conf_bands = 0.25), vars_response = "CPI") # Draw areas inbetween the confidence bands and skip drawing lines plot(irf(x), col = "transparent", area = TRUE) # Subset to a specific impulse and response plot(irf(x), vars_response = "CPI", vars_impulse = "FED")
Retrieves / calculates forecasts for Bayesian VARs generated via
bvar
. If a forecast is already present and no settings are
supplied it is simply retrieved, otherwise it will be calculated.
To store the results you may want to assign the output using the setter
function (predict(x) <- predict(x)
). May also be used to update
confidence bands.
## S3 method for class 'bvar' predict(object, ..., conf_bands, n_thin = 1L, newdata) predict(object) <- value ## S3 method for class 'bvar_fcast' summary(object, vars = NULL, ...)
## S3 method for class 'bvar' predict(object, ..., conf_bands, n_thin = 1L, newdata) predict(object) <- value ## S3 method for class 'bvar_fcast' summary(object, vars = NULL, ...)
object |
A |
... |
A |
conf_bands |
Numeric vector of confidence bands to apply.
E.g. for bands at 5%, 10%, 90% and 95% set this to |
n_thin |
Integer scalar. Every n_thin'th draw in object is used to predict, others are dropped. |
newdata |
Optional numeric matrix or dataframe. Used to base the prediction on. |
value |
A |
vars |
Optional numeric or character vector. Used to subset the summary
to certain variables by position or name (must be available). Defaults to
|
Returns a list of class bvar_fcast
including forecasts
at desired confidence bands.
The summary method returns a numeric array of forecast paths at the
specified confidence bands.
# Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate a BVAR using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 1000L, n_burn = 200L, verbose = FALSE) # Calculate a forecast with an increased horizon y <- predict(x, horizon = 20) # Add some confidence bands and store the forecast predict(x) <- predict(x, conf_bands = c(0.05, 0.16)) # Recalculate with different settings and increased thinning predict(x, bv_fcast(24L), n_thin = 10L) # Simulate some new data to predict on predict(x, newdata = matrix(rnorm(300), ncol = 3)) # Calculate a conditional forecast (with a constrained second variable). predict(x, cond_path = c(1, 1, 1, 1, 1, 1), cond_var = 2) # Get a summary of the stored forecast summary(x) # Only get the summary for variable #2 summary(x, vars = 2L)
# Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate a BVAR using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 1000L, n_burn = 200L, verbose = FALSE) # Calculate a forecast with an increased horizon y <- predict(x, horizon = 20) # Add some confidence bands and store the forecast predict(x) <- predict(x, conf_bands = c(0.05, 0.16)) # Recalculate with different settings and increased thinning predict(x, bv_fcast(24L), n_thin = 10L) # Simulate some new data to predict on predict(x, newdata = matrix(rnorm(300), ncol = 3)) # Calculate a conditional forecast (with a constrained second variable). predict(x, cond_path = c(1, 1, 1, 1, 1, 1), cond_var = 2) # Get a summary of the stored forecast summary(x) # Only get the summary for variable #2 summary(x, vars = 2L)
Functions to compute the root mean squared error and log predictive scores.
## S3 method for class 'bvar' rmse(x, holdout, ...) ## S3 method for class 'bvar' lps(x, holdout, n_thin = 1L, ...) rmse(x, ...) ## Default S3 method: rmse(x, ...) lps(x, ...) ## Default S3 method: lps(x, ...)
## S3 method for class 'bvar' rmse(x, holdout, ...) ## S3 method for class 'bvar' lps(x, holdout, n_thin = 1L, ...) rmse(x, ...) ## Default S3 method: rmse(x, ...) lps(x, ...) ## Default S3 method: lps(x, ...)
x |
A |
holdout |
Optional numeric matrix or dataframe. Used for the out-of-sample fit. |
... |
Not used. |
n_thin |
Integer scalar. Every n_thin'th draw in x is used to calculate, others are dropped. |
Returns a matrix with measures of model fit.
# Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate a BVAR using one lag, default settings and very few draws x <- bvar(data[seq(1, nrow(data) - 5), ], lags = 1, n_draw = 600L, n_burn = 100L, verbose = FALSE) # Compute RMSE rmse(x) lps(x, holdout = data[seq(nrow(data) - 4, nrow(data)), ])
# Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate a BVAR using one lag, default settings and very few draws x <- bvar(data[seq(1, nrow(data) - 5), ], lags = 1, n_draw = 600L, n_burn = 100L, verbose = FALSE) # Compute RMSE rmse(x) lps(x, holdout = data[seq(nrow(data) - 4, nrow(data)), ])
Retrieves several outputs of interest, including the median coefficient matrix, the median variance-covariance matrix, and the log-likelihood. Separate summary methods exist for impulse responses and forecasts.
## S3 method for class 'bvar' summary(object, ...)
## S3 method for class 'bvar' summary(object, ...)
object |
A |
... |
Not used. |
Returns a list of class bvar_summary
with elements that can
can be accessed individually:
bvar
- the bvar
object provided.
coef
- coefficient values from coef.bvar
.
vcov
- VCOV values from vcov.bvar
.
logLik
- the log-likelihood from logLik
.
# Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate a BVAR using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 1000L, n_burn = 200L, verbose = FALSE) summary(x)
# Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate a BVAR using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 1000L, n_burn = 200L, verbose = FALSE) summary(x)
Calculates the widely applicable (or Watanabe-Akaike) information criterion
(Watanabe, 2010) for VAR models generated with bvar
. The
result equals
, where 'lppd' is the log pointwise predictive density, and 'pWAIC' is the effective number of parameters.
## S3 method for class 'bvar' WAIC(x, n_thin = 1L, ...) WAIC(x, ...) ## Default S3 method: WAIC(x, ...)
## S3 method for class 'bvar' WAIC(x, n_thin = 1L, ...) WAIC(x, ...) ## Default S3 method: WAIC(x, ...)
x |
A |
n_thin |
Integer scalar. Every n_thin'th draw in x is used to calculate, others are dropped. |
... |
Not used. |
Returns a numerical value.
Watanabe, S. (2010) Asymptotic Equivalence of Bayes Cross Validation and Widely Applicable Information Criterion in Singular Learning Theory. Journal of Machine Learning Research, 11, 3571-3594.
Kuschnig, N. and Vashold, L. (2021) BVAR: Bayesian Vector Autoregressions with Hierarchical Prior Selection in R. Journal of Statistical Software, 14, 1-27, doi:10.18637/jss.v100.i14.
# Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate a BVAR using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 600L, n_burn = 100L, verbose = FALSE) # Calculate the log-likelihood WAIC(x)
# Access a subset of the fred_qd dataset data <- fred_qd[, c("CPIAUCSL", "UNRATE", "FEDFUNDS")] # Transform it to be stationary data <- fred_transform(data, codes = c(5, 5, 1), lag = 4) # Estimate a BVAR using one lag, default settings and very few draws x <- bvar(data, lags = 1, n_draw = 600L, n_burn = 100L, verbose = FALSE) # Calculate the log-likelihood WAIC(x)