mixCopula {copula} | R Documentation |
Create Mixture of Copulas
Description
A mixture of m
copulas of dimension d
with weights
w_j
, j=1,2,\ldots,m
is itself a d
-dimensional copula,
with cumulative distribution function
C(x) = \sum_{j=1}^m w_j C_j(x),
and (probability) density function
c(x) = \sum_{j=1}^m w_j c_j(x),
where C_j
are the CDFs and c_j
are the
densities of the m
component copulas,
j=1,2,\ldots,m
.
Usage
mixCopula(coplist, w = NULL)
Arguments
coplist |
a |
w |
numeric vector of length |
Details
It easy to see that the tail dependencies lambda()
and
Spearman's rank correlation rho()
can be computed as
mixture of the individual measures.
Value
See Also
khoudrajiCopula
, rotCopula
also create new
copula models from existing ones.
Examples
mC <- mixCopula(list(gumbelCopula(2.5, dim=3),
claytonCopula(pi, dim=3),
tCopula(0.7, dim=3)),
c(2,2,4)/8)
mC
stopifnot(dim(mC) == 3)
set.seed(17)
uM <- rCopula(600, mC)
splom2(uM, main = "mixCopula( (gumbel, clayton, t-Cop) )")
d.uM <- dCopula(uM, mC)
p.uM <- pCopula(uM, mC)
## mix a Gumbel with a rotated Gumbel (with equal weights 1/2):
mGG <- mixCopula(list(gumbelCopula(2), rotCopula(gumbelCopula(1.5))))
rho(mGG) # 0.57886
lambda(mGG)# both lower and upper tail dependency
loglikCopula(c(2.5, pi, rho.1=0.7, df = 4, w = c(2,2,4)/8),
u = uM, copula = mC)
## define (profiled) log-likelihood function of two arguments (df, rho) :
ll.df <- Vectorize(function(df, rho)
loglikCopula(c(2.5, pi, rho.1=rho, df=df, w = c(2,2,4)/8),
uM, mC))
(df. <- 1/rev(seq(1/8, 1/2, length=21)))# in [2, 8] equidistant in 1/. scale
ll. <- ll.df(df., rho = (rh1 <- 0.7))
plot(df., ll., type = "b", main = "loglikCopula((.,.,rho = 0.7, df, ..), u, <mixCopula>)")
if(!exists("Xtras")) Xtras <- copula:::doExtras() ; cat("Xtras: ", Xtras,"\n")
if (Xtras) withAutoprint({
Rhos <- seq(0.55, 0.70, by = 0.01)
ll.m <- matrix(NA, nrow=length(df.), ncol=length(Rhos))
for(k in seq_along(Rhos)) ll.m[,k] <- ll.df(df., rho = Rhos[k])
tit <- "loglikelihood(<tCop>, true param. for rest)"
persp (df., Rhos, ll.m, phi=30, theta = 50, ticktype="detailed", main = tit)
filled.contour(df., Rhos, ll.m, xlab="df", ylab = "rho", main = tit)
})
## fitCopula() example -----------------------------------------------------
## 1) with "fixed" weights :
(mNt <- mixCopula(list(normalCopula(0.95), tCopula(-0.7)), w = c(1, 2) / 3))
set.seed(1452) ; U <- pobs(rCopula(1000, mNt))
(m1 <- mixCopula(list(normalCopula(), tCopula()), w = mNt@w))
getTheta(m1, freeOnly = TRUE, attr = TRUE)
getTheta(m1, named=TRUE)
isFree(m1) # all of them; --> now fix the weights :
fixedParam(m1) <- fx <- c(FALSE, FALSE, FALSE, TRUE, TRUE)
stopifnot(identical(isFree(m1), !fx))
if(Xtras) withAutoprint({ ## time
system.time( # ~ 16 sec (nb-mm4) :
fit <- fitCopula(m1, start = c(0, 0, 10), data = U)
)
fit
summary(fit) #-> incl 'Std.Error' (which seems small for rho1 !)
})
## 2) with "free" weights (possible since copula 1.0-0):
(mNt2 <- mixCopula(list(normalCopula(0.9), tCopula(-0.8)), w = c(1, 3) / 4))
set.seed(1959) ; U2 <- pobs(rCopula(2000, mNt2))
if(Xtras) withAutoprint({ ## time
m2 <- mixCopula(list(normalCopula(), tCopula()), w = mNt@w)
system.time( # ~ 13.5 sec (lynne) :
f2 <- fitCopula(m2, start = c(0, 0, 10, c(1/2, 1/2)), data = U2)
)
f2
summary(f2) # NA for 'Std. Error' as did *not* estimate.variance
summary(f2, orig=FALSE) # default 'orig=TRUE': w-scale; whereas
coef(f2, orig=FALSE) # 'orig=FALSE' => shows 'l-scale' instead
})
[Package copula version 1.1-3 Index]