
    M/Ph2                        d Z ddlZddlmZ ddlmZ d Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zedk    rdZerdZ ej        d          Zej                            dd          Zeddddf         Z ej        ee          eedddf         z  z   Zg dZ e e
eee                     e ej        ee          z
  dddf         ez  Z ee            e ee ej        ee          de                      ee ej        ee          z
             ddlm Z m!Z! d Z"d Z#d Z$d Z%d Z&d Z'er ed            e e!j(        e"dddd d!                      ed" eddded                      ed# eddded                      e e!j(        e"d$d%dd&d!                      ed# ed$dded'                      e e!j(        e"d$d%dd(d!                      ed# ed$dded'                      e e!j(        e"d$d%dd)d!                      ed# ed$dded'                      e e!j(        e#dd%dd*d!                      e e!j(        e$dd%dd+d!                     d,\  ZZ)Z*Z+ ed# eee)e*ed'                      e e!j(        e#e)d%dee*e+fd!                      e e!j(        e$e*d%dee)e+fd!                      ed-            e e!j(        e%dddd.d!                      e eddde                     d/\  ZZ)Z* ed# eee)e*e                      e e!j(        e&e)d%dee*fd!                      e e!j(        e'e*d%dee)fd!                     d0\  ZZ)Z* ed# eee)e*e                      e e!j(        e&e)d%dee*fd!                      e e!j(        e'e*d%dee)fd!                      ed1            e ed ej,        ddg          d2           e"dddd2          d3            e ed ej,        ddg          d           e"dddd          d3            e ed ej,        ddg          d           e"dddd                      e ed ej,        dd4g          d           e"d5dd5d                      e ed ej,        ddg          d2           e"dddd2                      e ed ej,        ddg          d           e"ddd5 ej-        d6          z  d                     dd7l.m/Z/ g d8Z ej0        d9d:d;          Z1eD ]m\  Z)Z* e!j(        e&e)d%de1e*fd!          Z2 e!j(        e'e*d%de1e)fd!          Z3 ee1e)e*e          Z4 e/e2e4d         d<d=>            e/e3e4d         d<d?>           nd@D ]Z+eD ]\  Z)Z* e!j(        e#e)d%de1e*e+fd!          Z2 e!j(        e$e*d%de1e)e+fd!          Z3 ee1e)e*ee+          Z4 e/e2e4d         dAd=>            e/e3e4d         dAd?>            e/ ee1 ej,        e)e*dz  g          e+           e"e1e)e*e+          d<dB>            e/ ee1 ej,        e)e*dz  g          e+           e"e1e)e* ej-        e+d:z
  e+z            z  e+          d<dB>           dS dS )Ca  gradient/Jacobian of normal and t loglikelihood

use chain rule

normal derivative wrt mu, sigma and beta

new version: loc-scale distributions, derivative wrt loc, scale

also includes "standardized" t distribution (for use in GARCH)

TODO:
* use sympy for derivative of loglike wrt shape parameters
  it works for df of t distribution dlog(gamma(a))da = polygamma(0,a) check
  polygamma is available in scipy.special
* get loc-scale example to work with mean = X*b
* write some full unit test examples

A: josef-pktd

    N)special)gammalnc                     |j         \  }}dt          j        dt          j        z            t          j        |          z   | |z
  dz  |z  z   z  }|S )ay  normal loglikelihood given observations and mean mu and variance sigma2

    Parameters
    ----------
    y : ndarray, 1d
        normally distributed random variable
    params : ndarray, (nobs, 2)
        array of mean, variance (mu, sigma2) with observations in rows

    Returns
    -------
    lls : ndarray
        contribution to loglikelihood for each observation
    g         )Tnplogpi)yparamsmusigma2llss        d/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/statsmodels/sandbox/regression/tools.pynorm_llsr      sK      JB
qw"&..0AbD19V3CC
DCJ    c                     |j         \  }}| |z
  |z  }| |z
  dz  |z  dz
  t          j        |          z  }t          j        ||f          S )aB  Jacobian of normal loglikelihood wrt mean mu and variance sigma2

    Parameters
    ----------
    y : ndarray, 1d
        normally distributed random variable
    params : ndarray, (nobs, 2)
        array of mean, variance (mu, sigma2) with observations in rows

    Returns
    -------
    grad : array (nobs, 2)
        derivative of loglikelihood for each observation wrt mean in first
        column, and wrt variance in second column

    Notes
    -----
    this is actually the derivative wrt sigma not sigma**2, but evaluated
    with parameter sigma2 = sigma**2

    r      )r   r   sqrtcolumn_stack)r   r   r   r   dllsdmudllsdsigma2s         r   norm_lls_gradr   /   sU    , JBtVmGbD19V#a'8K?G[1222r   c                     | S )z-gradient/Jacobian for d (x*beta)/ d beta
     )xbetas     r   	mean_gradr   K   s	     Hr   c                 j   |dd         }|d         t          j        t          |           df          z  }t          ||          }t          j        ||          }t          j        ||f          }t          | |          }t          j        |ddddf         |z  |ddddf         f          }	|	S )a  Jacobian of normal loglikelihood wrt mean mu and variance sigma2

    Parameters
    ----------
    y : ndarray, 1d
        normally distributed random variable with mean x*beta, and variance sigma2
    x : ndarray, 2d
        explanatory variables, observation in rows, variables in columns
    params : array_like, (nvars + 1)
        array of coefficients and variance (beta, sigma2)

    Returns
    -------
    grad : array (nobs, 2)
        derivative of loglikelihood for each observation wrt mean in first
        column, and wrt scale (sigma) in second column
    assume params = (beta, sigma2)

    Notes
    -----
    TODO: for heteroscedasticity need sigma to be a 1d array

    Nr   )r   oneslenr   dotr   r   )
r   r   r   r   r   dmudbetar   params2dllsdmsgrads
             r   normgradr(   P   s    0 #2#;DBZQ
+++FD!!H	4Bor&k**GAg&&G?GAAAbqbDM(2GAAAbqbDMBCCDKr   c                 X   |j         \  }}|dz  }t          |dz   dz            t          |dz            z
  dt          j        |dz
  t          j        z            z  z
  }||dz   dz  t          j        d| |z
  dz  |dz
  z  |z  z             z  dt          j        |          z  z   z  }|S )a  t loglikelihood given observations and mean mu and variance sigma2 = 1

    Parameters
    ----------
    y : ndarray, 1d
        normally distributed random variable
    params : ndarray, (nobs, 2)
        array of mean, variance (mu, sigma2) with observations in rows
    df : int
        degrees of freedom of the t distribution

    Returns
    -------
    lls : ndarray
        contribution to loglikelihood for each observation

    Notes
    -----
    parametrized for garch
          ?r          @      ?r   )r   r   r   r	   r
   r   r   dfr   r   r   s         r   tstd_llsr/   t   s    , JB	CB 2a4)

wr"u~~
-BFBqD"%<4H4H0H
HCBqD"9rvbAbD19bd#3F#::;;;cBF6NN>RRRCJr   c                     |  S )z?derivative of log pdf of standard normal with respect to y
    r   )r   s    r   
norm_dlldyr1      s     2Ir   c                 :   t          j        |dz            }t          j        t          j        |dz   dz            t          j        |dz            z
            t          j        |dz
  t           j        z            z  }|d| dz  |dz
  z  z   |dz   dz  z  z  }|S )zIpdf for standardized (not standard) t distribution, variance is one

    r*   r   r+   r   )r   arrayexpr   r   r   r
   )r   r.   rPxs       r   tstd_pdfr7      s    
 	CA	1b))'/!B$*?*??	@	@!A#ruAUAU	UB1adQqS\>ac2X
&&BIr   c                 n   t          | ||           |j        \  }}|dz  }t          |dz   dz            t          |dz            z
  dt          j        |t          j        z            z  z
  }||dz   dz  t          j        d| |z
  dz  |z  |z  z             z  dt          j        |          z  z   z  }|S )a  t loglikelihood given observations and mean mu and variance sigma2 = 1

    Parameters
    ----------
    y : ndarray, 1d
        normally distributed random variable
    params : ndarray, (nobs, 2)
        array of mean, variance (mu, sigma2) with observations in rows
    df : int
        degrees of freedom of the t distribution

    Returns
    -------
    lls : ndarray
        contribution to loglikelihood for each observation

    Notes
    -----
    parametrized for garch
    normalized/rescaled so that sigma2 is the variance

    >>> df = 10; sigma = 1.
    >>> stats.t.stats(df, loc=0., scale=sigma.*np.sqrt((df-2.)/df))
    (array(0.0), array(1.0))
    >>> sigma = np.sqrt(2.)
    >>> stats.t.stats(df, loc=0., scale=sigma*np.sqrt((df-2.)/df))
    (array(0.0), array(2.0))
    r*   r   r+   r,   r   )printr   r   r   r	   r
   r-   s         r   ts_llsr:      s    : 
!VRJB	CB 2a4)

wr"u~~
-BFB:4F4F0F
FCBrE2:rQrTAIrN6$99:::S26&>>=QQQCJr   c                 <    |dz  }|dz    |z  d| dz  |z  z   z  | z  S )a  derivative of log pdf of standard t with respect to y

    Parameters
    ----------
    y : array_like
        data points of random variable at which loglike is evaluated
    df : array_like
        degrees of freedom,shape parameters of log-likelihood function
        of t distribution

    Returns
    -------
    dlldy : ndarray
        derivative of loglikelihood wrt random variable y evaluated at the
        points given in y

    Notes
    -----
    with mean 0 and scale 1, but variance is df/(df-2)

    r*   r   r   r   r   r.   s     r   ts_dlldyr=      s5    , 
BB T7B<1q!tRy=)A--r   c                 >    |dz    |dz
  z  d| dz  |dz
  z  z   z  | z  S )a  derivative of log pdf of standardized t with respect to y

        Parameters
        ----------
    y : array_like
        data points of random variable at which loglike is evaluated
    df : array_like
        degrees of freedom,shape parameters of log-likelihood function
        of t distribution

    Returns
    -------
    dlldy : ndarray
        derivative of loglikelihood wrt random variable y evaluated at the
        points given in y


    Notes
    -----
    parametrized for garch, standardized to variance=1
    r   r+   r   r   r<   s     r   
tstd_dlldyr?      s3    . T7BrE?a!Q$2,./!33r   c                 j    | |z
  |z  } ||g|R   |z  }d|z   ||g|R  | |z
  z  |dz  z  z
  }||fS )a  derivative of log-likelihood with respect to location and scale

    Parameters
    ----------
    y : array_like
        data points of random variable at which loglike is evaluated
    loc : float
        location parameter of distribution
    scale : float
        scale parameter of distribution
    dlldy : function
        derivative of loglikelihood fuction wrt. random variable x
    args : array_like
        shape parameters of log-likelihood function

    Returns
    -------
    dlldloc : ndarray
        derivative of loglikelihood wrt location evaluated at the
        points given in y
    dlldscale : ndarray
        derivative of loglikelihood wrt scale evaluated at the
        points given in y

    g      r   r   )r   locscaledlldyargsystdlldloc	dlldscales           r   locscale_gradrH      sm    4 S5%-CuS 4    5(GE	EE#----37q@@IIr   __main__g?r   
      r   )r   r   r   )statsmiscc                 l    t          j        t          j                            | |||                    S N)rA   rB   r   r	   rL   tpdf)r   rA   rB   r.   s       r   lltrS   2  (    vegkk!RSk>>???r   c                 l    t          j        t          j                            ||| |                    S rO   rP   )rA   r   rB   r.   s       r   lltlocrV   4  rT   r   c                 l    t          j        t          j                            ||||                     S rO   rP   )rB   r   rA   r.   s       r   lltscalerX   6  rT   r   c                 j    t          j        t          j                            | ||                    S rO   r   r	   rL   normrR   )r   rA   rB   s      r   llnormr\   9  &    vejnnQCun==>>>r   c                 j    t          j        t          j                            || |                    S rO   rZ   )rA   r   rB   s      r   	llnormlocr_   ;  r]   r   c                 j    t          j        t          j                            |||                     S rO   rZ   )rB   r   rA   s      r   llnormscalera   =  r]   r   z
gradient of tgư>)r   r   rJ   )dxnrD   orderzt ts      ?g|=)r   r      rg   )r   r   rg   )r   r   rg   )rf   r   rg   )rf   r   rg   )rf   r   r   rg   z
gradient of normr   r   )rf   r   r   )rf   r   r   z
loglike of td   zdifferently standardizedg      ?r*   g?)assert_almost_equal)rh   )r*   r*   )g        r+   )r*   r+   g       r+         z	deriv loc)err_msgzderiv scale)rK   rJ   ri      loglike)5__doc__numpyr   scipyr   scipy.specialr   r   r   r   r(   r/   r1   r7   r:   r=   r?   rH   __name__verbosesigr!   r   randomrandnrvsr   r#   r   r   r9   	dllfdbetarL   rM   rS   rV   rX   r\   r_   ra   
derivativerA   rB   r.   r3   r   numpy.testingrj   linspaceytdlldlodlldscgrr   r   r   <module>r      sn
   *           ! ! ! ! ! !  (3 3 38  
     H  >    $ $ $N. . .64 4 44  > zG !rwqzzioob##!""IBF1TNNSQQQqS\)hhq!V$$%%%vrva&$/1	immAvrva:>>???aq$   !!!!!!!!@ @ @@ @ @@ @ @? ? ?? ? ?? ? ?  &O   odoc1KKKLLLdMM!Q:r::;;;dMM!Q8R88999odoc35AHANNNPPPdMM#q!Xr::;;;odoc35AHANNNPPPdMM#q!Xr::;;;odoc35AHANNNPPPdMM#q!Xr::;;;odofaEQZqQQQSSSodoheqzQRSSSTTT&#eBdMM!Cx<<===odofceq%|STUUUWWWodoh%1Ac":UVWWWXXX"###odofaDAEKKKLLLmmAq!Z00111#edMM!Cz::;;;odoi!1U)STUUUWWWodok5UaqgUVWWWXXX#edMM!Cz::;;;odoi!1U)STUUUWWWodok5UaqgUVWWWXXX 	hhq("(Aa5//3//Qq3A[\\\hhq("(Aa5//2..Aa"?YZZZffQ!A,,cc!Aamm<<<hhq("(Ai=11266BqBHHHffQ!A--ss1Qq~~>>>hhq("(Aa5//2..Aa7275>>8I"0M0MNNN 211111111F	SB		B E E	E CEQbZWXYYY e"SYZ[[[]2sE:66FBqE1kBBBBFBqE1mDDDDD 3 3 	3 	3IC$T_VSUar%PRm[\]]]F$T_Xu!2cRT+]^___Fr3x<<B1q+FFFF1q-HHHHr828S%(O+D+Db I I #Bs5 4 4a(13 3 3 3  XRXsE1Ho-F-F K K #Bs5"R%1D1D+DR H H!(13 3 3 3 3	3k h3 3r   