R语言中的多元统计之判别分析报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

前言

判别分析(discriminant analysis)是多元统计分析中较为成熟的一种分类方法,它的核心思想是“分类与判断”,即根据已知类别的样本所提供的信息,总结出分类的规律性,并建立好判别公式和判别准则,在此基础上,新的样本点将按照此准则判断其所属类型。例如,根据一年甚至更长时间的每天的湿度差及压差,我们可以建立一个用于判别是否会下雨的模型,当我们获取到某一天(建立模型以外的数据)的湿度差及压差后,使用已建立好的模型,就可以得出这一天是否会下雨的判断。

根据判别的组数来区分,判别分析可以分为两组判别和多组判别。接下来,我们将学习三种常见的判别分析方法,分别是:

•距离判别

•Bayes判别

•Fisher判别

一、距离判别基本理论

假设存在两个总体和,另有为一个维的样本值,计算得到该样本到两个总体的距离和,如果大于,则认

为样本属于总体,反之样本则属于总体;若等于,则该样本待判。这就是距离判别法的基本思想。

在距离判别法中,最核心的问题在于距离的计算,一般情况下我们最常用的是欧式距离,但由于该方法在计算多个总体之间的距离时并不考虑方差的影响,而马氏距离不受指标量纲及指标间相关性的影响,弥补了欧式距离在这方面的缺点,其计算公式如下:

,为总体之间的协方差矩阵

二、距离判别的R实现(训练样本)

首先我们导入数据

# 读取SAS数据

> library(sas7bdat)

> data1 <- read.sas7bdat('disl01.sas7bdat')

# 截取所需列数据,用于计算马氏距离

> testdata <- data1[2:5]

> head(testdata,3)

X1 X2 X3 X4

1 -0.45 -0.41 1.09 0.45

2 -0.56 -0.31 1.51 0.16

3 0.06 0.02 1.01 0.40

# 计算列均值

> colM <- colMeans(testdata)

> colM

X1 X2 X3 X4 0.096304348 -0.006956522 2.033478261 0.431739130 # 计算矩阵的协方差

> cov_test <- cov(testdata)

> cov_test

X1 X2 X3 X4 X1 0.068183816 0.027767053 0.14996870 -0.002566763 X2 0.027767053 0.015363865 0.05878251 0.001252367

X3 0.149968696 0.058782512 1.01309874 0.028607150

X4 -0.002566763 0.001252367 0.02860715 0.033912464

# 样本的马氏距离计算

> distance <- mahalanobis(testdata,colM,cov_test)

> head(distance,5)

[1] 12.726465 11.224681 1.692702 1.347885 2.369820

这样,我们得到了距离判别中最关键的马氏距离值,在此基础上就可

以进行进一步的判别分析了。不过我们介绍一个R的第三方包WMDB,该包的wmd()函数可以简化我们的距离判别过程,函数将输出样本的

分类判别结果、错判的样本信息以及判别分析的准确度。

> library(WMDB)

> head(data1,3)

A X1 X2 X3 X4

1 1 -0.45 -0.41 1.09 0.45

2 1 -0.56 -0.31 1.51 0.16

3 1 0.06 0.02 1.01 0.40

# 提取原始数据集的A列生成样品的已知类别

> testdata_group <- data1$A

# 转换为因子变量,用于wmd()函数中

> testdata_group <- as.factor(testdata_group)

> wmd(testdata,testdata_group)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

blong 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 1 1 1 2 1 1 1 1 2 2 2

28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46

blong 2 2 2 2 2 2 1 2 2 2 1 1 1 1 1 2 1 2 2 [1] "num of wrong judgement"

[1] 15 16 20 22 23 24 34 38 39 40 41 42 44

[1] "samples divided to"

[1] 2 2 2 1 1 1 1 1 1 1 1 1 1

[1] "samples actually belongs to"

[1] 1 1 1 2 2 2 2 2 2 2 2 2 2

Levels: 1 2

[1] "percent of right judgement"

[1] 0.7173913

由分析结果可知,根据已知分类的训练样品建立的判别规则,重新应用于训练样品后,出现了13个错判样品,拥有71.7%的准确度。

三、距离判别的R实现(测试样本)

接着,当我们获取到未分类的新样本数据时,使用wmd()函数,在训练样本的基础上进行这些数据的距离判别

# 导入数据,一共10个样本

> data2 <- read.sas7bdat('disldp01.sas7bdat')

# 截取所需列数据

> newtestdata <- data2[1:4]

# 进行判别分析

> wmd(testdata,testdata_group,TstX = newtestdata)

1 2 3 4 5 6 7 8 9 10

blong 1 1 1 1 1 1 2 2 2 1

相关文档
最新文档