R语言手动计算主成分分析(PCA)及其在R函数的实现

了解PCA的原理,但总是无法用R语言实现,这次算是有个教程。

转自:http://blog.163.com/xiaoji0106@126/blog/static/13613466120133185842687/

主成分分析(principal component analysis,PCA)是一种降维技术,把多个变量化为能够反映原始变量大部分信息的少数几个主成分。

设X有p个变量,为n*p阶矩阵,即n个样本的p维向量。首先对X的p个变量寻找正规化线性组合,使它的方差达到最大,这个新的变量称为第一主成分,抽取第一主成分后,第二主成分的抽取方法与第一主成分一样,依次类推,直到各主成分累积方差达到总方差的一定比例。
       主成分分析的计算步骤:
      假设样本观测数据矩阵为:
      X=(x1,x2,x3,...xp),xi为n个样本在第i个属性上的观测值,是一个列向量
     1.对原始数据标准化处理(0均值化处理)
     2.计算样本相关系数矩阵
     3.计算协方差矩阵的特征值和特征向量
     4、选择重要的主成分,并写出主成分表达式

5.计算主成分得分
     6.根据主成分得分的数据,做进一步的统计分析。

主成分分析可以得到p个主成分,但是,由于各个主成分的方差是递减的,包含的信息量也是递减的,所以实际分析时,一般不是选取p个主成分,而是根据各个主成分累计贡献率的大小选取前k个主成分,这里贡献率就是指某个主成分的方差占全部方差的比重,实际也就是某个特征值占全部特征值总和的比重。贡献率越大,说明该主成分所包含的原始变量的信息越强。主成分个数k的选取,主要根据主成分的累积贡献率来决定,即一般要求累计贡献率达到85%以上,这样才能保证综合变量能包括原始变量的绝大多数信息。 
另外,在实际应用中,选择了重要的主成分后,还要注意主成分实际含义解释。主成分分析中一个很关键的问题是如何给主成分赋予新的意义,给出合理的解释。一般而言,这个解释是根据主成分表达式的系数结合定性分析来进行的。主成分是原来变量的线性组合,在这个线性组合中个变量的系数有大有小,有正有负,有的大小相当,因而不能简单地认为这个主成分是某个原变量的属性的作用,线性组合中各变量系数的绝对值大者表明该主成分主要综合了绝对值大的变量,有几个变量系数大小相当时,应认为这一主成分是这几个变量的总和,这几个变量综合在一起应赋予怎样的实际意义,这要结合具体实际问题和专业,给出恰当的解释,进而才能达到深刻分析的目的 。

在R里手工统计过程如下:
> #数据集
> y=USArrests
> #相关矩阵
> c=cor(y)
> #特征值
> e=eigen(c)
> e
$values #特征值
[1] 2.4802416 0.9897652 0.3565632 0.1734301
$vectors 特征向量,也就是主成分的表达式
[,1] [,2] [,3] [,4]
[1,] -0.5358995 0.4181809 -0.3412327 0.64922780
[2,] -0.5831836 0.1879856 -0.2681484 -0.74340748
[3,] -0.2781909 -0.8728062 -0.3780158 0.13387773
[4,] -0.5434321 -0.1673186 0.8177779 0.08902432
> # 计算标准化的主成分得分
> scale( as.matrix(y))%*%e$vector
[,1] [,2] [,3] [,4]
Alabama -0.97566045 1.12200121 -0.43980366 0.154696581
Alaska -1.93053788 1.06242692 2.01950027 -0.434175454
Arizona -1.74544285 -0.73845954 0.05423025 -0.826264240
Arkansas 0.13999894 1.10854226 0.11342217 -0.180973554
.....
West Virginia 2.08739306 1.41052627 0.10372163 0.130583080
Wisconsin 2.05881199 -0.60512507 -0.13746933 0.182253407
Wyoming 0.62310061 0.31778662 -0.23824049 -0.164976866

R中下面两个函数可以用做主成分分析
princomp(x, cor = FALSE, scores = TRUE, covmat = NULL,
subset = rep(TRUE, nrow(as.matrix(x))), ...)
cor =TRUE 是使用相关矩阵求主成分,否则使用协方差矩阵。
prcomp(x, retx = TRUE, center = TRUE, scale. = FALSE,
tol = NULL, ...)
scale =TRUE 即使用相关矩阵求主成分夬否则使用协方差矩阵
求主成分。
> # prcomp() 的用法
> p=prcomp(USArrests, scale=T)
> p
Standard deviations:
[1] 1.5748783 0.9948694 0.5971291 0.4164494
Rotation:
                  PC1     PC2       PC3                  PC4
Murder -0.5358995 0.4181809 -0.3412327 0.64922780
Assault -0.5831836 0.1879856 -0.2681484 -0.74340748
UrbanPop -0.2781909 -0.8728062 -0.3780158 0.13387773
Rape -0.5434321 -0.1673186 0.8177779 0.08902432
> summary(p)
Importance of components:
                                      PC1  PC2 PC3 PC4
Standard deviation 1.5749 0.9949 0.59713 0.41645
Proportion of Variance 0.6201 0.2474 0.08914 0.04336
Cumulative Proportion 0.6201 0.8675 0.95664 1.00000
#计算标准化的主成分得分
> predict(p) 
结果和手工统计的一样。

R语言手动计算主成分分析(PCA)及其在R函数的实现相关推荐

  1. R语言在计算基因表达量均值,使用函数mean,R报错:既不是数值也不是逻辑值,返回NA。

    上图左侧的小窗口就是我的变量 counts,提前读入的,使用read.table::fread 出现上述报错,最后根据网上各种办法发现是,在作计算时错把基因名也当作数据进行计算了,所以出现报错. 解决 ...

  2. 数据分享|R语言用主成分PCA、 逻辑回归、决策树、随机森林分析心脏病数据并高维可视化...

    全文链接:http://tecdat.cn/?p=22262 在讨论分类时,我们经常分析二维数据(一个自变量,一个因变量)(点击文末"阅读原文"获取完整代码数据). 但在实际生活中 ...

  3. R语言使用pwr包的pwr.t.test函数对分组样本数相同的t检验进行效用分析(power analysis)、在已知效应量(effect size)、显著性水平、效用值的情况下计算需要的样本量

    R语言使用pwr包的pwr.t.test函数对分组样本数相同的t检验进行效用分析(power analysis).在已知效应量(effect size).显著性水平(sig).效用值(power)的情 ...

  4. R语言使用pwr包的pwr.t.test函数对分组样本数相同的t检验进行效用分析(power analysis)、在已知效应量(effect size)、显著性水平、样本量的情况下计算假设检验的效用值

    R语言使用pwr包的pwr.t.test函数对分组样本数相同的t检验进行效用分析(power analysis).在已知效应量(effect size).显著性水平(sig).样本量(sample s ...

  5. R语言使用pwr包的pwr.chisq.test函数对卡方检验进行效用分析(power analysis)、在已知效应量(effect size)、显著性水平、效用值的情况下计算需要的样本量

    R语言使用pwr包的pwr.chisq.test函数对卡方检验(Chi-square tests)进行效用分析(power analysis).在已知效应量(effect size).显著性水平(si ...

  6. R语言使用pwr包的pwr.f2.test函数对线性回归模型进行效用分析(power analysis)、在已知效应量(effect size)、显著性水平、效用值的情况下计算需要的样本量

    R语言使用pwr包的pwr.f2.test函数对线性回归模型(Linear models)进行效用分析(power analysis).在已知效应量(effect size).显著性水平(sig).效 ...

  7. R语言dataframe计算满足筛选条件的行的个数(筛选满足条件的数据行并计数):类似于excel的countif函数

    R语言dataframe计算满足筛选条件的行的个数(筛选满足条件的数据行并计数):类似于excel的countif函数 目录

  8. R语言相关性计算及使用ggcorrplot包相关性分析热力图可视化分析实战

    R语言相关性计算及使用ggcorrplot包相关性分析热力图可视化分析实战 目录 R语言相关性计算及使用ggcorrplot包相关性分析热力图可视化分析实战

  9. R语言置信区间计算(confidence interval)、计算比例值对应的置信区间、为比例值构建95%执行区间、使用glue包把最终结果以标准格式输出

    R语言置信区间计算(confidence interval).计算比例值对应的置信区间.为比例值构建95%执行区间.使用glue包把最终结果以标准格式输出 目录

最新文章

  1. 关于使用 git 命令行来和“码云”账号上的项目互通过程的基础步骤
  2. 史上最简单的 SpringCloud 教程 | 第十四篇: 服务注册(consul)
  3. 内存泄漏(OOM)产生原因
  4. 使用ASP.NET Core 3.x 构建 RESTful API - 3.2 开始建立Controller和Action
  5. Storm精华问答 | storm与Hadoop有什么区别?
  6. pagerank数据集_从小白视角理解数据挖掘十大算法
  7. 可靠型园区网组网,用VRRP还是堆叠?
  8. FlexForAndroid:文件读写
  9. iOS安全系列之一:HTTPS
  10. intellij idea 使用 git stash
  11. 2019年PMP考试模拟题(附答案解析)
  12. 动态规划之背包问题(优化版)
  13. nxlog管理配置linux,IIS服务器配置NXLog进行syslog转发(并解决GMT+8小时时差问题)...
  14. indel该右移还是左移
  15. 主流智能手机屏幕材质介绍 及 LCD闪屏现象分析
  16. 3d与人生 (极好的比喻)
  17. 【NOI2006】 生日快乐
  18. GEE——2018 年南非国家土地覆盖( 20 米分辨率多季节 Sentinel 2 卫星图像生成的)
  19. Linux下使用 tc 模拟网络延迟和丢包
  20. python批量文件重命名

热门文章

  1. c# 二进制文件编程实践
  2. 《大明王朝》掠之于官
  3. [架构之路-164]-《软考-系统分析师》-3-操作系统基本原理-文件系统(文件的逻辑组织、文件的物理组织、硬盘空间管理、分布式文件系统)
  4. wallpaper怎么导入视频_怎样制作Wallpaper Engine视频壁纸 制作视频壁纸方法图文教程...
  5. ubuntu mongo数据库无缘无故丢失了?如何保护mongoDB的数据。
  6. SparkStreaming编程
  7. 电脑报价管理系统C语言,C语言笔记本电脑销售系统课设(附源码).doc
  8. JAVA后台对接苹果APNS(VOIP)实现推送
  9. 电话机器人成骚扰机器?程序员可不背锅
  10. 7-6,输入厘米,输出英尺英寸