如何使用功能metaMDS的相异矩阵?

时间:2014-12-10 03:02:23

标签: r matrix vegan multi-dimensional-scaling

我有一个从具有三个原始列的表中得到的矩阵:第1列=站点代码,第2列=物种代码,第3列=每个物种的生物量权重。每个图中每个物种的生物量重量显示在矩阵中。可以使用以下三个选项之一计算矩阵(感谢对先前问题的反馈):

reshape::cast(dissimBiom, plot ~ species, value = 'biomass', fun = mean)
by(dissimBiom, dissimBiom$biomass, function(x) with(x, table(plot, species)))
tapply(dissimBiom$biomass,list(dissimBiom$plot,dissimBiom$species),mean)

注意:dissim是双列表的.csv文件名; dissimBiom是三列表的.csv文件名。

我现在想基于上述矩阵生成相异矩阵。以下代码需要素食主义者和生态主义者。

我之前使用过该功能

matrix <- with(dissim, table(plot,species))

仅基于两列(站点与物种)生成矩阵,然后使用

matrix.meta <- metaMDS(matrix, k=2, distance = "bray", trymax=10) 

生成相异矩阵。这很好用。

相反,试图生成一个相异矩阵,其中矩阵已使用以下代码之一生成(如上所述)

reshape::cast(dissimBiom, plot ~ species, value = 'biomass', fun = mean)
by(dissimBiom, dissimBiom$biomass, function(x) with(x, table(plot, species)))
tapply(dissimBiom$biomass,list(dissimBiom$plot,dissimBiom$species),mean

使用相同的功能

matrixBiom.meta <- metaMDS(matrixBiom, k=2, distance = "bray", trymax=10)

导致以下错误消息

Error in if (any(autotransform, noshare > 0, wascores) && any(comm < 0)) { : 
  missing value where TRUE/FALSE needed

注意:我从我编写的文件matrixBiom.csv中调用matrixBiom,将NA转换为0,使用

write.csv(matrixBiom, "matrixBiom.csv", na="0",row.names=TRUE)

与matrixBiom.meta相反,matrix.meta直接在'matrix'上使用而不编写.csv文件。

此外,由

生成的矩阵
matrix <- with(dissim, table(plot,species))

看起来像这样,

               species
    plot        xanfla1 xangria xanret 
      a100f177r       1.4       0      8.9      
      a100f562r       0       5.6      0      
      a100f56r        22.4       0      1.3 

而由其他任何一种方法生成的矩阵都具有格式

zinunk ziz150 zizang 
a100f177r     22.4     NA     2.6     
a100f562r     1.3     NA     NA     
a100f56r      NA     3.1     NA     
a100f5r       NA     NA     0.2 

我的问题是,

1)在这些功能中的任何一个

reshape::cast(dissimBiom, plot ~ species, value = 'biomass', fun = mean)
by(dissimBiom, dissimBiom$biomass, function(x) with(x, table(plot, species)))
tapply(dissimBiom$biomass,list(dissimBiom$plot,dissimBiom$species),mean

可以将NAs直接转换为0以避免在.csv文件中写入和读取,这可能会解决问题吗?

2)使用metaMDS对三列表示例进行NMDS可以使用哪些修复?

3)是否有替代函数来计算三列表示例的相异度矩阵?

非常感谢任何建议。

请在下面找到可重现的数据子集:

> dput(dataframe)
structure(list(plot = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 3L), .Label = c("a1f17r", 
"a1f56r", "a1m17r", "a1m5r"), class = "factor"), species = structure(c(12L, 
29L, 16L, 21L, 24L, 19L, 6L, 13L, 14L, 5L, 16L, 12L, 26L, 9L, 
29L, 28L, 17L, 15L, 25L, 6L, 3L, 8L, 27L, 6L, 1L, 7L, 18L, 10L, 
12L, 11L, 2L, 20L, 13L, 27L, 22L, 23L, 4L, 1L), .Label = c("annunk", 
"blurip", "cae089", "caepar", "chrodo", "clihir", "dalpin", "derele", 
"embphi", "ficmeg", "indunk", "jactom", "leeind", "merbor", "mergra", 
"mikcor", "nep127", "nepbis", "nepbis1", "palunk", "rubcle", 
"sinirp", "spagyr1", "sphoos", "stitrut", "tetped", "tinpet", 
"uncgla", "zinunk"), class = "factor"), biomass = c(100.6, 284.6, 
13.8, 2.8, 1, 3.1, 8.8, 0.5, 15.2, 13.8, 6.1, 5.3, 18.8, 4.1, 
199, 68, 143.3, 11.3, 6.5, 0.2, 54.1, 39, 22, 1.2, 6.3, 6, 0.1, 
2.8, 42, 1.9, 0.1, 0.2, 0.2, 0.1, 2.1, 4.3, 0.7, 0.2)), .Names = c("plot", 
"species", "biomass"), class = "data.frame", row.names = c(NA, 
-38L))

1 个答案:

答案 0 :(得分:0)

问题1:

不容易,所以在第二步中这样做。我发现tapply()结果更整洁,所以我将使用:(假设您的示例数据位于dat

dat2 <- as.data.frame(with(dat, tapply(biomass, list(plot, species), mean)))

> dat2[, 1:6]
       annunk blurip cae089 caepar chrodo clihir
a1f17r     NA     NA     NA     NA     NA    0.2
a1f56r     NA     NA     NA     NA   13.8    8.8
a1m17r    0.2     NA     NA    0.7     NA     NA
a1m5r     6.3    0.1   54.1     NA     NA    1.2

然后将NA转换为0我们

dat2[is.na(dat2)] <- 0

给了我们

> dat2[, 1:6]
       annunk blurip cae089 caepar chrodo clihir
a1f17r    0.0    0.0    0.0    0.0    0.0    0.2
a1f56r    0.0    0.0    0.0    0.0   13.8    8.8
a1m17r    0.2    0.0    0.0    0.7    0.0    0.0
a1m5r     6.3    0.1   54.1    0.0    0.0    1.2

问题2:

鉴于Q1的解决方案,不需要进一步的步骤。

问题3:

按照上面问题1中的解决方案,然后运行dist()vegdist()或其他一些可以从数据框对象计算相异矩阵的函数。