You've already forked lazarus-ccr
LazStats: Some refactoring of SPC chart units
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7666 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -93,24 +93,6 @@ type
|
|||||||
var
|
var
|
||||||
BasicSPCForm: TBasicSPCForm;
|
BasicSPCForm: TBasicSPCForm;
|
||||||
|
|
||||||
// Constants for correction of standard deviation, needed by some charts.
|
|
||||||
const
|
|
||||||
C4: array[2..25] of double = (
|
|
||||||
0.7979, 0.8862, 0.9213, 0.9400, 0.9515, 0.9594, 0.9650, 0.9693,
|
|
||||||
0.9727, 0.9754, 0.9776, 0.9794, 0.9810, 0.9823, 0.9835, 0.9845, 0.9854, 0.9862,
|
|
||||||
0.9869, 0.9876, 0.9882, 0.9887, 0.9892, 0.9896);
|
|
||||||
|
|
||||||
D3: array[1..24] of double = (
|
|
||||||
0, 0, 0, 0, 0, 0.076, 0.136, 0.184, 0.223, 0.256, 0.283, 0.307, 0.328,
|
|
||||||
0.347, 0.363, 0.378, 0.391, 0.403, 0.415, 0.425, 0.434, 0.443,
|
|
||||||
0.451, 0.459
|
|
||||||
);
|
|
||||||
D4: array[1..24] of double = (
|
|
||||||
3.267, 2.574, 2.282, 2.114, 2.004, 1.924, 1.864, 1.816, 1.777,
|
|
||||||
1.744, 1.717, 1.693, 1.672, 1.653, 1.637, 1.622, 1.608, 1.597,
|
|
||||||
1.585, 1.575, 1.566, 1.557, 1.548, 1.541
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
@ -139,6 +121,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
// To be overridden by descendant forms
|
||||||
procedure TBasicSPCForm.Compute;
|
procedure TBasicSPCForm.Compute;
|
||||||
begin
|
begin
|
||||||
//
|
//
|
||||||
|
@ -25,6 +25,19 @@ uses
|
|||||||
Math,
|
Math,
|
||||||
Globals, Utils, MainUnit, DataProcs;
|
Globals, Utils, MainUnit, DataProcs;
|
||||||
|
|
||||||
|
// Constants for correction of standard deviation
|
||||||
|
const
|
||||||
|
D3: array[2..25] of double = (
|
||||||
|
0, 0, 0, 0, 0, 0.076, 0.136, 0.184, 0.223, 0.256, 0.283, 0.307, 0.328,
|
||||||
|
0.347, 0.363, 0.378, 0.391, 0.403, 0.415, 0.425, 0.434, 0.443,
|
||||||
|
0.451, 0.459
|
||||||
|
);
|
||||||
|
D4: array[2..25] of double = (
|
||||||
|
3.267, 2.574, 2.282, 2.114, 2.004, 1.924, 1.864, 1.816, 1.777,
|
||||||
|
1.744, 1.717, 1.693, 1.672, 1.653, 1.637, 1.622, 1.608, 1.597,
|
||||||
|
1.585, 1.575, 1.566, 1.557, 1.548, 1.541
|
||||||
|
);
|
||||||
|
|
||||||
procedure TRChartForm.Compute;
|
procedure TRChartForm.Compute;
|
||||||
var
|
var
|
||||||
i, j: Integer;
|
i, j: Integer;
|
||||||
@ -116,8 +129,8 @@ begin
|
|||||||
seMean := seMean / sqrt(numValues);
|
seMean := seMean / sqrt(numValues);
|
||||||
grandMean := grandMean / numValues;
|
grandMean := grandMean / numValues;
|
||||||
grandRange := grandRange / numGrps;
|
grandRange := grandRange / numGrps;
|
||||||
D3Value := D3[grpSize-1];
|
D3Value := D3[grpSize];
|
||||||
D4Value := D4[grpSize-1];
|
D4Value := D4[grpSize];
|
||||||
UCL := D4Value * grandRange;
|
UCL := D4Value * grandRange;
|
||||||
LCL := D3Value * grandRange;
|
LCL := D3Value * grandRange;
|
||||||
|
|
||||||
|
@ -1,3 +1,11 @@
|
|||||||
|
{ This unit was checked against a commercial statistical software and
|
||||||
|
creates correct results.
|
||||||
|
|
||||||
|
Data file for testing: "boltsize.laz"
|
||||||
|
Group variable: LotNo
|
||||||
|
Selected variable: BoltLngth
|
||||||
|
}
|
||||||
|
|
||||||
unit SChartUnit;
|
unit SChartUnit;
|
||||||
|
|
||||||
{$mode objfpc}{$H+}
|
{$mode objfpc}{$H+}
|
||||||
@ -40,11 +48,9 @@ var
|
|||||||
numValues: Integer = 0;
|
numValues: Integer = 0;
|
||||||
grp: String;
|
grp: String;
|
||||||
grpIndex: Integer;
|
grpIndex: Integer;
|
||||||
X, Xsq: Double;
|
X, Xsq, Xmin, Xmax: Double;
|
||||||
seMean, grandMean, grandSigma, grandSD: Double;
|
seMean, grandMean, grandSigma, grandSD: Double;
|
||||||
B, C4, gamma, D3Value, D4Value: Double;
|
B, C4: Double;
|
||||||
xmin, xmax: Double;
|
|
||||||
sizeError: Boolean;
|
|
||||||
i, j: Integer;
|
i, j: Integer;
|
||||||
lReport: TStrings;
|
lReport: TStrings;
|
||||||
begin
|
begin
|
||||||
@ -63,7 +69,6 @@ begin
|
|||||||
seMean := 0.0;
|
seMean := 0.0;
|
||||||
grandMean := 0.0;
|
grandMean := 0.0;
|
||||||
grandSigma := 0.0;
|
grandSigma := 0.0;
|
||||||
sizeError := false;
|
|
||||||
|
|
||||||
// Count "good" data points
|
// Count "good" data points
|
||||||
numValues := 0;
|
numValues := 0;
|
||||||
@ -101,12 +106,15 @@ begin
|
|||||||
grpSize := count[j];
|
grpSize := count[j];
|
||||||
if j = 0 then oldGrpSize := grpSize;
|
if j = 0 then oldGrpSize := grpSize;
|
||||||
if oldGrpSize <> grpSize then
|
if oldGrpSize <> grpSize then
|
||||||
sizeError := true;
|
begin
|
||||||
|
ErrorMsg('All groups must have the same size.');
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
if (grpSize < 2) or (grpSize > 25) or sizeError then
|
if (grpSize < 2) then
|
||||||
begin
|
begin
|
||||||
ErrorMsg('Group size error.');
|
ErrorMsg('Groups with at least two values required.');
|
||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -117,14 +125,9 @@ begin
|
|||||||
seMean := seMean / sqrt(numValues);
|
seMean := seMean / sqrt(numValues);
|
||||||
grandMean := grandMean / numValues;
|
grandMean := grandMean / numValues;
|
||||||
grandSigma := grandSigma / numGrps;
|
grandSigma := grandSigma / numGrps;
|
||||||
D3Value := D3[grpSize-1];
|
|
||||||
D4Value := D4[grpSize-1];
|
C4 := CalcC4(grpSize);
|
||||||
C4 := sqrt(2.0 / (grpSize - 1));
|
B := grandSigma * sqrt(1.0 - sqr(C4)) / C4;
|
||||||
gamma := exp(GammaLn(grpSize / 2.0));
|
|
||||||
C4 := C4 * gamma;
|
|
||||||
gamma := exp(GammaLn((grpSize-1) / 2.0));
|
|
||||||
C4 := C4 / gamma;
|
|
||||||
B := grandSigma * sqrt(1.0 - (C4 * C4)) / C4;
|
|
||||||
UCL := grandSigma + 3.0 * B;
|
UCL := grandSigma + 3.0 * B;
|
||||||
LCL := grandSigma - 3.0 * B;
|
LCL := grandSigma - 3.0 * B;
|
||||||
if (LCL < 0.0) then LCL := 0.0;
|
if (LCL < 0.0) then LCL := 0.0;
|
||||||
@ -135,6 +138,9 @@ begin
|
|||||||
lReport.Add('Sigma Chart Results');
|
lReport.Add('Sigma Chart Results');
|
||||||
lReport.Add('');
|
lReport.Add('');
|
||||||
lReport.Add('Number of values: %8d', [numValues]);
|
lReport.Add('Number of values: %8d', [numValues]);
|
||||||
|
lReport.Add('Number of groups: %8d', [numGrps]);
|
||||||
|
lReport.Add('Group size: %8d', [grpSize]);
|
||||||
|
lReport.Add('');
|
||||||
lReport.Add('Grand Mean: %8.3f', [grandMean]);
|
lReport.Add('Grand Mean: %8.3f', [grandMean]);
|
||||||
lReport.Add('Standard Deviation: %8.3f', [grandSD]);
|
lReport.Add('Standard Deviation: %8.3f', [grandSD]);
|
||||||
lReport.Add('Standard Error of Mean: %8.3f', [seMean]);
|
lReport.Add('Standard Error of Mean: %8.3f', [seMean]);
|
||||||
@ -157,7 +163,7 @@ begin
|
|||||||
PlotMeans(
|
PlotMeans(
|
||||||
Format('Sigma Chart for "%s"', [GetFileName]),
|
Format('Sigma Chart for "%s"', [GetFileName]),
|
||||||
GroupEdit.Text, Format('StdDev(%s)', [MeasEdit.Text]),
|
GroupEdit.Text, Format('StdDev(%s)', [MeasEdit.Text]),
|
||||||
'Group Sigma', 'Mean',
|
'Group Sigma', 'Avg',
|
||||||
groups, stdDev,
|
groups, stdDev,
|
||||||
UCL, LCL, grandSigma,
|
UCL, LCL, grandSigma,
|
||||||
NaN, NaN, NaN
|
NaN, NaN, NaN
|
||||||
|
@ -25,6 +25,8 @@ function FDensity(x: Double; DF1, DF2: Integer): Double;
|
|||||||
|
|
||||||
function Chi2Density(x: Double; N: Integer): Double;
|
function Chi2Density(x: Double; N: Integer): Double;
|
||||||
|
|
||||||
|
function CalcC4(n: Integer): Double;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses
|
uses
|
||||||
@ -286,5 +288,24 @@ begin
|
|||||||
Result := power(x, (N-2.0) * 0.5) / (factor * exp(x * 0.5));
|
Result := power(x, (N-2.0) * 0.5) / (factor * exp(x * 0.5));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
// Returns the value of the C4 factor needed for correction of standard deviations
|
||||||
|
// C4 = sqrt(2 / (n-1)) (n/2-1)! / ((n-1)/2-1)!
|
||||||
|
function CalcC4(n: Integer): Double;
|
||||||
|
var
|
||||||
|
gamma1, gamma2: Double;
|
||||||
|
begin
|
||||||
|
gamma1 := GammaLn(n/2);
|
||||||
|
gamma2 := GammaLn((n-1)/2);
|
||||||
|
Result := sqrt(2.0 / (n-1)) * exp(gamma1 - gamma2);
|
||||||
|
{
|
||||||
|
C4 := sqrt(2.0 / (grpSize - 1));
|
||||||
|
gamma := exp(GammaLn(grpSize / 2.0));
|
||||||
|
C4 := C4 * gamma;
|
||||||
|
gamma := exp(GammaLn((grpSize-1) / 2.0));
|
||||||
|
C4 := C4 / gamma;
|
||||||
|
}
|
||||||
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user