PERMANOVA (adonis2) testing whether community composition differs across environmental groups. Returns R², F and p-value.
run_permanova <- function(comm, env, formula = NULL, nperm = 999) {
if (!requireNamespace("vegan", quietly = TRUE)) install.packages("vegan")
library(vegan)
d <- vegdist(comm, method = "bray")
if (is.null(formula)) {
if (is.data.frame(env)) {
formula <- as.formula(paste("d ~", paste(names(env), collapse = " + ")))
} else {
formula <- d ~ env
}
}
res <- adonis2(formula, data = if (is.data.frame(env)) env else NULL,
permutations = nperm)
as.data.frame(res)
}
# ── Example ──────────────────────────────────────────────────────
library(vegan)
comm <- iris[, 1:4] # traits as "species"
species <- iris$Species # grouping factor
run_permanova(comm, data.frame(sp = species), nperm = 499)