Johnson System of Distributions-SB System
/****************************************************************/
/* S A S S A M P L E L I B R A R Y */
/* */
/* NAME: JOHNSYS2 */
/* TITLE: Johnson System of Distributions-SB 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 Sb System of Distributions';
/*---------------------------------------------------------*/
/* */
/* Generate 150 observations from Johnson Sb System */
/* */
/*---------------------------------------------------------*/
data sbdata;
lambda = 1;
eta = 1;
gamma = 1;
epsilon = 2;
do i = 1 to 150;
z = rannor(993131);
a = exp( (z-gamma)/eta);
x = lambda / ( 1 + ( 1/a ) ) + epsilon;
output;
end;
keep x;
run;
/*--------------------------------------------------*/
/* */
/* Estimate Johnson Sb parameters using PROC IML */
/* */
/* The parameters are estimated using the method of */
/* matching percentiles as described in Slifker and */
/* Shenton (1980). */
/* */
/*--------------------------------------------------*/
proc iml;
sort sbdata 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 Sb Parameter ---*/
temp = .5*sqrt( (1 + p/m)*(1 + p/n) );
eta = zval / log( temp + sqrt(temp*temp - 1) );
temp = (p/n-p/m)*sqrt((1 + p/m)*(1 + p/n)-4)/(2*(p*p/(m*n)-1));
gamma = eta*log(temp + sqrt(temp*temp + 1) );
lambda = p*sqrt( ( (1 + p/m)*(1 + p/n)- 2)**2-4)/(p*p/(m*n)-1);
epsilon = (x1z + xm1z)/2-lambda/2 + p*(p/n-p/m)/(2*(p*p/(m*n)-1));
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=sbdata 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;
if ( x > epsilon ) then do;
a = (x-epsilon)/lambda;
fy = log(a / (1 - a ));
y = constant*
(1/(a*(1-a)))*exp(-.5*(gamma + eta*fy)**2);
end;
else y = 0;
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 = 100; y = 100; output;
xsys = 'A';
ysys = 'A';
x = -3; y = -3; output;
function = 'cntl2txt'; output;
function = 'push'; output;
function = 'label'; hsys = 'A';
size = 1;
position = 'a';
style = 'none';
color = 'white';
x = 0; y = 0;
text = 'Johnson (Sb)'; output;
function = 'move'; x = -13; y = .5; output;
function = 'draw'; color = 'yellow';
size = 2;
x = -4; y = 0; output;
function = 'cntl2txt'; output;
function = 'label'; size = 1;
color = 'white';
position = 'c';
x = 0; y = -3.5;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 = -18; y = 2; 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 = 100; y = 100; output;
xsys = 'A';
ysys = 'A';
x = -3; y = -3; output;
function = 'move'; x = -13; y = .5; output;
function = 'draw'; color = 'yellow';
size = 2;
x = -4; y = 0; 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=sbdata annotate=anno noprint;
hist x / cframe = gray;
run;
options gstyle;
goptions reset=global;