From f3c9b61472d5cec6809fa5b0efe9e8e943d686e5 Mon Sep 17 00:00:00 2001 From: Rappoport Date: Fri, 20 Jul 2018 09:55:07 -0400 Subject: [PATCH] Added new library, jStat, and implemented functionality for model p-value calculation & export to csv --- app/enpi_tool.js | 4 +- app/maths.ts | 2 + app/regression_calc.js | 922 ++++++++++++++++++++--------------------- 3 files changed, 456 insertions(+), 472 deletions(-) diff --git a/app/enpi_tool.js b/app/enpi_tool.js index a5fa65c..912231c 100644 --- a/app/enpi_tool.js +++ b/app/enpi_tool.js @@ -1966,9 +1966,11 @@ function exportData(){ //date export_formatJson[i][outputKeys[0]] = tables[z]["results"][k][outputKeys[0]][i][0]; + //pValue for model + export_formatJson[i]["pValue"] = tables[z]["results"][k]["pValue"][i]; for (var j = 1; j < outputKeys.length; j++) { - if(outputKeys[j] != "comboNumber"){ + if(outputKeys[j] != "comboNumber" && outputKeys[j] != "pValue"){ export_formatJson[i]["(" + dependentNames[z] + ")" + outputKeys[j]] = tables[z]["results"][k][outputKeys[j]][i]; } } diff --git a/app/maths.ts b/app/maths.ts index 5f9a220..df9de4c 100644 --- a/app/maths.ts +++ b/app/maths.ts @@ -56,6 +56,7 @@ function findResults(json, dependentNumber){ results["comboNumber"] = []; results[i + "Intercept"] = []; results[i + "fittedModel"] = []; + results["pValue"] = []; for(var k = 0; k < independentCombinations[i].length; k++){ results[i + independentCombinations[i][k] + "Coeff"] = []; @@ -78,6 +79,7 @@ function findResults(json, dependentNumber){ results["rSquare"][j] = model.rSquare; results["comboNumber"][j] = i; results[i + "Intercept"][j] = model.intercept; + results["pValue"][j] = model.pValue; for(var n = 0; n < independentCombinations[i].length; n++){ results[i + independentCombinations[i][n] + "Coeff"][j] = model.params[n]; diff --git a/app/regression_calc.js b/app/regression_calc.js index 0c9f47f..1e72981 100644 --- a/app/regression_calc.js +++ b/app/regression_calc.js @@ -1,7 +1,11 @@ +var jStat = require('jStat').jStat; + var json; +//Number of rows (datapoints) var N = 0; var maxN = 16; +//Number of parameters (independent) var M = 4; var X = new makeArray2(M, maxN); var Y = new Array; @@ -15,66 +19,58 @@ var abort = false; var regrCoeff = new Array; -var sigDig =3; +var sigDig = 3; -function slidingRegression(){ +function slidingRegression() { } -function makeArray2 (X,Y) -{ +function makeArray2(X, Y) { var count; - this.length = X+1; - for (var count = 0; count <= X+1; count++) + this.length = X + 1; + for (var count = 0; count <= X + 1; count++) this[count] = new makeArray(Y); } -function makeArray (Y) -{ +function makeArray(Y) { var count; - this.length = Y+1; - for (var count = 0; count <= Y+1; count++) + this.length = Y + 1; + for (var count = 0; count <= Y + 1; count++) this[count] = 0; } -function det(A) -{ - var Length = A.length-1; +function det(A) { + var Length = A.length - 1; if (Length == 1) return (A[1][1]); - else - { + else { var i; var sum = 0; var factor = 1; - for (var i = 1; i <= Length; i++) - { - if (A[1][i] != 0) - { - minor = new makeArray2(Length-1,Length-1); + for (var i = 1; i <= Length; i++) { + if (A[1][i] != 0) { + minor = new makeArray2(Length - 1, Length - 1); var m; var n; var theColumn; - for (var m = 1; m <= Length-1; m++) - { + for (var m = 1; m <= Length - 1; m++) { if (m < i) theColumn = m; - else theColumn = m+1; - for (var n = 1; n <= Length-1; n++) - { - minor[n][m] = A[n+1][theColumn]; -// alert(minor[n][m]); + else theColumn = m + 1; + for (var n = 1; n <= Length - 1; n++) { + minor[n][m] = A[n + 1][theColumn]; + // alert(minor[n][m]); } } - sum = sum + A[1][i]*factor*det(minor); + sum = sum + A[1][i] * factor * det(minor); } factor = -factor; } // end i } - return(sum); + return (sum); } function inverse(A) { @@ -82,121 +78,109 @@ function inverse(A) { var B = new makeArray2(Length, Length); var d = det(A); if (d == 0) alert("singular matrix--check data"); - else - { + else { var i; var j; - for (var i = 1; i <= Length; i++) - { - for (var j = 1; j <= Length; j++) - { + for (var i = 1; i <= Length; i++) { + for (var j = 1; j <= Length; j++) { - minor = new makeArray2(Length-1,Length-1); + minor = new makeArray2(Length - 1, Length - 1); var m; var n; var theColumn; var theRow; - for (var m = 1; m <= Length-1; m++) - { + for (var m = 1; m <= Length - 1; m++) { if (m < j) theColumn = m; - else theColumn = m+1; - for (var n = 1; n <= Length-1; n++) - { + else theColumn = m + 1; + for (var n = 1; n <= Length - 1; n++) { if (n < i) theRow = n; - else theRow = n+1; + else theRow = n + 1; minor[n][m] = A[theRow][theColumn]; -// alert(minor[n][m]); + // alert(minor[n][m]); } } - var temp = (i+j)/2; + var temp = (i + j) / 2; if (temp == Math.round(temp)) factor = 1; else factor = -1; - B[j][i] = det(minor)*factor/d; + B[j][i] = det(minor) * factor / d; } // j } } - return(B); + return (B); } function shiftRight(theNumber, k) { if (k == 0) return (theNumber) - else - { + else { var k2 = 1; var num = k; if (num < 0) num = -num; - for (var i = 1; i <= num; i++) - { - k2 = k2*10 + for (var i = 1; i <= num; i++) { + k2 = k2 * 10 } } - if (k>0) - {return(k2*theNumber)} - else - {return(theNumber/k2)} + if (k > 0) { return (k2 * theNumber) } + else { return (theNumber / k2) } } function roundSigDig(theNumber, numDigits) { - with (Math) - { - if (theNumber == 0) return(0); - else if(abs(theNumber) < 0.000000000001) return(0); - else - { - var k = floor(log(abs(theNumber))/log(10))-numDigits - var k2 = shiftRight(round(shiftRight(abs(theNumber),-k)),k) - if (theNumber > 0) return(k2); - else return(-k2) + with (Math) { + if (theNumber == 0) return (0); + else if (abs(theNumber) < 0.000000000001) return (0); + else { + var k = floor(log(abs(theNumber)) / log(10)) - numDigits + var k2 = shiftRight(round(shiftRight(abs(theNumber), -k)), k) + if (theNumber > 0) return (k2); + else return (-k2) } } } -function clearForms (){ - document.theForm.output.value="" - document.theForm.residual_values.value="" - document.theForm.RMEAN.value="" - - document.theForm.ESQV.value="" - document.theForm.mean1.value="" - document.theForm.mean2.value="" - - document.theForm.VR1.value="" - document.theForm.VR2.value="" - document.theForm.FR1.value="" - - document.theForm.SR2.value="" - document.theForm.DW.value="" - document.theForm.MAE.value="" - - - document.theForm.NCON.value="" - for (i = 0; i <= 15; i++) - { - document.theForm[3+6*i].value="" - document.theForm[4+6*i].value="" - document.theForm[5+6*i].value="" - document.theForm[6+6*i].value="" - document.theForm[7+6*i].value="" - document.theForm[8+6*i].value="" +function clearForms() { + document.theForm.output.value = "" + document.theForm.residual_values.value = "" + document.theForm.RMEAN.value = "" + + document.theForm.ESQV.value = "" + document.theForm.mean1.value = "" + document.theForm.mean2.value = "" + + document.theForm.VR1.value = "" + document.theForm.VR2.value = "" + document.theForm.FR1.value = "" + + document.theForm.SR2.value = "" + document.theForm.DW.value = "" + document.theForm.MAE.value = "" + + + document.theForm.NCON.value = "" + for (i = 0; i <= 15; i++) { + document.theForm[3 + 6 * i].value = "" + document.theForm[4 + 6 * i].value = "" + document.theForm[5 + 6 * i].value = "" + document.theForm[6 + 6 * i].value = "" + document.theForm[7 + 6 * i].value = "" + document.theForm[8 + 6 * i].value = "" } } -function stripSpaces (InString) { - OutString=""; - for (Count=0; Count < InString.length; Count++) { - TempChar=InString.substring (Count, Count+1); - if (TempChar!=" ") - OutString=OutString+TempChar; +function stripSpaces(InString) { + OutString = ""; + for (Count = 0; Count < InString.length; Count++) { + TempChar = InString.substring(Count, Count + 1); + if (TempChar != " ") + OutString = OutString + TempChar; } return (OutString); } -function buildxy() { +function buildxy() { e = 2.718281828459045; pi = 3.141592653589793; abort = false; @@ -215,9 +199,9 @@ function buildxy() { //Runs through as many rows as there are dates available for (var i = 0; i < json.date.Date.length; i++) { - for(var j = 0; j < numvariables; j++){ + for (var j = 0; j < numvariables; j++) { var key = independentKeys[j]; - X[j+1][N] = json["independent"][key][N]; + X[j + 1][N] = json["independent"][key][N]; } Y[N] = json["dependent"][dependentKeys[0]][N]; @@ -229,7 +213,7 @@ function buildxy() { M = numvariables; } -function buildxy2(dependent, independent){ +function buildxy2(dependent, independent) { e = 2.718281828459045; pi = 3.141592653589793; abort = false; @@ -244,8 +228,8 @@ function buildxy2(dependent, independent){ //Runs through as many rows as there are dates available for (var i = 0; i < dependent.length; i++) { - for(var j = 0; j < numvariables; j++){ - X[j+1][N] = independent[j][N]; + for (var j = 0; j < numvariables; j++) { + X[j + 1][N] = independent[j][N]; } Y[N] = dependent[N][0]; @@ -258,8 +242,7 @@ function buildxy2(dependent, independent){ } -function linregr() -{ +function linregr() { if (!abort) { e = 2.718281828459045; pi = 3.141592653589793; @@ -268,48 +251,43 @@ function linregr() var j; var sum; - B = new makeArray(M+1); - P = new makeArray2(M+1, M+1); - invP = new makeArray2(M+1, M+1); - var mtemp = M+1; - -// if (N < M+1) alert("your need at least "+ mtemp +" points"); - with (Math) - { - for (i = 0; i < N; i++) X[0][i] = 1; - for (i = 1; i <= M+1; i++) - { + B = new makeArray(M + 1); + P = new makeArray2(M + 1, M + 1); + invP = new makeArray2(M + 1, M + 1); + var mtemp = M + 1; + + // if (N < M+1) alert("your need at least "+ mtemp +" points"); + with (Math) { + for (i = 0; i < N; i++) X[0][i] = 1; + for (i = 1; i <= M + 1; i++) { sum = 0; - for (k = 0; k < N; k++){ - sum = sum + X[i-1][k]*Y[k]; + for (k = 0; k < N; k++) { + sum = sum + X[i - 1][k] * Y[k]; } B[i] = sum; - for (j = 1; j <= M+1; j++) - { + for (j = 1; j <= M + 1; j++) { sum = 0; - for (k = 0; k < N; k++) sum = sum + X[i-1][k]*X[j-1][k]; + for (k = 0; k < N; k++) sum = sum + X[i - 1][k] * X[j - 1][k]; P[i][j] = sum; } } invP = inverse(P); - for (k = 0; k <= M; k++) - { + for (k = 0; k <= M; k++) { sum = 0; - for (j = 1; j <= M+1; j++) - { - sum = sum + invP[k+1][j]*B[j]; + for (j = 1; j <= M + 1; j++) { + sum = sum + invP[k + 1][j] * B[j]; } -// alert("here"); + // alert("here"); regrCoeff[k] = sum; } } } } -function calc2(){ +function calc2() { var num = calc2.arguments[0]; json = calc2.arguments[1]; @@ -319,6 +297,7 @@ function calc2(){ yValues: "", rSquare: "", fStatistic: "", + pval: "", mean: "", variance: "", mean_1: "", @@ -333,63 +312,56 @@ function calc2(){ iResidual: [] }; - if (num == 1) - { + if (num == 1) { } - else if (num == 2) - { + else if (num == 2) { } - else if (num == 3) - { + else if (num == 3) { } - else if (num == 4) - { + else if (num == 4) { } - else if (num == 5) - { - with (Math) - { + else if (num == 5) { + with (Math) { buildxy(); -// alert("here"); + // alert("here"); linregr(); var predicted = new Array; var residual = new Array; var output = "Y = " + roundSigDig(regrCoeff[0], sigDig); - var SE=0; + var SE = 0; var ST = 0; - for (i = 1; i <=M; i++) { + for (i = 1; i <= M; i++) { output += " + (" + roundSigDig(regrCoeff[i], sigDig) + ")X" + i; - model.params[i-1] = roundSigDig(regrCoeff[i], sigDig); + model.params[i - 1] = roundSigDig(regrCoeff[i], sigDig); } //console.log("The Fitted Model is :" + output); model.fittedModel = output; - for ( i = -1; i < N-1; i++) - { + for (i = -1; i < N - 1; i++) { y = regrCoeff[0]; - for (j = 1; j <=M; j++) y +=regrCoeff[j]*X[j][i+1]; + for (j = 1; j <= M; j++) y += regrCoeff[j] * X[j][i + 1]; //console.log("Predicted Y Value " + (i+2) + ": " + roundSigDig(y, sigDig)); - model.yValues[i+2] = "Predicted Y Value " + (i+2) + ": " + roundSigDig(y, sigDig); + model.yValues[i + 2] = "Predicted Y Value " + (i + 2) + ": " + roundSigDig(y, sigDig); predicted[i] = roundSigDig(y, sigDig); - residual[i] = (Y[i+1] - predicted[i]); + residual[i] = (Y[i + 1] - predicted[i]); //console.log("ith Residual: " + "("+(i+2)+")"+ Math.round(residual[i]*Math.pow(10,4))/Math.pow(10,4)+" "); - model.iResidual[i+1] = ("("+(i+2)+") "+ Math.round(residual[i]*Math.pow(10,4))/Math.pow(10,4)+"\t\t"); + model.iResidual[i + 1] = ("(" + (i + 2) + ") " + Math.round(residual[i] * Math.pow(10, 4)) / Math.pow(10, 4) + "\t\t"); SE += residual[i]; - ST += Y[i+1]; + ST += Y[i + 1]; } @@ -397,25 +369,25 @@ function calc2(){ var MSE = 0; var MST = 0; - MSE = SE/N; - MST = ST/N; + MSE = SE / N; + MST = ST / N; var SSE = 0; var SST = 0; for (i = 0; i < N; i++) { - SSE += (residual[i-1] - MSE)*(residual[i-1] - MSE); + SSE += (residual[i - 1] - MSE) * (residual[i - 1] - MSE); - SST += (Y[i] - MST) *(Y[i] - MST); + SST += (Y[i] - MST) * (Y[i] - MST); } var FR; var RRSQ; - RRSQ = 1-(SSE/SST); + RRSQ = 1 - (SSE / SST); - FR = ((N-M-1)*(SST-SSE))/(M*SSE); + FR = ((N - M - 1) * (SST - SSE)) / (M * SSE); //console.log("F-Statistic: " + FR); model.fStatistic = FR; //console.log("R-Square: " + RRSQ); @@ -427,80 +399,82 @@ function calc2(){ //start analysis************************************************************ - var Pi=Math.PI; var PiD2=Pi/2; var PiD4=Pi/4; var Pi2=2*Pi - var e=2.718281828459045235; var e10 = 1.105170918075647625 - var Deg=180/Pi + var Pi = Math.PI; var PiD2 = Pi / 2; var PiD4 = Pi / 4; var Pi2 = 2 * Pi + var e = 2.718281828459045235; var e10 = 1.105170918075647625 + var Deg = 180 / Pi function Norm(z) { - z=Math.abs(z) - var p=1+ z*(0.04986735+ z*(0.02114101+ z*(0.00327763+ z*(0.0000380036+ z*(0.0000488906+ z*0.000005383))))) - p=p*p; p=p*p; p=p*p - return 1/(p*p) + z = Math.abs(z) + var p = 1 + z * (0.04986735 + z * (0.02114101 + z * (0.00327763 + z * (0.0000380036 + z * (0.0000488906 + z * 0.000005383))))) + p = p * p; p = p * p; p = p * p + return 1 / (p * p) } function CalcNr(theForm) { console.log("NR: " + Fmt(ANorm(eval(document.theForm.pn.value)))); } - function ANorm(p) { var v=0.5; var dv=0.5; var z=0 - while(dv>1e-6) { z=1/v-1; dv=dv/2; if(Norm(z)>p) { v=v-dv } else { v=v+dv } } + function ANorm(p) { + var v = 0.5; var dv = 0.5; var z = 0 + while (dv > 1e-6) { z = 1 / v - 1; dv = dv / 2; if (Norm(z) > p) { v = v - dv } else { v = v + dv } } return z } function Fmt(x) { var v - if(x>=0) { v=''+(x+0.00005) } else { v=''+(x-0.00005) } - return v.substring(0,v.indexOf('.')+5) - } - function FishF(f,n1,n2) { - var x=n2/(n1*f+n2) - if((n1%2)==0) { return StatCom(1-x,n2,n1+n2-4,n2-2)*Math.pow(x,n2/2) } - if((n2%2)==0){ return 1-StatCom(x,n1,n1+n2-4,n1-2)*Math.pow(1-x,n1/2) } - - var th=Math.atan(Math.sqrt(n1*f/n2)); var a=th/PiD2; var sth=Math.sin(th); var cth=Math.cos(th) - if(n2>1) { a=a+sth*cth*StatCom(cth*cth,2,n2-3,-1)/PiD2 } - if(n1==1) { return 1-a } - var c=4*StatCom(sth*sth,n2+1,n1+n2-4,n2-2)*sth*Math.pow(cth,n2)/Pi - if(n2==1) { return 1-a+c/2 } - var k=2; while(k<=(n2-1)/2) {c=c*k/(k-.5); k=k+1 } - return 1-a+c - } - function StatCom(q,i,j,b) { - var zz=1; var z=zz; var k=i; while(k<=j) { zz=zz*q*k/(k-b); z=z+zz; k=k+2 } + if (x >= 0) { v = '' + (x + 0.00005) } else { v = '' + (x - 0.00005) } + return v.substring(0, v.indexOf('.') + 5) + } + function FishF(f, n1, n2) { + var x = n2 / (n1 * f + n2) + if ((n1 % 2) == 0) { return StatCom(1 - x, n2, n1 + n2 - 4, n2 - 2) * Math.pow(x, n2 / 2) } + if ((n2 % 2) == 0) { return 1 - StatCom(x, n1, n1 + n2 - 4, n1 - 2) * Math.pow(1 - x, n1 / 2) } + + var th = Math.atan(Math.sqrt(n1 * f / n2)); var a = th / PiD2; var sth = Math.sin(th); var cth = Math.cos(th) + if (n2 > 1) { a = a + sth * cth * StatCom(cth * cth, 2, n2 - 3, -1) / PiD2 } + if (n1 == 1) { return 1 - a } + var c = 4 * StatCom(sth * sth, n2 + 1, n1 + n2 - 4, n2 - 2) * sth * Math.pow(cth, n2) / Pi + if (n2 == 1) { return 1 - a + c / 2 } + var k = 2; while (k <= (n2 - 1) / 2) { c = c * k / (k - .5); k = k + 1 } + return 1 - a + c + } + function StatCom(q, i, j, b) { + var zz = 1; var z = zz; var k = i; while (k <= j) { zz = zz * q * k / (k - b); z = z + zz; k = k + 2 } return z } - function AFishF(p,n1,n2) { var v=0.5; var dv=0.5; var f=0 - while(dv>1e-10) { f=1/v-1; dv=dv/2; if(FishF(f,n1,n2)>p) { v=v-dv } else { v=v+dv } } + function AFishF(p, n1, n2) { + var v = 0.5; var dv = 0.5; var f = 0 + while (dv > 1e-10) { f = 1 / v - 1; dv = dv / 2; if (FishF(f, n1, n2) > p) { v = v - dv } else { v = v + dv } } return f } var SUME = 0.0; var StdE = 0.0; - for(i=0; i=0) { - fval[i6] = 1 - (F1)/2; } - else { - fval[i6] = F1/2; } - F1=0; + if (zvalS[i6] >= 0) { + fval[i6] = 1 - (F1) / 2; + } + else { + fval[i6] = F1 / 2; + } + F1 = 0; } //calculate J from here var jval = new Array(); - jval[0] = freqS[0]/SUMF; + jval[0] = freqS[0] / SUMF; - for(i7=1; i7 D025) { + if (t2N > D025) { //console.log("Evidence against normality"); model.normalityCond = "Evidence against normality"; } - else if ((t2N <= D025) && (t2N > D05)) { + else if ((t2N <= D025) && (t2N > D05)) { //console.log("Sufficient evidence against normality"); model.normalityCond = "Sufficient evidence against normality"; } - else if ((t2N <= D05) && (t2N > D10)) { + else if ((t2N <= D05) && (t2N > D10)) { //console.log("Suggestive evidence against normality"); model.normalityCond = "Suggestive evidence against normality"; } - else if ((t2N <= D10) && (t2N > D15)) { + else if ((t2N <= D10) && (t2N > D15)) { //console.log("Little evidence against normality"); model.normalityCond = "Little evidence against normality"; } - else if (t2N <=D15) { + else if (t2N <= D15) { //console.log("No evidences against normality"); model.normalityCond = "No evidences against normality"; } @@ -761,13 +737,12 @@ function calc2(){ } } - else if (num == 6) - { + else if (num == 6) { } return model; } -function calc3(num, dependent, independent, independentNames){ +function calc3(num, dependent, independent, independentNames) { var model = { fittedModel: "", @@ -775,6 +750,7 @@ function calc3(num, dependent, independent, independentNames){ yValues: "", rSquare: "", fStatistic: "", + pValue: "", mean: "", variance: "", mean_1: "", @@ -790,23 +766,17 @@ function calc3(num, dependent, independent, independentNames){ iResidual: [] }; - if (num == 1) - { + if (num == 1) { } - else if (num == 2) - { + else if (num == 2) { } - else if (num == 3) - { + else if (num == 3) { } - else if (num == 4) - { + else if (num == 4) { } - else if (num == 5) - { - with (Math) - { + else if (num == 5) { + with (Math) { buildxy2(dependent, independent); linregr(); @@ -818,32 +788,31 @@ function calc3(num, dependent, independent, independentNames){ var SE = 0; var ST = 0; - for (i = 1; i <=M; i++) { - output += " + (" + roundSigDig(regrCoeff[i], sigDig) + ")" + independentNames[i-1]; - model.params[i-1] = roundSigDig(regrCoeff[i], sigDig); + for (i = 1; i <= M; i++) { + output += " + (" + roundSigDig(regrCoeff[i], sigDig) + ")" + independentNames[i - 1]; + model.params[i - 1] = roundSigDig(regrCoeff[i], sigDig); } //console.log("The Fitted Model is :" + output); model.fittedModel = output; - for ( i = -1; i < N-1; i++) - { + for (i = -1; i < N - 1; i++) { y = regrCoeff[0]; - for (j = 1; j <=M; j++) y +=regrCoeff[j]*X[j][i+1]; + for (j = 1; j <= M; j++) y += regrCoeff[j] * X[j][i + 1]; //console.log("Predicted Y Value " + (i+2) + ": " + roundSigDig(y, sigDig)); - model.yValues[i+2] = "Predicted Y Value " + (i+2) + ": " + roundSigDig(y, sigDig); + model.yValues[i + 2] = "Predicted Y Value " + (i + 2) + ": " + roundSigDig(y, sigDig); predicted[i] = roundSigDig(y, sigDig); - residual[i] = (Y[i+1] - predicted[i]); + residual[i] = (Y[i + 1] - predicted[i]); //console.log("ith Residual: " + "("+(i+2)+")"+ Math.round(residual[i]*Math.pow(10,4))/Math.pow(10,4)+" "); - model.iResidual[i+1] = ("("+(i+2)+") "+ Math.round(residual[i]*Math.pow(10,4))/Math.pow(10,4)+"\t\t"); + model.iResidual[i + 1] = ("(" + (i + 2) + ") " + Math.round(residual[i] * Math.pow(10, 4)) / Math.pow(10, 4) + "\t\t"); SE += residual[i]; //console.log(Number(Y[i+1])); @@ -853,7 +822,7 @@ function calc3(num, dependent, independent, independentNames){ // // console.log(Number(Y[i+1])); - ST += Number(Y[i+1]); + ST += Number(Y[i + 1]); } @@ -864,16 +833,16 @@ function calc3(num, dependent, independent, independentNames){ //console.log(ST); // console.log(N); - MSE = SE/N; - MST = ST/N; + MSE = SE / N; + MST = ST / N; var SSE = 0; var SST = 0; for (i = 0; i < N; i++) { - SSE += (residual[i-1] - MSE)*(residual[i-1] - MSE); + SSE += (residual[i - 1] - MSE) * (residual[i - 1] - MSE); - SST += (Y[i] - MST) *(Y[i] - MST); + SST += (Y[i] - MST) * (Y[i] - MST); } // console.log(SST); @@ -882,11 +851,19 @@ function calc3(num, dependent, independent, independentNames){ var FR; var RRSQ; - RRSQ = 1-(SSE/SST); + RRSQ = 1 - (SSE / SST); - FR = ((N-M-1)*(SST-SSE))/(M*SSE); + FR = ((N - M - 1) * (SST - SSE)) / (M * SSE); + var dfNum, dfDenom, pValue; + //number of parameters in model + dfNum = M; + //number of data points - number of parameters + dfDenom = N - M; + pValue = jStat.ftest(FR, dfNum, dfDenom); //console.log("F-Statistic: " + FR); model.fStatistic = FR; + console.log("P-value: " + pValue); + model.pValue = pValue; //console.log("R-Square: " + RRSQ); model.rSquare = RRSQ; @@ -896,80 +873,82 @@ function calc3(num, dependent, independent, independentNames){ //start analysis************************************************************ - var Pi=Math.PI; var PiD2=Pi/2; var PiD4=Pi/4; var Pi2=2*Pi - var e=2.718281828459045235; var e10 = 1.105170918075647625 - var Deg=180/Pi + var Pi = Math.PI; var PiD2 = Pi / 2; var PiD4 = Pi / 4; var Pi2 = 2 * Pi + var e = 2.718281828459045235; var e10 = 1.105170918075647625 + var Deg = 180 / Pi function Norm(z) { - z=Math.abs(z) - var p=1+ z*(0.04986735+ z*(0.02114101+ z*(0.00327763+ z*(0.0000380036+ z*(0.0000488906+ z*0.000005383))))) - p=p*p; p=p*p; p=p*p - return 1/(p*p) + z = Math.abs(z) + var p = 1 + z * (0.04986735 + z * (0.02114101 + z * (0.00327763 + z * (0.0000380036 + z * (0.0000488906 + z * 0.000005383))))) + p = p * p; p = p * p; p = p * p + return 1 / (p * p) } function CalcNr(theForm) { console.log("NR: " + Fmt(ANorm(eval(document.theForm.pn.value)))); } - function ANorm(p) { var v=0.5; var dv=0.5; var z=0 - while(dv>1e-6) { z=1/v-1; dv=dv/2; if(Norm(z)>p) { v=v-dv } else { v=v+dv } } + function ANorm(p) { + var v = 0.5; var dv = 0.5; var z = 0 + while (dv > 1e-6) { z = 1 / v - 1; dv = dv / 2; if (Norm(z) > p) { v = v - dv } else { v = v + dv } } return z } function Fmt(x) { var v - if(x>=0) { v=''+(x+0.00005) } else { v=''+(x-0.00005) } - return v.substring(0,v.indexOf('.')+5) - } - function FishF(f,n1,n2) { - var x=n2/(n1*f+n2) - if((n1%2)==0) { return StatCom(1-x,n2,n1+n2-4,n2-2)*Math.pow(x,n2/2) } - if((n2%2)==0){ return 1-StatCom(x,n1,n1+n2-4,n1-2)*Math.pow(1-x,n1/2) } - - var th=Math.atan(Math.sqrt(n1*f/n2)); var a=th/PiD2; var sth=Math.sin(th); var cth=Math.cos(th) - if(n2>1) { a=a+sth*cth*StatCom(cth*cth,2,n2-3,-1)/PiD2 } - if(n1==1) { return 1-a } - var c=4*StatCom(sth*sth,n2+1,n1+n2-4,n2-2)*sth*Math.pow(cth,n2)/Pi - if(n2==1) { return 1-a+c/2 } - var k=2; while(k<=(n2-1)/2) {c=c*k/(k-.5); k=k+1 } - return 1-a+c - } - function StatCom(q,i,j,b) { - var zz=1; var z=zz; var k=i; while(k<=j) { zz=zz*q*k/(k-b); z=z+zz; k=k+2 } + if (x >= 0) { v = '' + (x + 0.00005) } else { v = '' + (x - 0.00005) } + return v.substring(0, v.indexOf('.') + 5) + } + function FishF(f, n1, n2) { + var x = n2 / (n1 * f + n2) + if ((n1 % 2) == 0) { return StatCom(1 - x, n2, n1 + n2 - 4, n2 - 2) * Math.pow(x, n2 / 2) } + if ((n2 % 2) == 0) { return 1 - StatCom(x, n1, n1 + n2 - 4, n1 - 2) * Math.pow(1 - x, n1 / 2) } + + var th = Math.atan(Math.sqrt(n1 * f / n2)); var a = th / PiD2; var sth = Math.sin(th); var cth = Math.cos(th) + if (n2 > 1) { a = a + sth * cth * StatCom(cth * cth, 2, n2 - 3, -1) / PiD2 } + if (n1 == 1) { return 1 - a } + var c = 4 * StatCom(sth * sth, n2 + 1, n1 + n2 - 4, n2 - 2) * sth * Math.pow(cth, n2) / Pi + if (n2 == 1) { return 1 - a + c / 2 } + var k = 2; while (k <= (n2 - 1) / 2) { c = c * k / (k - .5); k = k + 1 } + return 1 - a + c + } + function StatCom(q, i, j, b) { + var zz = 1; var z = zz; var k = i; while (k <= j) { zz = zz * q * k / (k - b); z = z + zz; k = k + 2 } return z } - function AFishF(p,n1,n2) { var v=0.5; var dv=0.5; var f=0 - while(dv>1e-10) { f=1/v-1; dv=dv/2; if(FishF(f,n1,n2)>p) { v=v-dv } else { v=v+dv } } + function AFishF(p, n1, n2) { + var v = 0.5; var dv = 0.5; var f = 0 + while (dv > 1e-10) { f = 1 / v - 1; dv = dv / 2; if (FishF(f, n1, n2) > p) { v = v - dv } else { v = v + dv } } return f } var SUME = 0.0; var StdE = 0.0; - for(i=0; i=0) { - fval[i6] = 1 - (F1)/2; } - else { - fval[i6] = F1/2; } - F1=0; + if (zvalS[i6] >= 0) { + fval[i6] = 1 - (F1) / 2; + } + else { + fval[i6] = F1 / 2; + } + F1 = 0; } //calculate J from here var jval = new Array(); - jval[0] = freqS[0]/SUMF; + jval[0] = freqS[0] / SUMF; - for(i7=1; i7 D025) { + if (t2N > D025) { //console.log("Evidence against normality"); model.normalityCond = "Evidence against normality"; } - else if ((t2N <= D025) && (t2N > D05)) { + else if ((t2N <= D025) && (t2N > D05)) { //console.log("Sufficient evidence against normality"); model.normalityCond = "Sufficient evidence against normality"; } - else if ((t2N <= D05) && (t2N > D10)) { + else if ((t2N <= D05) && (t2N > D10)) { //console.log("Suggestive evidence against normality"); model.normalityCond = "Suggestive evidence against normality"; } - else if ((t2N <= D10) && (t2N > D15)) { + else if ((t2N <= D10) && (t2N > D15)) { //console.log("Little evidence against normality"); model.normalityCond = "Little evidence against normality"; } - else if (t2N <=D15) { + else if (t2N <= D15) { //console.log("No evidences against normality"); model.normalityCond = "No evidences against normality"; } @@ -1230,8 +1211,7 @@ function calc3(num, dependent, independent, independentNames){ } } - else if (num == 6) - { + else if (num == 6) { } console.log(model);