null_model_FD(comm, traits, nperm, metric)

Compute standardised effect sizes (SES) for a functional diversity metric against a null model (random species shuffling). Returns SES, p-value and CI.

functional diversitynull models
Args:comm — community matrixtraits — trait matrixnperm=999metric="FRic"
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]))
}