1

我有一个从包含三个原始列的表中导出的矩阵:第 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 文件名。

我现在想根据上面的矩阵生成一个相异矩阵。下面的代码需要 vegan 和 ecodist 包。

我之前使用过该功能

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

NA可以直接转换为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))
4

1 回答 1

0

问题一:

不容易,所以在第二步中进行。我发现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

然后转换NA0我们做

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()​​orvegdist()或其他可以从数据框对象计算相异矩阵的函数。

于 2015-01-05T18:13:12.267 回答