2008年3月4日 星期二

Discriminant Analysis Using Quadratic Discriminant Function


In SPSS, there is no subroutine for Quadratic Discriminant Analysis, I write this macro to compute quadratic score and posterior probability. If you have any problem, please let me know.

SET MXLOOP =99999.
MATRIX.
GET DATA/VARIABLES=X1 to Xp/MISSING=OMIT.
GET Group/VARIABLES=Y/MISSING=OMIT.
COMPUTE GMAX=CMAX(Group).
COMPUTE GMIN=CMIN(Group).
COMPUTE NR=NROW(DATA).
COMPUTE NC=NCOL(DATA).
COMPUTE RN=MAKE(GMAX-GMIN+1,1,1).
COMPUTE SSIGMA=MAKE(NC*(GMAX-GMIN+1),NC,0).
COMPUTE PI=4*ARTAN(1).
COMPUTE QDA=MAKE(NR, (GMAX-GMIN)+1,-999).
COMPUTE QDAPOST=MAKE(NR, 2*(GMAX-GMIN)+2,-999).
COMPUTE TEMP2=0.
LOOP I=GMIN TO GMAX.
COMPUTE TEMP1=0.
LOOP J=1 TO NR.
DO IF (Group(J)=I).
COMPUTE TEMP1=TEMP1+1.
END IF.
END LOOP.
COMPUTE TEMPDATA=MAKE(TEMP1,NC,999).
LOOP K=1 TO TEMP1.
COMPUTE TEMPDATA(K,:)=DATA(K+TEMP2,:).
END LOOP.
COMPUTE PG=NROW(TEMPDATA)/NR.
COMPUTE TEMP2=TEMP1+TEMP2.
COMPUTE MEAN=T(CSUM(TEMPDATA)/NROW(TEMPDATA)).
COMPUTE SIGMA=(SSCP(TEMPDATA)-NROW(TEMPDATA)*MEAN*T(MEAN))/(NROW(TEMPDATA)-1).
PRINT SIGMA.
LOOP U=1 TO NC.
COMPUTE SSIGMA(4*(I-1)+U,:)=SIGMA(U,:).
END LOOP.
LOOP V=1 TO NR.
COMPUTE XX=T(DATA(V,:)).
COMPUTE QD=TEMP1/NR*(2*PI)&**(-1*NC/2)*DET(SIGMA)&**(-0.5)*EXP(-0.5*T(XX-MEAN)*INV(SIGMA)*(XX-MEAN)).
COMPUTE QDA(V,I)=LN(QD)+(NC/2)*LN(2*PI).
COMPUTE QDAPOST(V,I)=LN(QD)+(NC/2)*LN(2*PI).
END LOOP.
END LOOP.
LOOP W= 1 TO NC.
LOOP X=1 TO NR.
COMPUTE QDAPOST(X,GMAX-GMIN+1+W)=QDA(X,W)/RSUM(QDA(X,:)).
END LOOP.
END LOOP.
LOOP X=1 TO NR.
LOOP GPRED= 1 TO GMAX-GMIN+1.
DO IF (QDAPOST(X,GPRED)= RMAX(QDA(X,:))).
COMPUTE QDAPOST(X,2*(GMAX-GMIN)+3)=GPRED.
END IF.
END LOOP.
END LOOP.
PRINT QDAPOST.
END MATRIX.


沒有留言: