#' Do jackknife test of variable importance using Maxent models
#'
#' @param data A sdmflow dataframe with fitted models
#' @param varlist names list with variables to select
#' @param n_cores number of cores to use for parallel processing
#'
#' @return A data frame with jackknife results
#' @export
jackknife <- function(data, varlist, n_cores) {
data <- data %>% dplyr::select(train, test, data_name, predictor_name, sampling_name, resampling_name)
dat <- map_dfr(1:nrow(data), function(i){
r <- dplyr::slice(data, i)
df <- as.data.frame(r$train[[1]])
out1 <- map_dfr(1:length(varlist), function(j){
dplyr::mutate(r, train = list(dplyr::select(df, varlist[[j]], "occ", "id")))
})
out1$subset <- names(varlist)
out1$subset_type <- "with"
out2 <- map_dfr(1:length(varlist), function(j){
dplyr::mutate(r, train = list(dplyr::select(df, -one_of(varlist[[j]]), "occ", "id")))
})
out2$subset <- names(varlist)
out2$subset_type <- "without"
dplyr::bind_rows(out1, out2)
})
cl <- parallel::makeCluster(n_cores)
doParallel::registerDoParallel(cl)
loaded_pkgs <- .packages()
model_list <- foreach::foreach(r = iterators::iter(dat, by = "row"),
.packages = loaded_pkgs) %dopar% {
train_df <- r$train[[1]]
test_df <- as.data.frame(r$test[[1]])
m <- dismo::maxent(train_df %>% dplyr::select(-one_of("occ", "id")),
train_df %>% dplyr:: pull(occ))
r <- r %>% mutate(prediction = list(predict(m, test_df)))
score_models(r, metrics = "auc")
}
parallel::stopCluster(cl)
out <- do.call(dplyr::bind_rows, model_list)
return(out)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.