I have a matrix derived from a table with three original columns: column 1 = site codes, column 2 = species codes and column 3 = biomass weight for each species. The biomass weight of each species in each plot is displayed in the matrix. The matrix can be calculated with one of the three following options (thanks to feedback on an earlier question):
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)
Note: dissim is the .csv file name for two-column table; dissimBiom is the .csv file name for three-column table.
I now would like to generate a dissimilarity matrix based on the above matrix. The below code requires packages vegan and ecodist.
I had earlier used the function
matrix <- with(dissim, table(plot,species))
to generate a matrix based on two columns (site vs species) only and then used
matrix.meta <- metaMDS(matrix, k=2, distance = "bray", trymax=10)
to generate a dissimilarity matrix. This worked just fine.
In contrast, attempts to generate a dissimilarity matrix where the matrix has been generated with one of the following codes (as above)
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
using the same function
matrixBiom.meta <- metaMDS(matrixBiom, k=2, distance = "bray", trymax=10)
results in the following error message
Error in if (any(autotransform, noshare > 0, wascores) && any(comm < 0)) { :
missing value where TRUE/FALSE needed
Note: I call matrixBiom from the file matrixBiom.csv which I wrote to convert the NA's to 0, using
write.csv(matrixBiom, "matrixBiom.csv", na="0",row.names=TRUE)
In contrast to matrixBiom.meta, matrix.meta was directly used on 'matrix' without writing a .csv file.
Also, the matrix generated by
matrix <- with(dissim, table(plot,species))
looks like this,
species
plot xanfla1 xangria xanret
a100f177r 1.4 0 8.9
a100f562r 0 5.6 0
a100f56r 22.4 0 1.3
while the matrix generated by either of the other approaches has the format
zinunk ziz150 zizang
a100f177r 22.4 NA 2.6
a100f562r 1.3 NA NA
a100f56r NA 3.1 NA
a100f5r NA NA 0.2
My questions would be,
1) In either of these functions
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
can NAs directly be converted to 0s to avoid writing and reading in a .csv file, maybe this would solve the problem?
2) What fixes could be used for the three-column table example to conduct an NMDS using metaMDS?
3) Is there alternative functions to calculate a dissimilarity matrix for the three-column table example?
Any advice would be very much appreciated.
Please find a reproducible data subset below:
> 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))
Question 1:
Not easily, so do it in a secondary step. I find the
tapply()
result neater so I'll go with that: (assuming your example data is indat
)giving
Then to convert
NA
to0
we dowhich gives us
Question 2:
Given the solution to Q1, there are no further steps required.
Question 3:
Follow the solution in Question 1 above and then run
dist()
orvegdist()
or some other function that can compute dissimilarity matrices from data frame objects.