1.  Perform a Fisher's dsicriminant analysis on Iris data.
2.
3.  READ DATA,  3 GROUPS (N1=N2=N3=3), 2 VARIABLES
4. FEEDBACK OFF
5Echo on
6DIMENSION 200 COLUMNS
7SKIP 25
8READ IRIS.DAT SEPLENG SEPWIDTH PETLENG PETWIDTH TAG
9SKIP 0
10.
11LET NTOT = SIZE SEPLENG
12LET X = MATRIX DEFINITION SEPLENG NTOT 4
13LET P = MATRIX NUMBER OF COLUMNS X
14LET GROUPID = DISTINCT TAG
15LET NG = SIZE GROUPID
16LOOP FOR K = 1 1 NG
17    LET N(K) = SIZE TAG SUBSET TAG = K
18END OF LOOP
19LOOP FOR K = 1 1 P
20    LET XMGRAND(K) = MEAN X^K
21END OF LOOP
22.
23.  CALCULATE B0 = SUM (I=1,NG) (XBARi - XBARALL)(XBARi-XBARALL)'
24.
25LET JUNK = 0 FOR I = 1 1 P
26LET B0 = DIAGONAL MATRIX JUNK
27.
28LOOP FOR K = 1 1 G
29   LOOP FOR L = 1 1 P
30       LET XMEANI(L) = MEAN X^L  SUBSET TAG = K
31   END OF LOOP
32   LET TEMP = XMEANI - XMGRAND
33   LET XM = MATRIX DEFINITION TEMP P 1
34   LET XMT = MATRIX TRANSPOSE XM
35   LET B0TEMP = MATRIX MULTIPLY XM XMT
36   LET B0 = MATRIX ADDITION B0 B0TEMP
37END OF LOOP
38echo off
39print g
40PRINT " "; PRINT " "; PRINT "B0 MATRIX:"; PRINT B0
41pause
42.
43.  CALCULATE Spooled = (N1-1)S1 + ... + (Ng-1)Sg)/(N1+...+ Ng - g)
44.  W = Spooled WITHOUT THE DENOMINATOR TERM
45LET JUNK2 = 0 FOR I = 1 1 G
46LET W = DIAGONAL MATRIX JUNK2
47LOOP FOR K = 1 1 G
48    LET ROWLAST = SUM N FOR I = 1 1 K
49    LET ATEMP = N(K)
50    LET ROWFIRST = ROWLAST - ATEMP + 1
51    LET XTEMP = MATRIX DEFINITION X ROWLAST P ROWFIRST
52    LET SI = VARIANCE-COVARIANCE MATRIX XTEMP
53    LET ATEMP = ATEMP - 1
54    LET SI = MATRIX MULTIPLICATION SI ATEMP
55    LET W = MATRIX ADDITION W SI
56END OF LOOP
57LET DENOM = 1/(NTOT - NG)
58LET SPOOL = MATRIX MULTIPLY W DENOM
59PRINT " "; PRINT " "; PRINT "POOLED COVARIANCE MATRIX:"; PRINT SPOOL
60LET WINV = MATRIX INVERSE W
61LET WINVB = MATRIX MULTIPLICATION WINV B0
62.
63.  COMPUTE EIGENVALUES AND SORT IN DECREASING ORDER
64.  COMPUTE EIGENVECTORS, ONLY KEEP REAL COMPONENT, SORT
65.
66LET INDX = SEQUENCE 1 1 P
67LET E = MATRIX EIGENVALUES WINVB
68RETAIN E FOR I = 1 1 P
69LET ESORT = SORTC E INDX
70LET REVERSE = SEQUENCE P 1 1
71LET REVERSE = SORTC REVERSE ESORT INDX
72LET EV = MATRIX EIGENVECTORS WINVB
73LET DIAG = 0 FOR I = 1 1 P
74LET EVECT = DIAGONAL MATRIX DIAG
75LOOP FOR K = 1 1 P
76    LET LTAG = INDX(K)
77    LET EVECT^LTAG = EV^K FOR I = 1 1 P
78END OF LOOP
79PRINT " "; PRINT " "; PRINT "EIGENVALUES:"; PRINT ESORT
80.  NORMALIZE L'SpooledL =1
81.  DIST = L'SpooledL, MULTIPLY EIGENVECTOR BY 1/SQRT(DIST)
82LOOP FOR K = 1 1 P
83   LET LTEMP = MATRIX DEFINITION EVECT^K P 1
84   LET LTEMPT = MATRIX TRANSPOSE LTEMP
85   LET MATTMP = MATRIX MULTIPLY LTEMPT SPOOL
86   LET MATTMZ = MATRIX MULTIPLY MATTMP LTEMP
87   LET DIST = MATTMZ1(1)
88   LET FACT = 1/SQRT(DIST)
89   LET EVECT^K = FACT*EVECT^K
90END OF LOOP
91PRINT " "; PRINT " "
92PRINT "COLUMNS ARE THE DISCRIMINANT FUNCTIONS:"; PRINT EVECT
93.  PLOT FIRST 2 DISCRIMINANTS
94LET ZY = 0 FOR I = 1 1 NTOT
95LOOP FOR K = 1 1 P
96    LET FACT = EVECT1(K)
97    LET ZY = ZY + FACT*X^K
98END OF LOOP
99LET ZX = 0 FOR I = 1 1 NTOT
100LOOP FOR K = 1 1 P
101    LET FACT = EVECT2(K)
102    LET ZX = ZX + FACT*X^K
103END OF LOOP
104LOOP FOR K = 1 1 NG
105   LET AY = MEAN ZY SUBSET TAG = K
106   LET AX = MEAN ZX SUBSET TAG = K
107   LET GMEANX(K) = AX
108   LET GMEANY(K) = AY
109END OF LOOP
110PRINT " "; PRINT " "; PRINT "GROUP MEANS:"; PRINT GMEANX GMEANY
111Y1LABEL FIRST DISCRIMINANT
112X1LABEL SECOND DISCRIMINANT
113CHARACTER CIRCLE SQUARE TRIANGLE
114LINE BLANK ALL
115LEGEND 1 CIRC() - SPECIES 1
116LEGEND 2 SQUA() - SPECIES 2
117LEGEND 3 TRIA() - SPECIES 3
118LEGEND FONT DUPLEX
119LEGEND SIZE 1.2
120TITLE PLOT FIRST 2 DISCRIMINANT FUNCTIONS
121PLOT ZY ZX TAG
122.
123FEEDBACK OFF
124