An S-vine model combines marginal distributions with a stationary vine copula. The package exposes these two layers separately:
svine() fits a complete distribution model to observed
data. It estimates the marginal distributions, transforms the
observations to the unit hypercube, and fits the copula.svinecop() fits only the copula and therefore expects
approximately uniform pseudo-observations.svine_dist() and svinecop_dist() construct
models from specified margins, pair copulas, and an S-vine
structure.The argument p is the Markov order. An order-one model
relates the current observation to the previous observation, while
larger values include additional lags.
The returns data contain daily log returns of 20
companies. We use two series and restrict the candidate families to keep
this example short.
data(returns)
x <- returns[1:200, 1:2]
fit <- svine(
x,
p = 1,
margin_families = c("norm", "std"),
family_set = c("gaussian", "t")
)
fit
#> 2-dimensional S-vine distribution model of order p = 1 ('svine_dist')
summary(fit)
#> $margins
#> # A data.frame: 2 x 5
#> margin name model parameters loglik
#> 1 Allianz Normal 0.00034, 0.01536 551
#> 2 AXA Student-t 0.0019, 0.0197, 4.0004 522
#>
#> $copula
#> # A data.frame: 5 x 10
#> tree edge conditioned conditioning var_types family rotation parameters
#> 1 1 3, 1 c,c t 0 -0.084, 4.781
#> 1 2 2, 1 c,c t 0 0.84, 4.87
#> 2 1 4, 1 3 c,c gaussian 0 -0.064
#> 2 2 3, 2 1 c,c gaussian 0 0.074
#> 3 1 4, 2 1, 3 c,c gaussian 0 -0.072
#> df tau
#> 2 -0.054
#> 2 0.637
#> 1 -0.041
#> 1 0.047
#> 1 -0.046The fitted object contains the marginal models in
fit$margins and the copula model in
fit$copula. Standard rvinecopulib methods can
be applied to the copula component.
Without a conditioning history, svine_sim() generates a
new stationary time series. Supplying past instead
generates paths conditional on the observed history.
sim <- svine_sim(n = 100, rep = 1, model = fit)
dim(sim)
#> [1] 100 2
next_obs <- svine_sim(n = 1, rep = 100, model = fit, past = x)
dim(next_obs)
#> dim
#> 1 2 100Pseudo-residuals are conditional Rosenblatt transforms. For a fitted
model of order p, the result has NROW(x) - p
rows.
For discrete variables, specify var_types = "d" and
restrict margin_families to suitable discrete families. The
following model uses two Poisson margins.
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,] 2 5
#> [2,] 0 1
#> [3,] 5 5
#> [4,] 6 7
#> [5,] 2 3svine() evaluates both the CDF, F(x), and
its left limit, F(x-), and constructs the copula data
automatically. When calling svinecop() directly, supply the
regular CDF columns first, followed by one left-limit column for each
discrete variable.
When the marginal transformation is handled separately, fit the copula layer directly.
u <- pseudo_obs(x)
copula_fit <- svinecop(
u,
p = 1,
family_set = c("gaussian", "t")
)
copula_fit
#> 2-dimensional S-vine copula model of order p = 1 ('svinecop_dist')Use svinecop_loglik(), svinecop_scores(),
and svinecop_hessian() for copula-level inference. The
corresponding svine_* functions include the marginal
parameters.