qesuite 1.0.58 → 1.0.59

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
1
  /** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2
- */
2
+ */
3
3
  declare class Specification {
4
4
  constructor(spec: any, USL?: number, LSL?: number, tolerance?: number, tol_plus?: number, tol_minus?: number, units?: string);
5
5
  nominal: number;
@@ -1211,8 +1211,10 @@ declare const ANOVA: {
1211
1211
  };
1212
1212
  };
1213
1213
  declare const MANOVA: {
1214
+ WilksLambda(responses: any, factors: any, interactions?: any[]): any;
1214
1215
  Report(responses: any, factors: any, interactions?: any[]): any;
1215
- HypothesisMatrix(responses: any, factor: any): void;
1216
+ ErrorMatrix(responses: any, factor: any): any;
1217
+ HypothesisMatrix(responses: any, factor: any): any;
1216
1218
  };
1217
1219
  /**
1218
1220
  * Calculates the average moving range of the array supplied.
@@ -1717,6 +1719,18 @@ declare const OutlierTesting: {
1717
1719
  rejectNull: boolean;
1718
1720
  chart: HTMLCanvasElement;
1719
1721
  };
1722
+ /**
1723
+ * Performs Dixon's Test to test for and identify (if one exists) an outlier. H_0: data has no outliers | H_A: there is one outlier
1724
+ * @param data The array of numbers to evaluate
1725
+ * @param tails OPTIONAL: Whether to perform single or two-tailed Grubbs' Test. DEFAULT = 0: two-tailed | -1: lower tailed (checks if smallest value is an outlier) | 1: upper tailed (checks if largest value is an outlier)
1726
+ * @param alpha OPTIONAL: The significance value to evaluate outliers. DEFAULT = 0.05
1727
+ */
1728
+ Dixon(data: any[], i?: number, j?: number, alpha?: number, name?: string): {
1729
+ test: string;
1730
+ r: number;
1731
+ p: number;
1732
+ chart: HTMLCanvasElement;
1733
+ };
1720
1734
  };
1721
1735
  declare const Probability: {
1722
1736
  Combinations(n: number, r: number): number;
@@ -1890,7 +1904,7 @@ declare function CreateLayeredChart(charts: Chart[], title?: string, chartSettin
1890
1904
  declare function GetFunctionValues(callback: Function, range: number[], count: number): DataSet;
1891
1905
  declare function QQPlotChart(data: number[], distribution?: string): HTMLCanvasElement;
1892
1906
  declare function CreateControlChart(data: number[], chartTitle?: string, UCL?: number, LCL?: number, controlTests?: any): HTMLCanvasElement;
1893
- declare function GeneralizedLinearModel(dependent: number[], factors: any, covariates?: any, interactions?: any[][]): {
1907
+ declare function GeneralizedLinearModel(dependent: number[], factors: any, covariates?: any, interactions?: any[][], simple?: boolean): {
1894
1908
  ANOVA: any;
1895
1909
  Coefficients: {};
1896
1910
  ModelSummary: {
@@ -2276,5 +2290,6 @@ declare function GRRByPartChart(data: GRRData): HTMLCanvasElement;
2276
2290
  declare function NestedGRRByPartChart(data: GRRData): HTMLCanvasElement;
2277
2291
  declare function GRRPartxOperatorChart(data: GRRData): HTMLCanvasElement;
2278
2292
  declare function CompileGRRObject(operators: any, parts: any, measurements: any): GRRData;
2293
+ declare function Unique(values: any[]): any[];
2279
2294
 
2280
- export { ANOMEChartEMP, ANOMRChartEMP, ANOVA, AnovaTableTwoWay, AttributeAgreementAnalysis, AverageMovingRange, AxisSettings, Beta, CanvasDrawSettings, Capability, Chart, ChartSettings, CohenKappa, CompileGRRObject, Correlation, Count, CreateBarChart, CreateBoxPlot, CreateBoxandWhiskerGraph, CreateCapabilityHistogram, CreateCapabilityPlot, CreateCategoricalBarGraph, CreateContinuousBarGraph, CreateControlChart, CreateLayeredChart, CreateMatrixChart, CreateScatterPlot, CreateSplitGraph, CreateStackedChart, CreateSummaryChart, CustomDraw, CustomGridline, CustomGridlines, DataCollection, DataSet, DescriptiveStatistics, Distributions, ERF, EngFont, EquivalenceTesting, EvaluateMeasurementProcess, FixedPointIteration, FleissKappa, G1, G1Graphs, GRR, GRRByPartChart, GRRData, GRRGraphs, GRROperator, GRRPartxOperatorChart, GRRReplication, GageEvaluation, GageLinearityAndBias, Gamma, GeneralizedLinearModel, GetFunctionValues, GetHistogramDataset, GoodnessOfFit, HypothesisTesting, IndividualDistributionIdentification, IndividualDistributionPlots, IndividualValuePlot, LastObservationsChart, Line, MANOVA, Margin, MaximumLikelihoodParameters, Mean, Median, MedianMovingRange, MovingRange, MovingRangeChart, MultipleLinearRegression, NestedGRR, NestedGRRByPartChart, NewtonRaphson, NonlinearRootFinding, NonparametricTesting, ObjectToArray, OutlierTesting, ParameterizedCDF, PlochhammerSymbol, Point, Probability, Product, QQPlot, QQPlotChart, Quartile, Rang, SerializeData, SimpleLinearRegression, Specification, StDev, StandardError, Sum, SumSq, SumSquaredDeviation, TrimmedMean, UnbiasingConstant, Variance, VarianceComponents };
2295
+ export { ANOMEChartEMP, ANOMRChartEMP, ANOVA, AnovaTableTwoWay, AttributeAgreementAnalysis, AverageMovingRange, AxisSettings, Beta, CanvasDrawSettings, Capability, Chart, ChartSettings, CohenKappa, CompileGRRObject, Correlation, Count, CreateBarChart, CreateBoxPlot, CreateBoxandWhiskerGraph, CreateCapabilityHistogram, CreateCapabilityPlot, CreateCategoricalBarGraph, CreateContinuousBarGraph, CreateControlChart, CreateLayeredChart, CreateMatrixChart, CreateScatterPlot, CreateSplitGraph, CreateStackedChart, CreateSummaryChart, CustomDraw, CustomGridline, CustomGridlines, DataCollection, DataSet, DescriptiveStatistics, Distributions, ERF, EngFont, EquivalenceTesting, EvaluateMeasurementProcess, FixedPointIteration, FleissKappa, G1, G1Graphs, GRR, GRRByPartChart, GRRData, GRRGraphs, GRROperator, GRRPartxOperatorChart, GRRReplication, GageEvaluation, GageLinearityAndBias, Gamma, GeneralizedLinearModel, GetFunctionValues, GetHistogramDataset, GoodnessOfFit, HypothesisTesting, IndividualDistributionIdentification, IndividualDistributionPlots, IndividualValuePlot, LastObservationsChart, Line, MANOVA, Margin, MaximumLikelihoodParameters, Mean, Median, MedianMovingRange, MovingRange, MovingRangeChart, MultipleLinearRegression, NestedGRR, NestedGRRByPartChart, NewtonRaphson, NonlinearRootFinding, NonparametricTesting, ObjectToArray, OutlierTesting, ParameterizedCDF, PlochhammerSymbol, Point, Probability, Product, QQPlot, QQPlotChart, Quartile, Rang, SerializeData, SimpleLinearRegression, Specification, StDev, StandardError, Sum, SumSq, SumSquaredDeviation, TrimmedMean, UnbiasingConstant, Unique, Variance, VarianceComponents };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2
- */
2
+ */
3
3
  declare class Specification {
4
4
  constructor(spec: any, USL?: number, LSL?: number, tolerance?: number, tol_plus?: number, tol_minus?: number, units?: string);
5
5
  nominal: number;
@@ -1211,8 +1211,10 @@ declare const ANOVA: {
1211
1211
  };
1212
1212
  };
1213
1213
  declare const MANOVA: {
1214
+ WilksLambda(responses: any, factors: any, interactions?: any[]): any;
1214
1215
  Report(responses: any, factors: any, interactions?: any[]): any;
1215
- HypothesisMatrix(responses: any, factor: any): void;
1216
+ ErrorMatrix(responses: any, factor: any): any;
1217
+ HypothesisMatrix(responses: any, factor: any): any;
1216
1218
  };
1217
1219
  /**
1218
1220
  * Calculates the average moving range of the array supplied.
@@ -1717,6 +1719,18 @@ declare const OutlierTesting: {
1717
1719
  rejectNull: boolean;
1718
1720
  chart: HTMLCanvasElement;
1719
1721
  };
1722
+ /**
1723
+ * Performs Dixon's Test to test for and identify (if one exists) an outlier. H_0: data has no outliers | H_A: there is one outlier
1724
+ * @param data The array of numbers to evaluate
1725
+ * @param tails OPTIONAL: Whether to perform single or two-tailed Grubbs' Test. DEFAULT = 0: two-tailed | -1: lower tailed (checks if smallest value is an outlier) | 1: upper tailed (checks if largest value is an outlier)
1726
+ * @param alpha OPTIONAL: The significance value to evaluate outliers. DEFAULT = 0.05
1727
+ */
1728
+ Dixon(data: any[], i?: number, j?: number, alpha?: number, name?: string): {
1729
+ test: string;
1730
+ r: number;
1731
+ p: number;
1732
+ chart: HTMLCanvasElement;
1733
+ };
1720
1734
  };
1721
1735
  declare const Probability: {
1722
1736
  Combinations(n: number, r: number): number;
@@ -1890,7 +1904,7 @@ declare function CreateLayeredChart(charts: Chart[], title?: string, chartSettin
1890
1904
  declare function GetFunctionValues(callback: Function, range: number[], count: number): DataSet;
1891
1905
  declare function QQPlotChart(data: number[], distribution?: string): HTMLCanvasElement;
1892
1906
  declare function CreateControlChart(data: number[], chartTitle?: string, UCL?: number, LCL?: number, controlTests?: any): HTMLCanvasElement;
1893
- declare function GeneralizedLinearModel(dependent: number[], factors: any, covariates?: any, interactions?: any[][]): {
1907
+ declare function GeneralizedLinearModel(dependent: number[], factors: any, covariates?: any, interactions?: any[][], simple?: boolean): {
1894
1908
  ANOVA: any;
1895
1909
  Coefficients: {};
1896
1910
  ModelSummary: {
@@ -2276,5 +2290,6 @@ declare function GRRByPartChart(data: GRRData): HTMLCanvasElement;
2276
2290
  declare function NestedGRRByPartChart(data: GRRData): HTMLCanvasElement;
2277
2291
  declare function GRRPartxOperatorChart(data: GRRData): HTMLCanvasElement;
2278
2292
  declare function CompileGRRObject(operators: any, parts: any, measurements: any): GRRData;
2293
+ declare function Unique(values: any[]): any[];
2279
2294
 
2280
- export { ANOMEChartEMP, ANOMRChartEMP, ANOVA, AnovaTableTwoWay, AttributeAgreementAnalysis, AverageMovingRange, AxisSettings, Beta, CanvasDrawSettings, Capability, Chart, ChartSettings, CohenKappa, CompileGRRObject, Correlation, Count, CreateBarChart, CreateBoxPlot, CreateBoxandWhiskerGraph, CreateCapabilityHistogram, CreateCapabilityPlot, CreateCategoricalBarGraph, CreateContinuousBarGraph, CreateControlChart, CreateLayeredChart, CreateMatrixChart, CreateScatterPlot, CreateSplitGraph, CreateStackedChart, CreateSummaryChart, CustomDraw, CustomGridline, CustomGridlines, DataCollection, DataSet, DescriptiveStatistics, Distributions, ERF, EngFont, EquivalenceTesting, EvaluateMeasurementProcess, FixedPointIteration, FleissKappa, G1, G1Graphs, GRR, GRRByPartChart, GRRData, GRRGraphs, GRROperator, GRRPartxOperatorChart, GRRReplication, GageEvaluation, GageLinearityAndBias, Gamma, GeneralizedLinearModel, GetFunctionValues, GetHistogramDataset, GoodnessOfFit, HypothesisTesting, IndividualDistributionIdentification, IndividualDistributionPlots, IndividualValuePlot, LastObservationsChart, Line, MANOVA, Margin, MaximumLikelihoodParameters, Mean, Median, MedianMovingRange, MovingRange, MovingRangeChart, MultipleLinearRegression, NestedGRR, NestedGRRByPartChart, NewtonRaphson, NonlinearRootFinding, NonparametricTesting, ObjectToArray, OutlierTesting, ParameterizedCDF, PlochhammerSymbol, Point, Probability, Product, QQPlot, QQPlotChart, Quartile, Rang, SerializeData, SimpleLinearRegression, Specification, StDev, StandardError, Sum, SumSq, SumSquaredDeviation, TrimmedMean, UnbiasingConstant, Variance, VarianceComponents };
2295
+ export { ANOMEChartEMP, ANOMRChartEMP, ANOVA, AnovaTableTwoWay, AttributeAgreementAnalysis, AverageMovingRange, AxisSettings, Beta, CanvasDrawSettings, Capability, Chart, ChartSettings, CohenKappa, CompileGRRObject, Correlation, Count, CreateBarChart, CreateBoxPlot, CreateBoxandWhiskerGraph, CreateCapabilityHistogram, CreateCapabilityPlot, CreateCategoricalBarGraph, CreateContinuousBarGraph, CreateControlChart, CreateLayeredChart, CreateMatrixChart, CreateScatterPlot, CreateSplitGraph, CreateStackedChart, CreateSummaryChart, CustomDraw, CustomGridline, CustomGridlines, DataCollection, DataSet, DescriptiveStatistics, Distributions, ERF, EngFont, EquivalenceTesting, EvaluateMeasurementProcess, FixedPointIteration, FleissKappa, G1, G1Graphs, GRR, GRRByPartChart, GRRData, GRRGraphs, GRROperator, GRRPartxOperatorChart, GRRReplication, GageEvaluation, GageLinearityAndBias, Gamma, GeneralizedLinearModel, GetFunctionValues, GetHistogramDataset, GoodnessOfFit, HypothesisTesting, IndividualDistributionIdentification, IndividualDistributionPlots, IndividualValuePlot, LastObservationsChart, Line, MANOVA, Margin, MaximumLikelihoodParameters, Mean, Median, MedianMovingRange, MovingRange, MovingRangeChart, MultipleLinearRegression, NestedGRR, NestedGRRByPartChart, NewtonRaphson, NonlinearRootFinding, NonparametricTesting, ObjectToArray, OutlierTesting, ParameterizedCDF, PlochhammerSymbol, Point, Probability, Product, QQPlot, QQPlotChart, Quartile, Rang, SerializeData, SimpleLinearRegression, Specification, StDev, StandardError, Sum, SumSq, SumSquaredDeviation, TrimmedMean, UnbiasingConstant, Unique, Variance, VarianceComponents };
package/dist/index.js CHANGED
@@ -119,6 +119,7 @@ __export(QESuite_exports, {
119
119
  SumSquaredDeviation: () => SumSquaredDeviation,
120
120
  TrimmedMean: () => TrimmedMean,
121
121
  UnbiasingConstant: () => UnbiasingConstant,
122
+ Unique: () => Unique,
122
123
  Variance: () => Variance,
123
124
  VarianceComponents: () => VarianceComponents
124
125
  });
@@ -5586,7 +5587,7 @@ var ANOVA = {
5586
5587
  let rp = ANOVA.PostHoc.Duncan.Rp(treatmentNumber, DFE);
5587
5588
  let Rp = rp * S_x;
5588
5589
  returnArray.push({
5589
- treatment: infoArray[i].treatment,
5590
+ Treatment: infoArray[i].treatment,
5590
5591
  Mean: infoArray[i].Mean,
5591
5592
  Rp,
5592
5593
  D: infoArray[i].Mean - Rp,
@@ -5711,8 +5712,8 @@ var ANOVA = {
5711
5712
  let diff = infoArray[i].Mean - infoArray[rev].Mean;
5712
5713
  let t = diff / Math.sqrt(MSE * (1 / infoArray[i].N + 1 / infoArray[rev].N));
5713
5714
  returnArray.push({
5714
- name: `${infoArray[i].treatment} - ${infoArray[rev].treatment}`,
5715
- meanDifference: diff,
5715
+ Name: `${infoArray[i].treatment} - ${infoArray[rev].treatment}`,
5716
+ MeanDifference: diff,
5716
5717
  T: t,
5717
5718
  LSD: tCrit * Math.sqrt(MSE * (1 / infoArray[i].N + 1 / infoArray[rev].N)),
5718
5719
  p: 2 * Distributions.T.RightTail(t, DFE)
@@ -5738,7 +5739,7 @@ var ANOVA = {
5738
5739
  let mean = Mean(data[key]);
5739
5740
  let tCrit = q_prime * Math.sqrt(MSE / n);
5740
5741
  returnArray.push({
5741
- treatment: key,
5742
+ Treatment: key,
5742
5743
  N: n,
5743
5744
  Mean: mean,
5744
5745
  T: tCrit,
@@ -6628,6 +6629,73 @@ var ANOVA = {
6628
6629
  }
6629
6630
  };
6630
6631
  var MANOVA = {
6632
+ WilksLambda(responses, factors, interactions = []) {
6633
+ let rKeys = Object.keys(responses);
6634
+ let fKeys = Object.keys(factors);
6635
+ let coefficientCount = Sum(fKeys.map((k) => {
6636
+ return Unique(factors[k]).length;
6637
+ })) - 1 + interactions.length;
6638
+ let dfError = responses[rKeys[0]].length - coefficientCount - 1;
6639
+ let varTerms = [...fKeys];
6640
+ let p = rKeys.length;
6641
+ let v = dfError;
6642
+ let returner = [];
6643
+ fKeys.map((fk) => {
6644
+ let factor = factors[fk];
6645
+ let q = Unique(factor).length - 1;
6646
+ let E = MANOVA.ErrorMatrix(responses, factor);
6647
+ let H = MANOVA.HypothesisMatrix(responses, factor);
6648
+ let lambda = Matrix.Determinant(E) / Matrix.Determinant(Matrix.Sum(H, E));
6649
+ let m = 0.5 * (Math.abs(p - 1) - 1);
6650
+ let s = Math.min(p, 1);
6651
+ let u = 0.25 * (p * q - 2);
6652
+ let n = 0.5 * (v - p - 1);
6653
+ let r = v - 0.5 * (p - q + 1);
6654
+ let t = Math.pow(p, 2) + Math.pow(q, 2) - 5 > 0 ? Math.sqrt((Math.pow(p, 2) * Math.pow(q, 2) - 4) / (Math.pow(p, 2) + Math.pow(q, 2) - 5)) : 1;
6655
+ let f = (1 - Math.pow(lambda, 1 / t)) / Math.pow(lambda, 1 / t) * (r * t - 2 * u) / (p * q);
6656
+ let denDF = r * t - 2 * u;
6657
+ let numDF = p * q;
6658
+ returner.push({
6659
+ DenominatorDF: denDF,
6660
+ F: f,
6661
+ Factor: fk,
6662
+ Lambda: lambda,
6663
+ NumeratorDF: numDF,
6664
+ p: Distributions.F.RightTail(f, denDF, numDF)
6665
+ });
6666
+ });
6667
+ interactions.forEach((int) => {
6668
+ let factor = [];
6669
+ for (let i = 0; i < responses[rKeys[0]].length; i++) {
6670
+ factor.push(int.map((inter) => {
6671
+ return factors[inter][i];
6672
+ }).join("*"));
6673
+ }
6674
+ console.log(factor);
6675
+ let q = Unique(factor).length - 1;
6676
+ let E = MANOVA.ErrorMatrix(responses, factor);
6677
+ let H = MANOVA.HypothesisMatrix(responses, factor);
6678
+ let lambda = Matrix.Determinant(E) / Matrix.Determinant(Matrix.Sum(H, E));
6679
+ let m = 0.5 * (Math.abs(p - 1) - 1);
6680
+ let s = Math.min(p, 1);
6681
+ let u = 0.25 * (p * q - 2);
6682
+ let n = 0.5 * (v - p - 1);
6683
+ let r = v - 0.5 * (p - q + 1);
6684
+ let t = Math.pow(p, 2) + Math.pow(q, 2) - 5 > 0 ? Math.sqrt((Math.pow(p, 2) * Math.pow(q, 2) - 4) / (Math.pow(p, 2) + Math.pow(q, 2) - 5)) : 1;
6685
+ let f = (1 - Math.pow(lambda, 1 / t)) / Math.pow(lambda, 1 / t) * (r * t - 2 * u) / (p * q);
6686
+ let denDF = r * t - 2 * u;
6687
+ let numDF = p * q;
6688
+ returner.push({
6689
+ DenominatorDF: denDF,
6690
+ F: f,
6691
+ Factor: int.join("*"),
6692
+ Lambda: lambda,
6693
+ NumeratorDF: numDF,
6694
+ p: Distributions.F.RightTail(f, denDF, numDF)
6695
+ });
6696
+ });
6697
+ return returner;
6698
+ },
6631
6699
  Report(responses, factors, interactions = []) {
6632
6700
  let returner = [];
6633
6701
  let rKeys = Object.keys(responses);
@@ -6647,7 +6715,6 @@ var MANOVA = {
6647
6715
  let u = 0.25 * (p * q - 2);
6648
6716
  let m = 0.5 * (Math.abs(p - q) - 1);
6649
6717
  let n = 0.5 * (v - p - 1);
6650
- console.log({ m, n, p, q, r, s, t, u, v });
6651
6718
  let TotalMatrix = Matrix.New(p, p);
6652
6719
  let ErrorMatrix = Matrix.New(p, p);
6653
6720
  Matrix.Fill(ErrorMatrix, 0);
@@ -6674,6 +6741,7 @@ var MANOVA = {
6674
6741
  let factorSSCP = Matrix.Multiply(Matrix.Transpose(rDevMatrix), rDevMatrix);
6675
6742
  ErrorMatrix = Matrix.Sum(ErrorMatrix, factorSSCP);
6676
6743
  });
6744
+ console.log({ DeviationMatrix, nMatrix });
6677
6745
  let devXn = Matrix.Scale(DeviationMatrix, nMatrix);
6678
6746
  let HypothesisMatrix = Matrix.Multiply(Matrix.Transpose(DeviationMatrix), devXn);
6679
6747
  console.log({ HypothesisMatrix, ErrorMatrix });
@@ -6736,7 +6804,49 @@ var MANOVA = {
6736
6804
  });
6737
6805
  return returner;
6738
6806
  },
6807
+ ErrorMatrix(responses, factor) {
6808
+ let factorLevels = Unique(factor);
6809
+ let errorMatrix = Matrix.New(Object.keys(responses).length, Object.keys(responses).length);
6810
+ Matrix.Fill(errorMatrix, 0);
6811
+ factorLevels.forEach((lv, lvi) => {
6812
+ let nResponses = factor.filter((f) => f == lv).length;
6813
+ let filteredResponses = {};
6814
+ let responseMeans = {};
6815
+ Object.keys(responses).forEach((k) => {
6816
+ let subgroup = responses[k].filter((r, ri) => factor[ri] == lv);
6817
+ filteredResponses[k] = subgroup;
6818
+ responseMeans[k] = Mean(subgroup);
6819
+ });
6820
+ let treatmentMatrix = Matrix.New(nResponses, Object.keys(responses).length);
6821
+ let deviationMatrix = Matrix.New(nResponses, Object.keys(responses).length);
6822
+ for (let i = 0; i < nResponses; i++) {
6823
+ Object.keys(responses).forEach((k, ki) => {
6824
+ treatmentMatrix[i][ki] = filteredResponses[k][i];
6825
+ deviationMatrix[i][ki] = filteredResponses[k][i] - responseMeans[k];
6826
+ });
6827
+ }
6828
+ let SSCP = Matrix.Multiply(Matrix.Transpose(deviationMatrix), treatmentMatrix);
6829
+ errorMatrix = Matrix.Sum(errorMatrix, SSCP);
6830
+ });
6831
+ return errorMatrix;
6832
+ },
6739
6833
  HypothesisMatrix(responses, factor) {
6834
+ let factorGroups = Unique(factor);
6835
+ let responseMeans = {};
6836
+ let deviationMatrix = Matrix.New(factorGroups.length, Object.keys(responses).length);
6837
+ let nMatrix = Matrix.New(factorGroups.length, Object.keys(responses).length);
6838
+ Object.keys(responses).forEach((k, ki) => {
6839
+ let responseMean = Mean(responses[k]);
6840
+ responseMeans[k] = responseMean;
6841
+ factorGroups.forEach((g, gi) => {
6842
+ let subgroup = responses[k].filter((d, di) => factor[di] == g);
6843
+ deviationMatrix[gi][ki] = Mean(subgroup) - responseMean;
6844
+ nMatrix[gi][ki] = subgroup.length;
6845
+ });
6846
+ });
6847
+ let devXn = Matrix.Scale(deviationMatrix, nMatrix);
6848
+ let hypothesisMatrix = Matrix.Multiply(Matrix.Transpose(deviationMatrix), devXn);
6849
+ return hypothesisMatrix;
6740
6850
  }
6741
6851
  };
6742
6852
  function AverageMovingRange(data, w = 2) {
@@ -8211,6 +8321,54 @@ var OutlierTesting = {
8211
8321
  rejectNull: p <= alpha,
8212
8322
  chart: outlierPlot
8213
8323
  };
8324
+ },
8325
+ /**
8326
+ * Performs Dixon's Test to test for and identify (if one exists) an outlier. H_0: data has no outliers | H_A: there is one outlier
8327
+ * @param data The array of numbers to evaluate
8328
+ * @param tails OPTIONAL: Whether to perform single or two-tailed Grubbs' Test. DEFAULT = 0: two-tailed | -1: lower tailed (checks if smallest value is an outlier) | 1: upper tailed (checks if largest value is an outlier)
8329
+ * @param alpha OPTIONAL: The significance value to evaluate outliers. DEFAULT = 0.05
8330
+ */
8331
+ Dixon(data, i = 1, j = 0, alpha = 0.05, name) {
8332
+ let y = [...data].sort((a, b) => a - b);
8333
+ let n = y.length;
8334
+ let r_ij = Math.max((y[i] - y[0]) / (y[n - 1 - j] - y[0]), (y[n - 1] - y[n - 1 - i]) / (y[n - 1] - y[j]));
8335
+ let C = Probability.Factorialize(n) * Math.pow(2 * Math.PI, -3 / 2) / (Probability.Factorialize(j) * Probability.Factorialize(n - i - j - 2) * Probability.Factorialize(i - 1));
8336
+ const j_xvr = (x, v, r) => {
8337
+ };
8338
+ const t = (r, v) => {
8339
+ return (1 + Math.pow(r, 2)) * Math.pow(v, 2) / 2;
8340
+ };
8341
+ const u2 = (x) => {
8342
+ return 3 * Math.pow(x, 2) / 2;
8343
+ };
8344
+ let p = NaN;
8345
+ let outliers = [];
8346
+ if (p <= alpha) {
8347
+ if ((y[i] - y[0]) / (y[n - 1 - j] - y[0]) > (y[n - 1] - y[n - 1 - i]) / (y[n - 1] - y[j])) {
8348
+ outliers = [{ i: data.findIndex((d) => d == y[0]), value: y[0] }];
8349
+ } else {
8350
+ outliers = [{ i: data.findIndex((d) => d == y[n - 1]), value: y[n - 1] }];
8351
+ }
8352
+ }
8353
+ let plotData = data.map((d, i2) => {
8354
+ if (outliers.findIndex((o) => o.i == i2) >= 0) {
8355
+ return new Point(d, 1, new CanvasDrawSettings("red", "red", 1, 1));
8356
+ } else {
8357
+ return new Point(d, 1, new CanvasDrawSettings("#2183b2", "#2183b2"));
8358
+ }
8359
+ });
8360
+ let plotSettings = new ChartSettings();
8361
+ plotSettings.axis.y = new AxisSettings(0, 2);
8362
+ plotSettings.axis.y.showAutoGridlines = false;
8363
+ plotSettings.axis.y.customGridlines = [new CustomGridline(1)];
8364
+ let title = name ? `Outlier Plot of ${name}` : `Outlier Plot`;
8365
+ let outlierPlot = CreateScatterPlot([new DataSet(plotData)], title, plotSettings);
8366
+ return {
8367
+ test: i == 1 && j == 0 ? "Dixon's Q" : `Dixon's r${i}${j}`,
8368
+ r: r_ij,
8369
+ p,
8370
+ chart: outlierPlot
8371
+ };
8214
8372
  }
8215
8373
  };
8216
8374
  var Probability = {
@@ -8540,7 +8698,7 @@ var UnbiasingConstant = {
8540
8698
  return 3.4873 + 0.0250141 * N - 9823e-8 * Math.pow(N, 2);
8541
8699
  },
8542
8700
  D2prime(g, m) {
8543
- let d2PrimeTable = [];
8701
+ let d2PrimeTable = [[{ "df": 1, "d2": 1.41421 }, { "df": 2, "d2": 1.91155 }, { "df": 2.9, "d2": 2.23887 }, { "df": 3.8, "d2": 2.48124 }, { "df": 4.7, "d2": 2.67253 }, { "df": 5.5, "d2": 2.82981 }, { "df": 6.3, "d2": 2.96288 }, { "df": 7, "d2": 3.07794 }, { "df": 7.7, "d2": 3.17905 }, { "df": 8.3, "d2": 3.26909 }, { "df": 9, "d2": 3.35016 }, { "df": 9.6, "d2": 3.42378 }, { "df": 10.2, "d2": 3.49116 }, { "df": 10.8, "d2": 3.55333 }, { "df": 11.3, "d2": 3.61071 }, { "df": 11.9, "d2": 3.66422 }, { "df": 12.4, "d2": 3.71424 }, { "df": 12.9, "d2": 3.76118 }, { "df": 13.4, "d2": 3.80537 }], [{ "df": 1.9, "d2": 1.27931 }, { "df": 3.8, "d2": 1.80538 }, { "df": 5.7, "d2": 2.15069 }, { "df": 7.5, "d2": 2.40484 }, { "df": 9.2, "d2": 2.60438 }, { "df": 10.8, "d2": 2.76779 }, { "df": 12.3, "d2": 2.90562 }, { "df": 13.8, "d2": 3.02446 }, { "df": 15.1, "d2": 3.12869 }, { "df": 16.5, "d2": 3.22134 }, { "df": 17.8, "d2": 3.30463 }, { "df": 19, "d2": 3.38017 }, { "df": 20.2, "d2": 3.44922 }, { "df": 21.3, "d2": 3.51287 }, { "df": 22.4, "d2": 3.57156 }, { "df": 23.5, "d2": 3.62625 }, { "df": 24.5, "d2": 3.67734 }, { "df": 25.5, "d2": 3.72524 }, { "df": 26.5, "d2": 3.77032 }], [{ "df": 2.8, "d2": 1.23105 }, { "df": 5.7, "d2": 1.76858 }, { "df": 8.4, "d2": 2.12049 }, { "df": 11.1, "d2": 2.37883 }, { "df": 13.6, "d2": 2.58127 }, { "df": 16, "d2": 2.74681 }, { "df": 18.3, "d2": 2.88628 }, { "df": 20.5, "d2": 3.00643 }, { "df": 22.6, "d2": 3.11173 }, { "df": 24.6, "d2": 3.20526 }, { "df": 26.5, "d2": 3.28931 }, { "df": 28.4, "d2": 3.3655 }, { "df": 30.1, "d2": 3.43512 }, { "df": 31.9, "d2": 3.49927 }, { "df": 33.5, "d2": 3.55842 }, { "df": 35.1, "d2": 3.61351 }, { "df": 36.7, "d2": 3.66495 }, { "df": 38.2, "d2": 3.71319 }, { "df": 39.7, "d2": 3.75857 }], [{ "df": 3.7, "d2": 1.20621 }, { "df": 7.5, "d2": 1.74989 }, { "df": 11.2, "d2": 2.10522 }, { "df": 14.7, "d2": 2.36571 }, { "df": 18.1, "d2": 2.56964 }, { "df": 21.3, "d2": 2.73626 }, { "df": 24.4, "d2": 2.87656 }, { "df": 27.3, "d2": 2.99737 }, { "df": 30.1, "d2": 3.10321 }, { "df": 32.7, "d2": 3.1972 }, { "df": 35.3, "d2": 3.28163 }, { "df": 37.7, "d2": 3.35815 }, { "df": 40.1, "d2": 3.42805 }, { "df": 42.4, "d2": 3.49246 }, { "df": 44.6, "d2": 3.55183 }, { "df": 46.7, "d2": 3.60712 }, { "df": 48.8, "d2": 3.65875 }, { "df": 50.8, "d2": 3.70715 }, { "df": 52.8, "d2": 3.75268 }], [{ "df": 4.6, "d2": 1.19105 }, { "df": 9.3, "d2": 1.73857 }, { "df": 13.9, "d2": 2.09601 }, { "df": 18.4, "d2": 2.35781 }, { "df": 22.6, "d2": 2.56263 }, { "df": 26.6, "d2": 2.72991 }, { "df": 30.4, "d2": 2.87071 }, { "df": 34, "d2": 2.99192 }, { "df": 37.5, "d2": 3.09808 }, { "df": 40.8, "d2": 3.19235 }, { "df": 44, "d2": 3.27701 }, { "df": 47.1, "d2": 3.35372 }, { "df": 50.1, "d2": 3.42381 }, { "df": 52.9, "d2": 3.48836 }, { "df": 55.7, "d2": 3.54787 }, { "df": 58.4, "d2": 3.60328 }, { "df": 61, "d2": 3.65502 }, { "df": 63.5, "d2": 3.70352 }, { "df": 65.9, "d2": 3.74914 }], [{ "df": 5.5, "d2": 1.18083 }, { "df": 11.1, "d2": 1.73099 }, { "df": 16.7, "d2": 2.08985 }, { "df": 22, "d2": 2.35253 }, { "df": 27, "d2": 2.55795 }, { "df": 31.8, "d2": 2.72567 }, { "df": 36.4, "d2": 2.8668 }, { "df": 40.8, "d2": 2.98829 }, { "df": 45, "d2": 3.09467 }, { "df": 49, "d2": 3.18911 }, { "df": 52.8, "d2": 3.27392 }, { "df": 56.5, "d2": 3.35077 }, { "df": 60.1, "d2": 3.42097 }, { "df": 63.5, "d2": 3.48563 }, { "df": 66.8, "d2": 3.54522 }, { "df": 70, "d2": 3.60072 }, { "df": 73.1, "d2": 3.65253 }, { "df": 76.1, "d2": 3.70109 }, { "df": 79.1, "d2": 3.74678 }], [{ "df": 6.4, "d2": 1.17348 }, { "df": 12.9, "d2": 1.72555 }, { "df": 19.4, "d2": 2.08543 }, { "df": 25.6, "d2": 2.34875 }, { "df": 31.5, "d2": 2.5546 }, { "df": 37.1, "d2": 2.72263 }, { "df": 42.5, "d2": 2.86401 }, { "df": 47.6, "d2": 2.98568 }, { "df": 52.4, "d2": 3.09222 }, { "df": 57.1, "d2": 3.18679 }, { "df": 61.6, "d2": 3.27172 }, { "df": 65.9, "d2": 3.34866 }, { "df": 70, "d2": 3.41894 }, { "df": 74, "d2": 3.48368 }, { "df": 77.9, "d2": 3.54333 }, { "df": 81.6, "d2": 3.59888 }, { "df": 85.3, "d2": 3.65075 }, { "df": 88.8, "d2": 3.69936 }, { "df": 92.2, "d2": 3.74509 }], [{ "df": 7.2, "d2": 1.16794 }, { "df": 14.8, "d2": 1.72147 }, { "df": 22.1, "d2": 2.08212 }, { "df": 29.2, "d2": 2.34591 }, { "df": 36, "d2": 2.55208 }, { "df": 42.4, "d2": 2.72036 }, { "df": 48.5, "d2": 2.86192 }, { "df": 54.3, "d2": 2.98373 }, { "df": 59.9, "d2": 3.09039 }, { "df": 65.2, "d2": 3.18506 }, { "df": 70.3, "d2": 3.27006 }, { "df": 75.2, "d2": 3.34708 }, { "df": 80, "d2": 3.41742 }, { "df": 84.6, "d2": 3.48221 }, { "df": 89, "d2": 3.54192 }, { "df": 93.3, "d2": 3.59751 }, { "df": 97.4, "d2": 3.64941 }, { "df": 101.4, "d2": 3.69806 }, { "df": 105.3, "d2": 3.74382 }], [{ "df": 8.1, "d2": 1.16361 }, { "df": 16.6, "d2": 1.71828 }, { "df": 24.9, "d2": 2.07953 }, { "df": 32.9, "d2": 2.3437 }, { "df": 40.4, "d2": 2.55013 }, { "df": 47.7, "d2": 2.71858 }, { "df": 54.5, "d2": 2.86028 }, { "df": 61.1, "d2": 2.98221 }, { "df": 67.3, "d2": 3.08896 }, { "df": 73.3, "d2": 3.1837 }, { "df": 79.1, "d2": 3.26878 }, { "df": 84.6, "d2": 3.34585 }, { "df": 90, "d2": 3.41624 }, { "df": 95.1, "d2": 3.48107 }, { "df": 100.1, "d2": 3.54081 }, { "df": 104.9, "d2": 3.59644 }, { "df": 109.5, "d2": 3.64838 }, { "df": 114.1, "d2": 3.69705 }, { "df": 118.5, "d2": 3.74284 }], [{ "df": 9, "d2": 1.16014 }, { "df": 18.4, "d2": 1.71573 }, { "df": 27.6, "d2": 2.07746 }, { "df": 36.5, "d2": 2.34192 }, { "df": 44.9, "d2": 2.54856 }, { "df": 52.9, "d2": 2.71717 }, { "df": 60.6, "d2": 2.85898 }, { "df": 67.8, "d2": 2.981 }, { "df": 74.8, "d2": 3.08781 }, { "df": 81.5, "d2": 3.18262 }, { "df": 87.9, "d2": 3.26775 }, { "df": 94, "d2": 3.34486 }, { "df": 99.9, "d2": 3.41529 }, { "df": 105.6, "d2": 3.48016 }, { "df": 111.2, "d2": 3.53993 }, { "df": 116.5, "d2": 3.59559 }, { "df": 121.7, "d2": 3.64755 }, { "df": 126.7, "d2": 3.69625 }, { "df": 131.6, "d2": 3.74205 }], [{ "df": 9.9, "d2": 1.15729 }, { "df": 20.2, "d2": 1.71363 }, { "df": 30.4, "d2": 2.07577 }, { "df": 40.1, "d2": 2.34048 }, { "df": 49.4, "d2": 2.54728 }, { "df": 58.2, "d2": 2.716 }, { "df": 66.6, "d2": 2.85791 }, { "df": 74.6, "d2": 2.98 }, { "df": 82.2, "d2": 3.08688 }, { "df": 89.6, "d2": 3.18174 }, { "df": 96.6, "d2": 3.2669 }, { "df": 103.4, "d2": 3.34406 }, { "df": 109.9, "d2": 3.41452 }, { "df": 116.2, "d2": 3.47941 }, { "df": 122.3, "d2": 3.53921 }, { "df": 128.1, "d2": 3.59489 }, { "df": 133.8, "d2": 3.64687 }, { "df": 139.4, "d2": 3.69558 }, { "df": 144.7, "d2": 3.74141 }], [{ "df": 10.7, "d2": 1.1549 }, { "df": 22, "d2": 1.71189 }, { "df": 33.1, "d2": 2.07436 }, { "df": 43.7, "d2": 2.33927 }, { "df": 53.8, "d2": 2.54621 }, { "df": 63.5, "d2": 2.71504 }, { "df": 72.6, "d2": 2.85702 }, { "df": 81.3, "d2": 2.97917 }, { "df": 89.7, "d2": 3.0861 }, { "df": 97.7, "d2": 3.181 }, { "df": 105.4, "d2": 3.2662 }, { "df": 112.7, "d2": 3.34339 }, { "df": 119.9, "d2": 3.41387 }, { "df": 126.7, "d2": 3.47879 }, { "df": 133.3, "d2": 3.53861 }, { "df": 139.8, "d2": 3.5943 }, { "df": 146, "d2": 3.6463 }, { "df": 152, "d2": 3.69503 }, { "df": 157.9, "d2": 3.74087 }], [{ "df": 11.6, "d2": 1.15289 }, { "df": 23.8, "d2": 1.71041 }, { "df": 35.8, "d2": 2.07316 }, { "df": 47.3, "d2": 2.33824 }, { "df": 58.3, "d2": 2.5453 }, { "df": 68.7, "d2": 2.71422 }, { "df": 78.6, "d2": 2.85627 }, { "df": 88.1, "d2": 2.97847 }, { "df": 97.1, "d2": 3.08544 }, { "df": 105.8, "d2": 3.18037 }, { "df": 114.1, "d2": 3.26561 }, { "df": 122.1, "d2": 3.34282 }, { "df": 129.8, "d2": 3.41333 }, { "df": 137.3, "d2": 3.47826 }, { "df": 144.4, "d2": 3.5381 }, { "df": 151.4, "d2": 3.59381 }, { "df": 158.1, "d2": 3.64582 }, { "df": 164.7, "d2": 3.69457 }, { "df": 171, "d2": 3.74041 }], [{ "df": 12.5, "d2": 1.15115 }, { "df": 25.7, "d2": 1.70914 }, { "df": 38.6, "d2": 2.07213 }, { "df": 51, "d2": 2.33737 }, { "df": 62.8, "d2": 2.54452 }, { "df": 74, "d2": 2.71351 }, { "df": 84.7, "d2": 2.85562 }, { "df": 94.9, "d2": 2.97787 }, { "df": 104.6, "d2": 3.08487 }, { "df": 113.9, "d2": 3.17984 }, { "df": 122.9, "d2": 3.2651 }, { "df": 131.5, "d2": 3.34233 }, { "df": 139.8, "d2": 3.41286 }, { "df": 147.8, "d2": 3.47781 }, { "df": 155.5, "d2": 3.53766 }, { "df": 163, "d2": 3.59339 }, { "df": 170.3, "d2": 3.64541 }, { "df": 177.3, "d2": 3.69417 }, { "df": 184.2, "d2": 3.74002 }], [{ "df": 13.4, "d2": 1.14965 }, { "df": 27.5, "d2": 1.70804 }, { "df": 41.3, "d2": 2.07125 }, { "df": 54.6, "d2": 2.33661 }, { "df": 67.2, "d2": 2.54385 }, { "df": 79.3, "d2": 2.7129 }, { "df": 90.7, "d2": 2.85506 }, { "df": 101.6, "d2": 2.97735 }, { "df": 112.1, "d2": 3.08438 }, { "df": 122.1, "d2": 3.17938 }, { "df": 131.7, "d2": 3.26465 }, { "df": 140.9, "d2": 3.34191 }, { "df": 149.8, "d2": 3.41245 }, { "df": 158.3, "d2": 3.47742 }, { "df": 166.6, "d2": 3.53728 }, { "df": 174.6, "d2": 3.59302 }, { "df": 182.4, "d2": 3.64505 }, { "df": 190, "d2": 3.69382 }, { "df": 197.3, "d2": 3.73969 }], [{ "df": 14.3, "d2": 1.14833 }, { "df": 29.3, "d2": 1.70708 }, { "df": 44.1, "d2": 2.07047 }, { "df": 58.2, "d2": 2.33594 }, { "df": 71.7, "d2": 2.54326 }, { "df": 84.5, "d2": 2.71237 }, { "df": 96.7, "d2": 2.85457 }, { "df": 108.4, "d2": 2.97689 }, { "df": 119.5, "d2": 3.08395 }, { "df": 130.2, "d2": 3.17897 }, { "df": 140.4, "d2": 3.26427 }, { "df": 150.2, "d2": 3.34154 }, { "df": 159.7, "d2": 3.4121 }, { "df": 168.9, "d2": 3.47707 }, { "df": 177.7, "d2": 3.53695 }, { "df": 186.3, "d2": 3.5927 }, { "df": 194.6, "d2": 3.64474 }, { "df": 202.6, "d2": 3.69351 }, { "df": 210.4, "d2": 3.73939 }], [{ "df": 15.1, "d2": 1.14717 }, { "df": 31.1, "d2": 1.70623 }, { "df": 46.8, "d2": 2.06978 }, { "df": 61.8, "d2": 2.33535 }, { "df": 76.2, "d2": 2.54274 }, { "df": 89.8, "d2": 2.7119 }, { "df": 102.8, "d2": 2.85413 }, { "df": 115.1, "d2": 2.97649 }, { "df": 127, "d2": 3.08358 }, { "df": 138.3, "d2": 3.17861 }, { "df": 149.2, "d2": 3.26393 }, { "df": 159.6, "d2": 3.34121 }, { "df": 169.7, "d2": 3.41178 }, { "df": 179.4, "d2": 3.47677 }, { "df": 188.8, "d2": 3.53666 }, { "df": 197.9, "d2": 3.59242 }, { "df": 206.7, "d2": 3.64447 }, { "df": 215.2, "d2": 3.69325 }, { "df": 223.6, "d2": 3.73913 }], [{ "df": 16, "d2": 1.14613 }, { "df": 32.9, "d2": 1.70547 }, { "df": 49.5, "d2": 2.06917 }, { "df": 65.5, "d2": 2.33483 }, { "df": 80.6, "d2": 2.54228 }, { "df": 95.1, "d2": 2.71148 }, { "df": 108.8, "d2": 2.85375 }, { "df": 121.9, "d2": 2.97613 }, { "df": 134.4, "d2": 3.08324 }, { "df": 146.4, "d2": 3.17829 }, { "df": 157.9, "d2": 3.26362 }, { "df": 169, "d2": 3.34092 }, { "df": 179.7, "d2": 3.4115 }, { "df": 190, "d2": 3.4765 }, { "df": 199.9, "d2": 3.5364 }, { "df": 209.5, "d2": 3.59216 }, { "df": 218.8, "d2": 3.64422 }, { "df": 227.9, "d2": 3.69301 }, { "df": 236.7, "d2": 3.7389 }], [{ "df": 16.9, "d2": 1.1452 }, { "df": 34.7, "d2": 1.7048 }, { "df": 52.3, "d2": 2.06862 }, { "df": 69.1, "d2": 2.33436 }, { "df": 85.1, "d2": 2.54187 }, { "df": 100.3, "d2": 2.71111 }, { "df": 114.8, "d2": 2.85341 }, { "df": 128.7, "d2": 2.97581 }, { "df": 141.9, "d2": 3.08294 }, { "df": 154.5, "d2": 3.17801 }, { "df": 166.7, "d2": 3.26335 }, { "df": 178.4, "d2": 3.34066 }, { "df": 189.6, "d2": 3.41125 }, { "df": 200.5, "d2": 3.47626 }, { "df": 211, "d2": 3.53617 }, { "df": 221.1, "d2": 3.59194 }, { "df": 231, "d2": 3.644 }, { "df": 240.5, "d2": 3.6928 }, { "df": 249.8, "d2": 3.73869 }], [{ "df": 17.8, "d2": 1.14437 }, { "df": 36.5, "d2": 1.70419 }, { "df": 55, "d2": 2.06813 }, { "df": 72.7, "d2": 2.33394 }, { "df": 89.6, "d2": 2.54149 }, { "df": 105.6, "d2": 2.71077 }, { "df": 120.9, "d2": 2.8531 }, { "df": 135.4, "d2": 2.97552 }, { "df": 149.3, "d2": 3.08267 }, { "df": 162.7, "d2": 3.17775 }, { "df": 175.5, "d2": 3.26311 }, { "df": 187.8, "d2": 3.34042 }, { "df": 199.6, "d2": 3.41103 }, { "df": 211, "d2": 3.47605 }, { "df": 222.1, "d2": 3.53596 }, { "df": 232.8, "d2": 3.59174 }, { "df": 243.1, "d2": 3.6438 }, { "df": 253.2, "d2": 3.6926 }, { "df": 263, "d2": 3.7385 }]];
8544
8702
  if (g > 20) {
8545
8703
  let d2s = [1.12838, 0.69257, 2.05875, 2.32593, 2.53441, 2.70436, 2.8472, 2.97003, 3.07751, 3.17287, 3.25845, 3.33598, 3.40676, 3.47193, 3.53198, 3.58788, 3.64006, 3.68896, 3.735];
8546
8704
  let cds = [0.876, 1.815, 2.7378, 3.623, 4.4658, 5.2673, 6.0305, 6.7582, 7.4539, 8.1207, 8.7602, 9.3751, 9.9679, 10.5396, 11.0913, 11.6259, 12.144, 12.6468, 13.1362];
@@ -10170,6 +10328,8 @@ function QQPlotChart(data, distribution = "Normal") {
10170
10328
  ];
10171
10329
  chartSettings.axis.y.customGridlines = customGridlines;
10172
10330
  chartSettings.axis.y.showAutoGridlines = false;
10331
+ chartSettings.width += 100;
10332
+ chartSettings.margins.right += 100;
10173
10333
  if (distribution.toLowerCase().includes("exponential")) {
10174
10334
  chartSettings.axis.x.max = 100;
10175
10335
  chartSettings.axis.x.min = 0.1;
@@ -10255,7 +10415,7 @@ function QQPlotChart(data, distribution = "Normal") {
10255
10415
  { key: "SW(R):", value: SWR.W },
10256
10416
  { key: "p-value:", value: SWR.p },
10257
10417
  { key: "", value: "" }
10258
- ], 1075, 50, 175, 100, "", 30);
10418
+ ], chartSettings.width - chartSettings.margins.right + 50, 50, chartSettings.margins.right - 50, 100, "", 30, new EngFont("black", "Calibri", "28px"));
10259
10419
  }
10260
10420
  } else {
10261
10421
  let dist = distribution.replace("-", "").replace("arameter", "").replace(/\s/g, "");
@@ -10265,7 +10425,7 @@ function QQPlotChart(data, distribution = "Normal") {
10265
10425
  let AD = GoodnessOfFit.AndersonDarling.Test(data, dist);
10266
10426
  let ctx = chart.getContext("2d");
10267
10427
  if (ctx && (AD.AD || AD.AD === Infinity || Number.isNaN(AD.AD)) && (AD.p || AD.p === Infinity || Number.isNaN(AD.p))) {
10268
- AddInfoTable(ctx, [{ key: "AD:", value: AD.AD }, { key: "p-value:", value: AD.p }], 1075, 150, 175, 100, "", 30);
10428
+ AddInfoTable(ctx, [{ key: "AD:", value: AD.AD }, { key: "p-value:", value: AD.p }], chartSettings.width - chartSettings.margins.right + 50, 175, chartSettings.margins.right - 50, 100, "", 30, new EngFont("black", "Calibri", "28px"));
10269
10429
  }
10270
10430
  }
10271
10431
  return chart;
@@ -10338,7 +10498,7 @@ function FactorCode(level, factorLevels) {
10338
10498
  let centered = zeroBased - factorLevels.length / 2 + 0.5;
10339
10499
  return centered;
10340
10500
  }
10341
- function GeneralizedLinearModel(dependent, factors, covariates = {}, interactions = []) {
10501
+ function GeneralizedLinearModel(dependent, factors, covariates = {}, interactions = [], simple) {
10342
10502
  let refactored = { ...covariates };
10343
10503
  let unfactored = { ...covariates, ...factors };
10344
10504
  let refactoredWLevels = { ...covariates };
@@ -11403,8 +11563,8 @@ function BiasVsReferencePlot(biasAndLinearity, parts, referenceValues, responses
11403
11563
  let biasInfo = [];
11404
11564
  if (biasAndLinearity.GageLinearity.Linearity) {
11405
11565
  modelInfo.push(["Linearity", RoundDigits(biasAndLinearity.GageLinearity.Linearity, 6), "%Linearity", RoundDigits(biasAndLinearity.GageLinearity.PercentLinearity * 100, 2) + "%"]);
11406
- biasInfo = [["Reference Value", "Bias", "%Bias"], ...biasAndLinearity.GageBias.map((d) => {
11407
- return [RoundDigits(d.ReferenceValue, 6, true), RoundDigits(d.Bias, 6), RoundDigits(d.PercentBias * 100, 2)];
11566
+ biasInfo = [["Reference Value", "Bias", "%Bias", "P"], ...biasAndLinearity.GageBias.map((d) => {
11567
+ return [RoundDigits(d.ReferenceValue, 6, true), RoundDigits(d.Bias, 6), RoundDigits(d.PercentBias * 100, 2), RoundDigits(d.p, 3)];
11408
11568
  })];
11409
11569
  let miniX = chartSettings.width - chartSettings.margins.right + 75;
11410
11570
  let miniW = chartSettings.margins.right - 125;
@@ -11639,24 +11799,23 @@ function GageLinearityAndBias(parts, referenceValues, responses, processVariatio
11639
11799
  let bias = Sum(biases) / n2;
11640
11800
  let avgMeasure = Mean(measurements);
11641
11801
  let t = NaN;
11802
+ let { d2, df } = UnbiasingConstant.D2prime(n2, Object.keys(byParts).length);
11642
11803
  if (useStDevMethod) {
11643
11804
  let \u03C3 = Math.sqrt(SumSq(measurements.map((d) => {
11644
11805
  return d - avgMeasure;
11645
11806
  })) / (n2 - 1));
11646
11807
  t = bias / (\u03C3 / Math.sqrt(n2));
11647
11808
  } else {
11648
- let \u03C3 = (Math.max(...biases) - Math.min(...biases)) / UnbiasingConstant.D2(n2);
11649
- console.log({ \u03C3, d2: UnbiasingConstant.D2(n2) });
11809
+ let \u03C3 = (Math.max(...biases) - Math.min(...biases)) / d2;
11650
11810
  t = bias / (\u03C3 / Math.sqrt(n2));
11651
11811
  }
11652
- let df = n2 - 1;
11653
- let pValue = 2 * (1 - Distributions.T.cdf(Math.abs(t), df));
11654
- console.log({ t, pValue });
11812
+ console.log(t, df);
11813
+ let pValue = Distributions.T.cdf(-Math.abs(t), df) + Distributions.T.RightTail(Math.abs(t), df);
11655
11814
  partBiases.push({
11656
11815
  ReferenceValue: ref,
11657
11816
  Bias: bias,
11658
- PercentBias: processVariation ? Math.abs(bias / processVariation) : NaN
11659
- // p: pValue
11817
+ PercentBias: processVariation ? Math.abs(bias / processVariation) : NaN,
11818
+ p: pValue
11660
11819
  });
11661
11820
  biasAsY.push(bias);
11662
11821
  refAsX.push(ref);
@@ -11664,12 +11823,13 @@ function GageLinearityAndBias(parts, referenceValues, responses, processVariatio
11664
11823
  let avgBias = Mean(partBiases.map((b) => {
11665
11824
  return b.Bias;
11666
11825
  }));
11667
- let avgT = avgBias / (Math.max(...biasAsY) - Math.min(...biasAsY)) / UnbiasingConstant.D2(responses.length) / Math.sqrt(responses.length);
11826
+ let { d2: avgD2, df: avgDF } = UnbiasingConstant.D2prime(4, 5);
11827
+ let avgT = avgBias / (Math.max(...biasAsY) - Math.min(...biasAsY)) / avgD2 / Math.sqrt(responses.length);
11668
11828
  let avgGroup = {
11669
11829
  ReferenceValue: "Average",
11670
11830
  Bias: avgBias,
11671
11831
  PercentBias: processVariation ? Math.abs(avgBias / processVariation) : NaN,
11672
- p: Distributions.T.cdf(Math.abs(avgT), responses.length - 1)
11832
+ p: Distributions.T.cdf(Math.abs(avgT), avgDF)
11673
11833
  };
11674
11834
  let gageBiases = [avgGroup, ...partBiases];
11675
11835
  let regression = SimpleLinearRegression(biasAsY, refAsX);
@@ -12689,6 +12849,7 @@ var Matrix = {
12689
12849
  SumSquaredDeviation,
12690
12850
  TrimmedMean,
12691
12851
  UnbiasingConstant,
12852
+ Unique,
12692
12853
  Variance,
12693
12854
  VarianceComponents
12694
12855
  });
package/dist/index.mjs CHANGED
@@ -5462,7 +5462,7 @@ var ANOVA = {
5462
5462
  let rp = ANOVA.PostHoc.Duncan.Rp(treatmentNumber, DFE);
5463
5463
  let Rp = rp * S_x;
5464
5464
  returnArray.push({
5465
- treatment: infoArray[i].treatment,
5465
+ Treatment: infoArray[i].treatment,
5466
5466
  Mean: infoArray[i].Mean,
5467
5467
  Rp,
5468
5468
  D: infoArray[i].Mean - Rp,
@@ -5587,8 +5587,8 @@ var ANOVA = {
5587
5587
  let diff = infoArray[i].Mean - infoArray[rev].Mean;
5588
5588
  let t = diff / Math.sqrt(MSE * (1 / infoArray[i].N + 1 / infoArray[rev].N));
5589
5589
  returnArray.push({
5590
- name: `${infoArray[i].treatment} - ${infoArray[rev].treatment}`,
5591
- meanDifference: diff,
5590
+ Name: `${infoArray[i].treatment} - ${infoArray[rev].treatment}`,
5591
+ MeanDifference: diff,
5592
5592
  T: t,
5593
5593
  LSD: tCrit * Math.sqrt(MSE * (1 / infoArray[i].N + 1 / infoArray[rev].N)),
5594
5594
  p: 2 * Distributions.T.RightTail(t, DFE)
@@ -5614,7 +5614,7 @@ var ANOVA = {
5614
5614
  let mean = Mean(data[key]);
5615
5615
  let tCrit = q_prime * Math.sqrt(MSE / n);
5616
5616
  returnArray.push({
5617
- treatment: key,
5617
+ Treatment: key,
5618
5618
  N: n,
5619
5619
  Mean: mean,
5620
5620
  T: tCrit,
@@ -6504,6 +6504,73 @@ var ANOVA = {
6504
6504
  }
6505
6505
  };
6506
6506
  var MANOVA = {
6507
+ WilksLambda(responses, factors, interactions = []) {
6508
+ let rKeys = Object.keys(responses);
6509
+ let fKeys = Object.keys(factors);
6510
+ let coefficientCount = Sum(fKeys.map((k) => {
6511
+ return Unique(factors[k]).length;
6512
+ })) - 1 + interactions.length;
6513
+ let dfError = responses[rKeys[0]].length - coefficientCount - 1;
6514
+ let varTerms = [...fKeys];
6515
+ let p = rKeys.length;
6516
+ let v = dfError;
6517
+ let returner = [];
6518
+ fKeys.map((fk) => {
6519
+ let factor = factors[fk];
6520
+ let q = Unique(factor).length - 1;
6521
+ let E = MANOVA.ErrorMatrix(responses, factor);
6522
+ let H = MANOVA.HypothesisMatrix(responses, factor);
6523
+ let lambda = Matrix.Determinant(E) / Matrix.Determinant(Matrix.Sum(H, E));
6524
+ let m = 0.5 * (Math.abs(p - 1) - 1);
6525
+ let s = Math.min(p, 1);
6526
+ let u = 0.25 * (p * q - 2);
6527
+ let n = 0.5 * (v - p - 1);
6528
+ let r = v - 0.5 * (p - q + 1);
6529
+ let t = Math.pow(p, 2) + Math.pow(q, 2) - 5 > 0 ? Math.sqrt((Math.pow(p, 2) * Math.pow(q, 2) - 4) / (Math.pow(p, 2) + Math.pow(q, 2) - 5)) : 1;
6530
+ let f = (1 - Math.pow(lambda, 1 / t)) / Math.pow(lambda, 1 / t) * (r * t - 2 * u) / (p * q);
6531
+ let denDF = r * t - 2 * u;
6532
+ let numDF = p * q;
6533
+ returner.push({
6534
+ DenominatorDF: denDF,
6535
+ F: f,
6536
+ Factor: fk,
6537
+ Lambda: lambda,
6538
+ NumeratorDF: numDF,
6539
+ p: Distributions.F.RightTail(f, denDF, numDF)
6540
+ });
6541
+ });
6542
+ interactions.forEach((int) => {
6543
+ let factor = [];
6544
+ for (let i = 0; i < responses[rKeys[0]].length; i++) {
6545
+ factor.push(int.map((inter) => {
6546
+ return factors[inter][i];
6547
+ }).join("*"));
6548
+ }
6549
+ console.log(factor);
6550
+ let q = Unique(factor).length - 1;
6551
+ let E = MANOVA.ErrorMatrix(responses, factor);
6552
+ let H = MANOVA.HypothesisMatrix(responses, factor);
6553
+ let lambda = Matrix.Determinant(E) / Matrix.Determinant(Matrix.Sum(H, E));
6554
+ let m = 0.5 * (Math.abs(p - 1) - 1);
6555
+ let s = Math.min(p, 1);
6556
+ let u = 0.25 * (p * q - 2);
6557
+ let n = 0.5 * (v - p - 1);
6558
+ let r = v - 0.5 * (p - q + 1);
6559
+ let t = Math.pow(p, 2) + Math.pow(q, 2) - 5 > 0 ? Math.sqrt((Math.pow(p, 2) * Math.pow(q, 2) - 4) / (Math.pow(p, 2) + Math.pow(q, 2) - 5)) : 1;
6560
+ let f = (1 - Math.pow(lambda, 1 / t)) / Math.pow(lambda, 1 / t) * (r * t - 2 * u) / (p * q);
6561
+ let denDF = r * t - 2 * u;
6562
+ let numDF = p * q;
6563
+ returner.push({
6564
+ DenominatorDF: denDF,
6565
+ F: f,
6566
+ Factor: int.join("*"),
6567
+ Lambda: lambda,
6568
+ NumeratorDF: numDF,
6569
+ p: Distributions.F.RightTail(f, denDF, numDF)
6570
+ });
6571
+ });
6572
+ return returner;
6573
+ },
6507
6574
  Report(responses, factors, interactions = []) {
6508
6575
  let returner = [];
6509
6576
  let rKeys = Object.keys(responses);
@@ -6523,7 +6590,6 @@ var MANOVA = {
6523
6590
  let u = 0.25 * (p * q - 2);
6524
6591
  let m = 0.5 * (Math.abs(p - q) - 1);
6525
6592
  let n = 0.5 * (v - p - 1);
6526
- console.log({ m, n, p, q, r, s, t, u, v });
6527
6593
  let TotalMatrix = Matrix.New(p, p);
6528
6594
  let ErrorMatrix = Matrix.New(p, p);
6529
6595
  Matrix.Fill(ErrorMatrix, 0);
@@ -6550,6 +6616,7 @@ var MANOVA = {
6550
6616
  let factorSSCP = Matrix.Multiply(Matrix.Transpose(rDevMatrix), rDevMatrix);
6551
6617
  ErrorMatrix = Matrix.Sum(ErrorMatrix, factorSSCP);
6552
6618
  });
6619
+ console.log({ DeviationMatrix, nMatrix });
6553
6620
  let devXn = Matrix.Scale(DeviationMatrix, nMatrix);
6554
6621
  let HypothesisMatrix = Matrix.Multiply(Matrix.Transpose(DeviationMatrix), devXn);
6555
6622
  console.log({ HypothesisMatrix, ErrorMatrix });
@@ -6612,7 +6679,49 @@ var MANOVA = {
6612
6679
  });
6613
6680
  return returner;
6614
6681
  },
6682
+ ErrorMatrix(responses, factor) {
6683
+ let factorLevels = Unique(factor);
6684
+ let errorMatrix = Matrix.New(Object.keys(responses).length, Object.keys(responses).length);
6685
+ Matrix.Fill(errorMatrix, 0);
6686
+ factorLevels.forEach((lv, lvi) => {
6687
+ let nResponses = factor.filter((f) => f == lv).length;
6688
+ let filteredResponses = {};
6689
+ let responseMeans = {};
6690
+ Object.keys(responses).forEach((k) => {
6691
+ let subgroup = responses[k].filter((r, ri) => factor[ri] == lv);
6692
+ filteredResponses[k] = subgroup;
6693
+ responseMeans[k] = Mean(subgroup);
6694
+ });
6695
+ let treatmentMatrix = Matrix.New(nResponses, Object.keys(responses).length);
6696
+ let deviationMatrix = Matrix.New(nResponses, Object.keys(responses).length);
6697
+ for (let i = 0; i < nResponses; i++) {
6698
+ Object.keys(responses).forEach((k, ki) => {
6699
+ treatmentMatrix[i][ki] = filteredResponses[k][i];
6700
+ deviationMatrix[i][ki] = filteredResponses[k][i] - responseMeans[k];
6701
+ });
6702
+ }
6703
+ let SSCP = Matrix.Multiply(Matrix.Transpose(deviationMatrix), treatmentMatrix);
6704
+ errorMatrix = Matrix.Sum(errorMatrix, SSCP);
6705
+ });
6706
+ return errorMatrix;
6707
+ },
6615
6708
  HypothesisMatrix(responses, factor) {
6709
+ let factorGroups = Unique(factor);
6710
+ let responseMeans = {};
6711
+ let deviationMatrix = Matrix.New(factorGroups.length, Object.keys(responses).length);
6712
+ let nMatrix = Matrix.New(factorGroups.length, Object.keys(responses).length);
6713
+ Object.keys(responses).forEach((k, ki) => {
6714
+ let responseMean = Mean(responses[k]);
6715
+ responseMeans[k] = responseMean;
6716
+ factorGroups.forEach((g, gi) => {
6717
+ let subgroup = responses[k].filter((d, di) => factor[di] == g);
6718
+ deviationMatrix[gi][ki] = Mean(subgroup) - responseMean;
6719
+ nMatrix[gi][ki] = subgroup.length;
6720
+ });
6721
+ });
6722
+ let devXn = Matrix.Scale(deviationMatrix, nMatrix);
6723
+ let hypothesisMatrix = Matrix.Multiply(Matrix.Transpose(deviationMatrix), devXn);
6724
+ return hypothesisMatrix;
6616
6725
  }
6617
6726
  };
6618
6727
  function AverageMovingRange(data, w = 2) {
@@ -8087,6 +8196,54 @@ var OutlierTesting = {
8087
8196
  rejectNull: p <= alpha,
8088
8197
  chart: outlierPlot
8089
8198
  };
8199
+ },
8200
+ /**
8201
+ * Performs Dixon's Test to test for and identify (if one exists) an outlier. H_0: data has no outliers | H_A: there is one outlier
8202
+ * @param data The array of numbers to evaluate
8203
+ * @param tails OPTIONAL: Whether to perform single or two-tailed Grubbs' Test. DEFAULT = 0: two-tailed | -1: lower tailed (checks if smallest value is an outlier) | 1: upper tailed (checks if largest value is an outlier)
8204
+ * @param alpha OPTIONAL: The significance value to evaluate outliers. DEFAULT = 0.05
8205
+ */
8206
+ Dixon(data, i = 1, j = 0, alpha = 0.05, name) {
8207
+ let y = [...data].sort((a, b) => a - b);
8208
+ let n = y.length;
8209
+ let r_ij = Math.max((y[i] - y[0]) / (y[n - 1 - j] - y[0]), (y[n - 1] - y[n - 1 - i]) / (y[n - 1] - y[j]));
8210
+ let C = Probability.Factorialize(n) * Math.pow(2 * Math.PI, -3 / 2) / (Probability.Factorialize(j) * Probability.Factorialize(n - i - j - 2) * Probability.Factorialize(i - 1));
8211
+ const j_xvr = (x, v, r) => {
8212
+ };
8213
+ const t = (r, v) => {
8214
+ return (1 + Math.pow(r, 2)) * Math.pow(v, 2) / 2;
8215
+ };
8216
+ const u2 = (x) => {
8217
+ return 3 * Math.pow(x, 2) / 2;
8218
+ };
8219
+ let p = NaN;
8220
+ let outliers = [];
8221
+ if (p <= alpha) {
8222
+ if ((y[i] - y[0]) / (y[n - 1 - j] - y[0]) > (y[n - 1] - y[n - 1 - i]) / (y[n - 1] - y[j])) {
8223
+ outliers = [{ i: data.findIndex((d) => d == y[0]), value: y[0] }];
8224
+ } else {
8225
+ outliers = [{ i: data.findIndex((d) => d == y[n - 1]), value: y[n - 1] }];
8226
+ }
8227
+ }
8228
+ let plotData = data.map((d, i2) => {
8229
+ if (outliers.findIndex((o) => o.i == i2) >= 0) {
8230
+ return new Point(d, 1, new CanvasDrawSettings("red", "red", 1, 1));
8231
+ } else {
8232
+ return new Point(d, 1, new CanvasDrawSettings("#2183b2", "#2183b2"));
8233
+ }
8234
+ });
8235
+ let plotSettings = new ChartSettings();
8236
+ plotSettings.axis.y = new AxisSettings(0, 2);
8237
+ plotSettings.axis.y.showAutoGridlines = false;
8238
+ plotSettings.axis.y.customGridlines = [new CustomGridline(1)];
8239
+ let title = name ? `Outlier Plot of ${name}` : `Outlier Plot`;
8240
+ let outlierPlot = CreateScatterPlot([new DataSet(plotData)], title, plotSettings);
8241
+ return {
8242
+ test: i == 1 && j == 0 ? "Dixon's Q" : `Dixon's r${i}${j}`,
8243
+ r: r_ij,
8244
+ p,
8245
+ chart: outlierPlot
8246
+ };
8090
8247
  }
8091
8248
  };
8092
8249
  var Probability = {
@@ -8416,7 +8573,7 @@ var UnbiasingConstant = {
8416
8573
  return 3.4873 + 0.0250141 * N - 9823e-8 * Math.pow(N, 2);
8417
8574
  },
8418
8575
  D2prime(g, m) {
8419
- let d2PrimeTable = [];
8576
+ let d2PrimeTable = [[{ "df": 1, "d2": 1.41421 }, { "df": 2, "d2": 1.91155 }, { "df": 2.9, "d2": 2.23887 }, { "df": 3.8, "d2": 2.48124 }, { "df": 4.7, "d2": 2.67253 }, { "df": 5.5, "d2": 2.82981 }, { "df": 6.3, "d2": 2.96288 }, { "df": 7, "d2": 3.07794 }, { "df": 7.7, "d2": 3.17905 }, { "df": 8.3, "d2": 3.26909 }, { "df": 9, "d2": 3.35016 }, { "df": 9.6, "d2": 3.42378 }, { "df": 10.2, "d2": 3.49116 }, { "df": 10.8, "d2": 3.55333 }, { "df": 11.3, "d2": 3.61071 }, { "df": 11.9, "d2": 3.66422 }, { "df": 12.4, "d2": 3.71424 }, { "df": 12.9, "d2": 3.76118 }, { "df": 13.4, "d2": 3.80537 }], [{ "df": 1.9, "d2": 1.27931 }, { "df": 3.8, "d2": 1.80538 }, { "df": 5.7, "d2": 2.15069 }, { "df": 7.5, "d2": 2.40484 }, { "df": 9.2, "d2": 2.60438 }, { "df": 10.8, "d2": 2.76779 }, { "df": 12.3, "d2": 2.90562 }, { "df": 13.8, "d2": 3.02446 }, { "df": 15.1, "d2": 3.12869 }, { "df": 16.5, "d2": 3.22134 }, { "df": 17.8, "d2": 3.30463 }, { "df": 19, "d2": 3.38017 }, { "df": 20.2, "d2": 3.44922 }, { "df": 21.3, "d2": 3.51287 }, { "df": 22.4, "d2": 3.57156 }, { "df": 23.5, "d2": 3.62625 }, { "df": 24.5, "d2": 3.67734 }, { "df": 25.5, "d2": 3.72524 }, { "df": 26.5, "d2": 3.77032 }], [{ "df": 2.8, "d2": 1.23105 }, { "df": 5.7, "d2": 1.76858 }, { "df": 8.4, "d2": 2.12049 }, { "df": 11.1, "d2": 2.37883 }, { "df": 13.6, "d2": 2.58127 }, { "df": 16, "d2": 2.74681 }, { "df": 18.3, "d2": 2.88628 }, { "df": 20.5, "d2": 3.00643 }, { "df": 22.6, "d2": 3.11173 }, { "df": 24.6, "d2": 3.20526 }, { "df": 26.5, "d2": 3.28931 }, { "df": 28.4, "d2": 3.3655 }, { "df": 30.1, "d2": 3.43512 }, { "df": 31.9, "d2": 3.49927 }, { "df": 33.5, "d2": 3.55842 }, { "df": 35.1, "d2": 3.61351 }, { "df": 36.7, "d2": 3.66495 }, { "df": 38.2, "d2": 3.71319 }, { "df": 39.7, "d2": 3.75857 }], [{ "df": 3.7, "d2": 1.20621 }, { "df": 7.5, "d2": 1.74989 }, { "df": 11.2, "d2": 2.10522 }, { "df": 14.7, "d2": 2.36571 }, { "df": 18.1, "d2": 2.56964 }, { "df": 21.3, "d2": 2.73626 }, { "df": 24.4, "d2": 2.87656 }, { "df": 27.3, "d2": 2.99737 }, { "df": 30.1, "d2": 3.10321 }, { "df": 32.7, "d2": 3.1972 }, { "df": 35.3, "d2": 3.28163 }, { "df": 37.7, "d2": 3.35815 }, { "df": 40.1, "d2": 3.42805 }, { "df": 42.4, "d2": 3.49246 }, { "df": 44.6, "d2": 3.55183 }, { "df": 46.7, "d2": 3.60712 }, { "df": 48.8, "d2": 3.65875 }, { "df": 50.8, "d2": 3.70715 }, { "df": 52.8, "d2": 3.75268 }], [{ "df": 4.6, "d2": 1.19105 }, { "df": 9.3, "d2": 1.73857 }, { "df": 13.9, "d2": 2.09601 }, { "df": 18.4, "d2": 2.35781 }, { "df": 22.6, "d2": 2.56263 }, { "df": 26.6, "d2": 2.72991 }, { "df": 30.4, "d2": 2.87071 }, { "df": 34, "d2": 2.99192 }, { "df": 37.5, "d2": 3.09808 }, { "df": 40.8, "d2": 3.19235 }, { "df": 44, "d2": 3.27701 }, { "df": 47.1, "d2": 3.35372 }, { "df": 50.1, "d2": 3.42381 }, { "df": 52.9, "d2": 3.48836 }, { "df": 55.7, "d2": 3.54787 }, { "df": 58.4, "d2": 3.60328 }, { "df": 61, "d2": 3.65502 }, { "df": 63.5, "d2": 3.70352 }, { "df": 65.9, "d2": 3.74914 }], [{ "df": 5.5, "d2": 1.18083 }, { "df": 11.1, "d2": 1.73099 }, { "df": 16.7, "d2": 2.08985 }, { "df": 22, "d2": 2.35253 }, { "df": 27, "d2": 2.55795 }, { "df": 31.8, "d2": 2.72567 }, { "df": 36.4, "d2": 2.8668 }, { "df": 40.8, "d2": 2.98829 }, { "df": 45, "d2": 3.09467 }, { "df": 49, "d2": 3.18911 }, { "df": 52.8, "d2": 3.27392 }, { "df": 56.5, "d2": 3.35077 }, { "df": 60.1, "d2": 3.42097 }, { "df": 63.5, "d2": 3.48563 }, { "df": 66.8, "d2": 3.54522 }, { "df": 70, "d2": 3.60072 }, { "df": 73.1, "d2": 3.65253 }, { "df": 76.1, "d2": 3.70109 }, { "df": 79.1, "d2": 3.74678 }], [{ "df": 6.4, "d2": 1.17348 }, { "df": 12.9, "d2": 1.72555 }, { "df": 19.4, "d2": 2.08543 }, { "df": 25.6, "d2": 2.34875 }, { "df": 31.5, "d2": 2.5546 }, { "df": 37.1, "d2": 2.72263 }, { "df": 42.5, "d2": 2.86401 }, { "df": 47.6, "d2": 2.98568 }, { "df": 52.4, "d2": 3.09222 }, { "df": 57.1, "d2": 3.18679 }, { "df": 61.6, "d2": 3.27172 }, { "df": 65.9, "d2": 3.34866 }, { "df": 70, "d2": 3.41894 }, { "df": 74, "d2": 3.48368 }, { "df": 77.9, "d2": 3.54333 }, { "df": 81.6, "d2": 3.59888 }, { "df": 85.3, "d2": 3.65075 }, { "df": 88.8, "d2": 3.69936 }, { "df": 92.2, "d2": 3.74509 }], [{ "df": 7.2, "d2": 1.16794 }, { "df": 14.8, "d2": 1.72147 }, { "df": 22.1, "d2": 2.08212 }, { "df": 29.2, "d2": 2.34591 }, { "df": 36, "d2": 2.55208 }, { "df": 42.4, "d2": 2.72036 }, { "df": 48.5, "d2": 2.86192 }, { "df": 54.3, "d2": 2.98373 }, { "df": 59.9, "d2": 3.09039 }, { "df": 65.2, "d2": 3.18506 }, { "df": 70.3, "d2": 3.27006 }, { "df": 75.2, "d2": 3.34708 }, { "df": 80, "d2": 3.41742 }, { "df": 84.6, "d2": 3.48221 }, { "df": 89, "d2": 3.54192 }, { "df": 93.3, "d2": 3.59751 }, { "df": 97.4, "d2": 3.64941 }, { "df": 101.4, "d2": 3.69806 }, { "df": 105.3, "d2": 3.74382 }], [{ "df": 8.1, "d2": 1.16361 }, { "df": 16.6, "d2": 1.71828 }, { "df": 24.9, "d2": 2.07953 }, { "df": 32.9, "d2": 2.3437 }, { "df": 40.4, "d2": 2.55013 }, { "df": 47.7, "d2": 2.71858 }, { "df": 54.5, "d2": 2.86028 }, { "df": 61.1, "d2": 2.98221 }, { "df": 67.3, "d2": 3.08896 }, { "df": 73.3, "d2": 3.1837 }, { "df": 79.1, "d2": 3.26878 }, { "df": 84.6, "d2": 3.34585 }, { "df": 90, "d2": 3.41624 }, { "df": 95.1, "d2": 3.48107 }, { "df": 100.1, "d2": 3.54081 }, { "df": 104.9, "d2": 3.59644 }, { "df": 109.5, "d2": 3.64838 }, { "df": 114.1, "d2": 3.69705 }, { "df": 118.5, "d2": 3.74284 }], [{ "df": 9, "d2": 1.16014 }, { "df": 18.4, "d2": 1.71573 }, { "df": 27.6, "d2": 2.07746 }, { "df": 36.5, "d2": 2.34192 }, { "df": 44.9, "d2": 2.54856 }, { "df": 52.9, "d2": 2.71717 }, { "df": 60.6, "d2": 2.85898 }, { "df": 67.8, "d2": 2.981 }, { "df": 74.8, "d2": 3.08781 }, { "df": 81.5, "d2": 3.18262 }, { "df": 87.9, "d2": 3.26775 }, { "df": 94, "d2": 3.34486 }, { "df": 99.9, "d2": 3.41529 }, { "df": 105.6, "d2": 3.48016 }, { "df": 111.2, "d2": 3.53993 }, { "df": 116.5, "d2": 3.59559 }, { "df": 121.7, "d2": 3.64755 }, { "df": 126.7, "d2": 3.69625 }, { "df": 131.6, "d2": 3.74205 }], [{ "df": 9.9, "d2": 1.15729 }, { "df": 20.2, "d2": 1.71363 }, { "df": 30.4, "d2": 2.07577 }, { "df": 40.1, "d2": 2.34048 }, { "df": 49.4, "d2": 2.54728 }, { "df": 58.2, "d2": 2.716 }, { "df": 66.6, "d2": 2.85791 }, { "df": 74.6, "d2": 2.98 }, { "df": 82.2, "d2": 3.08688 }, { "df": 89.6, "d2": 3.18174 }, { "df": 96.6, "d2": 3.2669 }, { "df": 103.4, "d2": 3.34406 }, { "df": 109.9, "d2": 3.41452 }, { "df": 116.2, "d2": 3.47941 }, { "df": 122.3, "d2": 3.53921 }, { "df": 128.1, "d2": 3.59489 }, { "df": 133.8, "d2": 3.64687 }, { "df": 139.4, "d2": 3.69558 }, { "df": 144.7, "d2": 3.74141 }], [{ "df": 10.7, "d2": 1.1549 }, { "df": 22, "d2": 1.71189 }, { "df": 33.1, "d2": 2.07436 }, { "df": 43.7, "d2": 2.33927 }, { "df": 53.8, "d2": 2.54621 }, { "df": 63.5, "d2": 2.71504 }, { "df": 72.6, "d2": 2.85702 }, { "df": 81.3, "d2": 2.97917 }, { "df": 89.7, "d2": 3.0861 }, { "df": 97.7, "d2": 3.181 }, { "df": 105.4, "d2": 3.2662 }, { "df": 112.7, "d2": 3.34339 }, { "df": 119.9, "d2": 3.41387 }, { "df": 126.7, "d2": 3.47879 }, { "df": 133.3, "d2": 3.53861 }, { "df": 139.8, "d2": 3.5943 }, { "df": 146, "d2": 3.6463 }, { "df": 152, "d2": 3.69503 }, { "df": 157.9, "d2": 3.74087 }], [{ "df": 11.6, "d2": 1.15289 }, { "df": 23.8, "d2": 1.71041 }, { "df": 35.8, "d2": 2.07316 }, { "df": 47.3, "d2": 2.33824 }, { "df": 58.3, "d2": 2.5453 }, { "df": 68.7, "d2": 2.71422 }, { "df": 78.6, "d2": 2.85627 }, { "df": 88.1, "d2": 2.97847 }, { "df": 97.1, "d2": 3.08544 }, { "df": 105.8, "d2": 3.18037 }, { "df": 114.1, "d2": 3.26561 }, { "df": 122.1, "d2": 3.34282 }, { "df": 129.8, "d2": 3.41333 }, { "df": 137.3, "d2": 3.47826 }, { "df": 144.4, "d2": 3.5381 }, { "df": 151.4, "d2": 3.59381 }, { "df": 158.1, "d2": 3.64582 }, { "df": 164.7, "d2": 3.69457 }, { "df": 171, "d2": 3.74041 }], [{ "df": 12.5, "d2": 1.15115 }, { "df": 25.7, "d2": 1.70914 }, { "df": 38.6, "d2": 2.07213 }, { "df": 51, "d2": 2.33737 }, { "df": 62.8, "d2": 2.54452 }, { "df": 74, "d2": 2.71351 }, { "df": 84.7, "d2": 2.85562 }, { "df": 94.9, "d2": 2.97787 }, { "df": 104.6, "d2": 3.08487 }, { "df": 113.9, "d2": 3.17984 }, { "df": 122.9, "d2": 3.2651 }, { "df": 131.5, "d2": 3.34233 }, { "df": 139.8, "d2": 3.41286 }, { "df": 147.8, "d2": 3.47781 }, { "df": 155.5, "d2": 3.53766 }, { "df": 163, "d2": 3.59339 }, { "df": 170.3, "d2": 3.64541 }, { "df": 177.3, "d2": 3.69417 }, { "df": 184.2, "d2": 3.74002 }], [{ "df": 13.4, "d2": 1.14965 }, { "df": 27.5, "d2": 1.70804 }, { "df": 41.3, "d2": 2.07125 }, { "df": 54.6, "d2": 2.33661 }, { "df": 67.2, "d2": 2.54385 }, { "df": 79.3, "d2": 2.7129 }, { "df": 90.7, "d2": 2.85506 }, { "df": 101.6, "d2": 2.97735 }, { "df": 112.1, "d2": 3.08438 }, { "df": 122.1, "d2": 3.17938 }, { "df": 131.7, "d2": 3.26465 }, { "df": 140.9, "d2": 3.34191 }, { "df": 149.8, "d2": 3.41245 }, { "df": 158.3, "d2": 3.47742 }, { "df": 166.6, "d2": 3.53728 }, { "df": 174.6, "d2": 3.59302 }, { "df": 182.4, "d2": 3.64505 }, { "df": 190, "d2": 3.69382 }, { "df": 197.3, "d2": 3.73969 }], [{ "df": 14.3, "d2": 1.14833 }, { "df": 29.3, "d2": 1.70708 }, { "df": 44.1, "d2": 2.07047 }, { "df": 58.2, "d2": 2.33594 }, { "df": 71.7, "d2": 2.54326 }, { "df": 84.5, "d2": 2.71237 }, { "df": 96.7, "d2": 2.85457 }, { "df": 108.4, "d2": 2.97689 }, { "df": 119.5, "d2": 3.08395 }, { "df": 130.2, "d2": 3.17897 }, { "df": 140.4, "d2": 3.26427 }, { "df": 150.2, "d2": 3.34154 }, { "df": 159.7, "d2": 3.4121 }, { "df": 168.9, "d2": 3.47707 }, { "df": 177.7, "d2": 3.53695 }, { "df": 186.3, "d2": 3.5927 }, { "df": 194.6, "d2": 3.64474 }, { "df": 202.6, "d2": 3.69351 }, { "df": 210.4, "d2": 3.73939 }], [{ "df": 15.1, "d2": 1.14717 }, { "df": 31.1, "d2": 1.70623 }, { "df": 46.8, "d2": 2.06978 }, { "df": 61.8, "d2": 2.33535 }, { "df": 76.2, "d2": 2.54274 }, { "df": 89.8, "d2": 2.7119 }, { "df": 102.8, "d2": 2.85413 }, { "df": 115.1, "d2": 2.97649 }, { "df": 127, "d2": 3.08358 }, { "df": 138.3, "d2": 3.17861 }, { "df": 149.2, "d2": 3.26393 }, { "df": 159.6, "d2": 3.34121 }, { "df": 169.7, "d2": 3.41178 }, { "df": 179.4, "d2": 3.47677 }, { "df": 188.8, "d2": 3.53666 }, { "df": 197.9, "d2": 3.59242 }, { "df": 206.7, "d2": 3.64447 }, { "df": 215.2, "d2": 3.69325 }, { "df": 223.6, "d2": 3.73913 }], [{ "df": 16, "d2": 1.14613 }, { "df": 32.9, "d2": 1.70547 }, { "df": 49.5, "d2": 2.06917 }, { "df": 65.5, "d2": 2.33483 }, { "df": 80.6, "d2": 2.54228 }, { "df": 95.1, "d2": 2.71148 }, { "df": 108.8, "d2": 2.85375 }, { "df": 121.9, "d2": 2.97613 }, { "df": 134.4, "d2": 3.08324 }, { "df": 146.4, "d2": 3.17829 }, { "df": 157.9, "d2": 3.26362 }, { "df": 169, "d2": 3.34092 }, { "df": 179.7, "d2": 3.4115 }, { "df": 190, "d2": 3.4765 }, { "df": 199.9, "d2": 3.5364 }, { "df": 209.5, "d2": 3.59216 }, { "df": 218.8, "d2": 3.64422 }, { "df": 227.9, "d2": 3.69301 }, { "df": 236.7, "d2": 3.7389 }], [{ "df": 16.9, "d2": 1.1452 }, { "df": 34.7, "d2": 1.7048 }, { "df": 52.3, "d2": 2.06862 }, { "df": 69.1, "d2": 2.33436 }, { "df": 85.1, "d2": 2.54187 }, { "df": 100.3, "d2": 2.71111 }, { "df": 114.8, "d2": 2.85341 }, { "df": 128.7, "d2": 2.97581 }, { "df": 141.9, "d2": 3.08294 }, { "df": 154.5, "d2": 3.17801 }, { "df": 166.7, "d2": 3.26335 }, { "df": 178.4, "d2": 3.34066 }, { "df": 189.6, "d2": 3.41125 }, { "df": 200.5, "d2": 3.47626 }, { "df": 211, "d2": 3.53617 }, { "df": 221.1, "d2": 3.59194 }, { "df": 231, "d2": 3.644 }, { "df": 240.5, "d2": 3.6928 }, { "df": 249.8, "d2": 3.73869 }], [{ "df": 17.8, "d2": 1.14437 }, { "df": 36.5, "d2": 1.70419 }, { "df": 55, "d2": 2.06813 }, { "df": 72.7, "d2": 2.33394 }, { "df": 89.6, "d2": 2.54149 }, { "df": 105.6, "d2": 2.71077 }, { "df": 120.9, "d2": 2.8531 }, { "df": 135.4, "d2": 2.97552 }, { "df": 149.3, "d2": 3.08267 }, { "df": 162.7, "d2": 3.17775 }, { "df": 175.5, "d2": 3.26311 }, { "df": 187.8, "d2": 3.34042 }, { "df": 199.6, "d2": 3.41103 }, { "df": 211, "d2": 3.47605 }, { "df": 222.1, "d2": 3.53596 }, { "df": 232.8, "d2": 3.59174 }, { "df": 243.1, "d2": 3.6438 }, { "df": 253.2, "d2": 3.6926 }, { "df": 263, "d2": 3.7385 }]];
8420
8577
  if (g > 20) {
8421
8578
  let d2s = [1.12838, 0.69257, 2.05875, 2.32593, 2.53441, 2.70436, 2.8472, 2.97003, 3.07751, 3.17287, 3.25845, 3.33598, 3.40676, 3.47193, 3.53198, 3.58788, 3.64006, 3.68896, 3.735];
8422
8579
  let cds = [0.876, 1.815, 2.7378, 3.623, 4.4658, 5.2673, 6.0305, 6.7582, 7.4539, 8.1207, 8.7602, 9.3751, 9.9679, 10.5396, 11.0913, 11.6259, 12.144, 12.6468, 13.1362];
@@ -10046,6 +10203,8 @@ function QQPlotChart(data, distribution = "Normal") {
10046
10203
  ];
10047
10204
  chartSettings.axis.y.customGridlines = customGridlines;
10048
10205
  chartSettings.axis.y.showAutoGridlines = false;
10206
+ chartSettings.width += 100;
10207
+ chartSettings.margins.right += 100;
10049
10208
  if (distribution.toLowerCase().includes("exponential")) {
10050
10209
  chartSettings.axis.x.max = 100;
10051
10210
  chartSettings.axis.x.min = 0.1;
@@ -10131,7 +10290,7 @@ function QQPlotChart(data, distribution = "Normal") {
10131
10290
  { key: "SW(R):", value: SWR.W },
10132
10291
  { key: "p-value:", value: SWR.p },
10133
10292
  { key: "", value: "" }
10134
- ], 1075, 50, 175, 100, "", 30);
10293
+ ], chartSettings.width - chartSettings.margins.right + 50, 50, chartSettings.margins.right - 50, 100, "", 30, new EngFont("black", "Calibri", "28px"));
10135
10294
  }
10136
10295
  } else {
10137
10296
  let dist = distribution.replace("-", "").replace("arameter", "").replace(/\s/g, "");
@@ -10141,7 +10300,7 @@ function QQPlotChart(data, distribution = "Normal") {
10141
10300
  let AD = GoodnessOfFit.AndersonDarling.Test(data, dist);
10142
10301
  let ctx = chart.getContext("2d");
10143
10302
  if (ctx && (AD.AD || AD.AD === Infinity || Number.isNaN(AD.AD)) && (AD.p || AD.p === Infinity || Number.isNaN(AD.p))) {
10144
- AddInfoTable(ctx, [{ key: "AD:", value: AD.AD }, { key: "p-value:", value: AD.p }], 1075, 150, 175, 100, "", 30);
10303
+ AddInfoTable(ctx, [{ key: "AD:", value: AD.AD }, { key: "p-value:", value: AD.p }], chartSettings.width - chartSettings.margins.right + 50, 175, chartSettings.margins.right - 50, 100, "", 30, new EngFont("black", "Calibri", "28px"));
10145
10304
  }
10146
10305
  }
10147
10306
  return chart;
@@ -10214,7 +10373,7 @@ function FactorCode(level, factorLevels) {
10214
10373
  let centered = zeroBased - factorLevels.length / 2 + 0.5;
10215
10374
  return centered;
10216
10375
  }
10217
- function GeneralizedLinearModel(dependent, factors, covariates = {}, interactions = []) {
10376
+ function GeneralizedLinearModel(dependent, factors, covariates = {}, interactions = [], simple) {
10218
10377
  let refactored = { ...covariates };
10219
10378
  let unfactored = { ...covariates, ...factors };
10220
10379
  let refactoredWLevels = { ...covariates };
@@ -11279,8 +11438,8 @@ function BiasVsReferencePlot(biasAndLinearity, parts, referenceValues, responses
11279
11438
  let biasInfo = [];
11280
11439
  if (biasAndLinearity.GageLinearity.Linearity) {
11281
11440
  modelInfo.push(["Linearity", RoundDigits(biasAndLinearity.GageLinearity.Linearity, 6), "%Linearity", RoundDigits(biasAndLinearity.GageLinearity.PercentLinearity * 100, 2) + "%"]);
11282
- biasInfo = [["Reference Value", "Bias", "%Bias"], ...biasAndLinearity.GageBias.map((d) => {
11283
- return [RoundDigits(d.ReferenceValue, 6, true), RoundDigits(d.Bias, 6), RoundDigits(d.PercentBias * 100, 2)];
11441
+ biasInfo = [["Reference Value", "Bias", "%Bias", "P"], ...biasAndLinearity.GageBias.map((d) => {
11442
+ return [RoundDigits(d.ReferenceValue, 6, true), RoundDigits(d.Bias, 6), RoundDigits(d.PercentBias * 100, 2), RoundDigits(d.p, 3)];
11284
11443
  })];
11285
11444
  let miniX = chartSettings.width - chartSettings.margins.right + 75;
11286
11445
  let miniW = chartSettings.margins.right - 125;
@@ -11515,24 +11674,23 @@ function GageLinearityAndBias(parts, referenceValues, responses, processVariatio
11515
11674
  let bias = Sum(biases) / n2;
11516
11675
  let avgMeasure = Mean(measurements);
11517
11676
  let t = NaN;
11677
+ let { d2, df } = UnbiasingConstant.D2prime(n2, Object.keys(byParts).length);
11518
11678
  if (useStDevMethod) {
11519
11679
  let \u03C3 = Math.sqrt(SumSq(measurements.map((d) => {
11520
11680
  return d - avgMeasure;
11521
11681
  })) / (n2 - 1));
11522
11682
  t = bias / (\u03C3 / Math.sqrt(n2));
11523
11683
  } else {
11524
- let \u03C3 = (Math.max(...biases) - Math.min(...biases)) / UnbiasingConstant.D2(n2);
11525
- console.log({ \u03C3, d2: UnbiasingConstant.D2(n2) });
11684
+ let \u03C3 = (Math.max(...biases) - Math.min(...biases)) / d2;
11526
11685
  t = bias / (\u03C3 / Math.sqrt(n2));
11527
11686
  }
11528
- let df = n2 - 1;
11529
- let pValue = 2 * (1 - Distributions.T.cdf(Math.abs(t), df));
11530
- console.log({ t, pValue });
11687
+ console.log(t, df);
11688
+ let pValue = Distributions.T.cdf(-Math.abs(t), df) + Distributions.T.RightTail(Math.abs(t), df);
11531
11689
  partBiases.push({
11532
11690
  ReferenceValue: ref,
11533
11691
  Bias: bias,
11534
- PercentBias: processVariation ? Math.abs(bias / processVariation) : NaN
11535
- // p: pValue
11692
+ PercentBias: processVariation ? Math.abs(bias / processVariation) : NaN,
11693
+ p: pValue
11536
11694
  });
11537
11695
  biasAsY.push(bias);
11538
11696
  refAsX.push(ref);
@@ -11540,12 +11698,13 @@ function GageLinearityAndBias(parts, referenceValues, responses, processVariatio
11540
11698
  let avgBias = Mean(partBiases.map((b) => {
11541
11699
  return b.Bias;
11542
11700
  }));
11543
- let avgT = avgBias / (Math.max(...biasAsY) - Math.min(...biasAsY)) / UnbiasingConstant.D2(responses.length) / Math.sqrt(responses.length);
11701
+ let { d2: avgD2, df: avgDF } = UnbiasingConstant.D2prime(4, 5);
11702
+ let avgT = avgBias / (Math.max(...biasAsY) - Math.min(...biasAsY)) / avgD2 / Math.sqrt(responses.length);
11544
11703
  let avgGroup = {
11545
11704
  ReferenceValue: "Average",
11546
11705
  Bias: avgBias,
11547
11706
  PercentBias: processVariation ? Math.abs(avgBias / processVariation) : NaN,
11548
- p: Distributions.T.cdf(Math.abs(avgT), responses.length - 1)
11707
+ p: Distributions.T.cdf(Math.abs(avgT), avgDF)
11549
11708
  };
11550
11709
  let gageBiases = [avgGroup, ...partBiases];
11551
11710
  let regression = SimpleLinearRegression(biasAsY, refAsX);
@@ -12564,6 +12723,7 @@ export {
12564
12723
  SumSquaredDeviation,
12565
12724
  TrimmedMean,
12566
12725
  UnbiasingConstant,
12726
+ Unique,
12567
12727
  Variance,
12568
12728
  VarianceComponents
12569
12729
  };
package/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- /** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1
+ /** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2
2
  */
3
3
  // Classes
4
4
 
@@ -5858,7 +5858,7 @@ export const ANOVA = {
5858
5858
  let Rp = rp*S_x;
5859
5859
 
5860
5860
  returnArray.push({
5861
- treatment: infoArray[i].treatment,
5861
+ Treatment: infoArray[i].treatment,
5862
5862
  Mean: infoArray[i].Mean,
5863
5863
  Rp: Rp,
5864
5864
  D: infoArray[i].Mean - Rp,
@@ -5983,8 +5983,8 @@ export const ANOVA = {
5983
5983
  let diff = infoArray[i].Mean - infoArray[rev].Mean;
5984
5984
  let t = diff/Math.sqrt(MSE*(1/infoArray[i].N + 1/infoArray[rev].N))
5985
5985
  returnArray.push({
5986
- name: `${infoArray[i].treatment} - ${infoArray[rev].treatment}`,
5987
- meanDifference: diff,
5986
+ Name: `${infoArray[i].treatment} - ${infoArray[rev].treatment}`,
5987
+ MeanDifference: diff,
5988
5988
  T: t,
5989
5989
  LSD: tCrit*Math.sqrt(MSE*(1/infoArray[i].N + 1/infoArray[rev].N)),
5990
5990
  p: 2*Distributions.T.RightTail(t, DFE)
@@ -6008,7 +6008,7 @@ export const ANOVA = {
6008
6008
  let mean = Mean(data[key]);
6009
6009
  let tCrit = q_prime*Math.sqrt(MSE/n)
6010
6010
  returnArray.push({
6011
- treatment: key,
6011
+ Treatment: key,
6012
6012
  N: n,
6013
6013
  Mean: mean,
6014
6014
  T: tCrit,
@@ -6968,6 +6968,83 @@ export const ANOVA = {
6968
6968
  }
6969
6969
 
6970
6970
  export const MANOVA = {
6971
+ WilksLambda(responses: any, factors: any, interactions: any[] = []){
6972
+ let rKeys = Object.keys(responses);
6973
+ let fKeys = Object.keys(factors);
6974
+ let coefficientCount = Sum(fKeys.map(k => {return Unique(factors[k]).length})) - 1 + interactions.length;
6975
+ let dfError = responses[rKeys[0]].length - coefficientCount - 1;
6976
+
6977
+ let varTerms = [...fKeys];
6978
+
6979
+ let p = rKeys.length;
6980
+ let v = dfError;
6981
+
6982
+
6983
+ let returner: any = [];
6984
+ fKeys.map((fk) => {
6985
+ let factor = factors[fk]
6986
+ let q = Unique(factor).length - 1;
6987
+ let E = MANOVA.ErrorMatrix(responses, factor);
6988
+ let H = MANOVA.HypothesisMatrix(responses, factor);
6989
+ let lambda = Matrix.Determinant(E) / Matrix.Determinant(Matrix.Sum(H, E))
6990
+
6991
+ let m = 0.5 * (Math.abs(p - 1) - 1)
6992
+ let s = Math.min(p, 1);
6993
+ let u = 0.25*(p*q - 2)
6994
+
6995
+ let n = 0.5 * (v - p - 1)
6996
+ let r = v - 0.5*(p - q + 1)
6997
+ let t = (Math.pow(p, 2) + Math.pow(q, 2) - 5 > 0) ? Math.sqrt((Math.pow(p,2) * Math.pow(q,2) - 4)/(Math.pow(p,2) + Math.pow(q,2) - 5)) : 1
6998
+
6999
+ let f = (1 - Math.pow(lambda, 1/t)) / Math.pow(lambda, 1/t) * (r*t - 2*u) / (p * q)
7000
+ let denDF = (r*t - 2*u)
7001
+ let numDF = p*q
7002
+
7003
+ returner.push({
7004
+ DenominatorDF: denDF,
7005
+ F: f,
7006
+ Factor: fk,
7007
+ Lambda: lambda,
7008
+ NumeratorDF: numDF,
7009
+ p: Distributions.F.RightTail(f, denDF, numDF),
7010
+ })
7011
+ })
7012
+
7013
+ interactions.forEach(int => {
7014
+ let factor: any = [];
7015
+ for(let i = 0; i < responses[rKeys[0]].length; i++){
7016
+ factor.push(int.map(inter => {return factors[inter][i]}).join("*"))
7017
+ }
7018
+ console.log(factor);
7019
+
7020
+ let q = Unique(factor).length - 1;
7021
+ let E = MANOVA.ErrorMatrix(responses, factor);
7022
+ let H = MANOVA.HypothesisMatrix(responses, factor);
7023
+ let lambda = Matrix.Determinant(E) / Matrix.Determinant(Matrix.Sum(H, E))
7024
+
7025
+ let m = 0.5 * (Math.abs(p - 1) - 1)
7026
+ let s = Math.min(p, 1);
7027
+ let u = 0.25*(p*q - 2)
7028
+
7029
+ let n = 0.5 * (v - p - 1)
7030
+ let r = v - 0.5*(p - q + 1)
7031
+ let t = (Math.pow(p, 2) + Math.pow(q, 2) - 5 > 0) ? Math.sqrt((Math.pow(p,2) * Math.pow(q,2) - 4)/(Math.pow(p,2) + Math.pow(q,2) - 5)) : 1
7032
+
7033
+ let f = (1 - Math.pow(lambda, 1/t)) / Math.pow(lambda, 1/t) * (r*t - 2*u) / (p * q)
7034
+ let denDF = (r*t - 2*u)
7035
+ let numDF = p*q
7036
+
7037
+ returner.push({
7038
+ DenominatorDF: denDF,
7039
+ F: f,
7040
+ Factor: int.join("*"),
7041
+ Lambda: lambda,
7042
+ NumeratorDF: numDF,
7043
+ p: Distributions.F.RightTail(f, denDF, numDF),
7044
+ })
7045
+ })
7046
+ return returner
7047
+ },
6971
7048
  Report(responses: any, factors: any, interactions: any[] = []){
6972
7049
  let returner: any = []
6973
7050
  let rKeys = Object.keys(responses);
@@ -6986,7 +7063,6 @@ export const MANOVA = {
6986
7063
  let u = 0.25 * (p * q - 2);
6987
7064
  let m = 0.5 * (Math.abs(p - q) - 1)
6988
7065
  let n = 0.5 * (v - p - 1)
6989
- console.log({m, n, p, q, r, s, t, u, v})
6990
7066
 
6991
7067
  let TotalMatrix = Matrix.New(p, p); //Total SSCP
6992
7068
  let ErrorMatrix: any = Matrix.New(p, p); //Within
@@ -7017,6 +7093,7 @@ export const MANOVA = {
7017
7093
  ErrorMatrix = Matrix.Sum(ErrorMatrix, factorSSCP);
7018
7094
  })
7019
7095
 
7096
+ console.log({DeviationMatrix, nMatrix})
7020
7097
  let devXn = Matrix.Scale(DeviationMatrix, nMatrix);
7021
7098
  let HypothesisMatrix = Matrix.Multiply(Matrix.Transpose(DeviationMatrix), devXn)//, responses[rKeys[0]].length/factorGroups.length)
7022
7099
  console.log({HypothesisMatrix, ErrorMatrix})
@@ -7098,8 +7175,50 @@ export const MANOVA = {
7098
7175
  // })
7099
7176
  return returner
7100
7177
  },
7178
+ ErrorMatrix(responses: any, factor: any){
7179
+ let factorLevels = Unique(factor);
7180
+ let errorMatrix: any = Matrix.New(Object.keys(responses).length, Object.keys(responses).length);
7181
+ Matrix.Fill(errorMatrix, 0);
7182
+ factorLevels.forEach((lv, lvi) => {
7183
+ let nResponses = factor.filter(f => f == lv).length
7184
+ let filteredResponses = {}
7185
+ let responseMeans = {}
7186
+ Object.keys(responses).forEach(k => {
7187
+ let subgroup = responses[k].filter((r, ri) => factor[ri] == lv);
7188
+ filteredResponses[k] = subgroup;
7189
+ responseMeans[k] = Mean(subgroup);
7190
+ })
7191
+ let treatmentMatrix = Matrix.New(nResponses, Object.keys(responses).length);
7192
+ let deviationMatrix = Matrix.New(nResponses, Object.keys(responses).length);
7193
+ for(let i = 0; i < nResponses; i++){
7194
+ Object.keys(responses).forEach((k, ki) => {
7195
+ treatmentMatrix[i][ki] = filteredResponses[k][i]
7196
+ deviationMatrix[i][ki] = filteredResponses[k][i] - responseMeans[k]
7197
+ })
7198
+ }
7199
+ let SSCP = Matrix.Multiply(Matrix.Transpose(deviationMatrix), treatmentMatrix);
7200
+ errorMatrix = Matrix.Sum(errorMatrix, SSCP)
7201
+ })
7202
+ return errorMatrix
7203
+ },
7101
7204
  HypothesisMatrix(responses: any, factor: any){
7102
-
7205
+ let factorGroups = Unique(factor)
7206
+ let responseMeans: any = {}
7207
+ let deviationMatrix: any = Matrix.New(factorGroups.length, Object.keys(responses).length)
7208
+ let nMatrix: any = Matrix.New(factorGroups.length, Object.keys(responses).length)
7209
+ Object.keys(responses).forEach((k, ki) => {
7210
+ let responseMean = Mean(responses[k]);
7211
+ responseMeans[k] = responseMean
7212
+ factorGroups.forEach((g, gi) => {
7213
+ let subgroup = responses[k].filter((d, di) => factor[di] == g);
7214
+ deviationMatrix[gi][ki] = (Mean(subgroup) - responseMean)
7215
+ nMatrix[gi][ki] = subgroup.length
7216
+ })
7217
+ })
7218
+ let devXn = Matrix.Scale(deviationMatrix, nMatrix);
7219
+ let hypothesisMatrix = Matrix.Multiply(Matrix.Transpose(deviationMatrix), devXn);
7220
+
7221
+ return hypothesisMatrix
7103
7222
  }
7104
7223
  }
7105
7224
 
@@ -8626,6 +8745,49 @@ export const OutlierTesting = {
8626
8745
  rejectNull: p <= alpha,
8627
8746
  chart: outlierPlot
8628
8747
  }
8748
+ },
8749
+ /**
8750
+ * Performs Dixon's Test to test for and identify (if one exists) an outlier. H_0: data has no outliers | H_A: there is one outlier
8751
+ * @param data The array of numbers to evaluate
8752
+ * @param tails OPTIONAL: Whether to perform single or two-tailed Grubbs' Test. DEFAULT = 0: two-tailed | -1: lower tailed (checks if smallest value is an outlier) | 1: upper tailed (checks if largest value is an outlier)
8753
+ * @param alpha OPTIONAL: The significance value to evaluate outliers. DEFAULT = 0.05
8754
+ */
8755
+ Dixon(data: any[], i: number = 1, j: number = 0, alpha: number = 0.05, name?: string){
8756
+ let y = [...data].sort((a, b) => a-b);
8757
+ let n = y.length;
8758
+
8759
+ let r_ij = Math.max((y[i] - y[0])/(y[n - 1 - j] - y[0]), (y[n-1] - y[n - 1 - i])/(y[n-1] - y[j]))
8760
+
8761
+ let C = (Probability.Factorialize(n)*Math.pow(2*Math.PI, -3/2))/(Probability.Factorialize(j) * Probability.Factorialize(n - i - j - 2) * Probability.Factorialize(i - 1))
8762
+ const j_xvr = (x, v, r) => {}
8763
+ const t = (r, v) => {return (1 + Math.pow(r, 2))*Math.pow(v, 2)/2}
8764
+ const u2 = (x) => {return 3*Math.pow(x, 2)/2}
8765
+
8766
+ let p = NaN;
8767
+ let outliers:any = [];
8768
+ if(p <= alpha){
8769
+ // Add outliers
8770
+ if((y[i] - y[0])/(y[n - 1 - j] - y[0]) > (y[n-1] - y[n - 1 - i])/(y[n-1] - y[j])){
8771
+ outliers = [{i: data.findIndex(d => d == y[0]), value: y[0]}]
8772
+ }else{
8773
+ outliers = [{i: data.findIndex(d => d == y[n-1]), value: y[n-1]}]
8774
+ }
8775
+ }
8776
+
8777
+ let plotData = data.map((d, i) => {if(outliers.findIndex(o => o.i == i) >= 0){return new Point(d, 1, new CanvasDrawSettings("red","red",1,1))}else{return new Point(d, 1, new CanvasDrawSettings('#2183b2', '#2183b2'))}})
8778
+ let plotSettings = new ChartSettings();
8779
+ plotSettings.axis.y = new AxisSettings(0,2);
8780
+ plotSettings.axis.y.showAutoGridlines = false;
8781
+ plotSettings.axis.y.customGridlines = [new CustomGridline(1)];
8782
+ let title = name ? `Outlier Plot of ${name}` : `Outlier Plot`
8783
+ let outlierPlot = CreateScatterPlot([new DataSet(plotData)], title, plotSettings)
8784
+
8785
+ return {
8786
+ test: (i == 1 && j == 0) ? "Dixon's Q" : `Dixon's r${i}${j}`,
8787
+ r: r_ij,
8788
+ p: p,
8789
+ chart: outlierPlot
8790
+ }
8629
8791
  }
8630
8792
  }
8631
8793
 
@@ -9000,7 +9162,7 @@ export const UnbiasingConstant = {
9000
9162
  return 3.4873 + 0.0250141 * N - 0.00009823 * Math.pow(N,2);
9001
9163
  },
9002
9164
  D2prime(g: number, m: number){
9003
- let d2PrimeTable:any = [];
9165
+ let d2PrimeTable:any = [[{"df":1,"d2":1.41421},{"df":2,"d2":1.91155},{"df":2.9,"d2":2.23887},{"df":3.8,"d2":2.48124},{"df":4.7,"d2":2.67253},{"df":5.5,"d2":2.82981},{"df":6.3,"d2":2.96288},{"df":7,"d2":3.07794},{"df":7.7,"d2":3.17905},{"df":8.3,"d2":3.26909},{"df":9,"d2":3.35016},{"df":9.6,"d2":3.42378},{"df":10.2,"d2":3.49116},{"df":10.8,"d2":3.55333},{"df":11.3,"d2":3.61071},{"df":11.9,"d2":3.66422},{"df":12.4,"d2":3.71424},{"df":12.9,"d2":3.76118},{"df":13.4,"d2":3.80537}],[{"df":1.9,"d2":1.27931},{"df":3.8,"d2":1.80538},{"df":5.7,"d2":2.15069},{"df":7.5,"d2":2.40484},{"df":9.2,"d2":2.60438},{"df":10.8,"d2":2.76779},{"df":12.3,"d2":2.90562},{"df":13.8,"d2":3.02446},{"df":15.1,"d2":3.12869},{"df":16.5,"d2":3.22134},{"df":17.8,"d2":3.30463},{"df":19,"d2":3.38017},{"df":20.2,"d2":3.44922},{"df":21.3,"d2":3.51287},{"df":22.4,"d2":3.57156},{"df":23.5,"d2":3.62625},{"df":24.5,"d2":3.67734},{"df":25.5,"d2":3.72524},{"df":26.5,"d2":3.77032}],[{"df":2.8,"d2":1.23105},{"df":5.7,"d2":1.76858},{"df":8.4,"d2":2.12049},{"df":11.1,"d2":2.37883},{"df":13.6,"d2":2.58127},{"df":16,"d2":2.74681},{"df":18.3,"d2":2.88628},{"df":20.5,"d2":3.00643},{"df":22.6,"d2":3.11173},{"df":24.6,"d2":3.20526},{"df":26.5,"d2":3.28931},{"df":28.4,"d2":3.3655},{"df":30.1,"d2":3.43512},{"df":31.9,"d2":3.49927},{"df":33.5,"d2":3.55842},{"df":35.1,"d2":3.61351},{"df":36.7,"d2":3.66495},{"df":38.2,"d2":3.71319},{"df":39.7,"d2":3.75857}],[{"df":3.7,"d2":1.20621},{"df":7.5,"d2":1.74989},{"df":11.2,"d2":2.10522},{"df":14.7,"d2":2.36571},{"df":18.1,"d2":2.56964},{"df":21.3,"d2":2.73626},{"df":24.4,"d2":2.87656},{"df":27.3,"d2":2.99737},{"df":30.1,"d2":3.10321},{"df":32.7,"d2":3.1972},{"df":35.3,"d2":3.28163},{"df":37.7,"d2":3.35815},{"df":40.1,"d2":3.42805},{"df":42.4,"d2":3.49246},{"df":44.6,"d2":3.55183},{"df":46.7,"d2":3.60712},{"df":48.8,"d2":3.65875},{"df":50.8,"d2":3.70715},{"df":52.8,"d2":3.75268}],[{"df":4.6,"d2":1.19105},{"df":9.3,"d2":1.73857},{"df":13.9,"d2":2.09601},{"df":18.4,"d2":2.35781},{"df":22.6,"d2":2.56263},{"df":26.6,"d2":2.72991},{"df":30.4,"d2":2.87071},{"df":34,"d2":2.99192},{"df":37.5,"d2":3.09808},{"df":40.8,"d2":3.19235},{"df":44,"d2":3.27701},{"df":47.1,"d2":3.35372},{"df":50.1,"d2":3.42381},{"df":52.9,"d2":3.48836},{"df":55.7,"d2":3.54787},{"df":58.4,"d2":3.60328},{"df":61,"d2":3.65502},{"df":63.5,"d2":3.70352},{"df":65.9,"d2":3.74914}],[{"df":5.5,"d2":1.18083},{"df":11.1,"d2":1.73099},{"df":16.7,"d2":2.08985},{"df":22,"d2":2.35253},{"df":27,"d2":2.55795},{"df":31.8,"d2":2.72567},{"df":36.4,"d2":2.8668},{"df":40.8,"d2":2.98829},{"df":45,"d2":3.09467},{"df":49,"d2":3.18911},{"df":52.8,"d2":3.27392},{"df":56.5,"d2":3.35077},{"df":60.1,"d2":3.42097},{"df":63.5,"d2":3.48563},{"df":66.8,"d2":3.54522},{"df":70,"d2":3.60072},{"df":73.1,"d2":3.65253},{"df":76.1,"d2":3.70109},{"df":79.1,"d2":3.74678}],[{"df":6.4,"d2":1.17348},{"df":12.9,"d2":1.72555},{"df":19.4,"d2":2.08543},{"df":25.6,"d2":2.34875},{"df":31.5,"d2":2.5546},{"df":37.1,"d2":2.72263},{"df":42.5,"d2":2.86401},{"df":47.6,"d2":2.98568},{"df":52.4,"d2":3.09222},{"df":57.1,"d2":3.18679},{"df":61.6,"d2":3.27172},{"df":65.9,"d2":3.34866},{"df":70,"d2":3.41894},{"df":74,"d2":3.48368},{"df":77.9,"d2":3.54333},{"df":81.6,"d2":3.59888},{"df":85.3,"d2":3.65075},{"df":88.8,"d2":3.69936},{"df":92.2,"d2":3.74509}],[{"df":7.2,"d2":1.16794},{"df":14.8,"d2":1.72147},{"df":22.1,"d2":2.08212},{"df":29.2,"d2":2.34591},{"df":36,"d2":2.55208},{"df":42.4,"d2":2.72036},{"df":48.5,"d2":2.86192},{"df":54.3,"d2":2.98373},{"df":59.9,"d2":3.09039},{"df":65.2,"d2":3.18506},{"df":70.3,"d2":3.27006},{"df":75.2,"d2":3.34708},{"df":80,"d2":3.41742},{"df":84.6,"d2":3.48221},{"df":89,"d2":3.54192},{"df":93.3,"d2":3.59751},{"df":97.4,"d2":3.64941},{"df":101.4,"d2":3.69806},{"df":105.3,"d2":3.74382}],[{"df":8.1,"d2":1.16361},{"df":16.6,"d2":1.71828},{"df":24.9,"d2":2.07953},{"df":32.9,"d2":2.3437},{"df":40.4,"d2":2.55013},{"df":47.7,"d2":2.71858},{"df":54.5,"d2":2.86028},{"df":61.1,"d2":2.98221},{"df":67.3,"d2":3.08896},{"df":73.3,"d2":3.1837},{"df":79.1,"d2":3.26878},{"df":84.6,"d2":3.34585},{"df":90,"d2":3.41624},{"df":95.1,"d2":3.48107},{"df":100.1,"d2":3.54081},{"df":104.9,"d2":3.59644},{"df":109.5,"d2":3.64838},{"df":114.1,"d2":3.69705},{"df":118.5,"d2":3.74284}],[{"df":9,"d2":1.16014},{"df":18.4,"d2":1.71573},{"df":27.6,"d2":2.07746},{"df":36.5,"d2":2.34192},{"df":44.9,"d2":2.54856},{"df":52.9,"d2":2.71717},{"df":60.6,"d2":2.85898},{"df":67.8,"d2":2.981},{"df":74.8,"d2":3.08781},{"df":81.5,"d2":3.18262},{"df":87.9,"d2":3.26775},{"df":94,"d2":3.34486},{"df":99.9,"d2":3.41529},{"df":105.6,"d2":3.48016},{"df":111.2,"d2":3.53993},{"df":116.5,"d2":3.59559},{"df":121.7,"d2":3.64755},{"df":126.7,"d2":3.69625},{"df":131.6,"d2":3.74205}],[{"df":9.9,"d2":1.15729},{"df":20.2,"d2":1.71363},{"df":30.4,"d2":2.07577},{"df":40.1,"d2":2.34048},{"df":49.4,"d2":2.54728},{"df":58.2,"d2":2.716},{"df":66.6,"d2":2.85791},{"df":74.6,"d2":2.98},{"df":82.2,"d2":3.08688},{"df":89.6,"d2":3.18174},{"df":96.6,"d2":3.2669},{"df":103.4,"d2":3.34406},{"df":109.9,"d2":3.41452},{"df":116.2,"d2":3.47941},{"df":122.3,"d2":3.53921},{"df":128.1,"d2":3.59489},{"df":133.8,"d2":3.64687},{"df":139.4,"d2":3.69558},{"df":144.7,"d2":3.74141}],[{"df":10.7,"d2":1.1549},{"df":22,"d2":1.71189},{"df":33.1,"d2":2.07436},{"df":43.7,"d2":2.33927},{"df":53.8,"d2":2.54621},{"df":63.5,"d2":2.71504},{"df":72.6,"d2":2.85702},{"df":81.3,"d2":2.97917},{"df":89.7,"d2":3.0861},{"df":97.7,"d2":3.181},{"df":105.4,"d2":3.2662},{"df":112.7,"d2":3.34339},{"df":119.9,"d2":3.41387},{"df":126.7,"d2":3.47879},{"df":133.3,"d2":3.53861},{"df":139.8,"d2":3.5943},{"df":146,"d2":3.6463},{"df":152,"d2":3.69503},{"df":157.9,"d2":3.74087}],[{"df":11.6,"d2":1.15289},{"df":23.8,"d2":1.71041},{"df":35.8,"d2":2.07316},{"df":47.3,"d2":2.33824},{"df":58.3,"d2":2.5453},{"df":68.7,"d2":2.71422},{"df":78.6,"d2":2.85627},{"df":88.1,"d2":2.97847},{"df":97.1,"d2":3.08544},{"df":105.8,"d2":3.18037},{"df":114.1,"d2":3.26561},{"df":122.1,"d2":3.34282},{"df":129.8,"d2":3.41333},{"df":137.3,"d2":3.47826},{"df":144.4,"d2":3.5381},{"df":151.4,"d2":3.59381},{"df":158.1,"d2":3.64582},{"df":164.7,"d2":3.69457},{"df":171,"d2":3.74041}],[{"df":12.5,"d2":1.15115},{"df":25.7,"d2":1.70914},{"df":38.6,"d2":2.07213},{"df":51,"d2":2.33737},{"df":62.8,"d2":2.54452},{"df":74,"d2":2.71351},{"df":84.7,"d2":2.85562},{"df":94.9,"d2":2.97787},{"df":104.6,"d2":3.08487},{"df":113.9,"d2":3.17984},{"df":122.9,"d2":3.2651},{"df":131.5,"d2":3.34233},{"df":139.8,"d2":3.41286},{"df":147.8,"d2":3.47781},{"df":155.5,"d2":3.53766},{"df":163,"d2":3.59339},{"df":170.3,"d2":3.64541},{"df":177.3,"d2":3.69417},{"df":184.2,"d2":3.74002}],[{"df":13.4,"d2":1.14965},{"df":27.5,"d2":1.70804},{"df":41.3,"d2":2.07125},{"df":54.6,"d2":2.33661},{"df":67.2,"d2":2.54385},{"df":79.3,"d2":2.7129},{"df":90.7,"d2":2.85506},{"df":101.6,"d2":2.97735},{"df":112.1,"d2":3.08438},{"df":122.1,"d2":3.17938},{"df":131.7,"d2":3.26465},{"df":140.9,"d2":3.34191},{"df":149.8,"d2":3.41245},{"df":158.3,"d2":3.47742},{"df":166.6,"d2":3.53728},{"df":174.6,"d2":3.59302},{"df":182.4,"d2":3.64505},{"df":190,"d2":3.69382},{"df":197.3,"d2":3.73969}],[{"df":14.3,"d2":1.14833},{"df":29.3,"d2":1.70708},{"df":44.1,"d2":2.07047},{"df":58.2,"d2":2.33594},{"df":71.7,"d2":2.54326},{"df":84.5,"d2":2.71237},{"df":96.7,"d2":2.85457},{"df":108.4,"d2":2.97689},{"df":119.5,"d2":3.08395},{"df":130.2,"d2":3.17897},{"df":140.4,"d2":3.26427},{"df":150.2,"d2":3.34154},{"df":159.7,"d2":3.4121},{"df":168.9,"d2":3.47707},{"df":177.7,"d2":3.53695},{"df":186.3,"d2":3.5927},{"df":194.6,"d2":3.64474},{"df":202.6,"d2":3.69351},{"df":210.4,"d2":3.73939}],[{"df":15.1,"d2":1.14717},{"df":31.1,"d2":1.70623},{"df":46.8,"d2":2.06978},{"df":61.8,"d2":2.33535},{"df":76.2,"d2":2.54274},{"df":89.8,"d2":2.7119},{"df":102.8,"d2":2.85413},{"df":115.1,"d2":2.97649},{"df":127,"d2":3.08358},{"df":138.3,"d2":3.17861},{"df":149.2,"d2":3.26393},{"df":159.6,"d2":3.34121},{"df":169.7,"d2":3.41178},{"df":179.4,"d2":3.47677},{"df":188.8,"d2":3.53666},{"df":197.9,"d2":3.59242},{"df":206.7,"d2":3.64447},{"df":215.2,"d2":3.69325},{"df":223.6,"d2":3.73913}],[{"df":16,"d2":1.14613},{"df":32.9,"d2":1.70547},{"df":49.5,"d2":2.06917},{"df":65.5,"d2":2.33483},{"df":80.6,"d2":2.54228},{"df":95.1,"d2":2.71148},{"df":108.8,"d2":2.85375},{"df":121.9,"d2":2.97613},{"df":134.4,"d2":3.08324},{"df":146.4,"d2":3.17829},{"df":157.9,"d2":3.26362},{"df":169,"d2":3.34092},{"df":179.7,"d2":3.4115},{"df":190,"d2":3.4765},{"df":199.9,"d2":3.5364},{"df":209.5,"d2":3.59216},{"df":218.8,"d2":3.64422},{"df":227.9,"d2":3.69301},{"df":236.7,"d2":3.7389}],[{"df":16.9,"d2":1.1452},{"df":34.7,"d2":1.7048},{"df":52.3,"d2":2.06862},{"df":69.1,"d2":2.33436},{"df":85.1,"d2":2.54187},{"df":100.3,"d2":2.71111},{"df":114.8,"d2":2.85341},{"df":128.7,"d2":2.97581},{"df":141.9,"d2":3.08294},{"df":154.5,"d2":3.17801},{"df":166.7,"d2":3.26335},{"df":178.4,"d2":3.34066},{"df":189.6,"d2":3.41125},{"df":200.5,"d2":3.47626},{"df":211,"d2":3.53617},{"df":221.1,"d2":3.59194},{"df":231,"d2":3.644},{"df":240.5,"d2":3.6928},{"df":249.8,"d2":3.73869}],[{"df":17.8,"d2":1.14437},{"df":36.5,"d2":1.70419},{"df":55,"d2":2.06813},{"df":72.7,"d2":2.33394},{"df":89.6,"d2":2.54149},{"df":105.6,"d2":2.71077},{"df":120.9,"d2":2.8531},{"df":135.4,"d2":2.97552},{"df":149.3,"d2":3.08267},{"df":162.7,"d2":3.17775},{"df":175.5,"d2":3.26311},{"df":187.8,"d2":3.34042},{"df":199.6,"d2":3.41103},{"df":211,"d2":3.47605},{"df":222.1,"d2":3.53596},{"df":232.8,"d2":3.59174},{"df":243.1,"d2":3.6438},{"df":253.2,"d2":3.6926},{"df":263,"d2":3.7385}]]
9004
9166
  if(g > 20){
9005
9167
  // https://dastmardi.ir/wp-content/uploads/2017/07/MSA_Reference_Manual_4th_Edition.pdf#page=212&zoom=100,0,97
9006
9168
  let d2s = [1.12838, .69257, 2.05875, 2.32593, 2.53441, 2.70436, 2.8472, 2.97003, 3.07751, 3.17287, 3.25845, 3.33598, 3.40676, 3.47193, 3.53198, 3.58788, 3.64006, 3.68896, 3.735]
@@ -10934,6 +11096,8 @@ export function QQPlotChart(data: number[], distribution: string = 'Normal'){
10934
11096
 
10935
11097
  chartSettings.axis.y.customGridlines = customGridlines;
10936
11098
  chartSettings.axis.y.showAutoGridlines = false;
11099
+ chartSettings.width += 100;
11100
+ chartSettings.margins.right += 100;
10937
11101
 
10938
11102
  if(distribution.toLowerCase().includes('exponential')){
10939
11103
  chartSettings.axis.x.max = 100;
@@ -11018,7 +11182,7 @@ export function QQPlotChart(data: number[], distribution: string = 'Normal'){
11018
11182
  { key: "KS:", value: KS.KS }, { key: "p-value:", value: KS.p }, { key: "", value: "" },
11019
11183
  { key: "Lf:", value: LF.KS }, { key: "p-value:", value: LF.p }, { key: "", value: "" },
11020
11184
  { key: "RJ:", value: RJ.RJ }, { key: "crit.:", value: RJ.critical }, { key: "", value: "" },
11021
- { key: "SW(R):", value: SWR.W }, { key: "p-value:", value: SWR.p }, { key: "", value: "" },], 1075, 50, 175, 100, "", 30);
11185
+ { key: "SW(R):", value: SWR.W }, { key: "p-value:", value: SWR.p }, { key: "", value: "" },], chartSettings.width - chartSettings.margins.right + 50, 50, chartSettings.margins.right - 50, 100, "", 30, new EngFont("black","Calibri","28px"));
11022
11186
  }
11023
11187
  }else{
11024
11188
  let dist = distribution.replace("-", "").replace("arameter", "").replace(/\s/g, "");
@@ -11031,7 +11195,7 @@ export function QQPlotChart(data: number[], distribution: string = 'Normal'){
11031
11195
  let ctx: any = chart.getContext("2d");
11032
11196
 
11033
11197
  if(ctx && (AD.AD || AD.AD === Infinity || Number.isNaN(AD.AD)) && (AD.p || AD.p === Infinity || Number.isNaN(AD.p))){
11034
- AddInfoTable(ctx, [{ key: "AD:", value: AD.AD }, { key: "p-value:", value: AD.p }], 1075, 150, 175, 100, "", 30);
11198
+ AddInfoTable(ctx, [{ key: "AD:", value: AD.AD }, { key: "p-value:", value: AD.p }], chartSettings.width - chartSettings.margins.right + 50, 175, chartSettings.margins.right - 50, 100, "", 30, new EngFont("black","Calibri","28px"));
11035
11199
  }
11036
11200
 
11037
11201
  }
@@ -11129,8 +11293,7 @@ function FactorCode(level: any, factorLevels: string[]){
11129
11293
  return centered
11130
11294
  }
11131
11295
 
11132
-
11133
- export function GeneralizedLinearModel(dependent: number[], factors: any, covariates: any = {}, interactions: any[][] = []){
11296
+ export function GeneralizedLinearModel(dependent: number[], factors: any, covariates: any = {}, interactions: any[][] = [], simple?: boolean){
11134
11297
  let refactored = {...covariates};
11135
11298
  let unfactored = {...covariates, ...factors}
11136
11299
  let refactoredWLevels = {...covariates}
@@ -11258,7 +11421,6 @@ export function MultipleLinearRegression(dependent: number[], factors: any, inte
11258
11421
  row[fi] = fObj[f][ri]
11259
11422
  })
11260
11423
  })
11261
-
11262
11424
  let inv_xTx = Matrix.Inverse(Matrix.Multiply(Matrix.Transpose(x), x))
11263
11425
  let xTy = Matrix.Multiply(Matrix.Transpose(x), y);
11264
11426
  let betaEstimators = Matrix.Multiply(inv_xTx, xTy);
@@ -12225,7 +12387,7 @@ function BiasVsReferencePlot(biasAndLinearity: any, parts: any[], referenceValue
12225
12387
  let biasInfo: any = []
12226
12388
  if(biasAndLinearity.GageLinearity.Linearity){
12227
12389
  modelInfo.push(["Linearity", RoundDigits(biasAndLinearity.GageLinearity.Linearity, 6),"%Linearity",RoundDigits(biasAndLinearity.GageLinearity.PercentLinearity*100, 2)+"%"])
12228
- biasInfo = [["Reference Value", "Bias", "%Bias"], ...biasAndLinearity.GageBias.map(d => {return [RoundDigits(d.ReferenceValue, 6, true), RoundDigits(d.Bias, 6), RoundDigits(d.PercentBias*100, 2)]})]
12390
+ biasInfo = [["Reference Value", "Bias", "%Bias", "P"], ...biasAndLinearity.GageBias.map(d => {return [RoundDigits(d.ReferenceValue, 6, true), RoundDigits(d.Bias, 6), RoundDigits(d.PercentBias*100, 2), RoundDigits(d.p, 3)]})]
12229
12391
 
12230
12392
  // Draw %Process Variation Chart
12231
12393
  let miniX = chartSettings.width - chartSettings.margins.right + 75
@@ -12492,24 +12654,22 @@ export function GageLinearityAndBias(parts: any[], referenceValues: number[], re
12492
12654
  let avgMeasure = Mean(measurements);
12493
12655
 
12494
12656
  let t = NaN;
12657
+ let {d2: d2, df: df} = UnbiasingConstant.D2prime(n, Object.keys(byParts).length)
12495
12658
  if(useStDevMethod){
12496
12659
  let σ = Math.sqrt(SumSq(measurements.map(d => {return d - avgMeasure}))/(n - 1))
12497
12660
  t = bias / (σ/Math.sqrt(n))
12498
12661
  }else{
12499
- let σ = (Math.max(...biases) - Math.min(...biases)) / UnbiasingConstant.D2(n);
12500
- console.log({σ, d2: UnbiasingConstant.D2(n)})
12662
+ let σ = (Math.max(...biases) - Math.min(...biases)) / d2;
12501
12663
  t = bias / (σ/Math.sqrt(n))
12502
12664
  }
12503
-
12504
- let df = n - 1;
12505
- let pValue = 2 * (1 - Distributions.T.cdf(Math.abs(t), df))
12506
- console.log({t, pValue})
12665
+ console.log(t, df)
12666
+ let pValue = Distributions.T.cdf(-Math.abs(t), df) + Distributions.T.RightTail(Math.abs(t), df)
12507
12667
 
12508
12668
  partBiases.push({
12509
12669
  ReferenceValue: ref,
12510
12670
  Bias: bias,
12511
12671
  PercentBias: processVariation ? Math.abs(bias/processVariation) : NaN,
12512
- // p: pValue
12672
+ p: pValue
12513
12673
  })
12514
12674
 
12515
12675
  biasAsY.push(bias)
@@ -12517,12 +12677,13 @@ export function GageLinearityAndBias(parts: any[], referenceValues: number[], re
12517
12677
  })
12518
12678
 
12519
12679
  let avgBias = Mean(partBiases.map(b => {return b.Bias}))
12520
- let avgT = avgBias/(Math.max(...biasAsY) - Math.min(...biasAsY))/(UnbiasingConstant.D2(responses.length))/Math.sqrt(responses.length)
12680
+ let {d2: avgD2, df: avgDF} = UnbiasingConstant.D2prime(4, 5)
12681
+ let avgT = avgBias/(Math.max(...biasAsY) - Math.min(...biasAsY))/(avgD2)/Math.sqrt(responses.length)
12521
12682
  let avgGroup = {
12522
12683
  ReferenceValue: "Average",
12523
12684
  Bias: avgBias,
12524
12685
  PercentBias: processVariation ? Math.abs(avgBias/processVariation) : NaN,
12525
- p: Distributions.T.cdf(Math.abs(avgT), responses.length - 1)
12686
+ p: Distributions.T.cdf(Math.abs(avgT), avgDF)
12526
12687
  }
12527
12688
  let gageBiases = [avgGroup, ...partBiases]
12528
12689
 
@@ -13331,7 +13492,7 @@ function AllIdentical(values: any[]){
13331
13492
  }
13332
13493
  return identical
13333
13494
  }
13334
- function Unique(values: any[]){
13495
+ export function Unique(values: any[]){
13335
13496
  let unique: any[] = [];
13336
13497
  values.forEach(v => {
13337
13498
  if(unique.indexOf(v) < 0){
@@ -13545,4 +13706,5 @@ const Matrix = {
13545
13706
  },
13546
13707
  }
13547
13708
  // End Matrix Functions
13548
- /** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
13709
+ /** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */// Validation
13710
+
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qesuite",
3
- "version": "1.0.58",
3
+ "version": "1.0.59",
4
4
  "description": "Performs advanced statistical analysis of data. Specifically designed for engineering statistical analysis",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -0,0 +1,3 @@
1
+ - Changed Font Size for normality test results in QQPlotChart()
2
+ - Adjusted Output Property names of Post Hoc tests to align with Capitalization Format
3
+ - Added an Export for the Unique Function