U
    Ãmœd`_  ã                   @   sš   d Z ddlZddlmZ ddlmZ ddlm	Z	 ddl
m  mZ ddlm  m  mZ ddlm  m  mZ ejZG dd„ dƒZG dd„ deƒZdS )z
Impulse reponse-related code
é    N)Úcache_readonlyc                   @   sz   e Zd ZdZddd„Zddd„Zd	d
„ Zdd„ Zdddddddddddddœdd„Zddddddddddddœ
dd„Z	dS )ÚBaseIRAnalysiszƒ
    Base class for plotting and computing IRF-related statistics, want to be
    able to handle known and estimated processes
    Né
   Fc                 C   s  || _ || _|j|j|j  | _| _| _|| _|d krF|j}t	 
|¡}|| _|| _| |¡| _|rt|j||d�| _n|j||d�| _| jjdd�| _|rª| jjdd�| _n| jjdd�| _|sò| ¡ | _|ràt | ¡ |¡| _nt | ¡ |¡| _|�rt |j¡| _ nt |j!¡| _ d S )N)ÚPr   ©Zaxis)"ÚmodelÚperiodsÚneqsZk_arZnobsÚlagsÚTÚorderZsigma_uÚlaZcholeskyr   ÚsvarZma_repÚirfsZsvar_ma_repÚ	svar_irfsZorth_ma_repÚ	orth_irfsZcumsumÚcum_effectsZsvar_cum_effectsÚorth_cum_effectsZlong_run_effectsÚ
lr_effectsÚnpÚdotZsvar_lr_effectsÚorth_lr_effectsÚutilZcomp_matrixZvar_repÚ_AZcoefs)Úselfr   r   r   r   r   ÚvecmÚsigma© r   úV/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/statsmodels/tsa/vector_ar/irf.pyÚ__init__   s2    


zBaseIRAnalysis.__init__c                 C   s   |r
| j S |r| jS | jS d S ©N)r   r   r   )r   Úorthr   r   r   r   Ú_choose_irfsK   s
    zBaseIRAnalysis._choose_irfsc                 O   s   t ‚d S r    ©ÚNotImplementedError©r   ÚargsÚkwargsr   r   r   ÚcovS   s    zBaseIRAnalysis.covc                 O   s   t ‚d S r    r#   r%   r   r   r   Úcum_effect_covV   s    zBaseIRAnalysis.cum_effect_covçš™™™™™©?)r   r   TÚasyméè  )ÚimpulseÚresponseÚsignifÚplot_paramsÚfigsizeÚsubplot_paramsÚplot_stderrÚstderr_typeÚreplÚseedÚ	componentc                C   s  | j }| j}| j}|r"|r"tdƒ‚|  ||¡}|r8d}n|rBd}nd}|dkrTd}nœ|	dkrftdƒ‚nŠ|	d	krz| j|d
�}|	dkr–| j|||
||d�}|	dkr´| j|||
|||d�}|	dkrÒ| j|||
|||d�}|	dkrð| j	|||
|||d�}t
j||||| jj||||||	d�}|S )aÅ  
        Plot impulse responses

        Parameters
        ----------
        orth : bool, default False
            Compute orthogonalized impulse responses
        impulse : {str, int}
            variable providing the impulse
        response : {str, int}
            variable affected by the impulse
        signif : float (0 < signif < 1)
            Significance level for error bars, defaults to 95% CI
        subplot_params : dict
            To pass to subplot plotting funcions. Example: if fonts are too big,
            pass {'fontsize' : 8} or some number to your taste.
        plot_params : dict

        figsize : (float, float), default (10, 10)
            Figure size (width, height in inches)
        plot_stderr : bool, default True
            Plot standard impulse response error bands
        stderr_type : str
            'asym': default, computes asymptotic standard errors
            'mc': monte carlo standard errors (use rpl)
        repl : int, default 1000
            Number of replications for Monte Carlo and Sims-Zha standard errors
        seed : int
            np.random.seed for Monte Carlo replications
        component: array or vector of principal component indices
        zFor SVAR system, set orth=Falsez"Impulse responses (orthogonalized)zImpulse responses (structural)zImpulse responsesFN)r+   ÚmcÚsz1Úsz2Úsz3z<Error type must be either 'asym', 'mc','sz1','sz2', or 'sz3'r+   ©r!   r8   )r!   r   r5   r/   r6   r9   )r!   r   r5   r/   r6   r7   r:   r;   )r/   r2   r0   r1   r4   )r   r   r   Ú
ValueErrorr"   r(   Ú
errband_mcÚerr_band_sz1Úerr_band_sz2Úerr_band_sz3ÚplottingÚirf_grid_plotÚnames)r   r!   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r   r   r   r   ÚtitleÚstderrÚfigr   r   r   ÚplotY   sl    #
 þ ý ý ý  ûzBaseIRAnalysis.plot)
r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   c       
         C   s˜   |rd}| j }| j}nd}| j}| j}|	dkr8tdƒ‚n.|	dkrL| j|d�}|	dkrf| j||
||d�}|snd	}tj||||| j	j
|||||||	d
�}|S )a‰  
        Plot cumulative impulse response functions

        Parameters
        ----------
        orth : bool, default False
            Compute orthogonalized impulse responses
        impulse : {str, int}
            variable providing the impulse
        response : {str, int}
            variable affected by the impulse
        signif : float (0 < signif < 1)
            Significance level for error bars, defaults to 95% CI
        subplot_params : dict
            To pass to subplot plotting funcions. Example: if fonts are too big,
            pass {'fontsize' : 8} or some number to your taste.
        plot_params : dict

        figsize: (float, float), default (10, 10)
            Figure size (width, height in inches)
        plot_stderr : bool, default True
            Plot standard impulse response error bands
        stderr_type : str
            'asym': default, computes asymptotic standard errors
            'mc': monte carlo standard errors (use rpl)
        repl : int, default 1000
            Number of replications for monte carlo standard errors
        seed : int
            np.random.seed for Monte Carlo replications
        z/Cumulative responses responses (orthogonalized)zCumulative responses)r+   r8   z)`stderr_type` must be one of 'asym', 'mc'r+   r<   r8   )r!   r5   r/   r6   N)r/   Zhlinesr2   r0   r1   r4   )r   r   r   r   r=   r)   Úcum_errband_mcrB   rC   r   rD   )r   r!   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   rE   r   r   rF   rG   r   r   r   Úplot_cum_effects¯   s:    #
 ÿ  úzBaseIRAnalysis.plot_cum_effects)Nr   NFF)FF)F)F)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r"   r(   r)   rH   rJ   r   r   r   r   r      s8     ÿ
3
      ýV     ýr   c                   @   sÀ   e Zd ZdZd,dd„Zd-dd„Zd.dd„Zd/dd„Zd0dd„Zd1dd„Z	dd„ Z
edd„ ƒZdd„ Zd2dd„Zd3dd„Zd4dd„Zd5d d!„Zd6d"d#„Zd7d$d%„Zd&d'„ Zed(d)„ ƒZd*d+„ ZdS )8Ú
IRAnalysisuô   
    Impulse response analysis class. Computes impulse responses, asymptotic
    standard errors, and produces relevant plots

    Parameters
    ----------
    model : VAR instance

    Notes
    -----
    Using LÃ¼tkepohl (2005) notation
    Nr   Fc              	   C   s@   t j| ||||||d� |r&|j| _n|j| _|j| _i | _d S )N)r   r   r   r   r   )r   r   Zcov_var_reprÚcov_aZ
_cov_alphaZ
_cov_sigmaÚcov_sigÚ_g_memo)r   r   r   r   r   r   r   r   r   r   r   ý   s      ÿ
zIRAnalysis.__init__c                 C   sv   |r|   ¡ S |  | jd ¡}t | jd | jd f¡|d< td| jd ƒD ]&}| j|d  }|| j |j	 ||< qJ|S )u°   
        Compute asymptotic standard errors for impulse response coefficients

        Notes
        -----
        LÃ¼tkepohl eq 3.7.5

        Returns
        -------
        é   é   r   )
Ú	_orth_covÚ_empty_covmr   r   Úzerosr	   ÚrangeÚGrP   r   )r   r!   ÚcovsÚiZGir   r   r   r(     s    zIRAnalysis.covr,   r*   éd   c           	   	   C   sD   | j }| j}|r(|j||||||dd�S |j||||||dd�S dS )z8
        IRF Monte Carlo integrated error bands
        F©r!   r5   Ústepsr/   r6   ÚburnZcumN)r   r   Zsirf_errband_mcÚirf_errband_mc)	r   r!   r   r5   r/   r6   r_   r   r   r   r   r   r>   !  s    
  þ
  þzIRAnalysis.errband_mcc                 C   s’  | j }| j}	|  ||¡}
| j}|j|||	||d�}t |¡}|  |¡\}}}|dk	r¢t 	|¡||fkr‚t
dt|ƒ d t|ƒ ƒ‚t |¡||	 kržt
dƒ‚n|}t |
¡}t |
¡}t|ƒD ]Ê}t|ƒD ]¼}|
dd…||f |||dd…|||f f | t ||||||f f ¡  |dd…||f< |
dd…||f |||dd…|||f f | t ||||||f f ¡  |dd…||f< qÊq¾||fS )aÁ  
        IRF Sims-Zha error band method 1. Assumes symmetric error bands around
        mean.

        Parameters
        ----------
        orth : bool, default False
            Compute orthogonalized impulse responses
        repl : int, default 1000
            Number of MC replications
        signif : float (0 < signif < 1)
            Significance level for error bars, defaults to 95% CI
        seed : int, default None
            np.random seed
        burn : int, default 100
            Number of initial simulated obs to discard
        component : neqs x neqs array, default to largest for each
            Index of column of eigenvector/value to use for each error band
            Note: period of impulse (t=0) is not included when computing
            principle component

        References
        ----------
        Sims, Christopher A., and Tao Zha. 1999. "Error Bands for Impulse
        Response". Econometrica 67: 1113-1155.
        ©r!   r5   r^   r6   r_   NúComponent array must be ú x ú,Atleast one of the components does not existrS   )r   r   r"   r	   Ú	irf_resimr   Znorm_signif_levelÚ_eigval_decomp_SZr   Úshaper=   ÚstrÚargmaxÚcopyrX   Úsqrt)r   r!   r   r5   r/   r6   r_   r7   r   r   r   r	   re   ÚqÚWÚeigvaÚkÚlowerÚupperr[   Újr   r   r   r?   1  s.    
 ÿ



\`zIRAnalysis.err_band_sz1c              	   C   sþ  | j }| j}	|  ||¡}
| j}|j|||	|dd�}|  |¡\}}}|dk	r˜t |¡||fkrxtdt	|ƒ d t	|ƒ ƒ‚t 
|¡||	 kr”tdƒ‚n|}t ||	d ||f¡}t|ƒD ]`}t|ƒD ]R}t|ƒD ]D}||||||f dd…f ||dd…||f  ||dd…||f< qÎqÂq¶tj|dd	�}t|d
 | ƒd td|d
  | ƒd f}t |
¡}t |
¡}t|ƒD ]†}t|ƒD ]v}|
dd…||f ||d dd…||f  |dd…||f< |
dd…||f ||d dd…||f  |dd…||f< �qz�qn||fS )aÖ  
        IRF Sims-Zha error band method 2.

        This method Does not assume symmetric error bands around mean.

        Parameters
        ----------
        orth : bool, default False
            Compute orthogonalized impulse responses
        repl : int, default 1000
            Number of MC replications
        signif : float (0 < signif < 1)
            Significance level for error bars, defaults to 95% CI
        seed : int, default None
            np.random seed
        burn : int, default 100
            Number of initial simulated obs to discard
        component : neqs x neqs array, default to largest for each
            Index of column of eigenvector/value to use for each error band
            Note: period of impulse (t=0) is not included when computing
            principle component

        References
        ----------
        Sims, Christopher A., and Tao Zha. 1999. "Error Bands for Impulse
        Response". Econometrica 67: 1113-1155.
        r\   ra   Nrb   rc   rd   rS   r   r   rT   )r   r   r"   r	   re   rf   r   rg   r=   rh   ri   rW   rX   ÚsortÚroundrj   )r   r!   r   r5   r/   r6   r_   r7   r   r   r   r	   re   rm   rn   ro   ÚgammaÚpr[   rr   Ú
gamma_sortÚindxrp   rq   r   r   r   r@   j  s8    ÿ
F,

8@zIRAnalysis.err_band_sz2c              	   C   s4  | j }| j}	|  ||¡}
| j}|j|||	|dd�}t |||	| f¡}t|ƒD ]@}t|ƒD ]2}t ||dd…dd…|f j	¡|||dd…f< qZqNt ||	| |	| f¡}t ||	| |	| f¡}t ||	| f¡}tj|t
d�}|dk	�r,t |¡|k�r
tdt|ƒ ƒ‚t |¡||	 k�r(tdƒ‚n|}t|ƒD ]<}tj|| dd	�||< t || ¡\||< ||< ||< �q4t ||	d ||f¡}t|ƒD ]¼}d}t|ƒD ]¨}t|ƒD ]˜}|||| ||	 |d |	 …f ||dd…||f  ||dd…||f< ||d k�r¬|||| ||	 d…f ||dd…||f  ||dd…||f< �q¬�q �q�tj|dd
�}t|d | ƒd td|d  | ƒd f}t |
¡}t |
¡}t|ƒD ]†}t|ƒD ]v}|
dd…||f ||d dd…||f  |dd…||f< |
dd…||f ||d dd…||f  |dd…||f< �q°�q¤||fS )aÂ  
        IRF Sims-Zha error band method 3. Does not assume symmetric error bands around mean.

        Parameters
        ----------
        orth : bool, default False
            Compute orthogonalized impulse responses
        repl : int, default 1000
            Number of MC replications
        signif : float (0 < signif < 1)
            Significance level for error bars, defaults to 95% CI
        seed : int, default None
            np.random seed
        burn : int, default 100
            Number of initial simulated obs to discard
        component : vector length neqs, default to largest for each
            Index of column of eigenvector/value to use for each error band
            Note: period of impulse (t=0) is not included when computing
            principle component

        References
        ----------
        Sims, Christopher A., and Tao Zha. 1999. "Error Bands for Impulse
        Response". Econometrica 67: 1113-1155.
        r\   ra   rS   N©Zdtypez"Component array must be of length rd   r   ©Zrowvarr   rT   )r   r   r"   r	   re   r   rW   rX   Zravelr   ÚintÚsizer=   rh   ri   r(   r   Úeigval_decomprs   rt   rj   )r   r!   r   r5   r/   r6   r_   r7   r   r   r   r	   re   Ústackrv   r[   Z	stack_covrm   rn   ro   ru   Úcrr   rw   rx   rp   rq   r   r   r   rA   ª  sT    
 ÿ2

$FJ,

8@zIRAnalysis.err_band_sz3c           
      C   s  | j }| j}t ||||f¡}t|ƒD ]H}t|ƒD ]:}tj|dd…dd…||f dd�|||dd…dd…f< q2q&t ||||f¡}t |||df¡}tj||ftd�}	t|ƒD ]b}t|ƒD ]T}t |||dd…dd…f ¡\|||dd…dd…f< |||dd…df< |	||f< qºq®|||	fS )z¸
        Returns
        -------
        W: array of eigenvectors
        eigva: list of eigenvalues
        k: matrix indicating column # of largest eigenvalue for each c_i,j
        NrS   r   rz   ry   )	r	   r   r   rW   rX   r(   r{   r   r}   )
r   re   r	   r   Zcov_holdr[   rr   rm   rn   ro   r   r   r   rf   û  s    :TzIRAnalysis._eigval_decomp_SZc                    s2   ˆj ‰ ‡ ‡fdd„‰‡fdd„tdˆjd ƒD ƒS )Nc                    sx   d}t | ƒD ]f}| d | }|ˆjkr2ˆj| }n&t ˆjj|¡}|d ˆ … }|ˆj|< t |ˆj| ¡}|| }q|S )Nç        rS   )	rX   rR   r   Zmatrix_powerr   r   r   Úkronr   )r[   rY   ÚmÚidxZapowZpiece)ÚKr   r   r   Ú_make_g  s    


zIRAnalysis.G.<locals>._make_gc                    s   g | ]}ˆ |ƒ‘qS r   r   )Ú.0r[   )r…   r   r   Ú
<listcomp>1  s     z IRAnalysis.G.<locals>.<listcomp>rS   )r	   rX   r   ©r   r   )r„   r…   r   r   rY     s    zIRAnalysis.Gc           
      C   sº   t  | j¡}t  | jj|¡}| j}|  | jd ¡}t	| jd ƒD ]t}|dkrRd}n&t  
|| j|d  ¡}|| j |j }t  
t  || j| ¡|¡}|| j |j | j }	||	 ||< q@|S )NrS   r   )r   Úeyer	   r�   r   r   ÚHrV   r   rX   r   rY   rP   r   rQ   )
r   ÚIkÚPIkrŠ   rZ   r[   ÚapieceZCiZCibarÚbpiecer   r   r   rU   3  s    zIRAnalysis._orth_covc                 C   s  t  | j¡}t  | jj|¡}d}|  | jd ¡}t| jd ƒD ]È}|dkr\|| j	|d   }|rÊ|dkrnd}nt  
||¡}|| j |j }t  
t  || j| ¡| j¡}	|	| j |	j | j }
||
 ||< q>|dkròt  | jd | jd f¡||< q>|| j |j ||< q>|S )a  
        Compute asymptotic standard errors for cumulative impulse response
        coefficients

        Parameters
        ----------
        orth : bool

        Notes
        -----
        eq. 3.7.7 (non-orth), 3.7.10 (orth)

        Returns
        -------
        r€   rS   r   rT   )r   r‰   r	   r�   r   r   rV   r   rX   rY   r   rP   r   rŠ   rQ   rW   )r   r!   r‹   rŒ   ÚFrZ   r[   r�   ZBnZBnbarrŽ   r   r   r   r)   J  s(    zIRAnalysis.cum_effect_covc              	   C   s$   | j }| j}|j||||||dd�S )zM
        IRF Monte Carlo integrated error bands of cumulative effect
        Tr]   )r   r   r`   )r   r!   r5   r/   r6   r_   r   r   r   r   r   rI   w  s       þzIRAnalysis.cum_errband_mcc                 C   s˜   | j }t t |j| j¡|¡}t | j¡}|r„t t | j	jt | j¡¡|¡}t t ||¡| j
¡}|| j |j || j |j  S || j |j S dS )z)
        Returns
        -------
        N)r   r   r�   Ztiler   r
   r‰   r	   r   r   rŠ   rP   rQ   )r   r!   ZlreZFinftyr‹   ZBinfZBinfbarr   r   r   Úlr_effect_cov‚  s     ÿzIRAnalysis.lr_effect_covc                 C   s   t  dd„ | j|d�D ƒ¡S )Nc              	   S   s"   g | ]}t  t t |¡¡¡‘qS r   ©ÚtsaÚunvecr   rk   Údiag©r†   r   r   r   r   r‡   •  s   ÿz%IRAnalysis.stderr.<locals>.<listcomp>r<   )r   Úarrayr(   ©r   r!   r   r   r   rF   ”  s    

ÿzIRAnalysis.stderrc                 C   s   t  dd„ | j|d�D ƒ¡S )Nc              	   S   s"   g | ]}t  t t |¡¡¡‘qS r   r‘   r•   r   r   r   r‡   ™  s   ÿz0IRAnalysis.cum_effect_stderr.<locals>.<listcomp>r<   )r   r–   r)   r—   r   r   r   Úcum_effect_stderr˜  s    

ÿzIRAnalysis.cum_effect_stderrc                 C   s"   | j |d�}t t t |¡¡¡S )Nr<   )r�   r’   r“   r   rk   r”   )r   r!   r(   r   r   r   Úlr_effect_stderrœ  s    zIRAnalysis.lr_effect_stderrc                 C   s    t j|| jd | jd ftd�S )NrT   ry   )r   rW   r	   Úfloat)r   r   r   r   r   rV      s    ÿzIRAnalysis._empty_covmc                 C   sd   | j }t |¡}t ||¡}t |¡}|t || j¡| t | j|¡  |j }t 	|jt
 |¡¡S r    )r	   r’   Zelimination_matrixZcommutation_matrixr   r‰   r�   r   r   r   ÚLÚinv)r   ro   ZLkZKkkr‹   ÚBr   r   r   rŠ   ¤  s    

*zIRAnalysis.Hc                 C   s   t ‚d S r    r#   rˆ   r   r   r   Ú
fevd_table³  s    zIRAnalysis.fevd_table)Nr   NFF)F)FFr,   r*   Nr\   )FFr,   r*   Nr\   N)FFr,   r*   Nr\   N)FFr,   r*   Nr\   N)F)Fr,   r*   Nr\   )F)F)F)F)rK   rL   rM   rN   r   r(   r>   r?   r@   rA   rf   r   rY   rU   r)   rI   r�   rF   r˜   r™   rV   rŠ   rž   r   r   r   r   rO   ð   sX     ÿ

      ÿ
        ÿ
9      ÿ
@      ÿ
Q

-      ÿ





rO   )rN   Únumpyr   Znumpy.linalgZlinalgr   Zscipy.linalgr›   Zstatsmodels.tools.decoratorsr   Zstatsmodels.tsa.tsatoolsr’   ZtsatoolsZ"statsmodels.tsa.vector_ar.plottingZ	vector_arrB   Zstatsmodels.tsa.vector_ar.utilr   r–   Úmatr   rO   r   r   r   r   Ú<module>   s    _