U
    Ãmœd‰+  ã                   @   sR  d Z ddlmZ ddlZddlmZmZ ddlm	Z	 ddl
Z
ddlmZ ddlmZ ddlmZmZ dd	lmZ dd
lmZ G dd„ dƒZG dd„ dƒZG dd„ deƒZG dd„ dƒZG dd„ deeƒZG dd„ deeƒZG dd„ deƒZG dd„ deƒZe
jjdde d�G dd„ deƒƒZ!G d d!„ d!eƒZ"e
jjd"de#d�G d#d$„ d$eƒƒZ$dS )%a|	  Tests for gam.AdditiveModel and GAM with Polynomials compared to OLS and GLM


Created on Sat Nov 05 14:16:07 2011

Author: Josef Perktold
License: BSD


Notes
-----

TODO: TestGAMGamma: has test failure (GLM looks good),
        adding log-link did not help
        resolved: gamma does not fail anymore after tightening the
                  convergence criterium (rtol=1e-6)
TODO: TestGAMNegativeBinomial: rvs generation does not work,
        nbinom needs 2 parameters
TODO: TestGAMGaussianLogLink: test failure,
        but maybe precision issue, not completely off

        but something is wrong, either the testcase or with the link
        >>> tt3.__class__
        <class '__main__.TestGAMGaussianLogLink'>
        >>> tt3.res2.mu_pred.mean()
        3.5616368292650766
        >>> tt3.res1.mu_pred.mean()
        3.6144278964707679
        >>> tt3.mu_true.mean()
        34.821904835958122
        >>>
        >>> tt3.y_true.mean()
        2.685225067611543
        >>> tt3.res1.y_pred.mean()
        0.52991541684645616
        >>> tt3.res2.y_pred.mean()
        0.44626406889363229



one possible change
~~~~~~~~~~~~~~~~~~~
add average, integral based tests, instead of or additional to sup
    * for example mean squared error for mu and eta (predict, fittedvalues)
      or mean absolute error, what's the scale for this? required precision?
    * this will also work for real non-parametric tests

example: Gamma looks good in average bias and average RMSE (RMISE)

>>> tt3 = _estGAMGamma()
>>> np.mean((tt3.res2.mu_pred - tt3.mu_true))/tt3.mu_true.mean()
-0.0051829977497423706
>>> np.mean((tt3.res2.y_pred - tt3.y_true))/tt3.y_true.mean()
0.00015255264651864049
>>> np.mean((tt3.res1.y_pred - tt3.y_true))/tt3.y_true.mean()
0.00015255538823786711
>>> np.mean((tt3.res1.mu_pred - tt3.mu_true))/tt3.mu_true.mean()
-0.0051937668989744494
>>> np.sqrt(np.mean((tt3.res1.mu_pred - tt3.mu_true)**2))/tt3.mu_true.mean()
0.022946118520401692
>>> np.sqrt(np.mean((tt3.res2.mu_pred - tt3.mu_true)**2))/tt3.mu_true.mean()
0.022953913332599746
>>> maxabs = lambda x: np.max(np.abs(x))
>>> maxabs((tt3.res1.mu_pred - tt3.mu_true))/tt3.mu_true.mean()
0.079540546242707733
>>> maxabs((tt3.res2.mu_pred - tt3.mu_true))/tt3.mu_true.mean()
0.079578857986784574
>>> maxabs((tt3.res2.y_pred - tt3.y_true))/tt3.y_true.mean()
0.016282852522951426
>>> maxabs((tt3.res1.y_pred - tt3.y_true))/tt3.y_true.mean()
0.016288391235613865



é    )ÚlrangeN)Úassert_almost_equalÚassert_equal)Ústats)ÚAdditiveModel)ÚModel)ÚfamilyÚlinks)ÚGLM)ÚOLSc                   @   s   e Zd ZdS )ÚDummyN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú[/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/statsmodels/sandbox/tests/test_gam.pyr   [   s   r   c                   @   sP   e Zd Zdd„ Zejjdedd�dd„ ƒZdd	„ Z	ejjd
de
d�dd„ ƒZdS )ÚCheckAMc                 C   s8   t | jj| jjdd� t | jj| jjd d… dd� d S ©Né   ©Údecimalé
   )r   Úres1Úy_predÚres2Úy_predshort©Úselfr   r   r   Útest_predict`   s     ÿ ÿzCheckAM.test_predictz&Unknown, results do not match expectedT)ÚreasonÚraisesÚstrictc                 C   s8   t | jj| jjdd� t | jj| jjd d… dd� d S r   )r   r   r   r   Zfittedvaluesr   r   r   r   r   Útest_fittedf   s     ÿ ÿzCheckAM.test_fittedc                 C   sH   t | jjdd … | jjdd … dd� t | jjd | jjd dd� d S )Né   r   r   )r   r   Úparamsr   r   r   r   r   Útest_paramso   s     ÿ
 ÿzCheckAM.test_paramszres_ps attribute does not exist©r   r!   r    c                 C   s@   t | j ¡ | jjƒ t | j ¡ | jjƒ t | j ¡ | jjƒ d S ©N)r   Zres_psZdf_modelr   Zdf_fitZdf_residr   r   r   r   Útest_dfx   s    zCheckAM.test_dfN)r   r   r   r   ÚpytestÚmarkÚxfailÚAssertionErrorr"   r%   ÚAttributeErrorr(   r   r   r   r   r   ^   s    ÿ
	 ÿr   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚCheckGAMc                 C   s   t | jj| jjdd� d S )Nr   r   )r   r   Úmu_predr   r   r   r   r   Útest_muƒ   s     ÿzCheckGAM.test_muc                 C   s"   t | jj| jjd d… dd� d S )Nr   r   r   )r   r   r   r   r   r   r   r   r   Útest_predictionˆ   s     ÿzCheckGAM.test_predictionN)r   r   r   r0   r1   r   r   r   r   r.   �   s   r.   c                   @   s   e Zd Zedd„ ƒZdS )ÚBaseAMc                 C   sØ   d}d}d\}}t  |||¡}t  d| ¡}t  || ¡  d d| f¡}|d d …d d …d f t  |d ¡d d d d …f   |d¡}t|d d ƒ}	|	|d = |d d …|	f }
| d¡}|| _	|||
  | _
| _| _d S )Né   éÈ   )g      Àr3   r   r#   g      ð?éÿÿÿÿ)ÚnpZlinspaceÚsinZcolumn_stackÚmaxZarangeZreshaper   ÚsumÚnobsÚy_trueÚxÚexog)ÚclsÚorderr:   ZlbZubÚx1Zx2r<   r=   ÚidxZexog_reducedr;   r   r   r   Úsetup_class�   s    :

zBaseAM.setup_classN)r   r   r   ÚclassmethodrB   r   r   r   r   r2   Ž   s   r2   c                       s,   e Zd Ze‡ fdd„ƒZ‡ fdd„Z‡  ZS )ÚTestAdditiveModelc                    sü   t t| ƒ ¡  | j}| j| j| j  }}}tj 	d¡ d}||tj 
|¡  }t|ƒ}| |¡ |j}t||ƒ ¡ }	tƒ  | _}
|	 | _}| |¡|
_|	j |	j|¡|_| |d d… ¡|
_dd„ |jD ƒ}|jtdd„ |jD ƒƒ }t |g| ¡|
_d S )Né)Â… gš™™™™™¹?r   c                 S   s$   g | ]}|j d d… D ]}|‘qqS ©r#   N©r$   ©Ú.0ÚssÚir   r   r   Ú
<listcomp>Á   s       z1TestAdditiveModel.setup_class.<locals>.<listcomp>c                 S   s   g | ]}|j d  ‘qS ©r#   rG   ©rI   rJ   r   r   r   rL   Ã   s     )ÚsuperrD   rB   r:   r;   r<   r=   r6   ÚrandomÚseedZrandnr   ÚfitÚresultsr   r   r   r   Úpredictr   Úmodelr$   r   Ú	smoothersÚalphar9   Úarray)r>   r:   r;   r<   r=   Zsigma_noiseÚyÚmÚres_gamZres_olsr   r   ÚslopesÚconst©Ú	__class__r   r   rB   §   s$    

zTestAdditiveModel.setup_classc                    s   t t| ƒ ¡  d S r'   )rO   rD   r"   r   r^   r   r   r"   Ç   s    zTestAdditiveModel.test_fitted)r   r   r   rC   rB   r"   Ú__classcell__r   r   r^   r   rD   ¥   s   rD   c                   @   s   e Zd Zedd„ ƒZdS )ÚBaseGAMc                 C   sx  | j }| j| j| j  }}}t| dƒs,d}n| j}| j}|j |¡ | _	}t
j d¡ z| j|||d�}W n" tk
rŒ   | j||d�}Y nX t|||d�}	|	j|dd� |	j}
|
| _|	| _t|||d� ¡ }tƒ  | _}| | _}|jj|j|d	d
�|_|
 |¡|_|
 |d d… ¡|_|jj|j|dd
�|_|
j|_dd„ |	jD ƒ}|
j t!dd„ |	jD ƒƒ }t
 "|g| ¡|_d S )NÚscaler#   rE   )rb   Úsize)rc   )r   éd   )ÚmaxiterZlinear)Úwhichr   Zmeanc                 S   s$   g | ]}|j d d… D ]}|‘qqS rF   rG   rH   r   r   r   rL   ú   s       z BaseGAM.init.<locals>.<listcomp>c                 S   s   g | ]}|j d  ‘qS rM   rG   rN   r   r   r   rL   û   s     )#r:   r;   r<   r=   Úhasattrrb   r   ÚlinkZinverseÚmu_truer6   rP   rQ   ÚrvsÚ	TypeErrorÚGAMrR   rS   r[   Zmod_gamr
   r   r   r   rU   rT   r$   r   r   r/   ÚmurV   rW   r9   rX   )r>   r:   r;   r<   r=   rb   Úfri   Zy_obsrZ   r[   Zres_glmr   r   r\   r]   r   r   r   ÚinitÏ   s8    

zBaseGAM.initN)r   r   r   rC   ro   r   r   r   r   ra   Í   s   ra   c                       s    e Zd Ze‡ fdd„ƒZ‡  ZS )ÚTestGAMPoissonc                    s.   t t| ƒ ¡  t ¡ | _tjj| _|  ¡  d S r'   )	rO   rp   rB   r   ZPoissonr   Zpoissonrj   ro   ©r>   r^   r   r   rB     s    

zTestGAMPoisson.setup_class©r   r   r   rC   rB   r`   r   r   r^   r   rp   ÿ   s   rp   c                       s    e Zd Ze‡ fdd„ƒZ‡  ZS )ÚTestGAMBinomialc                    s.   t t| ƒ ¡  t ¡ | _tjj| _|  ¡  d S r'   )	rO   rs   rB   r   ZBinomialr   Z	bernoullirj   ro   rq   r^   r   r   rB     s    

zTestGAMBinomial.setup_classrr   r   r   r^   r   rs   
  s   rs   z'Unknown, results do not match expected.Tr&   c                       s    e Zd Ze‡ fdd„ƒZ‡  ZS )ÚTestGAMGaussianLogLinkc                    s:   t t| ƒ ¡  t t ¡ ¡| _tjj	| _	d| _
|  ¡  d S )Né   )rO   rt   rB   r   ZGaussianr	   ÚLogr   Znormrj   rb   ro   rq   r^   r   r   rB   !  s
    
z"TestGAMGaussianLogLink.setup_classrr   r   r   r^   r   rt     s   rt   c                       s    e Zd Ze‡ fdd„ƒZ‡  ZS )ÚTestGAMGammac                    s4   t t| ƒ ¡  t t ¡ ¡| _tjj	| _	|  
¡  d S r'   )rO   rw   rB   r   ÚGammar	   rv   r   Úgammarj   ro   rq   r^   r   r   rB   .  s    
zTestGAMGamma.setup_classrr   r   r   r^   r   rw   ,  s   rw   ú6Passing wrong number of args/kwargs to _parse_args_rvsc                       s\   e Zd Ze‡ fdd„ƒZejjdded�‡ fdd„ƒZ	ejjdded�‡ fdd	„ƒZ
‡  ZS )
ÚTestGAMNegativeBinomialc                    s.   t t| ƒ ¡  t ¡ | _tjj| _|  ¡  d S r'   )	rO   r{   rB   r   ZNegativeBinomialr   Znbinomrj   ro   rq   r^   r   r   rB   >  s    

z#TestGAMNegativeBinomial.setup_classrz   Tr&   c                    s   t t| ƒ ¡  d S r'   )rO   r{   r"   r   r^   r   r   r"   G  s    z#TestGAMNegativeBinomial.test_fittedc                    s   t t| ƒ ¡  d S r'   )rO   r{   r(   r   r^   r   r   r(   O  s    zTestGAMNegativeBinomial.test_df)r   r   r   rC   rB   r)   r*   r+   rk   r"   r(   r`   r   r   r^   r   r{   8  s    þ þr{   )%Ú__doc__Zstatsmodels.compat.pythonr   Únumpyr6   Znumpy.testingr   r   Zscipyr   r)   Zstatsmodels.sandbox.gamr   r   rl   Zstatsmodels.genmod.familiesr   r	   Z+statsmodels.genmod.generalized_linear_modelr
   Z#statsmodels.regression.linear_modelr   r   r   r.   r2   rD   ra   rp   rs   r*   r+   r,   rt   rw   rk   r{   r   r   r   r   Ú<module>   s:   K#(2 ÿ þ