本文主要是介绍【统计分析数学模型】判别分析(一):距离判别法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
【统计分析数学模型】判别分析(一):距离判别法
- 一、判别分析
- 1. 概述
- 2. 判别分析的目标
- 3. 分类
- 4. 步骤
- 二、距离判别法
- 三、R语言实现距离判别法
- 1. 加载数据集
- 2. 计算相关系数矩阵
- 3. 计算中心点
- 4. Box M检验
- 5. 计算协方差矩阵
- 6. 计算马氏距离
- 7. 混淆矩阵
- 8. 判断正确率
一、判别分析
1. 概述
判别分析(discriminant analysis) 是研究样品所属类别的一种统计分析方法。
判别分析与聚类分析都是研究分类问题,不同的是,在聚类分析中,所有样品事先都不知道属于哪一类,也不知道一共有多少类;而在判别分析中,用于建立判别准则的样品的分类是已知的,判别的目的是根据建立的分类准则判断新的样品的分类。
在机器学习中,聚类分析属于无监督学习(unsupervised learning),判别分析属于有监督学习(supervised learning)。
2. 判别分析的目标
在医学研究和临床实践中,经常需要根据观察资料对所研究的对象进行判别归类。判别分析的目标有两类:
- 目标1(预测方面):分类(或分配)
在已知历史上用某些方法已把研究对象分成若干组(亦称类或总体)的情况下,来判定新的观测样品应归属的组别。 - 目标2(描述方面):分离
就是用图形(通常二维,有时三维或一维,一般通过降维实现)方法或代数方法描述来自各组的样品之间的差异性,最大限度地分离各组。
例如:
判别分类的例子:非溃疡胃病组(胃功能紊乱者)与控制组(“正常”者).
测量变量:焦虑、依赖性、罪恶感、完美主义的量度
3. 分类
根据建立的判别准则的不同,判别分析可分为:
- 距离判别
- Fisher判别
- Bayes判别
- 机器学习的各种分类算法
- ……
其中,距离判别和Bayes判别只能用于分类。Fisher判别即可用于分类,也可用于分离,且更多地用于后者。
这些都是基于判别变量为定量变量的。
4. 步骤
- 收集训练样本数据(training dataset)和测试样本数据(testing dataset):收集一批分类明确的训练样品和测试样品,根据专业知识测量每个样品的分类指标。
- 建立判别准则:根据专业问题的特点和资料的性质选择判别方法,使用训练样本建立判别函数。
- 考核判别效果:用回代法和前瞻法考核所建立函数的判别效果。
回代法又叫内部验证,它是将训练样本中每个样品的各项指标回代入所建立的判别函数中得到判定类别,并将此分类与原类别进行比较,计算判断正确率(符合率)。
前瞻法也叫外部验证,它是将所建立的判别准则用于测试样本集,得到测试样本的分类,并与测试样本的原始分类作比较计算正确率。
只有当回判正确率和前瞻正确率都比较高时,才可以认为所建立的判别准则是合适的。前者衡量的是判别模型的拟合优度,后者衡量的是判别模型的预测准确度。
二、距离判别法
距离判别法的原理简单而朴素,即根据样品到各类中心点(均值向量)的距离,按距离最近准则进行判别归类。
因为马氏距离不受指标的量纲和指标之间多重相关性的影响,所以在距离判别中最为常用。
三、R语言实现距离判别法
以mclust包里的数据集thyroid为例说明距离判别法的原理和应用。
1. 加载数据集
将其中的分类变量Diagnosis的3个水平重新按照在数据集里出现的顺序排序。
data(thyroid,package="mclust")
thyroid$Diagnosis<-factor(thyroid$Diagnosis, levels=c("Normal","Hyper","Hypo"))
2. 计算相关系数矩阵
通过相关系数矩阵探索5项检测指标之间的相关性:
cor(thyroid[,2:6])
运行结果如下:
> cor(thyroid[,2:6])RT3U T4 T3 TSH DTSH
RT3U 1.0000000 -0.4941624 -0.5369712 0.2903679 0.2963267
T4 -0.4941624 1.0000000 0.7186816 -0.4228445 -0.4099646
T3 -0.5369712 0.7186816 1.0000000 -0.2416412 -0.2273919
TSH 0.2903679 -0.4228445 -0.2416412 1.0000000 0.4975449
DTSH 0.2963267 -0.4099646 -0.2273919 0.4975449 1.0000000
5项检测指标之间存在较强的相关关系。
因此,需要用马氏距离计算各对象之间的距离。
3. 计算中心点
分别计算3组患者的5项检测指标的均值,作为各个类别的中心点:
m.Normal<-colMeans(thyroid[1:150,2:6])
m.Normalm.Hyper<-colMeans(thyroid[151:185,2:6])
m.Hyperm.Hypo<-colMeans(thyroid[186:215,2:6])
m.Hypo
运行结果如下:
> m.NormalRT3U T4 T3 TSH DTSH
110.513333 9.192667 1.731333 1.316667 2.516667 > m.HyperRT3U T4 T3 TSH DTSH
95.2857143 17.7457143 4.2628571 0.9742857 -0.0200000 > m.HypoRT3U T4 T3 TSH DTSH
121.700000 3.600000 1.063333 12.920000 17.533333
4. Box M检验
biotools包里的 boxM() 函数可以实现 Box M检验:
Box M检验要求变量服从多元正态分布,其零假设是各协方差矩阵相等。如果该检验结果不显著,则认为各类总体的协方差矩阵相同,此时可以用所有对象计算的协方差矩阵作为总体协方差矩阵的估计值。
library(biotools)
boxM(thyroid[,-1],thyroid[,1])
运行结果如下:
> boxM(thyroid[,-1],thyroid[,1])Box's M-test for Homogeneity of Covariance Matricesdata: thyroid[, -1]
Chi-Sq (approx.) = 1512.6, df = 30, p-value < 2.2e-16
检验结果表明,3组患者的5项检测指标协方差矩阵之间的差异有统计学意义(P <0.001)。因此,分别计算3组的协方差矩阵。
5. 计算协方差矩阵
v.Normal<-cov(thyroid[1:150,2:6])
v.Normalv.Hyper<-cov(thyroid[151:185,2:6])
v.Hyperv.Hypo<-cov(thyroid[186:215,2:6])
v.Hypo
结果如下:
> v.NormalRT3U T4 T3 TSH DTSH
RT3U 65.6072036 4.843387025 1.138841163 -0.186465324 3.06252796
T4 4.8433870 4.198804922 0.252781655 -0.009340045 -0.62256152
T3 1.1388412 0.252781655 0.225924385 0.002158837 0.06262864
TSH -0.1864653 -0.009340045 0.002158837 0.247572707 0.08227069
DTSH 3.0625280 -0.622561521 0.062628635 0.082270694 3.90247204> v.HyperRT3U T4 T3 TSH DTSH
RT3U 352.0336134 -2.157815e+01 -22.72731092 -0.79537815 1.4205882353
T4 -21.5781513 1.731314e+01 4.21174790 0.32709244 0.0009411765
T3 -22.7273109 4.211748e+00 5.08122689 0.07401681 -0.0284117647
TSH -0.7953782 3.270924e-01 0.07401681 0.16020168 -0.0252352941
DTSH 1.4205882 9.411765e-04 -0.02841176 -0.02523529 0.0728235294 > v.HypoRT3U T4 T3 TSH DTSH
RT3U 122.286207 -7.0137931 -1.0596552 23.006207 -17.262069
T4 -7.013793 3.0848276 0.5755172 -12.250000 9.207241
T3 -1.059655 0.5755172 0.3086092 -2.823034 2.593333
TSH 23.006207 -12.2500000 -2.8230345 153.447862 19.091034
DTSH -17.262069 9.2072414 2.5933333 19.091034 240.445057
6. 计算马氏距离
用函数mahalanobis()计算每个对象与3组患者中心点的距离。例如,计算第1个对象与3组患者中心点的马氏距离:
mahalanobis(thyroid[1,2:6],m.Normal,v.Normal)
mahalanobis(thyroid[1,2:6],m.Hyper,v.Hyper)
mahalanobis(thyroid[1,2:6],m.Hypo,v.Hypo)
运行结果:
> mahalanobis(thyroid[1,2:6],m.Normal,v.Normal)1
2.601487
>
> mahalanobis(thyroid[1,2:6],m.Hyper,v.Hyper)1
122.2996
>
> mahalanobis(thyroid[1,2:6],m.Hypo,v.Hypo)1
25.30864
结果表明,第1个对象与甲状腺正常组的中心点距离最近,因此将其判为“Normal”。类似地,我们可以用这种方法对其余所有对象做出判断。
计算所有对象与3个中心点的距离:
d.Normal<-mahalanobis(thyroid[,2:6],m.Normal,v.Normal)
d.Hyper<-mahalanobis(thyroid[,2:6],m.Hyper,v.Hyper)
d.Hypo<-mahalanobis(thyroid[,2:6],m.Hypo,v.Hypo)
d<-data.frame(d.Normal,d.Hyper,d.Hypo)
head(d)
> head(d)d.Normal d.Hyper d.Hypo
1 2.601487 122.299578 25.308641
2 12.722546 599.864349 30.202970
3 7.619211 10.949499 60.943138
4 4.747232 54.121522 4.266343
5 3.300288 9.766824 10.065090
6 8.572603 826.207585 7.183526
将3个向量放入一个数据框中,找出数据框d的每一行中哪一个最小:
index<-apply(d,MARGIN=1,FUN=which.min)
index
type<-factor(index,labels=c("Normal","Hyper","Hypo"))
type
> index[1] 1 1 1 3 1 3 1 1 1 1 3 1 1 3 1 1 1 1 1 1 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1[38] 1 1 1 1 1 1 1 1 1 1 1 2 3 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1[75] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1
[112] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1
[149] 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[186] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3> type[1] Normal Normal Normal Hypo Normal Hypo Normal Normal Normal Normal[11] Hypo Normal Normal Hypo Normal Normal Normal Normal Normal Normal[21] Normal Hyper Hyper Normal Normal Normal Normal Normal Normal Normal[31] Normal Normal Normal Normal Normal Normal Normal Normal Normal Normal[41] Normal Normal Normal Normal Normal Normal Normal Normal Hyper Hypo [51] Hyper Normal Normal Normal Normal Normal Normal Normal Normal Normal[61] Normal Normal Normal Normal Normal Normal Normal Normal Normal Normal[71] Normal Normal Normal Normal Normal Normal Normal Normal Normal Normal[81] Normal Normal Normal Normal Normal Normal Normal Normal Normal Normal[91] Normal Hypo Normal Normal Normal Normal Normal Normal Normal Normal
[101] Normal Normal Normal Hypo Normal Normal Normal Normal Normal Normal
[111] Normal Normal Normal Normal Normal Normal Normal Normal Normal Normal
[121] Normal Normal Normal Normal Normal Normal Normal Normal Normal Normal
[131] Normal Hyper Normal Normal Normal Normal Normal Normal Normal Normal
[141] Hypo Normal Normal Normal Normal Normal Normal Normal Normal Normal
[151] Hyper Hyper Hyper Hyper Hyper Hyper Hyper Hyper Hyper Hyper
[161] Hyper Hyper Hyper Hyper Hyper Hyper Hyper Hyper Hyper Hyper
[171] Hyper Hyper Hyper Hyper Hyper Hyper Hyper Hyper Hyper Hyper
[181] Hyper Hyper Hyper Hyper Hyper Hypo Hypo Hypo Hypo Hypo
[191] Hypo Hypo Hypo Hypo Hypo Hypo Hypo Hypo Hypo Hypo
[201] Hypo Hypo Hypo Hypo Hypo Hypo Hypo Hypo Hypo Hypo
[211] Hypo Hypo Hypo Hypo Hypo
Levels: Normal Hyper Hypo
7. 混淆矩阵
借助判定类别与真实类别构成的列联表查看判别效果,即构建分类结果的混淆矩阵:
confusion.matrix<-table(type,thyroid$Diagnosis)
confusion.matrix
结果如下:
> confusion.matrixtype Normal Hyper HypoNormal 137 0 0Hyper 5 35 0Hypo 8 0 30
结果表明,有5个Normal被错判为Hyper,8个Normal被错判为Hypo。
被错判的对象所处的行号:
which(type=="Hyper"&thyroid$Diagnosis=="Normal")
which(type=="Hypo"&thyroid$Diagnosis=="Normal")
8. 判断正确率
混淆矩阵对角线上的数字代表判断正确的数目,判断正确的总数为(202):
sum(diag(confusion.matrix))
因此,本示例回代法的判断正确率为202/215 ≈ 94%。
这篇关于【统计分析数学模型】判别分析(一):距离判别法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!