我是生态学家,主要使用纯素 R 包。
我有 2 个矩阵(样本 x 丰度)(见下面的数据):
矩阵 1/ nrow= 6replicates*24sites, ncol=15 物种丰度(鱼) 矩阵 2/ nrow= 3replicates*24sites, ncol=10 物种丰度(无脊椎动物)
两个矩阵中的位点相同。我想获得成对站点之间的整体布雷柯蒂斯差异(考虑两个矩阵)。我看到 2 个选项:
选项 1,对重复(在站点规模)鱼类和大型无脊椎动物丰度进行平均,cbind 两个平均丰度矩阵(nrow=24sites,ncol=15+10 平均丰度)并计算 bray-curtis。
选项 2,对于每个组合,计算站点对之间的布雷-柯蒂斯相异度,计算站点质心之间的距离。然后对2个距离矩阵求和。
如果我不清楚,我在下面的 R 代码中做了这两个操作。
请您告诉我选项 2 是否正确且比选项 1 更合适。
先感谢您。
皮埃尔
下面是 R 代码示例
生成数据
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),]
选项 1,平均丰度和 cbind
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")
选项 2,计算质心之间的每个组合距离并对 2 个距离矩阵求和
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")
使用 Gavin Simpson 的 fuse() 对两个距离矩阵求和
dist.centroid=fuse(a1.dist.centroid,a2.dist.centroid,weights=c(15/25,10/25))
总结两个欧几里得距离矩阵(感谢 Jari Oksanen 校正)
dist.centroid=sqrt(a1.dist.centroid^2 + a2.dist.centroid^2)
以及下面的“coord.centroid”,用于进一步基于距离的分析(是否正确?)
coord.centroid=cmdscale(dist.centroid,k=23,add=TRUE)
比较选项 1 和 2
pco.mean=cmdscale(vegdist(sqrt(bio.mean),"bray"))
pco.centroid=cmdscale(dist.centroid)
comparison=procrustes(pco.centroid,pco.mean)
protest(pco.centroid,pco.mean)