dsge

Dynamic Stochastic General Equilibrium Models for R.

Overview

The dsge package provides tools for specifying, solving, and estimating DSGE models by maximum likelihood and Bayesian methods. It supports:

Postestimation tools include policy and transition matrix extraction, stability diagnostics, impulse-response functions with confidence/credible bands, and forecasting with fan charts.

Installation

# Install from source
install.packages("path/to/dsge", repos = NULL, type = "source")

# Or using devtools
devtools::install("path/to/dsge")

Quick Start: Maximum Likelihood

library(dsge)

# Define a simple New Keynesian model
nk <- dsge_model(
  obs(p   ~ beta * lead(p) + kappa * x),
  unobs(x ~ lead(x) - (r - lead(p) - g)),
  obs(r   ~ psi * p + u),
  state(u ~ rhou * u),
  state(g ~ rhog * g),
  fixed = list(beta = 0.96),
  start = list(kappa = 0.1, psi = 1.5, rhou = 0.7, rhog = 0.9)
)

# Estimate the model
fit <- estimate(nk, data = your_data)
summary(fit)

# Postestimation
policy_matrix(fit)
transition_matrix(fit)
stability(fit)

# Impulse-response functions (with plot)
irfs <- irf(fit, periods = 20)
plot(irfs)

# Forecast (with plot)
fc <- forecast(fit, horizon = 12)
plot(fc)

Bayesian Estimation

Bayesian estimation is available for linear DSGE models via adaptive Random-Walk Metropolis-Hastings (RWMH).

library(dsge)

# Define the model (same syntax as ML)
nk <- dsge_model(
  obs(p   ~ beta * lead(p) + kappa * x),
  unobs(x ~ lead(x) - (r - lead(p) - g)),
  obs(r   ~ psi * p + u),
  state(u ~ rhou * u),
  state(g ~ rhog * g),
  start = list(beta = 0.95, kappa = 0.15, psi = 1.5, rhou = 0.7, rhog = 0.9)
)

# Specify priors
my_priors <- list(
  beta  = prior("beta", shape1 = 95, shape2 = 5),
  kappa = prior("beta", shape1 = 30, shape2 = 70),
  psi   = prior("gamma", shape = 184, rate = 122.7),
  rhou  = prior("beta", shape1 = 70, shape2 = 20),
  rhog  = prior("beta", shape1 = 70, shape2 = 20)
  # shock SDs default to inv_gamma(0.01, 0.01)
)

# Run MCMC
fit <- bayes_dsge(nk, data = your_data, priors = my_priors,
                  chains = 2, iter = 10000, warmup = 5000)

# Results
summary(fit)                        # posterior table with ESS, R-hat

# MCMC diagnostics
plot(fit, type = "trace")            # trace plots (all chains)
plot(fit, type = "density")          # posterior density + prior overlay
plot(fit, type = "prior_posterior")   # dedicated prior-vs-posterior
plot(fit, type = "running_mean")     # cumulative mean convergence
plot(fit, type = "acf")              # autocorrelation diagnostics
plot(fit, type = "pairs")            # pairwise scatter + correlations
plot(fit, type = "all")              # combined trace + density panel

# Parameter selection (works with all diagnostic types)
plot(fit, type = "trace", pars = c("kappa", "psi"))

# Posterior IRFs with credible bands
plot(fit, type = "irf", periods = 12)

Supported prior distributions: normal, beta, gamma, uniform, inv_gamma.

Plotting: All plot types support a pars argument for parameter selection (e.g., pars = c("kappa", "psi")). Pagination handles any number of parameters. Forecast plotting is not yet available for Bayesian fits.

Nonlinear DSGE Example

library(dsge)

# Define a nonlinear RBC model
rbc <- dsgenl_model(
  "1/C = beta / C(+1) * (alpha * exp(Z) * K^(alpha-1) + 1 - delta)",
  "K(+1) = exp(Z) * K^alpha - C + (1 - delta) * K",
  "Z(+1) = rho * Z",
  observed = "C",
  endo_state = "K",
  exo_state = "Z",
  fixed = list(alpha = 0.33, beta = 0.99, delta = 0.025),
  start = list(rho = 0.9),
  ss_guess = c(C = 2, K = 30, Z = 0)
)

# Compute steady state
ss <- steady_state(rbc, params = c(alpha = 0.33, beta = 0.99,
                                    delta = 0.025, rho = 0.9))

# Solve (linearize + Klein solver)
sol <- solve_dsge(rbc, params = c(alpha = 0.33, beta = 0.99,
                                   delta = 0.025, rho = 0.9))

# IRFs and postestimation work identically to linear models
irfs <- irf(sol, periods = 40, se = FALSE)
plot(irfs)

Try It Yourself in RStudio

The package ships with self-contained demo scripts. After installing:

library(dsge)

# AR(1) model demo (simplest case)
source(system.file("examples", "demo_ar1.R", package = "dsge"))

# New Keynesian model demo (multivariate)
source(system.file("examples", "demo_nk.R", package = "dsge"))

# Nonlinear RBC model demo (first-order perturbation)
source(system.file("examples", "demo_rbc.R", package = "dsge"))

# Bayesian NK with real FRED data (requires internet; ~10 min)
source(system.file("examples", "bayesian_nk_fred.R", package = "dsge"))

# Bayesian nonlinear NK model (~15-25 min)
source(system.file("examples", "bayesian_nk_nonlinear.R", package = "dsge"))

# Bayesian nonlinear RBC with capital — quick demo (~2.5 min)
source(system.file("examples", "bayesian_rbc_capital_demo.R", package = "dsge"))

What This Package Currently Supports

Included in v0.4.0:

Not yet supported (planned for future releases):

Validation

The package has been validated on:

Key Features

Model Syntax

Variables are declared by their role in the model:

Wrapper Role Example
obs() Observed control variable obs(p ~ beta * lead(p) + kappa * x)
unobs() Unobserved control variable unobs(x ~ lead(x) - r)
state() State variable (with shock) state(u ~ rho * u)
state(, shock = FALSE) Endogenous state (no shock) state(k ~ delta * k, shock = FALSE)

References

License

MIT