o
    0Gf8                     @   s   d Z ddlZddlZddlmZmZmZ ddlm	Z	 ddl
mZ ddlmZ dd	 Zd
d Zdd Zdd ZG dd deZG dd deZG dd deZG dd deZdS )zM
Created on Fri Jan 29 19:19:45 2021

Author: Josef Perktold
License: BSD-3

    N)stats	integrateoptimize   )
transforms)Copula)check_random_statec                 C   s>   t t jjd }dd }t | }t|||d | }|S )Nd   c                 S   s   t | t | d  S Nr   )npsqueezeexp)t r   Llib/python3.10/site-packages/statsmodels/distributions/copula/archimedean.py	integrand   s   z_debye.<locals>.integrandr   )r   ZfinfoZfloat64Zepsr   r   Zquad)alphaZEPSILONr   Z_alphadebye_valuer   r   r   _debye   s
   
r   c                 C   sd   t | } |  d | d d  | d d  | d d  | d d  | d	 d
  | d d d  }|S )z^Debye function minus 1, Taylor series approximation around zero

    function is not used
          $   i     i:    i  
   i g     l    x"=r   asarray)xZdm1r   r   r   _debyem1_expansion   s   
8
r    c                 C   s4   | dkr
t | }|S t| }dd|d  |   }|S )a  Kendall's tau for Frank Copula

    This uses Taylor series expansion for theta <= 1.

    Parameters
    ----------
    theta : float
        Parameter of the Frank copula. (not vectorized)

    Returns
    -------
    tau : float, tau for given theta
    r   r   )_tau_frank_expansionr   )thetataur   r   r   r   	tau_frank)   s   r$   c                 C   sV   t | } | d | d d  | d d  | d d  | d d  | d	 d
 d  }|S )N	      i     i     i@) i   r   l    ^vr   )r   r#   r   r   r   r!   A   s
   
6r!   c                       sX   e Zd ZdZd fdd	Zdd Zdd	 Zdd
dZdddZdddZ	dd Z
  ZS )ArchimedeanCopulaaN  Base class for Archimedean copulas

    Parameters
    ----------
    transform : instance of transformation class
        Archimedean generator with required methods including first and second
        derivatives
    args : tuple
        Optional copula parameters. Copula parameters can be either provided
        when creating the instance or as arguments when calling methods.
    k_dim : int
        Dimension, number of components in the multivariate random variable.
        Currently only bivariate copulas are verified. Support for more than
        2 dimension is incomplete.
    r   r   c                    s$   t  j|d || _|| _d| _d S )N)k_dimr   )super__init__args	transformZk_args)selfr/   r.   r+   	__class__r   r   r-   [   s   
zArchimedeanCopula.__init__c                 C   sB   t |tjr
t|}t |ts|f}t|dks|dkr| j}|S )Nr   N)
isinstancer   ndarraytuplelenr.   )r0   r.   r   r   r   _handle_argsa   s   
zArchimedeanCopula._handle_argsc                 C   s2   t |}|jd | jkrdd l}|dt |S )Nr   zRu has different dimension than k_dim. This will raise exception in future versions)r   r   shaper+   warningswarnFutureWarning)r0   ur;   r   r   r   	_handle_uo   s   
zArchimedeanCopula._handle_uc                 C   st   |  |}| |}d}| jj}| jj}|||g|R  |g|R  }t|tjr-|nd}tj	|dd|d}|S )z#Evaluate cdf of Archimedean copula.r9   Ng              ?)out)
r8   r?   r/   evaluateinversesumr4   r   r5   Zclip)r0   r>   r.   axisZphiZphi_invZcdfvrA   r   r   r   cdfy   s   

"zArchimedeanCopula.cdfc                    s    |}|}d}jj}|jd dkrjj}n$|jd dkr(jj}n|jd dkr4jj}n|jd   fdd}jj|g|R  	|}t
||g|R  |}|||g|R  9 }t
|S )z#Evaluate pdf of Archimedean copula.r9   r   r&   r   c                        j j g| R  S r3   r/   Zderivk_inverser.   kr0   r   r   psi_d      z$ArchimedeanCopula.pdf.<locals>.psi_d)r?   r8   r/   derivr:   deriv2_inversederiv3_inversederiv4_inverserB   rD   r   prodabs)r0   r>   r.   rE   phi_d1rL   psiZpdfvr   rJ   r   pdf   s    






zArchimedeanCopula.pdfc              	      s    |}|}d}jj}|jd dkrjj}n$|jd dkr(jj}n|jd dkr4jj}n|jd   fdd}jj|g|R  	|}t
	t
t
||g|R  |}|t
t
||g|R  7 }|S )z4Evaluate log pdf of multivariate Archimedean copula.r9   r   r&   r   c                     rG   r3   rH   rI   rJ   r   r   rL      rM   z'ArchimedeanCopula.logpdf.<locals>.psi_d)r?   r8   r/   rN   r:   rO   rP   rQ   rB   rD   r   logrS   )r0   r>   r.   rE   rT   rL   rU   Zlogpdfvr   rJ   r   logpdf   s    





$ zArchimedeanCopula.logpdfc                 C   s
   |  |S r3   )theta_from_taur0   r#   r   r   r   _arg_from_tau   s   
zArchimedeanCopula._arg_from_tau)r   r   r   )__name__
__module____qualname____doc__r-   r8   r?   rF   rV   rX   r[   __classcell__r   r   r1   r   r*   J   s    



r*   c                       sd   e Zd ZdZd fdd	Zddd	Zd fd
d	Zd fdd	ZdddZdddZ	dd Z
  ZS )ClaytonCopulaa  Clayton copula.

    Dependence is greater in the negative tail than in the positive.

    .. math::

        C_\theta(u,v) = \left[ \max\left\{ u^{-\theta} + v^{-\theta} -1 ;
        0 \right\} \right]^{-1/\theta}

    with :math:`\theta\in[-1,\infty)\backslash\{0\}`.

    Nr   c                    sT   |d ur|f}nd}t  jt ||d |d ur%|dks!|dkr%td|| _d S )Nr   r.   r+   r9   r   zTheta must be > -1 and !=0)r,   r-   r   ZTransfClayton
ValueErrorr"   r0   r"   r+   r.   r1   r   r   r-      s   
zClaytonCopula.__init__r   r   c           	      C   s   t |}| |\}||| jf}td| j|df|d}| jdkr4dt||  d|  }|S | j	
t| | |}|S )Nr@   r   sizerandom_stater         )r   r8   randomr+   r   Zgammarvsr   rW   r/   rC   	r0   nobsr.   rh   rngthr   vZrvr   r   r   rk      s   
zClaytonCopula.rvsc                    s   |  |}| |\}|jd dkr=|d tj|dd|d    }tj||  ddd }d| d  | }|||  S t ||S )Nr9   r   r   rE   )r?   r8   r:   r   rR   rD   r,   rV   )r0   r>   r.   ro   abcr1   r   r   rV      s   
 zClaytonCopula.pdfc                       t  j||dS NrI   r,   rX   r0   r>   r.   r1   r   r   rX         zClaytonCopula.logpdfc                 C   sD   |  |}| |\}|jd }tj||  dd| d d|  S )Nr9   rq   r   ri   )r?   r8   r:   r   rD   )r0   r>   r.   ro   dr   r   r   rF      s   

$zClaytonCopula.cdfc                 C   s   |d u r| j }||d  S Nr   r"   r0   r"   r   r   r   r#         zClaytonCopula.tauc                 C   s   d| d|  S )Nr   r   r   rZ   r   r   r   rY        zClaytonCopula.theta_from_taur{   r   r   Nr\   r3   )r]   r^   r_   r`   r-   rk   rV   rX   rF   r#   rY   ra   r   r   r1   r   rb      s    


rb   c                       sx   e Zd ZdZd fdd	Zddd	Zd fd
d	ZdddZd fdd	ZdddZ	dddZ
dddZdd Z  ZS )FrankCopulaa2  Frank copula.

    Dependence is symmetric.

    .. math::

        C_\theta(\mathbf{u}) = -\frac{1}{\theta} \log \left[ 1-
        \frac{ \prod_j (1-\exp(- \theta u_j)) }{ (1 - \exp(-\theta)-1)^{d -
        1} } \right]

    with :math:`\theta\in \mathbb{R}\backslash\{0\}, \mathbf{u} \in [0, 1]^d`.

    Nr   c                    sL   |d ur|f}nd}t  jt ||d |d ur!|dkr!td|| _d S )Nr   rc   r   zTheta must be !=0)r,   r-   r   ZTransfFrankrd   r"   re   r1   r   r   r-        
zFrankCopula.__init__r   r   c              	   C   s   t |}| |\}||| jf}tjjdt|  |df|d}d| t	dtt	| |  t| d    S )Nr@   r   rf   ri   )
r   r8   rj   r+   r   Zlogserrk   r   r   rW   )r0   rm   r.   rh   rn   ro   r   rp   r   r   r   rk   %  s   "
zFrankCopula.rvsc           	         s   |  |}| |\}|jd dkrt ||S t| tj|dd d }t| d }| | d|  }tjt| | d dd| }|d }|| S )Nr9   r   rq   r   )	r?   r8   r:   r,   rV   r   r   rD   rR   )	r0   r>   r.   ro   Zg_Zg1numZauxdenr1   r   r   rV   2  s   
"zFrankCopula.pdfc                 C   sp   |  |}| |\}|jd }tjdt| |  dd}dt|  |d  }d| td||   S )Nr9   r   rq   ri   )r?   r8   r:   r   rR   r   rW   )r0   r>   r.   ro   Zdimr   r   r   r   r   rF   @  s   

zFrankCopula.cdfc                    s   |  |}| |\}|jd dkrO|d |d }}dt|  }t|| |||   }|dt|dt| |  dt| |     8 }|S t ||S )Nr9   r   .r   .r   r   )r?   r8   r:   r   r   rW   r,   rX   )r0   r>   r.   ro   u1u2rs   rV   r1   r   r   rX   J  s   
zFrankCopula.logpdfc                 C   s   |  |}| |\}|jd dkr=|d |d }}t| | }|t| t| |  t| |   }|S td)zFConditional cdf of second component given the value of first.
        r9   r   r   r   #u needs to be bivariate (2 columns))r?   r8   r:   r   r   expm1NotImplementedError)r0   r>   r.   ro   r   r   Zcdfcr   r   r   cdfcond_2g1Z  s   
0zFrankCopula.cdfcond_2g1c              	   C   sl   t |}| |\}|jd dkr2t dt | d| d t | |  d    | }|S td)zFConditional pdf of second component given the value of first.
        r9   r   r   )r   r   r8   r:   rW   r   r   r   )r0   qr   r.   ro   Zppfcr   r   r   ppfcond_2g1h  s   
zFrankCopula.ppfcond_2g1c                 C   s   |d u r| j }t|S r3   )r"   r$   r}   r   r   r   r#   v  s   zFrankCopula.tauc                    s\   t tjj}t tjj} fdd}dk rdnd}tj||||fd}|jd }|S )Nc                    s    j | d S )Nr|   )r#   )r   rZ   r   r   _theta_from_tau  r   z3FrankCopula.theta_from_tau.<locals>._theta_from_taug)\(?g      ?r   )Zboundsr   )	r   rW   sys
float_infominmaxr   Zleast_squaresr   )r0   r#   ZMIN_FLOAT_LOGZMAX_FLOAT_LOGr   startresultr"   r   rZ   r   rY   }  s   
zFrankCopula.theta_from_taur{   r   r\   r3   )r]   r^   r_   r`   r-   rk   rV   rF   rX   r   r   r#   rY   ra   r   r   r1   r   r   
  s    





r   c                       sd   e Zd ZdZd fdd	Zddd	Zd fd
d	ZdddZd fdd	ZdddZ	dd Z
  ZS )GumbelCopulaa  Gumbel copula.

    Dependence is greater in the positive tail than in the negative.

    .. math::

        C_\theta(u,v) = \exp\!\left[ -\left( (-\log(u))^\theta +
        (-\log(v))^\theta \right)^{1/\theta} \right]

    with :math:`\theta\in[1,\infty)`.

    Nr   c                    sL   |d ur|f}nd}t  jt ||d |d ur!|dkr!td|| _d S )Nr   rc   r   zTheta must be > 1)r,   r-   r   ZTransfGumbelrd   r"   re   r1   r   r   r-     r   zGumbelCopula.__init__r   r   c           	   	   C   s   t |}| |\}||| jf}tjjd| ddttj	d|  | |df|d}| jdkrCt
t| | d|   }|S | jt| | |}|S )Nr@   r   r   r   rf   )r   r8   rj   r+   r   Zlevy_stablerk   r   ZcosZpir   rW   r/   rC   rl   r   r   r   rk     s   

 zGumbelCopula.rvsc                    s   |  |}| |\}|jd dkr[t| }|| }tj|dd}|d|  }t| }|| d }	|d| d  }
tj|dd|d  }tj|ddd }||	 |
 | | S t 	||S )Nr9   r   rq   r@   ri   )
r?   r8   r:   r   rW   rD   r   rR   r,   rV   )r0   r>   r.   ro   ZxyZxy_thetaZsum_xy_thetaZsum_xy_theta_thetarr   rs   rt   rz   er1   r   r   rV     s   
zGumbelCopula.pdfc                 C   sH   |  |}| |\}tjt| | dd}t|d|   }|S )Nr9   rq   r@   )r?   r8   r   rD   rW   r   )r0   r>   r.   ro   hrF   r   r   r   rF     s
   
zGumbelCopula.cdfc                    ru   rv   rw   rx   r1   r   r   rX     ry   zGumbelCopula.logpdfc                 C   s   |d u r| j }|d | S r
   r|   r}   r   r   r   r#     r~   zGumbelCopula.tauc                 C   s   dd|  S r
   r   rZ   r   r   r   rY     s   zGumbelCopula.theta_from_taur{   r   r\   r3   )r]   r^   r_   r`   r-   rk   rV   rF   rX   r#   rY   ra   r   r   r1   r   r     s    


r   )r`   r   Znumpyr   Zscipyr   r   r    r   Zcopulasr   Zstatsmodels.tools.rng_qrngr   r   r    r$   r!   r*   rb   r   r   r   r   r   r   <module>   s     	{E 