R语言中的多元统计之判别分析报告
- 格式:doc
- 大小:146.64 KB
- 文档页数:15
《应用多元统计分析》第四章判别分析实验报告第四章判别分析实验报告实验环境Windows xp、Windows vista、Windows 7等,软件SPSS 11.0版本及以上。
实验结果与分析本题中记变量值CF_TD, NI_TA, CA_CL, CA_NS分别为X1,X2,X3,X4 (1)Fisher判别函数特征值EigenvaluesFunction Eigenvalue% of Variance Cumulative %CanonicalCorrelation1.940a100.0100.0.696a. First 1 canonical discriminant functions were used in the analysis.(2)Fisher判别函数有效性检验Wilks' LambdaTest ofFunction(s)Wilks' Lambda Chi-square df Sig.1.51527.8394.000(3)标准化的Fisher判别函数系数Standardized Canonical Discriminant FunctionCoefficientsFunction1CF_TD.134NI_TA.463CA_CL.715CA_NS-.220所以标准化的判别函数为:Y=0.134X1+0.463X2+0.715X3-0.220X4得出Y=0.9012(4)未标准化的Fisher判别函数系数Canonical Discriminant Function CoefficientsFunction1CF_TD.629NI_TA 4.446CA_CL.889CA_NS-1.184 (Constant)-1.327 Unstandardized coefficients所以为标准化的费希尔判别函数为:Y=-1.327+0.629X1+4.446X2+0.889X3-1.184X4得出Y=-0.1703(5)组重心处的费希尔判别函数值Functions at Group CentroidsG Function11.8692-1.035 Unstandardized canonical discriminant functions evaluated at group means各类重心在空间中的坐标位置。
多元统计分析r代码-2#图2.1马氏距离例rm(list=ls())x=seq(from=-5,to=10,by=0.01)y1=dnorm(x,0,1) #计算密度y2=dnorm(x,4,2) #计算密度plot(x,y1,type="l",xlab="", ylab="",axes=F,xlim=c(-5,10), ylim=c(0,0.4))lines(x,y2,type="l")axis(2)rect(-5.8, 0, 10, 0.4)rect(0, 0, 0, 0.4)rect(1.658, 0, 1.658, 0.1)rect(4, 0, 4, 0.2)text(1.658,-0.01,expression(A),cex=1)text(0,-0.008,expression(0),cex=0.9)text(4,-0.01,expression(4),cex=1)#例2.1x<-c(1,1,3,4,2,0,1,2,3,5); dim(x)<-c(5,2)d<-dist(x)hc1<-hclust(d, "single"); hc2<-hclust(d, "complete")hc3<-hclust(d, "average"); hc4<-hclust(d, "ward")opar <- par(mfrow = c(2, 2))plot(hc1,hang=-1); plot(hc2,hang=-1)plot(hc3,hang=-1); plot(hc4,hang=-1)par(opar)dend1<-as.dendrogram(hc1)opar <- par(mfrow = c(2, 2),mar = c(4,3,1,2))plot(dend1)plot(dend1, nodePar=list(pch = c(1,NA), cex=0.8, lab.cex = 0.8),type = "t", center=TRUE)plot(dend1, edgePar=list(col = 1:2, lty = 2:3), dLeaf=1, edge.root = TRUE)plot(dend1, nodePar=list(pch = 2:1,cex=.4*2:1, col = 2:3), horiz=TRUE)par(opar)#例2.2## 输入相关矩阵.x<- c(1.000, 0.846, 0.805, 0.859, 0.473, 0.398, 0.301, 0.382,0.846, 1.000, 0.881, 0.826, 0.376, 0.326, 0.277, 0.277,0.805, 0.881, 1.000, 0.801, 0.380, 0.319, 0.237, 0.345,0.859, 0.826, 0.801, 1.000, 0.436, 0.329, 0.327, 0.365,0.473, 0.376, 0.380, 0.436, 1.000, 0.762, 0.730, 0.629,0.398, 0.326, 0.319, 0.329, 0.762, 1.000, 0.583, 0.577,0.301, 0.277, 0.237, 0.327, 0.730, 0.583, 1.000, 0.539,0.382, 0.415, 0.345, 0.365, 0.629, 0.577, 0.539, 1.000)names<-c("身高 x1", "手臂长 x2", "上肢长 x3", "下肢长 x4", "体重 x5","颈围 x6", "胸围 x7", "胸宽 x8")r<-matrix(x, nrow=8, dimnames=list(names, names))## 作系统聚类分析,## as.dist()的作用是将普通矩阵转化为聚类分析用的距离结构.d<-as.dist(1-r); hc<-hclust(d); dend<-as.dendrogram(hc)## 写一段小程序, 其目的是在绘图命令中调用它, 使谱系图更好看. nP<-list(col=3:2, cex=c(2.0, 0.75), pch= 21:22,bg= c("light blue", "pink"),lab.cex = 1.0, lab.col = "tomato")addE <- function(n){if(!is.leaf(n)) {attr(n, "edgePar") <- list(p.col="plum")attr(n, "edgetext") <- paste(attr(n,"members"),"members") }n}## 画出谱系图.op<-par(mfrow=c(1,1), mar=c(4,3,0.5,0))de <- dendrapply(dend, addE); plot(de, nodePar= nP)par(op)#分成三类的程序和计算结果plclust(hc, hang=-1); re<-rect.hclust(hc, k=3)#例2.3续例1.2,海南板块的股票数据read.csv("hn-2.csv",header=T)->DAr<-DA[,2:12]/doc/bd16977641.html,s<-DA[,1]X<-data.frame(r, /doc/bd16977641.html,s)HN<-dist(scale(r))hc1<-hclust(HN, "complete")hc2<-hclust(HN, "average")hc3<-hclust(HN, "centroid")hc4<-hclust(HN, "ward")opar<-par(mfrow=c(2,2), mar=c(5.2,4,0,0),cex=0.8) plclust(hc1,hang=-1)re1<-rect.hclust(hc1,k=5,border="red")plclust(hc2,hang=-1)re2<-rect.hclust(hc2,k=5,border="red")plclust(hc3,hang=-1)re3<-rect.hclust(hc3,k=5,border="red")plclust(hc4,hang=-1)re4<-rect.hclust(hc4,k=5,border="red")par(opar)#例2.4动态聚类km <- kmeans(HN, 5, nstart = 20); kmsort(km$cluster)。
《多元统计实验》判别分析实验报告cbind(类别,newG,Z$post,Z$x)#合并原分类、回判分类回判后验概率及判别tab=table(类别,newG)#原分类和新分类列表比较tabsum(diag(prop.table(tab)))prenew=predict(ld,newdata=newdata)prenew#对三个待判样本进行判定cbind(prenew$class,prenew$post,prenew$x)#也可以按列合并在一起看二、实验结果分析5.5进行Fisher判别分析.若一位新客户的8个指标分别为(2 500, 1 500, 0,3, 2,3, 4, 1),试对该客户的信用度进行评价.以上输出结果中包括了lad()所用的公式、先验概率1、2、3、4、5 为:0.2941176 、0.1176471 、0.1764706 0.1764706 、0.2352941,各组均值向量、线性判别函数的系数。
输出所有分类组由输出结果可知第十二号样品为第四组的被误判给了第五组,且与距离判别法结果一致,最后对新客户的8个指标(2500,1500,0,3,2,3,4,1)进行判定。
说明:由$class可以看出该新用户被判入第一组,结果与距离判别法一致,对应的后验概率决定该新用户的归类组。
因此该新用户的信用度评价为一。
5.6试对表5-7中的数据进行Bayes判别分析并对8个待判样品的类别进行判定.由上结果可知,两个组别为一的被误判为第二组,第二组的三个被误判为第一组。
出现5个误判结果正确率为:0.9411765,误判错误的概率仍然较低。
Bayes判别法对八个待测样本的判定结果为:四个判给第一组,四个判给第二组,且Bayes 判别法是采用了新的后验概率,而不是先验概率。
因此判出概率相同。
应用多元统计分析第8章 对应分析- 1-对应分析(Correspondence Analysis)是在因子分析的基础上发展起来的一种视觉化的数据分析方法,目的是通过定位点图直观地揭示样品和变量之间的内在联系。
R型因子分析是对变量(指标)进行因子分析,研究的是变量之间的相互关系;Q型因子分析是对样品作因子分析,研究的是样品之间的相互关系。
但无论是R型或Q型分析都不能很好地揭示变量和样品之间的双重关系。
而在许多领域错综复杂的多维数据分析中,经常需要同时考虑三种关系,即变量之间的关系、样品之间的关系以及变量与样品之间的交互关系。
法国学者苯参次(J.P.Benzecri)于1970年提出了对应分析方法,这个方法对原始数据采用适当的标度化处理,把R型和Q型分析结合起来,通过R型因子分析直接得到Q型因子分析的结果,同时把变量和样品反映到同一因子平面上,从而揭示所研究的样品和变量之间的内在联系。
在因子分析中,R型因子分析和Q型因子分析都是从分析观测数据矩阵出发的,它们是反映一个整体的不同侧面,因而它们之间一定存在内在联系。
对应分析就是通过某种特定的标准化变换后得到的对应变换矩阵Z将两者有机地结合起来。
具体地,就是首先给出变量的R型因子分析的协方差阵 和样品的Q型因子分析的协方差阵 。
由于矩阵 和 有相同的非零特征值,记为 ,如果 的对应于特征值 的标准化特征向量为 ,则容易证明, 的对应于同一特征值的标准化特征向量为当样本容量n很大时,直接计算矩阵 的特征向量会占用相当大的容量,也会大大降低计算速度。
利用上面关系式,很容易从 的特征向量得到 的特征向量。
并且由 的特征值和特征向量即可得到R 型因子分析的因子载荷阵A和Q型因子分析的因子载荷阵B,即有由于 和 具有相同的非零特征值,而这些特征值又是各个公因子的方差,因此设有p个变量的n个样品观测矩阵 ,这里要求所有元素 ,否则对所有数据同时加上一个适当的正数,以使它们满足以上要求。
多元统计分析R与Python的实现在进行多元统计分析时,选择合适的工具是非常重要的。
R和Python 是两种常用的数据分析工具,都具有强大的多元统计分析功能。
本文将为你介绍R和Python在多元统计分析中的应用和实现。
聚类分析是一种将数据分为不同组的方法,以发现数据内部的结构和模式。
在R中,可以使用“hclust”函数实现层次聚类分析。
判别分析是一种用于确定分类变量与预测变量之间关系的统计方法。
在R中,可以使用“lda”函数实现线性判别分析。
因子分析是一种用于识别数据背后潜在结构的方法。
在R中,可以使用“factanal”函数实现因子分析。
与R相比,Python在数据分析领域的应用也日渐增多。
Python的数据分析库主要有NumPy、Pandas和SciPy等。
NumPy是Python的数值计算库,提供了丰富的数值处理功能,包括矩阵运算、线性代数运算和随机数生成等。
在多元统计分析中,NumPy可以用于计算协方差矩阵和特征值、特征向量等。
Pandas是Python的数据分析库,提供了高效的数据结构和数据分析工具,包括数据的读取、处理和分析等。
在多元统计分析中,Pandas可以用于数据的清洗和预处理。
SciPy是Python的科学计算库,包含了许多用于科学计算的函数和工具。
在多元统计分析中,SciPy可以用于聚类分析、判别分析和因子分析等。
此外,Python还提供了诸多专门用于统计分析的模块和包,如StatsModels和Scikit-learn。
StatsModels是Python的统计分析库,提供了许多统计模型和统计方法的实现。
Scikit-learn是Python的机器学习库,提供了许多机器学习算法和模型的实现,其中包括了许多多元统计分析方法的实现。
总之,R和Python都是非常强大的多元统计分析工具,它们都提供了丰富的函数和包用于多元统计分析的实现。
选择使用哪种工具主要取决于个人偏好和具体的分析需求。
多元统计分析_判别分析实验报告一、实验目的本实验旨在通过对一组数据进行判别分析,了解判别分析的基本原理和应用过程,掌握判别分析的实现方法并运用MATLAB软件进行实现。
二、实验原理判别分析是一种分类方法,用于将已知的样本分类到已知类别中。
判别分析的目的是找到一个统计模型,通过对样本进行观测和测量,能够把它们判别为若干类别中的一种。
在判别分析中,样本数据是由多个指标组成,每个指标都是一个随机变量。
在多元统计中,这些指标被称为变量。
判别函数是一个用于将样本分类的函数,它以样本的多个变量作为输入,并输出该样本属于哪一类的分类决策。
判别函数的形式取决于所使用的判别方法。
判别分析中最重要的判别方法是线性判别分析。
线性判别分析是一种找到最佳线性分类器的方法。
在线性判别分析中,样本被认为是由每个变量线性组合而成,各个变量之间存在某种相关性。
判别分析的目标是找到一条分割两个类别的直线,使得该直线上或下的样本属于不同的类别。
这条直线被称为判别函数。
对于一个具有p个指标的样本,判别函数可以通过下式计算得到:$g_j(x)=x^T\hat{a_j}+\hat{a}_{j0}$其中,j表示第j个判别函数,x是一个向量,包含了样本各个指标的取值,$\hat{a_j}$是一个向量,表示样本各个变量在第j个判别函数中的系数,$\hat{a}_{j0}$是一个截距项。
在线性判别分析中,判别函数的系数可以通过最小平方判别函数系数估计公式获得:$\hat{a_j}=(\sum_{i=1}^{n_j}(x_i-\bar{x_j})(x_i-\bar{x_j})^T)^{-1}(\bar{x_1}-\ bar{x_2})$其中,$\bar{x_1}=\frac{1}{n_1}\sum_{i=1}^{n_1}x_i$n1和n2分别是两个类别的样本数。
三、实验步骤1. 导入数据并分别计算两个类别数据的均值和协方差矩阵。
2. 计算最佳线性判别函数,并作图展示判别平面和两个类别的分布情况。
前言判别分析(discriminant analysis)是多元统计分析中较为成熟的一种分类方法,它的核心思想是“分类与判断”,即根据已知类别的样本所提供的信息,总结出分类的规律性,并建立好判别公式和判别准则,在此基础上,新的样本点将按照此准则判断其所属类型。
例如,根据一年甚至更长时间的每天的湿度差及压差,我们可以建立一个用于判别是否会下雨的模型,当我们获取到某一天(建立模型以外的数据)的湿度差及压差后,使用已建立好的模型,就可以得出这一天是否会下雨的判断。
根据判别的组数来区分,判别分析可以分为两组判别和多组判别。
接下来,我们将学习三种常见的判别分析方法,分别是:•距离判别•Bayes判别•Fisher判别一、距离判别基本理论假设存在两个总体和,另有为一个维的样本值,计算得到该样本到两个总体的距离和,如果大于,则认为样本属于总体,反之样本则属于总体;若等于,则该样本待判。
这就是距离判别法的基本思想。
在距离判别法中,最核心的问题在于距离的计算,一般情况下我们最常用的是欧式距离,但由于该方法在计算多个总体之间的距离时并不考虑方差的影响,而马氏距离不受指标量纲及指标间相关性的影响,弥补了欧式距离在这方面的缺点,其计算公式如下:,为总体之间的协方差矩阵二、距离判别的R实现(训练样本)首先我们导入数据# 读取SAS数据> library(sas7bdat)> data1 <- read.sas7bdat('disl01.sas7bdat')# 截取所需列数据,用于计算马氏距离> testdata <- data1[2:5]> head(testdata,3)X1 X2 X3 X41 -0.45 -0.41 1.09 0.452 -0.56 -0.31 1.51 0.163 0.06 0.02 1.01 0.40# 计算列均值> colM <- colMeans(testdata)> colMX1 X2 X3 X4 0.096304348 -0.006956522 2.033478261 0.431739130 # 计算矩阵的协方差> cov_test <- cov(testdata)> cov_testX1 X2 X3 X4 X1 0.068183816 0.027767053 0.14996870 -0.002566763 X2 0.027767053 0.015363865 0.05878251 0.001252367X3 0.149968696 0.058782512 1.01309874 0.028607150X4 -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 X41 1 -0.45 -0.41 1.09 0.452 1 -0.56 -0.31 1.51 0.163 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 27blong 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 228 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46blong 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 2Levels: 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 10blong 1 1 1 1 1 1 2 2 2 1根据马氏距离判别分析得到的结果,10个待判样品中,第一类7个,第二类3个。
距离判别方法简单实用,它只要求知道总体的数字特征,而不涉及总体的分布,当总体均值和协方差未知时,就用样本的均值和协方差矩阵来估计,因此距离判别没有考虑到每个总体出现的机会大小,即先验概率,没有考虑到错判的损失。
因此,我们进一步学习贝叶斯判别法。
一、贝叶斯判别基本理论贝叶斯判别法的前提是假定我们已经对所要分析的数据有所了解(比如数据服从什么分别,各个类别的先验概率等),根据各个类别的先验概率求得新样本属于某类的后验概率。
该算法应用到经典的贝叶斯公式,该公式为:假设有两个总体和,分别具有概率密度函数和,并且根据以往的统计分析,两个总体各自出现的先验概率为和,当一个样本发生时,求该样本属于某一类的概率,计算公式为:这样,我们得到了该样本属于两类总体的概率,分别为和,属于哪一类总体的概率值大,我们则将样本划分到该类中。
二、贝叶斯判别的R实现在R中,我们使用klaR包中的NaiveBayes()函数实现贝叶斯判别分析,函数调用公式如下:> NaiveBayes(formula, data, ..., subset, na.action = na.pass)# formula指定参与模型计算的变量,以公式形式给出,类似于y=x1+x2+x3# na.action指定缺失值的处理方法,默认情况下不将缺失值纳入模型计算,也不会发生报错信息,当设为“na.omit”时则会删除含有缺失值的样本# 数据准备,使用R内置数据集iris# 通过抽样建立训练样本(70%)和测试样本(30%)> index <- sample(2,size = nrow(iris),replace = TRUE,prob = c(0.7,0.3))> train_data <- iris[index == 1,]> test_data <- iris[index == 2,]# 载入所用包> library(klaR)# 构建贝叶斯模型> Bayes_model <- NaiveBayes(Species ~ ., data = train_data)# 进行预测> Bayes_model_pre <- predict(Bayes_model, newdata = test_data[,1:4]) # 生成实际与预判交叉表> table(test_data$Species,Bayes_model_pre$class)setosa versicolor virginicasetosa 20 0 0versicolor 0 17 0virginica 0 3 7从上表生成的交叉表中,我们可以看到在该模型中错判了3个。
# 生成预判精度> sum(diag(table(test_data$Species,Bayes_model_pre$class)))+ / sum(table(test_data$Species,Bayes_model_pre$class))[1] 0.9361702三、Fisher判别基本理论Fisher判别法的基本思想是“投影”,将组维的数据向低维空间投影,使其投影的组与组之间的方差尽可能的大,组内的方差尽可能的小。
因此,Fisher判别法的重点就是选择适当的“投影轴”。
判别函数为,接下来我们以两类总体举例。
首先我们将样本点投影到一维空间,旋转坐标轴至总体单位尽可能分开的方向,此时分类变量被简化为一个,判别函数;如果划分的效果不理想,可以考虑投影到二维空间(),以此类推。
上图为二维空间的Fisher判别,从图中可以看到,无论我们把总体和投影到还是轴,都不能很好的把两类总体区分出来。
为此,我们需要寻找一条合适的投影线,使得两类总体向该线投影后的区分程度达到最大,线性判别函数即为该投影线的表达形式(这里我们仅介绍Fisher判别的基本原理,不涉及参数的具体推导和求解,这些都可用R程序求得)。
四、Fisher判别的R实现在R中,我们使用MASS包中的lda()函数实现Fisher判别分析,函数调用公式如下:> lda(formula, data, ..., subset, na.action)# formula:指定参与模型计算的变量,以公式形式给出,类似于y=x1+x2+x3 # na.action:指定缺失值的处理方法,默认情况下,缺失值的存在使算法无法运行,当设置为“na.omit”时则会删除含有缺失值的样本# 数据准备,使用R内置数据集iris# 通过抽样建立训练样本(70%)和测试样本(30%)> index <- sample(2,size = nrow(iris),replace = TRUE, prob = c(0.7,0.3)) > train_data <- iris[index == 1,]> test_data <- iris[index == 2,]# 载入所用包> library(MASS)# 构建Fisher判别模型> fisher_model <- lda(Species~., data = train_data)# 进行预测> fisher_model_pre <- predict(fisher_model, newdata = test_data[,1:4]) # 生成实际与预判交叉表> table(test_data$Species,fisher_model_pre$class)setosa versicolor virginicasetosa 20 0 0versicolor 0 14 1virginica 0 0 18# 生成预判精度> sum(diag(table(test_data$Species,fisher_model_pre$class)))+ / sum(table(test_data$Species,fisher_model_pre$class))[1] 0.9811321五、Fisher判别进阶——非线性判别在判别分析的实际应用中,对复杂的数据使用线性判别可能无法得到理想的效果。