判别分析的方法有参数方法和非参数方法。参数方法假定每个类的观测来自(多元)正态分布总体,各类的分布的均值(中心)可以不同。非参数方法不要求知道各类所来自总体的分布,它对每一类使用非参数方法估计该类的分布密度,然后据此建立判别规则。 1.DISCRIM过程的语句说明
SAS/STAT的DISCRIM过程可以进行参数判别分析和非参数判别分析,其一般格式如下:
PROC DISCRIM DATA=输入数据集: CLASS 分类变量:
VAR 判别用自变量集合: RUN;
其中,PROC DISCRIM语句的选项中\"输入数据集\"为训练数据的数据集,包括一个分类变量(在CLASS语句中说明)和用来建立判别公式的自变量集合(在VAR语句中说明)。可以用\"TESTDATA=数据集\"选项指定一个检验数据集,检验数据集必须包含与训练数据集相同的自变量集合,用训练数据集产生判别规则后将对检验数据集中的每一个观测给出分类值,如果这个检验数据集中有表示真实分类的变量可以在过程中用\"TESTCLASS分类变量\"语句指定,这样可以检验判别的效果如何。
用\"OUTSTAT=数据集\"指定输出判别函数的数据集,后面可以再次用DISCRIM过程把这样输出的判别函数作为输入数据集(DATA=)读入并用它来判别检验数据(TESTDATA=)。用\"OUT=数据集\"指定存放训练样本及后验概率、交叉确认分类的数据集。用\"OUTD=数据集\"指定存放训练样本及分组的密度估计的数掘集。用\"TESTOUT=数据集\"指定存放检验数据的后验概率及分类结果的数据集。用\"TESTOUTD=数据集\"输出检验数据及分组密度估计。
PROC DISCRIM语句还有一些指定判别分析方法的选项。METHOD=NORMAL或NPAR选择参数方法或非参数方法。用POOL=NO或TEST或YES表示不用合并协方差阵、通过检验决定是否使用合并协方差阵、用合并协方差阵。如果使用非参数方法,需要指定\"R=核估计半径\"选项来规定核估计方法或者指定\"k=最近邻个数\"来规定最近邻估计方法。
PROC DISCRIM语句有一些规定显示结果的选项。用LISTERR显示训练样本错判的观测。用CROSLISTERR显示用交叉核实方法对训练样本判别错判的观测。用LIST对每一观测显示结果。用NOCLASSIFY取消对训练样本的分类检验。用CROSSLIST显示对训练样本的交叉核实的判别结果。用CROSSVALIDATE要求进行交叉核实。当有用\"TESTDATA=\"指定的检验数据集时用TESTLIST选项显示检验数据集的检验结果,当有TESTCLASS语句时用TESTLISTERR可以列出检验样本判错
的观测,用POSTERR选项可以打印基于分类结果的分类准则的后验概率错误率估计。用NOPRINT选项可以取消结果的显示。
在DISCRIM过程中还可以使用PRIORS语句指定先验概率qt的取法。\"PRIORS EQUAL\"指定等先验概率。\"PRIORS PROPORTIONAL\"指定先验概率与各类个数成正比。\"PRIORS概率值表\"可以直接指定各组的先验概率值。
例:用卫星遥感可以分辨作物的种类。CROPS是训练数据集,其中包含了作物的实际种类(CROP)和四种遥感指标变量(XI-X4)。数据集中还把各X1-X4变量值作为一个字符型变量读入来作为行标识xvalues。
data crops;
title '五种作物 ' ;
input crop $ 1-10 x1-x4 xvalues $ 11-21; /*xvalues为11-21列*/ cards ;
CORN 16 27 31 33 CORN 15 23 30 30 CORN 16 27 27 26 CORN 18 20 25 23 CORN 15 15 31 32 CORN 15 32 32 15 CORN 12 15 16 73 SOYBEANS 20 23 23 25 SOYBEANS 24 24 25 32 SOYBEANS 21 25 23 24 SOYBEANS 27 45 24 12 SOYBEANS 12 13 15 42 SOYBEANS 22 32 31 43 COTTON 31 32 33 34 COTTON 29 24 26 28 COTTON 34 32 28 45 COTTON 26 25 23 24 COTTON 53 48 75 26 COTTON 34 35 25 78
SUGARBEETS22 23 25 42 SUGARBEETS25 25 24 26 SUGARBEETS34 25 16 52 SUGARBEETS54 23 21 54 SUGARBEETS25 43 32 15 SUGARBEETS26 54 2 54 CLOVER 12 45 32 54 CLOVER 24 58 25 34 CLOVER 87 54 61 21 ; run;
用下列DISCRIM过程可以产生线性判别函数(METHOD=NORMAL规定使用参数方法,POOL=YES选项规定使用合并协方差阵,这样产生的判别函数是线性函数)。用OUTSTAT=选项指定了判别函数的输出数据集为CROPSTAT,这个数据集可以作为后续的DISCRIM过程输入用来判别检验数据集。选项LIST要求列出每个观测的结果,CROSSVALIDATE要求交叉核实。\"PRIORS PROPORTIONAL\"即按各种类出现的比例计算各类的先验概率,ID语句指定列出各观测时以什么变量值作为标识。
proc discrim data=crops outstat=cropstat method=normal pool=yes list crossvalidate; class crop;
priors proportional;/*指定先验概率*/ id xvalues; var x1-x4; run;
部分结果如下:
以上为各组的基本情况,并列出了各组先验概率值。因为指定了\"PRIORS PROPORTIONAL\"所以各组的先验概率按实际数据中各组比例计算。
上面具体列出了各类的线性判别函数的各常数项及系数值。比如,观测了X1-X4后棉花类的线性判别函数
-11.46537+0.02462x1+0.017596x2+0.15880x3+0.18362X4。
上面就是每个观测的判别情况,包括原来为哪一类(From CROP),分入了哪一类(Classified into CROP),属于各类的后验概率值(Posterior Probability of Membership in CROP),有星号的为错判的观测。
现在假设我们有若干遥感数据放在了数据集TEST中,实际是己知作物类型的(在变量CROP中),但是我们假装不知道然后用上面建立的线性判别函数(己保存在CROPSTAT数据集中)对这些遥感数据进行判别,这样可以得到比较客观的判别效果的评价。下面程序中用DATA=指定了判别函数数据集(由上一次的DISCRIM过程产生),用TESTDATA=选项指定了检验数据集名,用TESTOUT=选项指定了检验数据集判别结果的输出数据集,用TESTLIST要求列出检验结果。TESTID语句指定检验数据集的各观测用什么变量的值来标识。
data test;
input crop $ 1-10 x1-x4 xvalues $ 11-21; cards;
corn 16 27 31 33 soybeans 21 25 23 24 cotton 29 24 26 28 sugarbeets54 23 21 54 clover 32 32 62 16 ; run;
proc discrim data=cropstat
testdata=test testout=tout testlist; class crop; testclass crop; testid xvalues; var x1-x4; run;
结果列出了每个观测的判别结果和判入每类的后验概率,因为我们知道真实类,所以结果中有一项是\"From CROP\",如果不知道真实类则只能给出判入的类(Classified into CROPP)
因篇幅问题不能全部显示,请点此查看更多更全内容