R/jackknife.R

Defines functions jackknife

Documented in jackknife

#' 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)

}
juoe/sdmflow documentation built on Feb. 23, 2020, 7:38 p.m.