proc format; value specname 1='Setosa ' 2='Versicolor' 3='Virginica '; run; data iris; title 'Discriminant Analysis of Fisher (1936) Iris Data'; input SepalLength SepalWidth PetalLength PetalWidth Species @@; format Species specname.; label SepalLength='Sepal Length in mm.' SepalWidth ='Sepal Width in mm.' PetalLength='Petal Length in mm.' PetalWidth ='Petal Width in mm.'; symbol = put(Species, specname10.); datalines; 50 33 14 02 1 64 28 56 22 3 65 28 46 15 2 67 31 56 24 3 63 28 51 15 3 46 34 14 03 1 69 31 51 23 3 62 22 45 15 2 59 32 48 18 2 46 36 10 02 1 61 30 46 14 2 60 27 51 16 2 65 30 52 20 3 56 25 39 11 2 65 30 55 18 3 58 27 51 19 3 68 32 59 23 3 51 33 17 05 1 57 28 45 13 2 62 34 54 23 3 77 38 67 22 3 63 33 47 16 2 67 33 57 25 3 76 30 66 21 3 49 25 45 17 3 55 35 13 02 1 67 30 52 23 3 70 32 47 14 2 64 32 45 15 2 61 28 40 13 2 48 31 16 02 1 59 30 51 18 3 55 24 38 11 2 63 25 50 19 3 64 32 53 23 3 52 34 14 02 1 49 36 14 01 1 54 30 45 15 2 79 38 64 20 3 44 32 13 02 1 67 33 57 21 3 50 35 16 06 1 58 26 40 12 2 44 30 13 02 1 77 28 67 20 3 63 27 49 18 3 47 32 16 02 1 55 26 44 12 2 50 23 33 10 2 72 32 60 18 3 48 30 14 03 1 51 38 16 02 1 61 30 49 18 3 48 34 19 02 1 50 30 16 02 1 50 32 12 02 1 61 26 56 14 3 64 28 56 21 3 43 30 11 01 1 58 40 12 02 1 51 38 19 04 1 67 31 44 14 2 62 28 48 18 3 49 30 14 02 1 51 35 14 02 1 56 30 45 15 2 58 27 41 10 2 50 34 16 04 1 46 32 14 02 1 60 29 45 15 2 57 26 35 10 2 57 44 15 04 1 50 36 14 02 1 77 30 61 23 3 63 34 56 24 3 58 27 51 19 3 57 29 42 13 2 72 30 58 16 3 54 34 15 04 1 52 41 15 01 1 71 30 59 21 3 64 31 55 18 3 60 30 48 18 3 63 29 56 18 3 49 24 33 10 2 56 27 42 13 2 57 30 42 12 2 55 42 14 02 1 49 31 15 02 1 77 26 69 23 3 60 22 50 15 3 54 39 17 04 1 66 29 46 13 2 52 27 39 14 2 60 34 45 16 2 50 34 15 02 1 44 29 14 02 1 50 20 35 10 2 55 24 37 10 2 58 27 39 12 2 47 32 13 02 1 46 31 15 02 1 69 32 57 23 3 62 29 43 13 2 74 28 61 19 3 59 30 42 15 2 51 34 15 02 1 50 35 13 03 1 56 28 49 20 3 60 22 40 10 2 73 29 63 18 3 67 25 58 18 3 49 31 15 01 1 67 31 47 15 2 63 23 44 13 2 54 37 15 02 1 56 30 41 13 2 63 25 49 15 2 61 28 47 12 2 64 29 43 13 2 51 25 30 11 2 57 28 41 13 2 65 30 58 22 3 69 31 54 21 3 54 39 13 04 1 51 35 14 03 1 72 36 61 25 3 65 32 51 20 3 61 29 47 14 2 56 29 36 13 2 69 31 49 15 2 64 27 53 19 3 68 30 55 21 3 55 25 40 13 2 48 34 16 02 1 48 30 14 01 1 45 23 13 03 1 57 25 50 20 3 57 38 17 03 1 51 38 15 03 1 55 23 40 13 2 66 30 44 14 2 68 28 48 14 2 54 34 17 02 1 51 37 15 04 1 52 35 15 02 1 58 28 51 24 3 67 30 50 17 2 63 33 60 25 3 53 37 15 02 1 ; proc plot data=iris; plot petalwid*petallen=species / vpos=17 vaxis=-4 to 28 by 2 haxis=0 to 75 by 5; format species specchar.; run; /*------------------------------------------- Analyse discriminante univariée --------------------------------------------- */ data plotdata; do petalwid=-4 to 28 by 2; do petallen=0 to 75; output; end; end; run; %macro plot; data plotd; set plotd; if setosa<.002 then setosa=.; if versicolor<.002 then versicolor=.; if virginica <.002 then virginica=.; label PetalWidth='Petal Width in mm.'; run; symbol1 i=join v=none c=red l=1 /*l=21*/; symbol2 i=join v=none c=yellow l=1 /*l= 1*/; symbol3 i=join v=none c=blue l=1 /*l= 2*/; legend1 label=none frame; axis1 label=(angle=90 'Density') order=(0 to .6 by .1); proc gplot data=plotd; plot setosa*PetalWidth versicolor*PetalWidth virginica*PetalWidth / overlay vaxis=axis1 legend=legend1 frame cframe=ligr; title3 'Plot of Estimated Densities'; run; data plotp; set plotp; if setosa<.01 then setosa=.; if versicolor<.01 then versicolor=.; if virginica<.01 then virginica=.; label PetalWidth='Petal Width in mm.'; run; axis1 label=(angle=90 'Posterior Probability') order=(0 to 1 by .2); proc gplot data=plotp; plot setosa*PetalWidth versicolor*PetalWidth virginica*PetalWidth / overlay vaxis=axis1 legend=legend1 frame cframe=ligr; title3 'Plot of Posterior Probabilities'; run; %mend; /*------------------------------------------- Analyse discriminante bivariée --------------------------------------------- */ data plotdata; do PetalLength=-2 to 72 by 0.25; h + 1; * Number of horizontal cells; do PetalWidth=-5 to 32 by 0.25; n + 1; * Total number of cells; output; end; end; * Make variables to contain H and V grid sizes; call symput('hnobs', compress(put(h , best12.))); call symput('vnobs', compress(put(n / h, best12.))); drop n h; run; %macro contour; data contour(keep=PetalWidth PetalLength symbol density); set plotd(in=d) iris; if d then density = max(setosa,versicolor,virginica); run; title3 'Plot of Estimated Densities'; %plotit(data=contour, plotvars=PetalWidth PetalLength, labelvar=_blank_, symvar=symbol, typevar=symbol, symlen=4, exttypes=symbol contour, ls=100, paint=density white black, rgbtypes=contour, hnobs=&hnobs, vnobs=&vnobs, excolors=white, rgbround=-16 1 1 1, extend=close, options=noclip, types =Setosa Versicolor Virginica '', symtype=symbol symbol symbol contour, symsize=0.6 0.6 0.6 1, symfont=swiss swiss swiss solid) data posterior(keep=PetalWidth PetalLength symbol prob _into_); set plotp(in=d) iris; if d then prob = max(setosa,versicolor,virginica); run; title3 'Plot of Posterior Probabilities ' '(Black to White is Low to High Probability)'; %plotit(data=posterior, plotvars=PetalWidth PetalLength, labelvar=_blank_, symvar=symbol, typevar=symbol, symlen=4, exttypes=symbol contour, ls=100, paint=prob black white 0.3 0.999, rgbtypes=contour, hnobs=&hnobs, vnobs=&vnobs, excolors=white, rgbround=-16 1 1 1, extend=close, options=noclip, types =Setosa Versicolor Virginica '', symtype=symbol symbol symbol contour, symsize=0.6 0.6 0.6 1, symfont=swiss swiss swiss solid) title3 'Plot of Classification Results'; %plotit(data=posterior, plotvars=PetalWidth PetalLength, labelvar=_blank_, symvar=symbol, typevar=symbol, symlen=4, exttypes=symbol contour, ls=100, paint=_into_ CXCCCCCC CXDDDDDD white, rgbtypes=contour, hnobs=&hnobs, vnobs=&vnobs, excolors=white, extend=close, options=noclip, types =Setosa Versicolor Virginica '', symtype=symbol symbol symbol contour, symsize=0.6 0.6 0.6 1, symfont=swiss swiss swiss solid) %mend;