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 +19 -4
- package/dist/index.d.ts +19 -4
- package/dist/index.js +181 -20
- package/dist/index.mjs +180 -20
- package/index.ts +187 -25
- package/package.json +1 -1
- package/versions/1_0_59.md +3 -0
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
5715
|
-
|
|
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
|
-
|
|
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
|
-
],
|
|
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 }],
|
|
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)) /
|
|
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
|
-
|
|
11653
|
-
let pValue =
|
|
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
|
-
|
|
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
|
|
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),
|
|
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
|
-
|
|
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
|
-
|
|
5591
|
-
|
|
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
|
-
|
|
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
|
-
],
|
|
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 }],
|
|
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)) /
|
|
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
|
-
|
|
11529
|
-
let pValue =
|
|
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
|
-
|
|
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
|
|
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),
|
|
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
|
-
|
|
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
|
-
|
|
5987
|
-
|
|
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
|
-
|
|
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: "" },],
|
|
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 }],
|
|
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)) /
|
|
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
|
|
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
|
-
|
|
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
|
|
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),
|
|
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