Impute missing trait values using MICE (Multiple Imputation by Chained Equations). Returns a completed data frame averaged over m imputations.
mice_impute <- function(df, m = 5, method = "pmm", seed = 42) {
if (!requireNamespace("mice", quietly = TRUE)) install.packages("mice")
library(mice)
sp_col <- if ("species" %in% names(df)) "species" else rownames(df)
num_cols <- names(df)[sapply(df, is.numeric)]
imp <- mice(df[, num_cols], m = m, method = method,
seed = seed, printFlag = FALSE)
# Average over all imputations
completed <- Reduce("+", lapply(1:m, function(i) complete(imp, i))) / m
df[, num_cols] <- completed
df
}
# Example
# mice_impute(trait_matrix, m = 10)
# ── Example ──────────────────────────────────────────────────────
df <- airquality[, 1:4] # has real NAs in Ozone and Solar.R
cat("NAs before:", sum(is.na(df)), "
")
df_imp <- mice_impute(df, m = 5)
cat("NAs after: ", sum(is.na(df_imp)), "
")