Table JavaScript Functions for Building New Tables

From Q
Jump to navigation Jump to search

This page contains functions which are used by QScripts or Rules for constructing complicated tables from scratch. The functions are very specific to the QScripts that they were designed for, and so will generally not be useful for other purposes. However, since multiple scripts are making use of this code it needs to be in a central location.

buildTableWithDifferentWeightsForDifferentPeriods

This function is designed to build a new table (or chart) where each column is weighted differently. This is achieved by generating new summary tables for each weight and copying the statistics over. Significance testing is performed manually by this function. More details on this can be found at the QScript pages which make use of this function: Weighting - Tables with Weights for Each Time Period and Weighting - Plots with Weights for Each Time Period.

Source Code

var buildTableWithDifferentWeightsForDifferentPeriods = function(for_plot, p_cutoff, use_bessel_correction, weight_names, weight_question_name, brown_question, high_symbol, low_symbol) {

	// This function takes the question in the blue drop-down and generates a number of columns where a different weight is applied to the table in each column.
	// Significance tests are conducted, where each cell is compared with the cell in the previous column.
	//
	// Parameters:
	//
	// for_plot - Boolean to tell the script if it is being applied to a plot (or false for a table)
	// p_cutoff - The p-value cutoff for the statistical tests used on the new table
	// use_bessel_correction - Boolean to determine if the statitical test for means employs the Bessel's correction
	// weight_names - An array containing the names of the weight variables to use for the columns of this table
	// weight_question_name - The name of the question that contains the weights
	// brown_question - The question to use in the brown drop-down menu (should have the same number of columns as there are weights)
	// high_symbol - Symbol to use for significantly high results
	// low_symbol - Symbol to use for significanctly low results


	// Include the jStat library for its t-test and z-test.
	// Source: https://github.com/jstat/jstat
	// Documentation: https://github.com/jstat/jstat/blob/master/doc/md/distributions.md
	// This version was current as of 2014-05-14
	// Copyright (c) 2013 jStat
	// 
	// Permission is hereby granted, free of charge, to any person obtaining a copy
	// of this software and associated documentation files (the "Software"), to deal
	// in the Software without restriction, including without limitation the rights
	// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
	// copies of the Software, and to permit persons to whom the Software is
	// furnished to do so, subject to the following conditions:
	// 
	// The above copyright notice and this permission notice shall be included in
	// all copies or substantial portions of the Software.
	// 
	// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
	// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
	// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
	// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
	// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
	// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
	// THE SOFTWARE.
	this.j$=this.jStat=function(a,b){function f(b,c){var d=b>c?b:c;return a.pow(10,17-~~(a.log(d>0?d:-d)*a.LOG10E))}function h(a){return e.call(a)==="[object Function]"}function i(a){return typeof a=="number"&&a===a}function j(a){return c.apply([],a)}function k(){return new k._init(arguments)}function l(){return 0}function m(){return 1}function n(a,b){return a===b?1:0}var c=Array.prototype.concat,d=Array.prototype.slice,e=Object.prototype.toString,g=Array.isArray||function(b){return e.call(b)==="[object Array]"};k.fn=k.prototype,k._init=function(b){var c;if(g(b[0]))if(g(b[0][0])){h(b[1])&&(b[0]=k.map(b[0],b[1]));for(c=0;c<b[0].length;c++)this[c]=b[0][c];this.length=b[0].length}else this[0]=h(b[1])?k.map(b[0],b[1]):b[0],this.length=1;else if(i(b[0]))this[0]=k.seq.apply(null,b),this.length=1;else{if(b[0]instanceof k)return k(b[0].toArray());this[0]=[],this.length=1}return this},k._init.prototype=k.prototype,k._init.constructor=k,k.utils={calcRdx:f,isArray:g,isFunction:h,isNumber:i,toVector:j},k.extend=function(b){var c,d;if(arguments.length===1){for(d in b)k[d]=b[d];return this}for(c=1;c<arguments.length;c++)for(d in arguments[c])b[d]=arguments[c][d];return b},k.rows=function(b){return b.length||1},k.cols=function(b){return b[0].length||1},k.dimensions=function(b){return{rows:k.rows(b),cols:k.cols(b)}},k.row=function(b,c){return b[c]},k.col=function(b,c){var d=new Array(b.length);for(var e=0;e<b.length;e++)d[e]=[b[e][c]];return d},k.diag=function(b){var c=k.rows(b),d=new Array(c);for(var e=0;e<c;e++)d[e]=[b[e][e]];return d},k.antidiag=function(b){var c=k.rows(b)-1,d=new Array(c);for(var e=0;c>=0;c--,e++)d[e]=[b[e][c]];return d},k.transpose=function(b){var c=[],d,e,f,h,i;g(b[0])||(b=[b]),e=b.length,f=b[0].length;for(i=0;i<f;i++){d=new Array(e);for(h=0;h<e;h++)d[h]=b[h][i];c.push(d)}return c.length===1?c[0]:c},k.map=function(b,c,d){var e,f,h,i,j;g(b[0])||(b=[b]),f=b.length,h=b[0].length,i=d?b:new Array(f);for(e=0;e<f;e++){i[e]||(i[e]=new Array(h));for(j=0;j<h;j++)i[e][j]=c(b[e][j],e,j)}return i.length===1?i[0]:i},k.alter=function(b,c){return k.map(b,c,!0)},k.create=function(b,c,d){var e=new Array(b),f,g;h(c)&&(d=c,c=b);for(f=0;f<b;f++){e[f]=new Array(c);for(g=0;g<c;g++)e[f][g]=d(f,g)}return e},k.zeros=function(b,c){return i(c)||(c=b),k.create(b,c,l)},k.ones=function(b,c){return i(c)||(c=b),k.create(b,c,m)},k.rand=function(c,d){return i(d)||(d=c),k.create(c,d,a.random)},k.identity=function(b,c){return i(c)||(c=b),k.create(b,c,n)},k.symmetric=function(b){var c=!0,d=b.length,e,f;if(b.length!==b[0].length)return!1;for(e=0;e<d;e++)for(f=0;f<d;f++)if(b[f][e]!==b[e][f])return!1;return!0},k.clear=function(b){return k.alter(b,l)},k.seq=function(b,c,d,e){h(e)||(e=!1);var g=[],i=f(b,c),j=(c*i-b*i)/((d-1)*i),k=b,l;for(l=0;k<=c;l++,k=(b*i+j*i*l)/i)g.push(e?e(k,l):k);return g};var o=k.prototype;return o.length=0,o.push=Array.prototype.push,o.sort=Array.prototype.sort,o.splice=Array.prototype.splice,o.slice=Array.prototype.slice,o.toArray=function(){return this.length>1?d.call(this):d.call(this)[0]},o.map=function(b,c){return k(k.map(this,b,c))},o.alter=function(b){return k.alter(this,b),this},function(a){for(var b=0;b<a.length;b++)(function(a){o[a]=function(b){var c=this,d;return b?(setTimeout(function(){b.call(c,o[a].call(c))}),this):(d=k[a](this),g(d)?k(d):d)}})(a[b])}("transpose clear symmetric rows cols dimensions diag antidiag".split(" ")),function(a){for(var b=0;b<a.length;b++)(function(a){o[a]=function(b,c){var d=this;return c?(setTimeout(function(){c.call(d,o[a].call(d,b))}),this):k(k[a](this,b))}})(a[b])}("row col".split(" ")),function(a){for(var b=0;b<a.length;b++)(function(a){o[a]=new Function("return jStat(jStat."+a+".apply(null, arguments));")})(a[b])}("create zeros ones rand identity".split(" ")),k}(Math),function(a,b){function d(a,b){return a-b}function e(a,c,d){return b.max(c,b.min(a,d))}var c=a.utils.isFunction;a.sum=function g(a){var g=0,b=a.length,c;while(--b>=0)g+=a[b];return g},a.sumsqrd=function(b){var c=0,d=b.length;while(--d>=0)c+=b[d]*b[d];return c},a.sumsqerr=function(c){var d=a.mean(c),e=0,f=c.length,g;while(--f>=0)g=c[f]-d,e+=g*g;return e},a.product=function(b){var c=1,d=b.length;while(--d>=0)c*=b[d];return c},a.min=function(b){var c=b[0],d=0;while(++d<b.length)b[d]<c&&(c=b[d]);return c},a.max=function(b){var c=b[0],d=0;while(++d<b.length)b[d]>c&&(c=b[d]);return c},a.mean=function(c){return a.sum(c)/c.length},a.meansqerr=function(c){return a.sumsqerr(c)/c.length},a.geomean=function(d){return b.pow(a.product(d),1/d.length)},a.median=function(b){var c=b.length,e=b.slice().sort(d);return c&1?e[c/2|0]:(e[c/2-1]+e[c/2])/2},a.cumsum=function(b){var c=b.length,d=new Array(c),e;d[0]=b[0];for(e=1;e<c;e++)d[e]=d[e-1]+b[e];return d},a.diff=function(b){var c=[],d=b.length,e;for(e=1;e<d;e++)c.push(b[e]-b[e-1]);return c},a.mode=function(b){var c=b.length,e=b.slice().sort(d),f=1,g=0,h=0,i=[],j;for(j=0;j<c;j++)e[j]===e[j+1]?f++:(f>g?(i=[e[j]],g=f,h=0):f===g&&(i.push(e[j]),h++),f=1);return h===0?i[0]:i},a.range=function(c){return a.max(c)-a.min(c)},a.variance=function(c,d){return a.sumsqerr(c)/(c.length-(d?1:0))},a.stdev=function(d,e){return b.sqrt(a.variance(d,e))},a.meandev=function(d){var e=0,f=a.mean(d),g;for(g=d.length-1;g>=0;g--)e+=b.abs(d[g]-f);return e/d.length},a.meddev=function(d){var e=0,f=a.median(d),g;for(g=d.length-1;g>=0;g--)e+=b.abs(d[g]-f);return e/d.length},a.coeffvar=function(c){return a.stdev(c)/a.mean(c)},a.quartiles=function(c){var e=c.length,f=c.slice().sort(d);return[f[b.round(e/4)-1],f[b.round(e/2)-1],f[b.round(e*3/4)-1]]},a.quantiles=function(c,f,g,h){var i=c.slice().sort(d),j=[f.length],k=c.length,l,m,n,o,p,q;typeof g=="undefined"&&(g=3/8),typeof h=="undefined"&&(h=3/8);for(l=0;l<f.length;l++)m=f[l],n=g+m*(1-g-h),o=k*m+n,p=b.floor(e(o,1,k-1)),q=e(o-p,0,1),j[l]=(1-q)*i[p-1]+q*i[p];return j},a.percentileOfScore=function(b,c,d){var e=0,f=b.length,g=!1,h,i;d==="strict"&&(g=!0);for(i=0;i<f;i++)h=b[i],(g&&h<c||!g&&h<=c)&&e++;return e/f},a.covariance=function(c,d){var e=a.mean(c),f=a.mean(d),g=c.length,h=new Array(g),i;for(i=0;i<g;i++)h[i]=(c[i]-e)*(d[i]-f);return a.sum(h)/(g-1)},a.corrcoeff=function(c,d){return a.covariance(c,d)/a.stdev(c,1)/a.stdev(d,1)};var f=a.prototype;f.cumsum=function(b,d){var e=[],g=0,h=this;c(b)&&(d=b,b=!1);if(d)return setTimeout(function(){d.call(h,f.cumsum.call(h,b))}),this;if(this.length>1){h=b===!0?this:this.transpose();for(;g<h.length;g++)e[g]=a.cumsum(h[g]);return e}return a.cumsum(this[0],b)},function(b){for(var d=0;d<b.length;d++)(function(b){f[b]=function(d,e){var g=[],h=0,i=this;c(d)&&(e=d,d=!1);if(e)return setTimeout(function(){e.call(i,f[b].call(i,d))}),this;if(this.length>1){i=d===!0?this:this.transpose();for(;h<i.length;h++)g[h]=a[b](i[h]);return d===!0?a[b](a.utils.toVector(g)):g}return a[b](this[0],d)}})(b[d])}("sum sumsqrd sumsqerr product min max mean meansqerr geomean median diff mode range variance stdev meandev meddev coeffvar quartiles".split(" ")),function(b){for(var d=0;d<b.length;d++)(function(b){f[b]=function(){var d=[],e=0,g=this,h=Array.prototype.slice.call(arguments);if(c(h[h.length-1])){var i=h[h.length-1],j=h.slice(0,h.length-1);return setTimeout(function(){i.call(g,f[b].apply(g,j))}),this}var i=undefined,k=function(d){return a[b].apply(g,[d].concat(h))};if(this.length>1){g=g.transpose();for(;e<g.length;e++)d[e]=k(g[e]);return d}return k(this[0])}})(b[d])}("quantiles percentileOfScore".split(" "))}(this.jStat,Math),function(a,b){a.gammaln=function(c){var d=0,e=[76.18009172947146,-86.50532032941678,24.01409824083091,-1.231739572450155,.001208650973866179,-0.000005395239384953],f=1.000000000190015,g,h,i;i=(h=g=c)+5.5,i-=(g+.5)*b.log(i);for(;d<6;d++)f+=e[d]/++h;return b.log(2.5066282746310007*f/g)-i},a.gammafn=function(c){var d=[-1.716185138865495,24.76565080557592,-379.80425647094563,629.3311553128184,866.9662027904133,-31451.272968848367,-36144.413418691176,66456.14382024054],e=[-30.8402300119739,315.35062697960416,-1015.1563674902192,-3107.771671572311,22538.11842098015,4755.846277527881,-134659.9598649693,-115132.2596755535],f=!1,g=0,h=0,i=0,j=c,k,l,m,n,o,p;if(j<=0){n=j%1+3.6e-16;if(n)f=(j&1?-1:1)*b.PI/b.sin(b.PI*n),j=1-j;else return Infinity}m=j,j<1?l=j++:l=(j-=g=(j|0)-1)-1;for(k=0;k<8;++k)i=(i+d[k])*l,h=h*l+e[k];n=i/h+1;if(m<j)n/=m;else if(m>j)for(k=0;k<g;++k)n*=j,j++;return f&&(n=f/n),n},a.gammap=function(d,e){var f=a.gammaln(d),g=d,h=1/d,i=h,j=e+1-d,k=1/1e-30,l=1/j,m=l,n=1,o=-~(b.log(d>=1?d:1/d)*8.5+d*.4+17),p,q;if(e<0||d<=0)return NaN;if(e<d+1){for(;n<=o;n++)h+=i*=e/++g;return h*b.exp(-e+d*b.log(e)-f)}for(;n<=o;n++)p=-n*(n-d),j+=2,l=p*l+j,k=j+p/k,l=1/l,m*=l*k;return 1-m*b.exp(-e+d*b.log(e)-f)},a.factorialln=function(c){return c<0?NaN:a.gammaln(c+1)},a.factorial=function(c){return c<0?NaN:a.gammafn(c+1)},a.combination=function(d,e){return d>170||e>170?b.exp(a.combinationln(d,e)):a.factorial(d)/a.factorial(e)/a.factorial(d-e)},a.combinationln=function(c,d){return a.factorialln(c)-a.factorialln(d)-a.factorialln(c-d)},a.permutation=function(c,d){return a.factorial(c)/a.factorial(c-d)},a.betafn=function(d,e){return d<=0||e<=0?undefined:d+e>170?b.exp(a.betaln(d,e)):a.gammafn(d)*a.gammafn(e)/a.gammafn(d+e)},a.betaln=function(c,d){return a.gammaln(c)+a.gammaln(d)-a.gammaln(c+d)},a.betacf=function(c,d,e){var f=1e-30,g=1,h=d+e,i=d+1,j=d-1,k=1,l=1-h*c/i,m,n,o,p;b.abs(l)<f&&(l=f),l=1/l,p=l;for(;g<=100;g++){m=2*g,n=g*(e-g)*c/((j+m)*(d+m)),l=1+n*l,b.abs(l)<f&&(l=f),k=1+n/k,b.abs(k)<f&&(k=f),l=1/l,p*=l*k,n=-(d+g)*(h+g)*c/((d+m)*(i+m)),l=1+n*l,b.abs(l)<f&&(l=f),k=1+n/k,b.abs(k)<f&&(k=f),l=1/l,o=l*k,p*=o;if(b.abs(o-1)<3e-7)break}return p},a.gammapinv=function(d,e){var f=0,g=e-1,h=1e-8,i=a.gammaln(e),j,k,l,m,n,o,p;if(d>=1)return b.max(100,e+100*b.sqrt(e));if(d<=0)return 0;e>1?(o=b.log(g),p=b.exp(g*(o-1)-i),n=d<.5?d:1-d,l=b.sqrt(-2*b.log(n)),j=(2.30753+l*.27061)/(1+l*(.99229+l*.04481))-l,d<.5&&(j=-j),j=b.max(.001,e*b.pow(1-1/(9*e)-j/(3*b.sqrt(e)),3))):(l=1-e*(.253+e*.12),d<l?j=b.pow(d/l,1/e):j=1-b.log(1-(d-l)/(1-l)));for(;f<12;f++){if(j<=0)return 0;k=a.gammap(e,j)-d,e>1?l=p*b.exp(-(j-g)+g*(b.log(j)-o)):l=b.exp(-j+g*b.log(j)-i),m=k/l,j-=l=m/(1-.5*b.min(1,m*((e-1)/j-1))),j<=0&&(j=.5*(j+l));if(b.abs(l)<h*j)break}return j},a.erf=function(c){var d=[-1.3026537197817094,.6419697923564902,.019476473204185836,-0.00956151478680863,-0.000946595344482036,.000366839497852761,42523324806907e-18,-0.000020278578112534,-0.000001624290004647,130365583558e-17,1.5626441722e-8,-8.5238095915e-8,6.529054439e-9,5.059343495e-9,-9.91364156e-10,-2.27365122e-10,9.6467911e-11,2.394038e-12,-6.886027e-12,8.94487e-13,3.13092e-13,-1.12708e-13,3.81e-16,7.106e-15,-1.523e-15,-9.4e-17,1.21e-16,-2.8e-17],e=d.length-1,f=!1,g=0,h=0,i,j,k,l;c<0&&(c=-c,f=!0),i=2/(2+c),j=4*i-2;for(;e>0;e--)k=g,g=j*g-h+d[e],h=k;return l=i*b.exp(-c*c+.5*(d[0]+j*g)-h),f?l-1:1-l},a.erfc=function(c){return 1-a.erf(c)},a.erfcinv=function(d){var e=0,f,g,h,i;if(d>=2)return-100;if(d<=0)return 100;i=d<1?d:2-d,h=b.sqrt(-2*b.log(i/2)),f=-0.70711*((2.30753+h*.27061)/(1+h*(.99229+h*.04481))-h);for(;e<2;e++)g=a.erfc(f)-i,f+=g/(1.1283791670955126*b.exp(-f*f)-f*g);return d<1?f:-f},a.ibetainv=function(d,e,f){var g=1e-8,h=e-1,i=f-1,j=0,k,l,m,n,o,p,q,r,s,t,u;if(d<=0)return 0;if(d>=1)return 1;e>=1&&f>=1?(m=d<.5?d:1-d,n=b.sqrt(-2*b.log(m)),q=(2.30753+n*.27061)/(1+n*(.99229+n*.04481))-n,d<.5&&(q=-q),r=(q*q-3)/6,s=2/(1/(2*e-1)+1/(2*f-1)),t=q*b.sqrt(r+s)/s-(1/(2*f-1)-1/(2*e-1))*(r+5/6-2/(3*s)),q=e/(e+f*b.exp(2*t))):(k=b.log(e/(e+f)),l=b.log(f/(e+f)),n=b.exp(e*k)/e,o=b.exp(f*l)/f,t=n+o,d<n/t?q=b.pow(e*t*d,1/e):q=1-b.pow(f*t*(1-d),1/f)),u=-a.gammaln(e)-a.gammaln(f)+a.gammaln(e+f);for(;j<10;j++){if(q===0||q===1)return q;p=a.ibeta(q,e,f)-d,n=b.exp(h*b.log(q)+i*b.log(1-q)+u),o=p/n,q-=n=o/(1-.5*b.min(1,o*(h/q-i/(1-q)))),q<=0&&(q=.5*(q+n)),q>=1&&(q=.5*(q+n+1));if(b.abs(n)<g*q&&j>0)break}return q},a.ibeta=function(d,e,f){var g=d===0||d===1?0:b.exp(a.gammaln(e+f)-a.gammaln(e)-a.gammaln(f)+e*b.log(d)+f*b.log(1-d));return d<0||d>1?!1:d<(e+1)/(e+f+2)?g*a.betacf(d,e,f)/e:1-g*a.betacf(1-d,f,e)/f},a.randn=function(d,e){var f,g,h,i,j,k;e||(e=d);if(d)return a.create(d,e,function(){return a.randn()});do f=b.random(),g=1.7156*(b.random()-.5),h=f-.449871,i=b.abs(g)+.386595,j=h*h+i*(.196*i-.25472*h);while(j>.27597&&(j>.27846||g*g>-4*b.log(f)*f*f));return g/f},a.randg=function(d,e,f){var g=d,h,i,j,k,l,m;f||(f=e),d||(d=1);if(e)return m=a.zeros(e,f),m.alter(function(){return a.randg(d)}),m;d<1&&(d+=1),h=d-1/3,i=1/b.sqrt(9*h);do{do l=a.randn(),k=1+i*l;while(k<=0);k=k*k*k,j=b.random()}while(j>1-.331*b.pow(l,4)&&b.log(j)>.5*l*l+h*(1-k+b.log(k)));if(d==g)return h*k;do j=b.random();while(j===0);return b.pow(j,1/g)*h*k},function(b){for(var c=0;c<b.length;c++)(function(b){a.fn[b]=function(){return a(a.map(this,function(c){return a[b](c)}))}})(b[c])}("gammaln gammafn factorial factorialln".split(" ")),function(b){for(var c=0;c<b.length;c++)(function(b){a.fn[b]=function(){return a(a[b].apply(null,arguments))}})(b[c])}("randn".split(" "))}(this.jStat,Math),function(a,b){(function(b){for(var c=0;c<b.length;c++)(function(b){a[b]=function(a,b,c){return this instanceof arguments.callee?(this._a=a,this._b=b,this._c=c,this):new arguments.callee(a,b,c)},a.fn[b]=function(c,d,e){var f=a[b](c,d,e);return f.data=this,f},a[b].prototype.sample=function(c){var d=this._a,e=this._b,f=this._c;return c?a.alter(c,function(){return a[b].sample(d,e,f)}):a[b].sample(d,e,f)},function(c){for(var d=0;d<c.length;d++)(function(c){a[b].prototype[c]=function(d){var e=this._a,f=this._b,g=this._c;return d||(d=this.data),typeof d!="number"?a.fn.map.call(d,function(d){return a[b][c](d,e,f,g)}):a[b][c](d,e,f,g)}})(c[d])}("pdf cdf inv".split(" ")),function(c){for(var d=0;d<c.length;d++)(function(c){a[b].prototype[c]=function(){return a[b][c](this._a,this._b,this._c)}})(c[d])}("mean median mode variance".split(" "))})(b[c])})("beta centralF cauchy chisquare exponential gamma invgamma kumaraswamy lognormal normal pareto studentt weibull uniform  binomial negbin hypgeom poisson triangular".split(" ")),a.extend(a.beta,{pdf:function(c,d,e){return c>1||c<0?0:d==1&&e==1?1:b.exp((d-1)*b.log(c)+(e-1)*b.log(1-c)-a.betaln(d,e))},cdf:function(b,c,d){return b>1||b<0?(b>1)*1:a.ibeta(b,c,d)},inv:function(b,c,d){return a.ibetainv(b,c,d)},mean:function(a,b){return a/(a+b)},median:function(a,b){},mode:function(a,c){return a*c/(b.pow(a+c,2)*(a+c+1))},sample:function(b,c){var d=a.randg(b);return d/(d+a.randg(c))},variance:function(a,c){return a*c/(b.pow(a+c,2)*(a+c+1))}}),a.extend(a.centralF,{pdf:function(c,d,e){return c>=0?b.sqrt(b.pow(d*c,d)*b.pow(e,e)/b.pow(d*c+e,d+e))/(c*a.betafn(d/2,e/2)):undefined},cdf:function(b,c,d){return a.ibeta(c*b/(c*b+d),c/2,d/2)},inv:function(b,c,d){return d/(c*(1/a.ibetainv(b,c/2,d/2)-1))},mean:function(a,b){return b>2?b/(b-2):undefined},mode:function(a,b){return a>2?b*(a-2)/(a*(b+2)):undefined},sample:function(b,c){var d=a.randg(b/2)*2,e=a.randg(c/2)*2;return d/b/(e/c)},variance:function(a,b){return b>4?2*b*b*(a+b-2)/(a*(b-2)*(b-2)*(b-4)):undefined}}),a.extend(a.cauchy,{pdf:function(a,c,d){return d/(b.pow(a-c,2)+b.pow(d,2))/b.PI},cdf:function(a,c,d){return b.atan((a-c)/d)/b.PI+.5},inv:function(a,c,d){return c+d*b.tan(b.PI*(a-.5))},median:function(a,b){return a},mode:function(a,b){return a},sample:function(c,d){return a.randn()*b.sqrt(1/(2*a.randg(.5)))*d+c}}),a.extend(a.chisquare,{pdf:function(c,d){return b.exp((d/2-1)*b.log(c)-c/2-d/2*b.log(2)-a.gammaln(d/2))},cdf:function(b,c){return a.gammap(c/2,b/2)},inv:function(b,c){return 2*a.gammapinv(b,.5*c)},mean:function(a){return a},median:function(a){return a*b.pow(1-2/(9*a),3)},mode:function(a){return a-2>0?a-2:0},sample:function(b){return a.randg(b/2)*2},variance:function(a){return 2*a}}),a.extend(a.exponential,{pdf:function(a,c){return a<0?0:c*b.exp(-c*a)},cdf:function(a,c){return a<0?0:1-b.exp(-c*a)},inv:function(a,c){return-b.log(1-a)/c},mean:function(a){return 1/a},median:function(a){return 1/a*b.log(2)},mode:function(a){return 0},sample:function(a){return-1/a*b.log(b.random())},variance:function(a){return b.pow(a,-2)}}),a.extend(a.gamma,{pdf:function(c,d,e){return b.exp((d-1)*b.log(c)-c/e-a.gammaln(d)-d*b.log(e))},cdf:function(b,c,d){return a.gammap(c,b/d)},inv:function(b,c,d){return a.gammapinv(b,c)*d},mean:function(a,b){return a*b},mode:function(a,b){return a>1?(a-1)*b:undefined},sample:function(b,c){return a.randg(b)*c},variance:function(a,b){return a*b*b}}),a.extend(a.invgamma,{pdf:function(c,d,e){return b.exp(-(d+1)*b.log(c)-e/c-a.gammaln(d)+d*b.log(e))},cdf:function(b,c,d){return 1-a.gammap(c,d/b)},inv:function(b,c,d){return d/a.gammapinv(1-b,c)},mean:function(a,b){return a>1?b/(a-1):undefined},mode:function(a,b){return b/(a+1)},sample:function(b,c){return c/a.randg(b)},variance:function(a,b){return a>2?b*b/((a-1)*(a-1)*(a-2)):undefined}}),a.extend(a.kumaraswamy,{pdf:function(a,c,d){return b.exp(b.log(c)+b.log(d)+(c-1)*b.log(a)+(d-1)*b.log(1-b.pow(a,c)))},cdf:function(a,c,d){return 1-b.pow(1-b.pow(a,c),d)},mean:function(b,c){return c*a.gammafn(1+1/b)*a.gammafn(c)/a.gammafn(1+1/b+c)},median:function(a,c){return b.pow(1-b.pow(2,-1/c),1/a)},mode:function(a,c){return a>=1&&c>=1&&a!==1&&c!==1?b.pow((a-1)/(a*c-1),1/a):undefined},variance:function(a,b){}}),a.extend(a.lognormal,{pdf:function(a,c,d){return b.exp(-b.log(a)-.5*b.log(2*b.PI)-b.log(d)-b.pow(b.log(a)-c,2)/(2*d*d))},cdf:function(c,d,e){return.5+.5*a.erf((b.log(c)-d)/b.sqrt(2*e*e))},inv:function(c,d,e){return b.exp(-1.4142135623730951*e*a.erfcinv(2*c)+d)},mean:function(a,c){return b.exp(a+c*c/2)},median:function(a,c){return b.exp(a)},mode:function(a,c){return b.exp(a-c*c)},sample:function(c,d){return b.exp(a.randn()*d+c)},variance:function(a,c){return(b.exp(c*c)-1)*b.exp(2*a+c*c)}}),a.extend(a.normal,{pdf:function(a,c,d){return b.exp(-0.5*b.log(2*b.PI)-b.log(d)-b.pow(a-c,2)/(2*d*d))},cdf:function(c,d,e){return.5*(1+a.erf((c-d)/b.sqrt(2*e*e)))},inv:function(b,c,d){return-1.4142135623730951*d*a.erfcinv(2*b)+c},mean:function(a,b){return a},median:function(a,b){return a},mode:function(a,b){return a},sample:function(b,c){return a.randn()*c+b},variance:function(a,b){return b*b}}),a.extend(a.pareto,{pdf:function(a,c,d){return a>c?d*b.pow(c,d)/b.pow(a,d+1):undefined},cdf:function(a,c,d){return 1-b.pow(c/a,d)},mean:function(a,c){return c>1?c*b.pow(a,c)/(c-1):undefined},median:function(a,c){return a*c*b.SQRT2},mode:function(a,b){return a},variance:function(a,c){return c>2?a*a*c/(b.pow(c-1,2)*(c-2)):undefined}}),a.extend(a.studentt,{pdf:function(c,d){return a.gammafn((d+1)/2)/(b.sqrt(d*b.PI)*a.gammafn(d/2))*b.pow(1+c*c/d,-((d+1)/2))},cdf:function(c,d){var e=d/2;return a.ibeta((c+b.sqrt(c*c+d))/(2*b.sqrt(c*c+d)),e,e)},inv:function(c,d){var e=a.ibetainv(2*b.min(c,1-c),.5*d,.5);return e=b.sqrt(d*(1-e)/e),c>0?e:-e},mean:function(a){return a>1?0:undefined},median:function(a){return 0},mode:function(a){return 0},sample:function(c){return a.randn()*b.sqrt(c/(2*a.randg(c/2)))},variance:function(a){return a>2?a/(a-2):a>1?Infinity:undefined}}),a.extend(a.weibull,{pdf:function(a,c,d){return a<0?0:d/c*b.pow(a/c,d-1)*b.exp(-b.pow(a/c,d))},cdf:function(a,c,d){return a<0?0:1-b.exp(-b.pow(a/c,d))},inv:function(a,c,d){return c*b.pow(-b.log(1-a),1/d)},mean:function(b,c){return b*a.gammafn(1+1/c)},median:function(a,c){return a*b.pow(b.log(2),1/c)},mode:function(a,c){return c>1?a*b.pow((c-1)/c,1/c):undefined},sample:function(a,c){return a*b.pow(-b.log(b.random()),1/c)},variance:function(c,d){return c*c*a.gammafn(1+2/d)-b.pow(this.mean(c,d),2)}}),a.extend(a.uniform,{pdf:function(a,b,c){return a<b||a>c?0:1/(c-b)},cdf:function(a,b,c){return a<b?0:a<c?(a-b)/(c-b):1},mean:function(a,b){return.5*(a+b)},median:function(b,c){return a.mean(b,c)},mode:function(a,b){},sample:function(a,c){return a/2+c/2+(c/2-a/2)*(2*b.random()-1)},variance:function(a,c){return b.pow(c-a,2)/12}}),a.extend(a.binomial,{pdf:function(c,d,e){return e===0||e===1?d*e===c?1:0:a.combination(d,c)*b.pow(e,c)*b.pow(1-e,d-c)},cdf:function(b,c,d){var e=[],f=0;if(b<0)return 0;if(b<c){for(;f<=b;f++)e[f]=a.binomial.pdf(f,c,d);return a.sum(e)}return 1}}),a.extend(a.negbin,{pdf:function(c,d,e){return c!==c|0?!1:c<0?0:a.combination(c+d-1,c)*b.pow(1-e,d)*b.pow(e,c)},cdf:function(b,c,d){var e=0,f=0;if(b<0)return 0;for(;f<=b;f++)e+=a.negbin.pdf(f,c,d);return e}}),a.extend(a.hypgeom,{pdf:function(b,c,d,e){return b!==b|0?!1:b<0?0:a.combination(d,b)*a.combination(c-d,e-b)/a.combination(c,e)},cdf:function(b,c,d,e){var f=0,g=0;if(b<0)return 0;for(;g<=b;g++)f+=a.hypgeom.pdf(g,c,d,e);return f}}),a.extend(a.poisson,{pdf:function(c,d){return b.pow(d,c)*b.exp(-d)/a.factorial(c)},cdf:function(b,c){var d=[],e=0;if(b<0)return 0;for(;e<=b;e++)d.push(a.poisson.pdf(e,c));return a.sum(d)},mean:function(a){return a},variance:function(a){return a},sample:function(a){var c=1,d=0,e=b.exp(-a);do d++,c*=b.random();while(c>e);return d-1}}),a.extend(a.triangular,{pdf:function(a,b,c,d){return c<=b||d<b||d>c?undefined:a<b||a>c?0:a<=d?2*(a-b)/((c-b)*(d-b)):2*(c-a)/((c-b)*(c-d))},cdf:function(a,c,d,e){return d<=c||e<c||e>d?undefined:a<c?0:a<=e?b.pow(a-c,2)/((d-c)*(e-c)):1-b.pow(d-a,2)/((d-c)*(d-e))},mean:function(a,b,c){return(a+b+c)/3},median:function(a,c,d){if(d<=(a+c)/2)return c-b.sqrt((c-a)*(c-d))/b.sqrt(2);if(d>(a+c)/2)return a+b.sqrt((c-a)*(d-a))/b.sqrt(2)},mode:function(a,b,c){return c},sample:function(a,c,d){var e=b.random();return e<(d-a)/(c-a)?a+b.sqrt(e*(c-a)*(d-a)):c-b.sqrt((1-e)*(c-a)*(c-d))},variance:function(a,b,c){return(a*a+b*b+c*c-a*b-a*c-b*c)/18}})}(this.jStat,Math),function(a,b){var d=Array.prototype.push,e=a.utils.isArray;a.extend({add:function(b,c){return e(c)?(e(c[0])||(c=[c]),a.map(b,function(a,b,d){return a+c[b][d]})):a.map(b,function(a){return a+c})},subtract:function(b,c){return e(c)?(e(c[0])||(c=[c]),a.map(b,function(a,b,d){return a-c[b][d]||0})):a.map(b,function(a){return a-c})},divide:function(b,c){return e(c)?(e(c[0])||(c=[c]),a.multiply(b,a.inv(c))):a.map(b,function(a){return a/c})},multiply:function(b,c){var d,f,g,h,i=b.length,j=b[0].length,k=a.zeros(i,g=e(c)?c[0].length:j),l=0;if(e(c)){for(;l<g;l++)for(d=0;d<i;d++){h=0;for(f=0;f<j;f++)h+=b[d][f]*c[f][l];k[d][l]=h}return i===1&&l===1?k[0][0]:k}return a.map(b,function(a){return a*c})},dot:function(b,c){e(b[0])||(b=[b]),e(c[0])||(c=[c]);var d=b[0].length===1&&b.length!==1?a.transpose(b):b,f=c[0].length===1&&c.length!==1?a.transpose(c):c,g=[],h=0,i=d.length,j=d[0].length,k,l;for(;h<i;h++){g[h]=[],k=0;for(l=0;l<j;l++)k+=d[h][l]*f[h][l];g[h]=k}return g.length===1?g[0]:g},pow:function(c,d){return a.map(c,function(a){return b.pow(a,d)})},abs:function(c){return a.map(c,function(a){return b.abs(a)})},norm:function(a,c){var d=0,f=0;isNaN(c)&&(c=2),e(a[0])&&(a=a[0]);for(;f<a.length;f++)d+=b.pow(b.abs(a[f]),c);return b.pow(d,1/c)},angle:function(c,d){return b.acos(a.dot(c,d)/(a.norm(c)*a.norm(d)))},aug:function(a,b){var c=a.slice(),e=0;for(;e<c.length;e++)d.apply(c[e],b[e]);return c},inv:function(b){var c=b.length,d=b[0].length,e=a.identity(c,d),f=a.gauss_jordan(b,e),g=[],h=0,i;for(;h<c;h++){g[h]=[];for(i=d-1;i<f[0].length;i++)g[h][i-d]=f[h][i]}return g},det:function(a){var b=a.length,c=b*2,d=new Array(c),e=b-1,f=c-1,g=e-b+1,h=f,i=0,j=0,k;if(b===2)return a[0][0]*a[1][1]-a[0][1]*a[1][0];for(;i<c;i++)d[i]=1;for(i=0;i<b;i++){for(k=0;k<b;k++)d[g<0?g+b:g]*=a[i][k],d[h<b?h+b:h]*=a[i][k],g++,h--;g=--e-b+1,h=--f}for(i=0;i<b;i++)j+=d[i];for(;i<c;i++)j-=d[i];return j},gauss_elimination:function(c,d){var e=0,f=0,g=c.length,h=c[0].length,i=1,j=0,k=[],l,m,n,o;c=a.aug(c,d),l=c[0].length;for(;e<g;e++){m=c[e][e],f=e;for(o=e+1;o<h;o++)m<b.abs(c[o][e])&&(m=c[o][e],f=o);if(f!=e)for(o=0;o<l;o++)n=c[e][o],c[e][o]=c[f][o],c[f][o]=n;for(f=e+1;f<g;f++){i=c[f][e]/c[e][e];for(o=e;o<l;o++)c[f][o]=c[f][o]-i*c[e][o]}}for(e=g-1;e>=0;e--){j=0;for(f=e+1;f<=g-1;f++)j=k[f]*c[e][f];k[e]=(c[e][l-1]-j)/c[e][e]}return k},gauss_jordan:function(d,e){var f=a.aug(d,e),g=f.length,h=f[0].length;for(var i=0;i<g;i++){var j=i;for(var k=i+1;k<g;k++)b.abs(f[k][i])>b.abs(f[j][i])&&(j=k);var l=f[i];f[i]=f[j],f[j]=l;for(var k=i+1;k<g;k++){c=f[k][i]/f[i][i];for(var m=i;m<h;m++)f[k][m]-=f[i][m]*c}}for(var i=g-1;i>=0;i--){c=f[i][i];for(var k=0;k<i;k++)for(var m=h-1;m>i-1;m--)f[k][m]-=f[i][m]*f[k][i]/c;f[i][i]/=c;for(var m=g;m<h;m++)f[i][m]/=c}return f},lu:function(a,b){},cholesky:function(a,b){},gauss_jacobi:function(c,d,e,f){var g=0,h=0,i=c.length,j=[],k=[],l=[],m,n,o,p;for(;g<i;g++){j[g]=[],k[g]=[],l[g]=[];for(h=0;h<i;h++)g>h?(j[g][h]=c[g][h],k[g][h]=l[g][h]=0):g<h?(k[g][h]=c[g][h],j[g][h]=l[g][h]=0):(l[g][h]=c[g][h],j[g][h]=k[g][h]=0)}o=a.multiply(a.multiply(a.inv(l),a.add(j,k)),-1),n=a.multiply(a.inv(l),d),m=e,p=a.add(a.multiply(o,e),n),g=2;while(b.abs(a.norm(a.subtract(p,m)))>f)m=p,p=a.add(a.multiply(o,m),n),g++;return p},gauss_seidel:function(c,d,e,f){var g=0,h=c.length,i=[],j=[],k=[],l,m,n,o,p;for(;g<h;g++){i[g]=[],j[g]=[],k[g]=[];for(l=0;l<h;l++)g>l?(i[g][l]=c[g][l],j[g][l]=k[g][l]=0):g<l?(j[g][l]=c[g][l],i[g][l]=k[g][l]=0):(k[g][l]=c[g][l],i[g][l]=j[g][l]=0)}o=a.multiply(a.multiply(a.inv(a.add(k,i)),j),-1),n=a.multiply(a.inv(a.add(k,i)),d),m=e,p=a.add(a.multiply(o,e),n),g=2;while(b.abs(a.norm(a.subtract(p,m)))>f)m=p,p=a.add(a.multiply(o,m),n),g+=1;return p},SOR:function(c,d,e,f,g){var h=0,i=c.length,j=[],k=[],l=[],m,n,o,p,q;for(;h<i;h++){j[h]=[],k[h]=[],l[h]=[];for(m=0;m<i;m++)h>m?(j[h][m]=c[h][m],k[h][m]=l[h][m]=0):h<m?(k[h][m]=c[h][m],j[h][m]=l[h][m]=0):(l[h][m]=c[h][m],j[h][m]=k[h][m]=0)}p=a.multiply(a.inv(a.add(l,a.multiply(j,g))),a.subtract(a.multiply(l,1-g),a.multiply(k,g))),o=a.multiply(a.multiply(a.inv(a.add(l,a.multiply(j,g))),d),g),n=e,q=a.add(a.multiply(p,e),o),h=2;while(b.abs(a.norm(a.subtract(q,n)))>f)n=q,q=a.add(a.multiply(p,n),o),h++;return q},householder:function(c){var d=c.length,e=c[0].length,f=0,g=[],h=[],i,j,k,l,m;for(;f<d-1;f++){i=0;for(l=f+1;l<e;l++)i+=c[l][f]*c[l][f];m=c[f+1][f]>0?-1:1,i=m*b.sqrt(i),j=b.sqrt((i*i-c[f+1][f]*i)/2),g=a.zeros(d,1),g[f+1][0]=(c[f+1][f]-i)/(2*j);for(k=f+2;k<d;k++)g[k][0]=c[k][f]/(2*j);h=a.subtract(a.identity(d,e),a.multiply(a.multiply(g,a.transpose(g)),2)),c=a.multiply(h,a.multiply(c,h))}return c},QR:function(c,d){var e=c.length,f=c[0].length,g=0,h=[],i=[],j=[],k,l,m,n,o,p;for(;g<e-1;g++){l=0;for(k=g+1;k<f;k++)l+=c[k][g]*c[k][g];o=c[g+1][g]>0?-1:1,l=o*b.sqrt(l),m=b.sqrt((l*l-c[g+1][g]*l)/2),h=a.zeros(e,1),h[g+1][0]=(c[g+1][g]-l)/(2*m);for(n=g+2;n<e;n++)h[n][0]=c[n][g]/(2*m);i=a.subtract(a.identity(e,f),a.multiply(a.multiply(h,a.transpose(h)),2)),c=a.multiply(i,c),d=a.multiply(i,d)}for(g=e-1;g>=0;g--){p=0;for(k=g+1;k<=f-1;k++)p=j[k]*c[g][k];j[g]=d[g][0]/c[g][g]}return j},jacobi:function(c){var d=1,e=0,f=c.length,g=a.identity(f,f),h=[],i,j,k,l,m,n,o,p;while(d===1){e++,n=c[0][1],l=0,m=1;for(j=0;j<f;j++)for(k=0;k<f;k++)j!=k&&n<b.abs(c[j][k])&&(n=b.abs(c[j][k]),l=j,m=k);c[l][l]===c[m][m]?o=c[l][m]>0?b.PI/4:-b.PI/4:o=b.atan(2*c[l][m]/(c[l][l]-c[m][m]))/2,p=a.identity(f,f),p[l][l]=b.cos(o),p[l][m]=-b.sin(o),p[m][l]=b.sin(o),p[m][m]=b.cos(o),g=a.multiply(g,p),i=a.multiply(a.multiply(a.inv(p),c),p),c=i,d=0;for(j=1;j<f;j++)for(k=1;k<f;k++)j!=k&&b.abs(c[j][k])>.001&&(d=1)}for(j=0;j<f;j++)h.push(c[j][j]);return[g,h]},rungekutta:function(a,b,c,d,e,f){var g,h,i,j,k;if(f===2)while(d<=c)g=b*a(d,e),h=b*a(d+b,e+g),i=e+(g+h)/2,e=i,d+=b;if(f===4)while(d<=c)g=b*a(d,e),h=b*a(d+b/2,e+g/2),j=b*a(d+b/2,e+h/2),k=b*a(d+b,e+j),i=e+(g+2*h+2*j+k)/6,e=i,d+=b;return e},romberg:function(a,c,d,e){var f=0,g=(d-c)/2,h=[],i=[],j=[],k,l,m,n,o,p;while(f<e/2){o=a(c);for(m=c,n=0;m<=d;m+=g,n++)h[n]=m;k=h.length;for(m=1;m<k-1;m++)o+=(m%2!==0?4:2)*a(h[m]);o=g/3*(o+a(d)),j[f]=o,g/=2,f++}l=j.length,k=1;while(l!==1){for(m=0;m<l-1;m++)i[m]=(b.pow(4,k)*j[m+1]-j[m])/(b.pow(4,k)-1);l=i.length,j=i,i=[],k++}return j},richardson:function(a,c,d,e){function f(a,b){var c=0,d=a.length,e;for(;c<d;c++)a[c]===b&&(e=c);return e}var g=a.length,h=b.abs(d-a[f(a,d)+1]),i=0,j=[],k=[],l,m,n,o,p;while(e>=h)l=f(a,d+e),m=f(a,d),j[i]=(c[l]-2*c[m]+c[2*m-l])/(e*e),e/=2,i++;o=j.length,n=1;while(o!=1){for(p=0;p<o-1;p++)k[p]=(b.pow(4,n)*j[p+1]-j[p])/(b.pow(4,n)-1);o=k.length,j=k,k=[],n++}return j},simpson:function(a,b,c,d){var e=(c-b)/d,f=a(b),g=[],h=b,i=0,j=1,k;for(;h<=c;h+=e,i++)g[i]=h;k=g.length;for(;j<k-1;j++)f+=(j%2!==0?4:2)*a(g[j]);return e/3*(f+a(c))},hermite:function(a,b,c,d){var e=a.length,f=0,g=0,h=[],i=[],j=[],k=[],l;for(;g<e;g++){h[g]=1;for(l=0;l<e;l++)g!=l&&(h[g]*=(d-a[l])/(a[g]-a[l]));i[g]=0;for(l=0;l<e;l++)g!=l&&(i[g]+=1/(a[g]-a[l]));j[g]=(1-2*(d-a[g])*i[g])*h[g]*h[g],k[g]=(d-a[g])*h[g]*h[g],f+=j[g]*b[g]+k[g]*c[g]}return f},lagrange:function(a,b,c){var d=0,e=0,f,g,h=a.length;for(;e<h;e++){g=b[e];for(f=0;f<h;f++)e!=f&&(g*=(c-a[f])/(a[e]-a[f]));d+=g}return d},cubic_spline:function(b,c,d){var e=b.length,f=0,g,h=[],i=[],j=[],k=[],l=[],m=[],n=[];for(;f<e-1;f++)l[f]=b[f+1]-b[f];j[0]=0;for(f=1;f<e-1;f++)j[f]=3/l[f]*(c[f+1]-c[f])-3/l[f-1]*(c[f]-c[f-1]);for(f=1;f<e-1;f++)h[f]=[],i[f]=[],h[f][f-1]=l[f-1],h[f][f]=2*(l[f-1]+l[f]),h[f][f+1]=l[f],i[f][0]=j[f];k=a.multiply(a.inv(h),i);for(g=0;g<e-1;g++)m[g]=(c[g+1]-c[g])/l[g]-l[g]*(k[g+1][0]+2*k[g][0])/3,n[g]=(k[g+1][0]-k[g][0])/(3*l[g]);for(g=0;g<e;g++)if(b[g]>d)break;return g-=1,c[g]+(d-b[g])*m[g]+a.sq(d-b[g])*k[g]+(d-b[g])*a.sq(d-b[g])*n[g]},gauss_quadrature:function(){},PCA:function(b){var c=b.length,d=b[0].length,e=!1,f=0,g,h,i=[],j=[],k=[],l=[],m=[],n=[],o=[],p=[],q=[],r=[];for(f=0;f<c;f++)i[f]=a.sum(b[f])/d;for(f=0;f<d;f++){o[f]=[];for(g=0;g<c;g++)o[f][g]=b[g][f]-i[g]}o=a.transpose(o);for(f=0;f<c;f++){p[f]=[];for(g=0;g<c;g++)p[f][g]=a.dot([o[f]],[o[g]])/(d-1)}k=a.jacobi(p),q=k[0],j=k[1],r=a.transpose(q);for(f=0;f<j.length;f++)for(g=f;g<j.length;g++)j[f]<j[g]&&(h=j[f],j[f]=j[g],j[g]=h,l=r[f],r[f]=r[g],r[g]=l);n=a.transpose(o);for(f=0;f<c;f++){m[f]=[];for(g=0;g<n.length;g++)m[f][g]=a.dot([r[f]],[n[g]])}return[b,j,r,m]}}),function(b){for(var c=0;c<b.length;c++)(function(b){a.fn[b]=function(c,d){var e=this;return d?(setTimeout(function(){d.call(e,a.fn[b].call(e,c))},15),this):a(a[b](this,c))}})(b[c])}("add divide multiply subtract dot pow abs norm angle".split(" "))}(this.jStat,Math),function(a,b){var c=[].slice,d=a.utils.isNumber;a.extend({zscore:function(){var b=c.call(arguments);return d(b[1])?(b[0]-b[1])/b[2]:(b[0]-a.mean(b[1]))/a.stdev(b[1],b[2])},ztest:function(){var e=c.call(arguments);if(e.length===4){if(d(e[1])){var f=a.zscore(e[0],e[1],e[2]);return e[3]===1?a.normal.cdf(-b.abs(f),0,1):a.normal.cdf(-b.abs(f),0,1)*2}var f=e[0];return e[2]===1?a.normal.cdf(-b.abs(f),0,1):a.normal.cdf(-b.abs(f),0,1)*2}var f=a.zscore(e[0],e[1],e[3]);return e[1]===1?a.normal.cdf(-b.abs(f),0,1):a.normal.cdf(-b.abs(f),0,1)*2}}),a.extend(a.fn,{zscore:function(a,b){return(a-this.mean())/this.stdev(b)},ztest:function(c,d,e){var f=b.abs(this.zscore(c,e));return d===1?a.normal.cdf(-f,0,1):a.normal.cdf(-f,0,1)*2}}),a.extend({tscore:function(){var d=c.call(arguments);return d.length===4?(d[0]-d[1])/(d[2]/b.sqrt(d[3])):(d[0]-a.mean(d[1]))/(a.stdev(d[1],!0)/b.sqrt(d[1].length))},ttest:function(){var e=c.call(arguments),f;return e.length===5?(f=b.abs(a.tscore(e[0],e[1],e[2],e[3])),e[4]===1?a.studentt.cdf(-f,e[3]-1):a.studentt.cdf(-f,e[3]-1)*2):d(e[1])?(f=b.abs(e[0]),e[2]==1?a.studentt.cdf(-f,e[1]-1):a.studentt.cdf(-f,e[1]-1)*2):(f=b.abs(a.tscore(e[0],e[1])),e[2]==1?a.studentt.cdf(-f,e[1].length-1):a.studentt.cdf(-f,e[1].length-1)*2)}}),a.extend(a.fn,{tscore:function(a){return(a-this.mean())/(this.stdev(!0)/b.sqrt(this.cols()))},ttest:function(c,d){return d===1?1-a.studentt.cdf(b.abs(this.tscore(c)),this.cols()-1):a.studentt.cdf(-b.abs(this.tscore(c)),this.cols()-1)*2}}),a.extend({anovafscore:function(){var d=c.call(arguments),e,f,g,h,i,j,k,l;if(d.length===1){i=new Array(d[0].length);for(k=0;k<d[0].length;k++)i[k]=d[0][k];d=i}if(d.length===2)return a.variance(d[0])/a.variance(d[1]);f=new Array;for(k=0;k<d.length;k++)f=f.concat(d[k]);g=a.mean(f),e=0;for(k=0;k<d.length;k++)e+=d[k].length*b.pow(a.mean(d[k])-g,2);e/=d.length-1,j=0;for(k=0;k<d.length;k++){h=a.mean(d[k]);for(l=0;l<d[k].length;l++)j+=b.pow(d[k][l]-h,2)}return j/=f.length-d.length,e/j},anovaftest:function(){var b=c.call(arguments),e,f,g,h;if(d(b[0]))return 1-a.centralF.cdf(b[0],b[1],b[2]);anovafscore=a.anovafscore(b),e=b.length-1,g=0;for(h=0;h<b.length;h++)g+=b[h].length;return f=g-e-1,1-a.centralF.cdf(anovafscore,e,f)},ftest:function(b,c,d){return 1-a.centralF.cdf(b,c,d)}}),a.extend(a.fn,{anovafscore:function(){return a.anovafscore(this.toArray())},anovaftest:function(){var b=0,c;for(c=0;c<this.length;c++)b+=this[c].length;return a.ftest(this.anovafscore(),this.length-1,b-this.length)}}),a.extend({normalci:function(){var d=c.call(arguments),e=new Array(2),f;return d.length===4?f=b.abs(a.normal.inv(d[1]/2,0,1)*d[2]/b.sqrt(d[3])):f=b.abs(a.normal.inv(d[1]/2,0,1)*a.stdev(d[2])/b.sqrt(d[2].length)),e[0]=d[0]-f,e[1]=d[0]+f,e},tci:function(){var d=c.call(arguments),e=new Array(2),f;return d.length===4?f=b.abs(a.studentt.inv(d[1]/2,d[3]-1
	)*d[2]/b.sqrt(d[3])):f=b.abs(a.studentt.inv(d[1]/2,d[2].length)*a.stdev(d[2],!0)/b.sqrt(d[2].length)),e[0]=d[0]-f,e[1]=d[0]+f,e},significant:function(a,b){return a<b}}),a.extend(a.fn,{normalci:function(b,c){return a.normalci(b,c,this.toArray())},tci:function(b,c){return a.tci(b,c,this.toArray())}})}(this.jStat,Math);


	includeWeb('Table JavaScript Utility Functions');

	// This function copies the specified statistic from a number of summary tables in table_array into the rows
	// or columns of a new array (just containing the statistic) and returns it.
	var copyStatisticsFromSummaryTablesIntoMultipleRowsOrColumns = function(by_rows, statistic_name, table_array) {
		if (by_rows) {
			var new_stats = [];
		    var num_tables = table_array.length;
		    var num_cols = table_array[0].get(statistic_name).length;
		    for (var row = 0; row < num_tables; row++) {
		        var current_stats = table_array[row].get(statistic_name);
		        new_stats.push([]); // Blank array for each new row
		        for (var col = 0; col < num_cols; col++)
		            new_stats[row].push(current_stats[col][0]); // copy the statistic from the row of the summary to the appropriate column in the crosstab.
		    }
		    return new_stats;
        } else {
            var new_stats = table_array[0].get(statistic_name);
            var num_tables = table_array.length;
            var num_rows = new_stats.length;
            for (var j = 1; j < num_tables; j++) {
                var current_stats = table_array[j].get(statistic_name);
                for (var k = 0; k < num_rows; k++)
                    new_stats[k].push(current_stats[k][0]);
            }
            return new_stats;            
		}
	}

	// Replace all statistic values in the named statistic with NaN
	var setStatisticToNaN = function(statistic_name) {
		var nan_stat = table.get(statistic_name);
		var num_rows = table.numberRows;
		var num_cols = table.numberColumns;
		var nan_value;
		if (statistic_name == "Column Comparisons" || statistic_name == "Columns Compared" || statistic_name == "Column Names")
			nan_value = "";
		else
			nan_value = NaN;
		for (var row = 0; row < num_rows; row++)
			for (var col = 0; col < num_cols; col++)
				nan_stat[row][col] = nan_value;
		table.set(statistic_name, nan_stat);
	}

	// Returns the p-value described at: http://wiki.q-researchsoftware.com/wiki/Independent_Complex_Samples_t-Test_-_Comparing_Two_Means
	var independentComplexSamplesTTestForMeans = function(mean_1, mean_2, standard_error_1, standard_error_2, sample_size_1, sample_size_2, use_bessel_correction) {
		// Re-used calculations
		var standard_error_1_squared = Math.pow(standard_error_1, 2);
		var standard_error_2_squared = Math.pow(standard_error_2, 2);
		
		// Adjustment for Bessel correction
		var b;
		if (use_bessel_correction)
			b = 1;
		else
			b = 0;

		// Degrees-of-freedom parameter
		var D1 = Math.pow(standard_error_1_squared, 2) / (sample_size_1 - b);
		var D2 = Math.pow(standard_error_2_squared, 2) / (sample_size_2 - b);
		var df = Math.pow(standard_error_1_squared + standard_error_2_squared, 2) / (D1 + D2);
		var denominator = Math.pow(standard_error_1_squared + standard_error_2_squared, 0.5);

		// Calculate t-statistic
		var t;
		if (denominator == 0)
			t = 0; // when the denominator of the t formula is zero then t should be zero
		else
			t = (mean_1 - mean_2) / denominator;

		// Calculate the p-value
	    var p_value = 2 * (1 - jStat.studentt.cdf(Math.abs(t), df));
		return p_value;
	}

	// Returns the p-value described at: http://wiki.q-researchsoftware.com/wiki/Independent_Complex_Samples_Z-Test_-_Comparing_Two_Proportions
	var independentComplexSamplesZTestForProportions = function(proportion_1, proportion_2, standard_error_1, standard_error_2) {
		// Calculate the z-statistic
		var denominator = Math.pow((Math.pow(standard_error_1, 2) + Math.pow(standard_error_2, 2)), 0.5);
		var z;
		if (denominator == 0)
			z = 0; // When the denominator of the z formula is zero then z should be zero
		else
			z = (proportion_1 - proportion_2)/denominator;
		// Calculate the p-value
		var p_value = 2 * (1 - jStat.normal.cdf(Math.abs(z), 0, 1));
		return p_value;
	}

	// Conduct an Independent Complex Samples t-Test for Means using the mean for the current cell and the mean from the cell in the previous column for all cells in the table
	var applyIndependentComplexSamplesTTestForMeansForComparingToPreviousColumn = function(means, standard_errors, sample_sizes, p_cutoff, use_bessel_correction, high_symbol, low_symbol, cell_text) {
		var sig_results = cell_text;
		var num_rows = means.length;
		var num_cols = means[0].length;
		for (var row = 0; row < num_rows; row++) {
			var row_means = means[row];
			var row_standard_errors = standard_errors[row];
			var row_sample_sizes = sample_sizes[row];
			for (var col = 1; col < num_cols; col++) {
				var p_value = independentComplexSamplesTTestForMeans(row_means[col-1], row_means[col], row_standard_errors[col-1], row_standard_errors[col], row_sample_sizes[col-1], row_sample_sizes[col], use_bessel_correction);
				if (p_value <= p_cutoff) {
					if (row_means[col] > row_means[col-1])
						sig_results[row][col] = [high_symbol];
					else
						sig_results[row][col] = [low_symbol];
				}
			}
		}
		return sig_results;
	}

	// Conduct an Indpendent Complex Samples Z Test for the % shown in the current cell and the % from the cell in the previous column for all cells in the table
	var applyindependentComplexSamplesZTestForProportionsForComparingToPreviousColumn = function(proportions, standard_errors, p_cutoff, high_symbol, low_symbol, cell_text) {
		var sig_results = cell_text;
		var num_rows = proportions.length;
		var num_cols = proportions[0].length;
		for (var row = 0; row < num_rows; row++) {
			var row_proportions = proportions[row];
			var row_standard_errors = standard_errors[row];
			for (var col = 1; col < num_cols; col++) {
				var p_value = independentComplexSamplesZTestForProportions(row_proportions[col-1] / 100, row_proportions[col] / 100, row_standard_errors[col-1], row_standard_errors[col]);
				if (p_value <= p_cutoff) {
					if (row_proportions[col] > row_proportions[col-1])
						sig_results[row][col] = [high_symbol];
					else
						sig_results[row][col] = [low_symbol];
				}
			}
		}
		return sig_results;
	}

	// Q.transpose became available in Q 4.8.3.  Fill-in for older Q versions.
    if (typeof(Q) == "undefined")
        Q = {};
	if (!Q.transpose) { 
		// Transpose a two-dimensional array
		Q.transpose = function(array) {
			var new_array = [];
			var num_rows = array.length;
			if (num_rows != 0) {
				var num_cols = array[0].length;
				for (var j = 0; j < num_cols; j++) {
					var new_row = [];
					for (var k = 0; k < num_rows; k++)
						new_row.push(array[k][j]);
					new_array.push(new_row);
				}
			}
			return new_array;
		};
	}
	if (!Q.matrix) {
		// Returns a new array with the value repeated.
        // If you want a 1D array, only supply one length.
        // If you want a 2D array, supply both lengths.
        Q.matrix = function (value, num_rows, num_cols) {
            var rows_array = [];
            if (arguments.length > 2) {
                for (var row = 0; row < num_rows; row++) {
                    var col_array = [];
                    for (var col = 0; col < num_cols; col++)
                        col_array[col] = value;
                    rows_array[row] = col_array;
                }
            } else {
                for (var row = 0; row < num_rows; row++)
                    rows_array[row] = value;
            }
            return rows_array;
        };
	}

	var num_weights = weight_names.length;
	var is_numeric = table.availableStatistics[0] == "Average";
	var is_categorical = table.availableStatistics[0] == "Column %";

	// Blank out stats that aren't used or don't make sense by assigning a value of NaN
	var available_stats = table.availableStatistics;
	var stats_to_remove = ["p", "t-Statistic", "z-Statistic", "Column Comparisons", "Column Names", "Columns Compared"];
	stats_to_remove.forEach(function(stat) {
		if (available_stats.indexOf(stat) > -1)
			setStatisticToNaN(stat);
	});

	// Prevent the user from displaying statistics that don't make sense on this table
	var stats_to_prevent = stats_to_remove.concat(["Index", "Total %", "% Row Responses", 
													"% Column Responses", "% Total Responses", ,
													"Not Duplicate", "Base Population", "Corrected p", "Multiple Comparison Adjustment",
													"Effective Base n", "Base n"]);
	if (for_plot)
		stats_to_prevent.push("Column %", "Column n", "Column Population");
	else
		stats_to_prevent.push("Row %", "Row n", "Row Population");

	if (is_categorical)
		stats_to_prevent.push("Standard Error"); // Don't show Standard error for categorical data as the 'Column Standard Error' is used instead
	
	table.statistics.forEach(function (stat) {
		if (stats_to_prevent.indexOf(stat) > -1) {
			if (for_plot) {
				table.suppressOutput("It is not appropriate to show the " + stat + " on this constructed plot. Click Undo and remove it from the Statistics menu.");
				return;
			}
			else {
				table.suppressOutput("It is not appropriate to show the " + stat + " on this constructed table. Remove it from the Statistics - Cells menu.");
				return;
			}
		}
	});

	if (belowTableExists())
		if (below_table.statistics.length > 0) {
			table.suppressOutput("Statistics - Below are not available for this constructed table. Remove any selections from the Statistics - Below menu.");
			return;
		}

	if (rightTableExists())
		if (right_table.statistics.length > 0) {
			table.suppressOutput("Statistics - Right are not available for this constructed table. Remove any selections from the Statistics - Right menu.");
			return;
		}

    if (for_plot && table.numberRows != num_weights) {
        table.suppressOutput("The number of weights does not match the number of columns in this plot.");
        return;
    }
	else if (!for_plot && table.numberColumns != num_weights) {
		table.suppressOutput("The number of weights does not match the number of columns in the table.");
		return;
	}
	else if (!is_categorical && !is_numeric) {
		if (for_plot) {
			table.suppressOutput("Plot does not have appropriate statistics. Select a Pick One, Pick Any, Number, or Number - Multi question in the brown drop-down.");
			return;
		}
		else {
			table.suppressOutput("Table does not have appropriate statistics. Select a Pick One, Pick Any, Number, or Number - Multi question in the blue drop-down.");
			return;
		}
	} else {
		// Determine which question to use in the summary tables

		var question_in_summary;
        if (for_plot)
            question_in_summary = table.brown;
        else
            question_in_summary = table.blue;

		// Get the table dimensions
		var num_rows = table.numberRows;
		var num_cols = table.numberColumns;

		// Generate an array of table objects for the different weights
		var new_tables = [];
		for (var j = 0; j < num_weights; j++)
			new_tables.push(calculateTable(question_in_summary, "SUMMARY", ["!UseQFilters"], weight_names[j]));

	    // Copy Stats from individual tables
	    // The first statistic is the statistic to copy from the SUMMARY table, and the second is the 
	    // destination statistic on the current table. This is to be used when a statistic has a different
	    // name on the SUMMARY table than its equivalent in the crosstab
	    var row_or_column;
	    if (for_plot)
	    	row_or_column = "Row";
	    else
	    	row_or_column = "Column";
		var stat_map = {};
		stat_map[row_or_column + " %"] = "%";
		stat_map[row_or_column + " Population"] = "Base Population";
		stat_map[row_or_column + " n"] = "Base n";
		if (num_rows > 1)
			stat_map["% " + row_or_column + " Share"] = "% Share";
		if (is_categorical)
			stat_map["Column Standard Error"] = "Standard Error";


		// First remove stats that do not make sense for these tables.
		// Then copy the stats from the source SUMMARY table, optionally renaming them in the destination table.
		available_stats
			.filter(function (stat) { return stats_to_prevent.indexOf(stat) == -1; })
			.forEach(function (stat) {
				var source_stat;
				if (stat_map[stat])
					source_stat = stat_map[stat];
				else
					source_stat = stat;
				table.set(stat, copyStatisticsFromSummaryTablesIntoMultipleRowsOrColumns(for_plot, source_stat, new_tables));
			});

		// Conduct the testing and add symbols for significant results
		var cell_text = table.cellText;
		if (!for_plot) {
			if (is_categorical)
				table.cellText = applyindependentComplexSamplesZTestForProportionsForComparingToPreviousColumn(table.get("Column %"), table.get("Column Standard Error"), p_cutoff, high_symbol, low_symbol, cell_text);
			else if (is_numeric)
				table.cellText = applyIndependentComplexSamplesTTestForMeansForComparingToPreviousColumn(table.get("Average"), table.get("Standard Error"), table.get("Column n"), p_cutoff, use_bessel_correction, high_symbol, low_symbol, cell_text);
		} else {
			if (is_categorical)
				// Column Standard Error actually represents the Row Standard Error, but Q does not have a statistic for this.
				table.cellText = Q.transpose(applyindependentComplexSamplesZTestForProportionsForComparingToPreviousColumn(Q.transpose(table.get("Row %")), Q.transpose(table.get("Column Standard Error")), p_cutoff, high_symbol, low_symbol, Q.transpose(cell_text)));
			else if (is_numeric)
				table.cellText = Q.transpose(applyIndependentComplexSamplesTTestForMeansForComparingToPreviousColumn(Q.transpose(table.get("Average")), Q.transpose(table.get("Standard Error")), Q.transpose(table.get("Row n")), p_cutoff, use_bessel_correction, high_symbol, low_symbol, Q.transpose(cell_text)));
		}
	}

	// Remove cell significance (after Q 4.8.3)
	if (table.cellSignificance) {
		table.cellSignificance = Q.matrix(false, num_rows, num_cols);
		table.hypothesisTestingEnabled = false;
	}

	// Add footers to explain the table
	var footers = table.extraFooters;
	footers.push("Columns weighted using the variables from: " + weight_question_name +
		". Significance testing conducted against the previous period. Results that are high at the " + p_cutoff +
		" level are indicated with a " + high_symbol + ", results that are low are indicated with a " + low_symbol);
	table.extraFooters = footers;
}

See Also