An R package that provides functionality to fit and simulate from stationary vine copula models for time series.
The package is built on top of rvinecopulib and univariateML.
Install the released version from CRAN.
install.packages("svines")Install the development version from GitHub with
remotes.
# install.packages("remotes")
remotes::install_github("tnagler/svines")For detailed documentation and examples, see the package website.
Use svine() for observed data: it estimates the marginal
distributions and the S-vine copula. Use svinecop() when
the margins have already been transformed to approximately uniform
pseudo-observations.
library(svines)
data(returns) # data set of stock returns
returns <- returns[1:500, 1:2]fit <- svine(returns, p = 1) # Markov order 1
summary(fit)
#> $margins
#> # A data.frame: 2 x 5
#> margin name model parameters loglik
#> 1 Allianz Skew Student-t 0.00039, 0.01589, 5.45534, 0.91785 1382
#> 2 AXA Skew Student-t 0.00052, 0.02089, 4.35198, 0.90611 1260
#>
#> $copula
#> # A data.frame: 5 x 10
#> tree edge conditioned conditioning var_types family rotation parameters df
#> 1 1 3, 2 c,c t 0 0.037, 4.893 2
#> 1 2 2, 1 c,c t 0 0.86, 3.48 2
#> 2 1 4, 2 3 c,c joe 90 1.1 1
#> 2 2 3, 1 2 c,c indep 0 0
#> 3 1 4, 1 2, 3 c,c t 0 0.079, 8.994 2
#> tau
#> 0.023
#> 0.662
#> -0.033
#> 0.000
#> 0.051contour(fit$copula)
svine_sim() can be used in two different ways:
sim <- svine_sim(n = 500, rep = 1, model = fit)
pairs(sim)
pairs(returns)
sim <- svine_sim(n = 1, rep = 100, model = fit, past = returns)
pairs(t(sim[1, , ]))
To generate bootstrap replicates with the one-step block multiplier bootstrap, use
set.seed(2026)
models <- svine_bootstrap_models(2, fit)
summary(models[[1]])
#> $margins
#> # A data.frame: 2 x 5
#> margin name model parameters loglik
#> 1 Allianz Skew Student-t 0.00057, 0.01437, 7.22824, 0.97850 NA
#> 2 AXA Skew Student-t 0.00065, 0.01842, 5.29395, 0.98127 NA
#>
#> $copula
#> # A data.frame: 5 x 10
#> tree edge conditioned conditioning var_types family rotation parameters df
#> 1 1 3, 2 c,c t 0 -0.022, 5.380 2
#> 1 2 2, 1 c,c t 0 0.84, 2.99 2
#> 2 1 4, 2 3 c,c joe 90 1 1
#> 2 2 3, 1 2 c,c indep 0 0
#> 3 1 4, 1 2, 3 c,c t 0 0.11, 6.83 2
#> tau
#> -0.014
#> 0.634
#> -0.008
#> 0.000
#> 0.068Declare discrete variables through var_types and
restrict their marginal families to suitable discrete distributions. The
following model uses Poisson margins and a Gaussian pair-copula
family.
counts <- cbind(
claims = rpois(250, lambda = 2),
events = rpois(250, lambda = 4)
)
fit_discrete <- svine(
counts,
p = 1,
var_types = c("d", "d"),
margin_families = "pois",
family_set = "gaussian"
)
fit_discrete
#> 2-dimensional S-vine distribution model of order p = 1 ('svine_dist')
svine_sim(5, rep = 1, model = fit_discrete)
#> claims events
#> [1,] 3 4
#> [2,] 0 5
#> [3,] 0 1
#> [4,] 3 5
#> [5,] 1 1svine() constructs the required CDF and left-limit CDF
values automatically. Users calling svinecop() directly
must supply all regular F(x) columns, followed by one
F(x-) column for each discrete variable.
Nagler, T., Krüger, D., and Min, A. (2022). Stationary vine copula models for multivariate time series. Journal of Econometrics, 227(2), pp. 305-324 [pdf] [doi]