B
    Z!                 @   s"  d Z ddlZddlmZmZ dd Zdd Zdd	 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G dd deZd3ddZd4d d!Zd5d"d#Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zeeeee	e	e	e
eee
d0ZG d1d2 d2eZdS )6z

Which Archimedean is Best?
Extreme Value copulas formulas are based on Genest 2009

References
----------

Genest, C., 2009. Rank-based inference for bivariate extreme-value
copulas. The Annals of Statistics, 37(5), pp.2990-3022.



    N)expm1log1pc             C   s   | | S )z!independent bivariate copula
     )uvr   r   Glib/python3.7/site-packages/statsmodels/sandbox/distributions/copula.pycopula_bv_indep   s    r   c             C   s   t | |S )z!comonotonic bivariate copula
    )npminimum)r   r   r   r   r   copula_bv_min   s    r   c             C   s   t | | d dS )z&countermonotonic bivariate copula
       r   )r	   maximum)r   r   r   r   r   copula_bv_max   s    r   c             C   s:   |dkst dtt| | t||  d | S )z.Clayton or Cook, Johnson bivariate copula
    r   z#theta needs to be strictly positiver   )
ValueErrorr	   power)r   r   thetar   r   r   copula_bv_clayton$   s    r   c             C   sV   |dkst dtdt| |  t| |  t|    | }t|d}|S )z#Cook, Johnson bivariate copula
    r   z#theta needs to be strictly positiver   )r   r	   logr   r
   )r   r   r   cdfvr   r   r   copula_bv_frank+   s
    6r   c             C   s   t d S )N)NotImplementedError)r   r   rhor   r   r   copula_bv_gauss5   s    r   c             C   s   t d S )N)r   )r   r   r   Zdfr   r   r   copula_bv_t8   s    r   c               @   s   e Zd Zdd ZdS )
Transformsc             C   s   d S )Nr   )selfr   r   r   __init__=   s    zTransforms.__init__N)__name__
__module____qualname__r   r   r   r   r   r   <   s   r   c               @   s   e Zd Zdd Zdd ZdS )TransfFrankc             C   s*   t t| |  t t|    S )N)r	   r   r   )r   tr   r   r   r   evaluateB   s    zTransfFrank.evaluatec             C   s"   t t | t|   | S )N)r	   r   expr   )r   phir   r   r   r   inverseF   s    zTransfFrank.inverseN)r   r   r   r"   r%   r   r   r   r   r    @   s   r    c               @   s$   e Zd Zdd Zdd Zdd ZdS )TransfClaytonc             C   s   | dkS )Nr   r   )r   r   r   r   
_checkargsK   s    zTransfClayton._checkargsc             C   s   t || d S )Ng      ?)r	   r   )r   r!   r   r   r   r   r"   N   s    zTransfClayton.evaluatec             C   s   t d| | S )Nr   )r	   r   )r   r$   r   r   r   r   r%   Q   s    zTransfClayton.inverseN)r   r   r   r'   r"   r%   r   r   r   r   r&   I   s   r&   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	TransfGumbelz
    requires theta >=1
    c             C   s   | dkS )Nr   r   )r   r   r   r   r'   Y   s    zTransfGumbel._checkargsc             C   s   t t | |S )N)r	   r   r   )r   r!   r   r   r   r   r"   \   s    zTransfGumbel.evaluatec             C   s   t t |d|  S )Ng      ?)r	   r#   r   )r   r$   r   r   r   r   r%   _   s    zTransfGumbel.inverseN)r   r   r   __doc__r'   r"   r%   r   r   r   r   r(   T   s   r(   c               @   s   e Zd Zdd Zdd ZdS )TransfIndepc             C   s   t | S )N)r	   r   )r   r!   r   r   r   r"   c   s    zTransfIndep.evaluatec             C   s   t | S )N)r	   r#   )r   r$   r   r   r   r%   f   s    zTransfIndep.inverseN)r   r   r   r"   r%   r   r   r   r   r*   b   s   r*   r   c             C   s6   |j }|j}||| f| ||f|  f| }|S )z
    )r"   r%   )r   r   	transformargsr$   phi_invr   r   r   r   copula_bv_archimedeani   s    &r.   c             C   s.   |j }|j}||| f| |f| }|S )z,generic multivariate Archimedean copula
    )r"   r%   sum)r   r+   r,   Zaxisr$   r-   r   r   r   r   copula_mv_archimedeanr   s    r1   c          	   C   s6   t t | | |t |t | |  f|  S )z+generic bivariate extreme value copula
    )r	   r#   r   )r   r   r+   r,   r   r   r   copula_bv_ev{   s    r2   c             C   sr   dd }t ||||s"tdd| d|   }|d| |  7 }|||  d|  |d|   d|   | 7 }|S )zasymmetric logistic model of Tawn 1988

    special case: a1=a2=1 : Gumbel

    restrictions:
     - theta in (0,1]
     - a1, a2 in [0,1]
    c             S   s<   |dko|dk}| dko| dk}|dko.|dk}|o:|o:|S )Nr   r   r   )a1a2r   condthconda1conda2r   r   r   _check_args   s    z#transform_tawn.<locals>._check_argszinvalid argsr   g      ?)r	   allr   )r!   r3   r4   r   r8   transfr   r   r   transform_tawn   s    
,r;   c             C   sT   dd }t ||||s"tdd|d|   d|  ||  d|   |   }|S )zasymmetric negative logistic model of Joe 1990

    special case:  a1=a2=1 : symmetric negative logistic of Galambos 1978

    restrictions:
     - theta in (0,inf)
     - a1, a2 in (0,1]
    c             S   s4   |dk}| dko| dk}|dko&|dk}|o2|o2|S )Nr   r   r   )r3   r4   r   r5   r6   r7   r   r   r   r8      s    z"transform_joe.<locals>._check_argszinvalid argsr   g      )r	   r9   r   )r!   r3   r4   r   r8   r:   r   r   r   transform_joe   s
    
.r<   c             C   sL   dd }t |||s tdd|| |   ||  |   || d   }|S )zasymmetric mixed model of Tawn 1988

    special case:  k=0, theta in [0,1] : symmetric mixed model of
        Tiago de Oliveira 1980

    restrictions:
     - theta > 0
     - theta + 3*k > 0
     - theta + k <= 1
     - theta + 2*k <= 1
    c             S   s<   | dk}| d|  dko2| | dko2| d|  dk}|o:|S )Nr      r      r   )r   kr5   cond1r   r   r   r8      s    ,z$transform_tawn2.<locals>._check_argszinvalid argsr   r=   )r	   r9   r   )r!   r   r?   r8   r:   r   r   r   transform_tawn2   s
    (rA   c                sL   dd }t | s td fdd}ddlm} ||dd}|S )	zbilogistic model of Coles and Tawn 1994, Joe, Smith and Weissman 1992

    restrictions:
     - (beta, delta) in (0,1)^2 or
     - (beta, delta) in (-inf,0)^2

    not vectorized because of numerical integration
    c             S   s8   | dko| dko|dko|dk}| dk o.|dk }||B S )Nr   r   r   )betadeltar@   cond2r   r   r   r8      s     z)transform_bilogistic.<locals>._check_argszinvalid argsc                sL   d  t |    d  }d t d|     }t || d S )Nr   )r	   r   r   )wZterm1Zterm2)rB   rC   r!   r   r   
_integrant   s    z(transform_bilogistic.<locals>._integrantr   )quadr   )r	   r9   r   Zscipy.integraterG   )r!   rB   rC   r8   rF   rG   r:   r   )rB   rC   r!   r   transform_bilogistic   s    
rH   c             C   sp   dd }t ||stdt d|  |  d | }ddlm} d|  |||  | |||   }|S )	zmodel of Huesler Reiss 1989

    special case:  a1=a2=1 : symmetric negative logistic of Galambos 1978

    restrictions:
     - lambda in (0,inf)
    c             S   s   | dk}|S )Nr   r   )lamdaZcondr   r   r   r8      s    z!transform_hr.<locals>._check_argszinvalid argsg      ?g      ?r   )normr   )r	   r9   r   r   scipy.statsrJ   _cdf)r!   rI   r8   ZtermrJ   r:   r   r   r   transform_hr   s    	(rM   c             C   s   dd }t |||s tdddlm} t d| t | d|   d| |  }|t d||   }d|  |||d  | |||d   }|S )z_t-EV model of Demarta and McNeil 2005

    restrictions:
     - rho in (-1,1)
     - x > 0
    c             S   s    |dk}| dko| dk }|o|S )Nr   r   r   )r   xr@   rD   r   r   r   r8     s    z"transform_tev.<locals>._check_argszinvalid argsr   )r!   g      ?r   )r	   r9   r   rK   r!   Zsqrtr   rL   )r!   r   rN   r8   Zstats_tzr:   r   r   r   transform_tev   s    *,rP   )ZindepiminmaxZclaytonZcookjohnsonZcjZfrankZgaussZnormalr!   c               @   s$   e Zd ZdZdddZd	ddZdS )
CopulaBivariatezjbivariate copula class

    Instantiation needs the arguments, cop_args, that are required for copula
    r   c             C   sP   |t krt | | _n,y|d| }W n   tdY nX || _|| _|| _d S )N      ?z,copula needs to be a copula name or callable)rU   rU   )copulanamescopular   marginalcdfscopargs)r   rX   rW   rY   Ztmpr   r   r   r   "  s    zCopulaBivariate.__init__Nc             C   s<   |\}}|dkr| j }| j| jd || jd |f| S )zNxx needs to be iterable, instead of x,y for extension to multivariate
        Nr   r   )rY   rW   rX   )r   Zxyr,   rN   yr   r   r   cdf1  s
    zCopulaBivariate.cdf)r   )N)r   r   r   r)   r   r[   r   r   r   r   rT     s   
rT   )r   )r   r/   )r   )r)   Znumpyr	   Zscipy.specialr   r   r   r   r   r   r   r   r   objectr   r    r&   r(   r*   r.   r1   r2   r;   r<   rA   rH   rM   rP   rV   rT   r   r   r   r   <module>   sF   
	
	
	
