当前位置:首页 > 科技 > 正文

你要的PCA分析来啦!

主成分分析(Principal Component Analysis,PCA)是一种无监督的多元统计分析方法,能从总体上反应各组样本之间的总体差异和组内样本之间的变异度大小,其结果一目了然,在许多生信分析中可以运用到。

基本原理是,利用数学的方法,将原来变量重新组合成新的互相无关的几个综合变量(即主成分),对所有因素按重要性排序,通常靠后的微小因素被忽略掉,从而起到简化数据的作用。实际项目中,我们可以通过PCA找出离群样品、判别相似性高的样品簇等。

PCA 是一种较为常用的降维技术,PCA 的思想是将维特征映射到维上,这维是全新的正交特征。这维特征称为主元,是重新构造出来的维特征。

在 PCA 中,数据从原来的坐标系转换到新的坐标系下,新的坐标系的选择与数据本身是密切相关的。其中,第一个新坐标轴选择的是原始数据中方差最大的方向,第二个新坐标轴选取的是与第一个坐标轴正交且具有最大方差的方向,依次类推,我们可以取到这样的几个坐标轴。

PCA的计算过程

1、去平均值,即每一位特征减去各自的平均值

2、计算协方差矩阵

3、计算协方差矩阵的特征值与特征向量

4、对特征值从大到小排序

5、保留最大的个特征向量

6、将数据转换到个特征向量构建的新空间中

PCA分析有很多的方法可以实现,今天要讲的是使用R来做PCA分析。在R中有两个自带的函数可以做PCA分析,分别是prcomp和princomp,这两者之间的不同之处在于princomp只能用于R mode,而prcomp对于R mode和Q mode都可以使用;

R mode是变量(variable)比数据(observation)多的类型,即列比行多,是基于variable的分析,Q mode则是基于observation的分析;两者使用的算法也不同。所以对于不同的数据类型可以选择相应的方法去分析。

PCA作图方法介绍

> data <-read.table('text.xls',header=true)>

> pca = prcomp(data,scale=T)

> head(pca$x) #用于作图的数据

> summary(pca) #PCA的统计信息

Standard deviation #标准差

Proportion of Variance #差异比例

Cumulative Proportion #累计比例

累计比例达0.8的主成分作为后续分析的数据,从碎石图也可以判别;

>screeplot(pca,type = 'lines')


图1:PCA碎石图

图上可以看出,从第四个主成分之后,曲线开始趋于平缓,所以选择前四个主成分用于分析。

  • 运用R自带的基础画图函数画PCA散点图

    > group <- factor(c(rep('a',59),rep('b',71),rep('c',48)))="">

    > colour_group <>

    > colour <>

    > plot(pca$x[,1:2],col =colour,pch=c(20,21,22,23,24)[group])

    > legend('topleft',legend =levels(group),col=colour_group,pch =c(20,21,22,23,24))

    > title('PCA')


图2:PCA散点图

  • 用ggplot2画PCA散点图

    >library(ggplot2)

    > group_2 <>

    > pca_result <>

    > pca_result <->

    >p<>

    >p<>

    > p


图3:PCA散点图

  • scatterplot3d画PCA 3D图

    > library(scatterplot3d)

    > par(mar=c(5.1,4.1,4.1,8.1),xpd=TRUE)

    >scatterplot3d(pca_result[,1:3],pch=20,color=colour,angle=45,main='PCA_3D',cex.symbols=2,mar=c(5.1,4.1,4.1,8.1))

    >legend('rigth',legend=group,col=colour,pch=20,bg='white',xpd=TRUE,inset=-0.5)


图4:PCA 3D图

  • ggfortify画PCA圈图

    > library(ggfortify)

    > data_2=cbind(data,group_2)

    >autoplot(pca,data=data_2,colour='group',label=FALSE,frame=TRUE,frame.type='norm')


图5:PCA圈图

你可能想看: