
    !g8              
       B   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 Z
d Z G d	 d
e	      Z G d d      Z G d de      Z G d de      Z G d de      Zedk(  rBddlmc mZ ddlZddlm	Z	 ddlmZ ej2                  j4                  j7                         Zej:                  dd Zej<                  dd Z ej@                  edee!d      Z" ejF                  e"      Z$e$jK                  ddg      jM                         Z'eddg   jQ                  e!      jS                  dd      Z ejT                  ed      Z e
ed         Z+ed   Z, eeee+e,ddgd      Z-e-j]                  d !      Z/e-j]                  d"d#$      Z0e-j]                  d%d#$      Z1e-j]                  d"d&$      Z2e-j]                  d%d&$      Z3e-j]                  d%d'$      Z4 ejj                  g d(      Z6e6jn                  d   Z8 ejr                  e6      Z: ejj                  g d)      Z; ejr                  e;      Z<e6dddf   e:k(  j{                  e!      Z>e;dddf   e<k(  j{                  e!      Z?d*Z@ ej                  d+      ZB ej                  d,      ZCej                  eBe>z  eCe?z  f   ZE ej                  eEeEj                        e@ ej                  e8      z  z   ZI eJeI        eJej                  j                  eI             ej                  j                  eI      \  ZNZO ej                  eOd-eNz  eOz  j                        ZPej                  j                  eI      ZR ej                  eOeNeOz  j                        ZS eJ ej                   ej                  eSeIz
                      eJ ej                   ej                   ej                  ePeI       ej                  e8      z
                     eO ej                  eN      z  ZV eJ ej                   ej                   ej                  eVeVj                        ePz
                      ejj                  eBeCe@g      ZW ej                  e6e;f      ZY eeYeW      \  ZZZ[Z\ eJ ej                   ej                  eZeIz
                      eJ ej                   ej                  e[ePz
                      eJ ej                   ej                  e\eVz
                      eej                  e>ej                  j                   ej                  e>j                  e>            e>j                  g      Z] ej                  e8      e]z
  Z^ eJ ej                   ej                   ej                  e^e6                         yy).z
Sandbox Panel Estimators

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

Baltagi, Badi H. `Econometric Analysis of Panel Data.` 4th ed. Wiley, 2008.
    )reduceN)GLS
PanelModel)Panelc                     i }t        j                  t        |             }t        t        |             D ]3  }| |   |vr|j	                  | |   t        |      i       || |      ||<   5 |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)X	uniq_dictgroupis       _/var/www/dash_apps/app1/venv/lib/python3.12/site-packages/statsmodels/sandbox/panel/panelmod.pyr   r      sq     IHHSVE3q6] #ty adS^45QqT?a# L    c                 8   | j                   dk(  r	| dddf   } | j                  \  }}|d   t        j                  |      z  }t	        |      D ]f  }| dd||dz   f   }t        j
                  |      }||   ||k(  j                  t              z  }|t        j                  ||j                        z  }h t        j                  j                  |      \  }	}
t        j                  |
d|	z  |
z  j                        }|
t        j                  |	      z  }|||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)groupssigmasnobsnreomegaigrr   	groupuniqdummygrevevecomegainvomegainvhalfs                r   repanel_covr-   '   s   8 {{a$ID#2Jrvvd|#ESz -qSU{#IIe$	+)!3 ; ;E BB"&&')),,	-
 yy~~e$HBvvdQrTD[OO,H#L(L((r   c                       e Zd Zy)	PanelDataN__name__
__module____qualname__ r   r   r/   r/   S       r   r/   c                   D    e Zd ZdZ	 	 d
dZd Zd ZddZddZd Z	d	 Z
y)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                 6    || j                  ||||||       y y N)
initialize)selfendogexogpaneltimextnamesequation
panel_datas           r   __init__zPanelModel.__init__i   s%    
 OOE4gxH r   c                 z   |j                  d      }|d   | _        |dd }|d   | _        |d   | _        |j	                  d      dk(  }	d|	v r0t        j                  |	dk(        d   d   }
|j                  |
d       |	| _        || _	        t        j                  t        j                  |            | _        t        j                  |      }|| _        t        j                  |      | _        t        j                  |      | _        t        j                   |      | _        t        j                   |      | _        y)zG
        Initialize plain array model.

        See PanelModel
         r   r   NTcons)split
endog_name
panel_name	time_namevarr   whereinsert_cons_index
exog_namessqueezeasarrayr;   r<   r=   r>   r   	paneluniqtimeuniq)r:   r;   r<   r=   r>   r?   r@   namesrN   novar
cons_indexs              r   r9   zPanelModel.initializez   s    s#(12Y
!!*  q 5=%1*-a03Jj&1 $ZZ

5 12
zz$	ZZ&
JJt$	5)		$r   c                 ^   || _         ||   j                  }t        j                  |      | _        |+|j
                  j                         }|j                  |       |j                  |      j                  | _	        || _
        || _        |j                  | _        |j                  | _        y r8   )rA   valuesr   rO   r;   columnstolistremovefilterItemsr<   
_exog_name_endog_name
major_axis_timeseries
minor_axis_panelseries)r:   rA   rG   	exog_namer;   s        r   initialize_pandaszPanelModel.initialize_pandas   s    $:&--ZZ&
"**113IZ(**95<<	#%%00&11r   c                    |dk(  r| j                   }| j                  }n,|dk(  r| j                  }| j                  }nt	        d|z        t        |||dddf   t        |      t        |      t        |dddf         |       ||dddf   k(  j                  t              }|j                  dkD  r0t        j                  ||      |j                  d      dddf   z  }n(t        j                  ||      |j                  d      z  }|du r|du r|S |du r|du r||j                  d      fS |du r|du r||j                  d      |fS |du r	|du r||fS yy)z[
        Get group means of X by time or by panel.

        index default is panel
        onewayr>   zindex %s not understoodNr   FT)r=   rQ   r>   rR   
ValueErrorprintr
   r   r   r   r   r   sum)	r:   r   indexcountsdummiesYuniqdummymeans	            r   _group_meanzPanelModel._group_mean   s[    H

A>>Df_		A==D6>??atAdF|SVSYD4L8I	 d1T6l"**5166A:66%?599Q<$#77D66%?599Q</DU?w%/Kt^5 01%%t^41u,,u_D; "1_r   c                 2   |r|j                         }|j                         }|r|dvrt        d|z        |dk(  r.t        | j                  | j                        j                         S |dk(  r| j                  ||      S |dk(  r| j                  ||      S y)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.
        )lsdvdemeanedmleglsbefez%s not a valid methodpooledbetweenfixedN)lowerrf   r   r;   r<   fit	_fit_btwn
_fit_fixed)r:   modelmethodeffectss       r   r|   zPanelModel.fit   s    6 \\^Ff %8 8 4v=>> Htzz499-1133I>>&'22G??6733 r   c                     |dk7  r;| j                  | j                  |      }| j                  | j                  |      }nt        d|z        t	        ||      j                         }|S )Ntwowayri   z1%s effects is not valid for the between estimator)rp   r;   r<   rf   r   r|   )r:   r   r   r;   r<   befits         r   r}   zPanelModel._fit_btwn  sp    h$$TZZw$?E##DIIW#=D )+23 4 4E4 $$&r   c                 l   | j                   }| j                  }d}|dv r||dk(  rd}d}| j                  ||d      \  }}| j                  ||      }|j                  t              }|t        j                  ||      z
  }|t        j                  ||d	      z
  }|s|d
k(  rf| j                  |d
d      \  }}	| j                  |d
      }|t        j                  ||	      z
  }|t        j                  |	j                  |      z
  }t        ||d d | j                   f         j                         }
|
S )NF)re   twowaysr   Tre   )ri   rj   r   r   )axisr>   )ri   rk   )r;   r<   rp   r   intr   repeatr   r   r   rM   r|   )r:   r   r   r;   r<   demeantwice
endog_meanrj   	exog_meanrk   fefits              r   r~   zPanelModel._fit_fixed)  s?   

yy**)#""!%!1!1%w "2 "J((W(=I]]3'FBIIj&99E"))IvA>>D'V+"&"2"25 #3 #J((V(<IBFF:w77E"&&I66DE44#3#3"3 34599;r   )NNNNNNN)re   FF)NNre   )r1   r2   r3   __doc__rB   r9   rc   rp   r|   r}   r~   r4   r   r   r   r   V   s8    $ @D48I"(|2 @)4l	r   c                       e Zd Zy)SURPanelNr0   r4   r   r   r   r   E  r5   r   r   c                       e Zd Zy)SEMPanelNr0   r4   r   r   r   r   H  r5   r   r   c                       e Zd Zy)DynamicPanelNr0   r4   r   r   r   r   K  r5   r   r   __main__i
investmentF)usemaskyearfirmvaluecapitalr      )prependzinvest value capital)r?   r@   rx   )r   ry   re   )r   r   rz   r>   r   )r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   g      ?g       @g      @r   )_r   	functoolsr   numpyr   #statsmodels.regression.linear_modelr   __all__pandasr   r   r-   r/   r   r   r   r   r1   numpy.lib.recfunctionslibrecfunctionsnprfstatsmodels.apiapismdatasetsgrunfeldloaddatar;   r<   fullexogappend_fieldsr   	panel_arr	DataFramepanel_df	set_indexto_panelpanel_pandaviewreshapeadd_constantr=   r   	panel_modr|   	panel_olspanel_bepanel_fe	panel_bet	panel_fet	panel_fe2arrayr!   r   r#   r   r'   periods
perioduniqr   r(   dummypesigmar    sigmagrsigmapec_dummyallr   r   r   r%   rg   r   choleskyr   r)   r*   r+   inv	omegainv2	omegacompmaxabsr,   sigmas2column_stackgroups2omega_	omegainv_omegainvhalf_PgrQgrr4   r   r   <module>r      s/     3. &()X	 	j j^	z 		z 		: 	 z)) ;;$$&DJJtEyy#H"""8\5%I  v	*H$$ff%56??AK WY'(--e4<<RBD2??4/D(6"#EFD5$tfV_+-I H-I}}9h}?H}}7H}=HIv>IGV<IGY?I" RXX'(F<<?D		&!Ibhh()G7#Jaf~*2259Gqv*,44U;GEbggbkGbggbkG
 uuWW_ggo56H BFF8XZZ(5&"&&,+>>E	%L	"))

U
#$yy~~e$HBrvvdQrTD[OO,H		e$Itb4i]]+I	&"&&	E)*
+, 
&"&&x.=>
?@#L	&"&&|LNN;hFG
HI bhh%01Gboovw/0G'27G'D$FI}	&"&&'
()	&"&&	H,-
./	&"&&45
67 IIMM&"&&G45giiA BC
"&&,
C 
&"&&sF+,
-.W r   