专栏首页生物信息云R语言数据分析与挖掘(第八章):判别分析(3)——费歇尔(Fisher)判别分析

R语言数据分析与挖掘(第八章):判别分析(3)——费歇尔(Fisher)判别分析

概述

我们之前介绍了判别分析中,因为判别准则的不同,可分为多种判别分析法。常用的有费歇尔(Fisher)判别分析、贝叶斯(Bayes)判别分析和距离判别分析。在上2篇文章中(判别分析——距离判别法贝叶斯(Bayes)判别分析)介绍了距离判别分析和贝叶斯判别,本文将介绍贝费歇尔(Fisher)判别分析。

Fisher判别,又称典则判别(canonical discriminant),适用于两类和多类判别。我们将结合两类判别的问题,来介绍一下Fisher判别的原理。

已知有A类和B类两类观察对象,A类有a例,B类有b例,分别记录了X1,X2,……Xm个观察指标,我们称这m个观察指标为判别指标或变量。

Fisher判别法就是找到一个线性组合

使得综合指标Z在A类的均数与B类的均数的差异尽可能大,而两类的类内综合指标的变异(S2A+S2B)尽可能小,也就是类间差异尽可能大,类内变异尽可能小,即使

达到最大,此时综合指标的公式便称为Fisher判别函数,C1,C2,……,Cm即为判别系数。

建立判别函数后,我们逐例计算出综合指标Zi,求得A类的均数、B类的均数及总均数,按照下式计算判别界值:

如果A类均值大于B类的话,最终的判别规则如下:

?收集22例肝硬化患者的3个指标(腹水量X1,肝长径X2,肝短径X3)中心化、标准化后的资料,其中早期患者A类12例,晚期患者B类10例,如果让我们做Fisher判别:

Step1找到一个类间差异尽可能大,类内变异尽可能小判别函数,各系数通过合并协方差阵代入解方程可得,即Z=-0.070X1+0.225X2-0.318X3;

Step2 逐例计算综合指标Zi,计算出A类、B类的均数和总均数分别为1.428,-1.722,-0.004;

Step3 确定界值,进行两类判别Zc=(1.428+1.722)/2=-0.147,那么-0.147即为界值,Z值高于-0.147即判别为A类,低于则判别为B类。

Step4 判别效果评价,一般要求判别函数的误判概率小于0.1或0.2才有应用价值。本例有4例错判,那么误判概率为4/22=18.2%。

表 22例患者3项指标观察结果

函数介绍

在R语言中,用与进行Fisher判别的最常用函数为lda(),该函数在包MASS中,有2种调用方式。

公式形式:

lda(formula, data, ..., subset, na.action)

Formula:指定用于Fisher判别的公示对象;

Data:指定用于Fisher判别的数据对象,一般为数据框,且优先采用公式中指定的变量数据;

Subset:指定可选向量,表示选择的样本子集;

Na.action:一个函数,指定缺失数据的处理方法,若为NULL,则使用函数

na.omit()删除缺失数据。

矩阵形式:

lda(x, grouping, prior = proportions, tol = 1.0e-4,
    method, CV = FALSE, nu, ...)

数据框形式:

lda(x, grouping, ..., subset, na.action)

参数介绍:

X:指定用于Fisher判别的数据对象,可以为矩阵、数据框和包含解释变量的矩阵;

Grouping:因子向量,用于指定样本属于哪一类;

Subset:指定可选向量,表示选择的样本子集;

Na.action:一个函数,指定缺失数据的处理方法,若为NULL,则使用函数na. omit()删除缺失数据;

Prior:指定各个类别的先验概率,默认值为已有训练样本的计算结果;

tol:控制精度,用于判断矩阵是否奇异;

Method:字符串,用于指定估计方法,“mle”表示极大似然估计,“mve”表示使用cov. mve进行估计,“t”表示基于t分布的稳健估计;

CV:逻辑值,若为TRUE,则表示返回值中将包括舍一法的交叉验证结果;

Nu;当参数method设定为“t”时,此处需要设定t分布的自由度。

函数lda()的返回值包括:调用方式、先验慨率、每一类样本的均值和线性判别系数( Fisher判别属于线性判别)。此外,还可以利用函数predict()输出Fisher判别的结果。

案例:基于Fisher 判别的iris 数据集分类

下面以iris数据集进行操作演练,首先对数据集中的分类变量进行数据转换,将莺尾花的三个类别分别用1,2,3替代:

> library(MASS)
> data(iris)
> diris<- data.frame(rbind(iris3[,,1], iris3[,,2], iris3[,,3]),species =rep(c(1,2,3), rep(50,3)))
> head(diris)
  Sepal.Length Petal.Length Petal.Width Species log.slength species
1          5.1          1.4         0.2  setosa    1.629241       1
2          4.9          1.4         0.2  setosa    1.589235       1
3          4.7          1.3         0.2  setosa    1.547563       1
4          4.6          1.5         0.2  setosa    1.526056       1
5          5.0          1.4         0.2  setosa    1.609438       1
6          5.4          1.7         0.4  setosa    1.686399       1

下面提取训练集和测试集,由于函数lda()中要求训练集的样本与测试集的样本量相等,故此处的训练集和测试集均为75,具体操作如下:

> sa<-sample(1:150, 75)
> sa
 [1]  48  46  24   6  32 118  76 131 119   7  64  37  43  70  25 103  27  35
[19] 143 106  72  84  40  79  42  63 129  60  30  93   9 139  85 123  18  58
[37]  57 145  20  95  96   5 133   2  26  75  33  53 147 115  13  89 107 144
[55] 120  50 142 141 122  61 124 126 100 150  17  77 104 132  14  73  82 130
[73]  11  78 110
> table(diris$species[sa])

 1  2  3 
26 23 26 

上面结果显示:测试数据集中莺尾花类别分别为1,2,3的样本量分别为26,23和26,利用函数lda()进行Fisher()判别分析的代码如下:

> z <- lda(species ~ ., diris, prior = c(1,1,1)/3, subset = sa)
> z
Call:
lda(species ~ ., data = diris, prior = c(1, 1, 1)/3, subset = sa)

Prior probabilities of groups:
        1         2         3 
0.3333333 0.3333333 0.3333333 

Group means:
  Sepal.L. Sepal.W. Petal.L.  Petal.W.
1    4.900 3.352174 1.430435 0.2173913
2    6.024 2.800000 4.344000 1.3560000
3    6.600 2.911111 5.607407 2.0333333

Coefficients of linear discriminants:
               LD1        LD2
Sepal.L.  1.357925 -0.2184939
Sepal.W.  1.352581 -1.7520073
Petal.L. -2.580115  1.2345873
Petal.W. -2.928385 -3.1793546

Proportion of trace:
   LD1    LD2 
0.9958 0.0042 
> pre<-predict(z, diris[-sa, ])
> pre$class
 [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2
[37] 3 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3 3
[73] 3 3 3
Levels: 1 2 3
> head(pre$posterior,n=20)
   1            2            3
3  1 2.090293e-22 4.088528e-45
7  1 9.587920e-21 1.818849e-42
9  1 1.669810e-17 1.720576e-38
13 1 9.791804e-22 1.457286e-44
15 1 2.446685e-35 1.190135e-62
16 1 1.892658e-31 1.336548e-56
17 1 9.352663e-29 4.043571e-53
19 1 1.966823e-26 2.742911e-50
21 1 3.093880e-23 2.702536e-46
24 1 3.094668e-17 2.374637e-37
25 1 2.669539e-17 5.117169e-38
26 1 2.024177e-19 3.391083e-41
27 1 1.246972e-19 8.594884e-41
28 1 5.185051e-25 1.245723e-48
29 1 1.561341e-25 2.107706e-49
32 1 3.367160e-23 8.900937e-46
34 1 1.709891e-32 1.436627e-58
37 1 3.808029e-29 2.273465e-54
39 1 2.580772e-19 6.413240e-41
40 1 9.124537e-24 5.889644e-47
> head(pre$x,n=20)
         LD1         LD2
3   8.061759  0.04341695
7   7.645632 -0.47961183
9   6.990596  0.75802603
13  7.961862  0.81336319
15 10.895552 -1.72199091
16  9.941080 -2.66643913
17  9.373435 -1.97180479
19  8.906347 -1.05038186
21  8.250776  0.03390468
24  6.829625 -0.67915279
25  6.919998  0.41191849
26  7.424586  0.69864642
27  7.379941 -0.63802740
28  8.630472 -0.34451473
29  8.753226 -0.29277273
32  8.181122 -0.84888370
34 10.242668 -1.75992672
37  9.553873 -0.65698037
39  7.383865  0.45936658
40  8.359422 -0.14746461
> class<-pre$class
> diris$species[-sa]
 [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2
[37] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
[73] 3 3 3
> sum(class==diris$species[-sa])
[1] 72

上面结果中,Call表示调用方法;Prior probabilities of groups表示先验概率;Group means表示每一类样本的均值;Coefficients of linear discriminants表示线性判别系数;Proportion of trace表示比例值。

然后利用class()函数将判别结果展示出来,该函数输出结果为1个列表,其中class、posterior和x三个子列表,分别表示分类结果,后验概率,由于输出量较大,故后面只展示20行记录。

在测试数据集的75条记录中,72个样本分类正确。

本文分享自微信公众号 - MedBioInfoCloud(MedBioInfoCloud),作者:DoubleHelix

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • R语言数据分析与挖掘(第八章):判别分析(1)——距离判别法

    判别分析是判断个体所属类别的一种多元统计分析方法。它在医学领域有着广泛的应用,主要有疾病诊断、疾病预测和病因学分析。例如,根据病人的症状、生化指标判断病人得的是...

    DoubleHelix
  • R语言数据分析与挖掘(第八章):判别分析(2)——贝叶斯(Bayes)判别分析

    Bayes判别,它是基于Bayes准则的判别方法,判别指标为定量资料,它的判别规则和最大似然判别、Bayes公式判别相似,都是根据概率大小进行判别,要求各类近似...

    DoubleHelix
  • GEO数据库表达谱差异基因分析

    关于GEO数据库表达谱差异基因分析,网上有很多教程,但很多都不系统,几乎千篇一律,而且都是直接使用整理好的矩阵文件来操作的。大家都知道,GEO数据库只负责用户上...

    DoubleHelix
  • 《spss统计分析与行业应用案例详解》聚类分析与判别分析案例研究 实例44层次聚类分析 实例45 判别分析

    又称系统聚类分析,先将每一个样本看作一类,然后逐渐合并,直至合并为一类的一种合并法,层次聚类分析的优点很明显,他可对样本进行聚类,样本可以为连续或是分类变量,还...

    统计学家
  • Multidex记录一:介绍和使用

    为什么要用记录呢,因为我从开始接触Android时我们的项目就在65535的边缘。不久Google就出了multidex的解决方案。我们也已经接入multide...

    静默加载
  • MySQL中专门的关系运算

    条件由常数、属性名或列名、比较操作符(>、<、 = 、≥、≤、≠)及逻辑操 作符(¬ 、∧、∨)组成的条件表达式。

    越陌度阡
  • Extension field添加到CDS view上的技术实现

    Jerry Wang
  • SAP ABAP RFC table administration

    when I change something in R3, check table in CRM:

    Jerry Wang
  • 【译】开始在web中使用CPU计算

    本文是关于我使用实验性的WebGPU API并与有兴趣使用GPU进行数据并行计算的Web开发人员分享我的旅程。

    腾讯IVWEB团队
  • 用数据分析网络暴力有多可怕

    潘老师是在17时发出微博的,但是那时并没有大量的评论出现,那个小时一共有1237条评论。

    数据森麟

扫码关注云+社区

领取腾讯云代金券