JZXBK的个人博客分享 http://blog.sciencenet.cn/u/JZXBK

博文

R 语言 PCA PCoA 区别

已有 3502 次阅读 2020-4-14 23:27 |系统分类:科研笔记

PCA(principal component analysis)中文名字叫主成分分析:基于特征向量的排序方法,分析对象是原始的定量数据。排序图展示样方之间的欧氏距离。

PCoA(principal coordinate analysis)中文名字叫主坐标分析:分析对象为距离矩阵,而非原始的样方-变量矩阵。因此可以灵活选着关联测度。

这样我们就发现了这两种非约束排序的区别:PCA是基于原始物种所做的排序分析,而PCoA则是基于物种组成计算得到的距离矩阵。计算距离矩阵的方法有很多;Euclidean,Bray-Curtis,Jaccard以及Weighted Unifrac和Unweighted Unifrac。PCA通常不适合原始物种丰度数据分析,需要适当转化物种丰度数据后进行PCA分析。

下面我将用同一组数据分别做PCA和PCoA分析,通过R绘图将会更清楚的了解PCA和PCoA的区别。

先展示一下我的数据格式,我一直认为这很必要,否者他人在看你代码时只能通过自己的臆想。

image.png

这是OTU门绝对丰度水平的表,本来是下面这个格式,我用excel打开后另存为.csv文件。image.png

R语言作图部分主要参考了大神刘尧的博客:http://blog.sciencenet.cn/u/lyao222lll,另外大神最近开设了微信公众号:生信小白鱼,感兴趣的小伙伴可以关注一下。先展示PCA代码:

#PCA分析

#读入物种数据

phylum <- read.csv('pca.csv', row.names = 1)

#行为物种,列为样方(原是此形式无需转置)

phylum<-t(phylum) 

##加载 vegan 包,如果尚未安装vegan包,需要在此步骤之前执行:install.packages('vegan')

library(vegan)

#物种数据 Hellinger 预转化(处理包含很多 0 值的群落物种数据时,推荐使用)

phylum_hel <- decostand(phylum, method = 'hellinger')

#PCA 排序(vegan 包中 rda() 执行)

tbpca <- rda(phylum_hel, scale = FALSE)

#查看 PCA 结果

summary(tbpca, scaling = 1)

#画图,scaling = 1选着1型标尺默认为scaling=2,choices = c(1, 2)选择PCA排序的第1主成分和第2主成分

#需要注意的是col = c(rep('red', 12), rep('orange', 12), rep('green3', 12),rep('blue',12))是根据你自己的数

#据需要更改的地方,我自己有四组数据,所以有四种颜色,每组数据有12个重复。

plot(tbpca, choices = c(1, 2), scaling = 1, type = 'n')

points(tbpca, choices = c(1, 2), scaling = 1, display = 'sites', pch = 20, col = c(rep('red', 12), rep('orange', 12), rep('green3', 12),rep('blue',12)))

在这我要从#查看PCA结果开始说,我们看到summary(tbpca, scaling = 1)中scaling参数设定为scaling = 1,scaling是指排序结果投影到排序空间的可视化方式。一般的排序图需要同时展示对象和变量,但是没有同时可视化对象和变量的最优化方法。一般有两种标尺模式,不同模式 的排序图有不同解读,即关注点不同。以上解释摘至《数量生态学》

scaling=1(1型标尺)=distance biplot(距离双序图):特征向量被标准化为单位长度,关注的是对象之间的关系。(双序图中的对象之间的距离近似于多维空间里的欧氏距离,代表变量之间的箭头的角度没有意义)

scaling=2(2型标尺)=correlation biplot(相关双序图):每个特征向量被标准化为特征根的平方根,关注的是变量之间的关系。(双序图中对象之间的距离不再近似于多维空间内的欧氏距离,代表变量箭头之间夹角反应变量的相关性)

选择建议:如果分析兴趣在于解读对象之间的关系,设定scaling。如果分析兴趣在于解读变量之间的关系,设定scaling=2。为了找出区别我将不同类型的标尺画在同一面板上,结果是这样的(如下图,上面的是scaling=1,下面的是scaling=2)。可以看的出来,点与点之间的相对位置是一致的,就是scaling=1更紧凑,scaling=2更松散。这样可能就好理解了,scaling=1注重点于点之间的距离,scaling=2注重点与点之间的角度。

image.png

这样PCA就差不多了,再来展示一下PCoA,数据还是PCA用的数据,代码如下

#自己的数据PCoA

phylum <- read.csv('pca.csv', row.names = 1)

#行为物种,列为样方(原是此形式无需转置)

phylum<-t(phylum) 

##加载 vegan 包

library(vegan)

#物种数据 Hellinger 预转化(处理包含很多 0 值的群落物种数据时,推荐使用)

phylum<- decostand(phylum, method = 'hellinger')

#使用Bray-curtis方法计算距离矩阵

bray <- vegdist(phylum, method = 'bray')

#PCoA 排序(vegan 包中 cmdscale() 执行),这里会出现warning message,没有关系继续就行。

pcoa <- cmdscale(bray, k = (nrow(phylum) - 1), eig = TRUE)

#PCoA 作图

plot(scores(pcoa)[ ,1], scores(pcoa)[ ,2], pch = 20, col = c(rep('red', 12), rep('orange',12), rep('green3', 12),rep('black',12)),xlab='PCoA1',ylab='PCoA2')

abline(h=0,lty=3)

abline(v=0,lty=3)

对比PCA代码和PCoA代码可以发现PCoA多了一步使用Bray-curtis方法计算距离矩阵,这也就是开头提到的PCA使用原始数据,而PCoA分离对象是对原始数据转化后的距离矩阵。我现在把PCA 1型,PCA 2型和PCoA画到一起,感受一下。可能是自己的数据不适合这些聚类方法,聚类效果都不太好哈哈

image.png

这一篇就写这么多吧,下一篇计划将这里的plot函数画出的图统统ggplot2画出来。




https://wap.sciencenet.cn/blog-3419243-1228377.html

上一篇:python3 fasta txt seq contig等纯文本文件的读取 写入
下一篇:R语言 PCA PCoA ggplot2

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2021-12-8 22:01

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部