goptions reset = all; data sasuser.iris; input variety $ sl sw pl pw @@; datalines; S 5.1 3.5 1.4 0.2 S 4.9 3.0 1.4 0.2 S 4.7 3.2 1.3 0.2 S 4.6 3.1 1.5 0.2 S 5.0 3.6 1.4 0.2 S 5.4 3.9 1.7 0.4 S 4.6 3.4 1.4 0.3 S 5.0 3.4 1.5 0.2 S 4.4 2.9 1.4 0.2 S 4.9 3.1 1.5 0.1 S 5.4 3.7 1.5 0.2 S 4.8 3.4 1.6 0.2 S 4.8 3.0 1.4 0.1 S 4.3 3.0 1.1 0.1 S 5.8 4.0 1.2 0.2 S 5.7 4.4 1.5 0.4 S 5.4 3.9 1.3 0.4 S 5.1 3.5 1.4 0.3 S 5.7 3.8 1.7 0.3 S 5.1 3.8 1.5 0.3 S 5.4 3.4 1.7 0.2 S 5.1 3.7 1.5 0.4 S 4.6 3.6 1.0 0.2 S 5.1 3.3 1.7 0.5 S 4.8 3.4 1.9 0.2 S 5.0 3.0 1.6 0.2 S 5.0 3.4 1.6 0.4 S 5.2 3.5 1.5 0.2 S 5.2 3.4 1.4 0.2 S 4.7 3.2 1.6 0.2 S 4.8 3.1 1.6 0.2 S 5.4 3.4 1.5 0.4 S 5.2 4.1 1.5 0.1 S 5.5 4.2 1.4 0.2 S 4.9 3.1 1.5 0.2 S 5.0 3.2 1.2 0.2 S 5.5 3.5 1.3 0.2 S 4.9 3.6 1.4 0.1 S 4.4 3.0 1.3 0.2 S 5.1 3.4 1.5 0.2 S 5.0 3.5 1.3 0.3 S 4.5 2.3 1.3 0.3 S 4.4 3.2 1.3 0.2 S 5.0 3.5 1.6 0.6 S 5.1 3.8 1.9 0.4 S 4.8 3.0 1.4 0.3 S 5.1 3.8 1.6 0.2 S 4.6 3.2 1.4 0.2 S 5.3 3.7 1.5 0.2 S 5.0 3.3 1.4 0.2 C 7.0 3.2 4.7 1.4 C 6.4 3.2 4.5 1.5 C 6.9 3.1 4.9 1.5 C 5.5 2.3 4.0 1.3 C 6.5 2.8 4.6 1.5 C 5.7 2.8 4.5 1.3 C 6.3 3.3 4.7 1.6 C 4.9 2.4 3.3 1.0 C 6.6 2.9 4.6 1.3 C 5.2 2.7 3.9 1.4 C 5.0 2.0 3.5 1.0 C 5.9 3.0 4.2 1.5 C 6.0 2.2 4.0 1.0 C 6.1 2.9 4.7 1.4 C 5.6 2.9 3.6 1.3 C 6.7 3.1 4.4 1.4 C 5.6 3.0 4.5 1.5 C 5.8 2.7 4.1 1.0 C 6.2 2.2 4.5 1.5 C 5.6 2.5 3.9 1.1 C 5.9 3.2 4.8 1.8 C 6.1 2.8 4.0 1.3 C 6.3 2.5 4.9 1.5 C 6.1 2.8 4.7 1.2 C 6.4 2.9 4.3 1.3 C 6.6 3.0 4.4 1.4 C 6.8 2.8 4.8 1.4 C 6.7 3.0 5.0 1.7 C 6.0 2.9 4.5 1.5 C 5.7 2.6 3.5 1.0 C 5.5 2.4 3.8 1.1 C 5.5 2.4 3.7 1.0 C 5.8 2.7 3.9 1.2 C 6.0 2.7 5.1 1.6 C 5.4 3.0 4.5 1.5 C 6.0 3.4 4.5 1.6 C 6.7 3.1 4.7 1.5 C 6.3 2.3 4.4 1.3 C 5.6 3.0 4.1 1.3 C 5.5 2.5 4.0 1.3 C 5.5 2.6 4.4 1.2 C 6.1 3.0 4.6 1.4 C 5.8 2.6 4.0 1.2 C 5.0 2.3 3.3 1.0 C 5.6 2.7 4.2 1.3 C 5.7 3.0 4.2 1.2 C 5.7 2.9 4.2 1.3 C 6.2 2.9 4.3 1.3 C 5.1 2.5 3.0 1.1 C 5.7 2.8 4.1 1.3 V 6.3 3.3 6.0 2.5 V 5.8 2.7 5.1 1.9 V 7.1 3.0 5.9 2.1 V 6.3 2.9 5.6 1.8 V 6.5 3.0 5.8 2.2 V 7.6 3.0 6.6 2.1 V 4.9 2.5 4.5 1.7 V 7.3 2.9 6.3 1.8 V 6.7 2.5 5.8 1.8 V 7.2 3.6 6.1 2.5 V 6.5 3.2 5.1 2.0 V 6.4 2.7 5.3 1.9 V 6.8 3.0 5.5 2.1 V 5.7 2.5 5.0 2.0 V 5.8 2.8 5.1 2.4 V 6.4 3.2 5.3 2.3 V 6.5 3.0 5.5 1.8 V 7.7 3.8 6.7 2.2 V 7.7 2.6 6.9 2.3 V 6.0 2.2 5.0 1.5 V 6.9 3.2 5.7 2.3 V 5.6 2.8 4.9 2.0 V 7.7 2.8 6.7 2.0 V 6.3 2.7 4.9 1.8 V 6.7 3.3 5.7 2.1 V 7.2 3.2 6.0 1.8 V 6.2 2.8 4.8 1.8 V 6.1 3.0 4.9 1.8 V 6.4 2.8 5.6 2.1 V 7.2 3.0 5.8 1.6 V 7.4 2.8 6.1 1.9 V 7.9 3.8 6.4 2.0 V 6.4 2.8 5.6 2.2 V 6.3 2.8 5.1 1.5 V 6.1 2.6 5.6 1.4 V 7.7 3.0 6.1 2.3 V 6.3 3.4 5.6 2.4 V 6.4 3.1 5.5 1.8 V 6.0 3.0 4.8 1.8 V 6.9 3.1 5.4 2.1 V 6.7 3.1 5.6 2.4 V 6.9 3.1 5.1 2.3 V 5.8 2.7 5.1 1.9 V 6.8 3.2 5.9 2.3 V 6.7 3.3 5.7 2.5 V 6.7 3.0 5.2 2.3 V 6.3 2.5 5.0 1.9 V 6.5 3.0 5.2 2.0 V 6.2 3.4 5.4 2.3 V 5.9 3.0 5.1 1.8 ; /* Dave Dickey Created Feb15 2008 */ /* Dan Kelly and Cat Truxillo Modified Feb22 2008 */ /* ------------------------------------------------------------------------------------- IRIS : Fisher's iris data. ------------------------------------------------------------------------------------- */ %macro pdf (rawdata, statdata, class, vars); proc freq data=&rawdata noprint; tables &class / out=list(keep=&class); run; proc sql noprint; select &class into :group1-:group99 from list; quit; %do ii = 1 %to &sqlobs; %put &&groupⅈ proc iml; USE &rawdata; USE &statdata; setin &statdata; read ALL VAR &vars Where (_TYPE_ = 'PCOV') into PCOV; read ALL VAR &vars Where (&class = "&&group&ii")/*need double quotes here so the & resolves*/ into MEANT; /* row vector of means */ /*print PCOV;print MEANT;*/ MEAN = MEANT`; /* column vector of means */ dS = det(PCOV); /* determinant of pooled covariance matrix */ p = NCOL(PCOV); /* number of variables in the analysis */ setin &rawdata; read ALL VAR &vars into XT; X = XT`; /*print x;*/ PDF_&&group&ii = j(NCOL(X), 1, 0); DO i = 1 to NCOL(X); PDF_&&group&ii[i, ] = (1 / 6.28318531**(p/2)*dS**.5)* (exp(-1*(X[,i] - mean)` * INV(PCOV) * (X[,i] - mean) )/2); END; /*print PDF_&group;*/ CREATE work.pdf_&&group&ii FROM PDF_&&group&ii[colname = "PDF_&&group&ii"]; APPEND from PDF_&&groupⅈ quit; %end; data scoredRaw; merge &rawData %do ii = 1 %to &sqlobs; work.pdf_&&group&ii %end; ; array class(*) $ c s v ("C" "S" "V"); array pdf_(*) pdf:; array color(99) $ ("RED " "GREEN " "BLUE " "ORANGE " "PURPLE "); decision=""; do i = 1 to dim(class); if pdf_(i) = max(of pdf:) then do; decision=class(i); dcolor=color(i); end; end; probmax=max(of pdf:); drop c s v i; run; proc print data=scoredRaw(firstobs=77 obs=95); run; %mend pdf; proc print data=sasuser.iris (obs=25); run; proc princomp data = sasuser.iris out = irispc n = 2; var pl pw sl sw; run; proc discrim data = sasuser.iris out = irisscores outstat = irisstat(where=((_type_='MEAN' and variety ne ' ') or (_type_='PCOV'))) ; class variety; priors prop; var pl pw sl sw; run; proc print data = irisstat(obs = 25); run; %pdf(irispc, irisstat, variety, {PL PW SL SW}); ods html; goptions dev = activex; proc g3d data=scoredraw ; scatter prin1*prin2=probmax / noneedle shape="balloon" color=dcolor; run; ods html close; title;