diff --git a/CHANGELOG.md b/CHANGELOG.md index a0920ad..d6bb400 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,63 @@ #Change Log +## [3.0] - 2016-09-12 +##Added +- [subStatDist.js] line 54: ` lk2=f('a','link2'+r9,tDiv.id),lk2.innerHTML='
1-sample t-test',lk2.href='./testingFtU3.html';` + +##Changed +- [subStatDist.js] line 20: `var B,tDiv,fm,fmR,lbA,ipA,lbB,ipB,Btn,TxtALb,txtA,br01,restB,adrsLbl,adrs,sbmtB,t,D=[],lk,lk2;` +- [testingFtU.html] line 24: `

F-test, t-test, and U-test with two numerical arrays

` +- [testingFtU2.html] line 2: `testingFtU@bootstrap_simulation` + +##Added +- [testingFtU2.html] line 26: `

F-test, t-test, and U-test with bootstrap simulation

` + +## [3.0] - 2016-09-10 +##Changed +- [statDist3.js] line 45-47 in statDist2.js: ` X/=N;` + ` slf.postMessage({t:X,p:P});` + ` c=dBts=P=null;` +- [statDist3.js] line 43 in statDist2.js: ` X+=P[I] ===` + ` t_1spl=function(A,m){` + ` //A and m are numerical array and given mean value respectively.` + ` var v=0,I=0,av=0,s2=0,n=A.length;` + ` while(I ===` + +##Removed +- [statDist3.js] line 24 in statDist2.js + +##Changed +- [statDist3.js] line 23 in statDist2.js: ` var t_1spl,c,d=e.data.split('@'),d0=d[0].split(','),d1=+d[1],d2=+d[2],d3=+d[3],d4=+d[4],I=0,N=0,dBts,P=[],X=0;` +- [statDist3.js] line 2 in statDist2.js: `* statDist3.js` +- [statDist3.js] line 19-20 in statDist2.js: `//the available data format is csv formatted numerical arrays, given mean value, time of simulation and significance level (0 to 1), separated with '@' as follows:` + `// e.g., '0,1,2@1@10@0.025'` +- [statDist3.js] line 17 in statDist2.js: `//{t:[(t +* https://github.com/YujiSODE/testingFtU +* +* This is modified from statDist (Yuji SODE,2016): the Artistic License; +* https://github.com/YujiSODE/statDist +* +* This is released under the Artistic License. +* See http://dev.perl.org/licenses/ and http://dev.perl.org/licenses/artistic.html +* or LICENSE. +*/ +//============================================================================ +//this is Web Worker interface for statistical test (1-sample t-test) with bootstrap method. +//the Web Worker returns an object with upper probabilities as follows: +//{t:[(t === + t_1spl=function(A,m){ + //A and m are numerical array and given mean value respectively. + var v=0,I=0,av=0,s2=0,n=A.length; + while(I === + //=== === + I=0;while(I === + I=0,N=P.length;while(I1){throw("Invalid p: $p\n");}return precision_string(_subchisqr($n-0,$p-0));}function udistr($p){if($p>1||$p<=0){throw("Invalid p: $p\n");}return precision_string(_subu($p-0));}function tdistr($n,$p){if($n<=0||Math.abs($n)-Math.abs(integer($n))!=0){throw("Invalid n: $n\n");}if($p<=0||$p>=1){throw("Invalid p: $p\n");}return precision_string(_subt($n-0, $p-0));}function fdistr($n,$m,$p){if(($n<=0)||((Math.abs($n)-(Math.abs(integer($n))))!=0)){throw("Invalid n: $n\n");}if(($m<=0)||((Math.abs($m)-(Math.abs(integer($m))))!=0)){throw("Invalid m: $m\n");}if(($p<=0)||($p>1)){throw("Invalid p: $p\n");}return precision_string(_subf($n-0, $m-0, $p-0));}function uprob($x){return precision_string(_subuprob($x-0));}function chisqrprob($n,$x){if(($n<=0)||((Math.abs($n)-(Math.abs(integer($n))))!=0)){throw("Invalid n: $n\n");}return precision_string(_subchisqrprob($n-0, $x-0));}function tprob($n,$x){if(($n<=0)||((Math.abs($n)-Math.abs(integer($n)))!=0)){throw("Invalid n: $n\n");}return precision_string(_subtprob($n-0,$x-0));}function fprob($n,$m,$x){if(($n<=0)||((Math.abs($n)-(Math.abs(integer($n))))!=0)){throw("Invalid n: $n\n");}if(($m<=0)||((Math.abs($m)-(Math.abs(integer($m))))!=0)){throw("Invalid m: $m\n");}return precision_string(_subfprob($n-0,$m-0,$x-0));}function _subfprob($n,$m,$x){var $p;if($x<=0){$p=1;}else if($m%2==0){var $z=$m/($m+$n*$x),$a=1;for(var $i=$m-2;$i>=2;$i-=2){$a=1+($n+$i-2)/$i*$z*$a;}$p=1-(Math.pow((1-$z),($n/2))*$a);}else if($n%2==0){var $z=$n*$x/($m+$n*$x),$a=1;for(var $i=$n-2;$i>=2;$i-=2){$a=1+($m+$i-2)/$i*$z*$a;}$p=Math.pow((1-$z),($m/2))*$a;}else{var $y=Math.atan2(Math.sqrt($n*$x/$m),1),$z=Math.pow(Math.sin($y),2),$a=($n==1)?0:1;for(var $i=$n-2;$i>=3;$i-=2){$a=1+($m+$i-2)/$i*$z*$a;}var $b=Math.PI;for(var $i=2;$i<=$m-1;$i+=2){$b*=($i-1)/$i;}var $p1=2/$b*Math.sin($y)*Math.pow(Math.cos($y),$m)*$a;$z=Math.pow(Math.cos($y),2);$a=($m==1)?0:1;for(var $i=$m-2;$i>=3;$i-=2){$a=1+($i-1)/$i*$z*$a;}$p=max(0,$p1+1-2*$y/Math.PI-2/Math.PI*Math.sin($y)*Math.cos($y)*$a);}return $p;}function _subchisqrprob($n,$x){var $p;if($x<=0){$p=1;}else if($n>100){$p=_subuprob((Math.pow(($x / $n),1/3)-(1-2/9/$n))/Math.sqrt(2/9/$n));}else if($x>400){$p=0;}else{var $a,$i,$i1;if(($n%2)!=0){$p=2*_subuprob(Math.sqrt($x));$a=Math.sqrt(2/Math.PI)*Math.exp(-$x/2)/Math.sqrt($x);$i1=1;}else{$p=$a=Math.exp(-$x/2);$i1=2;}for($i=$i1;$i<=($n-2);$i+= 2){$a*=$x/$i;$p+=$a;}}return $p;}function _subu($p){var $y=-Math.log(4*$p*(1-$p)),$x=Math.sqrt($y*(1.570796288+$y*(.03706987906+$y*(-.8364353589E-3+$y*(-.2250947176E-3+$y*(.6841218299E-5+$y*(0.5824238515E-5+$y*(-.104527497E-5+$y*(.8360937017E-7+$y*(-.3231081277E-8+$y*(.3657763036E-10+$y*.6936233982E-12)))))))))));if($p>.5)$x = -$x;return $x;}function _subuprob($x){var $p = 0,$absx = Math.abs($x);if($absx<1.9){$p=Math.pow((1+$absx*(.049867347+$absx*(.0211410061+$absx*(.0032776263+$absx*(.0000380036+$absx*(.0000488906+$absx*.000005383)))))),-16)/2;}else if($absx<=100){for(var $i=18;$i>=1;$i--){$p=$i/($absx+$p);}$p=Math.exp(-.5*$absx*$absx)/Math.sqrt(2*Math.PI)/($absx+$p);}if($x<0)$p=1-$p;return $p;}function _subt($n,$p){if($p>=1||$p<=0){throw("Invalid p: $p\n");}if($p==0.5){return 0;}else if($p<0.5){return -_subt($n,1-$p);}var $u=_subu($p),$u2=Math.pow($u,2),$a=($u2+1)/4,$b=((5*$u2+16)*$u2+3)/96,$c=(((3*$u2+19)*$u2+17)*$u2-15)/384,$d=((((79*$u2+776)*$u2+1482)*$u2-1920)*$u2-945)/92160,$e=(((((27*$u2+339)*$u2+930)*$u2-1782)*$u2-765)*$u2+17955)/368640,$x=$u*(1 +($a+($b+($c+($d+$e/$n)/$n)/$n)/$n)/$n);if($n<=Math.pow(log10($p),2)+3){var $round;do{var $p1=_subtprob($n,$x),$n1=$n+1,$delta=($p1-$p)/Math.exp(($n1*Math.log($n1/($n+$x*$x))+Math.log($n/$n1/2/Math.PI)-1+(1/$n1-1/$n)/6)/2);$x+=$delta;$round=round_to_precision($delta,Math.abs(integer(log10(Math.abs($x))-4)));}while(($x)&&($round!=0));}return $x;}function _subtprob($n,$x){var $a,$b,$w=Math.atan2($x/Math.sqrt($n),1),$z=Math.pow(Math.cos($w),2),$y=1;for(var $i=$n-2;$i>=2;$i-=2){$y=1+($i-1)/$i*$z*$y;}if($n%2==0){$a=Math.sin($w)/2;$b=.5;}else{$a=($n==1)?0:Math.sin($w)*Math.cos($w)/Math.PI;$b=.5+$w/Math.PI;}return max(0,1-$b-$a*$y);}function _subf ($n,$m,$p){var $x;if($p>=1||$p<=0){throw("Invalid p: $p\n");}if ($p==1){$x=0;}else if($m==1){$x=1/Math.pow(_subt($n,0.5-$p/2),2);}else if($n==1){$x=Math.pow(_subt($m, $p/2),2);}else if($m==2){var $u=_subchisqr($m,1-$p),$a=$m-2;$x=1/($u/$m*(1+(($u-$a)/2+(((4*$u-11*$a)*$u+$a*(7*$m-10))/24+(((2*$u-10*$a)*$u+$a*(17*$m-26))*$u-$a*$a*(9*$m-6))/48/$n)/$n)/$n));}else if($n>$m){$x=1/_subf2($m,$n,1-$p)}else{$x=_subf2($n,$m,$p)}return $x;}function _subf2($n,$m,$p){var $u=_subchisqr($n,$p),$n2=$n-2,$x=$u/$n*(1+(($u-$n2)/2+(((4*$u-11*$n2)*$u+$n2*(7*$n-10))/24+(((2*$u-10*$n2)*$u+$n2*(17*$n-26))*$u-$n2*$n2*(9*$n-6))/48/$m)/$m)/$m),$delta;do{var $z=Math.exp((($n+$m)*Math.log(($n+$m)/($n*$x+$m))+($n-2)*Math.log($x)+ Math.log($n*$m/($n+$m))-Math.log(4*Math.PI)-(1/$n+1/$m-1/($n+$m))/6)/2);$delta=(_subfprob($n,$m,$x)-$p)/$z;$x+=$delta;}while(Math.abs($delta)>3e-4);return $x;}function _subchisqr($n,$p){var $x;if(($p>1)||($p<=0)){throw("Invalid p: $p\n");}else if($p==1){$x=0;}else if($n==1){$x=Math.pow(_subu($p/2),2);}else if($n==2){$x=-2*Math.log($p);}else{var $u=_subu($p),$u2=$u*$u;$x=max(0,$n+Math.sqrt(2*$n)*$u+2/3*($u2-1)+$u*($u2-7)/9/Math.sqrt(2*$n)-2/405/$n*($u2*(3*$u2+7)-16));if($n<=100){var $x0,$p1,$z;do{$x0=$x;if($x<0){$p1=1;}else if($n>100){$p1=_subuprob((Math.pow(($x/$n),(1/3))-(1-2/9/$n))/Math.sqrt(2/9/$n));}else if($x>400){$p1=0;}else{var $i0,$a;if(($n%2)!=0){$p1=2*_subuprob(Math.sqrt($x));$a=Math.sqrt(2/Math.PI)*Math.exp(-$x/2)/Math.sqrt($x);$i0=1;}else{$p1=$a=Math.exp(-$x/2);$i0=2;}for(var $i=$i0;$i<=$n-2;$i+=2){$a*=$x/$i;$p1+=$a;}}$z=Math.exp((($n-1)*Math.log($x/$n)-Math.log(4*Math.PI*$x)+$n-$x-1/$n/6)/2);$x+=($p1-$p)/$z;$x=round_to_precision($x,5);}while(($n<31)&&(Math.abs($x0-$x)>1e-4));}}return $x;}function log10($n){return Math.log($n)/Math.log(10);}function max(){var $max=arguments[0];for(var $i=0;$iarguments[$i])$min=arguments[$i];}return $min;}function precision($x){return Math.abs(integer(log10(Math.abs($x))-SIGNIFICANT));}function precision_string($x){if($x){return round_to_precision($x,precision($x));}else{return "0";}}function round_to_precision($x,$p){$x=$x*Math.pow(10,$p);$x=Math.round($x);return $x/Math.pow(10,$p);}function integer($i){if($i>0){return Math.floor($i);}else{return Math.ceil($i);}} +/*statistics-distributions-js_Ymdf.js (Ben Tilly,2008; modified by Yuji SODE, 2016)*/ +/*bootstrapEst-2.1/bootstrapMdl.js (Yuji SODE,2016) +* This software is released under the MIT License. See http://opensource.org/licenses/mit-license.php +* the simple interface for estimation of a value of statistic, with bootstrap Method (Efron,1979). +* reference: Efron, B. 1979. Bootstrap Methods: Another Look at the Jackknife. Ann. Statist. vol. 7, no. 1, p. 1-26. +*/ +function bootstrap(A,n){var r=[],rdInt=0;for(var i=0;i @@ -51,6 +51,7 @@ var B,tDiv,fm,fmR,lbA,ipA,lbB,ipB,Btn,TxtALb,txtA,br01,restB,adrsLbl,adrs,sbmtB, },true); // lk=f('a','link'+r9,tDiv.id),lk.innerHTML='
Test with bootstrap method',lk.href='./testingFtU2.html'; + lk2=f('a','link2'+r9,tDiv.id),lk2.innerHTML='
1-sample t-test',lk2.href='./testingFtU3.html'; //============ web worker ============ W=new Worker('./statDist.js'); W.addEventListener('error',function(e){console.log(e.message),W.terminate();},true); diff --git a/subStatDist3.js b/subStatDist3.js new file mode 100644 index 0000000..be56b60 --- /dev/null +++ b/subStatDist3.js @@ -0,0 +1,90 @@ +/*testingFtU +* subStatDist3.js +* +* Copyright (c) 2016 Yuji SODE +* https://github.com/YujiSODE/testingFtU +* +* This is released under the Artistic License. +* See http://dev.perl.org/licenses/ and http://dev.perl.org/licenses/artistic.html +* or LICENSE. +*/ +(function(){ +var slf=this.window,W,r9=slf.Math.random().toFixed(9).replace(/\./g,''),cObj; + //=== element generator === + var f=function(elName,elId,targetId){ + var t=slf.document.getElementById(targetId),E=slf.document.createElement(elName); + E.id=elId; + return t.appendChild(E); + }; + //========================= +var B,tDiv,fm,fmR,lbA,ipA,lbM,ipM,lbSSize,ipSSize,lbTSm,ipTSm,lbAlpha,ipAlpha,Btn,TxtALb,txtA,br01,restB,adrsLbl,adrs,sbmtB,t,D=[],lk; + B=slf.document.getElementsByTagName('body')[0];B.id='B'+r9; + tDiv=f('div','div'+r9,B.id),B.removeAttribute('id'); + //
+ fm=f('form','fm'+r9,tDiv.id); + fmR=f('form','fmR'+r9,tDiv.id); + fmR.name='statistical test'; + fmR.action='mailto:123.example@qwerty.com?subject='+slf.document.getElementsByTagName('title')[0].innerHTML; + fmR.method='post'; + fmR.enctype='text/plain'; + //
+ // + lbA=f('label','labelA'+r9,fm.id),lbA.innerHTML='
Resampling from:'; + ipA=f('input','inputA'+r9,lbA.id),ipA.type='text',ipA.value='0,1,2'; + //
+ // + lbM=f('label','labelM'+r9,fm.id),lbM.innerHTML='
Given mean:'; + ipM=f('input','inputM'+r9,lbM.id),ipM.type='number',ipM.step=0.01,ipM.value=1; + //
+ // + lbSSize=f('label','labelSSize'+r9,fm.id),lbSSize.innerHTML='
Resampling size:'; + ipSSize=f('input','inputSSize'+r9,lbSSize.id),ipSSize.type='number',ipSSize.min=1,ipSSize.step=1,ipSSize.value=20; + //
+ // + // + lbAlpha=f('label','labelAlpha'+r9,fm.id),lbAlpha.innerHTML='
Significance level:'; + ipAlpha=f('input','inputAlpha'+r9,lbAlpha.id),ipAlpha.type='number',ipAlpha.min=0,ipAlpha.max=1,ipAlpha.step=0.001,ipAlpha.value=0.025; + //
+ Btn=f('input','Btn'+r9,fm.id),Btn.type='button',Btn.value='Run'; + // + TxtALb=f('label','labelTxtArea'+r9,fmR.id),TxtALb.innerHTML='
Result:'; + txtA=f('textarea','result'+r9,TxtALb.id),txtA.name='Result'; + br01=f('br','br01_'+r9,fmR.id); + restB=f('input','resetB'+r9,fmR.id),restB.type='button',restB.value='Clear'; + adrsLbl=f('label','adrsLbl'+r9,fmR.id),adrsLbl.innerHTML='
Email address:'; + adrs=f('input','adrs'+r9,adrsLbl.id),adrs.type='email',adrs.value='123.example@qwerty.com'; + sbmtB=f('input','submitB'+r9,fmR.id),sbmtB.type='submit',sbmtB.value='Output as email'; + adrs.addEventListener('change',function(){ + var F=slf.document.getElementById(fmR.id); + F.action='mailto:'+this.value+'?subject='+slf.document.getElementsByTagName('title')[0].innerHTML+': '+slf.Date().replace(/\s/g,'_'); + },true); + //
+ lk=f('a','link'+r9,tDiv.id),lk.innerHTML='
2 sample test',lk.href='./testingFtU.html'; + restB.addEventListener('click',function(){ + slf.document.getElementById(txtA.id).value=''; + },true); +//============ web worker ============ + W=new Worker('./statDist3.js'); + W.addEventListener('error',function(e){console.log(e.message),W.terminate();},true); + W.addEventListener('message',function(e){ + var output='1-sample t-test\n',d=e.data,n=d.p.length; + t=slf.document.getElementById(txtA.id); + output+='Rejection rate:'+d.t+'\n\n'; + for(var i=0;i\n[Resampled size:'+D[2]+';Given mean:'+D[1]+';\nSimulation:'+D[3]+'times;\nSignificance level:'+D[4]+']\n' + },true); +}()); diff --git a/testingFtU.html b/testingFtU.html index 83de361..2b95fc2 100644 --- a/testingFtU.html +++ b/testingFtU.html @@ -21,6 +21,7 @@ +

F-test, t-test, and U-test with two numerical arrays

diff --git a/testingFtU2.html b/testingFtU2.html index 5b0ddb4..51f5d94 100644 --- a/testingFtU2.html +++ b/testingFtU2.html @@ -1,5 +1,5 @@ -testingFtU@bootstrap simulation +testingFtU@bootstrap_simulation @@ -23,6 +23,7 @@ +

F-test, t-test, and U-test with bootstrap simulation

diff --git a/testingFtU3.html b/testingFtU3.html new file mode 100644 index 0000000..1269d11 --- /dev/null +++ b/testingFtU3.html @@ -0,0 +1,29 @@ + +testingFtU@1-sample_t-test + + + + + + + + + + + + + +

1-sample_t-test

+ + +