Pie*_*rre 6 r distance matrix centroid vegan
我是生态学家,主要使用纯素R包.
我有2个矩阵(样本x丰度)(见下面的数据):
矩阵1/nrow = 6replicates*24sites,ncol = 15种丰度(鱼)矩阵2/nrow = 3replicates*24sites,ncol = 10种丰度(无脊椎动物)
两个矩阵中的站点相同.我想在两对网站之间得到整体的bray-curtis不同(考虑两个矩阵).我看到两个选项:
选项1,平均重复(在场地规模)鱼类和大型无脊椎动物丰度,cbind两个平均丰度矩阵(nrow = 24sites,ncol = 15 + 10平均丰度)和计算bray-curtis.
选项2,对于每个组合,计算站点对之间的bray-curtis不相似性,计算站点质心之间的距离.然后总结2个距离矩阵.
如果我不清楚,我在下面的R代码中做了这两个操作.
请问,您能告诉我选项2是否正确且比选项1更合适.
先感谢您.
皮埃尔
library(plyr);library(vegan)
#assemblage 1: 15 fish species, 6 replicates per site
a1.env=data.frame(
Habitat=paste("H",gl(2,12*6),sep=""),
Site=paste("S",gl(24,6),sep=""),
Replicate=rep(paste("R",1:6,sep=""),24))
summary(a1.env)
a1.bio=as.data.frame(replicate(15,rpois(144,sample(1:10,1))))
names(a1.bio)=paste("F",1:15,sep="")
a1.bio[1:72,]=2*a1.bio[1:72,]
#assemblage 2: 10 taxa of macro-invertebrates, 3 replicates per site
a2.env=a1.env[a1.env$Replicate%in%c("R1","R2","R3"),]
summary(a2.env)
a2.bio=as.data.frame(replicate(10,rpois(72,sample(10:100,1))))
names(a2.bio)=paste("I",1:10,sep="")
a2.bio[1:36,]=0.5*a2.bio[1:36,]
#environmental data at the sit scale
env=unique(a1.env[,c("Habitat","Site")])
env=env[order(env$Site),]
Run Code Online (Sandbox Code Playgroud)
a1.bio.mean=ddply(cbind(a1.bio,a1.env),.(Habitat,Site),numcolwise(mean))
a1.bio.mean=a1.bio.mean[order(a1.bio.mean$Site),]
a2.bio.mean=ddply(cbind(a2.bio,a2.env),.(Habitat,Site),numcolwise(mean))
a2.bio.mean=a2.bio.mean[order(a2.bio.mean$Site),]
bio.mean=cbind(a1.bio.mean[,-c(1:2)],a2.bio.mean[,-c(1:2)])
dist.mean=vegdist(sqrt(bio.mean),"bray")
Run Code Online (Sandbox Code Playgroud)
a1.dist=vegdist(sqrt(a1.bio),"bray")
a1.coord.centroid=betadisper(a1.dist,a1.env$Site)$centroids
a1.dist.centroid=vegdist(a1.coord.centroid,"eucl")
a2.dist=vegdist(sqrt(a2.bio),"bray")
a2.coord.centroid=betadisper(a2.dist,a2.env$Site)$centroids
a2.dist.centroid=vegdist(a2.coord.centroid,"eucl")
Run Code Online (Sandbox Code Playgroud)
用Gavin Simpson的保险丝()总结两个距离矩阵
dist.centroid=fuse(a1.dist.centroid,a2.dist.centroid,weights=c(15/25,10/25))
Run Code Online (Sandbox Code Playgroud)
总结两个欧氏距离矩阵(感谢Jari Oksanen校正)
dist.centroid=sqrt(a1.dist.centroid^2 + a2.dist.centroid^2)
Run Code Online (Sandbox Code Playgroud)
coord.centroid=cmdscale(dist.centroid,k=23,add=TRUE)
Run Code Online (Sandbox Code Playgroud)
pco.mean=cmdscale(vegdist(sqrt(bio.mean),"bray"))
pco.centroid=cmdscale(dist.centroid)
comparison=procrustes(pco.centroid,pco.mean)
protest(pco.centroid,pco.mean)
Run Code Online (Sandbox Code Playgroud)
更简单的解决方案是通过对每个矩阵进行加权来灵活地组合两个相异矩阵。权重之和需要为 1。对于两个相异矩阵,融合相异矩阵为
d.fused = (w * d.x) + ((1 - w) * d.y)
Run Code Online (Sandbox Code Playgroud)
其中w是数值标量(长度为 1 的向量)权重。如果您没有理由对其中一组差异的权重高于另一组,则只需使用w = 0.5。
我的模拟包中有一个函数可以为您执行此操作;fuse()。的例子?fuse是
train1 <- data.frame(matrix(abs(runif(100)), ncol = 10))
train2 <- data.frame(matrix(sample(c(0,1), 100, replace = TRUE),
ncol = 10))
rownames(train1) <- rownames(train2) <- LETTERS[1:10]
colnames(train1) <- colnames(train2) <- as.character(1:10)
d1 <- vegdist(train1, method = "bray")
d2 <- vegdist(train2, method = "jaccard")
dd <- fuse(d1, d2, weights = c(0.6, 0.4))
dd
str(dd)
Run Code Online (Sandbox Code Playgroud)
这个想法被用在监督 Kohonen 网络(监督 SOM)中,将多层数据纳入单个分析中。
Analogue与vegan密切合作,因此并行运行两个包不会出现任何问题。