
    'YHhH_                         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c mZ ddlmc mc mZ ddlmc mc mZ ej$                  Z G d d      Z G d de      Zy)z
Impulse reponse-related code
    N)cache_readonlyc                   r    e Zd ZdZ	 	 ddZddZd Zd Z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Z	y)BaseIRAnalysisz
    Base class for plotting and computing IRF-related statistics, want to be
    able to handle known and estimated processes
    Nc                    || _         || _        |j                  |j                  |j                  c| _        | _        | _        || _        |!|j                  }t        j                  |      }|| _        || _        |j                  |      | _        |r|j                  ||      | _        n|j#                  ||      | _        | j                  j'                  d      | _        |r"| j                   j'                  d      | _        n!| j$                  j'                  d      | _        |sj|j/                         | _        |r*t3        j4                  |j/                         |      | _        n)t3        j4                  |j/                         |      | _        |r%t;        j<                  |j>                        | _         y t;        j<                  |jB                        | _         y )N)Pr   axis)"modelperiodsneqsk_arnobslagsTordersigma_ulacholeskyr   svarma_repirfssvar_ma_rep	svar_irfsorth_ma_rep	orth_irfscumsumcum_effectssvar_cum_effectsorth_cum_effectslong_run_effects
lr_effectsnpdotsvar_lr_effectsorth_lr_effectsutilcomp_matrixvar_rep_Acoefs)selfr
   r   r   r   r   vecmsigmas           V/var/www/html/planif/env/lib/python3.12/site-packages/statsmodels/tsa/vector_ar/irf.py__init__zBaseIRAnalysis.__init__   sx   
',zz5::uzz$	49df
9MME E"A	LL)	"..w!.<DN"..w!.<DN99+++3$(NN$9$9q$9$AD!$(NN$9$9q$9$AD! #446DO')vve.D.D.F'J$')vve.D.D.F'J$ &&u}}5DG&&u{{3DG    c                 R    |r| j                   S |r| j                  S | j                  S N)r   r   r   )r+   orthr   s      r.   _choose_irfszBaseIRAnalysis._choose_irfsJ   s&    >>!>>!99r0   c                     t         r2   NotImplementedErrorr+   argskwargss      r.   covzBaseIRAnalysis.covR       !!r0   c                     t         r2   r6   r8   s      r.   cum_effect_covzBaseIRAnalysis.cum_effect_covU   r<   r0   皙?)
   r@   Tasym  )impulseresponsesignifplot_paramsfigsizesubplot_paramsplot_stderrstderr_typereplseed	componentc                H   | j                   }| j                  }| j                  }|r|rt        d      | j	                  ||      }|rd}n|rd}nd}|du rd}n|	dvrt        d      |	d	k(  r| j                  |
      }|	dk(  r| j                  |||
||      }|	dk(  r| j                  |||
|||      }|	dk(  r| j                  |||
|||      }|	dk(  r| j                  |||
|||      }t        j                  |||| j                  j                  ||||||	      }|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)rA   mcsz1sz2sz3z<Error type must be either 'asym', 'mc','sz1','sz2', or 'sz3'rA   r3   rO   )r3   r   rK   rE   rL   rP   )r3   r   rK   rE   rL   rM   rQ   rR   )rE   rH   rF   rG   rJ   )r   r
   r   
ValueErrorr4   r;   
errband_mcerr_band_sz1err_band_sz2err_band_sz3plottingirf_grid_plotnames)r+   r3   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   r   r
   r   r   titlestderrfigs                       r.   plotzBaseIRAnalysis.plotX   s   F ,,

yyD>??  t,8E4E'E%F BB[\\f$t,d"d.26.2 ) 4 e#**404V045> + @ e#**404V045> + @ e#**404V045> + @
 $$T67H%)ZZ%5%5uV4B1<-41<> 
r0   )
rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   c       
         f   |rd}| j                   }| j                  }nd}| j                  }| j                  }|	dvrt	        d      |	dk(  r| j                  |      }|	dk(  r| j                  ||
||      }|sd	}t        j                  |||| j                  j                  |||||||	
      }|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)rA   rO   z)`stderr_type` must be one of 'asym', 'mc'rA   rS   rO   )r3   rK   rE   rL   N)rE   hlinesrH   rF   rG   rJ   )r   r%   r   r!   rT   r>   cum_errband_mcrY   rZ   r
   r[   )r+   r3   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   r\   r   r!   r]   r^   s                    r.   plot_cum_effectszBaseIRAnalysis.plot_cum_effects   s    F EE//K--J*E**KJn,HIIf$,,$,7d",,$T4: - GF$$[&'8%)ZZ%5%5uV,64B1<-41<> 
r0   Nr@   NFF)FFF)
__name__
__module____qualname____doc__r/   r4   r;   r>   r_   rc    r0   r.   r   r      sm    
 DI14f""T$dH dTTTl>dT $$(,$%+$T>r0   r   c                       e Zd ZdZ	 	 ddZddZ	 	 ddZ	 	 ddZ	 	 ddZ	 	 ddZ	d	 Z
ed
        Zd ZddZ	 	 ddZddZddZddZddZd Zed        Zd Zy)
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
    Nc           	          t         j                  | ||||||       |r|j                  | _        n|j                  | _        |j
                  | _        i | _        y )N)r   r   r   r   r,   )r   r/   cov_var_reprcov_a
_cov_alpha
_cov_sigmacov_sig_g_memo)r+   r
   r   r   r   r   r,   s          r.   r/   zIRAnalysis.__init__   sZ    eq'&+$T 	  	C ++DJ))DJ'' r0   c                 l   |r| j                         S | j                  | j                  dz         }t        j                  | j
                  dz  | j
                  dz  f      |d<   t        d| j                  dz         D ]3  }| j                  |dz
     }|| j                  z  |j                  z  ||<   5 |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Gro   r   )r+   r3   covsiGis        r.   r;   zIRAnalysis.cov
  s     >>##q 01((DIINDIIN;<Qq$,,*+ 	-AAB4::o,DG	- r0   c           	          | j                   }| j                  }|r|j                  ||||||d      S |j                  ||||||d      S )z8
        IRF Monte Carlo integrated error bands
        Fr3   rK   stepsrE   rL   burncum)r
   r   sirf_errband_mcirf_errband_mc)	r+   r3   r   rK   rE   rL   r   r
   r   s	            r.   rU   zIRAnalysis.errband_mc   sk    
 

,,((dW06T.2 ) ? ? ''TG/5D-1u ( > >r0   c                 z   | j                   }| j                  }	| j                  ||      }
| j                  }|j	                  |||	||      }t        j                  |      }| j                  |      \  }}}|ht        j                  |      ||fk7  r&t        dt        |      z   dz   t        |      z         t        j                  |      ||	z  k\  rt        d      |}t        j                  |
      }t        j                  |
      }t        |      D ]  }t        |      D ]  }|
dd||f   |||dd|||f   f   |z  t        j                  ||||||f   f         z  z   |dd||f<   |
dd||f   |||dd|||f   f   |z  t        j                  ||||||f   f         z  z
  |dd||f<     ||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.
        r3   rK   r   rL   r   NComponent array must be  x ,Atleast one of the components does not existru   )r
   r   r4   r   	irf_resimr&   norm_signif_level_eigval_decomp_SZr"   shaperT   strargmaxcopyrz   sqrt)r+   r3   r   rK   rE   rL   r   rM   r
   r   r   r   r   qWeigvaklowerupperr}   js                        r.   rV   zIRAnalysis.err_band_sz10  s   : 

,,  t,yyOOD)-D $ :	""6*++I65! xx	"tDk1 !;c$i!G%!ORUVZR[![\\yy#tG|3 !OPP t 	\A4[ \ $QR!Vq1Qq1vq/@qQRSTUVWXUXSYzIZA[/[ [ab1f $QR!Vq1Qq1vq/@qQRSTUVWXUXSYzIZA[/[ [ab1f\	\
 e|r0   c           	         | j                   }| j                  }	| j                  ||      }
| j                  }|j	                  |||	|d      }| j                  |      \  }}}|ht        j                  |      ||fk7  r&t        dt        |      z   dz   t        |      z         t        j                  |      ||	z  k\  rt        d      |}t        j                  ||	dz   ||f      }t        |      D ]G  }t        |      D ]7  }t        |      D ]'  }||||||f   ddf   ||dd||f   z  ||dd||f<   ) 9 I t        j                  |d	      }t        |d
z  |z        dz
  t        d|d
z  z
  |z        dz
  f}t        j                  |
      }t        j                  |
      }t        |      D ]T  }t        |      D ]D  }|
dd||f   ||d   dd||f   z   |dd||f<   |
dd||f   ||d   dd||f   z   |dd||f<   F V ||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.
        d   r   Nr   r   r   ru   r   r   rv   )r
   r   r4   r   r   r   r"   r   rT   r   r   ry   rz   sortroundr   )r+   r3   r   rK   rE   rL   r   rM   r
   r   r   r   r   r   r   r   gammapr}   r   
gamma_sortindxr   r   s                           r.   rW   zIRAnalysis.err_band_sz2i  sV   : 

,,  t,yyOODd), $ .	 ,,Y75! xx	"tDk1 !;c$i!G%!ORUVZR[![\\yy#tG|3 !OPP$	467t 	LA4[ Lt LA&'!AacF1o	!ABq(8K&KE!ABq(OLL	L
 WWU+
VAXd]#A%eQvaxZ,=&>q&@@t 	GA4[ G#AaE{ZQ!A-FFa!e#AaE{ZQ!A-FFa!eG	G
 e|r0   c           	         | j                   }| j                  }	| j                  ||      }
| j                  }|j	                  |||	|d      }t        j                  |||	|z  f      }t        |      D ]D  }t        |      D ]4  }t        j                  ||dddd|f   j                        |||ddf<   6 F t        j                  ||	|z  |	|z  f      }t        j                  ||	|z  |	|z  f      }t        j                  ||	|z  f      }t        j                  |t              }|Wt        j                  |      |k7  rt        dt        |      z         t        j                  |      ||	z  k\  rt        d      |}t        |      D ]D  }t        j                  ||   d	      ||<   t!        j"                  ||         \  ||<   ||<   ||<   F t        j                  ||	dz   ||f      }t        |      D ]}  }d}t        |      D ]k  }t        |      D ][  }||||   ||	z  |dz   |	z  f   ||dd||f   z  ||dd||f<   ||dz
  k(  s7||||   ||	z  df   ||dd||f   z  ||dd||f<   ] m  t        j$                  |d
      }t'        |dz  |z        dz
  t'        d|dz  z
  |z        dz
  f}t        j(                  |
      }t        j(                  |
      }t        |      D ]T  }t        |      D ]D  }|
dd||f   ||d   dd||f   z   |dd||f<   |
dd||f   ||d   dd||f   z   |dd||f<   F V ||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   r   ru   Ndtypez"Component array must be of length r   r   rowvarr   rv   )r
   r   r4   r   r   r"   ry   rz   ravelr   intsizerT   r   r   r;   r&   eigval_decompr   r   r   )r+   r3   r   rK   rE   rL   r   rM   r
   r   r   r   r   stackr   r}   	stack_covr   r   r   r   cr   r   r   r   r   s                              r.   rX   zIRAnalysis.err_band_sz3  s   8 

,,  t,yyOOD)-C $ 9	$gdl34 t 	@A4[ @ "1QR!8)<)>)> ?a1f@	@ ((D'$,=>	HHdGDL'$,78$-.HHT% wwy!d+ !ED	!QRRyy#tG|3 !OPP t 	DA66%(!4IaL#'#5#5il#C AaD%(AaD	D $	467t 	UAA4[ Ut UA&'!A$qy!A#w/F(F&G)TUVWVXYZ[\T\J]&]E!ABq(ODF{*+Aad1W9:,=*>1QRPQRS8AT*Ta1QhUU	U WWU+
VAXd]#A%eQvaxZ,=&>q&@@t 	GA4[ G#AaE{ZQ!A-FFa!e#AaE{ZQ!A-FFa!eG	G
 e|r0   c                 `   | j                   }| j                  }t        j                  ||||f      }t	        |      D ]?  }t	        |      D ]/  }t        j
                  |dddd||f   d      |||ddddf<   1 A t        j                  ||||f      }t        j                  |||df      }t        j                  ||ft              }	t	        |      D ]O  }t	        |      D ]?  }t        j                  |||ddddf         \  |||ddddf<   |||dddf<   |	||f<   A 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
        Nru   r   r   r   )	r   r   r"   ry   rz   r;   r   r&   r   )
r+   r   r   r   cov_holdr}   r   r   r   r   s
             r.   r   zIRAnalysis._eigval_decomp_SZ  sH    yy,,88T4':;t 	IA4[ I$&FF9Qqr!AX+>a$H1Qq!I	I HHdD'734$gq12HHdD\-t 	[A4[ [595G5GQRSTUVWXQXHY5Z2!Aa'
E!Aa'NAacF[	[ %{r0   c                       j                    fd}t        d j                  dz         D cg c]
  } ||       c}S c c}w )Nc                 D   d}t        |       D ]  }| dz
  |z
  }|j                  v rj                  |   }n>t        j                  j                  j
                  |      }|d  }|j                  |<   t        j                  |j                  |         }||z   } |S )N        ru   )	rz   rs   r   matrix_powerr)   r   r"   kronr   )r}   r{   midxapowpieceKr+   s         r.   _make_gzIRAnalysis.G.<locals>._make_g  s    A1X !eai$,,&<<,D??47799c:D8D(,DLL% diil3I Hr0   ru   )r   rz   r   )r+   r   r}   r   s   `  @r.   r{   zIRAnalysis.G  s=     II
	( %*!T\\A-=$>?q
???s   Ac                    t        j                  | j                        }t        j                  | j                  j
                  |      }| j                  }| j                  | j                  dz         }t        | j                  dz         D ]  }|dk(  rd}nBt        j                  || j                  |dz
           }|| j                  z  |j
                  z  }t        j                  t        j                  || j                  |         |      }|| j                  z  |j
                  z  | j
                  z  }	||	z   ||<    |S )Nru   r   )r"   eyer   r   r   r   Hrx   r   rz   r#   r{   ro   r   rr   )
r+   IkPIkr   r|   r}   apieceCiCibarbpieces
             r.   rw   zIRAnalysis._orth_cov2  s    VVDIIggdffhh#FFq 01t||a'( 	&AAvVVC!-djj244/FF2772tyy|4a8Edll*UWW4>F voDG	& r0   c                 \   t        j                  | j                        }t        j                  | j                  j
                  |      }d}| j                  | j                  dz         }t        | j                  dz         D ]&  }|dkD  r|| j                  |dz
     z   }|r|dk(  rd}n2t        j                  ||      }|| j                  z  |j
                  z  }t        j                  t        j                  || j                  |         | j                        }	|	| j                  z  |	j
                  z  | j
                  z  }
||
z   ||<   |dk(  r6t        j                  | j                  dz  | j                  dz  f      ||<   || j                  z  |j
                  z  ||<   ) |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   ru   r   rv   )r"   r   r   r   r   r   rx   r   rz   r{   r#   ro   r   r   rr   ry   )r+   r3   r   r   Fr|   r}   r   BnBnbarr   s              r.   r>   zIRAnalysis.cum_effect_covI  sc     VVDIIggdffhh#q 01t||a'( 	/A1uq1u%6FQB$**_rtt3Frwwr4+;+;A+>?H$,,.8DFFB 6/Q6 hh		1diil'CDDGdjj.133.Q)	/, r0   c           	      b    | j                   }| j                  }|j                  ||||||d      S )zM
        IRF Monte Carlo integrated error bands of cumulative effect
        Tr   )r
   r   r   )r+   r3   rK   rE   rL   r   r
   r   s           r.   rb   zIRAnalysis.cum_errband_mcv  s@    
 

,,##D*1&)-Dd $ D 	Dr0   c                    | j                   }t        j                  t        j                  |j                  | j
                        |      }t        j                  | j                        }|rt        j                  t        j                  | j                  j                  t        j                  | j                              |      }t        j                  t        j                  ||      | j                        }|| j                  z  |j                  z  || j                  z  |j                  z  z   S || j                  z  |j                  z  S )z)
        Returns
        -------
        )r!   r"   r   tiler   r   r   r   r#   r   r   ro   rr   )r+   r3   lreFinftyr   BinfBinfbars          r.   lr_effect_covzIRAnalysis.lr_effect_cov  s    
 oo		2C8VVDII66"''$&&((BFF499,=>GDffRWWR-tvv6G4::%.dll*WYY67 8 DJJ&11r0   c                     t        j                  | j                  |      D cg c]=  }t        j                  t        j
                  t        j                  |                  ? c}      S c c}w NrS   )r"   arrayr;   tsaunvecr   diagr+   r3   r   s      r.   r]   zIRAnalysis.stderr  sS    xx"&((("57 2772771:#67 7 8 	8 7   AA-c                     t        j                  | j                  |      D cg c]=  }t        j                  t        j
                  t        j                  |                  ? c}      S c c}w r   )r"   r   r>   r   r   r   r   r   s      r.   cum_effect_stderrzIRAnalysis.cum_effect_stderr  s[    xx"&"5"54"5"@B 2772771:#67 B C 	C Br   c                     | j                  |      }t        j                  t        j                  t        j
                  |                  S r   )r   r   r   r"   r   r   )r+   r3   r;   s      r.   lr_effect_stderrzIRAnalysis.lr_effect_stderr  s5      d +yy.//r0   c                 r    t        j                  || j                  dz  | j                  dz  ft              S )Nrv   r   )r"   ry   r   float)r+   r   s     r.   rx   zIRAnalysis._empty_covm  s/    xx$))q.$))q.A#% 	%r0   c                    | j                   }t        j                  |      }t        j                  ||      }t	        j
                  |      }|t	        j                  || j                        |z  t	        j                  | j                  |      z   z  |j                  z  }t	        j                  |j                  t        j                  |            S r2   )r   r   elimination_matrixcommutation_matrixr"   r   r   r   r   r#   Linv)r+   r   LkKkkr   Bs         r.   r   zIRAnalysis.H  s    II##A&$$Q*VVAY "''"dff%+bggdffb.AABRTTIvvbddAEE!H%%r0   c                     t         r2   r6   )r+   s    r.   
fevd_tablezIRAnalysis.fevd_table  r<   r0   rd   re   )FFrB   r?   Nr   )FFrB   r?   Nr   N)FrB   r?   Nr   )rf   rg   rh   ri   r/   r;   rU   rV   rW   rX   r   r   r{   rw   r>   rb   r   r]   r   r   rx   r   r   rj   r0   r.   rl   rl      s     DI, 7;03>  9=AE7r FJ48>@ FJ48Ob2 @ @<.+Z /347	D2$8C0% & &"r0   rl   )ri   numpyr"   numpy.linalglinalgr   scipy.linalgr   statsmodels.tools.decoratorsr   statsmodels.tsa.tsatoolsr   tsatools"statsmodels.tsa.vector_ar.plotting	vector_arrY   statsmodels.tsa.vector_ar.utilr&   r   matr   rl   rj   r0   r.   <module>r      sN       7 & & 5 5 - -hh[ [|D" D"r0   