Compute standardised effect sizes (SES) for a functional diversity metric against a null model (random species shuffling). Returns SES, p-value and CI.
null_model_FD <- function(comm, traits, nperm = 999, metric = "FRic",
ndim = 3, probs = c(0.025, 0.975)) {
library(FD)
obs_fn <- function(tr) {
res <- FD::dbFD(scale(tr), comm, m = ndim,
calc.FRic = TRUE, print.pco = FALSE)
res[[metric]]
}
obs <- obs_fn(traits)
null <- replicate(nperm, {
tr_null <- traits[sample(nrow(traits)), ]
rownames(tr_null) <- rownames(traits)
obs_fn(tr_null)
})
ses <- (obs - rowMeans(null)) / apply(null, 1, sd)
pval <- rowMeans(null <= obs)
data.frame(site = rownames(comm),
obs = obs,
ses = ses,
pval = pval,
ci_low = apply(null, 1, quantile, probs[1]),
ci_hi = apply(null, 1, quantile, probs[2]))
}