U
    Kvf3                     @   sj   d Z ddlZddlZddlmZ ddlmZmZ ddl	m
Z
mZmZ ddlmZmZ G dd dejZdS )	zs
(Internal) AR(1) model for monthly growth rates aggregated to quarterly freq.

Author: Chad Fulton
License: BSD-3
    N)Bunch)mlemodelinitialization)SMOOTHER_STATESMOOTHER_STATE_COVSMOOTHER_STATE_AUTOCOV)constrain_stationary_univariate!unconstrain_stationary_univariatec                       s   e Zd ZdZ fddZedd Zedd Z fdd	ZdddZ	dddZ
d ddZd!ddZdd Zdd Z fddZ  ZS )"QuarterlyAR1a  
    AR(1) model for monthly growth rates aggregated to quarterly frequency

    Parameters
    ----------
    endog : array_like
        The observed time-series process :math:`y`

    Notes
    -----
    This model is internal, used to estimate starting parameters for the
    DynamicFactorMQ class. The model is:

    .. math::

        y_t & = \begin{bmatrix} 1 & 2 & 3 & 2 & 1 \end{bmatrix} \alpha_t \\
        \alpha_t & = \begin{bmatrix}
            \phi & 0 & 0 & 0 & 0 \\
               1 & 0 & 0 & 0 & 0 \\
               0 & 1 & 0 & 0 & 0 \\
               0 & 0 & 1 & 0 & 0 \\
               0 & 0 & 0 & 1 & 0 \\
        \end{bmatrix} +
        \begin{bmatrix} 1 \\ 0 \\ 0 \\ 0 \\ 0 \end{bmatrix} \varepsilon_t

    The two parameters to be estimated are :math:`\phi` and :math:`\sigma^2`.

    It supports fitting via the usual quasi-Newton methods, as well as using
    the EM algorithm.

    c                    sN   t  j|dddd dddddg| d< td| d	dd d d
f< d| d< d S )N      Z
stationary)k_statesZk_posdefr         Zdesign   
transitiong      ?)Z	selectionr   r   )super__init__npZeye)selfendog	__class__ M/tmp/pip-unpacked-wheel-2v6byqio/statsmodels/tsa/statespace/_quarterly_ar1.pyr   3   s    zQuarterlyAR1.__init__c                 C   s   ddgS )NphiZsigma2r   r   r   r   r   param_names:   s    zQuarterlyAR1.param_namesc                 C   s   t dt | jd gS )Nr      )r   arrayZnanvarr   r   r   r   r   start_params>   s    zQuarterlyAR1.start_paramsc              	      s0   t   t d t j||}W 5 Q R X |S )Nignore)warningscatch_warningssimplefilterr   fit)r   argskwargsoutr   r   r   r&   B   s    

zQuarterlyAR1.fitNTnone  ư>Fc                 C   s  | j rtd|rtd|d kr.| j}d}ntj|dd}|sJ| |}g }|g}d }d}d}||k r"|dk s|||kr"| j|d ||d	}||d j	
  ||d  |rtj| jd
|d jd |d jd d}|dkrd|d |d   t|d t|d   }|d7 }q`|
r2|d }n|rH| jj}|| j_| j|d d||d}|rl|| j_|	rtf t|t||d}tf ||d}nd }d }||_||_|S )NzFCannot fit using the EM algorithm while holding some parameters fixed.z?Cannot fit using the EM algorithm when using low_memory option.Tr   )Zndminr   r   r   )initmstep_methodZknown).r   )ZconstantZstationary_cov)transformedcov_typecov_kwds)paramsllfiter)	tolerancemaxiter)Z_has_fixed_paramsNotImplementedError
ValueErrorr!   r   r    transform_params_em_iterationappendllf_obssumr   ZInitializationr   smoothed_statesmoothed_state_covabsssmsmoothr   Zmle_retvalsZmle_settings)r   r!   r0   r1   r2   r7   r6   Zem_initializationr.   Zfull_outputZreturn_paramsZ
low_memoryr4   r3   r-   ideltar)   result	base_initZ
em_retvalsZem_settingsr   r   r   fit_emI   sr    
 


 
zQuarterlyAR1.fit_emc                 C   s&   | j ||d}| j|||d}||fS )N)r-   )r.   )_em_expectation_step_em_maximization_step)r   params0r-   r.   resparams1r   r   r   r;      s
    zQuarterlyAR1._em_iterationc                 C   sd   |  | |d k	r"| jj}|| j_| jjttB tB dd}tj| jj	j
dd|_|d k	r`|| j_|S )NF)Zupdate_filterT)copy)updaterB   r   rC   r   r   r   r   r    Z_kalman_filterZloglikelihoodr=   )r   rK   r-   rG   rL   r   r   r   rI      s    

 z!QuarterlyAR1._em_expectation_stepc              	   C   s0  |j jd }|jddd}|jddd}| t||ddd }|d d t|dd  |d d ddd }|d dd dd df jdd}	|d d d dd df jdd}
|dd d dd df jdd}|j	d d }|
|	 }|||
j  | }t
|}|d |d< |d |d< |S )N).Nr   r   r   r   )Zaxis)r   r   )r?   Tr@   Z	transposeZsmoothed_state_autocovrN   r   matmulr>   shapeZ
zeros_like)r   rL   rK   r.   aZcov_aZacov_aZEaaZEaa1ABCZnobsZf_AZf_QrM   r   r   r   rJ      s    2"""
z"QuarterlyAR1._em_maximization_stepc                 C   s"   t t|d d |d d gS )Nr   r   )r   hstackr   )r   Zunconstrainedr   r   r   r:      s    
zQuarterlyAR1.transform_paramsc                 C   s"   t t|d d |d d gS )Nr   g      ?)r   rW   r	   )r   Zconstrainedr   r   r   untransform_params   s    
zQuarterlyAR1.untransform_paramsc                    s,   t  j|f| |d | d< |d | d< d S )Nr   )r   r   r   r   )Z	state_covr   r   )r   rO   )r   r3   r(   r   r   r   rO      s    zQuarterlyAR1.update)NTr*   Nr+   r,   TNTFF)NN)N)N)__name__
__module____qualname____doc__r   propertyr   r!   r&   rH   r;   rI   rJ   r:   rX   rO   __classcell__r   r   r   r   r
      s.   

              
F



r
   )r\   r#   Znumpyr   Zstatsmodels.tools.toolsr   Zstatsmodels.tsa.statespacer   r   Z*statsmodels.tsa.statespace.kalman_smootherr   r   r   Z statsmodels.tsa.statespace.toolsr   r	   ZMLEModelr
   r   r   r   r   <module>   s   