/**********************************************************************/ /* Macro to Calculate ARL for Shewhart Chart */ options mprint nosymbolgen; %macro shewhart(mu0=,sigma=,dl=,du=,d=,lcl=,ucl=); data arls; mu0=&mu0; sigma=σ lcl=(&lcl-mu0)/sigma; ucl=(&ucl-mu0)/sigma; /* Compute ARL for various shifts in process mean */ do shift = &dl to &du by &d; delta = shift/sigma; p=probnorm(ucl-delta) - probnorm(lcl-delta); arl = 1 / (1-p); output; end; proc print; var shift delta arl; run; %mend shewhart; %shewhart(mu0=0,sigma=1,dl=0,du=3.5,d=.2,lcl=-3,ucl=3) /**********************************************************************/ /* Macro to Calculate ARL for Shewhart Chart with */ /* Supplemental Run Rules */ options mprint ; %macro shewsupp(side,mu0=,sigma=,dl=,du=,d=,c1=,r1=,r2=); data arls; z11=0; z12=0; z13=0; z14=0; z21=0; z22=0; z23=0; z24=0; mu0=&mu0; sigma=σ /* Read Number of consecutive points */ /* and region boundaries */ %do i=1 %to 2; %do j=1 %to 4; %let z=%scan(&&r&i,&j,%str( )); %if %quote(&z)= %then %goto nexta; z&i&j=&z; z&i&j=(z&i&j - mu0)/sigma; %end; %nexta: %end; /* Compute ARL for various shifts in process mean */ l=&c1; do shift = &dl to &du by &d; delta = shift/sigma; q=(probnorm(z12-delta) - probnorm(z11-delta)) + (probnorm(z14-delta) - probnorm(z13-delta)); p=(probnorm(z22-delta) - probnorm(z21-delta)) + (probnorm(z24-delta) - probnorm(z23-delta)); arlp = (1-q**l) / (1-q-(1-q**l)*p); /* Compute approximate ARL for Two-sided chart */ /* if necessary */ %if "&side" eq "ONESIDED" %then %do; q=(probnorm(z12+delta) - probnorm(z11+delta)) + (probnorm(z14+delta) - probnorm(z13+delta)); p=(probnorm(z22+delta) - probnorm(z21+delta)) + (probnorm(z24+delta) - probnorm(z23+delta)); arlm = (1-q**l) / (1-q-(1-q**l)*p); arl2 = (1/arlp) + (1/arlm); arlp = 1/arl2; %end; arl=arlp; output; end; proc print; var shift delta arl; run; %mend shewsupp; %shewsupp(ONESIDED,mu0=0,sigma=1,dl=0,du=3.4, d=.2,c1=9,r1=0 3,r2=-1e8 0) %shewsupp(TWOSIDED,mu0=0,sigma=1,dl=0,du=3.4, d=.2,c1=15,r1=-1 1,r2=-3 -1 1 3) %shewsupp(TWOSIDED,mu0=0,sigma=1,dl=0,du=3.4, d=.2,c1=8,r1=-3 -1 1 3,r2=-1 1) %shewsupp(ONESIDED,mu0=0,sigma=1,dl=0,du=3.4, d=.2,c1=3,r1=2 3,r2=-1e8 2) /**********************************************************************/ /* Example Code 1 */ /* Example SAS code to Generate Cusum ARLs */ data arls; mu0=0; sigma=1; h=8; k=.25; do shift=0 to 3.4 by .2; cusarl=cusumarl('TWOSIDED',shift,h,k); output; end; run; proc print; run; /**********************************************************************/ /* Example Code 2 */ /* SAS Code to Generate EWMA ARLs for Table 3 */ data ewma; lambda=.12; do shift=0,1; do h=2.35 to 2.95 by .10; ewmaarl = ewmaarl(shift,lambda,h); output; end; end; run; proc print; title 'EWMA Chart ARL Example'; run; /**********************************************************************/ /* Example Code 3 */ /* Macro to compute approximate correlated data ARL */ %macro approx(h=,k=,rho=,shift=,beta1=,beta2=); data; h=&h; k=&k; shift=&shift; rho=ρ beta1=&beta1; beta2=&beta2; arl0 = cusumarl('TWOSIDED',shift,h,k); intercep = -probit(1/arl0); predpro = intercep + beta1*rho + beta2*rho**2; arlpred = 1 / probnorm(-predpro); run; proc print; run; %mend approx; %approx(h=4,k=.5,rho=.3,shift=0,beta1=-1.92113,beta2=.60359) %approx(h=4,k=.5,rho=.3,shift=1,beta1=-.52487,beta2=.087087) /**********************************************************************/