Ë
    £�Djƒ3  ã                   ó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(  �rídZerÕd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        úhC:\Crop_Prediction\Backend\crop-ai-system\venv\Lib\site-packages\statsmodels/sandbox/regression/tools.pyÚnorm_llsr      sO   € ð  —‘�J€BˆØ
”—‘�qœŸ™‘w“¤"§&¡&¨£.Ñ0°A°b±D¸1±9¸VÑ3CÑCÑ
D€CØ€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   € ð, —‘�J€BˆØ�‰t�V‰m€GØ�b‘D˜1‘9˜VÑ# aÑ'¬¯©°«Ñ8€KÜ�?‰?˜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

    Néÿÿÿÿr   )r   ÚonesÚlenr   Údotr   r   )
r   r   r   r   r   Údmudbetar   Úparams2ÚdllsdmsÚgrads
             r   Únormgradr(   P   sœ   € ð0 �#�2ˆ;€DØ�B‰ZœŸ™¤ Q£¨ 
Ó+Ñ+€FÜ˜˜DÓ!€HÜ	�‰��4‹€Bä�o‰o˜r &˜kÓ*€GÜ˜A˜gÓ&€GÜ�?‰?˜G¢A b q b D™M¨(Ñ2°GºA¸b¸q¸b¸D±MÐBÓC€DØ€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¬   € ð, —‘�J€BˆØ	ˆC‰€Bô �2�a‘4˜‘)Ó
œw r¨"¡u›~Ñ
-°´B·F±F¸B¸q¹DÄ"Ç%Á%¹<Ó4HÑ0HÑ
H€CØˆBˆq‰D�"‰9”r—v‘v˜b A b¡D¨1¡9¨b°©dÑ#3°FÑ#:Ñ:Ó;Ñ;¸cÄBÇFÁFÈ6ÃNÑ>RÑRÑR€Cà€Jr   c                 ó   — |  S )z?derivative of log pdf of standard normal with respect to y
    r   )r   s    r   Ú
norm_dlldyr1   “   s   € ð ˆ2€Ir   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É#ÌrÏuÉuÉÓAUÑ	U€BØˆ1ˆa�‰d�Q�q‘S‰\‰>˜a ™c 2™XÑ
&Ñ&€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¯   € ô: 
ˆ!ˆV�RÔØ—‘�J€BˆØ	ˆC‰€Bô �2�a‘4˜‘)Ó
œw r¨"¡u›~Ñ
-°´B·F±F¸BÄÇÁ¹:Ó4FÑ0FÑ
F€CØˆBˆr‰E�2‰:œŸ™˜r Q r¡T¨A¡I¨r¡N°6Ñ$9Ñ9Ó:Ñ:¸SÄ2Ç6Á6È&Ã>Ñ=QÑQÑQ€CØ€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ð �‰Tˆ7�B‰<˜1˜q !™t R™y™=Ñ)¨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   € ð. �‰Tˆ7�B�r‘E‰?˜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 ˆS‰5�%‰-€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  ó&   € Ü�v‰v”e—g‘g—k‘k ! R¨S¸�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  ó$   € Ü�v‰v”e—j‘j—n‘n Q¨C°u�nÓ=Ó>Ð>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 téd   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í  ðñó* Ý Ý !òò(3ò8ò
 òHò>òò$òN.ò64ò4ð> ˆzÓØ€GÙØˆØˆr�w‰w�q‹zˆØ�i‰i�o‰o˜b Ó#ˆØ’�!‘"�‰IˆØˆB�F‰F�1�T‹N˜S ¢Q q S¡™\Ñ)ˆâˆÙ‰h�q˜!˜VÓ$Ô%à�v�r—v‘v˜a “Ñ&ª¨$¨Ñ/°Ñ1ˆ	ÙˆiÔá‰m˜A˜v˜rŸv™v a¨›°°:Ó>Ô?Ùˆa��—‘�q˜$“ÑÔ ç!ò@ò@ò@ò?ò?ò?ò ÙÐÔ Ùˆoˆd�o‰o˜c 1¨°¸ÈÔKÔLÙˆd‘M ! Q¨¨:°rÓ:Ô;Ùˆd‘M ! Q¨¨8°RÓ8Ô9Ùˆoˆd�o‰o˜c 3¨5°A¸HÈAÔNÔPÙˆd‘M # q¨!¨X°rÓ:Ô;Ùˆoˆd�o‰o˜c 3¨5°A¸HÈAÔNÔPÙˆd‘M # q¨!¨X°rÓ:Ô;Ùˆoˆd�o‰o˜c 3¨5°A¸HÈAÔNÔPÙˆd‘M # q¨!¨X°rÓ:Ô;Ùˆoˆd�o‰o˜f a¨E°Q¸ZÈqÔQÔSÙˆoˆd�o‰o˜h¨¨e°q¸zÐQRÔSÔTØ&‰ˆˆ#ˆe�BÙˆd‘M ! C¨¨x¸Ó<Ô=Ùˆoˆd�o‰o˜f c¨e°qÀÀ%È¸|ÐSTÔUÔWÙˆoˆd�o‰o˜h¨°%¸1ÀAÀcÈ"À:ÐUVÔWÔXáÐ"Ô#Ùˆoˆd�o‰o˜f a¨D°A¸EÈÔKÔLÙ‰m˜A˜q ! ZÓ0Ô1Ø‰ˆˆ#ˆeÙˆd‘M ! C¨¨zÓ:Ô;Ùˆoˆd�o‰o˜i¨°¸!À1ÀUÀ)ÐSTÔUÔWÙˆoˆd�o‰o˜k¨5°U¸aÀqÈÀgÐUVÔWÔXØ‰ˆˆ#ˆeÙˆd‘M ! C¨¨zÓ:Ô;Ùˆoˆd�o‰o˜i¨°¸!À1ÀUÀ)ÐSTÔUÔWÙˆoˆd�o‰o˜k¨5°U¸aÀqÈÀgÐUVÔWÔXñ 	ÐÔÙ‰h�q˜(˜"Ÿ(™( A a 5›/¨3Ó/±°Q°q¸¸3³ÐA[Ô\Ù‰h�q˜(˜"Ÿ(™( A a 5›/¨2Ó.±°A°a¸¸"³Ð?YÔZÙ‰f�Q˜˜Ÿ™ ! A ›¨Ó,©c°!°A°a¸«mÔ<Ù‰h�q˜(˜"Ÿ(™( A i =Ó1°2Ó6¹¸B¸qÀÀB»ÔHÙ‰f�Q˜˜Ÿ™ ! A ›¨Ó-©s°1°Q°q¸«~Ô>á‰h�q˜(˜"Ÿ(™( A a 5›/¨2Ó.±°A°a¸¸7¸2¿7¹7À5»>Ñ8IÈ"Ó0MÔNõ 2Ú1€FØ	ˆ�‰�S˜˜BÓ	€BØò E‰	ˆˆEØ �—‘ ¨C°E¸QÀbÈÀZÐWXÔYˆØ �—‘ ¨e¸ÀÈ"ÈSÈÐYZÔ[ˆÙ˜2˜s E¨:Ó6ˆÙ˜F B q¡E¨1°kÕBÙ˜F B q¡E¨1°mÖDðEð ò 3ˆØò 	3‰IˆC�Ø$�T—_‘_ V¨S°U¸aÀrÈ%ÐPRÀmÐ[\Ô]ˆFØ$�T—_‘_ X¨u¸À!È2ÈcÐRTÈ+Ð]^Ô_ˆFÙ˜r 3¨¨x¸Ó<ˆBÙ ¨¨1©¨q¸+ÕFÙ ¨¨1©¨q¸-ÕHÙ¡ r¨8¨2¯8©8°S¸%À¹(°OÓ+DÀbÓ IÙ # B s¨5°Ó 4°aØ(1õ3ñ  ¡¨¨X¨R¯X©X°s¸EÀ1¹H°oÓ-FÈÓ KÙ # B s¨5°°·±¸"¸R¹%À¹Ó1DÑ+DÀRÓ HÈ!Ø(1ö3ñ	3ñ3ði r   