R/genbeta2.R

Defines functions pcondbgb2cop pbgb2cop pbgb2 mgb2.cpar2cor dmgb2copnllk logdmgb2cop bgb2.cpar2lm rmgb2cop rbgb2cop dmgb2cop dbgb2cop qtbeta ptbeta dugb2 dmgb2 dbgb2

Documented in bgb2.cpar2lm dbgb2 dbgb2cop dmgb2 dmgb2cop logdmgb2cop mgb2.cpar2cor pbgb2 pbgb2cop pcondbgb2cop rmgb2cop

# Yang X, Frees EW, Zhang Z (2011). A generalized beta copula with
# applications in modeling multivariate long-tailed data.
# Insurance: Mathematics and Economics 49, 265-284.

#  [Y_j|Q=q)] ~ Gamma(eta_j,rate=q) conditionally independent for j=1,...,d, 
#  Q~ Gamma(ze,1).
#  f_{Y1...Yd}=
#   \int_0^oo \prod_{j=1}^d { y_j^{q-1}e^{-q y_j} q^{eta_j}\over Gamma(eta_j) } 
#          {e^{-q} q^{ze-1}\over Gamma(ze)} dq
#   = { Gamma(eta_+ +ze) \prod_{j=1}^d y_j^{eta_j-1} \over
#           Gamma(eta_1)...Gamma(eta_d) Gamma(ze) (1+y_+)^{eta_+ +ze} }. 

# y1>0, y2>0, param=c(eta1,eta2,zeta), all parameters>0 
# Output: bivariate generalized Beta2 density 
dbgb2=function(y1,y2,param)
{ eta1=param[1]; eta2=param[2]; ze=param[3]
  lcon=lgamma(eta1+eta2+ze)-lgamma(eta1)-lgamma(eta2)-lgamma(ze)
  ltem=(eta1-1)*log(y1)+(eta2-1)*log(y2)-(eta1+eta2+ze)*log(1+y1+y2)
  exp(lcon+ltem)
}

# yvec = (y1,...,yd) >0 
# param = (eta1,...,etad, zeta), all >0 
# Output: multivariate generalized Beta2 density 
dmgb2=function(yvec,param)
{ d=length(param)-1
  eta=param[1:d]; ze=param[d+1]
  lcon=lgamma(sum(param))-sum(lgamma(param))
  ltem=sum((eta-1)*log(yvec))-sum(param)*log(1+sum(yvec))
  exp(lcon+ltem)
}

# y>0, eta>0, ze>0
# Output: univariate GB2 density
dugb2= function(y,eta,ze)
{ lcon=lgamma(eta+ze)-lgamma(eta)-lgamma(ze)
  ltem=(eta-1)*log(y)-(eta+ze)*log(1+y)
  exp(lcon+ltem)
}

# y>0, eta>0, ze>0
# Output: univariate GB2 cdf
ptbeta= function(y,eta,ze)
{ w=y/(1+y)
  pbeta(w,eta,ze)
}

# y>0, eta>0, ze>0
# Output: univariate GB2 quantile function
qtbeta= function(u,eta,ze)
{ w=qbeta(u,eta,ze)
  w/(1-w)
}

# 0<u,v<1 (could be vectorized)
# param = copula parameter (eta1,eta2,zeta)
# Output: bivariate copula density of generalized Beta2
dbgb2cop=function(u,v,param)
{ eta1=param[1]; eta2=param[2]; ze=param[3]
  y1=qtbeta(u,eta1,ze)
  y2=qtbeta(v,eta2,ze)
  lcon=lgamma(eta1+eta2+ze)-lgamma(eta1+ze)-lgamma(eta2+ze)+lgamma(ze)
  ltem=(eta1+ze)*log(1+y1)+(eta2+ze)*log(1+y2)-(eta1+eta2+ze)*log(1+y1+y2)
  exp(lcon+ltem)
}

# uvec = (u1,...,ud) in (0,1) 
# Output: multivariate copula density of generalized Beta2
dmgb2cop=function(uvec,param)
{ d=length(param)-1
  eta=param[1:d]; ze=param[d+1]
  yvec=qtbeta(uvec,eta,ze)
  lcon=lgamma(sum(param))-sum(lgamma(eta+ze))+(d-1)*lgamma(ze)
  ltem=sum((eta+ze)*log(1+yvec))-(sum(eta)+ze)*log(1+sum(yvec))
  exp(lcon+ltem)
}

# n = simulation sample size
# param = (eta1,eta2,zeta), all parameters >0
# Output: random bivariate sample with U(0,1) margins
rbgb2cop= function(n,param)
{ eta1=param[1]; eta2=param[2]; ze=param[3]
  th=rgamma(n,ze)
  y1=rgamma(n,eta1,rate=th)
  y2=rgamma(n,eta2,rate=th)
  u1=ptbeta(y1,eta1,ze)
  u2=ptbeta(y2,eta2,ze)
  cbind(u1,u2)
}

# n = simulation sample size
# param = (eta1,...,etad, zeta), all parameters >0 
# Output: random multivariate sample with U(0,1) margins
rmgb2cop=function(n,param)
{ d=length(param)-1
  eta=param[1:d]; ze=param[d+1]
  th=rgamma(n,ze)
  uu=matrix(0,n,d)
  for(j in 1:d) 
  { yy=rgamma(n,eta[j],rate=th) 
    uu[,j]=ptbeta(yy,eta[j],ze)
  }
  uu
}

# param = (eta1,eta2,zeta), all parameters>0 
# Output: upper tail dependence parameter of bivariate generalized Beta2
bgb2.cpar2lm=function(param)
{ eta1=param[1]; eta2=param[2]; ze=param[3]
  tem1=(beta(eta1,ze))^(1/ze)
  tem2=(beta(eta2,ze))^(1/ze)
  w1=tem1/(tem1+tem2); w2=1-w1
  pbeta(w1,ze+eta2,eta1)+pbeta(w2,ze+eta1,eta2)
}

# uvec = (u1,...,ud) in (0,1) 
# Output: log copula density for one d-vector
logdmgb2cop=function(uvec,param)
{ d=length(param)-1
  eta=param[1:d]; ze=param[d+1]
  yvec=qtbeta(uvec,eta,ze)
  lcon=lgamma(sum(param))-sum(lgamma(eta+ze))+(d-1)*lgamma(ze)
  ltem=sum((eta+ze)*log(1+yvec))-(sum(eta)+ze)*log(1+sum(yvec))
  lcon+ltem
}

# param = (eta1,...,etad, zeta), all parameters >0 
# udat = nxd data matrix with U(0,1) margins
dmgb2copnllk= function(param,udat)
{ n=nrow(udat)
  if(any(param<=0)) return(1.e10)
  nllk=0
  for(i in 1:n) nllk=nllk-logdmgb2cop(udat[i,],param)
  nllk
}

# param = (eta1,...,etad, zeta), all parameters >0  and zeta>2
# Output: correlation matrix of multivariate GB2
mgb2.cpar2cor=function(param)
{ d=length(param)-1
  eta=param[1:d]; ze=param[d+1]
  if(ze<=2) return(NA)
  eq=1/(ze-1); eq2=eq/(ze-2); v=eq2=eq*eq
  r=eq2/v
  tem=eta/(r+eta)
  rmat=outer(tem,tem)
  diag(rmat)=1
  rmat
}

#============================================================

# bivariate cdf via integration, Gauss-Laguerre quadrature should be better
# y1>0, y2>0, param=c(eta1,eta2,zeta), all parameters>0 
# Output: bivariate generalized Beta2 cdf 
pbgb2=function(y1,y2,param)
{ eta1=param[1]; eta2=param[2]; ze=param[3]
  intgfn= function(r)
  { pgamma(y1*r,eta1)*pgamma(y2*r,eta2)*dgamma(r,ze) }
  cdf=integrate(intgfn,0,Inf)
  cdf$value
}

# 0<u,v<1 
# param = copula parameter (eta1,eta2,zeta)
# Output: bivariate copula cdf of generalized Beta2
pbgb2cop=function(u,v,param)
{ eta1=param[1]; eta2=param[2]; ze=param[3]
  y1=qtbeta(u,eta1,ze)
  y2=qtbeta(v,eta2,ze)
  pbgb2(y1,y2,param)
}

# 0<v,u<1 
# param = copula parameter (eta1,eta2,zeta)
# Output: copula conditional cdf of bivariate generalized Beta2
pcondbgb2cop=function(v,u,param)
{ eta1=param[1]; eta2=param[2]; ze=param[3]
  y1=qtbeta(u,eta1,ze)
  y2=qtbeta(v,eta2,ze)
  intgfnc= function(r)
  { r*dgamma(y1*r,eta1)*pgamma(y2*r,eta2)*dgamma(r,ze) }
  tem=integrate(intgfnc,0,Inf)
  ccdf=tem$value/dugb2(y1,eta1,ze)
  ccdf
}
vincenzocoia/CopulaModel documentation built on Oct. 27, 2021, 6:41 a.m.