我试图计算和可视化Bray-Curtis在一组地点和生命阶段之间的差异。因此,本质上,我试图创建一个矩阵,可以可视化三件事:
- 所有成人社区之间的差异
- 同一地点的成虫和幼虫群落之间的差异
- 所有幼虫群落之间的差异
我可以在所有社区中进行计算,只需手动选择我实际需要的比较(例如,A站点的成年人和C站点的幼虫的比较,对我来说意义不大,但A站点的成人与A站点的幼虫相比是有信息的(。这实际上是我目前通过Excel所做的,对角线下方的成虫比较,对角线上方的幼虫比较,然后对角线上同一地点的成虫x幼虫。
例如数据集:
library(vegan)
Site = c("A", "B", "C", "D", "E", "A", "B", "D", "E")
LifeStage = c(Ad, Ad, Ad, Ad, Ad, L, L, L, L)
Sp1 = c(56, 42, 67, 23, 44, 21, 15, 20, 12)
Sp2 = c(15, 10, 17, 1, 5, 2, 3, 1,6)
Sp3 = c(10, 6, 7, 10, 5, 4, 0, 1, 0)
Sp4 = c(9, 6, 4, 8, 13, 5, 2, 1, 0)
df = data.frame(Site, LifeStage, Sp1, Sp2, Sp3, Sp4)
mat <- df[,3:6]
dist.mat <- vegdist (mat, dist = "bray") #All comparisons, but many unnecessary
注意:我知道不是每个网站都有成虫和幼虫的数据
我找到的最好的解决方案来自这个线程。我可以看到这个选项是有效的,只是听起来它仍然不能帮助我跳过上面提到的手动步骤。
谢谢你的帮助!
这可以让你只计算你想要的值,但它不会将它们组合成矩阵,因为你不清楚如何表示缺失的幼虫阶段:
(Adult <- vegdist(df[which(df$LifeStage=="Ad"), 3:6], dist="bray"))
# A_Ad B_Ad C_Ad D_Ad
# B_Ad 0.1688312
# C_Ad 0.1135135 0.2201258
# D_Ad 0.3636364 0.3207547 0.4890511
# E_Ad 0.1974522 0.1145038 0.2839506 0.3211009
(Larval <- vegdist(df[which(df$LifeStage=="L"), 3:6], dist="bray"))
# A_L B_L D_L
# B_L 0.2692308
# D_L 0.1636364 0.2093023
# E_L 0.4400000 0.2105263 0.3658537
(unlist(sapply(unique(df$Site), function(x) vegdist(df[which(df$Site==x), 3:6], dist="bray"))))
# A B D E
# 0.4754098 0.5238095 0.2923077 0.6000000