Search code examples
rmixturecopula

How to solve for mixed copula weight coefficients using EM algorithm?


In R language, I want to solve the weight coefficients of a multidimensional hybrid copula, it is better to be able to use different copula functions, or for a fixed copula function(clayton,gumbel,frank copula) if the conditions are restricted. Use EM algorithm or some other algorithm to calculate the weight coefficients. Thank you very much for your professional advice and guidance!

library(copula)
### Input three-dimension data :
x1 <- rnorm(n=1000,mean = 0.5,sd = 0.1)
x2 <- rlnorm(n = 1000,meanlog = 0.5,sdlog = 0.01)
x3 <- runif(n = 1000,min = 0.2,max = 0.8)
data<-matrix(c(x1,x2,x3),1000,3)
### mixture copula type:   clayton + gumbel + frank copula (or + normal copula \ t copula)
###for example:
copula1 <- mixCopula(list( claytonCopula  (param = 1.3,dim = 3),
                           frankCopula    (param = 2.718,dim = 3),
                           gumbelCopula   (param = 4.58,dim = 3)))
###EM algothrim.   
### output :  weight of mixture copula

Solution

  • To form a mixture copula model, you can use the 'Copula' package in R.

    Here you go:

    MixCop <- mixCopula(list(frankCopula(9,dim=3), claytonCopula(4, dim=3))) ## form the model
    CopD <- rCopula(300, MixCop) ## generate the data 
    Res <- fitCopula(CopD) ## estimate the model
    

    based on your updated question:

    library(copula)
    ### Input three-dimension data :
    x1 <- rnorm(n=1000,mean = 0.5,sd = 0.1)
    x2 <- rlnorm(n = 1000,meanlog = 0.5,sdlog = 0.01)
    x3 <- runif(n = 1000,min = 0.2,max = 0.8)
    data <- cbind(x1, x2,x3)
    Copdat <- pobs(data)## transform the data to copula data 
    ### mixture copula type:   clayton + gumbel + frank copula (or + normal copula \ t copula)
    ###for example:
    copula1 <- mixCopula(list( claytonCopula  (param = 1.3,dim = 3),
                               frankCopula    (param = 2.718,dim = 3),
                               gumbelCopula   (param = 4.58,dim = 3)))
    cop <- fitCopula(copula1, Copdat)
    

    The result:

    > cop <- fitCopula(copula1, Copdat)
    Warning messages:
    1: In .local(copula, tau, ...) :
      For the Gumbel copula, tau must be >= 0. Replacing negative values by 0.
    2: In fitCopula.ml(copula, u = data, method = method, start = start,  :
      var.mpl(copula, u) failed: system is computationally singular: reciprocal condition number = 6.5821e-29
    > cop
    Call: fitCopula(copula1, data = Copdat)
    Fit based on "maximum pseudo-likelihood" and 1000 3-dimensional observations.
    Copula: mixExplicitCopula 
     m1.alpha  m2.alpha  m3.alpha        w1        w2        w3 
    3.893e+00 8.883e-01 1.000e+00 5.682e-14 1.060e-10 1.000e+00 
    The maximized loglikelihood is -2.649e-06 
    Optimization converged
    

    I advise you to try other types of copula functions for your data.

    Hope this helps