微信公众号:生信小知识
关注可了解更多的教程及生信知识。问题或建议,请公众号留言;
R语言 PCA主成分分析
前言统计学背景知识协方差相关系数函数总结实例讲解1.载入原始数据2.作主成分分析3.结果解读4.画主成分的碎石图并预测5.PCA结果绘制后记
前言
PCA分析大家肯定经常看到,但是你真的懂PCA分析的结果吗?
图我也会看,我只是不是很清楚PCA背后输出结果的解读而已。正好看到一篇不错的博客,就把主要的知识点记录下 。
reference:
/longzhongren/p/4300593.html
/question/2085
223.主成分分析PCA
统计学背景知识
协方差
可以通俗的理解为:两个变量在变化过程中是同方向变化?还是反方向变化?同向或反向程度如何?
你变大,同时我也变大,说明两个变量是同向变化的,这时协方差就是正的。
你变大,同时我变小,说明两个变量是反向变化的,这时协方差就是负的。
从数值来看,协方差的数值越大,两个变量同向程度也就越大。反之亦然。
从公式出发来理解一下:
公式简单翻译一下是:如果有X,Y两个变量,每个时刻的“X值与其均值之差”乘以“Y值与其均值之差”得到一个乘积,再对这每时刻的乘积求和并求出均值(其实是求“期望”,但就不引申太多新概念了,简单认为就是求均值了)。
具体例子可以去知乎详细查看:
/question/2085
相关系数
对于相关系数,我们从它的公式入手。一般情况下,相关系数的公式为:
翻译一下:就是用X、Y的协方差除以X的标准差和Y的标准差。
所以,相关系数也可以看成协方差:一种剔除了两个变量量纲影响、标准化后的特殊协方差。
既然是一种特殊的协方差,那它:
1、也可以反映两个变量变化时是同向还是反向,如果同向变化就为正,反向变化就为负。
2、由于它是标准化后的协方差,因此更重要的特性来了:它消除了两个变量变化幅度的影响,而只是单纯反应两个变量每单位变化时的相似程度。
具体例子可以去知乎详细查看:
/question/2085
函数总结
注意:这里的输入数据,rownames是样本名,colnames是样本的特征。(与正常数据正好相反,需要用t()
来转置数据)
princomp()
主成分分析 可以从相关阵或者从协方差阵做主成分分析
fviz_pca_ind
对princomp()
结果进行展示
summary()
提取主成分信息
loadings()
显示主成分分析或因子分析中载荷的内容
predict()
预测主成分的值
screeplot()
画出主成分的碎石图
biplot()
画出数据关于主成分的散点图和原坐标在主成分下的方向
实例讲解
现有30名中学生身高、体重、胸围、坐高数据,对身体的四项指标数据做主成分分析。
1.载入原始数据
#清空环境
2.作主成分分析
#PCA分析
结果解读:
Standard deviation 标准差 其平方为方差=特征值
Proportion of Variance 方差贡献率
Cumulative Proportion 方差累计贡献率
由结果显示:前两个主成分的累计贡献率已经达到96.36%,可以舍去另外两个主成分,达到降维的目的。
因此可以得到函数表达式:
Z1 = 0.497*height + 0.515*weight + 0.481*chest + 0.507*sit-h
Z2 = 0.543*height - 0.210*weight - 0.725*chest + 0.368*sit-h
注意要点:
princomp()
函数中:
cor是逻辑变量,当cor=TRUE表示用样本的相关矩阵R做主成分分析,当cor=FALSE表示用样本的协方差阵S做主成分分析
summary()
函数中:
loading是逻辑变量,当loading=TRUE时表示显示loading 的内容,loadings的输出结果为载荷是主成分对应于原始变量的系数,即Q矩阵
3.结果解读
这里我们可以看一看得到的test.pr
变量的结构:
sdev是标准偏差
center是每列计算是减去的均值
scores即降维之后的结果
我们可以利用函数来验证下scores的结果到底是什么意思:
library(factoextra)
PCA结果图:
手动画散点图:
可以看到,这两者的结果图是一样的!
4.画主成分的碎石图并预测
"lines")
5.PCA结果绘制
主要用到的函数是fviz_pca_ind
,这个函数来自factoextra
R包,所以需要先安装&加载才可使用,下面记录下关于这个函数最常用的几个选项:
fviz_pca_ind(X,axes=c(1,2),geom=c("point","text"), geom.ind=geom,repel=FALSE,habillage="none",palette=NULL, addEllipses=FALSE,col.ind="black",fill.ind="white", col.ind.sup="blue",alpha.ind=1,select.ind=list(name=NULL,cos2 =NULL,contrib=NULL),...) Arguments # geom——指定图形上是只显示点,还是同时也显示标签。默认同时显示。 #palette——自行指定颜色 #addEllipses——加95%置信椭圆 #col.ind——每个点的颜色 #legend.title——指定legend的名字Usage
下面看实例:
geom.ind="point", col.ind=as.character(c(rep("Normal",15),rep("Tumor",15))), palette=c("red","black"), addEllipses=T, legend.title="Groups")fviz_pca_ind(test.pr,
是有点丑了,不过也是为了方便理解这个函数每个参数的意义。
后记
稍微整理了下,感觉对PCA怎么画有了更多了解,虽然之前画过,但是都是跑流程,从没有关注具体结果,所以,看似简单,但是却不熟悉。