【统计分析数学模型】判别分析(一):距离判别法

在这里插入图片描述


一、判别分析

1. 概述

判别分析(discriminant analysis) 是研究样品所属类别的一种统计分析方法。

判别分析与聚类分析都是研究分类问题,不同的是,在聚类分析中,所有样品事先都不知道属于哪一类,也不知道一共有多少类;而在判别分析中,用于建立判别准则的样品的分类是已知的,判别的目的是根据建立的分类准则判断新的样品的分类。

在机器学习中,聚类分析属于无监督学习(unsupervised learning),判别分析属于有监督学习(supervised learning)。

2. 判别分析的目标

在医学研究和临床实践中,经常需要根据观察资料对所研究的对象进行判别归类。判别分析的目标有两类:

  1. 目标1(预测方面):分类(或分配)
    在已知历史上用某些方法已把研究对象分成若干组(亦称类或总体)的情况下,来判定新的观测样品应归属的组别。
  2. 目标2(描述方面)分离
    就是用图形(通常二维,有时三维或一维,一般通过降维实现)方法或代数方法描述来自各组的样品之间的差异性,最大限度地分离各组。

例如:
判别分类的例子:非溃疡胃病组(胃功能紊乱者)与控制组(“正常”者).
测量变量:焦虑、依赖性、罪恶感、完美主义的量度

3. 分类

根据建立的判别准则的不同,判别分析可分为:

  • 距离判别
  • Fisher判别
  • Bayes判别
  • 机器学习的各种分类算法
  • ……

其中,距离判别和Bayes判别只能用于分类。Fisher判别即可用于分类,也可用于分离,且更多地用于后者。
这些都是基于判别变量为定量变量的。

4. 步骤

  1. 收集训练样本数据(training dataset)和测试样本数据(testing dataset):收集一批分类明确的训练样品和测试样品,根据专业知识测量每个样品的分类指标。
  2. 建立判别准则:根据专业问题的特点和资料的性质选择判别方法,使用训练样本建立判别函数。
  3. 考核判别效果:用回代法和前瞻法考核所建立函数的判别效果。

回代法又叫内部验证,它是将训练样本中每个样品的各项指标回代入所建立的判别函数中得到判定类别,并将此分类与原类别进行比较,计算判断正确率(符合率)。

前瞻法也叫外部验证,它是将所建立的判别准则用于测试样本集,得到测试样本的分类,并与测试样本的原始分类作比较计算正确率。

只有当回判正确率和前瞻正确率都比较高时,才可以认为所建立的判别准则是合适的。前者衡量的是判别模型的拟合优度,后者衡量的是判别模型的预测准确度

二、距离判别法

距离判别法的原理简单而朴素,即根据样品到各类中心点(均值向量)的距离,按距离最近准则进行判别归类。

因为马氏距离不受指标的量纲和指标之间多重相关性的影响,所以在距离判别中最为常用。

三、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.Normal

m.Hyper<-colMeans(thyroid[151:185,2:6])
m.Hyper

m.Hypo<-colMeans(thyroid[186:215,2:6])
m.Hypo

运行结果如下:

> m.Normal
      RT3U         T4         T3        TSH       DTSH 
110.513333   9.192667   1.731333   1.316667   2.516667 

> m.Hyper
      RT3U         T4         T3        TSH       DTSH 
95.2857143 17.7457143  4.2628571  0.9742857 -0.0200000 

> m.Hypo
      RT3U         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 Matrices

data:  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.Normal

v.Hyper<-cov(thyroid[151:185,2:6])
v.Hyper

v.Hypo<-cov(thyroid[186:215,2:6])
v.Hypo

结果如下:

> v.Normal
           RT3U           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.Hyper
            RT3U            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.Hypo
           RT3U          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.matrix
        
type     Normal Hyper Hypo
  Normal    137     0    0
  Hyper       5    35    0
  Hypo        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%。

  • 37
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值