UNPKG

jstat

Version:

Statistical Library for JavaScript

207 lines (169 loc) 5.49 kB
//To regress, simply build X matrix //(append column of 1's) using //buildxmatrix and build the Y //matrix using buildymatrix //(simply the transpose) //and run regress. //Regressions jStat.extend({ buildxmatrix: function buildxmatrix(){ //Parameters will be passed in as such //(array1,array2,array3,...) //as (x1,x2,x3,...) //needs to be (1,x1,x2,x3,...) var matrixRows = new Array(arguments.length); for(var i=0;i<arguments.length;i++){ var array = [1]; matrixRows[i]= array.concat(arguments[i]); } return jStat(matrixRows); }, builddxmatrix: function builddxmatrix() { //Paramters will be passed in as such //([array1,array2,...] var matrixRows = new Array(arguments[0].length); for(var i=0;i<arguments[0].length;i++){ var array = [1] matrixRows[i]= array.concat(arguments[0][i]); } return jStat(matrixRows); }, buildjxmatrix: function buildjxmatrix(jMat) { //Builds from jStat Matrix var pass = new Array(jMat.length) for(var i=0;i<jMat.length;i++){ pass[i] = jMat[i]; } return jStat.builddxmatrix(pass); }, buildymatrix: function buildymatrix(array){ return jStat(array).transpose(); }, buildjymatrix: function buildjymatrix(jMat){ return jMat.transpose(); }, matrixmult: function matrixmult(A,B){ var i, j, k, result, sum; if (A.cols() == B.rows()) { if(B.rows()>1){ result = []; for (i = 0; i < A.rows(); i++) { result[i] = []; for (j = 0; j < B.cols(); j++) { sum = 0; for (k = 0; k < A.cols(); k++) { sum += A.toArray()[i][k] * B.toArray()[k][j]; } result[i][j] = sum; } } return jStat(result); } result = []; for (i = 0; i < A.rows(); i++) { result[i] = []; for (j = 0; j < B.cols(); j++) { sum = 0; for (k = 0; k < A.cols(); k++) { sum += A.toArray()[i][k] * B.toArray()[j]; } result[i][j] = sum; } } return jStat(result); } }, //regress and regresst to be fixed regress: function regress(jMatX,jMatY){ //print("regressin!"); //print(jMatX.toArray()); var innerinv = jStat.xtranspxinv(jMatX); //print(innerinv); var xtransp = jMatX.transpose(); var next = jStat.matrixmult(jStat(innerinv),xtransp); return jStat.matrixmult(next,jMatY); }, regresst: function regresst(jMatX,jMatY,sides){ var beta = jStat.regress(jMatX,jMatY); var compile = {}; compile.anova = {}; var jMatYBar = jStat.jMatYBar(jMatX, beta); compile.yBar = jMatYBar; var yAverage = jMatY.mean(); compile.anova.residuals = jStat.residuals(jMatY, jMatYBar); compile.anova.ssr = jStat.ssr(jMatYBar, yAverage); compile.anova.msr = compile.anova.ssr / (jMatX[0].length - 1); compile.anova.sse = jStat.sse(jMatY, jMatYBar); compile.anova.mse = compile.anova.sse / (jMatY.length - (jMatX[0].length - 1) - 1); compile.anova.sst = jStat.sst(jMatY, yAverage); compile.anova.mst = compile.anova.sst / (jMatY.length - 1); compile.anova.r2 = 1 - (compile.anova.sse / compile.anova.sst); if (compile.anova.r2 < 0) compile.anova.r2 = 0; compile.anova.fratio = compile.anova.msr / compile.anova.mse; compile.anova.pvalue = jStat.anovaftest(compile.anova.fratio, jMatX[0].length - 1, jMatY.length - (jMatX[0].length - 1) - 1); compile.anova.rmse = Math.sqrt(compile.anova.mse); compile.anova.r2adj = 1 - (compile.anova.mse / compile.anova.mst); if (compile.anova.r2adj < 0) compile.anova.r2adj = 0; compile.stats = new Array(jMatX[0].length); var covar = jStat.xtranspxinv(jMatX); var sds, ts, ps; for(var i=0; i<beta.length;i++){ sds=Math.sqrt(compile.anova.mse * Math.abs(covar[i][i])); ts= Math.abs(beta[i] / sds); ps= jStat.ttest(ts, jMatY.length - jMatX[0].length - 1, sides); compile.stats[i]=[beta[i], sds, ts, ps]; } compile.regress = beta; return compile; }, xtranspx: function xtranspx(jMatX){ return jStat.matrixmult(jMatX.transpose(),jMatX); }, xtranspxinv: function xtranspxinv(jMatX){ var inner = jStat.matrixmult(jMatX.transpose(),jMatX); var innerinv = jStat.inv(inner); return innerinv; }, jMatYBar: function jMatYBar(jMatX, beta) { var yBar = jStat.matrixmult(jMatX, beta); return new jStat(yBar); }, residuals: function residuals(jMatY, jMatYBar) { return jStat.matrixsubtract(jMatY, jMatYBar); }, ssr: function ssr(jMatYBar, yAverage) { var ssr = 0; for(var i = 0; i < jMatYBar.length; i++) { ssr += Math.pow(jMatYBar[i] - yAverage, 2); } return ssr; }, sse: function sse(jMatY, jMatYBar) { var sse = 0; for(var i = 0; i < jMatY.length; i++) { sse += Math.pow(jMatY[i] - jMatYBar[i], 2); } return sse; }, sst: function sst(jMatY, yAverage) { var sst = 0; for(var i = 0; i < jMatY.length; i++) { sst += Math.pow(jMatY[i] - yAverage, 2); } return sst; }, matrixsubtract: function matrixsubtract(A,B){ var ans = new Array(A.length); for(var i=0;i<A.length;i++){ ans[i] = new Array(A[i].length); for(var j=0;j<A[i].length;j++){ ans[i][j]=A[i][j]-B[i][j]; } } return jStat(ans); } });