qesuite 1.0.32 → 1.0.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -611,6 +611,18 @@ declare const Distributions: {
611
611
  KS: number;
612
612
  p: any;
613
613
  };
614
+ ShapiroWilk: {
615
+ Test(data: number[], expanded?: boolean): {
616
+ W: number;
617
+ p: number;
618
+ };
619
+ constants: number[][];
620
+ p(W: number, N: number): number;
621
+ pChart: {
622
+ wValues: number[][];
623
+ pValues: number[];
624
+ };
625
+ };
614
626
  };
615
627
  T: {
616
628
  /**
@@ -895,14 +907,6 @@ declare function SerializeData(data: number[]): DataSet;
895
907
  */
896
908
  declare function CreateScatterPlot(data: DataSet[], title?: string, chartSettings?: ChartSettings): HTMLCanvasElement;
897
909
  /**
898
- * Checks if data is out of control and marks out-of-control points
899
- * @param data An array of data sets to check
900
- * @param UCL Upper Control Limit
901
- * @param LCL Lower Control Limit
902
- * @param display Display settings for out-of-control points. DEFAULT: RED SQUARE
903
- */
904
- declare function MarkOutOfControl(data: DataSet, UCL: number, LCL: number, display?: CanvasDrawSettings): void;
905
- /**
906
910
  * Create a histogram
907
911
  * @param data An array of data sets to plot
908
912
  * @param title Title to display on chart
@@ -1134,4 +1138,4 @@ declare function GRRByPartChart(data: GRRData): HTMLCanvasElement;
1134
1138
  declare function GRRPartxOperatorChart(data: GRRData): HTMLCanvasElement;
1135
1139
  declare function CompileGRRObject(operators: any, parts: any, measurements: any): GRRData;
1136
1140
 
1137
- export { AnovaTableTwoWay, AverageMovingRange, AxisSettings, Beta, CanvasDrawSettings, Capability, Chart, ChartSettings, CompileGRRObject, CreateBoxandWhiskerGraph, CreateCapabilityHistogram, CreateCapabilityPlot, CreateCategoricalBarGraph, CreateContinuousBarGraph, CreateScatterPlot, CreateSplitGraph, CreateStackedChart, CreateSummaryChart, CustomGridline, DataCollection, DataSet, Distributions, ERF, EngFont, FixedPointIteration, G1, G1Graphs, GRR, GRRByPartChart, GRRData, GRRGraphs, GRROperator, GRRPartxOperatorChart, GRRReplication, GageEvaluation, Gamma, GetFunctionValues, GetHistogramDataset, GoodnessOfFit, IndividualDistributionIdentification, IndividualDistributionPlots, IndividualValuePlot, LastObservationsChart, Line, Margin, MarkOutOfControl, MaximumLikelihoodParameters, Mean, Median, MovingRange, MovingRangeChart, NewtonRaphson, ObjectToArray, ParameterizedCDF, Point, QQPlot, QQPlotChart, Rang, RoundTO, SerializeData, Specification, StDev, Sum, UnbiasingConstant, VarianceComponents };
1141
+ export { AnovaTableTwoWay, AverageMovingRange, AxisSettings, Beta, CanvasDrawSettings, Capability, Chart, ChartSettings, CompileGRRObject, CreateBoxandWhiskerGraph, CreateCapabilityHistogram, CreateCapabilityPlot, CreateCategoricalBarGraph, CreateContinuousBarGraph, CreateScatterPlot, CreateSplitGraph, CreateStackedChart, CreateSummaryChart, CustomGridline, DataCollection, DataSet, Distributions, ERF, EngFont, FixedPointIteration, G1, G1Graphs, GRR, GRRByPartChart, GRRData, GRRGraphs, GRROperator, GRRPartxOperatorChart, GRRReplication, GageEvaluation, Gamma, GetFunctionValues, GetHistogramDataset, GoodnessOfFit, IndividualDistributionIdentification, IndividualDistributionPlots, IndividualValuePlot, LastObservationsChart, Line, Margin, MaximumLikelihoodParameters, Mean, Median, MovingRange, MovingRangeChart, NewtonRaphson, ObjectToArray, ParameterizedCDF, Point, QQPlot, QQPlotChart, Rang, RoundTO, SerializeData, Specification, StDev, Sum, UnbiasingConstant, VarianceComponents };
package/dist/index.d.ts CHANGED
@@ -611,6 +611,18 @@ declare const Distributions: {
611
611
  KS: number;
612
612
  p: any;
613
613
  };
614
+ ShapiroWilk: {
615
+ Test(data: number[], expanded?: boolean): {
616
+ W: number;
617
+ p: number;
618
+ };
619
+ constants: number[][];
620
+ p(W: number, N: number): number;
621
+ pChart: {
622
+ wValues: number[][];
623
+ pValues: number[];
624
+ };
625
+ };
614
626
  };
615
627
  T: {
616
628
  /**
@@ -895,14 +907,6 @@ declare function SerializeData(data: number[]): DataSet;
895
907
  */
896
908
  declare function CreateScatterPlot(data: DataSet[], title?: string, chartSettings?: ChartSettings): HTMLCanvasElement;
897
909
  /**
898
- * Checks if data is out of control and marks out-of-control points
899
- * @param data An array of data sets to check
900
- * @param UCL Upper Control Limit
901
- * @param LCL Lower Control Limit
902
- * @param display Display settings for out-of-control points. DEFAULT: RED SQUARE
903
- */
904
- declare function MarkOutOfControl(data: DataSet, UCL: number, LCL: number, display?: CanvasDrawSettings): void;
905
- /**
906
910
  * Create a histogram
907
911
  * @param data An array of data sets to plot
908
912
  * @param title Title to display on chart
@@ -1134,4 +1138,4 @@ declare function GRRByPartChart(data: GRRData): HTMLCanvasElement;
1134
1138
  declare function GRRPartxOperatorChart(data: GRRData): HTMLCanvasElement;
1135
1139
  declare function CompileGRRObject(operators: any, parts: any, measurements: any): GRRData;
1136
1140
 
1137
- export { AnovaTableTwoWay, AverageMovingRange, AxisSettings, Beta, CanvasDrawSettings, Capability, Chart, ChartSettings, CompileGRRObject, CreateBoxandWhiskerGraph, CreateCapabilityHistogram, CreateCapabilityPlot, CreateCategoricalBarGraph, CreateContinuousBarGraph, CreateScatterPlot, CreateSplitGraph, CreateStackedChart, CreateSummaryChart, CustomGridline, DataCollection, DataSet, Distributions, ERF, EngFont, FixedPointIteration, G1, G1Graphs, GRR, GRRByPartChart, GRRData, GRRGraphs, GRROperator, GRRPartxOperatorChart, GRRReplication, GageEvaluation, Gamma, GetFunctionValues, GetHistogramDataset, GoodnessOfFit, IndividualDistributionIdentification, IndividualDistributionPlots, IndividualValuePlot, LastObservationsChart, Line, Margin, MarkOutOfControl, MaximumLikelihoodParameters, Mean, Median, MovingRange, MovingRangeChart, NewtonRaphson, ObjectToArray, ParameterizedCDF, Point, QQPlot, QQPlotChart, Rang, RoundTO, SerializeData, Specification, StDev, Sum, UnbiasingConstant, VarianceComponents };
1141
+ export { AnovaTableTwoWay, AverageMovingRange, AxisSettings, Beta, CanvasDrawSettings, Capability, Chart, ChartSettings, CompileGRRObject, CreateBoxandWhiskerGraph, CreateCapabilityHistogram, CreateCapabilityPlot, CreateCategoricalBarGraph, CreateContinuousBarGraph, CreateScatterPlot, CreateSplitGraph, CreateStackedChart, CreateSummaryChart, CustomGridline, DataCollection, DataSet, Distributions, ERF, EngFont, FixedPointIteration, G1, G1Graphs, GRR, GRRByPartChart, GRRData, GRRGraphs, GRROperator, GRRPartxOperatorChart, GRRReplication, GageEvaluation, Gamma, GetFunctionValues, GetHistogramDataset, GoodnessOfFit, IndividualDistributionIdentification, IndividualDistributionPlots, IndividualValuePlot, LastObservationsChart, Line, Margin, MaximumLikelihoodParameters, Mean, Median, MovingRange, MovingRangeChart, NewtonRaphson, ObjectToArray, ParameterizedCDF, Point, QQPlot, QQPlotChart, Rang, RoundTO, SerializeData, Specification, StDev, Sum, UnbiasingConstant, VarianceComponents };
package/dist/index.js CHANGED
@@ -64,7 +64,6 @@ __export(QESuite_exports, {
64
64
  LastObservationsChart: () => LastObservationsChart,
65
65
  Line: () => Line,
66
66
  Margin: () => Margin,
67
- MarkOutOfControl: () => MarkOutOfControl,
68
67
  MaximumLikelihoodParameters: () => MaximumLikelihoodParameters,
69
68
  Mean: () => Mean,
70
69
  Median: () => Median,
@@ -644,7 +643,7 @@ function IndividualValuePlot(data, title, historicalMean) {
644
643
  chartSettings.axis.x.autoSize = false;
645
644
  let dataset = SerializeData(data);
646
645
  dataset.line.type = "straight";
647
- MarkOutOfControl(dataset, UCL, LCL);
646
+ MarkOutOfControl(dataset, UCL, LCL, centerline, std);
648
647
  return CreateScatterPlot([dataset], title, chartSettings);
649
648
  }
650
649
  function MovingRangeChart(data, title, w = 2) {
@@ -673,7 +672,7 @@ function MovingRangeChart(data, title, w = 2) {
673
672
  chartSettings.axis.x.autoSize = false;
674
673
  let dataset = SerializeData(movingRange);
675
674
  dataset.line.type = "straight";
676
- MarkOutOfControl(dataset, UCL, LCL);
675
+ MarkOutOfControl(dataset, UCL, LCL, void 0, void 0, void 0, [1]);
677
676
  return CreateScatterPlot([dataset], title, chartSettings);
678
677
  }
679
678
  function LastObservationsChart(data, N, title) {
@@ -1585,7 +1584,7 @@ var Distributions = {
1585
1584
  let dMinusArray = [];
1586
1585
  let dPlusArray = [];
1587
1586
  for (let i = 1; i <= N; i++) {
1588
- let Z_i = this.cdf(data[i - 1], mean, std);
1587
+ let Z_i = this.cdf(sortedData[i - 1], mean, std);
1589
1588
  dPlusArray.push(i / N - Z_i);
1590
1589
  dMinusArray.push(Z_i - (i - 1) / N);
1591
1590
  }
@@ -1595,6 +1594,148 @@ var Distributions = {
1595
1594
  KS,
1596
1595
  p
1597
1596
  };
1597
+ },
1598
+ ShapiroWilk: {
1599
+ Test(data, expanded) {
1600
+ let N = data.length;
1601
+ let mean = Mean(data);
1602
+ let sorted = [...data].sort();
1603
+ let invSort = [...data].sort((a, b2) => b2 - a);
1604
+ let SS = 0;
1605
+ sorted.forEach((s) => {
1606
+ SS += Math.pow(s - mean, 2);
1607
+ });
1608
+ if (N < 12) {
1609
+ expanded = false;
1610
+ }
1611
+ if (expanded || N > 50) {
1612
+ let u = 1 / Math.sqrt(N);
1613
+ let m_i = [];
1614
+ let M = 0;
1615
+ for (let i = 0; i < N; i++) {
1616
+ let m = Distributions.Normal.inv((i + 1 - 0.375) / (N + 0.25));
1617
+ m_i[i] = m;
1618
+ M += Math.pow(m, 2);
1619
+ }
1620
+ let a_i = [];
1621
+ a_i[N - 1] = -2.706056 * Math.pow(u, 5) + 4.434685 * Math.pow(u, 4) - 2.07119 * Math.pow(u, 3) - 0.147981 * Math.pow(u, 2) + 0.221157 * u + m_i[N - 1] / Math.sqrt(M);
1622
+ a_i[N - 2] = -3.582633 * Math.pow(u, 5) + 5.682633 * Math.pow(u, 4) - 1.752461 * Math.pow(u, 3) - 0.293762 * Math.pow(u, 2) + 0.042981 * u + m_i[N - 2] / Math.sqrt(M);
1623
+ a_i[0] = -1 * a_i[N - 1];
1624
+ a_i[1] = -1 * a_i[N - 2];
1625
+ let eps = (M - 2 * Math.pow(m_i[N - 1], 2) - 2 * Math.pow(m_i[N - 2], 2)) / (1 - 2 * Math.pow(a_i[N - 1], 2) - 2 * Math.pow(a_i[N - 2], 2));
1626
+ for (let i = 2; i < N - 2; i++) {
1627
+ a_i[i] = m_i[i] / Math.sqrt(eps);
1628
+ }
1629
+ let W2 = Math.pow(Correlate(a_i, sorted), 2);
1630
+ let p_mu = 38915e-7 * Math.pow(Math.log(N), 3) - 0.083751 * Math.pow(Math.log(N), 2) - 0.31082 * Math.log(N) - 1.5861;
1631
+ let p_sigma = Math.exp(30302e-7 * Math.pow(Math.log(N), 2) - 0.082676 * Math.log(N) - 0.4803);
1632
+ let z = (Math.log(1 - W2) - p_mu) / p_sigma;
1633
+ return {
1634
+ W: W2,
1635
+ p: 1 - Distributions.Normal.cdf(z, 0, 1)
1636
+ };
1637
+ }
1638
+ let b = 0;
1639
+ for (let i = 0; i < Math.floor(N / 2); i++) {
1640
+ let a = Distributions.Normal.ShapiroWilk.constants[i][N - 2];
1641
+ b += a * (invSort[i] - sorted[i]);
1642
+ }
1643
+ let W = Math.pow(b, 2) / SS;
1644
+ let p = Distributions.Normal.ShapiroWilk.p(W, N);
1645
+ return {
1646
+ W,
1647
+ p
1648
+ };
1649
+ },
1650
+ constants: [
1651
+ [0.7071, 0.7071, 0.6872, 0.6646, 0.6431, 0.6233, 0.6052, 0.5888, 0.5739, 0.5601, 0.5475, 0.5359, 0.5251, 0.515, 0.5056, 0.4968, 0.4886, 0.4808, 0.4734, 0.4643, 0.459, 0.4542, 0.4493, 0.445, 0.4407, 0.4366, 0.4328, 0.4291, 0.4254, 0.422, 0.4188, 0.4156, 0.4127, 0.4096, 0.4068, 0.404, 0.4015, 0.3989, 0.3964, 0.394, 0.3917, 0.3894, 0.3872, 0.385, 0.383, 0.3808, 0.3789, 0.377, 0.3751],
1652
+ [NaN, NaN, 0.1677, 0.2413, 0.2806, 0.3031, 0.3164, 0.3244, 0.3291, 0.3315, 0.3325, 0.3325, 0.3318, 0.3306, 0.329, 0.3273, 0.3253, 0.3232, 0.3211, 0.3185, 0.3156, 0.3126, 0.3098, 0.3069, 0.3043, 0.3018, 0.2992, 0.2968, 0.2944, 0.2921, 0.2898, 0.2876, 0.2854, 0.2834, 0.2813, 0.2794, 0.2774, 0.2755, 0.2737, 0.2719, 0.2701, 0.2684, 0.2667, 0.2651, 0.2635, 0.262, 0.2604, 0.2589, 0.2574],
1653
+ [NaN, NaN, NaN, NaN, 0.0875, 0.1401, 0.1743, 0.1976, 0.2141, 0.226, 0.2347, 0.2412, 0.246, 0.2495, 0.2521, 0.254, 0.2553, 0.2561, 0.2565, 0.2578, 0.2571, 0.2563, 0.2554, 0.2543, 0.2533, 0.2522, 0.251, 0.2499, 0.2487, 0.2475, 0.2463, 0.2451, 0.2439, 0.2427, 0.2415, 0.2403, 0.2391, 0.238, 0.2368, 0.2357, 0.2345, 0.2334, 0.2323, 0.2313, 0.2302, 0.2291, 0.2281, 0.2271, 0.226],
1654
+ [NaN, NaN, NaN, NaN, NaN, NaN, 0.0561, 0.0947, 0.1224, 0.1429, 0.1586, 0.1707, 0.1802, 0.1878, 0.1939, 0.1988, 0.2027, 0.2059, 0.2085, 0.2119, 0.2131, 0.2139, 0.2145, 0.2148, 0.2151, 0.2152, 0.2151, 0.215, 0.2148, 0.2145, 0.2141, 0.2137, 0.2132, 0.2127, 0.2121, 0.2116, 0.211, 0.2104, 0.2098, 0.2091, 0.2085, 0.2078, 0.2072, 0.2065, 0.2058, 0.2052, 0.2045, 0.2038, 0.2032],
1655
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0.0399, 0.0695, 0.0922, 0.1099, 0.124, 0.1353, 0.1447, 0.1524, 0.1587, 0.1641, 0.1686, 0.1736, 0.1764, 0.1787, 0.1807, 0.1822, 0.1836, 0.1848, 0.1857, 0.1864, 0.187, 0.1874, 0.1878, 0.188, 0.1882, 0.1883, 0.1883, 0.1883, 0.1881, 0.188, 0.1878, 0.1876, 0.1874, 0.1871, 0.1868, 0.1865, 0.1862, 0.1859, 0.1855, 0.1851, 0.1847],
1656
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0.0303, 0.0539, 0.0727, 0.088, 0.1005, 0.1109, 0.1197, 0.1271, 0.1334, 0.1399, 0.1443, 0.148, 0.1512, 0.1539, 0.1563, 0.1584, 0.1601, 0.1616, 0.163, 0.1641, 0.1651, 0.166, 0.1667, 0.1673, 0.1678, 0.1683, 0.1686, 0.1689, 0.1691, 0.1693, 0.1694, 0.1695, 0.1695, 0.1695, 0.1695, 0.1695, 0.1693, 0.1692, 0.1691],
1657
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0.024, 0.0433, 0.0593, 0.0725, 0.0837, 0.0932, 0.1013, 0.1092, 0.115, 0.1201, 0.1245, 0.1283, 0.1316, 0.1346, 0.1372, 0.1395, 0.1415, 0.1433, 0.1449, 0.1463, 0.1475, 0.1487, 0.1496, 0.1505, 0.1513, 0.152, 0.1526, 0.1531, 0.1535, 0.1539, 0.1542, 0.1545, 0.1548, 0.155, 0.1551, 0.1553, 0.1554],
1658
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0.0196, 0.0359, 0.0496, 0.0612, 0.0711, 0.0804, 0.0878, 0.0941, 0.0997, 0.1046, 0.1089, 0.1128, 0.1162, 0.1192, 0.1219, 0.1243, 0.1265, 0.1284, 0.1301, 0.1317, 0.1331, 0.1344, 0.1356, 0.1366, 0.1376, 0.1384, 0.1392, 0.1398, 0.1405, 0.141, 0.1415, 0.142, 0.1423, 0.1427, 0.143],
1659
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0.0163, 0.0303, 0.0422, 0.053, 0.0618, 0.0696, 0.0764, 0.0823, 0.0876, 0.0923, 0.0965, 0.1002, 0.1036, 0.1066, 0.1093, 0.1118, 0.114, 0.116, 0.1179, 0.1196, 0.1211, 0.1225, 0.1237, 0.1249, 0.1259, 0.1269, 0.1278, 0.1286, 0.1293, 0.13, 0.1306, 0.1312, 0.1317],
1660
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0.014, 0.0263, 0.0368, 0.0459, 0.0539, 0.061, 0.0672, 0.0728, 0.0778, 0.0822, 0.0862, 0.0899, 0.0931, 0.0961, 0.0988, 0.1013, 0.1036, 0.1056, 0.1075, 0.1092, 0.1108, 0.1123, 0.1136, 0.1149, 0.116, 0.117, 0.118, 0.1189, 0.1197, 0.1205, 0.1212],
1661
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0.0122, 0.0228, 0.0321, 0.0403, 0.0476, 0.054, 0.0598, 0.065, 0.0697, 0.0739, 0.0777, 0.0812, 0.0844, 0.0873, 0.09, 0.0924, 0.0947, 0.0967, 0.0986, 0.1004, 0.102, 0.1035, 0.1049, 0.1062, 0.1073, 0.1085, 0.1095, 0.1105, 0.1113],
1662
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 0.0107, 0.02, 0.0284, 0.0358, 0.0424, 0.0483, 0.0537, 0.0585, 0.0629, 0.0669, 0.0706, 0.0739, 0.077, 0.0798, 0.0824, 0.0848, 0.087, 0.0891, 0.0909, 0.0927, 0.0943, 0.0959, 0.0972, 0.0986, 0.0998, 0.101, 0.102],
1663
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 94e-4, 0.0178, 0.0253, 0.032, 0.0381, 0.0435, 0.0485, 0.053, 0.0572, 0.061, 0.0645, 0.0677, 0.0706, 0.0733, 0.0759, 0.0782, 0.0804, 0.0824, 0.0842, 0.086, 0.0876, 0.0892, 0.0906, 0.0919, 0.0932],
1664
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 84e-4, 0.0159, 0.0227, 0.0289, 0.0344, 0.0395, 0.0441, 0.0484, 0.0523, 0.0559, 0.0592, 0.0622, 0.0651, 0.0677, 0.0701, 0.0724, 0.0745, 0.0765, 0.0783, 0.0801, 0.0817, 0.0832, 0.0846],
1665
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 76e-4, 0.0144, 0.0206, 0.0262, 0.0314, 0.0361, 0.0404, 0.0444, 0.0481, 0.0515, 0.0546, 0.0575, 0.0602, 0.0628, 0.0651, 0.0673, 0.0694, 0.0713, 0.0731, 0.0748, 0.0764],
1666
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 68e-4, 0.0131, 0.0187, 0.0239, 0.0287, 0.0331, 0.0372, 0.0409, 0.0444, 0.0476, 0.0506, 0.0534, 0.056, 0.0584, 0.0607, 0.0628, 0.0648, 0.0667, 0.0685],
1667
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 62e-4, 0.0119, 0.0172, 0.022, 0.0264, 0.0305, 0.0343, 0.0379, 0.0411, 0.0442, 0.0471, 0.0497, 0.0522, 0.0546, 0.0568, 0.0588, 0.0608],
1668
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 57e-4, 0.011, 0.0158, 0.0203, 0.0244, 0.0283, 0.0318, 0.0352, 0.0383, 0.0412, 0.0439, 0.0465, 0.0489, 0.0511, 0.0532],
1669
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 53e-4, 0.0101, 0.0146, 0.0188, 0.0227, 0.0263, 0.0296, 0.0328, 0.0357, 0.0385, 0.0411, 0.0436, 0.0459],
1670
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 49e-4, 94e-4, 0.0136, 0.0175, 0.0211, 0.0245, 0.0277, 0.0307, 0.0335, 0.0361, 0.0386],
1671
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 45e-4, 87e-4, 0.0126, 0.0163, 0.0197, 0.0229, 0.0259, 0.0288, 0.0314],
1672
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 42e-4, 81e-4, 0.0118, 0.0153, 0.0185, 0.0215, 0.0244],
1673
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 39e-4, 76e-4, 0.0111, 0.0143, 0.0174],
1674
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 37e-4, 71e-4, 0.0104],
1675
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 35e-4]
1676
+ ],
1677
+ p(W, N) {
1678
+ let wArray = Distributions.Normal.ShapiroWilk.pChart.wValues[N - 3];
1679
+ let inflection = wArray.findIndex((w) => W <= w);
1680
+ let w1 = wArray[inflection - 1];
1681
+ let w2 = wArray[inflection];
1682
+ let p1 = Distributions.Normal.ShapiroWilk.pChart.pValues[inflection - 1];
1683
+ let p2 = Distributions.Normal.ShapiroWilk.pChart.pValues[inflection];
1684
+ return p1 + (p2 - p1) / (w2 - w1) * (W - w1);
1685
+ },
1686
+ pChart: {
1687
+ wValues: [
1688
+ [0.753, 0.756, 0.767, 0.789, 0.959, 0.998, 0.999, 1, 1],
1689
+ [0.687, 0.707, 0.748, 0.792, 0.935, 0.987, 0.992, 0.996, 0.997],
1690
+ [0.686, 0.715, 0.762, 0.806, 0.927, 0.979, 0.986, 0.991, 0.993],
1691
+ [0.713, 0.743, 0.788, 0.826, 0.927, 0.974, 0.981, 0.986, 0.989],
1692
+ [0.73, 0.76, 0.803, 0.838, 0.928, 0.972, 0.979, 0.985, 0.988],
1693
+ [0.749, 0.778, 0.818, 0.851, 0.932, 0.972, 0.978, 0.984, 0.987],
1694
+ [0.764, 0.791, 0.829, 0.859, 0.935, 0.972, 0.978, 0.984, 0.986],
1695
+ [0.781, 0.806, 0.842, 0.869, 0.938, 0.972, 0.978, 0.983, 0.986],
1696
+ [0.792, 0.817, 0.85, 0.876, 0.94, 0.973, 0.979, 0.984, 0.986],
1697
+ [0.805, 0.828, 0.859, 0.883, 0.943, 0.973, 0.979, 0.984, 0.986],
1698
+ [0.814, 0.837, 0.866, 0.889, 0.945, 0.974, 0.979, 0.984, 0.986],
1699
+ [0.825, 0.846, 0.874, 0.895, 0.947, 0.975, 0.98, 0.984, 0.986],
1700
+ [0.835, 0.855, 0.881, 0.901, 0.95, 0.975, 0.98, 0.984, 0.987],
1701
+ [0.844, 0.863, 0.887, 0.906, 0.952, 0.976, 0.981, 0.985, 0.987],
1702
+ [0.851, 0.869, 0.892, 0.91, 0.954, 0.977, 0.981, 0.985, 0.987],
1703
+ [0.858, 0.874, 0.897, 0.914, 0.956, 0.978, 0.982, 0.986, 0.988],
1704
+ [0.863, 0.879, 0.901, 0.917, 0.957, 0.978, 0.982, 0.986, 0.988],
1705
+ [0.868, 0.884, 0.905, 0.92, 0.959, 0.979, 0.983, 0.986, 0.988],
1706
+ [0.873, 0.888, 0.908, 0.923, 0.96, 0.98, 0.983, 0.987, 0.989],
1707
+ [0.878, 0.892, 0.911, 0.926, 0.961, 0.98, 0.984, 0.987, 0.989],
1708
+ [0.881, 0.895, 0.914, 0.928, 0.962, 0.981, 0.984, 0.987, 0.989],
1709
+ [0.884, 0.898, 0.916, 0.93, 0.963, 0.981, 0.984, 0.987, 0.989],
1710
+ [0.888, 0.901, 0.918, 0.931, 0.964, 0.981, 0.985, 0.988, 0.989],
1711
+ [0.891, 0.904, 0.92, 0.933, 0.965, 0.982, 0.985, 0.988, 0.989],
1712
+ [0.894, 0.906, 0.923, 0.935, 0.965, 0.982, 0.985, 0.988, 0.99],
1713
+ [0.896, 0.908, 0.924, 0.936, 0.966, 0.982, 0.985, 0.988, 0.99],
1714
+ [0.898, 0.91, 0.926, 0.937, 0.966, 0.982, 0.985, 0.988, 0.99],
1715
+ [0.9, 0.912, 0.927, 0.939, 0.967, 0.983, 0.985, 0.988, 0.99],
1716
+ [0.902, 0.914, 0.929, 0.94, 0.967, 0.983, 0.986, 0.988, 0.99],
1717
+ [0.904, 0.915, 0.93, 0.941, 0.968, 0.983, 0.986, 0.988, 0.99],
1718
+ [0.906, 0.917, 0.931, 0.942, 0.968, 0.983, 0.986, 0.989, 0.99],
1719
+ [0.908, 0.919, 0.933, 0.943, 0.969, 0.983, 0.986, 0.989, 0.99],
1720
+ [0.91, 0.92, 0.934, 0.944, 0.969, 0.984, 0.986, 0.989, 0.99],
1721
+ [0.912, 0.922, 0.935, 0.945, 0.97, 0.984, 0.986, 0.989, 0.99],
1722
+ [0.914, 0.924, 0.936, 0.946, 0.97, 0.984, 0.987, 0.989, 0.99],
1723
+ [0.916, 0.925, 0.938, 0.947, 0.971, 0.984, 0.987, 0.989, 0.99],
1724
+ [0.917, 0.927, 0.939, 0.948, 0.971, 0.984, 0.987, 0.989, 0.991],
1725
+ [0.919, 0.928, 0.94, 0.949, 0.972, 0.985, 0.987, 0.989, 0.991],
1726
+ [0.92, 0.929, 0.941, 0.95, 0.972, 0.985, 0.987, 0.989, 0.991],
1727
+ [0.922, 0.93, 0.942, 0.951, 0.972, 0.985, 0.987, 0.989, 0.991],
1728
+ [0.923, 0.932, 0.943, 0.951, 0.973, 0.985, 0.987, 0.99, 0.991],
1729
+ [0.924, 0.933, 0.944, 0.952, 0.973, 0.985, 0.987, 0.99, 0.991],
1730
+ [0.926, 0.934, 0.945, 0.953, 0.973, 0.985, 0.988, 0.99, 0.991],
1731
+ [0.927, 0.935, 0.945, 0.953, 0.974, 0.985, 0.988, 0.99, 0.991],
1732
+ [0.928, 0.936, 0.946, 0.954, 0.974, 0.985, 0.988, 0.99, 0.991],
1733
+ [0.929, 0.937, 0.947, 0.954, 0.974, 0.985, 0.988, 0.99, 0.991],
1734
+ [0.929, 0.939, 0.947, 0.955, 0.974, 0.985, 0.988, 0.99, 0.991],
1735
+ [0.93, 0.938, 0.947, 0.955, 0.974, 0.985, 0.988, 0.99, 0.991]
1736
+ ],
1737
+ pValues: [0.01, 0.02, 0.05, 0.1, 0.5, 0.9, 0.95, 0.98, 0.99]
1738
+ }
1598
1739
  }
1599
1740
  },
1600
1741
  T: {
@@ -2178,6 +2319,43 @@ var StDev = {
2178
2319
  return averageMR / d2w;
2179
2320
  }
2180
2321
  };
2322
+ var Covariance = {
2323
+ /**
2324
+ * Calculates the population covariance of the arrays supplied.
2325
+ * @customfunction
2326
+ * @param xData The first array of numbers.
2327
+ * @param yData The second array of numbers.
2328
+ */
2329
+ P(xData, yData) {
2330
+ let xBar = Mean(xData);
2331
+ let yBar = Mean(yData);
2332
+ let sum = 0;
2333
+ for (let i = 0; i < xData.length; i++) {
2334
+ sum += (xData[i] - xBar) * (yData[i] - yBar);
2335
+ }
2336
+ return sum / xData.length;
2337
+ },
2338
+ /**
2339
+ * Calculates the sample covariance of the arrays supplied.
2340
+ * @customfunction
2341
+ * @param xData The first array of numbers.
2342
+ * @param yData The second array of numbers.
2343
+ */
2344
+ S(xData, yData) {
2345
+ let xBar = Mean(xData);
2346
+ let yBar = Mean(yData);
2347
+ let sum = 0;
2348
+ for (let i = 0; i < xData.length; i++) {
2349
+ sum += (xData[i] - xBar) * (yData[i] - yBar);
2350
+ }
2351
+ return sum / (xData.length - 1);
2352
+ }
2353
+ };
2354
+ function Correlate(xData, yData) {
2355
+ let cov = Covariance.S(xData, yData);
2356
+ let den = StDev.S(xData) * StDev.S(yData);
2357
+ return cov / den;
2358
+ }
2181
2359
  function Sum(data) {
2182
2360
  let sum = 0;
2183
2361
  data.forEach((d) => {
@@ -2917,11 +3095,112 @@ function CreateScatterPlot(data, title, chartSettings) {
2917
3095
  AddPlotBorder(ctx, chartSettings);
2918
3096
  return canvas;
2919
3097
  }
2920
- function MarkOutOfControl(data, UCL, LCL, display = new CanvasDrawSettings("red", "red", 1, 1)) {
2921
- data.values.forEach((v) => {
2922
- if (v.y > UCL || v.y < LCL) {
3098
+ function MarkOutOfControl(data, UCL, LCL, CL, std, display = new CanvasDrawSettings("red", "black", 1, 1), controlTests = [1, 2, 3, 4, 5, 6, 7, 8]) {
3099
+ if (CL === void 0) {
3100
+ CL = Mean([LCL, UCL]);
3101
+ }
3102
+ if (std === void 0) {
3103
+ std = (CL - LCL) / 3;
3104
+ }
3105
+ let Test2 = 0;
3106
+ let Test3 = 0;
3107
+ let Test4 = 0;
3108
+ let Test5 = [0, 0, 0];
3109
+ let Test6 = [0, 0, 0, 0, 0, 0];
3110
+ let Test7 = 0;
3111
+ let Test8 = 0;
3112
+ data.values.forEach((v, i) => {
3113
+ if (controlTests.includes(1) && (v.y > UCL || v.y < LCL)) {
2923
3114
  v.display = display;
2924
3115
  }
3116
+ if (controlTests.includes(2) && (v.y > CL && Test2 >= 0 || v.y < CL && Test2 <= 0)) {
3117
+ Test2 += v.y < CL ? -1 : 1;
3118
+ if (Test2 >= 8 || Test2 <= -8) {
3119
+ v.display = display;
3120
+ }
3121
+ } else {
3122
+ Test2 = 0;
3123
+ }
3124
+ if (i !== 0) {
3125
+ if (controlTests.includes(3) && (v.y > data.values[i - 1].y && Test3 >= 0 || v.y < data.values[i - 1].y && Test3 <= 0)) {
3126
+ Test3 += v.y < data.values[i - 1].y ? -1 : 1;
3127
+ if (Test3 >= 5 || Test3 <= -6) {
3128
+ v.display = display;
3129
+ }
3130
+ } else {
3131
+ Test3 = 0;
3132
+ }
3133
+ if (controlTests.includes(4) && v.y < data.values[i - 1].y) {
3134
+ if (Test4 >= 0) {
3135
+ Test4 = -1 * (Test4 + 1);
3136
+ } else {
3137
+ Test4 = 0;
3138
+ }
3139
+ if (Math.abs(Test4) >= 13) {
3140
+ v.display = display;
3141
+ }
3142
+ }
3143
+ if (controlTests.includes(4) && v.y > data.values[i - 1].y) {
3144
+ if (Test4 <= 0) {
3145
+ Test4 = -1 * (Test4 - 1);
3146
+ } else {
3147
+ Test4 = 0;
3148
+ }
3149
+ if (Math.abs(Test4) >= 13) {
3150
+ v.display = display;
3151
+ }
3152
+ }
3153
+ }
3154
+ Test5[0] = Test5[1];
3155
+ Test5[1] = Test5[2];
3156
+ if (controlTests.includes(5) && v.y > 2 * std + CL) {
3157
+ Test5[2] = 1;
3158
+ if (Test5[0] === 1 || Test5[1] === 1) {
3159
+ v.display = display;
3160
+ }
3161
+ }
3162
+ if (controlTests.includes(5) && v.y < CL - 2 * std) {
3163
+ Test5[2] = -1;
3164
+ if (Test5[0] === -1 || Test5[1] === -1) {
3165
+ v.display = display;
3166
+ }
3167
+ }
3168
+ Test6[0] = Test6[1];
3169
+ Test6[1] = Test6[2];
3170
+ Test6[2] = Test6[3];
3171
+ Test6[3] = Test6[4];
3172
+ Test6[4] = Test6[5];
3173
+ if (controlTests.includes(6) && v.y > std + CL) {
3174
+ Test6[5] = 1;
3175
+ let plus = Test6.filter((t) => t === 1);
3176
+ if (plus.length >= 4) {
3177
+ v.display = display;
3178
+ }
3179
+ } else if (controlTests.includes(6) && v.y < CL - std) {
3180
+ Test6[5] = -1;
3181
+ let plus = Test6.filter((t) => t === -1);
3182
+ if (plus.length >= 4) {
3183
+ v.display = display;
3184
+ }
3185
+ } else {
3186
+ Test6[5] = 0;
3187
+ }
3188
+ if (controlTests.includes(7) && v.y >= CL - std && v.y <= CL + std) {
3189
+ Test7 += 1;
3190
+ if (Test7 >= 15) {
3191
+ v.display = display;
3192
+ }
3193
+ } else {
3194
+ Test7 = 0;
3195
+ }
3196
+ if (controlTests.includes(8) && (v.y < CL - std || v.y > CL + std)) {
3197
+ Test8 += 1;
3198
+ if (Test8 >= 8) {
3199
+ v.display = display;
3200
+ }
3201
+ } else {
3202
+ Test8 = 0;
3203
+ }
2925
3204
  });
2926
3205
  }
2927
3206
  function GetHistogramDataset(data, title, bucketRange, chartSettings) {
@@ -4032,7 +4311,6 @@ function SplitObjectArrayByProp(array, prop) {
4032
4311
  LastObservationsChart,
4033
4312
  Line,
4034
4313
  Margin,
4035
- MarkOutOfControl,
4036
4314
  MaximumLikelihoodParameters,
4037
4315
  Mean,
4038
4316
  Median,
package/dist/index.mjs CHANGED
@@ -557,7 +557,7 @@ function IndividualValuePlot(data, title, historicalMean) {
557
557
  chartSettings.axis.x.autoSize = false;
558
558
  let dataset = SerializeData(data);
559
559
  dataset.line.type = "straight";
560
- MarkOutOfControl(dataset, UCL, LCL);
560
+ MarkOutOfControl(dataset, UCL, LCL, centerline, std);
561
561
  return CreateScatterPlot([dataset], title, chartSettings);
562
562
  }
563
563
  function MovingRangeChart(data, title, w = 2) {
@@ -586,7 +586,7 @@ function MovingRangeChart(data, title, w = 2) {
586
586
  chartSettings.axis.x.autoSize = false;
587
587
  let dataset = SerializeData(movingRange);
588
588
  dataset.line.type = "straight";
589
- MarkOutOfControl(dataset, UCL, LCL);
589
+ MarkOutOfControl(dataset, UCL, LCL, void 0, void 0, void 0, [1]);
590
590
  return CreateScatterPlot([dataset], title, chartSettings);
591
591
  }
592
592
  function LastObservationsChart(data, N, title) {
@@ -1498,7 +1498,7 @@ var Distributions = {
1498
1498
  let dMinusArray = [];
1499
1499
  let dPlusArray = [];
1500
1500
  for (let i = 1; i <= N; i++) {
1501
- let Z_i = this.cdf(data[i - 1], mean, std);
1501
+ let Z_i = this.cdf(sortedData[i - 1], mean, std);
1502
1502
  dPlusArray.push(i / N - Z_i);
1503
1503
  dMinusArray.push(Z_i - (i - 1) / N);
1504
1504
  }
@@ -1508,6 +1508,148 @@ var Distributions = {
1508
1508
  KS,
1509
1509
  p
1510
1510
  };
1511
+ },
1512
+ ShapiroWilk: {
1513
+ Test(data, expanded) {
1514
+ let N = data.length;
1515
+ let mean = Mean(data);
1516
+ let sorted = [...data].sort();
1517
+ let invSort = [...data].sort((a, b2) => b2 - a);
1518
+ let SS = 0;
1519
+ sorted.forEach((s) => {
1520
+ SS += Math.pow(s - mean, 2);
1521
+ });
1522
+ if (N < 12) {
1523
+ expanded = false;
1524
+ }
1525
+ if (expanded || N > 50) {
1526
+ let u = 1 / Math.sqrt(N);
1527
+ let m_i = [];
1528
+ let M = 0;
1529
+ for (let i = 0; i < N; i++) {
1530
+ let m = Distributions.Normal.inv((i + 1 - 0.375) / (N + 0.25));
1531
+ m_i[i] = m;
1532
+ M += Math.pow(m, 2);
1533
+ }
1534
+ let a_i = [];
1535
+ a_i[N - 1] = -2.706056 * Math.pow(u, 5) + 4.434685 * Math.pow(u, 4) - 2.07119 * Math.pow(u, 3) - 0.147981 * Math.pow(u, 2) + 0.221157 * u + m_i[N - 1] / Math.sqrt(M);
1536
+ a_i[N - 2] = -3.582633 * Math.pow(u, 5) + 5.682633 * Math.pow(u, 4) - 1.752461 * Math.pow(u, 3) - 0.293762 * Math.pow(u, 2) + 0.042981 * u + m_i[N - 2] / Math.sqrt(M);
1537
+ a_i[0] = -1 * a_i[N - 1];
1538
+ a_i[1] = -1 * a_i[N - 2];
1539
+ let eps = (M - 2 * Math.pow(m_i[N - 1], 2) - 2 * Math.pow(m_i[N - 2], 2)) / (1 - 2 * Math.pow(a_i[N - 1], 2) - 2 * Math.pow(a_i[N - 2], 2));
1540
+ for (let i = 2; i < N - 2; i++) {
1541
+ a_i[i] = m_i[i] / Math.sqrt(eps);
1542
+ }
1543
+ let W2 = Math.pow(Correlate(a_i, sorted), 2);
1544
+ let p_mu = 38915e-7 * Math.pow(Math.log(N), 3) - 0.083751 * Math.pow(Math.log(N), 2) - 0.31082 * Math.log(N) - 1.5861;
1545
+ let p_sigma = Math.exp(30302e-7 * Math.pow(Math.log(N), 2) - 0.082676 * Math.log(N) - 0.4803);
1546
+ let z = (Math.log(1 - W2) - p_mu) / p_sigma;
1547
+ return {
1548
+ W: W2,
1549
+ p: 1 - Distributions.Normal.cdf(z, 0, 1)
1550
+ };
1551
+ }
1552
+ let b = 0;
1553
+ for (let i = 0; i < Math.floor(N / 2); i++) {
1554
+ let a = Distributions.Normal.ShapiroWilk.constants[i][N - 2];
1555
+ b += a * (invSort[i] - sorted[i]);
1556
+ }
1557
+ let W = Math.pow(b, 2) / SS;
1558
+ let p = Distributions.Normal.ShapiroWilk.p(W, N);
1559
+ return {
1560
+ W,
1561
+ p
1562
+ };
1563
+ },
1564
+ constants: [
1565
+ [0.7071, 0.7071, 0.6872, 0.6646, 0.6431, 0.6233, 0.6052, 0.5888, 0.5739, 0.5601, 0.5475, 0.5359, 0.5251, 0.515, 0.5056, 0.4968, 0.4886, 0.4808, 0.4734, 0.4643, 0.459, 0.4542, 0.4493, 0.445, 0.4407, 0.4366, 0.4328, 0.4291, 0.4254, 0.422, 0.4188, 0.4156, 0.4127, 0.4096, 0.4068, 0.404, 0.4015, 0.3989, 0.3964, 0.394, 0.3917, 0.3894, 0.3872, 0.385, 0.383, 0.3808, 0.3789, 0.377, 0.3751],
1566
+ [NaN, NaN, 0.1677, 0.2413, 0.2806, 0.3031, 0.3164, 0.3244, 0.3291, 0.3315, 0.3325, 0.3325, 0.3318, 0.3306, 0.329, 0.3273, 0.3253, 0.3232, 0.3211, 0.3185, 0.3156, 0.3126, 0.3098, 0.3069, 0.3043, 0.3018, 0.2992, 0.2968, 0.2944, 0.2921, 0.2898, 0.2876, 0.2854, 0.2834, 0.2813, 0.2794, 0.2774, 0.2755, 0.2737, 0.2719, 0.2701, 0.2684, 0.2667, 0.2651, 0.2635, 0.262, 0.2604, 0.2589, 0.2574],
1567
+ [NaN, NaN, NaN, NaN, 0.0875, 0.1401, 0.1743, 0.1976, 0.2141, 0.226, 0.2347, 0.2412, 0.246, 0.2495, 0.2521, 0.254, 0.2553, 0.2561, 0.2565, 0.2578, 0.2571, 0.2563, 0.2554, 0.2543, 0.2533, 0.2522, 0.251, 0.2499, 0.2487, 0.2475, 0.2463, 0.2451, 0.2439, 0.2427, 0.2415, 0.2403, 0.2391, 0.238, 0.2368, 0.2357, 0.2345, 0.2334, 0.2323, 0.2313, 0.2302, 0.2291, 0.2281, 0.2271, 0.226],
1568
+ [NaN, NaN, NaN, NaN, NaN, NaN, 0.0561, 0.0947, 0.1224, 0.1429, 0.1586, 0.1707, 0.1802, 0.1878, 0.1939, 0.1988, 0.2027, 0.2059, 0.2085, 0.2119, 0.2131, 0.2139, 0.2145, 0.2148, 0.2151, 0.2152, 0.2151, 0.215, 0.2148, 0.2145, 0.2141, 0.2137, 0.2132, 0.2127, 0.2121, 0.2116, 0.211, 0.2104, 0.2098, 0.2091, 0.2085, 0.2078, 0.2072, 0.2065, 0.2058, 0.2052, 0.2045, 0.2038, 0.2032],
1569
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0.0399, 0.0695, 0.0922, 0.1099, 0.124, 0.1353, 0.1447, 0.1524, 0.1587, 0.1641, 0.1686, 0.1736, 0.1764, 0.1787, 0.1807, 0.1822, 0.1836, 0.1848, 0.1857, 0.1864, 0.187, 0.1874, 0.1878, 0.188, 0.1882, 0.1883, 0.1883, 0.1883, 0.1881, 0.188, 0.1878, 0.1876, 0.1874, 0.1871, 0.1868, 0.1865, 0.1862, 0.1859, 0.1855, 0.1851, 0.1847],
1570
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0.0303, 0.0539, 0.0727, 0.088, 0.1005, 0.1109, 0.1197, 0.1271, 0.1334, 0.1399, 0.1443, 0.148, 0.1512, 0.1539, 0.1563, 0.1584, 0.1601, 0.1616, 0.163, 0.1641, 0.1651, 0.166, 0.1667, 0.1673, 0.1678, 0.1683, 0.1686, 0.1689, 0.1691, 0.1693, 0.1694, 0.1695, 0.1695, 0.1695, 0.1695, 0.1695, 0.1693, 0.1692, 0.1691],
1571
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0.024, 0.0433, 0.0593, 0.0725, 0.0837, 0.0932, 0.1013, 0.1092, 0.115, 0.1201, 0.1245, 0.1283, 0.1316, 0.1346, 0.1372, 0.1395, 0.1415, 0.1433, 0.1449, 0.1463, 0.1475, 0.1487, 0.1496, 0.1505, 0.1513, 0.152, 0.1526, 0.1531, 0.1535, 0.1539, 0.1542, 0.1545, 0.1548, 0.155, 0.1551, 0.1553, 0.1554],
1572
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0.0196, 0.0359, 0.0496, 0.0612, 0.0711, 0.0804, 0.0878, 0.0941, 0.0997, 0.1046, 0.1089, 0.1128, 0.1162, 0.1192, 0.1219, 0.1243, 0.1265, 0.1284, 0.1301, 0.1317, 0.1331, 0.1344, 0.1356, 0.1366, 0.1376, 0.1384, 0.1392, 0.1398, 0.1405, 0.141, 0.1415, 0.142, 0.1423, 0.1427, 0.143],
1573
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0.0163, 0.0303, 0.0422, 0.053, 0.0618, 0.0696, 0.0764, 0.0823, 0.0876, 0.0923, 0.0965, 0.1002, 0.1036, 0.1066, 0.1093, 0.1118, 0.114, 0.116, 0.1179, 0.1196, 0.1211, 0.1225, 0.1237, 0.1249, 0.1259, 0.1269, 0.1278, 0.1286, 0.1293, 0.13, 0.1306, 0.1312, 0.1317],
1574
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0.014, 0.0263, 0.0368, 0.0459, 0.0539, 0.061, 0.0672, 0.0728, 0.0778, 0.0822, 0.0862, 0.0899, 0.0931, 0.0961, 0.0988, 0.1013, 0.1036, 0.1056, 0.1075, 0.1092, 0.1108, 0.1123, 0.1136, 0.1149, 0.116, 0.117, 0.118, 0.1189, 0.1197, 0.1205, 0.1212],
1575
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0.0122, 0.0228, 0.0321, 0.0403, 0.0476, 0.054, 0.0598, 0.065, 0.0697, 0.0739, 0.0777, 0.0812, 0.0844, 0.0873, 0.09, 0.0924, 0.0947, 0.0967, 0.0986, 0.1004, 0.102, 0.1035, 0.1049, 0.1062, 0.1073, 0.1085, 0.1095, 0.1105, 0.1113],
1576
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 0.0107, 0.02, 0.0284, 0.0358, 0.0424, 0.0483, 0.0537, 0.0585, 0.0629, 0.0669, 0.0706, 0.0739, 0.077, 0.0798, 0.0824, 0.0848, 0.087, 0.0891, 0.0909, 0.0927, 0.0943, 0.0959, 0.0972, 0.0986, 0.0998, 0.101, 0.102],
1577
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 94e-4, 0.0178, 0.0253, 0.032, 0.0381, 0.0435, 0.0485, 0.053, 0.0572, 0.061, 0.0645, 0.0677, 0.0706, 0.0733, 0.0759, 0.0782, 0.0804, 0.0824, 0.0842, 0.086, 0.0876, 0.0892, 0.0906, 0.0919, 0.0932],
1578
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 84e-4, 0.0159, 0.0227, 0.0289, 0.0344, 0.0395, 0.0441, 0.0484, 0.0523, 0.0559, 0.0592, 0.0622, 0.0651, 0.0677, 0.0701, 0.0724, 0.0745, 0.0765, 0.0783, 0.0801, 0.0817, 0.0832, 0.0846],
1579
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 76e-4, 0.0144, 0.0206, 0.0262, 0.0314, 0.0361, 0.0404, 0.0444, 0.0481, 0.0515, 0.0546, 0.0575, 0.0602, 0.0628, 0.0651, 0.0673, 0.0694, 0.0713, 0.0731, 0.0748, 0.0764],
1580
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 68e-4, 0.0131, 0.0187, 0.0239, 0.0287, 0.0331, 0.0372, 0.0409, 0.0444, 0.0476, 0.0506, 0.0534, 0.056, 0.0584, 0.0607, 0.0628, 0.0648, 0.0667, 0.0685],
1581
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 62e-4, 0.0119, 0.0172, 0.022, 0.0264, 0.0305, 0.0343, 0.0379, 0.0411, 0.0442, 0.0471, 0.0497, 0.0522, 0.0546, 0.0568, 0.0588, 0.0608],
1582
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 57e-4, 0.011, 0.0158, 0.0203, 0.0244, 0.0283, 0.0318, 0.0352, 0.0383, 0.0412, 0.0439, 0.0465, 0.0489, 0.0511, 0.0532],
1583
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 53e-4, 0.0101, 0.0146, 0.0188, 0.0227, 0.0263, 0.0296, 0.0328, 0.0357, 0.0385, 0.0411, 0.0436, 0.0459],
1584
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 49e-4, 94e-4, 0.0136, 0.0175, 0.0211, 0.0245, 0.0277, 0.0307, 0.0335, 0.0361, 0.0386],
1585
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 45e-4, 87e-4, 0.0126, 0.0163, 0.0197, 0.0229, 0.0259, 0.0288, 0.0314],
1586
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 42e-4, 81e-4, 0.0118, 0.0153, 0.0185, 0.0215, 0.0244],
1587
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 39e-4, 76e-4, 0.0111, 0.0143, 0.0174],
1588
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 37e-4, 71e-4, 0.0104],
1589
+ [NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0, 35e-4]
1590
+ ],
1591
+ p(W, N) {
1592
+ let wArray = Distributions.Normal.ShapiroWilk.pChart.wValues[N - 3];
1593
+ let inflection = wArray.findIndex((w) => W <= w);
1594
+ let w1 = wArray[inflection - 1];
1595
+ let w2 = wArray[inflection];
1596
+ let p1 = Distributions.Normal.ShapiroWilk.pChart.pValues[inflection - 1];
1597
+ let p2 = Distributions.Normal.ShapiroWilk.pChart.pValues[inflection];
1598
+ return p1 + (p2 - p1) / (w2 - w1) * (W - w1);
1599
+ },
1600
+ pChart: {
1601
+ wValues: [
1602
+ [0.753, 0.756, 0.767, 0.789, 0.959, 0.998, 0.999, 1, 1],
1603
+ [0.687, 0.707, 0.748, 0.792, 0.935, 0.987, 0.992, 0.996, 0.997],
1604
+ [0.686, 0.715, 0.762, 0.806, 0.927, 0.979, 0.986, 0.991, 0.993],
1605
+ [0.713, 0.743, 0.788, 0.826, 0.927, 0.974, 0.981, 0.986, 0.989],
1606
+ [0.73, 0.76, 0.803, 0.838, 0.928, 0.972, 0.979, 0.985, 0.988],
1607
+ [0.749, 0.778, 0.818, 0.851, 0.932, 0.972, 0.978, 0.984, 0.987],
1608
+ [0.764, 0.791, 0.829, 0.859, 0.935, 0.972, 0.978, 0.984, 0.986],
1609
+ [0.781, 0.806, 0.842, 0.869, 0.938, 0.972, 0.978, 0.983, 0.986],
1610
+ [0.792, 0.817, 0.85, 0.876, 0.94, 0.973, 0.979, 0.984, 0.986],
1611
+ [0.805, 0.828, 0.859, 0.883, 0.943, 0.973, 0.979, 0.984, 0.986],
1612
+ [0.814, 0.837, 0.866, 0.889, 0.945, 0.974, 0.979, 0.984, 0.986],
1613
+ [0.825, 0.846, 0.874, 0.895, 0.947, 0.975, 0.98, 0.984, 0.986],
1614
+ [0.835, 0.855, 0.881, 0.901, 0.95, 0.975, 0.98, 0.984, 0.987],
1615
+ [0.844, 0.863, 0.887, 0.906, 0.952, 0.976, 0.981, 0.985, 0.987],
1616
+ [0.851, 0.869, 0.892, 0.91, 0.954, 0.977, 0.981, 0.985, 0.987],
1617
+ [0.858, 0.874, 0.897, 0.914, 0.956, 0.978, 0.982, 0.986, 0.988],
1618
+ [0.863, 0.879, 0.901, 0.917, 0.957, 0.978, 0.982, 0.986, 0.988],
1619
+ [0.868, 0.884, 0.905, 0.92, 0.959, 0.979, 0.983, 0.986, 0.988],
1620
+ [0.873, 0.888, 0.908, 0.923, 0.96, 0.98, 0.983, 0.987, 0.989],
1621
+ [0.878, 0.892, 0.911, 0.926, 0.961, 0.98, 0.984, 0.987, 0.989],
1622
+ [0.881, 0.895, 0.914, 0.928, 0.962, 0.981, 0.984, 0.987, 0.989],
1623
+ [0.884, 0.898, 0.916, 0.93, 0.963, 0.981, 0.984, 0.987, 0.989],
1624
+ [0.888, 0.901, 0.918, 0.931, 0.964, 0.981, 0.985, 0.988, 0.989],
1625
+ [0.891, 0.904, 0.92, 0.933, 0.965, 0.982, 0.985, 0.988, 0.989],
1626
+ [0.894, 0.906, 0.923, 0.935, 0.965, 0.982, 0.985, 0.988, 0.99],
1627
+ [0.896, 0.908, 0.924, 0.936, 0.966, 0.982, 0.985, 0.988, 0.99],
1628
+ [0.898, 0.91, 0.926, 0.937, 0.966, 0.982, 0.985, 0.988, 0.99],
1629
+ [0.9, 0.912, 0.927, 0.939, 0.967, 0.983, 0.985, 0.988, 0.99],
1630
+ [0.902, 0.914, 0.929, 0.94, 0.967, 0.983, 0.986, 0.988, 0.99],
1631
+ [0.904, 0.915, 0.93, 0.941, 0.968, 0.983, 0.986, 0.988, 0.99],
1632
+ [0.906, 0.917, 0.931, 0.942, 0.968, 0.983, 0.986, 0.989, 0.99],
1633
+ [0.908, 0.919, 0.933, 0.943, 0.969, 0.983, 0.986, 0.989, 0.99],
1634
+ [0.91, 0.92, 0.934, 0.944, 0.969, 0.984, 0.986, 0.989, 0.99],
1635
+ [0.912, 0.922, 0.935, 0.945, 0.97, 0.984, 0.986, 0.989, 0.99],
1636
+ [0.914, 0.924, 0.936, 0.946, 0.97, 0.984, 0.987, 0.989, 0.99],
1637
+ [0.916, 0.925, 0.938, 0.947, 0.971, 0.984, 0.987, 0.989, 0.99],
1638
+ [0.917, 0.927, 0.939, 0.948, 0.971, 0.984, 0.987, 0.989, 0.991],
1639
+ [0.919, 0.928, 0.94, 0.949, 0.972, 0.985, 0.987, 0.989, 0.991],
1640
+ [0.92, 0.929, 0.941, 0.95, 0.972, 0.985, 0.987, 0.989, 0.991],
1641
+ [0.922, 0.93, 0.942, 0.951, 0.972, 0.985, 0.987, 0.989, 0.991],
1642
+ [0.923, 0.932, 0.943, 0.951, 0.973, 0.985, 0.987, 0.99, 0.991],
1643
+ [0.924, 0.933, 0.944, 0.952, 0.973, 0.985, 0.987, 0.99, 0.991],
1644
+ [0.926, 0.934, 0.945, 0.953, 0.973, 0.985, 0.988, 0.99, 0.991],
1645
+ [0.927, 0.935, 0.945, 0.953, 0.974, 0.985, 0.988, 0.99, 0.991],
1646
+ [0.928, 0.936, 0.946, 0.954, 0.974, 0.985, 0.988, 0.99, 0.991],
1647
+ [0.929, 0.937, 0.947, 0.954, 0.974, 0.985, 0.988, 0.99, 0.991],
1648
+ [0.929, 0.939, 0.947, 0.955, 0.974, 0.985, 0.988, 0.99, 0.991],
1649
+ [0.93, 0.938, 0.947, 0.955, 0.974, 0.985, 0.988, 0.99, 0.991]
1650
+ ],
1651
+ pValues: [0.01, 0.02, 0.05, 0.1, 0.5, 0.9, 0.95, 0.98, 0.99]
1652
+ }
1511
1653
  }
1512
1654
  },
1513
1655
  T: {
@@ -2091,6 +2233,43 @@ var StDev = {
2091
2233
  return averageMR / d2w;
2092
2234
  }
2093
2235
  };
2236
+ var Covariance = {
2237
+ /**
2238
+ * Calculates the population covariance of the arrays supplied.
2239
+ * @customfunction
2240
+ * @param xData The first array of numbers.
2241
+ * @param yData The second array of numbers.
2242
+ */
2243
+ P(xData, yData) {
2244
+ let xBar = Mean(xData);
2245
+ let yBar = Mean(yData);
2246
+ let sum = 0;
2247
+ for (let i = 0; i < xData.length; i++) {
2248
+ sum += (xData[i] - xBar) * (yData[i] - yBar);
2249
+ }
2250
+ return sum / xData.length;
2251
+ },
2252
+ /**
2253
+ * Calculates the sample covariance of the arrays supplied.
2254
+ * @customfunction
2255
+ * @param xData The first array of numbers.
2256
+ * @param yData The second array of numbers.
2257
+ */
2258
+ S(xData, yData) {
2259
+ let xBar = Mean(xData);
2260
+ let yBar = Mean(yData);
2261
+ let sum = 0;
2262
+ for (let i = 0; i < xData.length; i++) {
2263
+ sum += (xData[i] - xBar) * (yData[i] - yBar);
2264
+ }
2265
+ return sum / (xData.length - 1);
2266
+ }
2267
+ };
2268
+ function Correlate(xData, yData) {
2269
+ let cov = Covariance.S(xData, yData);
2270
+ let den = StDev.S(xData) * StDev.S(yData);
2271
+ return cov / den;
2272
+ }
2094
2273
  function Sum(data) {
2095
2274
  let sum = 0;
2096
2275
  data.forEach((d) => {
@@ -2830,11 +3009,112 @@ function CreateScatterPlot(data, title, chartSettings) {
2830
3009
  AddPlotBorder(ctx, chartSettings);
2831
3010
  return canvas;
2832
3011
  }
2833
- function MarkOutOfControl(data, UCL, LCL, display = new CanvasDrawSettings("red", "red", 1, 1)) {
2834
- data.values.forEach((v) => {
2835
- if (v.y > UCL || v.y < LCL) {
3012
+ function MarkOutOfControl(data, UCL, LCL, CL, std, display = new CanvasDrawSettings("red", "black", 1, 1), controlTests = [1, 2, 3, 4, 5, 6, 7, 8]) {
3013
+ if (CL === void 0) {
3014
+ CL = Mean([LCL, UCL]);
3015
+ }
3016
+ if (std === void 0) {
3017
+ std = (CL - LCL) / 3;
3018
+ }
3019
+ let Test2 = 0;
3020
+ let Test3 = 0;
3021
+ let Test4 = 0;
3022
+ let Test5 = [0, 0, 0];
3023
+ let Test6 = [0, 0, 0, 0, 0, 0];
3024
+ let Test7 = 0;
3025
+ let Test8 = 0;
3026
+ data.values.forEach((v, i) => {
3027
+ if (controlTests.includes(1) && (v.y > UCL || v.y < LCL)) {
2836
3028
  v.display = display;
2837
3029
  }
3030
+ if (controlTests.includes(2) && (v.y > CL && Test2 >= 0 || v.y < CL && Test2 <= 0)) {
3031
+ Test2 += v.y < CL ? -1 : 1;
3032
+ if (Test2 >= 8 || Test2 <= -8) {
3033
+ v.display = display;
3034
+ }
3035
+ } else {
3036
+ Test2 = 0;
3037
+ }
3038
+ if (i !== 0) {
3039
+ if (controlTests.includes(3) && (v.y > data.values[i - 1].y && Test3 >= 0 || v.y < data.values[i - 1].y && Test3 <= 0)) {
3040
+ Test3 += v.y < data.values[i - 1].y ? -1 : 1;
3041
+ if (Test3 >= 5 || Test3 <= -6) {
3042
+ v.display = display;
3043
+ }
3044
+ } else {
3045
+ Test3 = 0;
3046
+ }
3047
+ if (controlTests.includes(4) && v.y < data.values[i - 1].y) {
3048
+ if (Test4 >= 0) {
3049
+ Test4 = -1 * (Test4 + 1);
3050
+ } else {
3051
+ Test4 = 0;
3052
+ }
3053
+ if (Math.abs(Test4) >= 13) {
3054
+ v.display = display;
3055
+ }
3056
+ }
3057
+ if (controlTests.includes(4) && v.y > data.values[i - 1].y) {
3058
+ if (Test4 <= 0) {
3059
+ Test4 = -1 * (Test4 - 1);
3060
+ } else {
3061
+ Test4 = 0;
3062
+ }
3063
+ if (Math.abs(Test4) >= 13) {
3064
+ v.display = display;
3065
+ }
3066
+ }
3067
+ }
3068
+ Test5[0] = Test5[1];
3069
+ Test5[1] = Test5[2];
3070
+ if (controlTests.includes(5) && v.y > 2 * std + CL) {
3071
+ Test5[2] = 1;
3072
+ if (Test5[0] === 1 || Test5[1] === 1) {
3073
+ v.display = display;
3074
+ }
3075
+ }
3076
+ if (controlTests.includes(5) && v.y < CL - 2 * std) {
3077
+ Test5[2] = -1;
3078
+ if (Test5[0] === -1 || Test5[1] === -1) {
3079
+ v.display = display;
3080
+ }
3081
+ }
3082
+ Test6[0] = Test6[1];
3083
+ Test6[1] = Test6[2];
3084
+ Test6[2] = Test6[3];
3085
+ Test6[3] = Test6[4];
3086
+ Test6[4] = Test6[5];
3087
+ if (controlTests.includes(6) && v.y > std + CL) {
3088
+ Test6[5] = 1;
3089
+ let plus = Test6.filter((t) => t === 1);
3090
+ if (plus.length >= 4) {
3091
+ v.display = display;
3092
+ }
3093
+ } else if (controlTests.includes(6) && v.y < CL - std) {
3094
+ Test6[5] = -1;
3095
+ let plus = Test6.filter((t) => t === -1);
3096
+ if (plus.length >= 4) {
3097
+ v.display = display;
3098
+ }
3099
+ } else {
3100
+ Test6[5] = 0;
3101
+ }
3102
+ if (controlTests.includes(7) && v.y >= CL - std && v.y <= CL + std) {
3103
+ Test7 += 1;
3104
+ if (Test7 >= 15) {
3105
+ v.display = display;
3106
+ }
3107
+ } else {
3108
+ Test7 = 0;
3109
+ }
3110
+ if (controlTests.includes(8) && (v.y < CL - std || v.y > CL + std)) {
3111
+ Test8 += 1;
3112
+ if (Test8 >= 8) {
3113
+ v.display = display;
3114
+ }
3115
+ } else {
3116
+ Test8 = 0;
3117
+ }
2838
3118
  });
2839
3119
  }
2840
3120
  function GetHistogramDataset(data, title, bucketRange, chartSettings) {
@@ -3944,7 +4224,6 @@ export {
3944
4224
  LastObservationsChart,
3945
4225
  Line,
3946
4226
  Margin,
3947
- MarkOutOfControl,
3948
4227
  MaximumLikelihoodParameters,
3949
4228
  Mean,
3950
4229
  Median,
package/index.ts CHANGED
@@ -644,7 +644,7 @@ export function IndividualValuePlot(data: number[], title?: string, historicalMe
644
644
  // Construct dataset with data
645
645
  let dataset = SerializeData(data);
646
646
  dataset.line.type = 'straight'
647
- MarkOutOfControl(dataset, UCL, LCL);
647
+ MarkOutOfControl(dataset, UCL, LCL, centerline, std);
648
648
 
649
649
  return CreateScatterPlot([dataset], title, chartSettings);
650
650
  }
@@ -683,7 +683,7 @@ export function MovingRangeChart(data: number[], title?: string, w: number = 2){
683
683
  // Construct dataset with data
684
684
  let dataset = SerializeData(movingRange);
685
685
  dataset.line.type = 'straight'
686
- MarkOutOfControl(dataset, UCL, LCL);
686
+ MarkOutOfControl(dataset, UCL, LCL,undefined,undefined,undefined,[1]);
687
687
 
688
688
  return CreateScatterPlot([dataset], title, chartSettings);
689
689
  }
@@ -1668,7 +1668,7 @@ export const Distributions = {
1668
1668
  let dMinusArray: number[] = [];
1669
1669
  let dPlusArray: number[] = [];
1670
1670
  for(let i = 1; i <= N; i++){
1671
- let Z_i = this.cdf(data[i-1], mean, std)
1671
+ let Z_i = this.cdf(sortedData[i-1], mean, std)
1672
1672
  dPlusArray.push((i/N)-Z_i);
1673
1673
  dMinusArray.push(Z_i-(i-1)/N);
1674
1674
 
@@ -1679,6 +1679,156 @@ export const Distributions = {
1679
1679
  KS: KS,
1680
1680
  p: p
1681
1681
  };
1682
+ },
1683
+ ShapiroWilk:{
1684
+ Test(data: number[], expanded?: boolean){
1685
+ let N = data.length;
1686
+ let mean = Mean(data);
1687
+
1688
+ let sorted = [...data].sort();
1689
+ let invSort = [...data].sort((a, b) => b - a);
1690
+
1691
+ let SS = 0;
1692
+ sorted.forEach(s => {
1693
+ SS += Math.pow(s - mean, 2);
1694
+ })
1695
+
1696
+ if(N < 12){
1697
+ expanded = false;
1698
+ }
1699
+ // ShapiroWilk Royston Expanded Approximation
1700
+ if(expanded || N > 50){
1701
+ let u = 1/Math.sqrt(N);
1702
+ let m_i: number[] = [];
1703
+ let M = 0;
1704
+ for(let i = 0; i < N; i++){
1705
+ let m = Distributions.Normal.inv((i+1-0.375)/(N+.25));
1706
+ m_i[i] = m;
1707
+ M += Math.pow(m,2);
1708
+ }
1709
+
1710
+ let a_i: number[] = [];
1711
+ a_i[N - 1] = -2.706056*Math.pow(u,5)+4.434685*Math.pow(u,4)-2.07119*Math.pow(u,3)-0.147981*Math.pow(u,2)+0.221157*u+m_i[N - 1]/Math.sqrt(M);
1712
+ a_i[N - 2] = -3.582633*Math.pow(u,5)+5.682633*Math.pow(u,4)-1.752461*Math.pow(u,3)-0.293762*Math.pow(u,2)+0.042981*u+m_i[N - 2]/Math.sqrt(M);
1713
+ a_i[0] = -1 * a_i[N-1];
1714
+ a_i[1] = -1 * a_i[N-2];
1715
+ let eps = (M-2*Math.pow(m_i[N-1],2)-2*Math.pow(m_i[N-2],2))/(1-2*Math.pow(a_i[N-1],2)-2*Math.pow(a_i[N-2],2))
1716
+
1717
+ for(let i = 2; i < N-2; i++){
1718
+ a_i[i] = m_i[i]/Math.sqrt(eps);
1719
+ }
1720
+
1721
+ let W = Math.pow(Correlate(a_i, sorted), 2);
1722
+
1723
+ let p_mu = 0.0038915*Math.pow(Math.log(N),3)-0.083751*Math.pow(Math.log(N),2)-0.31082*Math.log(N)-1.5861;
1724
+ let p_sigma = Math.exp(0.0030302*Math.pow(Math.log(N),2)-0.082676*Math.log(N)-0.4803);
1725
+ let z = (Math.log(1 - W) - p_mu)/p_sigma;
1726
+
1727
+ return {
1728
+ W: W,
1729
+ p: 1 - Distributions.Normal.cdf(z, 0, 1)
1730
+ }
1731
+ }
1732
+ // ShapiroWilk
1733
+ let b = 0;
1734
+ for(let i = 0; i < Math.floor(N/2); i++){
1735
+ let a = Distributions.Normal.ShapiroWilk.constants[i][N-2];
1736
+ b += a*(invSort[i]-sorted[i]);
1737
+ }
1738
+ let W = Math.pow(b, 2)/SS;
1739
+ let p = Distributions.Normal.ShapiroWilk.p(W, N);
1740
+ return {
1741
+ W: W,
1742
+ p: p
1743
+ }
1744
+ },
1745
+ constants:[
1746
+ [0.7071,0.7071,0.6872,0.6646,0.6431,0.6233,0.6052,0.5888,0.5739,0.5601,0.5475,0.5359,0.5251,0.515,0.5056,0.4968,0.4886,0.4808,0.4734,0.4643,0.459,0.4542,0.4493,0.445,0.4407,0.4366,0.4328,0.4291,0.4254,0.422,0.4188,0.4156,0.4127,0.4096,0.4068,0.404,0.4015,0.3989,0.3964,0.394,0.3917,0.3894,0.3872,0.385,0.383,0.3808,0.3789,0.377,0.3751],
1747
+ [NaN,NaN,0.1677,0.2413,0.2806,0.3031,0.3164,0.3244,0.3291,0.3315,0.3325,0.3325,0.3318,0.3306,0.329,0.3273,0.3253,0.3232,0.3211,0.3185,0.3156,0.3126,0.3098,0.3069,0.3043,0.3018,0.2992,0.2968,0.2944,0.2921,0.2898,0.2876,0.2854,0.2834,0.2813,0.2794,0.2774,0.2755,0.2737,0.2719,0.2701,0.2684,0.2667,0.2651,0.2635,0.262,0.2604,0.2589,0.2574],
1748
+ [NaN,NaN,NaN,NaN,0.0875,0.1401,0.1743,0.1976,0.2141,0.226,0.2347,0.2412,0.246,0.2495,0.2521,0.254,0.2553,0.2561,0.2565,0.2578,0.2571,0.2563,0.2554,0.2543,0.2533,0.2522,0.251,0.2499,0.2487,0.2475,0.2463,0.2451,0.2439,0.2427,0.2415,0.2403,0.2391,0.238,0.2368,0.2357,0.2345,0.2334,0.2323,0.2313,0.2302,0.2291,0.2281,0.2271,0.226],
1749
+ [NaN,NaN,NaN,NaN,NaN,NaN,0.0561,0.0947,0.1224,0.1429,0.1586,0.1707,0.1802,0.1878,0.1939,0.1988,0.2027,0.2059,0.2085,0.2119,0.2131,0.2139,0.2145,0.2148,0.2151,0.2152,0.2151,0.215,0.2148,0.2145,0.2141,0.2137,0.2132,0.2127,0.2121,0.2116,0.211,0.2104,0.2098,0.2091,0.2085,0.2078,0.2072,0.2065,0.2058,0.2052,0.2045,0.2038,0.2032],
1750
+ [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,0.0399,0.0695,0.0922,0.1099,0.124,0.1353,0.1447,0.1524,0.1587,0.1641,0.1686,0.1736,0.1764,0.1787,0.1807,0.1822,0.1836,0.1848,0.1857,0.1864,0.187,0.1874,0.1878,0.188,0.1882,0.1883,0.1883,0.1883,0.1881,0.188,0.1878,0.1876,0.1874,0.1871,0.1868,0.1865,0.1862,0.1859,0.1855,0.1851,0.1847],
1751
+ [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,0.0303,0.0539,0.0727,0.088,0.1005,0.1109,0.1197,0.1271,0.1334,0.1399,0.1443,0.148,0.1512,0.1539,0.1563,0.1584,0.1601,0.1616,0.163,0.1641,0.1651,0.166,0.1667,0.1673,0.1678,0.1683,0.1686,0.1689,0.1691,0.1693,0.1694,0.1695,0.1695,0.1695,0.1695,0.1695,0.1693,0.1692,0.1691],
1752
+ [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,0.024,0.0433,0.0593,0.0725,0.0837,0.0932,0.1013,0.1092,0.115,0.1201,0.1245,0.1283,0.1316,0.1346,0.1372,0.1395,0.1415,0.1433,0.1449,0.1463,0.1475,0.1487,0.1496,0.1505,0.1513,0.152,0.1526,0.1531,0.1535,0.1539,0.1542,0.1545,0.1548,0.155,0.1551,0.1553,0.1554],
1753
+ [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,0.0196,0.0359,0.0496,0.0612,0.0711,0.0804,0.0878,0.0941,0.0997,0.1046,0.1089,0.1128,0.1162,0.1192,0.1219,0.1243,0.1265,0.1284,0.1301,0.1317,0.1331,0.1344,0.1356,0.1366,0.1376,0.1384,0.1392,0.1398,0.1405,0.141,0.1415,0.142,0.1423,0.1427,0.143],
1754
+ [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,0.0163,0.0303,0.0422,0.053,0.0618,0.0696,0.0764,0.0823,0.0876,0.0923,0.0965,0.1002,0.1036,0.1066,0.1093,0.1118,0.114,0.116,0.1179,0.1196,0.1211,0.1225,0.1237,0.1249,0.1259,0.1269,0.1278,0.1286,0.1293,0.13,0.1306,0.1312,0.1317],
1755
+ [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,0.014,0.0263,0.0368,0.0459,0.0539,0.061,0.0672,0.0728,0.0778,0.0822,0.0862,0.0899,0.0931,0.0961,0.0988,0.1013,0.1036,0.1056,0.1075,0.1092,0.1108,0.1123,0.1136,0.1149,0.116,0.117,0.118,0.1189,0.1197,0.1205,0.1212],
1756
+ [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,0.0122,0.0228,0.0321,0.0403,0.0476,0.054,0.0598,0.065,0.0697,0.0739,0.0777,0.0812,0.0844,0.0873,0.09,0.0924,0.0947,0.0967,0.0986,0.1004,0.102,0.1035,0.1049,0.1062,0.1073,0.1085,0.1095,0.1105,0.1113],
1757
+ [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,0,0.0107,0.02,0.0284,0.0358,0.0424,0.0483,0.0537,0.0585,0.0629,0.0669,0.0706,0.0739,0.077,0.0798,0.0824,0.0848,0.087,0.0891,0.0909,0.0927,0.0943,0.0959,0.0972,0.0986,0.0998,0.101,0.102],
1758
+ [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,0,0.0094,0.0178,0.0253,0.032,0.0381,0.0435,0.0485,0.053,0.0572,0.061,0.0645,0.0677,0.0706,0.0733,0.0759,0.0782,0.0804,0.0824,0.0842,0.086,0.0876,0.0892,0.0906,0.0919,0.0932],
1759
+ [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,0,0.0084,0.0159,0.0227,0.0289,0.0344,0.0395,0.0441,0.0484,0.0523,0.0559,0.0592,0.0622,0.0651,0.0677,0.0701,0.0724,0.0745,0.0765,0.0783,0.0801,0.0817,0.0832,0.0846],
1760
+ [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,0,0.0076,0.0144,0.0206,0.0262,0.0314,0.0361,0.0404,0.0444,0.0481,0.0515,0.0546,0.0575,0.0602,0.0628,0.0651,0.0673,0.0694,0.0713,0.0731,0.0748,0.0764],
1761
+ [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,0,0.0068,0.0131,0.0187,0.0239,0.0287,0.0331,0.0372,0.0409,0.0444,0.0476,0.0506,0.0534,0.056,0.0584,0.0607,0.0628,0.0648,0.0667,0.0685],
1762
+ [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,0,0.0062,0.0119,0.0172,0.022,0.0264,0.0305,0.0343,0.0379,0.0411,0.0442,0.0471,0.0497,0.0522,0.0546,0.0568,0.0588,0.0608],
1763
+ [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,0,0.0057,0.011,0.0158,0.0203,0.0244,0.0283,0.0318,0.0352,0.0383,0.0412,0.0439,0.0465,0.0489,0.0511,0.0532],
1764
+ [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,0,0.0053,0.0101,0.0146,0.0188,0.0227,0.0263,0.0296,0.0328,0.0357,0.0385,0.0411,0.0436,0.0459],
1765
+ [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,0,0.0049,0.0094,0.0136,0.0175,0.0211,0.0245,0.0277,0.0307,0.0335,0.0361,0.0386],
1766
+ [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,0,0.0045,0.0087,0.0126,0.0163,0.0197,0.0229,0.0259,0.0288,0.0314],
1767
+ [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,0,0.0042,0.0081,0.0118,0.0153,0.0185,0.0215,0.0244],
1768
+ [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,0,0.0039,0.0076,0.0111,0.0143,0.0174],
1769
+ [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,0,0.0037,0.0071,0.0104],
1770
+ [NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,0,0.0035]
1771
+ ],
1772
+ p(W: number, N: number){
1773
+ let wArray = Distributions.Normal.ShapiroWilk.pChart.wValues[N - 3];
1774
+ let inflection = wArray.findIndex(w => W <= w);
1775
+ let w1 = wArray[inflection-1]
1776
+ let w2 = wArray[inflection];
1777
+ let p1 = Distributions.Normal.ShapiroWilk.pChart.pValues[inflection - 1]
1778
+ let p2 = Distributions.Normal.ShapiroWilk.pChart.pValues[inflection]
1779
+ return p1 + ((p2-p1)/(w2-w1))*(W-w1);
1780
+ },
1781
+ pChart:{
1782
+ wValues: [[0.753,0.756,0.767,0.789,0.959,0.998,0.999,1,1,],
1783
+ [0.687,0.707,0.748,0.792,0.935,0.987,0.992,0.996,0.997,],
1784
+ [0.686,0.715,0.762,0.806,0.927,0.979,0.986,0.991,0.993,],
1785
+ [0.713,0.743,0.788,0.826,0.927,0.974,0.981,0.986,0.989,],
1786
+ [0.73,0.76,0.803,0.838,0.928,0.972,0.979,0.985,0.988,],
1787
+ [0.749,0.778,0.818,0.851,0.932,0.972,0.978,0.984,0.987,],
1788
+ [0.764,0.791,0.829,0.859,0.935,0.972,0.978,0.984,0.986,],
1789
+ [0.781,0.806,0.842,0.869,0.938,0.972,0.978,0.983,0.986,],
1790
+ [0.792,0.817,0.85,0.876,0.94,0.973,0.979,0.984,0.986,],
1791
+ [0.805,0.828,0.859,0.883,0.943,0.973,0.979,0.984,0.986,],
1792
+ [0.814,0.837,0.866,0.889,0.945,0.974,0.979,0.984,0.986,],
1793
+ [0.825,0.846,0.874,0.895,0.947,0.975,0.98,0.984,0.986,],
1794
+ [0.835,0.855,0.881,0.901,0.95,0.975,0.98,0.984,0.987,],
1795
+ [0.844,0.863,0.887,0.906,0.952,0.976,0.981,0.985,0.987,],
1796
+ [0.851,0.869,0.892,0.91,0.954,0.977,0.981,0.985,0.987,],
1797
+ [0.858,0.874,0.897,0.914,0.956,0.978,0.982,0.986,0.988,],
1798
+ [0.863,0.879,0.901,0.917,0.957,0.978,0.982,0.986,0.988,],
1799
+ [0.868,0.884,0.905,0.92,0.959,0.979,0.983,0.986,0.988,],
1800
+ [0.873,0.888,0.908,0.923,0.96,0.98,0.983,0.987,0.989,],
1801
+ [0.878,0.892,0.911,0.926,0.961,0.98,0.984,0.987,0.989,],
1802
+ [0.881,0.895,0.914,0.928,0.962,0.981,0.984,0.987,0.989,],
1803
+ [0.884,0.898,0.916,0.93,0.963,0.981,0.984,0.987,0.989,],
1804
+ [0.888,0.901,0.918,0.931,0.964,0.981,0.985,0.988,0.989,],
1805
+ [0.891,0.904,0.92,0.933,0.965,0.982,0.985,0.988,0.989,],
1806
+ [0.894,0.906,0.923,0.935,0.965,0.982,0.985,0.988,0.99,],
1807
+ [0.896,0.908,0.924,0.936,0.966,0.982,0.985,0.988,0.99,],
1808
+ [0.898,0.91,0.926,0.937,0.966,0.982,0.985,0.988,0.99,],
1809
+ [0.9,0.912,0.927,0.939,0.967,0.983,0.985,0.988,0.99,],
1810
+ [0.902,0.914,0.929,0.94,0.967,0.983,0.986,0.988,0.99,],
1811
+ [0.904,0.915,0.93,0.941,0.968,0.983,0.986,0.988,0.99,],
1812
+ [0.906,0.917,0.931,0.942,0.968,0.983,0.986,0.989,0.99,],
1813
+ [0.908,0.919,0.933,0.943,0.969,0.983,0.986,0.989,0.99,],
1814
+ [0.91,0.92,0.934,0.944,0.969,0.984,0.986,0.989,0.99,],
1815
+ [0.912,0.922,0.935,0.945,0.97,0.984,0.986,0.989,0.99,],
1816
+ [0.914,0.924,0.936,0.946,0.97,0.984,0.987,0.989,0.99,],
1817
+ [0.916,0.925,0.938,0.947,0.971,0.984,0.987,0.989,0.99,],
1818
+ [0.917,0.927,0.939,0.948,0.971,0.984,0.987,0.989,0.991,],
1819
+ [0.919,0.928,0.94,0.949,0.972,0.985,0.987,0.989,0.991,],
1820
+ [0.92,0.929,0.941,0.95,0.972,0.985,0.987,0.989,0.991,],
1821
+ [0.922,0.93,0.942,0.951,0.972,0.985,0.987,0.989,0.991,],
1822
+ [0.923,0.932,0.943,0.951,0.973,0.985,0.987,0.99,0.991,],
1823
+ [0.924,0.933,0.944,0.952,0.973,0.985,0.987,0.99,0.991,],
1824
+ [0.926,0.934,0.945,0.953,0.973,0.985,0.988,0.99,0.991,],
1825
+ [0.927,0.935,0.945,0.953,0.974,0.985,0.988,0.99,0.991,],
1826
+ [0.928,0.936,0.946,0.954,0.974,0.985,0.988,0.99,0.991,],
1827
+ [0.929,0.937,0.947,0.954,0.974,0.985,0.988,0.99,0.991,],
1828
+ [0.929,0.939,0.947,0.955,0.974,0.985,0.988,0.99,0.991,],
1829
+ [0.93,0.938,0.947,0.955,0.974,0.985,0.988,0.99,0.991,]],
1830
+ pValues: [0.01,0.02,0.05,0.1,0.5,0.9,0.95,0.98,0.99,]
1831
+ }
1682
1832
  }
1683
1833
  },
1684
1834
  T: {
@@ -2403,6 +2553,55 @@ export const StDev = {
2403
2553
  }
2404
2554
  }
2405
2555
 
2556
+ var Covariance = {
2557
+ /**
2558
+ * Calculates the population covariance of the arrays supplied.
2559
+ * @customfunction
2560
+ * @param xData The first array of numbers.
2561
+ * @param yData The second array of numbers.
2562
+ */
2563
+ P(xData: number[], yData: number[]){
2564
+ let xBar = Mean(xData);
2565
+ let yBar = Mean(yData);
2566
+ let sum = 0;
2567
+
2568
+ for(let i = 0; i < xData.length; i++){
2569
+ sum += (xData[i]-xBar)*(yData[i]-yBar);
2570
+ }
2571
+
2572
+ return sum/xData.length;
2573
+ },
2574
+ /**
2575
+ * Calculates the sample covariance of the arrays supplied.
2576
+ * @customfunction
2577
+ * @param xData The first array of numbers.
2578
+ * @param yData The second array of numbers.
2579
+ */
2580
+ S(xData: number[], yData: number[]){
2581
+ let xBar = Mean(xData);
2582
+ let yBar = Mean(yData);
2583
+ let sum = 0;
2584
+
2585
+ for(let i = 0; i < xData.length; i++){
2586
+ sum += (xData[i]-xBar)*(yData[i]-yBar);
2587
+ }
2588
+
2589
+ return sum/(xData.length-1);
2590
+ },
2591
+ }
2592
+ /**
2593
+ * Calculates the correlation coefficient of the arrays supplied.
2594
+ * @customfunction
2595
+ * @param xData The first array of numbers.
2596
+ * @param yData The second array of numbers.
2597
+ */
2598
+ function Correlate(xData: number[], yData: number[]){
2599
+ let cov = Covariance.S(xData, yData);
2600
+ let den = StDev.S(xData)*StDev.S(yData);
2601
+
2602
+ return cov/den;
2603
+ }
2604
+
2406
2605
  /**
2407
2606
  * Calculates the sum of the numbers supplied.
2408
2607
  * @customfunction
@@ -3278,14 +3477,122 @@ export function CreateScatterPlot(data: DataSet[], title?: string, chartSettings
3278
3477
  * @param data An array of data sets to check
3279
3478
  * @param UCL Upper Control Limit
3280
3479
  * @param LCL Lower Control Limit
3480
+ * @param CL Center Line Value
3481
+ * @param std Standard Deviation of Data
3281
3482
  * @param display Display settings for out-of-control points. DEFAULT: RED SQUARE
3282
3483
  */
3283
- export function MarkOutOfControl(data: DataSet, UCL: number, LCL: number, display: CanvasDrawSettings = new CanvasDrawSettings('red', 'red', 1, 1)){
3284
- data.values.forEach(v => {
3285
- if(v.y > UCL || v.y < LCL){
3484
+ function MarkOutOfControl(data: DataSet, UCL: number, LCL: number, CL?: any, std?: any, display = new CanvasDrawSettings("red", "black", 1, 1), controlTests: number[] = [1,2,3,4,5,6,7,8]) {
3485
+ if(CL === undefined){CL = Mean([LCL, UCL])}
3486
+ if(std === undefined){std = (CL - LCL)/3}
3487
+ let Test2 = 0;
3488
+ let Test3 = 0;
3489
+ let Test4 = 0;
3490
+ let Test5 = [0,0,0];
3491
+ let Test6 = [0, 0, 0, 0, 0, 0];
3492
+ let Test7 = 0;
3493
+ let Test8 = 0;
3494
+ data.values.forEach((v, i) => {
3495
+ // Test1: One point more than 3σ from center line
3496
+ if (controlTests.includes(1) && (v.y > UCL || v.y < LCL)) {
3497
+ v.display = display;
3498
+ }
3499
+ // Test2: Nine points in a row on same side of center line
3500
+ if(controlTests.includes(2) && ((v.y > CL && Test2 >= 0) || (v.y < CL && Test2 <= 0))){
3501
+ Test2 += v.y < CL ? -1 : 1;
3502
+ if(Test2 >= 8 || Test2 <= -8){
3503
+ v.display = display;
3504
+ }
3505
+ }else{
3506
+ Test2 = 0;
3507
+ }
3508
+
3509
+ if(i !== 0){
3510
+ // Test3: Six points in a row increasing or decreasing
3511
+ if(controlTests.includes(3) && ((v.y > data.values[i-1].y && Test3 >= 0) || (v.y < data.values[i-1].y && Test3 <= 0))){
3512
+ Test3 += v.y < data.values[i-1].y ? -1 : 1;
3513
+ if(Test3 >= 5 || Test3 <= -6){
3286
3514
  v.display = display;
3515
+ }
3516
+ }else{
3517
+ Test3 = 0;
3287
3518
  }
3288
- })
3519
+
3520
+ //Test4: Fourteen points in a row, alternating up and down
3521
+ if(controlTests.includes(4) && v.y < data.values[i-1].y){
3522
+ if(Test4 >= 0){
3523
+ Test4 = -1*(Test4 + 1);
3524
+ }else{Test4 = 0}
3525
+ if(Math.abs(Test4) >= 13){
3526
+ v.display = display;
3527
+ }
3528
+ }
3529
+ if(controlTests.includes(4) && v.y > data.values[i-1].y){
3530
+ if(Test4 <= 0){
3531
+ Test4 = -1*(Test4 - 1);
3532
+ }else{Test4 = 0}
3533
+ if(Math.abs(Test4) >= 13){
3534
+ v.display = display;
3535
+ }
3536
+ }
3537
+ }
3538
+
3539
+ // Test5: Two out of three points more than 2σ from the center line (same side)
3540
+ Test5[0] = Test5[1];
3541
+ Test5[1] = Test5[2];
3542
+ if (controlTests.includes(5) && v.y > 2*std+CL) {
3543
+ Test5[2] = 1;
3544
+ if(Test5[0] === 1 || Test5[1] === 1){
3545
+ v.display = display;
3546
+ }
3547
+ }
3548
+ if (controlTests.includes(5) && v.y < CL-2*std) {
3549
+ Test5[2] = -1;
3550
+ if(Test5[0] === -1 || Test5[1] === -1){
3551
+ v.display = display;
3552
+ }
3553
+ }
3554
+
3555
+ // Test6: Four out of five points more than 1σ from center line (same side)
3556
+ Test6[0] = Test6[1];
3557
+ Test6[1] = Test6[2];
3558
+ Test6[2] = Test6[3];
3559
+ Test6[3] = Test6[4];
3560
+ Test6[4] = Test6[5];
3561
+ if (controlTests.includes(6) && v.y > std+CL) {
3562
+ Test6[5] = 1;
3563
+ let plus = Test6.filter(t => t === 1);
3564
+ if(plus.length >= 4){
3565
+ v.display = display
3566
+ }
3567
+ }else if (controlTests.includes(6) && v.y < CL-std) {
3568
+ Test6[5] = -1;
3569
+ let plus = Test6.filter(t => t === -1);
3570
+ if(plus.length >= 4){
3571
+ v.display = display
3572
+ }
3573
+ }else{Test6[5] = 0}
3574
+
3575
+ // Test7: Fifteen points in a row within 1σ of center line (either side)
3576
+ if(controlTests.includes(7) && v.y >= CL - std && v.y <= CL + std){
3577
+ Test7 += 1;
3578
+ if(Test7 >= 15){
3579
+ v.display = display;
3580
+ }
3581
+ }else{
3582
+ Test7 = 0
3583
+ }
3584
+
3585
+ // Test7: Fifteen points in a row within 1σ of center line (either side)
3586
+ if(controlTests.includes(8) && (v.y < CL - std || v.y > CL + std)){
3587
+ Test8 += 1;
3588
+ if(Test8 >= 8){
3589
+ v.display = display;
3590
+ }
3591
+ }else{
3592
+ Test8 = 0
3593
+ }
3594
+
3595
+ });
3289
3596
  }
3290
3597
 
3291
3598
  /**
@@ -3837,6 +4144,33 @@ function QQDistributionModificationX(p: number, distribution: string, data: numb
3837
4144
  }
3838
4145
  return p;
3839
4146
  }
4147
+
4148
+ function CreateControlChart(data: number[], chartTitle?: string, UCL?: number, LCL?: number){
4149
+ let centerline = Mean(data);
4150
+ let std = StDev.S(data);
4151
+
4152
+ if(UCL === undefined){
4153
+ UCL = centerline + 3 * std;
4154
+ }
4155
+ if(LCL === undefined){
4156
+ LCL = centerline - 3 * std;
4157
+ }
4158
+ let dataSet = new DataSet(data.map((d,i) => {return new Point(i,d)}));
4159
+ dataSet.line.type = "straight";
4160
+ let customGridlines = [
4161
+ new CustomGridline(centerline, `x\u0304 = ${Math.round(centerline * 1e3) / 1e3}`, new CanvasDrawSettings("", "green"), void 0, true),
4162
+ new CustomGridline(LCL, `LCL = ${Math.round(LCL * 1e3) / 1e3}`, new CanvasDrawSettings("", "maroon"), void 0, true),
4163
+ new CustomGridline(UCL, `UCL = ${Math.round(UCL * 1e3) / 1e3}`, new CanvasDrawSettings("", "maroon"), void 0, true),
4164
+ ];
4165
+ let chartSettings = new ChartSettings();
4166
+ chartSettings.axis.y.customGridlines = customGridlines;
4167
+
4168
+ MarkOutOfControl(dataSet, UCL, LCL, centerline, std);
4169
+
4170
+ let graph = CreateScatterPlot([dataSet], chartTitle, chartSettings);
4171
+ return graph
4172
+ }
4173
+
3840
4174
  // End Graphs
3841
4175
  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3842
4176
  /** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qesuite",
3
- "version": "1.0.32",
3
+ "version": "1.0.34",
4
4
  "description": "Performs advanced statistical analysis of data. Specifically designed for engineering statistical analysis",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -0,0 +1 @@
1
+ Fixed bug in Normal.KolmogorovSmirnov() where data was not being sorted.
@@ -0,0 +1,11 @@
1
+ - Added new functionality
2
+ - - Covariance.P()
3
+ - - Covariance.S()
4
+ - - Correlate()
5
+ - - ShapiroWilk
6
+ - - - Test(): performs both the standard and expanded with built-in logic to handle sample size constraints
7
+ - - - constants: an array containing all ShapiroWilk constants based on sample size and constant locus
8
+ - - - p(): returns associated p-value from ShapiroWilk tables based on given W and N
9
+ - - - pChart: an object containing arrays used to calculate associated p-value based on W and N
10
+ - - CreateControlChart()
11
+ - - MarkOutOfControl(): included new tests