T-Square Chart for Bivariate Data

 /****************************************************************/
 /*          S A S   S A M P L E   L I B R A R Y                 */
 /*                                                              */
 /*    NAME: SHWTSQ3                                             */
 /*   TITLE: T-Square Chart for Bivariate Data                   */
 /* PRODUCT: QC                                                  */
 /*  SYSTEM: ALL                                                 */
 /*    KEYS: Shewhart Charts, T-Square Charts,                   */
 /*   PROCS: SHEWHART PRINCOMP SCORE                             */
 /*    DATA:                                                     */
 /*                                                              */
 /*     REF: Jackson, J. E. (1980).  Principal Components and    */
 /*          Factor Analysis:  Part I--Principal Components,     */
 /*          Journal of Quality Technology 12, 201-213.          */
 /*                                                              */
 /*   NOTES: The data in this example are based on the data      */
 /*          in Tables 1 and 2 of Jackson (1980).  Control       */
 /*          limits are computed from the first 15 observations, */
 /*          and the control limits are then extended to the     */
 /*          next 4 observations labeled A, B, C, D.             */
 /*                                                              */
 /*          In this example, the PRINCOMP and SCORE procedures  */
 /*          are used to compute the principal components, and   */
 /*          the DATA step is used to compute the T square       */
 /*          statistic as a sum of squares of the principal      */
 /*          components.  The results are passed to the SHEWHART */
 /*          procedure for graphical display.                    */
 /*                                                              */
 /*          The formulas for the control limits are exact and   */
 /*          based on the beta distribution.  By comparison, the */
 /*          control limits used by Jackson (1980) are approxi-  */
 /*          mations (see example shwtsq2.sas in the SAS/QC      */
 /*          Sample Library.)                                    */
 /*                                                              */
 /*          This example can be generalized in various ways.    */
 /*          For instance, it is easily extended to problems     */
 /*          in which the dimension p is greater than two.       */
 /*                                                              */
 /*    MISC:                                                     */
 /*                                                              */
 /****************************************************************/

options ps=60 ls=100;


* Data set from which control limits are to be computed;
data original;
   length i $ 2 ;
   input i x1 x2;
cards;
1   10.0  10.7
2   10.4   9.8
3    9.7  10.0
4    9.7  10.1
5   11.7  11.5
6   11.0  10.8
7    8.7   8.8
8    9.5   9.3
9   10.1   9.4
10   9.6   9.6
11  10.5  10.4
12   9.2   9.0
13  11.3  11.6
14  10.1   9.8
15   8.5   9.2
run;

* Additional observations;
data new;
   length i $ 2 ;
   input i x1 x2;
cards;
A   12.3  12.5
B    7.0   7.3
C   11.0   9.0
D    7.3   9.1
run;

* Center training data and save number of observations;
proc means data=original noprint;
   var x1 x2;
   output out=xmeans mean=mx1 mx2 n=nx1;
data xmeans;
   set xmeans;
   keep mx1 mx2 nx1;
data original;
   drop mx1 mx2;
   set original;
   if _n_=1 then set xmeans;
   x1 = x1 - mx1;
   x2 = x2 - mx2;
   _subn_   = 1;
   _limitn_ = 1;
run;

* Determine principal components;
proc princomp data=original std cov noprint out=prin
              outstat=scores;
   var x1 x2;
run;
title "Scores For Chemical Data";
proc print data=scores;
run;

* Compute T-square statistic for training data;
data prin;
   length period $ 16;
   set prin;
   period  = 'Training Data';
   tsquare = prin1*prin1 + prin2*prin2;
run;

* Center new observations with means of training data;
data new;
   length period $ 16;
   drop mx1 mx2;
   set new;
   period = 'New Data';
   if _n_=1 then set xmeans;
   x1 = x1 - mx1;
   x2 = x2 - mx2;
   _subn_   = 1;
   _limitn_ = 1;
run;

* Compute T-square statistics for new data;
proc score data=new score=scores out=newscore;
   var x1 x2;
run;
data newscore;
   set newscore;
   tsquare = prin1*prin1 + prin2*prin2;
run;

* Combine T-square statistics for original and new data;
data combine (rename=(tsquare=_subx_));
   set prin newscore;
   length _var_ $ 8 ;
   p        = 2;
   _var_    = 'tsquare';
   _alpha_  = 0.05;
   _lclx_   = ( ( nx1 - 1 ) * ( nx1 - 1 ) / nx1 ) *
              betainv( _alpha_/2, p/2, (nx1 - p - 1)/2 );
   _mean_   = ( ( nx1 - 1 ) * ( nx1 - 1 ) / nx1 ) *
              betainv( 0.5, p/2, (nx1 - p - 1)/2 );
   _uclx_   = ( ( nx1 - 1 ) * ( nx1 - 1 ) / nx1 ) *
              betainv( 1 - _alpha_/2, p/2, (nx1 - p - 1)/2 );
run;

title 'Analysis of Data For Chemical Example';
proc print data=combine;
run;

* Display T-squared chart;
title f=none h=1  'T'
      m=(+0,+1)   '2'
      m=(+0,-1)   ' Chart For Chemical Example';
symbol1 v=dot c=white h=.75;
proc shewhart table=combine;
   xchart tsquare * i ( period ) /
      blockpos = 1
      vaxis    = 0 to 25 by 5
      xsymbol  = mu
      cframe   = grey
      cinfill  = red
      novangle
      nolegend ;
label _SUBX_ = 'T Square'
      i      = 'Measurement Index';
run;

goptions reset=all;