Choose Language Hide Translation Bar

## Accessing Control Chart constants/unbiasing constant

I'm doing a variance analysis and need to look at the unbiased variance estimates for a number of subgroups I'm looking at.  I can manually calculate them using a d2 table I have, but I was hoping there was a way to put that into a formula.    I know that it can be derived from the Chi-squared distribution, but I don't have the math for that.

Any help on either a direct way to extract d2, or the math behind manually building it would be helpful.

Thanks

Evan Morris

1 ACCEPTED SOLUTION

Accepted Solutions

## Re: Accessing Control Chart constants/unbiasing constant

Haven't seen that d2 thing in a while!

``````// https://v8doc.sas.com/sashtml/qc/chapc/sect9.htm

NamesDefaultToHere(1);

calculateD2 =
Function({n}, {Default Local},
d2 = Round(Integrate(1 - Power(1 - NormalDistribution(x), n) - Power(NormalDistribution(x), n), x, ., .), 5);
);

for(n=2, n<=25, n++, Print(n, calculateD2(n)));``````
7 REPLIES 7

## Re: Accessing Control Chart constants/unbiasing constant

Are you looking for the variance of a subgroup?

https://en.wikipedia.org/wiki/Variance#Sample_variance

That will be the square of the coumns standard deviation the formulas is  (Col Std Dev( col, by1, by2, ...))^2

Run the script below.  You can also find this using Table> Summary.

``````Names Default To Here( 1 );
dt = Open( "\$SAMPLE_DATA/Big Class.jmp" );
dt << New Column( "Standard Variance for Each Age and Sex Group",
Formula( (Col Std Dev( :height, :age, :sex ))^2 )
);``````

## Re: Accessing Control Chart constants/unbiasing constant

No, I'm looking for the unbiased estimate of the population standard deviation (sigma-hat), that can be calculated from the subgroup sample standard deviation (s) and an unbiasing constant (either d2 or c4 depending on sample sizes and how I'm using them).

So lets say I have 30 subgroups of the same size (n=4).  I can calculate S-bar by averaging the within subgroup standard deviation.  I can then divide the s-bar by c4 and determine the unbiased estimate of the population standard deviation.

My problem is that I have varying subgroup sizes, so I can't just look it up once and put it in the table.  I'm also a bit squirelly on whether or not I need d2 or c4 (but that's my problem, I'll sort it out).

Either way, I was just hoping those parameters were easily extractable by a function in JSL, they are pretty common in control charting/SQC work.

Highlighted

## Re: Accessing Control Chart constants/unbiasing constant

Actually, let me update my question a bit.   Is the value reported int he variance components section of the variability gauge unbiased?  That may be sufficient for my work (although I would still prefer access to the constants)

## Re: Accessing Control Chart constants/unbiasing constant

Have you taken a look at the JMP documentation Statistical Details section for the specific control charts you are using? Generally, JMP documentation provides background detail for specific questions such as yours in the Statistical Details section. Here's the section for X bar and S charts in the JMP online documentation:

https://www.jmp.com/support/help/14-2/control-limits-for-xbar-and-s-charts.shtml#1149056

## Re: Accessing Control Chart constants/unbiasing constant

Haven't seen that d2 thing in a while!

``````// https://v8doc.sas.com/sashtml/qc/chapc/sect9.htm

NamesDefaultToHere(1);

calculateD2 =
Function({n}, {Default Local},
d2 = Round(Integrate(1 - Power(1 - NormalDistribution(x), n) - Power(NormalDistribution(x), n), x, ., .), 5);
);

for(n=2, n<=25, n++, Print(n, calculateD2(n)));``````

## Re: Accessing Control Chart constants/unbiasing constant

This is exactly what I need, thanks.

## Re: Accessing Control Chart constants/unbiasing constant

I noticed in JMP15 release that the Control Chart constant/unbiasing constant/bias adjustment constant will be calculated now for sample sizes up to 50. I was curious to see if JMP had any script under Sample Data, Teaching Scripts, or other. Does anyone know if JMP as is can create this table? I built on Ian's function, and made the following script for creating the table for teaching SPC classes. The table is to 5 decimal places, anyone can use Col > Standarize Attributes to change the format to 3 or 4. Also in the SAS software documentation there are functions for d2, d3, and c4. Maybe add the ability to script or add the table in JMP16?

``````// from post by ian_jmp to question on
// "Accessing Control Chart constants/unbiasing constants"

// add the complete table up to 25

Names Default To Here( 1 );

calculateD2 = Function( {n},
{Default Local},
d2 = Round( Integrate( 1 - Power( 1 - Normal Distribution( x ), n ) - Power( Normal Distribution( x ), n ), x, ., . ), 5 )
);

calculateD3 = Function( {n, d2},
{Default Local},
d3 = Round(
sqrt(
2 * (Integrate(
Integrate(
1 - Power(Normal Distribution(y),n) - Power( 1 - Normal Distribution(x),n) + Power( (Normal Distribution(y) - Normal Distribution(x)), n )
, x, ., y)
, y, ., . )) - d2^2
)
, 5 )
);

calculateC4 = Function( {n},
{Default Local},
c4 = Round( gamma(n/2) * sqrt(2/(n-1)) / gamma((n-1)/2), 5 )
);

// create table following example tables showing x-bar constants first (A2, A3)
// then d2 sigma estimate, then the R chart and S chart constants

dt = New Table("Table of Control Chart Constants",
New Column("Sample size", Numeric, Continuous),
New Column("A2", Numeric, Continuous, Format( "Fixed Dec", 8, 5 )),
New Column("A3", Numeric, Continuous, Format( "Fixed Dec", 8, 5 )),
New Column("d2", Numeric, Continuous, Format( "Fixed Dec", 8, 5 )),
New Column("d3", Numeric, Continuous, Format( "Fixed Dec", 8, 5 )),
New Column("D3", Numeric, Continuous, Format( "Fixed Dec", 8, 5 )),
New Column("D4", Numeric, Continuous, Format( "Fixed Dec", 8, 5 )),
New Column("c4", Numeric, Continuous, Format( "Fixed Dec", 8, 5 )),
New Column("B3", Numeric, Continuous, Format( "Fixed Dec", 8, 5 )),
New Column("B4", Numeric, Continuous, Format( "Fixed Dec", 8, 5 )),

); Wait(0);

For( n = 2, n <= 25, n++,
Column(dt,"Sample size")[n-1] = n;
Column(dt,"d2")[n-1] = d2 = calculateD2( n ); Wait(0);
Column(dt,"d3")[n-1] = d3 = calculateD3( n, d2 ); Wait(0);
D3temp = 1 - 3*d3/d2;
If(D3temp > 0,
Column(dt,"D3")[n-1] = D3temp,
Column(dt,"D3")[n-1] = 0   // for negative values
);
Column(dt,"D4")[n-1] = 1 + 3*d3/d2;
Column(dt,"A2")[n-1] = 3/(d2*sqrt(n));
Column(dt,"c4")[n-1] = c4 = calculateC4( n ); Wait(0);
Column(dt,"A3")[n-1] = 3/c4/sqrt(n);
B3temp = 1 - 3 * sqrt(1/c4^2 - 1);
If(B3temp > 0,
Column(dt,"B3")[n-1] = B3temp,
Column(dt,"B3")[n-1] = 0
);
Column(dt,"B4")[n-1] = 1 + 3 * sqrt(1/c4^2 - 1);
);``````