Johnson System of Distributions-SU System
/****************************************************************/
/* S A S S A M P L E L I B R A R Y */
/* */
/* NAME: JOHNSYS1 */
/* TITLE: Johnson System of Distributions-SU System */
/* PRODUCT: QC */
/* SYSTEM: ALL */
/* KEYS: Capability Analysis, Johnson System, */
/* PROCS: IML CAPABILITY */
/* DATA: */
/* */
/* NOTES: */
/* MISC: */
/* */
/* REF: Slifker, J. F. and Shapiro, S. S. (1980), "The */
/* Johnson System: Selection and Parameter Estimation",*/
/* Technometrics, Vol. 22, No. 2, pg. 239-246. */
/* */
/* Bowman, K. O. and Shenton, L. R. (1983), "Johnson's */
/* System of Distributions", Encyclopedia of */
/* Statistical Sciences, Vol. 4, pg. 303-314. */
/* John Wiley & Sons, Inc. */
/* */
/****************************************************************/
options ps=60 ls=80;
title1 'Johnson SU System of Distributions';
/*---------------------------------------------------------*/
/* */
/* Generate 150 observations from Johnson Su System */
/* */
/*---------------------------------------------------------*/
data sudata;
lambda = 2;
eta = 1;
gamma = 1;
epsilon = 4;
do i = 1 to 150;
z = rannor(9931131);
a = exp( (z-gamma)/eta);
x = lambda*(a**2 -1)/(2*a) + epsilon;
output;
end;
keep x;
run;
/*--------------------------------------------------*/
/* */
/* Estimate Johnson Su parameters using PROC IML */
/* */
/* The parameters are estimated using the method of */
/* matching percentiles as described in Slifker and */
/* Shenton (1980). */
/* */
/*--------------------------------------------------*/
proc iml;
sort sudata out=sorted by x;
use sorted;
read all var {x} into x;
nobs=nrow(x);
/*--- Choose z-value for percentile fit ---*/
zval = .524;
p3 = probnorm(3*zval);
p1 = probnorm(zval);
pm1 = probnorm(-1*zval);
pm3 = probnorm(-3*zval);
i4 = p3*nobs + .5;
i3 = p1*nobs + .5;
i2 = pm1*nobs + .5;
i1 = pm3*nobs + .5;
x3z = x[int(i4)] + mod(i4,1)*(x[int(i4)+1] - x[int(i4)]);
x1z = x[int(i3)] + mod(i3,1)*(x[int(i3)+1] - x[int(i3)]);
xm1z = x[int(i2)] + mod(i2,1)*(x[int(i2)+1] - x[int(i2)]);
xm3z = x[int(i1)] + mod(i1,1)*(x[int(i1)+1] - x[int(i1)]);
m = x3z - x1z;
n = xm1z - xm3z;
p = x1z - xm1z;
/*--- Estimate Johnson Su Parameter ---*/
temp = .5*(m/p + n/p);
eta = 2*zval/(log(temp + sqrt(temp*temp -1 )));
temp = (n/p - m/p) / ( 2*(sqrt(m*n/(p*p) - 1)) );
gamma = eta*log(temp + sqrt(temp*temp + 1));
lambda = 2*p*sqrt(m*n/(p*p)-1)/((m/p+n/p-2)*sqrt(m/p+n/p+2));
epsilon = (x1z + xm1z)/2 + p*(n/p - m/p) / ( 2*(m/p + n/p - 2));
create parms var{eta gamma lambda epsilon};
append;
close parms;
quit;
/*---------------------------------------*/
/* */
/* Use PROC CAPABILITY to save width of */
/* histogram bars in OUTFIT= dataset. */
/* */
/*---------------------------------------*/
proc capability data=sudata noprint;
hist x / outfit = out1 normal(noprint) noplot;
run;
/*------------------------------------------------------------*/
/* */
/* Create annotate dataset that will superimpose the johnson */
/* curve and a table containing the parameter estimates onto */
/* a histogram. */
/* */
/*------------------------------------------------------------*/
data anno;
merge parms out1;
length function style color cepsilon clambda cgamma ceta $ 8
text $ 20;
function = 'point';
color = 'yellow';
size = 2;
xsys = '2';
ysys = '2';
when = 'a';
pi = 3.14159;
constant = (100*_width_/lambda)*(eta/sqrt(2*pi));
start = _midpt1_ - .5*_width_;
finish = _midptn_ + .5*_width_;
/*--- Draw Johnson Curve ---*/
do x = start to finish by .01;
a = (x-epsilon)/lambda;
invsinh = log(a + sqrt(a**2 + 1));
y = constant*
(1/sqrt(1+a**2))*exp(-.5*(gamma+eta*invsinh)**2);
output;
function ='draw';
end;
/*--- Format Parameters with 3 Decimal Places ---*/
cepsilon = put(epsilon,6.3); clambda = put(lambda,6.3);
cgamma = put(gamma, 6.3); ceta = put(eta, 6.3);
/*--- Draw Table containing parameter estimates ---*/
function = 'move'; xsys = '1';
ysys = '1';
x = 0; y = 100; output;
xsys = 'A';
ysys = 'A';
x = 3; y = -2.5; output;
function = 'draw'; x = 4; y = 0;
color = 'yellow';
size = 2; output;
function = 'cntl2txt'; output;
function = 'label'; hsys = 'A';
size = 1;
position = 'c';
style = 'none';
color = 'white';
x = 1; y = -.5; text = 'Johnson (Su)'; output;
function = 'push'; output;
function = 'label';
x = -17; y = -3; text = 'Epsilon'; output;
x = -7; y = -2; text = 'Lambda'; output;
x = -6; y = -2; text = 'Gamma'; output;
x = -5; y = -2; text = 'Eta'; output;
function = 'pop'; output;
function = 'label'; position = 'a'; x = 0;
y = -3; text = cepsilon; output;
y = -2; text = clambda; output;
y = -2; text = cgamma; output;
y = -2; text = ceta; output;
function = 'move'; x = -5; y = 1.5; output;
function = 'poly'; style = 'solid';
color = 'blue';
x = 0; y = 0; output;
function = 'polycont'; x = 19; y = 0; output;
x = 19; y = -12; output;
x = 0; y = -12; output;
x = 0; y = 0; output;
function = 'move'; x = 0; y = -3; output;
function = 'draw'; color = 'white';
x = 19; y = 0; output;
function = 'move'; xsys = '1';
ysys = '1';
x = 0; y = 100; output;
xsys = 'A';
ysys = 'A';
x = 3; y = -2.5; output;
function = 'draw'; x = 4; y = 0;
color = 'yellow';
size = 2; output;
keep function xsys ysys hsys x y
text size position style color when;
run;
/*--------------------------------------------------------------*/
/* */
/* Display histogram with Johnson curve and parameter estimates */
/* */
/*--------------------------------------------------------------*/
pattern1 c=red v=s;
options nogstyle;
proc capability data=sudata annotate=anno noprint;
hist x / cframe = gray;
run;
options gstyle;
goptions reset=global;