Short Run Process Control

/****************************************************************/
/*          S A S   S A M P L E   L I B R A R Y                 */
/*                                                              */
/*    NAME: SHWSRUN                                             */
/*   TITLE: Short Run Process Control                           */
/* PRODUCT: QC                                                  */
/*  SYSTEM: ALL                                                 */
/*    KEYS: Shewhart Charts, Short Run Process Control,         */
/*   PROCS: SHEWHART GLM MEANS                                  */
/*    DATA:                                                     */
/*                                                              */
/*     REF: SAS/QC Software:  Usage and Reference, Version 6,   */
/*          First Edition, Volume 1 and Volume 2                */
/*                                                              */
/****************************************************************/

data Old;
   input Sample Prodtype $ Diameter;
   datalines;
 1  M3  13.99
 2  M3  14.69
 3  M3  13.86
 4  M3  14.32
 5  M3  13.23
 6  M1  17.55
 7  M1  14.26
 8  M1  14.62
 9  M1  12.97
10  M2  16.18
11  M2  15.29
12  M2  16.20
13  M3  13.89
14  M3  12.71
15  M3  14.32
16  M3  15.35
17  M2  15.08
18  M2  14.72
19  M2  14.79
20  M2  15.27
21  M2  15.95
22  M1  14.78
23  M1  15.19
24  M1  15.41
25  M1  16.26
26  M3  16.68
27  M3  15.60
28  M3  14.86
29  M3  16.67
30  M3  14.35
;

title;
proc print data=Old noobs;
run;

data Nomval;
   length Prodtype $2;
   input Prodtype Nominal;
   datalines;
M1 15.0
M2 15.5
M3 14.8
M4 15.2
;

title;
proc print data=Nomval noobs;
run;

proc sort data=Old;
   by Prodtype;
run;

data Old;
   format Diff 5.2 ;
   merge Nomval Old(in = a);
      by Prodtype;
   if a;
   Diff = Diameter - Nominal;
run;

proc sort data=Old;
   by Sample;
run;

title;
proc print data=Old noobs;
   var Sample Prodtype Diameter Nominal Diff;
run;

proc sort data=Old;
   by Prodtype;
run;

proc shewhart data=Old;
   irchart Diff*Sample /
      nochart
      outlimits=Baselim;
   by Prodtype;
run;

title 'Control Limits By Product Type';
proc print data=Baselim noobs;
run;

proc means data=Baselim noprint;
   var _r_;
   output out=Difflim (keep=_r_) mean=_r_;
run;

data Difflim;
   set Difflim;
   drop _r_;
   length _var_ _subgrp_ $ 8;
   _var_    = 'Diff';
   _subgrp_ = 'Sample';
   _mean_   = 0.0;
   _stddev_ = _r_ / d2(2);
   _limitn_ = 2;
   _sigmas_ = 3;
run;

title 'Control Limit Parameters For Differences';
proc print data=Difflim noobs;
run;

data new;
   input Sample Prodtype $ Diameter;
   datalines;
31  M2  14.69
32  M2  15.39
33  M2  14.56
34  M2  15.02
35  M2  13.93
36  M1  17.55
37  M1  14.26
38  M3  14.42
39  M3  12.77
40  M3  15.48
41  M3  14.59
42  M2  16.20
43  M2  14.59
44  M2  13.41
45  M2  15.02
46  M2  16.05
47  M2  15.08
48  M2  14.72
49  M2  14.79
50  M1  14.77
51  M1  15.45
52  M1  14.28
53  M1  14.69
54  M2  15.41
55  M2  16.26
56  M2  17.38
57  M3  15.60
58  M3  14.86
59  M3  16.67
60  M3  14.35
;

proc sort data=new;
   by Prodtype;
run;

data new;
   format Diff 5.2 ;
   merge Nomval new(in = a);
      by Prodtype;
   if a;
   Diff = Diameter - Nominal;
   label Sample   = 'Sample Number'
         Prodtype = 'Model';
run;

proc sort data=new;
   by Sample;
run;

ods graphics off;
symbol1 v=dot    c=blue  h=3.0 pct;
symbol2 v=plus   c=red   h=3.0 pct;
symbol3 v=circle c=green h=3.0 pct;
title 'Chart for Difference from Nominal';
proc shewhart data=new limits=Difflim;
   irchart Diff*Sample=Prodtype / split    = '/';
   label Diff = 'Difference/Moving Range';
run;

symbol h=3.0 pct;
title 'Chart for Difference from Nominal';
proc shewhart data=new (rename=(Prodtype=_phase_)) limits=Difflim;
   irchart Diff*Sample /
      readphases = all
      phaseref
      phasebreak
      phaselegend
      split      = '/';
   label Diff = 'Difference/Moving Range';
run;

data Difflim;
   set Difflim;
   _var_    = 'Diameter';
   _limitn_ = 1;
run;

title 'Differences and Nominal Values';
proc shewhart data=new limits=Difflim;
   xchart Diameter*Sample (Prodtype) /
      nolimitslegend
      nolegend
      split         = '/'
      blockpos      = 3
      blocklabtype  = scaled
      blocklabelpos = left
      xsymbol       = xbar
      trendvar      = Nominal;
   label Diameter   = 'Difference/Nominal'
         Prodtype   = 'Product';
run;

proc sort data=Old;
   by Prodtype;
run;

proc means data=Old noprint;
   var Diameter;
   by Prodtype;
   output out=Oldmean (keep=Prodtype diammean) mean=diammean;
run;

data Old;
   merge Old Oldmean;
      by Prodtype;
   absdev = abs( Diameter - diammean );
run;

proc means data=Old noprint;
  var absdev;
  by Prodtype;
  output out=stats n=n mean=mean css=css std=std;
run;

title;
proc glm data=Old outstat=glmout;
   class Prodtype;
   model absdev = Prodtype;
run;

proc sort data=new;
   by Prodtype;
run;

data new;
   keep Sample Prodtype z Diff Diameter Nominal _stddev_;
   label Sample = 'Sample Number';
   format Diff 5.2 ;
   merge Baselim new(in = a);
      by Prodtype;
   if a;
   z = (Diameter - Nominal) / _stddev_ ;
run;

proc sort data=new;
   by Sample;
run;

title 'Standardized Chart';
proc shewhart data=new;
   irchart z*Sample (Prodtype) /
      blocklabtype  = scaled
      mu0           = 0
      sigma0        = 1
      split         = '/';
   label Prodtype = 'Product Classification'
         z = 'Standardized Difference/Moving Range';
run;