U
    KvfH  ã                   @   sþ   d dl Zd dlmZ d dlZd dlZd dlmZm	Z	m
Z
mZ d dlmZ d dlmZ ej de ¡ e ¡ e ¡ g¡ej de	ƒ e
ƒ eƒ g¡dd	„ ƒƒZej de ¡ e ¡ e ¡ g¡ej de	ƒ e
ƒ eƒ g¡d
d„ ƒƒZej de	ƒ e
ƒ eƒ g¡dd„ ƒZdS )é    N)Úassert_allclose)ÚQIFÚQIFIndependenceÚQIFExchangeableÚQIFAutoregressive)Úapprox_fprime)ÚfamiliesÚfamÚ
cov_structc                    sv  t j d¡ d}d}t jj|dfd}t| tjƒrˆt  t jj|| dt  |¡¡}t  	d¡| t  	d¡t jj|d  }| 
d¡| }n<t| tjƒr¦t jjd	|d}nt| tjƒrÄt jjd
d|d}t  t  || ¡t  |¡¡ t¡}t|||| |d‰ td	ƒD ]p}t jjdd}	ˆ  |	¡\}}
}}}‡ fdd„}t|	|dƒ}t||dƒ ‡ fdd„}t|	|dƒ}t|
|dƒ q d S )Néú’ éÈ   é   é   ©Úsizeç      à?ç      è?é   é   r   é   ©ÚgroupsÚfamilyr
   c                    s   ˆ   | ¡d S )Nr   ©Ú	objective©Úparams©Úmodel© úE/tmp/pip-unpacked-wheel-2v6byqio/statsmodels/genmod/tests/test_qif.pyÚllf_gn)   s    z test_qif_numdiff.<locals>.llf_gngH¯¼šò×z>g-Cëâ6?c                    s   ˆ   | ¡d S )Nr   r   r   r   r   r    Úllf/   s    ztest_qif_numdiff.<locals>.llf)ÚnpÚrandomÚseedÚnormalÚ
isinstancer   ÚGaussianÚkronÚonesÚsqrtÚsumÚPoissonÚpoissonÚBinomialÚrandintÚarangeÚastypeÚintr   Úranger   r   r   )r	   r
   ÚnÚqÚxÚeÚyÚgÚ_ÚptZgradZgn_derivr!   Z
gn_numdiffr"   Zgrad_numdiffr   r   r    Útest_qif_numdiff   s.     &"r=   c                 C   sl  t j d¡ d}d}t jd }t jj|t|ƒfd}t| tjƒr˜t  	t jj|| dt  
|¡¡}t  d¡| t  d¡t jj|d  }t  ||¡| }nzt| tjƒrÈt  ||¡}t  |¡}	t j |	¡}nJt| tjƒrt  ||¡}ddt  | ¡  }	t jjd	d|d|	k  t¡}t  	t  || ¡t  
|¡¡ t¡}
t|||
| |d
}| ¡ }t|j|ddd | ¡ }d S )Nr   iè  r   )r   g      à¿gš™™™™™É?r   r   r   r   r   r   gš™™™™™©?)ZatolZrtol)r#   r$   r%   Zr_r&   Úlenr'   r   r(   r)   r*   r+   Údotr-   Úexpr.   r/   Úuniformr2   r3   r1   r   Úfitr   r   Úsummary)r	   r
   r5   r6   r   r7   r8   r9   ÚlprZmeanr:   r   Zrsltr;   r   r   r    Útest_qif_fit5   s,    
 &
"rE   c           
      C   sÔ   t j d¡ t jjdd}t jjdd}t  t  d¡t  d¡¡}t|||| d}| ¡ }t	 
||d d …df |d d …d	f |d
œ¡}tjdd| |d}| ¡ }t|j|jƒ t|j|jƒ t| tƒsÐ|j}	|j}	d S )Ni_  éd   r   )rF   r   é   r   )r   r
   r   r   )r9   Úx1Zx2r   zy ~ 0 + x1 + x2r   )r   r
   Údata)r#   r$   r%   r&   r)   r1   r*   r   rB   ÚpdZ	DataFrameZfrom_formular   r   Zbser'   r   ZbicZaic)
r
   r9   r7   r   Zmodel1Zresult1ZdfZmodel2Zresult2r;   r   r   r    Útest_formulaY   s"    , ÿ
rK   )Znumpyr#   Znumpy.testingr   ZpandasrJ   ZpytestZstatsmodels.genmod.qifr   r   r   r   Zstatsmodels.tools.numdiffr   Zstatsmodels.genmodr   ÚmarkZparametrizer(   r-   r/   r=   rE   rK   r   r   r   r    Ú<module>   s0   ÿÿ&ÿÿ ÿ