nfTlWNl rn Ѻq$³*%yNk9S maq.m>`iY v=78@?7 ~ CѶͫ\]*uQlf^ZL~`^ǥ_ 6E~/6._#1Iķխ}`[W">/m6ITC^bHLiN)cC#֒Hnn!V5孱4Fϟh^@M,XZ "^!8PQ?ltjd*'߻ҙL`C$((fnD!Yx_OԞJnbk$aǕ&P<}AT/ȉ$fM!{J }%p߬;]? Ex/a8Uh 2Q7R-T7&C6[zsqAC ^Vhѿ,CW*g|lj eD&U-Ӛ>Oߕ&3 I]C63O3tQ%`ߌ;뱎0_C&A[lJs`}XF#JpIC~֝) ׀};<=sk*9RÍo} ĢQ$3챓S= ȉ= \NIT0tB#e_Rz (qac c0߹v̖rsEzk#-ƲJv^{I\8~# 0<f*6(Y!FeA1d_g ^/C@K*fT^?8RezR~ElgͶp;Dwc$1+}p86ؕ+ j5Dĕ6 CŜ6wj69}g A \}ABǯ`vϛG(|z&UhK^Iq ~DtiS4]&9G mX'Fk]FwڡEwӏ}P jh'ؿb3(G {SPT6*gƋxD-jLDzOŃ-懶BGzQ_2w#-6c6fRK*ǛtQŏڄ&d:U"* 1JG|tI?>A> Nq&w|\嬱6>S8*v ٌDwe3c$%u!3PVs;1v$7KhevXNH` 6}tR6w^;ߖnoXA LE-kpҤH@o56u14Wl;+d/hDV)mJtJJ m8f`|kgܢ14M5p?Us \wME;0X`c0!SsAuCo56u14Wl;+hD5^I KIto(&X4Z *vA߾u{BtT|خji`snu 2T=,g<`}FvLI iZ9AȖE d"nrcD3}"?tnҧh8Y:=b[,UɱKˠN9ABy|M $4dܼ쟤'G^!{[/qyjXY)!hLj 0iS]UOz!]3'0~GQ”@`Dwe3c$`ˤmZ}Fuޑad"Suİ+Ǘ׈x_0aサjnh$!]gL @Eμwa_ .F>M[?uiu|#:@S5)݇QX/_{@9/|+c?bLoj6hi`wV-![)ȹgnH]T%7U÷W2`f=O9c?󬰼}] ( ,k(vVZgp8-k\"d;d@[m=JGͥ*>(XdDfBm{ǂ.dx/9:,C ĢQ$3o3* d82'J3FFŏ- 䡨!aTnɹPsmx\x}* N/gJr懨FH!wT#G~eO{r (,&Ju\.wvsNrYf[ÚՌ[ Gn,= '<NЀh ĢQ$3L:[$Fec$ B2h]#J0wӤiNj@Ȕ璊#7#?D[b``{m<0:S*5OZA Xت-uZU4M=Uvشx&Z/'8m' ib"!T*;{O"(83JPo_O-BL=c^!N*굡_* ,7N,]BR'~ڨ:~@:0a)V#:exfeXz" /;tV<99X:NLnq4] y%:ؗz;joVރ uD|ϒmE(PGrr&#:+vOp>g/+e5fhvmJNNKɨ\G߾nnG;[2/a؁[u4wkf`|kgܢ1;})(.j) ǨƷTئXwl郍Cr 1S;`t+9f`|kgܢ14M5ije/'p-xkdaه0d $ֻP* Jўo$V1x/Ҩ{mu^dz 9=$ 1j]V&9c\dܼ쟤'G^!{=P8<]J ִT6TwbYCBq8_@vS-퀭w櫃 kG/<bUV`T/Ban"915 msL]`G0/lǍ.v?H;j1k HB~$a_rhoLv9 ĢQ$3@cb̠` G= ; } `6*C$ Y-N5 2004 * copyright : (C) 2004 Michael Nickerson * email : nickersonm@yahoo.com * */ private static function inverseNcdf(float $p): float { // Inverse ncdf approximation by Peter J. Acklam, implementation adapted to // PHP by Michael Nickerson, using Dr. Thomas Ziegler's C implementation as // a guide. http://home.online.no/~pjacklam/notes/invnorm/index.html // I have not checked the accuracy of this implementation. Be aware that PHP // will truncate the coeficcients to 14 digits. // You have permission to use and distribute this function freely for // whatever purpose you want, but please show common courtesy and give credit // where credit is due. // Input paramater is $p - probability - where 0 < p < 1. // Coefficients in rational approximations static $a = [ 1 => -3.969683028665376e+01, 2 => 2.209460984245205e+02, 3 => -2.759285104469687e+02, 4 => 1.383577518672690e+02, 5 => -3.066479806614716e+01, 6 => 2.506628277459239e+00, ]; static $b = [ 1 => -5.447609879822406e+01, 2 => 1.615858368580409e+02, 3 => -1.556989798598866e+02, 4 => 6.680131188771972e+01, 5 => -1.328068155288572e+01, ]; static $c = [ 1 => -7.784894002430293e-03, 2 => -3.223964580411365e-01, 3 => -2.400758277161838e+00, 4 => -2.549732539343734e+00, 5 => 4.374664141464968e+00, 6 => 2.938163982698783e+00, ]; static $d = [ 1 => 7.784695709041462e-03, 2 => 3.224671290700398e-01, 3 => 2.445134137142996e+00, 4 => 3.754408661907416e+00, ]; // Define lower and upper region break-points. $p_low = 0.02425; //Use lower region approx. below this $p_high = 1 - $p_low; //Use upper region approx. above this if (0 < $p && $p < $p_low) { // Rational approximation for lower region. $q = sqrt(-2 * log($p)); return ((((($c[1] * $q + $c[2]) * $q + $c[3]) * $q + $c[4]) * $q + $c[5]) * $q + $c[6]) / (((($d[1] * $q + $d[2]) * $q + $d[3]) * $q + $d[4]) * $q + 1); } elseif ($p_high < $p && $p < 1) { // Rational approximation for upper region. $q = sqrt(-2 * log(1 - $p)); return -((((($c[1] * $q + $c[2]) * $q + $c[3]) * $q + $c[4]) * $q + $c[5]) * $q + $c[6]) / (((($d[1] * $q + $d[2]) * $q + $d[3]) * $q + $d[4]) * $q + 1); } // Rational approximation for central region. $q = $p - 0.5; $r = $q * $q; return ((((($a[1] * $r + $a[2]) * $r + $a[3]) * $r + $a[4]) * $r + $a[5]) * $r + $a[6]) * $q / ((((($b[1] * $r + $b[2]) * $r + $b[3]) * $r + $b[4]) * $r + $b[5]) * $r + 1); } }