
    !g2                     P   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.                  j1                  dd      Zeddddf   Z ej6                  ee      eedddf   z  z   Zg dZ e e
eee             e ej6                  ee      z
  dddf   ez  Z ee        e ee ej6                  ee      de              ee ej6                  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!jP                  e"dddd d!              ed" eddded              ed# eddded              e e!jP                  e"d$d%dd&d!              ed# ed$dded'              e e!jP                  e"d$d%dd(d!              ed# ed$dded'              e e!jP                  e"d$d%dd)d!              ed# ed$dded'              e e!jP                  e#dd%dd*d!              e e!jP                  e$dd%dd+d!             d,\  ZZ)Z*Z+ ed# eee)e*ed'              e e!jP                  e#e)d%dee*e+fd!              e e!jP                  e$e*d%dee)e+fd!              ed-        e e!jP                  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!jP                  e&e)d%dee*fd!              e e!jP                  e'e*d%dee)fd!             d0\  ZZ)Z* ed# eee)e*e              e e!jP                  e&e)d%dee*fd!              e e!jP                  e'e*d%dee)fd!              ed1        e ed ejX                  ddg      d2       e"dddd2      d3        e ed ejX                  ddg      d       e"dddd      d3        e ed ejX                  ddg      d       e"dddd              e ed ejX                  dd4g      d       e"d5dd5d              e ed ejX                  ddg      d2       e"dddd2              e ed ejX                  ddg      d       e"ddd5 ejZ                  d6      z  d             dd7l.m/Z/ g d8Z ej`                  d9d:d;      Z1eD ]b  \  Z)Z* e!jP                  e&e)d%de1e*fd!      Z2 e!jP                  e'e*d%de1e)fd!      Z3 ee1e)e*e      Z4 e/e2e4d   d<d=>        e/e3e4d   d<d?>       d d@D ]  Z+eD ]  \  Z)Z* e!jP                  e#e)d%de1e*e+fd!      Z2 e!jP                  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jX                  e)e*dz  g      e+       e"e1e)e*e+      d<dB>        e/ ee1 ejX                  e)e*dz  g      e+       e"e1e)e* ejZ                  e+d:z
  e+z        z  e+      d<dB>         yy)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        a/var/www/dash_apps/app1/venv/lib/python3.12/site-packages/statsmodels/sandbox/regression/tools.pynorm_llsr      sO      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   /   sV    , JBtVmGbD19V#a'8K??G[122r   c                     | S )z-gradient/Jacobian for d (x*beta)/ d beta
     )xbetas     r   	mean_gradr   K   s	     Hr   c                 >   |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oor&k*GAg&G??GAbqbDM(2GAbqbDMBCDKr   c                 `   |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~
-BFFBqD"%%<4H0H
HCBqD"9rvvbAbD19bd#3F#::;;cBFF6N>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                 L   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#ruuAU	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~
-BFFB:4F0F
FCBrE2:rQrTAIrN6$99::S266&>=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|  |z  }d|z   ||g| | |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      s]    4 S5%-CS 4  5(GE	E#--37q@@IIr   __main__g?r   
      r   )r   r   r   )statsmiscc                 n    t        j                  t        j                  j	                  | |||            S N)rA   rB   r   r	   rL   tpdf)r   rA   rB   r.   s       r   lltrS   2  &    vveggkk!RSk>??r   c                 n    t        j                  t        j                  j	                  ||| |            S rO   rP   )rA   r   rB   r.   s       r   lltlocrV   4  rT   r   c                 n    t        j                  t        j                  j	                  ||||             S rO   rP   )rB   r   rA   r.   s       r   lltscalerX   6  rT   r   c                 l    t        j                  t        j                  j	                  | ||            S rO   r   r	   rL   normrR   )r   rA   rB   s      r   llnormr\   9  $    vvejjnnQCun=>>r   c                 l    t        j                  t        j                  j	                  || |            S rO   rZ   )rA   r   rB   s      r   	llnormlocr_   ;  r]   r   c                 l    t        j                  t        j                  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      s  *   !(38
 H>$N.644> zGrwwqziioob#!"IBFF1TNSQqS\)hq!V$%vrvva&$/1	imAvrvva:>?aq$ !@@@???  odooc1KLdM!Q:r:;dM!Q8R89odooc35AHANPdM#q!Xr:;odooc35AHANPdM#q!Xr:;odooc35AHANPdM#q!Xr:;odoofaEQZqQSodooheqzQRST&#eBdM!Cx<=odoofceq%|STUWodooh%1Ac":UVWX"#odoofaDAEKLmAq!Z01#edM!Cz:;odooi!1U)STUWodook5UaqgUVWX#edM!Cz:;odooi!1U)STUWodook5UaqgUVWX 	hq("((Aa5/3/Qq3A[\hq("((Aa5/2.Aa"?YZfQ!A,c!Aam<hq("((Ai=126BqBHfQ!A-s1Qq~>hq("((Aa5/2.Aa72775>8I"0MN 21F	SB	B E	E CEQbZWXY e"SYZ[2sE:6FBqE1kBFBqE1mDE  3 	3IC$T__VSUar%PRm[\]F$T__Xu!2cRT+]^_Fr3x<B1q+F1q-Hr8288S%(O+Db I #Bs5 4a(13  XRXXsE1Ho-F K #Bs5"R%1D+DR H!(13	33i r   