R/copdepmeas.R

Defines functions bb1.b2cpar hr.b2cpar gal.b2cpar gum.b2cpar joe.b2cpar mtcj.b2cpar frk.b2cpar pla.b2cpar bvt.lm2cpar bvt.cpar2lm bvt.b2cpar bvt.cpar2b bvn.rhoS2cpar bvn.cpar2rhoS bvn.cpar2b bvn.b2cpar hr.lm2cpar hr.cpar2lm gal.lm2cpar gal.cpar2lm mtcj.lm2cpar mtcj.cpar2lm gum.lm2cpar gum.cpar2lm joe.lm2cpar joe.cpar2lm hr.cpar2rhoS hr.cpar2tau gal.cpar2rhoS gal.cpar2tau gum.cpar2rhoS joe.cpar2tau sibuyader mtcj.tau2cpar mtcj.cpar2tau gum.tau2cpar gum.cpar2tau frk.cpar2rhoS frk.cpar2tau debye2 debye pla.rhoS2cpar pla.cpar2rhoS

Documented in bb1.b2cpar bvn.b2cpar bvn.cpar2b bvn.cpar2rhoS bvn.rhoS2cpar bvt.b2cpar bvt.cpar2b bvt.cpar2lm bvt.lm2cpar frk.b2cpar frk.cpar2rhoS frk.cpar2tau gal.b2cpar gal.cpar2lm gal.cpar2rhoS gal.cpar2tau gal.lm2cpar gum.b2cpar gum.cpar2lm gum.cpar2rhoS gum.cpar2tau gum.lm2cpar gum.tau2cpar hr.b2cpar hr.cpar2lm hr.cpar2rhoS hr.cpar2tau hr.lm2cpar joe.b2cpar joe.cpar2lm joe.cpar2tau joe.lm2cpar mtcj.b2cpar mtcj.cpar2lm mtcj.cpar2tau mtcj.lm2cpar mtcj.tau2cpar pla.b2cpar pla.cpar2rhoS pla.rhoS2cpar

# Functions for copula parameter (cpar) to/from rhoS, tau, beta=b
# and lm = lambda = tail dependence parameter(s) 
# for bivariate copula families.

# cpar is abbreviation for copula parameter

# Spearman rho for Plackett copula
# In book of Hutchinson and Lai (originally due to Mardia) 
# rho= (cpar+1)/(cpar-1) - (2*cpar*log(cpar))/(cpar-1)^2
# rho'(cpar)= 1/(cpar-1) - [(cpar+1)+2*cpar*log(cpar)+2]/(cpar-1)^2
#        +4*cpar*log(cpar)/(cpar-1)^3
# cpar = copula parameter >0 except cpar=1
pla.cpar2rhoS=function(cpar)
{ ifelse(cpar==1, 0, (cpar+1)/(cpar-1) - (2*cpar*log(cpar))/(cpar-1)^2 ) }

# copula parameter given rhoS for Plackett
# vectorized input rhoS is OK
# rhoS = value of Spearman's rho
# cpar0 = starting point for Newton-Raphson iterations
# mxiter = maximum number of iterations
# eps = tolerance for convergence
# iprint = print flag for iterations
# mxstep = bound on step size for Newton-Raphson iterations
pla.rhoS2cpar=function(rhoS, cpar0=1.5,mxiter=25,eps=1.e-6,iprint=F,mxstep=10)
{ cpar=cpar0
  iter=0
  diff=1
  while(iter<mxiter & max(abs(diff))>eps)
  { cpar1=cpar-1
    cpar2=cpar1*cpar1; lgcpar=log(cpar)
    g=(cpar+1)/cpar1 - (2*cpar*lgcpar)/cpar2 -rhoS
    gp = 1/cpar1- ((cpar+1)+2*lgcpar+2)/cpar2 + 4*cpar*lgcpar/(cpar1*cpar2)
    diff=g/gp; cpar=cpar-diff
    iter=iter+1
    while(max(abs(diff))>mxstep | min(cpar)<=0) { diff=diff/2; cpar=cpar+diff }
    if(iprint) cat("iter=", iter, " cpar=", cpar, " ",g, " ",gp, "\n")
  }
  if(iter>=mxiter) { cat("did not converge\n") }
  cpar
}

# integrans for Kendall's tau for Frank copula
debye= function(t) { t/(exp(t)-1) }
debye2= function(t) { t^2/(exp(t)-1) }
frk.cpar2tau=function(cpar)
{ tem=integrate(debye,0,cpar,rel.tol=1.e-6)$value
  tem=tem/cpar
  tau=1+4*(tem-1)/cpar
  tau
}

# reference is Nelsen (1986). Comm Stat, 15(11), 3277-3285
# cpar = copula parameter >0 or <0
frk.cpar2rhoS=function(cpar)
{ tem=integrate(debye,0,cpar,rel.tol=1.e-6)$value
  tem2=integrate(debye2,0,cpar,rel.tol=1.e-6)$value
  tem=tem/cpar  # debye1
  tem2=tem2*2/cpar^2  # debye2
  rho=1+12*(tem2-tem)/cpar
  rho
}

# Kendall's tau for Gumbel is tau=(cpar-1)/cpar, for MTCJ is tau=cpar/(cpar+2)
# (also inverse functions)
# cpar = copula parameter >1, 0<tau<1
gum.cpar2tau=function(cpar) { (cpar-1)/cpar }
gum.tau2cpar=function(tau) { 1/(1-tau) }

# cpar = copula parameter >0, 0<tau<1
mtcj.cpar2tau=function(cpar) { cpar/(cpar+2) }
mtcj.tau2cpar=function(tau) { 2*tau/(1-tau) }

# function in integrand for Kendall's tau for Archimedean copula with Sibuya LT
# s* [psi'(s)]^2 for Sibuya LT
# s = positive value
# cpar = copula parameter >1
sibuyader= function(s,cpar)
{ es=exp(-s)
  psid=(1-es)^(1/cpar-1)
  psid=psid*es/cpar
  s*psid^2
}

# old version with integration has been replaced
#joe.cpar2tau= function(cpar)
#{ tem=integrate(sibuyader,0,Inf,cpar=cpar,rel.tol=1.e-6)
#  tem=tem$value
#  tau=1-4*tem
#  tau
#}

# simpler version of Kendall's tau for Joe/B5 copula
# also simpler than formula in Schepsmeier's Master's thesis
# cpar = copula parameter >1
joe.cpar2tau=function(cpar)
{ cpar1=2/cpar+1
  tem=digamma(2)-digamma(cpar1)
  tau=1+tem*2/(2-cpar)
  tau[cpar==2]=1-trigamma(2)
  tau
}

# cpar = copula parameter >1
gum.cpar2rhoS=function(cpar)
{ spgum= function(w,cpar)
  { w1=1-w
    wd=w^cpar; w1d=w1^cpar
    sm=wd+w1d
    B=sm^(1/cpar)
    tem=1/(B+1)
    tem^2
  }
  tem=integrate(spgum,0,1,cpar=cpar,rel.tol=1.e-6)
  rho=12*tem$value-3
  rho
}

# cpar = copula parameter >0
gal.cpar2tau=function(cpar)
{ # B(w) = 1- (w^cpar1+w1^cpar1)^(1/cpar1),   cpar1=-cpar
  # B'(w) =  (w^cpar1+w1^cpar1)^(1/cpar1-1) (-w^(cpar1-1) + w1^(cpar1-1) )
  taugal= function(w,cpar)
  { w1=1-w; cpar1=-cpar
    wd=w^cpar1; w1d=w1^cpar1
    sm=wd+w1d
    B=1-sm^(1/cpar1)
    Bp=(1+(w1/w)^cpar)^(1/cpar1-1) - (1+(w/w1)^cpar)^(1/cpar1-1)
    ((2*w-1)*Bp*B + w*w1*Bp*Bp )/(B*B)
  }
  tem=integrate(taugal,0,1,cpar=cpar,rel.tol=1.e-6)
  tau=tem$value
  tau
}

# cpar = copula parameter >0
gal.cpar2rhoS=function(cpar)
{ spgal= function(w,cpar)
  { w1=1-w; cpar1=-cpar
    wd=w^cpar1; w1d=w1^cpar1
    sm=wd+w1d
    B=1-sm^(1/cpar1)
    tem=1/(B+1)
    tem^2
  }
  tem=integrate(spgal,0,1,cpar=cpar,rel.tol=1.e-6)
  rho=12*tem$value-3
  rho
}

# cpar = copula parameter >0
hr.cpar2tau=function(cpar)
{ # B(w) =w\Phi\Bigl(\cpar^{-1}+\half\cpar \log {w\over 1-w}\Bigr)
  # +(1-w)\Phi\Bigl(\cpar^{-1}+\half\cpar \log {1-w\over w}\Bigr)
  # B'(w)=\Phi\Bigl(\cpar^{-1}+\half\cpar \log {w\over 1-w}\Bigr)
  #   -\Phi\Bigl(\cpar^{-1}+\half\cpar \log {1-w\over w}\Bigr)
  tauhr= function(w,cpar)
  { w1=1-w
    cpar1=1/cpar
    rat=w/w1; lograt=log(rat)
    tem1=pnorm(cpar1+.5*cpar*lograt); tem2=pnorm(cpar1-.5*cpar*lograt)
    B=w*tem1+w1*tem2
    Bp=tem1-tem2
    ((2*w-1)*Bp*B + w*w1*Bp*Bp )/(B*B)
  }
  tem=integrate(tauhr,0,1,cpar=cpar,rel.tol=1.e-6)
  tau=tem$value
  tau
}

# cpar = copula parameter >0
hr.cpar2rhoS=function(cpar)
{ sphr= function(w,cpar)
  { w1=1-w; cpar1=1/cpar
    rat=w/w1; lograt=log(rat)
    tem1=pnorm(cpar1+.5*cpar*lograt); tem2=pnorm(cpar1-.5*cpar*lograt)
    B=w*tem1+w1*tem2
    tem=1/(B+1)
    tem^2
  }
  tem=integrate(sphr,0,1,cpar=cpar,rel.tol=1.e-6)
  rho=12*tem$value-3
  rho
}

# lm = tail dependence parameter lambda in (0,1), possibly a vector
joe.cpar2lm=function(cpar) { 2-2^(1/cpar) }
joe.lm2cpar=function(lm) { log(2)/log(2-lm) }
gum.cpar2lm=function(cpar) { 2-2^(1/cpar) }
gum.lm2cpar=function(lm) { log(2)/log(2-lm) }
mtcj.cpar2lm=function(cpar) { 2^(-1/cpar) }
mtcj.lm2cpar=function(lm) { log(2)/(-log(lm)) }
gal.cpar2lm=function(cpar) { 2^(-1/cpar) }
gal.lm2cpar=function(lm) { log(2)/(-log(lm)) }
hr.cpar2lm=function(cpar) { 2*(1-pnorm(1/cpar)) }
hr.lm2cpar=function(lm) { 1/qnorm(1-lm/2) }

#============================================================
# Blomqvist beta for bivariate 1-parameter copulas, and  bivariate t, BB1
# given beta, find copula parameter

# BVN and bivariate t(nu)
# rho=sin(.5*pi*b), -1<b<1, -1<rho<1, -1<rhoS<1
bvn.b2cpar=function(b) { sin(.5*pi*b) }
bvn.tau2cpar=bvn.b2cpar
bvn.cpar2b=function(rho) { (2/pi)*asin(rho) }
bvn.cpar2tau=bvn.cpar2b
# Spearman is different for biv t
bvn.cpar2rhoS=function(rho) { (6/pi)*asin(rho/2) }
bvn.rhoS2cpar=function(rhoS) { 2*sin(pi*rhoS/6) }

# cpar = copula parameter (rho,nu)
bvt.cpar2b=function(cpar) 
{ if(is.matrix(cpar)) { rho=cpar[,1] } else { rho=cpar[1] }
  (2/pi)*asin(rho) 
}  
bvt.cpar2tau=bvt.cpar2b
bvt.b2cpar=function(b,nu) { sin(.5*pi*b)  }
bvt.tau2cpar=bvt.b2cpar

bvt.cpar2lm=function(cpar)
{ if(is.matrix(cpar)) { rho=cpar[,1]; nu=cpar[,2] }
  else { rho=cpar[1]; nu=cpar[2] }
  2*pt(-sqrt((nu+1)*(1-rho)/(1+rho)),nu+1) 
}

# lm = tail dependent lamdba  0<lm<1
# nu = degree of freedom parameter >0
bvt.lm2cpar=function(lm,nu)
{ tem=-qt(lm/2,1+nu)
  tem=tem^2/(1+nu)
  rho=(1-tem)/(1+tem)
  rho
}

# b = value of Blomqvist's beta, -1<b<1
pla.b2cpar=function(b) { ((1+b)/(1-b))^2 }

# Frank copula, solve equation to get cpar given Blomqvist's beta b
# vectorized input b is OK, b=0 fails
# b = value of Blomqvist's beta, -1<b<1
# cpar0 = starting point for Newton-Raphson iterations
# mxiter = maximum number of iterations
# eps = tolerance for convergence
# iprint = print flag for iterations
# Output: copula parameter with given b value
frk.b2cpar=function(b, cpar0=0,mxiter=20,eps=1.e-8,iprint=F)
{ iter=0
  #b[b==0]=.00000001
  b[abs(b)<1.e-8]=.00000001
  diff=1.
  cpar=cpar0
  if(cpar0<=0) cpar=10*b
  ln2=log(2)
  while(iter<mxiter & max(abs(diff))>eps)
  { tem=exp(cpar/2)
    g=log(1+tem)-ln2-cpar*(1+b)/4
    gp=.5/(1+1/tem)-(1+b)/4
    iter=iter+1
    diff=g/gp
    cpar=cpar-diff
    if(iprint) cat(iter," ",cpar," ",diff,"\n")
  }
  if(iter>=mxiter) cat("did not converge\n")
  cpar
}

# MTCJ copula, solve equation to get cpar given Blomqvist's beta b
# vectorized input b is OK
# b = value of Blomqvist's beta, 0<b<1
# cpar0 = starting point for Newton-Raphson iterations
# mxiter = maximum number of iterations
# eps = tolerance for convergence
# iprint = print flag for iterations
# Output: copula parameter with given b value
mtcj.b2cpar=function(b, cpar0=0,mxiter=20,eps=1.e-8,iprint=F)
{ iter=0
  diff=1.
  #b[b==0]=.00000001
  b[abs(b)<1.e-8]=.00000001
  cpar=cpar0
  if(cpar0<=0) cpar=2*b/(1-b)  # value of cpar with given tau
  ln2=log(2)
  btem=log((1+b)/4)
  while(iter<mxiter & max(abs(diff))>eps)
  { tem=2^(cpar+1)
    g=log(tem-1)+cpar*btem
    gp=ln2*tem/(tem-1)+btem
    iter=iter+1
    diff=g/gp
    cpar=cpar-diff
    if(iprint) cat(iter," ",cpar," ",diff,"\n")
  }
  if(iter>=mxiter) cat("did not converge\n")
  cpar
}

# Joe/B5, solve equation to get cpar given Blomqvist's beta b
# vectorized input b is OK
# b = value of Blomqvist's beta, 0<b<1
# cpar0 = starting point for Newton-Raphson iterations
# mxiter = maximum number of iterations
# eps = tolerance for convergence
# iprint = print flag for iterations
# Output: copula parameter with given b value
joe.b2cpar=function(b, cpar0=0,mxiter=20,eps=1.e-8,iprint=F)
{ iter=0
  diff=1.
  #b[b==0]=.00000001
  b[abs(b)<1.e-8]=.00000001
  cpar=cpar0
  if(cpar0<=0) cpar=2*b/(1-b)+1  # value of cpar with given tau for b4
  ln2=log(2)
  btem=log((3-b)/2)
  while(iter<mxiter & max(abs(diff))>eps)
  { tem=2^(-cpar)
    g=log(2-tem)-cpar*btem
    gp=ln2*tem/(2-tem)-btem
    iter=iter+1
    diff=g/gp
    cpar=cpar-diff
    while(min(cpar)<=1) { diff=diff/2; cpar=cpar+diff }
    if(iprint) cat(iter," ",cpar," ",diff,"\n")
  }
  if(iter>=mxiter) cat("did not converge\n")
  cpar
}

# Gumbel
# b = value of Blomqvist's beta, 0<b<1
gum.b2cpar=function(b)
{ ln2=log(2)
  ln2/log(2-(log(1+b))/ln2)
}

# Galambos
# b = value of Blomqvist's beta, 0<b<1
gal.b2cpar=function(b)
{ ln2=log(2)
  ln2/log(ln2/log(1+b))
}

# Huesler-Reiss
# b = value of Blomqvist's beta, 0<b<1
hr.b2cpar=function(b)
{ ln2=log(2)
  1/qnorm(1-(log(1+b))/(2*ln2))
}


# BB1 cpar=(th,de)
# b = value of Blomqvist's beta, 0<b<1
# de = delta parameter of copula
# thstart = starting point for theta for Newton-Raphson iterations
# mxiter = maximum number of iterations
# eps = tolerance for convergence
# Output: theta parameter given Blomqvist's beta and copula delta parameter
#   also tail dependence parameters  lml, lmu
bb1.b2cpar=function(b,de,thstart=1,mxiter=30,eps=1.e-6)
{ iter=0; 
  diff=1.;
  ln2=log(2.)
  #cat("beta=", b, " de=", de,"\n")
  lmu=2.-2^(1./de);
  bp=(1.+b)/4.; lbp=log(bp); 
  th=thstart;
  while(iter<mxiter & abs(diff)>eps)
  { tem1=2^th; tem2=bp^(-th); 
    g=2.*tem1-lmu*(tem1-1.)-tem2;
    gp=2.*tem1*ln2-lmu*tem1*ln2+tem2*lbp;
    iter=iter+1;
    diff=g/gp;
    th=th-diff;
    while(th<=0. | abs(diff)>5.) { diff=diff/2.; th=th+diff; }
    #print(c(iter,th,diff))
  }
  if(iter>=mxiter | th<1.e-6) cat("did not converge, use larger thstart\n");
  lml=2^(-1./(th*de))
  list(th=th,lmu=lmu,lml=lml)
}

# cpar = copula parameter with th>0, de>1
bb1.cpar2tau=function(cpar) 
{ if(is.matrix(cpar)) { th=cpar[,1]; de=cpar[,2] }
  else { th=cpar[1]; de=cpar[2] }
  1-2/(de*(th+2.)) 
}

# lmpar = tail dependence parameters (lml,lmu) in (0,1)^2 
# Output copula parameter (th,de)
bb1.lm2cpar=function(lmpar)  # order is lml,lmu
{ de=log(2)/log(2-lmpar[2]); th=log(2)/(-de*log(lmpar[1]))
  c(th,de)
}

# cpar = copula parameter with th>0, de>1
bb1.cpar2lm=function(cpar)
{ if(is.matrix(cpar)) { th=cpar[,1]; de=cpar[,2] }
  else { th=cpar[1]; de=cpar[2] }
  lml=2^(-1/(th*de)); lmu=2-2^(1/de)
  cbind(lml,lmu)
}

# BB1, given 0<tau<1, find theta and delta with lml=lmu
# tau = Kendall tau value
# destart = starting point for delta
# mxiter = maximum number of iterations
# eps = tolerance for convergence
# iprint = print flag for iterations
# Output: copula parameter (th,de) with lml=lmu anf given tau
bb1.tau2eqlm=function(tau,destart=1.5,mxiter=30,eps=1.e-6,iprint=F)
{ iter=0; 
  diff=1.;
  ln2=log(2.)
  de=destart
  rhs=2/(1-tau)
  while(iter<mxiter & max(abs(diff))>eps)
  { tem=2-2^(1/de); 
    ltem= -log(tem)
    g= ln2/ltem +2*de -rhs
    gp= (ln2/ltem/de)^2 * (2-tem)/tem +2
    iter=iter+1;
    diff=g/gp;
    de=de-diff;
    while(min(de)<=1. | max(abs(diff))>5.) { diff=diff/2.; de=de+diff; }
    if(iprint) print(c(iter,de,diff))
  }
  if(iter>=mxiter) cat("did not converge\n");
  th=ln2/(de*ltem)
  lml=2^(-1./(th*de))
  lmu=2.-2^(1./de)
  if(length(tau)==1)
  { out=c(th,de,lml,lmu)
    names(out)=c("th","de","lml","lmu")
  }
  else
  { out=cbind(th,de,lml,lmu) }
  out
}

# lmpar = tail dependence parameters (lml,lmu) in (0,1)^2 
# Output copula parameter (th,de)
bb7.lm2cpar=function(lmpar)  # order is lml,lmu
{ de=log(2)/(-log(lmpar[1])); th=log(2)/log(2-lmpar[2])
  c(th,de)
}

# cpar = copula parameter with th>1, de>0
bb7.cpar2lm=function(cpar)
{ if(is.matrix(cpar)) { th=cpar[,1]; de=cpar[,2] }
  else { th=cpar[1]; de=cpar[2] }
  lml=2^(-1/de); lmu=2-2^(1/th)
  cbind(lml,lmu)
}

# lmpar = tail dependence parameters (lml,lmu) in (0,1)^2 
# Output copula parameter (th,de)
bb4.lm2cpar=function(lmpar)  # order is lml,lmu
{ de=log(2)/(-log(lmpar[2])); th=log(2-lmpar[2])/(-log(lmpar[1]))
  c(th,de)
}

# cpar = copula parameter with th>0, de>0
bb4.cpar2lm=function(cpar)
{ if(is.matrix(cpar)) { th=cpar[,1]; de=cpar[,2] }
  else { th=cpar[1]; de=cpar[2] }
  lml=(2-2^(-1/de))^(-1/th); lmu=2^(-1/de)
  cbind(lml,lmu)
}

#============================================================
vincenzocoia/CopulaModel documentation built on Oct. 27, 2021, 6:41 a.m.