
    !gF                         d dl Zd dlmZmZ d dlZd dlmZ d dl	m
Z
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d Zd Zd Zd Zd Zd Zd Zd Z d Z!y)    N)BinomialBayesMixedGLMPoissonBayesMixedGLM)sparse)assert_allcloseassert_equal)approx_fprimec                    t         j                  j                  d       t        j                  t        j                  |       t        j
                  |df            }t         j                  j                  | |z  df      }|t         j                  j                  |       z  }t        j                  |t         j                  d         t        j                  ||      z   }ddt        j                  |       z   z  }dt         j                  j                  | |z        |k  z  }t        j                  | t              }	||||	fS )N        size)r   dtype)nprandomseedkroneyeonesnormaldotr_expuniformzerosint)
nccssexog_vcexog_fevclppryidents
             j/var/www/dash_apps/app1/venv/lib/python3.12/site-packages/statsmodels/genmod/tests/test_bayes_mixed_glm.pygen_simple_logitr*   
   s    IINN4ggbffRj"''2q'"23GiiR"WaL1G	
RYY2&	&B	u	&)<	<B	
a"&&"+o	B	RYYBG,r12AHHRs#Egw%%    c                 r   t         j                  j                  d       t        j                  t        j                  |       t        j
                  |df            }t         j                  j                  | |z  df      }|t         j                  j                  |       z  }t        j                  |t         j                  d         t        j                  ||      z   }t        j                  |      }t         j                  j                  |      }t        j                  | t              }	||||	fS )Nr
   r   r   r   )g?gr   )r   r   r   r   r   r   r   r   r   r   poissonr   r   )
r   r    r!   r"   r#   r$   r%   rr'   r(   s
             r)   gen_simple_poissonr/      s    IINN4ggbffRj"''2q'"23GiiR"WaL1G	
RYY2&	&B	y)	*RVVGR-@	@B
r
A
		!AHHRs#Egw%%r+   c                 z   t         j                  j                  d       t        j                  t        j                  |       t        j
                  |df            }t        j                  t        j
                  |df      t        j                  |             }t        j                  ||fd      }t         j                  j                  | |z  df      }|t         j                  j                  d| z        z  }|| d xxx ||z  z  ccc t        j                  |t         j                  d         t        j                  ||      z   }	ddt        j                  |	       z   z  }
dt         j                  j                  | |z        |
k  z  }t        j                  d| z  t              }d|| d  ||||fS Nr
   r   )axisr   r         r   )r   r   r   r   r   r   concatenater   r   r   r   r   r   r   )r   r    s1s2abr"   r#   r$   r%   r&   r'   r(   s                r)   gen_crossed_logitr9   (   sV   IINN4
r
BGGRG,-A
Q "&&*-AnnaV!,GiiR"WaL1G	biiAF+	+BrsGrBwG	t	%w(;	;B	
a"&&"+o	B	RYYBG,r12AHHQV3'EE"#Jgw%%r+   c                 X   t         j                  j                  d       t        j                  t        j                  |       t        j
                  |df            }t        j                  t        j
                  |df      t        j                  |             }t        j                  ||fd      }t         j                  j                  | |z  df      }|t         j                  j                  d| z        z  }|| d xxx ||z  z  ccc t        j                  |t         j                  d         t        j                  ||      z   }	t        j                  |	      }
t         j                  j                  |
      }t        j                  d| z  t              }d|| d  ||||fS r1   )r   r   r   r   r   r   r4   r   r   r   r   r-   r   r   )r   r    r5   r6   r7   r8   r"   r#   r$   r%   r.   r'   r(   s                r)   gen_crossed_poissonr;   <   s:   IINN4
r
BGGRG,-A
Q "&&*-AnnaV!,GiiR"WaL1G	biiAF+	+BrsGrBwG	t	%w(;	;B
r
A
		!AHHQV3'EE"#Jgw%%r+   c                     t         j                  j                  d       t        j                  t        j                  |       t        j
                  |            }t        j                  t        j
                  |      t        j                  |             }t        j
                  | |z        }t        j                  | |z        }t        j                  |      D ]F  }t        j                  ||k(        }	||	xx   |t         j                  j                         z  z  cc<   H t        j                  |      D ]F  }t        j                  ||k(        }	||	xx   |t         j                  j                         z  z  cc<   H d|z  |z   }
ddt        j                  |
       z   z  }dt         j                  j                  | |z        |k  z  }t        j                  d| z  t              }d|| d  t        j                  ||||d      }|S )Nr
   r3   r   r   r   r   )fer7   r8   r'   )r   r   r   r   aranger   r   uniqueflatnonzeror   r   r   r   pd	DataFrame)r   r    r5   r6   r7   r8   r=   r$   iiir%   r&   r'   r(   dfs                  r)   gen_crossed_logit_pandasrF   P   s   IINN4
		"rwwr{+A
RYYr]+A	b	B	"r'	BYYq\ *^^AF#
2"ryy'')))* YYq\ *^^AF#
2"ryy'')))* 
RB	
a"&&"+o	B	RYYBG,r12AHHQV3'EE"#J	Raaa8	9BIr+   c                  .   t        ddd      \  } }}}t        j                  |      }t        | |||d      }|j	                         }t        |j                  |j                        t        j                  |j                        d       dD ]  }d |fD ]|  }|j                  ||      }|j                  |j                  ||      }	t        ||	       |rCt        |j                         d	k\  d
       t        |j                         dk  d
       ~  y )N
   r         ?vcp_pMbP?atolFTlinearexogr   Tr   )r*   r   
csr_matrixr   fit_mapr   logposterior_gradparamsr   
zeros_likepredictr   minmax)
r'   r#   r"   r(   glmmrsltrQ   rR   pr1pr2s
             r)   test_simple_logit_mapr_   l   s    !1"b!!<Aw(G GWe3GD<<>Dt{{+
dkk"  3'M 	3D,,f4,8C,,t{{6,ECC%SWWY!^T2SWWY!^T2	33r+   c                  v   t        ddd      \  } }}}t        j                  |      }t        | |||d      }|j	                         }t        |j                  |j                        t        j                  |j                        d       t        | |||d      }|j	                         }t        |j                  |j                  d       dD ]  }d |fD ]  }	|j                  ||		      }
|j                  ||		      }|j                  |j                  ||		      }|j                  |j                  ||		      }t        |
|d
       t        ||d
       t        ||d
       |rt        |
j                         dk\  d       t        |j                         dk\  d       t        |j                         dk\  d         ||fD ]o  }|j                         }t        |j                        }t        |j                  t        j                   ||f          t        j"                  j%                  |       q y )NrH   g?rI   rJ   rL   rM   -C6?rO   rP   h㈵>rtolr   T)r/   r   rS   r   rT   r   rU   rV   r   rW   rX   r   rY   
cov_paramslenshaper   linalgcholesky)r'   r#   r"   r(   glmm1rslt1glmm2rslt2rQ   rR   r]   r^   pr3pr4r\   cpps                    r)   test_simple_poisson_maprr      s   !3BC!@Aw(G GWe3GEMMOE-
ell# !GWe3GEMMOEELL%,,T:  3'M 	3D--vD-9C--vD-9C--V$-GC--V$-GCC40C40C40SWWY!^T2SWWY!^T2SWWY!^T2	33 u __RXXruuQT{+
		2	r+   c                     t        dddd      \  } }}}t        j                  |      }t        | |||d      }|j	                         }t        |j                  |j                        t        j                  |j                        d       |j                         }t        |j                        }t        |j                  t        j                  ||f          t        j                  j!                  |       y )NrH   r   r   rI   rJ   ra   rM   )r9   r   rS   r   rT   r   rU   rV   r   rW   re   rf   r   rg   r   rh   ri   r'   r#   r"   r(   r[   r\   rp   rq   s           r)   test_crossed_logit_mapru      s    !22r1a!@Aw(G GWe3GD<<>Dt{{+
dkk" 
	BDKKA255A;'IIrr+   c                     t        dddd      \  } }}}t        j                  |      }t        | |||d      }|j	                         }t        |j                  |j                        t        j                  |j                        d       |j                         }t        |j                        }t        |j                  t        j                  ||f          t        j                  j!                  |       y )NrH   r   rI   rJ   ra   rM   )r;   r   rS   r   rT   r   rU   rV   r   rW   re   rf   r   rg   r   rh   ri   rt   s           r)   test_crossed_poisson_maprw      s    !4RQ!BAw(G7GU#FD<<>Dt{{+
dkk" 
	BDKKA255A;'IIrr+   c                     t        dddd      } d}ddd}t        j                  ||| d      }|j                         }t	        |j                  |j                        t        j                  |j                        d	
       |j                          |j                  d      }t	        |j                  dd d f   j                  t        j                  d   d	
       |j                         }|j                  j                  d   }t!        t#        |j                        ||g       t        j$                  j'                  |       y )NrH   r   rI   y ~ fe0 + C(a)0 + C(b)r7   r8   rJ   ra   rM   r7   r   )gvLg]/M?)rF   r   from_formularT   r   rU   rV   r   rW   summaryrandom_effectsilocvaluesr   re   rg   r   listrh   ri   )datafmlfml_vcr[   r\   r.   cmrq   s           r)   test_logit_map_crossed_formular      s    #BAs3D
CJ/F --c64sKD<<>Dt{{+
dkk" 	LLNC A	q!tRUU#89F 
	B!Abhh!Q(IIrr+   c            
         t        d      D ]  } t        d      D ]  }| dk(  r,|dk(  rt        ddd      \  }}}}nDt        dddd      \  }}}}n0| dk(  r+|dk(  rt        ddd      \  }}}}nt	        dddd      \  }}}}t        j                        }| dk(  rt        |d      nt        |d      j                         }t        d      D ]+  }|dk(  r"|j                  }t        j                  |      }	n|dk(  r4t        j                  t                    }t        j                  |      }	nTt        j                  j!                  t                    }t        j                  j#                  ddt        |            }	j%                  ||	      \  }
}fd	}t        j&                  ||	f      }t)        ||d
      }t        |      dz  }|d | }||d  }t+        |
|dd       t+        ||dd       .   y )Nr   r   rH   r   rI   rJ      r   c                 P    t        |       dz  }j                  | d | | |d        S )Nr   )rf   vb_elbo)vecnrj   s     r)   elboztest_elbo_grad.<locals>.elbo  s-    CAA ==Ra#ab'::r+   rb   g{Gz?)rN   rd   )ranger*   r9   r/   r;   r   rS   r   r   rT   rV   r   	ones_liker   rf   r   r   r   vb_elbo_gradr4   r   r   )fjr'   r#   r"   r(   rk   kvb_meanvb_sd	mean_gradsd_gradr   xg1r   mean_grad_n	sd_grad_nrj   s                     @r)   test_elbo_gradr      s   1X 6Jq 5	JAAv61A"b!1L.Aw1BB12&.Awa61CB2%.Aw 2EB32(.Aw ''0GAv-wc; -wc; MMOE1X J6#llGLL1E!V hhs7|4GLL1E ii..CL.AGII--aW-FE%*%7%7%G"	7; NNGU#34"1dD1FaK !fqrF		;TMDI5J75	J6Jr+   c                  p   t        ddd      \  } }}}t        j                  |      }t        | |||dd      }|j	                         }t        | |||dd      }|j                  |j                        }|j                          |j                          t        |j                  dd t        j                  d   dd       t        |j                  dd t        j                  d	   dd       ||fD ]  }|j                         }	t        |j                        }
||u rIt        |	j                  t        j                  |
|
f          t        j                  j!                  |	       ut        |	j                  t        j                  |
f          t        |	dkD  d
t        j"                  |
      z          y )NrH   r   rI   rK   fe_p   )g8V?gFcg	Hfcgջp%gl`Aqr?ra   rd   rN   )g2Dgoc?gp2`Qgzmg	!Ͽgkm?T)r*   r   rS   r   rT   fit_vbrV   r~   r   r   r   re   rf   r   rg   rh   ri   r   r'   r#   r"   r(   rj   rk   rl   rm   r\   rp   rq   s              r)   test_simple_logit_vbr   '  sn   !1"b!!<Aw(G!	7GU#C9EMMOE!	7GU#C9ELL&E	MMO	MMOQq
KL	 Qq
JK	 u 2__5=255A;/IIr"2559-abggaj12r+   c                  D   t        ddd      \  } }}}t        j                  |      }t        | |||d      }|j	                         }t        | |||d      }|j                  |j                        }|j                          |j                          t        |j                  dd t        j                  d   dd	       t        |j                         j                  dd t        j                  d
   dd	       t        |j                  dd t        j                  d   dd	       t        |j                         dd t        j                  d   dd	       ||fD ]  }|j                         }	t        |j                        }
||u rIt        |	j                  t        j                  |
|
f          t        j                   j#                  |	       ut        |	j                  t        j                  |
f          t        |	dkD  dt        j$                  |
      z          y )NrH   r   rI   rJ   r   r   )g\g`t,+gGV].޿gIP?g
dUdra   r   )gͪ2?gy(nJ?gV>;@gbh-?g+!L>?)gi%g0cPg%ͿgL[?g\/)g~?gr}~?gj ?gÞ?g[MϢ ?T)r/   r   rS   r   rT   r   rV   r~   r   r   r   re   flatrf   r   rg   rh   ri   r   r   s              r)   test_simple_poisson_vbr   M  s   !3BA!>Aw(G GWe3GEMMOE GWe3GELL&E	MMO	MMOQq
LM	 !$
IJ	 Qq
LM	 1Q
GH	 u 2__5=255A;/IIr"2559-abggaj12r+   c                  "   t        dddd      \  } }}}t        | |||dd      }|j                         }t        | |||dd      }|j                  |j                        }|j                          |j                          t        |j                  dd t        j                  d	   d
d
       t        |j                         j                  dd t        j                  d   d
d
       t        |j                  dd t        j                  d   d
d
       t        |j                         dd t        j                  d   d
d
       ||fD ]  }|j                         }	t        |j                        }
||u rIt        |	j                  t        j                  |
|
f          t        j                  j                  |	       ut        |	j                  t        j                  |
f          t        |	dkD  dt        j                   |
      z          y )NrH   r   r   rI   r   meanr   r   )g*2ڭ`gIO g=IW<7g
/KgA>Rfc?ra   r   )gȁQ$?g-?**gG^?gۤqf?gW=K#)gʎdgifwֿg3N4z{?g/q׿gLo.2?)gi?gJ4A7?gO?gC?gѝ7?T)r9   r   rT   r   rV   r~   r   r   r   re   r   rf   r   rg   rh   ri   r   r   s              r)   test_crossed_logit_vbr   ~  s   !22r1a!@Aw!	7GU#C9EMMOE!	7GU#C9ELLellL+E	MMO	MMOQq
 . 	/ !$
  	 Qq
HI	 1Q
HI	 u 2__5=255A;/IIr"2559-abggaj12r+   c                  .   t        dddd      } d}ddd}t        j                  ||| d	      }|j                         }t        |j                  |j
                  |j                  |j                  d	      }|j                         }t        |j                  |j                  d
       |j                          |j                          ||fD ]  }|j                         }t        |j                        }	||u rNt        |j                  t        j                   |	f          t        |dkD  dt        j"                  |	      z         zt        |j                  t        j                   |	f          t        |dkD  dt        j"                  |	      z          y )NrH   r   r   ry   rz   r{   r|   rI   rJ   ra   rM   r   T)rF   r   r}   r   endogrR   r"   r(   r   rV   r~   re   rf   r   rg   r   r   r   )
r   r   r   rj   rk   rl   rm   r\   rp   rq   s
             r)   test_crossed_logit_vb_formular     s1   #BAq1D
CJ/F!..sFDLELLNE!UZZ3HELLNEELL%,,T:	MMO	MMOu 2__5=2559-abggaj12559-abggaj12r+   c                  J   t        dddd      \  } }}}t        | |||dd      }|j                         }t        | |||dd      }|j                  |j                        }|j                          |j                          t        |j                  dd t        j                  d   d	d	
       t        |j                  dd t        j                  d   d	d	
       ||fD ]  }|j                         }	t        |j                        }
||u rIt        |	j                  t        j                  |
|
f          t        j                  j                  |	       ut        |	j                  t        j                  |
f          t        |	dkD  dt        j                  |
      z          y )NrH   r   rI   r   r   r   r   )g]bg,+Mƺ?g*\Egz9[@hgaD?ra   r   )gSg.U?g.	gJ֯gwF|?T)r;   r   rT   r   rV   r~   r   r   r   re   rf   r   rg   rh   ri   r   r   s              r)   test_crossed_poisson_vbr     sb   !4RQ!DAw 	7GU#C9EMMOE 	7GU#C9ELLellL+E	MMO	MMOQq
KL	 Qq
KL	 u 2__5=255A;/IIr"2559-abggaj12r+   c            	         t        dddd      \  } }}}dD ]9  }t        | |||      }|r|j                         }n|j                         }t	        j
                  | |d d df   d      }t        j                  t        |             }t        t        j                  |dk(              D ]  \  }	}
|	||d d |
f   dk(  <    ||d<   t        j                  t        |             }t        t        j                  |dk(              D ]  \  }	}
|	||d d |
f   dk(  <    ||d<   d	}i }d
|d<   d|d<   t        j                  |||      }|r|j                         }n|j                         }t        |j                  |j                  d       ||fD ]  }|j                         }t        |j                        }|rNt        |j                   t        j"                  |f          t        |dkD  dt        j$                  |      z         xt        |j                   t        j"                  ||f          t        j&                  j)                  |        < y )NrH   r   rI   rO   r   )r'   x1z1z2z
y ~ 0 + x1z	0 + C(z1)z	0 + C(z2)rb   rc   T)r;   r   r   rT   rA   rB   r   r   rf   	enumerater@   r}   r   rV   re   r   rg   r   r   rh   ri   )r'   r#   r"   r(   vbrj   rk   rE   r   r   r   r   r   vc_fmlrl   rm   r\   rp   rq   s                      r)   test_poisson_formular     s   !4RQ!DAw ('$w(LLNEMMOE \\A78XXc!fR^^EQJ78 	'CAa%&Bwq!t}!"	'4XXc!fR^^EQJ78 	'CAa%&Bwq!t}!"	'4"t"t$11#vrBLLNEMMOEell>5L 	'D"BDKK ARXXruuQRy1R!VT"''!*_5RXXruuQT{3		""2&	'A('r+   c            	      l   t        ddd      \  } }}}||j                  d      z  }||j                  d      z  }t        j                  |      }g }dD ]6  }t        | |||dd      }|j                  |      }|j                  |       8 t        |d   j                  |d   j                  d	       y 
NrH   r   rO   rI   r   )scale_fer   ra   rc   )
r*   r   stdr   rS   r   r   appendr   rV   r'   r#   r"   r(   rsltsr   r[   r\   s           r)   test_scale_vbr   #  s    !1"b!!<Aww||AGw{{1~G(GE $wc={{H{-T	 E!HOOU1X__4@r+   c            	      l   t        ddd      \  } }}}||j                  d      z  }||j                  d      z  }t        j                  |      }g }dD ]6  }t        | |||dd      }|j                  |      }|j                  |       8 t        |d   j                  |d   j                  d	       y r   )
r*   r   r   r   rS   r   rT   r   r   rV   r   s           r)   test_scale_mapr   3  s    !1"b!!<Aww||AGw{{1~G(GE $wc=||X|.T	 E!HOOU1X__4@r+   c                     t         j                  j                  d       d} d}t        j                  t         j                  j                  dd|       t         j                  j                  d||       d      }|d   |j                  j                         z
  |d<   t         j                  j                  |	      |j                     }|t         j                  j                  |	      |j                     |j                  z  z  }t         j                  j                  | 	      ddt        j                  |       z   z  k  }|j                  t              |d
<   ddd}t        j                   d||      }|j#                         }|}t         j                  j                  |	      |j                     }|t         j                  j                  |	      |j                     |j                  z  z  }t         j                  j%                  t        j                  |            |d
<   ddd}t'        j                   d||      }|j#                         }|}y )Ni?"        r   r   )YearVillager   year_cenr   r'   z0 + C(Village)z0 + C(Village)*year_cenr|   zy ~ year_cen)r   r   r   rA   rB   r   randintr   r   r   r   r   r   astyper   r   r}   r   r-   r   )	r   mr   lprr'   r   modelresult_s	            r)   test_doc_examplesr   C  s   IINN4A
A<<!2!21a!;$&II$5$5aA$>@ ADF|diinn&66D ))



"4<<
0C299#DLL1DMMAAC					"Q!bffcTl*:%;	;ADI $*CDF!../E\\^FA ))



"4<<
0C299#DLL1DMMAAC		!!"&&+.DI $*CDF --/E\\^FAr+   )"numpyr   "statsmodels.genmod.bayes_mixed_glmr   r   pandasrA   scipyr   numpy.testingr   r   scipy.optimizer   r*   r/   r9   r;   rF   r_   rr   ru   rw   r   r   r   r   r   r   r   r   r   r   r    r+   r)   <module>r      s    F   7 (&&&(&(830%P(&28Jv$2L.2b12h2:#2L,'\A A  r+   