|
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的区别。
先展示一下我的数据格式,我一直认为这很必要,否者他人在看你代码时只能通过自己的臆想。
这是OTU门绝对丰度水平的表,本来是下面这个格式,我用excel打开后另存为.csv文件。
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注重点与点之间的角度。
这样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画到一起,感受一下。可能是自己的数据不适合这些聚类方法,聚类效果都不太好哈哈。
这一篇就写这么多吧,下一篇计划将这里的plot函数画出的图统统ggplot2画出来。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-23 01:40
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社