U
    Kvfã8  ã                
   @   s2  d Z ddlmZ ddlZddlmZ dgZddlm	Z	 dd„ Z
d	d
„ ZG dd„ de	ƒZG dd„ dƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZedkr.ddlm  mZ ddlZddlm	Z	 ddlmZ ejj ¡ Zejdd… Zejdd… Zej edee!ddZ"e #e"¡Z$e$ %ddg¡ &¡ Z'eddg  (e!¡ )dd¡Zej*eddZe
ed ƒZ+ed Z,eeee+e,ddgd d!Z-e-j.d"d#Z/e-j.d$d%d&Z0e-j.d'd%d&Z1e-j.d$d(d&Z2e-j.d'd(d&Z3e-j.d'd)d&Z4e 5dddd*d*dddg¡Z6e6j7d Z8e 9e6¡Z:e 5dd*dd*ddd*dg¡Z;e 9e;¡Z<e6dd…df e:k =e!¡Z>e;dd…df e<k =e!¡Z?d+Z@e Ad,¡ZBe Ad-¡ZCejDeBe> eCe? f ZEe FeEeEjG¡e@e He8¡  ZIeJeIƒ eJejK LeI¡ƒ ejK MeI¡\ZNZOe FeOd*eN eO jG¡ZPejK QeI¡ZRe FeOeNeO jG¡ZSeJe Te UeSeI ¡¡ƒ eJe Te Ue FePeI¡e He8¡ ¡¡ƒ eOe AeN¡ ZVeJe Te Ue FeVeVjG¡eP ¡¡ƒ e 5eBeCe@g¡ZWe Xe6e;f¡ZYeeYeWƒ\ZZZ[Z\eJe Te UeZeI ¡¡ƒ eJe Te Ue[eP ¡¡ƒ eJe Te Ue\eV ¡¡ƒ eejFe>ejK Qe Fe>jGe>¡¡e>jGgƒZ]e He8¡e] Z^eJe Te Ue Fe^e6¡¡¡ƒ dS ).z
Sandbox Panel Estimators

References
-----------

Baltagi, Badi H. `Econometric Analysis of Panel Data.` 4th ed. Wiley, 2008.
é    )ÚreduceN)ÚGLSÚ
PanelModel)ÚPanelc                 C   sZ   i }t  t| ƒ¡}tt| ƒƒD ]6}| | |krD| | | t|ƒi¡ || |  ||< q|S )zÓ
    Returns unique numeric values for groups without sorting.

    Examples
    --------
    >>> X = np.array(['a','a','b','c','b','c'])
    >>> group(X)
    >>> g
    array([ 0.,  0.,  1.,  2.,  1.,  2.])
    )ÚnpÚzerosÚlenÚrangeÚupdate)ÚXZ	uniq_dictÚgroupÚi© r   úF/tmp/pip-unpacked-wheel-2v6byqio/statsmodels/sandbox/panel/panelmod.pyr      s    r   c                 C   sÌ   | j dkr| dd…df } | j\}}|d t |¡ }t|ƒD ]N}| dd…||d …f }t |¡}|| ||k t¡ }|t ||j	¡7 }q>tj
 |¡\}	}
t |
d|	 |
 j	¡}|
t |	¡ }|||fS )aG  calculate error covariance matrix for random effects model

    Parameters
    ----------
    groups : ndarray, (nobs, nre) or (nobs,)
        array of group/category observations
    sigma : ndarray, (nre+1,)
        array of standard deviations of random effects,
        last element is the standard deviation of the
        idiosyncratic error

    Returns
    -------
    omega : ndarray, (nobs, nobs)
        covariance matrix of error
    omegainv : ndarray, (nobs, nobs)
        inverse covariance matrix of error
    omegainvsqrt : ndarray, (nobs, nobs)
        squareroot inverse covariance matrix of error
        such that omega = omegainvsqrt * omegainvsqrt.T

    Notes
    -----
    This does not use sparse matrices and constructs nobs by nobs
    matrices. Also, omegainvsqrt is not sparse, i.e. elements are non-zero
    é   Néÿÿÿÿ)ÚndimÚshaper   Úeyer	   ÚuniqueÚastypeÚfloatÚdotÚTÚlinalgÚeighÚsqrt)ÚgroupsZsigmasÚnobsZnreÚomegaZigrr   Ú	groupuniqÚdummygrÚevÚevecÚomegainvÚomegainvhalfr   r   r   Úrepanel_cov'   s    


r&   c                   @   s   e Zd ZdS )Ú	PanelDataN©Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r'   S   s   r'   c                   @   sN   e Zd ZdZddd„Zdd„ Zdd„ Zddd„Zddd„Zdd„ Z	dd„ Z
dS )r   aà  
    An abstract statistical model class for panel (longitudinal) datasets.

    Parameters
    ----------
    endog : array_like or str
        If a pandas object is used then endog should be the name of the
        endogenous variable as a string.
#    exog
#    panel_arr
#    time_arr
    panel_data : pandas.Panel object

    Notes
    -----
    If a pandas object is supplied it is assumed that the major_axis is time
    and that the minor_axis has the panel variable.
    Nc                 C   s    |d kr|   ||||||¡ d S ©N)Ú
initialize)ÚselfÚendogÚexogÚpanelÚtimeÚxtnamesÚequationÚ
panel_datar   r   r   Ú__init__i   s    zPanelModel.__init__c                 C   sÎ   |  d¡}|d | _|dd… }|d | _|d | _| d¡dk}	d|	krlt |	dk¡d d }
| |
d¡ |	| _|| _	t 
t |¡¡| _t |¡}|| _t |¡| _t |¡| _t |¡| _t |¡| _dS )zG
        Initialize plain array model.

        See PanelModel
        ú r   r   NTZcons)ÚsplitÚ
endog_nameZ
panel_nameZ	time_nameÚvarr   ÚwhereÚinsertÚ_cons_indexÚ
exog_namesÚsqueezeZasarrayr/   r0   r1   r2   r   Ú	paneluniqÚtimeuniq)r.   r/   r0   r1   r2   r3   r4   Únamesr>   ZnovarZ
cons_indexr   r   r   r-   z   s$    





zPanelModel.initializec                 C   sf   || _ || j}t |¡| _|d kr8|j ¡ }| |¡ | |¡j| _	|| _
|| _|j| _|j| _d S r,   )r5   Úvaluesr   r?   r/   ÚcolumnsÚtolistÚremoveZfilterItemsr0   Z
_exog_nameZ_endog_nameZ
major_axisZ_timeseriesZ
minor_axisZ_panelseries)r.   r5   r9   Z	exog_namer/   r   r   r   Úinitialize_pandas¸   s    


zPanelModel.initialize_pandasÚonewayFc           	   
   C   sH  |dkr| j }| j}n"|dkr,| j}| j}ntd| ƒ‚t|||dd…df t|ƒt|ƒt|dd…df ƒ|ƒ ||dd…df k t¡}|j	dkr¸t
 ||¡| d¡dd…df  }nt
 ||¡| d¡ }|dkrâ|dkrâ|S |dkr|dkr|| d¡fS |dkr(|dkr(|| d¡|fS |dkrD|dkrD||fS dS )z[
        Get group means of X by time or by panel.

        index default is panel
        rH   r2   zindex %s not understoodNr   FT)r1   r@   r2   rA   Ú
ValueErrorÚprintr   r   r   r   r   r   Úsum)	r.   r   ÚindexÚcountsÚdummiesÚYZuniqÚdummyZmeanr   r   r   Ú_group_meanÈ   s,    2ÿ
$zPanelModel._group_meanc                 C   sr   |r|  ¡ }|  ¡ }|r,|dkr,td| ƒ‚|dkrFt| j| jƒ ¡ S |dkrZ|  ||¡S |dkrn|  ||¡S dS )ab  
        method : LSDV, demeaned, MLE, GLS, BE, FE, optional
        model :
                between
                fixed
                random
                pooled
                [gmm]
        effects :
                oneway
                time
                twoway
        femethod : demeaned (only one implemented)
                   WLS
        remethod :
                swar -
                amemiya
                nerlove
                walhus


        Notes
        -----
        This is unfinished.  None of the method arguments work yet.
        Only oneway effects should work.
        )ZlsdvZdemeanedZmleZglsÚbeZfez%s not a valid methodÚpooledÚbetweenÚfixedN)ÚlowerrI   r   r/   r0   ÚfitÚ	_fit_btwnÚ
_fit_fixed)r.   ÚmodelÚmethodÚeffectsr   r   r   rW   è   s    zPanelModel.fitc                 C   sH   |dkr*| j | j|d}| j | j|d}ntd| ƒ‚t||ƒ ¡ }|S )NZtwoway©rL   z1%s effects is not valid for the between estimator)rQ   r/   r0   rI   r   rW   )r.   r[   r\   r/   r0   Zbefitr   r   r   rX     s    ÿzPanelModel._fit_btwnc                 C   sê   | j }| j}d}|dkrx|dkr(d}d}| j||dd\}}| j||d}| t¡}|t ||¡ }|tj||dd	 }|s„|d
krÈ| j|d
dd\}}	| j|d
d}|t ||	¡ }|t |	j|¡ }t	||d d …| j
 f ƒ ¡ }
|
S )NF)rH   Útwowaysr^   TrH   )rL   rM   r]   r   )Zaxisr2   )rL   rN   )r/   r0   rQ   r   Úintr   Úrepeatr   r   r   r=   rW   )r.   r[   r\   r/   r0   ZdemeantwiceZ
endog_meanrM   Z	exog_meanrN   Zfefitr   r   r   rY   )  s.    ÿ

ÿ
zPanelModel._fit_fixed)NNNNNNN)rH   FF)NNrH   )r)   r*   r+   Ú__doc__r6   r-   rG   rQ   rW   rX   rY   r   r   r   r   r   V   s         ÿ
>
 
6c                   @   s   e Zd ZdS )ÚSURPanelNr(   r   r   r   r   rb   E  s   rb   c                   @   s   e Zd ZdS )ÚSEMPanelNr(   r   r   r   r   rc   H  s   rc   c                   @   s   e Zd ZdS )ÚDynamicPanelNr(   r   r   r   r   rd   K  s   rd   Ú__main__iìÿÿÿZ
investmentF)ZusemaskÚyearZfirmÚvalueZcapitalr   é   )Úprependzinvest value capital)r3   r4   rS   )rZ   rT   rH   )rZ   r\   rU   r2   r^   r   g      ð?g       @g      @)_ra   Ú	functoolsr   Znumpyr   Z#statsmodels.regression.linear_modelr   Ú__all__Zpandasr   r   r&   r'   r   rb   rc   rd   r)   Znumpy.lib.recfunctionsÚlibZrecfunctionsZnprfZstatsmodels.apiÚapiÚsmZdatasetsZgrunfeldÚloadÚdatar/   r0   ZfullexogZappend_fieldsr   Z	panel_arrZ	DataFrameZpanel_dfZ	set_indexZto_panelZpanel_pandaÚviewZreshapeZadd_constantr1   rf   Z	panel_modrW   Z	panel_olsZpanel_beZpanel_feZ	panel_betZ	panel_fetZ	panel_fe2Úarrayr   r   r   r   r    ZperiodsZ
perioduniqr   r!   ZdummypeÚsigmar   ZsigmagrZsigmapeZc_Zdummyallr   r   r   r   rJ   r   Zcholeskyr   r"   r#   r$   ÚinvZ	omegainv2Z	omegacompÚmaxÚabsr%   Zsigmas2Zcolumn_stackZgroups2Zomega_Z	omegainv_Zomegainvhalf_ZPgrZQgrr   r   r   r   Ú<module>   s’   , p
ÿ
ÿ




&" ÿ