B
    ¥ŠãZ·:  ã            
   @   sT  d Z ddlmZ ddlmZmZ ddlmZ ddlm	Z	m
Z
 ddl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eƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZedkrPddlZddlmZ ddlmZ ddlm  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(¡ 0dd ¡Z%ej1e%dd!Z%ee&d ƒZ2e&d Z3ee$e%e2e3ddgd"d#Z4e4j5d$d%Z6e4j5d&d'd(Z7e4j5d)d'd(Z8e4j5d&d*d(Z9e4j5d)d*d(Z:e4j5d)d+d(Z;e <dddd,d,d d d g¡Z=e=j>d Z?e @e=¡ZAe <dd,d d,d dd,d g¡ZBe @eB¡ZCe=dd…df eAk De(¡ZEeBdd…df eCk De(¡ZFd-ZGe Hd.¡ZIe Hd/¡ZJejKeIeE eJeF f ZLe MeLeLjN¡eGe Oe?¡  ZPeQePƒ eQejR SeP¡ƒ ejR TeP¡\ZUZVe MeVd,eU eV jN¡ZWejR XeP¡ZYe MeVeUeV jN¡ZZeQe [e \eZeP ¡¡ƒ eQe [e \e MeWeP¡e Oe?¡ ¡¡ƒ eVe HeU¡ Z]eQe [e \e Me]e]jN¡eW ¡¡ƒ e <eIeJeGg¡Z^e _e=eBf¡Z`ee`e^ƒ\ZaZbZceQe [e \eaeP ¡¡ƒ eQe [e \ebeW ¡¡ƒ eQe [e \ece] ¡¡ƒ eejMeEejR Xe MeEjNeE¡¡eEjNgƒZde Oe?¡ed ZeeQe [e \e Meee=¡¡¡ƒ dS )0z
Sandbox Panel Estimators

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

Baltagi, Badi H. `Econometric Analysis of Panel Data.` 4th ed. Wiley, 2008.
é    )Úprint_function)ÚrangeÚreduce)Úcategorical)ÚGLSÚWLSNÚ
PanelModel)ÚPanelc             C   s^   i }t  t| ƒ¡}xFtt| ƒƒD ]6}| | |krF| | | t|ƒi¡ || |  ||< q W |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.])
    )ÚnpZzerosÚlenr   Úupdate)ÚXZ	uniq_dictÚgroupÚi© r   úAlib/python3.7/site-packages/statsmodels/sandbox/panel/panelmod.pyr      s    r   c             C   sÐ   | j dkr| dd…df } | j\}}|d t |¡ }xZt|ƒD ]N}| dd…||d …f }t |¡}|| ||k t¡ }|t ||j	¡7 }q@W tj
 |¡\}	}
t |
d|	 |
 j	¡}|
t |	¡ }|||fS )a=  calculate error covariance matrix for random effects model

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

    Returns
    -------
    omega : array, (nobs, nobs)
        covariance matrix of error
    omegainv : array, (nobs, nobs)
        inverse covariance matrix of error
    omegainvsqrt : array, (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 )N)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uniqZ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 )ac  
        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glsZ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   rU   è   s    zPanelModel.fitc             C   sH   |dkr*| j | j|d}| j | j|d}ntdt ƒ‚t||ƒ ¡ }|S )NZtwoway)rL   z1%s effects is not valid for the between estimator)rP   r/   r0   rI   Úsr   rU   )r.   rY   rZ   r/   r0   Zbefitr   r   r   rV     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   )rL   r   )Zaxisr2   )rL   rN   )r/   r0   rP   r   Úintr
   Úrepeatr   r   r   r=   rU   )r.   rY   rZ   r/   r0   ZdemeantwiceZ
endog_meanrM   Z	exog_meanrN   Zfefitr   r   r   rW   (  s*    
zPanelModel._fit_fixed)NNNNNNN)rH   FF)NNrH   )r*   r+   r,   Ú__doc__r6   r-   rG   rP   rU   rV   rW   r   r   r   r   r   V   s    
>
 
5c               @   s   e Zd ZdS )ÚSURPanelN)r*   r+   r,   r   r   r   r   r`   D  s   r`   c               @   s   e Zd ZdS )ÚSEMPanelN)r*   r+   r,   r   r   r   r   ra   G  s   ra   c               @   s   e Zd ZdS )ÚDynamicPanelN)r*   r+   r,   r   r   r   r   rb   J  s   rb   Ú__main__iìÿÿÿZ
investmentF)ZusemaskÚyearZfirmÚvalueZcapitalr   é   )Zprependzinvest value capital)r3   r4   rQ   )rX   rR   rH   )rX   rZ   rS   r2   r\   r   g      ð?g       @g      @)fr_   Z
__future__r   Zstatsmodels.compat.pythonr   r   Zstatsmodels.tools.toolsr   Z#statsmodels.regression.linear_modelr   r   Znumpyr
   Ú__all__Zpandasr	   r   r(   r)   Úobjectr   r`   ra   rb   r*   Zstatsmodels.apiZapiZsmZnumpy.lib.recfunctionsÚlibZrecfunctionsZnprfZdatasetsZgrunfeldÚloadÚdatar/   r0   ZfullexogZappend_fieldsr   Z	panel_arrZ	DataFrameZpanel_dfZ	set_indexZto_panelZpanel_pandaZviewZreshapeZadd_constantr1   rd   Z	panel_modrU   Z	panel_olsZpanel_beZpanel_feZ	panel_betZ	panel_fetZ	panel_fe2Zarrayr   r   r    r   r"   ZperiodsZ
perioduniqr   r#   ZdummypeZ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Ž   , o






&"