All types of copula process can be combined with a v-transform to model volatile time series.
VT-ARMA processes are created by adding a v-transform to an
armacopula process using the command vtscopula
. The generic
commands sim
, fit
and plot
also
work for these processes.
This example uses a ARMA(1,1) copula and an off-centre linear v-transform. We set up the model and generate some data.
<- vtscopula(armacopula(list(ar = 0.95, ma = -0.85)),
vtarma11 Vtransform = Vlinear(delta = 0.6))
vtarma11#> object class: vtscopula
#> ____________
#> Base copula:
#> object class: armacopula
#> name: ARMA(1,1)
#> parameters:
#> ar1 ma1
#> 0.95 -0.85
#> ____________
#> V-transform:
#> name: Vlinear
#> parameters:
#> delta
#> 0.6
set.seed(19)
<- sim(vtarma11, 2000)
data ts.plot(data)
We now fit the model with a fixed value for the fulcrum parameter \(\delta\) and plot the results. (More on fulcrum choice next.)
<- vtscopula(armacopula(list(ar = 0, ma = 0)), Vtransform = Vlinear(delta = 0.6))
vtarma11spec <- fit(vtarma11spec, data)
vtarma11fit
vtarma11fit#> object class: vtscopula
#> ____________
#> Base copula:
#> object class: armacopula
#> name: ARMA(1,1)
#> parameters:
#> ar1 ma1
#> 0.9538201 -0.8531713
#> ____________
#> V-transform:
#> name: Vlinear
#> parameters:
#> delta
#> 0.6
#> _____________________
#> Summary of estimates:
#> ar.ar1 ma.ma1
#> 0.9538201 -0.8531713
#> convergence status: 0, log-likelihood: 102.2355
plot(vtarma11fit)
plot(vtarma11fit, plottype = "vtransform")
plot(vtarma11fit, plottype = "kendall" )
Optimization over the fulcrum parameter \(\delta\) does not take place. To identify a reasonable value for \(\delta\) we can carry a profile likelihood analysis using different fixed values for the fulcrum parameter.
profilefulcrum(data, tscopula = vtarma11spec, locations = seq(from = 0, to = 1, length = 11))
abline(v = 0.6)
VT-D-Vine processes are created by adding a v-transform to an
dvinecopula2
object using the command
vtscopula
. The generic commands sim
,
fit
and plot
also work for these
processes.
We add a 2-parameter V-transform.
<- dvinecopula2(family = "joe",
copmod kpacf = "kpacf_arma",
pars = list(ar = 0.9, ma = -0.85),
maxlag = 20)
<- vtscopula(copmod,
vcopmod Vtransform = V2p(delta = 0.6, kappa = 0.8)
)
vcopmod#> object class: vtscopula
#> ____________
#> Base copula:
#> object class: dvinecopula2
#> name: type2-d-vine
#> copula family: joe
#> KPACF: kpacf_arma with max lag 20
#> parameters:
#> ar ma
#> 0.90 -0.85
#> ____________
#> V-transform:
#> name: V2p
#> parameters:
#> delta kappa
#> 0.6 0.8
set.seed(13)
<- sim(vcopmod, n = 2000)
data2 hist(data2)
ts.plot(data2)
<- dvinecopula2(family = "joe",
copspec_Joe pars = list(ar = 0, ma = 0),
maxlag = 30)
<- vtscopula(copspec_Joe, V2p(delta = 0.6))
vcopspec <- fit(vcopspec, data2,
vcopfit tsoptions = list(hessian = TRUE),
control = list(maxit = 1000))
vcopfit#> object class: vtscopula
#> ____________
#> Base copula:
#> object class: dvinecopula2
#> name: type2-d-vine
#> copula family: joe
#> KPACF: kpacf_arma with max lag 30
#> parameters:
#> ar ma
#> 0.8973846 -0.8434568
#> ____________
#> V-transform:
#> name: V2p
#> parameters:
#> delta kappa
#> 0.6000000 0.7743815
#> _____________________
#> Summary of estimates:
#> ar ma vt.kappa
#> par 0.89738462 -0.84345681 0.77438147
#> se 0.01948549 0.02531814 0.06339235
#> convergence status: 0, log-likelihood: 48.57659
coef(vcopfit)
#> ar ma delta kappa
#> 0.8973846 -0.8434568 0.6000000 0.7743815
coef(vcopmod)
#> ar ma delta kappa
#> 0.90 -0.85 0.60 0.80
We can plot the estimated v-transform and well as the goodness-of-fit
plots for the dvinecopula2
object based on Kendall rank
correlations.
plot(vcopfit, plottype = "vtransform")
plot(vcopfit, plottype = "kendall")
plot(vcopfit, plottype = "residual")