From 1cb1e37f5647289222d8c45547068f54d9bc78ee Mon Sep 17 00:00:00 2001 From: bgcasey Date: Sat, 3 Oct 2026 14:23:45 -0600 Subject: [PATCH 01/16] Add grid_summary.csv to tracked output tables in .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 60171cd..3b432fd 100644 --- a/.gitignore +++ b/.gitignore @@ -66,6 +66,7 @@ vignettes/*.pdf !3_output/**/tables/parity_summary.csv !3_output/**/tables/coverage.csv !3_output/**/tables/metric_summary.csv +!3_output/**/tables/grid_summary.csv !3_output/**/tables/v2_self_agreement_summary.csv AGENTS.md From 11cb64623e58e29318ba2b9c6026788f40b9ee47 Mon Sep 17 00:00:00 2001 From: bgcasey Date: Sat, 3 Oct 2026 14:24:11 -0600 Subject: [PATCH 02/16] Refactor framework design and documentation - Removed obsolete 'cap' file. - Updated framework design documentation to reflect changes in the pipeline structure and method organization. - Added a comprehensive 'getting started' guide for running the v2 baseline, reading outputs, and testing changes. - Enhanced clarity on the roles of specs, stages, engines, and selection rules in the modeling process. - Improved organization of methods and modules for better maintainability and usability. --- 1_code/.gitkeep | 1 - 1_code/_deprecated/01_bootstrap_ids.R | 233 --- 1_code/_deprecated/02_hierarchical_models.R | 525 ------ 1_code/_deprecated/03_model_validation.R | 285 --- 1_code/_deprecated/README.md | 51 - 1_code/_deprecated/covar_attach.R | 46 - 1_code/_deprecated/data_load.R | 39 - 1_code/_deprecated/data_split.R | 39 - 1_code/_deprecated/eval_metrics.R | 41 - .../exp_000_parity_v2/01_collect_results.R | 63 - .../exp_000_parity_v2/02_compare_to_v2.R | 52 - .../exp_000_parity_v2/03_build_report.R | 50 - .../_deprecated/exp_000_parity_v2/README.md | 97 - 1_code/_deprecated/exp_000_parity_v2/run.R | 253 --- .../exp_000_parity_v2/utils/species_lists.R | 49 - 1_code/_deprecated/load_model_data.R | 443 ----- .../bootstrapping_functions.R | 130 -- .../hierarchical-model_functions.R | 981 ---------- .../model-validation_functions.R | 232 --- 1_code/_deprecated/plants_module/spec.R | 207 --- 1_code/_setup/02_validate_test_dataset.R | 72 + 1_code/_setup/09_harmonize_lookups.R | 398 ++++ 1_code/experiments/.gitkeep | 1 - .../utils => _shared}/focal_species.R | 15 +- 1_code/experiments/_template/README.md | 40 + 1_code/experiments/_template/run.R | 73 + 1_code/experiments/exp_000_parity_v2/.gitkeep | 1 - .../exp_000_parity_v2/01_collect_results.R | 258 --- ...{02_compare_to_v2.R => 01_compare_to_v2.R} | 84 +- .../{04_plot_parity.R => 02_plot_parity.R} | 32 +- .../exp_000_parity_v2/03_build_report.R | 147 +- .../experiments/exp_000_parity_v2/README.md | 40 +- 1_code/experiments/exp_000_parity_v2/run.R | 609 ++---- 1_code/harness/.gitkeep | 1 - 1_code/harness/cache.R | 79 + 1_code/harness/compare.R | 208 +++ 1_code/harness/covariate_sets.R | 14 +- 1_code/harness/data_load.R | 246 ++- 1_code/harness/engines.R | 603 +++--- 1_code/harness/eval_metrics.R | 253 +-- 1_code/harness/experiment.R | 447 +++++ 1_code/harness/harness.R | 155 +- 1_code/harness/model_sets.R | 36 +- 1_code/harness/predict_grid.R | 118 +- 1_code/harness/registry.R | 415 +++++ 1_code/harness/resample.R | 382 +--- 1_code/harness/result.R | 140 +- 1_code/harness/run_model.R | 1640 ++++++++--------- 1_code/harness/run_record.R | 215 +-- 1_code/harness/selection.R | 950 ++-------- 1_code/harness/spec.R | 512 +++++ 1_code/harness/species.R | 247 +-- 1_code/harness/summarise.R | 361 ++++ 1_code/harness/utils/step_runner.R | 109 -- 1_code/methods/README.md | 129 ++ 1_code/methods/_templates/engine_template.R | 94 + .../methods/_templates/selection_template.R | 80 + 1_code/methods/engines/_glm_family.R | 258 +++ 1_code/methods/engines/bayesglm.R | 83 + 1_code/methods/engines/glm.R | 55 + 1_code/methods/metrics/auc.R | 64 + 1_code/methods/metrics/calibration_slope.R | 46 + 1_code/methods/metrics/deviance_explained.R | 62 + 1_code/methods/metrics/n.R | 37 + 1_code/methods/metrics/prevalence.R | 41 + 1_code/methods/metrics/rmse.R | 37 + 1_code/methods/metrics/spearman.R | 44 + 1_code/methods/resampling/precomputed.R | 194 ++ 1_code/methods/resampling/spatial_block.R | 181 ++ 1_code/methods/resampling/spatial_cv.R | 109 ++ 1_code/methods/selection/aic_average.R | 107 ++ 1_code/methods/selection/aic_best.R | 59 + 1_code/methods/selection/aic_best_grid.R | 109 ++ 1_code/methods/selection/aic_best_onehot.R | 184 ++ 1_code/methods/selection/ivw_grid.R | 200 ++ 1_code/methods/selection/single.R | 59 + 1_code/methods/selection/staged_bic.R | 124 ++ 1_code/modules/.gitkeep | 1 - 1_code/modules/_shared/plant_group.R | 394 +++- 1_code/modules/_shared/standard_specs.R | 50 + 1_code/modules/birds/.gitkeep | 1 - 1_code/modules/birds/spec.R | 8 +- 1_code/modules/birds/standardize.R | 27 + 1_code/modules/mammals/.gitkeep | 1 - 1_code/modules/mammals/hurdle.R | 42 +- 1_code/modules/mammals/spec.R | 22 +- 1_code/tests/compare_stores.R | 203 ++ 1_code/tests/run_tests.R | 43 + 1_code/tests/testthat/test-dataset.R | 78 + 1_code/tests/testthat/test-methods.R | 90 + 1_code/tests/testthat/test-results.R | 112 ++ 1_code/tests/testthat/test-specs.R | 55 + README.md | 393 ++-- cap | 2 - docs/framework_design.md | 177 +- docs/getting_started.md | 250 +++ 96 files changed, 8770 insertions(+), 8253 deletions(-) delete mode 100644 1_code/.gitkeep delete mode 100644 1_code/_deprecated/01_bootstrap_ids.R delete mode 100644 1_code/_deprecated/02_hierarchical_models.R delete mode 100644 1_code/_deprecated/03_model_validation.R delete mode 100644 1_code/_deprecated/README.md delete mode 100644 1_code/_deprecated/covar_attach.R delete mode 100644 1_code/_deprecated/data_load.R delete mode 100644 1_code/_deprecated/data_split.R delete mode 100644 1_code/_deprecated/eval_metrics.R delete mode 100644 1_code/_deprecated/exp_000_parity_v2/01_collect_results.R delete mode 100644 1_code/_deprecated/exp_000_parity_v2/02_compare_to_v2.R delete mode 100644 1_code/_deprecated/exp_000_parity_v2/03_build_report.R delete mode 100644 1_code/_deprecated/exp_000_parity_v2/README.md delete mode 100644 1_code/_deprecated/exp_000_parity_v2/run.R delete mode 100644 1_code/_deprecated/exp_000_parity_v2/utils/species_lists.R delete mode 100644 1_code/_deprecated/load_model_data.R delete mode 100644 1_code/_deprecated/plants_functions/bootstrapping_functions.R delete mode 100644 1_code/_deprecated/plants_functions/hierarchical-model_functions.R delete mode 100644 1_code/_deprecated/plants_functions/model-validation_functions.R delete mode 100644 1_code/_deprecated/plants_module/spec.R create mode 100644 1_code/_setup/09_harmonize_lookups.R delete mode 100644 1_code/experiments/.gitkeep rename 1_code/experiments/{exp_000_parity_v2/utils => _shared}/focal_species.R (93%) create mode 100644 1_code/experiments/_template/README.md create mode 100644 1_code/experiments/_template/run.R delete mode 100644 1_code/experiments/exp_000_parity_v2/.gitkeep delete mode 100644 1_code/experiments/exp_000_parity_v2/01_collect_results.R rename 1_code/experiments/exp_000_parity_v2/{02_compare_to_v2.R => 01_compare_to_v2.R} (89%) rename 1_code/experiments/exp_000_parity_v2/{04_plot_parity.R => 02_plot_parity.R} (96%) delete mode 100644 1_code/harness/.gitkeep create mode 100644 1_code/harness/cache.R create mode 100644 1_code/harness/compare.R create mode 100644 1_code/harness/experiment.R create mode 100644 1_code/harness/registry.R create mode 100644 1_code/harness/spec.R create mode 100644 1_code/harness/summarise.R delete mode 100644 1_code/harness/utils/step_runner.R create mode 100644 1_code/methods/README.md create mode 100644 1_code/methods/_templates/engine_template.R create mode 100644 1_code/methods/_templates/selection_template.R create mode 100644 1_code/methods/engines/_glm_family.R create mode 100644 1_code/methods/engines/bayesglm.R create mode 100644 1_code/methods/engines/glm.R create mode 100644 1_code/methods/metrics/auc.R create mode 100644 1_code/methods/metrics/calibration_slope.R create mode 100644 1_code/methods/metrics/deviance_explained.R create mode 100644 1_code/methods/metrics/n.R create mode 100644 1_code/methods/metrics/prevalence.R create mode 100644 1_code/methods/metrics/rmse.R create mode 100644 1_code/methods/metrics/spearman.R create mode 100644 1_code/methods/resampling/precomputed.R create mode 100644 1_code/methods/resampling/spatial_block.R create mode 100644 1_code/methods/resampling/spatial_cv.R create mode 100644 1_code/methods/selection/aic_average.R create mode 100644 1_code/methods/selection/aic_best.R create mode 100644 1_code/methods/selection/aic_best_grid.R create mode 100644 1_code/methods/selection/aic_best_onehot.R create mode 100644 1_code/methods/selection/ivw_grid.R create mode 100644 1_code/methods/selection/single.R create mode 100644 1_code/methods/selection/staged_bic.R delete mode 100644 1_code/modules/.gitkeep create mode 100644 1_code/modules/_shared/standard_specs.R delete mode 100644 1_code/modules/birds/.gitkeep delete mode 100644 1_code/modules/mammals/.gitkeep create mode 100644 1_code/tests/compare_stores.R create mode 100644 1_code/tests/run_tests.R create mode 100644 1_code/tests/testthat/test-dataset.R create mode 100644 1_code/tests/testthat/test-methods.R create mode 100644 1_code/tests/testthat/test-results.R create mode 100644 1_code/tests/testthat/test-specs.R delete mode 100644 cap create mode 100644 docs/getting_started.md diff --git a/1_code/.gitkeep b/1_code/.gitkeep deleted file mode 100644 index 8b13789..0000000 --- a/1_code/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/1_code/_deprecated/01_bootstrap_ids.R b/1_code/_deprecated/01_bootstrap_ids.R deleted file mode 100644 index 5899935..0000000 --- a/1_code/_deprecated/01_bootstrap_ids.R +++ /dev/null @@ -1,233 +0,0 @@ -# --- -# title: Generate Bootstrap Site Ids (Plant Groups) -# author: Brendan Casey -# created: 2026-09-08 -# inputs: -# set by the calling experiment, or defaulted in 1.2: -# - taxon, data_dir, run_dir, species_subset, boot_iter, -# n_clusters -# in data_dir: -# - .csv, sites.csv, covariates/, lookup/ -# in this repository: -# - 1_code/modules/plants/load_model_data.R -# - 1_code/modules/plants/functions/bootstrapping_functions.R -# outputs: -# in run_dir: -# - bootstrap/-bootstrap-ids.Rdata (bootstrap.ids) -# notes: -# - Rewrite of the v2 script 01b_bootstrapping.R, which held -# the same four blocks one after another in a single file and -# wrote back over the model-data files. This one takes the -# taxon as a parameter and writes only the bootstrap ids, so -# nothing in 0_data/ is modified by a run. -# - Each species gets its own set of ids because the thinning -# depends on where that species was detected. Iteration 1 is -# the complete data set by construction, and 2 onward -# resample sites within spatial blocks with replacement. -# - The block grid is the v2 grid: longitude cut at -121, -116, -# -112 and -109, latitude at 48, 51, 54, 57 and 61, with the -# interaction relabelled a, b, c and so on. -# - The ids are SiteYearQu values, which is what the -# hierarchical models and the validation both index on. -# - Bootstrapping resamples, so a run is only reproducible if -# the seed is fixed. v2 set none. `boot_seed` defaults to -# NULL, which reproduces v2 exactly; set it to make a run -# repeatable. -# - The species selection is `species_subset`, not `species`. -# The v2 code loops with `for (species in species.list)`, -# which would otherwise overwrite the selection and leave the -# next stage running on one species. -# - Future improvement - ids are generated for every modelled -# species even when a later stage runs on a subset, because -# the v2 code reads them as boot.data[[species]] and ignores -# extras. Passing `species` here narrows both. -# --- - -# 1. Setup ---- - -## 1.1 Load packages ---- -library(foreach) # sequential %dopar% loop, as in v2 (version: 1.5.2) -library(parallel) # species-level parallelism (version: 4.5.0) - -## 1.2 Configure the run ---- -# Values a calling experiment has already set are kept, so this -# script runs either from 1_code/experiments/ or on its own. -if (!exists("project_root", inherits = FALSE)) { - project_root <- normalizePath(getwd(), winslash = "/") -} - -if (!exists("taxon", inherits = FALSE)) { - taxon <- "bryophyte" -} - -if (!exists("data_dir", inherits = FALSE)) { - data_dir <- file.path(project_root, "0_data/test_dataset") -} - -if (!exists("run_dir", inherits = FALSE)) { - run_dir <- file.path(project_root, "2_pipeline/plants") -} - -# NULL generates ids for every species the snapshot declares as -# modelled. -if (!exists("species_subset", inherits = FALSE)) { - species_subset <- NULL -} - -# The v2 defaults. 01b used 16 cores where 02 used 14. -if (!exists("boot_iter", inherits = FALSE)) { - boot_iter <- 1:100 -} - -if (!exists("n_clusters", inherits = FALSE)) { - n_clusters <- 16 -} - -# Minimum detections for a region's model to be considered -# viable, as in v2. -if (!exists("boot_threshold", inherits = FALSE)) { - boot_threshold <- 20 -} - -# NULL leaves the stream unseeded, which is what v2 did. -if (!exists("boot_seed", inherits = FALSE)) { - boot_seed <- NULL -} - -## 1.3 Load functions and data ---- -source(file.path( - project_root, "1_code/modules/plants/load_model_data.R" -)) -source(file.path( - project_root, - "1_code/modules/plants/functions/bootstrapping_functions.R" -)) - -model_data <- load_plant_model_data( - taxon = taxon, - data_dir = data_dir, - species = species_subset -) - -climate.data <- model_data$climate.data - -species.list <- unique(c( - model_data$veg.species.list, - model_data$soil.species.list -)) - -## 1.4 Create the output folder ---- -# save() does not create a missing folder. -dir.create( - file.path(run_dir, "bootstrap"), - recursive = TRUE, showWarnings = FALSE -) - -# 2. Define the bootstrap blocks ---- -# Sites are resampled within coarse latitude and longitude -# blocks, so a bootstrap sample keeps the geographic spread of -# the original data rather than drifting toward whichever region -# happens to be best surveyed. - -## 2.1 Cut the study area into blocks ---- -site.block <- data.frame( - LongBlock = cut( - climate.data$Long, c(-121, -116, -112, -109) - ), - LatBlock = cut( - climate.data$Lat, c(48, 51, 54, 57, 61) - ) -) - -site.block$Block <- interaction( - droplevels(site.block$LongBlock), - droplevels(site.block$LatBlock), - sep = "::", - drop = TRUE -) - -## 2.2 Relabel the blocks ---- -# bootstrap_data() selects a block with grep(), so the labels -# have to be free of the regex metacharacters that the interval -# notation above is full of. -reclass.site <- data.frame( - Orig = unique(site.block$Block), - Update = letters[1:length(unique(site.block$Block))] -) - -climate.data$Block <- reclass.site$Update[ - match(site.block$Block, reclass.site$Orig) -] - -rm(site.block, reclass.site) - -# 3. Generate the bootstrap ids ---- -# One set of ids per species, because the viability checks inside -# bootstrap_data() depend on where that species was detected. - -## 3.1 Define cores and objects for parallel processing ---- -if (!is.null(boot_seed)) { - set.seed(boot_seed) -} - -core.input <- makeCluster(n_clusters) - -if (!is.null(boot_seed)) { - clusterSetRNGStream(core.input, boot_seed) -} - -clusterExport( - core.input, - c("climate.data", "species.list", "boot_iter", "boot_threshold", - "bootstrap_data") -) - -cat( - "Bootstrapping ", taxon, ": ", length(species.list), - " species x ", length(boot_iter), " iterations on ", - n_clusters, " cores\n", - sep = "" -) - -## 3.2 Loop through each species ---- -bootstrap.list <- foreach(species = species.list) %dopar% - - parSapply( - core.input, - as.list(boot_iter), - FUN = function(boot) { - tryCatch( - bootstrap_data( - data = climate.data, - species = species, - threshold = boot_threshold, - boot = boot - ), - error = function(e) e - ) - } - ) - -names(bootstrap.list) <- species.list - -stopCluster(core.input) - -## 3.3 Simplify to one array per species ---- -bootstrap.ids <- list() - -for (one_species in species.list) { - bootstrap.ids[[one_species]] <- simplify2array( - bootstrap.list[[one_species]] - ) -} - -# 4. Save the results ---- -bootstrap_path <- file.path( - run_dir, "bootstrap", paste0(taxon, "-bootstrap-ids.Rdata") -) - -save(bootstrap.ids, file = bootstrap_path) - -cat("Wrote ", bootstrap_path, "\n", sep = "") - -# End of script ---- diff --git a/1_code/_deprecated/02_hierarchical_models.R b/1_code/_deprecated/02_hierarchical_models.R deleted file mode 100644 index 7892984..0000000 --- a/1_code/_deprecated/02_hierarchical_models.R +++ /dev/null @@ -1,525 +0,0 @@ -# --- -# title: Fit Bootstrapped Hierarchical Models (Plant Groups) -# author: Brendan Casey -# created: 2026-09-08 -# inputs: -# set by the calling experiment, or defaulted in 1.2: -# - taxon, data_dir, run_dir, species_subset, boot_iter, -# n_clusters -# in data_dir: -# - .csv, sites.csv, covariates/, lookup/ -# in run_dir: -# - bootstrap/-bootstrap-ids.Rdata, from 01 -# in this repository: -# - 1_code/modules/plants/load_model_data.R -# - 1_code/modules/plants/functions/ -# hierarchical-model_functions.R -# outputs: -# in run_dir: -# - models/-species-models.Rdata -# (climate.coef, vegetation.coef, soil.coef) -# notes: -# - Rewrite of the v2 scripts 02a-02d, which were four -# near-identical files. They differed only in the taxon they -# loaded and in whether they fitted a Protocol term, so they -# are one script here, parameterized by `taxon`. The formula -# text in section 2 is the v2 text verbatim, and the Protocol -# term is inserted for the taxa whose v2 script carried it, -# which reproduces all 42 formulas of both variants exactly. -# - The v2 scripts read a -model-data.Rdata that 01a -# built against paths on the v2 project. This one reads the -# harmonized test dataset, so a run needs only this -# repository and 0_data/test_dataset/. -# - Output location is the caller's to choose. v2 hard-coded -# 3_output/models/; here run_dir comes from the experiment. -# - All three model sets are defined in section 2, before any -# of them is fitted. v2 defined each set immediately before -# fitting it, which meant a model naming a habitat type its -# prediction matrix had no column for failed only after the -# climate models had already run. -# - The species selection is `species_subset`, not `species`. -# The v2 code loops with `for (species in species.list)`, -# which would otherwise overwrite the selection and leave the -# next stage running on one species. -# - boot_iter and n_clusters were hard-coded in v2 as 1:100 and -# 14. They are parameters here, but they default to the v2 -# values, so a parity run sets neither. -# - The v2 code took its vegetation coefficient names -# positionally, as colnames(veg.data)[403:489] and three -# other per-taxon spans. load_model_data.R names them -# instead; see its header for why. -# - foreach() runs with no backend registered, exactly as in -# v2, so the outer %dopar% is sequential and the parallelism -# is the inner parSapply over bootstraps. Left as it is: -# registering a backend would change the run, not just its -# speed. -# - Future improvement - the three model sets differ only in -# their data, formulas and fitting function, so sections 3 to -# 5 could share one helper rather than repeating the cluster -# setup. -# --- - -# 1. Setup ---- - -## 1.1 Load packages ---- -library(foreach) # sequential %dopar% loop, as in v2 (version: 1.5.2) -library(parallel) # bootstrap-level parallelism (version: 4.5.0) - -## 1.2 Configure the run ---- -# Values a calling experiment has already set are kept, so this -# script runs either from 1_code/experiments/ or on its own. -if (!exists("project_root", inherits = FALSE)) { - project_root <- normalizePath(getwd(), winslash = "/") -} - -if (!exists("taxon", inherits = FALSE)) { - taxon <- "bryophyte" -} - -if (!exists("data_dir", inherits = FALSE)) { - data_dir <- file.path(project_root, "0_data/test_dataset") -} - -if (!exists("run_dir", inherits = FALSE)) { - run_dir <- file.path(project_root, "2_pipeline/plants") -} - -# NULL models every species the snapshot declares as modelled. -if (!exists("species_subset", inherits = FALSE)) { - species_subset <- NULL -} - -# The v2 defaults. Lower them for a smoke test. -if (!exists("boot_iter", inherits = FALSE)) { - boot_iter <- 1:100 -} - -if (!exists("n_clusters", inherits = FALSE)) { - n_clusters <- 14 -} - -## 1.3 Load functions and data ---- -source(file.path( - project_root, "1_code/modules/plants/load_model_data.R" -)) -source(file.path( - project_root, - "1_code/modules/plants/functions/hierarchical-model_functions.R" -)) - -model_data <- load_plant_model_data( - taxon = taxon, - data_dir = data_dir, - species = species_subset -) - -climate.data <- model_data$climate.data -veg.data <- model_data$veg.data -soil.data <- model_data$soil.data - -veg.species.list <- model_data$veg.species.list -soil.species.list <- model_data$soil.species.list -species.list <- unique(c(veg.species.list, soil.species.list)) - -## 1.4 Load the bootstrap ids ---- -# Written by 01_bootstrap_ids.R into the same run_dir. -bootstrap_path <- file.path( - run_dir, "bootstrap", paste0(taxon, "-bootstrap-ids.Rdata") -) - -if (!file.exists(bootstrap_path)) { - stop( - "No bootstrap ids at ", - bootstrap_path, - "\nRun 1_code/modules/plants/01_bootstrap_ids.R first.", - call. = FALSE - ) -} - -load(bootstrap_path) - -## 1.5 Set the Protocol term for this taxon ---- -# v2 fitted Protocol for bryophytes and lichens, and not for -# mites or vascular plants. plant_taxa() is the record of which. -use_protocol <- taxon_uses_protocol(taxon) - -# In v2 the two Protocol scripts were their non-Protocol -# counterparts with the term inserted directly after Climate, and -# nowhere else. Applying that rule to the formula text in section -# 2 reproduces both variants exactly. -# -# The environment is set to the global environment, matching v2, -# where every formula was built at the top level. -build_models <- function(model_text, protocol = use_protocol) { - lapply( - model_text, - function(one) { - if (protocol) { - one <- sub( - "pcount ~ Climate", - "pcount ~ Climate + Protocol", - one, - fixed = TRUE - ) - } - - as.formula(one, env = globalenv()) - } - ) -} - -# Prefix for the coefficient templates, for the same reason. -coef_prefix <- if (use_protocol) { - c("Intercept", "Climate", "Protocol") -} else { - c("Intercept", "Climate") -} - -## 1.6 Create the output folder ---- -# save() does not create a missing folder, so a run would -# otherwise fail after the modelling rather than before it. -dir.create( - file.path(run_dir, "models"), - recursive = TRUE, showWarnings = FALSE -) - -cat( - "Fitting ", taxon, ": ", length(species.list), " species x ", - length(boot_iter), " bootstraps on ", n_clusters, " cores\n", - sep = "" -) - -# 2. Define the model sets ---- -# Everything the three fitting sections need, built before any of -# them runs, so a mismatch between a model and its prediction -# matrix is found in seconds rather than after the climate models -# have been fitted. - -## 2.1 Define climate models ---- -# The climate formulas carry no Protocol term in either v2 -# variant, so they are built without one. -climate.model.text <- c( - "pcount ~ 1", - "pcount ~ PET", - "pcount ~ CMD", - "pcount ~ MAT", - "pcount ~ FFP", - "pcount ~ MAP + FFP", - "pcount ~ MAP + FFP + CMD", - "pcount ~ MAP + PET + CMD + MAPPET", - "pcount ~ MAT + MAP + CMD + CMDMAT", - "pcount ~ MAT + MAP", - "pcount ~ MWMT + TD", - "pcount ~ CMD + PET", - "pcount ~ MAT + MAT2 + MWMT + MWMT2", - "pcount ~ TD + FFP + MAT" -) - -climate.models <- build_models( - climate.model.text, protocol = FALSE -) - -bioclim.model.text <- c( - ".~.+ bio9 + bio15" -) - -bioclim.models <- build_models( - bioclim.model.text, protocol = FALSE -) - -## 2.2 Define spatial models ---- -space.model.text <- c( - ".~.+ Easting + Northing", - ".~.+ Easting + Northing + EastingNorthing", - ".~.+ Easting + Northing + Easting2 + Northing2 + EastingNorthing" -) - -space.models <- build_models(space.model.text, protocol = FALSE) - -## 2.3 Define the prediction matrices ---- -# Both are needed for the checks below, so unlike v2 they are -# held under separate names rather than one reused -# prediction.matrix. -veg.prediction.matrix <- model_data$veg.pm -rownames(veg.prediction.matrix) <- veg.prediction.matrix$VegType -veg.prediction.matrix <- veg.prediction.matrix[, -1] - -soil.prediction.matrix <- model_data$soil.pm -rownames(soil.prediction.matrix) <- soil.prediction.matrix$VegType -soil.prediction.matrix <- soil.prediction.matrix[, -1] - -## 2.4 Define vegetation models ---- -vegetation.model.text <- c( - "pcount ~ Climate + WhiteSpruce + Pine + Deciduous + Mixedwood + BlackSpruce + TreedFen + TreedSwamp + GraminoidFen + ShrubbyFen + ShrubbyBog + ShrubbySwamp + Marsh + Grass + Shrub + CCWhiteSpruceR + CCWhiteSpruce1 + CCWhiteSpruce234 + CCPineR + CCPine1234 + CCDecidMixedR + CCDecidMixed1 + CCDecidMixed234 + HardLin + EnSeismic + EnSoftLin + TrSoftLin + UrbInd + Wellsites + Crop + RoughP + TameP", - "pcount ~ Climate + WhiteSpruce + Pine + Deciduous + Mixedwood + Peatland + Mineral + Grass + Shrub + CCWhiteSpruceR + CCWhiteSpruce1 + CCWhiteSpruce234 + CCPineR + CCPine1234 + CCDecidMixedR + CCDecidMixed1 + CCDecidMixed234 + HardLin + EnSeismic + EnSoftLin + TrSoftLin + UrbInd + Wellsites + Crop + RoughP + TameP", - "pcount ~ Climate + WhiteSpruce + Pine + Deciduous + Mixedwood + Bog + TreedFen + + NonTreedFen + TreedSwamp + ShrubbySwamp + Marsh + Grass + Shrub + CCWhiteSpruceR + CCWhiteSpruce1 + CCWhiteSpruce234 + CCPineR + CCPine1234 + CCDecidMixedR + CCDecidMixed1 + CCDecidMixed234 + HardLin + EnSeismic + EnSoftLin + TrSoftLin + UrbInd + Wellsites + Crop + RoughP + TameP", - "pcount ~ Climate + WhiteSpruce + Pine + Deciduous + Mixedwood + Bog + Fen + TreedSwamp + ShrubbySwamp + Marsh + Grass + Shrub + CCWhiteSpruceR + CCWhiteSpruce1 + CCWhiteSpruce234 + CCPineR + CCPine1234 + CCDecidMixedR + CCDecidMixed1 + CCDecidMixed234 + HardLin + EnSeismic + EnSoftLin + TrSoftLin + UrbInd + Wellsites + Crop + RoughP + TameP", - "pcount ~ Climate + WhiteSpruce + Pine + Deciduous + Mixedwood + Bog + Fen + Swamp + Marsh + GrassShrub + CCWhiteSprucePineR + CCWhiteSprucePine1 + CCWhiteSprucePine234 + CCDecidMixedR + CCDecidMixed1 + CCDecidMixed234 + HardLin + SoftLin + UrbInd + Wellsites + Crop + RoughP + TameP", - "pcount ~ Climate + WhiteSpruce + Pine + Deciduous + Mixedwood + Peatland + Mineral + GrassShrub + CCWhiteSprucePineR1234 + CCDecidMixedR1234 + HardLin + SoftLin + UrbIndWellsites + Crop + Pasture", - "pcount ~ Climate + WhiteSpruce + Pine + Deciduous + Mixedwood + Lowland + GrassShrub + CCWhiteSprucePineR1234 + CCDecidMixedR1234 + SoftLin + Alien", - "pcount ~ Climate + Upland + BlackSpruce + TreedFen + TreedSwamp + GraminoidFen + ShrubbyFen + ShrubbyBog + ShrubbySwamp + Marsh + Grass + Shrub + CCR1234 + HardLin + EnSeismic + EnSoftLin + TrSoftLin + UrbInd + Wellsites + Crop + RoughP + TameP", - "pcount ~ Climate + Upland + Bog + Fen + Swamp + Marsh + Grass + Shrub + CCR1234 + HardLin + EnSeismic + EnSoftLin + TrSoftLin + UrbInd + Wellsites + Crop + RoughP + TameP", - "pcount ~ Climate + Upland + Peatland + Swamp + Marsh + GrassShrub + CCR1234 + HardLin + SoftLin + UrbInd + Wellsites + Crop + RoughP + TameP", - "pcount ~ Climate + Upland + Peatland + Mineral + GrassShrub + CCR1234 + HardLin + SoftLin + UrbIndWellsites + Crop + Pasture", - "pcount ~ Climate + Upland + Lowland + GrassShrub + CCR1234 + SoftLin + Alien" -) - -vegetation.models <- build_models(vegetation.model.text) - -## 2.5 Define soil models ---- -soil.model.text <- c( - "pcount ~ Climate + Blowout + ClaySub + Loamy + RapidDrain + SandyLoam + ThinBreak + Other + UrbInd + Wellsites + Crop + TameP + RoughP + EnSoftLin + EnSeismic + TrSoftLin + HardLin", - "pcount ~ Climate + Blowout + ClaySubThin + Loamy + SandyRapid + Other + UrbInd+ Wellsites + Crop + TameP + RoughP + EnSoftLin + EnSeismic + TrSoftLin + HardLin", - "pcount ~ Climate + Productive + Nonproductive + Other + UrbInd + Wellsites + Crop + TameP + RoughP + EnSoftLin + EnSeismic + TrSoftLin + HardLin", - "pcount ~ Climate + Blowout + ClaySub + Loamy + RapidDrain + SandyLoam + ThinBreak + Other + UrbIndWellsites + Crop + Pasture + SoftLin + HardLin", - "pcount ~ Climate + Blowout + ClaySubThin + Loamy + SandyRapid + Other + UrbIndWellsites + Crop + Pasture + SoftLin + HardLin", - "pcount ~ Climate + Productive + Nonproductive + Other + UrbIndWellsites + Crop + Pasture + SoftLin + HardLin", - "pcount ~ Climate + Productive + Nonproductive + Other + UrbIndWellsites + Cult + SoftLin + HardLin", - "pcount ~ Climate + Productive + Nonproductive + Other + Alien + SoftLin", - "pcount ~ Climate + Blowout + ClaySub + Loamy + RapidDrain + SandyLoam + ThinBreak + Other + UrbInd + Wellsites + Crop + TameP + RoughP + EnSoftLin + EnSeismic + TrSoftLin + HardLin + paspen", - "pcount ~ Climate + Blowout + ClaySubThin + Loamy + SandyRapid + Other + UrbInd + Wellsites + Crop + TameP + RoughP + EnSoftLin + EnSeismic + TrSoftLin + HardLin + paspen", - "pcount ~ Climate + Productive + Nonproductive + Other + UrbInd + Wellsites + Crop + TameP + RoughP + EnSoftLin + EnSeismic + TrSoftLin + HardLin + paspen", - "pcount ~ Climate + Blowout + ClaySub + Loamy +RapidDrain + SandyLoam + ThinBreak + Other + UrbIndWellsites + Crop + Pasture + SoftLin + HardLin + paspen", - "pcount ~ Climate + Blowout + ClaySubThin + Loamy + SandyRapid + Other + UrbIndWellsites + Crop + Pasture + SoftLin + HardLin + paspen", - "pcount ~ Climate + Productive + Nonproductive + Other + UrbIndWellsites + Crop + Pasture + SoftLin + HardLin + paspen", - "pcount ~ Climate + Productive + Nonproductive + Other + UrbIndWellsites + Cult + SoftLin + HardLin + paspen", - "pcount ~ Climate + Productive + Nonproductive + Other + Alien + SoftLin + paspen" -) - -soil.models <- build_models(soil.model.text) - -## 2.6 Check the models against the prediction matrices ---- -# Every habitat term is predicted onto a column of its prediction -# matrix after fitting, so a term with no column cannot be -# predicted. In v2 that surfaced as `object '' not found` -# raised inside every bootstrap of every species. -pm_source_note <- paste0( - "\nThe matrices in ", data_dir, "/lookup/ are written from ", - "the\nsnapshot's veg.pm and soil.pm. The v2 scripts instead ", - "read\nveg-prediction-matrix-CC_2024.csv and\n", - "soil-prediction-matrix_2024.csv from the v2 project, which\n", - "carry the aggregate habitat columns the snapshot copies do\n", - "not. Set SDM_V2_LOOKUP to the folder holding those two files\n", - "and re-run 1_code/_setup/01_harmonize_model_ready_v2.R." -) - -check_prediction_terms( - vegetation.models, veg.prediction.matrix, "vegetation", - pm_source_note -) - -check_prediction_terms( - soil.models, soil.prediction.matrix, "soil", pm_source_note -) - -## 2.7 Define the coefficient templates ---- -# The vegetation template is the 87 habitat types, named by -# load_model_data.R rather than taken positionally. -veg.coef.names <- c(coef_prefix, model_data$veg_coef_names) -veg.coef.template <- rep(NA, length(veg.coef.names)) -names(veg.coef.template) <- veg.coef.names - -soil.coef.names <- c( - "paspen", - "Loamy", - "SandyLoam", - "ClaySub", - "RapidDrain", - "Blowout", - "ThinBreak", - "Other", - "EnSeismic", - "EnSoftLin", - "TrSoftLin", - "HardLin", - "UrbInd", - "Wellsites", - "Crop", - "TameP", - "RoughP" -) - -soil.coef.template.names <- c(coef_prefix, soil.coef.names) -soil.coef.template <- rep( - NA, length(soil.coef.template.names) -) -names(soil.coef.template) <- soil.coef.template.names - -# 3. Fit the climate models ---- -# Run over every bootstrap iteration on the spatially thinned -# data. The fitted climate coefficients feed both habitat model -# sets, so this section runs first. - -## 3.1 Define cores and objects for parallel processing ---- -core.input <- makeCluster(n_clusters) -clusterExport( - core.input, - c("climate.data", "species.list", "bootstrap.ids", - "climate.models", "bioclim.models", "space.models", - "boot_iter", "climate_models") -) -clusterEvalQ(core.input, { - - # Load relevant libraries - library(AICcmodavg) # Model averaging - library(arm) # Allows for the use of bayesglm function - library(binom) # For exact binomial confidence intervals - library(mapproj) # For projected maps - library(mgcv) # For binomial GAM - library(MuMIn) - library(pROC) - library(RcmdrMisc) - -}) - -## 3.2 Loop through each species ---- -climate.coef <- foreach(species = species.list) %dopar% - - t(parSapply( - core.input, - as.list(boot_iter), - FUN = function(boot) { - tryCatch( - climate_models( - species = species, - data = climate.data, - boot.data = bootstrap.ids, - climate.models = climate.models, - bioclim.models = bioclim.models, - space.models = space.models, - boot = boot - ), - error = function(e) e - ) - } - )) - -names(climate.coef) <- species.list - -stopCluster(core.input) - -# 4. Fit the vegetation models ---- -# The north model set, fitted for veg.species.list. - -## 4.1 Define cores and objects for parallel processing ---- -# use_protocol is read inside the worker closure, so it has to be -# exported. v2 passed a literal TRUE or FALSE and did not. -core.input <- makeCluster(n_clusters) -clusterExport( - core.input, - c("veg.data", "species.list", "bootstrap.ids", - "vegetation.models", "veg.prediction.matrix", "climate.coef", - "boot_iter", "veg.coef.template", "use_protocol", - "vegetation_models") -) -clusterEvalQ(core.input, { - - # Load relevant libraries - library(AICcmodavg) # Model averaging - library(arm) # Allows for the use of bayesglm function - library(binom) # For exact binomial confidence intervals - library(mapproj) # For projected maps - library(mgcv) # For binomial GAM - library(MuMIn) - library(pROC) - library(RcmdrMisc) - -}) - -## 4.2 Loop through each species ---- -vegetation.coef <- foreach(species = veg.species.list) %dopar% - - t(parSapply( - core.input, - as.list(boot_iter), - FUN = function(boot) { - tryCatch( - vegetation_models( - species = species, - data = veg.data, - boot.data = bootstrap.ids, - habitat.models = vegetation.models, - prediction.matrix = veg.prediction.matrix, - climate.coef = climate.coef, - coef.template = veg.coef.template, - weight.method = "IVW", - coef.adjust = TRUE, - protocol.flag = use_protocol, - boot = boot - ), - error = function(e) e - ) - } - )) - -names(vegetation.coef) <- veg.species.list - -stopCluster(core.input) - -# 5. Fit the soil models ---- -# The south model set, fitted for soil.species.list. A species -# can be common enough to model in one region and not the other, -# so the two lists differ. - -## 5.1 Define cores and objects for parallel processing ---- -core.input <- makeCluster(n_clusters) -clusterExport( - core.input, - c("soil.data", "species.list", "bootstrap.ids", "soil.models", - "soil.prediction.matrix", "climate.coef", "boot_iter", - "soil.coef.template", "use_protocol", "soil_models") -) -clusterEvalQ(core.input, { - - # Load relevant libraries - library(AICcmodavg) # Model averaging - library(arm) # Allows for the use of bayesglm function - library(binom) # For exact binomial confidence intervals - library(mapproj) # For projected maps - library(mgcv) # For binomial GAM - library(MuMIn) - library(pROC) - library(RcmdrMisc) - -}) - -## 5.2 Loop through each species ---- -soil.coef <- foreach(species = soil.species.list) %dopar% - - t(parSapply( - core.input, - as.list(boot_iter), - FUN = function(boot) { - tryCatch( - soil_models( - species = species, - data = soil.data, - boot.data = bootstrap.ids, - habitat.models = soil.models, - prediction.matrix = soil.prediction.matrix, - climate.coef = climate.coef, - coef.template = soil.coef.template, - weight.method = "IVW", - coef.adjust = TRUE, - protocol.flag = use_protocol, - boot = boot - ), - error = function(e) e - ) - } - )) - -names(soil.coef) <- soil.species.list - -stopCluster(core.input) - -# 6. Save the results from all three model sets ---- -models_path <- file.path( - run_dir, "models", paste0(taxon, "-species-models.Rdata") -) - -save(climate.coef, soil.coef, vegetation.coef, file = models_path) - -cat("Wrote ", models_path, "\n", sep = "") - -# End of script ---- diff --git a/1_code/_deprecated/03_model_validation.R b/1_code/_deprecated/03_model_validation.R deleted file mode 100644 index e5eff25..0000000 --- a/1_code/_deprecated/03_model_validation.R +++ /dev/null @@ -1,285 +0,0 @@ -# --- -# title: Validate Bootstrapped Models (Plant Groups) -# author: Brendan Casey -# created: 2026-09-08 -# inputs: -# set by the calling experiment, or defaulted in 1.2: -# - taxon, data_dir, run_dir, species_subset, boot_iter, -# n_clusters -# in data_dir: -# - .csv, sites.csv, covariates/, lookup/ -# in run_dir: -# - bootstrap/-bootstrap-ids.Rdata, from 01 -# - models/-species-models.Rdata, from 02 -# in this repository: -# - 1_code/modules/plants/load_model_data.R -# - 1_code/modules/plants/functions/ -# model-validation_functions.R -# outputs: -# in run_dir: -# - validation/-models-validation.Rdata -# (vegetation.fit, soil.fit) -# notes: -# - Rewrite of the v2 scripts 03a-03d, which were four -# near-identical files differing only in the taxon they -# loaded and in protocol.flag. They are one script here, -# parameterized by `taxon`, with the flag read from -# plant_taxa() so it cannot drift from what 02 fitted. -# - The species queue comes from the fitted model object rather -# than from the data, exactly as v2 did, so validation covers -# what was actually fitted even when 02 ran on a subset. -# - NA coefficients are set to qlogis(0.001) before scoring and -# the standard error columns are dropped, which is v2's -# handling of a bootstrap that failed to converge: an -# unestimated coefficient is scored as near-zero probability -# rather than dropping the iteration. -# - v2's 03a header names its output byrophyte-...Rdata while -# the code writes bryophyte-...Rdata. The name is built from -# `taxon` here, so the two cannot disagree. -# - The species selection is `species_subset`, not `species`. -# The v2 code loops with `for (species in species.list)`, -# which would otherwise overwrite the selection and leave the -# next stage running on one species. -# - Future improvement - the two model sets differ only in -# their data, coefficients and landcover.type, so they could -# share one helper rather than repeating the cluster setup. -# --- - -# 1. Setup ---- - -## 1.1 Load packages ---- -library(foreach) # sequential %dopar% loop, as in v2 (version: 1.5.2) -library(parallel) # bootstrap-level parallelism (version: 4.5.0) - -## 1.2 Configure the run ---- -# Values a calling experiment has already set are kept, so this -# script runs either from 1_code/experiments/ or on its own. -if (!exists("project_root", inherits = FALSE)) { - project_root <- normalizePath(getwd(), winslash = "/") -} - -if (!exists("taxon", inherits = FALSE)) { - taxon <- "bryophyte" -} - -if (!exists("data_dir", inherits = FALSE)) { - data_dir <- file.path(project_root, "0_data/test_dataset") -} - -if (!exists("run_dir", inherits = FALSE)) { - run_dir <- file.path(project_root, "2_pipeline/plants") -} - -if (!exists("species_subset", inherits = FALSE)) { - species_subset <- NULL -} - -# The v2 defaults. -if (!exists("boot_iter", inherits = FALSE)) { - boot_iter <- 1:100 -} - -if (!exists("n_clusters", inherits = FALSE)) { - n_clusters <- 14 -} - -## 1.3 Load functions and data ---- -source(file.path( - project_root, "1_code/modules/plants/load_model_data.R" -)) -source(file.path( - project_root, - "1_code/modules/plants/functions/model-validation_functions.R" -)) - -model_data <- load_plant_model_data( - taxon = taxon, - data_dir = data_dir, - species = species_subset -) - -veg.data <- model_data$veg.data -soil.data <- model_data$soil.data - -use_protocol <- taxon_uses_protocol(taxon) - -## 1.4 Load the bootstrap ids and the fitted models ---- -bootstrap_path <- file.path( - run_dir, "bootstrap", paste0(taxon, "-bootstrap-ids.Rdata") -) - -models_path <- file.path( - run_dir, "models", paste0(taxon, "-species-models.Rdata") -) - -missing_inputs <- c(bootstrap_path, models_path) -missing_inputs <- missing_inputs[!file.exists(missing_inputs)] - -if (length(missing_inputs) > 0) { - stop( - "Validation inputs not found:\n ", - paste(missing_inputs, collapse = "\n "), - "\nRun 01_bootstrap_ids.R and 02_hierarchical_models.R first.", - call. = FALSE - ) -} - -load(bootstrap_path) -load(models_path) - -## 1.5 Take the species queue from the fitted models ---- -# Not from the data. 02 may have run on a subset, and only what -# it fitted can be scored. -species.list <- names(climate.coef) -veg.species.list <- names(vegetation.coef) -soil.species.list <- names(soil.coef) - -dir.create( - file.path(run_dir, "validation"), - recursive = TRUE, showWarnings = FALSE -) - -cat( - "Validating ", taxon, ": ", length(veg.species.list), - " vegetation and ", length(soil.species.list), - " soil species x ", length(boot_iter), " bootstraps\n", - sep = "" -) - -## 1.6 Prepare coefficients for model fit evaluation ---- -# A bootstrap that failed to estimate a coefficient leaves NA. -# v2 scores those as qlogis(0.001), a near-zero probability, -# rather than dropping the iteration, and drops the standard -# error columns, which are not used in scoring. -for (one_species in veg.species.list) { - - climate.coef[[one_species]][ - is.na(climate.coef[[one_species]]) - ] <- qlogis(0.001) - - vegetation.coef[[one_species]][ - is.na(vegetation.coef[[one_species]]) - ] <- qlogis(0.001) - vegetation.coef[[one_species]] <- vegetation.coef[[one_species]][ - , -grep(".SE", colnames(vegetation.coef[[one_species]])) - ] - -} - -for (one_species in soil.species.list) { - - climate.coef[[one_species]][ - is.na(climate.coef[[one_species]]) - ] <- qlogis(0.001) - - soil.coef[[one_species]][ - is.na(soil.coef[[one_species]]) - ] <- qlogis(0.001) - soil.coef[[one_species]] <- soil.coef[[one_species]][ - , -grep(".SE", colnames(soil.coef[[one_species]])) - ] - -} - -# 2. Vegetation model fit ---- -# Scores the north model set per species per bootstrap, on AUC -# and the related measures model_validation() returns. - -## 2.1 Define cores and objects for parallel processing ---- -core.input <- makeCluster(n_clusters) -clusterExport( - core.input, - c("veg.data", "veg.species.list", "bootstrap.ids", - "vegetation.coef", "climate.coef", "boot_iter", - "use_protocol", "model_validation") -) -clusterEvalQ(core.input, { - - # Load relevant libraries - library(pROC) - -}) - -## 2.2 Loop through each species ---- -vegetation.fit <- foreach(species = veg.species.list) %dopar% - - t(parSapply( - core.input, - as.list(boot_iter), - FUN = function(boot) { - tryCatch( - model_validation( - species = species, - data = veg.data, - boot.data = bootstrap.ids, - climate.coef = climate.coef, - landcover.coef = vegetation.coef, - landcover.type = "Vegetation", - protocol.flag = use_protocol, - boot = boot - ), - error = function(e) e - ) - } - )) - -names(vegetation.fit) <- veg.species.list - -stopCluster(core.input) - -# 3. Soil model fit ---- -# The same scoring for the south model set. - -## 3.1 Define cores and objects for parallel processing ---- -core.input <- makeCluster(n_clusters) -clusterExport( - core.input, - c("soil.data", "soil.species.list", "bootstrap.ids", - "soil.coef", "climate.coef", "boot_iter", "use_protocol", - "model_validation") -) -clusterEvalQ(core.input, { - - # Load relevant libraries - library(pROC) - -}) - -## 3.2 Loop through each species ---- -soil.fit <- foreach(species = soil.species.list) %dopar% - - t(parSapply( - core.input, - as.list(boot_iter), - FUN = function(boot) { - tryCatch( - model_validation( - species = species, - data = soil.data, - boot.data = bootstrap.ids, - climate.coef = climate.coef, - landcover.coef = soil.coef, - landcover.type = "Soil", - protocol.flag = use_protocol, - boot = boot - ), - error = function(e) e - ) - } - )) - -names(soil.fit) <- soil.species.list - -stopCluster(core.input) - -# 4. Save the results ---- -validation_path <- file.path( - run_dir, "validation", - paste0(taxon, "-models-validation.Rdata") -) - -save(vegetation.fit, soil.fit, file = validation_path) - -cat("Wrote ", validation_path, "\n", sep = "") - -# End of script ---- diff --git a/1_code/_deprecated/README.md b/1_code/_deprecated/README.md deleted file mode 100644 index 3f46efc..0000000 --- a/1_code/_deprecated/README.md +++ /dev/null @@ -1,51 +0,0 @@ -# _deprecated - -Code superseded by the framework described in -[`docs/framework_design.md`](../../docs/framework_design.md). Kept for -reference during the transition, and not sourced by anything. - -Delete once the taxon specs in `1_code/modules/` reproduce v2 through the -new harness. - -## What is here and why - -| File | Superseded by | Note | -| --- | --- | --- | -| `01_bootstrap_ids.R` | `harness/resample.R` | Plant-only bootstrap generation | -| `02_hierarchical_models.R` | `harness/engines.R`, `harness/selection.R` | Plant-only two-stage fitting | -| `03_model_validation.R` | `harness/eval_metrics.R` | Plant-only scoring | -| `load_model_data.R` | `harness/data_load.R` | Read `covariates/_*.csv`, a layout the dataset no longer has | -| `covar_attach.R`, `data_load.R`, `data_split.R`, `eval_metrics.R` | the harness files of the same names | Placeholders that stopped rather than returning anything | -| `plants_functions/` | — | Byte-identical copies of `0_data/v2_scripts/plants/` | -| `exp_000_parity_v2/` | `1_code/experiments/exp_000_parity_v2/` | The gate rebuilt on the harness; the old version drove the deleted plants module | - -Two of these are worth knowing about. - -**The plants module was already broken.** `load_model_data.R` reads -`covariates/_climate.csv` and its siblings. The harmonizer now -writes one `covariates.csv` keyed on taxon instead, so that module could -not have run against the current test dataset regardless of the rewrite. - -**`plants_functions/` was pure duplication.** All three files were -byte-identical to the frozen originals in `0_data/v2_scripts/plants/`, -which are tracked and have recorded provenance. A second copy could only -drift. When the plant spec needs `climate_models()`, `vegetation_models()` -or `model_validation()` for parity, it should source the frozen originals -rather than a copy. - -## plants_module/spec.R - -The combined plant-group spec, superseded on 2026-09-10 when the -four plant-group taxa were split into their own modules: -`bryophytes/`, `lichens/`, `soil_mites/` and `vascular_plants/`. -Its `plant_spec(taxon)` became `plant_group_spec()` in -`1_code/modules/_shared/plant_group.R`, called by four thin taxon -files that each state only what is true of that taxon. - -Kept because it is what the split was verified against: every one -of the eight taxon-by-region model frames built from -`0_data/test_dataset` is identical between the old spec and the -new ones. The spec objects themselves differ only in the -environments captured by the region-filter formulas, which the -harness discards, evaluating the right-hand side against the data -frame instead. diff --git a/1_code/_deprecated/covar_attach.R b/1_code/_deprecated/covar_attach.R deleted file mode 100644 index 975c60a..0000000 --- a/1_code/_deprecated/covar_attach.R +++ /dev/null @@ -1,46 +0,0 @@ -# --- -# title: Attach Covariates to Records -# author: Brendan Casey -# created: 2026-09-05 -# inputs: none -# outputs: none -# notes: -# - Placeholder. 0_data/covariates/catalogue_v1.csv holds -# metadata and server paths only; the rasters live on the -# ABMI server. -# - The catalogue is extensible - a new catalogue version can -# add covariates without invalidating the test dataset. -# --- - -# 1. attach_covariates() ---- - -#' Attach Covariates to Records -#' -#' Attaches covariates from the versioned catalogue to records. -#' -#' @param data Data frame of response records with -#' coordinates. -#' @param catalogue Character. Catalogue version, e.g. -#' "catalogue_v1". -#' @param covariates Character vector of covariate names to -#' attach, or NULL for every covariate in the catalogue. -#' @return `data` with one column per attached covariate. -#' -#' @example -#' # Example usage of the function -#' # attach_covariates() -attach_covariates <- function( - data, - catalogue = "catalogue_v1", - covariates = NULL -) { - # Step 1: Read the catalogue and resolve the layer paths - # Step 2: Extract at the record coordinates and bind - - stop( - "attach_covariates() is not implemented yet.", - call. = FALSE - ) -} - -# End of script ---- diff --git a/1_code/_deprecated/data_load.R b/1_code/_deprecated/data_load.R deleted file mode 100644 index b294470..0000000 --- a/1_code/_deprecated/data_load.R +++ /dev/null @@ -1,39 +0,0 @@ -# --- -# title: Load the Frozen Test Dataset -# author: Brendan Casey -# created: 2026-09-05 -# inputs: none -# outputs: none -# notes: -# - Placeholder. The frozen test dataset is not yet -# assembled, so this stops rather than returning -# a partial answer. -# - 0_data/manifest.md is the source of truth for the -# dataset version and paths. -# --- - -# 1. load_test_data() ---- - -#' Load the Frozen Test Dataset -#' -#' Loads the frozen cross-taxa test dataset for one taxon. -#' -#' @param taxon Character. Taxon slug (e.g. "mite"). -#' @param version Character. Dataset version from -#' 0_data/manifest.md. -#' @return A data frame of response records. -#' -#' @example -#' # Example usage of the function -#' # load_test_data() -load_test_data <- function(taxon, version = NULL) { - # Step 1: Resolve the dataset path from the manifest - # Step 2: Read the records and validate the columns - - stop( - "load_test_data() is not implemented yet.", - call. = FALSE - ) -} - -# End of script ---- diff --git a/1_code/_deprecated/data_split.R b/1_code/_deprecated/data_split.R deleted file mode 100644 index 3a3201f..0000000 --- a/1_code/_deprecated/data_split.R +++ /dev/null @@ -1,39 +0,0 @@ -# --- -# title: Apply the Evaluation Split -# author: Brendan Casey -# created: 2026-09-05 -# inputs: none -# outputs: none -# notes: -# - Placeholder. The split is part of the frozen dataset, -# so it is read, never recomputed - recomputing it would -# break comparability across experiments. -# - The v2 pipeline does not use this; the v2 scripts carry -# their own bootstrap design in bootstrap.ids. -# --- - -# 1. apply_split() ---- - -#' Apply the Evaluation Split -#' -#' Applies the frozen evaluation split to a set of records. -#' -#' @param data Data frame of response records. -#' @param split Character. Which split to return, one of -#' "train", "test", or "all". -#' @return A data frame holding the requested split. -#' -#' @example -#' # Example usage of the function -#' # apply_split() -apply_split <- function(data, split = c("train", "test", "all")) { - # Step 1: Match the requested split - # Step 2: Join the frozen split assignment and subset - - stop( - "apply_split() is not implemented yet.", - call. = FALSE - ) -} - -# End of script ---- diff --git a/1_code/_deprecated/eval_metrics.R b/1_code/_deprecated/eval_metrics.R deleted file mode 100644 index 4b54222..0000000 --- a/1_code/_deprecated/eval_metrics.R +++ /dev/null @@ -1,41 +0,0 @@ -# --- -# title: Compute Evaluation Metrics -# author: Brendan Casey -# created: 2026-09-05 -# inputs: none -# outputs: none -# notes: -# - Placeholder. Metrics computed here are what experiments -# are compared on, so changes affect every past and future -# experiment and should be reviewed accordingly. -# - The v2 validation scripts compute their own AUC through -# model_validation(); this is for methods work that does -# not run the v2 code. -# --- - -# 1. eval_metrics() ---- - -#' Compute Evaluation Metrics -#' -#' Computes the shared evaluation metrics for a model's predictions. -#' -#' @param observed Numeric vector of observed values. -#' @param predicted Numeric vector of predicted values. -#' @param metrics Character vector of metric names to -#' compute, or NULL for the full set. -#' @return A named numeric vector of metric values. -#' -#' @example -#' # Example usage of the function -#' # eval_metrics() -eval_metrics <- function(observed, predicted, metrics = NULL) { - # Step 1: Validate that the two vectors align - # Step 2: Compute each requested metric - - stop( - "eval_metrics() is not implemented yet.", - call. = FALSE - ) -} - -# End of script ---- diff --git a/1_code/_deprecated/exp_000_parity_v2/01_collect_results.R b/1_code/_deprecated/exp_000_parity_v2/01_collect_results.R deleted file mode 100644 index 929dfe9..0000000 --- a/1_code/_deprecated/exp_000_parity_v2/01_collect_results.R +++ /dev/null @@ -1,63 +0,0 @@ -# --- -# title: Collect v2 Model Output (Experiment 000) -# author: Brendan Casey -# created: 2026-09-05 -# inputs: -# in pipeline_dir//: -# - models/-species-models.Rdata -# - validation/-models-validation.Rdata -# outputs: -# in out_dir/tables/: -# - species_.csv -# - validation_summary.csv -# notes: -# - Placeholder. Reads the model output each taxon left in -# pipeline_dir and writes flat summaries to out_dir. -# - Raw model objects stay in pipeline_dir on purpose. They are -# 100 bootstraps by every species by three model families, -# which is too large to commit; only the derived summaries -# belong in 3_output/. -# - Expects exp_id, pipeline_dir and out_dir from run.R. Both -# paths are taken from there rather than rebuilt here, so a -# run pointed at a scratch disk is still read correctly. -# --- - -# 1. Setup ---- - -## 1.1 Resolve paths ---- -# Sourced by run.R, so the experiment configuration is already -# in the environment. -tables_dir <- file.path(out_dir, "tables") -dir.create(tables_dir, recursive = TRUE, showWarnings = FALSE) - -## 1.2 Identify the taxa that produced output ---- -# A taxon appears here only once its stages have run into this -# pipeline_dir, in this pass or an earlier one. -run_taxa <- list.dirs( - pipeline_dir, full.names = FALSE, recursive = FALSE -) -run_taxa <- setdiff(run_taxa, "logs") - -# 2. Collect model coefficients ---- -# TODO: load each -species-models.Rdata, reduce the -# bootstrap coefficient arrays to per-species summaries, and -# write one table per taxon. - -# 3. Collect validation metrics ---- -# TODO: load each -models-validation.Rdata and write the -# per-species AUC and fit measures to validation_summary.csv. - -# 4. Report what was found ---- -cat( - "01_collect_results.R is a placeholder. Taxa found in ", - pipeline_dir, ": ", - if (length(run_taxa) > 0) { - paste(run_taxa, collapse = ", ") - } else { - "none" - }, - "\n", - sep = "" -) - -# End of script ---- diff --git a/1_code/_deprecated/exp_000_parity_v2/02_compare_to_v2.R b/1_code/_deprecated/exp_000_parity_v2/02_compare_to_v2.R deleted file mode 100644 index fbb1292..0000000 --- a/1_code/_deprecated/exp_000_parity_v2/02_compare_to_v2.R +++ /dev/null @@ -1,52 +0,0 @@ -# --- -# title: Compare Against the v2.0 Reference (Experiment 000) -# author: Brendan Casey -# created: 2026-09-05 -# inputs: -# in 3_output/exp_000_parity_v2/tables/: -# - species_.csv -# - validation_summary.csv -# reference: -# - the published v2.0 model output (source to be agreed) -# outputs: -# in 3_output/exp_000_parity_v2/: -# - tables/parity_.csv -# - figures/parity_.png -# notes: -# - Placeholder. This is the parity gate - it compares what -# this repository produced against the species models v2.0 -# results for the same species. -# - Open question: where the v2.0 reference output comes from. -# Either a frozen snapshot under 0_data/ with a pointer in -# manifest.md, or the external v2 project. The comparison -# cannot be written until that is settled. -# - The minimum acceptable parity target is not yet defined and -# will need to be agreed per taxon. -# - Expects exp_id, project_root, and out_dir from run.R. -# --- - -# 1. Setup ---- - -## 1.1 Resolve paths ---- -tables_dir <- file.path(out_dir, "tables") - -figures_dir <- file.path(out_dir, "figures") -dir.create(figures_dir, recursive = TRUE, showWarnings = FALSE) - -# 2. Compare coefficients ---- -# TODO: join this run's per-species coefficients to the v2.0 -# reference and record the differences per model family. - -# 3. Compare validation metrics ---- -# TODO: compare AUC and fit measures per species and bootstrap. - -# 4. Summarize parity ---- -# TODO: write parity_.csv and the matching figure, then -# state the result against the agreed target. -cat( - "02_compare_to_v2.R is a placeholder. The v2.0 reference ", - "source and the parity target are still to be agreed.\n", - sep = "" -) - -# End of script ---- diff --git a/1_code/_deprecated/exp_000_parity_v2/03_build_report.R b/1_code/_deprecated/exp_000_parity_v2/03_build_report.R deleted file mode 100644 index 71e50d0..0000000 --- a/1_code/_deprecated/exp_000_parity_v2/03_build_report.R +++ /dev/null @@ -1,50 +0,0 @@ -# --- -# title: Build the Experiment 000 Report -# author: Brendan Casey -# created: 2026-09-05 -# inputs: -# in 3_output/exp_000_parity_v2/: -# - tables/parity_.csv -# - figures/parity_.png -# outputs: -# in 3_output/exp_000_parity_v2/: -# - report.md -# notes: -# - Placeholder. Assembles the tables and figures into the -# committed report that states whether the parity gate -# passed, per taxon. -# - Writing a stub report.md on every run keeps the experiment -# folder complete, so a partial run is still legible. -# - Expects exp_id, project_root, and out_dir from run.R. -# --- - -# 1. Setup ---- - -## 1.1 Resolve paths ---- -report_file <- file.path(out_dir, "report.md") - -dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) - -# 2. Assemble the report ---- -# TODO: read the parity tables and figures and write the results -# section. For now the file records that the run happened and -# which species vector produced it. -report_lines <- c( - paste0("# ", exp_id), - "", - paste0("Generated ", format(Sys.time(), "%Y-%m-%d %H:%M:%S")), - "", - "## Status", - "", - "Placeholder report. The parity comparison in", - "`02_compare_to_v2.R` is not yet implemented, so no result is", - "stated here yet.", - "" -) - -# 3. Write the report ---- -writeLines(report_lines, report_file) - -cat("Wrote ", report_file, "\n", sep = "") - -# End of script ---- diff --git a/1_code/_deprecated/exp_000_parity_v2/README.md b/1_code/_deprecated/exp_000_parity_v2/README.md deleted file mode 100644 index 2a2cc59..0000000 --- a/1_code/_deprecated/exp_000_parity_v2/README.md +++ /dev/null @@ -1,97 +0,0 @@ -# exp_000_parity_v2 - -![Status](https://img.shields.io/badge/Status-Partially%20running-yellow) -![Languages](https://img.shields.io/badge/Languages-R-blue) - -The validation gate. Runs the v2.0 models through this repository's -pipeline and compares the results against the published species models -v2.0 outputs. - -## Question - -Does running the rewritten v2 modelling code, on the harmonized test -dataset, through this repository's pipeline reproduce the v2.0 results? - -Everything downstream depends on the answer. Later experiments are -compared against this one, so a difference here is a difference in the -plumbing, not in the method being tested. - -## Design - -| Element | Value | -| --- | --- | -| Taxa | Set per run in `run.R` section 1.4 (`mites <- TRUE`, and so on) | -| Species | Set per taxon in `utils/species_lists.R`; `NULL` runs all | -| Bootstraps | `boot_iter` in `run.R`; must stay at the v2 value of `1:100` for parity | -| Reference | The published v2.0 output — source still to be agreed | -| Target | Not yet defined; to be agreed per taxon | - -## Files - -| File | Purpose | -| --- | --- | -| `run.R` | Entry point. Paths, taxon flags, stage flags, run length | -| `utils/species_lists.R` | The species vector for each taxon | -| `01_collect_results.R` | Model output → flat summary tables | -| `02_compare_to_v2.R` | The parity comparison itself | -| `03_build_report.R` | Tables and figures → `report.md` | - -## How to run - -1. Build the test dataset first, if it is not already there — see - [Setup](../../../README.md#setup) in the repository README. A run needs - only `0_data/test_dataset/`, not the v2 project. -2. Edit `run.R`: - - **1.3** where the run reads and writes. The defaults follow the - repository conventions; point `pipeline_dir` at a scratch disk for a - long run. - - **1.4** the taxon flags. - - **1.5** the stage flags. `02` needs what `01` wrote and `03` needs what - `02` wrote, so a stage can be run alone only once the ones before it - have run into the same `pipeline_dir`. - - **1.6** the run length. Leave it at the v2 values for parity. -3. Name the species in `utils/species_lists.R`. `NULL` runs every modelled - species; a short vector is the smoke test, and is the right way to - shorten a trial run since `boot_iter` has to stay at `1:100`. -4. Run from the repository root: - -```r -source("1_code/experiments/exp_000_parity_v2/run.R") -``` - -## Outputs - -Intermediates, per taxon, in `pipeline_dir` -(`2_pipeline/exp_000_parity_v2/` by default): - -- `/bootstrap/` — the per-species bootstrap site ids. -- `/models/` — the fitted climate, vegetation and soil - coefficients. Gitignored; 100 bootstraps by every species by three - model families is too large to commit. -- `/validation/` — the per-bootstrap fit measures. -- `logs/` — one timestamped log per stage. - -Deliverables in `out_dir` (`3_output/exp_000_parity_v2/` by default): - -- `tables/`, `figures/`, `report.md` — committed, so comparisons - across experiments can be made from the repository alone. - -## Status - -The climate and soil model sets run end to end. Three things are -outstanding: - -- **The vegetation models cannot be fitted.** The prediction matrix in the - snapshot is missing four columns the v2 vegetation models are predicted - onto. See [Known gaps](../../../README.md#known-gaps) — it is one file - away from working, and `02_hierarchical_models.R` stops with the missing - columns named rather than failing partway through a run. -- **The v2.0 reference source** is undecided: a frozen snapshot under - `0_data/` or the external v2 project. -- **The parity target** is undefined, per taxon. - -`01`–`03` are placeholders pending the last two. - -Note that the v2 bootstrap draws without a fixed seed, so successive runs -of identical code differ. `boot_seed` in `run.R` fixes the stream when a -run needs to be repeatable; `NULL` reproduces v2. diff --git a/1_code/_deprecated/exp_000_parity_v2/run.R b/1_code/_deprecated/exp_000_parity_v2/run.R deleted file mode 100644 index d344c7a..0000000 --- a/1_code/_deprecated/exp_000_parity_v2/run.R +++ /dev/null @@ -1,253 +0,0 @@ -# --- -# title: Run Experiment 000 - v2.0 Parity Check -# author: Brendan Casey -# created: 2026-09-05 -# inputs: -# harness, in 1_code/harness/utils/: -# - step_runner.R -# experiment: -# - 1_code/experiments/exp_000_parity_v2/utils/species_lists.R -# modules, in 1_code/modules/plants/: -# - 01_bootstrap_ids.R -# - 02_hierarchical_models.R -# - 03_model_validation.R -# data: -# - 0_data/test_dataset/ -# outputs: -# in pipeline_dir (2_pipeline/exp_000_parity_v2/ by default): -# - /bootstrap/, /models/, /validation/ -# - logs/ -# in out_dir (3_output/exp_000_parity_v2/ by default): -# - tables/, figures/, report.md -# notes: -# - Entry point for the experiment, and the only file that has -# to be edited to change what runs. Sections 1.2 to 1.6 are -# the whole configuration: where output goes, which taxa run, -# on which species, and at what run length. -# - The modelling scripts in 1_code/modules/plants/ take every -# path as an argument. Nothing is hard-coded to a project -# layout, so pipeline_dir and out_dir can point anywhere -# writable; the defaults follow this repository's -# conventions. -# - Reads 0_data/test_dataset/ only, which is the harmonized -# snapshot 1_code/_setup/ builds. The v2 project itself is -# not needed at run time, and 0_data/ is not written to. -# - Species vectors live in utils/species_lists.R. NULL models -# every species the snapshot declares as modelled. -# - The three stages are ordered: 02 reads what 01 wrote and 03 -# reads what 02 wrote, all from pipeline_dir. Re-running one -# stage means setting its flag alone, so long as the earlier -# stages have run at least once. -# --- - -# 1. Setup ---- - -## 1.1 Set the working directory ---- -# Every path below is relative to this repository's root. In -# RStudio or Positron, uncomment to set it from this script's -# location. -# setwd(dirname(rstudioapi::getActiveDocumentContext()$path)) -# setwd("../../..") - -## 1.2 Configure the experiment ---- -# The identifier is used verbatim in 1_code/experiments/, -# 2_pipeline/ and 3_output/, so all three paths derive from one -# variable rather than being typed per stage. -exp_id <- "exp_000_parity_v2" - -project_root <- normalizePath(getwd(), winslash = "/") - -exp_code_dir <- file.path( - project_root, "1_code/experiments", exp_id -) - -module_dir <- file.path(project_root, "1_code/modules/plants") - -## 1.3 Choose where the run reads and writes ---- -# The three paths a run needs. Point them anywhere writable - a -# scratch disk for a long run, say - and nothing else has to -# change. The defaults follow this repository's conventions. -# -# data_dir is read only. It holds the frozen test dataset, and -# no stage writes to it. -data_dir <- file.path(project_root, "0_data/test_dataset") - -# pipeline_dir takes the intermediates: bootstrap ids, fitted -# models, validation objects, and the logs. These are large and -# gitignored. -pipeline_dir <- file.path(project_root, "2_pipeline", exp_id) - -# out_dir takes the committed deliverables: tables, figures and -# the report. -out_dir <- file.path(project_root, "3_output", exp_id) - -log_path <- file.path(pipeline_dir, "logs") - -## 1.4 Set the taxa to run ---- -# Set to TRUE to model that taxon. Toggling a flag re-runs one -# taxon without commenting out code. -bryophytes <- FALSE -lichens <- FALSE -mites <- TRUE -vascular_plants <- FALSE - -## 1.5 Set the stages to run ---- -# The three modelling stages, in order. 02 needs what 01 wrote -# and 03 needs what 02 wrote, so a stage can be run alone only -# once the ones before it have run at least once into the same -# pipeline_dir. -run_bootstrap <- TRUE # 01_bootstrap_ids.R -run_models <- TRUE # 02_hierarchical_models.R -run_validation <- TRUE # 03_model_validation.R - -# The steps that turn raw model output into deliverables. -run_collect <- TRUE -run_compare <- TRUE -run_report <- TRUE - -## 1.6 Set the run length ---- -# v2 hard-coded 100 bootstraps and 14 cores. Both are parameters -# now, but parity means running at the v2 values, so leave these -# as they are for exp_000 and shorten a smoke test with the -# species vectors instead. -boot_iter <- 1:100 -n_clusters <- 14 - -# NULL leaves the bootstrap stream unseeded, as v2 did. Set an -# integer to make a run repeatable. -boot_seed <- NULL - -## 1.7 Load the species vectors ---- -# Defines bryophyte_species, lichen_species, mite_species and -# vascular_plant_species. NULL means every modelled species. -source(file.path(exp_code_dir, "utils/species_lists.R")) - -## 1.8 Load the step runner ---- -# Supplies run_step(), which times each stage and mirrors its -# output to a log. -source(file.path( - project_root, "1_code/harness/utils/step_runner.R" -)) - -# 2. Run the modelling stages ---- -# One block per taxon. Each sets the parameters the module -# scripts read - taxon, species and the output root - then runs -# the three stages in order. Nothing outside pipeline_dir is -# written. - -## 2.1 run_taxon() ---- - -#' Run the Three Modelling Stages for One Taxon -#' -#' Sets the configuration the module scripts read from the global -#' environment, then runs the stages whose flags are TRUE. The -#' scripts are sourced rather than called because they read their -#' parameters by name from there, which is also where their -#' parallel workers export from. -#' -#' @param taxon_name Character. Taxon slug, as used in the test -#' dataset file names. -#' @param taxon_species Character vector of species to model, or -#' NULL for every modelled species. -#' @param label Character. The taxon as it reads in a log line. -#' @return NULL, invisibly. -#' -#' @example -#' # Example usage of the function -#' # run_taxon("mite", mite_species, "mites") -run_taxon <- function(taxon_name, taxon_species, label) { - # Step 1: Publish the parameters the module scripts read. They - # are assigned to the global environment because that is where - # the scripts are sourced and where clusterExport() looks. - # - # run_dir is the module's own output root, kept distinct from - # out_dir so the intermediates and the deliverables cannot be - # written to the same place by accident. - taxon <<- taxon_name - species_subset <<- taxon_species - run_dir <<- file.path(pipeline_dir, taxon_name) - - # Step 2: Run each requested stage in order - stages <- list( - list( - flag = run_bootstrap, - label = paste0("01: Bootstrap ids (", label, ")"), - script = file.path(module_dir, "01_bootstrap_ids.R") - ), - list( - flag = run_models, - label = paste0("02: Hierarchical models (", label, ")"), - script = file.path(module_dir, "02_hierarchical_models.R") - ), - list( - flag = run_validation, - label = paste0("03: Model validation (", label, ")"), - script = file.path(module_dir, "03_model_validation.R") - ) - ) - - for (stage in stages) { - if (stage$flag) { - run_step( - label = stage$label, - script = stage$script, - log_dir = log_path - ) - } - } - - invisible(NULL) -} - -## 2.2 Run each requested taxon ---- -experiment_start <- Sys.time() - -if (bryophytes) { - run_taxon("bryophyte", bryophyte_species, "bryophytes") -} - -if (lichens) { - run_taxon("lichen", lichen_species, "lichens") -} - -if (mites) { - run_taxon("mite", mite_species, "mites") -} - -if (vascular_plants) { - run_taxon( - "vascular_plant", vascular_plant_species, "vascular plants" - ) -} - -# 3. Summarize the results ---- -# These read the model output left in pipeline_dir and write the -# committed deliverables to out_dir. They are placeholders until -# the parity targets are agreed. -dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) - -## 3.1 Collect model output ---- -if (run_collect) { - source(file.path(exp_code_dir, "01_collect_results.R")) -} - -## 3.2 Compare against the v2.0 reference ---- -if (run_compare) { - source(file.path(exp_code_dir, "02_compare_to_v2.R")) -} - -## 3.3 Build the report ---- -if (run_report) { - source(file.path(exp_code_dir, "03_build_report.R")) -} - -# 4. Experiment complete ---- -experiment_time <- format(round(Sys.time() - experiment_start, 1)) -cat("\n========================================\n") -cat("EXPERIMENT ", exp_id, " COMPLETE\n", sep = "") -cat("Total run time: ", experiment_time, "\n", sep = "") -cat("========================================\n") -cat("Intermediates are in ", pipeline_dir, "\n", sep = "") -cat("Deliverables are in ", out_dir, "\n", sep = "") - -# End of script ---- diff --git a/1_code/_deprecated/exp_000_parity_v2/utils/species_lists.R b/1_code/_deprecated/exp_000_parity_v2/utils/species_lists.R deleted file mode 100644 index 9ca6a2d..0000000 --- a/1_code/_deprecated/exp_000_parity_v2/utils/species_lists.R +++ /dev/null @@ -1,49 +0,0 @@ -# --- -# title: Species Vectors for Experiment 000 -# author: Brendan Casey -# created: 2026-09-05 -# inputs: none -# outputs: none -# notes: -# - Defines the species each taxon is modelled on. Sourced by -# run.R and passed to the module scripts, which narrow the -# work queue to these names. -# - NULL models every species the snapshot declares as -# modelled, which is the parity setting: exp_000 has to cover -# what v2 covered. -# - A short vector is the smoke test. Species count and -# boot_iter are both adjustable now, but boot_iter has to -# stay at the v2 value for a parity run, so the species -# vector is what a trial run should shorten. -# - Names must match the species columns exactly. -# load_plant_model_data() stops and lists any name it cannot -# find, so a typo fails before modelling starts. -# - The names are those in lookup/modelled_species.csv, which -# is written from the snapshot's own veg.species.list and -# soil.species.list. To see the options for a taxon: -# -# modelled <- read.csv( -# "0_data/test_dataset/lookup/modelled_species.csv" -# ) -# head(modelled[modelled$taxon == "mite", ]) -# --- - -# 1. Species vectors ---- - -## 1.1 Bryophytes ---- -# 134 modelled species: 133 north, 32 south. -bryophyte_species <- NULL - -## 1.2 Lichens ---- -# 191 modelled species: 175 north, 55 south. -lichen_species <- NULL - -## 1.3 Soil mites ---- -# 125 modelled species: 116 north, 34 south. -mite_species <- NULL - -## 1.4 Vascular plants ---- -# 486 modelled species: 353 north, 269 south. -vascular_plant_species <- NULL - -# End of script ---- diff --git a/1_code/_deprecated/load_model_data.R b/1_code/_deprecated/load_model_data.R deleted file mode 100644 index e771a50..0000000 --- a/1_code/_deprecated/load_model_data.R +++ /dev/null @@ -1,443 +0,0 @@ -# --- -# title: Load Plant-Group Model Data from the Test Dataset -# author: Brendan Casey -# created: 2026-09-08 -# inputs: -# in 0_data/test_dataset/: -# - sites.csv -# - .csv -# - covariates/_climate.csv -# - covariates/_veg.csv -# - covariates/_soil.csv -# - lookup/veg_prediction_matrix.csv -# - lookup/soil_prediction_matrix.csv -# - lookup/modelled_species.csv -# outputs: none; returns objects in memory -# notes: -# - Rebuilds the three model frames the v2 plant scripts used to -# load from -model-data.Rdata, from the harmonized CSVs -# instead. The frames it returns are equivalent to the v2 -# objects of the same name, so the v2 function files in -# functions/ run against them unmodified. -# - The v2 code took its vegetation coefficient names -# positionally, as colnames(veg.data)[403:489] and three other -# per-taxon spans. Those spans are all the same 87 habitat -# types, and they are the first 87 columns of the vegetation -# covariate table, so veg_coef_names names them instead. That -# removes the one place where a reordered snapshot would have -# silently renamed every vegetation coefficient. -# - Protocol is carried only for bryophytes and lichens, because -# only those two v2 scripts fit it. plant_taxa() is the single -# record of which taxa do, and 02 and 03 read the flag from -# there rather than repeating it. -# - Both row-addressing styles the v2 functions use are -# supported: the hierarchical models index by rownames -# (data[site.id, ]) and the validation indexes by column -# (data$SiteYearQu %in% site.id), so SiteYearQu is kept as a -# column and as the rownames. -# - Future improvement - the same reader would serve mammals -# once their covariates are harmonized; nothing here is -# specific to the plant taxa except plant_taxa() and the site -# field mapping. -# --- - -# 1. Setup ---- - -## 1.1 Load packages ---- -library(data.table) # fast CSV reading (version: 1.16.4) - -# 2. plant_taxa() ---- - -#' Describe the Plant-Group Taxa -#' -#' The one record of which taxa exist and which of them fit a -#' Protocol term. In v2 that distinction was implicit in four -#' near-identical scripts: 02a and 02b carried `Protocol` in every -#' habitat formula and passed `protocol.flag = TRUE`, while 02c -#' and 02d carried neither. It is stated once here so the single -#' modelling script can reproduce both variants. -#' -#' @return A data frame with `taxon`, `use_protocol`, and -#' `label` (the taxon as it reads in a log line). -#' -#' @example # Example usage of the function -#' # plant_taxa() -#' # subset(plant_taxa(), taxon == "mite")$use_protocol -plant_taxa <- function() { - data.frame( - taxon = c("bryophyte", "lichen", "mite", "vascular_plant"), - use_protocol = c(TRUE, TRUE, FALSE, FALSE), - label = c("bryophytes", "lichens", "mites", "vascular plants"), - stringsAsFactors = FALSE - ) -} - -# 3. taxon_uses_protocol() ---- - -#' Look Up One Taxon's Protocol Flag -#' -#' @param taxon Character. One of the taxa in `plant_taxa()`. -#' @return Logical. TRUE when that taxon's v2 scripts fit a -#' Protocol term. -#' -#' @example # Example usage of the function -#' # taxon_uses_protocol("lichen") -taxon_uses_protocol <- function(taxon) { - taxa <- plant_taxa() - match_row <- match(taxon, taxa$taxon) - - if (is.na(match_row)) { - stop( - "Unknown taxon '", - taxon, - "'. Expected one of: ", - paste(taxa$taxon, collapse = ", "), - call. = FALSE - ) - } - - taxa$use_protocol[match_row] -} - -# 4. check_prediction_terms() ---- - -#' Check a Model Set Against Its Prediction Matrix -#' -#' Every habitat term a model fits is later predicted onto a row -#' of the prediction matrix, so a term the matrix has no column -#' for cannot be predicted. In v2 that surfaced only once fitting -#' reached the prediction step, as `object '' not found` -#' raised separately inside every bootstrap of every species. -#' Checking up front turns it into one readable failure. -#' -#' `Climate`, `Protocol` and `paspen` are excluded: they are -#' columns the model functions attach to the data themselves, and -#' the prediction matrix is not expected to carry them. -#' -#' @param models List of model formulas. -#' @param prediction_matrix Data frame. The prediction matrix the -#' fitted models are predicted onto, with `VegType` already -#' moved to the rownames. -#' @param what Character. Label for the model set, used in the -#' error message (e.g. "vegetation"). -#' @param source_note Character. Where the matrix came from, so -#' the message says what to fix. -#' @return NULL, invisibly. Stops when a term has no column. -#' -#' @example # Example usage of the function -#' # check_prediction_terms( -#' # vegetation.models, prediction.matrix, "vegetation" -#' # ) -check_prediction_terms <- function( - models, - prediction_matrix, - what, - source_note = "" -) { - # Step 1: Collect the habitat terms across the whole model set - attached_by_model_code <- c( - "pcount", "Climate", "Protocol", "paspen" - ) - - terms <- unique(unlist(lapply(models, all.vars))) - terms <- setdiff(terms, attached_by_model_code) - - # Step 2: Report every missing column at once - missing_terms <- setdiff(terms, colnames(prediction_matrix)) - - if (length(missing_terms) > 0) { - stop( - "The ", what, " prediction matrix has no column for ", - length(missing_terms), " term(s) the models fit:\n ", - paste(missing_terms, collapse = "\n "), - "\n", source_note, - call. = FALSE - ) - } - - invisible(NULL) -} - -# 5. load_plant_model_data() ---- - -#' Rebuild One Taxon's v2 Model Frames from the Test Dataset -#' -#' Joins the response, site and covariate tables into the three -#' frames the v2 plant scripts expect - `climate.data`, -#' `veg.data` and `soil.data` - and returns them alongside the -#' prediction matrices and species lists. -#' -#' `climate.data` is identity + response + climate covariates. -#' `veg.data` and `soil.data` are that frame plus their own -#' habitat block, which is how the v2 files were built: each -#' habitat frame is a superset of the climate frame, so a model -#' formula can name a species, a climate term and a habitat term -#' at once. -#' -#' @param taxon Character. One of the taxa in `plant_taxa()`. -#' @param data_dir Character. Path to 0_data/test_dataset. -#' @param species Character vector of species to model, or NULL -#' to keep every species the snapshot declares as modelled. -#' @return A list with `climate.data`, `veg.data`, `soil.data`, -#' `veg.pm`, `soil.pm`, `veg.species.list`, `soil.species.list` -#' and `veg_coef_names`. -#' -#' @example # Example usage of the function -#' # model_data <- load_plant_model_data( -#' # taxon = "bryophyte", -#' # data_dir = "0_data/test_dataset" -#' # ) -#' # dim(model_data$veg.data) -load_plant_model_data <- function( - taxon, - data_dir, - species = NULL -) { - taxon_uses_protocol(taxon) - - # Step 1: Confirm every file is present, so a missing covariate - # table fails here rather than as a cryptic formula error hours - # into a bootstrap run. - paths <- c( - sites = file.path(data_dir, "sites.csv"), - response = file.path(data_dir, paste0(taxon, ".csv")), - climate = file.path( - data_dir, "covariates", paste0(taxon, "_climate.csv") - ), - veg = file.path( - data_dir, "covariates", paste0(taxon, "_veg.csv") - ), - soil = file.path( - data_dir, "covariates", paste0(taxon, "_soil.csv") - ), - veg_pm = file.path( - data_dir, "lookup", "veg_prediction_matrix.csv" - ), - soil_pm = file.path( - data_dir, "lookup", "soil_prediction_matrix.csv" - ), - modelled = file.path( - data_dir, "lookup", "modelled_species.csv" - ) - ) - - missing_paths <- paths[!file.exists(paths)] - - if (length(missing_paths) > 0) { - stop( - "Test dataset files not found:\n ", - paste(missing_paths, collapse = "\n "), - "\nRun 1_code/_setup/01_harmonize_model_ready_v2.R first.", - call. = FALSE - ) - } - - read_table <- function(path) { - as.data.frame(fread(path, na.strings = "")) - } - - response <- read_table(paths[["response"]]) - climate_covariates <- read_table(paths[["climate"]]) - veg_covariates <- read_table(paths[["veg"]]) - soil_covariates <- read_table(paths[["soil"]]) - - # Step 2: Take the site fields back under their v2 names. The - # harmonizer factored them out of the covariate tables into - # sites.csv, so each value has one home; the v2 functions read - # them as NR, Lat and so on, and reference them by name. - site_fields <- c( - SiteYearQu = "survey_unit_id", - SiteYear = "site_year", - Site = "site", - Year = "year", - QUAD = "quadrant", - OnOffGrid = "on_off_grid", - Lat = "lat", - Long = "long", - Elevation = "elevation", - NR = "nr", - NSR = "nsr", - LufName = "luf", - Easting = "easting", - Northing = "northing" - ) - - sites <- read_table(paths[["sites"]])[, site_fields] - names(sites) <- names(site_fields) - - # Step 3: Put every table in the response table's row order, so - # the three frames stay aligned and reproduce the v2 ordering. - unit_ids <- as.character(response$survey_unit_id) - - align <- function(frame, what) { - row_order <- match(unit_ids, as.character(frame$survey_unit_id)) - - if (anyNA(row_order)) { - stop( - taxon, - ": ", - sum(is.na(row_order)), - " survey unit(s) in the response have no ", - what, - " row.", - call. = FALSE - ) - } - - frame[row_order, setdiff(names(frame), "survey_unit_id"), - drop = FALSE] - } - - site_rows <- sites[ - match(unit_ids, sites$SiteYearQu), , drop = FALSE - ] - - if (anyNA(site_rows$SiteYearQu)) { - stop( - taxon, - ": ", - sum(is.na(site_rows$SiteYearQu)), - " survey unit(s) in the response are absent from sites.csv.", - call. = FALSE - ) - } - - # Step 4: Assemble the climate frame - identity, response and - # climate covariates - then extend it with each habitat block. - species_columns <- response[ - , setdiff(names(response), "survey_unit_id"), drop = FALSE - ] - - climate.data <- cbind( - site_rows, - species_columns, - align(climate_covariates, "climate covariate") - ) - - # Step 4b: Recompute the terms that are products of other - # columns, using the same expressions - # 01a_data-standardization.R used. They are derived rather than - # stored so they stay exactly consistent with the columns they - # come from: a CSV carries about 15 significant digits, and a - # separately stored Northing2 would not equal Northing squared. - climate.data$Easting2 <- - climate.data$Easting * climate.data$Easting - climate.data$Northing2 <- - climate.data$Northing * climate.data$Northing - climate.data$EastingNorthing <- - climate.data$Northing * climate.data$Easting - climate.data$MAPPET <- climate.data$MAP * climate.data$PET - climate.data$MAT2 <- climate.data$MAT * climate.data$MAT - climate.data$CMDMAT <- climate.data$CMD * climate.data$MAT - climate.data$MWMT2 <- climate.data$MWMT * climate.data$MWMT - - veg_block <- align(veg_covariates, "vegetation covariate") - soil_block <- align(soil_covariates, "soil covariate") - - veg.data <- cbind(climate.data, veg_block) - soil.data <- cbind(climate.data, soil_block) - - # Step 5: Address rows both ways. The hierarchical models index - # by rownames and the validation matches on the SiteYearQu - # column, so the identifier has to be reachable as both. - for (frame_name in c("climate.data", "veg.data", "soil.data")) { - frame <- get(frame_name) - rownames(frame) <- frame$SiteYearQu - assign(frame_name, frame) - } - - # Step 6: Protocol is a factor in the v2 data, and the habitat - # formulas fit it as one. fread reads it as character, so it is - # converted back for the two taxa that carry it. - if (taxon_uses_protocol(taxon)) { - if (!"Protocol" %in% names(climate.data)) { - stop( - taxon, - " fits a Protocol term but no Protocol column was found ", - "in its climate covariates.", - call. = FALSE - ) - } - - climate.data$Protocol <- as.factor(climate.data$Protocol) - veg.data$Protocol <- as.factor(veg.data$Protocol) - soil.data$Protocol <- as.factor(soil.data$Protocol) - } - - # Step 7: Name the 87 habitat types the vegetation coefficient - # template is built from. They are the head of the vegetation - # block, which is the same set the v2 scripts reached by - # position; the rest of the block holds the aggregates the - # formulas call for, such as Peatland and CCDecidMixed234. - veg_coef_names <- names(veg_block)[1:87] - - # Step 8: Read the work queue, narrowed to `species` when the - # caller names one. The lists say which species each model set - # is fitted for, and they differ: a species can be common - # enough to model in the north and not in the south. - modelled <- read_table(paths[["modelled"]]) - modelled <- modelled[modelled$taxon == taxon, ] - - if (nrow(modelled) == 0) { - stop( - "No modelled species listed for ", - taxon, - " in lookup/modelled_species.csv.", - call. = FALSE - ) - } - - if (!is.null(species)) { - unknown <- setdiff(species, modelled$species) - - if (length(unknown) > 0) { - stop( - "Species not modelled for ", - taxon, - ":\n ", - paste(unknown, collapse = "\n "), - call. = FALSE - ) - } - - # Subsetting rather than reordering keeps the v2 queue order, - # so a narrowed run visits species in the same sequence. - modelled <- modelled[modelled$species %in% species, ] - } - - # Each list keeps its own v2 ordering, recorded per species by - # the harmonizer. The two differ, so neither can be recovered - # from the row order of modelled_species.csv alone. - veg_rows <- modelled[modelled$in_veg_models, ] - soil_rows <- modelled[modelled$in_soil_models, ] - - veg.species.list <- - veg_rows$species[order(veg_rows$veg_order)] - soil.species.list <- - soil_rows$species[order(soil_rows$soil_order)] - - message( - "Loaded ", - taxon, - ": ", - nrow(climate.data), - " survey units, ", - length(veg.species.list), - " vegetation and ", - length(soil.species.list), - " soil species" - ) - - return(list( - climate.data = climate.data, - veg.data = veg.data, - soil.data = soil.data, - veg.pm = read_table(paths[["veg_pm"]]), - soil.pm = read_table(paths[["soil_pm"]]), - veg.species.list = veg.species.list, - soil.species.list = soil.species.list, - veg_coef_names = veg_coef_names - )) -} - -# End of script ---- diff --git a/1_code/_deprecated/plants_functions/bootstrapping_functions.R b/1_code/_deprecated/plants_functions/bootstrapping_functions.R deleted file mode 100644 index fd87be9..0000000 --- a/1_code/_deprecated/plants_functions/bootstrapping_functions.R +++ /dev/null @@ -1,130 +0,0 @@ -# --- -# title: Bootstrapping functions -# author: Brandon Allen -# created: 2025-02-11 -# notes: Define functions that are used generating the bootstrap site list -# --- - -#' [Bootstrap data] -#' -#' [Creates a vector of site codes after thinning the recording data and performing a spatially explicate bootstrap sample.] -#' -#' @param [data] [Cleaned species and landcover data.] -#' @param [species] [Species code.] -#' @param [threshold] [Number of unique sites required to be considered sufficient for modeling.] -#' @param [boot] [Bootstrap iteration.] -#' @return [Creates a vector of site codes.] -#' - -bootstrap_data <- function(data, species, threshold = 20, boot) { - - # - # 1.0 Data standardization - # - - # Since we are treating each recording individually, we fix visit to 1 as we no longer need to apply this weight. - data["nQuadrant"] <- 1 - data$visit <- 1 - - # Create new column which is the observed count data (used for weighting in the age relationships), one for the converted probabilities - data["Count"] <- as.integer(ifelse(data[, species] > 0, 1, 0)) - data["pcount"] <- as.integer(ifelse(data[, species] > 0, 1, 0) / data$nQuadrant) - - # - # 2.0 Bootstrap - # If the boot index is 1, use the complete data set, - # otherwise perform subsampling with replacement based on block ID. - # - - # Check if there are at least 20 detections in each modeling region. - veg.detect <- sum(data$pcount[data$NR != "Grassland"]) - soil.detect <- sum(data$pcount[data$NR %in% c("Grassland", "Parkland")]) - - if (boot != 1) { - - unique.blocks <- unique(data$Block) - veg.site <- 0 - soil.site <- 0 - - # If both models are viable originally - if(veg.detect >= threshold & soil.detect >= threshold) { - - while (veg.site < threshold | soil.site < threshold) { - - data.in <- NULL - - for (sample_block in 1:length(unique.blocks)) { - - data.block <- data[grep(unique.blocks[sample_block], data$Block), ] - data.block <- data.block[sample(1:nrow(data.block), - nrow(data.block), replace=TRUE), ] - data.in <- rbind(data.in, data.block) - - } - - veg.site <- sum(ifelse(data.in[, "Count"] > 0, 1, 0)) - soil.site <- sum(ifelse(data.in[, "Count"] > 0, 1, 0)) - - } - - } - - # If only veg model is viable - if(veg.detect >= threshold & soil.detect < threshold) { - - while (veg.site < threshold) { - - data.in <- NULL - - for (sample_block in 1:length(unique.blocks)) { - - data.block <- data[grep(unique.blocks[sample_block], data$Block), ] - data.block <- data.block[sample(1:nrow(data.block), - nrow(data.block), replace=TRUE), ] - data.in <- rbind(data.in, data.block) - - } - - veg.site <- sum(ifelse(data.in[, "Count"] > 0, 1, 0)) - - } - - } - - # If only soil model is viable - if(veg.detect < threshold & soil.detect >= threshold) { - - while (soil.site < threshold) { - - data.in <- NULL - - for (sample_block in 1:length(unique.blocks)) { - - data.block <- data[grep(unique.blocks[sample_block], data$Block), ] - data.block <- data.block[sample(1:nrow(data.block), - nrow(data.block), replace=TRUE), ] - data.in <- rbind(data.in, data.block) - - } - - soil.site <- sum(ifelse(data.in[, "Count"] > 0, 1, 0)) - - } - - } - - - - } else { - - data.in <- data - - } - - # Return the unique IDs for the bootstrap iteration - boot.id <- data.frame(Boot = data.in$SiteYearQu) - colnames(boot.id)[1] <- paste0("Boot_", boot) - - return(boot.id) - -} diff --git a/1_code/_deprecated/plants_functions/hierarchical-model_functions.R b/1_code/_deprecated/plants_functions/hierarchical-model_functions.R deleted file mode 100644 index b38632b..0000000 --- a/1_code/_deprecated/plants_functions/hierarchical-model_functions.R +++ /dev/null @@ -1,981 +0,0 @@ -# --- -# title: Species hierarchical model functions -# author: Brandon Allen -# created: 2025-02-11 -# notes: Define functions that are used for performing the hierarchical modeling process. -# --- - -#' [Climate-space models] -#' -#' [Climate and spatial models that uses the spatially thinned data.] -#' -#' @param [species] [Focal species of interest.] -#' @param [data] [Cleaned species, climate, and landcover data.] -#' @param [boot.data] [List of site codes to be included for each species and bootstrap iteration.] -#' @param [climate.models] [List of climate model formulas to be assessed.] -#' @param [bioclim.models] [List of bioclim model formulas to be assessed.] -#' @param [space.models] [List of spatial model formulas to be assessed.] -#' @param [boot] [Defines bootstrap iteration.] -#' @return [Outputs vector of model coefficients defined in climate.models, bioclim.models, and space.models.] -#' - -climate_models <- function(species, data, boot.data, climate.models, bioclim.models, space.models, boot) { - - # - # 1.0 Data standardization - # - - # Since we are treating each recording individually, we fix visit to 1 as we no longer need to apply this weight. - data["nQuadrant"] <- 1 - data$visit <- 1 - - # Create new column which is the observed count data (used for weighting in the age relationships), one for the converted probabilities - data["Count"] <- as.integer(ifelse(data[, species] > 0, 1, 0)) - data["pcount"] <- as.integer(ifelse(data[, species] > 0, 1, 0) / data$nQuadrant) - data["TotalNoOfQU"] <- rep (1, nrow(data)) #Just add 1 - data["wt"] <- rep (1, nrow(data)) #Just add 1 - wt1<-data$TotalNoOfQU*data$wt # Kept for legacy purposes - - # 2.0 Bootstrap Selection - boot.data <- boot.data[[species]] - site.id <- boot.data[, paste0("Boot_", boot)] - data <- data[site.id, ] - - # - # 3.0 Climate Models - # - - space.climate.store <- list(NULL) - - for (model in 1:length(climate.models)) { - - space.climate.store[[model]] <- try(bayesglm(climate.models[[model]], - family = "binomial", - data = data, - maxit = 250)) - - } - - # Need to make sure all climate models get an update for these two variables - if(!is.null(bioclim.models)) { - - for (model.bioclim in 1:length(bioclim.models)) { - - # Calculate the length of the current model object and add to it - model.list.length <- length(climate.models) - - for (model.clim in 1:length(climate.models)) { - - # Define modifier for storing - space.climate.store[[model.clim + model.list.length]] <- try(update(space.climate.store[[model.clim]], bioclim.models[[model.bioclim]])) - - } - - } - - } - - # - # 4.0 Spatial Models - # - - if(!is.null(space.models)) { - - # Only add spatial updates for models without MAT, TD, PET (keep 1,3,5,6,7,17,19,20,21) - model.update.id <- c(1, 3, 5, 6, 7, 15, 17, 19, 20, 21) - - for (model.clim in model.update.id) { - - # Calculate the length of the current model object and add to it - model.list.length <- length(space.climate.store) - - for (model.space in 1:length(space.models)) { - - # Define modifier for storing - space.climate.store[[model.space + model.list.length]] <- try(update(space.climate.store[[model.clim]], space.models[[model.space]])) - - } - - } - - } - - # - # 5.0 Create ensemble and store - # - - modavg.sc <- model.avg(space.climate.store , rank = "AICc") - aicWtd.sc <- modavg.sc$coefficients["full", ] - - # Formatting to align variable names and keep intercept first - intercept.only <- aicWtd.sc[1] - names(intercept.only) <- "Intercept" - aicWtd.sc <- aicWtd.sc[-1] - aicWtd.sc <- aicWtd.sc[order(names(aicWtd.sc))] - aicWtd.sc <- c(intercept.only, aicWtd.sc) - - return(aicWtd.sc) - -} - -#' [Vegetation models] -#' -#' [Vegetation models that uses the spatially thinned data.] -#' -#' @param [species] [Focal species of interest.] -#' @param [data] [Cleaned species, climate, and landcover data.] -#' @param [boot.data] [List of site codes to be included for each species and bootstrap iteration.] -#' @param [habitat.models] [List of habitat model formulas to be assessed.] -#' @param [prediction.matrix] [Prediction matrix used for converting model coefficients to standardized habitat classes.] -#' @param [climate.coef] [List of climate coefficients calculated from the detection_models function.] -#' @param [weight.method] [Method used for weighting model coefficients. Inverse variance weighted is the only available method currently.] -#' @param [coef.template] [Vector template used to define valid model coefficients] -#' @param [protocol.flag] [Flag that determines if we need to account for differences in sample protocols] -#' @param [coef.adjust] [Flag used to determine if poorly sampled human footprint coefficients are adjusted based on similar feature types.] -#' @param [boot] [Defines bootstrap iteration.] -#' @return [Outputs vector of model coefficients defined in habitat.models.] -#' - -vegetation_models <- function(species, data, boot.data, habitat.models, prediction.matrix, - climate.coef, weight.method = "IVW", coef.template, - protocol.flag, coef.adjust = TRUE, boot) { - - # - # 1.0 Data standardization - # - - # Since we are treating each recording individually, we fix visit to 1 as we no longer need to apply this weight. - data["nQuadrant"] <- 1 - data$visit <- 1 - - # Create new column which is the observed count data (used for weighting in the age relationships), one for the converted probabilities - data["Count"] <- as.integer(ifelse(data[, species] > 0, 1, 0)) - data["pcount"] <- as.integer(ifelse(data[, species] > 0, 1, 0) / data$nQuadrant) - - # 1.1 Bootstrap Selection - boot.data <- boot.data[[species]] - site.id <- boot.data[, paste0("Boot_", boot)] - data <- data[site.id, ] - - # 1.2 Regional filter - data <- data[!(data$NR %in% c("Grassland")), ] - - # If the number of detections for the species is less than 20, skip - if(sum(data$Count) < 20) { - - coef.results <- coef.template - coef.se.results <- coef.results - names(coef.se.results) <- paste0(names(coef.se.results), ".SE") - coef.results <- c(coef.results, coef.se.results) - return(coef.results) - - } - - # 1.3 Define the templates for coefficients - coef.results <- coef.template - coef.se.results <- coef.template - - # - # 3.0 Climate Predictions - # - - # Using the matching climate model, create the prediction that will be used - # Add the intercept and extract climate coefficients - data$Intercept <- 1 - climate.dect.coef <- climate.coef[[species]][boot, ] - climate.veg <- as.matrix(data[, names(climate.dect.coef)]) - - # Predict space/climate component (Probability scale) - data$Climate <- plogis(drop(climate.veg %*% climate.dect.coef)) - - # - # 4.0 Vegetation Model - # - - # Loop through the models - landscape.store <- list(NULL) - - for (model in 1:length(habitat.models)) { - - landscape.store[[model]] <- try(bayesglm(habitat.models[[model]], family = "binomial", - data = data, - maxit = 250)) - - } - - # - # 5.0 Store the coefficients - # - - nModels <- length(habitat.models) - p1 <- p1.se <- array(0, c(length(habitat.models), nrow(prediction.matrix))) # Predictions for each model for each soil and HF type type. These are the main coefficients - colnames(p1) <- colnames(p1.se) <- rownames(prediction.matrix) - p.site1 <- p.site1.se <- array(0, c(nModels, nrow(data))) # Predictions for each model and each site. These are used as the offsets in the next stage - - # If there is a protocol coefficient, add it to the list, otherwise only store the climate coefficient - if(protocol.flag == TRUE) { - - p1.climate <- p1.climate.se <- array(0, c(length(habitat.models), 3)) - colnames(p1.climate) <- colnames(p1.climate.se) <- c("Intercept", "Climate", "Protocol") - - } else { - - p1.climate <- p1.climate.se <- array(0, c(length(habitat.models), 2)) - colnames(p1.climate) <- colnames(p1.climate.se) <- c("Intercept", "Climate") - - } - - for (i in 1:nModels) { - - if (class(landscape.store[[i]])[1] != "try-error") { # Prediction is 0 if model failed, but this is not used because AIC wt would equal 0 - - if(protocol.flag == TRUE) { - - plot.data <- data.frame(prediction.matrix, - Climate = 0, - Protocol = as.factor("New")) - - } else { - - plot.data <- data.frame(prediction.matrix, - Climate = 0) - - } - - p <- predict(landscape.store[[i]], newdata = plot.data, se.fit = TRUE) # For each type. Predictions made at 0% Aspen. All predictions made with new protocol. Aspen effect added later, and plotted as separate points - p1[i,] <- p$fit - p1.se[i,] <- p$se.fit - - model.fit <- predict(landscape.store[[i]], se.fit = TRUE) - p.site1[i,] <- model.fit$fit # For each site (using the original d.sp data frame) - p.site1.se[i,] <- model.fit$se.fit # For each site SE - - # Extract the climate and intercept coefficients - # We weight them separately, but then add them together to create the final coefficient - - # Coef storage (Extracts only the number of coefficients equal to object) - p <- summary(landscape.store[[i]])$coefficients[1:ncol(p1.climate),1] # For each type. - names(p)[1] <- "Intercept" - p1.climate[i, ] <- p - - # Standard error storage - p <- summary(landscape.store[[i]])$coefficients[1:ncol(p1.climate),2] # For each type. - names(p)[1] <- "Intercept" - p1.climate.se[i, ] <- p - - } - - } - - # - # 6.0 Weight the models - # - - if (weight.method == "IVW") { - - # - # Landcover - # - - tTypeMean <- tTypeVar <- NULL # Logit-scaled IVW for each veg type - - mod.converged <- NULL - for (i in 1:nModels) {mod.converged[i] <- landscape.store[[i]]$converged} - - # If there SE is 0 for a coefficient, fix it to a small value to avoid INF - p1.se[p1.se == 0] <- 0.0001 - - for (i in 1:nrow(prediction.matrix)) { - - # Note for me, the SE should be the mean not the sum. Otherwise the SE will converge to 0 - tTypeMean[i] <- sum(p1[mod.converged ,i] / p1.se[mod.converged ,i]^2) / sum(1/p1.se[mod.converged ,i]^2)# IVW mean of nModels for each veg type, on transformed scale - # Double check this tTypeVar[i]<- 1/mean(1/p1.se[mod.converged ,i]^2 ) # IVW variance of mean... - tTypeVar[i]<- 1/sum(1/p1.se[mod.converged ,i]^2 ) # IVW variance of mean... - - } - - # Weight the site level predictions - data$prediction <- colSums(p.site1/ p.site1.se^2) / colSums(1/p.site1.se^2) # Add logit-scaled model average prediction to data frame - - # Add names - names(tTypeMean) <- names(tTypeVar) <- rownames(prediction.matrix) - - # Put coefficients in Coef matrix (and SE's) - coef.results[na.omit(match(names(tTypeMean), names(coef.results)))] <- tTypeMean[names(coef.results)[na.omit(match(names(tTypeMean), names(coef.results)))]] # On logit scale - coef.se.results[na.omit(match(names(tTypeVar), names(coef.se.results)))] <- sqrt(tTypeVar[names(coef.se.results)[na.omit(match(names(tTypeVar), names(coef.se.results)))]]) # On logit scale - - # - # Climate - # - - tClimateMean <- tClimateVar <- NULL # Logit-scaled IVW for each climate - - mod.converged <- NULL - for (i in 1:nModels) {mod.converged[i] <- landscape.store[[i]]$converged} - - # If there SE is 0 for a coefficient, fix it to a small value to avoid INF - p1.climate.se[p1.climate.se == 0] <- 0.0001 - - for (i in 1:ncol(p1.climate)) { - - # Note for me, the SE should be the mean not the sum. Otherwise the SE will converge to 0 - tClimateMean[i] <- sum(p1.climate[mod.converged ,i] / p1.climate.se[mod.converged ,i]^2) / sum(1/p1.climate.se[mod.converged ,i]^2)# IVW mean of nModels for each veg type, on transformed scale - # Double check this tTypeVar[i]<- 1/mean(1/p1.se[mod.converged ,i]^2 ) # IVW variance of mean... - tClimateVar[i]<- 1/sum(1/p1.climate.se[mod.converged ,i]^2 ) # IVW variance of mean... - - } - - - # Add the intercept coefficient to the table - coef.results["Intercept"] <- tClimateMean[1] # On logit scale - coef.se.results["Intercept"] <- tClimateVar[1] # On logit scale - - # Add the climate coefficient to the table - coef.results["Climate"] <- tClimateMean[2] # On logit scale - coef.se.results["Climate"] <- tClimateVar[2] # On logit scale - - # Store protocol coefficient if modeled - if (protocol.flag == TRUE) { - - coef.results["Protocol"] <- tClimateMean[3] # On logit scale - coef.se.results["Protocol"] <- tClimateVar[3] # On logit scale - - } - - - } - - # # Currently only implement the IWV - # if (weight.method == "AIC") { - # - # # AIC calculation (I'm using AIC here, because this is primarily for prediction, rather than finding a minimial best model) - # aic.ta <- rep(999999999, (nModels)) - # - # for (i in 1:(nModels)) { - # - # if (!is.null(landscape.store[[i]]) & class(landscape.store[[i]])[1] != "try-error") { # last part is to not used non-converged models, unless none converged - # aic.ta[i] <- AICc(landscape.store[[i]]) - # } - # - # } - # - # aic.delta <- aic.ta - min(aic.ta) - # aic.exp <- exp(-1 / 2 * aic.delta) - # aic.wt.ta <- aic.exp / sum(aic.exp) - # - # tTypeMean <- tTypeVar <- NULL # Logit-scaled model averages for each veg type - # - # aic.wt.ta.adj <- ifelse(aic.wt.ta < 0.01, 0, aic.wt.ta) # Use adjusted weight to avoid poor fitting models with extreme values for certain types (usually numerically equivalent to 0's or 1's) - # aic.wt.ta.adj <- aic.wt.ta.adj / sum(aic.wt.ta.adj) - # - # # Add the site level prediction based on the ensemble - # # Convert to probabilities for the age estimation - # data$prediction <- colSums(p.site1 * aic.wt.ta.adj) - # - # for (i in 1:nrow(prediction.matrix)) { - # - # tTypeMean[i] <- sum(aic.wt.ta.adj * p1[, i]) # Mean of nModels for each veg type, on transformed scale - # #tTypeVar[i] <- sum(aic.wt.ta.adj * sqrt(p1.se[, i]^2 + (rep(tTypeMean[i], nModels) - p1[, i])^2))^2 # AIC-weighted variance of mean... - # - # } - # - # names(tTypeMean) <- rownames(prediction.matrix) # Rename the final intercept coefficient to productive - # - # # Put coefficients in Coef matrix (and SE's) - # coef.results[na.omit(match(names(tTypeMean), names(coef.results)))] <- tTypeMean[names(coef.results)[na.omit(match(names(tTypeMean), names(coef.results)))]] # On logit scale - # coef.se.results[na.omit(match(names(tTypeVar), names(coef.se.results)))] <- sqrt(tTypeVar[names(coef.se.results)[na.omit(match(names(tTypeVar), names(coef.se.results)))]]) # On logit scale - # - # - # } - - # - # 7.0 Create the forest age relationships - # - - # 7.1 Set up separate dataframes for sites containing a minimum amount of each broad stand type - stand.data <- list(WhiteSpruce = NULL, Pine = NULL, - Deciduous = NULL, Mixedwood = NULL, - BlackSpruce = NULL) - - cutoff.pc.for.age <- 0.1 # Set the cut-off for the minimum proportion of a stand type for a site to be included in the age analysis for a stand type - pSoftLin <- c(0.049, 0.0893, 0.434, 0.396) # Values based on overlap of softlin and the stand types in the 1km summary file. Lowland spruce includes other wetlands. Updated proportions 2020-11-17 - pSoftLin <- pSoftLin / sum(pSoftLin) # Make sure they sum to zero - aic.age <- array(NA, c(1, 4)) - stand.name <- c("WhiteSpruce", "Pine", "Deciduous", "Mixedwood", "BlackSpruce") - - for (i in 0:8) { # Add sites with each age class of the stand type to a separate data frames for each stand type - - i1 <- ifelse(i == 0, "R", i) # For variable name - i2 <- ifelse(i == 0, 0.5, i) # For twenty-year age - - for (stand.id in 1:length(stand.name)) { - - temp.name <- paste(stand.name[stand.id], i1, sep = "") # Col name - if (sum(data[ ,temp.name] > cutoff.pc.for.age) > 0) { - - stand.data[[stand.name[stand.id]]] <- rbind(stand.data[[stand.name[stand.id]]], - data.frame(pCount = data[data[, temp.name] > cutoff.pc.for.age, "Count"] / data$nQuadrant[data[, temp.name] > cutoff.pc.for.age], - age = i2, - wt1 = data[data[, temp.name] > cutoff.pc.for.age, temp.name]*data$visit[data[, temp.name] > cutoff.pc.for.age]*data$nQuadrant[data[, temp.name] > cutoff.pc.for.age], - p = data$prediction[data[, temp.name] > cutoff.pc.for.age])) # Weight is the proportion of the site of that age class and stand type, multiplied by the original weight (which accounts for revisited sites) and the number of binomial trials - - } - - } - - } - - rm(stand.name) - - # For upland forests, add grass sites as age 1, but with half the normal weight - d.grass <- data[data[, "Grass"] > cutoff.pc.for.age, ] # Select sites with grass (to make lines below less unruly) - pWhiteSpruce <- d.grass$WhiteSpruce / (d.grass$WhiteSpruce + d.grass$Pine + d.grass$Deciduous + d.grass$Mixedwood + d.grass$BlackSpruce + 0.01) - pPine <- d.grass$Pine / (d.grass$WhiteSpruce + d.grass$Pine + d.grass$Deciduous + d.grass$Mixedwood + d.grass$BlackSpruce + 0.01) - pDeciduous <- d.grass$Deciduous / (d.grass$WhiteSpruce + d.grass$Pine + d.grass$Deciduous + d.grass$Mixedwood + d.grass$BlackSpruce + 0.01) - pMixedwood <- d.grass$WhiteSpruce / (d.grass$WhiteSpruce + d.grass$Pine + d.grass$Deciduous + d.grass$Mixedwood + d.grass$BlackSpruce + 0.01) - - # If there are no sites to add, don't bind - if(sum(pWhiteSpruce) != 0) {stand.data$WhiteSpruce <- rbind(stand.data$WhiteSpruce, data.frame(pCount = d.grass[pWhiteSpruce > 0, "Count"] / d.grass$nQuadrant[pWhiteSpruce > 0], age = 0.5, wt1 = d.grass[pWhiteSpruce > 0, "Grass"]/2*d.grass$visit[pWhiteSpruce > 0]*d.grass$nQuadrant[pWhiteSpruce > 0]*pWhiteSpruce[pWhiteSpruce > 0], p = d.grass$prediction[pWhiteSpruce > 0]))} - if(sum(pPine) != 0) {stand.data$Pine <- rbind(stand.data$Pine, data.frame(pCount = d.grass[pPine > 0, "Count"] / d.grass$nQuadrant[pPine>0], age = 0.5, wt1 = d.grass[pPine>0,"Grass"]/2*d.grass$visit[pPine>0]*d.grass$nQuadrant[pPine>0]*pPine[pPine>0], p = d.grass$prediction[pPine>0]))} - if(sum(pDeciduous) != 0) {stand.data$Deciduous <- rbind(stand.data$Deciduous, data.frame(pCount = d.grass[pDeciduous > 0, "Count"] / d.grass$nQuadrant[pDeciduous > 0], age = 0.5, wt1 = d.grass[pDeciduous > 0, "Grass"] / 2*d.grass$visit[pDeciduous > 0]*d.grass$nQuadrant[pDeciduous > 0]*pDeciduous[pDeciduous > 0], p = d.grass$prediction[pDeciduous > 0]))} - if(sum(pMixedwood) != 0) {stand.data$Mixedwood <- rbind(stand.data$Mixedwood, data.frame(pCount = d.grass[pMixedwood > 0, "Count"] / d.grass$nQuadrant[pMixedwood > 0], age = 0.5, wt1 = d.grass[pMixedwood > 0, "Grass"] / 2*d.grass$visit[pMixedwood > 0]*d.grass$nQuadrant[pMixedwood > 0]*pMixedwood[pMixedwood > 0], p = d.grass$prediction[pMixedwood > 0]))} - - # And same for sites with shrubs - d.shrub <- data[data[, "Shrub"] > cutoff.pc.for.age,] # Select sites with shrubs (to make lines below less unruly) - pWhiteSpruce <- d.shrub$WhiteSpruce / (d.shrub$WhiteSpruce + d.shrub$Pine + d.shrub$Deciduous + d.shrub$Mixedwood + d.shrub$BlackSpruce + 0.01) - pPine <- d.shrub$Pine / (d.shrub$WhiteSpruce + d.shrub$Pine + d.shrub$Deciduous + d.shrub$Mixedwood + d.shrub$BlackSpruce + 0.01) - pDeciduous <- d.shrub$Deciduous / (d.shrub$WhiteSpruce + d.shrub$Pine + d.shrub$Deciduous + d.shrub$Mixedwood + d.shrub$BlackSpruce + 0.01) - pMixedwood <- d.shrub$WhiteSpruce / (d.shrub$WhiteSpruce + d.shrub$Pine + d.shrub$Deciduous + d.shrub$Mixedwood + d.shrub$BlackSpruce + 0.01) - - if(sum(pWhiteSpruce) != 0) {stand.data$WhiteSpruce <- rbind(stand.data$WhiteSpruce, data.frame(pCount = d.shrub[pWhiteSpruce > 0 , "Count"] / d.shrub$nQuadrant[pWhiteSpruce > 0], age = 1, wt1 = d.shrub[pWhiteSpruce > 0, "Shrub"] / 2*d.shrub$visit[pWhiteSpruce > 0]*d.shrub$nQuadrant[pWhiteSpruce > 0]*pWhiteSpruce[pWhiteSpruce > 0], p = d.shrub$prediction[pWhiteSpruce > 0]))} - if(sum(pPine) != 0) {stand.data$Pine <- rbind(stand.data$Pine, data.frame(pCount = d.shrub[pPine > 0, "Count"] / d.shrub$nQuadrant[pPine > 0], age = 1, wt1 = d.shrub[pPine > 0, "Shrub"] / 2*d.shrub$visit[pPine > 0]*d.shrub$nQuadrant[pPine > 0]*pPine[pPine > 0], p = d.shrub$prediction[pPine > 0]))} - if(sum(pDeciduous) != 0) {stand.data$Deciduous <- rbind(stand.data$Deciduous, data.frame(pCount = d.shrub[pDeciduous > 0, "Count"] / d.shrub$nQuadrant[pDeciduous > 0], age = 1, wt1 = d.shrub[pDeciduous > 0, "Shrub"] / 2*d.shrub$visit[pDeciduous > 0]*d.shrub$nQuadrant[pDeciduous > 0]*pDeciduous[pDeciduous > 0], p = d.shrub$prediction[pDeciduous > 0]))} - if(sum(pMixedwood) != 0) {stand.data$Mixedwood <- rbind(stand.data$Mixedwood, data.frame(pCount = d.shrub[pMixedwood > 0, "Count"] / d.shrub$nQuadrant[pMixedwood > 0], age = 1, wt1 = d.shrub[pMixedwood > 0, "Shrub"] / 2*d.shrub$visit[pMixedwood > 0]*d.shrub$nQuadrant[pMixedwood > 0]*pMixedwood[pMixedwood > 0], p = d.shrub$prediction[pMixedwood > 0]))} - - # Combined data frames for models using more than one stand type - stand.data$Conifpine <- rbind(cbind(stand.data$WhiteSpruce, Sp = "WhiteSpruce"), cbind(stand.data$Pine, Sp = "Pine")) - stand.data$Decidmixed <- rbind(cbind(stand.data$Deciduous, Sp = "Decid"), cbind(stand.data$Mixedwood, Sp = "Mixed")) - stand.data$All <- rbind(cbind(stand.data$WhiteSpruce, Sp = "WhiteSpruce"), cbind(stand.data$Pine, Sp = "Pine"), cbind(stand.data$Deciduous, Sp = "Decid"), cbind(stand.data$Mixedwood, Sp = "Mixed"), cbind(stand.data$BlackSpruce, Sp = "BlackSpruce")) - - # 6.2 Then fit models of age functions - ndet <- 8 - m.age <- list(NULL) # Age models for each of the 5 stand types plus 3 combinations - if (sum(sign(stand.data$WhiteSpruce$pCount)) > ndet) { - m.age[[1]] <- gam(pCount~s(sqrt(age),k = 3,m = 2) + offset(p), data = stand.data$WhiteSpruce, family = "binomial", weights = wt1) # Fit spline through age data for that stand type if enough records - } else { - m.age[[1]] <- gam(pCount~1 + offset(p), data = stand.data$WhiteSpruce, family = "binomial", weights = wt1) # Fit constant only if too few records in that stand type - } - if (sum(sign(stand.data$Pine$pCount)) > ndet) { - m.age[[2]] <- gam(pCount~s(sqrt(age),k = 3,m = 2) + offset(p), data = stand.data$Pine, family = "binomial", weights = wt1) - } else { - m.age[[2]] <- gam(pCount~1 + offset(p), data = stand.data$Pine, family = "binomial", weights = wt1) - } - if (sum(sign(stand.data$Deciduous$pCount)) > ndet) { - m.age[[3]] <- gam(pCount~s(sqrt(age),k = 3,m = 2) + offset(p), data = stand.data$Deciduous, family = "binomial", weights = wt1) - } else { - m.age[[3]] <- gam(pCount~1 + offset(p), data = stand.data$Deciduous, family = "binomial", weights = wt1) - } - if (sum(sign(stand.data$Mixedwood$pCount)) > ndet) { - m.age[[4]] <- gam(pCount~s(sqrt(age),k = 3,m = 2) + offset(p), data = stand.data$Mixedwood, family = "binomial", weights = wt1) - } else { - m.age[[4]] <- gam(pCount~1 + offset(p), data = stand.data$Mixedwood, family = "binomial", weights = wt1) - } - if (sum(sign(stand.data$BlackSpruce$pCount)) > ndet) { - m.age[[5]] <- gam(pCount~s(sqrt(age),k = 3,m = 2) + offset(p), data = stand.data$BlackSpruce, family = "binomial", weights = wt1) - } else { - m.age[[5]] <- gam(pCount~1 + offset(p), data = stand.data$BlackSpruce, family = "binomial", weights = wt1) - } - if (sum(sign(stand.data$Conifpine$pCount)) > ndet) { - m.age[[6]] <- gam(pCount~s(sqrt(age),k = 3,m = 2) + offset(p), data = stand.data$Conifpine, family = "binomial", weights = wt1) - } else { - m.age[[6]] <- gam(pCount~1 + offset(p), data = stand.data$Conifpine, family = "binomial", weights = wt1) - } - if (sum(sign(stand.data$Decidmixed$pCount)) > ndet) { - m.age[[7]] <- gam(pCount~s(sqrt(age),k = 3,m = 2) + offset(p), data = stand.data$Decidmixed, family = "binomial", weights = wt1) - } else { - m.age[[7]] <- gam(pCount~1 + offset(p), data = stand.data$Decidmixed, family = "binomial", weights = wt1) - } - if (sum(sign(stand.data$All$pCount)) > ndet) { - m.age[[8]] <- gam(pCount~s(sqrt(age),k = 3,m = 2) + offset(p), data = stand.data$All, family = "binomial", weights = wt1) - } else { - m.age[[8]] <- gam(pCount~1 + offset(p), data = stand.data$All, family = "binomial", weights = wt1) - } - - # Added an intercept only model. Prevents the simple model 8 from producing curves - # when we effectively have no age relationships. Even if we have enough data to attempt a curve. - m.age[[9]] <- gam(pCount~1 + offset(p), data = stand.data$All, family = "binomial", weights = wt1) - - # AIC for options - each separate, pairwise combinations, combine all - aic.age[1,1] <- AIC(m.age[[1]]) + AIC(m.age[[2]]) + AIC(m.age[[3]]) + AIC(m.age[[4]]) + AIC(m.age[[5]])-4 # Minus 4 for the 4 extra variances - aic.age[1,2] <- AIC(m.age[[5]]) + AIC(m.age[[6]]) + AIC(m.age[[7]])-2 - aic.age[1,3] <- AIC(m.age[[8]]) - aic.age[1,4] <- AIC(m.age[[9]]) - - # 7.3. Predict coefficients (and logit-scale SE) for each age class for each stand type - if (which.min(aic.age[1, ]) == 1) { - - p3 <- predict(m.age[[1]], newdata = data.frame(age = c(0.5,1:8), p = tTypeMean["WhiteSpruce"]), se.fit = T) - coef.results[which(names(coef.results) == "WhiteSpruceR"):which(names(coef.results) == "WhiteSpruce8")] <- p3$fit # Coefficient on logit scale - coef.se.results[which(names(coef.results) == "WhiteSpruceR"):which(names(coef.results) == "WhiteSpruce8")] <- p3$se.fit # SE still on the logit scale - - p3 <- predict(m.age[[2]], newdata = data.frame(age = c(0.5,1:8), p = tTypeMean["Pine"]), se.fit = T) - coef.results[which(names(coef.results) == "PineR"):which(names(coef.results) == "Pine8")] <- p3$fit # Coefficient on logit scale - coef.se.results[which(names(coef.results) == "PineR"):which(names(coef.results) == "Pine8")] <- p3$se.fit # SE still on the logit scale - - p3 <- predict(m.age[[3]], newdata = data.frame(age = c(0.5,1:8), p = tTypeMean["Deciduous"]), se.fit = T) - coef.results[which(names(coef.results) == "DeciduousR"):which(names(coef.results) == "Deciduous8")] <- p3$fit # Coefficient on logit scale - coef.se.results[which(names(coef.results) == "DeciduousR"):which(names(coef.results) == "Deciduous8")] <- p3$se.fit # SE still on the logit scale - - p3 <- predict(m.age[[4]], newdata = data.frame(age = c(0.5,1:8), p = tTypeMean["Mixedwood"]), se.fit = T) - coef.results[which(names(coef.results) == "MixedwoodR"):which(names(coef.results) == "Mixedwood8")] <- p3$fit # Coefficient on logit scale - coef.se.results[which(names(coef.results) == "MixedwoodR"):which(names(coef.results) == "Mixedwood8")] <- p3$se.fit # SE still on the logit scale - - p3 <- predict(m.age[[5]], newdata = data.frame(age = c(0.5,1:8), p = tTypeMean["BlackSpruce"]), se.fit = T) - coef.results[which(names(coef.results) == "BlackSpruceR"):which(names(coef.results) == "BlackSpruce8")] <- p3$fit # Coefficient on logit scale - coef.se.results[which(names(coef.results) == "BlackSpruceR"):which(names(coef.results) == "BlackSpruce8")] <- p3$se.fit # SE still on the logit scale - - } - - if (which.min(aic.age[1, ]) == 2) { - - p3 <- predict(m.age[[6]], newdata = data.frame(age = c(0.5,1:8), p = tTypeMean["WhiteSpruce"]), se.fit = T) - coef.results[which(names(coef.results) == "WhiteSpruceR"):which(names(coef.results) == "WhiteSpruce8")] <- p3$fit # Coefficient on logit scale - coef.se.results[which(names(coef.results) == "WhiteSpruceR"):which(names(coef.results) == "WhiteSpruce8")] <- p3$se.fit # SE still on the logit scale - - p3 <- predict(m.age[[6]], newdata = data.frame(age = c(0.5,1:8), p = tTypeMean["Pine"]), se.fit = T) - coef.results[which(names(coef.results) == "PineR"):which(names(coef.results) == "Pine8")] <- p3$fit # Coefficient on logit scale - coef.se.results[which(names(coef.results) == "PineR"):which(names(coef.results) == "Pine8")] <- p3$se.fit # SE still on the logit scale - - p3 <- predict(m.age[[7]], newdata = data.frame(age = c(0.5,1:8), p = tTypeMean["Deciduous"]), se.fit = T) - coef.results[which(names(coef.results) == "DeciduousR"):which(names(coef.results) == "Deciduous8")] <- p3$fit # Coefficient on logit scale - coef.se.results[which(names(coef.results) == "DeciduousR"):which(names(coef.results) == "Deciduous8")] <- p3$se.fit # SE still on the logit scale - - p3 <- predict(m.age[[7]], newdata = data.frame(age = c(0.5,1:8), p = tTypeMean["Mixedwood"]), se.fit = T) - coef.results[which(names(coef.results) == "MixedwoodR"):which(names(coef.results) == "Mixedwood8")] <- p3$fit # Coefficient on logit scale - coef.se.results[which(names(coef.results) == "MixedwoodR"):which(names(coef.results) == "Mixedwood8")] <- p3$se.fit # SE still on the logit scale - - p3 <- predict(m.age[[5]], newdata = data.frame(age = c(0.5,1:8), p = tTypeMean["BlackSpruce"]), se.fit = T) - coef.results[which(names(coef.results) == "BlackSpruceR"):which(names(coef.results) == "BlackSpruce8")] <- p3$fit # Coefficient on logit scale - coef.se.results[which(names(coef.results) == "BlackSpruceR"):which(names(coef.results) == "BlackSpruce8")] <- p3$se.fit # SE still on the logit scale - - } - - if (which.min(aic.age[1, ]) == 3) { - - p3 <- predict(m.age[[8]], newdata = data.frame(age = c(0.5,1:8), p = tTypeMean["WhiteSpruce"]), se.fit = T) - coef.results[which(names(coef.results) == "WhiteSpruceR"):which(names(coef.results) == "WhiteSpruce8")] <- p3$fit # Coefficient on logit scale - coef.se.results[which(names(coef.results) == "WhiteSpruceR"):which(names(coef.results) == "WhiteSpruce8")] <- p3$se.fit # SE still on the logit scale - - p3 <- predict(m.age[[8]], newdata = data.frame(age = c(0.5,1:8), p = tTypeMean["Pine"]), se.fit = T) - coef.results[which(names(coef.results) == "PineR"):which(names(coef.results) == "Pine8")] <- p3$fit # Coefficient on logit scale - coef.se.results[which(names(coef.results) == "PineR"):which(names(coef.results) == "Pine8")] <- p3$se.fit # SE still on the logit scale - - p3 <- predict(m.age[[8]], newdata = data.frame(age = c(0.5,1:8), p = tTypeMean["Deciduous"]), se.fit = T) - coef.results[which(names(coef.results) == "DeciduousR"):which(names(coef.results) == "Deciduous8")] <- p3$fit # Coefficient on logit scale - coef.se.results[which(names(coef.results) == "DeciduousR"):which(names(coef.results) == "Deciduous8")] <- p3$se.fit # SE still on the logit scale - - p3 <- predict(m.age[[8]], newdata = data.frame(age = c(0.5,1:8), p = tTypeMean["Mixedwood"]), se.fit = T) - coef.results[which(names(coef.results) == "MixedwoodR"):which(names(coef.results) == "Mixedwood8")] <- p3$fit # Coefficient on logit scale - coef.se.results[which(names(coef.results) == "MixedwoodR"):which(names(coef.results) == "Mixedwood8")] <- p3$se.fit # SE still on the logit scale - - p3 <- predict(m.age[[8]], newdata = data.frame(age = c(0.5,1:8), p = tTypeMean["BlackSpruce"]), se.fit = T) - coef.results[which(names(coef.results) == "BlackSpruceR"):which(names(coef.results) == "BlackSpruce8")] <- p3$fit # Coefficient on logit scale - coef.se.results[which(names(coef.results) == "BlackSpruceR"):which(names(coef.results) == "BlackSpruce8")] <- p3$se.fit # SE still on the logit scale - - } - - - if (which.min(aic.age[1, ]) == 4) { - - p3 <- predict(m.age[[9]], newdata = data.frame(age = c(0.5,1:8), p = tTypeMean["WhiteSpruce"]), se.fit = T) - coef.results[which(names(coef.results) == "WhiteSpruceR"):which(names(coef.results) == "WhiteSpruce8")] <- p3$fit # Coefficient on logit scale - coef.se.results[which(names(coef.results) == "WhiteSpruceR"):which(names(coef.results) == "WhiteSpruce8")] <- p3$se.fit # SE still on the logit scale - - p3 <- predict(m.age[[9]], newdata = data.frame(age = c(0.5,1:8), p = tTypeMean["Pine"]), se.fit = T) - coef.results[which(names(coef.results) == "PineR"):which(names(coef.results) == "Pine8")] <- p3$fit # Coefficient on logit scale - coef.se.results[which(names(coef.results) == "PineR"):which(names(coef.results) == "Pine8")] <- p3$se.fit # SE still on the logit scale - - p3 <- predict(m.age[[9]], newdata = data.frame(age = c(0.5,1:8), p = tTypeMean["Deciduous"]), se.fit = T) - coef.results[which(names(coef.results) == "DeciduousR"):which(names(coef.results) == "Deciduous8")] <- p3$fit # Coefficient on logit scale - coef.se.results[which(names(coef.results) == "DeciduousR"):which(names(coef.results) == "Deciduous8")] <- p3$se.fit # SE still on the logit scale - - p3 <- predict(m.age[[9]], newdata = data.frame(age = c(0.5,1:8), p = tTypeMean["Mixedwood"]), se.fit = T) - coef.results[which(names(coef.results) == "MixedwoodR"):which(names(coef.results) == "Mixedwood8")] <- p3$fit # Coefficient on logit scale - coef.se.results[which(names(coef.results) == "MixedwoodR"):which(names(coef.results) == "Mixedwood8")] <- p3$se.fit # SE still on the logit scale - - p3 <- predict(m.age[[9]], newdata = data.frame(age = c(0.5,1:8), p = tTypeMean["BlackSpruce"]), se.fit = T) - coef.results[which(names(coef.results) == "BlackSpruceR"):which(names(coef.results) == "BlackSpruce8")] <- p3$fit # Coefficient on logit scale - coef.se.results[which(names(coef.results) == "BlackSpruceR"):which(names(coef.results) == "BlackSpruce8")] <- p3$se.fit # SE still on the logit scale - - } - - # Will need to think of something else - # # 7.4 Adjust SE for estimates that are numerically equivalent to 0 - use exact binomial CI - # i4 <- which(is.na(coef.results) | coef.results < 0.0001) - # coef.results[i4] <- 0.0001 - # ntrials <- (colSums(data[, match(names(coef.results), names(data), nomatch = 0)])*2) + 1 # *2 because many rare types (which have the 0's are estimated from groups of types), + 1 to avoid failure for old cutblocks, - # for (i5 in i4) coef.se.results[i5] <- (qlogis(binom.confint(0, ntrials[i5], conf.level = 0.9)[5,6]) - qlogis(0.0001)) / 1.65 # That conf/level gives 1SE. Value is on logit scale, assuming estimate of 0.0001. This is set up so that when 90% CI's are ploted below, they will return the exact 90% binom confints - - # 7.5 Converge CC to natural trajectory - # Weighting is done on the probabilities - # Smooth CC trajectories into natural ones - coef.results["CCWhiteSpruce2"] <- qlogis(plogis(coef.results["WhiteSpruce2"])*0.50 + plogis(coef.results["CCWhiteSpruce2"])*(1-0.50)) # WhiteSpruce CC 20-40yr is 50% of way to 20-40yr natural forest - see document on convergence rates - coef.results["CCWhiteSpruce3"] <- qlogis(plogis(coef.results["WhiteSpruce3"])*0.849 + plogis(coef.results["CCWhiteSpruce3"])*(1-0.849)) # WhiteSpruce CC 40-60yr is 84.9% of way to 40-60yr natural forest - coef.results["CCWhiteSpruce4"] <- qlogis(plogis(coef.results["WhiteSpruce4"])*0.96 + plogis(coef.results["CCWhiteSpruce4"])*(1-0.96)) # WhiteSpruce CC 60-80yr is 96% of way to 60-80yr natural forest - coef.results["CCPine2"] <- qlogis(plogis(coef.results["Pine2"])*0.50 + plogis(coef.results["CCPine2"])*(1-0.50)) # Pine CC 20-40 is 50% of way to 20-40yr natural forest - see document on convergence rates - coef.results["CCPine3"] <- qlogis(plogis(coef.results["Pine3"])*0.849 + plogis(coef.results["CCPine3"])*(1-0.849)) # Pine CC 40-60 is 84.9% of way to 40-60yr natural forest - coef.results["CCPine4"] <- qlogis(plogis(coef.results["Pine4"])*0.96 + plogis(coef.results["CCPine4"])*(1-0.96)) # Pine CC 60-80 is 96% of way to 60-80yr natural forest - coef.results["CCDeciduous2"] <- qlogis(plogis(coef.results["Deciduous2"])*0.705 + plogis(coef.results["CCDeciduous2"])*(1-0.705)) # Decid CC 20-40yr is 70.5% of way to 20-40yr natural forest - see document on convergence rates - coef.results["CCDeciduous3"] <- qlogis(plogis(coef.results["Deciduous3"])*0.912 + plogis(coef.results["CCDeciduous3"])*(1-0.912)) # Decid CC 40-60yr is 91.2% of way to 40-60yr natural forest - coef.results["CCDeciduous4"] <- qlogis(plogis(coef.results["Deciduous4"])*0.97 + plogis(coef.results["CCDeciduous4"])*(1-0.97)) # Decid CC 60-80yr is 97% of way to 60-80yr natural forest - coef.results["CCMixedwood2"] <- qlogis(plogis(coef.results["Mixedwood2"])*0.705 + plogis(coef.results["CCMixedwood2"])*(1-0.705)) # Mixedwood CC 20-40yr is 70.5% of way to 20-40yr natural forest - see document on convergence rates - coef.results["CCMixedwood3"] <- qlogis(plogis(coef.results["Mixedwood3"])*0.912 + plogis(coef.results["CCMixedwood3"])*(1-0.912)) # Mixedwood CC 40-60yr is 91.2% of way to 40-60yr natural forest - coef.results["CCMixedwood4"] <- qlogis(plogis(coef.results["Mixedwood4"])*0.97 + plogis(coef.results["CCMixedwood4"])*(1-0.97)) # Mixedwood CC 60-80yr is 97% of way to 60-80yr natural forest - - # And same for SE's - coef.se.results["CCWhiteSpruce2"] <- coef.se.results["WhiteSpruce2"]*0.50 + coef.se.results["CCWhiteSpruce2"]*(1-0.50) - coef.se.results["CCWhiteSpruce3"] <- coef.se.results["WhiteSpruce3"]*0.849 + coef.se.results["CCWhiteSpruce3"]*(1-0.849) - coef.se.results["CCWhiteSpruce4"] <- coef.se.results["WhiteSpruce4"]*0.96 + coef.se.results["CCWhiteSpruce4"]*(1-0.96) - coef.se.results["CCPine2"] <- coef.se.results["Pine2"]*0.50 + coef.se.results["CCPine2"]*(1-0.50) - coef.se.results["CCPine3"] <- coef.se.results["Pine3"]*0.849 + coef.se.results["CCPine3"]*(1-0.849) - coef.se.results["CCPine4"] <- coef.se.results["Pine4"]*0.96 + coef.se.results["CCPine4"]*(1-0.96) - coef.se.results["CCDeciduous2"] <- coef.se.results["Deciduous2"]*0.705 + coef.se.results["CCDeciduous2"]*(1-0.705) - coef.se.results["CCDeciduous3"] <- coef.se.results["Deciduous3"]*0.912 + coef.se.results["CCDeciduous3"]*(1-0.912) - coef.se.results["CCDeciduous4"] <- coef.se.results["Deciduous4"]*0.97 + coef.se.results["CCDeciduous4"]*(1-0.97) - coef.se.results["CCMixedwood2"] <- coef.se.results["Mixedwood2"]*0.705 + coef.se.results["CCMixedwood2"]*(1-0.705) - coef.se.results["CCMixedwood3"] <- coef.se.results["Mixedwood3"]*0.912 + coef.se.results["CCMixedwood3"]*(1-0.912) - coef.se.results["CCMixedwood4"] <- coef.se.results["Mixedwood4"]*0.97 + coef.se.results["CCMixedwood4"]*(1-0.97) - - # - # 8.0 Adjust coefficients that are often estimated poorly. - # - - if (coef.adjust == TRUE) { # If true, adjust coefficients, otherwise leave as is. Can help to determine how much the adjustment is needed - - coef.results["HardLin"] <- (coef.results["HardLin"] / coef.se.results["HardLin"]^2 + coef.results["UrbInd"]/coef.se.results["UrbInd"]^2) / (1 / coef.se.results["HardLin"]^2 + 1 / coef.se.results["UrbInd"]^2) # Inverse-variance weighted, done on logit scale - coef.se.results["HardLin"] <- sqrt(1 / (1 / coef.se.results["HardLin"]^2 + 1 / coef.se.results["UrbInd"]^2)) - - young <- (pSoftLin[1]*coef.results["CCWhiteSpruceR"] + pSoftLin[2]*coef.results["CCPineR"] + pSoftLin[3]*coef.results["CCDeciduousR"] + pSoftLin[4]*coef.results["BlackSpruce1"]) / sum(pSoftLin) - young.se <- sqrt( ( pSoftLin[1]*coef.se.results["CCWhiteSpruceR"]^2 + pSoftLin[2]*coef.se.results["CCPineR"]^2 + pSoftLin[3]*coef.se.results["CCDeciduousR"]^2 + pSoftLin[4]*coef.se.results["BlackSpruce1"]^2 ) / sum(pSoftLin) ) # Weighted se (on logit scale) - does not include component of variance among types, because fixed weighting - - # Adjust for the three soft linear type coefficients (EnSoftLin, EnSeismic, TrSoftLin) - coef.results["EnSoftLin"] <- (coef.results["EnSoftLin"]/coef.se.results["EnSoftLin"]^2 + young / young.se^2) / (1 / coef.se.results["EnSoftLin"]^2 + 1 / young.se^2) # Inverse-variance weighted - coef.se.results["EnSoftLin"] <- sqrt(1 / (1 / coef.se.results["EnSoftLin"]^2 + 1 / young.se^2)) - - coef.results["EnSeismic"] <- (coef.results["EnSeismic"]/coef.se.results["EnSeismic"]^2 + young / young.se^2) / (1 / coef.se.results["EnSeismic"]^2 + 1 / young.se^2) # Inverse-variance weighted - coef.se.results["EnSeismic"] <- sqrt(1 / (1 / coef.se.results["EnSeismic"]^2 + 1 / young.se^2)) - - coef.results["TrSoftLin"] <- (coef.results["TrSoftLin"]/coef.se.results["TrSoftLin"]^2 + young / young.se^2) / (1 / coef.se.results["TrSoftLin"]^2 + 1 / young.se^2) # Inverse-variance weighted - coef.se.results["TrSoftLin"] <- sqrt(1 / (1 / coef.se.results["TrSoftLin"]^2 + 1 / young.se^2)) - - rm(young, young.se) - - } - - # Store the coefficients as a single object - names(coef.se.results) <- paste0(names(coef.se.results), ".SE") - coef.results <- c(coef.results, coef.se.results) - return(coef.results) - - -} - -#' [Soil models] -#' -#' [soil models that uses the spatially thinned data.] -#' -#' @param [species] [Focal species of interest.] -#' @param [data] [Cleaned species, climate, and landcover data.] -#' @param [boot.data] [List of site codes to be included for each species and bootstrap iteration.] -#' @param [habitat.models] [List of habitat model formulas to be assessed.] -#' @param [prediction.matrix] [Prediction matrix used for converting model coefficients to standardized habitat classes.] -#' @param [climate.coef] [List of climate coefficients calculated from the detection_models function.] -#' @param [weight.method] [Method used for weighting model coefficients. Inverse variance weighted is the only available method currently.] -#' @param [coef.template] [Vector template used to define valid model coefficients] -#' @param [protocol.flag] [Flag that determines if we need to account for differences in sample protocols] -#' @param [coef.adjust] [Flag used to determine if poorly sampled human footprint coefficients are adjusted based on similar feature types.] -#' @param [boot] [Defines bootstrap iteration.] -#' @return [Outputs vector of model coefficients defined in habitat.models.] -#' - -soil_models <- function(species, data, boot.data, habitat.models, prediction.matrix, - climate.coef, weight.method = "IVW", coef.template, - protocol.flag, coef.adjust = TRUE, boot) { - - # - # 1.0 Data standardization - # - - # Since we are treating each recording individually, we fix visit to 1 as we no longer need to apply this weight. - data["nQuadrant"] <- 1 - data$visit <- 1 - - # Create new column which is the observed count data (used for weighting in the age relationships), one for the converted probabilities - data["Count"] <- as.integer(ifelse(data[, species] > 0, 1, 0)) - data["pcount"] <- as.integer(ifelse(data[, species] > 0, 1, 0) / data$nQuadrant) - - # 1.1 Bootstrap Selection - boot.data <- boot.data[[species]] - site.id <- boot.data[, paste0("Boot_", boot)] - data <- data[site.id, ] - - # 1.2 Regional filter - data <- data[data$NR %in% c("Grassland", "Parkland"), ] - - # If the number of detections for the species is less than 20, return empty matrix - if(sum(data$Count) < 20) { - - coef.results <- coef.template - coef.se.results <- coef.results - names(coef.se.results) <- paste0(names(coef.se.results), ".SE") - coef.results <- c(coef.results, coef.se.results) - return(coef.results) - - } - - # 1.3 Define the templates for coefficients - coef.results <- coef.template - coef.se.results <- coef.template - - # - # 3.0 Climate Predictions - # - - # Using the matching climate model, create the prediction that will be used - # Add the intercept and extract climate coefficients - data$Intercept <- 1 - climate.dect.coef <- climate.coef[[species]][boot, ] - climate.veg <- as.matrix(data[, names(climate.dect.coef)]) - - # Predict space/climate component (Probability scale) - data$Climate <- plogis(drop(climate.veg %*% climate.dect.coef)) - - # - # 4.0 Soil Model - # - - # Loop through the models - landscape.store <- list(NULL) - - for (model in 1:length(habitat.models)) { - - landscape.store[[model]] <- try(bayesglm(habitat.models[[model]], family = "binomial", - data = data, - maxit = 250)) - - } - - # - # 4.0 Store the coefficients - # - - # South model needs to account for the addition of the probability of aspen coefficient, otherwise the processes is similar. - nModels <- length(habitat.models) - p1 <- p1.se <- array(0, c(length(habitat.models), nrow(prediction.matrix))) # Predictions for each model for each soil and HF type type. These are the main coefficients - colnames(p1) <- colnames(p1.se) <- rownames(prediction.matrix) - p.site1 <- p.site1.se <- array(0, c(nModels, nrow(data))) # Predictions for each model and each site. These are used as the offsets in the next stage - - # If there is a protocol coefficient, add it to the list, otherwise only store the climate coefficient - if(protocol.flag == TRUE) { - - p1.climate <- p1.climate.se <- array(0, c(length(habitat.models), 3)) - colnames(p1.climate) <- colnames(p1.climate.se) <- c("Intercept", "Climate", "Protocol") - - } else { - - p1.climate <- p1.climate.se <- array(0, c(length(habitat.models), 2)) - colnames(p1.climate) <- colnames(p1.climate.se) <- c("Intercept", "Climate") - - } - - p1.aspen <- p1.se.aspen <- rep(0, nModels) # Predictions for each model for aspen coefficient - - for (i in 1:nModels) { - - if (class(landscape.store[[i]])[1] != "try-error") { # Prediction is 0 if model failed, but this is not used because AIC wt would equal 0 - - if(protocol.flag == TRUE) { - - plot.data <- data.frame(prediction.matrix, - Climate = 0, - paspen = 0, - Protocol = as.factor("New")) - - } else { - - plot.data <- data.frame(prediction.matrix, - paspen = 0, - Climate = 0) - - } - - p <- predict(landscape.store[[i]], newdata = plot.data, se.fit = TRUE) # For each type. Predictions made at 0% Aspen. All predictions made with new protocol. Aspen effect added later, and plotted as separate points - p1[i,] <- p$fit - p1.se[i,] <- p$se.fit - - model.fit <- predict(landscape.store[[i]], se.fit = TRUE) - p.site1[i,] <- model.fit$fit # For each site (using the original d.sp data frame) - p.site1.se[i,] <- model.fit$se.fit # For each site SE - - # Extract the climate and intercept coefficients - # We weight them separately, but then add them together to create the final coefficient - - # Coef storage - p <- summary(landscape.store[[i]])$coefficients[1:ncol(p1.climate),1] # For each type. Predictions made at 0% Aspen. All predictions made with new protocol. Aspen effect added later, and plotted as separate points - names(p)[1] <- "Intercept" - p1.climate[i, ] <- p - - # Standard error storage - p <- summary(landscape.store[[i]])$coefficients[1:ncol(p1.climate),2] # For each type. Predictions made at 0% Aspen. All predictions made with new protocol. Aspen effect added later, and plotted as separate points - names(p)[1] <- "Intercept" - p1.climate.se[i, ] <- p - - # If pasen is present, store the coefficient - if ("paspen" %in% names(coef(landscape.store[[i]]))) { - p1.aspen[i] <- coefficients(summary(landscape.store[[i]]))["paspen","Estimate"] - p1.se.aspen[i] <- coefficients(summary(landscape.store[[i]]))["paspen","Std. Error"] - } - - } - - } - - # - # 5.0 Weight the models - # - - if (weight.method == "IVW") { - - # - # Landcover - # - - tTypeMean <- tTypeVar <- NULL # Logit-scaled IVW for each veg type - - mod.converged <- NULL - for (i in 1:nModels) {mod.converged[i] <- landscape.store[[i]]$converged} - - for (i in 1:nrow(prediction.matrix)) { - - tTypeMean[i] <- sum(p1[mod.converged ,i] / p1.se[mod.converged ,i]^2) / sum(1/p1.se[mod.converged ,i]^2)# IVW mean of nModels for each veg type, on transformed scale - tTypeVar[i]<- 1/sum(1/p1.se[mod.converged ,i]^2 ) # IVW variance of mean... - - } - - # Add names - names(tTypeMean) <- names(tTypeVar) <- rownames(prediction.matrix) - - # If paspen coefficients / SE is 0, remove - p1.aspen <- p1.aspen[p1.aspen > 0] - p1.se.aspen <- p1.se.aspen[p1.se.aspen > 0] - - tTypeMean["paspen"] <- sum(p1.aspen / p1.se.aspen^2) / sum(1 / p1.se.aspen^2) - tTypeVar["paspen"] <- 1/sum(1/p1.se.aspen^2 ) # IVWvariance of mean... - - # Put coefficients in Coef matrix (and SE's) - coef.results[na.omit(match(names(tTypeMean), names(coef.results)))] <- tTypeMean[names(coef.results)[na.omit(match(names(tTypeMean), names(coef.results)))]] # On logit scale - coef.se.results[na.omit(match(names(tTypeVar), names(coef.se.results)))] <- sqrt(tTypeVar[names(coef.se.results)[na.omit(match(names(tTypeVar), names(coef.se.results)))]]) # On logit scale - - - # - # Climate - # - - tClimateMean <- tClimateVar <- NULL # Logit-scaled IVW for each climate - - mod.converged <- NULL - for (i in 1:nModels) {mod.converged[i] <- landscape.store[[i]]$converged} - - # If there SE is 0 for a coefficient, fix it to a small value to avoid INF - p1.climate.se[p1.climate.se == 0] <- 0.0001 - - for (i in 1:ncol(p1.climate)) { - - # Note for me, the SE should be the mean not the sum. Otherwise the SE will converge to 0 - tClimateMean[i] <- sum(p1.climate[mod.converged ,i] / p1.climate.se[mod.converged ,i]^2) / sum(1/p1.climate.se[mod.converged ,i]^2)# IVW mean of nModels for each veg type, on transformed scale - # Double check this tTypeVar[i]<- 1/mean(1/p1.se[mod.converged ,i]^2 ) # IVW variance of mean... - tClimateVar[i]<- 1/sum(1/p1.climate.se[mod.converged ,i]^2 ) # IVW variance of mean... - - } - - # Add the intercept coefficient to the table - coef.results["Intercept"] <- tClimateMean[1] # On logit scale - coef.se.results["Intercept"] <- tClimateVar[1] # On logit scale - - # Add the climate coefficient to the table - coef.results["Climate"] <- tClimateMean[2] # On logit scale - coef.se.results["Climate"] <- tClimateVar[2] # On logit scale - - # Store protocol coefficient if modeled - if (protocol.flag == TRUE) { - - coef.results["Protocol"] <- tClimateMean[3] # On logit scale - coef.se.results["Protocol"] <- tClimateVar[3] # On logit scale - - } - - } - - # Don't currently use this method of weighting - # if (weight.method == "AIC") { - # - # - # # AIC calculation (I'm using AIC here, because this is primarily for prediction, rather than finding a minimial best model) - # aic.ta <- rep(999999999, (nModels)) - # - # for (i in 1:(nModels)) { - # - # if (!is.null(landscape.store[[i]]) & class(landscape.store[[i]])[1] != "try-error") { # last part is to not used non-converged models, unless none converged - # aic.ta[i] <- AICc(landscape.store[[i]]) - # } - # - # } - # - # aic.delta <- aic.ta - min(aic.ta) - # aic.exp <- exp(-1 / 2 * aic.delta) - # aic.wt.ta <- aic.exp / sum(aic.exp) - # - # tTypeMean <- tTypeVar <- NULL # Logit-scaled model averages for each veg type - # - # aic.wt.ta.adj <- ifelse(aic.wt.ta < 0.01, 0, aic.wt.ta) # Use adjusted weight to avoid poor fitting models with extreme values for certain types (usually numerically equivalent to 0's or 1's) - # aic.wt.ta.adj <- aic.wt.ta.adj / sum(aic.wt.ta.adj) - # - # for (i in 1:ncol(p1)) { - # - # tTypeMean[i] <- sum(aic.wt.ta.adj * p1[, i]) - # tTypeVar[i] <- sum(aic.wt.ta.adj * p1.se[, i]) - # - # } - # - # # Add names - # names(tTypeMean) <- names(tTypeVar) <- rownames(prediction.matrix) - # - # # Adjust the paspen variable as it isn't in all of the models - # mod.converged[p1[, "paspen"] == 0] <- FALSE - # tTypeMean["paspen"] <- sum(p1[mod.converged ,"paspen"] / p1.se[mod.converged ,"paspen"]^2) / sum(1/p1.se[mod.converged ,"paspen"]^2)# IVW mean of nModels for each veg type, on transformed scale - # tTypeVar["paspen"] <- 1/sum(1/p1.se[mod.converged ,"paspen"]^2 ) # IVW variance of mean... - # - # # Put coefficients in Coef matrix (and SE's) - # coef.results[na.omit(match(names(tTypeMean), names(coef.results)))] <- tTypeMean[names(coef.results)[na.omit(match(names(tTypeMean), names(coef.results)))]] # On logit scale - # coef.se.results[na.omit(match(names(tTypeVar), names(coef.se.results)))] <- sqrt(tTypeVar[names(coef.se.results)[na.omit(match(names(tTypeVar), names(coef.se.results)))]]) # On logit scale - # - # - # } - - # - # 7.0 Adjust coefficients that are often estimated poorly. - # - - if (coef.adjust == TRUE) { # If true, adjust coefficients, otherwise leave as is. Can help to determine how much the adjustment is needed - - coef.results["HardLin"] <- (coef.results["HardLin"] / coef.se.results["HardLin"]^2 + coef.results["UrbInd"]/coef.se.results["UrbInd"]^2) / (1 / coef.se.results["HardLin"]^2 + 1 / coef.se.results["UrbInd"]^2) # Inverse-variance weighted, done on logit scale - coef.se.results["HardLin"] <- sqrt(1 / (1 / coef.se.results["HardLin"]^2 + 1 / coef.se.results["UrbInd"]^2)) - - } - - # Store the coefficients as a single object - names(coef.se.results) <- paste0(names(coef.se.results), ".SE") - coef.results <- c(coef.results, coef.se.results) - return(coef.results) - -} diff --git a/1_code/_deprecated/plants_functions/model-validation_functions.R b/1_code/_deprecated/plants_functions/model-validation_functions.R deleted file mode 100644 index f4a31c1..0000000 --- a/1_code/_deprecated/plants_functions/model-validation_functions.R +++ /dev/null @@ -1,232 +0,0 @@ -# --- -# title: Model validation functions -# author: Brandon Allen -# created: 2025-02-11 -# notes: Define functions that are used for model validation. -# --- - -#' [Model validation] -#' -#' [Calculation of AUC statistics based on the final hierachical model. Implements two prediction approaches and climate truncation.] -#' -#' @param [species] [Focal species of interest.] -#' @param [data] [Cleaned species, climate, and landcover data.] -#' @param [boot.data] [List of site codes to be included for each species and bootstrap iteration.] -#' @param [climate.coef] [List of space-climate coefficients calculated from the detection_models function.] -#' @param [landcover.coef] [List of landcover coefficients calculated from the detection_models function.] -#' @param [landcover.type] [Defines if the provided landcover coefficients are Vegetation or Soil models.] -#' @param [protocol.flag] [Flag that determines if we need to account for differences in sample protocols] -#' @param [boot] [Defines bootstrap iteration.] -#' @return [Outputs vector of model coefficients defined in climate.models and space.models.] -#' - -model_validation <- function(species, data, boot.data, - climate.coef, landcover.coef, - landcover.type, protocol.flag, boot) { - - # - # 1.0 Libraries - # - - require(pROC) - - # - # 2.0 Data standardization - # - - # Since we are treating each recording individually, we fix visit to 1 as we no longer need to apply this weight. - data["nQuadrant"] <- 1 - data$visit <- 1 - - # Create new column which is the observed count data (used for weighting in the age relationships), one for the converted probabilities - data["Count"] <- as.integer(ifelse(data[, species] > 0, 1, 0)) - data["pcount"] <- as.integer(ifelse(data[, species] > 0, 1, 0) / data$nQuadrant) - - # 3.0 Bootstrap Selection - boot.data <- boot.data[[species]] - site.id <- boot.data[, paste0("Boot_", boot)] - data <- data[data$SiteYearQu %in% site.id, ] - - # - # 4.0 Climate Predictions - # - - # Using the matching climate model, create the prediction that will be used - # Add the intercept and extract climate coefficients - data$Intercept <- 1 - climate.dect.coef <- climate.coef[[species]][boot, ] - climate.veg <- as.matrix(data[, names(climate.dect.coef)]) - - # Predict space/climate component (Probability scale) - climate.prediction <- plogis(drop(climate.veg %*% climate.dect.coef)) - climate.prediction.truncated <- ifelse(climate.prediction >= quantile(climate.prediction, 0.99), - quantile(climate.prediction, 0.99), - climate.prediction) - - # - # 5.0 Landcover Predictions and statistics - # - - if(landcover.type == "Vegetation") { - - # - # Evaluation using landcover + climate - # - - veg.dect.coef <- vegetation.coef[[species]][boot, ] - - # If protocol flag is present, subtract protocol coefficient from the values - # for "Old" surveys. This is done because the coefficients are based on the - # "New" protocol. - if(protocol.flag == TRUE) { - - # Align the vegetation information and coefficients - column.remove <- -(1:3) - veg.in <- as.matrix(data[, names(veg.dect.coef)[column.remove]]) - - # Predict without space climate component - data$Vegetation <- drop(veg.in %*% plogis(veg.dect.coef[column.remove])) - - # If protocol == "old" remove the protocol coefficient - data$Vegetation[data$Protocol == "Old"] <- data$Vegetation[data$Protocol == "Old"] - as.numeric(veg.dect.coef["Protocol"]) - - } else { - - # Align the vegetation information and coefficients - column.remove <- -(1:2) - veg.in <- as.matrix(data[, names(veg.dect.coef)[column.remove]]) - - # Predict without space climate component - data$Vegetation <- drop(veg.in %*% plogis(veg.dect.coef[column.remove])) - - } - - # Predict with space climate component - climate.component <- climate.prediction * veg.dect.coef["Climate"] - climate.component.truncated <- climate.prediction.truncated * veg.dect.coef["Climate"] - data$VegetationClim <- plogis(qlogis(drop(veg.in %*% plogis(veg.dect.coef[column.remove]))) + climate.component) - data$VegetationClimTrunc <- plogis(qlogis(drop(veg.in %*% plogis(veg.dect.coef[column.remove]))) + climate.component.truncated) - - # Statistics - # Climate uses the entire grid - climate.auc <- auc(data$pcount, climate.prediction) - climate.truncated.auc <- auc(data$pcount, climate.prediction.truncated) - - # Landcover only uses the section included in the model - data.region <- data[!(data$NR %in% c("Grassland")), ] - landcover.auc <- auc(data.region$pcount, data.region$Vegetation) - full.auc <- auc(data.region$pcount, data.region$VegetationClim) - full.truncated.auc <- auc(data.region$pcount, data.region$VegetationClimTrunc) - - # - # Evaluation using modified climate + landcover coefficients - # - - # Convert climate component to a climate matrix with same dimentions as the landcover - climate.component <- matrix(climate.component, nrow = nrow(veg.in), ncol = ncol(veg.in)) - climate.component.truncated <- matrix(climate.component.truncated, nrow = nrow(veg.in), ncol = ncol(veg.in)) - - # Isolate the landcover coefficients - veg.dect.coef <- veg.dect.coef[column.remove] - - # Joint landcover and climate prediction - veg.joint.coef <- t(t(climate.component) + veg.dect.coef) - veg.joint.truncated.coef <- t(t(climate.component.truncated) + veg.dect.coef) - - data$VegetationClimJoint <- rowSums(veg.in * plogis(veg.joint.coef)) - data$VegetationClimJointTrunc <- rowSums(veg.in * plogis(veg.joint.truncated.coef)) - - # Evaluation in the focal region - data.region <- data[!(data$NR %in% c("Grassland")), ] - full.joint.auc <- auc(data.region$pcount, data.region$VegetationClimJoint) - full.joint.truncated.auc <- auc(data.region$pcount, data.region$VegetationClimJointTrunc) - - } - - if(landcover.type == "Soil") { - - # - # Evaluation using landcover + climate - # - - soil.dect.coef <- soil.coef[[species]][boot, ] - - # If protocol flag is present, subtract protocol coefficient from the values - # for "Old" surveys. This is done because the coefficients are based on the - # "New" protocol. - if(protocol.flag == TRUE) { - - # Align the vegetation information and coefficients - column.remove <- -(1:4) - soil.in <- as.matrix(data[, names(soil.dect.coef)[column.remove]]) - - # Predict without space climate component - data$Soil <- drop(soil.in %*% plogis(soil.dect.coef[column.remove])) - - # If protocol == "old" remove the protocol coefficient - data$Soil[data$Protocol == "Old"] <- data$Soil[data$Protocol == "Old"] - as.numeric(soil.dect.coef["Protocol"]) - - } else { - - # Align the vegetation information and coefficients - column.remove <- -(1:3) - soil.in <- as.matrix(data[, names(soil.dect.coef)[column.remove]]) - - # Predict without space climate component - data$Soil <- drop(soil.in %*% plogis(soil.dect.coef[column.remove])) - - } - - # Predict the pAspen and climate components - paspen.component <- data$paspen * soil.dect.coef["paspen"] - climate.component <- climate.prediction * soil.dect.coef["Climate"] - climate.component.truncated <- climate.prediction.truncated * soil.dect.coef["Climate"] - - # Predict with space climate component - data$SoilClim <- plogis(qlogis(drop(soil.in %*% plogis(soil.dect.coef[column.remove]))) + paspen.component + climate.component) - data$SoilClimTrunc <- plogis(qlogis(drop(soil.in %*% plogis(soil.dect.coef[column.remove]))) + paspen.component + climate.component.truncated) - - # Statistics - # Climate uses the entire grid - climate.auc <- auc(data$pcount, climate.prediction) - climate.truncated.auc <- auc(data$pcount, climate.prediction.truncated) - - # Landcover only uses the section included in the model - data.region <- data[data$NR %in% c("Grassland", "Parkland"), ] - landcover.auc <- auc(data.region$pcount, data.region$Soil) - full.auc <- auc(data.region$pcount, data.region$SoilClim) - full.truncated.auc <- auc(data.region$pcount, data.region$SoilClimTrunc) - - # - # Evaluation using modified climate + landcover coefficients - # - - # Convert climate component to a climate matrix with same dimentions as the landcover - climate.component <- matrix((climate.component + paspen.component), nrow = nrow(soil.in), ncol = ncol(soil.in)) - climate.component.truncated <- matrix((climate.component.truncated + paspen.component), nrow = nrow(soil.in), ncol = ncol(soil.in)) - - # soil.dect.coef the landcover coefficients - soil.dect.coef <- soil.dect.coef[column.remove] - - # Joint landcover and climate prediction - soil.joint.coef <- t(t(climate.component) + soil.dect.coef) - soil.joint.truncated.coef <- t(t(climate.component.truncated) + soil.dect.coef) - - data$SoilClimJoint <- rowSums(soil.in * plogis(soil.joint.coef)) - data$SoilClimJointTrunc <- rowSums(soil.in * plogis(soil.joint.truncated.coef)) - - # Evaluation in the focal region - data.region <- data[data$NR %in% c("Grassland", "Parkland"), ] - full.joint.auc <- auc(data.region$pcount, data.region$SoilClimJoint) - full.joint.truncated.auc <- auc(data.region$pcount, data.region$SoilClimJointTrunc) - - } - - model.fit <- c(climate.auc, climate.truncated.auc, landcover.auc, - full.auc, full.truncated.auc, full.joint.auc, full.joint.truncated.auc) - names(model.fit) <- c("Climate", "Climate_Truncated", "Landcover", - "Full", "Full_Truncated", "Full_Joint", "Full_Joint_Truncated") - return(model.fit) - -} - diff --git a/1_code/_deprecated/plants_module/spec.R b/1_code/_deprecated/plants_module/spec.R deleted file mode 100644 index f65f29c..0000000 --- a/1_code/_deprecated/plants_module/spec.R +++ /dev/null @@ -1,207 +0,0 @@ -# --- -# title: Plant-Group Taxon Specs -# author: Brendan Casey -# created: 2026-09-09 -# inputs: none -# outputs: none; returns objects in memory -# notes: -# - The v2 configuration for the four plant-group taxa, as data. -# "Plant group" names a survey design rather than a taxonomy: -# vascular plants, bryophytes, lichens and soil mites share -# one design and one set of scripts, soil mites included. -# - Parity coverage is the climate stage. The v2 habitat stage -# uses inverse-variance model averaging with a coefficient -# adjustment and post-hoc GAM age splines, none of which the -# harness implements yet; `habitat_v2_ready` records that per -# taxon so a run cannot quietly claim more than it did. -# - Protocol is fitted for bryophytes and lichens and not for -# mites or vascular plants. That asymmetry is v2's, preserved -# here for parity, and `use_protocol` exposes it so an -# experiment can equalize across taxa. See the parity ledger -# in docs/framework_design.md. -# - The engine is bayesglm, which the v2 plant scripts use -# because rare species fitted against 30-term habitat -# formulas separate completely and plain glm then returns -# infinite coefficients. The regularization is load-bearing. -# - Regions are the two model sets: north is fitted off the -# grassland, south on grassland and parkland. v2 applies -# those filters inside its model functions; they are stated -# here instead, which is numerically the same. -# --- - -# 1. Setup ---- - -## 1.1 Load packages ---- -# Base R only; the harness supplies everything else. - -# 2. plant_spec() ---- - -#' Build the v2 Spec for One Plant-Group Taxon -#' -#' @param taxon Character. One of "bryophyte", "lichen", "mite" -#' or "vascular_plant". -#' @param use_protocol Logical, or NULL to take the v2 value for -#' that taxon. Setting it equalizes a term v2 applies -#' inconsistently, which is what a cross-taxa experiment wants. -#' @return A spec list, as run_spec() consumes. -#' -#' @example # Example usage of the function -#' # spec <- plant_spec("bryophyte") -#' # spec$stages[[1]]$engine -plant_spec <- function(taxon, use_protocol = NULL) { - known <- c("bryophyte", "lichen", "mite", "vascular_plant") - - if (!taxon %in% known) { - stop( - "Unknown plant-group taxon `", taxon, "`. Known: ", - paste(known, collapse = ", "), - call. = FALSE - ) - } - - # v2 fits Protocol for bryophytes and lichens only. - v2_protocol <- taxon %in% c("bryophyte", "lichen") - - if (is.null(use_protocol)) { - use_protocol <- v2_protocol - } - - # The habitat sets are spliced from the mite script, which - # fits no Protocol. In the bryophyte and lichen scripts the - # same formulas carry the term directly after Climate and - # nowhere else, so inserting it there reproduces them. The - # climate set carries no Protocol in any variant. - with_protocol <- function(set) { - models <- get_model_set(set) - - if (!use_protocol) { - return(models) - } - - sub( - ". ~ . + Climate", ". ~ . + Climate + Protocol", - models, fixed = TRUE - ) - } - - list( - taxon = taxon, - response_name = "response", - - # Plant responses are cover or abundance values; v2 models - # presence, so anything above zero is a detection. - response_transform = "detection", - family = "binomial", - weight_column = NULL, - tier = NULL, - - regions = list( - north = list( - filter = ~ nr != "Grassland", - grid = "veg", - term_block = "veg", - habitat_models = with_protocol("habitat_veg_plant_v2") - ), - south = list( - filter = ~ nr %in% c("Grassland", "Parkland"), - grid = "soil", - term_block = "soil", - habitat_models = with_protocol("habitat_soil_plant_v2") - ) - ), - - stages = list( - list( - name = "climate", - models = "climate_plant_v2_full", - engine = "bayesglm", - selection = "aic_average", - ic = "AICc", - control = list(maxit = 250), - # The habitat stage takes this stage's prediction as a - # term called Climate, which is how v2 composes them. - carry_as = "Climate" - ), - list( - name = "habitat", - # Set per region below, because north fits vegetation - # types and south fits soil types. - models = NULL, - engine = "bayesglm", - selection = "ivw_grid", - ic = "AICc", - control = list(maxit = 250), - carry_from = "climate", - carry_from_as = "Climate", - # v2 predicts each candidate onto the grid holding - # Climate at zero, and at the new protocol where Protocol - # is fitted, so the habitat effects are read at an - # average climate under one protocol. - grid_constants = if (use_protocol) { - list( - Climate = 0, - Protocol = factor("New", levels = c("New", "Old")) - ) - } else { - list(Climate = 0) - }, - head_terms = if (use_protocol) { - c("Intercept", "Climate", "Protocol") - } else { - c("Intercept", "Climate") - }, - coef_adjust = TRUE - ) - ), - - resample = list( - scheme = "spatial_block", - min_detections = 20L, - seed = NULL - ), - - # The habitat stage runs, but not all of it: v2 overwrites 45 - # of the 87 vegetation effects with GAM age splines over - # stand age, which the harness does not fit. See the notes. - habitat_v2_ready = "partial", - use_protocol = use_protocol, - protocol_is_v2 = identical(use_protocol, v2_protocol), - - notes = paste0( - "v2 climate stage, and the habitat stage less its age ", - "splines. v2 refits the five aged stand types - white ", - "spruce, pine, deciduous, mixedwood and black spruce, nine ", - "age classes each - with GAM splines over stand age and ", - "overwrites 45 of the 87 vegetation effects with them, so ", - "those 45 will not match. The other 42, the intercept, ", - "climate and the soil effects are reproduced. ", - "Protocol ", if (use_protocol) "fitted" else "not fitted", - if (identical(use_protocol, v2_protocol)) { - " (the v2 setting for this taxon)." - } else { - " (overridden; v2 does the opposite for this taxon)." - } - ) - ) -} - -# 3. plant_specs() ---- - -#' Every Plant-Group Spec -#' -#' @param use_protocol Logical, or NULL for the v2 setting per -#' taxon. -#' @return A named list of specs. -#' -#' @example # Example usage of the function -#' # names(plant_specs()) -plant_specs <- function(use_protocol = NULL) { - taxa <- c("bryophyte", "lichen", "mite", "vascular_plant") - - stats::setNames( - lapply(taxa, plant_spec, use_protocol = use_protocol), - taxa - ) -} - -# End of script ---- diff --git a/1_code/_setup/02_validate_test_dataset.R b/1_code/_setup/02_validate_test_dataset.R index c2574a2..1e45973 100644 --- a/1_code/_setup/02_validate_test_dataset.R +++ b/1_code/_setup/02_validate_test_dataset.R @@ -1282,6 +1282,78 @@ if (file.exists(bird_data_file)) { ) } +## 3.6.3 Harmonized lookups ---- +# _setup/09 writes one species queue, one factor-level table, the +# bird grids and the dataset manifest from the files checked +# above. They are checked here against those files, so a lookup +# left stale by a rebuild of 01 or 06 fails rather than passing. +lookup_dir <- file.path(data_dir, "lookup") +harmonized <- c( + "species_queue.csv", "factor_levels.csv", "dataset_manifest.csv", + "bird_north_prediction_matrix.csv", + "bird_south_prediction_matrix.csv" +) +present <- file.exists(file.path(lookup_dir, harmonized)) + +note( + "lookups", "harmonized lookups written", all(present), + if (all(present)) "" else paste0( + "missing ", paste(harmonized[!present], collapse = ", "), + "; run 09_harmonize_lookups.R" + ) +) + +if (all(present)) { + queue <- fread(file.path(lookup_dir, "species_queue.csv"), + na.strings = "") + manifest <- fread(file.path(lookup_dir, "dataset_manifest.csv"), + na.strings = "") + + # Every queued species is a column of its taxon's response file + queued_ok <- vapply(unique(queue$taxon), function(one) { + file <- manifest$response_file[manifest$taxon == one][1] + columns <- names(fread(file.path(data_dir, file), nrows = 0)) + all(queue$species[queue$taxon == one] %in% columns) + }, logical(1)) + + note( + "lookups", "queued species are response columns", + all(queued_ok), + paste(names(queued_ok)[!queued_ok], collapse = ", ") + ) + + # The queue holds what the three source lookups hold + plant_rows <- fread(file.path(lookup_dir, "modelled_species.csv")) + bird_rows <- fread( + file.path(lookup_dir, "bird_modelled_species.csv") + ) + mammal_rows <- fread( + file.path(lookup_dir, "mammal_modelled_species.csv") + ) + expected <- sum(plant_rows$in_veg_models) + + sum(plant_rows$in_soil_models) + nrow(bird_rows) + + sum(mammal_rows$in_models) + sum(mammal_rows$in_ua_models) + + note( + "lookups", "queue rows match the source lookups", + nrow(queue) == expected, + paste0(nrow(queue), " queued, ", expected, " in the sources") + ) + + # Every file the manifest names exists + named <- c( + file.path(data_dir, manifest$response_file), + file.path(data_dir, stats::na.omit(manifest$offset_file)), + file.path(lookup_dir, + paste0(manifest$grid, "_prediction_matrix.csv")) + ) + + note( + "lookups", "manifest files exist", all(file.exists(named)), + paste(basename(named[!file.exists(named)]), collapse = ", ") + ) +} + ## 3.7 Verdict ---- # Every check, then the tally. A FAIL means the CSVs no longer # match the snapshot they claim to come from. diff --git a/1_code/_setup/09_harmonize_lookups.R b/1_code/_setup/09_harmonize_lookups.R new file mode 100644 index 0000000..7607f08 --- /dev/null +++ b/1_code/_setup/09_harmonize_lookups.R @@ -0,0 +1,398 @@ +# --- +# title: Harmonize the Test Dataset Lookups Across Taxa +# author: Brendan Casey +# created: 2026-10-03 +# inputs: +# in 0_data/test_dataset/lookup/ (all written by 01 and 06): +# - modelled_species.csv, mammal_modelled_species.csv, +# bird_modelled_species.csv +# - bird_factor_levels.csv +# - bird_veg_age_matrix.csv +# - veg_, soil_, mammal_north_ and mammal_south_ +# prediction_matrix.csv +# outputs: +# in 0_data/test_dataset/lookup/: +# - species_queue.csv +# - factor_levels.csv +# - dataset_manifest.csv +# - bird_north_prediction_matrix.csv +# - bird_south_prediction_matrix.csv +# notes: +# - The response tables were harmonized to one shape by 01; the +# lookups were not. Each taxon lead's species queue arrived in +# its own schema, factor levels were per taxon, and which file +# belongs to which taxon was known only to the harness code. +# This writes one form of each, so a method or a new taxon +# never needs taxon-specific file logic. +# - Offline. It reads only 0_data/test_dataset/, so it can be +# re-run at any time. Run it after 01 and 06, whenever either +# rebuilds lookup/. The source files are left in place. +# - species_queue.csv: one row per taxon, region, season, tier +# and species, with `order` the source list's own order, so a +# narrowed run visits species in the order v2 would, and +# `source_name` the name the source pipeline used. `tier` +# separates mammals' full habitat models (20+ detections) from +# their use-availability models (3+); it is "modelled" +# elsewhere. `season` is empty for all but mammals. +# - dataset_manifest.csv: one row per taxon and region, naming +# the response file, the offset file, the key the taxon's rows +# carry in covariates.csv, the habitat prediction grid, and +# where any stored bootstrap draws are. The harness reads file +# locations from here and nowhere else. +# - The bird prediction grids. Every other taxon predicts onto a +# grid with one row per habitat type; birds had none, because +# v2 translates bird coefficients onto habitat types with a +# model matrix (bird_veg_age_matrix.csv) rather than predicting +# a grid. The north grid is that matrix rebuilt in covariate +# space - each row's vegetation class from its dummy column, +# its stand age and type flags from the age terms - and is +# checked to reproduce the matrix exactly before it is +# written. The south grid is one row per soil class. Terms the +# matrix does not carry - roads, wells, water, survey method - +# are at zero, or at the reference level for a factor, which +# is what v2's translation assumes. +# - The stored bootstrap draws keep their two layouts (one +# table per taxon for birds, one file per species for the +# plant-group taxa), because v2 drew them that way. The +# manifest records which layout each taxon has. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +library(data.table) # CSV reading and writing (version: 1.16.4) + +## 1.2 Resolve paths ---- +project_root <- normalizePath(getwd(), winslash = "/") +lookup_dir <- file.path( + project_root, "0_data", "test_dataset", "lookup" +) + +if (!dir.exists(lookup_dir)) { + stop( + "Run this from the repository root; no ", lookup_dir, + call. = FALSE + ) +} + +read_lookup <- function(name) { + path <- file.path(lookup_dir, name) + + if (!file.exists(path)) { + stop( + "Missing ", path, ". Run 01_harmonize_model_ready_v2.R ", + "(and 06 for the bird matrix) first.", + call. = FALSE + ) + } + + as.data.frame(fread(path)) +} + +write_lookup <- function(frame, name) { + fwrite(frame, file.path(lookup_dir, name), na = "") + cat("Wrote ", name, " (", nrow(frame), " rows)\n", sep = "") +} + +# 2. Species queue ---- +# Three schemas become one. The logic is the one species.R used to +# apply on every read; it now runs once, here. + +## 2.1 queue_rows() ---- + +#' Rows of the Unified Species Queue +#' +#' @param species Character vector. +#' @param taxon,region,order,tier,season Values recycled to the +#' number of species. +#' @param source_name Character vector. The name the source +#' pipeline uses, where it differs from the dataset's column +#' name: mammals are "Black BearSummer" in v2's files and +#' "BlackBear_Summer" here. +#' @return A data frame in the queue schema. +#' +#' @example # Example usage of the function +#' # queue_rows(c("ALFL", "AMRO"), "bird", "north", 1:2) +queue_rows <- function( + species, taxon, region, order, tier = "modelled", + season = NA_character_, source_name = species +) { + if (length(species) == 0) { + return(NULL) + } + + data.frame( + taxon = as.character(taxon), + region = as.character(region), + season = as.character(season), + tier = as.character(tier), + species = as.character(species), + order = as.integer(order), + source_name = as.character(source_name), + stringsAsFactors = FALSE + ) +} + +## 2.2 Plant groups ---- +# One row per species, with membership of the north (veg) and +# south (soil) model sets as flags; each flag becomes a region. +plants <- read_lookup("modelled_species.csv") +north_plants <- plants[plants$in_veg_models, ] +south_plants <- plants[plants$in_soil_models, ] + +## 2.3 Mammals ---- +# Region and season are already columns; the two occurrence +# thresholds become tiers. +mammals <- read_lookup("mammal_modelled_species.csv") +full_mammals <- mammals[mammals$in_models, ] +ua_mammals <- mammals[mammals$in_ua_models, ] + +## 2.4 Birds ---- +# One row per species and region; the source order is the order +# within each region. +birds <- read_lookup("bird_modelled_species.csv") + +species_queue <- rbind( + queue_rows( + north_plants$species, north_plants$taxon, "north", + north_plants$veg_order + ), + queue_rows( + south_plants$species, south_plants$taxon, "south", + south_plants$soil_order + ), + queue_rows( + full_mammals$species, "mammal", full_mammals$region, + full_mammals$model_order, tier = "modelled", + season = full_mammals$season, + source_name = full_mammals$species_season + ), + queue_rows( + ua_mammals$species, "mammal", ua_mammals$region, + ua_mammals$ua_order, tier = "ua", season = ua_mammals$season, + source_name = ua_mammals$species_season + ), + queue_rows( + birds$species, "bird", birds$region, + stats::ave(seq_len(nrow(birds)), birds$region, FUN = seq_along) + ) +) + +## 2.5 Check and write ---- +duplicated_rows <- duplicated( + species_queue[, c("taxon", "region", "season", "tier", "species")] +) + +if (any(duplicated_rows)) { + stop( + sum(duplicated_rows), " species appear twice in one queue.", + call. = FALSE + ) +} + +write_lookup(species_queue, "species_queue.csv") + +# 3. Factor levels ---- +# One table with a taxon column, so any taxon can record the +# level order of its categorical covariates the same way. +factor_files <- list.files( + lookup_dir, pattern = "_factor_levels\\.csv$" +) + +factor_levels <- do.call(rbind, lapply(factor_files, function(file) { + levels_table <- read_lookup(file) + data.frame( + taxon = sub("_factor_levels\\.csv$", "", file), + levels_table[, c("column", "level_order", "level")], + stringsAsFactors = FALSE + ) +})) + +write_lookup(factor_levels, "factor_levels.csv") + +reference_level <- function(taxon, column) { + rows <- factor_levels[ + factor_levels$taxon == taxon & factor_levels$column == column, + ] + rows$level[which.min(rows$level_order)] +} + +levels_of <- function(taxon, column) { + rows <- factor_levels[ + factor_levels$taxon == taxon & factor_levels$column == column, + ] + rows$level[order(rows$level_order)] +} + +# 4. Bird prediction grids ---- + +## 4.1 North, rebuilt from v2's translation matrix ---- +age_table <- read_lookup("bird_veg_age_matrix.csv") +age <- as.matrix(age_table[, -1]) +rownames(age) <- age_table$type + +vegc_levels <- levels_of("bird", "vegc") +dummies <- grep("^vegc", colnames(age), value = TRUE) + +# Each row's class is the dummy set to 1, or the reference level +# where none is +vegc <- vapply(seq_len(nrow(age)), function(i) { + hit <- dummies[age[i, dummies] == 1] + + if (length(hit) > 1) { + stop("Matrix row ", rownames(age)[i], " sets two classes.", + call. = FALSE) + } + + if (length(hit) == 0) vegc_levels[1] else sub("^vegc", "", hit) +}, character(1)) + +# A type flag enters only through its interactions with age, so +# it is read back from them: the interaction divided by the age +# term, wherever age is non-zero. Where every age term is zero the +# flag cannot affect a prediction and is left at zero. +flags <- c("isCon", "isUpCon", "isBogFen", "isMix", "isPine", + "isWSpruce") +age_terms <- c("wtAge", "wtAge2", "wtAge05") + +flag_values <- sapply(flags, function(flag) { + vapply(seq_len(nrow(age)), function(i) { + for (term in age_terms) { + if (age[i, term] != 0) { + return(age[i, paste0(flag, ":", term)] / age[i, term]) + } + } + 0 + }, numeric(1)) +}) + +bird_north <- data.frame( + VegType = rownames(age), + vegc = vegc, + age[, c("wtAge", "wtAge2", "wtAge05", "fcc2"), drop = FALSE], + flag_values, + # Absent from a pure stand of a habitat type + road = 0, mWell = 0, mSoft = 0, mEnSft = 0, mTrSft = 0, + mSeism = 0, pWater_KM = 0, pWater2_KM = 0, + method = reference_level("bird", "method"), + stringsAsFactors = FALSE, + check.names = FALSE, + row.names = NULL +) + +### 4.1.1 Check the rebuild ---- +# The grid must reproduce v2's matrix column for column, or the +# grid predictions would not be the quantity v2 translates to. +rebuilt <- stats::model.matrix( + ~ vegc + wtAge + wtAge2 + wtAge05 + fcc2 + + (wtAge + wtAge2 + wtAge05):(isCon + isUpCon + isBogFen + + isMix + isPine + isWSpruce), + transform( + bird_north, vegc = factor(vegc, levels = vegc_levels) + ) +) +colnames(rebuilt) <- vapply( + strsplit(sub("^\\(Intercept\\)$", "Intercept", colnames(rebuilt)), + ":", fixed = TRUE), + function(pieces) paste(sort(pieces), collapse = ":"), + character(1) +) + +difference <- max(abs( + rebuilt[, colnames(age), drop = FALSE] - age +)) + +if (difference > 1e-12) { + stop( + "The rebuilt bird north grid does not reproduce ", + "bird_veg_age_matrix.csv (largest difference ", difference, + "). Not written.", + call. = FALSE + ) +} + +cat("Bird north grid reproduces v2's matrix (max diff ", + format(difference), ")\n", sep = "") + +write_lookup(bird_north, "bird_north_prediction_matrix.csv") + +## 4.2 South, one row per soil class ---- +soil_levels <- levels_of("bird", "soilc") + +bird_south <- data.frame( + VegType = soil_levels, + soilc = soil_levels, + paspen = 0, + road = 0, mWell = 0, mSoft = 0, pWater_KM = 0, pWater2_KM = 0, + method = reference_level("bird", "method"), + stringsAsFactors = FALSE +) + +write_lookup(bird_south, "bird_south_prediction_matrix.csv") + +# 5. Dataset manifest ---- +# Where each taxon's files are. A new taxon is added here, with +# its files, and needs no harness change. +plant_taxa <- c("vascular_plant", "bryophyte", "lichen", "mite") + +manifest <- rbind( + do.call(rbind, lapply(plant_taxa, function(taxon) { + data.frame( + taxon = taxon, + region = c("north", "south"), + response_file = paste0(taxon, ".csv"), + offset_file = NA_character_, + covariate_key = taxon, + grid = c("veg", "soil"), + bootstrap_ids = file.path("lookup", "v2_bootstrap_ids", taxon), + bootstrap_layout = "per_species_rds", + stringsAsFactors = FALSE + ) + })), + data.frame( + taxon = "mammal", + region = c("north", "south"), + response_file = "mammal.csv", + offset_file = NA_character_, + covariate_key = c("mammal_north", "mammal_south"), + grid = c("mammal_north", "mammal_south"), + bootstrap_ids = NA_character_, + bootstrap_layout = NA_character_, + stringsAsFactors = FALSE + ), + data.frame( + taxon = "bird", + region = c("north", "south"), + response_file = "bird.csv", + offset_file = "bird_offsets.csv", + covariate_key = "bird", + grid = c("bird_north", "bird_south"), + bootstrap_ids = file.path("lookup", "bird_bootstrap_ids.csv"), + bootstrap_layout = "per_taxon_csv", + stringsAsFactors = FALSE + ) +) + +## 5.1 Check every named file exists ---- +dataset_dir <- dirname(lookup_dir) +named <- c( + file.path(dataset_dir, manifest$response_file), + file.path(dataset_dir, stats::na.omit(manifest$offset_file)), + file.path(lookup_dir, + paste0(manifest$grid, "_prediction_matrix.csv")) +) +absent <- unique(named[!file.exists(named)]) + +if (length(absent) > 0) { + stop( + "The manifest names files that do not exist:\n ", + paste(absent, collapse = "\n "), + call. = FALSE + ) +} + +write_lookup(manifest, "dataset_manifest.csv") + +cat("\nLookups harmonized.\n") + +# End of script ---- diff --git a/1_code/experiments/.gitkeep b/1_code/experiments/.gitkeep deleted file mode 100644 index 8b13789..0000000 --- a/1_code/experiments/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/1_code/experiments/exp_000_parity_v2/utils/focal_species.R b/1_code/experiments/_shared/focal_species.R similarity index 93% rename from 1_code/experiments/exp_000_parity_v2/utils/focal_species.R rename to 1_code/experiments/_shared/focal_species.R index 58739ad..7736d96 100644 --- a/1_code/experiments/exp_000_parity_v2/utils/focal_species.R +++ b/1_code/experiments/_shared/focal_species.R @@ -1,13 +1,15 @@ # --- -# title: Focal Species Sets for Experiment 000 +# title: Focal Species Sets, Shared by Every Experiment # author: Brendan Casey # created: 2026-09-11 # inputs: none # outputs: none; returns objects in memory # notes: -# - Holds the species vectors run.R chooses between, so that -# run.R stays a page of decisions rather than a page of -# names. The sets grow; the run script should not. +# - Holds the species vectors an experiment's run.R chooses +# between, so run.R stays a page of decisions rather than a +# page of names. Shared, so a later experiment can run exactly +# the species exp_000 ran and compare against it like for +# like. Loaded by load_framework(). # - Every set uses the named-vector convention the harness # expects: names are taxa, values are species, names may # repeat, and an unnamed entry applies to every taxon. NULL @@ -21,8 +23,9 @@ # - To see what is available for a taxon: # head(list_species(data_dir, "mite", "north"), 20) # - A taxon a set does not name is unrestricted, not excluded. -# Narrow run_taxa alongside a partial set; run.R warns if a -# taxon would silently run its full species list. +# Narrow the run's taxa alongside a partial set; +# experiment_config() warns if a taxon would silently run its +# full species list. # - This mirrors model_sets() and get_model_set() in the # harness, so the two registries read the same way. # --- diff --git a/1_code/experiments/_template/README.md b/1_code/experiments/_template/README.md new file mode 100644 index 0000000..5a72534 --- /dev/null +++ b/1_code/experiments/_template/README.md @@ -0,0 +1,40 @@ +# exp_NNN_short_description + +![Status](https://img.shields.io/badge/Status-Planned-lightgrey) +![Languages](https://img.shields.io/badge/Languages-R-blue) + +## Question + +One sentence: what does this experiment ask? + +## Design + +- **What changes relative to exp_000:** the one thing this + experiment varies (a covariate, a model set, an engine, a + selection rule). +- **What stays the same:** taxa, species, draws and seed, unless + they are the question. +- **How it is set:** `stage_models` or `specs` in `run.R`. + +## How to read the result + +`run_experiment()` writes three comparison tables to +`3_output//tables/`, against the v2 baseline (exp_000): + +| File | One row per | Read it for | +| --- | --- | --- | +| `comparison_summary.csv` | taxon, region and metric | The headline: median difference, and the share of species that did better | +| `comparison_metrics.csv` | species and metric | Which species moved, with both runs' 10-90% bands | +| `comparison_grid.csv` | species | Whether habitat effects moved: rank correlation and absolute difference on the prediction grid | + +The metrics are out-of-bag: each draw scored on the survey units it +left out. "Better" is higher AUC, deviance explained and Spearman, +lower RMSE, and a calibration slope closer to 1. + +## Result + +_To be written after a full run._ + +## Assumptions and caveats + +- diff --git a/1_code/experiments/_template/run.R b/1_code/experiments/_template/run.R new file mode 100644 index 0000000..f2d9c53 --- /dev/null +++ b/1_code/experiments/_template/run.R @@ -0,0 +1,73 @@ +# --- +# title: Run Experiment NNN - [Short Description] +# author: [Your Name] +# created: [YYYY-MM-DD] +# inputs: +# - 0_data/test_dataset/ +# - 3_output/exp_000_parity_v2/tables/, the v2 baseline +# outputs: +# in 2_pipeline/exp_NNN_short_description/: +# - // result stores, and run_log.csv +# in 3_output/exp_NNN_short_description/: +# - tables/ (summaries, and comparison_*.csv against the +# baseline), run_record.md +# notes: +# - Copy this folder to 1_code/experiments/exp_NNN_*/, set `id` +# below to the folder's name, and state the question in the +# README. +# - Change one thing relative to exp_000, so a difference in the +# comparison is a difference in that thing. Use the same +# species, draws and seed as exp_000 unless they are the +# question. +# - The usual levers, from least to most invasive: +# - `stage_models`: different candidate formulas for a stage +# (new covariates, a different model set). +# - `specs`: a spec with a stage changed - a different engine +# or selection rule. Build it from standard_specs() and +# change the field; see docs/getting_started.md. +# - A new method in 1_code/methods/, then named in a spec; +# see 1_code/methods/README.md. +# --- + +# 1. Setup ---- + +## 1.1 Load the framework ---- +source("1_code/harness/harness.R") +load_framework() + +## 1.2 Configure the run ---- +config <- experiment_config( + id = "exp_NNN_short_description", + + # The runs to fit, from names(standard_specs()) + taxa = c( + "bryophyte", "lichen", "mite", "vascular_plant", + "mammal_summer", "mammal_winter", "bird" + ), + + # The same species exp_000 ran, so the comparison is like for + # like + species = "parity_check", + n_bootstraps = 100, + seed = 20260909, + + # The change this experiment tests. For example, every climate + # candidate with elevation added: + # stage_models = list( + # climate = extend_models("climate_plant_v2_full", "elevation") + # ), + stage_models = NULL, + + workers = 12 +) + +# 2. Run ---- +# Fit, summarize, and compare with the v2 baseline (exp_000). +# The comparison is written to tables/comparison_*.csv. +results <- run_experiment( + config, + translate = list(bird = bird_habitat_translation), + steps = list(compare = compare_to_baseline) +) + +# End of script ---- diff --git a/1_code/experiments/exp_000_parity_v2/.gitkeep b/1_code/experiments/exp_000_parity_v2/.gitkeep deleted file mode 100644 index 8b13789..0000000 --- a/1_code/experiments/exp_000_parity_v2/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/1_code/experiments/exp_000_parity_v2/01_collect_results.R b/1_code/experiments/exp_000_parity_v2/01_collect_results.R deleted file mode 100644 index 542fc85..0000000 --- a/1_code/experiments/exp_000_parity_v2/01_collect_results.R +++ /dev/null @@ -1,258 +0,0 @@ -# --- -# title: Collect Model Output (Experiment 000) -# author: Brendan Casey -# created: 2026-09-09 -# inputs: -# in pipeline_dir///: -# - coefficients.csv, metrics.csv, meta.json -# 0_data/test_dataset/, for the bird translation -# outputs: -# in out_dir/tables/: -# - coefficient_summary.csv -# - metric_summary.csv -# - coverage.csv -# notes: -# - Reduces the per-draw result stores to per-species summaries, -# which is what the comparison and the report read. The raw -# stores stay in pipeline_dir: 100 draws by every species is -# too large to commit. -# - One row per stage, not only the last, so the climate stage -# can be compared as well as the habitat stage. Stores -# written before stages were recorded carry the final stage -# only, and are labelled with it from meta.json. -# - Bird landcover coefficients are also translated onto v2's -# standardized habitat template, by -# modules/birds/standardize.R, and added as stage "habitat". -# The raw coefficients stay as stage "landcover". -# - Bootstrap draws are summarized by median and the 10th and -# 90th percentiles rather than mean and standard deviation. -# A coefficient distribution over draws is routinely skewed, -# and a rare species can produce an extreme draw that would -# drag a mean somewhere no draw actually is. -# - `boot1` is the iteration-1 value, the full-data fit. It is -# the like-for-like quantity where v2 fits once rather than -# bootstrapping, as the mammal habitat stage does. -# - `run` is the spec's key in run.R and names the store; the -# taxon, season and part come from the store's meta.json, so -# the two mammal season runs share the taxon "mammal". -# - Expects exp_id, data_dir, pipeline_dir and out_dir from -# run.R, and the bird module to be sourced. -# --- - -# 1. Setup ---- - -## 1.1 Load packages ---- -library(jsonlite) # reading meta.json (version: 1.8.9) - -## 1.2 Resolve paths ---- -tables_dir <- file.path(out_dir, "tables") -dir.create(tables_dir, recursive = TRUE, showWarnings = FALSE) - -## 1.3 Find the result stores ---- -# One per run and region, wherever a run wrote one. -store_dirs <- list.dirs(pipeline_dir, recursive = TRUE) -store_dirs <- store_dirs[ - file.exists(file.path(store_dirs, "meta.json")) -] - -if (length(store_dirs) == 0) { - message( - "No result stores in ", pipeline_dir, - "; run section 2 of run.R first." - ) -} - -# 2. Summarize ---- - -## 2.1 Helpers ---- - -#' Summarize a Value over Bootstrap Draws -#' -#' @param x Numeric vector. -#' @param boot Integer vector of the draw each value came from. -#' @return A named numeric vector of n, median, 10th and 90th -#' percentiles, and the iteration-1 value. -#' -#' @example # Example usage of the function -#' # draw_summary(c(0.1, 0.3, 0.2), 1:3) -draw_summary <- function(x, boot) { - boot1 <- x[boot == 1L] - boot1 <- if (length(boot1) == 1 && is.finite(boot1)) { - boot1 - } else { - NA_real_ - } - - x <- x[is.finite(x)] - - if (length(x) == 0) { - return(c(n = 0, median = NA_real_, p10 = NA_real_, - p90 = NA_real_, boot1 = boot1)) - } - - quantiles <- stats::quantile(x, c(0.1, 0.5, 0.9), names = FALSE) - - c(n = length(x), median = quantiles[2], p10 = quantiles[1], - p90 = quantiles[3], boot1 = boot1) -} - -#' Read a Store's meta.json, Tolerating a Missing Field -#' -#' @param dir Character. A result store directory. -#' @return A list with taxon, season, part and final_stage. -#' -#' @example # Example usage of the function -#' # store_meta(store_dirs[1]) -store_meta <- function(dir) { - meta <- jsonlite::fromJSON(file.path(dir, "meta.json")) - - field <- function(name) { - value <- meta[[name]] - - if (is.null(value) || length(value) == 0 || - identical(value, "NA") || all(is.na(value))) { - NA_character_ - } else { - as.character(value[1]) - } - } - - list( - taxon = field("taxon"), - region = field("region"), - season = field("season"), - part = field("part"), - final_stage = if (is.null(meta$stages)) { - NA_character_ - } else { - utils::tail(meta$stages, 1) - } - ) -} - -## 2.2 Walk the stores ---- -coefficient_rows <- list() -metric_rows <- list() -coverage_rows <- list() - -for (dir_one in store_dirs) { - # A store is ///. The run is read - # off the folder; the rest from meta.json, rather than parsed - # out of a path that may not use forward slashes. - meta <- store_meta(dir_one) - run <- basename(dirname(dir_one)) - region <- if (is.na(meta$region)) basename(dir_one) else meta$region - taxon <- if (is.na(meta$taxon)) run else meta$taxon - - labels <- data.frame( - taxon = taxon, run = run, region = region, - season = meta$season, part = meta$part, - stringsAsFactors = FALSE - ) - - coefficients <- read_results(dir_one, "coefficients") - metrics <- read_results(dir_one, "metrics") - - # A store written before stages were recorded holds the final - # stage only. - if (!is.null(coefficients) && !"stage" %in% names(coefficients)) { - coefficients$stage <- meta$final_stage - } - - # Bird landcover, translated onto v2's standardized template - if (identical(taxon, "bird") && !is.null(coefficients)) { - landcover <- coefficients[coefficients$stage == "landcover", ] - - if (nrow(landcover) > 0) { - translated <- standardize_bird_coefficients( - landcover, data_dir, region - ) - coefficients <- rbind( - coefficients, - translated[, names(coefficients)] - ) - } - } - - coverage_rows[[dir_one]] <- cbind( - labels, - data.frame( - species = length(unique(c( - coefficients$species, metrics$species - ))), - draws = length(unique(c(coefficients$boot, metrics$boot))), - stages = if (is.null(coefficients)) { - "" - } else { - paste(unique(coefficients$stage), collapse = ", ") - }, - has_coefficients = !is.null(coefficients), - has_grid = !is.null(read_results(dir_one, "grid_predictions")), - stringsAsFactors = FALSE - ) - ) - - if (!is.null(coefficients)) { - split_key <- interaction( - coefficients$species, coefficients$stage, coefficients$term, - drop = TRUE - ) - - coefficient_rows[[dir_one]] <- do.call(rbind, lapply( - split(coefficients, split_key), - function(block) { - cbind( - labels, - data.frame( - stage = block$stage[1], - species = block$species[1], term = block$term[1], - stringsAsFactors = FALSE - ), - as.data.frame(t(draw_summary(block$estimate, block$boot))) - ) - } - )) - } - - if (!is.null(metrics)) { - split_key <- interaction( - metrics$species, metrics$metric, drop = TRUE - ) - - metric_rows[[dir_one]] <- do.call(rbind, lapply( - split(metrics, split_key), - function(block) { - cbind( - labels, - data.frame( - species = block$species[1], metric = block$metric[1], - stringsAsFactors = FALSE - ), - as.data.frame(t(draw_summary(block$value, block$boot))) - ) - } - )) - } -} - -# 3. Write ---- -coefficient_summary <- do.call(rbind, coefficient_rows) -metric_summary <- do.call(rbind, metric_rows) -coverage <- do.call(rbind, coverage_rows) - -for (one in list( - list(coefficient_summary, "coefficient_summary.csv"), - list(metric_summary, "metric_summary.csv"), - list(coverage, "coverage.csv") -)) { - if (!is.null(one[[1]])) { - rownames(one[[1]]) <- NULL - data.table::fwrite( - one[[1]], file.path(tables_dir, one[[2]]), na = "" - ) - cat("Wrote tables/", one[[2]], ": ", nrow(one[[1]]), - " rows\n", sep = "") - } -} - -# End of script ---- diff --git a/1_code/experiments/exp_000_parity_v2/02_compare_to_v2.R b/1_code/experiments/exp_000_parity_v2/01_compare_to_v2.R similarity index 89% rename from 1_code/experiments/exp_000_parity_v2/02_compare_to_v2.R rename to 1_code/experiments/exp_000_parity_v2/01_compare_to_v2.R index 4e5aece..109c5db 100644 --- a/1_code/experiments/exp_000_parity_v2/02_compare_to_v2.R +++ b/1_code/experiments/exp_000_parity_v2/01_compare_to_v2.R @@ -3,15 +3,16 @@ # author: Brendan Casey # created: 2026-09-09 # inputs: -# in out_dir/tables/: -# - coefficient_summary.csv -# in v2_reference_dir, chosen in run.R: +# - `config`, from run.R: out_dir, data_dir, v2_reference_dir, +# n_bootstraps, v2_bootstraps, focal_species +# - `results$coefficient_summary`, from collect_results() +# - in config$v2_reference_dir: # - v2_results.csv, built by _setup/08 (ABMIexploreR) or # _setup/05 (the network drives) # outputs: -# in out_dir/tables/: -# - parity_terms.csv -# - parity_summary.csv +# - in out_dir/tables/: parity_terms.csv, parity_summary.csv +# - `results$parity`, `results$parity_summary` and +# `results$parity_notes`, for the later steps # notes: # - The gate itself. Compares this run's coefficients against # the published v2 ones, per stage, species and term. @@ -25,8 +26,9 @@ # until it does not. # - Habitat is joined on region. Plant terms are relabelled # as v2's 04a standardization does; bird terms are the -# translated ones from 01_collect_results.R (stage -# "habitat"), and the raw "landcover" stage is not scored. +# translated ones collect_results() adds (stage "habitat", +# via run.R's `translate`), and the raw "landcover" stage +# is not scored. # - Mammals are joined on the hurdle part, and their two # season runs are averaged first, because v2's `.all` # references average summer and winter. @@ -40,45 +42,27 @@ # have, or fixes at a placeholder, are flagged from # v2_unreachable_terms() and left out of the reachable # scores. -# - Whatever cannot be compared is left in `notes`, which the -# report prints. -# - Expects exp_id, data_dir, pipeline_dir and out_dir from -# run.R, and the plant-group module to be sourced. +# - Whatever cannot be compared is left in +# `results$parity_notes`, which the report prints. +# - Run by run_experiment() as a step, in an environment of its +# own holding only `config` and `results`; see +# script_step(). # --- # 1. Setup ---- ## 1.1 Resolve paths ---- -tables_dir <- file.path(out_dir, "tables") +tables_dir <- file.path(config$out_dir, "tables") dir.create(tables_dir, recursive = TRUE, showWarnings = FALSE) -# run.R's v2_reference picks the build. Without it, the drive -# build in 0_data/v2_results/, beside test_dataset/. -v2_reference_dir <- get0( - "v2_reference_dir", - ifnotfound = file.path(dirname(data_dir), "v2_results") -) -reference_path <- file.path(v2_reference_dir, "v2_results.csv") - -reference_builder <- if ( - grepl("abmiexplorer", v2_reference_dir) -) { - "1_code/_setup/08_harmonize_abmiexplorer_results.R" -} else { - "1_code/_setup/05_harmonize_v2_results.R" -} +reference_path <- file.path(config$v2_reference_dir, "v2_results.csv") +reference_builder <- config$v2_reference_builder ## 1.2 Read this run and the reference ---- -summary_path <- file.path(tables_dir, "coefficient_summary.csv") +run_coefficients <- results$coefficient_summary -run_coefficients <- if (file.exists(summary_path)) { - as.data.frame(data.table::fread(summary_path)) -} else { - message( - "No coefficient summary at ", summary_path, - "; run 01_collect_results.R first." - ) - NULL +if (is.null(run_coefficients)) { + message("No coefficients were collected; nothing to compare.") } reference <- if (file.exists(reference_path)) { @@ -172,8 +156,12 @@ if (!is.null(run_coefficients)) { # The mammal hurdle writes one stage per v2 table, # habitat_presence, habitat_abundance and habitat_total; each # is v2's habitat stage for that part. - hurdle <- grepl("^habitat_(presence|abundance|total)$", run_rows$stage) - run_rows$part[hurdle] <- sub("^habitat_", "", run_rows$stage[hurdle]) + hurdle <- grepl( + "^habitat_(presence|abundance|total)$", run_rows$stage + ) + run_rows$part[hurdle] <- sub( + "^habitat_", "", run_rows$stage[hurdle] + ) run_rows$stage[hurdle] <- "habitat" # v2 fits climate once across the province. @@ -360,7 +348,8 @@ if (!is.null(run_rows) && !is.null(reference) && (is.finite(parity$p10) & is.finite(parity$p90) & parity$v2_median >= parity$p10 & parity$v2_median <= parity$p90) | - parity$absolute_difference <= parity_targets()$numerical_tolerance + parity$absolute_difference <= + parity_targets()$numerical_tolerance ) parity$standardized_difference <- ifelse( matched & is.finite(spread) & spread > 0, @@ -488,9 +477,8 @@ if (!is.null(parity) && nrow(parity) > 0) { # The verdict against the proposed targets. A trial run - fewer # draws than v2, or a species subset - is not gated. - gated <- exists("n_bootstraps") && exists("v2_bootstraps") && - exists("focal_species") && n_bootstraps >= v2_bootstraps && - is.null(focal_species) + full_length <- config$n_bootstraps >= config$v2_bootstraps + gated <- full_length && is.null(config$focal_species) verdict_of <- function(gate) { vapply( @@ -511,8 +499,6 @@ if (!is.null(parity) && nrow(parity) > 0) { # A run with v2's full draw count on a species subset is not the # gate, but its rows can still be read against the targets. Said # separately, so it is never mistaken for the verdict. - full_length <- exists("n_bootstraps") && exists("v2_bootstraps") && - n_bootstraps >= v2_bootstraps parity_summary$indicative_verdict <- if (!gated && full_length) { verdict_of(TRUE) } else { @@ -524,7 +510,7 @@ if (!is.null(parity) && nrow(parity) > 0) { # five draws is narrower than one from a hundred. short <- grepl("median", parity_summary$comparison) & !is.na(parity_summary$min_draws) & - parity_summary$min_draws < get0("v2_bootstraps", ifnotfound = 0L) + parity_summary$min_draws < config$v2_bootstraps short_note <- paste0( "not gated (store holds ", parity_summary$min_draws, " draws)" ) @@ -542,6 +528,7 @@ if (!is.null(parity) && nrow(parity) > 0) { cat("\nParity against v2, by stage:\n") print(parity_summary) } else { + parity_summary <- NULL cat("\nNo parity comparison produced.\n") } @@ -549,4 +536,9 @@ for (note in notes) { cat(" note: ", note, "\n", sep = "") } +# 6. Hand on ---- +results$parity <- parity +results$parity_summary <- parity_summary +results$parity_notes <- notes + # End of script ---- diff --git a/1_code/experiments/exp_000_parity_v2/04_plot_parity.R b/1_code/experiments/exp_000_parity_v2/02_plot_parity.R similarity index 96% rename from 1_code/experiments/exp_000_parity_v2/04_plot_parity.R rename to 1_code/experiments/exp_000_parity_v2/02_plot_parity.R index e34f094..8da6ccc 100644 --- a/1_code/experiments/exp_000_parity_v2/04_plot_parity.R +++ b/1_code/experiments/exp_000_parity_v2/02_plot_parity.R @@ -3,8 +3,9 @@ # author: Brendan Casey # created: 2026-09-30 # inputs: -# in out_dir/tables/: -# - parity_terms.csv, from 02_compare_to_v2.R +# - `config$out_dir`, from run.R +# - `results$parity`, from 01_compare_to_v2.R; or, run on its +# own, out_dir/tables/parity_terms.csv # outputs: # in out_dir/figures/: # - parity_.png, one per taxon @@ -42,8 +43,9 @@ # difference, a wider or narrower one a spread difference. The # normal shape is a drawing convenience; v2 keeps only three # summaries of its draws. -# - Expects out_dir from run.R. Can also be run on its own from -# the repository root after 02_compare_to_v2.R. +# - Run by run_experiment() as a step, in an environment of its +# own; see script_step(). Can also be run on its own from the +# repository root after 01_compare_to_v2.R. # --- # 1. Setup ---- @@ -53,26 +55,30 @@ library(data.table) # reading and reshaping tables (version: 1.18.0) library(ggplot2) # plotting (version: 4.0.3) ## 1.2 Resolve paths ---- -if (!exists("out_dir")) { - out_dir <- file.path(getwd(), "3_output", "exp_000_parity_v2") +out_dir <- if (exists("config")) { + config$out_dir +} else { + file.path(getwd(), "3_output", "exp_000_parity_v2") } terms_path <- file.path(out_dir, "tables", "parity_terms.csv") figures_dir <- file.path(out_dir, "figures") +dir.create(figures_dir, recursive = TRUE, showWarnings = FALSE) -if (!file.exists(terms_path)) { +## 1.3 Import data ---- +# From the comparison step when it ran; from its table otherwise +parity_terms <- if (exists("results") && !is.null(results$parity)) { + as.data.table(results$parity) +} else if (file.exists(terms_path)) { + fread(terms_path) +} else { stop( - "parity_terms.csv not found; run 02_compare_to_v2.R first:\n ", + "No parity terms; run 01_compare_to_v2.R first:\n ", terms_path, call. = FALSE ) } -dir.create(figures_dir, recursive = TRUE, showWarnings = FALSE) - -## 1.3 Import data ---- -parity_terms <- fread(terms_path) - ## 1.4 Choose the mean figure's facets ---- # "taxon" gives one facet per taxon; "group" pools the four plant # taxa into one facet beside mammals and birds. diff --git a/1_code/experiments/exp_000_parity_v2/03_build_report.R b/1_code/experiments/exp_000_parity_v2/03_build_report.R index 6dcda77..29f4969 100644 --- a/1_code/experiments/exp_000_parity_v2/03_build_report.R +++ b/1_code/experiments/exp_000_parity_v2/03_build_report.R @@ -3,14 +3,12 @@ # author: Brendan Casey # created: 2026-09-09 # inputs: -# from run.R: -# - specs, run_taxa, focal_species, n_bootstraps, -# v2_bootstraps, boot_seed -# from 02_compare_to_v2.R, when it ran this session: -# - notes, the references it could not reach -# in out_dir/tables/: -# - coverage.csv, metric_summary.csv, parity_summary.csv -# in v2_reference_dir, chosen in run.R: +# - `config`, from run.R: id, specs, taxa, focal_species, +# n_bootstraps, v2_bootstraps, seed, out_dir and the v2 +# reference settings +# - `results`: coverage and metric_summary (collect_results()), +# parity_summary and parity_notes (01_compare_to_v2.R) +# - in config$v2_reference_dir: # - v2_results_coverage.csv # outputs: # in out_dir/: @@ -27,102 +25,45 @@ # not a parity read. # - Written on every run, so a partial run still leaves a # legible record of what it was. -# - Expects exp_id, data_dir, pipeline_dir, out_dir and the -# run settings above from run.R. +# - Run by run_experiment() as a step, in an environment of its +# own holding only `config` and `results`; see +# script_step(). # --- # 1. Setup ---- ## 1.1 Resolve paths ---- -tables_dir <- file.path(out_dir, "tables") -report_file <- file.path(out_dir, "report.md") - -# run.R's v2_reference picks the build. Without it, the drive -# build in 0_data/v2_results/, beside test_dataset/. -v2_reference_dir <- get0( - "v2_reference_dir", - ifnotfound = file.path(dirname(data_dir), "v2_results") -) +report_file <- file.path(config$out_dir, "report.md") v2_coverage_path <- file.path( - v2_reference_dir, "v2_results_coverage.csv" + config$v2_reference_dir, "v2_results_coverage.csv" ) - -v2_reference_builder <- if ( - grepl("abmiexplorer", v2_reference_dir) -) { - "1_code/_setup/08_harmonize_abmiexplorer_results.R" -} else { - "1_code/_setup/05_harmonize_v2_results.R" -} - -read_table <- function(path) { - if (!file.exists(path)) { - return(NULL) - } - - as.data.frame(data.table::fread(path)) -} +v2_reference_builder <- config$v2_reference_builder ## 1.2 Read the inputs ---- -coverage <- read_table(file.path(tables_dir, "coverage.csv")) -metric_summary <- read_table( - file.path(tables_dir, "metric_summary.csv") -) -parity_summary <- read_table( - file.path(tables_dir, "parity_summary.csv") -) -v2_coverage <- read_table(v2_coverage_path) - -# The specs that ran, not every spec defined, so the coverage -# table describes this run. -run_specs <- specs[intersect(run_taxa, names(specs))] - -# The comparison step leaves its unreachable references in -# `notes`. Absent when it did not run this session. -gate_notes <- if (exists("notes") && is.list(notes)) { - unlist(notes, use.names = FALSE) +coverage <- results$coverage +metric_summary <- results$metric_summary +parity_summary <- results$parity_summary +v2_coverage <- if (file.exists(v2_coverage_path)) { + as.data.frame(data.table::fread(v2_coverage_path)) } else { - character(0) + NULL } +# The comparison step's unreachable references +gate_notes <- unlist(results$parity_notes, use.names = FALSE) + # 2. Assemble ---- ## 2.1 Helpers ---- - -#' Render a Data Frame as a Markdown Table -#' -#' @param x A data frame, or NULL. -#' @param empty Character. What to say when there is nothing. -#' @return A character vector of markdown lines. -#' -#' @example # Example usage of the function -#' # markdown_table(coverage) +# Tables are rendered by md_table() (harness/run_record.R), so the +# report and the run record format numbers the same way. markdown_table <- function(x, empty = "_Nothing recorded._") { - if (is.null(x) || nrow(x) == 0) { - return(empty) - } - - # A pipe inside a cell would split it into two columns. - cells <- as.data.frame( - lapply(x, function(col) gsub("|", "\\|", col, fixed = TRUE)), - stringsAsFactors = FALSE - ) - - header <- paste("|", paste(names(x), collapse = " | "), "|") - rule <- paste( - "|", paste(rep("---", ncol(x)), collapse = " | "), "|" - ) - - rows <- apply(cells, 1, function(row) { - paste("|", paste(row, collapse = " | "), "|") - }) - - c(header, rule, rows) + if (is.null(x) || nrow(x) == 0) empty else md_table(x, digits = 3L) } ## 2.2 What kind of run this was ---- -is_full_species <- is.null(focal_species) -is_full_draws <- n_bootstraps >= v2_bootstraps +is_full_species <- is.null(config$focal_species) +is_full_draws <- config$n_bootstraps >= config$v2_bootstraps run_kind <- if (is_full_species && is_full_draws) { "**Full run.** Every species, every draw." @@ -130,21 +71,22 @@ run_kind <- if (is_full_species && is_full_draws) { paste0( "**Trial run.** ", if (!is_full_species) { - paste0(length(focal_species), " focal species") + paste0(length(config$focal_species), " focal species") } else { "every species" }, - ", ", n_bootstraps, " of ", v2_bootstraps, " draws. ", + ", ", config$n_bootstraps, " of ", config$v2_bootstraps, + " draws. ", "Its parity numbers show the pipeline ran; they are not a ", "parity read." ) } -seed_text <- if (is.null(boot_seed)) { +seed_text <- if (is.null(config$seed)) { "unseeded, as in v2" } else { paste0( - "`boot_seed = ", boot_seed, "`, one derived seed per species" + "`seed = ", config$seed, "`, one derived seed per species" ) } @@ -164,7 +106,10 @@ reference_lines <- if (is.null(v2_coverage)) { } gate_lines <- if (length(gate_notes) == 0) { - "_Every taxon and region that ran had a reference to compare against._" + paste( + "_Every taxon and region that ran had a reference to", + "compare against._" + ) } else { paste0("- ", gate_notes) } @@ -199,7 +144,8 @@ fit_lines <- if (is.null(metric_summary)) { for (label in names(shown)) { values <- block$median[block$metric == shown[[label]]] - row[[paste0("median_", label)]] <- if (length(values) == 0) { + column <- paste0("median_", label) + row[[column]] <- if (length(values) == 0) { NA_real_ } else { round(stats::median(values, na.rm = TRUE), 3) @@ -214,7 +160,7 @@ fit_lines <- if (is.null(metric_summary)) { ## 2.5 Write the report ---- lines <- c( - paste0("# ", exp_id), + paste0("# ", config$id), "", paste0("Generated ", format(Sys.time(), "%Y-%m-%d %H:%M:%S")), "", @@ -228,14 +174,14 @@ lines <- c( "stated. Change it there, not here.", "", markdown_table( - spec_coverage(run_specs), + spec_coverage(config$specs), "_No specs ran._" ), "", "## v2 references", "", paste0( - "Scored against `", get0("v2_reference", ifnotfound = "drives"), + "Scored against `", config$v2_reference, "`, built by `", v2_reference_builder, "`. What it holds, ", "from `v2_results_coverage.csv`:" ), @@ -287,11 +233,13 @@ lines <- c( "## Model fit", "", paste( - "Median AUC over species. `insample` scores the units each", - "draw fitted; `oob` the units it left out, the held-out read.", - "`v2val` is v2's validation, scored from the coefficients as v2", - "does (plants only). Iteration 1 is the full data and has no", - "out-of-bag units." + "Median AUC over species, scored on each run's final model:", + "for plants, v2's own prediction from its coefficient tables.", + "`insample` scores the units each draw fitted; `oob` the units", + "it left out, the held-out read. `v2val` is v2's validation,", + "scored from the coefficients as v2 does (plants only), so for", + "plants `v2val_full` equals `insample_auc`. Iteration 1 is the", + "full data and has no out-of-bag units." ), "", fit_lines, @@ -307,5 +255,6 @@ lines <- c( writeLines(lines, report_file) cat("Wrote ", report_file, "\n", sep = "") +results$report_file <- report_file # End of script ---- diff --git a/1_code/experiments/exp_000_parity_v2/README.md b/1_code/experiments/exp_000_parity_v2/README.md index 72aae92..f9d2b2f 100644 --- a/1_code/experiments/exp_000_parity_v2/README.md +++ b/1_code/experiments/exp_000_parity_v2/README.md @@ -6,6 +6,33 @@ The validation gate. Runs each taxon's v2 spec through the harness and compares the result against the published v2 output. +## How to run + +From the repository root: + +```r +source("1_code/experiments/exp_000_parity_v2/run.R") +``` + +Every decision is in `run.R`'s `experiment_config()` call: the runs, the +species set, the draws, the seed, and the workers. `run_experiment()` then +fits, summarizes the stores with the harness's `collect_results()`, and runs +this experiment's three steps in order: + +| Step | Script | Writes | +| --- | --- | --- | +| compare | `01_compare_to_v2.R` | `tables/parity_terms.csv`, `tables/parity_summary.csv` | +| plot | `02_plot_parity.R` | `figures/parity_*.png` | +| report | `03_build_report.R` | `report.md` | + +Each step runs in an environment of its own and reads only `config` and +`results`. `fit = FALSE` re-summarizes existing stores without refitting. + +Metrics and grid predictions score each run's final model: for plants, v2's +own prediction from its coefficient tables, so `insample_auc` equals +`v2val_Full`. Coefficients, and so the parity verdicts, do not depend on +this. + ## Question Does the framework, configured as v2, reproduce the v2 results? @@ -33,9 +60,9 @@ table. ## What the gate compares today -`02_compare_to_v2.R` compares **every stage** against one +`01_compare_to_v2.R` compares **every stage** against one `v2_results.csv`, so it runs with the network drives unmounted. -`v2_reference` in `run.R` section 1.3a picks which build of it: +`config$v2_reference` in `run.R` section 1.3 picks which build of it: | `v2_reference` | Built by | Source | Holds | | -------------- | -------- | ------ | ----- | @@ -101,7 +128,7 @@ committed gate and cannot be regenerated from it. ## Parity targets (proposed) -The targets live in `utils/parity_targets.R`, and `02_compare_to_v2.R` +The targets live in `utils/parity_targets.R`, and `01_compare_to_v2.R` reads a `verdict` per taxon, region and stage against them. **They are proposals until agreed**; the report says so. @@ -149,8 +176,9 @@ store holds fewer draws than v2 (`min_draws` in `parity_summary.csv`), whatever the run was configured for; a store overwritten by a shorter run would otherwise be scored on five-draw bands. -**Indicative result (2026-09-30, `parity_check` set, 100 draws).** 18 of -22 rows pass. Mammal habitat matches v2 to ≤1e-14; every plant climate and +**Indicative result (2026-10-03, `parity_check` set, 100 draws).** All 22 +rows pass (`3_output/exp_000_parity_v2/tables/parity_summary.csv`), 100% of +reachable terms in band. The history: on 2026-09-30, 18 of 22 rows passed. Mammal habitat matches v2 to ≤1e-14; every plant climate and habitat row passes, with band-width ratios of 0.88–1.05. Only birds fail: - **Birds, all four rows.** The published bird results (December 2025) @@ -220,7 +248,7 @@ evidence for each and an ordered plan. re-ran the frozen v2 functions: 134 of 134 species, 100 draws of 19 climate terms each, no failures. Separately, v2's `COEFS.RData` holds complete bryophyte arrays, and `v2_results.csv` uses those. -- **The seed.** `boot_seed` in `run.R` seeds every resampled taxon from +- **The seed.** `seed` in `run.R` seeds every resampled taxon from one number, with a derived seed per species. v2 is unseeded, so parity stays distributional, but this side of it now repeats. diff --git a/1_code/experiments/exp_000_parity_v2/run.R b/1_code/experiments/exp_000_parity_v2/run.R index 198608b..5992f0e 100644 --- a/1_code/experiments/exp_000_parity_v2/run.R +++ b/1_code/experiments/exp_000_parity_v2/run.R @@ -4,528 +4,133 @@ # created: 2026-09-09 # inputs: # - 0_data/test_dataset/ -# - 1_code/harness/harness.R -# - 1_code/modules/_shared/plant_group.R -# - 1_code/modules//spec.R -# - utils/focal_species.R +# - 0_data/v2_results/, the v2 reference (section 1.3) +# - the framework: 1_code/harness/, methods/, modules/ # outputs: -# in pipeline_dir (2_pipeline/exp_000_parity_v2/ by default): -# - // result stores -# - run_log.csv -# in out_dir (3_output/exp_000_parity_v2/ by default): -# - tables/, figures/, report.md +# in 2_pipeline/exp_000_parity_v2/: +# - // result stores, and run_log.csv +# in 3_output/exp_000_parity_v2/: +# - tables/, figures/, report.md, run_record.md # notes: -# - The validation gate. Runs each taxon's v2 spec through the -# harness and compares the result against the published v2 -# output. -# - The only file to edit. Sections 1.3 to 1.7 are the whole -# configuration: where the run reads and writes, which taxa -# and regions, which focal species, how many draws, and the -# random seed. +# - The validation gate, and the baseline every later +# experiment is compared against. Runs each taxon's v2 spec +# through the framework and compares the result with the +# published v2 output. +# - The only file to edit. Section 1.2 is the whole +# configuration; experiment_config() checks it before +# anything is fitted. +# - Parity here is distributional, not numerical: v2 seeds +# nothing, so two v2 runs give different coefficients, and +# the comparison is between bootstrap distributions. See the +# parity ledger in docs/framework_design.md. # - What each taxon reproduces of v2 is stated once, in its # spec's `v2_coverage`, and the report prints it from there. -# - Parity here is distributional, not numerical. v2 seeds -# nothing, so v2 does not reproduce against itself; two v2 -# runs give different coefficients. The comparison is -# therefore between bootstrap distributions. See the parity -# ledger in docs/framework_design.md. # --- # 1. Setup ---- -## 1.1 Set the working directory ---- -# Every path below is relative to this repository's root. In -# RStudio or Positron, uncomment to set it from this script's -# location. -# setwd(dirname(rstudioapi::getActiveDocumentContext()$path)) -# setwd("../../..") +## 1.1 Load the framework ---- +# Run from the repository root. In RStudio or Positron, the +# project file sets it. +source("1_code/harness/harness.R") +load_framework() -## 1.2 Load the harness and the specs ---- -project_root <- normalizePath(getwd(), winslash = "/") - -source(file.path(project_root, "1_code/harness/harness.R")) -load_harness(file.path(project_root, "1_code/harness")) - -# Shared machinery first: the four plant-group modules call it. -source(file.path( - project_root, - "1_code/modules/_shared/plant_group.R" -)) - -for (taxon_dir in c( - "bryophytes", - "lichens", - "soil_mites", - "vascular_plants", - "mammals", - "birds" -)) { - source(file.path( - project_root, - "1_code/modules", - taxon_dir, - "spec.R" - )) -} - -# Translates bird landcover coefficients onto v2's standardized -# habitat terms, so the comparison can join them. -source(file.path( - project_root, - "1_code/modules/birds/standardize.R" -)) - -# v2's mammal hurdle model, which the mammal specs select by -# default. -source(file.path(project_root, "1_code/modules/mammals/hurdle.R")) - -exp_id <- "exp_000_parity_v2" - -exp_code_dir <- file.path( - project_root, - "1_code/experiments", - exp_id -) - -# Named focal-species sets, so run.R chooses rather than lists. -source(file.path(exp_code_dir, "utils/focal_species.R")) +exp_dir <- "1_code/experiments/exp_000_parity_v2" # The parity targets the comparison reads its verdict against -source(file.path(exp_code_dir, "utils/parity_targets.R")) - -## 1.3 Choose where the run reads and writes ---- -# data_dir is read only. pipeline_dir takes the result stores, -# which are large and gitignored. out_dir takes the committed -# deliverables. Point them anywhere writable. -data_dir <- file.path(project_root, "0_data/test_dataset") - -pipeline_dir <- file.path(project_root, "2_pipeline", exp_id) - -out_dir <- file.path(project_root, "3_output", exp_id) - -## 1.3a Choose the v2 reference ---- -# Which build of the published v2 coefficients the run is scored -# against. Both write the same schema. -# -# abmiexplorer ABMI's ABMIexploreR package, pinned to a commit; -# 1_code/_setup/08_harmonize_abmiexplorer_results.R. -# The published species only; every taxon. -# drives the v2 project outputs on the network drives; -# 1_code/_setup/05_harmonize_v2_results.R. -# Every species v2 fitted. -v2_reference <- "abmiexplorer" - -v2_reference_dir <- switch( - v2_reference, - abmiexplorer = file.path( - project_root, - "0_data/v2_results/abmiexplorer" +source(file.path(exp_dir, "utils", "parity_targets.R")) + +## 1.2 Configure the run ---- +# Every decision is here. See experiment_config() for each +# argument, and docs/getting_started.md for what they mean. +config <- experiment_config( + id = "exp_000_parity_v2", + + # Runs, from names(standard_specs()). Mammals run once per + # season, because v2's mammal references average the two. + taxa = c( + "bryophyte", "lichen", "mite", "vascular_plant", + "mammal_summer", "mammal_winter", "bird" ), - drives = file.path(project_root, "0_data/v2_results"), - stop("v2_reference must be \"abmiexplorer\" or \"drives\".", call. = FALSE) -) -## 1.4 Set the taxa to run ---- -# Each entry names a spec. Comment one out to skip it. -# A key names the run and its folder under pipeline_dir; the -# data slug the spec reads is its own `taxon` field, which is -# what focal_species matches on. Soil mites use the slug "mite". -# -# Mammals run once per season. v2's mammal references average -# the summer and winter fits, so the comparison needs both. -# -# The plant bootstrap. "spatial_block" draws v2's bootstrap -# afresh, so parity is distributional. "v2_ids" replays the draws -# v2 stored, which makes it numerical draw by draw - but only -# against a reference fitted on those draws. The published -# lichen, mite and vascular plant models were not (checked: no -# published draw matches beyond the full-data one), so it pays -# off only for the bryophyte reference _setup/03 regenerated. -# "v2_ids" needs _setup/07 run for every species in the run. -plant_bootstrap <- "spatial_block" - -specs <- list( - bryophyte = bryophyte_spec(bootstrap = plant_bootstrap), - lichen = lichen_spec(bootstrap = plant_bootstrap), - mite = soil_mite_spec(bootstrap = plant_bootstrap), - vascular_plant = vascular_plant_spec(bootstrap = plant_bootstrap), - mammal_summer = mammal_spec( - season = "summer" - ), - mammal_winter = mammal_spec( - season = "winter" - ), - bird = bird_spec() + # A named set from focal_species_sets(), a vector named by + # taxon, or NULL for every species (the full parity run). + # "parity_check" is two species per taxon with tight bands. + # Shortening the species list is the right way to shorten a + # trial: it keeps every draw, so the parity bands stay honest. + species = "parity_check", + + # Draws per species. 100 is v2's, and the only setting the gate + # reads. Below about 20 the 10-90% bands are too unstable for + # the parity numbers to mean anything; 5 checks the plumbing. + n_bootstraps = 100, + + # One number governs every random draw; each species draws + # under its own seed derived from it. NULL leaves the draws + # unseeded, as v2 did. Birds replay v2's stored draws. + seed = 20260909, + + # "spatial_block" draws v2's plant bootstrap afresh; + # "v2_ids" replays v2's stored draws (needs _setup/07). + plant_bootstrap = "spatial_block", + + # NULL fits each spec's v2 candidate sets, which is what a + # parity run does. See extend_models() and + # models_from_covariates() to fit others. + stage_models = NULL, + + # Species fitted at once. Each worker is a separate R session. + workers = 12, + + # "none" writes no per-unit predictions (metrics are scored in + # memory); "oob" or "all" write them, at several GB for birds. + unit_predictions = "none" ) -# Every spec. Drop keys to run fewer. -run_taxa <- c( - "bryophyte", - "lichen", - "mite", - "vascular_plant", - "mammal_summer", - "mammal_winter", - "bird" +## 1.3 Choose the v2 reference ---- +# Which build of the published v2 coefficients the run is scored +# against. Both write the same schema. +# abmiexplorer ABMI's ABMIexploreR package, pinned to a commit +# (_setup/08); the published species, every taxon +# drives the v2 project outputs on the network drives +# (_setup/05); every species v2 fitted +config$v2_reference <- "abmiexplorer" + +config$v2_reference_dir <- file.path( + config$project_root, "0_data", "v2_results", + switch( + config$v2_reference, + abmiexplorer = "abmiexplorer", + drives = "", + stop("v2_reference must be \"abmiexplorer\" or \"drives\".", + call. = FALSE) + ) ) -## 1.5 Choose the focal species ---- -# Named sets live in utils/focal_species.R, so this stays a -# decision rather than a list of names. See that file for what -# each set is and why its species were chosen. -# -# full every species each spec declares; the parity run -# parity_check two per taxon, chosen for tight bootstrap bands -# plants_only the four plant-group taxa -# one_each one per taxon; the shortest run that touches -# every module -# -# A species vector written inline is also accepted and passes -# straight through, so a one-off does not need a named set: -# -# focal_species <- get_focal_species(c( -# lichen = "Alectoria.sarmentosa", -# mite = "Oppiella.nova" -# )) -# -# Shortening the species list is the right way to shorten a -# trial: it keeps every draw, so the parity bands stay honest. -# Lowering `n_bootstraps` in section 1.6 is cheaper still, but -# it widens those bands and costs you the parity read. -focal_species <- get_focal_species("parity_check") - -# A taxon in run_taxa that the species set does not name runs -# EVERY species, because an absent taxon means "no restriction" -# rather than "none". That is the convention working as intended, -# but it turns a set like plants_only into the longest run in the -# file rather than the shortest, so it is said out loud here. -# Matched on each spec's data slug, not its key, because the two -# mammal keys share the slug "mammal". -run_slugs <- vapply( - specs[intersect(run_taxa, names(specs))], - function(one) one$taxon, - character(1) +config$v2_reference_builder <- switch( + config$v2_reference, + abmiexplorer = "1_code/_setup/08_harmonize_abmiexplorer_results.R", + drives = "1_code/_setup/05_harmonize_v2_results.R" ) -unnamed_taxa <- if (is.null(focal_species)) { - character(0) -} else { - names(run_slugs)[!run_slugs %in% names(focal_species)] -} - -if (length(unnamed_taxa) > 0) { - message( - "Note: ", - paste(unnamed_taxa, collapse = ", "), - " are in run_taxa but not named in focal_species, so every ", - "species will be run for them. Narrow run_taxa to avoid it." +# 2. Run ---- +# Fits every species, collects the stores into summary tables, +# then compares with v2, plots and reports. Set `fit = FALSE` to +# re-summarize the stores already in 2_pipeline/ without fitting. +results <- run_experiment( + config, + fit = TRUE, + # Bird landcover is translated onto v2's habitat template so it + # can be compared; see modules/birds/standardize.R. + translate = list(bird = bird_habitat_translation), + steps = list( + compare = script_step(file.path(exp_dir, "01_compare_to_v2.R")), + plot = script_step(file.path(exp_dir, "02_plot_parity.R")), + report = script_step(file.path(exp_dir, "03_build_report.R")) ) -} - -## 1.5b Choose the candidate models ---- -# NULL fits each spec's own v2 candidate set, which is what a -# parity run does. To ask a different question, name a stage and -# hand it a set: either a name from model_sets(), or formulas -# built with extend_models() or models_from_covariates(). -# -# Keys are "taxon.stage", or "stage" to apply to every taxon. -# -# Covariates are not named anywhere. They are read off whichever -# formulas end up being fitted, so changing the models changes -# what is loaded, and a term can never be fitted without its -# column being read. -# -# stage_models <- list( -# # the v2 climate set, plus topography in every candidate -# "climate" = extend_models( -# "climate_plant_v2_full", c("elevation", "slope") -# ), -# # or a set built from covariates alone -# "mite.climate" = models_from_covariates( -# c("MAP", "FFP", "CMD"), form = "ladder" -# ) -# ) -# -# An override is recorded in each run's meta.json, so a run that -# did not fit the v2 sets cannot be mistaken for one that did. -stage_models <- NULL - -## 1.6 Set the run length ---- -# How many bootstrap draws each species gets. Cost is close to -# linear in this number, so 10 draws is roughly a tenth of the -# run, and it is the cheapest way to make a trial affordable. -# -# It is also the one setting that invalidates the parity read. -# The gate scores a term on whether the v2 value falls inside -# this run's 10th-to-90th percentile band, and a band estimated -# from a handful of draws is wide and unstable, so almost -# everything falls inside it and the test stops discriminating. -# Below roughly 20 draws, treat the parity numbers as evidence -# the pipeline ran, not as evidence it agrees with v2. -# -# Shorten the species list instead when you want a cheap run -# whose parity numbers still mean something. See section 1.5. -# -# 100 the v2 value, and the only setting that gates -# 20 a usable band, for a slow-but-real check -# 5 plumbing only -# -# `v2_bootstraps` is v2's draw count, fixed; the run length is -# `n_bootstraps`. A run shorter than v2's, or on a species -# subset, is a trial and is not gated. -v2_bootstraps <- 100L - -n_bootstraps <- 100L - -## 1.6a Validate the run length ---- -# Checked here rather than several hours into a run. -if ( - !is.numeric(n_bootstraps) || - length(n_bootstraps) != 1L || - is.na(n_bootstraps) || - n_bootstraps < 1 || - n_bootstraps != round(n_bootstraps) -) { - stop( - "n_bootstraps must be a single whole number of 1 or more; ", - "got ", - paste(format(n_bootstraps), collapse = ", "), - ".", - call. = FALSE - ) -} - -n_bootstraps <- as.integer(n_bootstraps) - -# Birds resample from stored ids and so have a hard ceiling. -# Every other taxon draws spatial blocks on the fly and has -# none. Counting the columns is cheap; discovering the limit -# from a failed bird run is not. -if ("bird" %in% run_taxa) { - bird_ids_path <- file.path( - data_dir, - "lookup", - "bird_bootstrap_ids.csv" - ) - - if (file.exists(bird_ids_path)) { - bird_draws <- length(names( - data.table::fread(bird_ids_path, nrows = 0) - )) - - if (n_bootstraps > bird_draws) { - stop( - "n_bootstraps is ", - n_bootstraps, - " but only ", - bird_draws, - " bird bootstrap draws are stored. Lower ", - "it, or drop \"bird\" from run_taxa.", - call. = FALSE - ) - } - } -} - -if (n_bootstraps < v2_bootstraps) { - message( - "Note: running ", - n_bootstraps, - " of ", - v2_bootstraps, - " v2 bootstrap draws. This is a trial run; its parity ", - "numbers are not a parity read." - ) -} - -iterations <- seq_len(n_bootstraps) - -## 1.6b Set the random seed ---- -# One number governs every random draw in the run. Each species -# resamples under its own seed, derived from this one and its -# name, so species are drawn independently as in v2 and a -# species' draws do not change when the focal set does. -# -# v2 set no seed, so its draws cannot be matched either way; the -# comparison is distributional. Seeding makes this side of it -# repeatable: the same seed and settings give the same stores. -# NULL leaves the draws unseeded, which is what v2 did. -# -# Birds are unaffected. Their draws are the stored v2 ids. -boot_seed <- 20260909L - -## 1.7 Set the stages to run ---- -run_models <- FALSE -run_collect <- FALSE -run_compare <- TRUE -run_plots <- TRUE -run_report <- TRUE - -# Named write_record rather than run_record, which would shadow -# the function it calls. -write_record <- TRUE - -# 2. Fit ---- -# One spec per taxon, each writing a result store per region. - -experiment_start <- Sys.time() -run_log <- NULL - -if (run_models) { - logs <- list() - - for (taxon in run_taxa) { - spec <- specs[[taxon]] - - if (is.null(spec)) { - stop( - "No spec defined for `", - taxon, - "` in section 1.4.", - call. = FALSE - ) - } - - logs[[taxon]] <- run_spec( - spec = spec, - data_dir = data_dir, - run_dir = file.path(pipeline_dir, taxon), - species = focal_species, - iterations = iterations, - stage_models = stage_models, - boot_seed = boot_seed - ) - } - - run_log <- do.call(rbind, logs) - - dir.create(pipeline_dir, recursive = TRUE, showWarnings = FALSE) - data.table::fwrite( - run_log, - file.path(pipeline_dir, "run_log.csv"), - na = "" - ) - - cat("\nRun log:\n") - print(table(run_log$taxon, run_log$status)) -} - -# 3. Summarize ---- -# These read the result stores and write the committed -# deliverables. - -dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) - -## 3.1 Collect model output ---- -if (run_collect) { - source(file.path(exp_code_dir, "01_collect_results.R")) -} - -## 3.2 Compare against the v2.0 reference ---- -if (run_compare) { - source(file.path(exp_code_dir, "02_compare_to_v2.R")) -} - -## 3.3 Plot parity against v2 ---- -# One figure per taxon in figures/, gitignored like the -# per-species tables it is drawn from. -if (run_plots) { - source(file.path(exp_code_dir, "04_plot_parity.R")) -} - -## 3.4 Build the report ---- -if (run_report) { - source(file.path(exp_code_dir, "03_build_report.R")) -} - -## 3.5 Write the run record ---- -# Committed with the report and summary tables. The stores in -# 2_pipeline/ and the per-species tables are gitignored, so when -# the stores are cleared this is what is left to say what -# happened. -# -# The config below is what makes two records comparable, so it -# holds settings rather than paths: an absolute directory -# differs between machines and would diff on every line without -# meaning anything. Volatile values belong in the record's own -# Provenance section, which run_record() writes. -if (write_record) { - stage_engines <- function(field) { - sort(unique(unlist(lapply( - specs[run_taxa], - function(one) { - vapply( - one$stages, - function(st) { - value <- st[[field]] - if (is.function(value)) "custom" else value - }, - character(1) - ) - } - )))) - } - - record_config <- list( - taxa = sort(run_taxa), - focal_species = if (is.null(focal_species)) { - "all" - } else { - sort(paste0(names(focal_species), "=", focal_species)) - }, - species_n = if (is.null(focal_species)) { - NA_integer_ - } else { - length(focal_species) - }, - n_bootstraps = n_bootstraps, - v2_bootstraps = v2_bootstraps, - boot_seed = if (is.null(boot_seed)) "unseeded" else boot_seed, - plant_bootstrap = plant_bootstrap, - stage_models = if (is.null(stage_models)) { - "spec defaults (v2 candidate sets)" - } else { - sort(names(stage_models)) - }, - engines = stage_engines("engine"), - selection = stage_engines("selection"), - data_dir = basename(data_dir) - ) - - # Failures belong in the record. Coverage says what was - # produced; without this, a run that lost half its jobs and - # one that lost none look alike wherever the survivors agree. - if (!is.null(run_log)) { - ok_n <- sum(run_log$status == "ok", na.rm = TRUE) - - record_config$jobs_total <- as.integer(nrow(run_log)) - record_config$jobs_ok <- as.integer(ok_n) - record_config$jobs_not_ok <- as.integer(nrow(run_log) - ok_n) - } - - record_file <- run_record( - pipeline_dir = pipeline_dir, - out_file = file.path(out_dir, "run_record.md"), - exp_id = exp_id, - config = record_config - ) - - cat("Run record: ", record_file, "\n", sep = "") -} - -# 4. Experiment complete ---- -experiment_time <- format(round(Sys.time() - experiment_start, 1)) -cat("\n========================================\n") -cat("EXPERIMENT ", exp_id, " COMPLETE\n", sep = "") -cat("Total run time: ", experiment_time, "\n", sep = "") -cat("========================================\n") -cat("Intermediates are in ", pipeline_dir, "\n", sep = "") -cat("Deliverables are in ", out_dir, "\n", sep = "") -cat( - "Committed: run_record.md, report.md and the summary ", - "tables. Commit them only after a full run.", - "\n", - sep = "" ) +# Commit run_record.md, report.md and the small summary tables +# only after a full run: every species, n_bootstraps = 100. + # End of script ---- diff --git a/1_code/harness/.gitkeep b/1_code/harness/.gitkeep deleted file mode 100644 index 8b13789..0000000 --- a/1_code/harness/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/1_code/harness/cache.R b/1_code/harness/cache.R new file mode 100644 index 0000000..03a0ab6 --- /dev/null +++ b/1_code/harness/cache.R @@ -0,0 +1,79 @@ +# --- +# title: Session Cache for Dataset Reads +# author: Brendan Casey +# created: 2026-10-03 +# inputs: none +# outputs: none; holds read results in memory +# notes: +# - The frozen dataset does not change during a run, but the +# small lookups were being re-read many times: the covariate +# catalogue several times per region, the species queue once +# per region, the stored bird draws once per species. This +# keeps one copy per file per session. +# - Entries are keyed on the file's path, its modification time +# and size, and a tag naming how it was read, so editing a +# lookup (or rebuilding the dataset) is picked up on the next +# read rather than served stale. +# - Only files are cached, never model fits or results, so the +# cache cannot change what a run computes - only how often it +# reads. clear_cache() empties it. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +# Base R only. + +## 1.2 The cache ---- +if (!exists(".sdm_cache", inherits = FALSE)) { + .sdm_cache <- new.env(parent = emptyenv()) +} + +# 2. cached_read() ---- + +#' Read a File Once per Session +#' +#' @param path Character. The file to read. +#' @param reader A function of the path returning its contents. +#' @param tag Character. Distinguishes two different reads of the +#' same file, such as one column subset and another. +#' @return Whatever `reader` returns. +#' +#' @example # Example usage of the function +#' # map <- cached_read(path, function(p) as.data.frame(fread(p))) +cached_read <- function(path, reader, tag = "") { + info <- file.info(path) + + if (is.na(info$size)) { + return(reader(path)) + } + + key <- paste( + normalizePath(path, winslash = "/", mustWork = FALSE), + format(info$mtime, "%Y%m%d%H%M%OS3"), info$size, tag, + sep = "|" + ) + + if (!exists(key, envir = .sdm_cache, inherits = FALSE)) { + assign(key, reader(path), envir = .sdm_cache) + } + + get(key, envir = .sdm_cache, inherits = FALSE) +} + +# 3. clear_cache() ---- + +#' Empty the Session Cache +#' +#' @return The number of entries removed, invisibly. +#' +#' @example # Example usage of the function +#' # clear_cache() +clear_cache <- function() { + keys <- ls(.sdm_cache, all.names = TRUE) + rm(list = keys, envir = .sdm_cache) + + invisible(length(keys)) +} + +# End of script ---- diff --git a/1_code/harness/compare.R b/1_code/harness/compare.R new file mode 100644 index 0000000..e5160d0 --- /dev/null +++ b/1_code/harness/compare.R @@ -0,0 +1,208 @@ +# --- +# title: Compare an Experiment Against a Baseline +# author: Brendan Casey +# created: 2026-10-03 +# inputs: +# in each experiment's out_dir/tables/: +# - metric_summary.csv, grid_summary.csv (collect_results()) +# outputs: +# in the candidate's out_dir/tables/: +# - comparison_metrics.csv: one row per species and metric +# - comparison_summary.csv: one row per taxon, region, metric +# - comparison_grid.csv: one row per species, grid agreement +# notes: +# - Every experiment after exp_000 asks the same thing: did the +# change do better or worse than the v2 baseline? This answers +# it the same way for any method, from the two experiments' +# summary tables, so a new experiment needs one call. +# - Two currencies, both engine-agnostic: +# - Model fit: the out-of-bag metrics, which score each draw +# on the units it left out. In-sample metrics flatter a +# flexible method, so they are not the default. +# - Habitat effects: the grid predictions, one per habitat +# type, compared by rank correlation and absolute +# difference. A GLM and a boosted tree both have these; +# only one has coefficients. +# - Rows are matched on taxon, region, season, part, species +# and metric (or grid unit), so two experiments that name +# their runs differently still line up. +# - "Better" depends on the metric: higher AUC, deviance +# explained and Spearman; lower RMSE; a calibration slope +# closer to 1. better_direction() states it once. +# - A difference is a difference in medians over draws. Whether +# it is larger than draw-to-draw noise is read from +# `share_better` across species and from the p10-p90 bands in +# comparison_metrics.csv, not from a single number. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +library(data.table) # keyed joins (version: 1.16.4) + +# 2. better_direction() ---- + +#' Which Way Is Better for a Metric +#' +#' @param metric Character vector of metric names, with or +#' without an `insample_` or `oob_` prefix. +#' @return Character vector: "higher", "lower", "toward_one" or +#' "none" (prevalence, n: not a measure of fit). +#' +#' @example # Example usage of the function +#' # better_direction(c("oob_auc", "oob_rmse")) +better_direction <- function(metric) { + base <- sub("^(insample_|oob_)", "", metric) + + ifelse( + base %in% c("rmse"), "lower", + ifelse( + base %in% c("calibration_slope"), "toward_one", + ifelse(base %in% c("prevalence", "n"), "none", "higher") + ) + ) +} + +# 3. compare_experiments() ---- + +#' Compare an Experiment's Summaries Against a Baseline's +#' +#' @param candidate_dir Character. The experiment's out_dir. +#' @param baseline_dir Character. The baseline's out_dir, e.g. +#' 3_output/exp_000_parity_v2. +#' @param metrics Character vector of metrics to compare, or NULL +#' for the out-of-bag fit metrics. +#' @param write Logical. Write the three tables to +#' `candidate_dir/tables/`. +#' @return A list of data frames: `metrics`, `summary` and `grid`. +#' +#' @example # Example usage of the function +#' # compare_experiments("3_output/exp_001_brt", +#' # "3_output/exp_000_parity_v2") +compare_experiments <- function( + candidate_dir, + baseline_dir, + metrics = NULL, + write = TRUE +) { + read_summary <- function(dir, name) { + path <- file.path(dir, "tables", paste0(name, ".csv")) + + if (!file.exists(path)) { + return(NULL) + } + + rows <- fread(path, na.strings = "") + # Season and part are empty for most taxa; a join needs them + # equal, not missing + for (column in c("season", "part")) { + if (column %in% names(rows)) { + rows[[column]] <- ifelse( + is.na(rows[[column]]), "", as.character(rows[[column]]) + ) + } + } + rows + } + + keys <- c("taxon", "region", "season", "part", "species") + values <- c("n", "median", "p10", "p90") + + # Step 1: Model fit, per species and metric + metrics <- metrics %||% c( + "oob_auc", "oob_deviance_explained", "oob_rmse", + "oob_spearman", "oob_calibration_slope" + ) + + candidate <- read_summary(candidate_dir, "metric_summary") + baseline <- read_summary(baseline_dir, "metric_summary") + + if (is.null(candidate) || is.null(baseline)) { + stop( + "Both experiments need tables/metric_summary.csv; run their ", + "collect step first.", + call. = FALSE + ) + } + + pick <- function(rows) { + rows[metric %in% metrics, c(keys, "metric", values), with = FALSE] + } + + joined <- merge( + pick(baseline), pick(candidate), + by = c(keys, "metric"), suffixes = c("_baseline", "_candidate") + ) + + joined[, difference := median_candidate - median_baseline] + joined[, direction := better_direction(metric)] + joined[, better := data.table::fcase( + direction == "higher", median_candidate > median_baseline, + direction == "lower", median_candidate < median_baseline, + direction == "toward_one", + abs(median_candidate - 1) < abs(median_baseline - 1), + default = NA + )] + + # Step 2: Per taxon, region and metric + summary <- joined[, list( + species = .N, + median_baseline = stats::median(median_baseline, na.rm = TRUE), + median_candidate = stats::median(median_candidate, na.rm = TRUE), + median_difference = stats::median(difference, na.rm = TRUE), + share_better = mean(better, na.rm = TRUE) + ), by = c("taxon", "region", "season", "part", "metric")] + + # Step 3: Habitat effects on the grid, per species + grid_candidate <- read_summary(candidate_dir, "grid_summary") + grid_baseline <- read_summary(baseline_dir, "grid_summary") + grid <- NULL + + if (!is.null(grid_candidate) && !is.null(grid_baseline)) { + grid_joined <- merge( + grid_baseline[, c(keys, "grid_unit", "median"), with = FALSE], + grid_candidate[, c(keys, "grid_unit", "median"), with = FALSE], + by = c(keys, "grid_unit"), + suffixes = c("_baseline", "_candidate") + ) + + grid <- grid_joined[, list( + grid_units = .N, + spearman = if (.N >= 3) { + suppressWarnings(stats::cor( + median_baseline, median_candidate, method = "spearman" + )) + } else { + NA_real_ + }, + median_absolute_difference = stats::median( + abs(median_candidate - median_baseline), na.rm = TRUE + ) + ), by = keys] + } + + out <- list( + metrics = as.data.frame(joined), + summary = as.data.frame(summary), + grid = if (is.null(grid)) NULL else as.data.frame(grid) + ) + + if (write) { + tables_dir <- file.path(candidate_dir, "tables") + dir.create(tables_dir, recursive = TRUE, showWarnings = FALSE) + + for (name in names(out)) { + if (!is.null(out[[name]])) { + fwrite( + out[[name]], + file.path(tables_dir, paste0("comparison_", name, ".csv")), + na = "" + ) + } + } + } + + out +} + +# End of script ---- diff --git a/1_code/harness/covariate_sets.R b/1_code/harness/covariate_sets.R index 198104e..bc6f007 100644 --- a/1_code/harness/covariate_sets.R +++ b/1_code/harness/covariate_sets.R @@ -77,12 +77,8 @@ covariate_sets <- function() { # a cross-taxa experiment can use without the taxa silently # fitting different models. # - # Five columns, once the mammal camera climate is joined. - # It was two before that: mammals carried no TD, CMD or EMT, - # because the SpTable climate block is a different and - # narrower extraction than the one their models were fitted - # against. Birds still have no MAT or PET, which is what - # keeps the shared set at five rather than more. + # Five columns. Birds have no MAT or PET, which is what keeps + # the shared set at five rather than more. # # Re-derive with common_covariates() after any dataset # version change rather than trusting this list. @@ -302,7 +298,7 @@ covariate_catalogue <- function(data_dir, taxon = NULL) { ) } - catalogue <- as.data.frame(fread(path)) + catalogue <- cached_read(path, function(p) as.data.frame(fread(p))) if (!is.null(taxon)) { # The catalogue is keyed the way covariates.csv is, so a @@ -351,7 +347,7 @@ available_covariates <- function( block = NULL, include_derived = TRUE ) { - key <- covariate_key(taxon, region) + key <- covariate_key(taxon, region, data_dir) catalogue <- covariate_catalogue(data_dir) rows <- catalogue[catalogue$taxon == key, ] @@ -467,7 +463,7 @@ term_map <- function( region = NULL, block = NULL ) { - key <- covariate_key(taxon, region) + key <- covariate_key(taxon, region, data_dir) catalogue <- covariate_catalogue(data_dir) rows <- catalogue[catalogue$taxon == key, ] diff --git a/1_code/harness/data_load.R b/1_code/harness/data_load.R index 5cbda00..f028808 100644 --- a/1_code/harness/data_load.R +++ b/1_code/harness/data_load.R @@ -5,19 +5,21 @@ # inputs: # in 0_data/test_dataset/: # - sites.csv -# - .csv # - covariates.csv -# - _offsets.csv (birds only) +# - each taxon's response and offset files, as named in +# lookup/dataset_manifest.csv +# - lookup/factor_levels.csv # outputs: none; returns objects in memory # notes: # - The taxon-agnostic data layer. Every reader takes the taxon # as an argument and knows nothing else about it; what a taxon # means is carried by its spec, not by this file. -# - covariates.csv is keyed on survey_unit_id and a covariate -# key, which is the taxon for most taxa but the taxon and -# region for mammals, whose north and south files carry -# different values for the same deployment. covariate_key() -# is the one place that difference is expressed. +# - Where each taxon's files are, and the key its rows carry in +# covariates.csv, is read from lookup/dataset_manifest.csv +# (written by _setup/09). Nothing here names a taxon. The key +# is the taxon for most taxa, but the taxon and region for +# mammals, whose north and south files carry different values +# for the same deployment. # - Reading is column-selective. covariates.csv is 218 MB and # 457 columns wide; a run wants a handful, so every reader # takes the columns it needs rather than loading the table. @@ -43,37 +45,97 @@ ## 1.1 Load packages ---- library(data.table) # column-selective CSV reading (version: 1.16.4) -# 2. covariate_key() ---- +# 2. The dataset manifest ---- + +## 2.1 dataset_manifest() ---- + +#' Read Where Each Taxon's Files Are +#' +#' One row per taxon and region: the response file, the offset +#' file, the covariate key, the habitat prediction grid, and any +#' stored bootstrap draws. +#' +#' @param data_dir Character. Path to 0_data/test_dataset. +#' @return A data frame. +#' +#' @example # Example usage of the function +#' # dataset_manifest(data_dir) +dataset_manifest <- function(data_dir) { + path <- file.path(data_dir, "lookup", "dataset_manifest.csv") + + if (!file.exists(path)) { + stop( + "Dataset manifest not found: + ", path, + " +Run 1_code/_setup/09_harmonize_lookups.R first.", + call. = FALSE + ) + } + + cached_read(path, function(p) { + as.data.frame(fread(p, na.strings = "", colClasses = "character")) + }) +} + +## 2.2 manifest_entry() ---- + +#' One Taxon's Manifest Row +#' +#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param taxon Character. Taxon slug. +#' @param region Character, or NULL for the taxon's first region, +#' which is enough for anything that does not vary by region. +#' @return A one-row data frame. +#' +#' @example # Example usage of the function +#' # manifest_entry(data_dir, "mammal", "north")$covariate_key +manifest_entry <- function(data_dir, taxon, region = NULL) { + manifest <- dataset_manifest(data_dir) + rows <- manifest[manifest$taxon == taxon, ] + + if (nrow(rows) == 0) { + stop( + "Taxon `", taxon, "` is not in the dataset manifest. Taxa: ", + paste(unique(manifest$taxon), collapse = ", "), + call. = FALSE + ) + } + + if (!is.null(region)) { + rows <- rows[rows$region == region, ] + + if (nrow(rows) == 0) { + stop( + "The manifest has no region `", region, "` for ", taxon, + ".", call. = FALSE + ) + } + } + + rows[1, , drop = FALSE] +} + +## 2.3 covariate_key() ---- #' Name a Taxon's Key in covariates.csv #' -#' Most taxa have one covariate row per survey unit. Mammals have -#' two models fitted on overlapping deployments, north and south, -#' whose covariates disagree, so their rows are keyed by taxon and -#' region together. -#' -#' @param taxon Character. Taxon slug, as in the response file -#' name (e.g. "bryophyte", "mammal", "bird"). -#' @param region Character. Region name, or NULL when the taxon -#' is not split. -#' @param split_taxa Character vector of taxa whose covariates -#' are stored per region. +#' @param taxon Character. Taxon slug. +#' @param region Character, or NULL when the taxon's covariates +#' are not stored per region. +#' @param data_dir Character. Path to 0_data/test_dataset. #' @return Character. The value to match in the `taxon` column of #' covariates.csv. #' #' @example # Example usage of the function -#' # covariate_key("mammal", "north") # "mammal_north" -#' # covariate_key("bryophyte", "north") # "bryophyte" -covariate_key <- function( - taxon, - region = NULL, - split_taxa = c("mammal") -) { - if (is.null(region) || !taxon %in% split_taxa) { +#' # covariate_key("mammal", "north", data_dir) # "mammal_north" +#' # covariate_key("bryophyte", NULL, data_dir) # "bryophyte" +covariate_key <- function(taxon, region = NULL, data_dir) { + if (is.null(region)) { return(taxon) } - paste(taxon, region, sep = "_") + manifest_entry(data_dir, taxon, region)$covariate_key } # 3. load_sites() ---- @@ -151,7 +213,9 @@ load_sites <- function(data_dir, taxon = NULL, columns = NULL) { #' # y <- load_response("bryophyte", data_dir, #' # species = "Aulacomnium.palustre") load_response <- function(taxon, data_dir, species = NULL) { - path <- file.path(data_dir, paste0(taxon, ".csv")) + path <- file.path( + data_dir, manifest_entry(data_dir, taxon)$response_file + ) check_dataset_file(path) if (is.null(species)) { @@ -196,12 +260,15 @@ load_response <- function(taxon, data_dir, species = NULL) { #' @example # Example usage of the function #' # off <- load_offsets("bird", data_dir, species = "ALFL") load_offsets <- function(taxon, data_dir, species = NULL) { - path <- file.path(data_dir, paste0(taxon, "_offsets.csv")) + offset_file <- manifest_entry(data_dir, taxon)$offset_file - if (!file.exists(path)) { + if (is.na(offset_file)) { return(NULL) } + path <- file.path(data_dir, offset_file) + check_dataset_file(path) + if (is.null(species)) { return(as.data.frame(fread(path))) } @@ -246,7 +313,7 @@ load_covariates <- function( path <- file.path(data_dir, "covariates.csv") check_dataset_file(path) - key <- covariate_key(taxon, region) + key <- covariate_key(taxon, region, data_dir) # Step 1: Check against what this taxon has, not against the # file header. covariates.csv is one wide table across every @@ -282,27 +349,58 @@ load_covariates <- function( ) } - covariates <- fread( - path, - select = unique(c("survey_unit_id", "taxon", to_read)) + # Step 2: Read the columns this key has not read before. The + # file is 218 MB, and a spec asks for overlapping column sets - + # the province climate, then each region's habitat - so columns + # already read for the key are kept for the session and only + # the rest are read. + info <- file.info(path) + cache_key <- paste( + "covariates", normalizePath(path, winslash = "/"), + format(info$mtime, "%Y%m%d%H%M%OS3"), info$size, key, + sep = "|" ) + held <- if (exists(cache_key, envir = .sdm_cache)) { + get(cache_key, envir = .sdm_cache) + } else { + NULL + } + to_load <- setdiff(to_read, names(held)) - # Step 2: Keep this taxon's rows, then drop the key column so - # the result is survey_unit_id plus covariates - covariates <- covariates[covariates$taxon == key, ] - - if (nrow(covariates) == 0) { - keys <- unique(fread(path, select = "taxon")$taxon) - stop( - "No covariate rows for key `", key, "`. Keys present: ", - paste(keys, collapse = ", "), - call. = FALSE + if (is.null(held) || length(to_load) > 0) { + fresh <- fread( + path, select = unique(c("survey_unit_id", "taxon", to_load)) ) - } - covariates[, taxon := NULL] + # Keep this key's rows, then drop the key column so the result + # is survey_unit_id plus covariates + fresh <- fresh[fresh$taxon == key, ] + + if (nrow(fresh) == 0) { + keys <- unique(fread(path, select = "taxon")$taxon) + stop( + "No covariate rows for key `", key, "`. Keys present: ", + paste(keys, collapse = ", "), + call. = FALSE + ) + } + + fresh[, taxon := NULL] + fresh <- as.data.frame(fresh) - covariates <- as.data.frame(covariates) + held <- if (is.null(held)) { + fresh + } else { + # Rows come back in file order every time, so the new + # columns line up with the held ones + cbind(held, fresh[, to_load, drop = FALSE]) + } + + assign(cache_key, held, envir = .sdm_cache) + } + + covariates <- held[, unique(c("survey_unit_id", to_read)), + drop = FALSE] # Step 3: Compute whatever was derivable rather than stored, # then hand back exactly the columns that were asked for @@ -321,8 +419,8 @@ load_covariates <- function( #' classes, and the survey method. A CSV reads them back as #' character, and a model then factors them alphabetically, which #' silently changes the reference level and so every contrast -#' coefficient. `_factor_levels.csv` records the order the -#' source used, and this restores it. +#' coefficient. lookup/factor_levels.csv records, per taxon, the +#' order the source used, and this restores it. #' #' A level present in the data but not in the lookup is an error #' rather than an extra level: it means the lookup is stale, and @@ -336,16 +434,18 @@ load_covariates <- function( #' @example # Example usage of the function #' # apply_factor_levels(frame, data_dir, "bird") apply_factor_levels <- function(frame, data_dir, taxon) { - path <- file.path( - data_dir, "lookup", paste0(taxon, "_factor_levels.csv") + path <- file.path(data_dir, "lookup", "factor_levels.csv") + check_dataset_file(path) + + levels_table <- cached_read( + path, function(p) as.data.frame(fread(p)) ) + levels_table <- levels_table[levels_table$taxon == taxon, ] - if (!file.exists(path)) { + if (nrow(levels_table) == 0) { return(frame) } - levels_table <- as.data.frame(fread(path)) - # The lookup names columns as the source did. A column the # harmonizer suffixed because it sits in more than one block - # the bird `method`, stored as method_veg and method_soil - is @@ -355,7 +455,7 @@ apply_factor_levels <- function(frame, data_dir, taxon) { # reference level and every contrast. map_path <- file.path(data_dir, "lookup", "covariate_columns.csv") column_map <- if (file.exists(map_path)) { - map <- as.data.frame(fread(map_path)) + map <- covariate_catalogue(data_dir) map[map$taxon == taxon, c("source_column", "master_column")] } else { data.frame(source_column = character(0), @@ -456,7 +556,7 @@ reference level and every contrast.", #' @param aliases Named list, alias to source column. Lets a #' model set name a column the dataset stores otherwise. #' @param site_columns Character vector of sites.csv columns to -#' carry, beyond survey_unit_id. +#' carry, beyond survey_unit_id, or NULL for site_columns(). #' @return A list with `covariates` (one row per unit, including #' the site columns), `response`, `offset` (or NULL), `units`, #' `taxon` and `region`. @@ -476,11 +576,10 @@ build_model_data <- function( region_filter = NULL, weight_column = NULL, aliases = list(), - site_columns = c( - "lat", "long", "easting", "northing", "nr", "nsr", "luf", "year", - "lured", "location", "summer_days", "winter_days" - ) + site_columns = NULL ) { + site_columns <- site_columns %||% site_columns() + # Step 1: Read each piece, narrowed to what was asked for. The # weight is a covariate like any other, so it is added here # rather than left for the caller to remember. @@ -705,7 +804,26 @@ check_dataset_file <- function(path) { invisible(NULL) } -## 10.2 align_to_units() ---- +## 10.2 site_columns() ---- + +#' The Site Fields Every Model Frame Carries +#' +#' Read from sites.csv rather than covariates.csv, so a region +#' filter or a formula may name them without loading them as +#' covariates. +#' +#' @return A character vector of sites.csv column names. +#' +#' @example # Example usage of the function +#' # site_columns() +site_columns <- function() { + c( + "lat", "long", "easting", "northing", "nr", "nsr", "luf", "year", + "lured", "location", "summer_days", "winter_days" + ) +} + +## 10.3 align_to_units() ---- #' Put a Keyed Frame in a Given Survey Unit Order #' @@ -725,7 +843,7 @@ align_to_units <- function(frame, units) { out } -## 10.3 apply_response_transform() ---- +## 10.4 apply_response_transform() ---- #' Turn a Recorded Value into a Modelling Response #' @@ -764,7 +882,7 @@ apply_response_transform <- function( ) } -## 10.4 rlang_f_rhs() ---- +## 10.5 rlang_f_rhs() ---- #' Take the Right-Hand Side of a One-Sided Formula #' diff --git a/1_code/harness/engines.R b/1_code/harness/engines.R index 11d4244..efbdba3 100644 --- a/1_code/harness/engines.R +++ b/1_code/harness/engines.R @@ -1,409 +1,368 @@ # --- -# title: Fitting Engines +# title: Engine Interface # author: Brendan Casey # created: 2026-09-09 # inputs: none -# outputs: none; returns objects in memory +# outputs: none; defines functions in memory # notes: -# - A engine is a fitting method behind one interface, so that -# swapping GLM for a boosted tree is a one-word change in an -# experiment rather than a rewrite. Every engine supplies -# fit, coef, predict and ic; an engine that has no -# coefficients returns NULL from coef, and the result writer -# records that rather than failing. -# - Registered here: `glm` and `bayesglm`. `gbm` and `brms` -# come later; the registry is what they slot into. -# - bayesglm and glm sit on different axes and should not be -# read as "frequentist versus Bayesian". bayesglm is -# penalized maximum likelihood - augmented IRLS under weakly -# informative Cauchy priors - giving a point estimate and a -# standard error, with no posterior. It belongs on a -# regularization axis. A Bayesian framework comparison needs -# brms or rstanarm. -# - The plant v2 models use bayesglm because rare species fitted -# against 30-term habitat formulas separate completely, and -# plain glm then returns infinite coefficients. The -# regularization is load-bearing there, not incidental, so -# swapping plants to glm as a control will fail outright for -# the rare end of the species list rather than give a clean -# comparison. -# - predict() takes an `se` flag. Inverse-variance averaging -# weights each candidate by the precision of its prediction, -# so an engine that cannot return a standard error cannot -# use that selection rule. Tree and boosting engines will -# need a different weighting when they arrive. -# - Fitting failures are caught and returned, not raised. A -# candidate model set is expected to contain models that -# cannot be estimated for a given species and bootstrap, and -# the selection rule needs to see which ones failed. +# - An engine is a fitting method behind one interface, so that +# swapping a GLM for a boosted tree is a one-word change in a +# spec rather than a rewrite. The engines themselves live in +# 1_code/methods/engines/, one file each; this file is how the +# harness talks to them. +# - The contract, in full, is in 1_code/methods/README.md: +# `fit(formula, data, family, weights, offset, control)` +# returns list(fit, ok, message) and never raises; +# `predict(fit, newdata, type, se)` returns a numeric vector +# (or list(fit, se.fit) when se = TRUE), or NULL on failure; +# `coef(fit)` and `ic(fit, type)` exist when the engine +# declares the `coefficients` and `ic` capabilities. +# - check_engine() runs that contract on small synthetic data, +# so a new engine can be tested before it meets the dataset. # --- # 1. Setup ---- ## 1.1 Load packages ---- -# arm is loaded lazily by the bayesglm engine rather than here, -# so a run that never uses it does not need it installed. +# Base R only. -# 2. Engine registry ---- - -## 2.1 engine_registry() ---- - -#' The Available Fitting Engines -#' -#' Each entry supplies four functions: `fit`, `coef`, `predict` -#' and `ic`. Adding an engine means adding an entry, not -#' touching the fitting loop. -#' -#' @return A named list of engine definitions. -#' -#' @example # Example usage of the function -#' # names(engine_registry()) -engine_registry <- function() { - list( - glm = engine_glm(), - bayesglm = engine_bayesglm() - ) -} - -## 2.2 get_engine() ---- +# 2. get_engine() ---- #' Look Up One Engine #' -#' @param name Character. Engine name. -#' @param registry Named list of engine definitions. +#' @param name Character. A registered engine name. #' @return The engine definition. #' #' @example # Example usage of the function #' # get_engine("glm") -get_engine <- function(name, registry = engine_registry()) { - if (!name %in% names(registry)) { - stop( - "Unknown engine `", name, "`. Registered: ", - paste(names(registry), collapse = ", "), - call. = FALSE - ) - } - - registry[[name]] +get_engine <- function(name) { + get_method("engine", name) } -# 3. engine_glm() ---- +# 3. Capabilities ---- -#' Plain Generalized Linear Model +## 3.1 engine_has() ---- + +#' Does an Engine Declare a Capability #' -#' @return An engine definition. +#' @param engine An engine definition. +#' @param capability Character. One of engine_capabilities(). +#' @return Logical. #' #' @example # Example usage of the function -#' # e <- engine_glm() -#' # fit <- e$fit(response ~ MAP, data, family = "binomial") -engine_glm <- function() { - list( - name = "glm", - has_coefficients = TRUE, - fit = function(formula, data, family, weights = NULL, - offset = NULL, control = list()) { - fit_glm_family( - stats::glm, formula, data, family, weights, offset, - control - ) - }, - coef = function(fit) fit_coefficients(fit), - predict = function(fit, newdata, type = "link", se = FALSE) { - fit_predict(fit, newdata, type, se) - }, - ic = function(fit, type = "AICc") information_criterion(fit, type) - ) +#' # engine_has(get_engine("glm"), "se") +engine_has <- function(engine, capability) { + capability %in% engine$capabilities } -# 4. engine_bayesglm() ---- +## 3.2 engine_coef() ---- -#' Penalized GLM with Weakly Informative Priors +#' Coefficients from a Fit, Where the Engine Has Them #' -#' `arm::bayesglm` with its default Cauchy priors, which is what -#' the v2 plant models use. See the header on why this is not a -#' Bayesian framework in the sense a framework comparison means. +#' A fit made through fit_with() carries its coefficients +#' already, so they are computed once per fit however many times +#' a rule reads them. #' -#' @return An engine definition. +#' @param engine An engine definition. +#' @param fit A fit from engine$fit(). +#' @return A data frame of term, estimate and se, or NULL. #' #' @example # Example usage of the function -#' # e <- engine_bayesglm() -engine_bayesglm <- function() { - list( - name = "bayesglm", - has_coefficients = TRUE, - fit = function(formula, data, family, weights = NULL, - offset = NULL, control = list()) { - if (!requireNamespace("arm", quietly = TRUE)) { - stop( - "The bayesglm engine needs the arm package.", - call. = FALSE - ) - } +#' # engine_coef(engine, fit) +engine_coef <- function(engine, fit) { + if (is.null(fit) || !isTRUE(fit$ok)) { + return(NULL) + } - # maxit defaults to the v2 value, which was raised from the - # arm default because rare species converge slowly - if (is.null(control$maxit)) { - control$maxit <- 250 - } + if (!is.null(fit$coefficients)) { + return(fit$coefficients) + } - fit_glm_family( - arm::bayesglm, formula, data, family, weights, offset, - control - ) - }, - coef = function(fit) fit_coefficients(fit), - predict = function(fit, newdata, type = "link", se = FALSE) { - fit_predict(fit, newdata, type, se) - }, - ic = function(fit, type = "AICc") information_criterion(fit, type) - ) -} + if (!engine_has(engine, "coefficients")) { + return(NULL) + } -# 5. Shared implementations ---- -# glm and bayesglm take the same arguments and return objects of -# the same shape, so the four operations are written once. + engine$coef(fit) +} -## 5.1 fit_glm_family() ---- +## 3.3 engine_converged() ---- -#' Fit a GLM-Family Model, Catching Failure +#' Did a Fit Converge, as Far as the Engine Can Say #' -#' @param fitter Function. stats::glm or arm::bayesglm. -#' @param formula A model formula. -#' @param data A data frame. -#' @param family Character or family object. -#' @param weights Numeric vector or NULL. -#' @param offset Numeric vector or NULL. -#' @param control Named list of extra arguments to the fitter. -#' @return A list with `fit` (or NULL), `ok`, and `message`. +#' @param engine An engine definition. +#' @param fit A fit from engine$fit(). +#' @return Logical. FALSE for a failed fit; TRUE for a fit whose +#' engine cannot report convergence. #' #' @example # Example usage of the function -#' # fit_glm_family(stats::glm, y ~ x, d, "binomial") -fit_glm_family <- function( - fitter, - formula, - data, - family, - weights = NULL, - offset = NULL, - control = list() -) { - args <- c( - list(formula = formula, data = data, family = family), - control - ) - - # Weights and offsets are passed as values rather than named in - # the formula, so the same formula serves a taxon that has them - # and one that does not. - if (!is.null(weights)) { - args$weights <- weights +#' # engine_converged(engine, fit) +engine_converged <- function(engine, fit) { + if (is.null(fit) || !isTRUE(fit$ok)) { + return(FALSE) } - if (!is.null(offset)) { - args$offset <- offset + if (!is.function(engine$converged)) { + return(TRUE) } - # A candidate set is expected to hold models that cannot be - # estimated for a given species and draw. The selection rule - # needs to see which failed, so failure is returned, not raised. - # - # A convergence warning still leaves a usable fit, so it is - # recorded rather than treated as a failure. It is caught with - # withCallingHandlers() and muffled, so the model is fitted - # once; catching it with tryCatch() would abandon the fit and - # force a second one. - warnings_seen <- character(0) - - tryCatch( - { - fit <- withCallingHandlers( - do.call(fitter, args), - warning = function(w) { - warnings_seen <<- c(warnings_seen, conditionMessage(w)) - invokeRestart("muffleWarning") - } - ) - - list( - fit = fit, - ok = TRUE, - message = if (length(warnings_seen) == 0) { - NA_character_ - } else { - paste(unique(warnings_seen), collapse = "; ") - } - ) - }, - error = function(e) { - list(fit = NULL, ok = FALSE, message = conditionMessage(e)) - } - ) + isTRUE(engine$converged(fit)) } -## 5.2 fit_coefficients() ---- +## 3.4 engine_nobs() ---- -#' Take Coefficients and Standard Errors from a Fit +#' Number of Observations a Fit Used #' -#' @param fit A list from fit_glm_family(). -#' @return A data frame of term, estimate and se, or NULL when -#' the fit failed. +#' @param engine An engine definition, or NULL. +#' @param fit A fit from engine$fit(). +#' @return An integer, or NA when it cannot be said. #' #' @example # Example usage of the function -#' # fit_coefficients(fit) -fit_coefficients <- function(fit) { - if (is.null(fit) || !isTRUE(fit$ok) || is.null(fit$fit)) { - return(NULL) +#' # engine_nobs(engine, fit) +engine_nobs <- function(engine, fit) { + if (is.null(fit) || !isTRUE(fit$ok)) { + return(NA_integer_) } - estimates <- stats::coef(fit$fit) - errors <- tryCatch( - stats::coef(summary(fit$fit))[, "Std. Error"], - error = function(e) rep(NA_real_, length(estimates)) - ) + if (!is.null(engine) && is.function(engine$nobs)) { + return(tryCatch( + as.integer(engine$nobs(fit)), + error = function(e) NA_integer_ + )) + } - data.frame( - term = names(estimates), - estimate = as.numeric(estimates), - se = as.numeric(errors[match(names(estimates), names(errors))]), - stringsAsFactors = FALSE + tryCatch( + as.integer(stats::nobs(fit$fit)), + error = function(e) NA_integer_ ) } -## 5.3 fit_predict() ---- +## 3.5 fit_with() ---- -#' Predict from a Fit +#' Fit One Formula Through an Engine +#' +#' The one place a candidate is fitted, so every rule gets the +#' same thing back: the engine's fit, with its coefficients +#' computed once and kept on it. #' -#' @param fit A list from fit_glm_family(). -#' @param newdata A data frame to predict onto. -#' @param type Character. "link" or "response". -#' @param se Logical. Return standard errors alongside the fit. -#' Inverse-variance averaging needs them, and an engine that -#' cannot supply them cannot use that selection rule. -#' @return A numeric vector, or when `se` is TRUE a list of `fit` -#' and `se.fit`. NULL when the fit failed. +#' @param engine An engine definition. +#' @param formula A model formula. +#' @param data,family,weights,offset,control As engine$fit takes. +#' @return The engine's fit list, with `coefficients` added when +#' the engine has them. #' #' @example # Example usage of the function -#' # fit_predict(fit, prediction_grid, type = "response") -#' # fit_predict(fit, grid, "link", se = TRUE)$se.fit -fit_predict <- function(fit, newdata, type = "link", se = FALSE) { - if (is.null(fit) || !isTRUE(fit$ok) || is.null(fit$fit)) { - return(NULL) - } - - tryCatch( - { - predicted <- stats::predict( - fit$fit, newdata = newdata, type = type, se.fit = se - ) +#' # fit_with(get_engine("glm"), response ~ MAP, d, "binomial") +fit_with <- function( + engine, formula, data, family, weights = NULL, offset = NULL, + control = list() +) { + fit <- engine$fit( + formula = formula, data = data, family = family, + weights = weights, offset = offset, control = control + ) - if (!se) { - return(as.numeric(predicted)) - } + if (isTRUE(fit$ok) && engine_has(engine, "coefficients")) { + fit$coefficients <- engine$coef(fit) + } - list( - fit = as.numeric(predicted$fit), - se.fit = as.numeric(predicted$se.fit) - ) - }, - error = function(e) NULL - ) + fit } -## 5.4 information_criterion() ---- +# 4. check_engine() ---- -#' Score a Fit for Model Selection +#' Test an Engine Against the Contract #' -#' AICc rather than AIC, because the candidate sets are large -#' relative to the number of survey units a rare species is -#' detected at. +#' Fits small synthetic binomial and Poisson data - with weights, +#' an offset in the formula, and a factor - and checks each part +#' of the contract the engine claims. Run it on a new engine +#' before using it in a spec. #' -#' @param fit A list from fit_glm_family(). -#' @param type Character. "AIC", "AICc" or "BIC". -#' @return A numeric value; Inf when the fit failed, so a failed -#' model never wins a selection. +#' @param engine An engine definition, or a registered name. +#' @param n Integer. Rows of synthetic data. +#' @param seed Integer. Seed for the synthetic data. +#' @param quiet Logical. Suppress the printed table. +#' @return A data frame of check, family, pass and note, +#' invisibly. Every `pass` should be TRUE. #' #' @example # Example usage of the function -#' # information_criterion(fit, "BIC") -information_criterion <- function(fit, type = "AICc") { - if (is.null(fit) || !isTRUE(fit$ok) || is.null(fit$fit)) { - return(Inf) +#' # check_engine("glm") +#' # check_engine(my_new_engine()) +check_engine <- function(engine, n = 400L, seed = 1L, quiet = FALSE) { + if (is.character(engine)) { + engine <- get_engine(engine) + } + + # Step 1: Synthetic data with a known signal, built under its + # own seed so the session's random state is left alone. + data <- with_seed(seed, { + x1 <- stats::rnorm(n) + x2 <- stats::runif(n) + habitat <- factor(sample(c("A", "B", "C"), n, replace = TRUE)) + effort <- stats::runif(n, 0.5, 2) + eta <- -0.5 + 0.8 * x1 - 0.6 * x2 + (habitat == "B") * 0.7 + + data.frame( + x1 = x1, x2 = x2, habitat = habitat, + offset = log(effort), + weight = stats::runif(n, 0.5, 1.5), + presence = stats::rbinom(n, 1, stats::plogis(eta)), + count = stats::rpois(n, exp(eta + log(effort))) + ) + }) + + checks <- list() + + record <- function(check, family, pass, note = "") { + checks[[length(checks) + 1]] <<- data.frame( + check = check, family = family, pass = isTRUE(pass), + note = note, stringsAsFactors = FALSE + ) } - value <- tryCatch( - switch( - type, - AIC = stats::AIC(fit$fit), - BIC = stats::BIC(fit$fit), - AICc = { - # The parameter count is the log-likelihood's degrees of - # freedom, as MuMIn uses, not the length of the - # coefficient vector, which also counts aliased (NA) - # terms and so over-penalizes a rank-deficient model. - k <- attr(stats::logLik(fit$fit), "df") - n <- stats::nobs(fit$fit) - # The correction is undefined once the parameter count - # reaches the sample size; Inf keeps such a model out of - # the selection rather than returning a negative score. - if (is.na(n) || n - k - 1 <= 0) { - Inf + newdata <- data[1:20, ] + + for (family in c("binomial", "poisson")) { + formula <- if (family == "binomial") { + presence ~ x1 + x2 + habitat + } else { + count ~ x1 + x2 + habitat + offset(offset) + } + + # Step 2: Fitting succeeds, weighted, and reports itself + fit <- tryCatch( + engine$fit( + formula = formula, data = data, family = family, + weights = data$weight, offset = NULL, control = list() + ), + error = function(e) { + list(ok = FALSE, message = conditionMessage(e)) + } + ) + record( + "fit returns list(fit, ok, message) with ok = TRUE", family, + is.list(fit) && isTRUE(fit$ok) && + all(c("fit", "ok", "message") %in% names(fit)), + if (!isTRUE(fit$ok)) format(fit$message) else "" + ) + + if (!isTRUE(fit$ok)) { + next + } + + # Step 3: Predictions on both scales + link <- tryCatch( + engine$predict(fit, newdata, "link"), + error = function(e) NULL + ) + response <- tryCatch( + engine$predict(fit, newdata, "response"), + error = function(e) NULL + ) + record( + "predict returns one finite value per row", family, + is.numeric(link) && length(link) == nrow(newdata) && + all(is.finite(link)) + ) + record( + "response-scale prediction is in range", family, + is.numeric(response) && length(response) == nrow(newdata) && + if (family == "binomial") { + all(response >= 0 & response <= 1) } else { - stats::AIC(fit$fit) + (2 * k * (k + 1)) / (n - k - 1) + all(response >= 0) } - }, - stop( - "Unknown information criterion `", type, "`.", - call. = FALSE + ) + + # The offset is part of a survey, not of the model: changing + # it on new data must change a Poisson prediction. + if (family == "poisson") { + shifted <- newdata + shifted$offset <- shifted$offset + log(2) + doubled <- tryCatch( + engine$predict(fit, shifted, "response"), + error = function(e) NULL ) - ), - error = function(e) Inf - ) + record( + "an offset in the formula is applied to new data", family, + is.numeric(doubled) && + isTRUE(all.equal(doubled, 2 * response, tolerance = 1e-6)) + ) + } - if (is.na(value)) Inf else value -} + # Step 4: The optional capabilities the engine declares + if (engine_has(engine, "coefficients")) { + cf <- tryCatch(engine$coef(fit), error = function(e) NULL) + record( + "coef returns term, estimate and se", family, + is.data.frame(cf) && + all(c("term", "estimate", "se") %in% names(cf)) && + nrow(cf) > 0 + ) + } -## 5.5 fit_converged() ---- + if (engine_has(engine, "ic")) { + scores <- vapply( + c("AIC", "AICc", "BIC"), + function(type) { + tryCatch(engine$ic(fit, type), error = function(e) NA_real_) + }, + numeric(1) + ) + record( + "ic returns a finite AIC, AICc and BIC", family, + all(is.finite(scores)) + ) + } -#' Did a Fit Converge -#' -#' Inverse-variance averaging drops non-converged candidates -#' rather than down-weighting them, which is what the v2 plant -#' code does. -#' -#' @param fit A list from fit_glm_family(). -#' @return Logical. FALSE when the fit failed or did not -#' converge. -#' -#' @example # Example usage of the function -#' # fit_converged(fit) -fit_converged <- function(fit) { - if (is.null(fit) || !isTRUE(fit$ok) || is.null(fit$fit)) { - return(FALSE) + if (engine_has(engine, "se")) { + with_se <- tryCatch( + engine$predict(fit, newdata, "link", se = TRUE), + error = function(e) NULL + ) + record( + "predict(se = TRUE) returns fit and se.fit", family, + is.list(with_se) && + length(with_se$fit) == nrow(newdata) && + length(with_se$se.fit) == nrow(newdata) && + all(with_se$se.fit >= 0) + ) + } } - converged <- fit$fit$converged + # Step 5: Failure is returned, not raised, so a selection rule + # can see which candidates failed + failed <- tryCatch( + engine$fit( + formula = presence ~ no_such_column, data = data, + family = "binomial", weights = NULL, offset = NULL, + control = list() + ), + error = function(e) "raised" + ) + record( + "a failed fit returns ok = FALSE rather than raising", "-", + is.list(failed) && identical(failed$ok, FALSE) + ) - if (is.null(converged)) { - return(TRUE) + if (is.list(failed)) { + record( + "predict on a failed fit returns NULL", "-", + is.null(tryCatch( + engine$predict(failed, newdata, "response"), + error = function(e) "raised" + )) + ) } - isTRUE(converged) -} - -## 5.6 fit_nobs() ---- + result <- do.call(rbind, checks) -#' Number of Observations a Fit Used -#' -#' @param fit A list from fit_glm_family(). -#' @return An integer, or NA when the fit failed. -#' -#' @example # Example usage of the function -#' # fit_nobs(fit) -fit_nobs <- function(fit) { - if (is.null(fit) || !isTRUE(fit$ok) || is.null(fit$fit)) { - return(NA_integer_) + if (!quiet) { + cat("Engine `", engine$name, "`: ", sum(result$pass), " of ", + nrow(result), " checks pass\n", sep = "") + print(result, row.names = FALSE, right = FALSE) } - as.integer(stats::nobs(fit$fit)) + invisible(result) } # End of script ---- diff --git a/1_code/harness/eval_metrics.R b/1_code/harness/eval_metrics.R index c05cd82..e3f45c9 100644 --- a/1_code/harness/eval_metrics.R +++ b/1_code/harness/eval_metrics.R @@ -5,22 +5,15 @@ # inputs: none # outputs: none; returns objects in memory # notes: -# - Metrics computed here are what experiments are compared on, -# so a change affects every past and future experiment and -# should be reviewed on that basis. -# - Every metric takes observed and predicted vectors and -# returns one number, so the set is extended by adding an -# entry to metric_registry() rather than by touching the -# loop. +# - Metrics are what experiments are compared on, so a change +# affects every past and future experiment and should be +# reviewed on that basis. +# - The metrics themselves live in 1_code/methods/metrics/, one +# file each, registered by name. Every metric takes observed +# and predicted vectors on the response scale and returns one +# number. # - Metrics are computed from predictions, never from a fitted # object, so a GLM and a boosted tree are scored the same way. -# That is the whole reason predictions rather than -# coefficients are the comparison currency. -# - AUC is computed directly rather than through pROC, so the -# harness does not depend on a package for one number, and so -# ties are handled explicitly. It is the Mann-Whitney form: -# the probability a random detection scores above a random -# non-detection, with ties counting a half. # - A metric that cannot be computed returns NA rather than # stopping. A bootstrap where a species was never detected # has no AUC, and that is a fact about the draw, not an error. @@ -29,27 +22,28 @@ # 1. Setup ---- ## 1.1 Load packages ---- -# Base R only, deliberately; see the header. +# Base R only. -# 2. metric_registry() ---- +# 2. default_metrics() ---- -#' The Available Metrics +#' The Metrics Scored When a Run Names None #' -#' @return A named list of functions taking `observed` and -#' `predicted` and returning one number. +#' Every registered metric. The seven original ones come first in +#' their original order, so a metrics table lists them the same +#' way it always has; any added later follow alphabetically. +#' +#' @return A character vector of metric names. #' #' @example # Example usage of the function -#' # names(metric_registry()) -metric_registry <- function() { - list( - auc = metric_auc, - deviance_explained = metric_deviance_explained, - rmse = metric_rmse, - spearman = metric_spearman, - calibration_slope = metric_calibration_slope, - prevalence = metric_prevalence, - n = metric_n +#' # default_metrics() +default_metrics <- function() { + core <- c( + "auc", "deviance_explained", "rmse", "spearman", + "calibration_slope", "prevalence", "n" ) + registered <- registered_names("metric") + + c(intersect(core, registered), sort(setdiff(registered, core))) } # 3. compute_metrics() ---- @@ -60,27 +54,21 @@ metric_registry <- function() { #' @param predicted Numeric vector of predictions, on the #' response scale. #' @param metrics Character vector of metric names, or NULL for -#' every registered metric. +#' default_metrics(). #' @return A data frame of metric and value. #' #' @example # Example usage of the function #' # compute_metrics(obs, pred, metrics = c("auc", "rmse")) compute_metrics <- function(observed, predicted, metrics = NULL) { - registry <- metric_registry() - if (is.null(metrics)) { - metrics <- names(registry) + metrics <- default_metrics() } - unknown <- setdiff(metrics, names(registry)) - - if (length(unknown) > 0) { - stop( - "Unknown metric(s): ", paste(unknown, collapse = ", "), - ". Registered: ", paste(names(registry), collapse = ", "), - call. = FALSE - ) - } + # Looked up first, so a misspelt metric stops the run here + functions <- lapply( + stats::setNames(metrics, metrics), + function(name) get_method("metric", name) + ) # Step 1: Drop pairs where either side is missing, so every # metric sees the same rows @@ -88,18 +76,18 @@ compute_metrics <- function(observed, predicted, metrics = NULL) { observed <- observed[keep] predicted <- predicted[keep] - # Step 2: Score, letting an uncomputable metric return NA + # Step 2: Score, letting an uncomputable metric return NA. A + # warning is muffled rather than caught, so the metric is + # computed once. values <- vapply( metrics, function(name) { tryCatch( - as.numeric(registry[[name]](observed, predicted)), - error = function(e) NA_real_, - warning = function(w) { - suppressWarnings( - as.numeric(registry[[name]](observed, predicted)) - ) - } + withCallingHandlers( + as.numeric(functions[[name]](observed, predicted)), + warning = function(w) invokeRestart("muffleWarning") + ), + error = function(e) NA_real_ ) }, numeric(1) @@ -112,169 +100,4 @@ compute_metrics <- function(observed, predicted, metrics = NULL) { ) } -# 4. Metric implementations ---- - -## 4.1 metric_auc() ---- - -#' Area Under the ROC Curve -#' -#' The Mann-Whitney form: the probability that a randomly chosen -#' detection scores above a randomly chosen non-detection, with -#' ties counting a half. Values above zero are treated as -#' detections, so a count or a density scores the same way a -#' presence does. -#' -#' @param observed,predicted Numeric vectors. -#' @return A number between 0 and 1, or NA when the observations -#' are all detections or all non-detections. -#' -#' @example # Example usage of the function -#' # metric_auc(c(0, 0, 1, 1), c(0.1, 0.3, 0.4, 0.9)) -metric_auc <- function(observed, predicted) { - positive <- observed > 0 - - # An AUC needs both classes present. A bootstrap where a - # species was never detected has none, which is a fact about - # the draw rather than a failure. - if (!any(positive) || all(positive)) { - return(NA_real_) - } - - ranks <- rank(predicted, ties.method = "average") - - # Counted as doubles, not integers. sum() of a logical returns - # an integer, and at bird scale - 16,745 detections against - # 199,013 non-detections - their product is 3.3e9, past the - # 32-bit maximum. That overflows to NA silently, so every large - # run would report no AUC at all. - n_pos <- as.numeric(sum(positive)) - n_neg <- as.numeric(sum(!positive)) - - (sum(ranks[positive]) - n_pos * (n_pos + 1) / 2) / - (n_pos * n_neg) -} - -## 4.2 metric_deviance_explained() ---- - -#' Proportion of Null Deviance Explained -#' -#' Poisson deviance for counts, Bernoulli for detections, chosen -#' from whether the observations are all zero or one. -#' -#' @param observed,predicted Numeric vectors. -#' @return A number, or NA when the null deviance is zero. -#' -#' @example # Example usage of the function -#' # metric_deviance_explained(c(0, 1, 2), c(0.2, 0.9, 1.8)) -metric_deviance_explained <- function(observed, predicted) { - binary <- all(observed %in% c(0, 1)) - - deviance <- function(y, mu) { - mu <- pmax(mu, 1e-10) - - if (binary) { - mu <- pmin(mu, 1 - 1e-10) - -2 * sum(y * log(mu) + (1 - y) * log(1 - mu)) - } else { - terms <- ifelse(y > 0, y * log(y / mu), 0) - 2 * sum(terms - (y - mu)) - } - } - - null_deviance <- deviance( - observed, rep(mean(observed), length(observed)) - ) - - if (!is.finite(null_deviance) || null_deviance <= 0) { - return(NA_real_) - } - - 1 - deviance(observed, predicted) / null_deviance -} - -## 4.3 metric_rmse() ---- - -#' Root Mean Squared Error -#' -#' @param observed,predicted Numeric vectors. -#' @return A number. -#' -#' @example # Example usage of the function -#' # metric_rmse(c(0, 1), c(0.1, 0.8)) -metric_rmse <- function(observed, predicted) { - sqrt(mean((observed - predicted)^2)) -} - -## 4.4 metric_spearman() ---- - -#' Rank Correlation of Observed and Predicted -#' -#' Scale-free, so it compares a density model against a count -#' model without either being rescaled. -#' -#' @param observed,predicted Numeric vectors. -#' @return A number between -1 and 1. -#' -#' @example # Example usage of the function -#' # metric_spearman(c(0, 1, 2), c(0.1, 0.5, 0.9)) -metric_spearman <- function(observed, predicted) { - if (stats::sd(observed) == 0 || stats::sd(predicted) == 0) { - return(NA_real_) - } - - stats::cor(observed, predicted, method = "spearman") -} - -## 4.5 metric_calibration_slope() ---- - -#' Calibration Slope -#' -#' The slope of observed on predicted. One is perfect -#' calibration; below one means the predictions are too extreme, -#' which is the usual signature of overfitting and the thing a -#' regularized fit is trying to fix. -#' -#' @param observed,predicted Numeric vectors. -#' @return A number. -#' -#' @example # Example usage of the function -#' # metric_calibration_slope(c(0, 1, 1), c(0.2, 0.6, 0.8)) -metric_calibration_slope <- function(observed, predicted) { - if (stats::sd(predicted) == 0) { - return(NA_real_) - } - - unname(stats::coef(stats::lm(observed ~ predicted))[2]) -} - -## 4.6 metric_prevalence() ---- - -#' Proportion of Survey Units with a Detection -#' -#' Carried alongside the scores because most of them are only -#' interpretable against it: an AUC of 0.9 means something -#' different at 2 per cent prevalence than at 40. -#' -#' @param observed,predicted Numeric vectors. -#' @return A number between 0 and 1. -#' -#' @example # Example usage of the function -#' # metric_prevalence(c(0, 0, 1), c(0, 0, 0)) -metric_prevalence <- function(observed, predicted) { - mean(observed > 0) -} - -## 4.7 metric_n() ---- - -#' Number of Survey Units Scored -#' -#' @param observed,predicted Numeric vectors. -#' @return An integer. -#' -#' @example # Example usage of the function -#' # metric_n(c(0, 1), c(0.2, 0.7)) -metric_n <- function(observed, predicted) { - length(observed) -} - # End of script ---- diff --git a/1_code/harness/experiment.R b/1_code/harness/experiment.R new file mode 100644 index 0000000..6796563 --- /dev/null +++ b/1_code/harness/experiment.R @@ -0,0 +1,447 @@ +# --- +# title: Configure and Run an Experiment +# author: Brendan Casey +# created: 2026-10-03 +# inputs: +# 0_data/test_dataset/ +# outputs: +# in 2_pipeline//: the result stores and run_log.csv +# in 3_output//: tables/, run_record.md, and whatever the +# experiment's own steps write +# notes: +# - An experiment is a configuration plus a few steps. This +# holds the part every experiment shares, so each run.R is a +# short list of decisions: +# - experiment_config() states and checks the decisions - +# which runs, species, draws, seed, candidate models and +# workers - before anything is fitted. Every check that used +# to sit in run.R lives here. +# - run_experiment() fits (optionally), collects the stores +# into summary tables, runs the experiment's own steps in +# order, and writes the run record. +# - Everything the steps need travels in the config and the +# results passed to them; nothing is read from the global +# environment, so a step can be run on its own. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +library(data.table) # run log writing (version: 1.16.4) + +# 2. experiment_config() ---- + +#' State and Check an Experiment's Configuration +#' +#' @param id Character. The experiment identifier, e.g. +#' "exp_001_covariate_scale". Names its 2_pipeline/ and +#' 3_output/ folders. +#' @param taxa Character vector of runs, from +#' names(standard_specs()), or NULL for all of them. +#' @param species A focal-species set name (see +#' focal_species_sets()), a species vector named by taxon, or +#' NULL for every species. +#' @param n_bootstraps Integer. Draws per species. 100 is v2's. +#' @param seed Integer or NULL. The base seed; NULL leaves the +#' draws unseeded, as v2 did. +#' @param stage_models Named list of replacement candidate sets, +#' or NULL for each spec's v2 sets; see apply_stage_models(). +#' @param specs Named list of specs, or NULL for +#' standard_specs(plant_bootstrap). An experiment that changes +#' a spec builds its own and passes it here. +#' @param plant_bootstrap Character. Passed to standard_specs(). +#' @param workers Integer. Species fitted at once. +#' @param unit_predictions Character. "none", "oob" or "all". +#' @param v2_bootstraps Integer. v2's draw count, which a run must +#' reach to be gated. +#' @param project_root Character. The repository root. +#' @param data_dir,pipeline_dir,out_dir Character, or NULL for +#' 0_data/test_dataset, 2_pipeline/ and 3_output/. +#' @return A list of class `experiment_config`. +#' +#' @example # Example usage of the function +#' # config <- experiment_config("exp_001_test", taxa = "lichen", +#' # species = "one_each", +#' # n_bootstraps = 5) +experiment_config <- function( + id, + taxa = NULL, + species = NULL, + n_bootstraps = 100L, + seed = 20260909L, + stage_models = NULL, + specs = NULL, + plant_bootstrap = "spatial_block", + workers = 1L, + unit_predictions = "none", + v2_bootstraps = 100L, + project_root = getOption("sdm.project_root", "."), + data_dir = NULL, + pipeline_dir = NULL, + out_dir = NULL +) { + # Step 1: The runs + specs <- specs %||% standard_specs(plant_bootstrap) + taxa <- taxa %||% names(specs) + unknown <- setdiff(taxa, names(specs)) + + if (length(unknown) > 0) { + stop( + "Unknown run(s): ", paste(unknown, collapse = ", "), + ". Available: ", paste(names(specs), collapse = ", "), + call. = FALSE + ) + } + + specs <- specs[taxa] + + # Step 2: The draw count, checked now rather than hours in + if (!is.numeric(n_bootstraps) || length(n_bootstraps) != 1L || + is.na(n_bootstraps) || n_bootstraps < 1 || + n_bootstraps != round(n_bootstraps)) { + stop( + "n_bootstraps must be a single whole number of 1 or more.", + call. = FALSE + ) + } + + n_bootstraps <- as.integer(n_bootstraps) + data_dir <- data_dir %||% file.path( + project_root, "0_data", "test_dataset" + ) + + # Stored draws have a hard ceiling; drawn ones do not + for (key in names(specs)) { + spec <- specs[[key]] + + if (!identical(spec$resample$scheme, "precomputed") || + isTRUE(spec$resample$per_species)) { + next + } + + location <- manifest_entry(data_dir, spec$taxon)$bootstrap_ids + stored <- length(names(fread( + file.path(data_dir, location), nrows = 0 + ))) + + if (n_bootstraps > stored) { + stop( + "n_bootstraps is ", n_bootstraps, " but only ", stored, + " ", spec$taxon, " draws are stored. Lower it, or drop `", + key, "`.", + call. = FALSE + ) + } + } + + if (n_bootstraps < v2_bootstraps) { + message( + "Note: running ", n_bootstraps, " of ", v2_bootstraps, + " v2 draws. This is a trial; its parity numbers are not a ", + "parity read." + ) + } + + # Step 3: The species. A taxon the set does not name runs every + # species, because an absent taxon means "no restriction". Said + # out loud, because it makes a partial set the longest run. + focal <- get_focal_species(species) + + if (!is.null(focal)) { + slugs <- vapply(specs, `[[`, character(1), "taxon") + unnamed <- names(slugs)[!slugs %in% names(focal)] + + if (length(unnamed) > 0) { + message( + "Note: ", paste(unnamed, collapse = ", "), " are not named ", + "in the species set, so every species will be run for ", + "them. Narrow `taxa` to avoid it." + ) + } + } + + structure( + list( + id = id, + taxa = taxa, + specs = specs, + # The set's name, for the record; "inline" for a vector + species_set = if (is.character(species) && + length(species) == 1L && + is.null(names(species))) { + species + } else { + "inline" + }, + focal_species = focal, + n_bootstraps = n_bootstraps, + v2_bootstraps = as.integer(v2_bootstraps), + seed = seed, + stage_models = stage_models, + plant_bootstrap = plant_bootstrap, + workers = as.integer(workers), + unit_predictions = unit_predictions, + project_root = project_root, + data_dir = data_dir, + pipeline_dir = pipeline_dir %||% + file.path(project_root, "2_pipeline", id), + out_dir = out_dir %||% file.path(project_root, "3_output", id) + ), + class = "experiment_config" + ) +} + +## 2.1 print.experiment_config() ---- + +#' Print an Experiment's Configuration +#' +#' @param x An experiment_config(). +#' @param ... Unused. +#' @return `x`, invisibly. +#' +#' @example # Example usage of the function +#' # print(config) +print.experiment_config <- function(x, ...) { + cat("Experiment ", x$id, "\n", sep = "") + cat(" runs: ", paste(x$taxa, collapse = ", "), "\n", sep = "") + cat(" species: ", if (is.null(x$focal_species)) { + "every species" + } else { + paste0(length(x$focal_species), " focal (", x$species_set, ")") + }, "\n", sep = "") + cat(" draws: ", x$n_bootstraps, " (v2: ", x$v2_bootstraps, + ")\n", sep = "") + cat(" seed: ", x$seed %||% "unseeded", "\n", sep = "") + cat(" models: ", if (is.null(x$stage_models)) { + "each spec's v2 candidate sets" + } else { + paste(names(x$stage_models), collapse = ", ") + }, "\n", sep = "") + cat(" workers: ", x$workers, "\n", sep = "") + cat(" writes: ", x$pipeline_dir, "\n ", x$out_dir, + "\n", sep = "") + + invisible(x) +} + +# 3. run_experiment() ---- + +#' Fit, Summarize, Run the Experiment's Steps, and Record +#' +#' @param config An experiment_config(). +#' @param fit Logical. FALSE skips fitting and re-summarizes the +#' stores already in pipeline_dir. +#' @param steps Named list of functions, run in order after the +#' summary tables are written. Each takes `config` and +#' `results` and returns `results`, which it may add to. +#' @param translate Named list of coefficient translations by +#' taxon, passed to collect_results(). +#' @param record Logical. Write run_record.md. +#' @return The results list, invisibly: the summary tables, the +#' run log, and whatever the steps added. +#' +#' @example # Example usage of the function +#' # results <- run_experiment(config, +#' # steps = list(compare = compare_to_baseline)) +run_experiment <- function( + config, + fit = TRUE, + steps = list(), + translate = list(), + record = TRUE +) { + started <- Sys.time() + print(config) + + # Step 1: Fit + run_log <- NULL + + if (fit) { + run_log <- run_specs( + specs = config$specs, + data_dir = config$data_dir, + pipeline_dir = config$pipeline_dir, + species = config$focal_species, + iterations = seq_len(config$n_bootstraps), + stage_models = config$stage_models, + boot_seed = config$seed, + workers = config$workers, + unit_predictions = config$unit_predictions + ) + + fwrite(run_log, file.path(config$pipeline_dir, "run_log.csv"), + na = "") + cat("\nRun log:\n") + print(table(run_log$taxon, run_log$status)) + } + + # Step 2: Summarize the stores + results <- collect_results( + config$pipeline_dir, config$data_dir, translate = translate + ) + results$run_log <- run_log + write_summaries(results, config$out_dir) + + # Step 3: The experiment's own steps, in order + for (name in names(steps)) { + cat("\n== ", name, " ==\n", sep = "") + results <- steps[[name]](config, results) + } + + # Step 4: The committed record of what ran + if (record) { + record_file <- run_record( + pipeline_dir = config$pipeline_dir, + out_file = file.path(config$out_dir, "run_record.md"), + exp_id = config$id, + config = record_config(config, run_log), + collected = results + ) + cat("Run record: ", record_file, "\n", sep = "") + } + + cat( + "\n", config$id, " complete in ", + format(round(Sys.time() - started, 1)), "\n", + "Intermediates: ", config$pipeline_dir, "\n", + "Deliverables: ", config$out_dir, "\n", + sep = "" + ) + + invisible(results) +} + +# 4. record_config() ---- + +#' The Settings a Run Record States +#' +#' Settings rather than paths: an absolute directory differs +#' between machines and would diff on every line without meaning +#' anything. +#' +#' @param config An experiment_config(). +#' @param run_log The run log, or NULL when nothing was fitted. +#' @return A named list. +#' +#' @example # Example usage of the function +#' # record_config(config, run_log) +record_config <- function(config, run_log = NULL) { + stage_values <- function(field) { + sort(unique(unlist(lapply(config$specs, function(spec) { + vapply(spec$stages, function(stage) { + value <- stage[[field]] + if (is.function(value)) "custom" else value + }, character(1)) + })))) + } + + out <- list( + taxa = sort(config$taxa), + focal_species = if (is.null(config$focal_species)) { + "all" + } else { + sort(paste0(names(config$focal_species), "=", + config$focal_species)) + }, + species_n = if (is.null(config$focal_species)) { + NA_integer_ + } else { + length(config$focal_species) + }, + n_bootstraps = config$n_bootstraps, + v2_bootstraps = config$v2_bootstraps, + boot_seed = config$seed %||% "unseeded", + plant_bootstrap = config$plant_bootstrap, + stage_models = if (is.null(config$stage_models)) { + "spec defaults (v2 candidate sets)" + } else { + sort(names(config$stage_models)) + }, + engines = stage_values("engine"), + selection = stage_values("selection"), + data_dir = basename(config$data_dir) + ) + + # Failures belong in the record. Without them, a run that lost + # half its jobs and one that lost none look alike wherever the + # survivors agree. + if (!is.null(run_log)) { + ok <- sum(run_log$status == "ok", na.rm = TRUE) + out$jobs_total <- nrow(run_log) + out$jobs_ok <- ok + out$jobs_not_ok <- nrow(run_log) - ok + } + + out +} + +# 5. compare_to_baseline() ---- + +#' An Experiment Step: Compare Against exp_000 +#' +#' Ready to pass in run_experiment()'s `steps`. Compares this +#' experiment's summaries with the v2 baseline's; see +#' compare_experiments(). +#' +#' @param config An experiment_config(). +#' @param results The results so far. +#' @param baseline Character. The baseline experiment's id. +#' @return `results`, with `comparison` added. +#' +#' @example # Example usage of the function +#' # run_experiment(config, steps = list( +#' # compare = compare_to_baseline)) +compare_to_baseline <- function( + config, results, baseline = "exp_000_parity_v2" +) { + comparison <- compare_experiments( + candidate_dir = config$out_dir, + baseline_dir = file.path( + config$project_root, "3_output", baseline + ) + ) + + cat("\nAgainst ", baseline, ", per taxon, region and metric:\n", + sep = "") + print(comparison$summary, row.names = FALSE) + + results$comparison <- comparison + results +} + +# 6. script_step() ---- + +#' Turn an Experiment Script into a Step +#' +#' An experiment's own scripts - a comparison, a figure, a +#' report - are written top to bottom and read `config` and +#' `results`. This runs one in an environment of its own holding +#' only those two, so it cannot depend on, or leave behind, any +#' other variable, and hands back the `results` it updated. +#' +#' @param path Character. The script. +#' @return A function(config, results) for run_experiment()'s +#' `steps`. +#' +#' @example # Example usage of the function +#' # steps <- list(report = script_step("03_build_report.R")) +script_step <- function(path) { + force(path) + + if (!file.exists(path)) { + stop("Step script not found: + ", path, call. = FALSE) + } + + function(config, results) { + env <- new.env(parent = globalenv()) + env$config <- config + env$results <- results + + sys.source(path, envir = env, keep.source = FALSE) + + env$results + } +} + +# End of script ---- diff --git a/1_code/harness/harness.R b/1_code/harness/harness.R index 2ea4e26..2b4ca72 100644 --- a/1_code/harness/harness.R +++ b/1_code/harness/harness.R @@ -1,19 +1,29 @@ # --- -# title: Load the Harness +# title: Load the Framework # author: Brendan Casey # created: 2026-09-09 # inputs: -# the other files in 1_code/harness/ -# outputs: none; defines the harness in the calling environment +# - the files in 1_code/harness/ +# - the files in 1_code/methods/ +# - the files in 1_code/modules/ +# outputs: none; defines the framework in the calling environment # notes: -# - One entry point, so an experiment sources this rather than -# nine files in the right order. -# - The order matters. covariate_sets.R calls covariate_key() -# from data_load.R, data_load.R calls the derivation helpers -# from covariate_sets.R, and run_model.R calls most of the -# rest. They are sourced into one environment, so the mutual -# reference between the first two resolves once all are -# loaded; only run_model.R has to come last. +# - One entry point. An experiment sources this file and calls +# load_framework(), rather than sourcing thirty files in the +# right order. +# - Four layers, loaded in this order: +# 1. harness/ - the taxon-agnostic machinery, including the +# method registry the next layer fills. +# 2. methods/ - engines, selection rules, resampling schemes +# and metrics, one file each. Every file registers itself, +# so adding a method is adding a file; nothing here lists +# them. +# 3. modules/ - one folder per taxon, holding its spec, after +# _shared/, which the plant-group taxa build on. +# 4. experiments/_shared/ - settings every experiment can +# use, such as the named focal-species sets. +# - Within a methods folder, files whose names start with an +# underscore are shared helpers and are loaded first. # --- # 1. Setup ---- @@ -35,7 +45,13 @@ load_harness <- function( harness_dir = "1_code/harness", envir = parent.frame() ) { + # The registry and cache come first: method files register into + # the one, and loaders read through the other. run_model.R is + # last because it calls most of the rest. files <- c( + "registry.R", + "cache.R", + "spec.R", "data_load.R", "covariate_sets.R", "species.R", @@ -48,15 +64,126 @@ load_harness <- function( "result.R", "run_record.R", "run_model.R", - file.path("utils", "step_runner.R") + "summarise.R", + "compare.R", + "experiment.R" ) - paths <- file.path(harness_dir, files) + source_all(file.path(harness_dir, files), envir) +} + +# 3. load_methods() ---- + +#' Source and Register Every Method +#' +#' @param methods_dir Character. Path to 1_code/methods. +#' @param envir Environment to source into. +#' @return Character vector of the files sourced, invisibly. +#' +#' @example # Example usage of the function +#' # load_methods("1_code/methods") +load_methods <- function( + methods_dir = "1_code/methods", + envir = parent.frame() +) { + kinds <- c("engines", "selection", "resampling", "metrics") + + paths <- unlist(lapply(kinds, function(kind) { + files <- sort(list.files( + file.path(methods_dir, kind), pattern = "\\.R$", + full.names = TRUE + )) + shared <- startsWith(basename(files), "_") + + c(files[shared], files[!shared]) + })) + + source_all(paths, envir) +} + +# 4. load_modules() ---- + +#' Source Every Taxon Module +#' +#' @param modules_dir Character. Path to 1_code/modules. +#' @param envir Environment to source into. +#' @return Character vector of the files sourced, invisibly. +#' +#' @example # Example usage of the function +#' # load_modules("1_code/modules") +load_modules <- function( + modules_dir = "1_code/modules", + envir = parent.frame() +) { + folders <- sort(list.dirs( + modules_dir, recursive = FALSE, full.names = TRUE + )) + shared <- startsWith(basename(folders), "_") + + paths <- unlist(lapply( + c(folders[shared], folders[!shared]), + function(folder) { + sort(list.files(folder, pattern = "\\.R$", full.names = TRUE)) + } + )) + + source_all(paths, envir) +} + +# 5. load_framework() ---- + +#' Load the Harness, Methods, Taxon Modules and Shared Settings +#' +#' What an experiment calls first. Everything is sourced into one +#' environment, the caller's by default. +#' +#' @param project_root Character. The repository root. +#' @param envir Environment to source into. +#' @return The project root, invisibly. +#' +#' @example # Example usage of the function +#' # source("1_code/harness/harness.R") +#' # load_framework() +#' # list_methods() +load_framework <- function( + project_root = ".", + envir = parent.frame() +) { + project_root <- normalizePath(project_root, winslash = "/") + code_dir <- file.path(project_root, "1_code") + + load_harness(file.path(code_dir, "harness"), envir) + load_methods(file.path(code_dir, "methods"), envir) + load_modules(file.path(code_dir, "modules"), envir) + + shared <- sort(list.files( + file.path(code_dir, "experiments", "_shared"), + pattern = "\\.R$", full.names = TRUE + )) + source_all(shared, envir) + + # Parallel workers load the framework from here themselves + options(sdm.project_root = project_root) + + invisible(project_root) +} + +# 6. source_all() ---- + +#' Source Files in Order, Failing Clearly on a Missing One +#' +#' @param paths Character vector of files. +#' @param envir Environment to source into. +#' @return The paths, invisibly. +#' +#' @example # Example usage of the function +#' # source_all(c("a.R", "b.R"), globalenv()) +source_all <- function(paths, envir) { absent <- paths[!file.exists(paths)] if (length(absent) > 0) { stop( - "Harness files not found:\n ", + "Framework files not found:\n ", paste(absent, collapse = "\n "), call. = FALSE ) diff --git a/1_code/harness/model_sets.R b/1_code/harness/model_sets.R index 3f76ee4..23c63bf 100644 --- a/1_code/harness/model_sets.R +++ b/1_code/harness/model_sets.R @@ -47,10 +47,8 @@ model_sets <- function() { # in eight combinations. # # Mammals fit it in full: the camera climate the harmonizer - # joins carries CMD and TD. Birds in v2 also fit each of the - # eight with linear and with quadratic spatial terms, 25 - # candidates in all, which this set does not include; see the - # bird spec's v2_coverage. + # joins carries CMD and TD. Birds fit it with spatial terms + # added, 25 candidates in all: climate_bird_v2 below. # # The null is a candidate, not just the base: v2 averages over # `climate.list` including the intercept-only model it starts @@ -85,17 +83,6 @@ model_sets <- function() { ) ) - # The subset of the above without CMD, five of the nine models. - # No spec uses it since the camera climate supplied CMD; kept - # for an experiment on a dataset that lacks CMD. - climate_mammal_available <- c( - ". ~ .", - ". ~ . + FFP", - ". ~ . + MAP", - ". ~ . + TD", - ". ~ . + TD + FFP" - ) - # The plant climate set, spliced from the v2 source. Wider # than the bird and mammal one, and includes interaction and # squared terms the other two do not use. @@ -116,18 +103,6 @@ model_sets <- function() { ". ~ . + TD + FFP + MAT" ) - # Applied on top of a chosen climate model, not instead of it. - bioclim_plant_v2 <- c( - ".~.+ bio9 + bio15" - ) - - # Spatial trend terms, likewise applied on top. - space_plant_v2 <- c( - ".~.+ Easting + Northing", - ".~.+ Easting + Northing + EastingNorthing", - ".~.+ Easting + Northing + Easting2 + Northing2 + EastingNorthing" - ) - # The plant climate candidate set as v2 actually assembles it. # v2 does not fit these 14 alone: it appends a bioclim version # of every one, then spatial versions of ten of them, and @@ -288,7 +263,7 @@ model_sets <- function() { # # This is the presence half of a hurdle model; v2 fits a Gamma # abundance-given-presence part alongside it and multiplies - # the two. Only the presence half is reproduced here. + # the two. modules/mammals/hurdle.R fits both. habitat_mammal_north_pa_v2 <- c( ". ~ . + Decid + Mixedwood + Pine + Spruce + TreedBog + TreedFen + TreedSwamp + GrassHerb + Shrub + Marsh + ShrubbySwamp + ShrubbyBogFen + CCDecidR + CCDecid1 + CCDecid2 + CCMixedwoodR + CCMixedwood1 + CCMixedwood2 + CCPineR + CCPine1 + CCSpruceR + CCSpruce1 + CCSpruce2 + EnSoftLin + EnSeismic + TrSoftLin + TameP + RoughP + Well + RurUrbInd + seas_days + Climate", ". ~ . + Decid + Mixedwood + Pine + Spruce + TreedBog + TreedFen + TreedSwamp + GrassHerb + Shrub + Marsh + ShrubbySwamp + ShrubbyBogFen + CCDecidMixed + CCPine + CCSpruce + EnSoftLin + EnSeismic + TrSoftLin + TameP + RoughP + Well + RurUrbInd + seas_days + Climate", @@ -353,7 +328,6 @@ model_sets <- function() { climate_bird_mammal_v2 = climate_bird_mammal_v2, climate_bird_v2 = climate_bird_v2, climate_plant_v2_full = climate_plant_v2_full, - climate_mammal_available = climate_mammal_available, climate_plant_v2 = climate_plant_v2, habitat_mammal_north_pa_v2 = habitat_mammal_north_pa_v2, intercept_mammal_north_pa_v2 = @@ -364,9 +338,7 @@ model_sets <- function() { landcover_bird_north_v2 = landcover_bird_north_v2, landcover_bird_south_v2 = landcover_bird_south_v2, habitat_veg_plant_v2 = habitat_veg_plant_v2, - habitat_soil_plant_v2 = habitat_soil_plant_v2, - bioclim_plant_v2 = bioclim_plant_v2, - space_plant_v2 = space_plant_v2 + habitat_soil_plant_v2 = habitat_soil_plant_v2 ) } diff --git a/1_code/harness/predict_grid.R b/1_code/harness/predict_grid.R index 3356612..a52f8c3 100644 --- a/1_code/harness/predict_grid.R +++ b/1_code/harness/predict_grid.R @@ -14,14 +14,18 @@ # the quantity v2 reports and the Biodiversity Browser shows. # - This is the comparison currency. Coefficients cannot compare # a GLM against a boosted tree, because a tree has none, but -# every engine can predict onto these rows. +# every engine can predict onto these rows. Every taxon has a +# grid; the bird ones are rebuilt by _setup/09 from v2's +# coefficient translation matrix. +# - The grid prediction is the stage's final model - the +# averaged or combined one where the rule combines candidates. +# v2's later coefficient adjustments (the plant stand-age +# splines, say) are in the coefficients, not the grid. # - Terms the grid does not carry are set to zero, not dropped. # A grid row describes a pure stand, so a human footprint term -# is genuinely absent from it rather than unknown, and zero is -# what "none of this here" means. Terms that carry a stage -# forward are the exception and are set to their mean, because -# a habitat effect is read at average climate, not at zero -# climate. +# is genuinely absent from it rather than unknown. Terms the +# stage holds fixed - Climate, Protocol, sampling effort - are +# set to the stage's constants. # - A grid whose VegType column is missing is an error rather # than a silent positional fallback, because the row order of # a prediction matrix is not something to guess at. @@ -77,69 +81,70 @@ load_prediction_grid <- function(data_dir, name) { # 3. predict_grid() ---- -#' Predict a Fitted Model onto a Grid +#' Predict a Selection's Final Model onto a Grid #' -#' Builds a prediction frame carrying every term the model needs: -#' the grid's own columns where it has them, zero where it does -#' not, and the mean where a term carries a previous stage. +#' Builds a prediction frame carrying every column the model +#' reads: the grid's own where it has them, the stage's constants +#' (v2 holds Climate at zero, and Protocol at the new protocol), +#' and zero for anything else. Predicts with the selection's own +#' predictor, so an averaged or combined model is projected as a +#' whole, whatever the engine. #' -#' @param selected A selection result, from selection_run(). -#' @param engine An engine definition. +#' @param selected A selection result, carrying `predict`. #' @param grid A prediction grid, from load_prediction_grid(). -#' @param carried Named list of values for terms that carry a -#' previous stage forward, or NULL to use zero. +#' @param constants Named list of values for columns held fixed +#' across the grid. #' @param type Character. "response" or "link". #' @return A named numeric vector, one value per grid row, or #' NULL when the model cannot be predicted. #' #' @example # Example usage of the function -#' # predict_grid(selected, engine, grid, -#' # carried = list(Climate = 0.4)) +#' # predict_grid(selected, grid, constants = list(Climate = 0)) predict_grid <- function( selected, - engine, grid, - carried = NULL, + constants = list(), type = "response" ) { - if (is.null(grid) || is.null(selected$fit)) { + if (is.null(grid) || !is.function(selected$predict)) { return(NULL) } - terms <- model_terms(selected) + newdata <- grid - if (length(terms) == 0) { - return(NULL) + # Step 1: Hold the stage's constants + for (one in names(constants)) { + newdata[[one]] <- constants[[one]] } - # Step 1: Start from the grid, so every term it carries takes - # the composition of a pure stand of that habitat type - newdata <- grid - - # Step 2: Fill in the terms the grid has no column for. Zero is - # what a grid row means by omission - none of that here - and a - # carried stage is the exception, held at its supplied value. - for (one in setdiff(terms, names(newdata))) { - newdata[[one]] <- if (!is.null(carried[[one]])) { - carried[[one]] - } else { - 0 - } + # Step 2: Every column any candidate formula reads, at zero + # where the grid and the constants have none. A grid row is a + # pure stand, so a term it omits is absent rather than unknown. + formulas <- selected$formulas %||% list(selected$formula) + needed <- unique(unlist(lapply( + Filter(function(f) !is.null(f) && !identical(f, NA_character_), + formulas), + formula_variables + ))) + + for (one in setdiff(needed, names(newdata))) { + newdata[[one]] <- 0 } # Step 3: An offset is a property of a survey, not of a habitat # type, so a grid prediction is made without one - if ("offset" %in% names(newdata) == FALSE) { - newdata$offset <- 0 - } + newdata$offset <- 0 - predicted <- engine$predict(selected$fit, newdata, type) + predicted <- tryCatch( + selected$predict(newdata, type), + error = function(e) NULL + ) - if (is.null(predicted)) { + if (is.null(predicted) || length(predicted) != nrow(grid)) { return(NULL) } - stats::setNames(predicted, rownames(grid)) + stats::setNames(as.numeric(predicted), rownames(grid)) } # 4. predict_from_coefficients() ---- @@ -227,35 +232,4 @@ predict_from_coefficients <- function( linear } -# 5. model_terms() ---- - -#' Name the Terms a Selected Model Uses -#' -#' Taken from the coefficients where the engine has them, and -#' from the formula otherwise, so an engine without coefficients -#' still reaches a grid prediction. -#' -#' @param selected A selection result. -#' @return A character vector of term names, without the -#' intercept. -#' -#' @example # Example usage of the function -#' # model_terms(selected) -model_terms <- function(selected) { - if (!is.null(selected$coefficients)) { - terms <- selected$coefficients$term - - return(setdiff(terms, c("(Intercept)", "Intercept"))) - } - - if (!is.na(selected$formula)) { - return(setdiff( - all.vars(stats::as.formula(selected$formula)), - c("response", "offset", "weight") - )) - } - - character(0) -} - # End of script ---- diff --git a/1_code/harness/registry.R b/1_code/harness/registry.R new file mode 100644 index 0000000..b584b81 --- /dev/null +++ b/1_code/harness/registry.R @@ -0,0 +1,415 @@ +# --- +# title: Method Registry +# author: Brendan Casey +# created: 2026-10-03 +# inputs: none +# outputs: none; holds the registered methods in memory +# notes: +# - Every method a spec can name - a fitting engine, a selection +# rule, a resampling scheme or a metric - is registered here +# under a name. A spec names it; the harness looks it up. Adding +# a method is therefore one new file in 1_code/methods/ that +# calls a register_*() function, and no harness file changes. +# - The registry is one environment, created when this file is +# sourced and filled as 1_code/methods/ is sourced after it. +# Re-sourcing a method file replaces its entry, so a method can +# be edited and reloaded during development. +# - Each entry carries a one-line description, which +# list_methods() prints, so a user can see what is available +# without reading code. +# - Requirements are explicit. A selection rule names the engine +# capabilities it needs, and validate_spec() (spec.R) checks +# them before any data is read, so an engine that cannot +# supply standard errors fails with a sentence rather than +# silently returning no predictions hours into a run. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +# Base R only. + +## 1.2 The registry ---- +# One environment per kind of method. Created only if absent, so +# re-sourcing this file does not empty a registry that the method +# files have already filled. +if (!exists(".sdm_registry", inherits = FALSE)) { + .sdm_registry <- new.env(parent = emptyenv()) +} + +for (.kind in c("engine", "selection", "resampler", "metric")) { + if (!exists(.kind, envir = .sdm_registry, inherits = FALSE)) { + assign(.kind, list(), envir = .sdm_registry) + } +} +rm(.kind) + +# 2. Registering ---- + +## 2.1 method_kinds() ---- + +#' The Kinds of Method the Registry Holds +#' +#' @return A named character vector: kind to a readable label. +#' +#' @example # Example usage of the function +#' # method_kinds() +method_kinds <- function() { + c( + engine = "fitting engine", + selection = "selection rule", + resampler = "resampling scheme", + metric = "metric" + ) +} + +## 2.2 engine_capabilities() ---- + +#' The Capabilities an Engine Can Declare +#' +#' - `coefficients`: the engine returns a table of term, estimate +#' and standard error. Needed by rules that average or read +#' coefficients, and by a stage carried forward through them. +#' - `ic`: the engine scores a fit with AIC, AICc or BIC. Needed +#' by every rule that ranks or weights candidates. +#' - `se`: the engine's predict() returns standard errors. Needed +#' by inverse-variance averaging. +#' - `converged`: the engine reports whether a fit converged. +#' Optional; a fit is assumed converged when it cannot say. +#' +#' @return A character vector. +#' +#' @example # Example usage of the function +#' # engine_capabilities() +engine_capabilities <- function() { + c("coefficients", "ic", "se", "converged") +} + +## 2.3 register_method() ---- + +#' Add One Method to the Registry +#' +#' The general form behind the four register_*() functions. +#' +#' @param kind Character. One of names(method_kinds()). +#' @param name Character. The name a spec uses. +#' @param value The method: a function, or for an engine a list. +#' @param description Character. One line on what it does. +#' @param requires Character vector of engine capabilities the +#' method needs. Used by selection rules. +#' @return The name, invisibly. +#' +#' @example # Example usage of the function +#' # register_method("metric", "auc", metric_auc, "Area under ROC") +register_method <- function( + kind, + name, + value, + description, + requires = character(0) +) { + if (!kind %in% names(method_kinds())) { + stop( + "Unknown method kind `", kind, "`. Kinds: ", + paste(names(method_kinds()), collapse = ", "), + call. = FALSE + ) + } + + if (!is.character(name) || length(name) != 1L || !nzchar(name)) { + stop("A method name must be one non-empty string.", call. = FALSE) + } + + if (!is.character(description) || length(description) != 1L) { + stop( + "Method `", name, "` needs a one-line description.", + call. = FALSE + ) + } + + unknown <- setdiff(requires, engine_capabilities()) + + if (length(unknown) > 0) { + stop( + "Method `", name, "` requires unknown capabilities: ", + paste(unknown, collapse = ", "), ". Known: ", + paste(engine_capabilities(), collapse = ", "), + call. = FALSE + ) + } + + entries <- get(kind, envir = .sdm_registry) + entries[[name]] <- list( + name = name, + value = value, + description = description, + requires = requires + ) + assign(kind, entries, envir = .sdm_registry) + + invisible(name) +} + +## 2.4 register_engine() ---- + +#' Register a Fitting Engine +#' +#' An engine is a list with `name`, `description`, `capabilities` +#' and the functions `fit`, `predict`, and - where its +#' capabilities include them - `coef` and `ic`. See +#' 1_code/methods/README.md for the contract, and check_engine() +#' to test one. +#' +#' @param engine A list, as described above. +#' @return The engine name, invisibly. +#' +#' @example # Example usage of the function +#' # register_engine(engine_glm()) +register_engine <- function(engine) { + required <- c("name", "description", "capabilities", "fit", + "predict") + absent <- setdiff(required, names(engine)) + + if (length(absent) > 0) { + stop( + "An engine needs ", paste(absent, collapse = ", "), ".", + call. = FALSE + ) + } + + if ("coefficients" %in% engine$capabilities && + !is.function(engine$coef)) { + stop( + "Engine `", engine$name, "` declares `coefficients` but has ", + "no coef() function.", + call. = FALSE + ) + } + + if ("ic" %in% engine$capabilities && !is.function(engine$ic)) { + stop( + "Engine `", engine$name, "` declares `ic` but has no ic() ", + "function.", + call. = FALSE + ) + } + + register_method( + "engine", engine$name, engine, engine$description + ) +} + +## 2.5 register_selection() ---- + +#' Register a Selection Rule +#' +#' A rule is a function taking at least `models`, `base`, `data`, +#' `engine`, `family`, `weights`, `offset`, `ic` and `control`, +#' and returning selection_result(). Any further argument it +#' declares is filled from the stage field of the same name. +#' +#' @param name Character. The name a spec uses. +#' @param fn The rule function. +#' @param description Character. One line. +#' @param requires Character vector of engine capabilities. +#' @return The name, invisibly. +#' +#' @example # Example usage of the function +#' # register_selection("aic_best", select_aic_best, +#' # "Lowest-scoring candidate", "ic") +register_selection <- function(name, fn, description, + requires = character(0)) { + core <- c("models", "base", "data", "engine", "family") + absent <- setdiff(core, names(formals(fn))) + + if (length(absent) > 0) { + stop( + "Selection rule `", name, "` must take ", + paste(absent, collapse = ", "), ".", + call. = FALSE + ) + } + + register_method("selection", name, fn, description, requires) +} + +## 2.6 register_resampler() ---- + +#' Register a Resampling Scheme +#' +#' A resampler is a function of `frame`, `iterations`, `seed` and +#' `context`, plus any settings it declares, which come from the +#' spec's `resample` list. It returns a list of character vectors +#' of survey unit ids, one per iteration: the units that draw is +#' fitted on. Units left out are scored as out-of-bag. +#' +#' @param name Character. The name a spec's `resample$scheme` +#' uses. +#' @param fn The resampler function. +#' @param description Character. One line. +#' @return The name, invisibly. +#' +#' @example # Example usage of the function +#' # register_resampler("spatial_block", resampler_spatial_block, +#' # "Bootstrap within spatial blocks") +register_resampler <- function(name, fn, description) { + core <- c("frame", "iterations", "seed", "context") + absent <- setdiff(core, names(formals(fn))) + + if (length(absent) > 0) { + stop( + "Resampler `", name, "` must take ", + paste(absent, collapse = ", "), ".", + call. = FALSE + ) + } + + register_method("resampler", name, fn, description) +} + +## 2.7 register_metric() ---- + +#' Register a Metric +#' +#' A metric is a function of `observed` and `predicted`, both on +#' the response scale, returning one number. +#' +#' @param name Character. The name metrics are reported under. +#' @param fn The metric function. +#' @param description Character. One line. +#' @return The name, invisibly. +#' +#' @example # Example usage of the function +#' # register_metric("rmse", metric_rmse, "Root mean squared error") +register_metric <- function(name, fn, description) { + if (!all(c("observed", "predicted") %in% names(formals(fn)))) { + stop( + "Metric `", name, "` must take `observed` and `predicted`.", + call. = FALSE + ) + } + + register_method("metric", name, fn, description) +} + +## 2.8 unregister_method() ---- + +#' Remove One Method from the Registry +#' +#' For tests and interactive development; a run never needs it. +#' +#' @param kind Character. One of names(method_kinds()). +#' @param name Character. The registered name. +#' @return The name, invisibly. +#' +#' @example # Example usage of the function +#' # unregister_method("metric", "my_test_metric") +unregister_method <- function(kind, name) { + entries <- get(kind, envir = .sdm_registry) + entries[[name]] <- NULL + assign(kind, entries, envir = .sdm_registry) + + invisible(name) +} + +# 3. Looking up ---- + +## 3.1 get_method() ---- + +#' Look Up One Registered Method +#' +#' @param kind Character. One of names(method_kinds()). +#' @param name Character. The registered name. +#' @param entry Logical. Return the whole entry (value, +#' description, requires) rather than the method itself. +#' @return The method, or its entry. +#' +#' @example # Example usage of the function +#' # get_method("selection", "aic_average") +get_method <- function(kind, name, entry = FALSE) { + entries <- get(kind, envir = .sdm_registry) + + if (!is.character(name) || length(name) != 1L || + !name %in% names(entries)) { + stop( + "Unknown ", method_kinds()[[kind]], " `", + paste(format(name), collapse = " "), "`. Registered: ", + if (length(entries) == 0) { + "none - has 1_code/methods/ been loaded?" + } else { + paste(names(entries), collapse = ", ") + }, + call. = FALSE + ) + } + + if (entry) entries[[name]] else entries[[name]]$value +} + +## 3.2 registered_names() ---- + +#' Names Registered for One Kind of Method +#' +#' @param kind Character. One of names(method_kinds()). +#' @return A character vector. +#' +#' @example # Example usage of the function +#' # registered_names("engine") +registered_names <- function(kind) { + names(get(kind, envir = .sdm_registry)) +} + +## 3.3 list_methods() ---- + +#' Show Every Registered Method +#' +#' What a spec can name, with a line on each. The quickest answer +#' to "which engines are there?". +#' +#' @param kind Character, or NULL for every kind. +#' @return A data frame of kind, name, requires and description, +#' printed and returned invisibly. +#' +#' @example # Example usage of the function +#' # list_methods() +#' # list_methods("engine") +list_methods <- function(kind = NULL) { + kinds <- if (is.null(kind)) names(method_kinds()) else kind + + rows <- lapply(kinds, function(one) { + entries <- get(one, envir = .sdm_registry) + + if (length(entries) == 0) { + return(NULL) + } + + data.frame( + kind = one, + name = names(entries), + requires = vapply( + entries, + function(e) { + capabilities <- if (one == "engine") { + e$value$capabilities + } else { + e$requires + } + paste(capabilities, collapse = ", ") + }, + character(1) + ), + description = vapply( + entries, `[[`, character(1), "description" + ), + stringsAsFactors = FALSE, + row.names = NULL + ) + }) + + table <- do.call(rbind, rows) + print(table, row.names = FALSE, right = FALSE) + + invisible(table) +} + +# End of script ---- diff --git a/1_code/harness/resample.R b/1_code/harness/resample.R index 7340c9f..28c699e 100644 --- a/1_code/harness/resample.R +++ b/1_code/harness/resample.R @@ -1,25 +1,19 @@ # --- -# title: Resampling Schemes +# title: Resampling - Seeds, Blocks and Dispatch # author: Brendan Casey # created: 2026-09-09 -# inputs: -# in 0_data/test_dataset/lookup/: -# - _bootstrap_ids.csv (where one is precomputed) +# inputs: none # outputs: none; returns objects in memory # notes: # - Produces the survey units one model fit sees. Every scheme -# returns the same thing - a character vector of survey unit -# ids, with replacement where the scheme resamples - so the -# fitting loop does not know which scheme it is running. -# - Three schemes. `precomputed` reads ids the source pipeline -# already generated, which is how birds reach parity. -# `spatial_block` reproduces the plant bootstrap: resample -# sites with replacement within coarse latitude and longitude -# blocks, so a draw keeps the geographic spread rather than -# drifting toward whichever region is best surveyed. -# `spatial_cv` holds out whole blocks, which is the scheme a -# spatial autocorrelation experiment needs and which v2 has -# no equivalent of. +# returns the same thing - a list of character vectors of +# survey unit ids, one per draw, with replacement where the +# scheme resamples - so the fitting loop does not know which +# scheme it is running. +# - The schemes themselves live in 1_code/methods/resampling/: +# `precomputed`, `spatial_block` and `spatial_cv`. This file +# holds what they share - seeding and spatial blocks - and +# resample_for_species(), which looks a scheme up by name. # - Iteration 1 of a bootstrap is the complete data by # convention, matching v2, so the first fit of every run is # the full-data fit. @@ -125,7 +119,8 @@ species_seed <- function(base, taxon, species) { #' set.seed() changes the session's random state for everything #' that follows. Restoring it on exit keeps resampling from #' changing any later random call, and makes the result depend -#' only on the seed given here. +#' only on the seed given here - not on the session's generator, +#' which is set explicitly to R's default. #' #' @param seed Integer or NULL. NULL evaluates the code without #' seeding. @@ -143,16 +138,28 @@ with_seed <- function(seed, code) { env <- globalenv() had_state <- exists(".Random.seed", envir = env, inherits = FALSE) old_state <- if (had_state) get(".Random.seed", envir = env) + old_kind <- RNGkind() on.exit({ + # The generator first, because setting it reseeds; then the + # caller's exact state on top + suppressWarnings(do.call(RNGkind, as.list(old_kind))) + if (had_state) { assign(".Random.seed", old_state, envir = env) - } else if (exists(".Random.seed", envir = env, inherits = FALSE)) { + } else if (exists(".Random.seed", envir = env, + inherits = FALSE)) { rm(".Random.seed", envir = env) } }, add = TRUE) - set.seed(seed) + # R's default generator, named rather than assumed, so the draws + # are the same whatever generator the session or a package (a + # parallel backend, say) has switched to + set.seed( + seed, kind = "Mersenne-Twister", normal.kind = "Inversion", + sample.kind = "Rejection" + ) code } @@ -199,319 +206,52 @@ spatial_blocks <- function( labels[match(cells, present)] } -# 4. resample_precomputed() ---- - -#' Read Bootstrap Ids the Source Pipeline Generated -#' -#' Two layouts. Birds store one table for the taxon, -#' `lookup/_bootstrap_ids.csv`, one column per draw. The -#' plant-group taxa store v2's draws per species, because v2 -#' drew them per species: -#' `lookup/v2_bootstrap_ids//.rds`, written by -#' 1_code/_setup/07_harmonize_v2_plant_bootstrap_ids.R. -#' -#' Replaying v2's own draws is what makes parity numerical rather -#' than distributional: the harness then fits the same rows v2 -#' fitted, draw by draw. -#' -#' @param data_dir Character. Path to 0_data/test_dataset. -#' @param taxon Character. Taxon slug. -#' @param iterations Integer vector of bootstrap iterations. -#' @param id_column Character. The column in the covariate frame -#' the stored ids refer to, when they are not survey unit ids. -#' @param frame A data frame carrying `survey_unit_id` and -#' `id_column`, used to translate stored ids into survey unit -#' ids. NULL when the stored ids are already unit ids. -#' @param species Character. The species, for per-species ids. -#' @param per_species Logical. Read the per-species layout. -#' @param unique_ids Logical. Keep each unit once per draw. v2's -#' bird scripts select a draw with `%in%`, so a unit drawn twice -#' is fitted once; the plant scripts index rows, so repeats -#' count. -#' @return A list of character vectors, one per iteration. -#' -#' @example # Example usage of the function -#' # ids <- resample_precomputed(data_dir, "bird", 1:3, -#' # id_column = "surveyid", -#' # frame = md$covariates, -#' # unique_ids = TRUE) -#' # ids <- resample_precomputed(data_dir, "lichen", 1:3, -#' # species = "Physcia.adscendens", -#' # per_species = TRUE) -resample_precomputed <- function( - data_dir, - taxon, - iterations, - id_column = NULL, - frame = NULL, - species = NULL, - per_species = FALSE, - unique_ids = FALSE -) { - # Step 1: Read the stored draws, as a list of id vectors - if (per_species) { - path <- file.path( - data_dir, "lookup", "v2_bootstrap_ids", taxon, - paste0(species, ".rds") - ) - - if (is.null(species) || !file.exists(path)) { - stop( - "No stored v2 bootstrap ids for ", taxon, " ", - species, ":\n ", path, - "\nRun 1_code/_setup/07_harmonize_v2_plant_bootstrap_ids.R", - " for this species, or use the spatial_block scheme.", - call. = FALSE - ) - } - - stored <- readRDS(path) - - # v2 stores a species' draws as a matrix, units by draws - if (is.matrix(stored)) { - stored <- lapply(seq_len(ncol(stored)), function(j) stored[, j]) - } - } else { - path <- file.path( - data_dir, "lookup", paste0(taxon, "_bootstrap_ids.csv") - ) - - if (!file.exists(path)) { - stop( - "No precomputed bootstrap ids for ", taxon, ":\n ", path, - "\nUse a different resampling scheme, or generate them.", - call. = FALSE - ) - } - - stored <- as.list(fread(path)) - } - - if (max(iterations) > length(stored)) { - stop( - taxon, " has ", length(stored), " precomputed bootstrap ", - "iterations; ", max(iterations), " were requested.", - call. = FALSE - ) - } - lapply(iterations, function(i) { - ids <- stored[[i]] - ids <- ids[!is.na(ids)] - - if (unique_ids) { - ids <- unique(ids) - } - - # Step 2: Translate to survey unit ids when the stored ids - # are a different key, which is how the bird ids are stored - if (is.null(id_column)) { - return(as.character(ids)) - } +# 4. resample_for_species() ---- - if (is.null(frame) || !id_column %in% names(frame)) { - stop( - "Translating precomputed ids needs a frame carrying `", - id_column, "`.", - call. = FALSE - ) - } - - matched <- match(ids, frame[[id_column]]) - as.character(frame$survey_unit_id[matched[!is.na(matched)]]) - }) -} - -# 5. resample_spatial_block() ---- - -#' Draw a Spatially Blocked Bootstrap -#' -#' Resamples survey units with replacement within each spatial -#' block, so every block keeps its original number of units and -#' the draw keeps the geographic spread of the survey. +#' Draw the Resampling Sets for One Species #' -#' Iteration 1 is the complete data, matching v2. +#' Looks the spec's scheme up in the registry and passes it the +#' spec's `resample` settings. `scheme`, `seed` and `scope` are +#' read here and by run_spec(), not by a scheme. #' -#' @param frame A data frame with `survey_unit_id` and the -#' coordinate columns. -#' @param iterations Integer vector of bootstrap iterations. -#' @param long_column,lat_column Character. Coordinate columns. -#' @param min_detections Integer. Redraw a block set until at -#' least this many detections are present, or 0 to skip the -#' check. -#' @param response Numeric vector, one per row of `frame`, used -#' only for the detection check. -#' @param max_attempts Integer. How many redraws before giving -#' up, so a species that can never meet the threshold fails -#' rather than looping forever. -#' @param seed Integer or NULL. Defaults to harness_seed(), so a -#' run reproduces. NULL leaves the stream unseeded, which is -#' what v2 did. -#' @return A list of character vectors, one per iteration. +#' @param spec A taxon spec. +#' @param frame The one-species frame, one row per unit that can +#' be drawn. +#' @param iterations Integer vector. +#' @param data_dir Character. +#' @param seed Integer or NULL. This species' seed, from +#' species_seed(). NULL leaves the draw unseeded. +#' @param species Character. Names the stored draws where they +#' are kept per species. +#' @return A list of character vectors of survey unit ids. #' #' @example # Example usage of the function -#' # ids <- resample_spatial_block(frame, 1:5, seed = 42) -resample_spatial_block <- function( - frame, - iterations, - long_column = "long", - lat_column = "lat", - min_detections = 0L, - response = NULL, - max_attempts = 100L, - seed = harness_seed() +#' # resample_for_species(spec, frame, 1:10, data_dir, +#' # seed = 123L, species = "Physcia.adscendens") +resample_for_species <- function( + spec, frame, iterations, data_dir, seed = NULL, species = NULL ) { - for (one in c(long_column, lat_column)) { - if (!one %in% names(frame)) { - stop( - "Spatial blocking needs `", one, "` in the frame.", - call. = FALSE - ) - } - } - - units <- as.character(frame$survey_unit_id) - blocks <- spatial_blocks( - frame[[long_column]], frame[[lat_column]] + scheme <- get_method("resampler", spec$resample$scheme) + settings <- spec$resample[ + setdiff(names(spec$resample), c("scheme", "seed", "scope")) + ] + + context <- list( + data_dir = data_dir, + taxon = spec$taxon, + species = species, + spec = spec, + response_name = spec$response_name %||% "response" ) - by_block <- split(seq_along(units), blocks) - - draw_once <- function() { - unlist( - lapply( - by_block, - function(rows) sample(rows, length(rows), replace = TRUE) - ), - use.names = FALSE - ) - } - - # Every draw comes from one stream under `seed`, so a species' - # draws depend only on its seed and the iterations requested. - with_seed(seed, lapply(iterations, function(i) { - # Step 1: Iteration 1 is the complete data, as in v2 - if (i == 1L) { - return(units) - } - - # Step 2: Redraw until the sample carries enough detections - # for a model to be estimable - for (attempt in seq_len(max_attempts)) { - rows <- draw_once() - - if (min_detections <= 0L || is.null(response)) { - return(units[rows]) - } - - if (sum(response[rows] > 0, na.rm = TRUE) >= min_detections) { - return(units[rows]) - } - } - stop( - "No spatially blocked draw reached ", min_detections, - " detections in ", max_attempts, " attempts. The species ", - "is probably too rare to bootstrap at this threshold.", - call. = FALSE - ) - })) -} - -# 6. resample_spatial_cv() ---- - -#' Split Survey Units into Spatial Cross-Validation Folds -#' -#' Holds out whole spatial blocks rather than random units, so a -#' held-out score is not inflated by a training unit sitting -#' beside its own test unit. This is the scheme a spatial -#' autocorrelation experiment needs; v2 has no equivalent. -#' -#' @param frame A data frame with `survey_unit_id` and the -#' coordinate columns. -#' @param folds Integer. Number of folds. -#' @param long_column,lat_column Character. Coordinate columns. -#' @param seed Integer or NULL. Defaults to harness_seed(). -#' @return A list of lists, each with `train` and `test` -#' character vectors of survey unit ids. -#' -#' @example # Example usage of the function -#' # cv <- resample_spatial_cv(frame, folds = 5, seed = 42) -#' # length(cv[[1]]$train) -resample_spatial_cv <- function( - frame, - folds = 5L, - long_column = "long", - lat_column = "lat", - seed = harness_seed() -) { - units <- as.character(frame$survey_unit_id) - blocks <- spatial_blocks( - frame[[long_column]], frame[[lat_column]] - ) - present <- unique(blocks[!is.na(blocks)]) - - if (length(present) < folds) { - stop( - "Only ", length(present), " spatial block(s) present; ", - folds, " folds were asked for. Use finer block breaks or ", - "fewer folds.", - call. = FALSE - ) - } - - # Step 1: Deal whole blocks into folds, so no fold shares a - # block with another - assignment <- with_seed( - seed, sample(rep_len(seq_len(folds), length(present))) - ) - fold_of_block <- assignment[match(blocks, present)] - - lapply(seq_len(folds), function(k) { + do.call(scheme, c( list( - train = units[!is.na(fold_of_block) & fold_of_block != k], - test = units[!is.na(fold_of_block) & fold_of_block == k] - ) - }) -} - -# 7. resample_units() ---- - -#' Produce the Survey Units for Each Model Fit -#' -#' The single entry point the fitting loop calls. Dispatches on -#' the scheme name so a spec names a scheme rather than calling -#' one. -#' -#' @param scheme Character. "precomputed", "spatial_block" or -#' "spatial_cv". -#' @param frame A data frame with `survey_unit_id`. -#' @param iterations Integer vector of iterations, or the number -#' of folds for spatial_cv. -#' @param ... Passed to the scheme's own function. -#' @return For the bootstrap schemes, a list of character vectors -#' of survey unit ids. For spatial_cv, a list of train and test -#' splits. -#' -#' @example # Example usage of the function -#' # resample_units("spatial_block", frame, 1:10, seed = 42) -resample_units <- function(scheme, frame, iterations, ...) { - switch( - scheme, - precomputed = resample_precomputed( - iterations = iterations, frame = frame, ... - ), - spatial_block = resample_spatial_block( - frame = frame, iterations = iterations, ... + frame = frame, iterations = iterations, seed = seed, + context = context ), - spatial_cv = resample_spatial_cv( - frame = frame, folds = length(iterations), ... - ), - stop( - "Unknown resampling scheme `", scheme, "`. Use ", - "\"precomputed\", \"spatial_block\" or \"spatial_cv\".", - call. = FALSE - ) - ) + settings + )) } # End of script ---- diff --git a/1_code/harness/result.R b/1_code/harness/result.R index f126afa..e49d792 100644 --- a/1_code/harness/result.R +++ b/1_code/harness/result.R @@ -22,10 +22,19 @@ # coefficients, because parity against v2 is checked there. # Its absence is recorded in meta.json rather than being # silently empty. -# - Writing is append-per-species rather than one object at the +# - Writing is append-per-draw rather than one object at the # end. A bird run is 172 species by 100 bootstraps, and # holding all of it before the first write would risk losing # a long run to a failure in its last species. +# - Species are fitted in parallel, so each writes to a shard +# store of its own, without headers. merge_result_shards() +# then writes each file's header once and appends the shards +# in queue order, so the merged store is byte for byte what a +# serial run writes. +# - unit_predictions.csv is optional. It holds every survey unit +# for every draw - gigabytes for birds - and nothing +# downstream reads it, because metrics are scored in memory. +# A run writes it only when asked. # - meta.json records the configuration a run cannot be # reproduced without: engine, selection rule, covariates, # seed, and the resampling scheme. The seed matters most - v2 @@ -40,39 +49,118 @@ library(data.table) # fast appending writes (version: 1.16.4) # 2. result_store() ---- -#' Open a Result Store +## 2.1 result_columns() ---- + +#' The Columns of Each Result File +#' +#' Fixed per file, so a comparison can rely on them and a shard +#' written without a header can be given one when merged. #' -#' Creates the directory and records which files have been -#' started, so each is written with a header once and appended to -#' after that. +#' @return A named list of character vectors. +#' +#' @example # Example usage of the function +#' # result_columns()$metrics +result_columns <- function() { + list( + grid_predictions = c( + "species", "region", "boot", "grid_unit", "prediction" + ), + unit_predictions = c( + "species", "region", "boot", "survey_unit_id", "prediction", + "observed" + ), + coefficients = c( + "species", "region", "stage", "boot", "term", "estimate", "se" + ), + metrics = c("species", "region", "boot", "metric", "value") + ) +} + +## 2.2 result_store() ---- + +#' Open a Result Store #' #' @param dir Character. Directory to write into. #' @param overwrite Logical. Remove existing result files first. #' FALSE lets a run add to a store, which is how a run that #' stopped part way is continued. +#' @param header Logical. Write a header line when a file is +#' started. FALSE for a shard, which is merged under one header. +#' @param unit_predictions Character. "none" writes no unit +#' predictions, "oob" only the units a draw left out, "all" +#' every unit. #' @return A store object. #' #' @example # Example usage of the function #' # store <- result_store("2_pipeline/exp_001/bryophyte") -result_store <- function(dir, overwrite = TRUE) { +result_store <- function( + dir, + overwrite = TRUE, + header = TRUE, + unit_predictions = c("none", "oob", "all") +) { + unit_predictions <- match.arg(unit_predictions) dir.create(dir, recursive = TRUE, showWarnings = FALSE) - files <- c( - "grid_predictions.csv", "unit_predictions.csv", - "coefficients.csv", "metrics.csv" - ) + files <- paste0(names(result_columns()), ".csv") if (overwrite) { - existing <- file.path(dir, files) + existing <- file.path(dir, c(files, "meta.json")) file.remove(existing[file.exists(existing)]) } structure( - list(dir = dir, files = files), + list( + dir = dir, files = files, header = header, + unit_predictions = unit_predictions + ), class = "result_store" ) } +## 2.3 merge_result_shards() ---- + +#' Combine Shard Stores into One Store +#' +#' @param store A result_store() to write into, with a header. +#' @param shard_dirs Character vector of shard directories, in the +#' order their rows should appear. +#' @return NULL, invisibly. +#' +#' @example # Example usage of the function +#' # merge_result_shards(store, file.path(shards, species)) +merge_result_shards <- function(store, shard_dirs) { + columns <- result_columns() + + for (what in names(columns)) { + target <- file.path(store$dir, paste0(what, ".csv")) + parts <- file.path(shard_dirs, paste0(what, ".csv")) + parts <- parts[file.exists(parts)] + + if (length(parts) == 0) { + next + } + + # The header is written by fwrite itself, from an empty table, + # so its line ending matches the rows appended under it + if (!file.exists(target)) { + empty <- stats::setNames( + as.data.frame( + rep(list(character(0)), length(columns[[what]])) + ), + columns[[what]] + ) + fwrite(empty, target) + } + + for (part in parts) { + file.append(target, part) + } + } + + invisible(NULL) +} + # 3. result_append() ---- #' Append Rows to One Result File @@ -92,12 +180,13 @@ result_append <- function(store, what, rows) { } path <- file.path(store$dir, paste0(what, ".csv")) + started <- file.exists(path) - # data.table writes the header only on the first call, so the - # file stays a single valid CSV across appends + # The header is written once, on the first call, so the file + # stays a single valid CSV across appends. A shard has none. fwrite( - rows, path, append = file.exists(path), - col.names = !file.exists(path), na = "" + rows, path, append = started, + col.names = store$header && !started, na = "" ) invisible(NULL) @@ -144,15 +233,30 @@ write_grid_predictions <- function( #' @param boot Integer. #' @param survey_unit_id Character vector. #' @param prediction,observed Numeric vectors. -#' @return NULL, invisibly. +#' @param in_bag Logical vector, TRUE where the unit was in the +#' draw. Used when the store keeps out-of-bag units only. +#' @return NULL, invisibly. Nothing is written when the store's +#' `unit_predictions` is "none". #' #' @example # Example usage of the function #' # write_unit_predictions(store, "ALFL", "north", 1, ids, #' # preds, obs) write_unit_predictions <- function( store, species, region, boot, survey_unit_id, prediction, - observed + observed, in_bag = NULL ) { + if (store$unit_predictions == "none") { + return(invisible(NULL)) + } + + # Only the held-out units, where the run asks for those alone + if (store$unit_predictions == "oob" && !is.null(in_bag)) { + keep <- !in_bag + survey_unit_id <- survey_unit_id[keep] + prediction <- prediction[keep] + observed <- observed[keep] + } + result_append(store, "unit_predictions", data.frame( species = species, region = region, diff --git a/1_code/harness/run_model.R b/1_code/harness/run_model.R index 5dbe004..0ca483f 100644 --- a/1_code/harness/run_model.R +++ b/1_code/harness/run_model.R @@ -1,245 +1,387 @@ # --- -# title: Run a Taxon Spec +# title: Run Taxon Specs # author: Brendan Casey # created: 2026-09-09 # inputs: -# a spec from 1_code/modules//spec.R +# specs from 1_code/modules//spec.R # the harmonized test dataset # outputs: -# in run_dir, one result store per region; see result.R +# in each run directory, one result store per region; see +# result.R # notes: -# - The loop a spec drives: region, then species, then -# resampling iteration, then stage. Everything it does is -# taken from the spec, so this file names no taxon. +# - The loop a spec drives. Everything it does is taken from +# the spec, so this file names no taxon. In order: +# 1. prepare_spec(): check the spec, decide the species, and +# load each region's data and grid once. +# 2. fit_species(): for one species, every region, draw and +# stage. This is the unit of work, run in parallel when +# `workers` is above 1. +# 3. merge_spec_shards(): each species wrote to a shard of its +# own; the shards are joined, in queue order, into one +# store per region, with its meta.json. # - Stages run in order and each may carry the previous one # forward. v2's habitat models take the fitted climate # prediction as a term called `Climate`; here that is # `carry_as` on a stage, and dropping it is how an experiment # asks whether staging helps at all. -# - The covariates a run needs are read off the model sets -# rather than declared twice. A spec that adds a term to a -# formula therefore cannot forget to load its column. -# - Predictions are written at survey units always, and onto the -# prediction grid when the spec names one. Grid predictions -# are the comparison currency; see docs/framework_design.md. -# - A species or iteration that fails is recorded and the run -# continues. Across 172 species and 100 iterations something -# always fails, and losing the whole run to it would be -# worse than losing the cell. +# - Seeds are derived per species (species_seed()), so results +# do not depend on how many workers ran or in what order: a +# parallel run writes the same stores as a serial one. +# - Metrics and grid predictions come from each stage's final +# model - the averaged or combined one where the rule +# combines candidates - or from the spec's `final_prediction` +# where it states its own, as the plant specs do with v2's. +# - A species or draw that fails is recorded and the run +# continues. Across 172 species and 100 draws something always +# fails, and losing the whole run to it would be worse than +# losing the cell. # --- # 1. Setup ---- ## 1.1 Load packages ---- -# Sourced alongside the rest of the harness; no direct imports. +# parallel (base R), when `workers` is above 1. -# 2. spec_covariates() ---- +# 2. run_specs() and run_spec() ---- -#' Read the Covariates a Spec's Model Sets Name +## 2.1 run_specs() ---- + +#' Run Several Specs Through One Pool of Workers #' -#' Taken from the formulas rather than declared separately, so a -#' spec cannot name a term it forgot to load. Terms the harness -#' supplies itself - the response, the offset, and any stage -#' carried forward - are excluded. +#' What an experiment calls. Every species of every spec is one +#' job, so a run with few species per taxon still keeps every +#' worker busy. #' -#' @param spec A taxon spec. -#' @param stage_names Character vector of stages to read, or NULL -#' for all of them. -#' @return A character vector of covariate names. +#' @param specs A named list of taxon specs. The names name the +#' runs, and so the folders under `pipeline_dir`. +#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param pipeline_dir Character. Each spec writes to +#' `pipeline_dir///`. +#' @param species Character vector of focal species, named by +#' taxon (see taxon_values()), or NULL for every species each +#' spec's queue declares. +#' @param regions Character vector of regions to run, or NULL for +#' all each spec defines. +#' @param iterations Integer vector of resampling iterations. +#' @param stage_models Named list of replacement candidate sets, +#' or NULL; see apply_stage_models(). +#' @param metrics Character vector of metric names, or NULL for +#' default_metrics(). +#' @param boot_seed Integer or NULL. The base seed. Each species +#' resamples under its own seed derived from it. NULL falls back +#' to the spec's `resample$seed`, and when that is NULL too the +#' draws are unseeded, as in v2. +#' @param workers Integer. Species fitted at once. 1 runs in this +#' session; more start background R sessions. +#' @param unit_predictions Character. "none", "oob" or "all"; see +#' result_store(). +#' @param verbose Logical. Report progress. +#' @return A data frame, one row per spec, species, region and +#' draw, recording what happened. #' #' @example # Example usage of the function -#' # spec_covariates(bryophyte_spec) -spec_covariates <- function(spec, stage_names = NULL) { - stages <- spec$stages - - if (!is.null(stage_names)) { - stages <- stages[vapply( - stages, function(s) s$name %in% stage_names, logical(1) - )] +#' # run_specs(list(lichen = lichen_spec()), data_dir, +#' # "2_pipeline/exp_001", iterations = 1:5, workers = 4) +run_specs <- function( + specs, + data_dir, + pipeline_dir, + species = NULL, + regions = NULL, + iterations = 1:100, + stage_models = NULL, + metrics = NULL, + boot_seed = NULL, + workers = 1L, + unit_predictions = c("none", "oob", "all"), + verbose = TRUE +) { + unit_predictions <- match.arg(unit_predictions) + + if (is.null(names(specs)) || any(!nzchar(names(specs)))) { + stop("`specs` must be a named list; the names name the runs.", + call. = FALSE) } - supplied <- c( - spec$response_name %||% "response", - "offset", "weight", - vapply(spec$stages, function(s) s$carry_as %||% "", character(1)), - # Columns a spec attaches per species rather than reads from - # the dataset: the mammal precomputed Climate. - spec$supplied_columns - ) + # Step 1: Prepare every spec before fitting any, so a problem in + # the last spec stops the run before hours are spent on the first + prepared <- lapply(stats::setNames(names(specs), names(specs)), + function(key) { + prepare_spec( + spec = specs[[key]], key = key, data_dir = data_dir, + run_dir = file.path(pipeline_dir, key), species = species, + regions = regions, iterations = iterations, + stage_models = stage_models, metrics = metrics, + boot_seed = boot_seed, unit_predictions = unit_predictions + ) + }) - terms <- unlist(lapply(stages, function(stage) { - # A staged set is a list of groups; flatten before reading - # terms off the formulas. - models <- unlist(get_model_set(stage$models), use.names = FALSE) + # Step 2: One job per spec and species + jobs <- unlist(lapply(prepared, function(p) { + lapply(p$species, function(one) list(key = p$key, species = one)) + }), recursive = FALSE) + + if (verbose) { + cat( + "Fitting ", length(jobs), " species across ", length(specs), + " spec(s), ", length(iterations), " draw(s) each, on ", + workers, " worker(s)\n", + sep = "" + ) + } - unlist(lapply(models, function(one) { - all.vars(stats::as.formula(one)) - })) - })) + logs <- run_jobs(jobs, prepared, workers, verbose) - covariates <- setdiff(unique(terms), c(supplied, ".")) + # Step 3: Join each spec's shards into its region stores + for (p in prepared) { + merge_spec_shards(p) + } - # A stage may need columns no formula names: the plant age - # splines read the aged stand-cover columns. - extra <- unlist(lapply(stages, function(stage) stage$extra_covariates)) + log <- do.call(rbind, logs) + rownames(log) <- NULL - # The weight is a covariate too, and is loaded with the rest - unique(c(covariates, extra, spec$weight_column)) + log } -# 3. apply_stage_models() ---- +## 2.2 run_spec() ---- -#' Swap a Spec's Candidate Sets for an Experiment's Own -#' -#' Lets an experiment define the models a stage fits without -#' editing the taxon spec, which keeps the spec as the record of -#' what v2 did and the experiment as the record of what was -#' changed. +#' Run One Spec #' -#' Entries are named `taxon.stage`, or `stage` to apply to every -#' taxon. Each value is either a name in model_sets() or a -#' character vector of formulas, so an experiment can hand over a -#' set built by extend_models() or models_from_covariates(). +#' run_specs() for a single spec, writing to `run_dir//`. #' -#' \preformatted{ -#' stage_models <- list( -#' "lichen.climate" = extend_models( -#' "climate_plant_v2_full", "elevation" -#' ), -#' "climate" = "climate_common_ladder" -#' ) -#' } +#' @param spec A taxon spec. +#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param run_dir Character. Where the region stores go. +#' @param ... Passed to run_specs(): species, regions, +#' iterations, stage_models, metrics, boot_seed, workers, +#' unit_predictions, verbose. +#' @return As run_specs(). #' -#' Because the covariates a run loads are read off the formulas, -#' swapping a set changes what is loaded too. Nothing else has to -#' be declared. +#' @example # Example usage of the function +#' # run_spec(bryophyte_spec(), data_dir, run_dir, +#' # species = c("Aulacomnium.palustre"), +#' # iterations = 1:5) +run_spec <- function(spec, data_dir, run_dir, ...) { + run_specs( + specs = stats::setNames(list(spec), basename(run_dir)), + data_dir = data_dir, + pipeline_dir = dirname(run_dir), + ... + ) +} + +# 3. Preparing a spec ---- + +## 3.1 prepare_spec() ---- + +#' Check a Spec and Load What Its Regions Need #' #' @param spec A taxon spec. -#' @param stage_models Named list of replacement model sets, or -#' NULL. -#' @return The spec, with matching stages replaced, and a record -#' of what changed in `models_overridden`. +#' @param key Character. The run's name. +#' @param data_dir,run_dir Character. +#' @param species,regions,iterations,stage_models,metrics,boot_seed +#' As in run_specs(). +#' @param unit_predictions Character. +#' @return A list: the spec, its regions (each with its data, +#' grid and species), the province-wide data, the species to +#' fit, and the run settings a worker needs. #' #' @example # Example usage of the function -#' # apply_stage_models(spec, list(climate = my_models)) -apply_stage_models <- function(spec, stage_models) { - if (is.null(stage_models) || length(stage_models) == 0) { - return(spec) - } +#' # p <- prepare_spec(lichen_spec(), "lichen", data_dir, run_dir) +prepare_spec <- function( + spec, key, data_dir, run_dir, species = NULL, regions = NULL, + iterations = 1:100, stage_models = NULL, metrics = NULL, + boot_seed = NULL, unit_predictions = "none" +) { + # An experiment's own candidate sets replace the spec's before + # anything is read, so the covariates follow from them. + spec <- apply_stage_models(spec, stage_models) - changed <- character(0) + # Checked before any data is read, so a misspelt field or an + # unregistered method stops the run here with a sentence. + validate_spec(spec) - spec$stages <- lapply(spec$stages, function(stage) { - # The taxon-specific key wins over the bare stage name, so a - # run can set a default and then override one taxon. - keys <- c(paste(spec$taxon, stage$name, sep = "."), stage$name) - hit <- keys[keys %in% names(stage_models)][1] + # One base seed governs the run; the experiment's wins over the + # spec's, so a run can seed every taxon from one setting. + base_seed <- boot_seed %||% spec$resample$seed - if (is.na(hit)) { - return(stage) - } + # Step 1: The species. A named species is validated once + # against the whole taxon, so a typo stops the run here. Per + # region it is then intersected rather than re-validated: a + # species modelled in the north and not the south is a fact + # about the species, not a mistake by the caller. + species <- taxon_values(species, spec$taxon) %||% species - stage$models <- stage_models[[hit]] - changed <<- c(changed, paste0(stage$name, " <- ", hit)) + if (!is.null(species)) { + species <- unname(species) + resolve_species(species, data_dir, spec$taxon, tier = spec$tier) + } - stage - }) + regions <- regions %||% names(spec$regions) + unknown_regions <- setdiff(regions, names(spec$regions)) - # Recorded so meta.json shows a run that did not fit the v2 - # candidate sets, which otherwise looks identical to one that - # did. - spec$models_overridden <- if (length(changed) > 0) { - changed - } else { - NULL + if (length(unknown_regions) > 0) { + stop( + "Spec for ", spec$taxon, " defines no region(s) ", + paste(unknown_regions, collapse = ", "), ". Regions: ", + paste(names(spec$regions), collapse = ", "), + call. = FALSE + ) } - spec + named_regions <- stats::setNames(regions, regions) + region_species <- lapply(named_regions, function(r) { + available <- list_species( + data_dir, spec$taxon, region = r, tier = spec$tier, + season = spec$season + ) + + if (is.null(species)) available else intersect(available, species) + }) + + all_species <- unique(unlist(region_species, use.names = FALSE)) + + # Step 2: Each region's stages, data and grid, loaded once + prepared_regions <- lapply( + regions[lengths(region_species[regions]) > 0], + function(r) { + prepare_region(spec, r, region_species[[r]], data_dir) + } + ) + names(prepared_regions) <- vapply( + prepared_regions, `[[`, character(1), "name" + ) + + list( + key = key, + spec = spec, + data_dir = data_dir, + run_dir = run_dir, + shard_dir = file.path(run_dir, "_shards"), + regions = prepared_regions, + province = province_context(spec, data_dir, all_species), + species = all_species, + iterations = iterations, + base_seed = base_seed, + metrics = metrics, + unit_predictions = unit_predictions + ) } -# 4. run_stage() ---- +## 3.2 prepare_region() ---- -#' Fit One Stage on One Draw +#' Resolve One Region's Stages and Load Its Data and Grid #' -#' @param stage A stage definition from a spec. -#' @param data A data frame for one species and one draw. -#' @param spec The taxon spec. -#' @param offset Numeric vector or NULL. -#' @param weights Numeric vector or NULL. -#' @param grid A prediction grid, or NULL. -#' @param species Character. Passed to a rule that declares it. -#' @return A selection result. +#' A stage with no models of its own takes the region's, which is +#' how one spec fits vegetation types in the north and soil types +#' in the south. The v2 formulas name columns as the source files +#' did; any column in more than one block was suffixed by the +#' harmonizer, so the names are rewritten here (see term_map()). +#' Without it a habitat model asks for HardLin, gets a column +#' belonging to another taxon, and reads NA. +#' +#' @param spec A taxon spec. +#' @param region Character. +#' @param species Character vector of the region's species. +#' @param data_dir Character. +#' @return A list of the region's name, spec (with resolved +#' stages), species, model data, grid, grid name, weight column +#' and covariates. #' #' @example # Example usage of the function -#' # run_stage(spec$stages[[1]], d, spec) -run_stage <- function( - stage, data, spec, offset = NULL, weights = NULL, - grid = NULL, species = NA_character_ -) { - models <- get_model_set(stage$models) +#' # prepare_region(lichen_spec(), "north", "Physcia.adscendens", +#' # data_dir) +prepare_region <- function(spec, region, species, data_dir) { + region_spec <- spec$regions[[region]] + rename <- term_map( + data_dir, spec$taxon, region, block = region_spec$term_block + ) - # A staged rule takes groups of formulas; the others take a - # flat list. Both arrive here as text and become formulas now. - as_formulas <- function(x) { - if (is.list(x)) { - return(lapply(x, as_formulas)) + # Step 1: The stages, with the region's models where a stage + # takes them, and every formula in the dataset's names + spec$stages <- lapply(spec$stages, function(stage) { + if (is.null(stage$models)) { + # A region that supplies the models also supplies what goes + # with them: the mammal one-hot rule's reference categories, + # constants, and the columns its age splines read. + stage$models <- region_spec$habitat_models + stage$intercept_cats <- region_spec$intercept_cats %||% + stage$intercept_cats + stage$constants <- region_spec$constants %||% stage$constants + stage$extra_covariates <- c( + stage$extra_covariates, region_spec$extra_covariates + ) + + # Terms held fixed on the grid can be added per region: v2 + # predicts the south at pAspen = 0. + if (!is.null(region_spec$grid_constants)) { + stage$grid_constants <- c( + stage$grid_constants %||% list(), + region_spec$grid_constants + ) + } } - lapply(x, stats::as.formula) - } + stage$models <- apply_term_map( + get_model_set(stage$models), rename + ) - # The offset goes in the formula, not in an argument. An - # offset supplied as an argument is not carried by predict() - # onto new data: R silently recycles the fitted offset against - # the new rows, which for birds means every prediction outside - # the draw is wrong. v2 writes `offset(offset)` in the formula - # for the same reason. - response <- spec$response_name %||% "response" + stage + }) - # A stage may start every candidate from terms of its own. v2's - # bird landcover selection starts from `count ~ climate`, so - # each group updates a model that already carries the climate - # stage; without it the carried climate would never enter. - base_terms <- c("1", stage$base_terms) + # Step 2: The columns to load. Read off the formulas, plus the + # weight, the stored-draw key and any filter column. + weight_column <- region_spec$weight_column %||% spec$weight_column + covariates <- covariate_request( + spec, spec_covariates(spec), region_spec$filter + ) - base <- stats::as.formula(paste( - response, "~", paste(base_terms, collapse = " + "), - if (is.null(offset)) "" else "+ offset(offset)" - )) + # Step 3: Load once for the region; species are cut from it + model_data <- build_model_data( + taxon = spec$taxon, + data_dir = data_dir, + species = species, + covariates = covariates, + region = region, + region_filter = region_spec$filter, + weight_column = weight_column, + aliases = spec$aliases %||% list() + ) - selection_run( - rule = stage$selection, - models = as_formulas(models), - base = base, - data = data, - engine = get_engine(stage$engine), - family = stage$family %||% spec$family, - weights = weights, - offset = NULL, - ic = stage$ic %||% "AICc", - control = stage$control %||% list(), - # Used only by rules that declare them; see selection_run(). - grid = grid, - grid_constants = stage$grid_constants %||% list(), - head_terms = stage$head_terms %||% c("Intercept", "Climate"), - intercept_cats = get_model_set(stage$intercept_cats), - constants = stage$constants %||% list(), - slope_terms = stage$slope_terms %||% "Climate", - always_advance = stage$always_advance %||% TRUE, + # Step 4: The grid. A spec may name its own; otherwise the + # dataset manifest's grid for the taxon and region is used. Its + # columns are renamed to match the data, but its row names - the + # habitat types effects are reported under - are left as v2 + # wrote them. + grid_name <- region_spec$grid %||% + manifest_entry(data_dir, spec$taxon, region)$grid + grid <- load_prediction_grid(data_dir, grid_name) + + if (!is.null(grid)) { + names(grid) <- apply_term_map(names(grid), rename) + + # A region may leave rows or columns out, as v2 drops the + # mammal north's WetlandMargin and Climate rows. + grid <- grid[ + !rownames(grid) %in% region_spec$grid_drop_rows, + !names(grid) %in% region_spec$grid_drop_cols, + drop = FALSE + ] + } + + list( + name = region, + spec = spec, species = species, - stage = stage, - scale = stage$scale %||% "link", - calibrate_against = if (isTRUE(stage$calibrate)) { - data[[spec$response_name %||% "response"]] - } else { - NULL - } + model_data = model_data, + grid = grid, + grid_name = grid_name, + weight_column = weight_column, + covariates = covariates ) } -# 5. run_spec() ---- - -## 5.1 province_context() ---- +## 3.3 province_context() ---- #' Assemble the Province-Wide Data a Spec's Province Scope Needs #' @@ -248,13 +390,13 @@ run_stage <- function( #' across the province; only the habitat stage is fitted per #' region. A spec says so with `scope = "province"` on a stage #' and on `resample`. This loads the unfiltered data those need, -#' once per taxon. +#' once per spec. #' #' @param spec A taxon spec, with stage models already resolved. #' @param data_dir Character. #' @param species Character vector of the species to model. -#' @return A list of `model_data` and `stages`, or NULL when the -#' spec has no province scope. +#' @return A list of `model_data`, `stages` and `draws`, or NULL +#' when the spec has no province scope. #' #' @example # Example usage of the function #' # province_context(spec, data_dir, c("Physcia.adscendens")) @@ -272,18 +414,11 @@ province_context <- function(spec, data_dir, species) { # A province stage is fitted before any region exists, so it # can take nothing from a region-scope stage. for (stage in province_stages) { - if (!is.null(stage$carry_from)) { + if (!is.null(stage$carry_from) || is.null(stage$models)) { stop( - "Stage `", stage$name, "` has province scope but carries ", - "from `", stage$carry_from, "`; a province stage must come ", - "first.", call. = FALSE - ) - } - - if (is.null(stage$models)) { - stop( - "Stage `", stage$name, "` has province scope but takes its ", - "models from the region.", call. = FALSE + "Stage `", stage$name, "` has province scope, so it must ", + "come first and name its own models.", + call. = FALSE ) } } @@ -295,27 +430,10 @@ province_context <- function(spec, data_dir, species) { character(0) } - covariates <- setdiff( - covariates, c(names(spec$aliases), unlist(spec$aliases)) - ) - - if (!is.null(spec$resample$id_column)) { - covariates <- unique(c(covariates, spec$resample$id_column)) - } - # The region filters are evaluated on the province frame for # v2's redraw rule, so their columns are loaded too. - site_supplied <- c( - "lat", "long", "easting", "northing", "nr", "nsr", "luf", "year", - "lured", "location", - "summer_days", "winter_days", "survey_unit_id" - ) - filter_terms <- unlist(lapply(spec$regions, function(one) { - if (is.null(one$filter)) character(0) else all.vars(one$filter) - })) - covariates <- unique(c( - covariates, setdiff(filter_terms, site_supplied) - )) + filters <- lapply(spec$regions, `[[`, "filter") + covariates <- covariate_request(spec, covariates, filters) list( model_data = build_model_data( @@ -333,445 +451,390 @@ province_context <- function(spec, data_dir, species) { ) } -## 5.2 run_spec() ---- +## 3.4 covariate_request() ---- -#' Run a Spec Across Species, Draws and Stages +#' The Columns to Load, Given the Covariates the Formulas Name +#' +#' Adds what no formula names but a run still needs - the column +#' stored draws are keyed on, and any column a region filter reads +#' - and drops what is not read from covariates.csv: aliases, +#' which are made from columns already loaded, and site fields. #' #' @param spec A taxon spec. -#' @param data_dir Character. Path to 0_data/test_dataset. -#' @param run_dir Character. Where result stores are written; one -#' subdirectory per region. -#' @param species Character vector of focal species, or NULL for -#' every species the spec's queue declares. -#' @param regions Character vector of regions to run, or NULL for -#' all the spec defines. -#' @param iterations Integer vector of resampling iterations. -#' @param stage_models Named list of replacement candidate sets, -#' or NULL to fit the spec's own. Keys are `taxon.stage` or -#' `stage`; see apply_stage_models(). Because covariates are -#' read off the formulas, replacing a set changes what is -#' loaded too. -#' @param metrics Character vector of metric names, or NULL. -#' @param boot_seed Integer or NULL. The experiment's base seed. -#' Each species resamples under its own seed derived from it by -#' species_seed(). NULL falls back to the spec's -#' `resample$seed`, and when that is NULL too the draws are -#' unseeded, as in v2. Ignored by the precomputed scheme, whose -#' draws are stored rather than drawn. -#' @param verbose Logical. Report progress per species. -#' @return A data frame, one row per species, region and -#' iteration, recording what happened. +#' @param covariates Character vector from spec_covariates(). +#' @param filters A one-sided formula, a list of them, or NULL. +#' @return A character vector of covariate names. #' #' @example # Example usage of the function -#' # run_spec(bryophyte_spec, data_dir, run_dir, -#' # species = c("Aulacomnium.palustre"), -#' # iterations = 1:5) -run_spec <- function( - spec, - data_dir, - run_dir, - species = NULL, - regions = NULL, - iterations = 1:100, - stage_models = NULL, - metrics = NULL, - boot_seed = NULL, - verbose = TRUE -) { - # An experiment's own candidate sets replace the spec's before - # anything is read, so the covariates follow from them. - spec <- apply_stage_models(spec, stage_models) +#' # covariate_request(spec, spec_covariates(spec), ~ useNorth == 1) +covariate_request <- function(spec, covariates, filters = NULL) { + if (inherits(filters, "formula")) { + filters <- list(filters) + } - # One base seed governs the run. The experiment's wins over the - # spec's, so a run can seed every taxon from one setting. - base_seed <- boot_seed %||% spec$resample$seed - draws_seeded <- !is.null(base_seed) && - spec$resample$scheme != "precomputed" + filter_terms <- unlist(lapply(filters, function(one) { + if (is.null(one)) character(0) else all.vars(one) + })) - if (is.null(regions)) { - regions <- names(spec$regions) - } + covariates <- setdiff( + covariates, c(names(spec$aliases), unlist(spec$aliases)) + ) - log_rows <- list() + unique(c( + covariates, + spec$resample$id_column, + setdiff(filter_terms, c(site_columns(), "survey_unit_id")) + )) +} - log_outcome <- function(species_name, region, status, note) { - for (boot in iterations) { - log_rows[[length(log_rows) + 1]] <<- data.frame( - taxon = spec$taxon, species = species_name, region = region, - boot = as.integer(boot), status = status, note = note, - stringsAsFactors = FALSE - ) - } - } +# 4. Fitting one species ---- - # A named species is validated once against the whole taxon, - # so a typo stops the run here. Per region it is then - # intersected rather than re-validated: a species modelled in - # the north and not the south is a fact about the species, not - # a mistake by the caller. - # `species` may be a plain vector or one named by taxon; take - # this taxon's entries either way. - species <- taxon_values(species, spec$taxon) %||% species +## 4.1 run_jobs() ---- - if (!is.null(species) && !is.null(names(species))) { - species <- unname(species) +#' Fit Every Job, in This Session or in Parallel +#' +#' Parallel runs start a cluster of background R sessions with the +#' base `parallel` package, load the framework on every one of +#' them at once, then hand out jobs one at a time as workers come +#' free, so a slow species (a bird) does not hold up the rest. +#' +#' @param jobs List of `key` and `species` pairs. +#' @param prepared Named list of prepare_spec() results. +#' @param workers Integer. +#' @param verbose Logical. +#' @return A list of log data frames, one per job, in job order. +#' +#' @example # Example usage of the function +#' # run_jobs(jobs, prepared, workers = 4) +run_jobs <- function(jobs, prepared, workers = 1L, verbose = TRUE) { + if (workers <= 1L || length(jobs) <= 1L) { + return(lapply(jobs, function(job) { + log <- fit_species(job$species, prepared[[job$key]]) + if (verbose) cat(".") + log + })) } - if (!is.null(species)) { - resolve_species( - species, data_dir, spec$taxon, tier = spec$tier - ) + project_root <- getOption("sdm.project_root") + + if (is.null(project_root)) { + stop("Parallel runs need load_framework() to have been ", + "called, so workers can load it too.", call. = FALSE) } - # Step 1: The species each region models. A species is - # modelled in one region and not another, so the queue is per - # region rather than per taxon. - region_queue <- lapply(stats::setNames(regions, regions), function(r) { - if (is.null(spec$regions[[r]])) { - stop( - "Spec for ", spec$taxon, " defines no region `", r, - "`. Regions: ", paste(names(spec$regions), collapse = ", "), - call. = FALSE - ) - } + # Step 1: Start the workers and load the framework on all of + # them at once + cluster <- parallel::makePSOCKcluster(min(workers, length(jobs))) + on.exit(parallel::stopCluster(cluster), add = TRUE) - available <- list_species( - data_dir, spec$taxon, region = r, tier = spec$tier, - season = spec$season - ) + parallel::clusterCall(cluster, load_worker, project_root) - if (is.null(species)) available else intersect(available, species) + # Step 2: One job at a time per worker. Each carries only its + # own spec's prepared data. + tasks <- lapply(jobs, function(job) { + list(species = job$species, prepared = prepared[[job$key]]) }) - # Step 2: The province-wide data, draws and stage fits, shared - # by every region. Built once per taxon; each species' draws - # and fits are made on first use and reused by later regions. - province <- province_context( - spec, data_dir, unique(unlist(region_queue)) + parallel::clusterApplyLB(cluster, tasks, fit_species_worker) +} + +## 4.2 load_worker() ---- + +#' Load the Framework in a Background Session +#' +#' @param project_root Character. The repository root. +#' @return NULL, invisibly. +#' +#' @example # Example usage of the function +#' # parallel::clusterCall(cluster, load_worker, root) +load_worker <- function(project_root) { + session <- globalenv() + + source( + file.path(project_root, "1_code", "harness", "harness.R"), + local = session ) - province_cache <- new.env() + load <- get("load_framework", envir = session) + load(project_root, envir = session) - province_for_species <- function(one_species) { - if (!is.null(province_cache[[one_species]])) { - return(province_cache[[one_species]]) - } + invisible(NULL) +} - frame <- model_frame( - province$model_data, - species = one_species, - transform = spec$response_transform %||% "identity" +## 4.3 fit_species_worker() ---- + +#' Fit One Job in a Background Session +#' +#' What a worker runs. It refers to nothing in the calling +#' session, so the worker needs only the job, and finds +#' fit_species() in the framework load_worker() loaded. +#' +#' @param task List of `species` and `prepared`. +#' @return The job's log data frame. +#' +#' @example # Example usage of the function +#' # fit_species_worker(task) +fit_species_worker <- function(task) { + get("fit_species", envir = globalenv())(task$species, task$prepared) +} + +## 4.4 fit_species() ---- + +#' Fit One Species in Every Region of a Spec +#' +#' The unit of work. Writes a shard store per region and returns +#' the log. Province-wide draws and stage fits are made once and +#' shared by the species' regions. +#' +#' @param species Character. +#' @param p A prepare_spec() result. +#' @return A data frame, one row per region and draw. +#' +#' @example # Example usage of the function +#' # fit_species("Physcia.adscendens", prepared$lichen) +fit_species <- function(species, p) { + spec <- p$spec + seed <- species_seed(p$base_seed, spec$taxon, species) + logs <- list() + + log_all <- function(region, status, note) { + data.frame( + taxon = spec$taxon, species = species, region = region, + boot = as.integer(p$iterations), status = status, note = note, + stringsAsFactors = FALSE ) + } - draws <- NULL + # Step 1: The province-wide frame and draws, when the spec has + # province scope. A species whose draws cannot be made is + # logged and skipped, not fatal. + province <- NULL + province_fits <- list() - if (province$draws) { - draws <- tryCatch( + if (!is.null(p$province)) { + province <- list(frame = model_frame( + p$province$model_data, species = species, + transform = spec$response_transform %||% "identity" + )) + + if (p$province$draws) { + province$draws <- tryCatch( resample_for_species( - spec, province$model_data, frame, iterations, data_dir, - seed = species_seed(base_seed, spec$taxon, one_species), - species = one_species + spec, province$frame, p$iterations, p$data_dir, + seed = seed, species = species ), error = function(e) conditionMessage(e) ) } + } - entry <- list(frame = frame, draws = draws, fits = list()) - province_cache[[one_species]] <- entry + for (region in p$regions) { + if (!species %in% region$species) { + next + } - entry - } + shard <- result_store( + file.path(p$shard_dir, region$name, safe_name(species)), + header = FALSE, unit_predictions = p$unit_predictions + ) - # A province stage is fitted once per species and draw, on the - # draw's province-wide rows, and reused by every region. - province_fits <- function(one_species, entry, boot, draw) { - key <- as.character(boot) + frame <- model_frame( + region$model_data, species = species, + transform = spec$response_transform %||% "identity", + weight_column = region$weight_column + ) - if (!is.null(entry$fits[[key]])) { - return(entry$fits[[key]]) + # A spec may attach per-species columns, and drop rows, + # before fitting: the mammal precomputed climate. + if (is.function(spec$species_frame)) { + frame <- spec$species_frame(frame, species, p$data_dir, spec) } - rows <- match(draw, entry$frame$survey_unit_id) - fitting <- entry$frame[rows[!is.na(rows)], , drop = FALSE] - - fits <- lapply(province$stages, function(stage) { + # Step 2: The draws. Province-wide ones are shared by every + # region and filtered to the region's units when fitted, which + # is how v2 subsets its draws. + draws <- if (!is.null(province$draws)) { + province$draws + } else { tryCatch( - fit_one_stage(stage, fitting, spec, NULL, one_species), - error = function(e) { - list(status = "error", note = conditionMessage(e), - selected = NULL) - } + resample_for_species( + spec, frame, p$iterations, p$data_dir, + seed = seed, species = species + ), + error = function(e) conditionMessage(e) ) - }) - names(fits) <- vapply(province$stages, `[[`, character(1), "name") - - entry$fits[[key]] <- fits - province_cache[[one_species]] <- entry - - fits - } - - for (region in regions) { - region_spec <- spec$regions[[region]] - region_species <- region_queue[[region]] - - if (length(region_species) == 0) { - next } - if (verbose) { - cat( - "\n", spec$taxon, " / ", region, ": ", - length(region_species), " species x ", - length(iterations), " iterations\n", - sep = "" + if (is.character(draws)) { + logs[[region$name]] <- log_all( + region$name, "resample_failed", draws ) + next } - # Step 3: A stage with no models of its own takes the - # region's, which is how one spec fits vegetation types in - # the north and soil types in the south. Covariates are read - # off the resulting formulas, so they differ per region too. - # The v2 formulas name columns as the source files did. Any - # column appearing in more than one block was suffixed by the - # harmonizer, so the names are rewritten here; see - # term_map(). Without it a habitat model asks for HardLin, - # gets a column belonging to another taxon, and reads NA. - rename <- term_map( - data_dir, spec$taxon, region, - block = region_spec$term_block - ) + # Step 3: Every draw, fitting province stages once per draw + outcomes <- lapply(seq_along(p$iterations), function(i) { + boot <- p$iterations[i] + fixed <- NULL - region_spec_stages <- lapply(spec$stages, function(stage) { - # A region that supplies the models may also supply what - # goes with them: the mammal one-hot rule needs each - # candidate's reference category, and the south models - # hold pAspen fixed as well. - if (is.null(stage$models)) { - stage$models <- region_spec$habitat_models - stage$intercept_cats <- region_spec$intercept_cats %||% - stage$intercept_cats - stage$constants <- region_spec$constants %||% stage$constants - stage$extra_covariates <- c( - stage$extra_covariates, region_spec$extra_covariates - ) + if (!is.null(province) && length(p$province$stages) > 0) { + key <- as.character(boot) - # Terms held fixed when predicting onto the grid can be - # added per region: v2 predicts the south at pAspen = 0. - if (!is.null(region_spec$grid_constants)) { - stage$grid_constants <- c( - stage$grid_constants %||% list(), - region_spec$grid_constants + if (is.null(province_fits[[key]])) { + province_fits[[key]] <<- fit_province_stages( + p$province$stages, province$frame, draws[[i]], spec, + species ) } + + fixed <- province_fits[[key]] } - stage$models <- apply_term_map( - get_model_set(stage$models), rename + run_one_draw( + spec = region$spec, frame = frame, draw = draws[[i]], + store = shard, species = species, region = region$name, + boot = boot, grid = region$grid, metrics = p$metrics, + fixed = fixed, + # The province-wide frame, for validation that scores + # climate over every unit + validation_frame = province$frame ) - - stage }) - region_spec_full <- spec - region_spec_full$stages <- region_spec_stages - covariates <- spec_covariates(region_spec_full) - - # A region may weight its models by a column of its own: v2 - # weights the bird landcover models by vegw in the north and - # soilw in the south. - weight_column <- region_spec$weight_column %||% spec$weight_column - - # An alias is made from a column already loaded, so it is - # not itself a covariate to read. - covariates <- setdiff( - covariates, - c(names(spec$aliases), unlist(spec$aliases)) - ) + logs[[region$name]] <- do.call(rbind, outcomes) + } - # A precomputed resampling scheme keys its stored ids on a - # column of its own, so that column is loaded as well. - if (!is.null(spec$resample$id_column)) { - covariates <- unique(c(covariates, spec$resample$id_column)) - } + do.call(rbind, logs) +} - # A region filter that names a covariate has to load it too. - # Birds select their region on useNorth and useSouth, which - # no model formula mentions. Site fields are already loaded - # and are dropped from the request. - if (!is.null(region_spec$filter)) { - filter_terms <- all.vars(region_spec$filter) - site_supplied <- c( - "lat", "long", "easting", "northing", "nr", "nsr", "luf", "year", - "lured", "location", "summer_days", "winter_days", - "survey_unit_id" - ) - covariates <- unique(c( - covariates, setdiff(filter_terms, site_supplied) - )) - } +## 4.5 fit_province_stages() ---- - # Step 4: Load once for the region, then cut per species - model_data <- build_model_data( - taxon = spec$taxon, - data_dir = data_dir, - species = region_species, - covariates = covariates, - region = region, - region_filter = region_spec$filter, - weight_column = weight_column, - aliases = spec$aliases %||% list() +#' Fit the Province-Scope Stages on One Draw +#' +#' @param stages List of province-scope stages. +#' @param frame The species' province-wide frame. +#' @param draw Character vector of survey unit ids. +#' @param spec The taxon spec. +#' @param species Character. +#' @return A named list of fit_one_stage() results. +#' +#' @example # Example usage of the function +#' # fit_province_stages(stages, frame, draws[[1]], spec, sp) +fit_province_stages <- function(stages, frame, draw, spec, species) { + rows <- match(draw, frame$survey_unit_id) + fitting <- frame[rows[!is.na(rows)], , drop = FALSE] + + fits <- lapply(stages, function(stage) { + tryCatch( + fit_one_stage(stage, fitting, spec, NULL, species), + error = function(e) { + list(status = "error", note = conditionMessage(e), + selected = NULL) + } ) + }) - store <- result_store(file.path(run_dir, region)) - - # The grid's columns are renamed to match, but its rownames - - # the habitat type names the coefficients are reported under - # - are left as v2 wrote them. - grid <- load_prediction_grid(data_dir, region_spec$grid) - - if (!is.null(grid)) { - names(grid) <- apply_term_map(names(grid), rename) - - # A region may leave rows or columns of the grid out, as v2 - # drops the mammal north's WetlandMargin and Climate rows. - grid <- grid[ - !rownames(grid) %in% region_spec$grid_drop_rows, - !names(grid) %in% region_spec$grid_drop_cols, - drop = FALSE - ] - } - - for (one_species in region_species) { - frame <- model_frame( - model_data, - species = one_species, - transform = spec$response_transform %||% "identity", - weight_column = weight_column - ) + stats::setNames(fits, vapply(stages, `[[`, character(1), "name")) +} - # A spec may attach per-species columns, and drop rows, - # before fitting: the mammal precomputed climate. - if (is.function(spec$species_frame)) { - frame <- spec$species_frame(frame, one_species, data_dir, spec) - } +# 5. Fitting one draw ---- - # Step 5: The draws. Province-wide ones are shared by every - # region, and filtered to the region's units when fitted, - # which is how v2 subsets its draws. A species whose draws - # cannot be made is logged and skipped, not fatal. - entry <- if (is.null(province)) { - NULL - } else { - province_for_species(one_species) - } +## 5.1 run_stage() ---- - draws <- if (!is.null(entry) && province$draws) { - entry$draws - } else { - tryCatch( - resample_for_species( - spec, model_data, frame, iterations, data_dir, - seed = species_seed(base_seed, spec$taxon, one_species), - species = one_species - ), - error = function(e) conditionMessage(e) - ) - } - - if (is.character(draws)) { - log_outcome(one_species, region, "resample_failed", draws) - next - } +#' Fit One Stage on One Draw +#' +#' @param stage A stage definition from a spec. +#' @param data A data frame for one species and one draw. +#' @param spec The taxon spec. +#' @param offset Numeric vector or NULL. +#' @param weights Numeric vector or NULL. +#' @param grid A prediction grid, or NULL. +#' @param species Character. Passed to a rule that declares it. +#' @return A selection result. +#' +#' @example # Example usage of the function +#' # run_stage(spec$stages[[1]], d, spec) +run_stage <- function( + stage, data, spec, offset = NULL, weights = NULL, + grid = NULL, species = NA_character_ +) { + models <- get_model_set(stage$models) + response <- spec$response_name %||% "response" - for (i in seq_along(iterations)) { - fixed <- if (!is.null(entry) && - length(province$stages) > 0) { - province_fits(one_species, entry, iterations[i], - draws[[i]]) - } else { - NULL - } + # A staged rule takes groups of formulas; the others take a + # flat list. Both arrive here as text and become formulas now. + as_formulas <- function(x) { + if (is.list(x)) { + return(lapply(x, as_formulas)) + } - outcome <- run_one_draw( - spec = region_spec_full, frame = frame, - draw = draws[[i]], - units = frame$survey_unit_id, store = store, - species = one_species, region = region, - boot = iterations[i], grid = grid, metrics = metrics, - fixed = fixed, - # The province-wide frame, where there is one, for - # validation that scores climate over every unit - validation_frame = if (is.null(entry)) NULL else entry$frame - ) + lapply(x, stats::as.formula) + } - log_rows[[length(log_rows) + 1]] <- outcome - } + # The offset goes in the formula, not in an argument. An offset + # supplied as an argument is not carried by predict() onto new + # data: R silently recycles the fitted offset against the new + # rows, which for birds would make every prediction outside the + # draw wrong. v2 writes `offset(offset)` for the same reason. + # + # A stage may start every candidate from terms of its own. v2's + # bird landcover selection starts from `count ~ climate`, so + # each group updates a model that already carries the climate + # stage. + base <- stats::as.formula(paste( + response, "~", paste(c("1", stage$base_terms), collapse = " + "), + if (is.null(offset)) "" else "+ offset(offset)" + )) - if (verbose) { - cat(".") - } - } + # Every stage field the rule declares as an argument is passed + # to it by name, so a new rule's settings need no change here. + rule <- if (is.function(stage$selection)) { + stage$selection + } else { + get_method("selection", stage$selection) + } - if (verbose) { - cat("\n") - } + core <- c( + "models", "base", "data", "engine", "family", "weights", + "offset", "ic", "control" + ) + settings <- stage[ + setdiff(intersect(names(stage), names(formals(rule))), core) + ] - write_meta(store, list( - taxon = spec$taxon, - region = region, - # Mammal specs are fitted per season and per hurdle part, - # and the comparison needs both to find the right - # reference. NA for every other taxon. - season = spec$season %||% NA_character_, - part = spec$part %||% NA_character_, - species_n = length(region_species), - iterations = length(iterations), - stages = vapply(spec$stages, function(s) s$name, character(1)), - stage_scope = vapply( - spec$stages, function(s) s$scope %||% "region", character(1) - ), - engines = vapply( - spec$stages, function(s) s$engine, character(1) - ), - selection = vapply( - spec$stages, - function(s) if (is.function(s$selection)) "custom" else s$selection, - character(1) - ), - covariates = covariates, - weight_column = weight_column %||% NA_character_, - resample_scheme = spec$resample$scheme, - resample_scope = spec$resample$scope %||% "region", - # The seed actually used, never a default that was not. - # Per-species seeds are derived from this base; see - # species_seed(). - seed = if (draws_seeded) { - paste0(base_seed, " (per species, via species_seed())") - } else if (spec$resample$scheme == "precomputed") { - "not used (precomputed draws)" - } else { - "unseeded" - }, - grid = region_spec$grid %||% NA_character_, - models_overridden = spec$models_overridden %||% NA_character_, - v2_coverage = if (is.null(spec$v2_coverage)) { - NA_character_ - } else { - paste0( - names(spec$v2_coverage), ": ", - vapply(spec$v2_coverage, `[[`, character(1), "status") - ) - }, - spec_notes = spec$notes %||% NA_character_ - )) + if (!is.null(settings$intercept_cats)) { + settings$intercept_cats <- get_model_set(settings$intercept_cats) } - do.call(rbind, log_rows) + do.call(selection_run, c( + list( + rule = stage$selection, + models = as_formulas(models), + base = base, + data = data, + engine = get_engine(stage$engine), + family = stage$family %||% spec$family, + weights = weights, + offset = NULL, + ic = stage$ic %||% "AICc", + control = stage$control %||% list() + ), + settings, + # Supplied by the harness rather than the stage, and passed + # only to a rule that declares them + list( + grid = grid, + species = species, + stage = stage, + calibrate_against = if (isTRUE(stage$calibrate)) { + data[[response]] + } else { + NULL + } + ) + )) } -# 6. run_one_draw() ---- - -## 6.1 fit_one_stage() ---- +## 5.2 fit_one_stage() ---- #' Prepare One Stage's Data and Fit It #' @@ -799,21 +862,18 @@ fit_one_stage <- function(stage, fitting, spec, grid = NULL, # A stage may read the response differently from the spec's # default; recomputed from the retained raw values. - if (!is.null(stage$response_transform)) { - raw_name <- paste0(response_name, "_raw") + raw_name <- paste0(response_name, "_raw") - if (raw_name %in% names(stage_data)) { - stage_data[[response_name]] <- apply_response_transform( - stage_data[[raw_name]], stage$response_transform, - stage_data - ) - } + if (!is.null(stage$response_transform) && + raw_name %in% names(stage_data)) { + stage_data[[response_name]] <- apply_response_transform( + stage_data[[raw_name]], stage$response_transform, stage_data + ) } # A stage may fit on a subset: the mammal abundance half is - # estimated from the units where the species was actually - # seen, because abundance given presence is not defined where - # there was none. + # estimated from the units where the species was seen, because + # abundance given presence is not defined where there was none. if (!is.null(stage$row_filter)) { keep <- stage$row_filter(stage_data) keep[is.na(keep)] <- FALSE @@ -858,48 +918,44 @@ fit_one_stage <- function(stage, fitting, spec, grid = NULL, return(failed("stage_failed")) } - # A stage may reshape its coefficients after selection with - # steps its spec supplies, applied in order: the plant stand-age - # splines and cutblock convergence. Each takes and returns the - # selection result, and sees the stage's data. They run before - # the footprint pooling below, which is v2's order: the pooling - # borrows from a spline-fitted age class. + # A stage may reshape its result after selection with steps its + # spec supplies, applied in order: the plant stand-age splines, + # cutblock convergence and footprint pooling. Each takes and + # returns the selection result, and sees the stage's data. for (step in stage$post_process) { selected <- step(selected, stage_data) } - # v2 pools a few poorly sampled footprint coefficients with - # types they are assumed to resemble. Applied after the - # averaging, as v2 does, and only where a stage asks. - if (isTRUE(stage$coef_adjust)) { - selected$coefficients <- coef_adjust_plant_veg( - selected$coefficients - ) - } - list(status = "ok", note = NA_character_, selected = selected) } -## 6.2 carry_values() ---- +## 5.3 carry_values() ---- #' The Value a Stage Hands the Next One #' -#' Computed from the averaged coefficients, not from the best +#' Computed from the stage's final model, not from its best #' single candidate: the averaging is the point of the stage. +#' Where the stage has coefficients that is the averaged +#' coefficients applied to the data, exactly as v2 computes it; +#' an engine without coefficients carries its final model's +#' prediction instead. #' -#' @param coefficients A data frame of term and estimate. +#' @param selected A selection result. #' @param data The rows to compute it for. #' @param stage The stage being carried. #' @return A numeric vector, one per row. #' #' @example # Example usage of the function -#' # carry_values(selected$coefficients, fitting, stage) -carry_values <- function(coefficients, data, stage) { - link <- predict_from_coefficients(coefficients, data, "link") +#' # carry_values(selected, fitting, stage) +carry_values <- function(selected, data, stage) { + link <- if (!is.null(selected$coefficients)) { + predict_from_coefficients(selected$coefficients, data, "link") + } else { + selected$predict(data, "link") + } - # v2's bird climate is predicted from the fitted models, whose - # linear predictor includes the QPAD offset, so the landcover - # model sees the expected count rather than the rate. + # v2's bird climate is carried without the QPAD offset, as + # MuMIn predicts it; a stage can ask for the offset to be added. if (isTRUE(stage$carry_offset) && "offset" %in% names(data)) { link <- link + data$offset } @@ -917,17 +973,16 @@ carry_values <- function(coefficients, data, stage) { ) } -## 6.3 run_one_draw() ---- +## 5.4 run_one_draw() ---- #' Fit Every Stage on One Species and One Draw #' -#' @param spec A taxon spec. -#' @param frame The full one-species frame. +#' @param spec A taxon spec, with the region's stages. +#' @param frame The full one-species frame for the region. #' @param draw Character vector of survey unit ids in the draw. -#' Ids not in `units` are dropped, so a province-wide draw +#' Ids not in the frame are dropped, so a province-wide draw #' passed to one region keeps only that region's units, with #' their repeats, as v2 filters its draws. -#' @param units Character vector of the frame's survey unit ids. #' @param store A result_store(). #' @param species,region Character. #' @param boot Integer. @@ -935,15 +990,16 @@ carry_values <- function(coefficients, data, stage) { #' @param metrics Character vector of metric names, or NULL. #' @param fixed Named list of fit_one_stage() results for stages #' already fitted at province scope, or NULL. -#' @param validation_frame The province-wide frame, or NULL; passed -#' to the spec's `validate` function, which scores climate over -#' every unit. +#' @param validation_frame The province-wide frame, or NULL; +#' passed to the spec's `validate` function, which scores +#' climate over every unit. #' @return A one-row data frame recording the outcome. #' #' @example # Example usage of the function -#' # run_one_draw(spec, frame, draw, units, store, sp, "north", 1) +#' # run_one_draw(spec, frame, draw, store, sp, "north", 1, grid, +#' # NULL) run_one_draw <- function( - spec, frame, draw, units, store, species, region, boot, grid, + spec, frame, draw, store, species, region, boot, grid, metrics, fixed = NULL, validation_frame = NULL ) { outcome <- function(status, note = NA_character_) { @@ -954,7 +1010,7 @@ run_one_draw <- function( ) } - rows <- match(draw, units) + rows <- match(draw, frame$survey_unit_id) rows <- rows[!is.na(rows)] if (length(rows) == 0) { @@ -964,6 +1020,7 @@ run_one_draw <- function( fitting <- frame[rows, , drop = FALSE] response_name <- spec$response_name %||% "response" + # Step 1: Fit the stages in order result <- tryCatch({ carried <- NULL last <- NULL @@ -973,9 +1030,9 @@ run_one_draw <- function( # A stage that carries the previous one forward gets it as # a column, which is how v2's habitat models take Climate if (!is.null(stage$carry_from) && !is.null(carried)) { - fitting[[stage$carry_from_as %||% "Climate"]] <- - carried$fitting - frame[[stage$carry_from_as %||% "Climate"]] <- carried$full + column <- stage$carry_from_as %||% "Climate" + fitting[[column]] <- carried$fitting + frame[[column]] <- carried$full } # A province-scope stage was fitted once for the species @@ -994,34 +1051,30 @@ run_one_draw <- function( if (!is.null(stage$carry_as)) { carried <- list( - fitting = carry_values(selected$coefficients, fitting, stage), - full = carry_values(selected$coefficients, frame, stage) + fitting = carry_values(selected, fitting, stage), + full = carry_values(selected, frame, stage) ) } # Every stage's coefficients are kept, not only the last, # so each stage can be compared against its own v2 - # reference. They are written only once the whole draw - # succeeds, so a store never holds half a draw. - # A rule with several outputs - the mammal hurdle's - # presence, abundance and total tables - writes each as its - # own stage, `_`. + # reference. A rule with several outputs - the mammal + # hurdle's presence, abundance and total tables - writes + # each as its own stage, `_`. if (!is.null(selected$outputs)) { for (output in names(selected$outputs)) { - stage_coefficients[[paste(stage$name, output, sep = "_")]] <- - selected$outputs[[output]] + key <- paste(stage$name, output, sep = "_") + stage_coefficients[[key]] <- selected$outputs[[output]] } } else { stage_coefficients[[stage$name]] <- selected$coefficients } - last <- list( - selected = selected, engine = get_engine(stage$engine), - stage = stage - ) + last <- list(selected = selected, stage = stage) } last$stage_coefficients <- stage_coefficients + last$frame <- frame last }, error = function(e) { @@ -1032,8 +1085,25 @@ run_one_draw <- function( return(result) } - # Step 1: Record every stage's coefficients, then the final - # stage's predictions + frame <- result$frame + + # Step 2: The final model's prediction at every unit. A spec + # may state its own final model, as the plant specs state v2's. + predicted <- tryCatch( + if (is.function(spec$final_prediction)) { + spec$final_prediction(result$stage_coefficients, frame) + } else { + result$selected$predict(frame, "response") + }, + error = function(e) NULL + ) + + if (is.null(predicted) || length(predicted) != nrow(frame)) { + return(outcome("predict_failed", result$stage$name)) + } + + # Written only once the whole draw succeeded, so a store never + # holds half a draw for (stage_name in names(result$stage_coefficients)) { write_coefficients( store, species, region, boot, @@ -1042,24 +1112,17 @@ run_one_draw <- function( ) } - predicted <- result$engine$predict( - result$selected$fit, frame, "response" - ) - - if (is.null(predicted)) { - return(outcome("predict_failed", result$stage$name)) - } + in_bag <- frame$survey_unit_id %in% draw write_unit_predictions( store, species, region, boot, frame$survey_unit_id, - predicted, frame[[response_name]] + predicted, frame[[response_name]], in_bag = in_bag ) - # Metrics are scored twice: on the units the draw fitted - # (in-sample) and on the units it left out (out-of-bag), which - # is the held-out read. Iteration 1 is the full data and has no - # out-of-bag units, so its out-of-bag metrics are NA. - in_bag <- frame$survey_unit_id %in% draw + # Step 3: Score twice: on the units the draw fitted (in-sample) + # and on the units it left out (out-of-bag), the held-out read. + # Iteration 1 is the full data and has no out-of-bag units, so + # its out-of-bag metrics are NA. scored <- function(keep, prefix) { out <- compute_metrics( frame[[response_name]][keep], predicted[keep], metrics @@ -1084,18 +1147,20 @@ run_one_draw <- function( error = function(e) NULL ) - if (!is.null(extra)) { - metric_rows <- rbind(metric_rows, extra) - } + metric_rows <- rbind(metric_rows, extra) } write_metrics(store, species, region, boot, metric_rows) - # Step 2: Project onto the prediction grid, the quantity that - # makes engines comparable + # Step 4: Project the final model onto the prediction grid, the + # quantity that makes engines comparable if (!is.null(grid)) { grid_prediction <- predict_grid( - result$selected, result$engine, grid + result$selected, grid, + constants = c( + result$stage$constants %||% list(), + result$stage$grid_constants %||% list() + ) ) if (!is.null(grid_prediction)) { @@ -1109,191 +1174,116 @@ run_one_draw <- function( outcome("ok") } -# 7. resample_for_species() ---- +# 6. Writing the stores ---- + +## 6.1 merge_spec_shards() ---- -#' Draw the Resampling Sets for One Species +#' Join a Spec's Shards into One Store per Region #' -#' @param spec A taxon spec. -#' @param model_data From build_model_data(). Kept for the -#' signature; the draws are made from `frame`, which carries the -#' same covariates and may have dropped rows. -#' @param frame The one-species frame, one row per unit that -#' can be drawn. -#' @param iterations Integer vector. -#' @param data_dir Character. -#' @param seed Integer or NULL. This species' seed, from -#' species_seed(). Replaces any seed in the spec; NULL leaves -#' the draw unseeded. -#' @param species Character. Names the stored draws where they -#' are kept per species. -#' @return A list of character vectors of survey unit ids. +#' Shards are joined in the region's queue order, so each store +#' holds its rows in the order a serial run writes them. The +#' store's meta.json is written here, and the shards removed. +#' +#' @param p A prepare_spec() result. +#' @return NULL, invisibly. #' #' @example # Example usage of the function -#' # resample_for_species(spec, md, frame, 1:10, data_dir, -#' # seed = 123L, species = "Physcia.adscendens") -resample_for_species <- function( - spec, model_data, frame, iterations, data_dir, seed = NULL, - species = NULL -) { - scheme <- spec$resample$scheme +#' # merge_spec_shards(prepared$lichen) +merge_spec_shards <- function(p) { + for (region in p$regions) { + store <- result_store( + file.path(p$run_dir, region$name), + unit_predictions = p$unit_predictions + ) - # The spec's seed is a base, not a species seed, so it is - # dropped here and the derived one passed instead. `scope` is - # read by run_spec(), not by a resampler. - args <- spec$resample[ - setdiff(names(spec$resample), c("scheme", "seed", "scope")) - ] + merge_result_shards( + store, + file.path(p$shard_dir, region$name, safe_name(region$species)) + ) - if (scheme == "precomputed") { - return(do.call(resample_precomputed, c( - list( - data_dir = data_dir, taxon = spec$taxon, - iterations = iterations, frame = frame, - species = species - ), - args - ))) + write_meta(store, run_meta(p, region)) } - if (scheme == "spatial_block") { - response <- frame[[spec$response_name %||% "response"]] - - # v2 redraws a sample only when the full data could meet the - # threshold in at least one model region; otherwise it takes - # the first draw. Checked per region, on the full data. - if (!is.null(args$min_detections) && args$min_detections > 0) { - viable <- any(vapply(spec$regions, function(one) { - # A region whose filter names columns this frame lacks - - # another region's, when the draw is not province-wide - - # cannot be judged here, and does not count. - if (!is.null(one$filter) && - !all(all.vars(one$filter) %in% names(frame))) { - return(FALSE) - } - - in_region <- if (is.null(one$filter)) { - rep(TRUE, nrow(frame)) - } else { - keep <- eval(rlang_f_rhs(one$filter), frame) - !is.na(keep) & keep - } + unlink(p$shard_dir, recursive = TRUE) - sum(response[in_region] > 0, na.rm = TRUE) >= - args$min_detections - }, logical(1))) - - if (!viable) { - args$min_detections <- 0L - } - } - - return(do.call(resample_spatial_block, c( - # `seed = NULL` is passed through deliberately: it means - # unseeded, not the resampler's harness_seed() default. - list( - frame = frame, iterations = iterations, - response = response, seed = seed - ), - args - ))) - } - - do.call(resample_units, c( - list( - scheme = scheme, frame = frame, - iterations = iterations, seed = seed - ), - args - )) + invisible(NULL) } -# 8. Helpers ---- +## 6.2 run_meta() ---- -## 8.1 `%||%` ---- - -#' Default for NULL +#' What a Region Store Records About Its Run #' -#' @param a,b Any values. -#' @return `a` unless it is NULL, in which case `b`. +#' @param p A prepare_spec() result. +#' @param region A prepare_region() result. +#' @return A named list for write_meta(). #' #' @example # Example usage of the function -#' # NULL %||% "default" -`%||%` <- function(a, b) { - if (is.null(a)) b else a -} - -## 8.2 v2_status() ---- +#' # run_meta(prepared$lichen, prepared$lichen$regions$north) +run_meta <- function(p, region) { + spec <- p$spec + stages <- region$spec$stages -#' State How Much of One v2 Stage a Spec Reproduces -#' -#' The entries of a spec's `v2_coverage`. The status vocabulary -#' is fixed, so a typo fails when the spec is built rather than -#' reading as a fourth category in the report. -#' -#' @param status Character. "reproduced", "partial" or -#' "not reproduced". -#' @param note Character. What is and is not reproduced, and why. -#' @return A list of `status` and `note`. -#' -#' @example # Example usage of the function -#' # v2_status("partial", "No age splines.") -v2_status <- function(status, note) { - allowed <- c("reproduced", "partial", "not reproduced") - - if (!is.character(status) || length(status) != 1L || - !status %in% allowed) { - stop( - "v2 status must be one of: ", - paste(allowed, collapse = ", "), ".", - call. = FALSE - ) - } - - if (!is.character(note) || length(note) != 1L || - !nzchar(note)) { - stop("A v2 status needs a one-line note.", call. = FALSE) - } - - list(status = status, note = note) + list( + taxon = spec$taxon, + region = region$name, + # Mammal specs are fitted per season and per hurdle part, and + # the comparison needs both to find the right reference. NA + # for every other taxon. + season = spec$season %||% NA_character_, + part = spec$part %||% NA_character_, + species_n = length(region$species), + iterations = length(p$iterations), + stages = vapply(stages, `[[`, character(1), "name"), + stage_scope = vapply( + stages, function(s) s$scope %||% "region", character(1) + ), + engines = vapply(stages, `[[`, character(1), "engine"), + selection = vapply( + stages, + function(s) { + if (is.function(s$selection)) "custom" else s$selection + }, + character(1) + ), + covariates = region$covariates, + weight_column = region$weight_column %||% NA_character_, + resample_scheme = spec$resample$scheme, + resample_scope = spec$resample$scope %||% "region", + # The seed actually used, never a default that was not + seed = if (spec$resample$scheme == "precomputed") { + "not used (precomputed draws)" + } else if (!is.null(p$base_seed)) { + paste0(p$base_seed, " (per species, via species_seed())") + } else { + "unseeded" + }, + grid = region$grid_name %||% NA_character_, + unit_predictions = p$unit_predictions, + models_overridden = spec$models_overridden %||% NA_character_, + v2_coverage = if (is.null(spec$v2_coverage)) { + NA_character_ + } else { + paste0( + names(spec$v2_coverage), ": ", + vapply(spec$v2_coverage, `[[`, character(1), "status") + ) + }, + spec_notes = spec$notes %||% NA_character_ + ) } -## 8.3 spec_coverage() ---- +## 6.3 safe_name() ---- -#' Tabulate What a Set of Specs Reproduces of v2 -#' -#' Flattens each spec's `v2_coverage` into one table, which is -#' what the report prints. Coverage is stated once, in the specs, -#' and read from there. +#' Make a Species Name Safe as a Folder Name #' -#' @param specs A named list of specs. -#' @return A data frame of taxon, stage, status and note. +#' @param x Character vector. +#' @return `x` with anything but letters, digits, dots, hyphens +#' and underscores replaced. #' #' @example # Example usage of the function -#' # spec_coverage(list(lichen = lichen_spec())) -spec_coverage <- function(specs) { - rows <- lapply(names(specs), function(key) { - coverage <- specs[[key]]$v2_coverage - - if (is.null(coverage) || length(coverage) == 0) { - return(data.frame( - taxon = key, stage = NA_character_, - status = "not stated", - note = "The spec has no v2_coverage.", - stringsAsFactors = FALSE - )) - } - - data.frame( - taxon = key, - stage = names(coverage), - status = vapply(coverage, `[[`, character(1), "status"), - note = vapply(coverage, `[[`, character(1), "note"), - stringsAsFactors = FALSE, - row.names = NULL - ) - }) - - do.call(rbind, rows) +#' # safe_name("Black Bear") # "Black_Bear" +safe_name <- function(x) { + gsub("[^A-Za-z0-9._-]", "_", x) } # End of script ---- diff --git a/1_code/harness/run_record.R b/1_code/harness/run_record.R index 909b80d..94b6137 100644 --- a/1_code/harness/run_record.R +++ b/1_code/harness/run_record.R @@ -30,14 +30,12 @@ # tables stay aligned and a diff points at the value that # changed rather than at a row that moved. # - What the format guarantees is that identical results -# render identically. It cannot make an unseeded pipeline -# reproduce. The plant-group specs pass `seed = NULL` to -# match v2, so two runs of the same configuration draw -# different bootstrap samples and their Metrics sections -# genuinely differ. Birds resample from stored ids and are -# deterministic. So in a diff between two runs, treat the -# Configuration and Coverage sections as exact and the -# Metrics section as exact only for seeded taxa. +# render identically. It cannot make an unseeded run +# reproduce: with `seed = NULL` (v2's behaviour) two runs of +# the same configuration draw different bootstrap samples +# and their Metrics sections genuinely differ. With a seed - +# the default - and with the birds' stored draws, every +# section is exact. # - File sizes are deliberately not recorded. They vary by a # few bytes between runs that agree, which is noise in a # document whose purpose is comparison. Row counts carry the @@ -178,79 +176,7 @@ kv_lines <- function(values, digits = 4L) { ) } -# 3. discover_stores() ---- - -#' Find the Result Stores Under a Pipeline Directory -#' -#' Stores are laid out as ///. A -#' directory holding none of the result files is not a store and -#' is skipped rather than reported empty. -#' -#' @param pipeline_dir Character. The run's pipeline directory. -#' @return A data frame of dir, taxon and region, ordered -#' deterministically. -#' -#' @example # Example usage of the function -#' # discover_stores("2_pipeline/exp_000_parity_v2") -discover_stores <- function(pipeline_dir) { - empty <- data.frame( - dir = character(0), taxon = character(0), - region = character(0), stringsAsFactors = FALSE - ) - - if (!dir.exists(pipeline_dir)) { - return(empty) - } - - known <- c( - "metrics.csv", "coefficients.csv", "grid_predictions.csv", - "unit_predictions.csv", "meta.json" - ) - - candidates <- list.dirs(pipeline_dir, recursive = TRUE) - candidates <- setdiff(candidates, pipeline_dir) - - is_store <- vapply( - candidates, - function(one) any(file.exists(file.path(one, known))), - logical(1) - ) - - candidates <- candidates[is_store] - - if (length(candidates) == 0) { - return(empty) - } - - # Stripped by length rather than by a regex on the path. - # tempdir() returns backslashes on Windows while list.dirs() - # returns forward slashes, so a pattern built from the raw - # path silently fails to match, and every store is then filed - # under a taxon named after the drive. - normalise <- function(x) { - normalizePath(x, winslash = "/", mustWork = FALSE) - } - - root <- sub("/+$", "", normalise(pipeline_dir)) - relative <- substring(normalise(candidates), nchar(root) + 2L) - - parts <- strsplit(relative, "/") - - out <- data.frame( - dir = candidates, - taxon = vapply(parts, function(p) p[1], character(1)), - region = vapply( - parts, - function(p) if (length(p) > 1) p[2] else NA_character_, - character(1) - ), - stringsAsFactors = FALSE - ) - - out[order(out$taxon, out$region), , drop = FALSE] -} - -# 4. run_record() ---- +# 3. run_record() ---- #' Write the Committed Record of One Run #' @@ -267,6 +193,9 @@ discover_stores <- function(pipeline_dir) { #' of the same configuration, which is what makes a diff #' between experiments readable. #' @param digits Integer. Decimal places for every number. +#' @param collected The result of collect_results() for this +#' pipeline directory, or NULL to read the stores here. Passing +#' it saves reading every store a second time. #' @return The path written, invisibly. #' #' @example # Example usage of the function @@ -280,9 +209,12 @@ run_record <- function( exp_id, config = list(), provenance = TRUE, - digits = 4L + digits = 4L, + collected = NULL ) { - stores <- discover_stores(pipeline_dir) + if (is.null(collected)) { + collected <- collect_results(pipeline_dir) + } lines <- c( paste("# Run record:", exp_id), @@ -294,7 +226,7 @@ run_record <- function( "" ) - ## 4.1 Provenance ---- + ## 3.1 Provenance ---- # Everything that differs between two identical runs lives # here and nowhere else, so the rest of the file diffs clean. if (provenance) { @@ -325,49 +257,24 @@ run_record <- function( ) } - ## 4.2 Configuration ---- + ## 3.2 Configuration ---- lines <- c( lines, "## Configuration", "", kv_lines(config, digits), "" ) - ## 4.3 Coverage and artefacts ---- + ## 3.3 Coverage and artefacts ---- # The inventory. Row counts rather than file sizes: both say # what was produced, only one is stable between runs. - coverage <- NULL - metrics_all <- list() - - if (nrow(stores) > 0) { - rows <- lapply(seq_len(nrow(stores)), function(i) { - dir_one <- stores$dir[i] - coefficients <- read_results(dir_one, "coefficients") - metrics <- read_results(dir_one, "metrics") - grid <- read_results(dir_one, "grid_predictions") - - if (!is.null(metrics) && nrow(metrics) > 0) { - metrics$taxon <- stores$taxon[i] - metrics$region <- stores$region[i] - metrics_all[[dir_one]] <<- metrics - } - - data.frame( - taxon = stores$taxon[i], - region = stores$region[i], - species = length(unique(c( - coefficients$species, metrics$species - ))), - draws = length(unique(c(coefficients$boot, metrics$boot))), - coefficient_rows = if (is.null(coefficients)) { - 0L - } else { - nrow(coefficients) - }, - metric_rows = if (is.null(metrics)) 0L else nrow(metrics), - grid_rows = if (is.null(grid)) 0L else nrow(grid), - stringsAsFactors = FALSE - ) - }) - - coverage <- do.call(rbind, rows) + coverage <- collected$store_rows + + if (!is.null(coverage)) { + names(coverage)[names(coverage) == "run"] <- "taxon" + coverage <- coverage[order(coverage$taxon, coverage$region), ] + coverage$coefficient_rows <- as.integer(coverage$coefficient_rows) + coverage$metric_rows <- as.integer(coverage$metric_rows) + coverage$grid_rows <- as.integer(coverage$grid_rows) + coverage$species <- as.integer(coverage$species) + coverage$draws <- as.integer(coverage$draws) } lines <- c( @@ -375,58 +282,24 @@ run_record <- function( md_table(coverage, digits), "" ) - ## 4.4 Metrics ---- - # One row per taxon, region and metric, ordered so that two - # records line up row for row. + ## 3.4 Metrics ---- + # One row per run, region and metric, pooled over species and + # draws, ordered so that two records line up row for row. metric_summary <- NULL - if (length(metrics_all) > 0) { - combined <- do.call(rbind, metrics_all) - - split_key <- interaction( - combined$taxon, combined$region, combined$metric, - drop = TRUE - ) - - metric_summary <- do.call(rbind, lapply( - split(combined, split_key), - function(block) { - values <- block$value[is.finite(block$value)] - - data.frame( - taxon = block$taxon[1], - region = block$region[1], - metric = block$metric[1], - n = length(values), - median = if (length(values)) { - stats::median(values) - } else { - NA_real_ - }, - p10 = if (length(values)) { - stats::quantile(values, 0.1, names = FALSE) - } else { - NA_real_ - }, - p90 = if (length(values)) { - stats::quantile(values, 0.9, names = FALSE) - } else { - NA_real_ - }, - stringsAsFactors = FALSE - ) - } - )) - - rownames(metric_summary) <- NULL - - metric_summary <- metric_summary[ - order( - metric_summary$taxon, metric_summary$region, - metric_summary$metric - ), , - drop = FALSE + if (!is.null(collected$metrics) && nrow(collected$metrics) > 0) { + pooled <- as.data.table(collected$metrics)[ + is.finite(value), + list( + n = .N, + median = stats::median(value), + p10 = stats::quantile(value, 0.1, names = FALSE), + p90 = stats::quantile(value, 0.9, names = FALSE) + ), + by = list(taxon = run, region, metric) ] + setorder(pooled, taxon, region, metric) + metric_summary <- as.data.frame(pooled) } lines <- c( @@ -434,7 +307,7 @@ run_record <- function( md_table(metric_summary, digits), "" ) - ## 4.5 Write ---- + ## 3.5 Write ---- # A .txt record drops the table pipes rather than the tables, # so the same content survives in a plain-text reader. if (grepl("[.]txt$", out_file, ignore.case = TRUE)) { diff --git a/1_code/harness/selection.R b/1_code/harness/selection.R index d77255b..0c9b3b3 100644 --- a/1_code/harness/selection.R +++ b/1_code/harness/selection.R @@ -1,68 +1,39 @@ # --- -# title: Model Selection Rules +# title: Selection Plumbing # author: Brendan Casey # created: 2026-09-09 # inputs: none -# outputs: none; returns objects in memory +# outputs: none; defines functions in memory # notes: -# - A selection rule turns a candidate model set into one set of -# coefficients. The three taxa use three different rules, and -# each is registered here so a spec names one rather than -# implementing it. -# - `single` fits one formula. `aic_best` keeps the lowest AICc, -# which is what the mammal models do. `aic_average` weights -# candidates by AICc and averages their coefficients, which is -# what the plant models do. `staged_bic` walks groups of -# formulas, keeping the best of each group as the base for the -# next, which is what the bird models do. +# - A selection rule turns a candidate model set into one result: +# coefficients, a fit, and a predictor for the final model. The +# rules themselves live in 1_code/methods/selection/, one file +# each; this file holds what every rule shares. # - A rule fits its own candidates rather than being handed # fitted objects, because staged selection has to refit as it # goes: each stage updates the previous stage's winner. One # interface then covers both shapes. -# - Every rule returns the same structure, so the fitting loop +# - Every rule returns selection_result(), so the fitting loop # and the result writer do not know which rule ran. -# - Coefficient averaging is over the terms present, treating a -# term absent from a candidate as zero. That is what "this -# model says the effect is nil" means, and it is how the v2 -# plant code assembles its coefficient template. +# - Candidates are fitted through fit_with() (engines.R), which +# computes a fit's coefficients once and keeps them on it. +# Rules read `fit$coefficients` rather than recomputing them, +# which matters for bayesglm, where summary() is slow. # --- # 1. Setup ---- ## 1.1 Load packages ---- -# Base R only; engines.R supplies the fitting and scoring. +# Base R only. -# 2. Selection registry ---- - -## 2.1 selection_registry() ---- - -#' The Available Selection Rules -#' -#' @return A named list of functions, each taking the arguments -#' selection_run() passes. -#' -#' @example # Example usage of the function -#' # names(selection_registry()) -selection_registry <- function() { - list( - single = select_single, - aic_best = select_aic_best, - aic_average = select_aic_average, - staged_bic = select_staged_bic, - ivw_grid = select_ivw_grid, - aic_best_grid = select_aic_best_grid, - aic_best_onehot = select_aic_best_onehot - ) -} - -## 2.2 selection_run() ---- +# 2. selection_run() ---- #' Run One Selection Rule #' #' The single entry point the fitting loop calls. #' -#' @param rule Character, a name in selection_registry(), or a -#' function a spec supplies with the same arguments. +#' @param rule Character, a registered rule name, or a function a +#' spec supplies with the same arguments. #' @param models A list of formulas, or for staged rules a list #' of named groups of formulas. #' @param base A formula the candidates update, e.g. @@ -74,10 +45,12 @@ selection_registry <- function() { #' @param weights,offset Numeric vectors or NULL. #' @param ic Character. "AIC", "AICc" or "BIC". #' @param control Named list passed to the engine. -#' @param ... Passed to the rule, for arguments only some rules -#' take - the prediction grid the ivw_grid rule needs, say. -#' @return A list with `fit`, `coefficients`, `ic_table`, -#' `n_fitted`, `n_failed` and `rule`. +#' @param ... Further arguments. Only those the rule declares are +#' passed, so a stage can carry settings for one rule without +#' another failing on them. +#' @return A selection result; see selection_result(). `rule` is +#' set to the rule's name, and `predict` to a predictor for the +#' final model when the rule did not supply one. #' #' @example # Example usage of the function #' # selection_run("aic_average", models, response ~ 1, d, @@ -98,30 +71,16 @@ selection_run <- function( # A rule is a registered name, or a function a spec supplies # for a model the registry has no shape for: the v2 mammal # hurdle is one. - registry <- selection_registry() - if (is.function(rule)) { rule_fn <- rule rule_name <- "custom" } else { - if (!rule %in% names(registry)) { - stop( - "Unknown selection rule `", rule, "`. Registered: ", - paste(names(registry), collapse = ", "), - call. = FALSE - ) - } - - rule_fn <- registry[[rule]] + rule_fn <- get_method("selection", rule) rule_name <- rule } - # Only pass the extra arguments a rule actually declares, so a - # spec can set a grid for every stage without the rules that - # do not use one failing on it. extra <- list(...) - accepted <- names(formals(rule_fn)) - extra <- extra[names(extra) %in% accepted] + extra <- extra[names(extra) %in% names(formals(rule_fn))] out <- do.call(rule_fn, c( list( @@ -134,6 +93,16 @@ selection_run <- function( out$rule <- rule_name + # A rule that combines candidates supplies its own predictor; + # otherwise the final model is the chosen fit. + if (is.null(out$predict) && !is.null(out$fit)) { + chosen <- out$fit + + out$predict <- function(newdata, type = "response") { + engine$predict(chosen, newdata, type) + } + } + out } @@ -148,7 +117,8 @@ selection_run <- function( #' @param data A data frame. #' @param engine An engine definition. #' @param family,weights,offset,ic,control As in selection_run(). -#' @return A list with `fits`, `formulas` and `scores`. +#' @return A list with `fits`, `formulas` and `scores`. Scores are +#' Inf where the engine has no information criterion. #' #' @example # Example usage of the function #' # fit_candidates(models, response ~ 1, d, engine, "binomial") @@ -166,14 +136,15 @@ fit_candidates <- function( formulas <- lapply(models, function(one) resolve_formula(one, base)) fits <- lapply(formulas, function(f) { - engine$fit( - formula = f, data = data, family = family, - weights = weights, offset = offset, control = control - ) + fit_with(engine, f, data, family, weights, offset, control) }) scores <- vapply( - fits, function(f) engine$ic(f, ic), numeric(1) + fits, + function(f) { + if (engine_has(engine, "ic")) engine$ic(f, ic) else Inf + }, + numeric(1) ) list(fits = fits, formulas = formulas, scores = scores) @@ -204,13 +175,37 @@ resolve_formula <- function(model, base) { model } -## 3.3 candidate_table() ---- +## 3.3 formula_variables() ---- + +#' The Data Columns a Formula Reads +#' +#' Read from the formula rather than from a fitted object, so it +#' works for any engine. The response and the harness-supplied +#' offset and weight are left out: a prediction frame never has +#' to supply them as data. +#' +#' @param formula A formula, or formula text. +#' @return A character vector of column names. +#' +#' @example # Example usage of the function +#' # formula_variables(response ~ MAP + offset(offset)) +formula_variables <- function(formula) { + if (is.character(formula)) { + formula <- stats::as.formula(formula) + } + + setdiff(all.vars(formula), c("response", "offset", "weight")) +} + +## 3.4 candidate_table() ---- #' Summarize a Candidate Set #' #' @param fitted A list from fit_candidates(). #' @param names_in Character vector of candidate names, or NULL. -#' @return A data frame of model, ic, delta, weight, k and ok. +#' @return A data frame of model, formula, ic, delta, weight, k +#' and ok. `k` counts coefficients, NA where the engine has +#' none. #' #' @example # Example usage of the function #' # candidate_table(fitted) @@ -229,7 +224,7 @@ candidate_table <- function(fitted, names_in = NULL) { k <- vapply( fitted$fits, function(f) { - cf <- fit_coefficients(f) + cf <- if (isTRUE(f$ok)) f$coefficients else NULL if (is.null(cf)) NA_integer_ else nrow(cf) }, integer(1) @@ -260,768 +255,93 @@ candidate_table <- function(fitted, names_in = NULL) { ) } -# 4. Selection rules ---- - -## 4.1 select_single() ---- - -#' Fit One Model, No Selection -#' -#' @param models A list holding one formula, or a single formula. -#' @param base,data,engine,family,weights,offset,ic,control As in -#' selection_run(). -#' @return A selection result. -#' -#' @example # Example usage of the function -#' # select_single(list(. ~ . + MAP), response ~ 1, d, engine, -#' # "binomial") -select_single <- function( - models, base, data, engine, family, - weights = NULL, offset = NULL, ic = "AICc", control = list() -) { - if (inherits(models, "formula")) { - models <- list(models) - } - - fitted <- fit_candidates( - models[1], base, data, engine, family, weights, offset, ic, - control - ) - - selection_result( - fit = fitted$fits[[1]], - coefficients = fit_coefficients(fitted$fits[[1]]), - ic_table = candidate_table(fitted), - fitted = fitted - ) -} +# 4. Combining predictions ---- -## 4.2 select_aic_best() ---- +## 4.1 family_linkinv() ---- -#' Keep the Single Best-Scoring Candidate -#' -#' The mammal rule. +#' The Inverse Link of a Family #' -#' @inheritParams select_single -#' @return A selection result. +#' @param family Character (e.g. "binomial") or a family object. +#' @return A function from the link scale to the response scale. #' #' @example # Example usage of the function -#' # select_aic_best(models, response ~ 1, d, engine, "binomial") -select_aic_best <- function( - models, base, data, engine, family, - weights = NULL, offset = NULL, ic = "AICc", control = list() -) { - fitted <- fit_candidates( - models, base, data, engine, family, weights, offset, ic, - control - ) - - table <- candidate_table(fitted) - - if (!any(table$ok)) { - return(selection_result(NULL, NULL, table, fitted)) +#' # family_linkinv("poisson")(0) +family_linkinv <- function(family) { + if (is.character(family)) { + family <- get(family, mode = "function")() } - winner <- which.min(fitted$scores) - - selection_result( - fit = fitted$fits[[winner]], - coefficients = fit_coefficients(fitted$fits[[winner]]), - ic_table = table, - fitted = fitted - ) + family$linkinv } -## 4.3 select_aic_average() ---- +## 4.2 combined_predictor() ---- -#' Average Candidates by Information-Criterion Weight +#' A Predictor That Averages Several Fits on the Link Scale #' -#' The plant rule. Coefficients are averaged across candidates -#' with Akaike weights, treating a term absent from a candidate -#' as zero - that model's statement that the effect is nil. +#' What a rule that combines candidates returns as `predict`, so +#' the final model scored and projected onto a grid is the +#' combined one, not the best single candidate. #' -#' @inheritParams select_single -#' @return A selection result. `fit` is the best single candidate, -#' kept so that predictions onto new data remain possible; -#' `coefficients` are the averaged ones. -#' -#' @example # Example usage of the function -#' # select_aic_average(models, response ~ 1, d, engine, -#' # "binomial") -select_aic_average <- function( - models, base, data, engine, family, - weights = NULL, offset = NULL, ic = "AICc", control = list() -) { - fitted <- fit_candidates( - models, base, data, engine, family, weights, offset, ic, - control - ) - - table <- candidate_table(fitted) - - if (!any(table$ok) || sum(table$weight) == 0) { - return(selection_result(NULL, NULL, table, fitted)) - } - - # Step 1: Collect every term any candidate estimated - per_model <- lapply(fitted$fits, fit_coefficients) - terms <- unique(unlist(lapply(per_model, function(x) x$term))) - - # Step 2: Weighted mean per term, absent terms counting as zero - averaged <- do.call(rbind, lapply(terms, function(term) { - estimate <- 0 - variance <- 0 - - for (i in seq_along(per_model)) { - cf <- per_model[[i]] - w <- table$weight[i] - - if (is.null(cf) || w == 0) { - next - } - - # A term the candidate lacks, or estimated as NA because it - # is aliased, counts as zero, as in MuMIn's full average. - row <- match(term, cf$term) - absent <- is.na(row) || is.na(cf$estimate[row]) - value <- if (absent) 0 else cf$estimate[row] - se <- if (absent) 0 else cf$se[row] - - estimate <- estimate + w * value - variance <- variance + w * ifelse(is.na(se), 0, se^2) - } - - data.frame( - term = term, - estimate = estimate, - se = sqrt(variance), - stringsAsFactors = FALSE - ) - })) - - selection_result( - fit = fitted$fits[[which.min(fitted$scores)]], - coefficients = averaged, - ic_table = table, - fitted = fitted - ) -} - -## 4.4 select_staged_bic() ---- - -#' Walk Groups of Candidates, Carrying the Winner Forward -#' -#' The bird rule. `models` is a list of named groups. Each group -#' is fitted as an update to the previous group's winner, and the -#' winner is the smallest model within `threshold` of the best -#' score - a parsimony tie-break, not simply the minimum. -#' -#' @inheritParams select_single -#' @param threshold Numeric. How far above the best score a -#' candidate may sit and still be eligible. -#' @param always_advance Logical. TRUE, v2's rule, takes each -#' group's winner as the next base whatever its score; FALSE -#' takes it only when it improves on the running model. -#' @return A selection result, with `ic_table` carrying a `stage` -#' column. -#' -#' @example # Example usage of the function -#' # select_staged_bic(model_groups, response ~ 1, d, engine, -#' # "poisson", ic = "BIC") -select_staged_bic <- function( - models, base, data, engine, family, - weights = NULL, offset = NULL, ic = "BIC", control = list(), - threshold = 2, always_advance = TRUE -) { - # Step 1: Fit the base model. It is the starting point every - # group updates, and the fallback if no group improves on it. - current <- engine$fit( - formula = base, data = data, family = family, - weights = weights, offset = offset, control = control - ) - current_formula <- base - tables <- list() - - if (!isTRUE(current$ok)) { - return(selection_result( - NULL, NULL, - data.frame( - stage = "base", model = "base", formula = deparse(base), - ic = Inf, delta = NA_real_, weight = 0, k = NA_integer_, - ok = FALSE, stringsAsFactors = FALSE - ), - NULL - )) - } - - group_names <- names(models) - - if (is.null(group_names)) { - group_names <- paste0("stage_", seq_along(models)) - } - - # Step 2: Each group updates the running winner - for (i in seq_along(models)) { - fitted <- fit_candidates( - models[[i]], current_formula, data, engine, family, - weights, offset, ic, control - ) - - table <- candidate_table(fitted) - table$stage <- group_names[i] - tables[[i]] <- table - - eligible <- which(table$ok & is.finite(fitted$scores)) - - if (length(eligible) == 0) { - next - } - - # Step 3: Among candidates within `threshold` of the best, - # take the one with fewest parameters. This is a parsimony - # rule, and it is why the winner is not simply which.min(). - best <- min(fitted$scores[eligible]) - close <- eligible[fitted$scores[eligible] <= best + threshold] - winner <- close[which.min(table$k[close])] - - # Step 4: Carry the group's winner forward. v2 always does, - # even when it scores worse than the model it updated - # (07.ModelLandcover.R, section 14); `always_advance = FALSE` - # keeps the running model instead unless the group improves - # on it. - if (always_advance || - fitted$scores[winner] < engine$ic(current, ic)) { - current <- fitted$fits[[winner]] - current_formula <- fitted$formulas[[winner]] - } - } - - selection_result( - fit = current, - coefficients = fit_coefficients(current), - ic_table = do.call(rbind, tables), - fitted = NULL, - formula = current_formula - ) -} - -## 4.5 select_ivw_grid() ---- - -#' Inverse-Variance Average Predictions onto a Grid -#' -#' The plant habitat rule, and the one place where a "coefficient" -#' is not a regression coefficient. v2 fits each candidate, then -#' predicts it onto the prediction matrix - one row per habitat -#' type - and combines those predictions across candidates -#' weighting each by the precision of its own prediction. The -#' result is an effect per habitat type on the link scale, which -#' is what the v2 coefficient tables hold. -#' -#' Weighting by precision rather than by AICc is a different -#' claim: a candidate that is confident about a habitat type -#' dominates there even if it is a poor model overall, and the -#' weighting is per habitat type rather than per model. -#' -#' Non-converged candidates are dropped, not down-weighted, -#' matching v2. A zero standard error is floored at 1e-4, because -#' a precision weight of 1/0 would take the whole average. -#' -#' @inheritParams select_single -#' @param grid A prediction grid, one row per habitat type. -#' @param grid_constants Named list of values for terms the grid -#' has no column for - v2 predicts at `Climate = 0` and, where -#' Protocol is fitted, at the new protocol. -#' @param head_terms Character vector of leading model -#' coefficients to average separately and prepend, which is how -#' v2 carries Intercept, Climate and Protocol. -#' @return A selection result whose `coefficients` are the -#' averaged per-habitat-type effects. +#' @param fits List of engine fits. +#' @param engine An engine definition. +#' @param family Character or family object. +#' @param weights Numeric vector of fixed weights, one per fit, or +#' NULL to weight each prediction by its own precision +#' (inverse-variance), which needs the `se` capability. +#' @return A function(newdata, type = "response") returning a +#' numeric vector. NULL when nothing can predict, or, under +#' fixed weights, when any weighted fit cannot. #' #' @example # Example usage of the function -#' # select_ivw_grid(models, response ~ 1, d, engine, "binomial", -#' # grid = veg_grid, -#' # grid_constants = list(Climate = 0)) -select_ivw_grid <- function( - models, base, data, engine, family, - weights = NULL, offset = NULL, ic = "AICc", control = list(), - grid = NULL, grid_constants = list(), - head_terms = c("Intercept", "Climate") -) { - if (is.null(grid)) { - stop( - "The ivw_grid rule needs a prediction grid; the spec's ", - "region defines one with `grid`.", - call. = FALSE - ) - } - - fitted <- fit_candidates( - models, base, data, engine, family, weights, offset, ic, - control - ) - - table <- candidate_table(fitted) - converged <- vapply(fitted$fits, fit_converged, logical(1)) - - if (!any(converged)) { - return(selection_result(NULL, NULL, table, fitted)) - } - - # Step 1: Predict every converged candidate onto the grid, at - # the constants v2 holds the non-habitat terms at - newdata <- grid - - for (one in names(grid_constants)) { - newdata[[one]] <- grid_constants[[one]] +#' # predict <- combined_predictor(fits, engine, "binomial", w) +#' # predict(newdata) +combined_predictor <- function(fits, engine, family, weights = NULL) { + linkinv <- family_linkinv(family) + + if (!is.null(weights)) { + keep <- weights > 0 + fits <- fits[keep] + weights <- weights[keep] / sum(weights[keep]) } - predictions <- lapply(seq_along(fitted$fits), function(i) { - if (!converged[i]) { + function(newdata, type = "response") { + if (length(fits) == 0) { return(NULL) } - engine$predict(fitted$fits[[i]], newdata, "link", se = TRUE) - }) - - usable <- !vapply(predictions, is.null, logical(1)) - - if (!any(usable)) { - return(selection_result(NULL, NULL, table, fitted)) - } - - estimate <- do.call( - rbind, lapply(predictions[usable], function(x) x$fit) - ) - error <- do.call( - rbind, lapply(predictions[usable], function(x) x$se.fit) - ) - - # A zero standard error would carry infinite weight - error[error == 0] <- 1e-4 + if (is.null(weights)) { + predictions <- lapply(fits, function(f) { + engine$predict(f, newdata, "link", se = TRUE) + }) - grid_coefficients <- ivw_combine(estimate, error) - rownames_out <- rownames(grid) + # Precision weights renormalize by construction, so a + # candidate that cannot predict is left out, as v2 leaves + # out a failed fit + predictions <- predictions[ + !vapply(predictions, is.null, logical(1)) + ] - # Step 2: The leading coefficients are averaged the same way, - # from the model's own coefficient table rather than from a - # prediction - head_estimate <- do.call(rbind, lapply( - which(converged), function(i) { - cf <- fit_coefficients(fitted$fits[[i]]) - cf$estimate[seq_along(head_terms)] - } - )) - head_error <- do.call(rbind, lapply( - which(converged), function(i) { - cf <- fit_coefficients(fitted$fits[[i]]) - cf$se[seq_along(head_terms)] - } - )) - head_error[head_error == 0 | is.na(head_error)] <- 1e-4 - - head_coefficients <- ivw_combine(head_estimate, head_error) - - coefficients <- data.frame( - term = c(head_terms, rownames_out), - estimate = c(head_coefficients$estimate, - grid_coefficients$estimate), - se = c(head_coefficients$se, grid_coefficients$se), - stringsAsFactors = FALSE - ) - - # Step 3: The site-level prediction, averaged the same way. v2 - # keeps it as `data$prediction` and uses it as the offset of - # its stand-age splines. It averages every fitted candidate, - # converged or not; one that failed outright is left out here, - # where v2's would turn the whole average into NaN. - site <- lapply(which(table$ok), function(i) { - engine$predict(fitted$fits[[i]], data, "link", se = TRUE) - }) - site <- site[!vapply(site, is.null, logical(1))] - - site_prediction <- if (length(site) == 0) { - NULL - } else { - site_fit <- do.call(rbind, lapply(site, `[[`, "fit")) - site_se <- do.call(rbind, lapply(site, `[[`, "se.fit")) - colSums(site_fit / site_se^2) / colSums(1 / site_se^2) - } - - result <- selection_result( - fit = fitted$fits[[which.min(fitted$scores)]], - coefficients = coefficients, - ic_table = table, - fitted = fitted - ) - result$site_prediction <- site_prediction - - # Each fitted candidate's own coefficients, for steps that - # average a term the grid does not carry: v2's pAspen. - result$candidate_coefficients <- lapply( - which(table$ok), function(i) fit_coefficients(fitted$fits[[i]]) - ) - - result -} - -## 4.6 ivw_combine() ---- - -#' Combine Estimates by Inverse-Variance Weight -#' -#' @param estimate Matrix of candidates by columns. -#' @param error Matrix of standard errors, the same shape. -#' @return A list of `estimate` and `se`, one per column. -#' -#' @example # Example usage of the function -#' # ivw_combine(rbind(c(1, 2), c(1.2, 2.1)), -#' # rbind(c(0.1, 0.2), c(0.3, 0.1))) -ivw_combine <- function(estimate, error) { - precision <- 1 / error^2 - - # The variance of the combined estimate is the reciprocal of - # the summed precision, not its mean, so adding candidates - # sharpens rather than dilutes it. - list( - estimate = colSums(estimate * precision) / colSums(precision), - se = sqrt(1 / colSums(precision)) - ) -} - -## 4.7 coef_adjust_plant_veg() ---- - -#' Borrow Strength for Poorly Sampled Footprint Types -#' -#' v2's `coef.adjust`. Some human footprint types are rarely the -#' dominant cover at a survey unit, so their effect is estimated -#' from little data. v2 pools each with a type it is assumed to -#' resemble, by inverse-variance weight: -#' -#' - `HardLin` borrows from `UrbInd`. -#' - The three soft linear types - `EnSoftLin`, `EnSeismic` and -#' `TrSoftLin` - each borrow from a composite of young -#' regenerating stands, weighted by how much those stand types -#' overlap soft linear features in the provincial summary. -#' -#' The weights are v2's, measured from a 1 km summary and fixed -#' since 2020-11-17. They are an assumption about which habitats -#' resemble which, not an estimate, so they are stated here -#' rather than derived. -#' -#' @param coefficients A data frame of term, estimate and se. -#' @param overlap Numeric vector of four proportions, for -#' white spruce, pine, deciduous and black spruce regeneration. -#' @return The coefficients, with the four terms adjusted. -#' -#' @example # Example usage of the function -#' # coef_adjust_plant_veg(selected$coefficients) -coef_adjust_plant_veg <- function( - coefficients, - overlap = c(0.049, 0.0893, 0.434, 0.396) -) { - if (is.null(coefficients)) { - return(NULL) - } - - value <- stats::setNames( - coefficients$estimate, coefficients$term - ) - error <- stats::setNames(coefficients$se, coefficients$term) - - # Pool two estimates by precision. - pool <- function(a, a_se, b, b_se) { - precision <- 1 / a_se^2 + 1 / b_se^2 - - list( - estimate = (a / a_se^2 + b / b_se^2) / precision, - se = sqrt(1 / precision) - ) - } - - present <- function(...) { - all(c(...) %in% names(value)) && - all(is.finite(value[c(...)])) && - all(is.finite(error[c(...)])) - } - - # Step 1: Hard linear features borrow from urban and industrial - if (present("HardLin", "UrbInd")) { - pooled <- pool( - value["HardLin"], error["HardLin"], - value["UrbInd"], error["UrbInd"] - ) - value["HardLin"] <- pooled$estimate - error["HardLin"] <- pooled$se - } - - # Step 2: Soft linear features borrow from young regeneration - young_types <- c( - "CCWhiteSpruceR", "CCPineR", "CCDeciduousR", "BlackSpruce1" - ) - - if (present(young_types)) { - weights <- overlap / sum(overlap) - - young <- sum(weights * value[young_types]) - # The weighted variance carries no between-type component, - # because the weights are fixed rather than estimated. - young_se <- sqrt(sum(weights * error[young_types]^2)) - - for (one in c("EnSoftLin", "EnSeismic", "TrSoftLin")) { - if (!present(one)) { - next + if (length(predictions) == 0) { + return(NULL) } - pooled <- pool(value[one], error[one], young, young_se) - value[one] <- pooled$estimate - error[one] <- pooled$se - } - } - - coefficients$estimate <- unname(value[coefficients$term]) - coefficients$se <- unname(error[coefficients$term]) - - coefficients -} - -## 4.8 select_aic_best_grid() ---- - -#' Best Model, Predicted onto a Prediction Grid -#' -#' The mammal abundance-given-presence rule. Where the presence -#' half reads one habitat type at a time from an identity grid, -#' this one predicts the winning model onto the shared prediction -#' matrix, and reports the result on the link scale. -#' -#' No calibration is applied. v2 calibrates the product of the -#' two halves multiplicatively rather than each half separately, -#' because an additive shift on a log-scale abundance can send a -#' small prediction negative and `log` of that is not a number. -#' -#' @inheritParams select_single -#' @param grid A prediction grid. -#' @param constants Named list of values held fixed across the -#' grid - sampling effort and climate. -#' @param scale Character. "link" reports the linear predictor, -#' which for a log-link Gamma is log abundance; "response" -#' exponentiates it. -#' @return A selection result, one effect per grid row. -#' -#' @example # Example usage of the function -#' # select_aic_best_grid(models, response ~ 1, d, engine, -#' # Gamma(link = "log"), grid = grid) -select_aic_best_grid <- function( - models, base, data, engine, family, - weights = NULL, offset = NULL, ic = "AICc", control = list(), - grid = NULL, constants = list(), scale = "link" -) { - if (is.null(grid)) { - stop( - "The aic_best_grid rule needs a prediction grid.", - call. = FALSE - ) - } - - fitted <- fit_candidates( - models, base, data, engine, family, weights, offset, ic, - control - ) - - table <- candidate_table(fitted) - - if (!any(table$ok)) { - return(selection_result(NULL, NULL, table, fitted)) - } - - best <- fitted$fits[[which.min(fitted$scores)]] - - newdata <- grid - - for (one in names(constants)) { - newdata[[one]] <- constants[[one]] - } - - # A grid row describes a pure stand, so a term the grid has no - # column for is genuinely absent rather than unknown. - terms <- attr(stats::terms(best$fit), "term.labels") - - for (one in setdiff(terms, names(newdata))) { - newdata[[one]] <- 0 - } - - predicted <- engine$predict(best, newdata, scale, se = TRUE) - - if (is.null(predicted)) { - return(selection_result(NULL, NULL, table, fitted)) - } - - selection_result( - fit = best, - coefficients = data.frame( - term = rownames(grid), - estimate = predicted$fit, - se = predicted$se.fit, - stringsAsFactors = FALSE - ), - ic_table = table, - fitted = fitted - ) -} - -## 4.9 select_aic_best_onehot() ---- - -#' Best Model, Read One Habitat Type at a Time -#' -#' The mammal presence rule. Unlike the plant habitat stage there -#' is no fixed prediction matrix: v2 reads each effect by setting -#' that one term to 1 and every other to 0, so the grid is an -#' identity over whichever terms the winning model happens to -#' carry. -#' -#' Three things make the result a probability rather than a -#' coefficient: -#' -#' - Each prediction is passed through the logistic, so an effect -#' is the modelled probability of presence in a pure stand of -#' that type. -#' - `Climate` is a slope, not a habitat type, so it is taken -#' from the fitted coefficient rather than from a one-hot -#' prediction, and is left out of the calibration below. -#' - The whole set is shifted on the logit scale so that mean -#' fitted presence matches mean observed presence. Without it -#' the effects are internally consistent but sit at the wrong -#' level. -#' -#' The reference category - the land cover the winning formula -#' omits - is reported alongside the fitted terms, because a -#' coefficient here means "relative to that type" and the table -#' is unreadable without it. -#' -#' @inheritParams select_single -#' @param intercept_cats Character vector, parallel to `models`, -#' naming each candidate's reference category. -#' @param constants Named list of values every one-hot -#' prediction holds fixed - v2 uses 100 sampling days at zero -#' climate. -#' @param calibrate_against Numeric vector of observed responses -#' to calibrate the level against, or NULL to skip. -#' @param slope_terms Character vector of terms that are slopes -#' rather than habitat types. -#' @return A selection result whose `coefficients` are -#' probabilities of presence per habitat type. -#' -#' @example # Example usage of the function -#' # select_aic_best_onehot(models, response ~ 1, d, engine, -#' # "binomial", intercept_cats = cats) -select_aic_best_onehot <- function( - models, base, data, engine, family, - weights = NULL, offset = NULL, ic = "AICc", control = list(), - intercept_cats = NULL, - constants = list(seas_days = 100, Climate = 0), - calibrate_against = NULL, - slope_terms = "Climate" -) { - fitted <- fit_candidates( - models, base, data, engine, family, weights, offset, ic, - control - ) - - table <- candidate_table(fitted) - - if (!any(table$ok)) { - return(selection_result(NULL, NULL, table, fitted)) - } - - winner <- which.min(fitted$scores) - best <- fitted$fits[[winner]] - - # Step 1: The terms to read are the winning model's own, plus - # the category it leaves out. - terms <- attr(stats::terms(best$fit), "term.labels") - reference <- if (is.null(intercept_cats)) { - NULL - } else { - intercept_cats[winner] - } - - # A slope stays in the reported set even though it is held at - # a constant for the one-hot predictions: its value is taken - # from the fitted coefficient below, and dropping it here would - # make that an append rather than a replacement. Pure design - # constants - sampling effort - are not reported at all. - terms <- setdiff( - c(terms, reference), - setdiff(names(constants), slope_terms) - ) - - if (length(terms) == 0) { - return(selection_result( - best, fit_coefficients(best), table, fitted - )) - } - - # Step 2: One prediction per term, at 100 per cent of that type - onehot <- as.data.frame(diag(length(terms))) - names(onehot) <- terms - - for (one in names(constants)) { - onehot[[one]] <- constants[[one]] - } - - predicted <- engine$predict(best, onehot, "link", se = TRUE) - - if (is.null(predicted)) { - return(selection_result(NULL, NULL, table, fitted)) - } - - estimate <- stats::plogis(predicted$fit) - error <- predicted$se.fit - names(estimate) <- names(error) <- terms - - # Step 3: Shift the level so mean fitted presence matches mean - # observed. Slopes are exempt: the shift is an intercept - # change, and applying it to a slope would be meaningless. - if (!is.null(calibrate_against)) { - on_scale <- engine$predict(best, data, "link") - - if (!is.null(on_scale)) { - shift <- stats::qlogis(mean(calibrate_against)) - - stats::qlogis(mean(stats::plogis(on_scale))) + estimate <- do.call(rbind, lapply(predictions, `[[`, "fit")) + error <- do.call(rbind, lapply(predictions, `[[`, "se.fit")) + link <- colSums(estimate / error^2) / colSums(1 / error^2) + } else { + predictions <- lapply(fits, function(f) { + engine$predict(f, newdata, "link") + }) - if (is.finite(shift)) { - habitat <- setdiff(names(estimate), slope_terms) - estimate[habitat] <- stats::plogis( - stats::qlogis(estimate[habitat]) + shift - ) + if (any(vapply(predictions, is.null, logical(1)))) { + return(NULL) } - } - } - # Step 4: A slope is reported from its own coefficient, not - # from a one-hot prediction of a type that does not exist. - coefficients <- stats::coef(best$fit) - - for (one in intersect(slope_terms, names(coefficients))) { - if (!one %in% names(estimate)) { - next + link <- drop(weights %*% do.call(rbind, predictions)) } - estimate[one] <- stats::plogis(coefficients[[one]]) + if (type == "link") link else linkinv(link) } - - result <- selection_result( - fit = best, - coefficients = data.frame( - term = names(estimate), - estimate = unname(estimate), - se = unname(error), - stringsAsFactors = FALSE - ), - ic_table = table, - fitted = fitted - ) - - result$reference_category <- reference - - result } # 5. selection_result() ---- @@ -1035,6 +355,9 @@ select_aic_best_onehot <- function( #' @param fitted The full candidate set, or NULL. #' @param formula The chosen formula, or NULL to read it from #' `fit`. +#' @param engine The engine, or NULL. Used to count observations. +#' @param predict A function(newdata, type) for the final model, +#' or NULL to predict from `fit` (set by selection_run()). #' @return A list. #' #' @example # Example usage of the function @@ -1044,7 +367,9 @@ selection_result <- function( coefficients, ic_table, fitted = NULL, - formula = NULL + formula = NULL, + engine = NULL, + predict = NULL ) { list( fit = fit, @@ -1053,13 +378,20 @@ selection_result <- function( formula = if (!is.null(formula)) { paste(deparse(formula), collapse = " ") } else if (!is.null(fit) && isTRUE(fit$ok)) { - paste(deparse(stats::formula(fit$fit)), collapse = " ") + tryCatch( + paste(deparse(stats::formula(fit$fit)), collapse = " "), + error = function(e) NA_character_ + ) } else { NA_character_ }, + # Every formula any candidate fitted, so a grid prediction can + # supply each term a combined predictor reads + formulas = if (is.null(fitted)) NULL else fitted$formulas, n_fitted = if (is.null(ic_table)) 0L else sum(ic_table$ok), n_failed = if (is.null(ic_table)) 0L else sum(!ic_table$ok), - nobs = fit_nobs(fit) + nobs = engine_nobs(engine, fit), + predict = predict ) } diff --git a/1_code/harness/spec.R b/1_code/harness/spec.R new file mode 100644 index 0000000..b9eafaa --- /dev/null +++ b/1_code/harness/spec.R @@ -0,0 +1,512 @@ +# --- +# title: Taxon Specs - Validation and Helpers +# author: Brendan Casey +# created: 2026-10-03 +# inputs: none +# outputs: none; defines functions in memory +# notes: +# - A spec is a list that states one taxon's configuration as +# data: response, family, regions, stages, resampling. It holds +# no modelling code; every method it names is looked up in the +# registry (registry.R). The fields are documented in +# docs/getting_started.md. +# - validate_spec() checks a spec before any data is read, and +# reports every problem at once in plain language: a misspelt +# field, an engine or rule that is not registered, a rule that +# needs a capability the engine lacks. Without it those surface +# as a failed species hours into a run, or not at all. +# - Unknown fields are errors rather than warnings, because a +# misspelt field is silently ignored by everything downstream. +# A field a selection rule or resampler declares as an +# argument is known, so a new method's settings need no +# change here. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +# Base R only. + +# 2. Known fields ---- + +## 2.1 spec_fields() ---- + +#' The Fields a Spec, Region or Stage May Carry +#' +#' Each entry is what the harness itself reads. Settings for a +#' particular selection rule or resampling scheme are known +#' through that method's arguments instead, so they are not +#' listed. +#' +#' @return A named list of character vectors: `spec`, `region`, +#' `stage` and `resample`. +#' +#' @example # Example usage of the function +#' # spec_fields()$stage +spec_fields <- function() { + list( + spec = c( + "taxon", "response_name", "response_transform", "family", + "weight_column", "tier", "season", "part", "aliases", + "regions", "stages", "resample", "v2_coverage", "validate", + "final_prediction", "species_frame", "supplied_columns", + "notes", "models_overridden", + # Recorded facts a module keeps for its own reports + "use_protocol", "protocol_is_v2", "climate_source" + ), + region = c( + "filter", "grid", "term_block", "habitat_models", + "grid_constants", "grid_drop_rows", "grid_drop_cols", + "constants", "intercept_cats", "extra_covariates", + "weight_column" + ), + stage = c( + "name", "models", "engine", "selection", "ic", "control", + "family", "scope", "weighted", "base_terms", + "response_transform", "row_filter", "min_detections", + "extra_covariates", "post_process", "calibrate", + "carry_as", "carry_scale", "carry_offset", "carry_from", + "carry_from_as", + # Values held fixed when the final model is projected onto + # the grid; rules that predict onto a grid read them too + "constants", "grid_constants" + ), + resample = c("scheme", "seed", "scope") + ) +} + +# 3. validate_spec() ---- + +#' Check a Spec Before Running It +#' +#' @param spec A taxon spec. +#' @param stop_on_error Logical. Stop with every problem listed, +#' or return the problems. +#' @return The spec, invisibly, when it is valid; otherwise stops, +#' or returns a character vector of problems when +#' `stop_on_error` is FALSE. +#' +#' @example # Example usage of the function +#' # validate_spec(lichen_spec()) +validate_spec <- function(spec, stop_on_error = TRUE) { + problems <- character(0) + problem <- function(...) { + problems <<- c(problems, paste0(...)) + } + fields <- spec_fields() + unknown_fields <- function(x, known, where) { + extra <- setdiff(names(x), known) + + if (length(extra) > 0) { + problem( + where, " has unknown field(s): ", + paste(extra, collapse = ", "), "." + ) + } + } + + # Step 1: The spec itself + if (!is.character(spec$taxon) || length(spec$taxon) != 1L) { + problem("`taxon` must be one data slug, such as \"lichen\".") + } + + label <- paste0("Spec `", spec$taxon %||% "?", "`") + unknown_fields(spec, fields$spec, label) + + # Step 2: Regions + if (!is.list(spec$regions) || length(spec$regions) == 0) { + problem(label, " defines no regions.") + } + + for (region in names(spec$regions)) { + one <- spec$regions[[region]] + unknown_fields( + one, fields$region, paste0("Region `", region, "`") + ) + + if (!is.null(one$filter) && !inherits(one$filter, "formula")) { + problem( + "Region `", region, "`: `filter` must be a one-sided ", + "formula, such as ~ nr != \"Grassland\"." + ) + } + } + + # Step 3: Stages, in order + stage_names <- character(0) + carried <- character(0) + + for (stage in spec$stages) { + name <- stage$name %||% "?" + where <- paste0("Stage `", name, "`") + + if (name %in% stage_names) { + problem(where, " appears twice; stage names must differ.") + } + stage_names <- c(stage_names, name) + + engine <- tryCatch( + get_engine(stage$engine), + error = function(e) { + problem(where, ": ", conditionMessage(e)) + NULL + } + ) + + rule <- if (is.function(stage$selection)) { + stage$selection + } else { + tryCatch( + get_method("selection", stage$selection), + error = function(e) { + problem(where, ": ", conditionMessage(e)) + NULL + } + ) + } + + # A field the rule takes as an argument is a rule setting + known <- c(fields$stage, if (!is.null(rule)) names(formals(rule))) + unknown_fields(stage, known, where) + + # The rule's requirements against the engine's capabilities + if (!is.null(engine) && is.character(stage$selection)) { + needs <- get_method( + "selection", stage$selection, entry = TRUE + )$requires + missing_capabilities <- setdiff(needs, engine$capabilities) + + if (length(missing_capabilities) > 0) { + problem( + where, ": selection rule `", stage$selection, + "` needs ", paste(missing_capabilities, collapse = ", "), + ", which engine `", engine$name, "` does not provide. ", + "Choose a rule that does not, such as `single`." + ) + } + } + + if (!is.null(stage$ic) && + !stage$ic %in% c("AIC", "AICc", "BIC")) { + problem(where, ": `ic` must be \"AIC\", \"AICc\" or \"BIC\".") + } + + # A carried column may instead be attached per species, as + # the mammal precomputed climate is, through + # `supplied_columns`; then no earlier stage is needed. + carried_column <- stage$carry_from_as %||% "Climate" + + if (!is.null(stage$carry_from) && + !stage$carry_from %in% carried && + !carried_column %in% spec$supplied_columns) { + problem( + where, " carries from `", stage$carry_from, "`, which is ", + "not an earlier stage with `carry_as`, and `", + carried_column, "` is not in `supplied_columns`." + ) + } + + if (!is.null(stage$carry_as)) { + carried <- c(carried, name) + } + + # Models: a registered set name, formulas, or NULL to take + # each region's habitat models + if (is.null(stage$models)) { + lacking <- names(spec$regions)[vapply( + spec$regions, function(r) is.null(r$habitat_models), + logical(1) + )] + + if (length(lacking) > 0) { + problem( + where, " takes its models from the region, but ", + paste(lacking, collapse = ", "), " define(s) no ", + "`habitat_models`." + ) + } + } else { + problems <- c(problems, check_model_set(stage$models, where)) + } + } + + # Step 4: Resampling + scheme <- spec$resample$scheme + + resampler <- tryCatch( + get_method("resampler", scheme %||% ""), + error = function(e) { + problem("`resample$scheme`: ", conditionMessage(e)) + NULL + } + ) + + if (!is.null(resampler)) { + unknown_fields( + spec$resample, + c(fields$resample, names(formals(resampler))), + "`resample`" + ) + } + + if (length(problems) == 0) { + return(invisible(spec)) + } + + if (!stop_on_error) { + return(problems) + } + + stop( + label, " has ", length(problems), " problem(s):\n - ", + paste(problems, collapse = "\n - "), + call. = FALSE + ) +} + +## 3.1 check_model_set() ---- + +#' Check a Stage's Models Name Something Real +#' +#' A single string that is neither a registered set nor a +#' formula is almost always a misspelt set name. Without this it +#' would be fitted as a one-formula candidate and fail later. +#' +#' @param models A set name, or formulas as text. +#' @param where Character. Prefix for the message. +#' @return A character vector of problems, empty when fine. +#' +#' @example # Example usage of the function +#' # check_model_set("climate_plant_v2_ful", "Stage `climate`") +check_model_set <- function(models, where) { + if (is.list(models)) { + return(unlist(lapply(models, check_model_set, where = where))) + } + + if (!is.character(models)) { + return(paste0(where, ": `models` must be a set name or text.")) + } + + if (length(models) == 1L && !grepl("~", models, fixed = TRUE) && + !models %in% names(model_sets())) { + return(paste0( + where, ": `", models, "` is not a model set or a formula. ", + "Sets: see names(model_sets())." + )) + } + + character(0) +} + +# 4. spec_covariates() ---- + +#' Read the Covariates a Spec's Model Sets Name +#' +#' Taken from the formulas rather than declared separately, so a +#' spec cannot name a term it forgot to load. Terms the harness +#' supplies itself - the response, the offset, and any stage +#' carried forward - are excluded. +#' +#' @param spec A taxon spec. +#' @param stage_names Character vector of stages to read, or NULL +#' for all of them. +#' @return A character vector of covariate names. +#' +#' @example # Example usage of the function +#' # spec_covariates(bryophyte_spec()) +spec_covariates <- function(spec, stage_names = NULL) { + stages <- spec$stages + + if (!is.null(stage_names)) { + stages <- stages[vapply( + stages, function(s) s$name %in% stage_names, logical(1) + )] + } + + supplied <- c( + spec$response_name %||% "response", + "offset", "weight", + vapply(spec$stages, function(s) s$carry_as %||% "", character(1)), + # Columns a spec attaches per species rather than reads from + # the dataset: the mammal precomputed Climate. + spec$supplied_columns + ) + + terms <- unlist(lapply(stages, function(stage) { + # A staged set is a list of groups; flatten before reading + # terms off the formulas. + models <- unlist(get_model_set(stage$models), use.names = FALSE) + + unlist(lapply(models, function(one) { + all.vars(stats::as.formula(one)) + })) + })) + + covariates <- setdiff(unique(terms), c(supplied, ".")) + + # A stage may need columns no formula names: the plant age + # splines read the aged stand-cover columns. + extra <- unlist(lapply(stages, `[[`, "extra_covariates")) + + # The weight is a covariate too, and is loaded with the rest + unique(c(covariates, extra, spec$weight_column)) +} + +# 5. apply_stage_models() ---- + +#' Swap a Spec's Candidate Sets for an Experiment's Own +#' +#' Lets an experiment define the models a stage fits without +#' editing the taxon spec, which keeps the spec as the record of +#' what v2 did and the experiment as the record of what was +#' changed. +#' +#' Entries are named `taxon.stage`, or `stage` to apply to every +#' taxon. Each value is either a name in model_sets() or a +#' character vector of formulas, so an experiment can hand over a +#' set built by extend_models() or models_from_covariates(). +#' +#' \preformatted{ +#' stage_models <- list( +#' "lichen.climate" = extend_models( +#' "climate_plant_v2_full", "elevation" +#' ), +#' "climate" = models_from_covariates(c("MAP", "FFP")) +#' ) +#' } +#' +#' @param spec A taxon spec. +#' @param stage_models Named list of replacement model sets, or +#' NULL. +#' @return The spec, with matching stages replaced, and a record +#' of what changed in `models_overridden`. +#' +#' @example # Example usage of the function +#' # apply_stage_models(spec, list(climate = my_models)) +apply_stage_models <- function(spec, stage_models) { + if (is.null(stage_models) || length(stage_models) == 0) { + return(spec) + } + + changed <- character(0) + + for (i in seq_along(spec$stages)) { + stage <- spec$stages[[i]] + + # The taxon-specific key wins over the bare stage name, so a + # run can set a default and then override one taxon. + keys <- c(paste(spec$taxon, stage$name, sep = "."), stage$name) + hit <- keys[keys %in% names(stage_models)][1] + + if (is.na(hit)) { + next + } + + spec$stages[[i]]$models <- stage_models[[hit]] + changed <- c(changed, paste0(stage$name, " <- ", hit)) + } + + # Recorded so meta.json shows a run that did not fit the v2 + # candidate sets, which otherwise looks identical to one that + # did. + spec$models_overridden <- if (length(changed) > 0) { + changed + } else { + NULL + } + + spec +} + +# 6. v2 coverage ---- + +## 6.1 v2_status() ---- + +#' State How Much of One v2 Stage a Spec Reproduces +#' +#' The entries of a spec's `v2_coverage`. The status vocabulary +#' is fixed, so a typo fails when the spec is built rather than +#' reading as a fourth category in the report. +#' +#' @param status Character. "reproduced", "partial" or +#' "not reproduced". +#' @param note Character. What is and is not reproduced, and why. +#' @return A list of `status` and `note`. +#' +#' @example # Example usage of the function +#' # v2_status("partial", "No age splines.") +v2_status <- function(status, note) { + allowed <- c("reproduced", "partial", "not reproduced") + + if (!is.character(status) || length(status) != 1L || + !status %in% allowed) { + stop( + "v2 status must be one of: ", + paste(allowed, collapse = ", "), ".", + call. = FALSE + ) + } + + if (!is.character(note) || length(note) != 1L || + !nzchar(note)) { + stop("A v2 status needs a one-line note.", call. = FALSE) + } + + list(status = status, note = note) +} + +## 6.2 spec_coverage() ---- + +#' Tabulate What a Set of Specs Reproduces of v2 +#' +#' Flattens each spec's `v2_coverage` into one table, which is +#' what the report prints. Coverage is stated once, in the specs, +#' and read from there. +#' +#' @param specs A named list of specs. +#' @return A data frame of taxon, stage, status and note. +#' +#' @example # Example usage of the function +#' # spec_coverage(list(lichen = lichen_spec())) +spec_coverage <- function(specs) { + rows <- lapply(names(specs), function(key) { + coverage <- specs[[key]]$v2_coverage + + if (is.null(coverage) || length(coverage) == 0) { + return(data.frame( + taxon = key, stage = NA_character_, + status = "not stated", + note = "The spec has no v2_coverage.", + stringsAsFactors = FALSE + )) + } + + data.frame( + taxon = key, + stage = names(coverage), + status = vapply(coverage, `[[`, character(1), "status"), + note = vapply(coverage, `[[`, character(1), "note"), + stringsAsFactors = FALSE, + row.names = NULL + ) + }) + + do.call(rbind, rows) +} + +# 7. Helpers ---- + +## 7.1 `%||%` ---- + +#' Default for NULL +#' +#' @param a,b Any values. +#' @return `a` unless it is NULL, in which case `b`. +#' +#' @example # Example usage of the function +#' # NULL %||% "default" +`%||%` <- function(a, b) { + if (is.null(a)) b else a +} + +# End of script ---- diff --git a/1_code/harness/species.R b/1_code/harness/species.R index 8f25f6d..0565f70 100644 --- a/1_code/harness/species.R +++ b/1_code/harness/species.R @@ -4,20 +4,19 @@ # created: 2026-09-09 # inputs: # in 0_data/test_dataset/lookup/: -# - modelled_species.csv (plant groups) -# - mammal_modelled_species.csv -# - bird_modelled_species.csv +# - species_queue.csv, from _setup/09_harmonize_lookups.R # outputs: none; returns objects in memory # notes: -# - The three source lookups have three different schemas, one -# per taxon lead. This flattens them to one, so an experiment -# asks for species the same way whatever the taxon. -# - The unified schema is taxon, species, region, tier, order -# and season. `tier` separates a taxon's model classes where -# it has them - mammals fit a full habitat model for species -# with at least 20 detections and a use-availability model -# for those with at least 3 - and is "modelled" elsewhere. -# `season` is NA for everything but mammals. +# - One species queue for every taxon, in one schema: taxon, +# region, season, tier, species, order and source_name. The +# three taxon leads' lookups are flattened into it once, by +# _setup/09, so an experiment asks for species the same way +# whatever the taxon. +# - `tier` separates a taxon's model classes where it has them - +# mammals fit a full habitat model for species with at least +# 20 detections and a use-availability model for those with +# at least 3 - and is "modelled" elsewhere. `season` is empty +# for everything but mammals. # - `order` preserves each source list's own ordering, so a # narrowed run visits species in the order v2 would have. # - resolve_species() is the entry point an experiment uses to @@ -31,132 +30,37 @@ ## 1.1 Load packages ---- library(data.table) # lookup table reading (version: 1.16.4) -# 2. Source lookup declarations ---- +# 2. species_catalogue() ---- -## 2.1 species_lookup_files() ---- - -#' Name Each Taxon's Species Lookup -#' -#' @return A named character vector of file names within -#' 0_data/test_dataset/lookup/. -#' -#' @example # Example usage of the function -#' # species_lookup_files()[["mammal"]] -species_lookup_files <- function() { - c( - plants = "modelled_species.csv", - mammal = "mammal_modelled_species.csv", - bird = "bird_modelled_species.csv" - ) -} - -## 2.2 plant_taxa() ---- - -#' Name the Taxa Held in the Plant-Group Lookup -#' -#' "Plant group" names a file layout rather than a taxonomy: the -#' four share one survey design and one lookup, soil mites -#' included. -#' -#' @return A character vector of taxon slugs. -#' -#' @example # Example usage of the function -#' # plant_taxa() -plant_taxa <- function() { - c("vascular_plant", "bryophyte", "lichen", "mite") -} - -# 3. species_catalogue() ---- - -#' Flatten Every Species Lookup into One Table +#' Read the Species Queue #' #' @param data_dir Character. Path to 0_data/test_dataset. #' @param taxon Character. Keep one taxon, or NULL for all. -#' @return A data frame of taxon, species, region, tier, order -#' and season. +#' @return A data frame of taxon, region, season, tier, species, +#' order and source_name. #' #' @example # Example usage of the function #' # species_catalogue(data_dir, taxon = "bryophyte") species_catalogue <- function(data_dir, taxon = NULL) { - lookup_dir <- file.path(data_dir, "lookup") - files <- species_lookup_files() - - read_lookup <- function(name) { - path <- file.path(lookup_dir, files[[name]]) + path <- file.path(data_dir, "lookup", "species_queue.csv") - if (!file.exists(path)) { - stop( - "Species lookup not found:\n ", path, - "\nRun 1_code/_setup/01_harmonize_model_ready_v2.R first.", - call. = FALSE - ) - } - - as.data.frame(fread(path)) - } - - parts <- list() - - # Step 1: Plant groups. One row per species, with membership - # of the north (veg) and south (soil) model sets as flags, so - # each flag becomes a region row. - plants <- read_lookup("plants") - - parts$plants <- rbind( - unified_rows( - plants[plants$in_veg_models, ], - taxon = plants$taxon[plants$in_veg_models], - region = "north", - order = plants$veg_order[plants$in_veg_models] - ), - unified_rows( - plants[plants$in_soil_models, ], - taxon = plants$taxon[plants$in_soil_models], - region = "south", - order = plants$soil_order[plants$in_soil_models] - ) - ) - - # Step 2: Mammals. Region and season are already columns, and - # the two occurrence thresholds become tiers. - mammals <- read_lookup("mammal") - - parts$mammal <- rbind( - unified_rows( - mammals[mammals$in_models, ], - taxon = "mammal", - region = mammals$region[mammals$in_models], - order = mammals$model_order[mammals$in_models], - tier = "modelled", - season = mammals$season[mammals$in_models] - ), - unified_rows( - mammals[mammals$in_ua_models, ], - taxon = "mammal", - region = mammals$region[mammals$in_ua_models], - order = mammals$ua_order[mammals$in_ua_models], - tier = "ua", - season = mammals$season[mammals$in_ua_models] - ) - ) - - # Step 3: Birds. One row per species and region already. - birds <- read_lookup("bird") - - parts$bird <- unified_rows( - birds, - taxon = "bird", - region = birds$region, - order = stats::ave( - seq_len(nrow(birds)), birds$region, FUN = seq_along + if (!file.exists(path)) { + stop( + "Species queue not found:\n ", path, + "\nRun 1_code/_setup/09_harmonize_lookups.R first.", + call. = FALSE ) - ) + } - catalogue <- do.call(rbind, parts) - rownames(catalogue) <- NULL + catalogue <- cached_read(path, function(p) { + queue <- as.data.frame(fread(p, na.strings = "")) + queue$season <- as.character(queue$season) + queue + }) if (!is.null(taxon)) { known <- unique(catalogue$taxon) + if (!taxon %in% known) { stop( "Unknown taxon `", taxon, "`. Taxa in the catalogue: ", @@ -172,7 +76,7 @@ species_catalogue <- function(data_dir, taxon = NULL) { catalogue } -# 4. list_species() ---- +# 3. list_species() ---- #' List the Species Available for a Taxon #' @@ -219,17 +123,42 @@ list_species <- function( unique(catalogue$species) } +# 4. species_source_name() ---- + +#' The Name a Source Pipeline Used for a Species +#' +#' v2's files sometimes name a species differently from the +#' dataset's column: mammals are "Black BearSummer" there and +#' "BlackBear_Summer" here. +#' +#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param taxon,species Character. +#' @return Character, the source name. +#' +#' @example # Example usage of the function +#' # species_source_name(data_dir, "mammal", "BlackBear_Summer") +species_source_name <- function(data_dir, taxon, species) { + catalogue <- species_catalogue(data_dir, taxon) + name <- unique(catalogue$source_name[catalogue$species == species]) + + if (length(name) == 0) { + stop( + "`", species, "` is not in the ", taxon, " species queue.", + call. = FALSE + ) + } + + name[1] +} + # 5. resolve_species() ---- #' Choose the Focal Species for a Run #' -#' NULL means every species the source lookup declares as -#' modelled. A character vector means those species, and an -#' unknown name stops the run here rather than failing inside a -#' bootstrap hours later. -#' -#' Selection is how a trial run is shortened. Three species is a -#' smoke test; the full list is the parity run. +#' NULL means every species the queue declares as modelled. A +#' character vector means those species, and an unknown name +#' stops the run here rather than failing inside a bootstrap +#' hours later. #' #' @param species Character vector of species, or NULL for all. #' @param data_dir Character. Path to 0_data/test_dataset. @@ -294,17 +223,8 @@ resolve_species <- function( #' lichen = "Bryoria.fremontii", #' mite = "Oppiella.nova" #' ) -#' -#' covariates <- c( -#' "climate_common", # every taxon -#' lichen = "topography" # lichens as well -#' ) #' } #' -#' One convention for both keeps the two selections symmetrical, -#' and lets a single vector configure a run across taxa without a -#' nested list. -#' #' @param x A named character vector, or NULL. #' @param taxon Character. The taxon to read. #' @return A character vector of the entries that apply, or NULL @@ -337,49 +257,4 @@ taxon_values <- function(x, taxon) { out } -# 7. Helpers ---- - -## 6.1 unified_rows() ---- - -#' Build Rows in the Unified Schema -#' -#' @param frame A data frame with a `species` column. -#' @param taxon,region,order,tier,season Values recycled to the -#' number of rows in `frame`. -#' @return A data frame in the unified schema, or an empty one -#' when `frame` has no rows. -#' -#' @example # Example usage of the function -#' # unified_rows(birds, "bird", birds$region, seq_len(nrow(birds))) -unified_rows <- function( - frame, - taxon, - region, - order, - tier = "modelled", - season = NA_character_ -) { - if (nrow(frame) == 0) { - return(data.frame( - taxon = character(0), - species = character(0), - region = character(0), - tier = character(0), - order = integer(0), - season = character(0), - stringsAsFactors = FALSE - )) - } - - data.frame( - taxon = as.character(taxon), - species = as.character(frame$species), - region = as.character(region), - tier = as.character(tier), - order = as.integer(order), - season = as.character(season), - stringsAsFactors = FALSE - ) -} - # End of script ---- diff --git a/1_code/harness/summarise.R b/1_code/harness/summarise.R new file mode 100644 index 0000000..3187faf --- /dev/null +++ b/1_code/harness/summarise.R @@ -0,0 +1,361 @@ +# --- +# title: Summarize Result Stores +# author: Brendan Casey +# created: 2026-10-03 +# inputs: +# in pipeline_dir///: +# - coefficients.csv, metrics.csv, grid_predictions.csv, +# meta.json +# outputs: +# collect_results() returns the summaries; write_summaries() +# writes them to out_dir/tables/: +# - coverage.csv, metric_summary.csv, grid_summary.csv +# (small; committed) +# - coefficient_summary.csv (large; gitignored) +# notes: +# - Reduces the per-draw result stores to per-species summaries, +# which is what every experiment compares. The same for any +# experiment, so it lives in the harness: an experiment's own +# scripts start from these tables. +# - Draws are summarized by median and the 10th and 90th +# percentiles rather than mean and standard deviation. A +# coefficient's distribution over draws is routinely skewed, +# and a rare species can produce an extreme draw that would +# drag a mean somewhere no draw actually is. +# - `boot1` is the iteration-1 value, the full-data fit. It is +# the like-for-like quantity where a reference fits once +# rather than bootstrapping, as the v2 mammal models do. +# - `run` is the folder a store sits in, which run.R names; the +# taxon, season and part come from the store's meta.json, so +# the two mammal season runs share the taxon "mammal". +# - A taxon whose coefficients need translating before they can +# be compared (birds, onto v2's habitat template) is handled +# by a function the experiment passes in `translate`, so the +# harness stays taxon-agnostic. +# - Each store is read once. The row counts and pooled metrics +# the run record needs are kept from that read and handed to +# run_record(), rather than read again. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +library(data.table) # grouped summaries (version: 1.16.4) + +# 2. Finding stores ---- + +## 2.1 find_stores() ---- + +#' Find the Result Stores Under a Pipeline Directory +#' +#' A store is a directory holding a meta.json, laid out as +#' `///`. +#' +#' @param pipeline_dir Character. +#' @return A data frame of dir, run, region, taxon, season, part +#' and final_stage, ordered by run and region. +#' +#' @example # Example usage of the function +#' # find_stores("2_pipeline/exp_000_parity_v2") +find_stores <- function(pipeline_dir) { + dirs <- list.dirs(pipeline_dir, recursive = TRUE) + dirs <- dirs[file.exists(file.path(dirs, "meta.json"))] + + if (length(dirs) == 0) { + return(data.frame( + dir = character(0), run = character(0), region = character(0), + taxon = character(0), season = character(0), + part = character(0), final_stage = character(0), + stringsAsFactors = FALSE + )) + } + + rows <- lapply(dirs, function(dir) { + meta <- store_meta(dir) + + # The run is read off the folder; the rest from meta.json, + # rather than parsed out of a path that may not use forward + # slashes. + data.frame( + dir = dir, + run = basename(dirname(dir)), + region = if (is.na(meta$region)) basename(dir) else meta$region, + taxon = if (is.na(meta$taxon)) { + basename(dirname(dir)) + } else { + meta$taxon + }, + season = meta$season, + part = meta$part, + final_stage = meta$final_stage, + stringsAsFactors = FALSE + ) + }) + + stores <- do.call(rbind, rows) + stores[order(stores$run, stores$region), , drop = FALSE] +} + +## 2.2 store_meta() ---- + +#' Read a Store's meta.json, Tolerating a Missing Field +#' +#' @param dir Character. A result store directory. +#' @return A list with taxon, region, season, part and +#' final_stage; NA for what the file does not say. +#' +#' @example # Example usage of the function +#' # store_meta("2_pipeline/exp_000_parity_v2/lichen/north") +store_meta <- function(dir) { + if (!requireNamespace("jsonlite", quietly = TRUE)) { + stop("Reading meta.json needs the jsonlite package.", + call. = FALSE) + } + + meta <- jsonlite::fromJSON(file.path(dir, "meta.json")) + + field <- function(name) { + value <- meta[[name]] + + if (is.null(value) || length(value) == 0 || + identical(value, "NA") || all(is.na(value))) { + NA_character_ + } else { + as.character(value[1]) + } + } + + list( + taxon = field("taxon"), + region = field("region"), + season = field("season"), + part = field("part"), + final_stage = if (is.null(meta$stages)) { + NA_character_ + } else { + utils::tail(meta$stages, 1) + } + ) +} + +# 3. Summarizing draws ---- + +## 3.1 summarise_draws() ---- + +#' Summarize a Value over Bootstrap Draws, per Group +#' +#' @param rows A data frame with `boot` and the value column. +#' @param value Character. The column to summarize. +#' @param keys Character vector of grouping columns. +#' @return A data.table of the keys plus n, median, p10, p90 and +#' boot1. n counts the finite values; boot1 is the iteration-1 +#' value where there is exactly one. +#' +#' @example # Example usage of the function +#' # summarise_draws(metrics, "value", c("species", "metric")) +summarise_draws <- function(rows, value, keys) { + rows <- as.data.table(rows) + + # The column is passed through .SDcols rather than named inside + # the call, because a column may itself be called `value` + rows[, draw_summary(.SD[[1L]], boot), by = keys, .SDcols = value] +} + +## 3.2 draw_summary() ---- + +#' Summarize One Value over Its Draws +#' +#' @param x Numeric vector, one value per draw. +#' @param boot Integer vector of the draw each value came from. +#' @return A list of n, median, p10, p90 and boot1. +#' +#' @example # Example usage of the function +#' # draw_summary(c(0.1, 0.3, 0.2), 1:3) +draw_summary <- function(x, boot) { + first <- x[boot == 1L] + first <- if (length(first) == 1 && is.finite(first)) { + first + } else { + NA_real_ + } + finite <- x[is.finite(x)] + + if (length(finite) == 0) { + return(list(n = 0, median = NA_real_, p10 = NA_real_, + p90 = NA_real_, boot1 = first)) + } + + quantiles <- stats::quantile( + finite, c(0.1, 0.5, 0.9), names = FALSE + ) + + list(n = as.numeric(length(finite)), median = quantiles[2], + p10 = quantiles[1], p90 = quantiles[3], boot1 = first) +} + +# 4. collect_results() ---- + +#' Reduce Every Store in a Pipeline Directory to Summaries +#' +#' @param pipeline_dir Character. Where the stores are. +#' @param data_dir Character. Passed to `translate` functions. +#' @param translate Named list of functions, by taxon. Each takes +#' the store's coefficients, `data_dir` and the region, and +#' returns extra coefficient rows - a translation of them - to +#' summarize alongside. +#' @return A list of data frames: `coverage`, `coefficient_summary`, +#' `metric_summary`, `grid_summary`, and for the run record, +#' `store_rows` (row counts per store) and `metrics` (every +#' metric row, labelled with its run and region). +#' +#' @example # Example usage of the function +#' # results <- collect_results("2_pipeline/exp_000_parity_v2", +#' # data_dir, translate = list(bird = bird_habitat_translation)) +collect_results <- function(pipeline_dir, data_dir = NULL, + translate = list()) { + stores <- find_stores(pipeline_dir) + + if (nrow(stores) == 0) { + message("No result stores in ", pipeline_dir, ".") + } + + pieces <- lapply(seq_len(nrow(stores)), function(i) { + store <- stores[i, ] + labels <- store[, c("taxon", "run", "region", "season", "part")] + rownames(labels) <- NULL + + coefficients <- read_results(store$dir, "coefficients") + metrics <- read_results(store$dir, "metrics") + grid <- read_results(store$dir, "grid_predictions") + + counts <- data.frame( + run = store$run, region = store$region, + species = length(unique(c(coefficients$species, + metrics$species))), + draws = length(unique(c(coefficients$boot, metrics$boot))), + coefficient_rows = NROW(coefficients), + metric_rows = NROW(metrics), + grid_rows = NROW(grid), + stringsAsFactors = FALSE + ) + + # A store written before stages were recorded holds the final + # stage only + if (!is.null(coefficients) && !"stage" %in% names(coefficients)) { + coefficients$stage <- store$final_stage + } + + # Coefficients a taxon needs translated before comparing + translator <- translate[[store$taxon]] + + if (is.function(translator) && !is.null(coefficients)) { + extra <- translator(coefficients, data_dir, store$region) + + if (!is.null(extra) && nrow(extra) > 0) { + coefficients <- rbind( + coefficients, extra[, names(coefficients)] + ) + } + } + + summarised <- function(rows, value, keys) { + if (is.null(rows) || nrow(rows) == 0) { + return(NULL) + } + + cbind(labels, summarise_draws(rows, value, keys)) + } + + list( + coverage = cbind(labels, data.frame( + species = counts$species, + draws = counts$draws, + stages = if (is.null(coefficients)) { + "" + } else { + paste(unique(coefficients$stage), collapse = ", ") + }, + has_coefficients = !is.null(coefficients), + has_grid = !is.null(grid), + stringsAsFactors = FALSE + )), + coefficient_summary = summarised( + coefficients, "estimate", c("stage", "species", "term") + ), + metric_summary = summarised( + metrics, "value", c("species", "metric") + ), + grid_summary = summarised( + grid, "prediction", c("species", "grid_unit") + ), + store_rows = counts, + metrics = if (is.null(metrics)) { + NULL + } else { + cbind(run = store$run, metrics) + } + ) + }) + + combine <- function(name) { + parts <- lapply(pieces, `[[`, name) + parts <- parts[!vapply(parts, is.null, logical(1))] + + if (length(parts) == 0) { + return(NULL) + } + + out <- as.data.frame(rbindlist(parts, use.names = TRUE)) + rownames(out) <- NULL + out + } + + stats::setNames( + lapply( + c("coverage", "coefficient_summary", "metric_summary", + "grid_summary", "store_rows", "metrics"), + combine + ), + c("coverage", "coefficient_summary", "metric_summary", + "grid_summary", "store_rows", "metrics") + ) +} + +# 5. write_summaries() ---- + +#' Write the Summary Tables +#' +#' @param results From collect_results(). +#' @param out_dir Character. Tables go in `out_dir/tables/`. +#' @return The paths written, invisibly. +#' +#' @example # Example usage of the function +#' # write_summaries(results, "3_output/exp_000_parity_v2") +write_summaries <- function(results, out_dir) { + tables_dir <- file.path(out_dir, "tables") + dir.create(tables_dir, recursive = TRUE, showWarnings = FALSE) + + tables <- c( + "coverage", "metric_summary", "grid_summary", + "coefficient_summary" + ) + written <- character(0) + + for (name in tables) { + table <- results[[name]] + + if (is.null(table)) { + next + } + + path <- file.path(tables_dir, paste0(name, ".csv")) + fwrite(table, path, na = "") + cat("Wrote tables/", name, ".csv: ", nrow(table), " rows\n", + sep = "") + written <- c(written, path) + } + + invisible(written) +} + +# End of script ---- diff --git a/1_code/harness/utils/step_runner.R b/1_code/harness/utils/step_runner.R deleted file mode 100644 index 1dd6cec..0000000 --- a/1_code/harness/utils/step_runner.R +++ /dev/null @@ -1,109 +0,0 @@ -# --- -# title: Pipeline Step Runner -# author: Brendan Casey -# created: 2026-09-05 -# inputs: none -# outputs: none -# notes: -# - Taxon-agnostic helper for running one numbered module -# script, timing it, and mirroring its output to a log. -# Sourced by the experiments in 1_code/experiments/. -# - Was v2_script_runner.R, which also switched the working -# directory to a v2 project root and restored the caller's -# objects after each script's rm(list = ls()). The module -# scripts do neither now: they take their paths as arguments -# and clear nothing, so both are gone along with the input -# checks, which each script does for itself against the paths -# it was actually given. -# - Scripts are sourced into the global environment on purpose. -# They read their configuration from objects the experiment -# has already set there, and their clusterExport() calls read -# from .GlobalEnv. -# --- - -# 1. run_step() ---- - -#' Run One Pipeline Step -#' -#' Sources a script, reporting its label and the time it took. -#' Mirrors console output to a timestamped log file so an -#' unattended run leaves a record. -#' -#' The script is sourced into the global environment, so it sees -#' the configuration the caller set there - `taxon`, `out_dir` -#' and the rest - and its parallel workers can export from it. -#' -#' @param label Character. A descriptive label for the step, used -#' in the console output and in the log file name -#' (e.g. "02: Hierarchical models (mites)"). -#' @param script Character. Path to the script to run. -#' @param log_dir Character. Directory for log files, or NULL to -#' print to the console only. -#' @return NULL, invisibly. Output is printed to the console and, -#' when `log_dir` is set, copied to a log file. -#' -#' @example -#' # Example usage of the function -#' run_step( -#' label = "02: Hierarchical models (mites)", -#' script = "1_code/modules/lichens/02_hierarchical_models.R", -#' log_dir = log_path -#' ) -#' -#' # Run without writing a log file -#' run_step( -#' label = "02: Hierarchical models (mites)", -#' script = "1_code/modules/lichens/02_hierarchical_models.R", -#' log_dir = NULL -#' ) -run_step <- function(label, script, log_dir = NULL) { - # Step 1: Fail on a missing script before anything is logged - if (!file.exists(script)) { - stop("Script not found: ", script, call. = FALSE) - } - - # Step 2: Announce the step and record the start time - cat("\n--- Running ", label, " ---\n", sep = "") - start <- Sys.time() - - # Step 3: Mirror output to a timestamped log. split = TRUE keeps - # it on the console too, and on.exit() closes the connection - # even if the script errors. - if (!is.null(log_dir)) { - if (!dir.exists(log_dir)) { - dir.create(log_dir, recursive = TRUE) - } - - stamp <- format(Sys.time(), "%Y-%m-%d_%H-%M-%S") - safe_label <- gsub("[^A-Za-z0-9_]+", "_", label) - log_file <- file.path( - log_dir, - paste0(stamp, "_", safe_label, ".log") - ) - - log_con <- file(log_file, open = "wt") - sink(log_con, split = TRUE) - on.exit( - { - sink() - close(log_con) - }, - add = TRUE - ) - - cat("Logging to ", log_file, "\n", sep = "") - } - - # Step 4: Source into the global environment, which is where the - # module scripts read their configuration and where their - # clusterExport() calls look for objects - source(script) - - # Step 5: Report how long the step took - elapsed <- format(round(Sys.time() - start, 1)) - cat("Completed ", label, " in ", elapsed, "\n", sep = "") - - invisible(NULL) -} - -# End of script ---- diff --git a/1_code/methods/README.md b/1_code/methods/README.md new file mode 100644 index 0000000..20f221e --- /dev/null +++ b/1_code/methods/README.md @@ -0,0 +1,129 @@ +# Methods + +Every method a spec can name lives here, one file each. A file +defines its method and registers it under a name; a spec names it; +the harness looks it up. Adding a method is adding a file. No +harness file changes. + +```r +source("1_code/harness/harness.R") +load_framework() +list_methods() # everything registered, with what it needs +list_methods("engine") # one kind +``` + +| Folder | Kind | Registered with | Named in a spec as | +| --- | --- | --- | --- | +| `engines/` | How a model is fitted | `register_engine()` | `stage$engine` | +| `selection/` | How a candidate set becomes one result | `register_selection()` | `stage$selection` | +| `resampling/` | Which survey units each draw fits | `register_resampler()` | `resample$scheme` | +| `metrics/` | How a prediction is scored | `register_metric()` | scored for every run | + +Files whose names start with `_` are shared helpers and load first +(`engines/_glm_family.R`). `_templates/` holds a copy-and-fill +skeleton for an engine and a selection rule; it is not loaded. + +## What is registered + +| Kind | Name | What it does | Needs | +| --- | --- | --- | --- | +| engine | `glm` | `stats::glm` (v2 mammals, birds) | | +| engine | `bayesglm` | `arm::bayesglm`, weakly informative priors (v2 plants) | | +| selection | `single` | Fit the first candidate; no ranking | | +| selection | `aic_best` | Keep the lowest-scoring candidate | ic | +| selection | `aic_average` | Average coefficients by Akaike weight (v2 climate) | ic, coefficients | +| selection | `staged_bic` | Forward selection through groups (v2 bird landcover) | ic, coefficients | +| selection | `ivw_grid` | Inverse-variance average onto the habitat grid (v2 plant habitat) | coefficients, se | +| selection | `aic_best_grid` | Best candidate, predicted onto the grid (v2 mammal abundance) | ic, se | +| selection | `aic_best_onehot` | Best candidate, one habitat type at a time (v2 mammal presence) | ic, coefficients, se | +| resampler | `precomputed` | Replay draws stored with the dataset (v2 birds; plant `v2_ids`) | | +| resampler | `spatial_block` | Bootstrap within coarse spatial blocks (v2 plants, mammals) | | +| resampler | `spatial_cv` | Spatial block cross-validation; each draw holds out one fold | | +| metric | `auc`, `deviance_explained`, `rmse`, `spearman`, `calibration_slope`, `prevalence`, `n` | Scored in-sample and out-of-bag for every draw | | + +`validate_spec()` checks a spec against this table before any data +is read. A rule paired with an engine that lacks what it needs, an +unregistered name, or a misspelt field stops the run with a +sentence saying which. + +## The engine contract + +An engine is a list: + +| Element | Required | Contract | +| --- | --- | --- | +| `name`, `description` | yes | The registered name, and one line for `list_methods()` | +| `capabilities` | yes | A subset of `"coefficients"`, `"ic"`, `"se"`, `"converged"` | +| `fit(formula, data, family, weights, offset, control)` | yes | Returns `list(fit, ok, message)`. **Never raises**: a failure returns `ok = FALSE` and the message, because candidate sets hold models that cannot be fitted for every species and draw | +| `predict(fit, newdata, type, se)` | yes | `type` is `"link"` or `"response"`. Returns one number per row, or `NULL` when it cannot. With `se = TRUE` (only if declared), `list(fit, se.fit)`. An offset in the formula, `+ offset(offset)`, must be applied to new data | +| `coef(fit)` | with `coefficients` | A data frame of `term`, `estimate`, `se` | +| `ic(fit, type)` | with `ic` | AIC, AICc or BIC; `Inf` for a failed fit | +| `converged(fit)`, `nobs(fit)` | no | Assumed converged, and observations read with `stats::nobs`, when absent | + +The harness passes the offset in the formula, never as an +argument: an offset argument is not carried onto new data by +`predict()`, so every prediction outside the draw would be wrong. + +`family` arrives as a name (`"binomial"`, `"poisson"`) or a family +object (`Gamma(link = "log")`). An engine with its own vocabulary, +such as `gbm`'s `distribution = "bernoulli"`, translates it. + +### Testing an engine + +```r +check_engine(engine_mine()) +``` + +`check_engine()` fits small synthetic binomial and Poisson data, +with weights, an offset and a factor, and checks every part of the +contract the engine declares. Every row should read `TRUE` before +the engine meets the dataset. + +### Which rules an engine can use + +An engine without an information criterion or coefficients - a +boosted regression tree, a random forest - can still run any +stage, using the `single` rule: one formula, fitted as given. To +compare it with v2 on a stage v2 fits with model averaging, +replace that stage's engine, selection and models together. The +v2 post-processing steps that read coefficients (the plant +stand-age splines, say) then do not apply, and the stage should +drop them; see `docs/getting_started.md`. + +A stage carried into the next one (`carry_as`) is carried from the +stage's final model: its averaged coefficients where it has them, +its prediction otherwise. + +## The other contracts + +**Selection rule.** A function taking `models` (formulas, or named +groups of them), `base`, `data`, `engine`, `family`, `weights`, +`offset`, `ic` and `control`, returning `selection_result()`. Any +further argument is a setting, filled from the stage field of the +same name. Fit candidates with `fit_candidates()`; read +coefficients with `engine_coef()`. A rule that combines candidates +passes `predict` (see `combined_predictor()`) so metrics and grid +predictions use the combined model. Register with the capabilities +it `requires`. + +**Resampler.** A function of `frame`, `iterations`, `seed` and +`context` (data directory, taxon, species, spec), plus any setting +from the spec's `resample` list, returning one character vector of +survey unit ids per draw: the units that draw fits. Units left out +are scored out-of-bag. Draw under `with_seed(seed, ...)` so a +species' draws depend only on its seed. + +**Metric.** A function of `observed` and `predicted`, both on the +response scale, returning one number. Return `NA` rather than +stopping when the metric does not apply to a draw. + +## Checklist for a new method + +- [ ] One file in the right folder, from `_templates/` where there + is one, with the standard header. +- [ ] Registered with a one-line description and, for a rule, what + it `requires`. +- [ ] `check_engine()` passes, for an engine. +- [ ] `Rscript 1_code/tests/run_tests.R` passes. +- [ ] Tried on one species and a few draws (`species = "one_each"`, + `n_bootstraps = 5`) before a full run. diff --git a/1_code/methods/_templates/engine_template.R b/1_code/methods/_templates/engine_template.R new file mode 100644 index 0000000..4e89add --- /dev/null +++ b/1_code/methods/_templates/engine_template.R @@ -0,0 +1,94 @@ +# --- +# title: Engine - [Name] +# author: [Your Name] +# created: [YYYY-MM-DD] +# inputs: none +# outputs: registers the `[name]` engine +# notes: +# - A template. Copy to 1_code/methods/engines/[name].R, fill in +# the four functions, and run check_engine(engine_[name]()) +# until every check passes. Then name it in a spec stage: +# `engine = "[name]"`. +# - The contract, in full, is in 1_code/methods/README.md. In +# short: +# - fit() never raises. It returns list(fit, ok, message), +# with ok = FALSE and the error message when fitting fails, +# because a candidate set is expected to hold models that +# cannot be fitted for every species and draw. +# - predict() returns one number per row of newdata, or NULL +# when it cannot. An offset in the formula +# (`+ offset(offset)`) must be applied to new data. +# - Declare only the capabilities the engine really has. +# Selection rules check them: a rule that ranks candidates +# needs `ic`; one that averages coefficients needs +# `coefficients`; inverse-variance averaging needs `se`. +# With none of them, use the `single` rule. +# - Load any package lazily with requireNamespace(), so a run +# that does not use this engine does not need the package. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +# [package], lazily; see the header. + +# 2. engine_[name]() ---- + +#' [One-line title of the method] +#' +#' [What it fits, and any setting it takes through `control`.] +#' +#' @return An engine definition. +#' +#' @example # Example usage of the function +#' # check_engine(engine_[name]()) +engine_template <- function() { + list( + name = "[name]", + description = "[One line for list_methods()]", + + # A subset of engine_capabilities(): "coefficients", "ic", + # "se", "converged" + capabilities = character(0), + + # Step 1: Fit. Never raise; return the failure instead. + fit = function(formula, data, family, weights = NULL, + offset = NULL, control = list()) { + tryCatch( + { + fit <- NULL # [fit the model with formula and data] + list(fit = fit, ok = TRUE, message = NA_character_) + }, + error = function(e) { + list(fit = NULL, ok = FALSE, message = conditionMessage(e)) + } + ) + }, + + # Step 2: Predict. `type` is "link" or "response"; with + # se = TRUE (only when declared), list(fit, se.fit). + predict = function(fit, newdata, type = "link", se = FALSE) { + if (is.null(fit) || !isTRUE(fit$ok)) { + return(NULL) + } + + tryCatch( + NULL, # [predict fit$fit onto newdata, one value per row] + error = function(e) NULL + ) + }, + + # Step 3, when declared: a data frame of term, estimate, se + coef = NULL, + + # Step 4, when declared: a number for type "AIC", "AICc" or + # "BIC"; Inf for a failed fit, so it never wins + ic = NULL + ) +} + +# 3. Register ---- +# Uncomment once check_engine() passes: +# register_engine(engine_template()) + +# End of script ---- diff --git a/1_code/methods/_templates/selection_template.R b/1_code/methods/_templates/selection_template.R new file mode 100644 index 0000000..6aa36c6 --- /dev/null +++ b/1_code/methods/_templates/selection_template.R @@ -0,0 +1,80 @@ +# --- +# title: Selection Rule - [Name] +# author: [Your Name] +# created: [YYYY-MM-DD] +# inputs: none +# outputs: registers the `[name]` rule +# notes: +# - A template. Copy to 1_code/methods/selection/[name].R and +# fill it in. Then name it in a spec stage: +# `selection = "[name]"`. +# - A rule turns a candidate set into one result. It fits its +# own candidates, with fit_candidates(), and returns +# selection_result(). +# - Any argument beyond the standard nine is a setting, filled +# from the stage field of the same name. A stage with +# `my_threshold = 3` passes 3 to a rule declaring +# `my_threshold`. No harness change is needed. +# - Read coefficients with engine_coef(engine, fit), never with +# coef() on the fitted object, so the rule works with any +# engine that declares `coefficients`. +# - When the rule combines candidates, pass `predict` to +# selection_result() - combined_predictor() builds one - so +# metrics and grid predictions use the combined model rather +# than one candidate. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +# Base R only. + +# 2. select_[name]() ---- + +#' [One-line title of the rule] +#' +#' @inheritParams select_single +#' @param [setting] [What the stage field sets.] +#' @return A selection result. +#' +#' @example # Example usage of the function +#' # select_[name](models, response ~ 1, d, get_engine("glm"), +#' # "binomial") +select_template <- function( + models, base, data, engine, family, + weights = NULL, offset = NULL, ic = "AICc", control = list() +) { + # Step 1: Fit every candidate + fitted <- fit_candidates( + models, base, data, engine, family, weights, offset, ic, + control + ) + table <- candidate_table(fitted) + + if (!any(table$ok)) { + return(selection_result(NULL, NULL, table, fitted)) + } + + # Step 2: Choose or combine. [Replace with the rule.] + chosen <- which(table$ok)[1] + + # Step 3: Return the result + selection_result( + fit = fitted$fits[[chosen]], + coefficients = engine_coef(engine, fitted$fits[[chosen]]), + ic_table = table, + fitted = fitted, + engine = engine + ) +} + +# 3. Register ---- +# Name the engine capabilities the rule needs in `requires`. +# Uncomment when ready: +# register_selection( +# "[name]", select_template, +# "[One line for list_methods()]", +# requires = character(0) +# ) + +# End of script ---- diff --git a/1_code/methods/engines/_glm_family.R b/1_code/methods/engines/_glm_family.R new file mode 100644 index 0000000..84c3eb7 --- /dev/null +++ b/1_code/methods/engines/_glm_family.R @@ -0,0 +1,258 @@ +# --- +# title: Shared Implementation for GLM-Family Engines +# author: Brendan Casey +# created: 2026-09-09 +# inputs: none +# outputs: none; defines functions in memory +# notes: +# - glm and bayesglm take the same arguments and return objects +# of the same shape, so fitting, coefficients, prediction and +# scoring are written once here and both engines point at +# them. A new engine with a different shape writes its own. +# - The leading underscore makes the loader source this before +# the engine files that use it. +# - Fitting failures are caught and returned, not raised. A +# candidate model set is expected to contain models that +# cannot be estimated for a given species and bootstrap, and +# the selection rule needs to see which ones failed. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +# Base R only. + +# 2. fit_glm_family() ---- + +#' Fit a GLM-Family Model, Catching Failure +#' +#' @param fitter Function. stats::glm or arm::bayesglm. +#' @param formula A model formula. +#' @param data A data frame. +#' @param family Character or family object. +#' @param weights Numeric vector or NULL. +#' @param offset Numeric vector or NULL. +#' @param control Named list of extra arguments to the fitter. +#' @return A list with `fit` (or NULL), `ok`, and `message`. +#' +#' @example # Example usage of the function +#' # fit_glm_family(stats::glm, y ~ x, d, "binomial") +fit_glm_family <- function( + fitter, + formula, + data, + family, + weights = NULL, + offset = NULL, + control = list() +) { + args <- c( + list(formula = formula, data = data, family = family), + control + ) + + # Weights and offsets are passed as values rather than named in + # the formula, so the same formula serves a taxon that has them + # and one that does not. + if (!is.null(weights)) { + args$weights <- weights + } + + if (!is.null(offset)) { + args$offset <- offset + } + + # A convergence warning still leaves a usable fit, so it is + # recorded rather than treated as a failure. It is caught with + # withCallingHandlers() and muffled, so the model is fitted + # once; catching it with tryCatch() would abandon the fit and + # force a second one. + warnings_seen <- character(0) + + tryCatch( + { + fit <- withCallingHandlers( + do.call(fitter, args), + warning = function(w) { + warnings_seen <<- c(warnings_seen, conditionMessage(w)) + invokeRestart("muffleWarning") + } + ) + + list( + fit = fit, + ok = TRUE, + message = if (length(warnings_seen) == 0) { + NA_character_ + } else { + paste(unique(warnings_seen), collapse = "; ") + } + ) + }, + error = function(e) { + list(fit = NULL, ok = FALSE, message = conditionMessage(e)) + } + ) +} + +# 3. fit_coefficients() ---- + +#' Take Coefficients and Standard Errors from a Fit +#' +#' @param fit A list from fit_glm_family(). +#' @return A data frame of term, estimate and se, or NULL when +#' the fit failed. +#' +#' @example # Example usage of the function +#' # fit_coefficients(fit) +fit_coefficients <- function(fit) { + if (is.null(fit) || !isTRUE(fit$ok) || is.null(fit$fit)) { + return(NULL) + } + + estimates <- stats::coef(fit$fit) + errors <- tryCatch( + stats::coef(summary(fit$fit))[, "Std. Error"], + error = function(e) rep(NA_real_, length(estimates)) + ) + + data.frame( + term = names(estimates), + estimate = as.numeric(estimates), + se = as.numeric(errors[match(names(estimates), names(errors))]), + stringsAsFactors = FALSE + ) +} + +# 4. fit_predict() ---- + +#' Predict from a Fit +#' +#' @param fit A list from fit_glm_family(). +#' @param newdata A data frame to predict onto. +#' @param type Character. "link" or "response". +#' @param se Logical. Return standard errors alongside the fit. +#' @return A numeric vector, or when `se` is TRUE a list of `fit` +#' and `se.fit`. NULL when the fit failed. +#' +#' @example # Example usage of the function +#' # fit_predict(fit, prediction_grid, type = "response") +#' # fit_predict(fit, grid, "link", se = TRUE)$se.fit +fit_predict <- function(fit, newdata, type = "link", se = FALSE) { + if (is.null(fit) || !isTRUE(fit$ok) || is.null(fit$fit)) { + return(NULL) + } + + tryCatch( + { + predicted <- stats::predict( + fit$fit, newdata = newdata, type = type, se.fit = se + ) + + if (!se) { + return(as.numeric(predicted)) + } + + list( + fit = as.numeric(predicted$fit), + se.fit = as.numeric(predicted$se.fit) + ) + }, + error = function(e) NULL + ) +} + +# 5. information_criterion() ---- + +#' Score a Fit for Model Selection +#' +#' AICc rather than AIC by default, because the candidate sets +#' are large relative to the number of survey units a rare +#' species is detected at. +#' +#' @param fit A list from fit_glm_family(). +#' @param type Character. "AIC", "AICc" or "BIC". +#' @return A numeric value; Inf when the fit failed, so a failed +#' model never wins a selection. +#' +#' @example # Example usage of the function +#' # information_criterion(fit, "BIC") +information_criterion <- function(fit, type = "AICc") { + if (is.null(fit) || !isTRUE(fit$ok) || is.null(fit$fit)) { + return(Inf) + } + + value <- tryCatch( + switch( + type, + AIC = stats::AIC(fit$fit), + BIC = stats::BIC(fit$fit), + AICc = { + # The parameter count is the log-likelihood's degrees of + # freedom, as MuMIn uses, not the length of the + # coefficient vector, which also counts aliased (NA) + # terms and so over-penalizes a rank-deficient model. + k <- attr(stats::logLik(fit$fit), "df") + n <- stats::nobs(fit$fit) + # The correction is undefined once the parameter count + # reaches the sample size; Inf keeps such a model out of + # the selection rather than returning a negative score. + if (is.na(n) || n - k - 1 <= 0) { + Inf + } else { + stats::AIC(fit$fit) + (2 * k * (k + 1)) / (n - k - 1) + } + }, + stop( + "Unknown information criterion `", type, "`.", + call. = FALSE + ) + ), + error = function(e) Inf + ) + + if (is.na(value)) Inf else value +} + +# 6. fit_converged() ---- + +#' Did a Fit Converge +#' +#' @param fit A list from fit_glm_family(). +#' @return Logical. FALSE when the fit failed or did not +#' converge. +#' +#' @example # Example usage of the function +#' # fit_converged(fit) +fit_converged <- function(fit) { + if (is.null(fit) || !isTRUE(fit$ok) || is.null(fit$fit)) { + return(FALSE) + } + + converged <- fit$fit$converged + + if (is.null(converged)) { + return(TRUE) + } + + isTRUE(converged) +} + +# 7. fit_nobs() ---- + +#' Number of Observations a Fit Used +#' +#' @param fit A list from fit_glm_family(). +#' @return An integer, or NA when the fit failed. +#' +#' @example # Example usage of the function +#' # fit_nobs(fit) +fit_nobs <- function(fit) { + if (is.null(fit) || !isTRUE(fit$ok) || is.null(fit$fit)) { + return(NA_integer_) + } + + as.integer(stats::nobs(fit$fit)) +} + +# End of script ---- diff --git a/1_code/methods/engines/bayesglm.R b/1_code/methods/engines/bayesglm.R new file mode 100644 index 0000000..2228b0f --- /dev/null +++ b/1_code/methods/engines/bayesglm.R @@ -0,0 +1,83 @@ +# --- +# title: Engine - Penalized GLM with Weakly Informative Priors +# author: Brendan Casey +# created: 2026-09-09 +# inputs: none +# outputs: registers the `bayesglm` engine +# notes: +# - arm::bayesglm with its default Cauchy priors, which is what +# the v2 plant models use. +# - bayesglm and glm sit on different axes and should not be +# read as "frequentist versus Bayesian". bayesglm is +# penalized maximum likelihood - augmented IRLS under weakly +# informative Cauchy priors - giving a point estimate and a +# standard error, with no posterior. It belongs on a +# regularization axis. A Bayesian framework comparison needs +# brms or rstanarm. +# - The plant v2 models use it because rare species fitted +# against 30-term habitat formulas separate completely, and +# plain glm then returns infinite coefficients. The +# regularization is load-bearing, so swapping plants to glm as +# a control will fail outright for the rare end of the species +# list rather than give a clean comparison. +# - arm is loaded lazily, so a run that never uses this engine +# does not need it installed. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +# arm, lazily; see the header. + +# 2. engine_bayesglm() ---- + +#' Penalized GLM with Weakly Informative Priors +#' +#' @return An engine definition. +#' +#' @example # Example usage of the function +#' # e <- engine_bayesglm() +engine_bayesglm <- function() { + list( + name = "bayesglm", + description = paste( + "Penalized GLM, weakly informative Cauchy priors", + "(arm::bayesglm)" + ), + capabilities = c("coefficients", "ic", "se", "converged"), + fit = function(formula, data, family, weights = NULL, + offset = NULL, control = list()) { + if (!requireNamespace("arm", quietly = TRUE)) { + stop( + "The bayesglm engine needs the arm package.", + call. = FALSE + ) + } + + # maxit defaults to the v2 value, which was raised from the + # arm default because rare species converge slowly + if (is.null(control$maxit)) { + control$maxit <- 250 + } + + fit_glm_family( + arm::bayesglm, formula, data, family, weights, offset, + control + ) + }, + coef = fit_coefficients, + predict = function(fit, newdata, type = "link", se = FALSE) { + fit_predict(fit, newdata, type, se) + }, + ic = function(fit, type = "AICc") { + information_criterion(fit, type) + }, + converged = fit_converged, + nobs = fit_nobs + ) +} + +# 3. Register ---- +register_engine(engine_bayesglm()) + +# End of script ---- diff --git a/1_code/methods/engines/glm.R b/1_code/methods/engines/glm.R new file mode 100644 index 0000000..fe859fc --- /dev/null +++ b/1_code/methods/engines/glm.R @@ -0,0 +1,55 @@ +# --- +# title: Engine - Generalized Linear Model (glm) +# author: Brendan Casey +# created: 2026-09-09 +# inputs: none +# outputs: registers the `glm` engine +# notes: +# - stats::glm. The engine the v2 mammal and bird models fit +# with. +# - Shares its implementation with bayesglm; see +# _glm_family.R. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +# Base R only. + +# 2. engine_glm() ---- + +#' Plain Generalized Linear Model +#' +#' @return An engine definition. +#' +#' @example # Example usage of the function +#' # e <- engine_glm() +#' # fit <- e$fit(response ~ MAP, data, family = "binomial") +engine_glm <- function() { + list( + name = "glm", + description = "Generalized linear model (stats::glm)", + capabilities = c("coefficients", "ic", "se", "converged"), + fit = function(formula, data, family, weights = NULL, + offset = NULL, control = list()) { + fit_glm_family( + stats::glm, formula, data, family, weights, offset, + control + ) + }, + coef = fit_coefficients, + predict = function(fit, newdata, type = "link", se = FALSE) { + fit_predict(fit, newdata, type, se) + }, + ic = function(fit, type = "AICc") { + information_criterion(fit, type) + }, + converged = fit_converged, + nobs = fit_nobs + ) +} + +# 3. Register ---- +register_engine(engine_glm()) + +# End of script ---- diff --git a/1_code/methods/metrics/auc.R b/1_code/methods/metrics/auc.R new file mode 100644 index 0000000..60fdc4d --- /dev/null +++ b/1_code/methods/metrics/auc.R @@ -0,0 +1,64 @@ +# --- +# title: Metric - Area Under the ROC Curve +# author: Brendan Casey +# created: 2026-09-09 +# inputs: none +# outputs: registers the `auc` metric +# notes: +# - Takes observed and predicted vectors on the response scale +# and returns one number. Computed from predictions only, so +# every engine is scored the same way. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +# Base R only. + +# 2. metric_auc() ---- + +#' Area Under the ROC Curve +#' +#' The Mann-Whitney form: the probability that a randomly chosen +#' detection scores above a randomly chosen non-detection, with +#' ties counting a half. Values above zero are treated as +#' detections, so a count or a density scores the same way a +#' presence does. +#' +#' @param observed,predicted Numeric vectors. +#' @return A number between 0 and 1, or NA when the observations +#' are all detections or all non-detections. +#' +#' @example # Example usage of the function +#' # metric_auc(c(0, 0, 1, 1), c(0.1, 0.3, 0.4, 0.9)) +metric_auc <- function(observed, predicted) { + positive <- observed > 0 + + # An AUC needs both classes present. A bootstrap where a + # species was never detected has none, which is a fact about + # the draw rather than a failure. + if (!any(positive) || all(positive)) { + return(NA_real_) + } + + ranks <- rank(predicted, ties.method = "average") + + # Counted as doubles, not integers. sum() of a logical returns + # an integer, and at bird scale - 16,745 detections against + # 199,013 non-detections - their product is 3.3e9, past the + # 32-bit maximum. That overflows to NA silently, so every large + # run would report no AUC at all. + n_pos <- as.numeric(sum(positive)) + n_neg <- as.numeric(sum(!positive)) + + (sum(ranks[positive]) - n_pos * (n_pos + 1) / 2) / + (n_pos * n_neg) +} + +# 3. Register ---- +register_metric( + "auc", metric_auc, + "Area under the ROC curve (Mann-Whitney, ties count a half)" +) + +# End of script ---- diff --git a/1_code/methods/metrics/calibration_slope.R b/1_code/methods/metrics/calibration_slope.R new file mode 100644 index 0000000..7d80f90 --- /dev/null +++ b/1_code/methods/metrics/calibration_slope.R @@ -0,0 +1,46 @@ +# --- +# title: Metric - Calibration Slope +# author: Brendan Casey +# created: 2026-09-09 +# inputs: none +# outputs: registers the `calibration_slope` metric +# notes: +# - Takes observed and predicted vectors on the response scale +# and returns one number. Computed from predictions only, so +# every engine is scored the same way. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +# Base R only. + +# 2. metric_calibration_slope() ---- + +#' Calibration Slope +#' +#' The slope of observed on predicted. One is perfect +#' calibration; below one means the predictions are too extreme, +#' which is the usual signature of overfitting and the thing a +#' regularized fit is trying to fix. +#' +#' @param observed,predicted Numeric vectors. +#' @return A number. +#' +#' @example # Example usage of the function +#' # metric_calibration_slope(c(0, 1, 1), c(0.2, 0.6, 0.8)) +metric_calibration_slope <- function(observed, predicted) { + if (stats::sd(predicted) == 0) { + return(NA_real_) + } + + unname(stats::coef(stats::lm(observed ~ predicted))[2]) +} + +# 3. Register ---- +register_metric( + "calibration_slope", metric_calibration_slope, + "Slope of observed on predicted; 1 is well calibrated" +) + +# End of script ---- diff --git a/1_code/methods/metrics/deviance_explained.R b/1_code/methods/metrics/deviance_explained.R new file mode 100644 index 0000000..5b34973 --- /dev/null +++ b/1_code/methods/metrics/deviance_explained.R @@ -0,0 +1,62 @@ +# --- +# title: Metric - Deviance Explained +# author: Brendan Casey +# created: 2026-09-09 +# inputs: none +# outputs: registers the `deviance_explained` metric +# notes: +# - Takes observed and predicted vectors on the response scale +# and returns one number. Computed from predictions only, so +# every engine is scored the same way. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +# Base R only. + +# 2. metric_deviance_explained() ---- + +#' Proportion of Null Deviance Explained +#' +#' Poisson deviance for counts, Bernoulli for detections, chosen +#' from whether the observations are all zero or one. +#' +#' @param observed,predicted Numeric vectors. +#' @return A number, or NA when the null deviance is zero. +#' +#' @example # Example usage of the function +#' # metric_deviance_explained(c(0, 1, 2), c(0.2, 0.9, 1.8)) +metric_deviance_explained <- function(observed, predicted) { + binary <- all(observed %in% c(0, 1)) + + deviance <- function(y, mu) { + mu <- pmax(mu, 1e-10) + + if (binary) { + mu <- pmin(mu, 1 - 1e-10) + -2 * sum(y * log(mu) + (1 - y) * log(1 - mu)) + } else { + terms <- ifelse(y > 0, y * log(y / mu), 0) + 2 * sum(terms - (y - mu)) + } + } + + null_deviance <- deviance( + observed, rep(mean(observed), length(observed)) + ) + + if (!is.finite(null_deviance) || null_deviance <= 0) { + return(NA_real_) + } + + 1 - deviance(observed, predicted) / null_deviance +} + +# 3. Register ---- +register_metric( + "deviance_explained", metric_deviance_explained, + "Share of null deviance explained (Bernoulli or Poisson)" +) + +# End of script ---- diff --git a/1_code/methods/metrics/n.R b/1_code/methods/metrics/n.R new file mode 100644 index 0000000..ac30238 --- /dev/null +++ b/1_code/methods/metrics/n.R @@ -0,0 +1,37 @@ +# --- +# title: Metric - Units Scored +# author: Brendan Casey +# created: 2026-09-09 +# inputs: none +# outputs: registers the `n` metric +# notes: +# - Takes observed and predicted vectors on the response scale +# and returns one number. Computed from predictions only, so +# every engine is scored the same way. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +# Base R only. + +# 2. metric_n() ---- + +#' Number of Survey Units Scored +#' +#' @param observed,predicted Numeric vectors. +#' @return An integer. +#' +#' @example # Example usage of the function +#' # metric_n(c(0, 1), c(0.2, 0.7)) +metric_n <- function(observed, predicted) { + length(observed) +} + +# 3. Register ---- +register_metric( + "n", metric_n, + "Number of units scored" +) + +# End of script ---- diff --git a/1_code/methods/metrics/prevalence.R b/1_code/methods/metrics/prevalence.R new file mode 100644 index 0000000..456786a --- /dev/null +++ b/1_code/methods/metrics/prevalence.R @@ -0,0 +1,41 @@ +# --- +# title: Metric - Prevalence +# author: Brendan Casey +# created: 2026-09-09 +# inputs: none +# outputs: registers the `prevalence` metric +# notes: +# - Takes observed and predicted vectors on the response scale +# and returns one number. Computed from predictions only, so +# every engine is scored the same way. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +# Base R only. + +# 2. metric_prevalence() ---- + +#' Proportion of Survey Units with a Detection +#' +#' Carried alongside the scores because most of them are only +#' interpretable against it: an AUC of 0.9 means something +#' different at 2 per cent prevalence than at 40. +#' +#' @param observed,predicted Numeric vectors. +#' @return A number between 0 and 1. +#' +#' @example # Example usage of the function +#' # metric_prevalence(c(0, 0, 1), c(0, 0, 0)) +metric_prevalence <- function(observed, predicted) { + mean(observed > 0) +} + +# 3. Register ---- +register_metric( + "prevalence", metric_prevalence, + "Proportion of units with a detection" +) + +# End of script ---- diff --git a/1_code/methods/metrics/rmse.R b/1_code/methods/metrics/rmse.R new file mode 100644 index 0000000..7fae66f --- /dev/null +++ b/1_code/methods/metrics/rmse.R @@ -0,0 +1,37 @@ +# --- +# title: Metric - Root Mean Squared Error +# author: Brendan Casey +# created: 2026-09-09 +# inputs: none +# outputs: registers the `rmse` metric +# notes: +# - Takes observed and predicted vectors on the response scale +# and returns one number. Computed from predictions only, so +# every engine is scored the same way. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +# Base R only. + +# 2. metric_rmse() ---- + +#' Root Mean Squared Error +#' +#' @param observed,predicted Numeric vectors. +#' @return A number. +#' +#' @example # Example usage of the function +#' # metric_rmse(c(0, 1), c(0.1, 0.8)) +metric_rmse <- function(observed, predicted) { + sqrt(mean((observed - predicted)^2)) +} + +# 3. Register ---- +register_metric( + "rmse", metric_rmse, + "Root mean squared error" +) + +# End of script ---- diff --git a/1_code/methods/metrics/spearman.R b/1_code/methods/metrics/spearman.R new file mode 100644 index 0000000..9fb90b8 --- /dev/null +++ b/1_code/methods/metrics/spearman.R @@ -0,0 +1,44 @@ +# --- +# title: Metric - Spearman Correlation +# author: Brendan Casey +# created: 2026-09-09 +# inputs: none +# outputs: registers the `spearman` metric +# notes: +# - Takes observed and predicted vectors on the response scale +# and returns one number. Computed from predictions only, so +# every engine is scored the same way. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +# Base R only. + +# 2. metric_spearman() ---- + +#' Rank Correlation of Observed and Predicted +#' +#' Scale-free, so it compares a density model against a count +#' model without either being rescaled. +#' +#' @param observed,predicted Numeric vectors. +#' @return A number between -1 and 1. +#' +#' @example # Example usage of the function +#' # metric_spearman(c(0, 1, 2), c(0.1, 0.5, 0.9)) +metric_spearman <- function(observed, predicted) { + if (stats::sd(observed) == 0 || stats::sd(predicted) == 0) { + return(NA_real_) + } + + stats::cor(observed, predicted, method = "spearman") +} + +# 3. Register ---- +register_metric( + "spearman", metric_spearman, + "Rank correlation of observed and predicted" +) + +# End of script ---- diff --git a/1_code/methods/resampling/precomputed.R b/1_code/methods/resampling/precomputed.R new file mode 100644 index 0000000..21f7bd5 --- /dev/null +++ b/1_code/methods/resampling/precomputed.R @@ -0,0 +1,194 @@ +# --- +# title: Resampling Scheme - Precomputed Draws +# author: Brendan Casey +# created: 2026-09-09 +# inputs: +# in 0_data/test_dataset/, where lookup/dataset_manifest.csv +# says (`bootstrap_ids`, `bootstrap_layout`): +# - per_taxon_csv: one table, one column per draw (birds) +# - per_species_rds: one file per species (plant groups) +# outputs: registers the `precomputed` scheme +# notes: +# - Replays draws the source pipeline stored. Replaying v2's own +# draws is what makes parity numerical rather than +# distributional: the harness then fits the same rows v2 +# fitted, draw by draw. +# - Two layouts. Birds store one table for the taxon, one column +# per draw, keyed on `surveyid`. The plant-group taxa store +# v2's draws per species, because v2 drew them per species, +# written by 1_code/_setup/07_harmonize_v2_plant_bootstrap_ids.R. +# - The seed is ignored: the draws are stored, not drawn. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +library(data.table) # lookup table reading (version: 1.16.4) + +# 2. resample_precomputed() ---- + +#' Read Bootstrap Ids the Source Pipeline Generated +#' +#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param taxon Character. Taxon slug. +#' @param iterations Integer vector of bootstrap iterations. +#' @param id_column Character. The column in the covariate frame +#' the stored ids refer to, when they are not survey unit ids. +#' @param frame A data frame carrying `survey_unit_id` and +#' `id_column`, used to translate stored ids into survey unit +#' ids. NULL when the stored ids are already unit ids. +#' @param species Character. The species, for per-species ids. +#' @param per_species Logical. Read the per-species layout. +#' @param unique_ids Logical. Keep each unit once per draw. v2's +#' bird scripts select a draw with `%in%`, so a unit drawn twice +#' is fitted once; the plant scripts index rows, so repeats +#' count. +#' @return A list of character vectors, one per iteration. +#' +#' @example # Example usage of the function +#' # ids <- resample_precomputed(data_dir, "bird", 1:3, +#' # id_column = "surveyid", +#' # frame = frame, unique_ids = TRUE) +resample_precomputed <- function( + data_dir, + taxon, + iterations, + id_column = NULL, + frame = NULL, + species = NULL, + per_species = FALSE, + unique_ids = FALSE +) { + # Step 1: Read the stored draws, as a list of id vectors + stored <- read_stored_draws(data_dir, taxon, species, per_species) + + if (max(iterations) > length(stored)) { + stop( + taxon, " has ", length(stored), " precomputed bootstrap ", + "iterations; ", max(iterations), " were requested.", + call. = FALSE + ) + } + + lapply(iterations, function(i) { + ids <- stored[[i]] + ids <- ids[!is.na(ids)] + + if (unique_ids) { + ids <- unique(ids) + } + + # Step 2: Translate to survey unit ids when the stored ids + # are a different key, which is how the bird ids are stored + if (is.null(id_column)) { + return(as.character(ids)) + } + + if (is.null(frame) || !id_column %in% names(frame)) { + stop( + "Translating precomputed ids needs a frame carrying `", + id_column, "`.", + call. = FALSE + ) + } + + matched <- match(ids, frame[[id_column]]) + as.character(frame$survey_unit_id[matched[!is.na(matched)]]) + }) +} + +## 2.1 read_stored_draws() ---- + +#' Read One Taxon's or Species' Stored Draws +#' +#' Cached for the session, because a bird run otherwise re-reads +#' the 38 MB draw table once per species. +#' +#' @param data_dir,taxon,species,per_species As in +#' resample_precomputed(). +#' @return A list of id vectors, one per stored draw. +#' +#' @example # Example usage of the function +#' # length(read_stored_draws(data_dir, "bird", NULL, FALSE)) +read_stored_draws <- function(data_dir, taxon, species, per_species) { + location <- manifest_entry(data_dir, taxon)$bootstrap_ids + + if (is.na(location)) { + stop( + "The dataset manifest records no stored bootstrap draws ", + "for ", taxon, ". Use a scheme that draws them, such as ", + "spatial_block.", + call. = FALSE + ) + } + + if (per_species) { + path <- file.path(data_dir, location, paste0(species, ".rds")) + + if (is.null(species) || !file.exists(path)) { + stop( + "No stored v2 bootstrap ids for ", taxon, " ", + species, ":\n ", path, + "\nRun 1_code/_setup/07_harmonize_v2_plant_bootstrap_ids.R", + " for this species, or use the spatial_block scheme.", + call. = FALSE + ) + } + + stored <- readRDS(path) + + # v2 stores a species' draws as a matrix, units by draws + if (is.matrix(stored)) { + stored <- lapply(seq_len(ncol(stored)), function(j) stored[, j]) + } + + return(stored) + } + + path <- file.path(data_dir, location) + + if (!file.exists(path)) { + stop( + "No precomputed bootstrap ids for ", taxon, ":\n ", path, + "\nUse a different resampling scheme, or generate them.", + call. = FALSE + ) + } + + cached_read(path, function(p) as.list(fread(p))) +} + +# 3. resampler_precomputed() ---- + +#' The Registered Form of the Precomputed Scheme +#' +#' @param frame The one-species frame. +#' @param iterations Integer vector. +#' @param seed Ignored; the draws are stored. +#' @param context List with `data_dir`, `taxon` and `species`. +#' @param id_column,per_species,unique_ids Settings from the +#' spec's `resample` list; see resample_precomputed(). +#' @return A list of character vectors of survey unit ids. +#' +#' @example # Example usage of the function +#' # resampler_precomputed(frame, 1:5, NULL, context, +#' # id_column = "surveyid") +resampler_precomputed <- function( + frame, iterations, seed, context, + id_column = NULL, per_species = FALSE, unique_ids = FALSE +) { + resample_precomputed( + data_dir = context$data_dir, taxon = context$taxon, + iterations = iterations, id_column = id_column, frame = frame, + species = context$species, per_species = per_species, + unique_ids = unique_ids + ) +} + +# 4. Register ---- +register_resampler( + "precomputed", resampler_precomputed, + "Replay draws stored with the dataset (v2 birds; plant v2_ids)" +) + +# End of script ---- diff --git a/1_code/methods/resampling/spatial_block.R b/1_code/methods/resampling/spatial_block.R new file mode 100644 index 0000000..45d8057 --- /dev/null +++ b/1_code/methods/resampling/spatial_block.R @@ -0,0 +1,181 @@ +# --- +# title: Resampling Scheme - Spatially Blocked Bootstrap +# author: Brendan Casey +# created: 2026-09-09 +# inputs: none +# outputs: registers the `spatial_block` scheme +# notes: +# - Reproduces the v2 plant bootstrap: resample survey units +# with replacement within coarse latitude and longitude +# blocks, so a draw keeps the geographic spread rather than +# drifting toward whichever region is best surveyed. +# - Iteration 1 is the complete data, matching v2, so the first +# fit of every run is the full-data fit. +# - Every draw comes from one stream under the species' seed, so +# draws 1 to 5 of a 5-draw run are the same as draws 1 to 5 of +# a 100-draw run. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +# Base R only. + +# 2. resample_spatial_block() ---- + +#' Draw a Spatially Blocked Bootstrap +#' +#' Resamples survey units with replacement within each spatial +#' block, so every block keeps its original number of units. +#' +#' @param frame A data frame with `survey_unit_id` and the +#' coordinate columns. +#' @param iterations Integer vector of bootstrap iterations. +#' @param long_column,lat_column Character. Coordinate columns. +#' @param min_detections Integer. Redraw a block set until at +#' least this many detections are present, or 0 to skip the +#' check. +#' @param response Numeric vector, one per row of `frame`, used +#' only for the detection check. +#' @param max_attempts Integer. How many redraws before giving +#' up, so a species that can never meet the threshold fails +#' rather than looping forever. +#' @param seed Integer or NULL. NULL leaves the stream unseeded, +#' which is what v2 did. +#' @return A list of character vectors, one per iteration. +#' +#' @example # Example usage of the function +#' # ids <- resample_spatial_block(frame, 1:5, seed = 42) +resample_spatial_block <- function( + frame, + iterations, + long_column = "long", + lat_column = "lat", + min_detections = 0L, + response = NULL, + max_attempts = 100L, + seed = harness_seed() +) { + for (one in c(long_column, lat_column)) { + if (!one %in% names(frame)) { + stop( + "Spatial blocking needs `", one, "` in the frame.", + call. = FALSE + ) + } + } + + units <- as.character(frame$survey_unit_id) + blocks <- spatial_blocks( + frame[[long_column]], frame[[lat_column]] + ) + by_block <- split(seq_along(units), blocks) + + draw_once <- function() { + unlist( + lapply( + by_block, + function(rows) sample(rows, length(rows), replace = TRUE) + ), + use.names = FALSE + ) + } + + with_seed(seed, lapply(iterations, function(i) { + # Step 1: Iteration 1 is the complete data, as in v2 + if (i == 1L) { + return(units) + } + + # Step 2: Redraw until the sample carries enough detections + # for a model to be estimable + for (attempt in seq_len(max_attempts)) { + rows <- draw_once() + + if (min_detections <= 0L || is.null(response)) { + return(units[rows]) + } + + if (sum(response[rows] > 0, na.rm = TRUE) >= min_detections) { + return(units[rows]) + } + } + + stop( + "No spatially blocked draw reached ", min_detections, + " detections in ", max_attempts, " attempts. The species ", + "is probably too rare to bootstrap at this threshold.", + call. = FALSE + ) + })) +} + +# 3. resampler_spatial_block() ---- + +#' The Registered Form of the Spatially Blocked Bootstrap +#' +#' Adds v2's redraw rule: a sample is redrawn for detections only +#' when the full data could meet the threshold in at least one +#' model region; otherwise the first draw is taken. Checked per +#' region, on the full data. +#' +#' @param frame The one-species frame. +#' @param iterations Integer vector. +#' @param seed Integer or NULL. This species' seed. +#' @param context List with `spec` and `response_name`. +#' @param min_detections,long_column,lat_column,max_attempts +#' Settings from the spec's `resample` list. +#' @return A list of character vectors of survey unit ids. +#' +#' @example # Example usage of the function +#' # resampler_spatial_block(frame, 1:5, 42L, context, +#' # min_detections = 20L) +resampler_spatial_block <- function( + frame, iterations, seed, context, + min_detections = 0L, long_column = "long", lat_column = "lat", + max_attempts = 100L +) { + response <- frame[[context$response_name]] + + if (min_detections > 0) { + viable <- any(vapply(context$spec$regions, function(region) { + # A region whose filter names columns this frame lacks - + # another region's, when the draw is not province-wide - + # cannot be judged here, and does not count. + if (!is.null(region$filter) && + !all(all.vars(region$filter) %in% names(frame))) { + return(FALSE) + } + + in_region <- if (is.null(region$filter)) { + rep(TRUE, nrow(frame)) + } else { + keep <- eval(rlang_f_rhs(region$filter), frame) + !is.na(keep) & keep + } + + sum(response[in_region] > 0, na.rm = TRUE) >= min_detections + }, logical(1))) + + if (!viable) { + min_detections <- 0L + } + } + + # `seed = NULL` is passed through deliberately: it means + # unseeded, not the resampler's harness_seed() default. + resample_spatial_block( + frame = frame, iterations = iterations, + long_column = long_column, lat_column = lat_column, + min_detections = min_detections, response = response, + max_attempts = max_attempts, seed = seed + ) +} + +# 4. Register ---- +register_resampler( + "spatial_block", resampler_spatial_block, + "Bootstrap within coarse spatial blocks (v2 plants, mammals)" +) + +# End of script ---- diff --git a/1_code/methods/resampling/spatial_cv.R b/1_code/methods/resampling/spatial_cv.R new file mode 100644 index 0000000..94117f2 --- /dev/null +++ b/1_code/methods/resampling/spatial_cv.R @@ -0,0 +1,109 @@ +# --- +# title: Resampling Scheme - Spatial Cross-Validation +# author: Brendan Casey +# created: 2026-09-09 +# inputs: none +# outputs: registers the `spatial_cv` scheme +# notes: +# - Holds out whole spatial blocks rather than random units, so +# a held-out score is not inflated by a training unit sitting +# beside its own test unit. This is the scheme a spatial +# autocorrelation experiment needs; v2 has no equivalent. +# - One "iteration" per fold. Each draw is that fold's training +# units, so the fold's test units are exactly what the harness +# scores as out-of-bag (`oob_` metrics). Set `n_bootstraps` to +# the number of folds wanted. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +# Base R only. + +# 2. resample_spatial_cv() ---- + +#' Split Survey Units into Spatial Cross-Validation Folds +#' +#' @param frame A data frame with `survey_unit_id` and the +#' coordinate columns. +#' @param folds Integer. Number of folds. +#' @param long_column,lat_column Character. Coordinate columns. +#' @param seed Integer or NULL. Defaults to harness_seed(). +#' @return A list of lists, each with `train` and `test` +#' character vectors of survey unit ids. +#' +#' @example # Example usage of the function +#' # cv <- resample_spatial_cv(frame, folds = 5, seed = 42) +#' # length(cv[[1]]$train) +resample_spatial_cv <- function( + frame, + folds = 5L, + long_column = "long", + lat_column = "lat", + seed = harness_seed() +) { + units <- as.character(frame$survey_unit_id) + blocks <- spatial_blocks( + frame[[long_column]], frame[[lat_column]] + ) + present <- unique(blocks[!is.na(blocks)]) + + if (length(present) < folds) { + stop( + "Only ", length(present), " spatial block(s) present; ", + folds, " folds were asked for. Use finer block breaks or ", + "fewer folds.", + call. = FALSE + ) + } + + # Step 1: Deal whole blocks into folds, so no fold shares a + # block with another + assignment <- with_seed( + seed, sample(rep_len(seq_len(folds), length(present))) + ) + fold_of_block <- assignment[match(blocks, present)] + + lapply(seq_len(folds), function(k) { + list( + train = units[!is.na(fold_of_block) & fold_of_block != k], + test = units[!is.na(fold_of_block) & fold_of_block == k] + ) + }) +} + +# 3. resampler_spatial_cv() ---- + +#' The Registered Form of Spatial Cross-Validation +#' +#' @param frame The one-species frame. +#' @param iterations Integer vector; its length is the number of +#' folds. +#' @param seed Integer or NULL. +#' @param context Unused. +#' @param long_column,lat_column Settings from the spec's +#' `resample` list. +#' @return A list of character vectors: each fold's training +#' units. +#' +#' @example # Example usage of the function +#' # resampler_spatial_cv(frame, 1:5, 42L, list()) +resampler_spatial_cv <- function( + frame, iterations, seed, context, + long_column = "long", lat_column = "lat" +) { + splits <- resample_spatial_cv( + frame, folds = length(iterations), long_column = long_column, + lat_column = lat_column, seed = seed + ) + + lapply(splits, `[[`, "train") +} + +# 4. Register ---- +register_resampler( + "spatial_cv", resampler_spatial_cv, + "Spatial block cross-validation; each draw holds out one fold" +) + +# End of script ---- diff --git a/1_code/methods/selection/aic_average.R b/1_code/methods/selection/aic_average.R new file mode 100644 index 0000000..9809569 --- /dev/null +++ b/1_code/methods/selection/aic_average.R @@ -0,0 +1,107 @@ +# --- +# title: Selection Rule - Information-Criterion Model Averaging +# author: Brendan Casey +# created: 2026-09-09 +# inputs: none +# outputs: registers the `aic_average` rule +# notes: +# - The v2 climate rule for plants and birds. Coefficients are +# averaged across candidates with Akaike weights, treating a +# term absent from a candidate as zero - that model's statement +# that the effect is nil, and MuMIn's "full" average. +# - The final model's predictor is the weighted average of the +# candidates' link predictions, which for a linear predictor is +# the averaged coefficients applied to the data. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +# Base R only. + +# 2. select_aic_average() ---- + +#' Average Candidates by Information-Criterion Weight +#' +#' @inheritParams select_single +#' @return A selection result. `fit` is the best single candidate; +#' `coefficients` are the averaged ones; `predict` is the +#' weighted average of the candidates. +#' +#' @example # Example usage of the function +#' # select_aic_average(models, response ~ 1, d, engine, +#' # "binomial") +select_aic_average <- function( + models, base, data, engine, family, + weights = NULL, offset = NULL, ic = "AICc", control = list() +) { + fitted <- fit_candidates( + models, base, data, engine, family, weights, offset, ic, + control + ) + + table <- candidate_table(fitted) + + if (!any(table$ok) || sum(table$weight) == 0) { + return(selection_result(NULL, NULL, table, fitted)) + } + + # Step 1: Collect every term any candidate estimated + per_model <- lapply(fitted$fits, function(f) engine_coef(engine, f)) + terms <- unique(unlist(lapply(per_model, function(x) x$term))) + + # Step 2: Weighted mean per term, absent terms counting as zero + averaged <- do.call(rbind, lapply(terms, function(term) { + estimate <- 0 + variance <- 0 + + for (i in seq_along(per_model)) { + cf <- per_model[[i]] + w <- table$weight[i] + + if (is.null(cf) || w == 0) { + next + } + + # A term the candidate lacks, or estimated as NA because it + # is aliased, counts as zero, as in MuMIn's full average. + row <- match(term, cf$term) + absent <- is.na(row) || is.na(cf$estimate[row]) + value <- if (absent) 0 else cf$estimate[row] + se <- if (absent) 0 else cf$se[row] + + estimate <- estimate + w * value + variance <- variance + w * ifelse(is.na(se), 0, se^2) + } + + data.frame( + term = term, + estimate = estimate, + se = sqrt(variance), + stringsAsFactors = FALSE + ) + })) + + selection_result( + fit = fitted$fits[[which.min(fitted$scores)]], + coefficients = averaged, + ic_table = table, + fitted = fitted, + engine = engine, + predict = combined_predictor( + fitted$fits, engine, family, weights = table$weight + ) + ) +} + +# 3. Register ---- +register_selection( + "aic_average", select_aic_average, + paste( + "Average coefficients over candidates by Akaike weight", + "(v2 climate)" + ), + requires = c("ic", "coefficients") +) + +# End of script ---- diff --git a/1_code/methods/selection/aic_best.R b/1_code/methods/selection/aic_best.R new file mode 100644 index 0000000..f24c29d --- /dev/null +++ b/1_code/methods/selection/aic_best.R @@ -0,0 +1,59 @@ +# --- +# title: Selection Rule - Best by Information Criterion +# author: Brendan Casey +# created: 2026-09-09 +# inputs: none +# outputs: registers the `aic_best` rule +# notes: +# - Keeps the single candidate with the lowest score (AICc by +# default; the stage's `ic` sets it). +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +# Base R only. + +# 2. select_aic_best() ---- + +#' Keep the Single Best-Scoring Candidate +#' +#' @inheritParams select_single +#' @return A selection result. +#' +#' @example # Example usage of the function +#' # select_aic_best(models, response ~ 1, d, engine, "binomial") +select_aic_best <- function( + models, base, data, engine, family, + weights = NULL, offset = NULL, ic = "AICc", control = list() +) { + fitted <- fit_candidates( + models, base, data, engine, family, weights, offset, ic, + control + ) + + table <- candidate_table(fitted) + + if (!any(table$ok)) { + return(selection_result(NULL, NULL, table, fitted)) + } + + winner <- which.min(fitted$scores) + + selection_result( + fit = fitted$fits[[winner]], + coefficients = engine_coef(engine, fitted$fits[[winner]]), + ic_table = table, + fitted = fitted, + engine = engine + ) +} + +# 3. Register ---- +register_selection( + "aic_best", select_aic_best, + "Keep the lowest-scoring candidate (AICc, AIC or BIC)", + requires = "ic" +) + +# End of script ---- diff --git a/1_code/methods/selection/aic_best_grid.R b/1_code/methods/selection/aic_best_grid.R new file mode 100644 index 0000000..8745fb7 --- /dev/null +++ b/1_code/methods/selection/aic_best_grid.R @@ -0,0 +1,109 @@ +# --- +# title: Selection Rule - Best Model, Predicted onto a Grid +# author: Brendan Casey +# created: 2026-09-09 +# inputs: none +# outputs: registers the `aic_best_grid` rule +# notes: +# - The v2 mammal abundance-given-presence rule. Predicts the +# winning model onto the shared prediction matrix and reports +# one effect per grid row. +# - No calibration is applied. v2 calibrates the product of the +# two hurdle halves multiplicatively rather than each half +# separately, because an additive shift on a log-scale +# abundance can send a small prediction negative and `log` of +# that is not a number. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +# Base R only. + +# 2. select_aic_best_grid() ---- + +#' Best Model, Predicted onto a Prediction Grid +#' +#' @inheritParams select_single +#' @param grid A prediction grid. +#' @param constants Named list of values held fixed across the +#' grid - sampling effort and climate. +#' @param scale Character. "link" reports the linear predictor, +#' which for a log-link Gamma is log abundance; "response" +#' exponentiates it. +#' @return A selection result, one effect per grid row. +#' +#' @example # Example usage of the function +#' # select_aic_best_grid(models, response ~ 1, d, engine, +#' # Gamma(link = "log"), grid = grid) +select_aic_best_grid <- function( + models, base, data, engine, family, + weights = NULL, offset = NULL, ic = "AICc", control = list(), + grid = NULL, constants = list(), scale = "link" +) { + if (is.null(grid)) { + stop( + "The aic_best_grid rule needs a prediction grid.", + call. = FALSE + ) + } + + fitted <- fit_candidates( + models, base, data, engine, family, weights, offset, ic, + control + ) + + table <- candidate_table(fitted) + + if (!any(table$ok)) { + return(selection_result(NULL, NULL, table, fitted)) + } + + winner <- which.min(fitted$scores) + best <- fitted$fits[[winner]] + + newdata <- grid + + for (one in names(constants)) { + newdata[[one]] <- constants[[one]] + } + + # A grid row describes a pure stand, so a term the grid has no + # column for is genuinely absent rather than unknown. + terms <- formula_variables(fitted$formulas[[winner]]) + + for (one in setdiff(terms, names(newdata))) { + newdata[[one]] <- 0 + } + + predicted <- engine$predict(best, newdata, scale, se = TRUE) + + if (is.null(predicted)) { + return(selection_result(NULL, NULL, table, fitted)) + } + + selection_result( + fit = best, + coefficients = data.frame( + term = rownames(grid), + estimate = predicted$fit, + se = predicted$se.fit, + stringsAsFactors = FALSE + ), + ic_table = table, + fitted = fitted, + engine = engine + ) +} + +# 3. Register ---- +register_selection( + "aic_best_grid", select_aic_best_grid, + paste( + "Best candidate by AICc, predicted onto the habitat grid", + "(v2 mammal abundance)" + ), + requires = c("ic", "se") +) + +# End of script ---- diff --git a/1_code/methods/selection/aic_best_onehot.R b/1_code/methods/selection/aic_best_onehot.R new file mode 100644 index 0000000..835a4d6 --- /dev/null +++ b/1_code/methods/selection/aic_best_onehot.R @@ -0,0 +1,184 @@ +# --- +# title: Selection Rule - Best Model, Read One Habitat at a Time +# author: Brendan Casey +# created: 2026-09-09 +# inputs: none +# outputs: registers the `aic_best_onehot` rule +# notes: +# - The v2 mammal presence rule. Unlike the plant habitat stage +# there is no fixed prediction matrix: v2 reads each effect by +# setting that one term to 1 and every other to 0, so the grid +# is an identity over whichever terms the winning model +# happens to carry. +# - Three things make the result a probability rather than a +# coefficient: +# - Each prediction is passed through the logistic, so an +# effect is the modelled probability of presence in a pure +# stand of that type. +# - `Climate` is a slope, not a habitat type, so it is taken +# from the fitted coefficient rather than from a one-hot +# prediction, and is left out of the calibration below. +# - The whole set is shifted on the logit scale so that mean +# fitted presence matches mean observed presence. +# - The reference category - the land cover the winning formula +# omits - is reported alongside the fitted terms, because a +# coefficient here means "relative to that type". +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +# Base R only. + +# 2. select_aic_best_onehot() ---- + +#' Best Model, Read One Habitat Type at a Time +#' +#' @inheritParams select_single +#' @param intercept_cats Character vector, parallel to `models`, +#' naming each candidate's reference category. +#' @param constants Named list of values every one-hot +#' prediction holds fixed. The mammal specs set v2's 100 +#' sampling days at zero climate per region. +#' @param calibrate_against Numeric vector of observed responses +#' to calibrate the level against, or NULL to skip. Filled by +#' the harness when the stage sets `calibrate = TRUE`. +#' @param slope_terms Character vector of terms that are slopes +#' rather than habitat types. +#' @return A selection result whose `coefficients` are +#' probabilities of presence per habitat type. +#' +#' @example # Example usage of the function +#' # select_aic_best_onehot(models, response ~ 1, d, engine, +#' # "binomial", intercept_cats = cats) +select_aic_best_onehot <- function( + models, base, data, engine, family, + weights = NULL, offset = NULL, ic = "AICc", control = list(), + intercept_cats = NULL, + constants = list(), + calibrate_against = NULL, + slope_terms = "Climate" +) { + fitted <- fit_candidates( + models, base, data, engine, family, weights, offset, ic, + control + ) + + table <- candidate_table(fitted) + + if (!any(table$ok)) { + return(selection_result(NULL, NULL, table, fitted)) + } + + winner <- which.min(fitted$scores) + best <- fitted$fits[[winner]] + + # Step 1: The terms to read are the winning model's own, plus + # the category it leaves out. + terms <- attr( + stats::terms(fitted$formulas[[winner]]), "term.labels" + ) + reference <- if (is.null(intercept_cats)) { + NULL + } else { + intercept_cats[winner] + } + + # A slope stays in the reported set even though it is held at + # a constant for the one-hot predictions: its value is taken + # from the fitted coefficient below, and dropping it here would + # make that an append rather than a replacement. Pure design + # constants - sampling effort - are not reported at all. + terms <- setdiff( + c(terms, reference), + setdiff(names(constants), slope_terms) + ) + + if (length(terms) == 0) { + return(selection_result( + best, engine_coef(engine, best), table, fitted, + engine = engine + )) + } + + # Step 2: One prediction per term, at 100 per cent of that type + onehot <- as.data.frame(diag(length(terms))) + names(onehot) <- terms + + for (one in names(constants)) { + onehot[[one]] <- constants[[one]] + } + + predicted <- engine$predict(best, onehot, "link", se = TRUE) + + if (is.null(predicted)) { + return(selection_result(NULL, NULL, table, fitted)) + } + + estimate <- stats::plogis(predicted$fit) + error <- predicted$se.fit + names(estimate) <- names(error) <- terms + + # Step 3: Shift the level so mean fitted presence matches mean + # observed. Slopes are exempt: the shift is an intercept + # change, and applying it to a slope would be meaningless. + if (!is.null(calibrate_against)) { + on_scale <- engine$predict(best, data, "link") + + if (!is.null(on_scale)) { + shift <- stats::qlogis(mean(calibrate_against)) - + stats::qlogis(mean(stats::plogis(on_scale))) + + if (is.finite(shift)) { + habitat <- setdiff(names(estimate), slope_terms) + estimate[habitat] <- stats::plogis( + stats::qlogis(estimate[habitat]) + shift + ) + } + } + } + + # Step 4: A slope is reported from its own coefficient, not + # from a one-hot prediction of a type that does not exist. + best_coefficients <- engine_coef(engine, best) + coefficients <- stats::setNames( + best_coefficients$estimate, best_coefficients$term + ) + + for (one in intersect(slope_terms, names(coefficients))) { + if (!one %in% names(estimate)) { + next + } + + estimate[one] <- stats::plogis(coefficients[[one]]) + } + + result <- selection_result( + fit = best, + coefficients = data.frame( + term = names(estimate), + estimate = unname(estimate), + se = unname(error), + stringsAsFactors = FALSE + ), + ic_table = table, + fitted = fitted, + engine = engine + ) + + result$reference_category <- reference + + result +} + +# 3. Register ---- +register_selection( + "aic_best_onehot", select_aic_best_onehot, + paste( + "Best candidate by AICc, read one habitat type at a time", + "and calibrated (v2 mammal presence)" + ), + requires = c("ic", "coefficients", "se") +) + +# End of script ---- diff --git a/1_code/methods/selection/ivw_grid.R b/1_code/methods/selection/ivw_grid.R new file mode 100644 index 0000000..dd54993 --- /dev/null +++ b/1_code/methods/selection/ivw_grid.R @@ -0,0 +1,200 @@ +# --- +# title: Selection Rule - Inverse-Variance Averaging onto a Grid +# author: Brendan Casey +# created: 2026-09-09 +# inputs: none +# outputs: registers the `ivw_grid` rule +# notes: +# - The v2 plant habitat rule, and the one place where a +# "coefficient" is not a regression coefficient. v2 fits each +# candidate, predicts it onto the prediction matrix - one row +# per habitat type - and combines those predictions across +# candidates weighting each by the precision of its own +# prediction. The result is an effect per habitat type on the +# link scale, which is what the v2 coefficient tables hold. +# - Weighting by precision rather than by AICc is a different +# claim: a candidate that is confident about a habitat type +# dominates there even if it is a poor model overall, and the +# weighting is per habitat type rather than per model. +# - Non-converged candidates are dropped from the grid average, +# not down-weighted, matching v2. A zero standard error is +# floored at 1e-4, because a precision weight of 1/0 would take +# the whole average. +# - The site-level prediction - v2 keeps it as `data$prediction` +# and uses it as the offset of its stand-age splines - is the +# result's `predict()` on the link scale. It averages every +# fitted candidate, converged or not, as v2 does; one that +# failed outright is left out, where v2's would turn the whole +# average into NaN. It is computed when a step asks for it, +# not on every draw. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +# Base R only. + +# 2. select_ivw_grid() ---- + +#' Inverse-Variance Average Predictions onto a Grid +#' +#' @inheritParams select_single +#' @param grid A prediction grid, one row per habitat type. +#' @param grid_constants Named list of values for terms the grid +#' has no column for - v2 predicts at `Climate = 0` and, where +#' Protocol is fitted, at the new protocol. +#' @param head_terms Character vector of leading model +#' coefficients to average separately and prepend, which is how +#' v2 carries Intercept, Climate and Protocol. +#' @return A selection result whose `coefficients` are the +#' averaged per-habitat-type effects, with +#' `candidate_coefficients` for steps that average a term the +#' grid does not carry. +#' +#' @example # Example usage of the function +#' # select_ivw_grid(models, response ~ 1, d, engine, "binomial", +#' # grid = veg_grid, +#' # grid_constants = list(Climate = 0)) +select_ivw_grid <- function( + models, base, data, engine, family, + weights = NULL, offset = NULL, ic = "AICc", control = list(), + grid = NULL, grid_constants = list(), + head_terms = c("Intercept", "Climate") +) { + if (is.null(grid)) { + stop( + "The ivw_grid rule needs a prediction grid; the spec's ", + "region defines one with `grid`.", + call. = FALSE + ) + } + + fitted <- fit_candidates( + models, base, data, engine, family, weights, offset, ic, + control + ) + + table <- candidate_table(fitted) + converged <- vapply( + fitted$fits, function(f) engine_converged(engine, f), logical(1) + ) + + if (!any(converged)) { + return(selection_result(NULL, NULL, table, fitted)) + } + + # Step 1: Predict every converged candidate onto the grid, at + # the constants v2 holds the non-habitat terms at + newdata <- grid + + for (one in names(grid_constants)) { + newdata[[one]] <- grid_constants[[one]] + } + + predictions <- lapply(seq_along(fitted$fits), function(i) { + if (!converged[i]) { + return(NULL) + } + + engine$predict(fitted$fits[[i]], newdata, "link", se = TRUE) + }) + + usable <- !vapply(predictions, is.null, logical(1)) + + if (!any(usable)) { + return(selection_result(NULL, NULL, table, fitted)) + } + + estimate <- do.call( + rbind, lapply(predictions[usable], function(x) x$fit) + ) + error <- do.call( + rbind, lapply(predictions[usable], function(x) x$se.fit) + ) + + # A zero standard error would carry infinite weight + error[error == 0] <- 1e-4 + + grid_coefficients <- ivw_combine(estimate, error) + + # Step 2: The leading coefficients are averaged the same way, + # from each model's own coefficient table rather than from a + # prediction. Read by position, as v2 reads them: the head + # terms lead every candidate's formula. + head_estimate <- do.call(rbind, lapply( + which(converged), function(i) { + fitted$fits[[i]]$coefficients$estimate[seq_along(head_terms)] + } + )) + head_error <- do.call(rbind, lapply( + which(converged), function(i) { + fitted$fits[[i]]$coefficients$se[seq_along(head_terms)] + } + )) + head_error[head_error == 0 | is.na(head_error)] <- 1e-4 + + head_coefficients <- ivw_combine(head_estimate, head_error) + + coefficients <- data.frame( + term = c(head_terms, rownames(grid)), + estimate = c(head_coefficients$estimate, + grid_coefficients$estimate), + se = c(head_coefficients$se, grid_coefficients$se), + stringsAsFactors = FALSE + ) + + result <- selection_result( + fit = fitted$fits[[which.min(fitted$scores)]], + coefficients = coefficients, + ic_table = table, + fitted = fitted, + engine = engine, + # Step 3: The final model, averaged per site the same way + predict = combined_predictor( + fitted$fits[table$ok], engine, family + ) + ) + + # Each fitted candidate's own coefficients, for steps that + # average a term the grid does not carry: v2's pAspen. + result$candidate_coefficients <- lapply( + which(table$ok), function(i) fitted$fits[[i]]$coefficients + ) + + result +} + +# 3. ivw_combine() ---- + +#' Combine Estimates by Inverse-Variance Weight +#' +#' @param estimate Matrix of candidates by columns. +#' @param error Matrix of standard errors, the same shape. +#' @return A list of `estimate` and `se`, one per column. +#' +#' @example # Example usage of the function +#' # ivw_combine(rbind(c(1, 2), c(1.2, 2.1)), +#' # rbind(c(0.1, 0.2), c(0.3, 0.1))) +ivw_combine <- function(estimate, error) { + precision <- 1 / error^2 + + # The variance of the combined estimate is the reciprocal of + # the summed precision, not its mean, so adding candidates + # sharpens rather than dilutes it. + list( + estimate = colSums(estimate * precision) / colSums(precision), + se = sqrt(1 / colSums(precision)) + ) +} + +# 4. Register ---- +register_selection( + "ivw_grid", select_ivw_grid, + paste( + "Inverse-variance average of candidate predictions onto a", + "habitat grid (v2 plant habitat)" + ), + requires = c("coefficients", "se") +) + +# End of script ---- diff --git a/1_code/methods/selection/single.R b/1_code/methods/selection/single.R new file mode 100644 index 0000000..2cad9cc --- /dev/null +++ b/1_code/methods/selection/single.R @@ -0,0 +1,59 @@ +# --- +# title: Selection Rule - Single Model +# author: Brendan Casey +# created: 2026-09-09 +# inputs: none +# outputs: registers the `single` rule +# notes: +# - Fits the first formula and keeps it. No ranking, so it needs +# nothing of the engine beyond fit and predict, which makes it +# the rule for an engine with no information criterion - a +# boosted tree, say - or for any one-model question. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +# Base R only. + +# 2. select_single() ---- + +#' Fit One Model, No Selection +#' +#' @param models A list holding one formula, or a single formula. +#' @param base,data,engine,family,weights,offset,ic,control As in +#' selection_run(). +#' @return A selection result. +#' +#' @example # Example usage of the function +#' # select_single(list(. ~ . + MAP), response ~ 1, d, engine, +#' # "binomial") +select_single <- function( + models, base, data, engine, family, + weights = NULL, offset = NULL, ic = "AICc", control = list() +) { + if (inherits(models, "formula")) { + models <- list(models) + } + + fitted <- fit_candidates( + models[1], base, data, engine, family, weights, offset, ic, + control + ) + + selection_result( + fit = fitted$fits[[1]], + coefficients = engine_coef(engine, fitted$fits[[1]]), + ic_table = candidate_table(fitted), + fitted = fitted, + engine = engine + ) +} + +# 3. Register ---- +register_selection( + "single", select_single, + "Fit the first candidate only; no ranking" +) + +# End of script ---- diff --git a/1_code/methods/selection/staged_bic.R b/1_code/methods/selection/staged_bic.R new file mode 100644 index 0000000..682a5bd --- /dev/null +++ b/1_code/methods/selection/staged_bic.R @@ -0,0 +1,124 @@ +# --- +# title: Selection Rule - Staged Forward Selection by BIC +# author: Brendan Casey +# created: 2026-09-09 +# inputs: none +# outputs: registers the `staged_bic` rule +# notes: +# - The v2 bird landcover rule. `models` is a list of named +# groups. Each group is fitted as an update to the previous +# group's winner, and the winner is the smallest model within +# `threshold` of the best score - a parsimony tie-break, not +# simply the minimum. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +# Base R only. + +# 2. select_staged_bic() ---- + +#' Walk Groups of Candidates, Carrying the Winner Forward +#' +#' @inheritParams select_single +#' @param threshold Numeric. How far above the best score a +#' candidate may sit and still be eligible. +#' @param always_advance Logical. TRUE, v2's rule, takes each +#' group's winner as the next base whatever its score; FALSE +#' takes it only when it improves on the running model. +#' @return A selection result, with `ic_table` carrying a `stage` +#' column. +#' +#' @example # Example usage of the function +#' # select_staged_bic(model_groups, response ~ 1, d, engine, +#' # "poisson", ic = "BIC") +select_staged_bic <- function( + models, base, data, engine, family, + weights = NULL, offset = NULL, ic = "BIC", control = list(), + threshold = 2, always_advance = TRUE +) { + # Step 1: Fit the base model. It is the starting point every + # group updates, and the fallback if no group improves on it. + current <- fit_with( + engine, base, data, family, weights, offset, control + ) + current_formula <- base + current_score <- engine$ic(current, ic) + tables <- list() + + if (!isTRUE(current$ok)) { + return(selection_result( + NULL, NULL, + data.frame( + stage = "base", model = "base", formula = deparse(base), + ic = Inf, delta = NA_real_, weight = 0, k = NA_integer_, + ok = FALSE, stringsAsFactors = FALSE + ), + NULL + )) + } + + group_names <- names(models) + + if (is.null(group_names)) { + group_names <- paste0("stage_", seq_along(models)) + } + + # Step 2: Each group updates the running winner + for (i in seq_along(models)) { + fitted <- fit_candidates( + models[[i]], current_formula, data, engine, family, + weights, offset, ic, control + ) + + table <- candidate_table(fitted) + table$stage <- group_names[i] + tables[[i]] <- table + + eligible <- which(table$ok & is.finite(fitted$scores)) + + if (length(eligible) == 0) { + next + } + + # Step 3: Among candidates within `threshold` of the best, + # take the one with fewest parameters. This is a parsimony + # rule, and it is why the winner is not simply which.min(). + best <- min(fitted$scores[eligible]) + close <- eligible[fitted$scores[eligible] <= best + threshold] + winner <- close[which.min(table$k[close])] + + # Step 4: Carry the group's winner forward. v2 always does, + # even when it scores worse than the model it updated + # (07.ModelLandcover.R, section 14); `always_advance = FALSE` + # keeps the running model instead unless the group improves + # on it. + if (always_advance || fitted$scores[winner] < current_score) { + current <- fitted$fits[[winner]] + current_formula <- fitted$formulas[[winner]] + current_score <- fitted$scores[winner] + } + } + + selection_result( + fit = current, + coefficients = engine_coef(engine, current), + ic_table = do.call(rbind, tables), + fitted = NULL, + formula = current_formula, + engine = engine + ) +} + +# 3. Register ---- +register_selection( + "staged_bic", select_staged_bic, + paste( + "Forward selection through groups of candidates, fewest", + "parameters within `threshold` (v2 birds)" + ), + requires = c("ic", "coefficients") +) + +# End of script ---- diff --git a/1_code/modules/.gitkeep b/1_code/modules/.gitkeep deleted file mode 100644 index 8b13789..0000000 --- a/1_code/modules/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/1_code/modules/_shared/plant_group.R b/1_code/modules/_shared/plant_group.R index 222ad76..e42c6ba 100644 --- a/1_code/modules/_shared/plant_group.R +++ b/1_code/modules/_shared/plant_group.R @@ -18,7 +18,7 @@ # adding a quirk means editing that taxon's file rather than # adding a branch to a shared one. # - The underscore prefix marks this as shared machinery rather -# than a taxon, matching _setup/ and _deprecated/. +# than a taxon, matching _setup/. # - What this spec reproduces of v2 is stated once, in # `v2_coverage` below. The report is generated from it, so # change it here when the harness changes, and nowhere else. @@ -175,12 +175,14 @@ plant_group_spec <- function( } else { c("Intercept", "Climate") }, - # v2's stand-age splines, then its cutblock convergence, - # both before the footprint pooling (coef_adjust). The - # splines read the aged stand-cover columns, which no - # formula names. Both leave the south unchanged. + # v2's steps after the averaging, in v2's order: the + # stand-age splines, the cutblock convergence, the south + # pAspen, then the footprint pooling, which borrows from + # a spline-fitted age class. The splines read the aged + # stand-cover columns, which no formula names. post_process = list( - plant_age_splines, plant_cutblock_convergence, plant_paspen + plant_age_splines, plant_cutblock_convergence, + plant_paspen, plant_footprint_pooling ), # The validation also weights each fine cutblock class by # its own effect, and the formulas name only lumped ones. @@ -192,7 +194,6 @@ plant_group_spec <- function( c("R", 1:4), paste0 ))) ), - coef_adjust = TRUE, # v2 skips the habitat model when the draw, after the # region filter, holds fewer than 20 detections. min_detections = 20L @@ -269,6 +270,10 @@ plant_group_spec <- function( # out-of-bag as well; see plant_v2_validation(). validate = plant_v2_validation, + # The final model the harness scores and reports: v2's own + # prediction from the published coefficient tables + final_prediction = plant_v2_full_prediction, + use_protocol = use_protocol, protocol_is_v2 = identical(use_protocol, protocol_in_v2), @@ -345,11 +350,10 @@ plant_v2_term_labels <- function(terms) { # 4. v2 habitat machinery ---- # Ports of the steps v2's vegetation_models() applies after the # inverse-variance weighting (hierarchical-model_functions.R), -# in v2's order: the stand-age splines (section 7), then the -# cutblock convergence (7.5). The footprint pooling (8.0) follows -# in the harness, as coef_adjust. Each takes and returns the -# selection result, so the habitat stage runs them as -# `post_process` steps. +# in v2's order: the stand-age splines (section 7), the cutblock +# convergence (7.5), and the footprint pooling (8.0). Each takes +# and returns the selection result, so the habitat stage runs +# them as `post_process` steps. ## 4.1 plant_stand_types() ---- @@ -405,7 +409,7 @@ plant_age_columns <- function() { #' unchanged. #' #' @param selected A selection result from the ivw_grid rule, -#' carrying `site_prediction`. +#' whose `predict()` gives the site-level IVW prediction. #' @param data The stage's data: detection in `response`, and the #' unaged and aged stand-cover columns, `Grass` and `Shrub`. #' @return The selection result with the 45 aged effects added. @@ -422,15 +426,22 @@ plant_age_splines <- function(selected, data) { return(selected) } - if (is.null(selected$site_prediction) || - length(selected$site_prediction) != nrow(data)) { + # The site-level IVW prediction, on the link scale, is the + # ivw_grid rule's final model. Computed here rather than by the + # rule, so regions without aged stand types never pay for it. + prediction <- if (is.function(selected$predict)) { + selected$predict(data, "link") + } else { + NULL + } + + if (is.null(prediction) || length(prediction) != nrow(data)) { stop("The age splines need the site-level IVW prediction.", call. = FALSE) } cutoff <- 0.1 count <- data$response - prediction <- selected$site_prediction # Step 1: One frame per stand type stand <- stats::setNames(vector("list", length(types)), types) @@ -581,16 +592,17 @@ plant_age_splines <- function(selected, data) { #' # selected <- plant_cutblock_convergence(selected, stage_data) plant_cutblock_convergence <- function(selected, data = NULL) { coefficients <- selected$coefficients + recovery <- cutblock_recovery_weights() weights <- list( - WhiteSpruce = c(0.50, 0.849, 0.96), - Pine = c(0.50, 0.849, 0.96), - Deciduous = c(0.705, 0.912, 0.97), - Mixedwood = c(0.705, 0.912, 0.97) + WhiteSpruce = recovery$conifer, + Pine = recovery$conifer, + Deciduous = recovery$deciduous, + Mixedwood = recovery$deciduous ) for (type in names(weights)) { - for (k in seq_along(2:4)) { - age <- (2:4)[k] + for (k in 1:3) { + age <- k + 1 w <- weights[[type]][k] cc <- match(paste0("CC", type, age), coefficients$term) natural <- match(paste0(type, age), coefficients$term) @@ -666,7 +678,230 @@ plant_paspen <- function(selected, data = NULL) { selected } -## 4.6 plant_v2_validation() ---- +## 4.6 plant_footprint_pooling() ---- + +#' Pool Poorly Sampled Footprint Effects, as a Post-Process Step +#' +#' v2's section 8.0, applied after the stand-age splines and the +#' cutblock convergence because it borrows from a spline-fitted +#' age class. See coef_adjust_plant_veg() for what is pooled. +#' +#' @param selected A selection result. +#' @param data Unused; the post_process signature. +#' @return The selection result with the four footprint effects +#' pooled. +#' +#' @example # Example usage of the function +#' # selected <- plant_footprint_pooling(selected, stage_data) +plant_footprint_pooling <- function(selected, data = NULL) { + selected$coefficients <- coef_adjust_plant_veg( + selected$coefficients + ) + + selected +} + +## 4.7 coef_adjust_plant_veg() ---- + +#' Borrow Strength for Poorly Sampled Footprint Types +#' +#' v2's `coef.adjust`. Some human footprint types are rarely the +#' dominant cover at a survey unit, so their effect is estimated +#' from little data. v2 pools each with a type it is assumed to +#' resemble, by inverse-variance weight: +#' +#' - `HardLin` borrows from `UrbInd`. +#' - The three soft linear types - `EnSoftLin`, `EnSeismic` and +#' `TrSoftLin` - each borrow from a composite of young +#' regenerating stands, weighted by how much those stand types +#' overlap soft linear features in the provincial summary. +#' +#' The weights are v2's, measured from a 1 km summary and fixed +#' since 2020-11-17. They are an assumption about which habitats +#' resemble which, not an estimate, so they are stated here +#' rather than derived. +#' +#' @param coefficients A data frame of term, estimate and se. +#' @param overlap Numeric vector of four proportions, for +#' white spruce, pine, deciduous and black spruce regeneration. +#' @return The coefficients, with the four terms adjusted. +#' +#' @example # Example usage of the function +#' # coef_adjust_plant_veg(selected$coefficients) +coef_adjust_plant_veg <- function( + coefficients, + overlap = c(0.049, 0.0893, 0.434, 0.396) +) { + if (is.null(coefficients)) { + return(NULL) + } + + value <- stats::setNames( + coefficients$estimate, coefficients$term + ) + error <- stats::setNames(coefficients$se, coefficients$term) + + # Pool two estimates by precision. + pool <- function(a, a_se, b, b_se) { + precision <- 1 / a_se^2 + 1 / b_se^2 + + list( + estimate = (a / a_se^2 + b / b_se^2) / precision, + se = sqrt(1 / precision) + ) + } + + present <- function(...) { + all(c(...) %in% names(value)) && + all(is.finite(value[c(...)])) && + all(is.finite(error[c(...)])) + } + + # Step 1: Hard linear features borrow from urban and industrial + if (present("HardLin", "UrbInd")) { + pooled <- pool( + value["HardLin"], error["HardLin"], + value["UrbInd"], error["UrbInd"] + ) + value["HardLin"] <- pooled$estimate + error["HardLin"] <- pooled$se + } + + # Step 2: Soft linear features borrow from young regeneration + young_types <- c( + "CCWhiteSpruceR", "CCPineR", "CCDeciduousR", "BlackSpruce1" + ) + + if (present(young_types)) { + weights <- overlap / sum(overlap) + + young <- sum(weights * value[young_types]) + # The weighted variance carries no between-type component, + # because the weights are fixed rather than estimated. + young_se <- sqrt(sum(weights * error[young_types]^2)) + + for (one in c("EnSoftLin", "EnSeismic", "TrSoftLin")) { + if (!present(one)) { + next + } + + pooled <- pool(value[one], error[one], young, young_se) + value[one] <- pooled$estimate + error[one] <- pooled$se + } + } + + coefficients$estimate <- unname(value[coefficients$term]) + coefficients$se <- unname(error[coefficients$term]) + + coefficients +} + +## 4.8 plant_v2_parts() ---- + +#' The Pieces of v2's Plant Prediction at a Set of Units +#' +#' v2 predicts a plant from its coefficient tables, not from a +#' fitted model: the climate prediction, and a landcover +#' prediction that weights each habitat type's effect by its +#' cover at the unit. Shared by the validation AUCs and by the +#' final prediction, so the two cannot drift apart. +#' +#' The cover terms are the published effects, less the unaged +#' stand types, which v2 publishes only by age class. A term's +#' column may carry the block suffix the harmonizer gave columns +#' in more than one block (UrbInd_veg, UrbInd_soil). +#' +#' Reproduced as written: the protocol coefficient, a logit, is +#' subtracted from an "Old" survey's landcover prediction on the +#' probability scale. +#' +#' @param stage_coefficients Named list of data frames of term +#' and estimate: `climate` and `habitat`. +#' @param data The units to predict at. +#' @return A list: `climate` (probability), `raw` (landcover, +#' probability scale), `landcover` (`raw` with the protocol +#' adjustment), `slope` (the Climate effect), `aspen`, the cover +#' matrix `x` and the cover terms' `effects` (logit scale). +#' +#' @example # Example usage of the function +#' # parts <- plant_v2_parts(stage_coefficients, region_frame) +plant_v2_parts <- function(stage_coefficients, data) { + climate <- stage_coefficients$climate + habitat <- stage_coefficients$habitat + + estimate <- stats::setNames(habitat$estimate, habitat$term) + head_terms <- c("Intercept", "Climate", "Protocol", "paspen") + + column_of <- function(term) { + candidates <- c(term, paste0(term, c("_veg", "_soil"))) + hit <- candidates[candidates %in% names(data)] + if (length(hit) == 0) NA_character_ else hit[1] + } + + cover <- setdiff( + names(estimate), c(head_terms, plant_stand_types()) + ) + cover <- cover[is.finite(estimate[cover])] + cover_columns <- vapply(cover, column_of, character(1)) + cover <- cover[!is.na(cover_columns)] + cover_columns <- cover_columns[!is.na(cover_columns)] + + x <- as.matrix(data[, cover_columns, drop = FALSE]) + raw <- drop(x %*% stats::plogis(estimate[cover])) + landcover <- raw + + if ("Protocol" %in% names(estimate) && + "Protocol" %in% names(data)) { + old <- as.character(data$Protocol) == "Old" + landcover[old] <- landcover[old] - estimate[["Protocol"]] + } + + list( + climate = stats::plogis( + predict_from_coefficients(climate, data, "link") + ), + raw = raw, + landcover = landcover, + slope = estimate[["Climate"]], + aspen = if ("paspen" %in% names(estimate) && + "paspen" %in% names(data)) { + data$paspen * estimate[["paspen"]] + } else { + 0 + }, + x = x, + effects = estimate[cover] + ) +} + +## 4.9 plant_v2_full_prediction() ---- + +#' v2's Final Plant Prediction: Landcover and Climate Together +#' +#' The prediction v2's "Full" validation AUC scores. The plant +#' specs name it as their `final_prediction`, so the harness's +#' own metrics score the model v2 reports, after its stand-age +#' splines, cutblock convergence and footprint pooling, rather +#' than any single fitted candidate. +#' +#' @param stage_coefficients Named list with `climate` and +#' `habitat` coefficient tables. +#' @param frame The units to predict at. +#' @return A numeric vector of probabilities, one per row. +#' +#' @example # Example usage of the function +#' # plant_v2_full_prediction(stage_coefficients, frame) +plant_v2_full_prediction <- function(stage_coefficients, frame) { + parts <- plant_v2_parts(stage_coefficients, frame) + + stats::plogis( + stats::qlogis(parts$raw) + parts$climate * parts$slope + + parts$aspen + ) +} + +## 4.10 plant_v2_validation() ---- #' v2's Plant Validation AUCs, In-Bag and Out-of-Bag #' @@ -683,10 +918,6 @@ plant_paspen <- function(selected, data = NULL) { #' draw left out, which is the held-out read v2 does not have. #' Iteration 1 is the full data and has no out-of-bag units. #' -#' Reproduced as written: the protocol coefficient, a logit, is -#' subtracted from an "Old" survey's landcover prediction on the -#' probability scale. -#' #' @param stage_coefficients Named list of data frames of term #' and estimate: `climate` and `habitat`. #' @param frame The region's frame. @@ -715,73 +946,42 @@ plant_v2_validation <- function( ) } - climate_prediction <- function(data) { - stats::plogis(predict_from_coefficients(climate, data, "link")) - } - truncate <- function(x) { cap <- stats::quantile(x, 0.99, names = FALSE) ifelse(x >= cap, cap, x) } - estimate <- stats::setNames(habitat$estimate, habitat$term) - head <- c("Intercept", "Climate", "Protocol", "paspen") - - # The cover terms are the published effects, less the unaged - # stand types, which v2 publishes only by age class. A term's - # column may carry the block suffix the harmonizer gave columns - # in more than one block (UrbInd_veg, UrbInd_soil). - column_of <- function(term) { - candidates <- c(term, paste0(term, c("_veg", "_soil"))) - hit <- candidates[candidates %in% names(frame)] - if (length(hit) == 0) NA_character_ else hit[1] - } - - cover <- setdiff(names(estimate), c(head, plant_stand_types())) - cover <- cover[is.finite(estimate[cover])] - cover_columns <- vapply(cover, column_of, character(1)) - cover <- cover[!is.na(cover_columns)] - cover_columns <- cover_columns[!is.na(cover_columns)] - score <- function(in_units) { all_units <- province_frame[ province_frame$survey_unit_id %in% in_units, , drop = FALSE ] - region <- frame[frame$survey_unit_id %in% in_units, , drop = FALSE] + region <- frame[ + frame$survey_unit_id %in% in_units, , drop = FALSE + ] if (nrow(region) == 0 || nrow(all_units) == 0) { return(rep(NA_real_, 7)) } - climate_all <- climate_prediction(all_units) - climate_region <- climate_prediction(region) - cap <- stats::quantile(climate_all, 0.99, names = FALSE) - climate_region_trunc <- ifelse(climate_region >= cap, cap, - climate_region) - - x <- as.matrix(region[, cover_columns, drop = FALSE]) - effect <- stats::plogis(estimate[cover]) - landcover <- drop(x %*% effect) - - if ("Protocol" %in% names(estimate) && "Protocol" %in% names(region)) { - old <- as.character(region$Protocol) == "Old" - landcover[old] <- landcover[old] - estimate[["Protocol"]] - } + parts <- plant_v2_parts(stage_coefficients, region) + climate_all <- stats::plogis( + predict_from_coefficients(climate, all_units, "link") + ) - slope <- estimate[["Climate"]] - aspen <- if ("paspen" %in% names(estimate) && - "paspen" %in% names(region)) { - region$paspen * estimate[["paspen"]] - } else { - 0 - } + # The truncation caps the region's climate at the 99th + # percentile over every unit in the draw + cap <- stats::quantile(climate_all, 0.99, names = FALSE) + climate_region_trunc <- ifelse( + parts$climate >= cap, cap, parts$climate + ) - raw <- drop(x %*% effect) - component <- climate_region * slope + aspen - component_trunc <- climate_region_trunc * slope + aspen + component <- parts$climate * parts$slope + parts$aspen + component_trunc <- climate_region_trunc * parts$slope + + parts$aspen joint <- function(shift) { - rowSums(x * stats::plogis(outer(shift, estimate[cover], `+`))) + shifted <- outer(shift, parts$effects, `+`) + rowSums(parts$x * stats::plogis(shifted)) } observed <- as.integer(region$response > 0) @@ -790,10 +990,13 @@ plant_v2_validation <- function( c( Climate = auc(observed_all, climate_all), Climate_Truncated = auc(observed_all, truncate(climate_all)), - Landcover = auc(observed, landcover), - Full = auc(observed, stats::plogis(stats::qlogis(raw) + component)), + Landcover = auc(observed, parts$landcover), + Full = auc( + observed, stats::plogis(stats::qlogis(parts$raw) + component) + ), Full_Truncated = auc( - observed, stats::plogis(stats::qlogis(raw) + component_trunc) + observed, + stats::plogis(stats::qlogis(parts$raw) + component_trunc) ), Full_Joint = auc(observed, joint(component)), Full_Joint_Truncated = auc(observed, joint(component_trunc)) @@ -813,8 +1016,10 @@ plant_v2_validation <- function( score(out_of_bag) } - names_out <- c("Climate", "Climate_Truncated", "Landcover", "Full", - "Full_Truncated", "Full_Joint", "Full_Joint_Truncated") + names_out <- c( + "Climate", "Climate_Truncated", "Landcover", "Full", + "Full_Truncated", "Full_Joint", "Full_Joint_Truncated" + ) data.frame( metric = c(paste0("v2val_", names_out), @@ -824,7 +1029,32 @@ plant_v2_validation <- function( ) } -# 5. plant_group_specs() ---- +# 5. cutblock_recovery_weights() ---- + +#' v2's Cutblock Recovery Weights +#' +#' How far a cutblock of age class 2, 3 and 4 has converged on the +#' natural stand of the same age, by stand group. Fixed in v2 and +#' shared by its plant (section 7.5) and mammal (section 6.11) +#' pipelines, so stated once for both modules. +#' +#' The two pipelines' stand-age splines are not shared: their +#' parameters differ (spline basis, detection threshold, model +#' choice), and merging them would put parity at risk. +#' +#' @return A list of `conifer` and `deciduous` weights, one per +#' age class 2 to 4. +#' +#' @example # Example usage of the function +#' # cutblock_recovery_weights()$conifer +cutblock_recovery_weights <- function() { + list( + conifer = c(0.500, 0.849, 0.960), + deciduous = c(0.705, 0.912, 0.970) + ) +} + +# 6. plant_group_specs() ---- #' Every Plant-Group Spec #' diff --git a/1_code/modules/_shared/standard_specs.R b/1_code/modules/_shared/standard_specs.R new file mode 100644 index 0000000..ab07691 --- /dev/null +++ b/1_code/modules/_shared/standard_specs.R @@ -0,0 +1,50 @@ +# --- +# title: The v2 Spec of Every Run +# author: Brendan Casey +# created: 2026-10-03 +# inputs: none +# outputs: none; returns objects in memory +# notes: +# - One place that lists the runs an experiment can choose +# between, each a taxon spec in its v2 configuration. An +# experiment names runs (`taxa = c("lichen", "bird")`) rather +# than building specs, so its run.R stays short and every +# experiment starts from the same v2 configuration. +# - Run names are the folder names results are written under. +# Mammals run once per season, because v2's mammal references +# average the summer and winter fits; the two runs share the +# data slug "mammal". Soil mites run as "mite", their slug. +# - A new taxon module adds its run here. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +# Base R only. + +# 2. standard_specs() ---- + +#' Every Run's Spec, in Its v2 Configuration +#' +#' @param plant_bootstrap Character. "spatial_block" draws v2's +#' plant bootstrap afresh, so parity is distributional; +#' "v2_ids" replays the draws v2 stored (needs +#' _setup/07_harmonize_v2_plant_bootstrap_ids.R run for every +#' species in the run). +#' @return A named list of specs, one per run. +#' +#' @example # Example usage of the function +#' # names(standard_specs()) +standard_specs <- function(plant_bootstrap = "spatial_block") { + list( + bryophyte = bryophyte_spec(bootstrap = plant_bootstrap), + lichen = lichen_spec(bootstrap = plant_bootstrap), + mite = soil_mite_spec(bootstrap = plant_bootstrap), + vascular_plant = vascular_plant_spec(bootstrap = plant_bootstrap), + mammal_summer = mammal_spec(season = "summer"), + mammal_winter = mammal_spec(season = "winter"), + bird = bird_spec() + ) +} + +# End of script ---- diff --git a/1_code/modules/birds/.gitkeep b/1_code/modules/birds/.gitkeep deleted file mode 100644 index 8b13789..0000000 --- a/1_code/modules/birds/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/1_code/modules/birds/spec.R b/1_code/modules/birds/spec.R index 4937dec..cc30cc8 100644 --- a/1_code/modules/birds/spec.R +++ b/1_code/modules/birds/spec.R @@ -60,7 +60,9 @@ bird_spec <- function() { regions = list( north = list( filter = ~ useNorth == 1, - grid = NULL, + # One row per habitat type, rebuilt by _setup/09 from + # v2's coefficient translation matrix + grid = "bird_north", term_block = "veg", habitat_models = "landcover_bird_north_v2", # v2 weights the landcover models by region @@ -68,7 +70,9 @@ bird_spec <- function() { ), south = list( filter = ~ useSouth == 1, - grid = NULL, + # One row per habitat type, rebuilt by _setup/09 from + # v2's coefficient translation matrix + grid = "bird_south", term_block = "soil", habitat_models = "landcover_bird_south_v2", weight_column = "soilw" diff --git a/1_code/modules/birds/standardize.R b/1_code/modules/birds/standardize.R index 7d2b021..3cec7d1 100644 --- a/1_code/modules/birds/standardize.R +++ b/1_code/modules/birds/standardize.R @@ -486,4 +486,31 @@ standardize_bird_coefficients <- function( out } +# 5. bird_habitat_translation() ---- + +#' Translate a Store's Bird Landcover onto v2's Habitat Template +#' +#' The form collect_results() takes in `translate`: given a +#' store's coefficients, returns the landcover stage translated +#' onto v2's standardized habitat types as extra rows, stage +#' "habitat". The raw "landcover" rows stay as they are. +#' +#' @param coefficients A store's coefficients. +#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param region Character. "north" or "south". +#' @return A data frame of coefficient rows, or NULL. +#' +#' @example # Example usage of the function +#' # collect_results(pipeline_dir, data_dir, +#' # translate = list(bird = bird_habitat_translation)) +bird_habitat_translation <- function(coefficients, data_dir, region) { + landcover <- coefficients[coefficients$stage == "landcover", ] + + if (nrow(landcover) == 0) { + return(NULL) + } + + standardize_bird_coefficients(landcover, data_dir, region) +} + # End of script ---- diff --git a/1_code/modules/mammals/.gitkeep b/1_code/modules/mammals/.gitkeep deleted file mode 100644 index 8b13789..0000000 --- a/1_code/modules/mammals/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/1_code/modules/mammals/hurdle.R b/1_code/modules/mammals/hurdle.R index 0dee071..1890fec 100644 --- a/1_code/modules/mammals/hurdle.R +++ b/1_code/modules/mammals/hurdle.R @@ -6,7 +6,7 @@ # inputs: # in 0_data/test_dataset/lookup/: # - mammal_climate_predictions.csv -# - mammal_modelled_species.csv +# - species_queue.csv (each species' v2 name) # outputs: none; returns objects in memory # notes: # - A port of the per-species, per-season body of v2's @@ -64,25 +64,25 @@ #' #' @example # Example usage of the function #' # frame <- mammal_precomputed_climate(frame, sp, data_dir, spec) -mammal_precomputed_climate <- function(frame, species, data_dir, spec) { - queue <- data.table::fread( - file.path(data_dir, "lookup", "mammal_modelled_species.csv") - ) - source_name <- unique(queue$species_season[queue$species == species]) - - if (length(source_name) == 0) { - stop("No v2 name for mammal species `", species, "`.", - call. = FALSE) - } - +mammal_precomputed_climate <- function(frame, species, data_dir, + spec) { # The climate file names species as v2 did, without the season - v2_name <- sub("(Summer|Winter)$", "", source_name[1]) + v2_name <- sub( + "(Summer|Winter)$", "", + species_source_name(data_dir, "mammal", species) + ) - climate <- data.table::fread( + # Read whole once per session; every species reads a column + climate <- cached_read( file.path(data_dir, "lookup", "mammal_climate_predictions.csv"), - select = c("survey_unit_id", v2_name) + function(p) as.data.frame(data.table::fread(p)) ) + if (!v2_name %in% names(climate)) { + stop("No precomputed climate for mammal `", v2_name, "`.", + call. = FALSE) + } + frame$Climate <- climate[[v2_name]][ match(frame$survey_unit_id, climate$survey_unit_id) ] @@ -482,16 +482,18 @@ select_mammal_v2_hurdle <- function( # Step 8: Cutblock convergence, north only (6.11) if (ages) { + # The same recovery weights as the plant pipeline + recovery <- cutblock_recovery_weights() convergence <- list( - CCSpruce = list("Spruce", c(0.500, 0.849, 0.960)), - CCPine = list("Pine", c(0.500, 0.849, 0.960)), - CCMixedwood = list("Mixedwood", c(0.705, 0.912, 0.970)), - CCDecid = list("Decid", c(0.705, 0.912, 0.970)) + CCSpruce = list("Spruce", recovery$conifer), + CCPine = list("Pine", recovery$conifer), + CCMixedwood = list("Mixedwood", recovery$deciduous), + CCDecid = list("Decid", recovery$deciduous) ) for (cc in names(convergence)) { for (k in 1:3) { - age <- (2:4)[k] + age <- k + 1 w <- convergence[[cc]][[2]][k] cc_name <- paste0(cc, age) natural <- paste0(convergence[[cc]][[1]], age) diff --git a/1_code/modules/mammals/spec.R b/1_code/modules/mammals/spec.R index 0d51da6..c1d854f 100644 --- a/1_code/modules/mammals/spec.R +++ b/1_code/modules/mammals/spec.R @@ -12,9 +12,10 @@ # MammalModels: nine binomial GLMs over FFP, MAP, CMD and TD, # averaged by AICc weight. That pipeline is adapted here as a # fitted stage, so a bioclimatic question can be asked of -# mammals at all. `climate_source` selects which, but only -# "fitted" is implemented: nothing reads the prediction file -# yet. +# mammals at all. `climate_source` selects which: +# "precomputed" (the default, v2's) reads the prediction file +# through mammal_precomputed_climate() in hurdle.R; "fitted" +# fits climate as the first stage. # - The climate block, CMD and TD included, comes from # abmi-camera-climate_2023.Rdata, the file v2 fitted against, # joined by the harmonizer. The fitted stage runs the full @@ -315,7 +316,11 @@ mammal_spec <- function( selection = select_mammal_v2_hurdle, ic = "AICc", carry_from = "climate", - carry_from_as = "Climate" + carry_from_as = "Climate", + # The grid prediction reads each habitat type at v2's + # 100 sampling days and zero climate, as its one-hot + # effects are read. Not passed to the hurdle itself. + grid_constants = list(seas_days = 100, Climate = 0) ) } else if (part == "presence") { list( @@ -434,8 +439,13 @@ mammal_spec <- function( # Facts about this run's configuration. Coverage is in # v2_coverage, not here. notes = paste0( - "Climate fitted with the full 9-model v2 set. Season: ", - season, ". Hurdle part: ", part, ". Tier: ", tier, "." + if (climate_source == "fitted") { + "Climate fitted with the full 9-model v2 set." + } else { + "Climate read from v2's precomputed predictions." + }, + " Season: ", season, ". Hurdle part: ", part, + ". Tier: ", tier, "." ) ) } diff --git a/1_code/tests/compare_stores.R b/1_code/tests/compare_stores.R new file mode 100644 index 0000000..31c0806 --- /dev/null +++ b/1_code/tests/compare_stores.R @@ -0,0 +1,203 @@ +# --- +# title: Compare Two Sets of Result Stores +# author: Brendan Casey +# created: 2026-10-03 +# inputs: +# two directories laid out as // result stores, as +# run_spec() writes them +# outputs: none; returns a data frame and prints a summary +# notes: +# - The regression check for any change to the harness, methods +# or modules: a refactor that is meant to leave results alone +# should leave every stored coefficient within `tolerance`. +# - Rows are matched on their keys, not their position, so a +# change in write order is not mistaken for a change in value. +# - `max_boot` restricts both sides to the first draws. Draws +# are seeded per species and drawn in order, so draws 1-5 of a +# 5-draw run are the same rows as draws 1-5 of a 100-draw run. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +library(data.table) # keyed joins on large tables (version: 1.16.4) + +# 2. compare_stores() ---- + +#' Compare the Values Two Sets of Stores Hold +#' +#' @param old_dir,new_dir Character. Directories holding +#' `//` stores. +#' @param files Character vector of store files to compare, +#' without the extension. +#' @param tolerance Numeric. Largest absolute difference that +#' still counts as a match. +#' @param max_boot Integer or NULL. Compare draws up to this one. +#' @param runs Character vector of run folders, or NULL for every +#' run present in both. +#' @return A data frame, one row per run, region and file, with +#' row counts on each side, rows only on one side, the largest +#' absolute difference and whether it matches. +#' +#' @example # Example usage of the function +#' # compare_stores("2_pipeline/_baseline/stores", +#' # "2_pipeline/exp_000_parity_v2", max_boot = 5) +compare_stores <- function( + old_dir, + new_dir, + files = c("coefficients", "metrics", "grid_predictions"), + tolerance = 1e-10, + max_boot = NULL, + runs = NULL +) { + store_dirs <- function(root) { + found <- list.files( + root, pattern = "^meta\\.json$", recursive = TRUE + ) + dirname(found) + } + + shared <- intersect(store_dirs(old_dir), store_dirs(new_dir)) + + if (!is.null(runs)) { + shared <- shared[dirname(shared) %in% runs] + } + + if (length(shared) == 0) { + stop("No store is present in both directories.", call. = FALSE) + } + + # Value columns per file; everything else is a key + value_columns <- list( + coefficients = c("estimate", "se"), + metrics = "value", + grid_predictions = "prediction", + unit_predictions = c("prediction", "observed") + ) + + read_one <- function(root, store, what) { + path <- file.path(root, store, paste0(what, ".csv")) + + if (!file.exists(path)) { + return(NULL) + } + + rows <- fread(path) + + if (!is.null(max_boot) && "boot" %in% names(rows)) { + rows <- rows[boot <= max_boot] + } + + rows + } + + out <- list() + + for (store in shared) { + for (what in files) { + old <- read_one(old_dir, store, what) + new <- read_one(new_dir, store, what) + + if (is.null(old) && is.null(new)) { + next + } + + values <- value_columns[[what]] + keys <- setdiff( + intersect(names(old) %||% names(new), names(new) %||% + names(old)), + values + ) + + row <- data.frame( + store = store, file = what, + old_rows = if (is.null(old)) 0L else nrow(old), + new_rows = if (is.null(new)) 0L else nrow(new), + only_old = NA_integer_, only_new = NA_integer_, + max_abs_difference = NA_real_, + stringsAsFactors = FALSE + ) + + if (!is.null(old) && !is.null(new)) { + # A key can repeat within a draw (a term written twice is a + # bug the comparison should surface), so rows are numbered + # within their key before joining. + old[, .dup := seq_len(.N), by = keys] + new[, .dup := seq_len(.N), by = keys] + joined <- merge( + old, new, by = c(keys, ".dup"), all = TRUE, + suffixes = c(".old", ".new") + ) + + first <- paste0(values[1], c(".old", ".new")) + row$only_old <- sum(is.na(joined[[first[2]]]) & + !is.na(joined[[first[1]]])) + row$only_new <- sum(is.na(joined[[first[1]]]) & + !is.na(joined[[first[2]]])) + + differences <- unlist(lapply(values, function(v) { + a <- joined[[paste0(v, ".old")]] + b <- joined[[paste0(v, ".new")]] + both <- !is.na(a) & !is.na(b) + # NA on one side only is a mismatch, NA on both is not + c(abs(a[both] - b[both]), + if (any(xor(is.na(a), is.na(b)))) Inf) + })) + + row$max_abs_difference <- if (length(differences) == 0) { + 0 + } else { + max(differences) + } + } + + out[[length(out) + 1]] <- row + } + } + + result <- do.call(rbind, out) + result$match <- result$old_rows == result$new_rows & + result$only_old %in% 0L & result$only_new %in% 0L & + result$max_abs_difference <= tolerance + + result +} + +`%||%` <- function(a, b) if (is.null(a)) b else a + +# 3. Command line ---- +# Rscript 1_code/tests/compare_stores.R +# [max_boot] [files] +if (sys.nframe() == 0L) { + args <- commandArgs(trailingOnly = TRUE) + + if (length(args) < 2) { + stop( + "Usage: Rscript compare_stores.R ", + "[max_boot] [file,file]", + call. = FALSE + ) + } + + result <- compare_stores( + args[1], args[2], + max_boot = if (length(args) >= 3 && args[3] != "all") { + as.integer(args[3]) + } else { + NULL + }, + files = if (length(args) >= 4) { + strsplit(args[4], ",")[[1]] + } else { + c("coefficients", "metrics", "grid_predictions") + } + ) + + print(result, row.names = FALSE) + cat( + "\n", sum(result$match), " of ", nrow(result), + " store files match.\n", sep = "" + ) +} + +# End of script ---- diff --git a/1_code/tests/run_tests.R b/1_code/tests/run_tests.R new file mode 100644 index 0000000..059b9ad --- /dev/null +++ b/1_code/tests/run_tests.R @@ -0,0 +1,43 @@ +# --- +# title: Run the Framework's Tests +# author: Brendan Casey +# created: 2026-10-03 +# inputs: +# - 1_code/tests/testthat/test-*.R +# - 0_data/test_dataset/, for the dataset checks +# outputs: none; prints a pass / fail summary +# notes: +# - Fast checks of the contracts the framework relies on: every +# engine meets the engine contract, every v2 spec validates, +# the harmonized lookups are consistent, shards merge in +# order, and seeds reproduce. They take seconds, so run them +# after any change to harness/, methods/ or modules/. +# - They do not replace the parity check. A change meant to +# leave results alone is confirmed by running the parity +# species at 5 draws and comparing the stores with +# 1_code/tests/compare_stores.R; see docs/getting_started.md. +# - Run from the repository root: +# Rscript 1_code/tests/run_tests.R +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +library(testthat) # test runner (version: 3.3.2) + +## 1.2 Load the framework ---- +source("1_code/harness/harness.R") +load_framework() + +data_dir <- file.path(getOption("sdm.project_root"), "0_data", + "test_dataset") + +# 2. Run ---- +results <- testthat::test_dir( + "1_code/tests/testthat", + env = environment(), + reporter = "summary", + stop_on_failure = TRUE +) + +# End of script ---- diff --git a/1_code/tests/testthat/test-dataset.R b/1_code/tests/testthat/test-dataset.R new file mode 100644 index 0000000..951e6e6 --- /dev/null +++ b/1_code/tests/testthat/test-dataset.R @@ -0,0 +1,78 @@ +# The harmonized lookups agree with each other and with the files +# they describe. Skipped when the dataset is not present. + +skip_if_not(dir.exists(data_dir), "No test dataset") + +test_that("the manifest names files that exist", { + manifest <- dataset_manifest(data_dir) + + expect_true(all(file.exists( + file.path(data_dir, manifest$response_file) + ))) + expect_true(all(file.exists(file.path( + data_dir, "lookup", + paste0(manifest$grid, "_prediction_matrix.csv") + )))) +}) + +test_that("every taxon in the queue is in the manifest", { + expect_setequal( + unique(species_catalogue(data_dir)$taxon), + unique(dataset_manifest(data_dir)$taxon) + ) +}) + +test_that("the species queue matches the source lookups", { + # The counts the three source schemas give, checked against + # the one queue _setup/09 wrote from them + plants <- data.table::fread( + file.path(data_dir, "lookup", "modelled_species.csv") + ) + expect_equal( + length(list_species(data_dir, "lichen", "north")), + sum(plants$taxon == "lichen" & plants$in_veg_models) + ) + + birds <- data.table::fread( + file.path(data_dir, "lookup", "bird_modelled_species.csv") + ) + expect_equal( + list_species(data_dir, "bird", "south"), + birds$species[birds$region == "south"] + ) + + expect_equal( + species_source_name(data_dir, "mammal", "BlackBear_Summer"), + "Black BearSummer" + ) +}) + +test_that("covariate keys come from the manifest", { + expect_equal(covariate_key("mammal", "north", data_dir), + "mammal_north") + expect_equal(covariate_key("lichen", "south", data_dir), "lichen") +}) + +test_that("the bird north grid reproduces v2's translation matrix", { + grid <- load_prediction_grid(data_dir, "bird_north") + age <- as.data.frame(data.table::fread( + file.path(data_dir, "lookup", "bird_veg_age_matrix.csv") + )) + + expect_equal(rownames(grid), age$type) + expect_equal(grid$wtAge, age$wtAge) + expect_equal( + grid$isCon * grid$wtAge, age[["isCon:wtAge"]], tolerance = 1e-12 + ) +}) + +test_that("the covariate cache returns what a fresh read does", { + clear_cache() + first <- load_covariates("lichen", data_dir, c("MAP", "FFP")) + wider <- load_covariates("lichen", data_dir, c("MAP", "CMD")) + clear_cache() + fresh <- load_covariates("lichen", data_dir, c("MAP", "CMD")) + + expect_identical(wider, fresh) + expect_identical(first$MAP, fresh$MAP) +}) diff --git a/1_code/tests/testthat/test-methods.R b/1_code/tests/testthat/test-methods.R new file mode 100644 index 0000000..ea9cea6 --- /dev/null +++ b/1_code/tests/testthat/test-methods.R @@ -0,0 +1,90 @@ +# Every registered method meets its contract, and the registry +# behaves as a spec relies on it to. + +test_that("every registered engine passes check_engine()", { + for (name in registered_names("engine")) { + checks <- check_engine(name, quiet = TRUE) + expect_true( + all(checks$pass), + info = paste(name, ":", paste( + checks$check[!checks$pass], collapse = "; " + )) + ) + } +}) + +test_that("the v2 methods are all registered", { + expect_setequal( + registered_names("engine"), c("glm", "bayesglm") + ) + expect_true(all(c( + "single", "aic_best", "aic_average", "staged_bic", "ivw_grid", + "aic_best_grid", "aic_best_onehot" + ) %in% registered_names("selection"))) + expect_true(all(c("precomputed", "spatial_block", "spatial_cv") + %in% registered_names("resampler"))) +}) + +test_that("an unknown method fails with the registered names", { + expect_error(get_engine("gbm"), "Registered: .*glm") + expect_error(get_method("selection", "best"), "aic_best") +}) + +test_that("a registered method can be looked up and removed", { + register_metric( + "test_mean_prediction", + function(observed, predicted) mean(predicted), + "Test only" + ) + on.exit(unregister_method("metric", "test_mean_prediction")) + + expect_equal( + get_method("metric", "test_mean_prediction")(0, c(1, 3)), 2 + ) + expect_true("test_mean_prediction" %in% default_metrics()) +}) + +test_that("compute_metrics keeps its order and scores known cases", { + scores <- compute_metrics(c(0, 0, 1, 1), c(0.1, 0.2, 0.8, 0.9)) + + expect_equal( + scores$metric[1:7], + c("auc", "deviance_explained", "rmse", "spearman", + "calibration_slope", "prevalence", "n") + ) + expect_equal(scores$value[scores$metric == "auc"], 1) + expect_equal(scores$value[scores$metric == "prevalence"], 0.5) + # A draw with one class has no AUC, and that is not an error + expect_true(is.na( + compute_metrics(c(0, 0), c(0.1, 0.2), "auc")$value + )) +}) + +test_that("an engine without coefficients can run the single rule", { + # A stand-in for a boosted tree: predictions only + glm <- get_engine("glm") + register_engine(list( + name = "test_predict_only", + description = "Test only", + capabilities = character(0), + fit = glm$fit, + predict = glm$predict + )) + on.exit(unregister_method("engine", "test_predict_only")) + + engine <- get_engine("test_predict_only") + data <- data.frame(response = rep(c(0, 1), 50), x = 1:100) + selected <- selection_run( + "single", list(stats::as.formula(". ~ . + x")), response ~ 1, + data, engine, "binomial" + ) + + expect_null(selected$coefficients) + expect_length(selected$predict(data, "response"), 100) + + # And a rule that needs coefficients is refused before fitting + spec <- lichen_spec() + spec$stages[[1]]$engine <- "test_predict_only" + problems <- validate_spec(spec, stop_on_error = FALSE) + expect_true(any(grepl("aic_average.*needs", problems))) +}) diff --git a/1_code/tests/testthat/test-results.R b/1_code/tests/testthat/test-results.R new file mode 100644 index 0000000..2d403e6 --- /dev/null +++ b/1_code/tests/testthat/test-results.R @@ -0,0 +1,112 @@ +# Result stores, shards and seeds behave as a parallel run relies +# on them to. + +test_that("merged shards equal a store written in one pass", { + root <- file.path(tempdir(), "shard_test") + unlink(root, recursive = TRUE) + on.exit(unlink(root, recursive = TRUE)) + + rows <- function(species) { + data.frame(term = c("a", "b"), estimate = c(0.1, 0.2), + se = c(0.01, 0.02)) + } + + # Serial: one store, appended in order + serial <- result_store(file.path(root, "serial")) + for (sp in c("sp1", "sp2")) { + for (boot in 1:2) { + write_coefficients(serial, sp, "north", boot, rows(sp), "s") + } + } + + # Parallel: a header-less shard per species, merged after + shards <- file.path(root, "shards", c("sp1", "sp2")) + for (i in 1:2) { + shard <- result_store(shards[i], header = FALSE) + for (boot in 1:2) { + write_coefficients( + shard, c("sp1", "sp2")[i], "north", boot, rows(), "s" + ) + } + } + merged <- result_store(file.path(root, "merged")) + merge_result_shards(merged, shards) + + expect_identical( + readBin(file.path(root, "serial", "coefficients.csv"), + "raw", 1e6), + readBin(file.path(root, "merged", "coefficients.csv"), + "raw", 1e6) + ) +}) + +test_that("unit predictions are written only when asked", { + root <- file.path(tempdir(), "unit_test") + unlink(root, recursive = TRUE) + on.exit(unlink(root, recursive = TRUE)) + + for (mode in c("none", "oob", "all")) { + store <- result_store(file.path(root, mode), + unit_predictions = mode) + write_unit_predictions( + store, "sp", "north", 1, c("u1", "u2", "u3"), + c(0.1, 0.2, 0.3), c(0, 1, 0), + in_bag = c(TRUE, FALSE, TRUE) + ) + } + + expect_null(read_results(file.path(root, "none"), + "unit_predictions")) + expect_equal( + read_results( + file.path(root, "oob"), "unit_predictions" + )$survey_unit_id, + "u2" + ) + expect_equal( + nrow(read_results(file.path(root, "all"), "unit_predictions")), 3 + ) +}) + +test_that("a seed gives the same draws whatever the generator", { + default <- with_seed(42, sample(100, 5)) + + old <- RNGkind() + RNGkind("L'Ecuyer-CMRG") + switched <- with_seed(42, sample(100, 5)) + after <- RNGkind()[1] + do.call(RNGkind, as.list(old)) + + expect_identical(default, switched) + # And the caller's generator is left as it was + expect_equal(after, "L'Ecuyer-CMRG") +}) + +test_that("species seeds do not depend on the other species", { + expect_identical( + species_seed(20260909L, "lichen", "Physcia.adscendens"), + species_seed(20260909L, "lichen", "Physcia.adscendens") + ) + expect_false(identical( + species_seed(20260909L, "lichen", "Physcia.adscendens"), + species_seed(20260909L, "lichen", "Cladonia.chlorophaea") + )) +}) + +test_that("spatial cross-validation holds out whole folds", { + frame <- data.frame( + survey_unit_id = paste0("u", 1:400), + long = stats::runif(400, -120, -110), + lat = stats::runif(400, 49, 60) + ) + draws <- resampler_spatial_cv( + frame, 1:3, seed = 1L, context = list() + ) + + expect_length(draws, 3) + # Every unit is held out by exactly one fold + held_out <- lapply( + draws, function(d) setdiff(frame$survey_unit_id, d) + ) + expect_equal(sum(lengths(held_out)), 400) +}) diff --git a/1_code/tests/testthat/test-specs.R b/1_code/tests/testthat/test-specs.R new file mode 100644 index 0000000..f8bb906 --- /dev/null +++ b/1_code/tests/testthat/test-specs.R @@ -0,0 +1,55 @@ +# The v2 specs are valid, and validate_spec() catches the mistakes +# a user is likely to make. + +test_that("every standard spec validates", { + for (key in names(standard_specs())) { + expect_silent(validate_spec(standard_specs()[[key]])) + } + expect_silent(validate_spec( + mammal_spec(climate_source = "fitted", season = "summer") + )) +}) + +test_that("a misspelt field is reported, not ignored", { + spec <- bird_spec() + spec$stages[[2]]$selction <- "staged_bic" + + expect_error(validate_spec(spec), "unknown field.*selction") +}) + +test_that("a misspelt model set is reported", { + spec <- lichen_spec() + spec$stages[[1]]$models <- "climate_plant_v2_ful" + + expect_error(validate_spec(spec), "not a model set") +}) + +test_that("every problem is reported at once", { + spec <- bird_spec() + spec$stages[[1]]$engine <- "no_such_engine" + spec$stages[[1]]$ic <- "DIC" + spec$resample$scheme <- "no_such_scheme" + + problems <- validate_spec(spec, stop_on_error = FALSE) + expect_length(problems, 3) +}) + +test_that("a rule's settings come from stage fields by name", { + # staged_bic's `threshold` is a setting no harness code names + spec <- bird_spec() + spec$stages[[2]]$threshold <- 4 + + expect_silent(validate_spec(spec)) +}) + +test_that("stage_models replaces a set and is recorded", { + spec <- apply_stage_models( + lichen_spec(), + list(climate = models_from_covariates(c("MAP", "FFP"))) + ) + + expect_equal(spec$models_overridden, "climate <- climate") + expect_setequal( + spec_covariates(spec, "climate"), c("MAP", "FFP") + ) +}) diff --git a/README.md b/README.md index 394956b..1fe6f16 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ species models. ## Contents - [Overview](#overview) +- [Quick start](#quick-start) - [Status](#status) - [Pipeline flow](#pipeline-flow) - [Directory structure](#directory-structure) @@ -49,6 +50,25 @@ comparable over time. This repository is for methods research and development. It is not for the final species models and does not generate reporting products. +## Quick start + +New here? Read [`docs/getting_started.md`](docs/getting_started.md): the +vocabulary, how to run the baseline, how to read what it writes, and how to +test a change against it. + +```r +source("1_code/harness/harness.R") +load_framework() # the harness, every method, every taxon module +list_methods() # the engines, selection rules, resampling, metrics +names(standard_specs()) # the runs an experiment can choose + +# The v2 baseline: configure at the top of run.R, then run it +source("1_code/experiments/exp_000_parity_v2/run.R") +``` + +A new experiment starts from `1_code/experiments/_template/`; a new method is +one file in `1_code/methods/` (see its [README](1_code/methods/README.md)). + ## Status | Component | State | @@ -61,40 +81,46 @@ final species models and does not generate reporting products. ## Pipeline flow -Four parts, each with one job. +Five parts, each with one job. ``` 0_data/test_dataset/ (a) the frozen dataset - │ responses, covariates, lookups; read only - │ read by + │ responses, covariates, lookups; read only; + │ read by lookup/dataset_manifest.csv says whose is what ▼ 1_code/harness/ (b) the harness - ▲ load, resample, fit, select, score, store; - │ configured by names no taxon - │ -1_code/modules//spec.R (c) taxon specs + ▲ ▲ load, resample, fit, select, score, store, + │ │ methods looked up by name summarize, compare; names no taxon + │ └── 1_code/methods/ (c) methods: engines, selection rules, + │ resampling schemes, metrics; one file each + │ configured by +1_code/modules//spec.R (d) taxon specs each taxon's v2 configuration, as data -1_code/experiments/exp_NNN_*/run.R (d) experiments - choose specs, species, draws and seed; - call the harness; summarize the results +1_code/experiments/exp_NNN_*/run.R (e) experiments + choose runs, species, draws, seed and what + changes; call run_experiment() ``` -An experiment run does three things: - -1. **Configures.** `run.R` is the only file to edit. It sets where the run - reads and writes (`data_dir`, `pipeline_dir`, `out_dir`), which taxa run, - the focal species, any replacement candidate models, the number of - bootstrap draws and the random seed. -2. **Fits.** For each taxon, `run_spec()` loops region → species → draw → - stage, doing what the spec says, and writes one result store per region - to `pipeline_dir///`. A failed species or draw is logged - and the run continues. -3. **Summarizes.** The experiment's numbered scripts read the stores and - write the deliverables to `out_dir`. - -Nothing outside `pipeline_dir` and `out_dir` is written during a run, and -`0_data/` is never written to outside `1_code/_setup/`. +An experiment run does four things: + +1. **Configures.** `run.R` calls `experiment_config()`, the only place a run's + decisions are made: the runs (taxa), the focal species, the draws, the + seed, any replacement candidate models or specs, and the workers. It is + checked before anything is fitted. +2. **Fits.** `run_experiment()` prepares each spec once - validating it and + loading each region's data and grid - then fits every species of every + spec as one job, in parallel when `workers` is above 1. Each job loops + region, draw and stage, doing what the spec says. A failed species or draw + is logged and the run continues. Results are written to + `2_pipeline////`. +3. **Summarizes.** `collect_results()` reduces the stores to per-species + summary tables in `3_output//tables/`. +4. **Runs the experiment's own steps**, such as exp_000's comparison with v2, + and writes `run_record.md`. + +Nothing outside `2_pipeline//` and `3_output//` is written during a +run, and `0_data/` is never written to outside `1_code/_setup/`. ### What a taxon spec holds @@ -105,19 +131,28 @@ modelling code; everything it names is looked up in a harness registry. | --- | --- | | `taxon` | The data slug that keys the response file, covariates and lookups | | `response_transform`, `family`, `weight_column` | How the recorded value becomes a response, and the error family and weights | -| `regions` | Per region: the row filter, the prediction grid, and the habitat candidate models | -| `stages` | In order: candidate models, engine, selection rule, information criterion, and which stage's prediction is carried into the next as `Climate` | +| `regions` | Per region: the row filter, the prediction grid (by default the manifest's), and the habitat candidate models | +| `stages` | In order: candidate models, engine, selection rule, information criterion, any rule settings, and which stage's prediction is carried into the next as `Climate` | | `resample` | The resampling scheme and its settings | +| `final_prediction` | Optional. The model the harness scores and projects; the plant specs name v2's own prediction from its coefficient tables | | `v2_coverage` | Per stage, whether the spec reproduces v2 (`reproduced`, `partial`, `not reproduced`) and what differs. **The one place coverage is stated**; the report prints it | | `notes` | Configuration facts, such as whether `Protocol` is fitted | -| Registry | File | Entries | +`validate_spec()` checks every field before a run reads any data. A misspelt +field, an unregistered method, or a rule paired with an engine that lacks what +it needs stops the run with a sentence saying which. + +| Registry | Where | Entries | | --- | --- | --- | -| Engines | `harness/engines.R` | `glm`, `bayesglm` | -| Selection rules | `harness/selection.R` | `single`, `aic_best`, `aic_average`, `staged_bic`, `ivw_grid`, `aic_best_grid`, `aic_best_onehot` | -| Resampling schemes | `harness/resample.R` | `precomputed`, `spatial_block`, `spatial_cv` | +| Engines | `methods/engines/` | `glm`, `bayesglm` | +| Selection rules | `methods/selection/` | `single`, `aic_best`, `aic_average`, `staged_bic`, `ivw_grid`, `aic_best_grid`, `aic_best_onehot` | +| Resampling schemes | `methods/resampling/` | `precomputed`, `spatial_block`, `spatial_cv` | +| Metrics | `methods/metrics/` | `auc`, `deviance_explained`, `rmse`, `spearman`, `calibration_slope`, `prevalence`, `n` | | Candidate model sets | `harness/model_sets.R` | The v2 formulas, spliced verbatim from `0_data/v2_scripts/` | -| Metrics | `harness/eval_metrics.R` | `auc`, `deviance_explained`, `rmse`, `spearman`, `calibration_slope`, `prevalence`, `n` | + +Each method is one file that registers itself; `list_methods()` prints them +with what each needs. The contracts are in +[`1_code/methods/README.md`](1_code/methods/README.md). The covariates a run loads are read off the formulas it fits, so a term can never be fitted without its column being loaded. @@ -142,6 +177,8 @@ this repository rather than copied: the harness reads the harmonized CSVs. - **Run length and seed are configurable.** v2 hard-coded 100 bootstrap draws and set no seed. Both are settings in `run.R`. +- **Species are fitted in parallel.** Each species draws under its own seed, + so a run gives the same results on one worker or twelve. Every taxon-specific behaviour in the v2 pipelines, and whether the harness reproduces it, is listed in [`docs/taxon_quirks.md`](docs/taxon_quirks.md). @@ -177,7 +214,11 @@ sdmMethodsDev/ │ │ ├── bird_bootstrap_ids.csv # the 100 stored v2 draws │ │ ├── bird_factor_levels.csv │ │ ├── bird_veg_age_matrix.csv # v2 bird translation, from _setup/06_ -│ │ └── v2_bootstrap_ids// # v2's stored plant draws, from _setup/07_ +│ │ ├── v2_bootstrap_ids// # v2's stored plant draws, from _setup/07_ +│ │ ├── dataset_manifest.csv # whose files are whose, from _setup/09_ +│ │ ├── species_queue.csv # every taxon's work queue, one schema +│ │ ├── factor_levels.csv # categorical level order, every taxon +│ │ └── bird_{north,south}_prediction_matrix.csv # bird habitat grids │ ├── v2_results/ # the v2 outputs, harmonized: built by _setup/05_ │ │ ├── v2_results.csv │ │ └── v2_results_coverage.csv @@ -190,33 +231,38 @@ sdmMethodsDev/ ├── 1_code/ │ ├── _scratch.R # temporary workspace │ ├── _setup/ # one-off; run by hand, not per experiment -│ │ ├── 01_harmonize_model_ready_v2.R -│ │ ├── 02_validate_test_dataset.R -│ │ ├── 03_rerun_bryophyte_v2_reference.R -│ │ ├── 04_package_bird_coefficients.R -│ │ ├── 05_harmonize_v2_results.R -│ │ ├── 06_harmonize_bird_translation_lookup.R -│ │ └── 07_harmonize_v2_plant_bootstrap_ids.R -│ ├── _deprecated/ # superseded code; not sourced +│ │ ├── 01_harmonize_model_ready_v2.R … 08_harmonize_abmiexplorer_results.R +│ │ └── 09_harmonize_lookups.R # the uniform lookups and the manifest │ ├── harness/ # shared, taxon-agnostic -│ │ ├── harness.R # load_harness(): sources the rest in order -│ │ ├── data_load.R +│ │ ├── harness.R # load_framework(): loads everything below +│ │ ├── registry.R # register_*(), get_method(), list_methods() +│ │ ├── cache.R # reads each lookup once per session +│ │ ├── spec.R # validate_spec(), spec helpers +│ │ ├── data_load.R # dataset manifest, loaders, model frames │ │ ├── covariate_sets.R │ │ ├── species.R -│ │ ├── model_sets.R -│ │ ├── resample.R -│ │ ├── engines.R -│ │ ├── selection.R +│ │ ├── model_sets.R # the v2 candidate formulas +│ │ ├── resample.R # seeds, spatial blocks, scheme dispatch +│ │ ├── engines.R # engine interface, check_engine() +│ │ ├── selection.R # candidate fitting, combined predictors │ │ ├── eval_metrics.R │ │ ├── predict_grid.R -│ │ ├── result.R -│ │ ├── run_record.R -│ │ ├── run_model.R # run_spec(): the fitting loop -│ │ └── utils/ -│ │ └── step_runner.R +│ │ ├── result.R # stores, shards +│ │ ├── run_model.R # run_specs(): the fitting loop +│ │ ├── summarise.R # collect_results() +│ │ ├── compare.R # compare_experiments() +│ │ ├── experiment.R # experiment_config(), run_experiment() +│ │ └── run_record.R +│ ├── methods/ # one file per method; see its README +│ │ ├── engines/ # glm.R, bayesglm.R, _glm_family.R +│ │ ├── selection/ # single.R, aic_average.R, ivw_grid.R, … +│ │ ├── resampling/ # precomputed.R, spatial_block.R, spatial_cv.R +│ │ ├── metrics/ # auc.R, rmse.R, … +│ │ └── _templates/ # copy-and-fill skeletons; not loaded │ ├── modules/ # one spec per taxon │ │ ├── _shared/ -│ │ │ └── plant_group.R # the v2 shape the four plant-group taxa share +│ │ │ ├── plant_group.R # the v2 shape the four plant-group taxa share +│ │ │ └── standard_specs.R # every run's v2 spec, by name │ │ ├── bryophytes/spec.R │ │ ├── lichens/spec.R │ │ ├── soil_mites/spec.R @@ -227,18 +273,22 @@ sdmMethodsDev/ │ │ └── birds/ │ │ ├── spec.R │ │ └── standardize.R # raw coefficients → v2's standardized terms -│ └── experiments/ -│ └── exp_000_parity_v2/ -│ ├── README.md # question, design, coverage -│ ├── run.R # the only file to edit -│ ├── utils/ -│ │ ├── focal_species.R # named species sets -│ │ └── parity_targets.R # what pass means -│ ├── 01_collect_results.R -│ ├── 02_compare_to_v2.R -│ ├── 03_build_report.R -│ ├── 04_plot_parity.R # one parity figure per taxon -│ └── v2_self_agreement.R # v2 against itself; run once +│ ├── experiments/ +│ │ ├── _shared/ +│ │ │ └── focal_species.R # named species sets, for every experiment +│ │ ├── _template/ # copy to start an experiment +│ │ └── exp_000_parity_v2/ +│ │ ├── README.md # question, design, coverage +│ │ ├── run.R # the only file to edit +│ │ ├── utils/parity_targets.R # what pass means +│ │ ├── 01_compare_to_v2.R +│ │ ├── 02_plot_parity.R +│ │ ├── 03_build_report.R +│ │ └── v2_self_agreement.R # v2 against itself; run once +│ └── tests/ +│ ├── run_tests.R # the contract tests; seconds +│ ├── compare_stores.R # are two runs' results the same? +│ └── testthat/ │ ├── 2_pipeline/ # intermediates; gitignored │ ├── exp_000_parity_v2/ @@ -254,6 +304,7 @@ sdmMethodsDev/ │ │ ├── parity_summary.csv # committed │ │ ├── coverage.csv # committed │ │ ├── metric_summary.csv # committed +│ │ ├── grid_summary.csv # committed │ │ ├── v2_self_agreement_summary.csv # committed │ │ ├── coefficient_summary.csv # gitignored; rebuilt │ │ └── parity_terms.csv # gitignored; rebuilt @@ -353,54 +404,71 @@ built yet. ### `1_code/` `harness/` holds the shared, taxon-agnostic pipeline. `harness.R` defines -`load_harness()`, which sources the other files in the order they need. -Changes here affect every experiment, past and future, and should be -reviewed accordingly. +`load_framework()`, which loads the harness, then every method, then every +taxon module, then the shared experiment settings. Changes here affect every +experiment, past and future, and should be reviewed accordingly. | File | Does | | --- | --- | -| `data_load.R` | Reads the test dataset column-selectively and assembles one frame per taxon and region | +| `registry.R` | The method registry: `register_engine()` and the rest, `get_method()`, `list_methods()` | +| `cache.R` | Keeps each lookup file, and each covariate column read, for the session | +| `spec.R` | `validate_spec()`, `apply_stage_models()`, `spec_covariates()`, `v2_status()` | +| `data_load.R` | The dataset manifest; column-selective loaders; one frame per taxon and region | | `covariate_sets.R` | Named covariate bundles, derived covariates, and term renaming | -| `species.R` | Work queues and focal-species resolution | -| `model_sets.R` | The v2 candidate formulas | -| `resample.R` | Bootstrap and cross-validation schemes, and per-species seeds | -| `engines.R` | Fitting engines behind one interface | -| `selection.R` | Turning a candidate set into one set of coefficients | -| `eval_metrics.R` | Metrics computed from predictions | -| `predict_grid.R` | Projecting a fit onto a habitat prediction grid | -| `result.R` | Writing and reading result stores | +| `species.R` | The species queue and focal-species resolution | +| `model_sets.R` | The v2 candidate formulas, and `extend_models()`, `models_from_covariates()` | +| `resample.R` | Seeds (`species_seed()`, `with_seed()`), spatial blocks, scheme dispatch | +| `engines.R` | How the harness talks to an engine, and `check_engine()` | +| `selection.R` | Candidate fitting and the result every rule returns | +| `eval_metrics.R` | `compute_metrics()` | +| `predict_grid.R` | Projecting a final model onto a habitat prediction grid | +| `result.R` | Writing, sharding and reading result stores | +| `run_model.R` | `run_specs()`: prepare, fit each species (in parallel), merge | +| `summarise.R` | `collect_results()`: stores to summary tables | +| `compare.R` | `compare_experiments()`: one experiment against a baseline | +| `experiment.R` | `experiment_config()`, `run_experiment()`, `script_step()` | | `run_record.R` | The committed run record | -| `run_model.R` | `run_spec()`, the loop a spec drives | -| `utils/step_runner.R` | `run_step()`: times a sourced script and logs its output | + +`methods/` holds every engine, selection rule, resampling scheme and metric, +one file each, each registering itself. Its +[`README.md`](1_code/methods/README.md) states each contract and how to add +and test a method. `modules/` holds one spec per taxon, in a folder named for the taxon. A spec is configuration only; experiment-specific logic belongs in the experiment. The four plant-group taxa share their v2 shape through `_shared/plant_group.R`, and each taxon's folder states only what is its -own, such as whether v2 fits `Protocol`. Soil mites use the data slug -`mite`, not `soil_mite`, wherever a taxon is named in `run.R`. +own, such as whether v2 fits `Protocol`. `_shared/standard_specs.R` lists +every run an experiment can choose, by name. Soil mites use the data slug +`mite`, not `soil_mite`. `experiments/` holds one folder per R&D question. Each contains a -`README.md` stating the question and design, a `run.R` entry point, and -numbered scripts that turn the result stores into deliverables. Experiments -call the harness and specs; they do not reimplement them. +`README.md` stating the question and design, and a `run.R` that configures +the run and calls `run_experiment()`. An experiment's own scripts are steps +it passes to `run_experiment()`; each runs in an environment of its own, +reading only `config` and `results`. `_template/` is the starting point for a +new experiment; `_shared/` holds settings every experiment can use, such as +the named focal-species sets. -`run.R` is the only file that has to be edited to change a run: +`run.R` is the only file that has to be edited to change a run. Its +`experiment_config()` call holds every decision: -| Section | Sets | +| Argument | Sets | | --- | --- | -| 1.3 | `data_dir`, `pipeline_dir`, `out_dir` | -| 1.4 | The specs, and `run_taxa` | -| 1.5 | The focal species, by name from `utils/focal_species.R` or inline | -| 1.5b | `stage_models`: replacement candidate sets, or `NULL` for v2's | -| 1.6 | `n_bootstraps` | -| 1.6b | `boot_seed`; `NULL` leaves the draws unseeded, as v2 did | -| 1.4 (`plant_bootstrap`) | `"spatial_block"` draws v2's bootstrap afresh; `"v2_ids"` replays v2's stored draws | -| 1.7 | Which steps run: fit, collect, compare, report, record | - -Output locations are the experiment's to choose. `pipeline_dir` takes the -intermediates and `out_dir` the deliverables; both can point anywhere -writable — a scratch disk for a long run, say — and nothing else changes. +| `id` | The experiment's folders under `2_pipeline/` and `3_output/` | +| `taxa` | The runs, from `names(standard_specs())` | +| `species` | A named set from `focal_species_sets()`, a vector named by taxon, or `NULL` for every species | +| `n_bootstraps` | Draws per species; 100 is v2's | +| `seed` | The base seed; `NULL` leaves draws unseeded, as v2 did | +| `stage_models` | Replacement candidate sets, or `NULL` for v2's | +| `specs` | Changed specs, or `NULL` for `standard_specs()` | +| `plant_bootstrap` | `"spatial_block"` draws v2's bootstrap afresh; `"v2_ids"` replays v2's stored draws | +| `workers` | Species fitted at once | +| `unit_predictions` | `"none"` (default), `"oob"` or `"all"` per-unit predictions written | + +`tests/` holds the contract tests (`run_tests.R`, seconds) and +`compare_stores.R`, which says whether two runs' results are the same; see +[Checking a change](docs/getting_started.md#check-that-nothing-broke). `_setup/` holds one-off scripts that prepare the repository itself. None runs as part of an experiment: they are run by hand, in order, when the @@ -416,6 +484,8 @@ them sorted clear of the run-time code. | `05_harmonize_v2_results.R` | v2 plant `COEFS.RData`, the mammal coefficient tables, `Birds2024.RData` | `0_data/v2_results/` | | `06_harmonize_bird_translation_lookup.R` | v2's bird `Xn-veg-v2024.Rdata` | `0_data/test_dataset/lookup/bird_veg_age_matrix.csv` | | `07_harmonize_v2_plant_bootstrap_ids.R` | v2's stored plant bootstrap draws | `0_data/test_dataset/lookup/v2_bootstrap_ids/` | +| `08_harmonize_abmiexplorer_results.R` | ABMIexploreR's packaged coefficients | `0_data/v2_results/abmiexplorer/` | +| `09_harmonize_lookups.R` | `0_data/test_dataset/lookup/` only (offline) | `species_queue.csv`, `factor_levels.csv`, `dataset_manifest.csv`, the bird prediction grids | - **`01`** writes every response, covariate and lookup table described under [`0_data/`](#0_data), so experiments run from @@ -454,11 +524,16 @@ them sorted clear of the run-time code. full sets are large (1.3 GB compressed for vascular plants), so `SDM_V2_BOOT_TAXA` and `SDM_V2_BOOT_SPECIES` restrict it to what a run needs. Bryophytes come from `03`'s regenerated draws. - -`_deprecated/` holds code superseded by the harness: the earlier -plant-only modules, placeholder harness files and the first version of -`exp_000`. Nothing sources it; its -[`README.md`](1_code/_deprecated/README.md) records what replaced each file. +- **`09`** writes the lookups every taxon shares one form of: one species + queue in one schema (the three taxon leads' lookups had three), one + factor-level table, the bird habitat prediction grids, and + `dataset_manifest.csv`, which names each taxon's response, offset and grid + files, its covariate key and its stored draws. The harness reads file + locations from the manifest and nowhere else, so a new taxon is rows there + plus its files. It reads only `test_dataset/`, so it runs offline; re-run it + after `01` or `06`. The bird north grid is v2's coefficient translation + matrix rebuilt in covariate space, and is checked to reproduce it exactly + before it is written. `_scratch.R` is a dated workspace for exploration. Work that proves durable is promoted into a proper script and removed from it. @@ -472,15 +547,17 @@ Each experiment writes one result store per taxon and region to | File | Holds | | --- | --- | -| `coefficients.csv` | Final-stage coefficients per species, draw and term | +| `coefficients.csv` | Every stage's coefficients per species, draw and term | | `metrics.csv` | Metrics per species and draw | -| `unit_predictions.csv` | Predictions at every survey unit | -| `grid_predictions.csv` | Predictions onto the habitat grid, where the spec names one | +| `grid_predictions.csv` | The final model's prediction for each habitat type on the grid | +| `unit_predictions.csv` | Only when `unit_predictions` is `"oob"` or `"all"`: the final model's prediction at survey units. Off by default: several GB for birds, and nothing downstream needs it | | `meta.json` | What produced the store: stages, engines, selection rules, covariates, resampling scheme, the seed actually used, any model overrides, and the spec's notes | `/run_log.csv` records the outcome of every species, region and draw — `ok`, or why not. The stores are too large to commit: 100 draws by -every species by every term. +every species by every term. While a run is fitting, each species writes to +`/_shards/`; the shards are joined into the region stores at the end, +row for row as a serial run would write them. `v2_reference/` holds v2 references rebuilt by `_setup/03` and `04`, which `_setup/05` reads. `logs/` holds the logs of the long `_setup` runs. @@ -499,10 +576,11 @@ time from the repository alone without large files changing on every run: | `tables/parity_summary.csv` | `tables/coefficient_summary.csv` | | `tables/coverage.csv` | `tables/parity_terms.csv` | | `tables/metric_summary.csv` | | +| `tables/grid_summary.csv` | | The gitignored tables hold per-species, per-term detail. They grow with the species list — a full plant run is tens of thousands of rows — and are rebuilt -from the `2_pipeline/` stores by re-running `run.R` with `run_models <- FALSE`. +from the `2_pipeline/` stores by `run_experiment(config, fit = FALSE)`. Keep the stores for as long as that detail may be needed. **Commit only runs that count.** A trial run writes to the same files as a @@ -520,13 +598,16 @@ experiment is its own record, and a rerun replaces it; its history is in git. A run writes its outputs in this order: ``` -2_pipeline stores ─► 01_collect ─► coverage · metric_summary · coefficient_summary - 02_compare ─► parity_terms · parity_summary - 04_plot ─► figures/parity_.png · parity_mean.png · parity_bell.png - 03_report ─► report.md - run.R 3.5 ─► run_record.md +2_pipeline stores ─► collect_results() ─► coverage · metric_summary · grid_summary · coefficient_summary + 01_compare_to_v2 ─► parity_terms · parity_summary + 02_plot_parity ─► figures/parity_.png · parity_mean.png · parity_bell.png + 03_build_report ─► report.md + run_record() ─► run_record.md ``` +`collect_results()` and `run_record()` belong to the harness and run for +every experiment; the three numbered scripts are exp_000's own steps. + A *draw* is one bootstrap iteration. Every summary reduces the draws to a median and a 10th–90th percentile band (`p10`, `p90`) rather than a mean and standard deviation, because the spread over draws is often skewed. @@ -581,8 +662,23 @@ draws. Each harness metric comes twice, prefixed by where it is scored: | `n` | Survey units scored | | `Climate`, `Climate_Truncated`, `Landcover`, `Full`, `Full_Truncated`, `Full_Joint`, `Full_Joint_Truncated` | v2's validation AUCs: climate alone (and capped at its 99th percentile), landcover alone, the two combined, and combined per habitat type | -The harness metrics come from the final stage's best single candidate model; -the v2 validation AUCs from the coefficients, as v2 reports them. +The harness metrics score each run's **final model**: the combined model where +a rule averages candidates, and for plants v2's own prediction from its +coefficient tables (`final_prediction` in the spec), so for plants +`insample_auc` equals `v2val_Full`. Earlier runs scored the best single +candidate instead; their metric summaries are not comparable with these. + +**`tables/grid_summary.csv`** — the final model's prediction for each habitat +type. One row per taxon × region × species × `grid_unit`, with `n`, +`median`, `p10`, `p90` and `boot1` over draws, on the response scale +(probability of detection or presence, or count for birds). Each grid row is +a pure stand of that type, at the stage's constants: `Climate` 0, the new +protocol where fitted, 100 sampling days for mammals. This is the quantity +every engine can produce, so it is what a method without coefficients is +compared on. Bird grids are v2's coefficient translation matrix rebuilt in +covariate space; v2's later adjustments to coefficients (the plant stand-age +splines, the bird linear-feature re-expression) are in the coefficients, not +the grid. **`tables/coefficient_summary.csv`** (gitignored) — what the models estimated. One row per run × region × stage × species × term, with the @@ -611,7 +707,7 @@ find which terms or species disagree. | `median`, `p10`, `p90`, `boot1`, `n` | This run's summary over draws | | `v2_median`, `v2_p10`, `v2_p90`, `v2_n`, `source` | The v2 summary and where it came from; `v2_n = 1` means v2 fitted once | | `comparison`, `run_value` | `median`, or `iteration 1` where v2 fitted once, and the run value used | -| `unreachable_reason`, `reachable` | Why a term cannot match yet (age spline, cutblock convergence, pooled with a spline term, v2 placeholder), from `v2_unreachable_terms()` in `02_compare_to_v2.R` | +| `unreachable_reason`, `reachable` | Why a term cannot match yet (age spline, cutblock convergence, pooled with a spline term, v2 placeholder), from `v2_unreachable_terms()` in `01_compare_to_v2.R` | | `in_band` | `TRUE` where the v2 median falls inside this run's `p10`–`p90` band | | `absolute_difference` | \|run value − v2 median\| | | `standardized_difference` | The absolute difference ÷ half this run's band width. Below 1 is close; far above 1 is a systematic difference | @@ -649,7 +745,7 @@ on the bryophyte climate stage, the evidence the distributional targets are set from. Written once by `v2_self_agreement.R`, not by `run.R`. **`figures/parity_.png`** — one figure per taxon, drawn from -`parity_terms.csv` by `04_plot_parity.R`. Panels are stage × region (and +`parity_terms.csv` by `02_plot_parity.R`. Panels are stage × region (and hurdle part, for mammals) by species; each row is a term. v2 and exp_000 are drawn in different colours as a median and a 10th–90th percentile bar, which is all v2's reference keeps of its draws. Terms span 1e-144 to 1e2, so each @@ -663,7 +759,7 @@ out and counted in the caption. species and term: one facet per taxon, one row per stage and region (and hurdle part). Each row is labelled with `|d|`, the mean absolute difference of the run's median from v2's, and the share of terms in band. Setting -`mean_facet <- "group"` in `04_plot_parity.R` pools the four plant taxa into +`mean_facet <- "group"` in `02_plot_parity.R` pools the four plant taxa into one facet beside mammals and birds. Averages use values clamped at ±4, so one far-off term cannot dominate a row. @@ -757,24 +853,19 @@ An experiment identifier is used verbatim in `1_code/experiments/`, ## Adding an experiment -1. Copy `1_code/experiments/exp_000_parity_v2/` to - `exp_00N_short_description/`. `run.R` creates the matching - `2_pipeline/` and `3_output/` folders on its first run. -2. Set `exp_id` in `run.R` to the new identifier. Every other path derives - from it. -3. State the question and design in the experiment's `README.md`. -4. Configure the run in `run.R`: the taxa (1.4), the focal species (1.5, - adding a named set to `utils/focal_species.R` if it will be reused), any - replacement candidate models (1.5b), the draws (1.6) and the seed (1.6b). -5. Write the numbered scripts. They read the result stores in - `2_pipeline//` with `read_results()` and write to - `3_output//`. - -Experiment-specific logic stays in the experiment. To change the models a -stage fits, use `stage_models` rather than editing a spec: the spec is the -record of what v2 did, and `meta.json` records the override. If a change is -needed in `harness/` or `modules/`, it affects every experiment and should -be reviewed on that basis. +1. Copy `1_code/experiments/_template/` to `exp_00N_short_description/`. +2. Set `id` in its `run.R` to the folder's name. Every path derives from it. +3. State the question and design in its `README.md`. +4. Change one thing relative to exp_000: `stage_models` for different + candidate formulas, or `specs` for a different engine or selection rule. + Keep exp_000's species, draws and seed unless they are the question. +5. Run it. The template's `compare_to_baseline` step writes + `tables/comparison_*.csv` against exp_000. + +[`docs/getting_started.md`](docs/getting_started.md#test-a-change) walks +through each lever. Experiment-specific logic stays in the experiment; a +change to `harness/`, `methods/` or `modules/` affects every experiment and +should be reviewed on that basis. ## Contributing a taxon module @@ -785,19 +876,21 @@ be reviewed on that basis. response table, its rows in `covariates.csv` and `covariate_columns.csv`, its species queue, and any prediction grid or stored bootstrap draws. Extend `02_validate_test_dataset.R` to trace them back to the source. -3. Splice the v2 candidate formulas into `harness/model_sets.R`, verbatim. -4. Add `1_code/modules//spec.R`, a function returning the spec. Model +3. Add the taxon to `09_harmonize_lookups.R`: its species queue rows and + its rows in `dataset_manifest.csv` (response file, offset file, covariate + key, grid, stored draws). Re-run `09`. +4. Splice the v2 candidate formulas into `harness/model_sets.R`, verbatim. +5. Add `1_code/modules//spec.R`, a function returning the spec. Model it on `lichens/spec.R` for a plant-group taxon, or on `birds/spec.R` or - `mammals/spec.R` for a standalone pipeline. If v2 does something no - registry entry covers, add an engine, selection rule or resampling scheme - to the harness, and review it as a harness change. -5. Add the taxon's published v2 results to `_setup/05_harmonize_v2_results.R`, + `mammals/spec.R` for a standalone pipeline, and add its run to + `modules/_shared/standard_specs.R`. If v2 does something no registered + method covers, add one to `1_code/methods/`. +6. Add the taxon's published v2 results to `_setup/05_harmonize_v2_results.R`, so `v2_results.csv` carries a reference for it. -6. Source the spec in section 1.2 of `run.R` and add it to `specs` in 1.4. -7. Check the result against the originals rather than trusting it. Record - every taxon-specific behaviour, and whether the spec reproduces it, in - `docs/taxon_quirks.md`, and anything the spec does not reproduce in its - `notes`. +7. Check that `validate_spec()` passes and `1_code/tests/run_tests.R` runs + clean, then check the result against the originals rather than trusting + it. Record every taxon-specific behaviour, and whether the spec reproduces + it, in `docs/taxon_quirks.md`. ## Setup @@ -806,7 +899,9 @@ R 4.4 or later, plus the packages the harness and the `_setup` scripts use: ```r install.packages(c( "data.table", "foreach", "AICcmodavg", "arm", "binom", - "mapproj", "mgcv", "MuMIn", "pROC", "RcmdrMisc" + "mapproj", "mgcv", "MuMIn", "pROC", "RcmdrMisc", + "jsonlite", "ggplot2", # summaries and figures + "testthat" # 1_code/tests/ )) ``` @@ -815,6 +910,8 @@ Build the test dataset once per snapshot, from the repository root: ```r source("1_code/_setup/01_harmonize_model_ready_v2.R") source("1_code/_setup/02_validate_test_dataset.R") +source("1_code/_setup/06_harmonize_bird_translation_lookup.R") +source("1_code/_setup/09_harmonize_lookups.R") # offline; seconds ``` Build the v2 reference once, after that. `03` and `04` are long — hours — diff --git a/cap b/cap deleted file mode 100644 index 83ae1b5..0000000 --- a/cap +++ /dev/null @@ -1,2 +0,0 @@ -numeric integer same values in order: TRUE -bird rows with any count see birdlist cols: species region det.mean det.min diff --git a/docs/framework_design.md b/docs/framework_design.md index 7b78cb0..dcb50d3 100644 --- a/docs/framework_design.md +++ b/docs/framework_design.md @@ -1,6 +1,6 @@ # Modelling framework design -![Status](https://img.shields.io/badge/Status-Steps%201--3%20built-yellow) +![Status](https://img.shields.io/badge/Status-Steps%201--5%20built-yellow) How the three taxon pipelines become one configurable framework, so that a methods question can be asked once and answered across taxa. @@ -72,49 +72,85 @@ requires a separate pipeline. ``` 1_code/ ├── harness/ # taxon-agnostic; the framework -│ ├── data_load.R # readers + build_model_data + model_frame +│ ├── harness.R # load_framework(): everything below, in order +│ ├── registry.R # register_*(), get_method(), list_methods() +│ ├── spec.R # validate_spec() and spec helpers +│ ├── data_load.R # dataset manifest, readers, model frames │ ├── covariate_sets.R # named bundles → the column catalogue -│ ├── species.R # one species catalogue across three schemas -│ ├── resample.R # precomputed | spatial_block | spatial_cv -│ ├── engines.R # registry: glm, bayesglm -│ ├── selection.R # single, aic_best, aic_average, staged_bic -│ ├── eval_metrics.R # scores computed from predictions only -│ ├── result.R # the five-file result store -│ └── utils/step_runner.R # timing and logging +│ ├── species.R # the one species queue +│ ├── resample.R # seeds, spatial blocks, scheme dispatch +│ ├── engines.R # engine interface, check_engine() +│ ├── selection.R # candidate fitting, combined predictors +│ ├── eval_metrics.R # compute_metrics() +│ ├── predict_grid.R # final model onto a habitat grid +│ ├── result.R # the result store, and shards +│ ├── run_model.R # run_specs(): prepare, fit (parallel), merge +│ ├── summarise.R # collect_results() +│ ├── compare.R # compare_experiments() +│ └── experiment.R # experiment_config(), run_experiment() +├── methods/ # one file per method, each self-registering +│ ├── engines/ # glm, bayesglm +│ ├── selection/ # single, aic_best, aic_average, staged_bic, +│ │ # ivw_grid, aic_best_grid, aic_best_onehot +│ ├── resampling/ # precomputed, spatial_block, spatial_cv +│ └── metrics/ # auc, deviance_explained, rmse, … ├── modules/ -│ ├── _shared/plant_group.R # the four plant-group taxa share this -│ └── /spec.R # that taxon's v2 configuration (step 4) -├── experiments/exp_NNN_*/ -│ └── run.R # taxon, species, covariates, engine -└── _deprecated/ # superseded; see its README +│ ├── _shared/ # plant_group.R; standard_specs.R +│ └── /spec.R # that taxon's v2 configuration +├── experiments/ +│ ├── _shared/ # focal-species sets +│ ├── _template/ # the starting point for a new one +│ └── exp_NNN_*/run.R # configuration, then run_experiment() +└── tests/ # contract tests; store comparison ``` -The harness knows nothing about any taxon. A module contributes only a -spec. An experiment overrides parts of a spec. +The harness knows nothing about any taxon, and nothing about any +particular method: it looks methods up by the name a spec gives. A +module contributes only a spec. An experiment changes parts of a +spec, or names different methods in it. There are six taxon modules: `bryophytes`, `lichens`, `soil_mites`, -`vascular_plants`, `mammals` and `birds`. The first four were one -`plants` module until they were split, so that a taxon-specific -quirk has one obvious home and the four can diverge. What they still -share is the v2 pipeline shape, which lives in -`_shared/plant_group.R` so four copies cannot drift apart. - -Directory names are plural and readable; **taxon slugs are the data -keys and are not**. Soil mites live in `soil_mites/` and key on -`mite`, which is what `run_taxa`, `focal_species` and every harness -call expect. - -Files are consolidated rather than one function per file: `engines.R` -holds the registry and both engines, and splits when `gbm` and `brms` -arrive. Two pieces named in the original sketch are deliberately not -built yet, because both depend on decisions a spec makes: - -- `predict_grid.R` — projecting a fitted model onto a prediction matrix. - v2 does this inside its habitat-model functions, and how the terms map - onto grid rows is spec-dependent. `write_grid_predictions()` is ready - for it; nothing produces grid predictions yet. -- `run_model.R` — the species-by-bootstrap loop. It is the glue a spec - drives, so it lands with the first spec. +`vascular_plants`, `mammals` and `birds`. The first four share the v2 +pipeline shape in `_shared/plant_group.R`, so four copies cannot +drift apart. Directory names are plural and readable; **taxon slugs +are the data keys and are not**. Soil mites live in `soil_mites/` and +key on `mite`. + +### Methods are plug-ins + +An engine, selection rule, resampling scheme or metric is one file in +`1_code/methods/` that registers itself. Each kind has a contract, +stated in `1_code/methods/README.md`, and a rule states the engine +capabilities it needs (`coefficients`, `ic`, `se`). `validate_spec()` +checks a spec against the registry before any data is read, so an +engine paired with a rule it cannot serve - a boosted tree with +inverse-variance averaging, say - stops with a sentence rather than +silently returning nothing hours into a run. `check_engine()` tests a +new engine against the contract on synthetic data. + +The rules talk to an engine only through its interface: coefficients +come from `engine$coef()`, computed once per fit, and every rule's +result carries a `predict()` for its final model. That is what lets +an engine without coefficients run any stage with the `single` rule, +be carried into a later stage, and be projected onto the grid. + +### The data is described, not assumed + +`0_data/test_dataset/lookup/dataset_manifest.csv`, written by +`_setup/09`, names each taxon's response, offset and grid files, its +key in `covariates.csv`, and its stored draws. The species queue and +factor levels are one table each for every taxon. The harness reads +file locations from the manifest and nowhere else, so a new taxon is +manifest rows plus its files. + +### Runs are parallel and reproducible + +Each species of each spec is one job. Jobs run on a cluster of R +sessions, each writing a shard of its own, and the shards are joined +in queue order, so a parallel run writes byte for byte what a serial +one does. Draws are seeded per species from one base seed, under R's +default generator named explicitly, so a run's results do not depend +on the number of workers or the order jobs finish in. ## Contract 1: the taxon spec @@ -170,18 +206,22 @@ run_experiment( ## Contract 2: the result object -Every run writes the same five files, whatever the engine. This is what +Every run writes the same files, whatever the engine. This is what makes a GLM run and a BRT run comparable. | File | Columns | Notes | | --- | --- | --- | | `grid_predictions.csv` | species, region, boot, grid_unit, prediction | **the common currency** | -| `unit_predictions.csv` | species, region, boot, survey_unit_id, prediction, observed | held-out scoring | +| `unit_predictions.csv` | species, region, boot, survey_unit_id, prediction, observed | optional (`unit_predictions = "oob"` or `"all"`); metrics are scored in memory | | `coefficients.csv` | species, region, boot, term, estimate, se | absent for engines without coefficients | | `metrics.csv` | species, region, boot, metric, value | AUC, deviance, calibration | | `meta.json` | engine, selection, covariate set, spec hash, seed, timing | provenance | -`grid_predictions` is the linchpin. Coefficients cannot compare a GLM to +`grid_predictions` is the linchpin. It is the stage's **final** model +projected onto the grid: the averaged or combined one where a rule +combines candidates, not the best single candidate. Every taxon has a +grid; the bird grids are v2's coefficient translation matrix rebuilt +in covariate space by `_setup/09`. Coefficients cannot compare a GLM to a boosted tree — a tree has no `Peatland` coefficient — but every engine can predict onto the 43 rows of the vegetation prediction matrix or the 16 of the soil matrix. Comparing there keeps the comparison on the @@ -389,39 +429,30 @@ It sits on a regularization axis. A Bayesian framework comparison needs ## Build order -1. **Built.** Harness data layer and covariate sets — - `data_load.R`, `covariate_sets.R`, `species.R`. -2. **Built.** Result object and its writers — `result.R`. -3. **Built.** Engines `glm` and `bayesglm` (`engines.R`); selection - `single`, `aic_best`, `aic_average`, `staged_bic` (`selection.R`); - resample `precomputed`, `spatial_block`, `spatial_cv` - (`resample.R`); metrics (`eval_metrics.R`). -4. **Built.** Specs for all six taxa, in - `1_code/modules//spec.R`, plus `run_model.R` (the - species-by-draw-by-stage loop) and `predict_grid.R`. +1. **Built.** Harness data layer and covariate sets. +2. **Built.** Result object and its writers. +3. **Built.** Engines `glm` and `bayesglm`; selection `single`, + `aic_best`, `aic_average`, `staged_bic`; resample `precomputed`, + `spatial_block`, `spatial_cv`; metrics. +4. **Built.** Specs for all six taxa, the fitting loop and grid + prediction. 5. **Built.** `exp_000_parity_v2` runs each spec and compares - against the published v2 output, on both the climate and the - habitat stage, for all three taxa. Plants reach **90.9% of - terms in band** among those the harness fits; the mammal - presence stage correlates **0.98** with `Coef.pa.all`. Birds - run but have no reachable reference. Coverage and the - remaining gaps are in the experiment's README and report. - - Five selection rules now cover the three pipelines' - different ideas of what a coefficient is: `aic_average` - (plants and birds, climate), `ivw_grid` (plants, habitat - - precision-weighted predictions onto a prediction matrix), - `staged_bic` (birds, landcover), and `aic_best_onehot` - (mammals - one-hot predictions on the probability scale with - a calibration shift). -6. Engines `gbm` and `brms`; the topography and remote-sensing covariate - extension; exp_001 onward. - -Steps 1–3 are taxon-agnostic and were built and exercised before any -taxon spec exists. All four taxon-and-region combinations — -bryophyte north, mammal north, mammal south, bird north — run through -one interface, covering the three response types, the offset path and -the weighted path. + against the published v2 output, on every stage, for all three + taxa. Five selection rules cover the three pipelines' different + ideas of what a coefficient is: `aic_average`, `ivw_grid`, + `staged_bic`, `aic_best_grid` and `aic_best_onehot`. +5a. **Built (2026-10-03).** The plug-in method layer + (`1_code/methods/`, the registry, `validate_spec()`, + `check_engine()`); the dataset manifest and harmonized lookups + (`_setup/09`); parallel species with byte-identical shards; + metrics and grids from each stage's final model, and grids for + every taxon; `experiment_config()` and `run_experiment()`; the + experiment template and `compare_experiments()`; contract tests. + Checked against the previous code at 5 draws for the 14 parity + species: every stage's coefficients identical. +6. New engines (`gbm`, `mgcv` GAMs, `brms`) as method files; the + topography and remote-sensing covariate extension; spatial + prediction onto the 1 km grid; exp_001 onward. ### What steps 1-3 settled diff --git a/docs/getting_started.md b/docs/getting_started.md new file mode 100644 index 0000000..652d375 --- /dev/null +++ b/docs/getting_started.md @@ -0,0 +1,250 @@ +# Getting started + +This guide covers running the v2 baseline, reading what it writes, +and testing a change against it. It assumes you know R. It does not +assume you know how the v2 models were built. + +- [The idea in one paragraph](#the-idea-in-one-paragraph) +- [Words used throughout](#words-used-throughout) +- [Run the baseline](#run-the-baseline) +- [Read the outputs](#read-the-outputs) +- [Test a change](#test-a-change) +- [Add a method](#add-a-method) +- [Check that nothing broke](#check-that-nothing-broke) +- [Where things are](#where-things-are) + +## The idea in one paragraph + +Every taxon's v2 model follows the same sequence: + +1. Pick survey units. +2. Fit a set of candidate models. +3. Choose among them or average them. +4. Predict and score. + +What differs between taxa is the contents of each step: the +response, the formulas, the selection rule. Here those contents are +data, in a **spec**, one per taxon. One shared pipeline, the +**harness**, runs any spec. + +So a methods question is asked once, by changing one entry, and +answered for every taxon. `exp_000_parity_v2` runs the v2 specs and +checks they reproduce v2. Every later experiment changes one thing +and is compared against it. + +## Words used throughout + +| Word | Means | +| --- | --- | +| **Spec** | A taxon's v2 configuration as a list: response, family, regions, stages, resampling. Built by functions such as `lichen_spec()` in `1_code/modules//spec.R`. Holds no modelling code. | +| **Run** | One spec in an experiment, named as its output folder: `lichen`, `mammal_summer`. `standard_specs()` lists them. | +| **Stage** | One model fitted in order. Plants and birds fit `climate`, then `habitat` (or `landcover`). | +| **Carry** | Passing one stage's prediction into the next as a covariate called `Climate`, which is how v2 combines its climate and habitat models. | +| **Candidate set** | The formulas a stage chooses among. The v2 sets are in `harness/model_sets.R`. | +| **Engine** | How one formula is fitted: `glm`, `bayesglm`. | +| **Selection rule** | How a candidate set becomes one result: `aic_average`, `staged_bic`, `ivw_grid`, and so on. | +| **Draw** | One bootstrap resample of the survey units. v2 uses 100. Draw 1 is the full data. | +| **Store** | A folder of results for one run and region: `coefficients.csv`, `metrics.csv`, `grid_predictions.csv`, `meta.json`. | +| **Grid** | A prediction matrix with one row per habitat type, each row a pure stand of that type. Predicting onto it gives each method's effect per habitat type, so methods without coefficients can be compared. | +| **Out-of-bag (oob)** | Scored on the survey units a draw left out, which is the held-out read. `insample` scores the units the draw fitted. | +| **Parity** | Whether a run reproduces v2. Distributional, not numerical: v2 sets no random seed, so two v2 runs differ. | + +## Run the baseline + +Open the project in RStudio or Positron. The working directory is +then the repository root. Then: + +```r +source("1_code/experiments/exp_000_parity_v2/run.R") +``` + +`run.R` is a page of decisions, `experiment_config()`, followed by +one call, `run_experiment()`. Before you run it, check three +settings: + +| Setting | For a quick check | For the real thing | +| --- | --- | --- | +| `species` | `"one_each"` (one species per taxon) | `"parity_check"`, or `NULL` for every species | +| `n_bootstraps` | `5` | `100` | +| `workers` | 4 | up to the cores you can spare | + +`experiment_config()` checks the configuration before anything is +fitted, and prints what it will do. Shorten a trial by cutting +species, not draws: a 10–90% band read from five draws does not +mean much. + +On a 24-core machine, for the 14 `parity_check` species (5-draw rows measured): + +| Draws | Workers | Time | +| --- | --- | --- | +| 5 | 1 | about 6 min | +| 5 | 12 | about 1.6 min, set by the slowest species (a bird, about 1 min) | +| 100 | 12 | estimated 25–30 min (not yet run); the previous, serial code took 3.3 h | + +Parallel workers are separate R sessions that load the framework from +disk when the run starts, so do not edit `1_code/` files while one is +starting. + +## Read the outputs + +Everything lands in `3_output//`. Read these in order: + +1. **`run_record.md`**: what ran. If it is not every species at 100 + draws, the numbers describe a trial. +2. **`report.md`**: what each spec reproduces of v2, parity by + stage, and model fit (AUC). +3. **`tables/parity_summary.csv`**: one row per taxon, region and + stage, with a verdict. +4. **`tables/metric_summary.csv`**: fit metrics per species. Read + the `oob_` rows. +5. **`tables/grid_summary.csv`**: the predicted effect of each + habitat type, per species. + +The column definitions are in the +[README's output key](../README.md#output-key). + +The model behind every metric and grid prediction is each stage's +**final** model. That is the averaged one where v2 averages +candidates, and v2's own prediction from its coefficient tables +for plants. It is not the single best candidate. + +## Test a change + +Copy `1_code/experiments/_template/` to +`1_code/experiments/exp_001_short_description/`, set `id`, and +write the question in the README. Then change one thing. There are +three levers, from least to most invasive. + +### 1. Different candidate formulas: `stage_models` + +The covariates a run loads are read off the formulas it fits. +Changing the formulas is therefore all it takes to try new +covariates. + +```r +stage_models = list( + # every v2 climate candidate, plus elevation + climate = extend_models("climate_plant_v2_full", "elevation"), + # or, for mites only, a ladder built from covariates + mite.climate = models_from_covariates( + c("MAP", "FFP", "CMD"), form = "ladder" + ) +) +``` + +Keys are `stage` (every taxon) or `taxon.stage` (one taxon). +`meta.json` records the override, so a run that did not fit the v2 +sets cannot be mistaken for one that did. + +### 2. A different engine or rule: `specs` + +Build the standard specs, change a stage, and pass them in. For +example, to fit the bird landcover stage with a registered engine +called `my_engine`, one formula, no ranking: + +```r +specs <- standard_specs() +specs$bird$stages[[2]]$engine <- "my_engine" +specs$bird$stages[[2]]$selection <- "single" + +config <- experiment_config( + id = "exp_002_my_engine", taxa = "bird", specs = specs, ... +) +``` + +`validate_spec()` checks the combination before anything runs. A +rule that needs something the engine cannot give, such as standard +errors for inverse-variance averaging, stops the run with a +sentence that says so. + +v2 post-processing steps that read coefficients do not apply to an +engine without them. Examples are the plant stand-age splines and +footprint pooling, set in a stage's `post_process`. Remove them +when you swap such an engine in: + +```r +specs$lichen$stages[[2]]$post_process <- NULL +``` + +### 3. A new method + +See [`1_code/methods/README.md`](../1_code/methods/README.md). A new +engine, rule, resampling scheme or metric is one file there. After +that, it is a name in a spec, as in lever 2. + +### Reading the comparison + +The template's `run.R` ends with `compare_to_baseline`, which +writes three tables: + +| File | Holds | +| --- | --- | +| `comparison_summary.csv` | Per taxon, region and metric: the median difference from exp_000, and the share of species that did better | +| `comparison_metrics.csv` | Per species and metric, with both runs' 10–90% bands | +| `comparison_grid.csv` | Per species: rank correlation and absolute difference of the habitat effects on the grid | + +"Better" means: + +- higher AUC, deviance explained and Spearman; +- lower RMSE; +- a calibration slope closer to 1. + +A difference is only worth reading if it is consistent across +species (`share_better`) and large relative to the bands. + +## Add a method + +The short version: + +1. Copy the matching template from `1_code/methods/_templates/` + into the matching folder of `1_code/methods/`. +2. Fill it in, and register it. +3. Check it: + + ```r + source("1_code/harness/harness.R") + load_framework() + check_engine(engine_mine()) # for an engine + list_methods() # it should be listed + ``` + +4. Run `Rscript 1_code/tests/run_tests.R`. +5. Name it in a spec (lever 2 above), then try it on + `species = "one_each"` with `n_bootstraps = 5`. + +## Check that nothing broke + +A change to `harness/`, `methods/` or `modules/` affects every +experiment, past and future. Before relying on one, take two steps. + +**1. Run the tests.** These take seconds: + +```sh +Rscript 1_code/tests/run_tests.R +``` + +**2. Confirm the v2 results are unchanged.** Draws are seeded per +species and made in order, so draws 1–5 of a 5-draw run are the +same rows as draws 1–5 of the 100-draw baseline. Run the parity +species at 5 draws to a scratch folder, then compare: + +```sh +Rscript 1_code/tests/compare_stores.R \ + 2_pipeline/exp_000_parity_v2 2_pipeline/ 5 +``` + +Every coefficient file should match to 1e-10. A change that is +meant to alter results should alter only what it says it does. + +## Where things are + +| Folder | Holds | Edit it to | +| --- | --- | --- | +| `1_code/harness/` | The shared pipeline: loading, the fitting loop, summaries, comparison | Change how every experiment runs (review as such) | +| `1_code/methods/` | Engines, selection rules, resampling schemes, metrics | Add a method | +| `1_code/modules//` | Each taxon's v2 spec | Record what v2 does for a taxon | +| `1_code/experiments/exp_NNN_*/` | One folder per question | Ask a question | +| `1_code/experiments/_shared/` | Named focal-species sets | Add a reusable species set | +| `1_code/_setup/` | One-off scripts that build `0_data/` | Rebuild or extend the dataset | +| `0_data/test_dataset/` | The frozen dataset. `lookup/dataset_manifest.csv` says which file is whose | Nothing; it is rebuilt by `_setup/` | +| `docs/` | Design, taxon quirks, this guide | | From db1df652f4716228e877471edceb91dc808e0ab1 Mon Sep 17 00:00:00 2001 From: bgcasey Date: Sat, 3 Oct 2026 14:56:26 -0600 Subject: [PATCH 03/16] Updated readme to reflect updated pipeline --- README.md | 1521 +++++++++++++++++++++++++++-------------------------- 1 file changed, 771 insertions(+), 750 deletions(-) diff --git a/README.md b/README.md index 1fe6f16..792e5ec 100644 --- a/README.md +++ b/README.md @@ -10,470 +10,474 @@ > [!IMPORTANT] > This repository is developed by and for the Science Centre at the Alberta Biodiversity Monitoring Institute (ABMI). It is intended for internal use. -> +> -Shared pipeline and static cross-taxa test dataset for methods R&D on ABMI -species models. +A shared, static cross-taxa test dataset and one modelling pipeline, so that +methods questions for Species Models 3.0 can be asked once and answered for +every taxon, against the same v2.0 baseline. ## Contents -- [Overview](#overview) +- [Why this repository exists](#why-this-repository-exists) - [Quick start](#quick-start) - [Status](#status) -- [Pipeline flow](#pipeline-flow) +- [How it works](#how-it-works) + - [One pipeline, taxon as configuration](#one-pipeline-taxon-as-configuration) + - [Everything is compared with one v2 baseline](#everything-is-compared-with-one-v2-baseline) + - [What a taxon spec holds](#what-a-taxon-spec-holds) + - [Methods are plug-ins](#methods-are-plug-ins) +- [The experiment pipeline](#the-experiment-pipeline) + - [From run.R to results](#from-runr-to-results) + - [Inside one species job](#inside-one-species-job) + - [Configuring a run](#configuring-a-run) +- [Building the dataset](#building-the-dataset) - [Directory structure](#directory-structure) - - [`0_data/`](#0_data) - - [`1_code/`](#1_code) - - [`2_pipeline/`](#2_pipeline) - - [`3_output/`](#3_output) - - [`docs/`](#docs) +- [Data: `0_data/`](#data-0_data) +- [Outputs: `2_pipeline/` and `3_output/`](#outputs-2_pipeline-and-3_output) - [Parity gate](#parity-gate) - [Known gaps](#known-gaps) -- [Naming conventions](#naming-conventions) - [Adding an experiment](#adding-an-experiment) - [Contributing a taxon module](#contributing-a-taxon-module) +- [Naming conventions](#naming-conventions) - [Setup](#setup) - [Related resources](#related-resources) - [Contact](#contact) -## Overview +## Why this repository exists + +Species Models are produced one taxon at a time, each by its taxon lead. That +works for production, but it confines R&D to one taxon: a method that improves +plant models may or may not improve bird models, and testing it three times in +three codebases duplicates effort. -A shared environment for testing methods across taxa. It holds a static -cross-taxa test dataset and a companion R&D pipeline: a taxon-agnostic -harness, and one taxon spec per taxon that states that taxon's v2 -configuration as data. +This repository holds: -Because the dataset and pipeline are fixed, R&D questions can be run once -across all taxa rather than reimplemented per taxon, and results stay -comparable over time. +- a **frozen test dataset** of 10–20 focal species per taxon, harmonized to + one format (`0_data/test_dataset/`); +- **one pipeline** that runs every taxon's v2.0 model as configuration rather + than as separate code (`1_code/`); +- **exp_000**, which checks that the pipeline reproduces v2.0, and is the + baseline every later experiment is compared against. -This repository is for methods research and development. It is not for the -final species models and does not generate reporting products. +It is for methods research and development. It does not produce the final +species models or reporting products. ## Quick start -New here? Read [`docs/getting_started.md`](docs/getting_started.md): the -vocabulary, how to run the baseline, how to read what it writes, and how to -test a change against it. +New to the repository? Read [`docs/getting_started.md`](docs/getting_started.md) +first: the vocabulary, how to run the baseline, how to read what it writes, +and how to test a change. ```r source("1_code/harness/harness.R") -load_framework() # the harness, every method, every taxon module -list_methods() # the engines, selection rules, resampling, metrics -names(standard_specs()) # the runs an experiment can choose +load_framework() # the harness, every method, every taxon module +list_methods() # engines, selection rules, resampling, metrics +names(standard_specs()) # the runs an experiment can choose -# The v2 baseline: configure at the top of run.R, then run it +# The v2 baseline: check the settings at the top of run.R, then source("1_code/experiments/exp_000_parity_v2/run.R") ``` -A new experiment starts from `1_code/experiments/_template/`; a new method is -one file in `1_code/methods/` (see its [README](1_code/methods/README.md)). +| To | Start from | +| --- | --- | +| Run the v2 baseline | `1_code/experiments/exp_000_parity_v2/run.R` | +| Test a methods question | A copy of `1_code/experiments/_template/` | +| Add an engine, selection rule, resampling scheme or metric | [`1_code/methods/README.md`](1_code/methods/README.md) | +| Check a code change broke nothing | `Rscript 1_code/tests/run_tests.R`, then [this check](docs/getting_started.md#check-that-nothing-broke) | ## Status | Component | State | | --- | --- | -| Test dataset | Built from the `model_ready_v2` snapshot and the bird `Stratified.Rdata`. Responses, covariates and lookups for the four plant-group taxa, mammals and birds. Validated by `_setup/02` | -| v2 reference | Harmonized into `0_data/v2_results/v2_results.csv` by `_setup/05`. Bryophyte model reference regenerated by `_setup/03`; bird coefficients re-packaged by `_setup/04` | -| Harness | Built: loading, resampling, fitting engines, selection rules, metrics, result stores, run records | -| Taxon specs | Every stage of every taxon runs, and every one is partial against v2. The detail is each spec's `v2_coverage`, printed in `report.md` | -| v2.0 parity check (`exp_000`) | Runs end to end. Not yet able to gate; see [Known gaps](#known-gaps) | - -## Pipeline flow - -Five parts, each with one job. - +| Test dataset | Built for the four plant-group taxa (bryophytes, lichens, soil mites, vascular plants), mammals and birds. Validated by `_setup/02` | +| v2 reference | Published v2 results harmonized into one table, `0_data/v2_results/` | +| Pipeline | Built: plug-in methods, parallel species, final-model metrics and habitat grids for every taxon, experiment runner, contract tests | +| Taxon specs | Every stage of every taxon runs. What each reproduces of v2 is stated in its spec's `v2_coverage`, printed in `report.md` | +| exp_000 (v2 parity) | At 100 draws on the 14-species `parity_check` set, all 22 taxon × region × stage rows pass the proposed targets. Not yet a gate: see [Parity gate](#parity-gate) | + +## How it works + +### One pipeline, taxon as configuration + +The three v2.0 pipelines differ in nearly every detail but share one sequence: +pick survey units, fit candidate models, choose among or average them, +predict and score. What differs is the contents of each step. Here those +contents are data, in a **spec** per taxon, and one **harness** runs any spec. +How a model is fitted, selected, resampled or scored is a **method**, looked +up by the name the spec gives. + +```mermaid +%% ---------------------------- +%% Taxon as configuration, not codebase +%% ---------------------------- +%%{init: {"themeVariables": {"edgeLabelBackground": "#ffffff"}}}%% +flowchart TD + + subgraph fw["framework: one pipeline, taxon as configuration"] + direction TB + PARAM["response · family · offset · regions · stages · resampling"] + PARAM --> SP["plant-group specs
bryophytes · lichens · mites · vascular plants"] + PARAM --> SM["mammal specs
summer · winter"] + PARAM --> SB["bird spec"] + SP --> H["1_code/harness/"] + SM --> H + SB --> H + MT["1_code/methods/
engines · selection rules · resampling · metrics"] + MT -.->|"looked up by name"| H + H -->|"the same result files
for every taxon and method"| R["result stores"] + end + + %% ---------------------------- + %% Styles + %% ---------------------------- + + %% Containers + style fw fill:none,stroke:#2D415B,stroke-width:1px + + %% Configuration + style PARAM fill:#ffffff,stroke:#2D415B,stroke-width:1px,stroke-dasharray: 5 5 + style SP fill:#A3B4C7,stroke:#2D415B,stroke-width:1px + style SM fill:#A3B4C7,stroke:#2D415B,stroke-width:1px + style SB fill:#A3B4C7,stroke:#2D415B,stroke-width:1px + style MT fill:#A3B4C7,stroke:#2D415B,stroke-width:1px,stroke-dasharray: 5 5 + + %% Shared pipeline + style H fill:#A4A88780,stroke:#C8A02C,stroke-width:4px + style R fill:#E8A396,stroke:#2D415B,stroke-width:4px ``` -0_data/test_dataset/ (a) the frozen dataset - │ responses, covariates, lookups; read only; - │ read by lookup/dataset_manifest.csv says whose is what - ▼ -1_code/harness/ (b) the harness - ▲ ▲ load, resample, fit, select, score, store, - │ │ methods looked up by name summarize, compare; names no taxon - │ └── 1_code/methods/ (c) methods: engines, selection rules, - │ resampling schemes, metrics; one file each - │ configured by -1_code/modules//spec.R (d) taxon specs - each taxon's v2 configuration, as data - -1_code/experiments/exp_NNN_*/run.R (e) experiments - choose runs, species, draws, seed and what - changes; call run_experiment() + +The harness names no taxon and no method. A taxon module contributes only a +spec; an experiment changes parts of a spec or names different methods in it. + +### Everything is compared with one v2 baseline + +```mermaid +%% ---------------------------- +%% Everything comparable to one v2 baseline +%% ---------------------------- +%%{init: {"themeVariables": {"edgeLabelBackground": "#ffffff"}}}%% +flowchart TD + + subgraph fw["framework: everything comparable to one v2 baseline"] + direction TB + D["0_data/test_dataset/"] --> M["1_code/modules/[taxon]/
v2 specs"] + V2["0_data/v2_results/
published v2.0"] + M --> E0["exp_000_parity_v2"] + M --> E1["exp_001"] + M --> E2["exp_002"] + V2 -->|"parity check"| E0 + E0 --> O0["3_output/exp_000_parity_v2/"] + E1 --> O1["3_output/exp_001/"] + E2 --> O2["3_output/exp_002/"] + O0 --> C["compare_experiments()"] + O1 --> C + O2 --> C + end + + %% ---------------------------- + %% Styles + %% ---------------------------- + + %% Container + style fw fill:none,stroke:#2D415B,stroke-width:1px + + %% Highlighted borders + style D fill:#A4A88780,stroke:#B8860B,stroke-width:4px + style M fill:#A4A88780,stroke:#B8860B,stroke-width:4px + style V2 fill:#ffffff,stroke:#2D415B,stroke-width:1px,stroke-dasharray: 5 5 + style E0 fill:#A3B4C7,stroke:#B8860B,stroke-width:4px + style E1 fill:#A3B4C7,stroke:#2D415B,stroke-width:1px + style E2 fill:#A3B4C7,stroke:#2D415B,stroke-width:1px + style O0 fill:#ffffff,stroke:#B8860B,stroke-width:4px,stroke-dasharray: 5 5 + style O1 fill:#ffffff,stroke:#2D415B,stroke-width:1px,stroke-dasharray: 5 5 + style O2 fill:#ffffff,stroke:#2D415B,stroke-width:1px,stroke-dasharray: 5 5 + style C fill:#E8A396,stroke:#2D415B,stroke-width:4px ``` -An experiment run does four things: - -1. **Configures.** `run.R` calls `experiment_config()`, the only place a run's - decisions are made: the runs (taxa), the focal species, the draws, the - seed, any replacement candidate models or specs, and the workers. It is - checked before anything is fitted. -2. **Fits.** `run_experiment()` prepares each spec once - validating it and - loading each region's data and grid - then fits every species of every - spec as one job, in parallel when `workers` is above 1. Each job loops - region, draw and stage, doing what the spec says. A failed species or draw - is logged and the run continues. Results are written to - `2_pipeline////`. -3. **Summarizes.** `collect_results()` reduces the stores to per-species - summary tables in `3_output//tables/`. -4. **Runs the experiment's own steps**, such as exp_000's comparison with v2, - and writes `run_record.md`. - -Nothing outside `2_pipeline//` and `3_output//` is written during a -run, and `0_data/` is never written to outside `1_code/_setup/`. +exp_000 runs every taxon's v2 spec and checks the result against the published +v2.0 output. Every later experiment changes one thing and is compared with +exp_000, so a difference is a difference in method rather than in plumbing. +Because the dataset is frozen, results stay comparable over time. ### What a taxon spec holds -A spec is a list returned by a function such as `lichen_spec()`. It holds no -modelling code; everything it names is looked up in a harness registry. +A spec is a list returned by a function such as `lichen_spec()`, in +`1_code/modules//spec.R`. It holds no modelling code. | Field | What it sets | | --- | --- | | `taxon` | The data slug that keys the response file, covariates and lookups | | `response_transform`, `family`, `weight_column` | How the recorded value becomes a response, and the error family and weights | -| `regions` | Per region: the row filter, the prediction grid (by default the manifest's), and the habitat candidate models | +| `regions` | Per region: the row filter, the prediction grid, and the habitat candidate models | | `stages` | In order: candidate models, engine, selection rule, information criterion, any rule settings, and which stage's prediction is carried into the next as `Climate` | | `resample` | The resampling scheme and its settings | -| `final_prediction` | Optional. The model the harness scores and projects; the plant specs name v2's own prediction from its coefficient tables | -| `v2_coverage` | Per stage, whether the spec reproduces v2 (`reproduced`, `partial`, `not reproduced`) and what differs. **The one place coverage is stated**; the report prints it | +| `final_prediction` | Optional. The model scored and projected; the plant specs name v2's own prediction from its coefficient tables | +| `v2_coverage` | Per stage, whether the spec reproduces v2 and what differs. **The one place coverage is stated**; the report prints it | | `notes` | Configuration facts, such as whether `Protocol` is fitted | `validate_spec()` checks every field before a run reads any data. A misspelt -field, an unregistered method, or a rule paired with an engine that lacks what -it needs stops the run with a sentence saying which. - -| Registry | Where | Entries | -| --- | --- | --- | -| Engines | `methods/engines/` | `glm`, `bayesglm` | -| Selection rules | `methods/selection/` | `single`, `aic_best`, `aic_average`, `staged_bic`, `ivw_grid`, `aic_best_grid`, `aic_best_onehot` | -| Resampling schemes | `methods/resampling/` | `precomputed`, `spatial_block`, `spatial_cv` | -| Metrics | `methods/metrics/` | `auc`, `deviance_explained`, `rmse`, `spearman`, `calibration_slope`, `prevalence`, `n` | -| Candidate model sets | `harness/model_sets.R` | The v2 formulas, spliced verbatim from `0_data/v2_scripts/` | - -Each method is one file that registers itself; `list_methods()` prints them -with what each needs. The contracts are in -[`1_code/methods/README.md`](1_code/methods/README.md). +field, an unregistered method, or a selection rule paired with an engine that +cannot serve it stops the run with a sentence saying which. The covariates a run loads are read off the formulas it fits, so a term can -never be fitted without its column being loaded. - -### Where the modelling code came from - -`0_data/v2_scripts//` holds the v2 scripts as received from the taxon -leads. They are kept unmodified as the reference the harness is checked -against, and are **not run** by any experiment. The v2 method is restated in -this repository rather than copied: - -- **The configuration moved into specs.** What differed between v2 scripts — - response, family, candidate models, selection rule, region filters — is a - field in a spec. What they shared is harness code, written once. -- **Formulas are spliced, not retyped.** The candidate sets in - `model_sets.R` are copied from the v2 source. The 58-model plant climate - set is rebuilt the way v2 builds it: 14 base models, a bioclim variant of - each, and three spatial variants of ten of them. -- **Paths are arguments.** v2 hard-coded paths relative to each v2 project - root. Every path is now set by the calling experiment. -- **Inputs come from the test dataset.** v2 loaded per-taxon `.Rdata` files; - the harness reads the harmonized CSVs. -- **Run length and seed are configurable.** v2 hard-coded 100 bootstrap - draws and set no seed. Both are settings in `run.R`. -- **Species are fitted in parallel.** Each species draws under its own seed, - so a run gives the same results on one worker or twelve. - -Every taxon-specific behaviour in the v2 pipelines, and whether the harness -reproduces it, is listed in [`docs/taxon_quirks.md`](docs/taxon_quirks.md). +never be fitted without its column being loaded. The v2 candidate formulas +are in `1_code/harness/model_sets.R`, spliced verbatim from the v2 scripts. -## Directory structure +### Methods are plug-ins + +Each method is one file in `1_code/methods/` that registers itself under a +name. Adding a method is adding a file; no harness code changes. +| Kind | Folder | Registered | +| --- | --- | --- | +| Engines: how a model is fitted | `methods/engines/` | `glm`, `bayesglm` | +| Selection rules: how candidates become one result | `methods/selection/` | `single`, `aic_best`, `aic_average`, `staged_bic`, `ivw_grid`, `aic_best_grid`, `aic_best_onehot` | +| Resampling: which units each draw fits | `methods/resampling/` | `precomputed`, `spatial_block`, `spatial_cv` | +| Metrics: how a prediction is scored | `methods/metrics/` | `auc`, `deviance_explained`, `rmse`, `spearman`, `calibration_slope`, `prevalence`, `n` | + +A selection rule states the engine capabilities it needs (coefficients, an +information criterion, standard errors), and `validate_spec()` checks them. +`check_engine()` tests a new engine against the contract on synthetic data. +The contracts are in [`1_code/methods/README.md`](1_code/methods/README.md). + +## The experiment pipeline + +### From run.R to results + +An experiment is a `run.R` that states its decisions in `experiment_config()` +and calls `run_experiment()`. Everything after that is the same for every +experiment. + +```mermaid +%% ---------------------------- +%% The experiment pipeline +%% ---------------------------- +%%{init: {"themeVariables": {"edgeLabelBackground": "#ffffff"}}}%% +flowchart TD + + subgraph cfg["run.R"] + direction TB + C["experiment_config()
runs · species · draws · seed · changes · workers"] + end + + subgraph run["run_experiment()"] + direction TB + V["validate every spec
before any data is read"] + P["prepare each spec once
region data · prediction grids"] + J["one job per species"] + W1["worker 1"] + W2["worker 2"] + WN["worker n"] + S["merge shards
in queue order"] + ST["result stores
2_pipeline/id/run/region/"] + CR["collect_results()
per-species summaries"] + T["3_output/id/tables/"] + X["the experiment's own steps
exp_000: compare to v2 · plot · report
later: compare_to_baseline"] + RR["run_record.md"] + + V --> P --> J + J --> W1 & W2 & WN + W1 & W2 & WN --> S --> ST + ST --> CR --> T --> X --> RR + end + + C --> V + + %% ---------------------------- + %% Styles + %% ---------------------------- + + %% Containers + style cfg fill:none,stroke:#2D415B,stroke-width:1px + style run fill:none,stroke:#2D415B,stroke-width:1px + + %% Configuration + style C fill:#A3B4C7,stroke:#2D415B,stroke-width:1px + + %% Shared pipeline + style V fill:#A4A88780,stroke:#C8A02C,stroke-width:2px + style P fill:#A4A88780,stroke:#C8A02C,stroke-width:2px + style J fill:#A4A88780,stroke:#C8A02C,stroke-width:2px + style W1 fill:#ffffff,stroke:#C8A02C,stroke-width:1px + style W2 fill:#ffffff,stroke:#C8A02C,stroke-width:1px + style WN fill:#ffffff,stroke:#C8A02C,stroke-width:1px,stroke-dasharray: 5 5 + style S fill:#A4A88780,stroke:#C8A02C,stroke-width:2px + style CR fill:#A4A88780,stroke:#C8A02C,stroke-width:2px + + %% Outputs + style ST fill:#ffffff,stroke:#2D415B,stroke-width:1px,stroke-dasharray: 5 5 + style T fill:#E8A396,stroke:#2D415B,stroke-width:4px + style X fill:#A3B4C7,stroke:#2D415B,stroke-width:1px + style RR fill:#E8A396,stroke:#2D415B,stroke-width:2px ``` -sdmMethodsDev/ -├── README.md -│ -├── 0_data/ # read-only inputs; written only by 1_code/_setup/ -│ ├── covariates/ # reserved for the covariate catalogue; empty -│ ├── test_dataset/ # frozen: built by 1_code/_setup/01_ -│ │ ├── sites.csv # one row per survey unit, all sources -│ │ ├── vascular_plant.csv # survey_unit_id + species columns -│ │ ├── bryophyte.csv -│ │ ├── lichen.csv -│ │ ├── mite.csv -│ │ ├── mammal.csv -│ │ ├── bird.csv # counts -│ │ ├── bird_offsets.csv # QPAD log offsets -│ │ ├── covariates.csv # every covariate, keyed on survey_unit_id + taxon -│ │ └── lookup/ -│ │ ├── covariate_columns.csv # block and v2 name of each covariate -│ │ ├── veg_prediction_matrix.csv # plant north habitat grid -│ │ ├── soil_prediction_matrix.csv # plant south habitat grid -│ │ ├── modelled_species.csv # plant-group work queue -│ │ ├── mammal_north_prediction_matrix.csv -│ │ ├── mammal_south_prediction_matrix.csv -│ │ ├── mammal_modelled_species.csv -│ │ ├── mammal_climate_predictions.csv -│ │ ├── bird_modelled_species.csv -│ │ ├── bird_bootstrap_ids.csv # the 100 stored v2 draws -│ │ ├── bird_factor_levels.csv -│ │ ├── bird_veg_age_matrix.csv # v2 bird translation, from _setup/06_ -│ │ ├── v2_bootstrap_ids// # v2's stored plant draws, from _setup/07_ -│ │ ├── dataset_manifest.csv # whose files are whose, from _setup/09_ -│ │ ├── species_queue.csv # every taxon's work queue, one schema -│ │ ├── factor_levels.csv # categorical level order, every taxon -│ │ └── bird_{north,south}_prediction_matrix.csv # bird habitat grids -│ ├── v2_results/ # the v2 outputs, harmonized: built by _setup/05_ -│ │ ├── v2_results.csv -│ │ └── v2_results_coverage.csv -│ └── v2_scripts/ # as-received snapshots; reference only -│ ├── README.md # sources, commits, snapshot date -│ ├── birds/ -│ ├── mammals/ -│ └── plants/ # all four plant-group taxa -│ -├── 1_code/ -│ ├── _scratch.R # temporary workspace -│ ├── _setup/ # one-off; run by hand, not per experiment -│ │ ├── 01_harmonize_model_ready_v2.R … 08_harmonize_abmiexplorer_results.R -│ │ └── 09_harmonize_lookups.R # the uniform lookups and the manifest -│ ├── harness/ # shared, taxon-agnostic -│ │ ├── harness.R # load_framework(): loads everything below -│ │ ├── registry.R # register_*(), get_method(), list_methods() -│ │ ├── cache.R # reads each lookup once per session -│ │ ├── spec.R # validate_spec(), spec helpers -│ │ ├── data_load.R # dataset manifest, loaders, model frames -│ │ ├── covariate_sets.R -│ │ ├── species.R -│ │ ├── model_sets.R # the v2 candidate formulas -│ │ ├── resample.R # seeds, spatial blocks, scheme dispatch -│ │ ├── engines.R # engine interface, check_engine() -│ │ ├── selection.R # candidate fitting, combined predictors -│ │ ├── eval_metrics.R -│ │ ├── predict_grid.R -│ │ ├── result.R # stores, shards -│ │ ├── run_model.R # run_specs(): the fitting loop -│ │ ├── summarise.R # collect_results() -│ │ ├── compare.R # compare_experiments() -│ │ ├── experiment.R # experiment_config(), run_experiment() -│ │ └── run_record.R -│ ├── methods/ # one file per method; see its README -│ │ ├── engines/ # glm.R, bayesglm.R, _glm_family.R -│ │ ├── selection/ # single.R, aic_average.R, ivw_grid.R, … -│ │ ├── resampling/ # precomputed.R, spatial_block.R, spatial_cv.R -│ │ ├── metrics/ # auc.R, rmse.R, … -│ │ └── _templates/ # copy-and-fill skeletons; not loaded -│ ├── modules/ # one spec per taxon -│ │ ├── _shared/ -│ │ │ ├── plant_group.R # the v2 shape the four plant-group taxa share -│ │ │ └── standard_specs.R # every run's v2 spec, by name -│ │ ├── bryophytes/spec.R -│ │ ├── lichens/spec.R -│ │ ├── soil_mites/spec.R -│ │ ├── vascular_plants/spec.R -│ │ ├── mammals/ -│ │ │ ├── spec.R -│ │ │ └── hurdle.R # v2's hurdle model, both halves together -│ │ └── birds/ -│ │ ├── spec.R -│ │ └── standardize.R # raw coefficients → v2's standardized terms -│ ├── experiments/ -│ │ ├── _shared/ -│ │ │ └── focal_species.R # named species sets, for every experiment -│ │ ├── _template/ # copy to start an experiment -│ │ └── exp_000_parity_v2/ -│ │ ├── README.md # question, design, coverage -│ │ ├── run.R # the only file to edit -│ │ ├── utils/parity_targets.R # what pass means -│ │ ├── 01_compare_to_v2.R -│ │ ├── 02_plot_parity.R -│ │ ├── 03_build_report.R -│ │ └── v2_self_agreement.R # v2 against itself; run once -│ └── tests/ -│ ├── run_tests.R # the contract tests; seconds -│ ├── compare_stores.R # are two runs' results the same? -│ └── testthat/ -│ -├── 2_pipeline/ # intermediates; gitignored -│ ├── exp_000_parity_v2/ -│ │ ├── run_log.csv # one row per species, region and draw -│ │ └── // # result stores -│ ├── v2_reference/ # rebuilt v2 references, from _setup/03_ and 04_ -│ └── logs/ # _setup logs -│ -├── 3_output/ # deliverables; summaries committed -│ └── exp_000_parity_v2/ -│ ├── figures/ # parity_, _mean, _bell .png; gitignored -│ ├── tables/ -│ │ ├── parity_summary.csv # committed -│ │ ├── coverage.csv # committed -│ │ ├── metric_summary.csv # committed -│ │ ├── grid_summary.csv # committed -│ │ ├── v2_self_agreement_summary.csv # committed -│ │ ├── coefficient_summary.csv # gitignored; rebuilt -│ │ └── parity_terms.csv # gitignored; rebuilt -│ ├── report.md # committed -│ └── run_record.md # committed -│ -└── docs/ - ├── framework_design.md # the harness design and parity ledger - ├── taxon_quirks.md # every taxon-specific v2 behaviour - ├── reviews/ # code reviews - └── images/ + +1. **Configure.** `experiment_config()` holds every decision and checks it + before anything is fitted. +2. **Prepare.** Each spec is validated, and each region's data and grid are + loaded once. +3. **Fit.** Every species of every spec is one job; with `workers` above 1 + the jobs run in parallel R sessions. Each species draws under its own + seed, so results are the same on one worker or twelve. A failed species + or draw is logged and the run continues. +4. **Store.** Each job writes a shard; the shards are merged into one result + store per run and region in `2_pipeline//`. +5. **Summarize.** `collect_results()` reduces the stores to per-species + tables in `3_output//tables/`. +6. **The experiment's own steps**, in order. For exp_000: compare with v2, + plot, write the report. For later experiments: compare with exp_000. +7. **Record.** `run_record.md` says what ran, for the commit. + +Nothing outside `2_pipeline//` and `3_output//` is written during a +run, and `0_data/` is never written outside `1_code/_setup/`. + +### Inside one species job + +```mermaid +%% ---------------------------- +%% One species, one draw +%% ---------------------------- +%%{init: {"themeVariables": {"edgeLabelBackground": "#ffffff"}}}%% +flowchart LR + + subgraph job["one species job: every region, every draw"] + direction LR + F["species frame
response · offset · weights · covariates"] + DR["draw
resampling scheme"] + S1["stage 1: climate
candidates → selection rule"] + S2["stage 2: habitat
candidates → selection rule
→ v2 post-processing"] + FM["final model"] + F --> DR --> S1 + S1 -->|"carried as Climate"| S2 --> FM + end + + FM --> CO["coefficients.csv
every stage"] + FM --> ME["metrics.csv
in-sample and out-of-bag"] + FM --> GR["grid_predictions.csv
one row per habitat type"] + + %% ---------------------------- + %% Styles + %% ---------------------------- + + %% Container + style job fill:none,stroke:#2D415B,stroke-width:1px + + %% Steps + style F fill:#ffffff,stroke:#2D415B,stroke-width:1px,stroke-dasharray: 5 5 + style DR fill:#A4A88780,stroke:#C8A02C,stroke-width:2px + style S1 fill:#A4A88780,stroke:#C8A02C,stroke-width:2px + style S2 fill:#A4A88780,stroke:#C8A02C,stroke-width:2px + style FM fill:#A3B4C7,stroke:#2D415B,stroke-width:2px + + %% Outputs + style CO fill:#E8A396,stroke:#2D415B,stroke-width:1px + style ME fill:#E8A396,stroke:#2D415B,stroke-width:1px + style GR fill:#E8A396,stroke:#2D415B,stroke-width:1px ``` -### `0_data/` - -Read-only during experiments. The one exception is `1_code/_setup/`, which -builds `test_dataset/` and `v2_results/` by hand, once per source snapshot; -nothing in the harness, modules or experiments writes here. The data is -gitignored; `v2_scripts/` is the tracked part of this folder. - -`test_dataset/` holds the frozen cross-taxa dataset. Its contents do not -change between experiments; an amendment is a rebuild by `_setup/01`, -checked by `_setup/02`. - -Every response table is `survey_unit_id` followed by one column per species, -and every identity, design and location field is factored out into -`sites.csv`. Join any response table to `sites.csv` on `survey_unit_id`. -`sites.csv` carries an `in_` flag per taxon. - -`covariates.csv` holds everything the models regress against, for every -taxon, in one wide table keyed on `survey_unit_id` and `taxon`. The key -includes the taxon because the sources disagree: bryophyte, lichen and -vascular plant share identical values on shared survey units, but mite does -not, which points at a different spatial support or HF vintage in the mite -source. Mammals are keyed per region (`mammal_north`, `mammal_south`), -because north and south are separate models on overlapping deployments — -512 `location_project` values appear in both — and their covariates differ. -The harness reads only the columns a run needs. - -`lookup/covariate_columns.csv` records, per taxon, which block each column -came from (climate, veg, soil, design) and its v2 spelling. A column present -in more than one block was suffixed by the harmonizer; the harness renames -model terms to match, so v2 formulas run unchanged. - -Ten columns are deliberately **not** stored, because they are products of -stored columns: `TD`, `MAPPET`, `MAT2`, `CMDMAT`, `MWMT2`, `Easting`, -`Northing`, `Easting2`, `Northing2` and `EastingNorthing`. The harness -computes them on load (`harness/covariate_sets.R`). A CSV carries about 15 -significant digits, so a separately stored `Northing2` would not equal -`Northing` squared, and a model fitting both would see an inconsistent pair. - -Mammal climate comes from `abmi-camera-climate_2023.Rdata`, the file the v2 -mammal climate pipeline fitted against. It replaces the `SpTable` climate -block rather than filling gaps in it, because the two are different -extractions. It matched 4,243 of 4,654 north deployments and all 1,168 -south; unmatched deployments carry `NA`, as v2 excludes them. - -`lookup/` holds the habitat prediction matrices, the work queues — which -species each model set is fitted for — and the stored bird draws. - -- Mammals have their own `mammal_modelled_species.csv`, because their queue - is season by occurrence threshold: `sp_table_*` are the species with at - least 20 detections, which get the full habitat model, and - `sp_table_*_ua` those with at least 3, which get the use-availability - model. -- `mammal_climate_predictions.csv` is the climate offset the v2 mammal - habitat models read from a separate climate pipeline. 509 of 5,822 - deployments carry `NA`, as the v2 join produced. The harness does not - read it yet: the mammal spec fits climate itself. -- The mammal prediction matrices were checked against the ABMI Mammals - drive copies and are identical. -- `bird_bootstrap_ids.csv` holds v2's 100 stored draws, keyed on - `surveyid`, so bird runs resample exactly as v2 did. -- `bird_factor_levels.csv` restores the source order of categorical levels, - so reference levels, and every contrast, match v2. - -`v2_results/` holds the published v2 results as one long table, so a run can -be scored against a single file rather than three storage formats on two -drives. Columns are `taxon`, `region`, `stage`, `part`, `season`, `species`, -`species_v2`, `term`, `v2_median`, `v2_p10`, `v2_p90`, `v2_se`, `v2_n` and -`source`. Plant climate is fitted once province-wide in v2, so those rows -carry `region = "all"`. `v2_results_coverage.csv` records which source was -reached for each part. `exp_000` does not read this table yet (see -[Known gaps](#known-gaps)). - -`v2_scripts/` holds the modelling scripts as received from the taxon leads, -unmodified, in one subfolder per source repository. The four plant-group -taxa share `plants/` because v2 fits them with one set of scripts. All three -are cloned snapshots taken on 2026-09-08; their sources and commits are -recorded in [`0_data/v2_scripts/README.md`](0_data/v2_scripts/README.md), -which is also where a refreshed snapshot gets logged. - -`covariates/` is reserved for a versioned catalogue of covariate layers — -metadata and server paths only, with rasters on the ABMI server. It is not -built yet. - -### `1_code/` - -`harness/` holds the shared, taxon-agnostic pipeline. `harness.R` defines -`load_framework()`, which loads the harness, then every method, then every -taxon module, then the shared experiment settings. Changes here affect every -experiment, past and future, and should be reviewed accordingly. - -| File | Does | -| --- | --- | -| `registry.R` | The method registry: `register_engine()` and the rest, `get_method()`, `list_methods()` | -| `cache.R` | Keeps each lookup file, and each covariate column read, for the session | -| `spec.R` | `validate_spec()`, `apply_stage_models()`, `spec_covariates()`, `v2_status()` | -| `data_load.R` | The dataset manifest; column-selective loaders; one frame per taxon and region | -| `covariate_sets.R` | Named covariate bundles, derived covariates, and term renaming | -| `species.R` | The species queue and focal-species resolution | -| `model_sets.R` | The v2 candidate formulas, and `extend_models()`, `models_from_covariates()` | -| `resample.R` | Seeds (`species_seed()`, `with_seed()`), spatial blocks, scheme dispatch | -| `engines.R` | How the harness talks to an engine, and `check_engine()` | -| `selection.R` | Candidate fitting and the result every rule returns | -| `eval_metrics.R` | `compute_metrics()` | -| `predict_grid.R` | Projecting a final model onto a habitat prediction grid | -| `result.R` | Writing, sharding and reading result stores | -| `run_model.R` | `run_specs()`: prepare, fit each species (in parallel), merge | -| `summarise.R` | `collect_results()`: stores to summary tables | -| `compare.R` | `compare_experiments()`: one experiment against a baseline | -| `experiment.R` | `experiment_config()`, `run_experiment()`, `script_step()` | -| `run_record.R` | The committed run record | - -`methods/` holds every engine, selection rule, resampling scheme and metric, -one file each, each registering itself. Its -[`README.md`](1_code/methods/README.md) states each contract and how to add -and test a method. - -`modules/` holds one spec per taxon, in a folder named for the taxon. A spec -is configuration only; experiment-specific logic belongs in the experiment. -The four plant-group taxa share their v2 shape through -`_shared/plant_group.R`, and each taxon's folder states only what is its -own, such as whether v2 fits `Protocol`. `_shared/standard_specs.R` lists -every run an experiment can choose, by name. Soil mites use the data slug -`mite`, not `soil_mite`. - -`experiments/` holds one folder per R&D question. Each contains a -`README.md` stating the question and design, and a `run.R` that configures -the run and calls `run_experiment()`. An experiment's own scripts are steps -it passes to `run_experiment()`; each runs in an environment of its own, -reading only `config` and `results`. `_template/` is the starting point for a -new experiment; `_shared/` holds settings every experiment can use, such as -the named focal-species sets. - -`run.R` is the only file that has to be edited to change a run. Its -`experiment_config()` call holds every decision: +Plants and birds fit climate, then habitat (birds: landcover), carrying the +climate prediction into the habitat stage as a term called `Climate`, as v2 +does. The **final model** is the averaged or combined one where a rule +combines candidates, and for plants v2's own prediction from its coefficient +tables. Metrics score it in-sample and on the units the draw left out +(out-of-bag). The **grid** holds its prediction for a pure stand of each +habitat type, the one quantity every engine can produce, so it is what a +method without coefficients is compared on. + +### Configuring a run + +`run.R` is the only file to edit. Its `experiment_config()` call holds every +decision: | Argument | Sets | | --- | --- | | `id` | The experiment's folders under `2_pipeline/` and `3_output/` | | `taxa` | The runs, from `names(standard_specs())` | | `species` | A named set from `focal_species_sets()`, a vector named by taxon, or `NULL` for every species | -| `n_bootstraps` | Draws per species; 100 is v2's | +| `n_bootstraps` | Draws per species; 100 is v2's. Use 5 to check that a run works | | `seed` | The base seed; `NULL` leaves draws unseeded, as v2 did | -| `stage_models` | Replacement candidate sets, or `NULL` for v2's | -| `specs` | Changed specs, or `NULL` for `standard_specs()` | +| `stage_models` | Replacement candidate formulas, or `NULL` for v2's | +| `specs` | Changed specs (a different engine or selection rule), or `NULL` for `standard_specs()` | | `plant_bootstrap` | `"spatial_block"` draws v2's bootstrap afresh; `"v2_ids"` replays v2's stored draws | | `workers` | Species fitted at once | | `unit_predictions` | `"none"` (default), `"oob"` or `"all"` per-unit predictions written | -`tests/` holds the contract tests (`run_tests.R`, seconds) and -`compare_stores.R`, which says whether two runs' results are the same; see -[Checking a change](docs/getting_started.md#check-that-nothing-broke). - -`_setup/` holds one-off scripts that prepare the repository itself. None -runs as part of an experiment: they are run by hand, in order, when the -dataset is first built or a source is replaced. The leading underscore keeps -them sorted clear of the run-time code. +Shorten a trial by cutting species, not draws: a 10–90% band read from a +handful of draws does not mean much. On a 24-core machine, the 14 +`parity_check` species take about 1.6 minutes at 5 draws on 12 workers. + +## Building the dataset + +The dataset is built once per source snapshot by the scripts in +`1_code/_setup/`, run by hand and in order. No experiment runs them. + +```mermaid +%% ---------------------------- +%% Building the frozen dataset and the v2 reference +%% ---------------------------- +%%{init: {"themeVariables": {"edgeLabelBackground": "#ffffff"}}}%% +flowchart TD + + subgraph src["network sources"] + direction LR + SN["model_ready_v2 snapshot
bird Stratified.Rdata
mammal camera climate"] + VP["v2 project outputs
plants · mammals · birds"] + AX["ABMIexploreR package"] + end + + subgraph setup["1_code/_setup/"] + direction TB + S01["01 harmonize"] + S02["02 validate"] + S06["06 bird translation matrix"] + S07["07 v2 plant draws"] + S09["09 harmonize lookups
manifest · species queue · bird grids"] + S03["03 rerun bryophyte reference"] + S04["04 package bird coefficients"] + S05["05 harmonize v2 results"] + S08["08 harmonize ABMIexploreR"] + end + + DS["0_data/test_dataset/
frozen"] + VR["0_data/v2_results/
the v2 reference"] + + SN --> S01 --> DS + DS --> S02 + VP --> S06 --> DS + VP --> S07 --> DS + DS --> S09 --> DS + VP --> S03 --> S05 + VP --> S04 --> S05 + S05 --> VR + AX --> S08 --> VR + + %% ---------------------------- + %% Styles + %% ---------------------------- + + %% Containers + style src fill:none,stroke:#2D415B,stroke-width:1px,stroke-dasharray: 5 5 + style setup fill:none,stroke:#2D415B,stroke-width:1px + + %% Sources + style SN fill:#ffffff,stroke:#2D415B,stroke-width:1px + style VP fill:#ffffff,stroke:#2D415B,stroke-width:1px + style AX fill:#ffffff,stroke:#2D415B,stroke-width:1px + + %% Scripts + style S01 fill:#A3B4C7,stroke:#2D415B,stroke-width:1px + style S02 fill:#A3B4C7,stroke:#2D415B,stroke-width:1px + style S06 fill:#A3B4C7,stroke:#2D415B,stroke-width:1px + style S07 fill:#A3B4C7,stroke:#2D415B,stroke-width:1px + style S09 fill:#A3B4C7,stroke:#2D415B,stroke-width:1px + style S03 fill:#A3B4C7,stroke:#2D415B,stroke-width:1px + style S04 fill:#A3B4C7,stroke:#2D415B,stroke-width:1px + style S05 fill:#A3B4C7,stroke:#2D415B,stroke-width:1px + style S08 fill:#A3B4C7,stroke:#2D415B,stroke-width:1px + + %% Products + style DS fill:#A4A88780,stroke:#B8860B,stroke-width:4px + style VR fill:#A4A88780,stroke:#B8860B,stroke-width:4px +``` | Script | Reads | Writes | | --- | --- | --- | @@ -482,174 +486,286 @@ them sorted clear of the run-time code. | `03_rerun_bryophyte_v2_reference.R` | The v2 plant project's bryophyte data, and the frozen v2 functions | `2_pipeline/v2_reference/bryophyte-species-models.Rdata` | | `04_package_bird_coefficients.R` | The per-draw v2 bird coefficient CSVs | `2_pipeline/v2_reference/Birds2024.RData` | | `05_harmonize_v2_results.R` | v2 plant `COEFS.RData`, the mammal coefficient tables, `Birds2024.RData` | `0_data/v2_results/` | -| `06_harmonize_bird_translation_lookup.R` | v2's bird `Xn-veg-v2024.Rdata` | `0_data/test_dataset/lookup/bird_veg_age_matrix.csv` | -| `07_harmonize_v2_plant_bootstrap_ids.R` | v2's stored plant bootstrap draws | `0_data/test_dataset/lookup/v2_bootstrap_ids/` | +| `06_harmonize_bird_translation_lookup.R` | v2's bird `Xn-veg-v2024.Rdata` | `lookup/bird_veg_age_matrix.csv` | +| `07_harmonize_v2_plant_bootstrap_ids.R` | v2's stored plant bootstrap draws | `lookup/v2_bootstrap_ids/` | | `08_harmonize_abmiexplorer_results.R` | ABMIexploreR's packaged coefficients | `0_data/v2_results/abmiexplorer/` | | `09_harmonize_lookups.R` | `0_data/test_dataset/lookup/` only (offline) | `species_queue.csv`, `factor_levels.csv`, `dataset_manifest.csv`, the bird prediction grids | -- **`01`** writes every response, covariate and lookup table described - under [`0_data/`](#0_data), so experiments run from - `0_data/test_dataset/` alone. Mammal species names are resolved against - `WildTrax Species Strings.RData`, so the north and south files reach the - same column name; a species the lookup lacks keeps its source spelling - and is reported (as of the 2024 snapshot, `Raccoon` alone). -- **`02`** is run after `01`, and again whenever the snapshot or the - harmonizer changes. Its first pass describes the tables (sizes, coverage, - value ranges, joins). Its second traces every written value back to its - source, restating the rules rather than calling the harmonizer's - functions, so a bug there shows up rather than cancelling itself out. It - writes nothing, so it is safe to re-run. +- **`01`** writes every response, covariate and lookup table, so experiments + run from `0_data/test_dataset/` alone. Mammal species names are resolved + against `WildTrax Species Strings.RData`, so the north and south files + reach the same column name. +- **`02`** is run after `01`, `06` and `09`, and whenever the snapshot or a + harmonizer changes. It traces every written value back to its source, + restating the rules rather than calling the harmonizer, so a bug there + shows up rather than cancelling out. It writes nothing. - **`03`** exists because the published bryophyte reference is unusable: - every draw is an error object, and its bootstrap-id file holds 3 draws - instead of 100. It re-runs the frozen v2 functions unmodified and writes to - `2_pipeline/`, never to the v2 project. It covers the climate stage only. -- **`04`** rebuilds the packaged bird output, which is absent from the bird - drive. It is a clone of v2's `08.PackageCoefficients.R` with only the paths - changed, and puts bird coefficients on the same standardized term names - as the plant tables. Reads are serial, because parallel reads trip Google - Drive's rate limiting. -- **`05`** flattens the three v2 storage formats into - `0_data/v2_results/v2_results.csv`. Plants come from `COEFS.RData`, v2's - own standardization output, which holds complete bryophyte arrays. Mammal - results average the two seasons, as v2's `.all` tables do. Note that + every draw is an error object. It re-runs the frozen v2 functions + unmodified, climate stage only. +- **`04`** rebuilds the packaged bird output, absent from the bird drive. It + is v2's `08.PackageCoefficients.R` with only the paths changed. +- **`05`** flattens the three v2 storage formats into one table. Mammal + results average the two seasons, as v2's `.all` tables do. `Birds2024.RData` labels draws 2 to 100 in file-listing order (`b2` is draw - 10, `b3` draw 100), a v2 packaging quirk: medians and bands are unaffected, - but a draw-by-draw comparison has to remap them. -- **`06`** copies the `age` matrix v2 uses to translate bird landcover - coefficients onto the standardized habitat types, so - `modules/birds/standardize.R` can do the same without the bird drive. Re-run - it whenever `01` rebuilds `lookup/`. -- **`07`** copies v2's stored plant bootstrap draws, one file per species, so a - run with `plant_bootstrap = "v2_ids"` fits exactly the rows v2 fitted. The - full sets are large (1.3 GB compressed for vascular plants), so - `SDM_V2_BOOT_TAXA` and `SDM_V2_BOOT_SPECIES` restrict it to what a run needs. - Bryophytes come from `03`'s regenerated draws. -- **`09`** writes the lookups every taxon shares one form of: one species - queue in one schema (the three taxon leads' lookups had three), one - factor-level table, the bird habitat prediction grids, and - `dataset_manifest.csv`, which names each taxon's response, offset and grid - files, its covariate key and its stored draws. The harness reads file - locations from the manifest and nowhere else, so a new taxon is rows there - plus its files. It reads only `test_dataset/`, so it runs offline; re-run it - after `01` or `06`. The bird north grid is v2's coefficient translation - matrix rebuilt in covariate space, and is checked to reproduce it exactly - before it is written. - -`_scratch.R` is a dated workspace for exploration. Work that proves durable -is promoted into a proper script and removed from it. - -### `2_pipeline/` - -Intermediate and cached files. Gitignored. - -Each experiment writes one result store per taxon and region to -`///`: + 10), a v2 packaging quirk: medians and bands are unaffected. +- **`06`** copies the matrix v2 uses to translate bird landcover coefficients + onto the standardized habitat types. Re-run it whenever `01` rebuilds + `lookup/`. +- **`07`** copies v2's stored plant draws, so `plant_bootstrap = "v2_ids"` + fits exactly the rows v2 fitted. The sets are large (1.3 GB for vascular + plants); `SDM_V2_BOOT_TAXA` and `SDM_V2_BOOT_SPECIES` restrict it. +- **`08`** harmonizes ABMIexploreR's published coefficients, pinned to a + commit; exp_000 scores against this build by default. +- **`09`** writes one form of the lookups for every taxon: one species queue + (the three taxon leads' lookups had three schemas), one factor-level table, + the bird habitat grids, and `dataset_manifest.csv`, which names each + taxon's files. The harness reads file locations from the manifest and + nowhere else. It runs offline in seconds; re-run it after `01` or `06`. -| File | Holds | -| --- | --- | -| `coefficients.csv` | Every stage's coefficients per species, draw and term | -| `metrics.csv` | Metrics per species and draw | -| `grid_predictions.csv` | The final model's prediction for each habitat type on the grid | -| `unit_predictions.csv` | Only when `unit_predictions` is `"oob"` or `"all"`: the final model's prediction at survey units. Off by default: several GB for birds, and nothing downstream needs it | -| `meta.json` | What produced the store: stages, engines, selection rules, covariates, resampling scheme, the seed actually used, any model overrides, and the spec's notes | +## Directory structure -`/run_log.csv` records the outcome of every species, region and -draw — `ok`, or why not. The stores are too large to commit: 100 draws by -every species by every term. While a run is fitting, each species writes to -`/_shards/`; the shards are joined into the region stores at the end, -row for row as a serial run would write them. +``` +sdmMethodsDev/ +├── README.md +├── 0_data/ # read-only inputs; written only by 1_code/_setup/ +│ ├── test_dataset/ # the frozen dataset; see "Data" below +│ ├── v2_results/ # the published v2 results, one table +│ ├── v2_scripts/ # the v2 scripts as received; reference only +│ └── covariates/ # reserved for a covariate catalogue; empty +│ +├── 1_code/ +│ ├── harness/ # the shared pipeline; names no taxon or method +│ │ ├── harness.R # load_framework(): loads everything +│ │ ├── experiment.R # experiment_config(), run_experiment() +│ │ ├── run_model.R # run_specs(): prepare, fit (parallel), merge +│ │ ├── spec.R # validate_spec() and spec helpers +│ │ ├── registry.R # register_*(), list_methods() +│ │ ├── data_load.R # the dataset manifest, loaders, model frames +│ │ ├── summarise.R # collect_results() +│ │ ├── compare.R # compare_experiments() +│ │ └── … # model sets, selection, engines, metrics, grids, stores +│ ├── methods/ # one file per method; see its README +│ │ ├── engines/ selection/ resampling/ metrics/ +│ │ └── _templates/ # copy-and-fill skeletons; not loaded +│ ├── modules/ # one v2 spec per taxon +│ │ ├── _shared/ # plant_group.R (four plant taxa); standard_specs.R +│ │ ├── bryophytes/ lichens/ soil_mites/ vascular_plants/ +│ │ ├── mammals/ # spec.R, hurdle.R (v2's hurdle model) +│ │ └── birds/ # spec.R, standardize.R (v2's term translation) +│ ├── experiments/ +│ │ ├── _shared/ # named focal-species sets +│ │ ├── _template/ # copy to start an experiment +│ │ └── exp_000_parity_v2/ # run.R, 01_compare_to_v2.R, 02_plot_parity.R, +│ │ # 03_build_report.R, utils/parity_targets.R +│ ├── _setup/ # 01–09: build 0_data/; run by hand +│ ├── tests/ # run_tests.R; compare_stores.R +│ └── _scratch.R # dated workspace for exploration +│ +├── 2_pipeline/ # result stores and intermediates; gitignored +│ ├── /// # one result store per run and region +│ └── v2_reference/ # rebuilt v2 references, from _setup/03 and 04 +│ +├── 3_output/ # deliverables, per experiment; summaries committed +│ └── / # tables/, figures/, report.md, run_record.md +│ +└── docs/ + ├── getting_started.md # start here + ├── framework_design.md # the design, contracts and parity ledger + ├── taxon_quirks.md # every taxon-specific v2 behaviour + └── reviews/ # dated code reviews +``` + +| Folder | Edit it to | Affects | +| --- | --- | --- | +| `1_code/experiments/exp_NNN_*/` | Ask a question | That experiment only | +| `1_code/experiments/_shared/` | Add a reusable species set | Experiments that use it | +| `1_code/methods/` | Add or change a method | Every experiment that names it | +| `1_code/modules//` | Record what v2 does for a taxon | Every experiment; review as such | +| `1_code/harness/` | Change how every run works | Every experiment, past and future; review as such | +| `1_code/_setup/` | Rebuild or extend the dataset | The dataset, and so every experiment | -`v2_reference/` holds v2 references rebuilt by `_setup/03` and `04`, which -`_setup/05` reads. `logs/` holds the logs of the long `_setup` runs. +## Data: `0_data/` -### `3_output/` +Read-only during experiments, and gitignored except `v2_scripts/`. -Deliverables, organized by experiment. Only derived artefacts belong here: -summary tables, figures, and the report. +### `test_dataset/` -Only the small summaries are committed, so experiments can be compared across -time from the repository alone without large files changing on every run: +The frozen cross-taxa dataset. It does not change between experiments; an +amendment is a rebuild by `_setup/`, checked by `_setup/02`. -| Committed | Gitignored | +| File | Holds | | --- | --- | -| `run_record.md`, `report.md` | `figures/` | -| `tables/parity_summary.csv` | `tables/coefficient_summary.csv` | -| `tables/coverage.csv` | `tables/parity_terms.csv` | -| `tables/metric_summary.csv` | | -| `tables/grid_summary.csv` | | +| `sites.csv` | One row per survey unit across every design: identity, design and location fields, and an `in_` flag per taxon | +| `.csv` | `survey_unit_id` plus one column per species: detections for plants, densities for mammals, counts for birds. Join to `sites.csv` on `survey_unit_id` | +| `bird_offsets.csv` | QPAD log offsets per survey unit and bird species | +| `covariates.csv` | Everything the models regress against, every taxon, in one wide table keyed on `survey_unit_id` and a covariate key | +| `lookup/dataset_manifest.csv` | Per taxon and region: the response and offset files, the covariate key, the prediction grid, and any stored draws. **The harness reads file locations from here** | +| `lookup/species_queue.csv` | Every taxon's work queue in one schema: taxon, region, season, tier, species, order, and the name v2 used | +| `lookup/covariate_columns.csv` | Per taxon, the block each covariate came from (climate, veg, soil, design) and its v2 spelling | +| `lookup/factor_levels.csv` | The source order of categorical levels, so reference levels and every contrast match v2 | +| `lookup/*_prediction_matrix.csv` | Habitat prediction grids: one row per habitat type, the cover of a pure stand. Plants (`veg`, `soil`), mammals and birds | +| `lookup/bird_bootstrap_ids.csv`, `lookup/v2_bootstrap_ids/` | v2's stored draws: birds, keyed on `surveyid`; plants per species | +| `lookup/mammal_climate_predictions.csv` | The climate offset v2's mammal habitat models read from a separate climate pipeline; the mammal specs read it by default | +| `lookup/bird_veg_age_matrix.csv` | v2's bird landcover translation matrix | + +Things to know about the data: + +- **Covariate keys include the taxon,** because the sources disagree: mites + differ from the other plant-group taxa on shared survey units, and mammals + are keyed per region (`mammal_north`, `mammal_south`) because north and + south are separate models on overlapping deployments. +- **A column in more than one block was suffixed** (`HardLin_veg`, + `HardLin_soil`); the harness renames model terms to match, so v2 formulas + run unchanged. +- **Ten derived columns are not stored** (`TD`, `MAPPET`, `MAT2`, `CMDMAT`, + `MWMT2`, `Easting`, `Northing`, `Easting2`, `Northing2`, + `EastingNorthing`). The harness computes them on load, so a squared term + always equals its square. +- **Mammal climate** comes from `abmi-camera-climate_2023.Rdata`, the file + v2's mammal climate pipeline fitted against. It matched 4,243 of 4,654 + north deployments and all 1,168 south; unmatched deployments carry `NA`, as + v2 excludes them. +- **The bird grids** are v2's translation matrix rebuilt in covariate space + by `_setup/09`, checked to reproduce it exactly. + +### `v2_results/` + +The published v2 results as one long table, so a run is scored against one +file rather than three storage formats on two drives: `taxon`, `region`, +`stage`, `part`, `season`, `species`, `species_v2`, `term`, `v2_median`, +`v2_p10`, `v2_p90`, `v2_se`, `v2_n` and `source`. Plant climate is fitted once +province-wide in v2, so those rows carry `region = "all"`. Two builds share the +schema: `abmiexplorer/` (the published species, from `_setup/08`; exp_000's +default) and the network-drive build (every species v2 fitted, from +`_setup/05`). `v2_results_coverage.csv` records which source each part came +from. + +### `v2_scripts/` + +The modelling scripts as received from the taxon leads, unmodified, one +subfolder per source repository, snapshotted on 2026-09-08. They are the +reference the pipeline is checked against and are **never run**. Sources and +commits are in [`0_data/v2_scripts/README.md`](0_data/v2_scripts/README.md). +The v2 method is restated here rather than copied: what differed between the +v2 scripts became spec fields, what they shared became harness code, and the +candidate formulas were spliced verbatim. + +## Outputs: `2_pipeline/` and `3_output/` + +```mermaid +%% ---------------------------- +%% What a run writes, in order +%% ---------------------------- +%%{init: {"themeVariables": {"edgeLabelBackground": "#ffffff"}}}%% +flowchart LR + + subgraph pipe["2_pipeline/id/ — gitignored"] + direction TB + ST["result stores
coefficients · metrics · grid_predictions · meta.json"] + LG["run_log.csv"] + end + + subgraph out["3_output/id/"] + direction TB + TS["tables/
coverage · metric_summary · grid_summary
coefficient_summary"] + PT["tables/
parity_terms · parity_summary"] + FG["figures/
parity_taxon · parity_mean · parity_bell"] + RP["report.md"] + RR["run_record.md"] + end + + ST -->|"collect_results()"| TS + TS -->|"01_compare_to_v2"| PT + PT -->|"02_plot_parity"| FG + PT -->|"03_build_report"| RP + ST -->|"run_record()"| RR + + %% ---------------------------- + %% Styles + %% ---------------------------- + + %% Containers + style pipe fill:none,stroke:#2D415B,stroke-width:1px,stroke-dasharray: 5 5 + style out fill:none,stroke:#2D415B,stroke-width:1px + + %% Stores + style ST fill:#A4A88780,stroke:#C8A02C,stroke-width:2px + style LG fill:#ffffff,stroke:#2D415B,stroke-width:1px + + %% Every experiment + style TS fill:#E8A396,stroke:#2D415B,stroke-width:2px + style RR fill:#E8A396,stroke:#2D415B,stroke-width:2px + + %% exp_000's own steps + style PT fill:#A3B4C7,stroke:#2D415B,stroke-width:1px + style FG fill:#A3B4C7,stroke:#2D415B,stroke-width:1px + style RP fill:#A3B4C7,stroke:#2D415B,stroke-width:1px +``` + +The red files are written for every experiment by the harness; the blue ones +are exp_000's own steps. A later experiment made from the template writes +`comparison_*.csv` against exp_000 instead. -The gitignored tables hold per-species, per-term detail. They grow with the -species list — a full plant run is tens of thousands of rows — and are rebuilt -from the `2_pipeline/` stores by `run_experiment(config, fit = FALSE)`. -Keep the stores for as long as that detail may be needed. +A *draw* is one bootstrap iteration; draw 1 is the full data. Every summary +reduces the draws to a median and a 10th–90th percentile band (`p10`, `p90`) +rather than a mean and standard deviation, because the spread over draws is +often skewed. `boot1` is the draw-1 value. -**Commit only runs that count.** A trial run writes to the same files as a -full run, so committing after a smoke test would record trial numbers as the -experiment's result. Commit `3_output/` after a run with the full species -list and `n_bootstraps` equal to `v2_bootstraps`, and check that -`run_record.md` describes that run. +### Result stores (`2_pipeline////`) -Output folders are named by experiment (`3_output//`) rather than by -version (`3_output/v0.1/`) as the Science Centre code standards suggest. Each -experiment is its own record, and a rerun replaces it; its history is in git. +| File | Holds | +| --- | --- | +| `coefficients.csv` | Every stage's coefficients per species, draw and term | +| `metrics.csv` | Metrics per species and draw | +| `grid_predictions.csv` | The final model's prediction for each habitat type | +| `unit_predictions.csv` | Only when `unit_predictions` is `"oob"` or `"all"`: predictions at survey units. Off by default: several GB for birds | +| `meta.json` | What produced the store: stages, engines, selection rules, covariates, resampling, the seed, any model overrides | -#### Output key +`2_pipeline//run_log.csv` records every species, region and draw: +`ok`, or why not. -A run writes its outputs in this order: +### What is committed -``` -2_pipeline stores ─► collect_results() ─► coverage · metric_summary · grid_summary · coefficient_summary - 01_compare_to_v2 ─► parity_terms · parity_summary - 02_plot_parity ─► figures/parity_.png · parity_mean.png · parity_bell.png - 03_build_report ─► report.md - run_record() ─► run_record.md -``` +| Committed | Gitignored (rebuilt with `run_experiment(config, fit = FALSE)`) | +| --- | --- | +| `run_record.md`, `report.md` | `figures/` | +| `tables/coverage.csv` | `tables/coefficient_summary.csv` | +| `tables/metric_summary.csv` | `tables/parity_terms.csv` | +| `tables/grid_summary.csv` | | +| `tables/parity_summary.csv`, `tables/v2_self_agreement_summary.csv` | | -`collect_results()` and `run_record()` belong to the harness and run for -every experiment; the three numbered scripts are exp_000's own steps. +**Commit only runs that count.** A trial writes the same files as a full run. +Commit `3_output/` after a run with the full species list and +`n_bootstraps = 100`, and check that `run_record.md` says so. Output folders +are named by experiment rather than by version; each experiment is its own +record, and its history is in git. -A *draw* is one bootstrap iteration. Every summary reduces the draws to a -median and a 10th–90th percentile band (`p10`, `p90`) rather than a mean and -standard deviation, because the spread over draws is often skewed. +### Tables written for every experiment -**`run_record.md`** — which run the other files came from. Read it first: if -its configuration is not a full run (full species list, `n_bootstraps` equal -to `v2_bootstraps`), the tables describe a trial. +**`run_record.md`** — what ran. Read it first: if it is not a full run, the +tables describe a trial. | Section | Holds | | --- | --- | -| Provenance | Git commit, R version, time written, pipeline folder. Volatile; ignored when comparing records | -| Configuration | Taxa, focal species, `n_bootstraps`, `boot_seed`, candidate model sets, engines, selection rules, jobs ok / not ok | -| Coverage | Rows written per taxon and region | -| Metrics | A short metric summary | - -**`tables/coverage.csv`** — what ran. One row per run × region. +| Provenance | Git commit, R version, time written. Volatile; ignored when comparing records | +| Configuration | Runs, focal species, draws, seed, candidate model sets, engines, selection rules, jobs ok / not ok | +| Coverage | Rows written per run and region | +| Metrics | Metrics pooled over species and draws | -| Column | Meaning | -| --- | --- | -| `taxon` | Data slug, from the store's `meta.json` | -| `run` | The spec's key in `run.R`, which names the store; the two mammal runs are `mammal_summer` and `mammal_winter` | -| `region` | Model region (`north`, `south`) | -| `season`, `part` | Mammals only: season, and hurdle part (`presence`, `abundance`) | -| `species` | Species that produced output | -| `draws` | Draws that produced output | -| `stages` | Stages with stored coefficients | -| `has_coefficients` | Whether coefficients were stored | -| `has_grid` | Whether predictions onto the habitat prediction grid were stored | - -A row with `species = 0` means that taxon and region produced nothing; the -reason is in `2_pipeline//run_log.csv`. +**`tables/coverage.csv`** — what ran, one row per run × region: `taxon`, +`run`, `region`, `season` and `part` (mammals), `species`, `draws`, `stages`, +`has_coefficients`, `has_grid`. A row with `species = 0` produced nothing; +the reason is in `run_log.csv`. **`tables/metric_summary.csv`** — how well the models fit. One row per -taxon × region × species × metric, with `n`, `median`, `p10` and `p90` over -draws. Each harness metric comes twice, prefixed by where it is scored: +taxon × region × species × metric, with `n`, `median`, `p10` and `p90`. | Prefix | Scored on | | --- | --- | | `insample_` | The units the draw fitted | -| `oob_` | The units the draw left out: the held-out read. NA for iteration 1, the full data | -| `v2val_` | v2's own validation (plants): seven AUCs scored from the coefficients on the draw's units, as v2 does | -| `oob_v2val_` | The same seven, on the units the draw left out | +| `oob_` | The units the draw left out: the held-out read. NA for draw 1 | +| `v2val_` | v2's own validation (plants): seven AUCs from the coefficients | +| `oob_v2val_` | The same seven, out-of-bag | | Metric | Meaning | | --- | --- | @@ -658,199 +774,114 @@ draws. Each harness metric comes twice, prefixed by where it is scored: | `rmse` | Typical prediction error | | `spearman` | Rank agreement between observed and predicted | | `calibration_slope` | 1 is well calibrated; below 1, predictions are over-confident | -| `prevalence` | Observed detection rate | -| `n` | Survey units scored | -| `Climate`, `Climate_Truncated`, `Landcover`, `Full`, `Full_Truncated`, `Full_Joint`, `Full_Joint_Truncated` | v2's validation AUCs: climate alone (and capped at its 99th percentile), landcover alone, the two combined, and combined per habitat type | - -The harness metrics score each run's **final model**: the combined model where -a rule averages candidates, and for plants v2's own prediction from its -coefficient tables (`final_prediction` in the spec), so for plants -`insample_auc` equals `v2val_Full`. Earlier runs scored the best single -candidate instead; their metric summaries are not comparable with these. - -**`tables/grid_summary.csv`** — the final model's prediction for each habitat -type. One row per taxon × region × species × `grid_unit`, with `n`, -`median`, `p10`, `p90` and `boot1` over draws, on the response scale -(probability of detection or presence, or count for birds). Each grid row is -a pure stand of that type, at the stage's constants: `Climate` 0, the new -protocol where fitted, 100 sampling days for mammals. This is the quantity -every engine can produce, so it is what a method without coefficients is -compared on. Bird grids are v2's coefficient translation matrix rebuilt in -covariate space; v2's later adjustments to coefficients (the plant stand-age -splines, the bird linear-feature re-expression) are in the coefficients, not -the grid. - -**`tables/coefficient_summary.csv`** (gitignored) — what the models -estimated. One row per run × region × stage × species × term, with the -labels from `coverage.csv`, `n`, `median`, `p10` and `p90` over draws, and -`boot1`, the iteration-1 (full-data) value. Every stage is stored, and a term -means something different by taxon and stage: +| `prevalence`, `n` | Observed detection rate; survey units scored | +| `Climate` … `Full_Joint_Truncated` | v2's seven validation AUCs: climate alone (and capped), landcover alone, the two combined, and combined per habitat type | + +Metrics score each run's final model, so for plants `insample_auc` equals +`v2val_Full`. Runs before 2026-10-03 scored the best single candidate; their +metric summaries are not comparable with these. + +**`tables/grid_summary.csv`** — the final model's prediction for each +habitat type, one row per taxon × region × species × `grid_unit`, on the +response scale. Each row is a pure stand of that type at the stage's +constants (`Climate` 0, the new protocol where fitted, 100 sampling days for +mammals). v2's later coefficient adjustments, such as the plant stand-age +splines, are in the coefficients, not the grid. + +**`tables/coefficient_summary.csv`** (gitignored) — one row per run × +region × stage × species × term. A term means something different by taxon +and stage: | Taxon and stage | `term` holds | | --- | --- | -| Any, `climate` | Model-averaged climate coefficients, on the link scale | -| Plant group, `habitat` | Effect of each habitat type on the logit scale, plus `Intercept`, `Climate` and, for bryophytes and lichens, `Protocol` | -| Mammals, `habitat` | Probability of presence per habitat type in the winning model | +| Any, `climate` | Model-averaged climate coefficients, link scale | +| Plant group, `habitat` | Effect of each habitat type, logit scale, plus `Intercept`, `Climate` and, for bryophytes and lichens, `Protocol` | +| Mammals, `habitat_presence` / `_abundance` / `_total` | Per habitat type, from v2's hurdle model | | Birds, `landcover` | Raw `glm` coefficients (e.g. `vegcCrop`) | -| Birds, `habitat` | The same, translated onto v2's standardized habitat types by `modules/birds/standardize.R`, log scale | +| Birds, `habitat` | The same, translated onto v2's standardized habitat types, log scale | -**`tables/parity_terms.csv`** (gitignored) — the term-by-term comparison -with v2: `coefficient_summary.csv` joined to `0_data/v2_results/v2_results.csv` -on taxon, region, stage, part, species and term. Plant habitat terms are -relabelled as v2 publishes them; mammal seasons are averaged first. Use it to -find which terms or species disagree. +**`tables/comparison_*.csv`** (experiments made from the template) — against +exp_000: `comparison_summary.csv` per taxon, region and metric, with the +median difference and the share of species that did better; +`comparison_metrics.csv` per species; `comparison_grid.csv` with the rank +correlation of habitat effects on the grid. "Better" is higher AUC, deviance +explained and Spearman, lower RMSE, and a calibration slope closer to 1. -| Column | Meaning | -| --- | --- | -| `ref_region`, `ref_part` | The reference rows joined to: climate joins region `all`, because v2 fits it province-wide | -| `seasons` | Mammals: the seasons averaged (`summer+winter`) | -| `median`, `p10`, `p90`, `boot1`, `n` | This run's summary over draws | -| `v2_median`, `v2_p10`, `v2_p90`, `v2_n`, `source` | The v2 summary and where it came from; `v2_n = 1` means v2 fitted once | -| `comparison`, `run_value` | `median`, or `iteration 1` where v2 fitted once, and the run value used | -| `unreachable_reason`, `reachable` | Why a term cannot match yet (age spline, cutblock convergence, pooled with a spline term, v2 placeholder), from `v2_unreachable_terms()` in `01_compare_to_v2.R` | -| `in_band` | `TRUE` where the v2 median falls inside this run's `p10`–`p90` band | -| `absolute_difference` | \|run value − v2 median\| | -| `standardized_difference` | The absolute difference ÷ half this run's band width. Below 1 is close; far above 1 is a systematic difference | +### exp_000's parity outputs -**`tables/parity_summary.csv`** — the gate result. One row per -taxon × region × stage. +**`tables/parity_terms.csv`** (gitignored) — the term-by-term comparison: +`coefficient_summary.csv` joined to the v2 reference on taxon, region, stage, +part, species and term, with plant habitat terms relabelled as v2 publishes +them and mammal seasons averaged. | Column | Meaning | | --- | --- | -| `comparison` | `median` or `iteration 1` | -| `species` | Species with at least one joined term | -| `terms_compared` | Terms joined to a v2 value | -| `min_draws` | Fewest draws the store holds for any compared term; a `median` row below v2's 100 gets no verdict | -| `in_band_pct` | Percentage of compared terms in band | -| `reachable_terms` | Compared terms v2 does not set by missing machinery or a placeholder | -| `reachable_in_band_pct` | Percentage of reachable terms in band | -| `median_standardized_difference` | Typical size of the gap, over reachable terms | -| `median_absolute_difference` | Typical absolute gap, over reachable terms | -| `max_absolute_difference` | Largest absolute gap, over reachable terms; the numerical test for `iteration 1` rows | -| `negligible_terms` | Reachable terms both runs shrink to nothing (below a millionth of the term's typical size); left out of the two columns below | -| `median_spearman` | Median, over species, of the rank correlation between run and v2 medians. Reported, not gated | -| `median_band_ratio` | Median, over species, of the median of this run's 10–90% band width ÷ v2's. Near 1 when the run is as variable as v2; gated between 0.75 and 1.33 | -| `verdict` | `pass`, `fail`, `no comparison`, `not gated (trial run)`, or `not gated (store holds N draws)`, against the targets in `utils/parity_targets.R` | -| `indicative_verdict` | For a 100-draw run on a species subset: the same test, **not** the gate | - -The targets are proposed from `v2_self_agreement.R`, which measures how -closely two v2 runs agree with each other; see the experiment README. A trial -run — fewer draws than v2's 100, or a species subset — is not gated: with few -draws the run's 10–90% band is estimated from a handful of values, and is -typically narrower than v2's 100-draw band, so `standardized_difference` is -inflated and the in-band tests are unreliable in both directions. - -**`tables/v2_self_agreement_summary.csv`** — how closely v2 agrees with itself -on the bryophyte climate stage, the evidence the distributional targets are -set from. Written once by `v2_self_agreement.R`, not by `run.R`. - -**`figures/parity_.png`** — one figure per taxon, drawn from -`parity_terms.csv` by `02_plot_parity.R`. Panels are stage × region (and -hurdle part, for mammals) by species; each row is a term. v2 and exp_000 are -drawn in different colours as a median and a 10th–90th percentile bar, which -is all v2's reference keeps of its draws. Terms span 1e-144 to 1e2, so each -is drawn relative to v2: 0 is v2's median and one unit is half v2's band, -the scale of `standardized_difference`. Where v2 fitted once (mammals), the -unit is half the run's band, v2 is a point, and the run's iteration 1 — what -the gate compares — is drawn in a third colour. Unreachable terms are left -out and counted in the caption. - -**`figures/parity_mean.png`** — the same scaled values averaged over every -species and term: one facet per taxon, one row per stage and region (and -hurdle part). Each row is labelled with `|d|`, the mean absolute difference of -the run's median from v2's, and the share of terms in band. Setting -`mean_facet <- "group"` in `02_plot_parity.R` pools the four plant taxa into -one facet beside mammals and birds. Averages use values clamped at ±4, so one -far-off term cannot dominate a row. - -**`figures/parity_bell.png`** — v2 and exp_000 as distributions. One -facet per taxon (or group, as above) and one pair of curves per stage and -region, v2 in blue and exp_000 in orange. Each term's median and 10–90% -band is read as a normal curve, in v2 units, and a row's curve is the -average over its terms, negligible ones left out. A shifted orange curve is -a difference in location; a wider or narrower one, a difference in spread -(what `median_band_ratio` measures). The normal shape is a drawing -convenience: v2 keeps only three summaries of its draws. Where v2 fitted -once (mammals) it is a blue line at 0. - -**`report.md`** — a readable summary, generated rather than written: - -| Section | Comes from | -| --- | --- | -| Run kind and seed | `run.R`: full or trial run, and `boot_seed` | -| What each spec reproduces of v2 | Each spec's `v2_coverage` | -| v2 references | `0_data/v2_results/v2_results_coverage.csv`, and what this run's comparison could not reach | -| What ran | `tables/coverage.csv` | -| Parity against v2, by stage | `tables/parity_summary.csv` | -| Model fit | Median AUC from `tables/metric_summary.csv` | +| `ref_region`, `ref_part` | The reference rows joined to; climate joins region `all` | +| `median`, `p10`, `p90`, `boot1`, `n` | This run over draws | +| `v2_median`, `v2_p10`, `v2_p90`, `v2_n`, `source` | v2's summary; `v2_n = 1` means v2 fitted once | +| `comparison`, `run_value` | `median`, or `iteration 1` where v2 fitted once, and the value used | +| `reachable`, `unreachable_reason` | Whether v2 fixes the term at a placeholder | +| `in_band` | `TRUE` where the v2 median falls inside this run's `p10`–`p90` band | +| `absolute_difference`, `standardized_difference` | The gap, raw and ÷ half this run's band. Below 1 is close | -### `docs/` +**`tables/parity_summary.csv`** — the gate, one row per taxon × region × +stage: `species`, `terms_compared`, `min_draws`, `in_band_pct`, +`reachable_terms`, `reachable_in_band_pct`, the median and maximum gaps, +`negligible_terms`, `median_spearman` (reported, not gated), +`median_band_ratio` (this run's band width ÷ v2's; gated between 0.75 and +1.33), `verdict` and `indicative_verdict` (a 100-draw run on a species +subset: the same test, **not** the gate). -| File | Holds | -| --- | --- | -| [`framework_design.md`](docs/framework_design.md) | How the three v2 pipelines became one harness: the spec and result contracts, covariate choice, the parity ledger, and the build order | -| [`taxon_quirks.md`](docs/taxon_quirks.md) | Every taxon-specific behaviour in the v2 pipelines, and whether the harness reproduces it | -| `reviews/` | Dated code reviews and their remediation plans | -| `images/` | Logos used in this README | +**`figures/`** — `parity_.png` draws each term's run and v2 median +and 10–90% band, relative to v2 (0 is v2's median, one unit half v2's band); +`parity_mean.png` averages them per taxon; `parity_bell.png` shows v2 and the +run as distributions, so a shift is a difference in location and a wider or +narrower curve a difference in spread. + +**`report.md`** — generated: run kind and seed, what each spec reproduces of +v2, the v2 references reached, what ran, parity by stage, and model fit. ## Parity gate -`exp_000` is the validation gate. It runs the v2.0 configuration of every -taxon through this repository's harness and compares the results against the -v2.0 outputs. Later experiments are compared against `exp_000`, so a -difference there is a difference in method rather than in plumbing. +exp_000 is the validation gate: it runs every taxon's v2.0 configuration +through the pipeline and compares the result with the published v2.0 output. + +v2 sets no random seed, so two v2 runs of the same code give different +coefficients, and parity is **distributional**: each term passes when the v2 +median falls inside this run's 10–90% band. Where v2 fits once (mammals), the +run's full-data fit is compared directly. The proposed targets, in +`utils/parity_targets.R`, are set from how closely two v2 runs agree with each +other (`v2_self_agreement.R`): at least 90% of reachable terms in band, a +median standardized difference of 0.25 or less, and a band-width ratio between +0.75 and 1.33. -Two things are needed before the gate can be closed: +`seed` in `run.R` makes this side repeatable: each species draws from its own +seed, derived from the base seed and the species name. `NULL` restores v2's +unseeded behaviour. Birds replay v2's stored draws. -- The harness has to reproduce v2 where it currently does not; see - [Known gaps](#known-gaps). -- The minimum acceptable parity target, which has not been defined and will - need to be agreed per taxon. +Two things are needed before the gate is closed: -The v2 bootstrap resamples without a fixed seed, so two v2 runs of the same -code do not produce identical coefficients, and the comparison is between -distributions rather than numbers. `boot_seed` in `run.R` makes this side -repeatable: each species draws from its own seed, derived from `boot_seed` -and the species name. Setting it to `NULL` reproduces v2's unseeded -behaviour. Birds are unaffected, because their draws are v2's stored ones. +- **Agree the parity targets** above, per taxon, or change them. +- **Run the full species queues at 100 draws** and commit the report and + record. Only a full run is gated; a run on a species subset gets an + indicative verdict. ## Known gaps -Per stage and taxon, each spec's `v2_coverage` is the authoritative -statement, and `report.md` prints it. The full list, with evidence and a -remediation plan, is in -[`docs/reviews/2026-09-28_alignment_review.md`](docs/reviews/2026-09-28_alignment_review.md). -The main ones: - -- **Some published v2 results cannot be reproduced exactly.** The harness - matches v2's own code to numerical precision (plants and birds, climate - and habitat). But the published lichen models were fitted on bootstrap - draws v2 did not keep, so parity against those is approximate. Birds - reproduce exactly, but only from the `Stratified.Rdata` in - `remote/birds_data_v2/`; the BirdModels drive's copy was rebuilt - after v2 and no longer matches. - See [`docs/taxon_quirks.md`](docs/taxon_quirks.md). +Each spec's `v2_coverage` is the authoritative statement per stage and taxon, +and `report.md` prints it. The full list, with evidence, is in +[`docs/reviews/2026-09-28_alignment_review.md`](docs/reviews/2026-09-28_alignment_review.md) +and [`docs/taxon_quirks.md`](docs/taxon_quirks.md). + +- **Some published v2 results cannot be matched exactly.** The pipeline + matches v2's own code to numerical precision, but the published lichen, + mite and vascular plant models were fitted on bootstrap draws v2 did not + keep, so parity against those is distributional. +- **Birds reproduce only from the right data.** v2's birds were fitted on the + `Stratified.Rdata` in `remote/birds_data_v2/`; the BirdModels drive's copy + was rebuilt after v2 and no longer matches. - **No parity target has been agreed.** -The v2 machinery is now all in the harness: the plant age splines, cutblock -convergence and validation (`modules/_shared/plant_group.R`), and the mammal -hurdle with its splines, calibration and convergence -(`modules/mammals/hurdle.R`). Each matches v2 numerically where the -reference was fitted on data the test dataset holds. - -## Naming conventions - -| Item | Convention | Example | -| --- | --- | --- | -| Experiments | `exp_NNN_short_description` | `exp_001_covariate_scale` | -| Taxon slugs | As the data files name them | `vascular_plant`, `mite`, `bird` | -| Module folders | Plural taxon name | `vascular_plants/`, `soil_mites/` | -| Setup scripts | `NN_` run order, in `1_code/_setup/` | `05_harmonize_v2_results.R` | - -An experiment identifier is used verbatim in `1_code/experiments/`, -`2_pipeline/`, and `3_output/`. `run.R` derives all three paths from -`exp_id` rather than typing the identifier per stage. - ## Adding an experiment 1. Copy `1_code/experiments/_template/` to `exp_00N_short_description/`. @@ -859,42 +890,46 @@ An experiment identifier is used verbatim in `1_code/experiments/`, 4. Change one thing relative to exp_000: `stage_models` for different candidate formulas, or `specs` for a different engine or selection rule. Keep exp_000's species, draws and seed unless they are the question. -5. Run it. The template's `compare_to_baseline` step writes - `tables/comparison_*.csv` against exp_000. +5. Run it, first at 5 draws to check it works. The template's + `compare_to_baseline` step writes `tables/comparison_*.csv` against exp_000. [`docs/getting_started.md`](docs/getting_started.md#test-a-change) walks -through each lever. Experiment-specific logic stays in the experiment; a -change to `harness/`, `methods/` or `modules/` affects every experiment and -should be reviewed on that basis. +through each lever. ## Contributing a taxon module 1. Put the v2 scripts as received in `0_data/v2_scripts//`, - unmodified, and log the source and commit in its `README.md`. They are - the reference, and are never edited and never run. -2. Extend `1_code/_setup/01_harmonize_model_ready_v2.R` to write the taxon's - response table, its rows in `covariates.csv` and `covariate_columns.csv`, - its species queue, and any prediction grid or stored bootstrap draws. - Extend `02_validate_test_dataset.R` to trace them back to the source. -3. Add the taxon to `09_harmonize_lookups.R`: its species queue rows and - its rows in `dataset_manifest.csv` (response file, offset file, covariate - key, grid, stored draws). Re-run `09`. + unmodified, and log the source and commit in its `README.md`. +2. Extend `_setup/01` to write the taxon's response table, its covariates, + its species queue, and any prediction grid or stored draws. Extend + `_setup/02` to trace them back to the source. +3. Add the taxon to `_setup/09`: its species queue rows and its rows in + `dataset_manifest.csv`. Re-run `09`. 4. Splice the v2 candidate formulas into `harness/model_sets.R`, verbatim. -5. Add `1_code/modules//spec.R`, a function returning the spec. Model - it on `lichens/spec.R` for a plant-group taxon, or on `birds/spec.R` or - `mammals/spec.R` for a standalone pipeline, and add its run to - `modules/_shared/standard_specs.R`. If v2 does something no registered - method covers, add one to `1_code/methods/`. -6. Add the taxon's published v2 results to `_setup/05_harmonize_v2_results.R`, - so `v2_results.csv` carries a reference for it. -7. Check that `validate_spec()` passes and `1_code/tests/run_tests.R` runs - clean, then check the result against the originals rather than trusting - it. Record every taxon-specific behaviour, and whether the spec reproduces - it, in `docs/taxon_quirks.md`. +5. Add `1_code/modules//spec.R`, modelled on `lichens/spec.R` for a + plant-group taxon or on `birds/spec.R` or `mammals/spec.R` otherwise, and + add its run to `modules/_shared/standard_specs.R`. If v2 does something no + registered method covers, add one to `1_code/methods/`. +6. Add the taxon's published v2 results to `_setup/05`. +7. Check that `validate_spec()` passes and `run_tests.R` runs clean, then + check the result against the originals. Record every taxon-specific + behaviour in `docs/taxon_quirks.md`. + +## Naming conventions + +| Item | Convention | Example | +| --- | --- | --- | +| Experiments | `exp_NNN_short_description` | `exp_001_covariate_scale` | +| Taxon slugs | As the data files name them | `vascular_plant`, `mite`, `bird` | +| Module folders | Plural taxon name | `vascular_plants/`, `soil_mites/` | +| Setup scripts | `NN_` run order, in `1_code/_setup/` | `05_harmonize_v2_results.R` | + +An experiment's identifier is used verbatim in `1_code/experiments/`, +`2_pipeline/` and `3_output/`. Soil mites use the data slug `mite`. ## Setup -R 4.4 or later, plus the packages the harness and the `_setup` scripts use: +R 4.4 or later, plus: ```r install.packages(c( @@ -905,26 +940,23 @@ install.packages(c( )) ``` -Build the test dataset once per snapshot, from the repository root: +Fitting an experiment needs only `0_data/`. Building the dataset needs the +network sources, once per snapshot, from the repository root: ```r source("1_code/_setup/01_harmonize_model_ready_v2.R") -source("1_code/_setup/02_validate_test_dataset.R") source("1_code/_setup/06_harmonize_bird_translation_lookup.R") -source("1_code/_setup/09_harmonize_lookups.R") # offline; seconds -``` - -Build the v2 reference once, after that. `03` and `04` are long — hours — -and only need re-running if their sources change: +source("1_code/_setup/09_harmonize_lookups.R") # offline; seconds +source("1_code/_setup/02_validate_test_dataset.R") -```r +# The v2 reference. 03 and 04 take hours; re-run only if their sources change source("1_code/_setup/03_rerun_bryophyte_v2_reference.R") source("1_code/_setup/04_package_bird_coefficients.R") source("1_code/_setup/05_harmonize_v2_results.R") +source("1_code/_setup/08_harmonize_abmiexplorer_results.R") ``` -The `_setup` scripts read their sources over the network. Set these when a -source is not in its default location: +Set these when a source is not in its default location: | Variable | Read by | Points at | | --- | --- | --- | @@ -938,17 +970,6 @@ source is not in its default location: | `SDM_V2_BIRD_ROOT` | `04`, `05` | The v2 bird project (`BirdModels`) | | `SDM_V2_MAMMAL_ROOT` | `05` | The v2 mammal habitat-modelling results for 2024 | -Then run an experiment, also from the repository root: - -```r -source("1_code/experiments/exp_000_parity_v2/run.R") -``` - -Building the dataset needs the network sources. Fitting an experiment does -not. `exp_000`'s comparison step still reads v2 from the network drives, -through `SDM_V2_PLANT_OUTPUT` and `SDM_V2_MAMMAL_OUTPUT`, until it is moved -onto `0_data/v2_results/`. - ## Related resources - [code_standards](https://github.com/ABbiodiversity/code_standards) — Science From 2b72a2b8c91e342e879570cef94c495ee49d10a4 Mon Sep 17 00:00:00 2001 From: bgcasey Date: Sat, 3 Oct 2026 15:06:39 -0600 Subject: [PATCH 04/16] Update parity_summary.csv and documentation for output clarity - Modified the parity_summary.csv to reflect updated metrics and draw limits for various taxa across climate and habitat stages. - Adjusted the documentation in getting_started.md to point to the correct section for output definitions. --- 1_code/experiments/exp_000_parity_v2/run.R | 18 +- 3_output/exp_000_parity_v2/report.md | 146 +- 3_output/exp_000_parity_v2/run_record.md | 655 ++++----- .../exp_000_parity_v2/tables/coverage.csv | 28 +- .../exp_000_parity_v2/tables/grid_summary.csv | 945 +++++++++++++ .../tables/metric_summary.csv | 1232 ++++++++--------- .../tables/parity_summary.csv | 44 +- docs/getting_started.md | 2 +- 8 files changed, 2012 insertions(+), 1058 deletions(-) create mode 100644 3_output/exp_000_parity_v2/tables/grid_summary.csv diff --git a/1_code/experiments/exp_000_parity_v2/run.R b/1_code/experiments/exp_000_parity_v2/run.R index 5992f0e..e06f7f8 100644 --- a/1_code/experiments/exp_000_parity_v2/run.R +++ b/1_code/experiments/exp_000_parity_v2/run.R @@ -49,8 +49,13 @@ config <- experiment_config( # Runs, from names(standard_specs()). Mammals run once per # season, because v2's mammal references average the two. taxa = c( - "bryophyte", "lichen", "mite", "vascular_plant", - "mammal_summer", "mammal_winter", "bird" + "bryophyte", + "lichen", + "mite", + "vascular_plant", + "mammal_summer", + "mammal_winter", + "bird" ), # A named set from focal_species_sets(), a vector named by @@ -63,7 +68,7 @@ config <- experiment_config( # Draws per species. 100 is v2's, and the only setting the gate # reads. Below about 20 the 10-90% bands are too unstable for # the parity numbers to mean anything; 5 checks the plumbing. - n_bootstraps = 100, + n_bootstraps = 5, # One number governs every random draw; each species draws # under its own seed derived from it. NULL leaves the draws @@ -97,13 +102,14 @@ config <- experiment_config( config$v2_reference <- "abmiexplorer" config$v2_reference_dir <- file.path( - config$project_root, "0_data", "v2_results", + config$project_root, + "0_data", + "v2_results", switch( config$v2_reference, abmiexplorer = "abmiexplorer", drives = "", - stop("v2_reference must be \"abmiexplorer\" or \"drives\".", - call. = FALSE) + stop("v2_reference must be \"abmiexplorer\" or \"drives\".", call. = FALSE) ) ) diff --git a/3_output/exp_000_parity_v2/report.md b/3_output/exp_000_parity_v2/report.md index 86b90ce..8b45006 100644 --- a/3_output/exp_000_parity_v2/report.md +++ b/3_output/exp_000_parity_v2/report.md @@ -1,10 +1,10 @@ # exp_000_parity_v2 -Generated 2026-10-03 05:16:40 +Generated 2026-10-03 14:32:58 -**Trial run.** 14 focal species, 100 of 100 draws. Its parity numbers show the pipeline ran; they are not a parity read. +**Trial run.** 14 focal species, 5 of 100 draws. Its parity numbers show the pipeline ran; they are not a parity read. -Draws: `boot_seed = 20260909`, one derived seed per species. +Draws: `seed = 20260909`, one derived seed per species. ## What each spec reproduces of v2 @@ -47,27 +47,27 @@ Scored against `abmiexplorer`, built by `1_code/_setup/08_harmonize_abmiexplorer | source_label | reachable | rows | species | note | | --- | --- | --- | --- | --- | -| amphibian north habitat | TRUE | 364 | 4 | NA | -| amphibian south habitat | FALSE | 0 | 0 | NA | -| amphibian all climate | TRUE | 44 | 4 | NA | -| bird north habitat | TRUE | 10609 | 103 | NA | -| bird south habitat | TRUE | 1747 | 65 | NA | -| bird all climate | TRUE | 1240 | 124 | NA | -| bryophyte north habitat | TRUE | 12154 | 118 | NA | -| bryophyte south habitat | TRUE | 673 | 25 | NA | -| bryophyte all climate | TRUE | 2242 | 118 | NA | -| lichen north habitat | TRUE | 13596 | 132 | NA | -| lichen south habitat | TRUE | 1206 | 45 | NA | -| lichen all climate | TRUE | 2755 | 145 | NA | -| mammal north habitat | TRUE | 5760 | 15 | NA | -| mammal south habitat | TRUE | 1079 | 13 | NA | -| mammal all climate | TRUE | 105 | 21 | NA | -| mite north habitat | TRUE | 9785 | 95 | NA | -| mite south habitat | TRUE | 755 | 28 | NA | -| mite all climate | TRUE | 2052 | 108 | NA | -| vascular_plant north habitat | TRUE | 32754 | 318 | NA | -| vascular_plant south habitat | TRUE | 6257 | 233 | NA | -| vascular_plant all climate | TRUE | 8246 | 434 | NA | +| amphibian north habitat | TRUE | 364 | 4 | - | +| amphibian south habitat | FALSE | 0 | 0 | - | +| amphibian all climate | TRUE | 44 | 4 | - | +| bird north habitat | TRUE | 10609 | 103 | - | +| bird south habitat | TRUE | 1747 | 65 | - | +| bird all climate | TRUE | 1240 | 124 | - | +| bryophyte north habitat | TRUE | 12154 | 118 | - | +| bryophyte south habitat | TRUE | 673 | 25 | - | +| bryophyte all climate | TRUE | 2242 | 118 | - | +| lichen north habitat | TRUE | 13596 | 132 | - | +| lichen south habitat | TRUE | 1206 | 45 | - | +| lichen all climate | TRUE | 2755 | 145 | - | +| mammal north habitat | TRUE | 5760 | 15 | - | +| mammal south habitat | TRUE | 1079 | 13 | - | +| mammal all climate | TRUE | 105 | 21 | - | +| mite north habitat | TRUE | 9785 | 95 | - | +| mite south habitat | TRUE | 755 | 28 | - | +| mite all climate | TRUE | 2052 | 108 | - | +| vascular_plant north habitat | TRUE | 32754 | 318 | - | +| vascular_plant south habitat | TRUE | 6257 | 233 | - | +| vascular_plant all climate | TRUE | 8246 | 434 | - | What this run's comparison could not reach: @@ -77,20 +77,20 @@ _Every taxon and region that ran had a reference to compare against._ | taxon | run | region | season | part | species | draws | stages | has_coefficients | has_grid | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| bird | bird | north | | | 2 | 100 | climate, landcover, habitat | TRUE | FALSE | -| bird | bird | south | | | 2 | 100 | climate, landcover, habitat | TRUE | FALSE | -| bryophyte | bryophyte | north | | | 2 | 100 | climate, habitat | TRUE | FALSE | -| bryophyte | bryophyte | south | | | 2 | 100 | climate, habitat | TRUE | FALSE | -| lichen | lichen | north | | | 2 | 100 | climate, habitat | TRUE | FALSE | -| lichen | lichen | south | | | 2 | 100 | climate, habitat | TRUE | FALSE | -| mammal | mammal_summer | north | summer | hurdle | 2 | 100 | habitat_presence, habitat_abundance, habitat_total | TRUE | FALSE | -| mammal | mammal_summer | south | summer | hurdle | 2 | 100 | habitat_presence, habitat_abundance, habitat_total | TRUE | FALSE | -| mammal | mammal_winter | north | winter | hurdle | 2 | 100 | habitat_presence, habitat_abundance, habitat_total | TRUE | FALSE | -| mammal | mammal_winter | south | winter | hurdle | 2 | 100 | habitat_presence, habitat_abundance, habitat_total | TRUE | FALSE | -| mite | mite | north | | | 2 | 100 | climate, habitat | TRUE | TRUE | -| mite | mite | south | | | 2 | 100 | climate, habitat | TRUE | TRUE | -| vascular_plant | vascular_plant | north | | | 2 | 100 | climate, habitat | TRUE | TRUE | -| vascular_plant | vascular_plant | south | | | 2 | 100 | climate, habitat | TRUE | TRUE | +| bird | bird | north | - | - | 2 | 5 | climate, landcover, habitat | TRUE | TRUE | +| bird | bird | south | - | - | 2 | 5 | climate, landcover, habitat | TRUE | TRUE | +| bryophyte | bryophyte | north | - | - | 2 | 5 | climate, habitat | TRUE | TRUE | +| bryophyte | bryophyte | south | - | - | 2 | 5 | climate, habitat | TRUE | TRUE | +| lichen | lichen | north | - | - | 2 | 5 | climate, habitat | TRUE | TRUE | +| lichen | lichen | south | - | - | 2 | 5 | climate, habitat | TRUE | TRUE | +| mammal | mammal_summer | north | summer | hurdle | 2 | 5 | habitat_presence, habitat_abundance, habitat_total | TRUE | TRUE | +| mammal | mammal_summer | south | summer | hurdle | 2 | 5 | habitat_presence, habitat_abundance, habitat_total | TRUE | TRUE | +| mammal | mammal_winter | north | winter | hurdle | 2 | 5 | habitat_presence, habitat_abundance, habitat_total | TRUE | TRUE | +| mammal | mammal_winter | south | winter | hurdle | 2 | 5 | habitat_presence, habitat_abundance, habitat_total | TRUE | TRUE | +| mite | mite | north | - | - | 2 | 5 | climate, habitat | TRUE | TRUE | +| mite | mite | south | - | - | 2 | 5 | climate, habitat | TRUE | TRUE | +| vascular_plant | vascular_plant | north | - | - | 2 | 5 | climate, habitat | TRUE | TRUE | +| vascular_plant | vascular_plant | south | - | - | 2 | 5 | climate, habitat | TRUE | TRUE | ## Parity against v2, by stage @@ -102,28 +102,28 @@ fixes at a placeholder are left out of the reachable scores. | taxon | region | stage | comparison | species | terms_compared | min_draws | in_band_pct | reachable_terms | reachable_in_band_pct | median_standardized_difference | median_absolute_difference | max_absolute_difference | negligible_terms | median_spearman | median_band_ratio | verdict | indicative_verdict | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| bird | north | climate | median | 2 | 20 | 100 | 100 | 20 | 100 | 0 | 0 | 2.2e-11 | 0 | 1 | 1 | not gated (trial run) | pass | -| bryophyte | north | climate | median | 1 | 19 | 100 | 100 | 19 | 100 | 0.035 | 0 | 1.4 | 6 | 1 | 1.062 | not gated (trial run) | pass | -| lichen | north | climate | median | 2 | 38 | 100 | 100 | 38 | 100 | 0 | 0 | 0.644 | 17 | 0.993 | 0.879 | not gated (trial run) | pass | -| mite | north | climate | median | 2 | 38 | 100 | 100 | 38 | 100 | 0 | 0 | 1.95 | 20 | 0.905 | 0.953 | not gated (trial run) | pass | -| vascular_plant | north | climate | median | 2 | 38 | 100 | 100 | 38 | 100 | 0 | 0 | 0.266 | 24 | 1 | 0.97 | not gated (trial run) | pass | -| bird | south | climate | median | 2 | 20 | 100 | 100 | 20 | 100 | 0 | 0 | 2.2e-11 | 0 | 1 | 1 | not gated (trial run) | pass | -| bryophyte | south | climate | median | 1 | 19 | 100 | 100 | 19 | 100 | 0.035 | 0 | 1.4 | 6 | 1 | 1.062 | not gated (trial run) | pass | -| lichen | south | climate | median | 2 | 38 | 100 | 100 | 38 | 100 | 0 | 0 | 0.644 | 17 | 0.993 | 0.879 | not gated (trial run) | pass | -| mite | south | climate | median | 2 | 38 | 100 | 100 | 38 | 100 | 0 | 0 | 1.95 | 20 | 0.905 | 0.953 | not gated (trial run) | pass | -| vascular_plant | south | climate | median | 2 | 38 | 100 | 100 | 38 | 100 | 0 | 0 | 0.266 | 24 | 1 | 0.97 | not gated (trial run) | pass | -| bird | north | habitat | median | 2 | 178 | 100 | 100 | 168 | 100 | 0 | 0 | 2.71e-11 | 0 | 1 | 1 | not gated (trial run) | pass | -| bryophyte | north | habitat | median | 1 | 94 | 100 | 100 | 94 | 100 | 0.072 | 0.023 | 0.0808 | 0 | 0.997 | 0.911 | not gated (trial run) | pass | -| lichen | north | habitat | median | 2 | 188 | 100 | 100 | 188 | 100 | 0.091 | 0.024 | 0.118 | 0 | 0.999 | 0.988 | not gated (trial run) | pass | -| mammal | north | habitat | iteration 1 | 2 | 448 | 65 | 100 | 436 | 100 | 0 | 0 | 9.77e-15 | 0 | 1 | NA | not gated (trial run) | pass | -| mite | north | habitat | median | 1 | 94 | 100 | 100 | 94 | 100 | 0.14 | 0.035 | 0.148 | 0 | 0.999 | 0.993 | not gated (trial run) | pass | -| vascular_plant | north | habitat | median | 2 | 188 | 100 | 100 | 188 | 100 | 0.108 | 0.022 | 0.125 | 0 | 0.999 | 0.95 | not gated (trial run) | pass | -| bird | south | habitat | median | 2 | 46 | 100 | 100 | 40 | 100 | 0 | 0 | 5.61e-11 | 0 | 1 | 1 | not gated (trial run) | pass | -| bryophyte | south | habitat | median | 1 | 19 | 100 | 100 | 19 | 100 | 0.047 | 0.021 | 0.0601 | 0 | 0.993 | 1.042 | not gated (trial run) | pass | -| lichen | south | habitat | median | 2 | 40 | 100 | 100 | 40 | 100 | 0.088 | 0.029 | 0.278 | 1 | 0.994 | 0.961 | not gated (trial run) | pass | -| mammal | south | habitat | iteration 1 | 2 | 126 | 99 | 100 | 120 | 100 | 0 | 0 | 5.33e-15 | 0 | 1 | NA | not gated (trial run) | pass | -| mite | south | habitat | median | 2 | 40 | 100 | 100 | 40 | 100 | 0.068 | 0.024 | 0.464 | 1 | 0.991 | 0.975 | not gated (trial run) | pass | -| vascular_plant | south | habitat | median | 2 | 40 | 100 | 100 | 40 | 100 | 0.074 | 0.027 | 0.184 | 0 | 0.997 | 1.021 | not gated (trial run) | pass | +| bird | north | climate | median | 2 | 20 | 5 | 90.000 | 20 | 90.000 | 0.351 | 0.000 | 0.651 | 0 | 1.000 | 0.694 | not gated (store holds 5 draws) | - | +| bryophyte | north | climate | median | 1 | 19 | 5 | 94.700 | 19 | 94.700 | 0.671 | 0.000 | 1.810 | 5 | 0.991 | 0.214 | not gated (store holds 5 draws) | - | +| lichen | north | climate | median | 2 | 38 | 5 | 89.500 | 38 | 89.500 | 0.003 | 0.000 | 1.990 | 17 | 0.991 | 0.301 | not gated (store holds 5 draws) | - | +| mite | north | climate | median | 2 | 38 | 5 | 94.700 | 38 | 94.700 | 0.082 | 0.000 | 3.790 | 20 | 0.973 | 0.656 | not gated (store holds 5 draws) | - | +| vascular_plant | north | climate | median | 2 | 38 | 5 | 97.400 | 38 | 97.400 | 0.000 | 0.000 | 0.120 | 24 | 0.982 | 0.602 | not gated (store holds 5 draws) | - | +| bird | south | climate | median | 2 | 20 | 5 | 90.000 | 20 | 90.000 | 0.351 | 0.000 | 0.651 | 0 | 1.000 | 0.694 | not gated (store holds 5 draws) | - | +| bryophyte | south | climate | median | 1 | 19 | 5 | 94.700 | 19 | 94.700 | 0.671 | 0.000 | 1.810 | 5 | 0.991 | 0.214 | not gated (store holds 5 draws) | - | +| lichen | south | climate | median | 2 | 38 | 5 | 89.500 | 38 | 89.500 | 0.003 | 0.000 | 1.990 | 17 | 0.991 | 0.301 | not gated (store holds 5 draws) | - | +| mite | south | climate | median | 2 | 38 | 5 | 94.700 | 38 | 94.700 | 0.082 | 0.000 | 3.790 | 20 | 0.973 | 0.656 | not gated (store holds 5 draws) | - | +| vascular_plant | south | climate | median | 2 | 38 | 5 | 97.400 | 38 | 97.400 | 0.000 | 0.000 | 0.120 | 24 | 0.982 | 0.602 | not gated (store holds 5 draws) | - | +| bird | north | habitat | median | 2 | 178 | 5 | 92.700 | 168 | 92.300 | 0.569 | 0.023 | 2.820 | 0 | 0.989 | 0.699 | not gated (store holds 5 draws) | - | +| bryophyte | north | habitat | median | 1 | 94 | 5 | 98.900 | 94 | 98.900 | 0.360 | 0.062 | 0.256 | 0 | 0.987 | 0.502 | not gated (store holds 5 draws) | - | +| lichen | north | habitat | median | 2 | 188 | 5 | 94.700 | 188 | 94.700 | 0.251 | 0.038 | 0.289 | 0 | 0.996 | 0.642 | not gated (store holds 5 draws) | - | +| mammal | north | habitat | iteration 1 | 2 | 448 | 4 | 100.000 | 436 | 100.000 | 0.000 | 0.000 | 0.000 | 0 | 1.000 | - | not gated (trial run) | - | +| mite | north | habitat | median | 1 | 94 | 5 | 76.600 | 94 | 76.600 | 0.579 | 0.078 | 0.673 | 0 | 0.993 | 0.642 | not gated (store holds 5 draws) | - | +| vascular_plant | north | habitat | median | 2 | 188 | 5 | 91.500 | 188 | 91.500 | 0.303 | 0.034 | 0.326 | 0 | 0.997 | 0.596 | not gated (store holds 5 draws) | - | +| bird | south | habitat | median | 2 | 46 | 5 | 80.400 | 40 | 77.500 | 0.334 | 0.021 | 0.121 | 0 | 0.995 | 0.508 | not gated (store holds 5 draws) | - | +| bryophyte | south | habitat | median | 1 | 19 | 5 | 100.000 | 19 | 100.000 | 0.399 | 0.066 | 0.267 | 0 | 0.991 | 0.633 | not gated (store holds 5 draws) | - | +| lichen | south | habitat | median | 2 | 40 | 5 | 87.500 | 40 | 87.500 | 0.337 | 0.048 | 0.655 | 1 | 0.985 | 0.554 | not gated (store holds 5 draws) | - | +| mammal | south | habitat | iteration 1 | 2 | 126 | 5 | 100.000 | 120 | 100.000 | 0.000 | 0.000 | 0.000 | 0 | 1.000 | - | not gated (trial run) | - | +| mite | south | habitat | median | 2 | 40 | 5 | 95.000 | 40 | 95.000 | 0.175 | 0.030 | 0.754 | 1 | 0.992 | 0.581 | not gated (store holds 5 draws) | - | +| vascular_plant | south | habitat | median | 2 | 40 | 5 | 75.000 | 40 | 75.000 | 0.585 | 0.070 | 0.552 | 0 | 0.977 | 0.566 | not gated (store holds 5 draws) | - | Where v2 bootstraps, parity is **distributional**: v2 seeds no random draw, so two v2 runs differ, and each term is scored on @@ -134,22 +134,22 @@ is compared directly; read `median_absolute_difference`. ## Model fit -Median AUC over species. `insample` scores the units each draw fitted; `oob` the units it left out, the held-out read. `v2val` is v2's validation, scored from the coefficients as v2 does (plants only). Iteration 1 is the full data and has no out-of-bag units. +Median AUC over species, scored on each run's final model: for plants, v2's own prediction from its coefficient tables. `insample` scores the units each draw fitted; `oob` the units it left out, the held-out read. `v2val` is v2's validation, scored from the coefficients as v2 does (plants only), so for plants `v2val_full` equals `insample_auc`. Iteration 1 is the full data and has no out-of-bag units. | taxon | region | species | median_insample_auc | median_oob_auc | median_v2val_full | median_oob_v2val_full | | --- | --- | --- | --- | --- | --- | --- | -| bird | north | 2 | 0.751 | 0.73 | NA | NA | -| bryophyte | north | 2 | 0.666 | 0.646 | 0.668 | 0.652 | -| lichen | north | 2 | 0.807 | 0.798 | 0.808 | 0.802 | -| mammal | north | 4 | 0.751 | 0.73 | NA | NA | -| mite | north | 2 | 0.747 | 0.722 | 0.735 | 0.718 | -| vascular_plant | north | 2 | 0.836 | 0.829 | 0.833 | 0.829 | -| bird | south | 2 | 0.706 | 0.702 | NA | NA | -| bryophyte | south | 2 | 0.705 | 0.686 | 0.676 | 0.664 | -| lichen | south | 2 | 0.836 | 0.816 | 0.802 | 0.792 | -| mammal | south | 4 | 0.739 | 0.716 | NA | NA | -| mite | south | 2 | 0.809 | 0.774 | 0.796 | 0.781 | -| vascular_plant | south | 2 | 0.862 | 0.851 | 0.85 | 0.844 | +| bird | north | 2 | 0.752 | 0.729 | - | - | +| bryophyte | north | 2 | 0.668 | 0.650 | 0.668 | 0.650 | +| lichen | north | 2 | 0.808 | 0.803 | 0.808 | 0.803 | +| mammal | north | 4 | 0.746 | 0.731 | - | - | +| mite | north | 2 | 0.733 | 0.716 | 0.733 | 0.716 | +| vascular_plant | north | 2 | 0.833 | 0.828 | 0.833 | 0.828 | +| bird | south | 2 | 0.704 | 0.702 | - | - | +| bryophyte | south | 2 | 0.671 | 0.669 | 0.671 | 0.669 | +| lichen | south | 2 | 0.802 | 0.792 | 0.802 | 0.792 | +| mammal | south | 4 | 0.753 | 0.686 | - | - | +| mite | south | 2 | 0.799 | 0.774 | 0.799 | 0.774 | +| vascular_plant | south | 2 | 0.848 | 0.846 | 0.848 | 0.846 | ## What is still needed diff --git a/3_output/exp_000_parity_v2/run_record.md b/3_output/exp_000_parity_v2/run_record.md index c7ca08c..6261b7a 100644 --- a/3_output/exp_000_parity_v2/run_record.md +++ b/3_output/exp_000_parity_v2/run_record.md @@ -6,18 +6,21 @@ Written by `run_record()`. The result stores this describes are gitignored; this _Volatile. Excluded from cross-run comparison._ -- **git_commit**: c6852d4 +- **git_commit**: 11cb646 - **pipeline_dir**: D:/local_projects/active/sdmMethodsDev/2_pipeline/exp_000_parity_v2 - **r_version**: 4.5.0 -- **written_at**: 2026-10-03 11:16:41 +- **written_at**: 2026-10-03 20:32:58 ## Configuration -- **boot_seed**: 20260909 +- **boot_seed**: 20260909.0000 - **data_dir**: test_dataset - **engines**: bayesglm, glm - **focal_species**: bird=AMRO, bird=YEWA, bryophyte=Bryum.All, bryophyte=Ceratodon.purpureus, lichen=Cladonia.chlorophaea, lichen=Physcia.adscendens, mammal=Coyote_Summer, mammal=Coyote_Winter, mammal=Moose_Summer, mammal=Moose_Winter, mite=Ceratozetes.gracilis, mite=Trhypochthonius.tectorum, vascular_plant=Galium.boreale, vascular_plant=Vicia.americana -- **n_bootstraps**: 100 +- **jobs_not_ok**: 0 +- **jobs_ok**: 140 +- **jobs_total**: 140 +- **n_bootstraps**: 5 - **plant_bootstrap**: spatial_block - **selection**: aic_average, custom, ivw_grid, staged_bic - **species_n**: 14 @@ -29,331 +32,331 @@ _Volatile. Excluded from cross-run comparison._ | taxon | region | species | draws | coefficient_rows | metric_rows | grid_rows | | --- | --- | --- | --- | --- | --- | --- | -| bird | north | 2 | 100 | 9380 | 2800 | 0 | -| bird | south | 2 | 100 | 6986 | 2800 | 0 | -| bryophyte | north | 2 | 100 | 22000 | 5600 | 0 | -| bryophyte | south | 2 | 100 | 7800 | 5600 | 0 | -| lichen | north | 2 | 100 | 22000 | 5600 | 0 | -| lichen | south | 2 | 100 | 7800 | 5600 | 0 | -| mammal_summer | north | 2 | 100 | 43450 | 2800 | 0 | -| mammal_summer | south | 2 | 100 | 13731 | 2786 | 0 | -| mammal_winter | north | 2 | 100 | 44008 | 2800 | 0 | -| mammal_winter | south | 2 | 100 | 13800 | 2800 | 0 | -| mite | north | 2 | 100 | 21800 | 5600 | 8600 | -| mite | south | 2 | 100 | 7600 | 5600 | 3200 | -| vascular_plant | north | 2 | 100 | 21800 | 5600 | 8600 | -| vascular_plant | south | 2 | 100 | 7600 | 5600 | 3200 | +| bird | north | 2 | 5 | 467 | 140 | 890 | +| bird | south | 2 | 5 | 350 | 140 | 170 | +| bryophyte | north | 2 | 5 | 1100 | 280 | 430 | +| bryophyte | south | 2 | 5 | 390 | 280 | 160 | +| lichen | north | 2 | 5 | 1100 | 280 | 430 | +| lichen | south | 2 | 5 | 390 | 280 | 160 | +| mammal_summer | north | 2 | 5 | 2204 | 140 | 450 | +| mammal_summer | south | 2 | 5 | 690 | 140 | 200 | +| mammal_winter | north | 2 | 5 | 2222 | 140 | 450 | +| mammal_winter | south | 2 | 5 | 690 | 140 | 200 | +| mite | north | 2 | 5 | 1090 | 280 | 430 | +| mite | south | 2 | 5 | 380 | 280 | 160 | +| vascular_plant | north | 2 | 5 | 1090 | 280 | 430 | +| vascular_plant | south | 2 | 5 | 380 | 280 | 160 | ## Metrics | taxon | region | metric | n | median | p10 | p90 | | --- | --- | --- | --- | --- | --- | --- | -| bird | north | insample_auc | 200 | 0.7500 | 0.7218 | 0.7798 | -| bird | north | insample_calibration_slope | 200 | 0.7722 | 0.6665 | 0.8113 | -| bird | north | insample_deviance_explained | 200 | 0.1986 | 0.1403 | 0.2614 | -| bird | north | insample_n | 200 | 46751.0000 | 46746.9000 | 46756.1000 | -| bird | north | insample_prevalence | 200 | 0.1847 | 0.1183 | 0.2520 | -| bird | north | insample_rmse | 200 | 0.6168 | 0.5471 | 0.6665 | -| bird | north | insample_spearman | 200 | 0.3268 | 0.3129 | 0.3440 | -| bird | north | oob_auc | 200 | 0.7300 | 0.7283 | 0.7318 | -| bird | north | oob_calibration_slope | 200 | 0.7890 | 0.6073 | 0.8883 | -| bird | north | oob_deviance_explained | 200 | 0.1637 | 0.1508 | 0.1808 | -| bird | north | oob_n | 200 | 124873.0000 | 124867.9000 | 124877.1000 | -| bird | north | oob_prevalence | 200 | 0.1874 | 0.1341 | 0.2415 | -| bird | north | oob_rmse | 200 | 0.6356 | 0.5854 | 0.6588 | -| bird | north | oob_spearman | 200 | 0.3108 | 0.2728 | 0.3502 | -| bird | south | insample_auc | 200 | 0.7048 | 0.6906 | 0.7212 | -| bird | south | insample_calibration_slope | 200 | 0.8737 | 0.8625 | 0.9017 | -| bird | south | insample_deviance_explained | 200 | 0.1578 | 0.0908 | 0.2349 | -| bird | south | insample_n | 200 | 23638.0000 | 23635.0000 | 23641.0000 | -| bird | south | insample_prevalence | 200 | 0.2151 | 0.1714 | 0.2596 | -| bird | south | insample_rmse | 200 | 0.6840 | 0.6223 | 0.7470 | -| bird | south | insample_spearman | 200 | 0.2942 | 0.2895 | 0.2994 | -| bird | south | oob_auc | 200 | 0.7012 | 0.6882 | 0.7164 | -| bird | south | oob_calibration_slope | 200 | 0.8829 | 0.8479 | 0.9478 | -| bird | south | oob_deviance_explained | 200 | 0.1475 | 0.0919 | 0.2042 | -| bird | south | oob_n | 200 | 67169.0000 | 67166.0000 | 67172.0000 | -| bird | south | oob_prevalence | 200 | 0.2175 | 0.1751 | 0.2606 | -| bird | south | oob_rmse | 200 | 0.6870 | 0.6369 | 0.7370 | -| bird | south | oob_spearman | 200 | 0.2911 | 0.2888 | 0.2936 | -| bryophyte | north | insample_auc | 200 | 0.6685 | 0.6364 | 0.6965 | -| bryophyte | north | insample_calibration_slope | 200 | 0.9694 | 0.9335 | 1.0068 | -| bryophyte | north | insample_deviance_explained | 200 | 0.0680 | 0.0445 | 0.0890 | -| bryophyte | north | insample_n | 200 | 3069.0000 | 3035.0000 | 3101.0000 | -| bryophyte | north | insample_prevalence | 200 | 0.4195 | 0.3957 | 0.4466 | -| bryophyte | north | insample_rmse | 200 | 0.4715 | 0.4664 | 0.4759 | -| bryophyte | north | insample_spearman | 200 | 0.2878 | 0.2314 | 0.3383 | -| bryophyte | north | oob_auc | 198 | 0.6436 | 0.6102 | 0.6808 | -| bryophyte | north | oob_calibration_slope | 198 | 0.8419 | 0.6967 | 0.9782 | -| bryophyte | north | oob_deviance_explained | 198 | 0.0432 | 0.0209 | 0.0745 | -| bryophyte | north | oob_n | 200 | 1783.0000 | 1751.0000 | 1817.0000 | -| bryophyte | north | oob_prevalence | 198 | 0.4186 | 0.3933 | 0.4485 | -| bryophyte | north | oob_rmse | 198 | 0.4773 | 0.4707 | 0.4833 | -| bryophyte | north | oob_spearman | 198 | 0.2451 | 0.1874 | 0.3103 | -| bryophyte | north | oob_v2val_Climate | 198 | 0.6045 | 0.5460 | 0.6535 | -| bryophyte | north | oob_v2val_Climate_Truncated | 198 | 0.6045 | 0.5459 | 0.6535 | -| bryophyte | north | oob_v2val_Full | 198 | 0.6547 | 0.6113 | 0.6909 | -| bryophyte | north | oob_v2val_Full_Joint | 198 | 0.6525 | 0.6101 | 0.6885 | -| bryophyte | north | oob_v2val_Full_Joint_Truncated | 198 | 0.6534 | 0.6104 | 0.6886 | -| bryophyte | north | oob_v2val_Full_Truncated | 198 | 0.6555 | 0.6115 | 0.6910 | -| bryophyte | north | oob_v2val_Landcover | 198 | 0.5970 | 0.5707 | 0.6262 | -| bryophyte | north | v2val_Climate | 200 | 0.6069 | 0.5588 | 0.6582 | -| bryophyte | north | v2val_Climate_Truncated | 200 | 0.6069 | 0.5588 | 0.6582 | -| bryophyte | north | v2val_Full | 200 | 0.6680 | 0.6329 | 0.7027 | -| bryophyte | north | v2val_Full_Joint | 200 | 0.6660 | 0.6316 | 0.6994 | -| bryophyte | north | v2val_Full_Joint_Truncated | 200 | 0.6662 | 0.6326 | 0.6996 | -| bryophyte | north | v2val_Full_Truncated | 200 | 0.6682 | 0.6341 | 0.7028 | -| bryophyte | north | v2val_Landcover | 200 | 0.6103 | 0.5865 | 0.6342 | -| bryophyte | south | insample_auc | 200 | 0.7094 | 0.6571 | 0.7537 | -| bryophyte | south | insample_calibration_slope | 200 | 0.9613 | 0.9174 | 1.0075 | -| bryophyte | south | insample_deviance_explained | 200 | 0.0987 | 0.0544 | 0.1444 | -| bryophyte | south | insample_n | 200 | 1461.5000 | 1440.9000 | 1484.0000 | -| bryophyte | south | insample_prevalence | 200 | 0.3038 | 0.2345 | 0.3768 | -| bryophyte | south | insample_rmse | 200 | 0.4321 | 0.3912 | 0.4661 | -| bryophyte | south | insample_spearman | 200 | 0.3290 | 0.2631 | 0.3747 | -| bryophyte | south | oob_auc | 198 | 0.6867 | 0.6283 | 0.7410 | -| bryophyte | south | oob_calibration_slope | 198 | 0.8419 | 0.6738 | 0.9682 | -| bryophyte | south | oob_deviance_explained | 198 | 0.0611 | 0.0230 | 0.1224 | -| bryophyte | south | oob_n | 200 | 848.5000 | 826.0000 | 869.1000 | -| bryophyte | south | oob_prevalence | 198 | 0.3062 | 0.2295 | 0.3842 | -| bryophyte | south | oob_rmse | 198 | 0.4434 | 0.3959 | 0.4758 | -| bryophyte | south | oob_spearman | 198 | 0.2901 | 0.2154 | 0.3532 | -| bryophyte | south | oob_v2val_Climate | 198 | 0.6045 | 0.5460 | 0.6535 | -| bryophyte | south | oob_v2val_Climate_Truncated | 198 | 0.6045 | 0.5459 | 0.6535 | -| bryophyte | south | oob_v2val_Full | 198 | 0.6605 | 0.6050 | 0.7223 | -| bryophyte | south | oob_v2val_Full_Joint | 198 | 0.6613 | 0.6046 | 0.7229 | -| bryophyte | south | oob_v2val_Full_Joint_Truncated | 198 | 0.6613 | 0.6048 | 0.7229 | -| bryophyte | south | oob_v2val_Full_Truncated | 198 | 0.6605 | 0.6050 | 0.7223 | -| bryophyte | south | oob_v2val_Landcover | 198 | 0.6058 | 0.5744 | 0.6394 | -| bryophyte | south | v2val_Climate | 200 | 0.6069 | 0.5588 | 0.6582 | -| bryophyte | south | v2val_Climate_Truncated | 200 | 0.6069 | 0.5588 | 0.6582 | -| bryophyte | south | v2val_Full | 200 | 0.6758 | 0.6249 | 0.7251 | -| bryophyte | south | v2val_Full_Joint | 200 | 0.6771 | 0.6255 | 0.7263 | -| bryophyte | south | v2val_Full_Joint_Truncated | 200 | 0.6771 | 0.6256 | 0.7263 | -| bryophyte | south | v2val_Full_Truncated | 200 | 0.6759 | 0.6249 | 0.7251 | -| bryophyte | south | v2val_Landcover | 200 | 0.6182 | 0.5948 | 0.6421 | -| lichen | north | insample_auc | 200 | 0.8071 | 0.7657 | 0.8473 | -| lichen | north | insample_calibration_slope | 200 | 0.9991 | 0.9802 | 1.0132 | -| lichen | north | insample_deviance_explained | 200 | 0.2375 | 0.1849 | 0.2980 | -| lichen | north | insample_n | 200 | 3674.5000 | 3639.0000 | 3709.0000 | -| lichen | north | insample_prevalence | 200 | 0.3844 | 0.3787 | 0.3905 | -| lichen | north | insample_rmse | 200 | 0.4111 | 0.3869 | 0.4329 | -| lichen | north | insample_spearman | 200 | 0.5160 | 0.4480 | 0.5856 | -| lichen | north | oob_auc | 198 | 0.8015 | 0.7542 | 0.8424 | -| lichen | north | oob_calibration_slope | 198 | 0.9725 | 0.9251 | 1.0142 | -| lichen | north | oob_deviance_explained | 198 | 0.2240 | 0.1638 | 0.2887 | -| lichen | north | oob_n | 200 | 2136.5000 | 2102.0000 | 2172.0000 | -| lichen | north | oob_prevalence | 198 | 0.3841 | 0.3745 | 0.3945 | -| lichen | north | oob_rmse | 198 | 0.4147 | 0.3893 | 0.4382 | -| lichen | north | oob_spearman | 198 | 0.5063 | 0.4286 | 0.5763 | -| lichen | north | oob_v2val_Climate | 198 | 0.7084 | 0.6845 | 0.7263 | -| lichen | north | oob_v2val_Climate_Truncated | 198 | 0.7084 | 0.6845 | 0.7263 | -| lichen | north | oob_v2val_Full | 198 | 0.8039 | 0.7636 | 0.8410 | -| lichen | north | oob_v2val_Full_Joint | 198 | 0.8020 | 0.7631 | 0.8384 | -| lichen | north | oob_v2val_Full_Joint_Truncated | 198 | 0.8021 | 0.7631 | 0.8386 | -| lichen | north | oob_v2val_Full_Truncated | 198 | 0.8040 | 0.7638 | 0.8411 | -| lichen | north | oob_v2val_Landcover | 198 | 0.7459 | 0.6978 | 0.8174 | -| lichen | north | v2val_Climate | 200 | 0.7072 | 0.6898 | 0.7278 | -| lichen | north | v2val_Climate_Truncated | 200 | 0.7072 | 0.6898 | 0.7278 | -| lichen | north | v2val_Full | 200 | 0.8091 | 0.7720 | 0.8423 | -| lichen | north | v2val_Full_Joint | 200 | 0.8077 | 0.7715 | 0.8400 | -| lichen | north | v2val_Full_Joint_Truncated | 200 | 0.8077 | 0.7716 | 0.8402 | -| lichen | north | v2val_Full_Truncated | 200 | 0.8092 | 0.7718 | 0.8425 | -| lichen | north | v2val_Landcover | 200 | 0.7453 | 0.7048 | 0.8159 | -| lichen | south | insample_auc | 200 | 0.8375 | 0.8219 | 0.8500 | -| lichen | south | insample_calibration_slope | 200 | 0.9835 | 0.9416 | 1.0174 | -| lichen | south | insample_deviance_explained | 200 | 0.2523 | 0.2053 | 0.2864 | -| lichen | south | insample_n | 200 | 1482.5000 | 1459.0000 | 1509.0000 | -| lichen | south | insample_prevalence | 200 | 0.1501 | 0.0887 | 0.2202 | -| lichen | south | insample_rmse | 200 | 0.3089 | 0.2665 | 0.3531 | -| lichen | south | insample_spearman | 200 | 0.4132 | 0.3181 | 0.4977 | -| lichen | south | oob_auc | 198 | 0.8170 | 0.7870 | 0.8399 | -| lichen | south | oob_calibration_slope | 198 | 0.9037 | 0.7274 | 1.0417 | -| lichen | south | oob_deviance_explained | 198 | 0.2035 | 0.1335 | 0.2674 | -| lichen | south | oob_n | 200 | 863.5000 | 837.0000 | 887.0000 | -| lichen | south | oob_prevalence | 198 | 0.1503 | 0.0880 | 0.2276 | -| lichen | south | oob_rmse | 198 | 0.3184 | 0.2720 | 0.3643 | -| lichen | south | oob_spearman | 198 | 0.3848 | 0.2846 | 0.4861 | -| lichen | south | oob_v2val_Climate | 198 | 0.7084 | 0.6845 | 0.7263 | -| lichen | south | oob_v2val_Climate_Truncated | 198 | 0.7084 | 0.6845 | 0.7263 | -| lichen | south | oob_v2val_Full | 198 | 0.7929 | 0.7520 | 0.8241 | -| lichen | south | oob_v2val_Full_Joint | 198 | 0.7932 | 0.7527 | 0.8219 | -| lichen | south | oob_v2val_Full_Joint_Truncated | 198 | 0.7932 | 0.7527 | 0.8219 | -| lichen | south | oob_v2val_Full_Truncated | 198 | 0.7929 | 0.7520 | 0.8241 | -| lichen | south | oob_v2val_Landcover | 198 | 0.7499 | 0.7160 | 0.7745 | -| lichen | south | v2val_Climate | 200 | 0.7072 | 0.6898 | 0.7278 | -| lichen | south | v2val_Climate_Truncated | 200 | 0.7072 | 0.6898 | 0.7278 | -| lichen | south | v2val_Full | 200 | 0.8072 | 0.7724 | 0.8287 | -| lichen | south | v2val_Full_Joint | 200 | 0.8057 | 0.7733 | 0.8261 | -| lichen | south | v2val_Full_Joint_Truncated | 200 | 0.8057 | 0.7733 | 0.8261 | -| lichen | south | v2val_Full_Truncated | 200 | 0.8072 | 0.7724 | 0.8287 | -| lichen | south | v2val_Landcover | 200 | 0.7520 | 0.7339 | 0.7705 | -| mammal_summer | north | insample_auc | 200 | 0.7195 | 0.6076 | 0.8295 | -| mammal_summer | north | insample_calibration_slope | 200 | 0.9415 | 0.7950 | 0.9994 | -| mammal_summer | north | insample_deviance_explained | 200 | 0.1457 | 0.0267 | 0.2897 | -| mammal_summer | north | insample_n | 200 | 2563.5000 | 2538.0000 | 2587.0000 | -| mammal_summer | north | insample_prevalence | 200 | 0.2733 | 0.2209 | 0.3269 | -| mammal_summer | north | insample_rmse | 200 | 0.3850 | 0.3230 | 0.4431 | -| mammal_summer | north | insample_spearman | 200 | 0.3181 | 0.1570 | 0.4710 | -| mammal_summer | north | oob_auc | 198 | 0.7008 | 0.5803 | 0.8199 | -| mammal_summer | north | oob_calibration_slope | 198 | 0.8458 | 0.5527 | 0.9867 | -| mammal_summer | north | oob_deviance_explained | 198 | 0.0563 | 0.0013 | 0.2662 | -| mammal_summer | north | oob_n | 200 | 1489.5000 | 1466.0000 | 1515.0000 | -| mammal_summer | north | oob_prevalence | 198 | 0.2735 | 0.2193 | 0.3287 | -| mammal_summer | north | oob_rmse | 198 | 0.3917 | 0.3259 | 0.4480 | -| mammal_summer | north | oob_spearman | 198 | 0.2890 | 0.1134 | 0.4545 | -| mammal_summer | south | insample_auc | 199 | 0.7546 | 0.6196 | 0.7995 | -| mammal_summer | south | insample_calibration_slope | 199 | 0.9613 | 0.8460 | 1.0524 | -| mammal_summer | south | insample_deviance_explained | 199 | 0.1647 | 0.0214 | 0.2324 | -| mammal_summer | south | insample_n | 199 | 674.0000 | 662.0000 | 689.0000 | -| mammal_summer | south | insample_prevalence | 199 | 0.2069 | 0.1750 | 0.6994 | -| mammal_summer | south | insample_rmse | 199 | 0.3563 | 0.3391 | 0.4250 | -| mammal_summer | south | insample_spearman | 199 | 0.3342 | 0.1592 | 0.3998 | -| mammal_summer | south | oob_auc | 197 | 0.7154 | 0.5675 | 0.7903 | -| mammal_summer | south | oob_calibration_slope | 197 | 0.7382 | 0.3358 | 1.0724 | -| mammal_summer | south | oob_deviance_explained | 197 | 0.0147 | -0.0349 | 0.2068 | -| mammal_summer | south | oob_n | 199 | 391.0000 | 376.0000 | 403.0000 | -| mammal_summer | south | oob_prevalence | 197 | 0.2300 | 0.1685 | 0.7076 | -| mammal_summer | south | oob_rmse | 197 | 0.3897 | 0.3411 | 0.4384 | -| mammal_summer | south | oob_spearman | 197 | 0.2707 | 0.0727 | 0.3889 | -| mammal_winter | north | insample_auc | 200 | 0.7665 | 0.6675 | 0.8446 | -| mammal_winter | north | insample_calibration_slope | 200 | 0.9541 | 0.8712 | 1.0110 | -| mammal_winter | north | insample_deviance_explained | 200 | 0.1900 | 0.0702 | 0.3056 | -| mammal_winter | north | insample_n | 200 | 2609.5000 | 2585.0000 | 2640.1000 | -| mammal_winter | north | insample_prevalence | 200 | 0.1764 | 0.1455 | 0.2061 | -| mammal_winter | north | insample_rmse | 200 | 0.3161 | 0.2973 | 0.3353 | -| mammal_winter | north | insample_spearman | 200 | 0.3518 | 0.2111 | 0.4734 | -| mammal_winter | north | oob_auc | 198 | 0.7540 | 0.6364 | 0.8417 | -| mammal_winter | north | oob_calibration_slope | 198 | 0.8826 | 0.6191 | 1.0325 | -| mammal_winter | north | oob_deviance_explained | 198 | 0.0839 | 0.0080 | 0.2921 | -| mammal_winter | north | oob_n | 200 | 1517.5000 | 1486.9000 | 1542.0000 | -| mammal_winter | north | oob_prevalence | 198 | 0.1742 | 0.1426 | 0.2060 | -| mammal_winter | north | oob_rmse | 198 | 0.3199 | 0.2972 | 0.3413 | -| mammal_winter | north | oob_spearman | 198 | 0.3263 | 0.1702 | 0.4645 | -| mammal_winter | south | insample_auc | 200 | 0.7315 | 0.6779 | 0.8331 | -| mammal_winter | south | insample_calibration_slope | 200 | 0.9493 | 0.8167 | 1.0904 | -| mammal_winter | south | insample_deviance_explained | 200 | 0.1130 | 0.0574 | 0.2652 | -| mammal_winter | south | insample_n | 200 | 695.0000 | 682.0000 | 709.0000 | -| mammal_winter | south | insample_prevalence | 200 | 0.3351 | 0.0822 | 0.6144 | -| mammal_winter | south | insample_rmse | 200 | 0.3196 | 0.2155 | 0.4099 | -| mammal_winter | south | insample_spearman | 200 | 0.3081 | 0.2774 | 0.3331 | -| mammal_winter | south | oob_auc | 198 | 0.7123 | 0.6520 | 0.8075 | -| mammal_winter | south | oob_calibration_slope | 198 | 0.7412 | 0.4709 | 1.0531 | -| mammal_winter | south | oob_deviance_explained | 198 | 0.0619 | 0.0061 | 0.1945 | -| mammal_winter | south | oob_n | 200 | 403.0000 | 389.0000 | 416.0000 | -| mammal_winter | south | oob_prevalence | 198 | 0.3423 | 0.0803 | 0.6235 | -| mammal_winter | south | oob_rmse | 198 | 0.3325 | 0.2222 | 0.4211 | -| mammal_winter | south | oob_spearman | 198 | 0.2687 | 0.2234 | 0.3096 | -| mite | north | insample_auc | 200 | 0.7521 | 0.6888 | 0.8020 | -| mite | north | insample_calibration_slope | 200 | 0.9863 | 0.9206 | 1.0220 | -| mite | north | insample_deviance_explained | 200 | 0.1291 | 0.0625 | 0.1988 | -| mite | north | insample_n | 200 | 3611.0000 | 3575.8000 | 3648.1000 | -| mite | north | insample_prevalence | 200 | 0.1491 | 0.0931 | 0.2122 | -| mite | north | insample_rmse | 200 | 0.3243 | 0.2837 | 0.3643 | -| mite | north | insample_spearman | 200 | 0.3111 | 0.1924 | 0.4248 | -| mite | north | oob_auc | 198 | 0.7259 | 0.6442 | 0.7940 | -| mite | north | oob_calibration_slope | 198 | 0.9046 | 0.6725 | 1.0204 | -| mite | north | oob_deviance_explained | 198 | 0.0943 | 0.0131 | 0.1858 | -| mite | north | oob_n | 200 | 2100.0000 | 2062.9000 | 2135.2000 | -| mite | north | oob_prevalence | 198 | 0.1509 | 0.0922 | 0.2141 | -| mite | north | oob_rmse | 198 | 0.3327 | 0.2860 | 0.3702 | -| mite | north | oob_spearman | 198 | 0.2796 | 0.1476 | 0.4139 | -| mite | north | oob_v2val_Climate | 198 | 0.6902 | 0.6270 | 0.7420 | -| mite | north | oob_v2val_Climate_Truncated | 198 | 0.6902 | 0.6270 | 0.7420 | -| mite | north | oob_v2val_Full | 198 | 0.7251 | 0.6397 | 0.7915 | -| mite | north | oob_v2val_Full_Joint | 198 | 0.7243 | 0.6393 | 0.7914 | -| mite | north | oob_v2val_Full_Joint_Truncated | 198 | 0.7243 | 0.6394 | 0.7914 | -| mite | north | oob_v2val_Full_Truncated | 198 | 0.7251 | 0.6398 | 0.7913 | -| mite | north | oob_v2val_Landcover | 198 | 0.6958 | 0.5964 | 0.7674 | -| mite | north | v2val_Climate | 200 | 0.6938 | 0.6397 | 0.7436 | -| mite | north | v2val_Climate_Truncated | 200 | 0.6938 | 0.6396 | 0.7436 | -| mite | north | v2val_Full | 200 | 0.7415 | 0.6711 | 0.7964 | -| mite | north | v2val_Full_Joint | 200 | 0.7411 | 0.6708 | 0.7961 | -| mite | north | v2val_Full_Joint_Truncated | 200 | 0.7411 | 0.6708 | 0.7961 | -| mite | north | v2val_Full_Truncated | 200 | 0.7414 | 0.6710 | 0.7964 | -| mite | north | v2val_Landcover | 200 | 0.7117 | 0.6394 | 0.7723 | -| mite | south | insample_auc | 200 | 0.8147 | 0.7113 | 0.9040 | -| mite | south | insample_calibration_slope | 200 | 0.9928 | 0.9285 | 1.0911 | -| mite | south | insample_deviance_explained | 200 | 0.2006 | 0.0826 | 0.3433 | -| mite | south | insample_n | 200 | 1492.5000 | 1471.0000 | 1516.1000 | -| mite | south | insample_prevalence | 200 | 0.0681 | 0.0529 | 0.0865 | -| mite | south | insample_rmse | 200 | 0.2315 | 0.1931 | 0.2731 | -| mite | south | insample_spearman | 200 | 0.2713 | 0.2030 | 0.3223 | -| mite | south | oob_auc | 198 | 0.7550 | 0.6586 | 0.8840 | -| mite | south | oob_calibration_slope | 198 | 0.8287 | 0.5660 | 1.0766 | -| mite | south | oob_deviance_explained | 198 | 0.0874 | -0.0174 | 0.2927 | -| mite | south | oob_n | 200 | 870.5000 | 846.9000 | 892.0000 | -| mite | south | oob_prevalence | 198 | 0.0680 | 0.0520 | 0.0901 | -| mite | south | oob_rmse | 198 | 0.2352 | 0.2013 | 0.2827 | -| mite | south | oob_spearman | 198 | 0.2294 | 0.1535 | 0.3140 | -| mite | south | oob_v2val_Climate | 198 | 0.6902 | 0.6270 | 0.7420 | -| mite | south | oob_v2val_Climate_Truncated | 198 | 0.6902 | 0.6270 | 0.7420 | -| mite | south | oob_v2val_Full | 198 | 0.7758 | 0.6618 | 0.8935 | -| mite | south | oob_v2val_Full_Joint | 198 | 0.7761 | 0.6619 | 0.8938 | -| mite | south | oob_v2val_Full_Joint_Truncated | 198 | 0.7761 | 0.6619 | 0.8938 | -| mite | south | oob_v2val_Full_Truncated | 198 | 0.7758 | 0.6618 | 0.8935 | -| mite | south | oob_v2val_Landcover | 198 | 0.6739 | 0.6215 | 0.7295 | -| mite | south | v2val_Climate | 200 | 0.6938 | 0.6397 | 0.7436 | -| mite | south | v2val_Climate_Truncated | 200 | 0.6938 | 0.6396 | 0.7436 | -| mite | south | v2val_Full | 200 | 0.7987 | 0.6949 | 0.8911 | -| mite | south | v2val_Full_Joint | 200 | 0.7990 | 0.6953 | 0.8919 | -| mite | south | v2val_Full_Joint_Truncated | 200 | 0.7990 | 0.6953 | 0.8919 | -| mite | south | v2val_Full_Truncated | 200 | 0.7987 | 0.6949 | 0.8911 | -| mite | south | v2val_Landcover | 200 | 0.6921 | 0.6525 | 0.7356 | -| vascular_plant | north | insample_auc | 200 | 0.8356 | 0.8299 | 0.8404 | -| vascular_plant | north | insample_calibration_slope | 200 | 0.9970 | 0.9837 | 1.0096 | -| vascular_plant | north | insample_deviance_explained | 200 | 0.2724 | 0.2607 | 0.2811 | -| vascular_plant | north | insample_n | 200 | 4350.0000 | 4321.9000 | 4383.0000 | -| vascular_plant | north | insample_prevalence | 200 | 0.3962 | 0.3735 | 0.4214 | -| vascular_plant | north | insample_rmse | 200 | 0.4002 | 0.3947 | 0.4053 | -| vascular_plant | north | insample_spearman | 200 | 0.5681 | 0.5585 | 0.5769 | -| vascular_plant | north | oob_auc | 198 | 0.8287 | 0.8197 | 0.8384 | -| vascular_plant | north | oob_calibration_slope | 198 | 0.9723 | 0.9325 | 1.0229 | -| vascular_plant | north | oob_deviance_explained | 198 | 0.2570 | 0.2396 | 0.2763 | -| vascular_plant | north | oob_n | 200 | 2524.0000 | 2491.0000 | 2552.1000 | -| vascular_plant | north | oob_prevalence | 198 | 0.3937 | 0.3713 | 0.4251 | -| vascular_plant | north | oob_rmse | 198 | 0.4041 | 0.3966 | 0.4130 | -| vascular_plant | north | oob_spearman | 198 | 0.5568 | 0.5420 | 0.5734 | -| vascular_plant | north | oob_v2val_Climate | 198 | 0.6889 | 0.6788 | 0.6980 | -| vascular_plant | north | oob_v2val_Climate_Truncated | 198 | 0.6890 | 0.6788 | 0.6980 | -| vascular_plant | north | oob_v2val_Full | 198 | 0.8282 | 0.8186 | 0.8382 | -| vascular_plant | north | oob_v2val_Full_Joint | 198 | 0.8270 | 0.8155 | 0.8373 | -| vascular_plant | north | oob_v2val_Full_Joint_Truncated | 198 | 0.8272 | 0.8157 | 0.8374 | -| vascular_plant | north | oob_v2val_Full_Truncated | 198 | 0.8282 | 0.8187 | 0.8384 | -| vascular_plant | north | oob_v2val_Landcover | 198 | 0.8033 | 0.7927 | 0.8137 | -| vascular_plant | north | v2val_Climate | 200 | 0.6903 | 0.6846 | 0.6956 | -| vascular_plant | north | v2val_Climate_Truncated | 200 | 0.6903 | 0.6846 | 0.6956 | -| vascular_plant | north | v2val_Full | 200 | 0.8328 | 0.8275 | 0.8378 | -| vascular_plant | north | v2val_Full_Joint | 200 | 0.8314 | 0.8249 | 0.8370 | -| vascular_plant | north | v2val_Full_Joint_Truncated | 200 | 0.8315 | 0.8250 | 0.8370 | -| vascular_plant | north | v2val_Full_Truncated | 200 | 0.8329 | 0.8276 | 0.8377 | -| vascular_plant | north | v2val_Landcover | 200 | 0.8077 | 0.8018 | 0.8141 | -| vascular_plant | south | insample_auc | 200 | 0.8620 | 0.8175 | 0.9066 | -| vascular_plant | south | insample_calibration_slope | 200 | 1.0058 | 0.9832 | 1.0274 | -| vascular_plant | south | insample_deviance_explained | 200 | 0.3234 | 0.2372 | 0.4314 | -| vascular_plant | south | insample_n | 200 | 1674.0000 | 1652.0000 | 1698.1000 | -| vascular_plant | south | insample_prevalence | 200 | 0.2431 | 0.2173 | 0.2692 | -| vascular_plant | south | insample_rmse | 200 | 0.3415 | 0.3018 | 0.3767 | -| vascular_plant | south | insample_spearman | 200 | 0.5349 | 0.4834 | 0.5862 | -| vascular_plant | south | oob_auc | 198 | 0.8543 | 0.8031 | 0.9038 | -| vascular_plant | south | oob_calibration_slope | 198 | 0.9737 | 0.8996 | 1.0404 | -| vascular_plant | south | oob_deviance_explained | 198 | 0.2934 | 0.2049 | 0.4160 | -| vascular_plant | south | oob_n | 200 | 974.0000 | 949.9000 | 996.0000 | -| vascular_plant | south | oob_prevalence | 198 | 0.2453 | 0.2136 | 0.2763 | -| vascular_plant | south | oob_rmse | 198 | 0.3498 | 0.3057 | 0.3852 | -| vascular_plant | south | oob_spearman | 198 | 0.5226 | 0.4606 | 0.5816 | -| vascular_plant | south | oob_v2val_Climate | 198 | 0.6889 | 0.6788 | 0.6980 | -| vascular_plant | south | oob_v2val_Climate_Truncated | 198 | 0.6890 | 0.6788 | 0.6980 | -| vascular_plant | south | oob_v2val_Full | 198 | 0.8408 | 0.7938 | 0.8962 | -| vascular_plant | south | oob_v2val_Full_Joint | 198 | 0.8371 | 0.7904 | 0.8903 | -| vascular_plant | south | oob_v2val_Full_Joint_Truncated | 198 | 0.8371 | 0.7904 | 0.8903 | -| vascular_plant | south | oob_v2val_Full_Truncated | 198 | 0.8408 | 0.7938 | 0.8962 | -| vascular_plant | south | oob_v2val_Landcover | 198 | 0.7754 | 0.7521 | 0.8003 | -| vascular_plant | south | v2val_Climate | 200 | 0.6903 | 0.6846 | 0.6956 | -| vascular_plant | south | v2val_Climate_Truncated | 200 | 0.6903 | 0.6846 | 0.6956 | -| vascular_plant | south | v2val_Full | 200 | 0.8496 | 0.8025 | 0.8978 | -| vascular_plant | south | v2val_Full_Joint | 200 | 0.8441 | 0.8002 | 0.8908 | -| vascular_plant | south | v2val_Full_Joint_Truncated | 200 | 0.8441 | 0.8001 | 0.8908 | -| vascular_plant | south | v2val_Full_Truncated | 200 | 0.8496 | 0.8025 | 0.8978 | -| vascular_plant | south | v2val_Landcover | 200 | 0.7822 | 0.7595 | 0.8038 | +| bird | north | insample_auc | 10 | 0.7522 | 0.7235 | 0.7796 | +| bird | north | insample_calibration_slope | 10 | 0.7559 | 0.6982 | 0.8102 | +| bird | north | insample_deviance_explained | 10 | 0.1996 | 0.1409 | 0.2605 | +| bird | north | insample_n | 10 | 46747.0000 | 46744.0000 | 46750.0000 | +| bird | north | insample_prevalence | 10 | 0.1851 | 0.1178 | 0.2520 | +| bird | north | insample_rmse | 10 | 0.6070 | 0.5467 | 0.6643 | +| bird | north | insample_spearman | 10 | 0.3277 | 0.3148 | 0.3446 | +| bird | north | oob_auc | 10 | 0.7299 | 0.7284 | 0.7308 | +| bird | north | oob_calibration_slope | 10 | 0.7875 | 0.6454 | 0.8810 | +| bird | north | oob_deviance_explained | 10 | 0.1647 | 0.1509 | 0.1821 | +| bird | north | oob_n | 10 | 124877.0000 | 124874.0000 | 124880.0000 | +| bird | north | oob_prevalence | 10 | 0.1877 | 0.1343 | 0.2411 | +| bird | north | oob_rmse | 10 | 0.6250 | 0.5831 | 0.6583 | +| bird | north | oob_spearman | 10 | 0.3117 | 0.2736 | 0.3483 | +| bird | south | insample_auc | 10 | 0.7052 | 0.6892 | 0.7215 | +| bird | south | insample_calibration_slope | 10 | 0.8775 | 0.8649 | 0.8901 | +| bird | south | insample_deviance_explained | 10 | 0.1561 | 0.0911 | 0.2337 | +| bird | south | insample_n | 10 | 23639.0000 | 23636.0000 | 23640.0000 | +| bird | south | insample_prevalence | 10 | 0.2142 | 0.1711 | 0.2590 | +| bird | south | insample_rmse | 10 | 0.6840 | 0.6232 | 0.7452 | +| bird | south | insample_spearman | 10 | 0.2943 | 0.2880 | 0.2978 | +| bird | south | oob_auc | 10 | 0.7013 | 0.6892 | 0.7156 | +| bird | south | oob_calibration_slope | 10 | 0.9220 | 0.8622 | 0.9549 | +| bird | south | oob_deviance_explained | 10 | 0.1483 | 0.0969 | 0.2066 | +| bird | south | oob_n | 10 | 67168.0000 | 67167.0000 | 67171.0000 | +| bird | south | oob_prevalence | 10 | 0.2178 | 0.1757 | 0.2603 | +| bird | south | oob_rmse | 10 | 0.6869 | 0.6369 | 0.7359 | +| bird | south | oob_spearman | 10 | 0.2916 | 0.2888 | 0.2927 | +| bryophyte | north | insample_auc | 10 | 0.6642 | 0.6314 | 0.7085 | +| bryophyte | north | insample_calibration_slope | 10 | 0.8499 | 0.7585 | 0.8973 | +| bryophyte | north | insample_deviance_explained | 10 | -0.1896 | -0.2902 | -0.0937 | +| bryophyte | north | insample_n | 10 | 3091.0000 | 3041.1000 | 4852.0000 | +| bryophyte | north | insample_prevalence | 10 | 0.4175 | 0.3976 | 0.4423 | +| bryophyte | north | insample_rmse | 10 | 0.4736 | 0.4634 | 0.4802 | +| bryophyte | north | insample_spearman | 10 | 0.2805 | 0.2228 | 0.3578 | +| bryophyte | north | oob_auc | 8 | 0.6562 | 0.6254 | 0.6808 | +| bryophyte | north | oob_calibration_slope | 8 | 0.7707 | 0.6959 | 0.8841 | +| bryophyte | north | oob_deviance_explained | 8 | -0.1858 | -0.2157 | -0.1326 | +| bryophyte | north | oob_n | 10 | 1761.0000 | 0.0000 | 1810.9000 | +| bryophyte | north | oob_prevalence | 8 | 0.4201 | 0.4007 | 0.4503 | +| bryophyte | north | oob_rmse | 8 | 0.4801 | 0.4711 | 0.4829 | +| bryophyte | north | oob_spearman | 8 | 0.2675 | 0.2128 | 0.3105 | +| bryophyte | north | oob_v2val_Climate | 8 | 0.6045 | 0.5487 | 0.6482 | +| bryophyte | north | oob_v2val_Climate_Truncated | 8 | 0.6045 | 0.5486 | 0.6482 | +| bryophyte | north | oob_v2val_Full | 8 | 0.6562 | 0.6254 | 0.6808 | +| bryophyte | north | oob_v2val_Full_Joint | 8 | 0.6538 | 0.6242 | 0.6786 | +| bryophyte | north | oob_v2val_Full_Joint_Truncated | 8 | 0.6546 | 0.6248 | 0.6788 | +| bryophyte | north | oob_v2val_Full_Truncated | 8 | 0.6571 | 0.6259 | 0.6811 | +| bryophyte | north | oob_v2val_Landcover | 8 | 0.5971 | 0.5798 | 0.6148 | +| bryophyte | north | v2val_Climate | 10 | 0.6069 | 0.5555 | 0.6643 | +| bryophyte | north | v2val_Climate_Truncated | 10 | 0.6069 | 0.5555 | 0.6643 | +| bryophyte | north | v2val_Full | 10 | 0.6642 | 0.6314 | 0.7085 | +| bryophyte | north | v2val_Full_Joint | 10 | 0.6615 | 0.6293 | 0.7047 | +| bryophyte | north | v2val_Full_Joint_Truncated | 10 | 0.6621 | 0.6299 | 0.7052 | +| bryophyte | north | v2val_Full_Truncated | 10 | 0.6647 | 0.6320 | 0.7089 | +| bryophyte | north | v2val_Landcover | 10 | 0.6082 | 0.5829 | 0.6350 | +| bryophyte | south | insample_auc | 10 | 0.6741 | 0.6221 | 0.7221 | +| bryophyte | south | insample_calibration_slope | 10 | 0.8833 | 0.8604 | 0.9293 | +| bryophyte | south | insample_deviance_explained | 10 | -0.0076 | -0.1062 | 0.0587 | +| bryophyte | south | insample_n | 10 | 1454.5000 | 1440.8000 | 2310.0000 | +| bryophyte | south | insample_prevalence | 10 | 0.3052 | 0.2352 | 0.3713 | +| bryophyte | south | insample_rmse | 10 | 0.4407 | 0.3994 | 0.4751 | +| bryophyte | south | insample_spearman | 10 | 0.2678 | 0.2042 | 0.3271 | +| bryophyte | south | oob_auc | 8 | 0.6737 | 0.6156 | 0.7162 | +| bryophyte | south | oob_calibration_slope | 8 | 0.8626 | 0.7944 | 0.9233 | +| bryophyte | south | oob_deviance_explained | 8 | 0.0177 | -0.0430 | 0.0521 | +| bryophyte | south | oob_n | 10 | 855.5000 | 0.0000 | 869.2000 | +| bryophyte | south | oob_prevalence | 8 | 0.3139 | 0.2297 | 0.3751 | +| bryophyte | south | oob_rmse | 8 | 0.4447 | 0.3999 | 0.4766 | +| bryophyte | south | oob_spearman | 8 | 0.2693 | 0.1933 | 0.3245 | +| bryophyte | south | oob_v2val_Climate | 8 | 0.6045 | 0.5487 | 0.6482 | +| bryophyte | south | oob_v2val_Climate_Truncated | 8 | 0.6045 | 0.5486 | 0.6482 | +| bryophyte | south | oob_v2val_Full | 8 | 0.6737 | 0.6156 | 0.7162 | +| bryophyte | south | oob_v2val_Full_Joint | 8 | 0.6754 | 0.6148 | 0.7178 | +| bryophyte | south | oob_v2val_Full_Joint_Truncated | 8 | 0.6754 | 0.6148 | 0.7178 | +| bryophyte | south | oob_v2val_Full_Truncated | 8 | 0.6737 | 0.6156 | 0.7162 | +| bryophyte | south | oob_v2val_Landcover | 8 | 0.6029 | 0.5970 | 0.6332 | +| bryophyte | south | v2val_Climate | 10 | 0.6069 | 0.5555 | 0.6643 | +| bryophyte | south | v2val_Climate_Truncated | 10 | 0.6069 | 0.5555 | 0.6643 | +| bryophyte | south | v2val_Full | 10 | 0.6741 | 0.6221 | 0.7221 | +| bryophyte | south | v2val_Full_Joint | 10 | 0.6743 | 0.6214 | 0.7227 | +| bryophyte | south | v2val_Full_Joint_Truncated | 10 | 0.6743 | 0.6215 | 0.7227 | +| bryophyte | south | v2val_Full_Truncated | 10 | 0.6741 | 0.6221 | 0.7221 | +| bryophyte | south | v2val_Landcover | 10 | 0.6137 | 0.5905 | 0.6386 | +| lichen | north | insample_auc | 10 | 0.8074 | 0.7781 | 0.8388 | +| lichen | north | insample_calibration_slope | 10 | 1.0001 | 0.9745 | 1.0269 | +| lichen | north | insample_deviance_explained | 10 | 0.1360 | 0.1091 | 0.1649 | +| lichen | north | insample_n | 10 | 3692.0000 | 3654.0000 | 5811.0000 | +| lichen | north | insample_prevalence | 10 | 0.3839 | 0.3815 | 0.3891 | +| lichen | north | insample_rmse | 10 | 0.4112 | 0.3929 | 0.4298 | +| lichen | north | insample_spearman | 10 | 0.5176 | 0.4685 | 0.5707 | +| lichen | north | oob_auc | 8 | 0.7997 | 0.7622 | 0.8453 | +| lichen | north | oob_calibration_slope | 8 | 0.9794 | 0.9485 | 1.0076 | +| lichen | north | oob_deviance_explained | 8 | 0.1271 | 0.0891 | 0.1748 | +| lichen | north | oob_n | 10 | 2119.0000 | 0.0000 | 2157.0000 | +| lichen | north | oob_prevalence | 8 | 0.3864 | 0.3761 | 0.3921 | +| lichen | north | oob_rmse | 8 | 0.4171 | 0.3889 | 0.4363 | +| lichen | north | oob_spearman | 8 | 0.5059 | 0.4420 | 0.5824 | +| lichen | north | oob_v2val_Climate | 8 | 0.7041 | 0.6878 | 0.7158 | +| lichen | north | oob_v2val_Climate_Truncated | 8 | 0.7041 | 0.6878 | 0.7158 | +| lichen | north | oob_v2val_Full | 8 | 0.7997 | 0.7622 | 0.8453 | +| lichen | north | oob_v2val_Full_Joint | 8 | 0.7969 | 0.7616 | 0.8417 | +| lichen | north | oob_v2val_Full_Joint_Truncated | 8 | 0.7969 | 0.7615 | 0.8418 | +| lichen | north | oob_v2val_Full_Truncated | 8 | 0.7997 | 0.7624 | 0.8453 | +| lichen | north | oob_v2val_Landcover | 8 | 0.7481 | 0.6957 | 0.8186 | +| lichen | north | v2val_Climate | 10 | 0.7093 | 0.6916 | 0.7289 | +| lichen | north | v2val_Climate_Truncated | 10 | 0.7093 | 0.6916 | 0.7290 | +| lichen | north | v2val_Full | 10 | 0.8074 | 0.7781 | 0.8388 | +| lichen | north | v2val_Full_Joint | 10 | 0.8057 | 0.7771 | 0.8370 | +| lichen | north | v2val_Full_Joint_Truncated | 10 | 0.8057 | 0.7770 | 0.8372 | +| lichen | north | v2val_Full_Truncated | 10 | 0.8074 | 0.7780 | 0.8390 | +| lichen | north | v2val_Landcover | 10 | 0.7424 | 0.7115 | 0.8121 | +| lichen | south | insample_auc | 10 | 0.8021 | 0.7789 | 0.8223 | +| lichen | south | insample_calibration_slope | 10 | 0.9035 | 0.8740 | 1.0439 | +| lichen | south | insample_deviance_explained | 10 | 0.1705 | 0.0924 | 0.2412 | +| lichen | south | insample_n | 10 | 1484.5000 | 1478.5000 | 2346.0000 | +| lichen | south | insample_prevalence | 10 | 0.1511 | 0.0868 | 0.2167 | +| lichen | south | insample_rmse | 10 | 0.3163 | 0.2688 | 0.3582 | +| lichen | south | insample_spearman | 10 | 0.3667 | 0.2735 | 0.4597 | +| lichen | south | oob_auc | 8 | 0.7976 | 0.7632 | 0.8185 | +| lichen | south | oob_calibration_slope | 8 | 0.9438 | 0.7927 | 1.1880 | +| lichen | south | oob_deviance_explained | 8 | 0.1218 | -0.0135 | 0.2395 | +| lichen | south | oob_n | 10 | 861.5000 | 0.0000 | 867.5000 | +| lichen | south | oob_prevalence | 8 | 0.1578 | 0.0943 | 0.2207 | +| lichen | south | oob_rmse | 8 | 0.3261 | 0.2806 | 0.3630 | +| lichen | south | oob_spearman | 8 | 0.3688 | 0.2665 | 0.4581 | +| lichen | south | oob_v2val_Climate | 8 | 0.7041 | 0.6878 | 0.7158 | +| lichen | south | oob_v2val_Climate_Truncated | 8 | 0.7041 | 0.6878 | 0.7158 | +| lichen | south | oob_v2val_Full | 8 | 0.7976 | 0.7632 | 0.8185 | +| lichen | south | oob_v2val_Full_Joint | 8 | 0.7958 | 0.7656 | 0.8153 | +| lichen | south | oob_v2val_Full_Joint_Truncated | 8 | 0.7958 | 0.7656 | 0.8153 | +| lichen | south | oob_v2val_Full_Truncated | 8 | 0.7976 | 0.7632 | 0.8185 | +| lichen | south | oob_v2val_Landcover | 8 | 0.7535 | 0.7464 | 0.7630 | +| lichen | south | v2val_Climate | 10 | 0.7093 | 0.6916 | 0.7289 | +| lichen | south | v2val_Climate_Truncated | 10 | 0.7093 | 0.6916 | 0.7290 | +| lichen | south | v2val_Full | 10 | 0.8021 | 0.7789 | 0.8223 | +| lichen | south | v2val_Full_Joint | 10 | 0.8018 | 0.7799 | 0.8189 | +| lichen | south | v2val_Full_Joint_Truncated | 10 | 0.8018 | 0.7799 | 0.8189 | +| lichen | south | v2val_Full_Truncated | 10 | 0.8021 | 0.7789 | 0.8223 | +| lichen | south | v2val_Landcover | 10 | 0.7535 | 0.7435 | 0.7653 | +| mammal_summer | north | insample_auc | 10 | 0.7207 | 0.6085 | 0.8216 | +| mammal_summer | north | insample_calibration_slope | 10 | 0.9417 | 0.8161 | 1.0198 | +| mammal_summer | north | insample_deviance_explained | 10 | 0.1542 | 0.0268 | 0.2763 | +| mammal_summer | north | insample_n | 10 | 2587.5000 | 2542.1000 | 4053.0000 | +| mammal_summer | north | insample_prevalence | 10 | 0.2736 | 0.2243 | 0.3206 | +| mammal_summer | north | insample_rmse | 10 | 0.3836 | 0.3234 | 0.4410 | +| mammal_summer | north | insample_spearman | 10 | 0.3160 | 0.1627 | 0.4610 | +| mammal_summer | north | oob_auc | 8 | 0.7007 | 0.5879 | 0.8116 | +| mammal_summer | north | oob_calibration_slope | 8 | 0.8971 | 0.7046 | 0.9590 | +| mammal_summer | north | oob_deviance_explained | 8 | 0.1194 | 0.0155 | 0.2466 | +| mammal_summer | north | oob_n | 10 | 1465.5000 | 0.0000 | 1510.9000 | +| mammal_summer | north | oob_prevalence | 8 | 0.2774 | 0.2208 | 0.3261 | +| mammal_summer | north | oob_rmse | 8 | 0.3919 | 0.3312 | 0.4445 | +| mammal_summer | north | oob_spearman | 8 | 0.2911 | 0.1268 | 0.4415 | +| mammal_summer | south | insample_auc | 10 | 0.7054 | 0.6336 | 0.8030 | +| mammal_summer | south | insample_calibration_slope | 10 | 0.9832 | 0.8710 | 1.0087 | +| mammal_summer | south | insample_deviance_explained | 10 | 0.1016 | 0.0257 | 0.2383 | +| mammal_summer | south | insample_n | 10 | 676.5000 | 670.8000 | 1065.0000 | +| mammal_summer | south | insample_prevalence | 10 | 0.4451 | 0.1814 | 0.7098 | +| mammal_summer | south | insample_rmse | 10 | 0.3814 | 0.3405 | 0.4191 | +| mammal_summer | south | insample_spearman | 10 | 0.2798 | 0.1705 | 0.4148 | +| mammal_summer | south | oob_auc | 8 | 0.6568 | 0.5888 | 0.7557 | +| mammal_summer | south | oob_calibration_slope | 8 | 0.6589 | 0.4354 | 1.0000 | +| mammal_summer | south | oob_deviance_explained | 8 | 0.0059 | -0.0790 | 0.1356 | +| mammal_summer | south | oob_n | 10 | 388.5000 | 0.0000 | 394.2000 | +| mammal_summer | south | oob_prevalence | 8 | 0.4195 | 0.1726 | 0.6930 | +| mammal_summer | south | oob_rmse | 8 | 0.3986 | 0.3422 | 0.4425 | +| mammal_summer | south | oob_spearman | 8 | 0.2181 | 0.1135 | 0.3243 | +| mammal_winter | north | insample_auc | 10 | 0.7608 | 0.6687 | 0.8445 | +| mammal_winter | north | insample_calibration_slope | 10 | 0.9604 | 0.9077 | 1.0052 | +| mammal_winter | north | insample_deviance_explained | 10 | 0.1877 | 0.0712 | 0.3014 | +| mammal_winter | north | insample_n | 10 | 2624.5000 | 2596.8000 | 4127.0000 | +| mammal_winter | north | insample_prevalence | 10 | 0.1752 | 0.1467 | 0.2040 | +| mammal_winter | north | insample_rmse | 10 | 0.3149 | 0.2994 | 0.3346 | +| mammal_winter | north | insample_spearman | 10 | 0.3463 | 0.2134 | 0.4714 | +| mammal_winter | north | oob_auc | 8 | 0.7383 | 0.6458 | 0.8353 | +| mammal_winter | north | oob_calibration_slope | 8 | 0.8540 | 0.6612 | 0.9533 | +| mammal_winter | north | oob_deviance_explained | 8 | 0.1614 | 0.0413 | 0.2853 | +| mammal_winter | north | oob_n | 10 | 1502.5000 | 0.0000 | 1530.2000 | +| mammal_winter | north | oob_prevalence | 8 | 0.1756 | 0.1450 | 0.2025 | +| mammal_winter | north | oob_rmse | 8 | 0.3180 | 0.3015 | 0.3423 | +| mammal_winter | north | oob_spearman | 8 | 0.3198 | 0.1800 | 0.4528 | +| mammal_winter | south | insample_auc | 10 | 0.7642 | 0.6906 | 0.8292 | +| mammal_winter | south | insample_calibration_slope | 10 | 0.9542 | 0.8588 | 1.0389 | +| mammal_winter | south | insample_deviance_explained | 10 | 0.1574 | 0.0675 | 0.2501 | +| mammal_winter | south | insample_n | 10 | 694.0000 | 684.8000 | 1098.0000 | +| mammal_winter | south | insample_prevalence | 10 | 0.3450 | 0.0865 | 0.6052 | +| mammal_winter | south | insample_rmse | 10 | 0.3145 | 0.2215 | 0.4071 | +| mammal_winter | south | insample_spearman | 10 | 0.3224 | 0.2964 | 0.3373 | +| mammal_winter | south | oob_auc | 8 | 0.7095 | 0.6257 | 0.7915 | +| mammal_winter | south | oob_calibration_slope | 8 | 0.7307 | 0.4495 | 0.8353 | +| mammal_winter | south | oob_deviance_explained | 8 | 0.0389 | 0.0035 | 0.1901 | +| mammal_winter | south | oob_n | 10 | 404.0000 | 0.0000 | 413.2000 | +| mammal_winter | south | oob_prevalence | 8 | 0.3501 | 0.0777 | 0.6225 | +| mammal_winter | south | oob_rmse | 8 | 0.3337 | 0.2202 | 0.4271 | +| mammal_winter | south | oob_spearman | 8 | 0.2450 | 0.1833 | 0.2817 | +| mite | north | insample_auc | 10 | 0.7336 | 0.6697 | 0.7962 | +| mite | north | insample_calibration_slope | 10 | 1.0028 | 0.9276 | 1.0341 | +| mite | north | insample_deviance_explained | 10 | 0.0502 | -0.0427 | 0.1395 | +| mite | north | insample_n | 10 | 3630.0000 | 3598.5000 | 5711.0000 | +| mite | north | insample_prevalence | 10 | 0.1545 | 0.0943 | 0.2113 | +| mite | north | insample_rmse | 10 | 0.3279 | 0.2873 | 0.3658 | +| mite | north | insample_spearman | 10 | 0.2958 | 0.1729 | 0.4186 | +| mite | north | oob_auc | 8 | 0.7189 | 0.6461 | 0.7894 | +| mite | north | oob_calibration_slope | 8 | 0.9472 | 0.7462 | 1.0295 | +| mite | north | oob_deviance_explained | 8 | 0.0324 | -0.0828 | 0.1165 | +| mite | north | oob_n | 10 | 2081.0000 | 0.0000 | 2112.5000 | +| mite | north | oob_prevalence | 8 | 0.1509 | 0.0925 | 0.2048 | +| mite | north | oob_rmse | 8 | 0.3263 | 0.2853 | 0.3680 | +| mite | north | oob_spearman | 8 | 0.2764 | 0.1475 | 0.4035 | +| mite | north | oob_v2val_Climate | 8 | 0.6835 | 0.6308 | 0.7383 | +| mite | north | oob_v2val_Climate_Truncated | 8 | 0.6834 | 0.6308 | 0.7383 | +| mite | north | oob_v2val_Full | 8 | 0.7189 | 0.6461 | 0.7894 | +| mite | north | oob_v2val_Full_Joint | 8 | 0.7191 | 0.6447 | 0.7888 | +| mite | north | oob_v2val_Full_Joint_Truncated | 8 | 0.7192 | 0.6448 | 0.7887 | +| mite | north | oob_v2val_Full_Truncated | 8 | 0.7190 | 0.6462 | 0.7893 | +| mite | north | oob_v2val_Landcover | 8 | 0.6850 | 0.6172 | 0.7620 | +| mite | north | v2val_Climate | 10 | 0.6950 | 0.6449 | 0.7401 | +| mite | north | v2val_Climate_Truncated | 10 | 0.6950 | 0.6449 | 0.7401 | +| mite | north | v2val_Full | 10 | 0.7336 | 0.6697 | 0.7962 | +| mite | north | v2val_Full_Joint | 10 | 0.7336 | 0.6692 | 0.7962 | +| mite | north | v2val_Full_Joint_Truncated | 10 | 0.7336 | 0.6692 | 0.7962 | +| mite | north | v2val_Full_Truncated | 10 | 0.7336 | 0.6697 | 0.7961 | +| mite | north | v2val_Landcover | 10 | 0.7057 | 0.6335 | 0.7708 | +| mite | south | insample_auc | 10 | 0.7997 | 0.7044 | 0.8840 | +| mite | south | insample_calibration_slope | 10 | 0.7882 | 0.6097 | 0.9768 | +| mite | south | insample_deviance_explained | 10 | 0.0405 | -0.0053 | 0.1740 | +| mite | south | insample_n | 10 | 1493.0000 | 1480.9000 | 2363.0000 | +| mite | south | insample_prevalence | 10 | 0.0721 | 0.0556 | 0.0841 | +| mite | south | insample_rmse | 10 | 0.2482 | 0.2139 | 0.2709 | +| mite | south | insample_spearman | 10 | 0.2519 | 0.1954 | 0.3151 | +| mite | south | oob_auc | 8 | 0.7769 | 0.6582 | 0.8839 | +| mite | south | oob_calibration_slope | 8 | 0.6139 | 0.5353 | 0.8012 | +| mite | south | oob_deviance_explained | 8 | 0.0535 | 0.0095 | 0.2026 | +| mite | south | oob_n | 10 | 870.0000 | 0.0000 | 882.1000 | +| mite | south | oob_prevalence | 8 | 0.0719 | 0.0489 | 0.0868 | +| mite | south | oob_rmse | 8 | 0.2447 | 0.2147 | 0.2788 | +| mite | south | oob_spearman | 8 | 0.2233 | 0.1492 | 0.3189 | +| mite | south | oob_v2val_Climate | 8 | 0.6835 | 0.6308 | 0.7383 | +| mite | south | oob_v2val_Climate_Truncated | 8 | 0.6834 | 0.6308 | 0.7383 | +| mite | south | oob_v2val_Full | 8 | 0.7769 | 0.6582 | 0.8839 | +| mite | south | oob_v2val_Full_Joint | 8 | 0.7766 | 0.6587 | 0.8846 | +| mite | south | oob_v2val_Full_Joint_Truncated | 8 | 0.7766 | 0.6587 | 0.8846 | +| mite | south | oob_v2val_Full_Truncated | 8 | 0.7769 | 0.6582 | 0.8839 | +| mite | south | oob_v2val_Landcover | 8 | 0.6792 | 0.6125 | 0.7124 | +| mite | south | v2val_Climate | 10 | 0.6950 | 0.6449 | 0.7401 | +| mite | south | v2val_Climate_Truncated | 10 | 0.6950 | 0.6449 | 0.7401 | +| mite | south | v2val_Full | 10 | 0.7997 | 0.7044 | 0.8840 | +| mite | south | v2val_Full_Joint | 10 | 0.8014 | 0.7048 | 0.8843 | +| mite | south | v2val_Full_Joint_Truncated | 10 | 0.8014 | 0.7048 | 0.8843 | +| mite | south | v2val_Full_Truncated | 10 | 0.7997 | 0.7044 | 0.8840 | +| mite | south | v2val_Landcover | 10 | 0.7027 | 0.6602 | 0.7282 | +| vascular_plant | north | insample_auc | 10 | 0.8331 | 0.8298 | 0.8373 | +| vascular_plant | north | insample_calibration_slope | 10 | 0.9949 | 0.9743 | 1.0061 | +| vascular_plant | north | insample_deviance_explained | 10 | 0.1616 | 0.1396 | 0.1816 | +| vascular_plant | north | insample_n | 10 | 4347.5000 | 4314.6000 | 6874.0000 | +| vascular_plant | north | insample_prevalence | 10 | 0.3951 | 0.3770 | 0.4211 | +| vascular_plant | north | insample_rmse | 10 | 0.4022 | 0.3958 | 0.4067 | +| vascular_plant | north | insample_spearman | 10 | 0.5651 | 0.5611 | 0.5668 | +| vascular_plant | north | oob_auc | 8 | 0.8283 | 0.8227 | 0.8329 | +| vascular_plant | north | oob_calibration_slope | 8 | 0.9755 | 0.9539 | 1.0021 | +| vascular_plant | north | oob_deviance_explained | 8 | 0.1803 | 0.1354 | 0.2064 | +| vascular_plant | north | oob_n | 10 | 2526.5000 | 0.0000 | 2559.4000 | +| vascular_plant | north | oob_prevalence | 8 | 0.3990 | 0.3725 | 0.4275 | +| vascular_plant | north | oob_rmse | 8 | 0.4052 | 0.3988 | 0.4110 | +| vascular_plant | north | oob_spearman | 8 | 0.5545 | 0.5499 | 0.5651 | +| vascular_plant | north | oob_v2val_Climate | 8 | 0.6916 | 0.6808 | 0.6996 | +| vascular_plant | north | oob_v2val_Climate_Truncated | 8 | 0.6916 | 0.6808 | 0.6996 | +| vascular_plant | north | oob_v2val_Full | 8 | 0.8283 | 0.8227 | 0.8329 | +| vascular_plant | north | oob_v2val_Full_Joint | 8 | 0.8258 | 0.8182 | 0.8325 | +| vascular_plant | north | oob_v2val_Full_Joint_Truncated | 8 | 0.8258 | 0.8183 | 0.8323 | +| vascular_plant | north | oob_v2val_Full_Truncated | 8 | 0.8285 | 0.8228 | 0.8328 | +| vascular_plant | north | oob_v2val_Landcover | 8 | 0.8009 | 0.7954 | 0.8101 | +| vascular_plant | north | v2val_Climate | 10 | 0.6886 | 0.6855 | 0.6950 | +| vascular_plant | north | v2val_Climate_Truncated | 10 | 0.6886 | 0.6855 | 0.6949 | +| vascular_plant | north | v2val_Full | 10 | 0.8331 | 0.8298 | 0.8373 | +| vascular_plant | north | v2val_Full_Joint | 10 | 0.8318 | 0.8275 | 0.8367 | +| vascular_plant | north | v2val_Full_Joint_Truncated | 10 | 0.8319 | 0.8277 | 0.8366 | +| vascular_plant | north | v2val_Full_Truncated | 10 | 0.8330 | 0.8299 | 0.8373 | +| vascular_plant | north | v2val_Landcover | 10 | 0.8087 | 0.8049 | 0.8130 | +| vascular_plant | south | insample_auc | 10 | 0.8460 | 0.8042 | 0.8967 | +| vascular_plant | south | insample_calibration_slope | 10 | 0.9608 | 0.9208 | 0.9855 | +| vascular_plant | south | insample_deviance_explained | 10 | 0.2841 | 0.1600 | 0.3822 | +| vascular_plant | south | insample_n | 10 | 1688.5000 | 1654.9000 | 2648.0000 | +| vascular_plant | south | insample_prevalence | 10 | 0.2438 | 0.2212 | 0.2654 | +| vascular_plant | south | insample_rmse | 10 | 0.3477 | 0.3070 | 0.3827 | +| vascular_plant | south | insample_spearman | 10 | 0.5180 | 0.4628 | 0.5647 | +| vascular_plant | south | oob_auc | 8 | 0.8412 | 0.8038 | 0.8909 | +| vascular_plant | south | oob_calibration_slope | 8 | 0.9408 | 0.9073 | 0.9701 | +| vascular_plant | south | oob_deviance_explained | 8 | 0.2459 | 0.1728 | 0.3387 | +| vascular_plant | south | oob_n | 10 | 959.5000 | 0.0000 | 993.1000 | +| vascular_plant | south | oob_prevalence | 8 | 0.2418 | 0.2131 | 0.2706 | +| vascular_plant | south | oob_rmse | 8 | 0.3513 | 0.3168 | 0.3827 | +| vascular_plant | south | oob_spearman | 8 | 0.5033 | 0.4643 | 0.5589 | +| vascular_plant | south | oob_v2val_Climate | 8 | 0.6916 | 0.6808 | 0.6996 | +| vascular_plant | south | oob_v2val_Climate_Truncated | 8 | 0.6916 | 0.6808 | 0.6996 | +| vascular_plant | south | oob_v2val_Full | 8 | 0.8412 | 0.8038 | 0.8909 | +| vascular_plant | south | oob_v2val_Full_Joint | 8 | 0.8369 | 0.8023 | 0.8809 | +| vascular_plant | south | oob_v2val_Full_Joint_Truncated | 8 | 0.8369 | 0.8023 | 0.8809 | +| vascular_plant | south | oob_v2val_Full_Truncated | 8 | 0.8412 | 0.8038 | 0.8908 | +| vascular_plant | south | oob_v2val_Landcover | 8 | 0.7762 | 0.7677 | 0.7961 | +| vascular_plant | south | v2val_Climate | 10 | 0.6886 | 0.6855 | 0.6950 | +| vascular_plant | south | v2val_Climate_Truncated | 10 | 0.6886 | 0.6855 | 0.6949 | +| vascular_plant | south | v2val_Full | 10 | 0.8460 | 0.8042 | 0.8967 | +| vascular_plant | south | v2val_Full_Joint | 10 | 0.8411 | 0.8013 | 0.8920 | +| vascular_plant | south | v2val_Full_Joint_Truncated | 10 | 0.8411 | 0.8013 | 0.8920 | +| vascular_plant | south | v2val_Full_Truncated | 10 | 0.8460 | 0.8042 | 0.8967 | +| vascular_plant | south | v2val_Landcover | 10 | 0.7783 | 0.7609 | 0.8028 | diff --git a/3_output/exp_000_parity_v2/tables/coverage.csv b/3_output/exp_000_parity_v2/tables/coverage.csv index 6e729eb..cc2de87 100644 --- a/3_output/exp_000_parity_v2/tables/coverage.csv +++ b/3_output/exp_000_parity_v2/tables/coverage.csv @@ -1,15 +1,15 @@ taxon,run,region,season,part,species,draws,stages,has_coefficients,has_grid -bird,bird,north,,,2,100,"climate, landcover, habitat",TRUE,FALSE -bird,bird,south,,,2,100,"climate, landcover, habitat",TRUE,FALSE -bryophyte,bryophyte,north,,,2,100,"climate, habitat",TRUE,FALSE -bryophyte,bryophyte,south,,,2,100,"climate, habitat",TRUE,FALSE -lichen,lichen,north,,,2,100,"climate, habitat",TRUE,FALSE -lichen,lichen,south,,,2,100,"climate, habitat",TRUE,FALSE -mammal,mammal_summer,north,summer,hurdle,2,100,"habitat_presence, habitat_abundance, habitat_total",TRUE,FALSE -mammal,mammal_summer,south,summer,hurdle,2,100,"habitat_presence, habitat_abundance, habitat_total",TRUE,FALSE -mammal,mammal_winter,north,winter,hurdle,2,100,"habitat_presence, habitat_abundance, habitat_total",TRUE,FALSE -mammal,mammal_winter,south,winter,hurdle,2,100,"habitat_presence, habitat_abundance, habitat_total",TRUE,FALSE -mite,mite,north,,,2,100,"climate, habitat",TRUE,TRUE -mite,mite,south,,,2,100,"climate, habitat",TRUE,TRUE -vascular_plant,vascular_plant,north,,,2,100,"climate, habitat",TRUE,TRUE -vascular_plant,vascular_plant,south,,,2,100,"climate, habitat",TRUE,TRUE +bird,bird,north,,,2,5,"climate, landcover, habitat",TRUE,TRUE +bird,bird,south,,,2,5,"climate, landcover, habitat",TRUE,TRUE +bryophyte,bryophyte,north,,,2,5,"climate, habitat",TRUE,TRUE +bryophyte,bryophyte,south,,,2,5,"climate, habitat",TRUE,TRUE +lichen,lichen,north,,,2,5,"climate, habitat",TRUE,TRUE +lichen,lichen,south,,,2,5,"climate, habitat",TRUE,TRUE +mammal,mammal_summer,north,summer,hurdle,2,5,"habitat_presence, habitat_abundance, habitat_total",TRUE,TRUE +mammal,mammal_summer,south,summer,hurdle,2,5,"habitat_presence, habitat_abundance, habitat_total",TRUE,TRUE +mammal,mammal_winter,north,winter,hurdle,2,5,"habitat_presence, habitat_abundance, habitat_total",TRUE,TRUE +mammal,mammal_winter,south,winter,hurdle,2,5,"habitat_presence, habitat_abundance, habitat_total",TRUE,TRUE +mite,mite,north,,,2,5,"climate, habitat",TRUE,TRUE +mite,mite,south,,,2,5,"climate, habitat",TRUE,TRUE +vascular_plant,vascular_plant,north,,,2,5,"climate, habitat",TRUE,TRUE +vascular_plant,vascular_plant,south,,,2,5,"climate, habitat",TRUE,TRUE diff --git a/3_output/exp_000_parity_v2/tables/grid_summary.csv b/3_output/exp_000_parity_v2/tables/grid_summary.csv new file mode 100644 index 0000000..bbe78eb --- /dev/null +++ b/3_output/exp_000_parity_v2/tables/grid_summary.csv @@ -0,0 +1,945 @@ +taxon,run,region,season,part,species,grid_unit,n,median,p10,p90,boot1 +bird,bird,north,,,AMRO,SpruceR,5,0.0460214970922903,0.0454744611146199,0.0478061585686823,0.0460214970922903 +bird,bird,north,,,AMRO,Spruce1,5,0.0336956807487701,0.0322810241650681,0.0345043254597905,0.0348507381455713 +bird,bird,north,,,AMRO,Spruce2,5,0.029967501134538,0.028689533256257,0.0309030506053303,0.0314691851923315 +bird,bird,north,,,AMRO,Spruce3,5,0.0258465915567713,0.0248847311078244,0.0269161638569105,0.0275986396962082 +bird,bird,north,,,AMRO,Spruce4,5,0.0234032880077339,0.0227504665773472,0.0245509472534085,0.0252157131909561 +bird,bird,north,,,AMRO,Spruce5,5,0.021731186122784,0.0213608104410011,0.0229344203019209,0.0235320177392087 +bird,bird,north,,,AMRO,Spruce6,5,0.0205987834958812,0.0203164427428931,0.0217537403151274,0.0222602046395292 +bird,bird,north,,,AMRO,Spruce7,5,0.0200852925184205,0.0194255140428591,0.0208590897859755,0.0212606901038818 +bird,bird,north,,,AMRO,Spruce8,5,0.0197353820173931,0.0187353929181975,0.020184041325968,0.0204546292796539 +bird,bird,north,,,AMRO,PineR,5,0.055663430449507,0.0543192030149498,0.0562118535015652,0.0535435973650151 +bird,bird,north,,,AMRO,Pine1,5,0.0400367096048969,0.0393476184649974,0.0404105539729648,0.0405470054004968 +bird,bird,north,,,AMRO,Pine2,5,0.0356069417161638,0.0348465927331193,0.0362895221196775,0.0366127459514038 +bird,bird,north,,,AMRO,Pine3,5,0.0307105378920888,0.0301269732104456,0.0316527175268143,0.0321095693334898 +bird,bird,north,,,AMRO,Pine4,5,0.0278758021291746,0.027484805318442,0.0288506206173034,0.0293371593640406 +bird,bird,north,,,AMRO,Pine5,5,0.0261879900411373,0.0256371542993188,0.0269648161579907,0.0273782680404298 +bird,bird,north,,,AMRO,Pine6,5,0.0247842187753593,0.0243295516540588,0.0256818169038513,0.0258985802241854 +bird,bird,north,,,AMRO,Pine7,5,0.0237257385224398,0.0233340026010986,0.0247312486059623,0.0247356975011427 +bird,bird,north,,,AMRO,Pine8,5,0.0229103307685888,0.022572936039687,0.0241270556938794,0.0237978880218547 +bird,bird,north,,,AMRO,DecidR,5,0.0229559115592863,0.0221306044429141,0.0235352610263104,0.0237579890560399 +bird,bird,north,,,AMRO,Decid1,5,0.030553448874834,0.0298317579364032,0.031292026146399,0.0315584625182446 +bird,bird,north,,,AMRO,Decid2,5,0.0321828552741194,0.0315537397610501,0.0329318625383302,0.0331998686079368 +bird,bird,north,,,AMRO,Decid3,5,0.0324092194941181,0.031901614565924,0.0331074352588107,0.0333598077618143 +bird,bird,north,,,AMRO,Decid4,5,0.0309081262409317,0.0304692552537095,0.0315217987870488,0.0317500403920757 +bird,bird,north,,,AMRO,Decid5,5,0.0286739687567556,0.0282544017321468,0.0291788293287055,0.0293809707313715 +bird,bird,north,,,AMRO,Decid6,5,0.026263369067971,0.0256592232040337,0.0265292756315766,0.0267049789894919 +bird,bird,north,,,AMRO,Decid7,5,0.0235829355542547,0.022996829053316,0.0238783254234698,0.0239651842606415 +bird,bird,north,,,AMRO,Decid8,5,0.0209712010709133,0.020405623716483,0.0212840394420598,0.0212996862068994 +bird,bird,north,,,AMRO,MixedwoodR,5,0.0216440418420787,0.0214366764666218,0.0229103918922939,0.0235968351556159 +bird,bird,north,,,AMRO,Mixedwood1,5,0.0291224189433723,0.0286974308645267,0.0305147340021009,0.0313443968700871 +bird,bird,north,,,AMRO,Mixedwood2,5,0.0306755089393133,0.0302969705278782,0.0321556893179631,0.0329746690631811 +bird,bird,north,,,AMRO,Mixedwood3,5,0.0308912709528129,0.030589685080101,0.0323492807237952,0.0331335233264806 +bird,bird,north,,,AMRO,Mixedwood4,5,0.0295710415430225,0.0291898679692672,0.0307877153702325,0.0315346752432942 +bird,bird,north,,,AMRO,Mixedwood5,5,0.0274075295438599,0.0270457330870442,0.0285447239533767,0.0291816753271841 +bird,bird,north,,,AMRO,Mixedwood6,5,0.0248744913880928,0.024598727956784,0.0260231600770452,0.0265238352270822 +bird,bird,north,,,AMRO,Mixedwood7,5,0.0223638470242142,0.0220520253761532,0.0234214558496831,0.0238026249249641 +bird,bird,north,,,AMRO,Mixedwood8,5,0.0199126764372763,0.0195738570800957,0.0208756562752855,0.0211552073327846 +bird,bird,north,,,AMRO,TreedBogR,5,0.0331850952367972,0.0319507285402324,0.0343298174584785,0.0320053956170601 +bird,bird,north,,,AMRO,TreedBog1,5,0.0441859758905737,0.04277191207391,0.0459514038332503,0.0425137445589404 +bird,bird,north,,,AMRO,TreedBog2,5,0.0465280988683981,0.0450759279854423,0.0485442094151598,0.0447249523823355 +bird,bird,north,,,AMRO,TreedBog3,5,0.0468127655397305,0.0453501172953296,0.0491179865619394,0.0449404132061633 +bird,bird,north,,,AMRO,TreedBog4,5,0.0445965703925972,0.0431609344939285,0.0470359967670578,0.0427718272455254 +bird,bird,north,,,AMRO,TreedBog5,5,0.0413013718566653,0.0399132456880923,0.043776679654854,0.0395803529352897 +bird,bird,north,,,AMRO,TreedBog6,5,0.0375650211610718,0.03623802297114,0.0400079459227759,0.0359754108602334 +bird,bird,north,,,AMRO,TreedBog7,5,0.0337311435879773,0.032474706589339,0.0360937692651888,0.0322845170729035 +bird,bird,north,,,AMRO,TreedBog8,5,0.0299955276096956,0.0288159490396316,0.0322449753172705,0.028693711490609 +bird,bird,north,,,AMRO,TreedFenR,5,0.0422645144129336,0.0411206711160944,0.0444612609388868,0.0416408069894085 +bird,bird,north,,,AMRO,TreedFen1,5,0.0567852320289917,0.0546993980136261,0.0595487401346133,0.0553127557852217 +bird,bird,north,,,AMRO,TreedFen2,5,0.0601053333210814,0.057576793915605,0.062801721494816,0.0581896606449257 +bird,bird,north,,,AMRO,TreedFen3,5,0.061004684620066,0.0578987833513519,0.0632661157627814,0.0584699872088007 +bird,bird,north,,,AMRO,TreedFen4,5,0.0585750472403725,0.0551364039392565,0.060286084605513,0.0556485357726957 +bird,bird,north,,,AMRO,TreedFen5,5,0.0546495586388256,0.0510462396551786,0.0558163205477266,0.0514962494721526 +bird,bird,north,,,AMRO,TreedFen6,5,0.0499841351763957,0.0464156762019834,0.0507663812147309,0.0468060185201128 +bird,bird,north,,,AMRO,TreedFen7,5,0.0447008747250632,0.0416684838734553,0.0457440880993633,0.0420039595905649 +bird,bird,north,,,AMRO,TreedFen8,5,0.0395694346049872,0.0370458190070238,0.0408183339762998,0.0373321210050387 +bird,bird,north,,,AMRO,GrassHerb,5,0.0391157074651561,0.0374665801039995,0.0407064521459671,0.0414109112421211 +bird,bird,north,,,AMRO,Shrub,5,0.0242992189479925,0.0228825094225992,0.0246776245457063,0.0249051907368317 +bird,bird,north,,,AMRO,GraminoidFen,5,0.0240253006082896,0.0229416430615678,0.0249398229795977,0.0240253006082896 +bird,bird,north,,,AMRO,Marsh,5,0.0190409138857816,0.0176773805870109,0.0216818753326244,0.0201855790618525 +bird,bird,north,,,AMRO,RoughP,5,0.0284487010336342,0.0273540658384352,0.029100651467195,0.0283163935552878 +bird,bird,north,,,AMRO,TameP,5,0.0337677662581705,0.0332118392222873,0.036508679760649,0.037370361410168 +bird,bird,north,,,AMRO,Crop,5,0.0303304446509559,0.0292521806779319,0.0312352000249702,0.0316675460758044 +bird,bird,north,,,AMRO,Industrial,5,0.0347264320174887,0.033312971177683,0.0355682981118906,0.0357679771660033 +bird,bird,north,,,AMRO,Mine,5,0.0436153300361437,0.0381990210765919,0.0459245387062479,0.0436153300361437 +bird,bird,north,,,AMRO,Rural,5,0.0396443515023387,0.038005707047867,0.0414176232218955,0.041757773007241 +bird,bird,north,,,AMRO,Urban,5,0.0403436023988292,0.0374075928778925,0.0427692941093427,0.0377072326980573 +bird,bird,north,,,AMRO,CCSpruceR,5,0.0464207068040547,0.0457292776866576,0.0488055453828144,0.0464207068040547 +bird,bird,north,,,AMRO,CCSpruce1,5,0.0334382471003622,0.0328903186279197,0.0349792099606696,0.0351307392341287 +bird,bird,north,,,AMRO,CCSpruce2,5,0.0297844962219075,0.0291681742313691,0.0312403869295451,0.0316709611104685 +bird,bird,north,,,AMRO,CCSpruce3,5,0.0257839800291967,0.0250483982402682,0.0270314998715563,0.0276685704867883 +bird,bird,north,,,AMRO,CCSpruce4,5,0.0233883758956751,0.0227898099129418,0.0245785085975324,0.0252324884758929 +bird,bird,north,,,AMRO,CCPineR,5,0.0556588717866301,0.0544149295122647,0.058052743467746,0.0540080569202541 +bird,bird,north,,,AMRO,CCPine1,5,0.0402344808099467,0.0399196288909847,0.0408216202332076,0.0408727719768734 +bird,bird,north,,,AMRO,CCPine2,5,0.0358025164520706,0.0354021820907293,0.0364721654805386,0.0368475016460527 +bird,bird,north,,,AMRO,CCPine3,5,0.0306877354469581,0.0303682798458408,0.0317012367664505,0.0321909301394351 +bird,bird,north,,,AMRO,CCPine4,5,0.0279566387258189,0.0275081026095794,0.0288622599803365,0.0293566765279551 +bird,bird,north,,,AMRO,CCDecidR,5,0.0235157538328627,0.0220205659375402,0.0240398063704617,0.0239640757885976 +bird,bird,north,,,AMRO,CCDecid1,5,0.0311469864460262,0.0297314532115381,0.0318112029859532,0.031776862556441 +bird,bird,north,,,AMRO,CCDecid2,5,0.0325949076990241,0.0314791572519253,0.0332838607667157,0.0333516171167642 +bird,bird,north,,,AMRO,CCDecid3,5,0.0325265668622635,0.0318777585482393,0.033207441139438,0.0334030551273305 +bird,bird,north,,,AMRO,CCDecid4,5,0.0309528425918292,0.0304601698476958,0.0315598462965716,0.0317664981841116 +bird,bird,north,,,AMRO,CCMixedwoodR,5,0.0224136935821678,0.0213872957159068,0.0232466535727542,0.0238015239718475 +bird,bird,north,,,AMRO,CCMixedwood1,5,0.0296185552493973,0.0288303211553137,0.0308120520947235,0.0315613154690116 +bird,bird,north,,,AMRO,CCMixedwood2,5,0.0308728597959445,0.0305223049649659,0.0323025377803166,0.033125388239769 +bird,bird,north,,,AMRO,CCMixedwood3,5,0.0310031221297793,0.0306928887240712,0.0323595803262164,0.033176477338817 +bird,bird,north,,,AMRO,CCMixedwood4,5,0.0295708962308159,0.0292462349147995,0.0307916306804173,0.0315510213997294 +bird,bird,north,,,AMRO,ShrubbySwamp,5,0.0280532806155646,0.0272120492548132,0.0304723043995906,0.0293807705242182 +bird,bird,north,,,AMRO,ShrubbyBog,5,0.0312066411236273,2.39623255235884e-06,0.0912997718305207,0.0987592495876081 +bird,bird,north,,,AMRO,ShrubbyFen,5,0.0199096452985301,0.0173227067986502,0.0204962269519268,0.0179711671460881 +bird,bird,north,,,AMRO,TreedSwamp,5,0.0150538387752528,0.0144236036440235,0.0158664078264896,0.0147780567655432 +bird,bird,north,,,YEWA,SpruceR,5,0.0258559745060982,0.0234403345263018,0.0260111209530433,0.0244391479557886 +bird,bird,north,,,YEWA,Spruce1,5,0.0228379925381185,0.0217902474136419,0.0235046389346874,0.0217244417914461 +bird,bird,north,,,YEWA,Spruce2,5,0.0202131466194631,0.0195276592826221,0.0212015763249332,0.0191951189565087 +bird,bird,north,,,YEWA,Spruce3,5,0.0152260266705766,0.014857155524532,0.0172302414914592,0.0147168214368909 +bird,bird,north,,,YEWA,Spruce4,5,0.0111004447615773,0.011013191632923,0.0132562242110949,0.0110142694942302 +bird,bird,north,,,YEWA,Spruce5,5,0.00804666353131241,0.00782404584193233,0.00956383307230264,0.00804666353131241 +bird,bird,north,,,YEWA,Spruce6,5,0.00573844799961777,0.00536607662283719,0.00647092405422643,0.00573844799961777 +bird,bird,north,,,YEWA,Spruce7,5,0.0039947676530843,0.0035660316198102,0.00416241768282985,0.0039947676530843 +bird,bird,north,,,YEWA,Spruce8,5,0.00235082179047476,0.00227361425460549,0.00270649382245452,0.00271460762119826 +bird,bird,north,,,YEWA,PineR,5,0.0205785305776538,0.016318274681477,0.0214352987031151,0.0205785305776538 +bird,bird,north,,,YEWA,Pine1,5,0.0182926626777856,0.0153708906689175,0.01895474719957,0.0182926626777856 +bird,bird,north,,,YEWA,Pine2,5,0.0161628933669374,0.0141454379072083,0.0166341234332659,0.0161628933669374 +bird,bird,north,,,YEWA,Pine3,5,0.0123056049633671,0.0114779279888745,0.0125556597430834,0.0123920261251661 +bird,bird,north,,,YEWA,Pine4,5,0.00925626382247502,0.00858692715044315,0.00939389903902125,0.00927436103695466 +bird,bird,north,,,YEWA,Pine5,5,0.00657162382380723,0.00614692336606859,0.00680475100874576,0.0067755435593238 +bird,bird,north,,,YEWA,Pine6,5,0.00453218358829318,0.00422748241429677,0.00472061781142898,0.00483195354609082 +bird,bird,north,,,YEWA,Pine7,5,0.00285709675383384,0.00277596123213307,0.00323273918784264,0.00336371989925068 +bird,bird,north,,,YEWA,Pine8,5,0.00182760895381318,0.00166130029618671,0.00216184116705074,0.00228578492344407 +bird,bird,north,,,YEWA,DecidR,5,0.067934626437015,0.0674576672463633,0.0729195663394245,0.067934626437015 +bird,bird,north,,,YEWA,Decid1,5,0.0765302527003605,0.0753508333805385,0.0809224163873259,0.0757433785005077 +bird,bird,north,,,YEWA,Decid2,5,0.0831933705848618,0.0821163970415955,0.0879817188793552,0.0824551590396893 +bird,bird,north,,,YEWA,Decid3,5,0.0909542914829032,0.0906172695168214,0.09667461567637,0.0909542914829032 +bird,bird,north,,,YEWA,Decid4,5,0.0911816141264914,0.0902820435873628,0.0960411655989214,0.0911816141264914 +bird,bird,north,,,YEWA,Decid5,5,0.0830749476256945,0.0815385432720113,0.0862567937273009,0.0830749476256945 +bird,bird,north,,,YEWA,Decid6,5,0.0684511157991116,0.0668156484857424,0.0701683129834214,0.0687878278508456 +bird,bird,north,,,YEWA,Decid7,5,0.0502439884002606,0.0495409659411423,0.052147813318469,0.0517644774974931 +bird,bird,north,,,YEWA,Decid8,5,0.0339005594888284,0.0329378261237809,0.0352547173481443,0.0354022441617264 +bird,bird,north,,,YEWA,MixedwoodR,5,0.0321181710498639,0.0319864486524918,0.0343492759912242,0.0321181710498639 +bird,bird,north,,,YEWA,Mixedwood1,5,0.0361186343792291,0.0357543657081755,0.0381193002267473,0.0358099972600774 +bird,bird,north,,,YEWA,Mixedwood2,5,0.0396578845880583,0.0389647638764836,0.0412876201913861,0.0389831966535626 +bird,bird,north,,,YEWA,Mixedwood3,5,0.044161071804344,0.0430114778126448,0.0450311260127699,0.0430014212895615 +bird,bird,north,,,YEWA,Mixedwood4,5,0.0442351820713005,0.0430824404362304,0.0445653556762868,0.0431088950173672 +bird,bird,north,,,YEWA,Mixedwood5,5,0.0398578791525603,0.0391443456983723,0.0400558611174636,0.0392762206512514 +bird,bird,north,,,YEWA,Mixedwood6,5,0.0324703166414877,0.032179685405207,0.0326999878711223,0.0325215480961012 +bird,bird,north,,,YEWA,Mixedwood7,5,0.0239356684881771,0.0236920166090268,0.0244336977342141,0.0244732389028849 +bird,bird,north,,,YEWA,Mixedwood8,5,0.0161253113583632,0.0156693072501918,0.0166180780337648,0.0167374929865786 +bird,bird,north,,,YEWA,TreedBogR,5,0.011556676565964,0.0106150734211072,0.015167132081919,0.0131547525960213 +bird,bird,north,,,YEWA,TreedBog1,5,0.0130294668017344,0.0118161055388771,0.0168577424412391,0.0146668268778186 +bird,bird,north,,,YEWA,TreedBog2,5,0.0143062189240542,0.0128370960433458,0.0182880974231299,0.0159664853451186 +bird,bird,north,,,YEWA,TreedBog3,5,0.0159307025000537,0.0140854433394799,0.0200138051382188,0.0176122437813552 +bird,bird,north,,,YEWA,TreedBog4,5,0.0159574371006158,0.0140225317629725,0.0198790018140412,0.0176562621751068 +bird,bird,north,,,YEWA,TreedBog5,5,0.0143783651328877,0.0126656720514962,0.0179214155743405,0.0160865002173325 +bird,bird,north,,,YEWA,TreedBog6,5,0.0116539735513248,0.0103793735442064,0.0146647056806911,0.0133199651555387 +bird,bird,north,,,YEWA,TreedBog7,5,0.00849682553839672,0.00771705937769765,0.0108920493747369,0.0100235907733028 +bird,bird,north,,,YEWA,TreedBog8,5,0.00557259559451445,0.00520557300073712,0.00734335343414964,0.00685523403478533 +bird,bird,north,,,YEWA,TreedFenR,5,0.0236371088398181,0.0172768808475891,0.024924502499633,0.0236371088398181 +bird,bird,north,,,YEWA,TreedFen1,5,0.0263540785518553,0.0192542019396591,0.0279298914574923,0.0263540785518553 +bird,bird,north,,,YEWA,TreedFen2,5,0.0286893690426434,0.0209405142100181,0.0305054446689458,0.0286893690426434 +bird,bird,north,,,YEWA,TreedFen3,5,0.031404364802713,0.0230203258078457,0.0337911333203274,0.0316465490426032 +bird,bird,north,,,YEWA,TreedFen4,5,0.0310353005156193,0.0229524913747421,0.0338582352701967,0.0317256434654338 +bird,bird,north,,,YEWA,TreedFen5,5,0.0278154609778999,0.0207556385456937,0.0306353026947788,0.0289050176894887 +bird,bird,north,,,YEWA,TreedFen6,5,0.0226089781361948,0.0170225823525394,0.0250329038492433,0.023933970922363 +bird,bird,north,,,YEWA,TreedFen7,5,0.0166663297897427,0.0126617741481907,0.0184756251524069,0.0180108827091141 +bird,bird,north,,,YEWA,TreedFen8,5,0.0111420056428385,0.00854164778652357,0.0123193300297175,0.0123178229176012 +bird,bird,north,,,YEWA,GrassHerb,5,0.0932809108920782,0.0913238743042866,0.099354153490354,0.0901967196519561 +bird,bird,north,,,YEWA,Shrub,5,0.0137692356170479,0.0119314278078182,0.0157329585961985,0.0157895871550544 +bird,bird,north,,,YEWA,GraminoidFen,5,0.0568382240230587,0.0469653962284414,0.0581610479717628,0.0584309966782358 +bird,bird,north,,,YEWA,Marsh,5,0.0523104434118613,0.0513226604208148,0.0592605534505783,0.0508708598171353 +bird,bird,north,,,YEWA,RoughP,5,0.0682370509878256,0.0670669867920174,0.0695536106096402,0.0675367024470256 +bird,bird,north,,,YEWA,TameP,5,0.0388719938949029,0.0351357025693022,0.0407515647841364,0.0388719938949029 +bird,bird,north,,,YEWA,Crop,5,0.0480473182692122,0.0467260154201003,0.0494996772635692,0.0480608449912437 +bird,bird,north,,,YEWA,Industrial,5,0.0209926161493617,0.0179403892660471,0.0274121855791778,0.0163774906175213 +bird,bird,north,,,YEWA,Mine,5,0.0298281089999606,0.0252803812327327,0.0438712258060967,0.0425264275216284 +bird,bird,north,,,YEWA,Rural,5,0.0520106523964021,0.0509948165571747,0.0580204328798446,0.0511767629721787 +bird,bird,north,,,YEWA,Urban,5,0.0189358775335448,0.0180723788869236,0.0232307511964699,0.0175580460951392 +bird,bird,north,,,YEWA,CCSpruceR,5,0.0152672175746062,0.0139145872911392,0.0165869364759518,0.0140004857871316 +bird,bird,north,,,YEWA,CCSpruce1,5,0.0145361447342197,0.0133048327331401,0.0151662007660585,0.0129654763620514 +bird,bird,north,,,YEWA,CCSpruce2,5,0.0142897376611622,0.0132388070120826,0.0146721348538594,0.0127102186233497 +bird,bird,north,,,YEWA,CCSpruce3,5,0.0134450799502097,0.0127354661170899,0.0148322925225234,0.0125004237260447 +bird,bird,north,,,YEWA,CCSpruce4,5,0.0107434349248054,0.0105759890760241,0.0127445041685453,0.0105517888223615 +bird,bird,north,,,YEWA,CCPineR,5,0.0117888489972604,0.00978058439715013,0.0136122385160046,0.0117888489972604 +bird,bird,north,,,YEWA,CCPine1,5,0.0109173385362286,0.00950427775443443,0.0124464416038799,0.0109173385362286 +bird,bird,north,,,YEWA,CCPine2,5,0.0107024034987813,0.00963763502050784,0.0118767346358323,0.0107024034987813 +bird,bird,north,,,YEWA,CCPine3,5,0.0105322296684723,0.00985879892133643,0.0109469939924601,0.0105257496024575 +bird,bird,north,,,YEWA,CCPine4,5,0.00888493777781158,0.00827021172815224,0.00903877043393079,0.00888493777781158 +bird,bird,north,,,YEWA,CCDecidR,5,0.0408740518525815,0.0395742880103873,0.0463855635812126,0.0389177958906805 +bird,bird,north,,,YEWA,CCDecid1,5,0.0504993452950062,0.0491803622371971,0.0566278245259164,0.048545974417128 +bird,bird,north,,,YEWA,CCDecid2,5,0.062995265035987,0.0619691334562304,0.0695286705182462,0.0614429350398245 +bird,bird,north,,,YEWA,CCDecid3,5,0.0839595481698585,0.0837446499537815,0.090415392433214,0.0836626760316502 +bird,bird,north,,,YEWA,CCDecid4,5,0.0881841836019783,0.0875140301840755,0.0935026282391147,0.0881841836019783 +bird,bird,north,,,YEWA,CCMixedwoodR,5,0.0198089465088669,0.0188166896946456,0.0215401269632987,0.0183995775182405 +bird,bird,north,,,YEWA,CCMixedwood1,5,0.0246050062604319,0.0233792653816228,0.0262550008779679,0.0229515931990476 +bird,bird,north,,,YEWA,CCMixedwood2,5,0.0307677459222674,0.0294152736977039,0.0322590575421635,0.0290490255252145 +bird,bird,north,,,YEWA,CCMixedwood3,5,0.0410887724516163,0.0397071014363877,0.0419786408808556,0.0395540872189119 +bird,bird,north,,,YEWA,CCMixedwood4,5,0.0429775093725811,0.0417350634696179,0.0433309104754257,0.0416917681213261 +bird,bird,north,,,YEWA,ShrubbySwamp,5,0.084170088903374,0.0814218719690635,0.0880371848217152,0.079822188726824 +bird,bird,north,,,YEWA,ShrubbyBog,5,4.8908918803986e-06,4.23856436295343e-06,5.39123857787991e-06,4.42578200846098e-06 +bird,bird,north,,,YEWA,ShrubbyFen,5,0.0414566214404942,0.039261597045695,0.0505385114750219,0.0484352778746871 +bird,bird,north,,,YEWA,TreedSwamp,5,0.0406512816816615,0.0399137539513559,0.0426021810257371,0.0406996342472028 +bird,bird,south,,,AMRO,Loamy,5,0.0241321618221621,0.0236693559161623,0.0244417594641063,0.0239569869686121 +bird,bird,south,,,AMRO,Blowout,5,0.00525978394452474,0.00483082627794943,0.00554114840096604,0.00559111949874543 +bird,bird,south,,,AMRO,ClaySub,5,0.0224545103948504,0.0209236101394104,0.0249199215728223,0.0250347637306298 +bird,bird,south,,,AMRO,Crop,5,0.0230932157889498,0.0226956842202502,0.0238595151902264,0.0236839952497224 +bird,bird,south,,,AMRO,Industrial,5,0.0262354418047225,0.0234169654211887,0.029992373999167,0.0233617397737627 +bird,bird,south,,,AMRO,Mine,5,0.0159069410465305,0.014010684448404,0.025109840836752,0.0159069410465305 +bird,bird,south,,,AMRO,Other,5,0.016098468661524,0.0128083644871958,0.0205965606097986,0.0210202102474962 +bird,bird,south,,,AMRO,RapidDrain,5,0.0236194782771747,0.0230076960669836,0.0255994765544292,0.0251675270889975 +bird,bird,south,,,AMRO,RoughP,5,0.0117188270413036,0.0109276575293055,0.0122383602743591,0.0112036711001846 +bird,bird,south,,,AMRO,Rural,5,0.0437070809393601,0.0424258544652182,0.0441423406644261,0.0437070809393601 +bird,bird,south,,,AMRO,SandyLoam,5,0.0147924310215059,0.0145440646614329,0.0149852796963371,0.0148469628367301 +bird,bird,south,,,AMRO,SoilUnknown,5,0.0243829782616065,0.0238722939341933,0.0257510776949805,0.0235542385568422 +bird,bird,south,,,AMRO,TameP,5,0.0270019486472823,0.0254866831491566,0.0280561852466744,0.0286155273878474 +bird,bird,south,,,AMRO,ThinBreak,5,0.0338003999398653,0.0330400812092674,0.037911798723991,0.0338003999398653 +bird,bird,south,,,AMRO,Urban,5,0.0508184548862111,0.0491287965989474,0.0516212401204611,0.0483719535027645 +bird,bird,south,,,AMRO,Water,5,0.0162706932878444,0.0146410988852416,0.0316387080129026,0.0364343359767869 +bird,bird,south,,,AMRO,Wellsites,5,0.0389513908707596,0.0124040818853545,0.0420540796368127,0.0437526708429192 +bird,bird,south,,,YEWA,Loamy,5,0.0889862342739654,0.0833142720796077,0.0912893187301941,0.0911235422512483 +bird,bird,south,,,YEWA,Blowout,5,0.0401628947157703,0.0373442373283019,0.0409157196574691,0.0401628947157703 +bird,bird,south,,,YEWA,ClaySub,5,0.0776026172652354,0.072738347688647,0.0806537209465533,0.0776026172652354 +bird,bird,south,,,YEWA,Crop,5,0.0477258909723985,0.0445439418592085,0.0483983633635829,0.0485578693440802 +bird,bird,south,,,YEWA,Industrial,5,0.0527276712827915,0.0407707589259449,0.0732258847421466,0.0332758320869208 +bird,bird,south,,,YEWA,Mine,5,0.0971806065268231,0.0846776257647363,0.121933813451961,0.112500894420852 +bird,bird,south,,,YEWA,Other,5,0.0875251951229225,0.0772673767356427,0.0958802062242052,0.100975326566864 +bird,bird,south,,,YEWA,RapidDrain,5,0.0665179523278429,0.0604144987507378,0.0698664068896251,0.0626153705338298 +bird,bird,south,,,YEWA,RoughP,5,0.0573815111243077,0.0533876378460484,0.0600900298992678,0.0564654939180325 +bird,bird,south,,,YEWA,Rural,5,0.0661716927633792,0.0628530852788089,0.0689878709663489,0.0657781939712168 +bird,bird,south,,,YEWA,SandyLoam,5,0.0511277264137194,0.0440509842319305,0.0548605397562365,0.0475053886435979 +bird,bird,south,,,YEWA,SoilUnknown,5,0.0997155153997096,0.0970882713180495,0.100977766167759,0.0979710879919298 +bird,bird,south,,,YEWA,TameP,5,0.0457686292658743,0.0435985886063968,0.0531975721116954,0.050747465664211 +bird,bird,south,,,YEWA,ThinBreak,5,0.183371746527312,0.178987377035422,0.188606353214059,0.179236197079509 +bird,bird,south,,,YEWA,Urban,5,0.0507331439696001,0.0448023038764347,0.0520602501639247,0.0507331439696001 +bird,bird,south,,,YEWA,Water,5,5.79878735375159e-07,4.76822525465649e-07,1.2010658345155e-06,6.60804504718257e-07 +bird,bird,south,,,YEWA,Wellsites,5,6.90003938618652e-06,5.25255285811954e-06,0.365617585043016,0.413267228722246 +bryophyte,bryophyte,north,,,Bryum.All,WhiteSpruce,5,0.104623666278372,0.0874722861544613,0.112679942833954,0.105666560031913 +bryophyte,bryophyte,north,,,Bryum.All,Pine,5,0.0674475602586271,0.0606847013691161,0.0749869714210322,0.0672116807219031 +bryophyte,bryophyte,north,,,Bryum.All,Deciduous,5,0.0919819625968023,0.0817645391225394,0.0978941606981865,0.0919819625968023 +bryophyte,bryophyte,north,,,Bryum.All,Mixedwood,5,0.0937191187701653,0.0766558041922239,0.101378049564084,0.0937191187701653 +bryophyte,bryophyte,north,,,Bryum.All,BlackSpruce,5,0.0821737878210885,0.0796472718492078,0.0914478284992744,0.082297728208448 +bryophyte,bryophyte,north,,,Bryum.All,TreedFen,5,0.103825175281253,0.09066068154714,0.115404378478857,0.103825175281253 +bryophyte,bryophyte,north,,,Bryum.All,TreedSwamp,5,0.14838302487508,0.134285947262339,0.15433966365031,0.14838302487508 +bryophyte,bryophyte,north,,,Bryum.All,GraminoidFen,5,0.102608545171503,0.091652995844401,0.112334612258834,0.102608545171503 +bryophyte,bryophyte,north,,,Bryum.All,ShrubbyFen,5,0.108214861633538,0.0993466210779264,0.120681656680431,0.108214861633538 +bryophyte,bryophyte,north,,,Bryum.All,ShrubbyBog,5,0.0822115868613973,0.0802689106984959,0.0930553295605826,0.0837594118723497 +bryophyte,bryophyte,north,,,Bryum.All,ShrubbySwamp,5,0.142659930075182,0.128769149552852,0.158781358177345,0.147623294355338 +bryophyte,bryophyte,north,,,Bryum.All,Marsh,5,0.103008117733597,0.0928698823634094,0.112264034639262,0.105256814676515 +bryophyte,bryophyte,north,,,Bryum.All,Shrub,5,0.205603841480222,0.174880422823466,0.253531593550174,0.19679926045177 +bryophyte,bryophyte,north,,,Bryum.All,Grass,5,0.205731498249484,0.170688321636038,0.244995847117187,0.195483946860916 +bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruceR,5,0.165475582798583,0.15518207397193,0.199998766587222,0.169554083366261 +bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce1,5,0.177961608354587,0.154126217921708,0.209058286085648,0.177961608354587 +bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce2,5,0.202884480777997,0.171266875481849,0.231723154322466,0.202884480777997 +bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce3,5,0.202884480777997,0.171266875481849,0.231723154322466,0.202884480777997 +bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce4,5,0.202884480777997,0.171266875481849,0.231723154322466,0.202884480777997 +bryophyte,bryophyte,north,,,Bryum.All,CCPineR,5,0.16022882422794,0.145827136293942,0.180254773430031,0.16022882422794 +bryophyte,bryophyte,north,,,Bryum.All,CCPine1,5,0.164291720401128,0.133145499888549,0.203845059962508,0.164291720401128 +bryophyte,bryophyte,north,,,Bryum.All,CCPine2,5,0.166830898209846,0.13451769307428,0.206946727968588,0.166830898209846 +bryophyte,bryophyte,north,,,Bryum.All,CCPine3,5,0.166830898209846,0.13451769307428,0.206946727968588,0.166830898209846 +bryophyte,bryophyte,north,,,Bryum.All,CCPine4,5,0.166830898209846,0.13451769307428,0.206946727968588,0.166830898209846 +bryophyte,bryophyte,north,,,Bryum.All,CCDeciduousR,5,0.161533823124016,0.1404659727257,0.174401252222805,0.161533823124016 +bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous1,5,0.174108402828508,0.161888476473846,0.17922980187219,0.17800935952687 +bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous2,5,0.150834982909368,0.122713525430442,0.157034030570364,0.150834982909368 +bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous3,5,0.150834982909368,0.122713525430442,0.157034030570364,0.150834982909368 +bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous4,5,0.150834982909368,0.122713525430442,0.157034030570364,0.150834982909368 +bryophyte,bryophyte,north,,,Bryum.All,CCMixedwoodR,5,0.161533823124016,0.1404659727257,0.174401252222805,0.161533823124016 +bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood1,5,0.174108402828508,0.161888476473846,0.17922980187219,0.17800935952687 +bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood2,5,0.150834982909368,0.122713525430442,0.157034030570364,0.150834982909368 +bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood3,5,0.150834982909368,0.122713525430442,0.157034030570364,0.150834982909368 +bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood4,5,0.150834982909368,0.122713525430442,0.157034030570364,0.150834982909368 +bryophyte,bryophyte,north,,,Bryum.All,EnSeismic,5,0.143247261154779,0.132144241170755,0.15978556612201,0.143247261154779 +bryophyte,bryophyte,north,,,Bryum.All,EnSoftLin,5,0.181976104710237,0.176334441522147,0.207421144310894,0.181976104710237 +bryophyte,bryophyte,north,,,Bryum.All,TrSoftLin,5,0.172100168424541,0.147841165917588,0.187901203255329,0.169203477599876 +bryophyte,bryophyte,north,,,Bryum.All,HardLin,5,0.119094247542269,0.0902286867109537,0.153196513874268,0.124691301578451 +bryophyte,bryophyte,north,,,Bryum.All,UrbInd,5,0.15870235487759,0.131129493678025,0.174263860237473,0.15870235487759 +bryophyte,bryophyte,north,,,Bryum.All,Wellsites,5,0.133875416816634,0.127095175106388,0.159927124091914,0.133875416816634 +bryophyte,bryophyte,north,,,Bryum.All,Crop,5,0.0820223721088346,0.0684673797777877,0.0983546690511286,0.078395085879973 +bryophyte,bryophyte,north,,,Bryum.All,TameP,5,0.14146232517738,0.121223613545195,0.153442524325088,0.14146232517738 +bryophyte,bryophyte,north,,,Bryum.All,RoughP,5,0.144150717399513,0.133810027719149,0.158938339577548,0.143669438263278 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,WhiteSpruce,5,0.170617726106481,0.150531559521949,0.174419709411094,0.176935668903147 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Pine,5,0.155784234979198,0.149699740009459,0.170954712542573,0.172791155095638 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Deciduous,5,0.157244630521525,0.142941372795819,0.163468234285499,0.162052893569508 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Mixedwood,5,0.158627676901957,0.13860286258159,0.171247492283289,0.15788444654738 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,BlackSpruce,5,0.0677921007733422,0.0521429659792482,0.0729564235762428,0.0685353715648879 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,TreedFen,5,0.0704119831070097,0.059745149134307,0.0811325128636527,0.0794290899103082 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,TreedSwamp,5,0.112752005656074,0.0984937696101871,0.137854437407414,0.122922619803698 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,GraminoidFen,5,0.071246619098096,0.0646705299404144,0.0824857475812227,0.0833874009572022 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,ShrubbyFen,5,0.0704520736989616,0.0644476326851635,0.0829604405865539,0.0826619615495143 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,ShrubbyBog,5,0.0669469626238629,0.0541167658533186,0.0737851895171726,0.0696158682654045 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,ShrubbySwamp,5,0.115517060865014,0.0928903325785583,0.132534115088148,0.121979163778046 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Marsh,5,0.113514973804854,0.096254727615824,0.137347333930943,0.121750013890524 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Shrub,5,0.258030208654547,0.21433734112913,0.288008334755188,0.275203776452487 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Grass,5,0.271067495374639,0.240923289977324,0.31781564474553,0.292406492273734 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruceR,5,0.338256695749658,0.31824880432862,0.364273497154808,0.345415843034206 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce1,5,0.310222319426016,0.28440620861304,0.33208710700024,0.310222319426016 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce2,5,0.344912345599046,0.314582284578097,0.372632043273075,0.35184667493467 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce3,5,0.344912345599046,0.314582284578097,0.372632043273075,0.35184667493467 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce4,5,0.344912345599046,0.314582284578097,0.372632043273075,0.35184667493467 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPineR,5,0.332237563055896,0.30230266389427,0.354086616306992,0.332237563055896 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine1,5,0.345687365666162,0.317841589858981,0.373089123054865,0.354005283762296 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine2,5,0.348225414237899,0.321582172515133,0.377622132855574,0.359033033466831 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine3,5,0.348225414237899,0.321582172515133,0.377622132855574,0.359033033466831 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine4,5,0.348225414237899,0.321582172515133,0.377622132855574,0.359033033466831 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduousR,5,0.318830335897459,0.27955994009676,0.332129458277748,0.329698896772244 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous1,5,0.311890371027914,0.291615240620109,0.319691638401899,0.321691125624866 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous2,5,0.30432063546174,0.283360736827309,0.339489268918774,0.311263402327306 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous3,5,0.30432063546174,0.283360736827309,0.339489268918774,0.311263402327306 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous4,5,0.30432063546174,0.283360736827309,0.339489268918774,0.311263402327306 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwoodR,5,0.318830335897459,0.27955994009676,0.332129458277748,0.329698896772244 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood1,5,0.311890371027914,0.291615240620109,0.319691638401899,0.321691125624866 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood2,5,0.30432063546174,0.283360736827309,0.339489268918774,0.311263402327306 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood3,5,0.30432063546174,0.283360736827309,0.339489268918774,0.311263402327306 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood4,5,0.30432063546174,0.283360736827309,0.339489268918774,0.311263402327306 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,EnSeismic,5,0.159710015581722,0.116043191735016,0.17072117947456,0.165838564517478 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,EnSoftLin,5,0.159418027877254,0.124794622673536,0.167171385865762,0.168995137454078 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,TrSoftLin,5,0.171669259495879,0.127684819372006,0.18790477785131,0.180401709818175 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,HardLin,5,0.10993941717652,0.0990227818218094,0.119734614597133,0.113196196589015 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,UrbInd,5,0.125398730461756,0.108350462054011,0.129809259709619,0.129273397383927 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Wellsites,5,0.120865154448231,0.106933037026666,0.135907579517197,0.135555384778656 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Crop,5,0.074461797530342,0.0663055752886782,0.0784646756931369,0.080469463459423 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,TameP,5,0.139209058513911,0.127041125175049,0.146790768834801,0.148781802724197 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,RoughP,5,0.141247542624157,0.127091822586834,0.155254205987659,0.153373422859104 +bryophyte,bryophyte,south,,,Bryum.All,Loamy,5,0.128371275228788,0.126267345563482,0.192554766969062,0.156609764097912 +bryophyte,bryophyte,south,,,Bryum.All,SandyLoam,5,0.163687813793554,0.157864329641462,0.257888717822438,0.209805018041589 +bryophyte,bryophyte,south,,,Bryum.All,ClaySub,5,0.138847380253595,0.129440293252389,0.192920064856309,0.163480694825708 +bryophyte,bryophyte,south,,,Bryum.All,RapidDrain,5,0.151000064270357,0.12841178366917,0.214806584231797,0.179839142499951 +bryophyte,bryophyte,south,,,Bryum.All,Blowout,5,0.177847228366661,0.13169779331486,0.213345983888902,0.18962303788414 +bryophyte,bryophyte,south,,,Bryum.All,ThinBreak,5,0.108774649500815,0.100351516195694,0.149118127661729,0.13142432263142 +bryophyte,bryophyte,south,,,Bryum.All,Other,5,0.153008911192339,0.143619231829843,0.22761954763385,0.192944265564736 +bryophyte,bryophyte,south,,,Bryum.All,EnSeismic,5,0.334606425412252,0.156177390749094,0.434765493190856,0.334606425412252 +bryophyte,bryophyte,south,,,Bryum.All,EnSoftLin,5,0.329548544110659,0.161421900535046,0.471022939170799,0.329548544110659 +bryophyte,bryophyte,south,,,Bryum.All,TrSoftLin,5,0.375563737003068,0.183612394029062,0.460581289024939,0.383815980210159 +bryophyte,bryophyte,south,,,Bryum.All,HardLin,5,0.1468328366873,0.0883371659600431,0.208225904838994,0.1468328366873 +bryophyte,bryophyte,south,,,Bryum.All,UrbInd,5,0.104701482537215,0.103446912111058,0.180846515565828,0.15376441179003 +bryophyte,bryophyte,south,,,Bryum.All,Wellsites,5,0.103827170399858,0.0947594363214667,0.177418037109713,0.140420183947776 +bryophyte,bryophyte,south,,,Bryum.All,Crop,5,0.0834326498037117,0.0762103903441286,0.118437315338461,0.100381454106891 +bryophyte,bryophyte,south,,,Bryum.All,TameP,5,0.124085918128196,0.113948945983715,0.179967952926487,0.164423435504234 +bryophyte,bryophyte,south,,,Bryum.All,RoughP,5,0.102704627973536,0.0996345261643043,0.149622110445284,0.13419258459678 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,Loamy,5,0.0641849871927666,0.050457745645129,0.07270277108154,0.0641849871927666 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,SandyLoam,5,0.0742797240604397,0.0646788146747532,0.0864582537717612,0.0742797240604397 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,ClaySub,5,0.0592505109132571,0.0488344242492647,0.0699996689330231,0.0592505109132571 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,RapidDrain,5,0.102551453445416,0.0986747245418018,0.114617392978353,0.102551453445416 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,Blowout,5,0.108577749315386,0.0975839841162081,0.119450204289074,0.108577749315386 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,ThinBreak,5,0.0863196169586629,0.0821949327472845,0.0998445672388945,0.0863196169586629 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,Other,5,0.0345770287640794,0.0255035080368273,0.0522013822338746,0.0345770287640794 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,EnSeismic,5,0.21574628197629,0.142477035309188,0.248955821906755,0.16811461642476 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,EnSoftLin,5,0.211754576394213,0.13866240930989,0.222190780941109,0.169876045775971 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,TrSoftLin,5,0.194018984551885,0.147159530414209,0.240287969097993,0.160797502761418 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,HardLin,5,0.0304162076535258,0.029166064034397,0.0432718766595132,0.0318703430228878 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,UrbInd,5,0.0356740467063795,0.0286632065765225,0.0429956144747444,0.0356740467063795 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,Wellsites,5,0.0429922761944743,0.0335372326498226,0.0467533160557549,0.0401699600814057 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,Crop,5,0.0228689540457825,0.0221752232262121,0.0277192165390448,0.0251044943216744 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,TameP,5,0.0603942872656395,0.0505159739370433,0.0666385260267113,0.054988635814872 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,RoughP,5,0.0576120452574267,0.0486453851644709,0.0647244005298698,0.0547537316462016 +lichen,lichen,north,,,Cladonia.chlorophaea,WhiteSpruce,5,0.299712823406177,0.267794399850091,0.31752477391247,0.299712823406177 +lichen,lichen,north,,,Cladonia.chlorophaea,Pine,5,0.211658158470293,0.187362325848506,0.221031041496282,0.213983673760142 +lichen,lichen,north,,,Cladonia.chlorophaea,Deciduous,5,0.242873835985486,0.212311835312585,0.251351915041242,0.242873835985486 +lichen,lichen,north,,,Cladonia.chlorophaea,Mixedwood,5,0.236140666947542,0.203901410662992,0.241600545650375,0.236140666947542 +lichen,lichen,north,,,Cladonia.chlorophaea,BlackSpruce,5,0.225302562827919,0.196261190714303,0.244967963651107,0.227843083435444 +lichen,lichen,north,,,Cladonia.chlorophaea,TreedFen,5,0.224783844707001,0.197704546932338,0.235642483863854,0.224783844707001 +lichen,lichen,north,,,Cladonia.chlorophaea,TreedSwamp,5,0.242591050953153,0.214272220682311,0.263632169592523,0.252640022245541 +lichen,lichen,north,,,Cladonia.chlorophaea,GraminoidFen,5,0.202508662292495,0.17836174844921,0.21210857272356,0.202508662292495 +lichen,lichen,north,,,Cladonia.chlorophaea,ShrubbyFen,5,0.199216086052812,0.177644856358741,0.212793282034292,0.199216086052812 +lichen,lichen,north,,,Cladonia.chlorophaea,ShrubbyBog,5,0.221625062963166,0.192800896978028,0.237791260930442,0.22188456568578 +lichen,lichen,north,,,Cladonia.chlorophaea,ShrubbySwamp,5,0.200597494570593,0.181101882111374,0.22301802236821,0.214356168657179 +lichen,lichen,north,,,Cladonia.chlorophaea,Marsh,5,0.175479744974187,0.145546102447274,0.1832220543811,0.175479744974187 +lichen,lichen,north,,,Cladonia.chlorophaea,Shrub,5,0.106371701235334,0.0787744447962615,0.122122293070246,0.12074279741616 +lichen,lichen,north,,,Cladonia.chlorophaea,Grass,5,0.096028783987272,0.0852156012169443,0.115683635060321,0.119014260443607 +lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruceR,5,0.169230436345503,0.139669943547809,0.195621086516419,0.18615405031743 +lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce1,5,0.181781734947402,0.144657786769576,0.210046678174516,0.20367100535893 +lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce2,5,0.208024972338578,0.167844483274645,0.235168093350801,0.225668903881609 +lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce3,5,0.208024972338578,0.167844483274645,0.235168093350801,0.225668903881609 +lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce4,5,0.208024972338578,0.167844483274645,0.235168093350801,0.225668903881609 +lichen,lichen,north,,,Cladonia.chlorophaea,CCPineR,5,0.167651692032762,0.133400179473255,0.18613840582969,0.177981748325327 +lichen,lichen,north,,,Cladonia.chlorophaea,CCPine1,5,0.205931254374661,0.156797989826113,0.214389722872389,0.215966217533035 +lichen,lichen,north,,,Cladonia.chlorophaea,CCPine2,5,0.20940040025485,0.161084160390568,0.217535050260925,0.219134448870029 +lichen,lichen,north,,,Cladonia.chlorophaea,CCPine3,5,0.20940040025485,0.161084160390568,0.217535050260925,0.219134448870029 +lichen,lichen,north,,,Cladonia.chlorophaea,CCPine4,5,0.20940040025485,0.161084160390568,0.217535050260925,0.219134448870029 +lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduousR,5,0.182662436599129,0.143290947030515,0.19168320742142,0.185594844139235 +lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous1,5,0.169020934098229,0.153496766364474,0.186476102510212,0.18593824743331 +lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous2,5,0.192198726287736,0.158139093430204,0.206351929165891,0.20739871277065 +lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous3,5,0.192198726287736,0.158139093430204,0.206351929165891,0.20739871277065 +lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous4,5,0.192198726287736,0.158139093430204,0.206351929165891,0.20739871277065 +lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwoodR,5,0.182662436599129,0.143290947030515,0.19168320742142,0.185594844139235 +lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood1,5,0.169020934098229,0.153496766364474,0.186476102510212,0.18593824743331 +lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood2,5,0.192198726287736,0.158139093430204,0.206351929165891,0.20739871277065 +lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood3,5,0.192198726287736,0.158139093430204,0.206351929165891,0.20739871277065 +lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood4,5,0.192198726287736,0.158139093430204,0.206351929165891,0.20739871277065 +lichen,lichen,north,,,Cladonia.chlorophaea,EnSeismic,5,0.0677503172110941,0.0471429245544719,0.0732894752325876,0.0738978700051816 +lichen,lichen,north,,,Cladonia.chlorophaea,EnSoftLin,5,0.0560689010826879,0.0412420864698087,0.0607043262160254,0.0624980816232269 +lichen,lichen,north,,,Cladonia.chlorophaea,TrSoftLin,5,0.0605465982137621,0.0416835448522874,0.0681202259279406,0.0691216097124846 +lichen,lichen,north,,,Cladonia.chlorophaea,HardLin,5,0.0163800997555834,0.0142046646641618,0.0207897341200193,0.0172490121407761 +lichen,lichen,north,,,Cladonia.chlorophaea,UrbInd,5,0.026932901747997,0.0217317496788856,0.032534963821666,0.0293523293874362 +lichen,lichen,north,,,Cladonia.chlorophaea,Wellsites,5,0.0269864370031369,0.0206711523672041,0.0318822891198792,0.0309948356921504 +lichen,lichen,north,,,Cladonia.chlorophaea,Crop,5,0.00896331783563511,0.0086673108662899,0.0116267325606197,0.00981647353265912 +lichen,lichen,north,,,Cladonia.chlorophaea,TameP,5,0.0284182757721163,0.0236344354897084,0.0319552752867162,0.0276152084684389 +lichen,lichen,north,,,Cladonia.chlorophaea,RoughP,5,0.025017860881902,0.0188312694768778,0.026815348770033,0.0254030986816399 +lichen,lichen,north,,,Physcia.adscendens,WhiteSpruce,5,0.0674088713205342,0.0614470981390403,0.0709653557850045,0.0640273150290537 +lichen,lichen,north,,,Physcia.adscendens,Pine,5,0.0472827411302775,0.0444708053145572,0.0510027667554357,0.0463066694973039 +lichen,lichen,north,,,Physcia.adscendens,Deciduous,5,0.171848485649294,0.166777961008327,0.183050642925004,0.171848485649294 +lichen,lichen,north,,,Physcia.adscendens,Mixedwood,5,0.103902979074589,0.0988920160049394,0.118672559907655,0.103902979074589 +lichen,lichen,north,,,Physcia.adscendens,BlackSpruce,5,0.0116692571413722,0.0109018461718084,0.0148387626612113,0.0111517688016057 +lichen,lichen,north,,,Physcia.adscendens,TreedFen,5,0.0134516061910062,0.0123980063480553,0.0165551828482426,0.0127565152125194 +lichen,lichen,north,,,Physcia.adscendens,TreedSwamp,5,0.0684768936890089,0.0623100924562356,0.0815946560942004,0.0684768936890089 +lichen,lichen,north,,,Physcia.adscendens,GraminoidFen,5,0.0143523346004894,0.0138707572661006,0.0201350817078948,0.0143523346004894 +lichen,lichen,north,,,Physcia.adscendens,ShrubbyFen,5,0.0135292337016339,0.0132145942878114,0.0184646324742449,0.0134564657796432 +lichen,lichen,north,,,Physcia.adscendens,ShrubbyBog,5,0.0122579132788025,0.0117121025240539,0.0159189671771411,0.0119692218653384 +lichen,lichen,north,,,Physcia.adscendens,ShrubbySwamp,5,0.0642372109431116,0.0574653507523936,0.0782239746399321,0.0642372109431116 +lichen,lichen,north,,,Physcia.adscendens,Marsh,5,0.0421183317862372,0.0354669594231994,0.0538859562288842,0.0421183317862372 +lichen,lichen,north,,,Physcia.adscendens,Shrub,5,0.148981950749374,0.139298464646428,0.195805779656963,0.159263060245612 +lichen,lichen,north,,,Physcia.adscendens,Grass,5,0.155922328843144,0.144176169953379,0.217726117790744,0.165761675145329 +lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruceR,5,0.0524933497432348,0.0448033430759125,0.0658373565662838,0.0524933497432348 +lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce1,5,0.0676142549226719,0.0595386229110912,0.0842373851191382,0.0676142549226719 +lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce2,5,0.075962081883682,0.0661774643260701,0.0924254985770442,0.075962081883682 +lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce3,5,0.075962081883682,0.0661774643260701,0.0924254985770442,0.075962081883682 +lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce4,5,0.075962081883682,0.0661774643260701,0.0924254985770442,0.075962081883682 +lichen,lichen,north,,,Physcia.adscendens,CCPineR,5,0.0530687182992354,0.0447898946528459,0.0673364978932711,0.0530687182992354 +lichen,lichen,north,,,Physcia.adscendens,CCPine1,5,0.054822170261719,0.0468044875054749,0.0681089706028397,0.054822170261719 +lichen,lichen,north,,,Physcia.adscendens,CCPine2,5,0.0575642554040823,0.0490603503195198,0.0707082507546723,0.0575642554040823 +lichen,lichen,north,,,Physcia.adscendens,CCPine3,5,0.0575642554040823,0.0490603503195198,0.0707082507546723,0.0575642554040823 +lichen,lichen,north,,,Physcia.adscendens,CCPine4,5,0.0575642554040823,0.0490603503195198,0.0707082507546723,0.0575642554040823 +lichen,lichen,north,,,Physcia.adscendens,CCDeciduousR,5,0.0827606661851487,0.0719443499282712,0.0987851185715972,0.0827606661851487 +lichen,lichen,north,,,Physcia.adscendens,CCDeciduous1,5,0.100618826509217,0.0877886957545074,0.125713872307938,0.100618826509217 +lichen,lichen,north,,,Physcia.adscendens,CCDeciduous2,5,0.084212382915902,0.073575752550813,0.103101354854498,0.084212382915902 +lichen,lichen,north,,,Physcia.adscendens,CCDeciduous3,5,0.084212382915902,0.073575752550813,0.103101354854498,0.084212382915902 +lichen,lichen,north,,,Physcia.adscendens,CCDeciduous4,5,0.084212382915902,0.073575752550813,0.103101354854498,0.084212382915902 +lichen,lichen,north,,,Physcia.adscendens,CCMixedwoodR,5,0.0827606661851487,0.0719443499282712,0.0987851185715972,0.0827606661851487 +lichen,lichen,north,,,Physcia.adscendens,CCMixedwood1,5,0.100618826509217,0.0877886957545074,0.125713872307938,0.100618826509217 +lichen,lichen,north,,,Physcia.adscendens,CCMixedwood2,5,0.084212382915902,0.073575752550813,0.103101354854498,0.084212382915902 +lichen,lichen,north,,,Physcia.adscendens,CCMixedwood3,5,0.084212382915902,0.073575752550813,0.103101354854498,0.084212382915902 +lichen,lichen,north,,,Physcia.adscendens,CCMixedwood4,5,0.084212382915902,0.073575752550813,0.103101354854498,0.084212382915902 +lichen,lichen,north,,,Physcia.adscendens,EnSeismic,5,0.0256366775276155,0.0220396461224062,0.0258667757531508,0.0258176949589414 +lichen,lichen,north,,,Physcia.adscendens,EnSoftLin,5,0.0273345543422601,0.0238543237522917,0.0285016462750445,0.0273345543422601 +lichen,lichen,north,,,Physcia.adscendens,TrSoftLin,5,0.0237240874831371,0.0199061804072359,0.0246224989022288,0.0242538337610053 +lichen,lichen,north,,,Physcia.adscendens,HardLin,5,0.019409667521594,0.0160175308478019,0.0222563530629276,0.0164220788059039 +lichen,lichen,north,,,Physcia.adscendens,UrbInd,5,0.0269462495385606,0.0228419440845845,0.0343747203469902,0.0269462495385606 +lichen,lichen,north,,,Physcia.adscendens,Wellsites,5,0.0189042713169681,0.0175846129876694,0.0279662325594366,0.0189042713169681 +lichen,lichen,north,,,Physcia.adscendens,Crop,5,0.0061978772206181,0.00485501825215725,0.00819431107983461,0.0061978772206181 +lichen,lichen,north,,,Physcia.adscendens,TameP,5,0.0217469866099191,0.0205259688525677,0.0269346862339065,0.0217469866099191 +lichen,lichen,north,,,Physcia.adscendens,RoughP,5,0.039996203554655,0.0376640264085737,0.0479047806634932,0.039996203554655 +lichen,lichen,south,,,Cladonia.chlorophaea,Loamy,5,0.118687300046851,0.104702736998946,0.12654114918338,0.118687300046851 +lichen,lichen,south,,,Cladonia.chlorophaea,SandyLoam,5,0.119258055085243,0.104379389676667,0.12444806981178,0.122725360583689 +lichen,lichen,south,,,Cladonia.chlorophaea,ClaySub,5,0.115647388648516,0.100225827670201,0.120420274007026,0.11648008810727 +lichen,lichen,south,,,Cladonia.chlorophaea,RapidDrain,5,0.134401942825707,0.130919679999458,0.142386868085905,0.134401942825707 +lichen,lichen,south,,,Cladonia.chlorophaea,Blowout,5,0.151003729060033,0.142629562152347,0.160102906059062,0.143701037126792 +lichen,lichen,south,,,Cladonia.chlorophaea,ThinBreak,5,0.137503969297793,0.129839880347417,0.148096403740304,0.137503969297793 +lichen,lichen,south,,,Cladonia.chlorophaea,Other,5,0.011592343091593,0.0046173071411171,0.0231715222749202,0.011592343091593 +lichen,lichen,south,,,Cladonia.chlorophaea,EnSeismic,5,0.0962488205728889,0.0753549922631135,0.252780357762154,0.0746380066039094 +lichen,lichen,south,,,Cladonia.chlorophaea,EnSoftLin,5,0.100106376262895,0.0629831331203498,0.25663036318437,0.0593528864488744 +lichen,lichen,south,,,Cladonia.chlorophaea,TrSoftLin,5,0.104765725082673,0.0622678835132489,0.285864107347038,0.104765725082673 +lichen,lichen,south,,,Cladonia.chlorophaea,HardLin,5,0.0224141883326856,0.0219404643210603,0.0240466025090097,0.0224141883326856 +lichen,lichen,south,,,Cladonia.chlorophaea,UrbInd,5,0.0316560982778314,0.0261042267475289,0.0343242569398769,0.0287494220624193 +lichen,lichen,south,,,Cladonia.chlorophaea,Wellsites,5,0.0355928387293783,0.0297480296972117,0.0456614857314296,0.0355928387293783 +lichen,lichen,south,,,Cladonia.chlorophaea,Crop,5,0.0115918691627171,0.0109797156544521,0.0127817951554016,0.0108908943675099 +lichen,lichen,south,,,Cladonia.chlorophaea,TameP,5,0.0528035523685076,0.0519157543218056,0.0592890736068868,0.0527988783208814 +lichen,lichen,south,,,Cladonia.chlorophaea,RoughP,5,0.0704617752927988,0.0683113023707642,0.0754893494676391,0.0704617752927988 +lichen,lichen,south,,,Physcia.adscendens,Loamy,5,0.165058834401252,0.151196844376258,0.179127371014315,0.169700398944145 +lichen,lichen,south,,,Physcia.adscendens,SandyLoam,5,0.178172116249331,0.161926494649089,0.189941302784499,0.181481384725004 +lichen,lichen,south,,,Physcia.adscendens,ClaySub,5,0.155520095046812,0.142809679634744,0.167690632468226,0.162178734164762 +lichen,lichen,south,,,Physcia.adscendens,RapidDrain,5,0.133157166351654,0.123712598889612,0.139250440689584,0.138113163461797 +lichen,lichen,south,,,Physcia.adscendens,Blowout,5,0.0780059275319079,0.0605615716646166,0.0817059444700948,0.0791009289771177 +lichen,lichen,south,,,Physcia.adscendens,ThinBreak,5,0.103023942244417,0.0819954494155731,0.103983652295498,0.103023942244417 +lichen,lichen,south,,,Physcia.adscendens,Other,5,0.108836563387276,0.0821453221454944,0.133452128995239,0.127814796703126 +lichen,lichen,south,,,Physcia.adscendens,EnSeismic,5,0.140820975204423,0.129482190661842,0.19424153380181,0.134144710345317 +lichen,lichen,south,,,Physcia.adscendens,EnSoftLin,5,0.106052188933668,0.0814400391043974,0.130572037732656,0.0868856909303751 +lichen,lichen,south,,,Physcia.adscendens,TrSoftLin,5,0.157835534383738,0.120487024187209,0.209774497540774,0.157835534383738 +lichen,lichen,south,,,Physcia.adscendens,HardLin,5,0.0165350535429243,0.0120621070012098,0.0195286140965431,0.0165350535429243 +lichen,lichen,south,,,Physcia.adscendens,UrbInd,5,0.0389262598086267,0.0294939748318359,0.0530990959477553,0.0431506202004028 +lichen,lichen,south,,,Physcia.adscendens,Wellsites,5,0.0361212212999052,0.0282999511156899,0.0508786677112775,0.0413073764753538 +lichen,lichen,south,,,Physcia.adscendens,Crop,5,0.00923975055880215,0.00688935614723793,0.00990739362805418,0.00923975055880215 +lichen,lichen,south,,,Physcia.adscendens,TameP,5,0.026713869603247,0.0180795051503958,0.0297402158652557,0.026713869603247 +lichen,lichen,south,,,Physcia.adscendens,RoughP,5,0.039320400519205,0.0281759149172245,0.0418780712232037,0.039320400519205 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Decid,5,0.047640807803491,0.0421034563656317,0.0521300438758573,0.0487558878166635 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Mixedwood,5,0.0279054540414128,0.0181658689236166,0.0367559849225421,0.0339606541972421 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Pine,5,0.0268788058190438,0.0209609632124494,0.0305097583077334,0.0258942184497686 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Spruce,5,0.0176721263875699,0.0146608207690292,0.0193257868464236,0.0155269078679997 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,TreedBog,5,0.0312070092273878,0.0296707284210888,0.0333575322543523,0.0299192022319042 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,TreedFen,5,0.031652259109271,0.0295795976387661,0.0337216938968473,0.0299192022319042 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,TreedSwamp,5,0.0344943810177399,0.0306124249828509,0.0489375718055997,0.0299192022319042 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,GrassHerb,5,0.0653279741583057,0.061888271218626,0.089856562855897,0.0701423452426464 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Shrub,5,0.0611030881192147,0.0442445083456052,0.0682165968089101,0.0701423452426464 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,GraminoidFen,5,0.0329008222005278,0.0311059034360441,0.0791720523993423,0.0320501190239091 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Marsh,5,0.0329008222005278,0.0311059034360441,0.0791720523993423,0.0320501190239091 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,ShrubbyBog,5,0.0304764263774674,0.0254605104823409,0.0325605409298803,0.0320501190239091 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,ShrubbyFen,5,0.0304764263774674,0.0254605104823409,0.0325605409298803,0.0320501190239091 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,ShrubbySwamp,5,0.0304764263774674,0.0207171959827077,0.0325605409298803,0.0320501190239091 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCDecidR,5,0.0519264751930211,0.0421909761363827,0.0610656929689814,0.0664247062431653 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCDecid1,5,0.0664247062431653,0.0454313130756783,0.161801935827499,0.0664247062431653 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCDecid2,5,0.0403674064209935,0.0226811921693289,0.0610656929689814,0.0664247062431653 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCDecid3,5,0.0664247062431653,0.0454313130756783,0.13984577572166,0.0664247062431653 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCDecid4,5,0.0664247062431653,0.0454313130756783,0.13984577572166,0.0664247062431653 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCMixedwoodR,5,0.0403674064209935,1.86696880287542e-07,0.0610656929689814,0.0664247062431653 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCMixedwood1,5,0.0664247062431653,0.0454313130756783,0.0985082759740731,0.0664247062431653 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCMixedwood2,5,0.0664247062431653,0.0454313130756783,0.0927460852883475,0.0664247062431653 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCMixedwood3,5,0.0664247062431653,0.0454313130756783,0.13984577572166,0.0664247062431653 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCMixedwood4,5,0.0664247062431653,0.0454313130756783,0.13984577572166,0.0664247062431653 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCPineR,5,0.0329977774300808,0.0275981212995825,0.055494150911045,0.0418434478038768 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCPine1,5,0.0286931152246994,0.00895589257187608,0.0383051796543584,0.0418434478038768 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCPine2,5,0.0418434478038768,0.030414980106852,0.13984577572166,0.0418434478038768 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCPine3,5,0.0418434478038768,0.030414980106852,0.13984577572166,0.0418434478038768 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCPine4,5,0.0418434478038768,0.030414980106852,0.13984577572166,0.0418434478038768 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCSpruceR,5,0.0418434478038768,0.030414980106852,0.305015280094132,0.0418434478038768 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCSpruce1,5,0.0329977774300808,0.0114772753535638,0.0426296284343427,0.0418434478038768 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCSpruce2,5,0.0329977774300808,0.0196456208529556,0.0493468226750582,0.0418434478038768 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCSpruce3,5,0.0418434478038768,0.030414980106852,0.13984577572166,0.0418434478038768 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCSpruce4,5,0.0418434478038768,0.030414980106852,0.13984577572166,0.0418434478038768 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,HardLin,5,0.134939746303501,0.11313165192637,0.138252211851646,0.140140987080189 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,EnSoftLin,5,0.135928985585703,0.114033932348076,0.146463088964367,0.108633567141907 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,EnSeismic,5,0.12213448015733,0.0890416535123073,0.143994279540726,0.108633567141907 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,TrSoftLin,5,0.108633567141907,0.0713041482970402,0.138717152503764,0.108633567141907 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Urban,5,0.134939746303501,0.11313165192637,0.138252211851646,0.140140987080189 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Rural,5,0.134939746303501,0.11313165192637,0.138252211851646,0.140140987080189 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Industrial,5,0.134939746303501,0.11313165192637,0.138252211851646,0.140140987080189 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Well,5,0.129304108911142,0.0508739875681123,0.138060490769514,0.140140987080189 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Crop,5,0.134939746303501,0.130856632631654,0.142628003268766,0.140140987080189 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,TameP,5,0.140140987080189,0.131558363868086,0.166944782085177,0.140140987080189 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,RoughP,5,0.134939746303501,0.107211805137829,0.197177402914023,0.140140987080189 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Decid,5,0.257670301669833,0.25268511782041,0.299216536351889,0.250263196314734 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Mixedwood,5,0.275371757751266,0.246931841338979,0.300679741105016,0.267778296796379 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Pine,5,0.191627552662267,0.185639377125035,0.22504720435644,0.191627552662267 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Spruce,5,0.227199239938309,0.197719069725711,0.261529215102722,0.211937623492895 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,TreedBog,5,0.148793830904151,0.132497404514779,0.155371350064858,0.13349759896445 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,TreedFen,5,0.144475982710738,0.132978225672994,0.154438886014026,0.140460621172556 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,TreedSwamp,5,0.249048354321576,0.223475542712116,0.289138875493625,0.219333664647888 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,GrassHerb,5,0.2480296169969,0.237318154647019,0.315522864674229,0.243208536186666 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Shrub,5,0.23362253489809,0.21634137243735,0.257032219262653,0.23362253489809 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,GraminoidFen,5,0.272335942420037,0.244138225439184,0.296606395166859,0.272335942420037 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Marsh,5,0.272335942420037,0.244138225439184,0.296606395166859,0.272335942420037 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,ShrubbyBog,5,0.129805148819312,0.116205825982704,0.158770458351882,0.123758665516073 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,ShrubbyFen,5,0.129805148819312,0.116205825982704,0.158770458351882,0.123758665516073 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,ShrubbySwamp,5,0.188745324781336,0.167005561530848,0.253626121411953,0.188745324781336 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCDecidR,5,0.231790845755958,0.199250708118932,0.239359596218743,0.204735734181689 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCDecid1,5,0.231790845755958,0.199250708118932,0.239359596218743,0.204735734181689 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCDecid2,5,0.231790845755958,0.199250708118932,0.239359596218743,0.204735734181689 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCDecid3,5,0.231790845755958,0.199250708118932,0.239359596218743,0.204735734181689 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCDecid4,5,0.231790845755958,0.199250708118932,0.239359596218743,0.204735734181689 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCMixedwoodR,5,0.231790845755958,0.199250708118932,0.239359596218743,0.204735734181689 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCMixedwood1,5,0.231790845755958,0.199250708118932,0.239359596218743,0.204735734181689 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCMixedwood2,5,0.231790845755958,0.199250708118932,0.239359596218743,0.204735734181689 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCMixedwood3,5,0.231790845755958,0.199250708118932,0.239359596218743,0.204735734181689 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCMixedwood4,5,0.231790845755958,0.199250708118932,0.239359596218743,0.204735734181689 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCPineR,5,0.334283211887097,0.223646034396249,0.350195977658891,0.252728055432474 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCPine1,5,0.334283211887097,0.223646034396249,0.350195977658891,0.252728055432474 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCPine2,5,0.334283211887097,0.223646034396249,0.350195977658891,0.252728055432474 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCPine3,5,0.334283211887097,0.223646034396249,0.350195977658891,0.252728055432474 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCPine4,5,0.334283211887097,0.223646034396249,0.350195977658891,0.252728055432474 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCSpruceR,5,0.321916199827704,0.226786073940564,0.3362304790634,0.251426565070253 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCSpruce1,5,0.321916199827704,0.226786073940564,0.3362304790634,0.251426565070253 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCSpruce2,5,0.321916199827704,0.226786073940564,0.3362304790634,0.251426565070253 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCSpruce3,5,0.321916199827704,0.226786073940564,0.3362304790634,0.251426565070253 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCSpruce4,5,0.321916199827704,0.226786073940564,0.3362304790634,0.251426565070253 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,HardLin,5,0.19071774622534,0.0974007399519308,0.240733568496156,0.111539574120126 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,EnSoftLin,5,0.248284317219045,0.226169685664436,0.301392052670499,0.245765939186683 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,EnSeismic,5,0.426961347747829,0.389435322188954,0.481650459050364,0.40014515763882 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,TrSoftLin,5,0.17814172514827,0.12158426489911,0.222472294628215,0.191095088735685 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Urban,5,0.19071774622534,0.0974007399519308,0.240733568496156,0.111539574120126 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Rural,5,0.19071774622534,0.0974007399519308,0.240733568496156,0.111539574120126 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Industrial,5,0.19071774622534,0.0974007399519308,0.240733568496156,0.111539574120126 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Well,5,0.204111777253966,0.157588378902068,0.3180994853061,0.135502134019886 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Crop,5,0.177273110573243,0.159339604167137,0.20698726239642,0.177273110573243 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,TameP,5,0.106013821908483,0.0894430978024326,0.17346343225447,0.0952839991630323 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,RoughP,5,0.274174686267773,0.223732051403491,0.374273016748219,0.274174686267773 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,ClaySub,5,0.555220139484688,0.394498331723014,0.702736975528346,0.555220139484688 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Other,5,0.555220139484688,0.394498331723014,0.702736975528346,0.555220139484688 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,RapidDrain,5,0.634195131080269,0.466725133776188,0.702736975528346,0.555220139484688 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Loamy,5,0.585624995059312,0.517090683974723,0.733450970235701,0.585624995059312 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,SandyLoam,5,0.779017339675273,0.680988596683654,0.866425950439531,0.779017339675273 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,ThinBreak,5,0.555220139484688,0.448231043418837,0.702736975528346,0.555220139484688 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Blowout,5,0.555220139484688,0.448231043418837,0.702736975528346,0.555220139484688 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Urban,5,0.583445114492641,0.499588697752921,0.825386051737734,0.487723056831294 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Rural,5,0.583445114492641,0.499588697752921,0.825386051737734,0.487723056831294 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Industrial,5,0.583445114492641,0.499588697752921,0.825386051737734,0.487723056831294 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Well,5,0.517387159135361,0.485351712822258,0.654799112289952,0.487723056831294 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Mine,5,0.583445114492641,0.499588697752921,0.825386051737734,0.487723056831294 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,EnSoftLin,5,0.551988691379397,0.472907672172372,0.746855800537036,0.551988691379397 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,EnSeismic,5,0.551988691379397,0.472907672172372,0.746855800537036,0.551988691379397 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,HardLin,5,0.583445114492641,0.499588697752921,0.825386051737734,0.487723056831294 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,TrSoftLin,5,0.551988691379397,0.472907672172372,0.661295206321867,0.551988691379397 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Crop,5,0.664605920258043,0.543810341278273,0.777406068435428,0.664605920258043 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,RoughP,5,0.661922813941234,0.543810341278273,0.734870844221513,0.664605920258043 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,TameP,5,0.664605920258043,0.543810341278273,0.762991086100113,0.664605920258043 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,WetlandMargin,5,0.585444465824865,0.239308585750385,0.749205253519565,0.585444465824865 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,ClaySub,5,0.0667209228725318,0.0471871616217136,0.0745121978337484,0.0784267337005647 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Other,5,0.0667209228725318,0.0471871616217136,0.0745121978337484,0.0784267337005647 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,RapidDrain,5,0.0784267337005647,0.0580184128835627,0.182475942831045,0.0784267337005647 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Loamy,5,0.0565859324870483,0.0491432799330989,0.0744882681216602,0.0784267337005647 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,SandyLoam,5,0.0522167395575833,0.022088416299373,0.106394166195476,0.0784267337005647 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,ThinBreak,5,0.0667209228725318,0.0526910929547497,0.0819102188921822,0.0784267337005647 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Blowout,5,0.0667209228725318,0.0526910929547497,0.0819102188921822,0.0784267337005647 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Urban,5,0.00922653651061864,0.0027634925310201,0.030904020696116,0.00922653651061864 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Rural,5,0.00922653651061864,0.0027634925310201,0.030904020696116,0.00922653651061864 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Industrial,5,0.00922653651061864,0.0027634925310201,0.030904020696116,0.00922653651061864 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Well,5,0.00242981545308046,4.85369257366382e-09,0.00684152516554301,0.00922653651061864 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Mine,5,0.00922653651061864,0.0027634925310201,0.030904020696116,0.00922653651061864 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,EnSoftLin,5,0.036098691627639,0.0108694320397718,0.0881199281160513,0.036098691627639 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,EnSeismic,5,0.036098691627639,0.0108694320397718,0.0881199281160513,0.036098691627639 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,HardLin,5,0.00922653651061864,0.0027634925310201,0.030904020696116,0.00922653651061864 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,TrSoftLin,5,0.0271735638239476,0.0226676570357414,0.0432617606269774,0.036098691627639 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Crop,5,0.0206055204843312,0.0177111458771107,0.0251768860663094,0.0270020288489522 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,RoughP,5,0.0225176634330294,0.0183397065659335,0.0271753939444167,0.0270020288489522 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,TameP,5,0.0168291639536684,0.00689293851916878,0.0244434255031038,0.0270020288489522 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,WetlandMargin,5,1.94731766462466e-08,9.60713813825307e-09,2.26961479274612e-08,2.33837497296015e-08 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Decid,5,0.0449203614522765,0.0399272055174853,0.0461207026143072,0.0449203614522765 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Mixedwood,5,0.0273241474240622,0.0148672640830864,0.029705093739567,0.0273241474240622 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Pine,5,0.0196006162097023,0.0177223221151389,0.0208573336024009,0.0176556438960936 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Spruce,5,0.0133118475600801,0.00928641896189441,0.0154669185911262,0.0137961282417973 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,TreedBog,5,0.0269986743089763,0.0246332515524093,0.0296528479842816,0.0286355651253948 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,TreedFen,5,0.0346703571209486,0.0300665281749436,0.0351451063464642,0.0316720599445966 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,TreedSwamp,5,0.0562955719457925,0.0435834392821119,0.07751039884971,0.0562955719457925 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,GrassHerb,5,0.0804381287263335,0.077265490603449,0.0897442881448977,0.0783755759784833 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Shrub,5,0.0681831360493072,0.0495067618820586,0.0834804792057293,0.0693588214886089 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,GraminoidFen,5,0.08298929154192,0.0746709031965066,0.0861134405713966,0.0834692933781883 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Marsh,5,0.08298929154192,0.0746709031965066,0.0861134405713966,0.0834692933781883 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,ShrubbyBog,5,0.0137861868727856,0.0133312667653021,0.0163982311535578,0.0174941754511015 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,ShrubbyFen,5,0.0137861868727856,0.0133312667653021,0.0163982311535578,0.0174941754511015 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,ShrubbySwamp,5,0.023346797778904,0.015694365834426,0.0247290058987953,0.0195830589922788 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCDecidR,5,0.0634232741924905,0.0524183155350296,0.0816623550282871,0.0634232741924905 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCDecid1,5,0.0634232741924905,0.0524183155350296,0.0816623550282871,0.0634232741924905 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCDecid2,5,0.0634232741924905,0.0524183155350296,0.0816623550282871,0.0634232741924905 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCDecid3,5,0.0634232741924905,0.0524183155350296,0.0816623550282871,0.0634232741924905 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCDecid4,5,0.0634232741924905,0.0524183155350296,0.0816623550282871,0.0634232741924905 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCMixedwoodR,5,0.0634232741924905,0.0524183155350296,0.0816623550282871,0.0634232741924905 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCMixedwood1,5,0.0634232741924905,0.0524183155350296,0.0816623550282871,0.0634232741924905 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCMixedwood2,5,0.0634232741924905,0.0524183155350296,0.0816623550282871,0.0634232741924905 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCMixedwood3,5,0.0634232741924905,0.0524183155350296,0.0816623550282871,0.0634232741924905 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCMixedwood4,5,0.0634232741924905,0.0524183155350296,0.0816623550282871,0.0634232741924905 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCPineR,5,0.0429017164110987,0.0334830377890367,0.05791632388432,0.0429017164110987 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCPine1,5,0.0429017164110987,0.0334830377890367,0.05791632388432,0.0429017164110987 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCPine2,5,0.0429017164110987,0.0334830377890367,0.05791632388432,0.0429017164110987 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCPine3,5,0.0429017164110987,0.0334830377890367,0.05791632388432,0.0429017164110987 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCPine4,5,0.0429017164110987,0.0334830377890367,0.05791632388432,0.0429017164110987 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCSpruceR,5,0.024139993434008,0.0150053643826653,0.0287361913785556,0.0309648973086927 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCSpruce1,5,0.024139993434008,0.0150053643826653,0.0287361913785556,0.0309648973086927 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCSpruce2,5,0.024139993434008,0.0150053643826653,0.0287361913785556,0.0309648973086927 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCSpruce3,5,0.024139993434008,0.0150053643826653,0.0287361913785556,0.0309648973086927 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCSpruce4,5,0.024139993434008,0.0150053643826653,0.0287361913785556,0.0309648973086927 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,HardLin,5,0.121863990133419,0.119864788586073,0.129947053494084,0.118992631310027 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,EnSoftLin,5,0.108883674200791,0.0983056772774538,0.132874774675726,0.0980871465772408 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,EnSeismic,5,0.0980871465772408,0.0436913018520788,0.104783593851584,0.0980871465772408 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,TrSoftLin,5,0.0980871465772408,0.0718039852980543,0.104783593851584,0.0980871465772408 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Urban,5,0.121863990133419,0.119864788586073,0.129947053494084,0.118992631310027 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Rural,5,0.121863990133419,0.119864788586073,0.129947053494084,0.118992631310027 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Industrial,5,0.121863990133419,0.119864788586073,0.129947053494084,0.118992631310027 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Well,5,0.121863990133419,0.119864788586073,0.129947053494084,0.118992631310027 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Crop,5,0.121863990133419,0.119864788586073,0.129947053494084,0.118992631310027 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,TameP,5,0.121863990133419,0.119864788586073,0.129947053494084,0.118992631310027 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,RoughP,5,0.121863990133419,0.119864788586073,0.129947053494084,0.118992631310027 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Decid,5,0.111664402452981,0.0925676785255877,0.12838442931739,0.111664402452981 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Mixedwood,5,0.0666129636526026,0.0517060528658316,0.0780092522284266,0.0655577834788831 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Pine,5,0.0387812701455966,0.0349164779226351,0.0431552649817136,0.0434917161194809 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Spruce,5,0.0695392350566296,0.0500711157624263,0.0819420036005477,0.0695392350566296 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,TreedBog,5,0.026015783845678,0.0246467881759166,0.0391195468077491,0.0324223167296191 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,TreedFen,5,0.0324223167296191,0.0231448273336468,0.0416424211240961,0.0324223167296191 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,TreedSwamp,5,0.12705806311569,0.0777590339638333,0.135275094643934,0.138924945537604 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,GrassHerb,5,0.0538649801932773,0.0494114363460887,0.0771016483764267,0.0674988002326724 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Shrub,5,0.0845204524428601,0.0813230199104712,0.110177551407743,0.0845204524428601 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,GraminoidFen,5,0.0664848446869057,0.0548562317765635,0.0823057352013198,0.0715579377130805 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Marsh,5,0.0664848446869057,0.0548562317765635,0.0823057352013198,0.0715579377130805 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,ShrubbyBog,5,0.0664848446869057,0.0400219913426505,0.0823057352013198,0.0715579377130805 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,ShrubbyFen,5,0.0664848446869057,0.0400219913426505,0.0823057352013198,0.0715579377130805 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,ShrubbySwamp,5,0.0894709335268126,0.0685140818973756,0.11559222101601,0.0715579377130805 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCDecidR,5,0.0979659072936202,0.056000550317278,0.119035445956366,0.0987996864776002 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCDecid1,5,0.0979659072936202,0.0754740008765856,0.119035445956366,0.0987996864776002 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCDecid2,5,0.0987996864776002,0.0879270736378564,0.143484471733302,0.0987996864776002 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCDecid3,5,0.0979659072936202,0.0621286619393974,0.119035445956366,0.0987996864776002 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCDecid4,5,0.0979659072936202,0.0621286619393974,0.119035445956366,0.0987996864776002 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCMixedwoodR,5,0.0979659072936202,0.0324939517016264,0.119035445956366,0.0987996864776002 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCMixedwood1,5,0.0987996864776002,0.0879270736378564,0.190271057342052,0.0987996864776002 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCMixedwood2,5,0.0979659072936202,0.0408003100761594,0.119035445956366,0.0987996864776002 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCMixedwood3,5,0.0979659072936202,0.0621286619393974,0.119035445956366,0.0987996864776002 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCMixedwood4,5,0.0979659072936202,0.0621286619393974,0.119035445956366,0.0987996864776002 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCPineR,5,0.0979659072936202,0.06146626030886,0.119035445956366,0.0987996864776002 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCPine1,5,0.0979659072936202,0.0742813046037392,0.119035445956366,0.0987996864776002 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCPine2,5,0.0979659072936202,0.0621286619393974,0.119035445956366,0.0987996864776002 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCPine3,5,0.0979659072936202,0.0621286619393974,0.119035445956366,0.0987996864776002 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCPine4,5,0.0979659072936202,0.0621286619393974,0.119035445956366,0.0987996864776002 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCSpruceR,5,0.0987996864776002,0.0879270736378564,0.133811680469912,0.0987996864776002 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCSpruce1,5,0.0979659072936202,0.0842318615581226,0.119035445956366,0.0987996864776002 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCSpruce2,5,0.0979659072936202,0.0553515374833462,0.119035445956366,0.0987996864776002 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCSpruce3,5,0.0979659072936202,0.0621286619393974,0.119035445956366,0.0987996864776002 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCSpruce4,5,0.0979659072936202,0.0621286619393974,0.119035445956366,0.0987996864776002 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,HardLin,5,0.0655704593026337,0.0386964513077742,0.0806664925562941,0.0681539858129174 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,EnSoftLin,5,0.0499491621686334,0.0432606306115374,0.0917851939975131,0.0630037477010183 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,EnSeismic,5,0.0630037477010183,0.0470136277181822,0.0956609574711948,0.0630037477010183 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,TrSoftLin,5,0.0499491621686334,0.0381918030077569,0.0917851939975131,0.0630037477010183 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Urban,5,0.0655704593026337,0.0386964513077742,0.0806664925562941,0.0681539858129174 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Rural,5,0.0655704593026337,0.0386964513077742,0.0806664925562941,0.0681539858129174 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Industrial,5,0.0655704593026337,0.0386964513077742,0.0806664925562941,0.0681539858129174 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Well,5,0.0656654516139695,0.0626306304625554,0.0806664925562941,0.0681539858129174 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Crop,5,0.0655704593026337,0.0539031526201264,0.0806664925562941,0.0681539858129174 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,TameP,5,0.0655704593026337,0.0400397821358317,0.0806664925562941,0.0681539858129174 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,RoughP,5,0.0681539858129174,0.0626306304625554,0.157698264126943,0.0681539858129174 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,ClaySub,5,0.691634949610229,0.550848790356094,0.802465195536948,0.714170375192759 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Other,5,0.691634949610229,0.550848790356094,0.802465195536948,0.714170375192759 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,RapidDrain,5,0.710928475172056,0.569824590326749,0.802465195536948,0.714170375192759 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Loamy,5,0.614208250714799,0.535537936114048,0.793086839692097,0.714170375192759 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,SandyLoam,5,0.710928475172056,0.569824590326749,0.851537864173555,0.714170375192759 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,ThinBreak,5,0.714170375192759,0.493395564734683,0.821258910605355,0.714170375192759 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Blowout,5,0.714170375192759,0.493395564734683,0.821258910605355,0.714170375192759 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Urban,5,0.757773549137013,0.657116840415395,0.839728338581547,0.757773549137013 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Rural,5,0.757773549137013,0.657116840415395,0.839728338581547,0.757773549137013 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Industrial,5,0.757773549137013,0.657116840415395,0.839728338581547,0.757773549137013 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Well,5,0.665294102611545,0.500844990155389,0.838316421030783,0.757773549137013 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Mine,5,0.757773549137013,0.657116840415395,0.839728338581547,0.757773549137013 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,EnSoftLin,5,0.652008305064925,0.550739776228706,0.78332637135667,0.628634628150965 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,EnSeismic,5,0.652008305064925,0.550739776228706,0.78332637135667,0.628634628150965 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,HardLin,5,0.757773549137013,0.657116840415395,0.839728338581547,0.757773549137013 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,TrSoftLin,5,0.628634628150965,0.425072256873216,0.765678825360405,0.628634628150965 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Crop,5,0.753168326869958,0.644219978099744,0.838316421030783,0.757773549137013 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,RoughP,5,0.753168326869958,0.5812621652318,0.838316421030783,0.757773549137013 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,TameP,5,0.753168326869958,0.660198982643474,0.838316421030783,0.757773549137013 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,WetlandMargin,5,0.870880735779777,0.824509912771411,0.934646436936643,0.870880735779777 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,ClaySub,5,0.0108355773911345,0.00400015925223842,0.0145163537839974,0.0141945654676911 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Other,5,0.0108355773911345,0.00400015925223842,0.0145163537839974,0.0141945654676911 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,RapidDrain,5,0.0141945654676911,0.00412645388529901,0.0149565220342368,0.0141945654676911 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Loamy,5,0.0141945654676911,0.00459311158353375,0.0160836483068433,0.0141945654676911 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,SandyLoam,5,0.0141945654676911,0.0101099232735522,0.0149565220342368,0.0141945654676911 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,ThinBreak,5,0.0147308793282016,0.0124614000782512,0.0267202462630917,0.0141945654676911 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Blowout,5,0.0147308793282016,0.0124614000782512,0.0267202462630917,0.0141945654676911 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Urban,5,9.37290365828135e-10,5.80885222938139e-10,1.02858504274146e-09,9.67698723675452e-10 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Rural,5,9.37290365828135e-10,5.80885222938139e-10,1.02858504274146e-09,9.67698723675452e-10 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Industrial,5,9.37290365828135e-10,5.80885222938139e-10,1.02858504274146e-09,9.67698723675452e-10 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Well,5,8.90552084803996e-10,3.87060694623438e-10,1.24813630833937e-09,8.90552084803996e-10 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Mine,5,9.37290365828135e-10,5.80885222938139e-10,1.02858504274146e-09,9.67698723675452e-10 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,EnSoftLin,5,0.0367985674989132,0.018521560297194,0.0629261097189651,0.0367985674989132 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,EnSeismic,5,0.0367985674989132,0.018521560297194,0.0629261097189651,0.0367985674989132 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,HardLin,5,9.37290365828135e-10,5.80885222938139e-10,1.02858504274146e-09,9.67698723675452e-10 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,TrSoftLin,5,0.0022392793878417,0.00098112936391626,0.00374456156057241,0.00374705166332369 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Crop,5,0.0051325112730342,0.00259608383885104,0.00661901820530916,0.00559204853976238 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,RoughP,5,0.00988095151082199,0.00435679506693851,0.0155976420996964,0.00988095151082199 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,TameP,5,0.00292203063138844,0.000742013980820096,0.00419414527275806,0.00325978967361389 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,WetlandMargin,5,2.01430416447776e-09,1.84918028139387e-09,3.24837282140699e-09,2.06303834717273e-09 +mite,mite,north,,,Ceratozetes.gracilis,WhiteSpruce,5,0.083324839926525,0.0773341259190752,0.0945808748551744,0.0783644708180673 +mite,mite,north,,,Ceratozetes.gracilis,Pine,5,0.058491231242114,0.0555475742526604,0.0633659637812255,0.0561087495328157 +mite,mite,north,,,Ceratozetes.gracilis,Deciduous,5,0.126688146057812,0.122367096566167,0.134062754480131,0.120032888034155 +mite,mite,north,,,Ceratozetes.gracilis,Mixedwood,5,0.0990912857393305,0.0936387390038836,0.106178442160669,0.0922465109400969 +mite,mite,north,,,Ceratozetes.gracilis,BlackSpruce,5,0.0210071881552033,0.0194431031984639,0.0243987448926687,0.0201312092719344 +mite,mite,north,,,Ceratozetes.gracilis,TreedFen,5,0.026580724324828,0.024242440270075,0.0332422257164936,0.0260589020761079 +mite,mite,north,,,Ceratozetes.gracilis,TreedSwamp,5,0.0749606880704819,0.0680207443603623,0.0931006713769451,0.0749606880704819 +mite,mite,north,,,Ceratozetes.gracilis,GraminoidFen,5,0.0274581642389803,0.0235853563324741,0.0322028810746652,0.0256468478624544 +mite,mite,north,,,Ceratozetes.gracilis,ShrubbyFen,5,0.0270291842209052,0.0233274790353779,0.0319634992742681,0.0254940252637942 +mite,mite,north,,,Ceratozetes.gracilis,ShrubbyBog,5,0.0221218552654225,0.0203526759367032,0.0258708245808148,0.0212207018552364 +mite,mite,north,,,Ceratozetes.gracilis,ShrubbySwamp,5,0.0787981143345215,0.0700959541686417,0.0912831982274847,0.0787981143345215 +mite,mite,north,,,Ceratozetes.gracilis,Marsh,5,0.0614924047415441,0.0503717579633235,0.0745768553412364,0.0549398690582114 +mite,mite,north,,,Ceratozetes.gracilis,Shrub,5,0.0690326282206128,0.0637085121852232,0.0855845655242005,0.0690326282206128 +mite,mite,north,,,Ceratozetes.gracilis,Grass,5,0.0717095541732357,0.0665149686947679,0.0985453710875707,0.0717095541732357 +mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruceR,5,0.107672074614269,0.0972477109913009,0.118541349512236,0.104199864858387 +mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce1,5,0.123393977309761,0.112425193396225,0.139387320231618,0.123393977309761 +mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce2,5,0.12437831599326,0.111359493905728,0.132705413454322,0.121062001485335 +mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce3,5,0.12437831599326,0.111359493905728,0.132705413454322,0.121062001485335 +mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce4,5,0.12437831599326,0.111359493905728,0.132705413454322,0.121062001485335 +mite,mite,north,,,Ceratozetes.gracilis,CCPineR,5,0.113773520489961,0.101859256408014,0.122211261862114,0.108797637100679 +mite,mite,north,,,Ceratozetes.gracilis,CCPine1,5,0.116106855588166,0.100441204830365,0.123976852017442,0.108122243613567 +mite,mite,north,,,Ceratozetes.gracilis,CCPine2,5,0.11817066960193,0.100316838150487,0.122679046365626,0.107706392899407 +mite,mite,north,,,Ceratozetes.gracilis,CCPine3,5,0.11817066960193,0.100316838150487,0.122679046365626,0.107706392899407 +mite,mite,north,,,Ceratozetes.gracilis,CCPine4,5,0.11817066960193,0.100316838150487,0.122679046365626,0.107706392899407 +mite,mite,north,,,Ceratozetes.gracilis,CCDeciduousR,5,0.144899037202292,0.133976042079909,0.148502963566285,0.134759239890019 +mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous1,5,0.173136461097876,0.161422569448153,0.176484401334677,0.159272382892999 +mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous2,5,0.134339082107598,0.127640012945417,0.1355719650486,0.12851467723662 +mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous3,5,0.134339082107598,0.127640012945417,0.1355719650486,0.12851467723662 +mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous4,5,0.134339082107598,0.127640012945417,0.1355719650486,0.12851467723662 +mite,mite,north,,,Ceratozetes.gracilis,CCMixedwoodR,5,0.144899037202292,0.133976042079909,0.148502963566285,0.134759239890019 +mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood1,5,0.173136461097876,0.161422569448153,0.176484401334677,0.159272382892999 +mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood2,5,0.134339082107598,0.127640012945417,0.1355719650486,0.12851467723662 +mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood3,5,0.134339082107598,0.127640012945417,0.1355719650486,0.12851467723662 +mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood4,5,0.134339082107598,0.127640012945417,0.1355719650486,0.12851467723662 +mite,mite,north,,,Ceratozetes.gracilis,EnSeismic,5,0.0802806120357541,0.0732029866316614,0.108944026446484,0.0802806120357541 +mite,mite,north,,,Ceratozetes.gracilis,EnSoftLin,5,0.0877847291238477,0.0716619099530992,0.114953790660522,0.0797199425033713 +mite,mite,north,,,Ceratozetes.gracilis,TrSoftLin,5,0.0824456293556031,0.0689700330268259,0.109575945632792,0.0742439958268106 +mite,mite,north,,,Ceratozetes.gracilis,HardLin,5,0.0268643924591711,0.0257899412772818,0.0304421627930103,0.0268643924591711 +mite,mite,north,,,Ceratozetes.gracilis,UrbInd,5,0.0514318415097621,0.0380292662597745,0.0597468130162695,0.0442950175704556 +mite,mite,north,,,Ceratozetes.gracilis,Wellsites,5,0.035050889042714,0.0311049144974151,0.0455477284585666,0.0328506872802035 +mite,mite,north,,,Ceratozetes.gracilis,Crop,5,0.0215366173604663,0.0212023183077577,0.027823845073315,0.0215366173604663 +mite,mite,north,,,Ceratozetes.gracilis,TameP,5,0.0350884778505926,0.0296620798510974,0.0366792367119695,0.0304807640689111 +mite,mite,north,,,Ceratozetes.gracilis,RoughP,5,0.0516992449980882,0.0487998406748331,0.0647307503735416,0.0516284245607066 +mite,mite,north,,,Trhypochthonius.tectorum,WhiteSpruce,5,0.0556561525490625,0.0510717677245686,0.0590786392356535,0.0510483651362441 +mite,mite,north,,,Trhypochthonius.tectorum,Pine,5,0.0594751004150133,0.0567146072015788,0.07263415395067,0.0594751004150133 +mite,mite,north,,,Trhypochthonius.tectorum,Deciduous,5,0.0535252270853639,0.0476609061082985,0.0610014811112496,0.0514776313631932 +mite,mite,north,,,Trhypochthonius.tectorum,Mixedwood,5,0.0563420244590419,0.0494241961076028,0.0610897108501066,0.0518923527010723 +mite,mite,north,,,Trhypochthonius.tectorum,BlackSpruce,5,0.0479250894638649,0.0425692505329721,0.053061593643466,0.0479250894638649 +mite,mite,north,,,Trhypochthonius.tectorum,TreedFen,5,0.0408841194527538,0.0377784135790944,0.0459994038000058,0.0408841194527538 +mite,mite,north,,,Trhypochthonius.tectorum,TreedSwamp,5,0.0337675075759103,0.0315015742262157,0.0379398823268421,0.033440734757267 +mite,mite,north,,,Trhypochthonius.tectorum,GraminoidFen,5,0.0407667314478653,0.0375105292015872,0.0453644606141766,0.0407667314478653 +mite,mite,north,,,Trhypochthonius.tectorum,ShrubbyFen,5,0.040625299041178,0.0380204987264493,0.0451305060870398,0.040625299041178 +mite,mite,north,,,Trhypochthonius.tectorum,ShrubbyBog,5,0.0468903066670746,0.0421032711447172,0.0516624938386451,0.0468903066670746 +mite,mite,north,,,Trhypochthonius.tectorum,ShrubbySwamp,5,0.0292316557779894,0.0280267417712238,0.0321894546760997,0.0286964469315836 +mite,mite,north,,,Trhypochthonius.tectorum,Marsh,5,0.0364031182916975,0.03246314137157,0.0387931260174801,0.0341610990357597 +mite,mite,north,,,Trhypochthonius.tectorum,Shrub,5,0.025223191055215,0.020275577906772,0.0300665662767551,0.0282145223452054 +mite,mite,north,,,Trhypochthonius.tectorum,Grass,5,0.0390477719581986,0.0270406150928457,0.0418778229533938,0.0390477719581986 +mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruceR,5,0.0467252252362432,0.0453107339176826,0.0515629452365753,0.0467252252362432 +mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce1,5,0.0439503346126213,0.0425636157475749,0.0475181466638955,0.0423468795516491 +mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce2,5,0.0443841971990541,0.0430576800412776,0.0470857489800855,0.043016752346317 +mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce3,5,0.0443841971990541,0.0430576800412776,0.0470857489800855,0.043016752346317 +mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce4,5,0.0443841971990541,0.0430576800412776,0.0470857489800855,0.043016752346317 +mite,mite,north,,,Trhypochthonius.tectorum,CCPineR,5,0.0526683392262,0.0494908781950819,0.0603392406871664,0.0518112255096306 +mite,mite,north,,,Trhypochthonius.tectorum,CCPine1,5,0.0468991106936687,0.0446094454502591,0.0499294662723947,0.0447974822354535 +mite,mite,north,,,Trhypochthonius.tectorum,CCPine2,5,0.0470893805229334,0.0447496174892123,0.0504045194737155,0.0449930704020798 +mite,mite,north,,,Trhypochthonius.tectorum,CCPine3,5,0.0470893805229334,0.0447496174892123,0.0504045194737155,0.0449930704020798 +mite,mite,north,,,Trhypochthonius.tectorum,CCPine4,5,0.0470893805229334,0.0447496174892123,0.0504045194737155,0.0449930704020798 +mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduousR,5,0.0514484824942495,0.0469845195905157,0.052906753720658,0.0451521693584135 +mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous1,5,0.0404798408803705,0.0375927192417578,0.0440082227599156,0.0368681428962799 +mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous2,5,0.0425578952838125,0.0405173081997961,0.0458365008762514,0.039821927948205 +mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous3,5,0.0425578952838125,0.0405173081997961,0.0458365008762514,0.039821927948205 +mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous4,5,0.0425578952838125,0.0405173081997961,0.0458365008762514,0.039821927948205 +mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwoodR,5,0.0514484824942495,0.0469845195905157,0.052906753720658,0.0451521693584135 +mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood1,5,0.0404798408803705,0.0375927192417578,0.0440082227599156,0.0368681428962799 +mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood2,5,0.0425578952838125,0.0405173081997961,0.0458365008762514,0.039821927948205 +mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood3,5,0.0425578952838125,0.0405173081997961,0.0458365008762514,0.039821927948205 +mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood4,5,0.0425578952838125,0.0405173081997961,0.0458365008762514,0.039821927948205 +mite,mite,north,,,Trhypochthonius.tectorum,EnSeismic,5,0.0522085190169312,0.0252569549779169,0.0665538824210485,0.0544387764396551 +mite,mite,north,,,Trhypochthonius.tectorum,EnSoftLin,5,0.0357984916598279,0.0190297380136641,0.0645302317518731,0.0402530079505476 +mite,mite,north,,,Trhypochthonius.tectorum,TrSoftLin,5,0.0330350845777108,0.0153319420477188,0.0512108000402237,0.0363880404889003 +mite,mite,north,,,Trhypochthonius.tectorum,HardLin,5,0.0243958652679851,0.0239704518035738,0.0279997624131438,0.0243958652679851 +mite,mite,north,,,Trhypochthonius.tectorum,UrbInd,5,0.0191105703106928,0.0167840749551519,0.0272407405128375,0.0191105703106928 +mite,mite,north,,,Trhypochthonius.tectorum,Wellsites,5,0.023351034935016,0.021158057868554,0.03223617749299,0.023351034935016 +mite,mite,north,,,Trhypochthonius.tectorum,Crop,5,0.015382693809727,0.0151069200337959,0.016892523752058,0.0152304430995811 +mite,mite,north,,,Trhypochthonius.tectorum,TameP,5,0.0258915433874115,0.0222945289246262,0.0264680931726066,0.024941743213498 +mite,mite,north,,,Trhypochthonius.tectorum,RoughP,5,0.0328180516103049,0.0322239355913061,0.0387542589134784,0.0375661766298358 +mite,mite,south,,,Ceratozetes.gracilis,Loamy,5,0.0218423245463604,0.0173672203176517,0.0230295231243844,0.0218423245463604 +mite,mite,south,,,Ceratozetes.gracilis,SandyLoam,5,0.0188962100537126,0.0162686755399601,0.0200379292106758,0.0185871549772747 +mite,mite,south,,,Ceratozetes.gracilis,ClaySub,5,0.0190796631779778,0.0156078918819073,0.0210172713505711,0.0190796631779778 +mite,mite,south,,,Ceratozetes.gracilis,RapidDrain,5,0.00969791273666386,0.00942196936388417,0.0112386251640146,0.0110451655878437 +mite,mite,south,,,Ceratozetes.gracilis,Blowout,5,0.0106020081675796,0.00863605999566094,0.0123463313279677,0.0108663421303504 +mite,mite,south,,,Ceratozetes.gracilis,ThinBreak,5,0.00878234749614848,0.00798269496694178,0.0107794669342902,0.00996372938352331 +mite,mite,south,,,Ceratozetes.gracilis,Other,5,0.0042686164608738,0.00063572314444851,0.00731890391266918,0.0042686164608738 +mite,mite,south,,,Ceratozetes.gracilis,EnSeismic,5,0.0128342993205689,0.00852724915739246,0.0633937793424426,0.0128342993205689 +mite,mite,south,,,Ceratozetes.gracilis,EnSoftLin,5,0.0100953485593809,0.00859879515579537,0.0518084711684424,0.0100953485593809 +mite,mite,south,,,Ceratozetes.gracilis,TrSoftLin,5,0.00945493320863686,0.00758629346095882,0.0565822367112004,0.00945493320863686 +mite,mite,south,,,Ceratozetes.gracilis,HardLin,5,0.0012818592428196,0.00122480067982412,0.00171071495716722,0.00176154072489266 +mite,mite,south,,,Ceratozetes.gracilis,UrbInd,5,0.00425941571595646,0.00295877473501209,0.00595057748445942,0.00425941571595646 +mite,mite,south,,,Ceratozetes.gracilis,Wellsites,5,0.00295291600474109,0.0021973086508854,0.00411443751717638,0.00295291600474109 +mite,mite,south,,,Ceratozetes.gracilis,Crop,5,0.00116588959329944,0.00104101704994527,0.00133284725072961,0.00116588959329944 +mite,mite,south,,,Ceratozetes.gracilis,TameP,5,0.0024464095231432,0.00214847243566944,0.00305858273470107,0.0023921447017999 +mite,mite,south,,,Ceratozetes.gracilis,RoughP,5,0.0023839015453601,0.00176469662219973,0.00260842275480983,0.00218127936434137 +mite,mite,south,,,Trhypochthonius.tectorum,Loamy,5,0.0499778174612043,0.0477160469108668,0.0521891286113536,0.0467852744100426 +mite,mite,south,,,Trhypochthonius.tectorum,SandyLoam,5,0.0427437044233035,0.0388352222189595,0.0446878887454315,0.0397630370091323 +mite,mite,south,,,Trhypochthonius.tectorum,ClaySub,5,0.0448532047061975,0.0434266302673582,0.0480060341777117,0.0429142869672478 +mite,mite,south,,,Trhypochthonius.tectorum,RapidDrain,5,0.0431738225185761,0.036600607606764,0.0449491670506471,0.0431738225185761 +mite,mite,south,,,Trhypochthonius.tectorum,Blowout,5,0.0612889561023144,0.0491998328469309,0.0746776432481998,0.0612889561023144 +mite,mite,south,,,Trhypochthonius.tectorum,ThinBreak,5,0.0472879860660164,0.037920270451541,0.0523574915662019,0.0472879860660164 +mite,mite,south,,,Trhypochthonius.tectorum,Other,5,0.0366771544480599,0.0228268207831538,0.0785517999620398,0.0478734329425522 +mite,mite,south,,,Trhypochthonius.tectorum,EnSeismic,5,0.005718045734362,0.000756250016234319,0.00887832731960815,0.00888461717648373 +mite,mite,south,,,Trhypochthonius.tectorum,EnSoftLin,5,0.00350908933263554,0.000310987183741067,0.00741715216602833,0.00723292387135889 +mite,mite,south,,,Trhypochthonius.tectorum,TrSoftLin,5,0.00296547128398102,0.000271010557576361,0.00513825945876903,0.00426948908637977 +mite,mite,south,,,Trhypochthonius.tectorum,HardLin,5,0.0352820429856263,0.0249011898739522,0.0517606271764086,0.0281443034455901 +mite,mite,south,,,Trhypochthonius.tectorum,UrbInd,5,0.0197564607327612,0.0161346626233351,0.0233198049521763,0.0197564607327612 +mite,mite,south,,,Trhypochthonius.tectorum,Wellsites,5,0.0218127811081771,0.0174582402547921,0.0273373033988181,0.0219652759405907 +mite,mite,south,,,Trhypochthonius.tectorum,Crop,5,0.0174842052478879,0.0146182157223179,0.0189255858640754,0.0177171723605232 +mite,mite,south,,,Trhypochthonius.tectorum,TameP,5,0.0334374326549006,0.0271748172003896,0.0414968532162421,0.0334374326549006 +mite,mite,south,,,Trhypochthonius.tectorum,RoughP,5,0.0330917206876311,0.0281248674259134,0.0375615466118284,0.0330917206876311 +vascular_plant,vascular_plant,north,,,Galium.boreale,WhiteSpruce,5,0.136563367302205,0.119462518901444,0.14703521115999,0.128707314176715 +vascular_plant,vascular_plant,north,,,Galium.boreale,Pine,5,0.116853425497967,0.107796441903968,0.124081762452193,0.108967866096832 +vascular_plant,vascular_plant,north,,,Galium.boreale,Deciduous,5,0.25887511408307,0.239156447325757,0.263482889907708,0.243876909457892 +vascular_plant,vascular_plant,north,,,Galium.boreale,Mixedwood,5,0.193041971414329,0.179396957180547,0.201982078860589,0.180205162477876 +vascular_plant,vascular_plant,north,,,Galium.boreale,BlackSpruce,5,0.0197313184843524,0.0186615095379396,0.0216346630739543,0.0190889513235295 +vascular_plant,vascular_plant,north,,,Galium.boreale,TreedFen,5,0.0190279322211574,0.0171394699429018,0.0204803027951359,0.0184868712710714 +vascular_plant,vascular_plant,north,,,Galium.boreale,TreedSwamp,5,0.0537157382799687,0.0494547113304226,0.0594834887289069,0.0502065849301497 +vascular_plant,vascular_plant,north,,,Galium.boreale,GraminoidFen,5,0.0207928426181494,0.0196811431002025,0.0226503378120183,0.0207928426181494 +vascular_plant,vascular_plant,north,,,Galium.boreale,ShrubbyFen,5,0.0201391073392683,0.0190935576196826,0.0221089799761179,0.0201391073392683 +vascular_plant,vascular_plant,north,,,Galium.boreale,ShrubbyBog,5,0.0199495272991526,0.0188220126503618,0.0218233356490728,0.0193388406568705 +vascular_plant,vascular_plant,north,,,Galium.boreale,ShrubbySwamp,5,0.045688982509881,0.042171496476318,0.0571441122739526,0.045688982509881 +vascular_plant,vascular_plant,north,,,Galium.boreale,Marsh,5,0.041347185000327,0.0369944475953885,0.0480790679841081,0.041347185000327 +vascular_plant,vascular_plant,north,,,Galium.boreale,Shrub,5,0.189304761120091,0.175516236345066,0.241103793907795,0.189304761120091 +vascular_plant,vascular_plant,north,,,Galium.boreale,Grass,5,0.214959292683282,0.180869477747652,0.249359372444126,0.191616359545112 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruceR,5,0.154137545244941,0.132581336610888,0.172927485618722,0.143043678232451 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce1,5,0.163315085825216,0.141002273364349,0.18905935770425,0.158059058434557 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce2,5,0.160436563203294,0.14069222929203,0.183967841364971,0.148743886710094 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce3,5,0.160436563203294,0.14069222929203,0.183967841364971,0.148743886710094 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce4,5,0.160436563203294,0.14069222929203,0.183967841364971,0.148743886710094 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCPineR,5,0.143905674843488,0.117440734273828,0.157542491898074,0.126516675922557 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine1,5,0.135255973929374,0.114079157254064,0.142460383178462,0.123115076680262 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine2,5,0.134477552857653,0.11341349299191,0.141401321460665,0.12088426096238 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine3,5,0.134477552857653,0.11341349299191,0.141401321460665,0.12088426096238 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine4,5,0.134477552857653,0.11341349299191,0.141401321460665,0.12088426096238 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduousR,5,0.208696634917917,0.175761239502858,0.219246203164378,0.186398225011703 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous1,5,0.256400751129383,0.223605802344556,0.280481606679469,0.232409451432954 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous2,5,0.196550402723055,0.177363867788528,0.223430883577534,0.189116187021577 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous3,5,0.196550402723055,0.177363867788528,0.223430883577534,0.189116187021577 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous4,5,0.196550402723055,0.177363867788528,0.223430883577534,0.189116187021577 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwoodR,5,0.208696634917917,0.175761239502858,0.219246203164378,0.186398225011703 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood1,5,0.256400751129383,0.223605802344556,0.280481606679469,0.232409451432954 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood2,5,0.196550402723055,0.177363867788528,0.223430883577534,0.189116187021577 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood3,5,0.196550402723055,0.177363867788528,0.223430883577534,0.189116187021577 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood4,5,0.196550402723055,0.177363867788528,0.223430883577534,0.189116187021577 +vascular_plant,vascular_plant,north,,,Galium.boreale,EnSeismic,5,0.0675357940232228,0.0536641840810974,0.0782448772200584,0.0666893133709304 +vascular_plant,vascular_plant,north,,,Galium.boreale,EnSoftLin,5,0.0666450469830431,0.0514688065567067,0.0769360972499699,0.0632085789748528 +vascular_plant,vascular_plant,north,,,Galium.boreale,TrSoftLin,5,0.0681813236346331,0.0554454641142448,0.0796107459686051,0.0681813236346331 +vascular_plant,vascular_plant,north,,,Galium.boreale,HardLin,5,0.032772954964339,0.0254952937216265,0.0427628821147054,0.0304014203144609 +vascular_plant,vascular_plant,north,,,Galium.boreale,UrbInd,5,0.032891069156295,0.0290596861735981,0.0426826279515852,0.0323859521239614 +vascular_plant,vascular_plant,north,,,Galium.boreale,Wellsites,5,0.0313114303488669,0.0258224080114288,0.0445788771357667,0.0313114303488669 +vascular_plant,vascular_plant,north,,,Galium.boreale,Crop,5,0.0114819275038514,0.00962690543049514,0.0155602283722968,0.0114819275038514 +vascular_plant,vascular_plant,north,,,Galium.boreale,TameP,5,0.0336485279117461,0.0256580113642758,0.0375637064974261,0.0283837215953415 +vascular_plant,vascular_plant,north,,,Galium.boreale,RoughP,5,0.0579560450257088,0.045965364331808,0.0773913737984615,0.0532646872909717 +vascular_plant,vascular_plant,north,,,Vicia.americana,WhiteSpruce,5,0.0717211911881468,0.0649940227788211,0.0757806047387571,0.0717211911881468 +vascular_plant,vascular_plant,north,,,Vicia.americana,Pine,5,0.0717443897992296,0.0637388171549185,0.0792558735029598,0.0717443897992296 +vascular_plant,vascular_plant,north,,,Vicia.americana,Deciduous,5,0.174528296976248,0.164090538301261,0.183795585911188,0.174528296976248 +vascular_plant,vascular_plant,north,,,Vicia.americana,Mixedwood,5,0.12738407433249,0.118327966346565,0.12914316163785,0.123903841395087 +vascular_plant,vascular_plant,north,,,Vicia.americana,BlackSpruce,5,0.0108602686526196,0.00947682296052838,0.0111197345835797,0.0110635169948055 +vascular_plant,vascular_plant,north,,,Vicia.americana,TreedFen,5,0.0104889884001634,0.00918775668655501,0.0114259715545775,0.0111781283427943 +vascular_plant,vascular_plant,north,,,Vicia.americana,TreedSwamp,5,0.0474586407623415,0.0434617027113533,0.0573459768855838,0.0505384149026876 +vascular_plant,vascular_plant,north,,,Vicia.americana,GraminoidFen,5,0.012380186783363,0.0106055968142056,0.0129729819618124,0.0128602111397556 +vascular_plant,vascular_plant,north,,,Vicia.americana,ShrubbyFen,5,0.0122885356189932,0.0107844229705085,0.0129771366500186,0.0127117113440904 +vascular_plant,vascular_plant,north,,,Vicia.americana,ShrubbyBog,5,0.0111679104948312,0.00984870753108598,0.01144241264329,0.0114521553910913 +vascular_plant,vascular_plant,north,,,Vicia.americana,ShrubbySwamp,5,0.0442619565088811,0.039395611852956,0.0514550187832082,0.0467803608934761 +vascular_plant,vascular_plant,north,,,Vicia.americana,Marsh,5,0.0395269377197916,0.0379010981822006,0.0480740857526984,0.0426749909362641 +vascular_plant,vascular_plant,north,,,Vicia.americana,Shrub,5,0.124413496826489,0.11630879041929,0.148831794626625,0.129561071424494 +vascular_plant,vascular_plant,north,,,Vicia.americana,Grass,5,0.140899561631048,0.132647046765579,0.149765706126522,0.140899561631048 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruceR,5,0.106333838059199,0.10563563998252,0.1113390336656,0.113324612808195 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce1,5,0.132673132079881,0.131014835763159,0.139245186106205,0.140904763899433 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce2,5,0.122518637692463,0.118113328719225,0.134306251834235,0.129378591587472 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce3,5,0.122518637692463,0.118113328719225,0.134306251834235,0.129378591587472 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce4,5,0.122518637692463,0.118113328719225,0.134306251834235,0.129378591587472 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCPineR,5,0.108086061678854,0.105116454412193,0.111847166658453,0.113106276644051 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine1,5,0.1122188310588,0.109732769391169,0.12258810268514,0.121735348725543 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine2,5,0.109183815724588,0.106720994046657,0.120537973445125,0.118682344001148 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine3,5,0.109183815724588,0.106720994046657,0.120537973445125,0.118682344001148 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine4,5,0.109183815724588,0.106720994046657,0.120537973445125,0.118682344001148 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduousR,5,0.145906249437239,0.140931022371577,0.15495341081461,0.151623580611421 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous1,5,0.180166516850587,0.168695392463167,0.188786472181105,0.183212683986236 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous2,5,0.156982604814944,0.145251669372505,0.15939063660912,0.156982604814944 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous3,5,0.156982604814944,0.145251669372505,0.15939063660912,0.156982604814944 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous4,5,0.156982604814944,0.145251669372505,0.15939063660912,0.156982604814944 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwoodR,5,0.145906249437239,0.140931022371577,0.15495341081461,0.151623580611421 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood1,5,0.180166516850587,0.168695392463167,0.188786472181105,0.183212683986236 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood2,5,0.156982604814944,0.145251669372505,0.15939063660912,0.156982604814944 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood3,5,0.156982604814944,0.145251669372505,0.15939063660912,0.156982604814944 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood4,5,0.156982604814944,0.145251669372505,0.15939063660912,0.156982604814944 +vascular_plant,vascular_plant,north,,,Vicia.americana,EnSeismic,5,0.216656015711896,0.168139707348619,0.254376282862556,0.216656015711896 +vascular_plant,vascular_plant,north,,,Vicia.americana,EnSoftLin,5,0.240353254005159,0.182193409855272,0.287354412958843,0.240353254005159 +vascular_plant,vascular_plant,north,,,Vicia.americana,TrSoftLin,5,0.185413846451138,0.143618351581936,0.21612482061455,0.185413846451138 +vascular_plant,vascular_plant,north,,,Vicia.americana,HardLin,5,0.0510142064754805,0.0476995560327749,0.0534135994986585,0.0494242045429297 +vascular_plant,vascular_plant,north,,,Vicia.americana,UrbInd,5,0.060270971424988,0.0527176972963101,0.0669155114807268,0.0570164101210413 +vascular_plant,vascular_plant,north,,,Vicia.americana,Wellsites,5,0.0495816235777512,0.045261299115898,0.0675981711099802,0.0583800066861835 +vascular_plant,vascular_plant,north,,,Vicia.americana,Crop,5,0.0198021833360757,0.0187130492427477,0.0215978803800823,0.020499648487122 +vascular_plant,vascular_plant,north,,,Vicia.americana,TameP,5,0.0435685547091363,0.0402056228771878,0.0533172713621298,0.0435685547091363 +vascular_plant,vascular_plant,north,,,Vicia.americana,RoughP,5,0.0428632794956036,0.0372440489603054,0.0534178816037923,0.0428632794956036 +vascular_plant,vascular_plant,south,,,Galium.boreale,Loamy,5,0.128653205010673,0.114611972972335,0.130784674892184,0.129566548831882 +vascular_plant,vascular_plant,south,,,Galium.boreale,SandyLoam,5,0.0836110810472021,0.0746816948024742,0.0894208141830331,0.0846341790254643 +vascular_plant,vascular_plant,south,,,Galium.boreale,ClaySub,5,0.101500964583409,0.0940741502041846,0.108970943759895,0.106582920663178 +vascular_plant,vascular_plant,south,,,Galium.boreale,RapidDrain,5,0.0388994289485226,0.0346245997860596,0.0529303847658474,0.0448318785090138 +vascular_plant,vascular_plant,south,,,Galium.boreale,Blowout,5,0.0506231282331206,0.0397681707601058,0.0574808564556098,0.0506231282331206 +vascular_plant,vascular_plant,south,,,Galium.boreale,ThinBreak,5,0.0479802424154928,0.0420075163241584,0.0517461800601525,0.051022562219615 +vascular_plant,vascular_plant,south,,,Galium.boreale,Other,5,0.0106061234511555,0.00720081589340935,0.0217479373094132,0.0177197087652051 +vascular_plant,vascular_plant,south,,,Galium.boreale,EnSeismic,5,0.0472125133205467,0.0295924639744709,0.110125197726374,0.0287456404184259 +vascular_plant,vascular_plant,south,,,Galium.boreale,EnSoftLin,5,0.0457108677001631,0.0342927417032321,0.133999583987908,0.0329811808897455 +vascular_plant,vascular_plant,south,,,Galium.boreale,TrSoftLin,5,0.0254268182100485,0.0116038912895437,0.0640062980763588,0.0143164876649795 +vascular_plant,vascular_plant,south,,,Galium.boreale,HardLin,5,0.0032621931802875,0.00285851385150083,0.00701707647763527,0.00538608376568717 +vascular_plant,vascular_plant,south,,,Galium.boreale,UrbInd,5,0.00523304185300579,0.00516680867336443,0.00698867393616868,0.00519980939835304 +vascular_plant,vascular_plant,south,,,Galium.boreale,Wellsites,5,0.00835585771334364,0.00699275850468526,0.00923375703992824,0.00769427442003421 +vascular_plant,vascular_plant,south,,,Galium.boreale,Crop,5,0.00170386065696764,0.00159546521345581,0.00280933357726183,0.00225132683231577 +vascular_plant,vascular_plant,south,,,Galium.boreale,TameP,5,0.00370735476367147,0.00294261667373477,0.00558659216344689,0.00460921237816997 +vascular_plant,vascular_plant,south,,,Galium.boreale,RoughP,5,0.00542654337673869,0.00450815448744484,0.00938121797095186,0.00706698519527935 +vascular_plant,vascular_plant,south,,,Vicia.americana,Loamy,5,0.280824609747584,0.267644583576923,0.289709776497706,0.273848614363572 +vascular_plant,vascular_plant,south,,,Vicia.americana,SandyLoam,5,0.243407150088342,0.234204092076879,0.250601947319584,0.239431294773893 +vascular_plant,vascular_plant,south,,,Vicia.americana,ClaySub,5,0.29707235668037,0.282488985824439,0.305118529233993,0.291486932950625 +vascular_plant,vascular_plant,south,,,Vicia.americana,RapidDrain,5,0.149586849572318,0.132500335286096,0.175603735182626,0.149586849572318 +vascular_plant,vascular_plant,south,,,Vicia.americana,Blowout,5,0.106950650814662,0.0907039605371348,0.121336311234738,0.103869081093715 +vascular_plant,vascular_plant,south,,,Vicia.americana,ThinBreak,5,0.165570611241508,0.152106899610986,0.186190099937036,0.165570611241508 +vascular_plant,vascular_plant,south,,,Vicia.americana,Other,5,0.102651600983928,0.0624149706900878,0.11235472915199,0.102651600983928 +vascular_plant,vascular_plant,south,,,Vicia.americana,EnSeismic,5,0.0987770601076429,0.0590846473435492,0.125153182170927,0.142317281363727 +vascular_plant,vascular_plant,south,,,Vicia.americana,EnSoftLin,5,0.124641821593195,0.0681868022186765,0.173426846411391,0.184942717247886 +vascular_plant,vascular_plant,south,,,Vicia.americana,TrSoftLin,5,0.0632469144327385,0.0350786082680709,0.083335221572322,0.0865561569046063 +vascular_plant,vascular_plant,south,,,Vicia.americana,HardLin,5,0.034768741467538,0.0317254788925045,0.0411641044703837,0.0319213954295495 +vascular_plant,vascular_plant,south,,,Vicia.americana,UrbInd,5,0.0317815932567955,0.0271544908564896,0.0356957214790492,0.0250464912812154 +vascular_plant,vascular_plant,south,,,Vicia.americana,Wellsites,5,0.0341400292126126,0.0279864934648464,0.0423488240839157,0.0262553863998158 +vascular_plant,vascular_plant,south,,,Vicia.americana,Crop,5,0.0239011853373428,0.0220577047645298,0.0264567603480559,0.0226673334870154 +vascular_plant,vascular_plant,south,,,Vicia.americana,TameP,5,0.0312372001895896,0.0292297510784975,0.0351771559180196,0.0306301444015498 +vascular_plant,vascular_plant,south,,,Vicia.americana,RoughP,5,0.0374123655632768,0.0359902090243626,0.0432584803569596,0.0374123655632768 diff --git a/3_output/exp_000_parity_v2/tables/metric_summary.csv b/3_output/exp_000_parity_v2/tables/metric_summary.csv index 06daa4c..c7c959b 100644 --- a/3_output/exp_000_parity_v2/tables/metric_summary.csv +++ b/3_output/exp_000_parity_v2/tables/metric_summary.csv @@ -1,617 +1,617 @@ taxon,run,region,season,part,species,metric,n,median,p10,p90,boot1 -bird,bird,north,,,AMRO,insample_auc,100,0.722941291958026,0.720972868858002,0.725025884727729,0.721701661835893 -bird,bird,north,,,YEWA,insample_auc,100,0.778186953289465,0.775689125540707,0.78064354760127,0.779841092447633 -bird,bird,north,,,AMRO,insample_calibration_slope,100,0.80439129216793,0.794598673414551,0.813263646692552,0.80440117768677 -bird,bird,north,,,YEWA,insample_calibration_slope,100,0.68667256345246,0.65127717317625,0.716419429614271,0.716264166431109 -bird,bird,north,,,AMRO,insample_deviance_explained,100,0.141892228737756,0.139516850461149,0.144440700348185,0.140587647159979 -bird,bird,north,,,YEWA,insample_deviance_explained,100,0.25902142141057,0.254928440560819,0.26248816234098,0.259141214360432 -bird,bird,north,,,AMRO,insample_n,100,46751,46746.9,46756.1,46747 -bird,bird,north,,,YEWA,insample_n,100,46751,46746.9,46756.1,46747 -bird,bird,north,,,AMRO,insample_prevalence,100,0.251013357719858,0.249469515535677,0.252466035822628,0.250861017819325 -bird,bird,north,,,YEWA,insample_prevalence,100,0.119004833940844,0.118139055614803,0.119814101354467,0.118296361263824 -bird,bird,north,,,AMRO,insample_rmse,100,0.663529568645484,0.659762946701523,0.667800183229973,0.664239276180889 -bird,bird,north,,,YEWA,insample_rmse,100,0.551892225105279,0.544039433841324,0.560242541149428,0.547158394049375 -bird,bird,north,,,AMRO,insample_spearman,100,0.341332033991246,0.337958860752305,0.344541559969754,0.339249301212572 -bird,bird,north,,,YEWA,insample_spearman,100,0.315129544166726,0.312069108270516,0.318157185925632,0.316093683296469 -bird,bird,north,,,AMRO,oob_auc,100,0.731083020235213,0.729728694406019,0.731997269207461,0.730766733254682 -bird,bird,north,,,YEWA,oob_auc,100,0.728919378934302,0.727561350140747,0.730408468931927,0.730809600284142 -bird,bird,north,,,AMRO,oob_calibration_slope,100,0.87705334102173,0.859046659953532,0.892405134838974,0.881696624797909 -bird,bird,north,,,YEWA,oob_calibration_slope,100,0.64415917079899,0.561997241434001,0.704587672561171,0.718728425403305 -bird,bird,north,,,AMRO,oob_deviance_explained,100,0.152102139021978,0.150344464224191,0.153768435297582,0.152754178062373 -bird,bird,north,,,YEWA,oob_deviance_explained,100,0.179057138830537,0.175210549900854,0.181998524533593,0.183210182399369 -bird,bird,north,,,AMRO,oob_n,100,124873,124867.9,124877.1,124877 -bird,bird,north,,,YEWA,oob_n,100,124873,124867.9,124877.1,124877 -bird,bird,north,,,AMRO,oob_prevalence,100,0.241188364632105,0.240643779705197,0.241766126792771,0.241245385459292 -bird,bird,north,,,YEWA,oob_prevalence,100,0.134323099251165,0.134021369904622,0.134647493509128,0.13458843502006 -bird,bird,north,,,AMRO,oob_rmse,100,0.65796553610531,0.656284605026556,0.659354479236559,0.657851304309638 -bird,bird,north,,,YEWA,oob_rmse,100,0.591993296525432,0.582825632432554,0.603629490711002,0.581496589737255 -bird,bird,north,,,AMRO,oob_spearman,100,0.349000795818394,0.346958699831137,0.350450615002725,0.348509330988823 -bird,bird,north,,,YEWA,oob_spearman,100,0.273840417323665,0.272323641876612,0.27551058043422,0.276382265893519 -bird,bird,south,,,AMRO,insample_auc,100,0.692241105195695,0.689277087417165,0.695254459353952,0.689537506786954 -bird,bird,south,,,YEWA,insample_auc,100,0.71931881761428,0.715530606727552,0.722950865983364,0.721262730392428 -bird,bird,south,,,AMRO,insample_calibration_slope,100,0.891418274449085,0.875752221574822,0.907045276999385,0.885403476414633 -bird,bird,south,,,YEWA,insample_calibration_slope,100,0.866682086841971,0.860362489808398,0.873353081017801,0.860619291916303 -bird,bird,south,,,AMRO,insample_deviance_explained,100,0.0922921788656006,0.0899257972801956,0.0959833319452778,0.0905093060629211 -bird,bird,south,,,YEWA,insample_deviance_explained,100,0.23129680597227,0.226310074573946,0.235915323956573,0.229114411717017 -bird,bird,south,,,AMRO,insample_n,100,23638,23635,23641,23640 -bird,bird,south,,,YEWA,insample_n,100,23638,23635,23641,23640 -bird,bird,south,,,AMRO,insample_prevalence,100,0.257858442272708,0.255935560656765,0.259915379733446,0.25655668358714 -bird,bird,south,,,YEWA,insample_prevalence,100,0.172480169299808,0.171161682117149,0.173982762791556,0.171742808798646 -bird,bird,south,,,AMRO,insample_rmse,100,0.742969543166091,0.737049963427855,0.748369656814777,0.746104469516561 -bird,bird,south,,,YEWA,insample_rmse,100,0.626430819488391,0.620643891953174,0.63211456133757,0.629305991109963 -bird,bird,south,,,AMRO,insample_spearman,100,0.292644243026994,0.288035146020249,0.296748860514725,0.287696121760142 -bird,bird,south,,,YEWA,insample_spearman,100,0.29573200936581,0.290701723813243,0.300697611022088,0.297439751075024 -bird,bird,south,,,AMRO,oob_auc,100,0.689119265153378,0.68765134183379,0.690180541905298,0.689591934626615 -bird,bird,south,,,YEWA,oob_auc,100,0.715167591737123,0.71286824374569,0.716852012704592,0.716561203894474 -bird,bird,south,,,AMRO,oob_calibration_slope,100,0.926837573631262,0.897339361283655,0.960759916528504,0.953623540744284 -bird,bird,south,,,YEWA,oob_calibration_slope,100,0.857604141687727,0.843443165747965,0.875941675070625,0.871741212363925 -bird,bird,south,,,AMRO,oob_deviance_explained,100,0.0970655203501608,0.0907384885890809,0.0989923781381314,0.0984328670162571 -bird,bird,south,,,YEWA,oob_deviance_explained,100,0.200176382933312,0.196725767352594,0.206420626511906,0.208119807948008 -bird,bird,south,,,AMRO,oob_n,100,67169,67166,67172,67167 -bird,bird,south,,,YEWA,oob_n,100,67169,67166,67172,67167 -bird,bird,south,,,AMRO,oob_prevalence,100,0.26025011165699,0.25952629071637,0.260926785729864,0.260708383581223 -bird,bird,south,,,YEWA,oob_prevalence,100,0.17548143131411,0.17495262154107,0.175945404105742,0.175741063319785 -bird,bird,south,,,AMRO,oob_rmse,100,0.735441343525441,0.733487115915094,0.737659872237311,0.734395013830007 -bird,bird,south,,,YEWA,oob_rmse,100,0.638166771124373,0.636266196981271,0.640144594296377,0.636772974666958 -bird,bird,south,,,AMRO,oob_spearman,100,0.290675252027123,0.288615904926869,0.292588132435043,0.291376773818019 -bird,bird,south,,,YEWA,oob_spearman,100,0.291825737345894,0.288897993957802,0.294289916161369,0.294073915420202 -bryophyte,bryophyte,north,,,Bryum.All,insample_auc,100,0.642318444539308,0.633921086630186,0.651884158043418,0.640680298981408 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_auc,100,0.689919413502033,0.681548570015025,0.69857719393943,0.687411866264163 -bryophyte,bryophyte,north,,,Bryum.All,insample_calibration_slope,100,0.955325651891997,0.921784876414541,0.994289263502767,0.994238258040669 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_calibration_slope,100,0.982104855078527,0.956074728361977,1.01367711616798,1.00727116584583 -bryophyte,bryophyte,north,,,Bryum.All,insample_deviance_explained,100,0.0475926557100003,0.0429069337919808,0.053599259247204,0.0473841241891654 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_deviance_explained,100,0.0838806697287246,0.0766425254757005,0.0918192109321069,0.0799213091698396 -bryophyte,bryophyte,north,,,Bryum.All,insample_n,100,3072,3037,3101.1,4852 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_n,100,3065,3034.8,3098.1,4852 -bryophyte,bryophyte,north,,,Bryum.All,insample_prevalence,100,0.399349043162305,0.393690846676296,0.405271234894856,0.400041220115416 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_prevalence,100,0.441423922595881,0.434027652325691,0.448036090018821,0.441055234954658 -bryophyte,bryophyte,north,,,Bryum.All,insample_rmse,100,0.474452320597645,0.472245590342395,0.476430126142195,0.474777494875911 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_rmse,100,0.468134439224328,0.465591168622141,0.470778976868538,0.469374241782048 -bryophyte,bryophyte,north,,,Bryum.All,insample_spearman,100,0.241880966381948,0.227489701074908,0.257061610015512,0.238746523656073 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_spearman,100,0.326942501811839,0.312732952582419,0.341695266915511,0.322343360373914 -bryophyte,bryophyte,north,,,Bryum.All,oob_auc,99,0.62017084478022,0.603856982933903,0.633969290458781, -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_auc,99,0.672728837382749,0.659997052859653,0.686897759352686, -bryophyte,bryophyte,north,,,Bryum.All,oob_calibration_slope,99,0.779099220956986,0.66468412261174,0.917938092422145, -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_calibration_slope,99,0.892217996848082,0.799264221532109,0.998536704936227, -bryophyte,bryophyte,north,,,Bryum.All,oob_deviance_explained,99,0.028633074039904,0.0171610604129409,0.0392434042960176, -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_deviance_explained,99,0.0647350614834209,0.0515925692157936,0.0785472562171148, -bryophyte,bryophyte,north,,,Bryum.All,oob_n,100,1780,1750.9,1815,0 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_n,100,1787,1753.9,1817.2,0 -bryophyte,bryophyte,north,,,Bryum.All,oob_prevalence,99,0.401248581157775,0.390844052298067,0.411007337376053, -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_prevalence,99,0.440387906446092,0.428865082471199,0.453160994868052, -bryophyte,bryophyte,north,,,Bryum.All,oob_rmse,99,0.480513128479088,0.476615100187253,0.484954013021498, -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_rmse,99,0.47387539884342,0.469269889512006,0.478829523309486, -bryophyte,bryophyte,north,,,Bryum.All,oob_spearman,99,0.204292949982475,0.175952087053534,0.227155326132657, -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_spearman,99,0.297224506192767,0.274722444418865,0.321893706579838, -bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Climate,99,0.552916481913235,0.540226254499829,0.567241677635273, -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Climate,99,0.646423397353534,0.635163324971908,0.658730585161026, -bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Climate_Truncated,99,0.552925779182699,0.540226609429324,0.567255933484287, -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Climate_Truncated,99,0.646430101039444,0.635179589567065,0.658754818805508, -bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Full,99,0.622515284380487,0.606966046632109,0.637941781112142, -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Full,99,0.680703511329967,0.668408531167835,0.695661297003528, -bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Full_Joint,99,0.620799473715077,0.605648460579975,0.636990572220664, -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Full_Joint,99,0.677589700394554,0.664504947148201,0.693024309187494, -bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Full_Joint_Truncated,99,0.621996503907548,0.606257564993021,0.637854921013833, -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Full_Joint_Truncated,99,0.677695162032219,0.664672623978323,0.693261314402482, -bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Full_Truncated,99,0.623158079831194,0.607536063147181,0.638923145728668, -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Full_Truncated,99,0.681193862566742,0.668549373133085,0.695968955838593, -bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Landcover,99,0.578478654378855,0.563340215848909,0.595416571811786, -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Landcover,99,0.616438734578608,0.601823118907835,0.630341259705069, -bryophyte,bryophyte,north,,,Bryum.All,v2val_Climate,100,0.564449154820466,0.554012171366573,0.570488080028572,0.563268568361301 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Climate,100,0.653628249222615,0.646582072273794,0.660645471865441,0.652571065182321 -bryophyte,bryophyte,north,,,Bryum.All,v2val_Climate_Truncated,100,0.564434908994878,0.553999088676995,0.57047860242542,0.563263005953167 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Climate_Truncated,100,0.653631181256494,0.646567181729957,0.660656834468788,0.652577122144193 -bryophyte,bryophyte,north,,,Bryum.All,v2val_Full,100,0.639513842289103,0.630384469487024,0.648716294484894,0.638127846001886 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Full,100,0.697312704147698,0.689101809484888,0.706500159400666,0.694675016541229 -bryophyte,bryophyte,north,,,Bryum.All,v2val_Full_Joint,100,0.638157016545815,0.628828304666193,0.647302051967581,0.63656986211763 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Full_Joint,100,0.693548409915653,0.685028144012786,0.703341076889968,0.69133661745651 -bryophyte,bryophyte,north,,,Bryum.All,v2val_Full_Joint_Truncated,100,0.63900274875512,0.628781781025239,0.648591404080496,0.637500263262641 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Full_Joint_Truncated,100,0.693647343658095,0.685257034827932,0.703395393409226,0.69158473589171 -bryophyte,bryophyte,north,,,Bryum.All,v2val_Full_Truncated,100,0.63997798915985,0.63067647736737,0.650065196096129,0.639020549706553 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Full_Truncated,100,0.697442938749871,0.689332998208995,0.706642286722351,0.694914692057453 -bryophyte,bryophyte,north,,,Bryum.All,v2val_Landcover,100,0.591982008865627,0.583299565240258,0.602597071514015,0.59031873097319 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Landcover,100,0.628211583853316,0.619312449475028,0.637212297876016,0.626159436771152 -bryophyte,bryophyte,south,,,Bryum.All,insample_auc,100,0.665806112785856,0.653994723957733,0.676094367539239,0.664235544228618 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_auc,100,0.744712111382323,0.736661862126833,0.756533309970613,0.744223004366669 -bryophyte,bryophyte,south,,,Bryum.All,insample_calibration_slope,100,0.963895419689307,0.909117948595872,1.01600769727917,0.994227632577823 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_calibration_slope,100,0.958632660333046,0.922837353048757,1.0032102926837,0.984379677252375 -bryophyte,bryophyte,south,,,Bryum.All,insample_deviance_explained,100,0.060647418310011,0.0519172518787997,0.0685880593571607,0.0582058232553434 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_deviance_explained,100,0.134087667715628,0.126054104059364,0.147661710838995,0.133761560466983 -bryophyte,bryophyte,south,,,Bryum.All,insample_n,100,1461,1441,1483.1,2310 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_n,100,1462,1439.9,1485.5,2310 -bryophyte,bryophyte,south,,,Bryum.All,insample_prevalence,100,0.37019021854078,0.360595240622412,0.379679386889781,0.370562770562771 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_prevalence,100,0.23977643361205,0.230206220419202,0.24915207746165,0.23982683982684 -bryophyte,bryophyte,south,,,Bryum.All,insample_rmse,100,0.463823679787936,0.460173033764873,0.4672287398531,0.464783812560398 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_rmse,100,0.395176481470325,0.389074942964999,0.400757094795644,0.395821890229672 -bryophyte,bryophyte,south,,,Bryum.All,insample_spearman,100,0.276125986422118,0.257199859142186,0.294584764044912,0.274767526720997 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_spearman,100,0.362228960302291,0.350062231973397,0.379817377754883,0.361229177029678 -bryophyte,bryophyte,south,,,Bryum.All,oob_auc,99,0.641746613175185,0.621549873118513,0.661902477499436, -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_auc,99,0.729595755352832,0.707659975120298,0.746574925136452, -bryophyte,bryophyte,south,,,Bryum.All,oob_calibration_slope,99,0.799638025660274,0.64705136717253,0.946234221472978, -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_calibration_slope,99,0.871686323040223,0.772018187900515,1.01323238589723, -bryophyte,bryophyte,south,,,Bryum.All,oob_deviance_explained,99,0.0358645687227639,0.0186324634218165,0.050802278597151, -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_deviance_explained,99,0.110691969317517,0.0859500240961407,0.128368392600255, -bryophyte,bryophyte,south,,,Bryum.All,oob_n,100,849,826.9,869,0 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_n,100,848,824.5,870.1,0 -bryophyte,bryophyte,south,,,Bryum.All,oob_prevalence,99,0.371203599550056,0.355314877874469,0.387708127053306, -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_prevalence,99,0.24,0.22333963288802,0.255865292031658, -bryophyte,bryophyte,south,,,Bryum.All,oob_rmse,99,0.471159298712749,0.464486718714448,0.478079898398807, -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_rmse,99,0.401778979201565,0.392569891777703,0.412481107813987, -bryophyte,bryophyte,south,,,Bryum.All,oob_spearman,99,0.239111146291676,0.202887915299472,0.272642778009816, -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_spearman,99,0.337919402029935,0.305482988407238,0.364596471722889, -bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Climate,99,0.552916481913235,0.540226254499829,0.567241677635273, -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Climate,99,0.646423397353534,0.635163324971908,0.658730585161026, -bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Climate_Truncated,99,0.552925779182699,0.540226609429324,0.567255933484287, -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Climate_Truncated,99,0.646430101039444,0.635179589567065,0.658754818805508, -bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Full,99,0.619011406844107,0.598240308408525,0.638566231844498, -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Full,99,0.70961611965701,0.685563349905508,0.730088189467665, -bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Full_Joint,99,0.618268164367979,0.598732723008374,0.639880025973981, -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Full_Joint,99,0.710644087069526,0.688159303290908,0.730668435774751, -bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Full_Joint_Truncated,99,0.618268164367979,0.598668784662836,0.639894643627021, -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Full_Joint_Truncated,99,0.710644087069526,0.688159303290908,0.730668435774751, -bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Full_Truncated,99,0.619011406844107,0.598240019402878,0.63877582946581, -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Full_Truncated,99,0.70961611965701,0.685563349905508,0.730088189467665, -bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Landcover,99,0.591609023285703,0.5684817431571,0.613703223028674, -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Landcover,99,0.624022482893451,0.601386928063719,0.645259704463817, -bryophyte,bryophyte,south,,,Bryum.All,v2val_Climate,100,0.564449154820466,0.554012171366573,0.570488080028572,0.563268568361301 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Climate,100,0.653628249222615,0.646582072273794,0.660645471865441,0.652571065182321 -bryophyte,bryophyte,south,,,Bryum.All,v2val_Climate_Truncated,100,0.564434908994878,0.553999088676995,0.57047860242542,0.563263005953167 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Climate_Truncated,100,0.653631181256494,0.646567181729957,0.660656834468788,0.652577122144193 -bryophyte,bryophyte,south,,,Bryum.All,v2val_Full,100,0.633431695701558,0.621072760304728,0.644071139511728,0.631477859980203 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Full,100,0.717588984872617,0.707940136120907,0.729990413520888,0.717485896729522 -bryophyte,bryophyte,south,,,Bryum.All,v2val_Full_Joint,100,0.633675239217769,0.621111812013989,0.644079463996898,0.630846343956086 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Full_Joint,100,0.719214027389327,0.70812487919115,0.732006695871702,0.718564200718732 -bryophyte,bryophyte,south,,,Bryum.All,v2val_Full_Joint_Truncated,100,0.633706694184747,0.621120911195063,0.644107658819543,0.630860002699611 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Full_Joint_Truncated,100,0.719214027389327,0.70812487919115,0.732006695871702,0.718564200718732 -bryophyte,bryophyte,south,,,Bryum.All,v2val_Full_Truncated,100,0.633501295313286,0.621085499158231,0.644081810530497,0.631535708776305 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Full_Truncated,100,0.717588984872617,0.707940136120907,0.729990413520888,0.717485896729522 -bryophyte,bryophyte,south,,,Bryum.All,v2val_Landcover,100,0.604108905134766,0.590811249395407,0.614816041548742,0.604777025029246 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Landcover,100,0.632138458386798,0.620856342049895,0.64588084751364,0.630393575816386 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_auc,100,0.769904413128653,0.764063950185549,0.774994859530566,0.769639340981023 -lichen,lichen,north,,,Physcia.adscendens,insample_auc,100,0.843858472001524,0.839627119885778,0.849457973616683,0.843598873256081 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_calibration_slope,100,0.99506569309268,0.975357328535013,1.00788600252369,1.00264901740429 -lichen,lichen,north,,,Physcia.adscendens,insample_calibration_slope,100,1.0023434293955,0.992290677679192,1.0144227094458,1.0054450276181 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_deviance_explained,100,0.189091223352288,0.181672074359276,0.19571373866611,0.188532571921241 -lichen,lichen,north,,,Physcia.adscendens,insample_deviance_explained,100,0.29252733374457,0.28393309923068,0.30281084569531,0.291544396783705 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_n,100,3676.5,3643.5,3708.1,5811 -lichen,lichen,north,,,Physcia.adscendens,insample_n,100,3672,3638.7,3709,5811 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_prevalence,100,0.384437187559081,0.380547590781089,0.390534077268186,0.384787472035794 -lichen,lichen,north,,,Physcia.adscendens,insample_prevalence,100,0.384489533269728,0.377838704868109,0.390009815932809,0.384099122354156 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_rmse,100,0.431560366260102,0.429640350605955,0.433524488609716,0.431642242867297 -lichen,lichen,north,,,Physcia.adscendens,insample_rmse,100,0.38926940084163,0.386109979689022,0.392548447467983,0.38952477075237 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_spearman,100,0.454700594463317,0.444291297886564,0.464217347731443,0.454461373310586 -lichen,lichen,north,,,Physcia.adscendens,insample_spearman,100,0.579034123424778,0.572457031426613,0.588107541175059,0.57892123989803 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_auc,99,0.758701523142145,0.751167957205167,0.77037258371695, -lichen,lichen,north,,,Physcia.adscendens,oob_auc,99,0.836309233023938,0.826949725892923,0.844910528306798, -lichen,lichen,north,,,Cladonia.chlorophaea,oob_calibration_slope,99,0.954267136908917,0.906613172943602,1.01012439935484, -lichen,lichen,north,,,Physcia.adscendens,oob_calibration_slope,99,0.983916249515356,0.942689284867629,1.01579271399548, -lichen,lichen,north,,,Cladonia.chlorophaea,oob_deviance_explained,99,0.171702415001063,0.160902175054887,0.185575056097344, -lichen,lichen,north,,,Physcia.adscendens,oob_deviance_explained,99,0.27675887709098,0.255216215590799,0.292828895189064, -lichen,lichen,north,,,Cladonia.chlorophaea,oob_n,100,2134.5,2102.9,2167.5,0 -lichen,lichen,north,,,Physcia.adscendens,oob_n,100,2139,2102,2172.3,0 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_prevalence,99,0.38539741219963,0.374872643000928,0.392180977534085, -lichen,lichen,north,,,Physcia.adscendens,oob_prevalence,99,0.383356708742403,0.373863819973773,0.394833611223034, -lichen,lichen,north,,,Cladonia.chlorophaea,oob_rmse,99,0.435804948437572,0.431963537434734,0.43930758296454, -lichen,lichen,north,,,Physcia.adscendens,oob_rmse,99,0.393757557408559,0.387508441417089,0.40047991779162, -lichen,lichen,north,,,Cladonia.chlorophaea,oob_spearman,99,0.436467740943861,0.424128371825953,0.456602087912647, -lichen,lichen,north,,,Physcia.adscendens,oob_spearman,99,0.567387904302673,0.549537429654247,0.581886454163815, -lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Climate,99,0.720918773373224,0.712650560435026,0.728579673956133, -lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Climate,99,0.689144635427072,0.680873381791638,0.698761438702953, -lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Climate_Truncated,99,0.720930740463725,0.712658541338133,0.728614575624258, -lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Climate_Truncated,99,0.689133844867517,0.680847879279384,0.698755518234618, -lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Full,99,0.769142363003573,0.760363798954931,0.781551514547456, -lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Full,99,0.834569321101047,0.825318195008198,0.843996747262564, -lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Full_Joint,99,0.768152331423773,0.759812672712765,0.780189734262456, -lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Full_Joint,99,0.833778617163388,0.821731526307177,0.841857565835814, -lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Full_Joint_Truncated,99,0.768049343702181,0.759794968553464,0.780225490484061, -lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Full_Joint_Truncated,99,0.833901297402281,0.821793123470401,0.841904293589348, -lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Full_Truncated,99,0.769375783962666,0.760288655670733,0.781582641288071, -lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Full_Truncated,99,0.834936696506996,0.825421706977217,0.844055449907669, -lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Landcover,99,0.707003638756629,0.694851661808356,0.720077223146866, -lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Landcover,99,0.806874249599937,0.78887752964357,0.820974567104598, -lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Climate,100,0.7235281228999,0.717441862095723,0.729839575280893,0.723004804073768 -lichen,lichen,north,,,Physcia.adscendens,v2val_Climate,100,0.693903155154763,0.68873689780885,0.698042527967169,0.693422907498 -lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Climate_Truncated,100,0.723538229483672,0.717445780953459,0.729849398789947,0.72301652132686 -lichen,lichen,north,,,Physcia.adscendens,v2val_Climate_Truncated,100,0.693897896800193,0.688717298999803,0.698042748005106,0.693419511127206 -lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Full,100,0.776586031004036,0.769782653235173,0.781235452865446,0.776659932196605 -lichen,lichen,north,,,Physcia.adscendens,v2val_Full,100,0.838564851497925,0.833625144582723,0.845039678547128,0.838268220834197 -lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Full_Joint,100,0.775847920853584,0.769071476627846,0.780273084489337,0.77578324180292 -lichen,lichen,north,,,Physcia.adscendens,v2val_Full_Joint,100,0.836617198875312,0.832065573684458,0.842958635790047,0.836357683360022 -lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Full_Joint_Truncated,100,0.775630433031142,0.768905297903972,0.78063749666941,0.775630371417491 -lichen,lichen,north,,,Physcia.adscendens,v2val_Full_Joint_Truncated,100,0.836790613008269,0.832110390227703,0.843010056321518,0.836525866238843 -lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Full_Truncated,100,0.776419861818452,0.769668394570003,0.781498799112205,0.77651231594881 -lichen,lichen,north,,,Physcia.adscendens,v2val_Full_Truncated,100,0.838676134749758,0.833749257931369,0.845128664248426,0.838439032548488 -lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Landcover,100,0.709593137989017,0.701801434200798,0.71574025781388,0.710689730662897 -lichen,lichen,north,,,Physcia.adscendens,v2val_Landcover,100,0.80961766255631,0.788306510386797,0.821112870692013,0.812994033294577 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_auc,100,0.830525429515063,0.81604844430429,0.841787762025551,0.828408463820101 -lichen,lichen,south,,,Physcia.adscendens,insample_auc,100,0.841765750148897,0.835332420212302,0.851818483932403,0.841173848599416 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_calibration_slope,100,0.982972841611774,0.933529016241715,1.02605515147802,1.01467814581042 -lichen,lichen,south,,,Physcia.adscendens,insample_calibration_slope,100,0.98414680389702,0.949866080740196,1.00735121035812,0.989153221348672 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_deviance_explained,100,0.217596986009839,0.199272844258197,0.233746882017517,0.217566602485613 -lichen,lichen,south,,,Physcia.adscendens,insample_deviance_explained,100,0.274920311445747,0.263973025543899,0.295736386939481,0.274902459396964 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_n,100,1483.5,1457,1509.1,2346 -lichen,lichen,south,,,Physcia.adscendens,insample_n,100,1480.5,1463,1508.1,2346 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_prevalence,100,0.093062874358488,0.0871251477911935,0.0985096364127046,0.092924126172208 -lichen,lichen,south,,,Physcia.adscendens,insample_prevalence,100,0.214722124199446,0.205436679722394,0.223097894761383,0.215686274509804 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_rmse,100,0.27087268791403,0.26414104023987,0.277530954067709,0.271312770803834 -lichen,lichen,south,,,Physcia.adscendens,insample_rmse,100,0.349408213370138,0.341231568382864,0.355156444882723,0.349756738076147 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_spearman,100,0.331663035664903,0.312174742385052,0.347856252239412,0.330286991594626 -lichen,lichen,south,,,Physcia.adscendens,insample_spearman,100,0.486225737344946,0.475186496857954,0.501475433694051,0.48609712754117 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_auc,99,0.799970484061393,0.775333716499924,0.821361725248609, -lichen,lichen,south,,,Physcia.adscendens,oob_auc,99,0.832216295609153,0.812918356886962,0.84383834193707, -lichen,lichen,south,,,Cladonia.chlorophaea,oob_calibration_slope,99,0.83226582711674,0.687252862288971,1.04162320779769, -lichen,lichen,south,,,Physcia.adscendens,oob_calibration_slope,99,0.933315477460017,0.84750745834188,1.03678504002113, -lichen,lichen,south,,,Cladonia.chlorophaea,oob_deviance_explained,99,0.168367974657616,0.118832513303203,0.197439279118203, -lichen,lichen,south,,,Physcia.adscendens,oob_deviance_explained,99,0.250569721574222,0.213912803567623,0.275038264461662, -lichen,lichen,south,,,Cladonia.chlorophaea,oob_n,100,862.5,836.9,889,0 -lichen,lichen,south,,,Physcia.adscendens,oob_n,100,865.5,837.9,883,0 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_prevalence,99,0.0926553672316384,0.0833333333333333,0.102941033138401, -lichen,lichen,south,,,Physcia.adscendens,oob_prevalence,99,0.217582417582418,0.203154716242863,0.232991265333397, -lichen,lichen,south,,,Cladonia.chlorophaea,oob_rmse,99,0.276805383506645,0.265439259208283,0.289284420169747, -lichen,lichen,south,,,Physcia.adscendens,oob_rmse,99,0.35779053373906,0.346088831243775,0.368235479879014, -lichen,lichen,south,,,Cladonia.chlorophaea,oob_spearman,99,0.304103065146685,0.271871702578512,0.32936871363484, -lichen,lichen,south,,,Physcia.adscendens,oob_spearman,99,0.473517262633272,0.443141256672266,0.491064816140324, -lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Climate,99,0.720918773373224,0.712650560435026,0.728579673956133, -lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Climate,99,0.689144635427072,0.680873381791638,0.698761438702953, -lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Climate_Truncated,99,0.720930740463725,0.712658541338133,0.728614575624258, -lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Climate_Truncated,99,0.689133844867517,0.680847879279384,0.698755518234618, -lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Full,99,0.769192913385827,0.740816145064209,0.792152407634443, -lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Full,99,0.814451917130489,0.796076806462607,0.831527942532319, -lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Full_Joint,99,0.769436743032249,0.744011243283277,0.793514941384641, -lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Full_Joint,99,0.81242151354924,0.791924831211599,0.828123603004887, -lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Full_Joint_Truncated,99,0.769436743032249,0.744011243283277,0.793514941384641, -lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Full_Joint_Truncated,99,0.81242151354924,0.791924831211599,0.828123603004887, -lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Full_Truncated,99,0.769192913385827,0.740816145064209,0.792152407634443, -lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Full_Truncated,99,0.814451917130489,0.796076806462607,0.831534146727906, -lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Landcover,99,0.738834202254804,0.70857488379101,0.767503416567657, -lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Landcover,99,0.759559552987862,0.73362889344165,0.776333033950638, -lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Climate,100,0.7235281228999,0.717441862095723,0.729839575280893,0.723004804073768 -lichen,lichen,south,,,Physcia.adscendens,v2val_Climate,100,0.693903155154763,0.68873689780885,0.698042527967169,0.693422907498 -lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Climate_Truncated,100,0.723538229483672,0.717445780953459,0.729849398789947,0.72301652132686 -lichen,lichen,south,,,Physcia.adscendens,v2val_Climate_Truncated,100,0.693897896800193,0.688717298999803,0.698042748005106,0.693419511127206 -lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Full,100,0.781684042308046,0.765640384141264,0.797179703714229,0.782940004828585 -lichen,lichen,south,,,Physcia.adscendens,v2val_Full,100,0.821831844343548,0.812065145466866,0.832981098960484,0.821573724007562 -lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Full_Joint,100,0.782929579158528,0.767421869497933,0.797927045706971,0.783724649927571 -lichen,lichen,south,,,Physcia.adscendens,v2val_Full_Joint,100,0.818461282378356,0.808982334731472,0.829948045116519,0.818413816807012 -lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Full_Joint_Truncated,100,0.782929579158528,0.767421869497933,0.797927045706971,0.783724649927571 -lichen,lichen,south,,,Physcia.adscendens,v2val_Full_Joint_Truncated,100,0.818465382979777,0.808982334731472,0.829948045116519,0.818413816807012 -lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Full_Truncated,100,0.781684042308046,0.765640384141264,0.797179703714229,0.782940004828585 -lichen,lichen,south,,,Physcia.adscendens,v2val_Full_Truncated,100,0.821831844343548,0.812065145466866,0.832981098960484,0.821573724007562 -lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Landcover,100,0.746462990180373,0.72844374826332,0.760216371643953,0.74708991515486 -lichen,lichen,south,,,Physcia.adscendens,v2val_Landcover,100,0.757941670475573,0.744902995002577,0.775307203498065,0.755514263619179 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_auc,100,0.823632636160737,0.814781230564576,0.831408128980217,0.820911148938545 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_auc,100,0.61475601886175,0.603679345102737,0.627353730564579,0.614800455189874 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_calibration_slope,100,0.974719951819278,0.940060183795489,1.01331111594891,0.987210797047211 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_calibration_slope,100,0.847565289100029,0.777129508768977,0.945716349335048,0.901041907949805 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_deviance_explained,100,0.279791843738347,0.261697566054768,0.292547470573807,0.272167552780268 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_deviance_explained,100,0.032556283657145,0.0243296542272488,0.039523255842162,0.0327130199155846 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_n,100,2564.5,2538.9,2588.1,4053 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_n,100,2562.5,2537.8,2585.2,4053 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_prevalence,100,0.225366262673778,0.220070866141732,0.230634088644114,0.22526523562793 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_prevalence,100,0.321224265570394,0.314927013046706,0.329608505982353,0.321243523316062 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_rmse,100,0.325947657311819,0.321499471172476,0.331112157543476,0.327783381237672 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_rmse,100,0.440780068007451,0.437909796174194,0.443705369273563,0.440494520447441 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_spearman,100,0.462005079284434,0.44910358192168,0.473619794940904,0.457622037926128 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_spearman,100,0.169333701727882,0.148930684100538,0.188146271759874,0.166867112583273 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_auc,99,0.808896640826873,0.79100198897739,0.827548123693069, -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_auc,99,0.59059424536098,0.573979407712817,0.607160496358349, -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_calibration_slope,99,0.93389114249429,0.850341206695487,1.01749958453456, -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_calibration_slope,99,0.643049641195582,0.517287601824814,0.821946111710213, -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_deviance_explained,99,0.243486713148957,0.193079357602948,0.27747427555585, -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_deviance_explained,99,0.0121132026875843,-0.00570566280736071,0.0241511023697404, -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_n,100,1488.5,1464.9,1514.1,0 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_n,100,1490.5,1467.8,1515.2,0 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_prevalence,99,0.224915824915825,0.215935838563886,0.234336783397599, -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_prevalence,99,0.321309285237141,0.306674120479106,0.332295711996362, -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_rmse,99,0.331823647228338,0.323085219723366,0.340284753308317, -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_rmse,99,0.445175541404113,0.440470485230338,0.448886295412126, -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_spearman,99,0.4394124176263,0.417905127967147,0.465739312197084, -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_spearman,99,0.130783814760799,0.101891242189749,0.155800550653179, -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_auc,99,0.635001427076396,0.606104262619653,0.657438718250968,0.634240369366988 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_auc,100,0.786511166542812,0.769504152294664,0.804093618520575,0.786049924840508 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_calibration_slope,99,0.913890378466184,0.820802523135607,1.01427035726621,1.00531761653027 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_calibration_slope,100,0.984182683497037,0.904891334217879,1.06778036362132,0.986324497785332 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_deviance_explained,99,0.026440006660178,0.0180120188346803,0.0396931836083979,0.0264112493368064 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_deviance_explained,100,0.21040174777469,0.184564736775399,0.242108898186897,0.205216892616348 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_n,99,675,663,685.4,1065 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_n,100,674,660.9,691.1,1065 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_prevalence,99,0.690265486725664,0.677825953587333,0.705306871830739,0.691079812206573 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_prevalence,100,0.182355333743735,0.168834754036547,0.195212578714749,0.182159624413146 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_rmse,99,0.421280362710698,0.414044874992987,0.426531332439636,0.421286846656193 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_rmse,100,0.343613620192013,0.334680149069424,0.351940369457748,0.345153854253612 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_spearman,99,0.180460025029286,0.146567810345527,0.214594440680258,0.175369074792115 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_spearman,100,0.38143205353404,0.353940396364084,0.410801187004518,0.381089371361329 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_auc,98,0.591021454838246,0.551176084882234,0.62061474225386, -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_auc,99,0.766688006828852,0.728742672765759,0.797692233844295, -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_calibration_slope,98,0.602514054060098,0.232115218957736,0.865596324101407, -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_calibration_slope,99,0.887224345060846,0.665784227384331,1.20908224079875, -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_deviance_explained,98,-0.000836625554455406,-0.0331073359910842,0.015317940018266, -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_deviance_explained,99,0.160410765184501,-0.0354375437473713,0.21724314670011, -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_n,99,390,379.6,402,0 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_n,100,391,373.9,404.1,0 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_prevalence,98,0.69250645994832,0.665551467442457,0.71439588688946, -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_prevalence,99,0.181578947368421,0.160028119078184,0.205617057719676, -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_rmse,98,0.429820967393949,0.42171561998268,0.442398381954269, -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_rmse,99,0.350823352193687,0.337300969232687,0.368279364518069, -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_spearman,98,0.110037755841753,0.0541619409153014,0.160705561767885, -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_spearman,99,0.356733670694178,0.298765552548449,0.401384960970594, -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_auc,100,0.840215938467687,0.83092115117171,0.849787411243392,0.839440907842931 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_auc,100,0.67821310892138,0.663270440192927,0.695381764999782,0.668767750495832 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_calibration_slope,100,0.972671886418681,0.93201508456542,1.02152533613636,0.982050704865843 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_calibration_slope,100,0.917861855484528,0.84216777747185,0.991483856313351,0.94812085347111 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_deviance_explained,100,0.295983987195951,0.279264150591629,0.313078108968483,0.294409607036222 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_deviance_explained,100,0.0786332530404745,0.0665566425621889,0.0944247372062849,0.0713753243188524 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_n,100,2609,2585,2637.1,4127 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_n,100,2610,2586.7,2642.1,4127 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_prevalence,100,0.201888432073211,0.197431539212855,0.208159731764965,0.201356917858008 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_prevalence,100,0.149990410433449,0.143887902486318,0.155025771607528,0.148776350860189 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_rmse,100,0.300488510882096,0.296257654339334,0.306287986982839,0.30069616131153 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_rmse,100,0.332560139164442,0.327709275223946,0.336999200640023,0.332910274284271 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_spearman,100,0.464310589597897,0.45159625601271,0.478558931582411,0.463240577826878 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_spearman,100,0.223831736114593,0.205313082589125,0.244481495615383,0.211955551417089 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_auc,99,0.83021391101824,0.813671018298189,0.846159487988212, -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_auc,99,0.650339977044136,0.626283007371369,0.674110216571647, -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_calibration_slope,99,0.943994670763352,0.852757151203258,1.04492756918031, -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_calibration_slope,99,0.765031662278474,0.564319012355523,0.978273019865697, -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_deviance_explained,99,0.273408193489382,0.229352594121753,0.302275051480294, -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_deviance_explained,99,0.0437348310014123,-0.0244103779855468,0.070888637861963, -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_n,100,1518,1489.9,1542,0 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_n,100,1517,1484.9,1540.3,0 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_prevalence,99,0.200259235255995,0.189775542999326,0.208169005020511, -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_prevalence,99,0.146603900470746,0.138208405767461,0.157249189724539, -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_rmse,99,0.304113428131756,0.295100478568192,0.311362926507058, -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_rmse,99,0.335213172770143,0.328331589790136,0.342856337727437, -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_spearman,99,0.448324145179786,0.427614830976871,0.47442464641456, -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_spearman,99,0.189218625360862,0.156934768956714,0.217963256910742, -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_auc,100,0.691441153027097,0.672240387183235,0.706212764410456,0.689082366331686 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_auc,100,0.820968430916565,0.801436993738574,0.84112134496232,0.819927852628077 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_calibration_slope,100,0.992627010851258,0.920219152025468,1.09520751465362,1.03306130883064 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_calibration_slope,100,0.883711120332416,0.748929633856669,1.03639244285071,0.926166715024209 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_deviance_explained,100,0.067567099805677,0.0560696673854207,0.0822942032238073,0.0670547674954939 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_deviance_explained,100,0.239038869889767,0.21013927948378,0.277280840586616,0.234870911391229 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_n,100,695,682,708.1,1098 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_n,100,696,681,709.1,1098 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_prevalence,100,0.603312544835565,0.587842923920052,0.618115052537349,0.604735883424408 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_prevalence,100,0.0873239436619718,0.0790283819028552,0.0939931596468854,0.0874316939890711 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_rmse,100,0.40682238205156,0.401865860344406,0.410771399612378,0.406888363248781 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_rmse,100,0.222369754770973,0.210112146550844,0.231243986964309,0.223331046901821 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_spearman,100,0.299224586077027,0.269355636443703,0.329699476853509,0.296933239332004 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_spearman,100,0.312958724627694,0.294454461225426,0.33498073496289,0.313170610278462 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_auc,99,0.664455665867854,0.639651542814446,0.690741654078452, -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_auc,99,0.783524426719841,0.742644818301232,0.814561651279978, -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_calibration_slope,99,0.817106846468162,0.635134217999263,1.06374115196959, -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_calibration_slope,99,0.631374792805361,0.431072836936144,0.94521686736471, -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_deviance_explained,99,0.0446136452786412,0.00619180902025967,0.0633330011439923, -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_deviance_explained,99,0.154109596533938,-0.020676255891081,0.207600467554891, -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_n,100,403,389.9,416,0 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_n,100,402,388.9,417,0 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_prevalence,99,0.6075,0.580323143750253,0.635349582154713, -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_prevalence,99,0.0876288659793814,0.0760837438423646,0.101576468326444, -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_rmse,99,0.413228278046299,0.406653224893685,0.424163637351331, -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_rmse,99,0.232970422089708,0.214829244725729,0.249813879153275, -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_spearman,99,0.261506753321649,0.206422225163459,0.30115717511071, -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_spearman,99,0.278122302398705,0.235207424325587,0.312315920243565, -mite,mite,north,,,Ceratozetes.gracilis,insample_auc,100,0.79764960251103,0.790265112142925,0.803014153893967,0.796797763564616 -mite,mite,north,,,Trhypochthonius.tectorum,insample_auc,100,0.695668269661138,0.683311469089793,0.708716981054314,0.693478045026932 -mite,mite,north,,,Ceratozetes.gracilis,insample_calibration_slope,100,0.998797614762679,0.973003562776025,1.02348834676389,1.01060441588758 -mite,mite,north,,,Trhypochthonius.tectorum,insample_calibration_slope,100,0.953819502076839,0.906510887653655,1.02084762209438,0.99979630802942 -mite,mite,north,,,Ceratozetes.gracilis,insample_deviance_explained,100,0.193008737804738,0.181739448301126,0.201661801567595,0.192285651521356 -mite,mite,north,,,Trhypochthonius.tectorum,insample_deviance_explained,100,0.0674511356385436,0.0598971412561373,0.0762925190230293,0.0657438604252465 -mite,mite,north,,,Ceratozetes.gracilis,insample_n,100,3611.5,3576.4,3648.1,5711 -mite,mite,north,,,Trhypochthonius.tectorum,insample_n,100,3611,3575.8,3647.3,5711 -mite,mite,north,,,Ceratozetes.gracilis,insample_prevalence,100,0.208199871528185,0.202330059472997,0.21373147884126,0.208369812642269 -mite,mite,north,,,Trhypochthonius.tectorum,insample_prevalence,100,0.0955235096257067,0.0915774802199236,0.0988495023046604,0.0956049728593941 -mite,mite,north,,,Ceratozetes.gracilis,insample_rmse,100,0.362341821380525,0.357614975130255,0.365783840587183,0.362271480910673 -mite,mite,north,,,Trhypochthonius.tectorum,insample_rmse,100,0.287055116874456,0.282074628131594,0.291589162021195,0.287472688930716 -mite,mite,north,,,Ceratozetes.gracilis,insample_spearman,100,0.418676629729472,0.407119399739678,0.427276208006511,0.417570583307426 -mite,mite,north,,,Trhypochthonius.tectorum,insample_spearman,100,0.199311545833827,0.186622637832808,0.211624444539445,0.197079610929558 -mite,mite,north,,,Ceratozetes.gracilis,oob_auc,99,0.786867707648098,0.774187910909352,0.796514509877961, -mite,mite,north,,,Trhypochthonius.tectorum,oob_auc,99,0.656996441402617,0.636882624100218,0.67929424581142, -mite,mite,north,,,Ceratozetes.gracilis,oob_calibration_slope,99,0.96183303495678,0.883323795220391,1.02731965461652, -mite,mite,north,,,Trhypochthonius.tectorum,oob_calibration_slope,99,0.772962411920347,0.625887214843551,0.971044514733484, -mite,mite,north,,,Ceratozetes.gracilis,oob_deviance_explained,99,0.174074875598022,0.153589237127838,0.189989626088515, -mite,mite,north,,,Trhypochthonius.tectorum,oob_deviance_explained,99,0.0286565486886089,0.00771368081782448,0.0495098764287371, -mite,mite,north,,,Ceratozetes.gracilis,oob_n,100,2099.5,2062.9,2134.6,0 -mite,mite,north,,,Trhypochthonius.tectorum,oob_n,100,2100,2063.7,2135.2,0 -mite,mite,north,,,Ceratozetes.gracilis,oob_prevalence,99,0.208786017949929,0.199496646948345,0.218887953819956, -mite,mite,north,,,Trhypochthonius.tectorum,oob_prevalence,99,0.095769409576941,0.0898898158460644,0.102527927842943, -mite,mite,north,,,Ceratozetes.gracilis,oob_rmse,99,0.365594372577947,0.360562265939922,0.372213007268495, -mite,mite,north,,,Trhypochthonius.tectorum,oob_rmse,99,0.290903335956598,0.28306112008192,0.298263526752633, -mite,mite,north,,,Ceratozetes.gracilis,oob_spearman,99,0.402588005893801,0.38436112841948,0.421432163723525, -mite,mite,north,,,Trhypochthonius.tectorum,oob_spearman,99,0.160614554026014,0.139028864717418,0.181462351625277, -mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Climate,99,0.734956389373006,0.72425367499707,0.745909153373562, -mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Climate,99,0.638342287752377,0.618187226042641,0.657504024919964, -mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Climate_Truncated,99,0.734924300615503,0.724212897038428,0.74588498630922, -mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Climate_Truncated,99,0.638365821429941,0.618184154764979,0.657498616560185, -mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Full,99,0.784719038881003,0.773178754620244,0.795479334633468, -mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Full,99,0.651718898385565,0.636655558271588,0.67451733769942, -mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Full_Joint,99,0.78489164605236,0.773137004390567,0.795379252566855, -mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Full_Joint,99,0.650619319414049,0.636142187917328,0.674471465378823, -mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Full_Joint_Truncated,99,0.784845263863121,0.773124471326533,0.795223511559166, -mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Full_Joint_Truncated,99,0.650697674418605,0.636256531006593,0.674578866782116, -mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Full_Truncated,99,0.784702420108714,0.773175774381691,0.795336105984979, -mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Full_Truncated,99,0.651754510921178,0.636777941613843,0.674583194603189, -mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Landcover,99,0.758805093399336,0.746485924819688,0.771387018903544, -mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Landcover,99,0.612701645627281,0.590187575597952,0.631325206986045, -mite,mite,north,,,Ceratozetes.gracilis,v2val_Climate,100,0.737438837044945,0.73108563444224,0.745220440466574,0.738382414749567 -mite,mite,north,,,Trhypochthonius.tectorum,v2val_Climate,100,0.646399889389764,0.635927059979148,0.656681007348258,0.646091585413555 -mite,mite,north,,,Ceratozetes.gracilis,v2val_Climate_Truncated,100,0.737426078766032,0.731081895217831,0.745228984913048,0.738392463572007 -mite,mite,north,,,Trhypochthonius.tectorum,v2val_Climate_Truncated,100,0.646412518420192,0.635932057855205,0.656705753288746,0.646095557008706 -mite,mite,north,,,Ceratozetes.gracilis,v2val_Full,100,0.792129407675089,0.784999351238186,0.798007653851505,0.791183069113511 -mite,mite,north,,,Trhypochthonius.tectorum,v2val_Full,100,0.678069892111616,0.668115642289897,0.691570135316744,0.669778092188547 -mite,mite,north,,,Ceratozetes.gracilis,v2val_Full_Joint,100,0.792319179894978,0.785107596237888,0.798106897210031,0.791225262500488 -mite,mite,north,,,Trhypochthonius.tectorum,v2val_Full_Joint,100,0.677875105270547,0.667971879477692,0.691152263754938,0.66926215120794 -mite,mite,north,,,Ceratozetes.gracilis,v2val_Full_Joint_Truncated,100,0.792270646461233,0.784996783953025,0.798085250808367,0.7911589984368 -mite,mite,north,,,Trhypochthonius.tectorum,v2val_Full_Joint_Truncated,100,0.677978875377472,0.668016715774074,0.691209732839322,0.669242116386356 -mite,mite,north,,,Ceratozetes.gracilis,v2val_Full_Truncated,100,0.792086330384434,0.784902829890835,0.797978154154108,0.791105466738786 -mite,mite,north,,,Trhypochthonius.tectorum,v2val_Full_Truncated,100,0.67819925700999,0.668189835369413,0.691638395354139,0.669767986128102 -mite,mite,north,,,Ceratozetes.gracilis,v2val_Landcover,100,0.766528013047557,0.758672408700658,0.774519100120648,0.766722893536977 -mite,mite,north,,,Trhypochthonius.tectorum,v2val_Landcover,100,0.647813214614084,0.635162138711342,0.660710676806236,0.637987440117159 -mite,mite,south,,,Ceratozetes.gracilis,insample_auc,100,0.892707050359217,0.880490910244845,0.908212907848489,0.890997673556088 -mite,mite,south,,,Trhypochthonius.tectorum,insample_auc,100,0.724867191947384,0.70852165349298,0.745317546849153,0.723973639682964 -mite,mite,south,,,Ceratozetes.gracilis,insample_calibration_slope,100,1.00502080599402,0.952455083247924,1.09112875870501,1.03680964341723 -mite,mite,south,,,Trhypochthonius.tectorum,insample_calibration_slope,100,0.981215565874312,0.893626222637007,1.09078831127912,1.03282742419112 -mite,mite,south,,,Ceratozetes.gracilis,insample_deviance_explained,100,0.325497099511249,0.297912532981948,0.361127487557951,0.320494419788214 -mite,mite,south,,,Trhypochthonius.tectorum,insample_deviance_explained,100,0.0934320512138448,0.0779654055574169,0.112971811878278,0.0913494137264966 -mite,mite,south,,,Ceratozetes.gracilis,insample_n,100,1494,1472,1519,2363 -mite,mite,south,,,Trhypochthonius.tectorum,insample_n,100,1491,1464.9,1513.1,2363 -mite,mite,south,,,Ceratozetes.gracilis,insample_prevalence,100,0.0560369998468874,0.0512751399543853,0.0605680889804702,0.0562843842573 -mite,mite,south,,,Trhypochthonius.tectorum,insample_prevalence,100,0.0834614879480407,0.0777956447270506,0.0898914722165834,0.0833685992382565 -mite,mite,south,,,Ceratozetes.gracilis,insample_rmse,100,0.199761264937152,0.190846959832617,0.207839536498707,0.200524923589364 -mite,mite,south,,,Trhypochthonius.tectorum,insample_rmse,100,0.268245651768535,0.260181738514282,0.275872677318287,0.267980602329676 -mite,mite,south,,,Ceratozetes.gracilis,insample_spearman,100,0.312194294877045,0.298401375089775,0.326491820416125,0.312161907288093 -mite,mite,south,,,Trhypochthonius.tectorum,insample_spearman,100,0.216574263979227,0.19736592523133,0.235039604757477,0.214479910507598 -mite,mite,south,,,Ceratozetes.gracilis,oob_auc,99,0.866366090050301,0.832423247232638,0.89832578771871, -mite,mite,south,,,Trhypochthonius.tectorum,oob_auc,99,0.681894702096055,0.644529496094018,0.718523652572189, -mite,mite,south,,,Ceratozetes.gracilis,oob_calibration_slope,99,0.870142167861266,0.718742962870896,1.16328663725671, -mite,mite,south,,,Trhypochthonius.tectorum,oob_calibration_slope,99,0.724900423720063,0.47529962795477,1.0104925890134, -mite,mite,south,,,Ceratozetes.gracilis,oob_deviance_explained,99,0.263266494848867,0.170366258386125,0.308407819151291, -mite,mite,south,,,Trhypochthonius.tectorum,oob_deviance_explained,99,0.0302321727646686,-0.036349004988869,0.0683437026947676, -mite,mite,south,,,Ceratozetes.gracilis,oob_n,100,869,844,891,0 -mite,mite,south,,,Trhypochthonius.tectorum,oob_n,100,872,849.9,898.1,0 -mite,mite,south,,,Ceratozetes.gracilis,oob_prevalence,99,0.0567536889897843,0.0492060040243461,0.0647286476351338, -mite,mite,south,,,Trhypochthonius.tectorum,oob_prevalence,99,0.0830489192263936,0.0720677621944575,0.0927861264477562, -mite,mite,south,,,Ceratozetes.gracilis,oob_rmse,99,0.20783366391651,0.195621348914586,0.223198277996607, -mite,mite,south,,,Trhypochthonius.tectorum,oob_rmse,99,0.272200342412914,0.258672733203831,0.285569347368102, -mite,mite,south,,,Ceratozetes.gracilis,oob_spearman,99,0.293951803574799,0.261879056437077,0.321029993144448, -mite,mite,south,,,Trhypochthonius.tectorum,oob_spearman,99,0.175614116696667,0.138478936612199,0.208838587852502, -mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Climate,99,0.734956389373006,0.72425367499707,0.745909153373562, -mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Climate,99,0.638342287752377,0.618187226042641,0.657504024919964, -mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Climate_Truncated,99,0.734924300615503,0.724212897038428,0.74588498630922, -mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Climate_Truncated,99,0.638365821429941,0.618184154764979,0.657498616560185, -mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Full,99,0.876754158004158,0.836903325941546,0.898009878626587, -mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Full,99,0.6853880850931,0.650846584321518,0.723794885344973, -mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Full_Joint,99,0.876374929418408,0.836856202096876,0.898594288869518, -mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Full_Joint,99,0.685599471717562,0.651414735716439,0.724097221093466, -mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Full_Joint_Truncated,99,0.876374929418408,0.836856202096876,0.89863479109714, -mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Full_Joint_Truncated,99,0.685599471717562,0.651414735716439,0.724082791079036, -mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Full_Truncated,99,0.876754158004158,0.836903325941546,0.89813801872643, -mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Full_Truncated,99,0.6853880850931,0.650846584321518,0.723780455330544, -mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Landcover,99,0.709904009034444,0.670283600525517,0.7409295732199, -mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Landcover,99,0.64709784411277,0.613057015806844,0.677195295537004, -mite,mite,south,,,Ceratozetes.gracilis,v2val_Climate,100,0.737438837044945,0.73108563444224,0.745220440466574,0.738382414749567 -mite,mite,south,,,Trhypochthonius.tectorum,v2val_Climate,100,0.646399889389764,0.635927059979148,0.656681007348258,0.646091585413555 -mite,mite,south,,,Ceratozetes.gracilis,v2val_Climate_Truncated,100,0.737426078766032,0.731081895217831,0.745228984913048,0.738392463572007 -mite,mite,south,,,Trhypochthonius.tectorum,v2val_Climate_Truncated,100,0.646412518420192,0.635932057855205,0.656705753288746,0.646095557008706 -mite,mite,south,,,Ceratozetes.gracilis,v2val_Full,100,0.882042472336732,0.867054900665937,0.899986632313541,0.880842240129472 -mite,mite,south,,,Trhypochthonius.tectorum,v2val_Full,100,0.709232811452144,0.690803634887013,0.726193259599038,0.705313075635924 -mite,mite,south,,,Ceratozetes.gracilis,v2val_Full_Joint,100,0.88218958764066,0.867694458860852,0.899921384780916,0.880966991469706 -mite,mite,south,,,Trhypochthonius.tectorum,v2val_Full_Joint,100,0.709509901712321,0.691147459247223,0.726823632228287,0.705786473932628 -mite,mite,south,,,Ceratozetes.gracilis,v2val_Full_Joint_Truncated,100,0.882197733815623,0.867697066513443,0.899923812672535,0.880966991469706 -mite,mite,south,,,Trhypochthonius.tectorum,v2val_Full_Joint_Truncated,100,0.709509901712321,0.691165548972259,0.726823632228287,0.705786473932628 -mite,mite,south,,,Ceratozetes.gracilis,v2val_Full_Truncated,100,0.882042472336732,0.867050421871751,0.899986632313541,0.880842240129472 -mite,mite,south,,,Trhypochthonius.tectorum,v2val_Full_Truncated,100,0.709232811452144,0.690805644856461,0.726193259599038,0.705313075635924 -mite,mite,south,,,Ceratozetes.gracilis,v2val_Landcover,100,0.722459055126778,0.706537970365812,0.746090508309774,0.719697225125594 -mite,mite,south,,,Trhypochthonius.tectorum,v2val_Landcover,100,0.664748292002699,0.648949581753739,0.681661010034853,0.660231262098608 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_auc,100,0.834468988277657,0.828928336349903,0.838915518684986,0.833320286593388 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_auc,100,0.836601185549824,0.831382391528133,0.840900880382826,0.836493020513452 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_calibration_slope,100,0.996687593783804,0.985621938666354,1.00809480601565,1.00255532835023 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_calibration_slope,100,0.997485731515118,0.983694544181411,1.01070470921699,1.0015303112941 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_deviance_explained,100,0.270038134398835,0.258860358224687,0.277684812114698,0.267292470908523 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_deviance_explained,100,0.274272213778602,0.264271361845172,0.28249828148454,0.274178640552758 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_n,100,4347,4323.8,4387.3,6874 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_n,100,4351.5,4320.7,4383,6874 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_prevalence,100,0.417040220010148,0.411257497538122,0.423685039429209,0.418242653476869 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_prevalence,100,0.377306878145649,0.372421470873602,0.383305291434879,0.377654931626418 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_rmse,100,0.402807779521981,0.400119105003523,0.406220795953825,0.403734289920767 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_rmse,100,0.396543835095377,0.393279626670222,0.400410954684666,0.396623189931934 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_spearman,100,0.571838349507647,0.560911569893269,0.57919529778825,0.569557439251032 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_spearman,100,0.565450887890109,0.556980305750447,0.573253743615028,0.565106061015985 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_auc,99,0.826467105666453,0.818134882684323,0.836065242715415, -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_auc,99,0.831547875351781,0.82281859588538,0.840212743351642, -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_calibration_slope,99,0.966009815108812,0.929602025875279,1.02111854359086, -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_calibration_slope,99,0.977657631263549,0.939047491110731,1.02921485678769, -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_deviance_explained,99,0.251408916844086,0.235763656796932,0.272400515048929, -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_deviance_explained,99,0.264305366197852,0.245361740606673,0.279169764617225, -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_n,100,2527,2486.7,2550.2,0 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_n,100,2522.5,2491,2553.3,0 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_prevalence,99,0.42032967032967,0.408683029891007,0.430237615488184, -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_prevalence,99,0.378367511057499,0.367908590365397,0.386595299016258, -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_rmse,99,0.408346436964315,0.402215206238207,0.413653651292851, -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_rmse,99,0.399648634867756,0.393721677322426,0.406070570088633, -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_spearman,99,0.55690592378909,0.543877653886252,0.574760225509608, -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_spearman,99,0.556770739143624,0.541586098282066,0.570253107766034, -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Climate,99,0.691331058165982,0.68123155690267,0.699550146575686, -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Climate,99,0.68632433751116,0.677583119454865,0.696836659504796, -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Climate_Truncated,99,0.691338305732185,0.681225313457141,0.699561362431822, -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Climate_Truncated,99,0.686313307565072,0.677589110480343,0.696832207844605, -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Full,99,0.825698367814741,0.8151054765314,0.834113856944233, -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Full,99,0.831908202854914,0.823072908701431,0.839274892124523, -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Full_Joint,99,0.822773343144525,0.812613222290088,0.831727369850404, -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Full_Joint,99,0.831226336599178,0.822851131341598,0.83913038872951, -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Full_Joint_Truncated,99,0.823115028001722,0.812677850152807,0.831916422372746, -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Full_Joint_Truncated,99,0.831315346461213,0.822816857019605,0.839004986966977, -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Full_Truncated,99,0.82605648894629,0.81517852582592,0.834212154167315, -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Full_Truncated,99,0.831845257508434,0.823068897237684,0.839217924213412, -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Landcover,99,0.799340331576827,0.791358391790512,0.809202566122227, -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Landcover,99,0.80682764061935,0.799080161359292,0.816069162479425, -vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Climate,100,0.691863415791796,0.686489408923301,0.696719641146645,0.691923775211569 -vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Climate,100,0.688696490409687,0.683131845162456,0.693889144615178,0.688388374288585 -vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Climate_Truncated,100,0.691859795870376,0.686499004324016,0.696720903409118,0.691928871889894 -vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Climate_Truncated,100,0.68869360113843,0.683133652338722,0.693889124375781,0.688377053340582 -vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Full,100,0.831134546695233,0.826453555719213,0.836685470451462,0.830322798090827 -vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Full,100,0.834462365229321,0.829555965644719,0.838247068153718,0.834425701496386 -vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Full_Joint,100,0.828855917801472,0.823553013652392,0.83406033197307,0.82780564706394 -vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Full_Joint,100,0.834056473759319,0.828597426961828,0.837786033350782,0.833795663987679 -vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Full_Joint_Truncated,100,0.828971835122009,0.823795676153817,0.834143980306853,0.827924459375713 -vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Full_Joint_Truncated,100,0.834022959691282,0.828654047414811,0.837750473486802,0.833746590035665 -vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Full_Truncated,100,0.8312443254568,0.826661177425835,0.836774505270543,0.830433260489035 -vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Full_Truncated,100,0.834403943416699,0.829592504956551,0.838224259430919,0.834353666337466 -vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Landcover,100,0.80581950873551,0.801033316272367,0.811556580125044,0.804887352272851 -vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Landcover,100,0.810187285280975,0.804248133867056,0.815353122716748,0.809938249660894 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_auc,100,0.901035156137018,0.893563651374437,0.91031768915141,0.900337246549105 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_auc,100,0.823127372215157,0.814110129779612,0.829186986563772,0.821021560574949 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_calibration_slope,100,1.01031904559746,0.99173321586267,1.02882378259652,1.0165389783207 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_calibration_slope,100,1.0005676324237,0.975719044216311,1.02197748582502,1.00704511924372 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_deviance_explained,100,0.418065739289151,0.398117525823418,0.441782950315863,0.416204794122737 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_deviance_explained,100,0.244223301177304,0.228971217143153,0.257532605798324,0.241174697140535 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_n,100,1673.5,1649.8,1699,2648 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_n,100,1674,1653.9,1694.3,2648 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_prevalence,100,0.222355073854372,0.213781211105625,0.230552475073514,0.222054380664653 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_prevalence,100,0.264335131120709,0.2545896459474,0.271697484166548,0.264350453172205 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_rmse,100,0.305845546065687,0.299100662189831,0.313303408267496,0.306524157374337 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_rmse,100,0.37329886994026,0.36809978882764,0.378671627245352,0.374125283110615 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_spearman,100,0.579702201309579,0.563715539561319,0.591925892607868,0.576396653446468 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_spearman,100,0.492415963836901,0.478110160826574,0.503525927797863,0.490400472492442 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_auc,99,0.892130345980071,0.875664360061375,0.90622002473392, -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_auc,99,0.810120710671945,0.798108645425018,0.824817132427904, -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_calibration_slope,99,0.985772407752148,0.921597320021943,1.03687803556838, -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_calibration_slope,99,0.960276556523553,0.894277734258451,1.04390870829479, -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_deviance_explained,99,0.391892468625026,0.34789014703091,0.428784802284979, -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_deviance_explained,99,0.220097431051985,0.196095548881429,0.246442169331092, -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_n,100,974.5,949,998.2,0 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_n,100,974,953.7,994.1,0 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_prevalence,99,0.221428571428571,0.207598481204393,0.237028340402618, -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_prevalence,99,0.26440329218107,0.251305848210322,0.281129701184139, -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_rmse,99,0.313481223183848,0.30107791062169,0.32484275529861, -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_rmse,99,0.379044237085407,0.370203730169587,0.387481062834015, -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_spearman,99,0.562971474999272,0.542747647731082,0.589490245195104, -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_spearman,99,0.474975972054997,0.452667957114156,0.499158420181428, -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Climate,99,0.691331058165982,0.68123155690267,0.699550146575686, -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Climate,99,0.68632433751116,0.677583119454865,0.696836659504796, -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Climate_Truncated,99,0.691338305732185,0.681225313457141,0.699561362431822, -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Climate_Truncated,99,0.686313307565072,0.677589110480343,0.696832207844605, -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Full,99,0.886224245054594,0.869117901860841,0.900597865515415, -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Full,99,0.802421159411642,0.790284494061973,0.816722022145616, -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Full_Joint,99,0.879593365215479,0.861830386153107,0.895754987854818, -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Full_Joint,99,0.799441687344913,0.787028453317583,0.814549757529911, -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Full_Joint_Truncated,99,0.879593365215479,0.86182583656257,0.895721611731583, -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Full_Joint_Truncated,99,0.799412018556479,0.787026434186315,0.814551885415856, -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Full_Truncated,99,0.886258508840057,0.869093352344466,0.90056962418037, -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Full_Truncated,99,0.802421159411642,0.790291050006029,0.816723086088588, -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Landcover,99,0.791207477106083,0.77381064055505,0.807775099233706, -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Landcover,99,0.763763509218055,0.748548282413935,0.778515474422235, -vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Climate,100,0.691863415791796,0.686489408923301,0.696719641146645,0.691923775211569 -vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Climate,100,0.688696490409687,0.683131845162456,0.693889144615178,0.688388374288585 -vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Climate_Truncated,100,0.691859795870376,0.686499004324016,0.696720903409118,0.691928871889894 -vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Climate_Truncated,100,0.68869360113843,0.683133652338722,0.693889124375781,0.688377053340582 -vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Full,100,0.890558388031281,0.882171718281364,0.900674587667653,0.890081979393699 -vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Full,100,0.809819891801173,0.800947962462695,0.816880517210972,0.808012980346143 -vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Full_Joint,100,0.883627775630597,0.874438730295859,0.894315052003888,0.88338493164256 -vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Full_Joint,100,0.807080547858112,0.797845801552239,0.813867490124536,0.804804561454972 -vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Full_Joint_Truncated,100,0.883627775630597,0.87442136391673,0.894317713023663,0.88338493164256 -vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Full_Joint_Truncated,100,0.807067965171889,0.797841230192768,0.81385074593849,0.804805294807862 -vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Full_Truncated,100,0.890574871795092,0.882170390818819,0.900674379527283,0.890081979393699 -vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Full_Truncated,100,0.809800062836453,0.800947962462695,0.816879321482204,0.808015180404811 -vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Landcover,100,0.797226829924464,0.785166290798729,0.807521076761336,0.795978634172116 -vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Landcover,100,0.766748996494141,0.75614009820194,0.776155586594122,0.76658587562335 +bird,bird,north,,,AMRO,insample_auc,5,0.72487649207557,0.722489112963132,0.72576145123834,0.721701661835893 +bird,bird,north,,,AMRO,insample_deviance_explained,5,0.142215080261758,0.140707166105981,0.144363142127984,0.140587647159979 +bird,bird,north,,,AMRO,insample_rmse,5,0.663619993960517,0.661624845419777,0.664719637388853,0.664239276180889 +bird,bird,north,,,AMRO,insample_spearman,5,0.344389309730045,0.340479678130316,0.345510088540595,0.339249301212572 +bird,bird,north,,,AMRO,insample_calibration_slope,5,0.80440117768677,0.799100431621395,0.810804150827482,0.80440117768677 +bird,bird,north,,,AMRO,insample_prevalence,5,0.251486631016043,0.251004373826971,0.252433263182893,0.250861017819325 +bird,bird,north,,,AMRO,insample_n,5,46747,46745.2,46750,46747 +bird,bird,north,,,AMRO,oob_auc,5,0.730373137296335,0.729897207197475,0.730684827423547,0.730766733254682 +bird,bird,north,,,AMRO,oob_deviance_explained,5,0.151664799728976,0.150795650809459,0.152520757577584,0.152754178062373 +bird,bird,north,,,AMRO,oob_rmse,5,0.658090400254619,0.657748490410106,0.658646272283023,0.657851304309638 +bird,bird,north,,,AMRO,oob_spearman,5,0.348000943732488,0.347176086570868,0.348405542162744,0.348509330988823 +bird,bird,north,,,AMRO,oob_calibration_slope,5,0.878884682385081,0.857978242744613,0.881378788597934,0.881696624797909 +bird,bird,north,,,AMRO,oob_prevalence,5,0.241010939026539,0.240656718532255,0.241191818078906,0.241245385459292 +bird,bird,north,,,AMRO,oob_n,5,124877,124874,124878.8,124877 +bird,bird,north,,,YEWA,insample_auc,5,0.778635633427003,0.778333348933502,0.779726988023268,0.779841092447633 +bird,bird,north,,,YEWA,insample_deviance_explained,5,0.259141214360432,0.25548753680516,0.260976441286628,0.259141214360432 +bird,bird,north,,,YEWA,insample_rmse,5,0.547361440801496,0.544308917361954,0.551849139043791,0.547158394049375 +bird,bird,north,,,YEWA,insample_spearman,5,0.315565876581618,0.314186701701599,0.31608982965666,0.316093683296469 +bird,bird,north,,,YEWA,insample_calibration_slope,5,0.705708332778131,0.69321277112837,0.712055437422832,0.716264166431109 +bird,bird,north,,,YEWA,insample_prevalence,5,0.118296361263824,0.117706951871658,0.119214980837802,0.118296361263824 +bird,bird,north,,,YEWA,insample_n,5,46747,46745.2,46750,46747 +bird,bird,north,,,YEWA,oob_auc,5,0.728595786591222,0.728230136724689,0.73005150345856,0.730809600284142 +bird,bird,north,,,YEWA,oob_deviance_explained,5,0.179475572495229,0.177360125449593,0.182723444677448,0.183210182399369 +bird,bird,north,,,YEWA,oob_rmse,5,0.591197627682823,0.582204245542092,0.591914132572009,0.581496589737255 +bird,bird,north,,,YEWA,oob_spearman,5,0.273873998143111,0.273042129222169,0.27544277961002,0.276382265893519 +bird,bird,north,,,YEWA,oob_calibration_slope,5,0.66953950556298,0.63693641889123,0.713887951481982,0.718728425403305 +bird,bird,north,,,YEWA,oob_prevalence,5,0.13458843502006,0.134244406707603,0.134809487963868,0.13458843502006 +bird,bird,north,,,YEWA,oob_n,5,124877,124874,124878.8,124877 +bird,bird,south,,,AMRO,insample_auc,5,0.689537506786954,0.689085767534014,0.694179854134546,0.689537506786954 +bird,bird,south,,,AMRO,insample_deviance_explained,5,0.0914919911243302,0.0907862366206112,0.0936622473347538,0.0905093060629211 +bird,bird,south,,,AMRO,insample_rmse,5,0.742475038662062,0.740051841768597,0.745694348908307,0.746104469516561 +bird,bird,south,,,AMRO,insample_spearman,5,0.289206389172517,0.287837179517966,0.295789973779885,0.287696121760142 +bird,bird,south,,,AMRO,insample_calibration_slope,5,0.885482053955006,0.883345065042026,0.893982715783319,0.885403476414633 +bird,bird,south,,,AMRO,insample_prevalence,5,0.258598079444985,0.257039179794386,0.259660332963851,0.25655668358714 +bird,bird,south,,,AMRO,insample_n,5,23639,23636.8,23639.6,23640 +bird,bird,south,,,AMRO,oob_auc,5,0.689591934626615,0.688348632550972,0.689843166919568,0.689591934626615 +bird,bird,south,,,AMRO,oob_deviance_explained,5,0.0984328670162571,0.094117282107193,0.0994994384196623,0.0984328670162571 +bird,bird,south,,,AMRO,oob_rmse,5,0.735225643291462,0.734322072987703,0.736655125441161,0.734395013830007 +bird,bird,south,,,AMRO,oob_spearman,5,0.291547044066434,0.289653619948351,0.29213277997847,0.291376773818019 +bird,bird,south,,,AMRO,oob_calibration_slope,5,0.934404203818623,0.926891186190493,0.961180760134325,0.953623540744284 +bird,bird,south,,,AMRO,oob_prevalence,5,0.259989876131491,0.259616009340861,0.260538534890505,0.260708383581223 +bird,bird,south,,,AMRO,oob_n,5,67168,67167.4,67170.2,67167 +bird,bird,south,,,YEWA,insample_auc,5,0.719332020865892,0.7167959223474,0.722607418769604,0.721262730392428 +bird,bird,south,,,YEWA,insample_deviance_explained,5,0.231210217495144,0.222251823593889,0.235961745747393,0.229114411717017 +bird,bird,south,,,YEWA,insample_rmse,5,0.625043487437273,0.62080865697937,0.628590391800858,0.629305991109963 +bird,bird,south,,,YEWA,insample_spearman,5,0.295095530582618,0.291167713950288,0.299659209105424,0.297439751075024 +bird,bird,south,,,YEWA,insample_calibration_slope,5,0.866874540634912,0.862503477222317,0.872567336726769,0.860619291916303 +bird,bird,south,,,YEWA,insample_prevalence,5,0.171376597004823,0.170895553957443,0.17183640258529,0.171742808798646 +bird,bird,south,,,YEWA,insample_n,5,23639,23636.8,23639.6,23640 +bird,bird,south,,,YEWA,oob_auc,5,0.714680925082376,0.712798268254752,0.716148435308362,0.716561203894474 +bird,bird,south,,,YEWA,oob_deviance_explained,5,0.20248138732713,0.197183679478114,0.207430346720716,0.208119807948008 +bird,bird,south,,,YEWA,oob_rmse,5,0.638667289278492,0.636815197956095,0.639153235243619,0.636772974666958 +bird,bird,south,,,YEWA,oob_spearman,5,0.291734550104421,0.289334731699639,0.29340482100249,0.294073915420202 +bird,bird,south,,,YEWA,oob_calibration_slope,5,0.871741212363925,0.853830810138639,0.901368353942083,0.871741212363925 +bird,bird,south,,,YEWA,oob_prevalence,5,0.175869820899522,0.175707986864887,0.176039185326346,0.175741063319785 +bird,bird,south,,,YEWA,oob_n,5,67168,67167.4,67170.2,67167 +bryophyte,bryophyte,north,,,Bryum.All,insample_auc,5,0.638127846001886,0.629068513424739,0.639705775242135,0.638127846001886 +bryophyte,bryophyte,north,,,Bryum.All,insample_deviance_explained,5,-0.275950193493276,-0.30093504049497,-0.246978357823554,-0.24424818155784 +bryophyte,bryophyte,north,,,Bryum.All,insample_rmse,5,0.479527636307096,0.479331369604887,0.480302514101111,0.479248548520264 +bryophyte,bryophyte,north,,,Bryum.All,insample_spearman,5,0.234421074075063,0.218639785436767,0.237098983905807,0.234421074075063 +bryophyte,bryophyte,north,,,Bryum.All,insample_calibration_slope,5,0.76525545060837,0.744233658530692,0.8107675025251,0.800400269549026 +bryophyte,bryophyte,north,,,Bryum.All,insample_prevalence,5,0.398261429491307,0.395579807718977,0.401857219116663,0.400041220115416 +bryophyte,bryophyte,north,,,Bryum.All,insample_n,5,3097,3072.4,4153.6,4852 +bryophyte,bryophyte,north,,,Bryum.All,oob_auc,4,0.630809068622639,0.623078012227396,0.646295585466171, +bryophyte,bryophyte,north,,,Bryum.All,oob_deviance_explained,4,-0.19138651532205,-0.229639096179351,-0.14780622710667, +bryophyte,bryophyte,north,,,Bryum.All,oob_rmse,4,0.480264599990569,0.480001687050415,0.482221755757651, +bryophyte,bryophyte,north,,,Bryum.All,oob_spearman,4,0.222299987465914,0.20864983396156,0.249132606040734, +bryophyte,bryophyte,north,,,Bryum.All,oob_calibration_slope,4,0.767411113061744,0.685944635693733,0.863863918531363, +bryophyte,bryophyte,north,,,Bryum.All,oob_prevalence,4,0.403358051486104,0.397360409603543,0.408630979157295, +bryophyte,bryophyte,north,,,Bryum.All,oob_n,5,1755,698.4,1779.6,0 +bryophyte,bryophyte,north,,,Bryum.All,v2val_Climate,5,0.562296054365257,0.554173006352827,0.563975593348497,0.563268568361301 +bryophyte,bryophyte,north,,,Bryum.All,v2val_Climate_Truncated,5,0.562295197193571,0.554169893407269,0.56396889522421,0.563263005953167 +bryophyte,bryophyte,north,,,Bryum.All,v2val_Landcover,5,0.59031873097319,0.582725624858305,0.592734774936281,0.59031873097319 +bryophyte,bryophyte,north,,,Bryum.All,v2val_Full,5,0.638127846001886,0.629068513424739,0.639705775242135,0.638127846001886 +bryophyte,bryophyte,north,,,Bryum.All,v2val_Full_Truncated,5,0.639020549706553,0.629556667762114,0.64021053224959,0.639020549706553 +bryophyte,bryophyte,north,,,Bryum.All,v2val_Full_Joint,5,0.63656986211763,0.627565538171321,0.638033581053569,0.63656986211763 +bryophyte,bryophyte,north,,,Bryum.All,v2val_Full_Joint_Truncated,5,0.637367602039122,0.62809310218947,0.638655312558534,0.637500263262641 +bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Climate,4,0.557120566175802,0.540969693146743,0.575367468760527, +bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Climate_Truncated,4,0.557104758803387,0.540966602037286,0.575374474456983, +bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Landcover,4,0.586912742882926,0.576860469268986,0.598756809203001, +bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Full,4,0.630809068622639,0.623078012227396,0.646295585466171, +bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Full_Truncated,4,0.63137585065822,0.623530655084542,0.647529866197263, +bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Full_Joint,4,0.62971870560941,0.622041714357572,0.644532558641158, +bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Full_Joint_Truncated,4,0.630321350629701,0.622479940089637,0.645772715128109, +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_auc,5,0.698174658798715,0.69094551695802,0.709058701464829,0.694675016541229 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_deviance_explained,5,-0.114510476579041,-0.131813022554523,-0.0904615002285642,-0.127187969172517 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_rmse,5,0.466695436776973,0.462912051047972,0.467727184931025,0.467432435043113 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_spearman,5,0.341399187547095,0.328255177404971,0.359282419780438,0.334844748701068 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_calibration_slope,5,0.886684142091591,0.88294240979435,0.897629158250886,0.897907532572089 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_prevalence,5,0.441055234954658,0.434155026365629,0.445516968426104,0.441055234954658 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_n,5,3068,3031.6,4152,4852 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_auc,4,0.669185680513321,0.66194940480315,0.689277603994979, +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_deviance_explained,4,-0.185591758024389,-0.197381970216131,-0.141841988806489, +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_rmse,4,0.475105452566444,0.469359003725674,0.481375013261819, +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_spearman,4,0.29101450640103,0.278786640187495,0.325621827918843, +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_calibration_slope,4,0.772810531065414,0.725727448039512,0.851082802104523, +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_prevalence,4,0.443665764352131,0.432608384046217,0.454192825112108, +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_n,5,1784,700,1820.4,0 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Climate,5,0.656006784390431,0.650667856695395,0.664851582602822,0.652571065182321 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Climate_Truncated,5,0.656014130093929,0.650669976200325,0.664873979724118,0.652577122144193 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Landcover,5,0.626159436771152,0.623847896625279,0.63744965808967,0.626159436771152 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Full,5,0.698174658798715,0.69094551695802,0.709058701464829,0.694675016541229 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Full_Truncated,5,0.698175100984084,0.691211313926766,0.709267355194508,0.694914692057453 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Full_Joint,5,0.693839915631032,0.687220562229904,0.705393695319871,0.69133661745651 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Full_Joint_Truncated,5,0.693823112587028,0.687469531659753,0.705583368208495,0.69158473589171 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Climate,4,0.636250911438379,0.627380368267631,0.653685141830713, +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Climate_Truncated,4,0.636263529886685,0.627402598788168,0.653701328647776, +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Landcover,4,0.608585612621007,0.595998860291286,0.617214693566341, +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Full,4,0.669185680513321,0.66194940480315,0.689277603994979, +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Full_Truncated,4,0.669430040893281,0.6621007168852,0.689600433702903, +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Full_Joint,4,0.667551944528101,0.659697874596654,0.686791205149657, +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Full_Joint_Truncated,4,0.667760268462804,0.659841527855415,0.687057304097503, +bryophyte,bryophyte,south,,,Bryum.All,insample_auc,5,0.624781080501705,0.619098305791523,0.631250290557445,0.631477859980203 +bryophyte,bryophyte,south,,,Bryum.All,insample_deviance_explained,5,-0.0882074375042718,-0.116317967526412,-0.0745997780131311,-0.0659569204939741 +bryophyte,bryophyte,south,,,Bryum.All,insample_rmse,5,0.473712635656491,0.473250036655967,0.475178356015742,0.473182584522988 +bryophyte,bryophyte,south,,,Bryum.All,insample_spearman,5,0.208905797682641,0.198735688372861,0.219564280666345,0.21996433153061 +bryophyte,bryophyte,south,,,Bryum.All,insample_calibration_slope,5,0.874557636620987,0.806197667935386,0.910286420946533,0.929039182089329 +bryophyte,bryophyte,south,,,Bryum.All,insample_prevalence,5,0.370562770562771,0.365528360602252,0.371569237798783,0.370562770562771 +bryophyte,bryophyte,south,,,Bryum.All,insample_n,5,1444,1429.8,1968,2310 +bryophyte,bryophyte,south,,,Bryum.All,oob_auc,4,0.622587939645232,0.609906666129414,0.635174456157602, +bryophyte,bryophyte,south,,,Bryum.All,oob_deviance_explained,4,-0.0294046792827352,-0.0439442359246929,0.0123272085791315, +bryophyte,bryophyte,south,,,Bryum.All,oob_rmse,4,0.475290386543187,0.473040753420391,0.476838977026333, +bryophyte,bryophyte,south,,,Bryum.All,oob_spearman,4,0.204907419101645,0.18388423679321,0.22723046467613, +bryophyte,bryophyte,south,,,Bryum.All,oob_calibration_slope,4,0.862631630882613,0.796586982841539,0.926986747501851, +bryophyte,bryophyte,south,,,Bryum.All,oob_prevalence,4,0.3703593055487,0.368749240306309,0.380219211352906, +bryophyte,bryophyte,south,,,Bryum.All,oob_n,5,866,342,880.2,0 +bryophyte,bryophyte,south,,,Bryum.All,v2val_Climate,5,0.562296054365257,0.554173006352827,0.563975593348497,0.563268568361301 +bryophyte,bryophyte,south,,,Bryum.All,v2val_Climate_Truncated,5,0.562295197193571,0.554169893407269,0.56396889522421,0.563263005953167 +bryophyte,bryophyte,south,,,Bryum.All,v2val_Landcover,5,0.590977483143704,0.588222769171523,0.60141327621516,0.604777025029246 +bryophyte,bryophyte,south,,,Bryum.All,v2val_Full,5,0.624781080501705,0.619098305791523,0.631250290557445,0.631477859980203 +bryophyte,bryophyte,south,,,Bryum.All,v2val_Full_Truncated,5,0.624781080501705,0.619154420181747,0.631292646881434,0.631535708776305 +bryophyte,bryophyte,south,,,Bryum.All,v2val_Full_Joint,5,0.624358409137791,0.618605858115063,0.631039389378428,0.630846343956086 +bryophyte,bryophyte,south,,,Bryum.All,v2val_Full_Joint_Truncated,5,0.624356386786767,0.618642020722096,0.631057597953052,0.630860002699611 +bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Climate,4,0.557120566175802,0.540969693146743,0.575367468760527, +bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Climate_Truncated,4,0.557104758803387,0.540966602037286,0.575374474456983, +bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Landcover,4,0.597272483474034,0.596765466015466,0.601974542549405, +bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Full,4,0.622587939645232,0.609906666129414,0.635174456157602, +bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Full_Truncated,4,0.622567363513545,0.609906666129414,0.63516211047859, +bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Full_Joint,4,0.622331585916656,0.607992717674767,0.636786215054005, +bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Full_Joint_Truncated,4,0.622313949232352,0.607992717674767,0.636775633043423, +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_auc,5,0.717485896729522,0.71685899652647,0.72287874285206,0.717485896729522 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_deviance_explained,5,0.0555144394517471,0.0525022042487002,0.0659817133460382,0.0552076565672067 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_rmse,5,0.403372277591519,0.398339551678763,0.406855811762638,0.403372277591519 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_spearman,5,0.324238098784219,0.318040132102534,0.330331200221374,0.321683515420121 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_calibration_slope,5,0.900294144555213,0.878293846695361,0.929217371465325,0.926240194199798 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_prevalence,5,0.23982683982684,0.231460603487586,0.246697056850865,0.23982683982684 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_n,5,1462,1452.8,1977.6,2310 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_auc,4,0.715093054248096,0.709938966718536,0.716833687112666, +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_deviance_explained,4,0.0485196427393902,0.0213884985438529,0.0541796492701325, +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_rmse,4,0.406296961312814,0.398165216308586,0.415127438523745, +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_spearman,4,0.316460819822169,0.305912040269855,0.327620546786264, +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_calibration_slope,4,0.856225115735854,0.811357325680967,0.90322965680456, +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_prevalence,4,0.238999572635154,0.227667581639544,0.255610993801512, +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_n,5,848,332.4,857.2,0 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Climate,5,0.656006784390431,0.650667856695395,0.664851582602822,0.652571065182321 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Climate_Truncated,5,0.656014130093929,0.650669976200325,0.664873979724118,0.652577122144193 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Landcover,5,0.633036828963795,0.625748811394207,0.642238687874322,0.630393575816386 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Full,5,0.717485896729522,0.71685899652647,0.72287874285206,0.717485896729522 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Full_Truncated,5,0.717485896729522,0.71685899652647,0.72287874285206,0.717485896729522 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Full_Joint,5,0.718564200718732,0.717751679375772,0.723867311169212,0.718564200718732 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Full_Joint_Truncated,5,0.718564200718732,0.717751679375772,0.723867311169212,0.718564200718732 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Climate,4,0.636250911438379,0.627380368267631,0.653685141830713, +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Climate_Truncated,4,0.636263529886685,0.627402598788168,0.653701328647776, +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Landcover,4,0.621073947742974,0.605174465777582,0.638800057775284, +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Full,4,0.715093054248096,0.709938966718536,0.716833687112666, +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Full_Truncated,4,0.715093054248096,0.709938966718536,0.716833687112666, +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Full_Joint,4,0.716849054867145,0.711184101825957,0.718706027458805, +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Full_Joint_Truncated,4,0.716849054867145,0.711184101825957,0.718706027458805, +lichen,lichen,north,,,Cladonia.chlorophaea,insample_auc,5,0.778362159718991,0.777313519482956,0.781078019062442,0.776659932196605 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_deviance_explained,5,0.129922817133758,0.116058360191463,0.137037124714767,0.126180029301491 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_rmse,5,0.428984342825858,0.426484514201266,0.429776953204885,0.429796613403064 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_spearman,5,0.46931020347218,0.467301179157511,0.473793771369763,0.466302441462258 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_calibration_slope,5,1.02280943622485,1.00638380806286,1.02708521369247,1.02280943622485 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_prevalence,5,0.384787472035794,0.382719077877937,0.387875670039505,0.384787472035794 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_n,5,3685,3644,4976.6,5811 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_auc,4,0.766320433722221,0.757378470612268,0.770532908104046, +lichen,lichen,north,,,Cladonia.chlorophaea,oob_deviance_explained,4,0.113996779288933,0.0998702886563739,0.140537458619322, +lichen,lichen,north,,,Cladonia.chlorophaea,oob_rmse,4,0.434233197376139,0.431409497762948,0.437875343465515, +lichen,lichen,north,,,Cladonia.chlorophaea,oob_spearman,4,0.448965855284841,0.434402780928462,0.454722953452224, +lichen,lichen,north,,,Cladonia.chlorophaea,oob_calibration_slope,4,0.967661500539704,0.947481883037204,0.982662848959669, +lichen,lichen,north,,,Cladonia.chlorophaea,oob_prevalence,4,0.385212683681362,0.378550429000763,0.388624647224836, +lichen,lichen,north,,,Cladonia.chlorophaea,oob_n,5,2126,834.4,2167,0 +lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Climate,5,0.726648362079003,0.7237588448296,0.731162951758353,0.723004804073768 +lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Climate_Truncated,5,0.726660385143037,0.723768652905815,0.731181039693866,0.72301652132686 +lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Landcover,5,0.714897867010021,0.711070873547497,0.715616075360572,0.710689730662897 +lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Full,5,0.778362159718991,0.777313519482956,0.781078019062442,0.776659932196605 +lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Full_Truncated,5,0.778213392638019,0.777186308510683,0.780963739171022,0.77651231594881 +lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Full_Joint,5,0.777290152345703,0.776349528728965,0.780295682938712,0.77578324180292 +lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Full_Joint_Truncated,5,0.777190658438047,0.776223771512686,0.780168440645134,0.775630371417491 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Climate,4,0.714982827935826,0.71142147790233,0.716134560839275, +lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Climate_Truncated,4,0.714986555031238,0.711429083580888,0.716141935437511, +lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Landcover,4,0.6993486440522,0.695238223478961,0.703833711587922, +lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Full,4,0.766320433722221,0.757378470612268,0.770532908104046, +lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Full_Truncated,4,0.766446335783094,0.757266971247998,0.770241672495975, +lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Full_Joint,4,0.76558237025298,0.756446722492137,0.76890475840522, +lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Full_Joint_Truncated,4,0.765720545345162,0.756181429801128,0.768751167860589, +lichen,lichen,north,,,Physcia.adscendens,insample_auc,5,0.837335108574662,0.833892427673138,0.841684373333987,0.838268220834197 +lichen,lichen,north,,,Physcia.adscendens,insample_deviance_explained,5,0.153309875432323,0.124539848626552,0.181355576712871,0.153309875432323 +lichen,lichen,north,,,Physcia.adscendens,insample_rmse,5,0.394413849121186,0.390679733700768,0.396338542998067,0.393389135816662 +lichen,lichen,north,,,Physcia.adscendens,insample_spearman,5,0.569716833320736,0.562212442609498,0.574320845837935,0.569949863531718 +lichen,lichen,north,,,Physcia.adscendens,insample_calibration_slope,5,0.977543215514836,0.973882604264117,0.992189734009598,0.974581235728712 +lichen,lichen,north,,,Physcia.adscendens,insample_prevalence,5,0.382961350027218,0.378754207234193,0.387054085275807,0.384099122354156 +lichen,lichen,north,,,Physcia.adscendens,insample_n,5,3699,3673.4,4975,5811 +lichen,lichen,north,,,Physcia.adscendens,oob_auc,4,0.839292658298271,0.829533400959301,0.846965637654569, +lichen,lichen,north,,,Physcia.adscendens,oob_deviance_explained,4,0.143454749419506,0.0949908751245048,0.205499371215224, +lichen,lichen,north,,,Physcia.adscendens,oob_rmse,4,0.391817546344859,0.388424442525194,0.400850115043751, +lichen,lichen,north,,,Physcia.adscendens,oob_spearman,4,0.570820101540557,0.556966290991812,0.585222167374373, +lichen,lichen,north,,,Physcia.adscendens,oob_calibration_slope,4,0.993551581711484,0.96245857697318,1.01756614536709, +lichen,lichen,north,,,Physcia.adscendens,oob_prevalence,4,0.386432660247333,0.378648004672367,0.394703317951312, +lichen,lichen,north,,,Physcia.adscendens,oob_n,5,2112,836,2137.6,0 +lichen,lichen,north,,,Physcia.adscendens,v2val_Climate,5,0.693422907498,0.690915989050979,0.694883881152127,0.693422907498 +lichen,lichen,north,,,Physcia.adscendens,v2val_Climate_Truncated,5,0.693419511127206,0.690911780963104,0.694883929491704,0.693419511127206 +lichen,lichen,north,,,Physcia.adscendens,v2val_Landcover,5,0.801861109542011,0.782213209132931,0.812598365772438,0.812994033294577 +lichen,lichen,north,,,Physcia.adscendens,v2val_Full,5,0.837335108574662,0.833892427673138,0.841684373333987,0.838268220834197 +lichen,lichen,north,,,Physcia.adscendens,v2val_Full_Truncated,5,0.837482703696643,0.83402227575171,0.841815848139725,0.838439032548488 +lichen,lichen,north,,,Physcia.adscendens,v2val_Full_Joint,5,0.836047248740013,0.832067905608026,0.840315800616736,0.836357683360022 +lichen,lichen,north,,,Physcia.adscendens,v2val_Full_Joint_Truncated,5,0.836286222674123,0.832185134167773,0.840452132671447,0.836525866238843 +lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Climate,4,0.690146520368093,0.687623451889863,0.696399093335788, +lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Climate_Truncated,4,0.690133662354544,0.687619313393814,0.696403232441228, +lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Landcover,4,0.80689396202876,0.792826777899119,0.818710192371022, +lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Full,4,0.839292658298271,0.829533400959301,0.846965637654569, +lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Full_Truncated,4,0.839479011781648,0.829796481228334,0.8470008753914, +lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Full_Joint,4,0.835740019351969,0.826152734502598,0.845016117951229, +lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Full_Joint_Truncated,4,0.835910659316576,0.826439317818255,0.845028920277397, +lichen,lichen,south,,,Cladonia.chlorophaea,insample_auc,5,0.782940004828585,0.771430317517624,0.78704102003786,0.782940004828585 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_deviance_explained,5,0.101560194956707,0.0833055588905147,0.10855690687591,0.0760150539678254 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_rmse,5,0.273630488580498,0.266940670870867,0.27923536011912,0.27615265636656 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_spearman,5,0.278345072756788,0.271410866729923,0.283855802016148,0.284558850730728 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_calibration_slope,5,1.00445803190767,0.923032164793458,1.06063235332037,1.00400781901235 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_prevalence,5,0.0907849829351536,0.0854880550520455,0.0942546707117982,0.092924126172208 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_n,5,1482,1471.8,2004.4,2346 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_auc,4,0.767777065619901,0.759098616020395,0.777508870753697, +lichen,lichen,south,,,Cladonia.chlorophaea,oob_deviance_explained,4,0.00020738830490835,-0.0197727594970929,0.0186135944535137, +lichen,lichen,south,,,Cladonia.chlorophaea,oob_rmse,4,0.285215861553978,0.278859149933553,0.293735548818788, +lichen,lichen,south,,,Cladonia.chlorophaea,oob_spearman,4,0.280771471067578,0.258586974156161,0.293911115946987, +lichen,lichen,south,,,Cladonia.chlorophaea,oob_calibration_slope,4,1.11452074384603,0.83884295294175,1.23312243580024, +lichen,lichen,south,,,Cladonia.chlorophaea,oob_prevalence,4,0.0997452652709462,0.0913286406440493,0.106312613843352, +lichen,lichen,south,,,Cladonia.chlorophaea,oob_n,5,864,341.6,874.2,0 +lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Climate,5,0.726648362079003,0.7237588448296,0.731162951758353,0.723004804073768 +lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Climate_Truncated,5,0.726660385143037,0.723768652905815,0.731181039693866,0.72301652132686 +lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Landcover,5,0.746232134390029,0.738477213352093,0.757183243479499,0.74708991515486 +lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Full,5,0.782940004828585,0.771430317517624,0.787041020037861,0.782940004828585 +lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Full_Truncated,5,0.782940004828585,0.771430317517624,0.787041020037861,0.782940004828585 +lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Full_Joint,5,0.783724649927571,0.773780455672375,0.788033764122229,0.783724649927571 +lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Full_Joint_Truncated,5,0.783724649927571,0.773780455672375,0.788033764122229,0.783724649927571 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Climate,4,0.714982827935826,0.71142147790233,0.716134560839275, +lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Climate_Truncated,4,0.714986555031238,0.711429083580888,0.716141935437511, +lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Landcover,4,0.75082184394749,0.74168570185442,0.752461597648907, +lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Full,4,0.767777065619901,0.759098616020395,0.777508870753697, +lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Full_Truncated,4,0.767777065619901,0.759098616020395,0.777508870753697, +lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Full_Joint,4,0.76868800182822,0.762466250385714,0.777619034446911, +lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Full_Joint_Truncated,4,0.76868800182822,0.762466250385714,0.777619034446911, +lichen,lichen,south,,,Physcia.adscendens,insample_auc,5,0.821353781719635,0.817185593102722,0.825672849056938,0.821573724007562 +lichen,lichen,south,,,Physcia.adscendens,insample_deviance_explained,5,0.239704709286469,0.231908892003898,0.24739316046634,0.239704709286469 +lichen,lichen,south,,,Physcia.adscendens,insample_rmse,5,0.356794925429378,0.352929674110169,0.358725757363671,0.356794925429378 +lichen,lichen,south,,,Physcia.adscendens,insample_spearman,5,0.458171869563314,0.449023619570466,0.466231041170605,0.458171869563314 +lichen,lichen,south,,,Physcia.adscendens,insample_calibration_slope,5,0.881651302841094,0.877029058458768,0.905002744726106,0.895884570463108 +lichen,lichen,south,,,Physcia.adscendens,insample_prevalence,5,0.215686274509804,0.210370852380551,0.218705697782215,0.215686274509804 +lichen,lichen,south,,,Physcia.adscendens,insample_n,5,1487,1480.8,2014,2346 +lichen,lichen,south,,,Physcia.adscendens,oob_auc,4,0.816688066173278,0.814577556447952,0.819582119521717, +lichen,lichen,south,,,Physcia.adscendens,oob_deviance_explained,4,0.229581557918766,0.221042427704859,0.242028578202743, +lichen,lichen,south,,,Physcia.adscendens,oob_rmse,4,0.361221111344793,0.357219734510275,0.363119037857434, +lichen,lichen,south,,,Physcia.adscendens,oob_spearman,4,0.454435749483605,0.444604153459308,0.459399541619317, +lichen,lichen,south,,,Physcia.adscendens,oob_calibration_slope,4,0.869323881706107,0.820424126275093,0.95799881977588, +lichen,lichen,south,,,Physcia.adscendens,oob_prevalence,4,0.21549434057534,0.209833885194357,0.226186106799465, +lichen,lichen,south,,,Physcia.adscendens,oob_n,5,859,332,865.2,0 +lichen,lichen,south,,,Physcia.adscendens,v2val_Climate,5,0.693422907498,0.690915989050979,0.694883881152127,0.693422907498 +lichen,lichen,south,,,Physcia.adscendens,v2val_Climate_Truncated,5,0.693419511127206,0.690911780963104,0.694883929491704,0.693419511127206 +lichen,lichen,south,,,Physcia.adscendens,v2val_Landcover,5,0.755367662346663,0.753354388319629,0.769154488554709,0.755514263619179 +lichen,lichen,south,,,Physcia.adscendens,v2val_Full,5,0.821353781719635,0.817185593102722,0.825672849056938,0.821573724007562 +lichen,lichen,south,,,Physcia.adscendens,v2val_Full_Truncated,5,0.821369179600887,0.817185593102722,0.825672849056938,0.821573724007562 +lichen,lichen,south,,,Physcia.adscendens,v2val_Full_Joint,5,0.818351194875585,0.815473629919288,0.821595518961059,0.818413816807012 +lichen,lichen,south,,,Physcia.adscendens,v2val_Full_Joint_Truncated,5,0.818366592756837,0.815473629919288,0.821595518961059,0.818413816807012 +lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Climate,4,0.690146520368093,0.687623451889863,0.696399093335788, +lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Climate_Truncated,4,0.690133662354544,0.687619313393814,0.696403232441228, +lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Landcover,4,0.757543713583416,0.754237750244239,0.765899299116814, +lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Full,4,0.816688066173278,0.814577556447952,0.819582119521717, +lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Full_Truncated,4,0.816692374438254,0.814577556447952,0.819584704480702, +lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Full_Joint,4,0.812861687935889,0.810647101871693,0.815758867203804, +lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Full_Joint_Truncated,4,0.81287030446584,0.810647101871693,0.815764037121775, +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_auc,5,0.820367038624296,0.819088803830954,0.825096132690793,0.820911148938545 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_deviance_explained,5,0.274643755760762,0.273047064346357,0.2795535093301,0.272167552780268 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_rmse,5,0.325649814939506,0.323044576138151,0.32774821127909,0.327783381237672 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_spearman,5,0.457622037926128,0.455146980332479,0.464800704476141,0.457622037926128 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_calibration_slope,5,0.987210797047211,0.964756720342875,1.04226829149403,0.987210797047211 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_prevalence,5,0.22526523562793,0.222685585610422,0.228865718677616,0.22526523562793 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_n,5,2588,2554.4,3469,4053 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_auc,4,0.807437018082126,0.795187683185118,0.814600712078279, +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_deviance_explained,4,0.234952851608951,0.215144910318834,0.252509532861174, +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_rmse,4,0.33540874228767,0.32943601838744,0.340042074806677, +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_spearman,4,0.436123893428745,0.419582521233002,0.446016838076314, +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_calibration_slope,4,0.947080559125973,0.940176391586403,0.972191240627968, +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_prevalence,4,0.224511499051979,0.218291264544164,0.230417458254175, +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_n,5,1465,584,1498.6,0 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_auc,5,0.61119205862304,0.608247846213005,0.619766590249117,0.614800455189874 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_deviance_explained,5,0.0293312456190202,0.0254868824061227,0.034855941334284,0.0327130199155846 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_rmse,5,0.440494520447441,0.439655702708701,0.441992443932362,0.440494520447441 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_spearman,5,0.166867112583273,0.161253581705846,0.173443277843013,0.166867112583273 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_calibration_slope,5,0.871613828265815,0.807561232834562,0.918699876937025,0.901041907949805 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_prevalence,5,0.320047355958958,0.317847829087179,0.320941159211816,0.321243523316062 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_n,5,2587,2537.6,3467,4053 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_auc,4,0.599789507623449,0.585096398809124,0.610287133771428, +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_deviance_explained,4,0.0222358139724005,0.0154302383695453,0.0289963709245666, +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_rmse,4,0.444244510956,0.443337295940116,0.444727707984992, +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_spearman,4,0.1428985967646,0.125110680243685,0.165466638254086, +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_calibration_slope,4,0.750011624893702,0.699600524966396,0.836834785057386, +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_prevalence,4,0.324076824388238,0.322733281306541,0.3276244709432, +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_n,5,1466,586,1515.4,0 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_auc,5,0.634240369366988,0.632910641847936,0.642195650517714,0.634240369366988 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_deviance_explained,5,0.0264112493368064,0.0244020509882967,0.0303865560800429,0.0264112493368064 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_rmse,5,0.418769573067301,0.41254704078318,0.420323940326511,0.421286846656193 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_spearman,5,0.175369074792115,0.169472066216479,0.19311238624043,0.175369074792115 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_calibration_slope,5,0.975536082659011,0.869669271029773,0.999133512851468,1.00531761653027 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_prevalence,5,0.691079812206573,0.689952548788955,0.71053806886065,0.691079812206573 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_n,5,675,672.2,911.8,1065 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_auc,4,0.590185162579443,0.588561095758765,0.594993617451278, +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_deviance_explained,4,-0.00660912212895907,-0.0246222554112858,0.00596211189481146, +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_rmse,4,0.438945021715404,0.435169754735052,0.442994297582763, +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_spearman,4,0.119269331592725,0.112670153678564,0.141855035472014, +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_calibration_slope,4,0.529521999315492,0.405879483641657,0.748020467389396, +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_prevalence,4,0.675933879994794,0.656439043984736,0.693034260713775, +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_n,5,390,153.2,392.8,0 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_auc,5,0.800563803516706,0.774332077165384,0.807116397983381,0.786049924840508 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_deviance_explained,5,0.235315369629889,0.184794016646685,0.243734500249067,0.205216892616348 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_rmse,5,0.345153854253612,0.340273324511787,0.350387335024819,0.345153854253612 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_spearman,5,0.399822439479778,0.365817333025682,0.416474286805188,0.381089371361329 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_calibration_slope,5,0.983951125311349,0.934535204259224,1.0182141754068,0.986324497785332 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_prevalence,5,0.182159624413146,0.181333087877553,0.193172072927236,0.182159624413146 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_n,5,678,670.6,913,1065 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_auc,4,0.729574202549047,0.71815250764054,0.778542353806383, +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_deviance_explained,4,0.0957319747373082,-0.112729476086203,0.182551981226243, +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_rmse,4,0.349900330806755,0.341019339169151,0.360550613582775, +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_spearman,4,0.291859756320935,0.287348724179463,0.363426726063271, +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_calibration_slope,4,0.774041963702232,0.646822148840561,1.18815164727979, +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_prevalence,4,0.182520739834082,0.160534290271133,0.183610188261351, +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_n,5,387,152,394.4,0 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_auc,5,0.843771320712376,0.837298705573725,0.845386776229526,0.839440907842931 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_deviance_explained,5,0.296908480586636,0.290887810793796,0.302200604755114,0.294409607036222 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_rmse,5,0.300280860452662,0.299352741208206,0.302368697081708,0.30069616131153 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_spearman,5,0.466818565812599,0.461436555661139,0.473138781426199,0.463240577826878 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_calibration_slope,5,0.972690836668142,0.921935358308296,0.979611212169833,0.982050704865843 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_prevalence,5,0.201509433962264,0.199761756423448,0.205640478898507,0.201356917858008 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_n,5,2612,2595.8,3536.2,4127 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_auc,4,0.827458353428436,0.817805717079038,0.840574988117616, +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_deviance_explained,4,0.276689902789578,0.265842733106712,0.294949072324388, +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_rmse,4,0.303789329751735,0.298771516378234,0.304833455528629, +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_spearman,4,0.444765026946551,0.435147313816253,0.460529325956992, +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_calibration_slope,4,0.912370954577014,0.861212539179959,0.954228059409819, +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_prevalence,4,0.199234448913847,0.193549889929862,0.204483398915383, +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_n,5,1515,590.8,1531.2,0 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_auc,5,0.672085273881372,0.668633720672182,0.680693747031501,0.668767750495832 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_deviance_explained,5,0.0758678220182751,0.0704991263862156,0.0841775407251298,0.0713753243188524 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_rmse,5,0.332910274284271,0.327210641524145,0.335100999244875,0.332910274284271 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_spearman,5,0.215829774013176,0.212589282113879,0.226422981371282,0.211955551417089 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_calibration_slope,5,0.94812085347111,0.856889525073144,1.03389671800408,0.94812085347111 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_prevalence,5,0.148776350860189,0.144579171619019,0.151265484707482,0.148776350860189 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_n,5,2637,2606,3537,4127 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_auc,4,0.654372882277188,0.640403021566792,0.6605591763494, +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_deviance_explained,4,0.0514858356828411,0.0379579660013158,0.0604573235872615, +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_rmse,4,0.337444976131703,0.331449906564068,0.342571110976009, +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_spearman,4,0.19099043338874,0.174162150130626,0.204597549588522, +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_calibration_slope,4,0.732075381978751,0.657958194547818,0.836247242841193, +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_prevalence,4,0.148630312373211,0.144212802079742,0.157027721824677, +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_n,5,1490,590,1521,0 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_auc,5,0.706112866420923,0.689756836780519,0.712422673247893,0.689082366331686 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_deviance_explained,5,0.077948761211899,0.0672394512735814,0.0862779229583741,0.0670547674954939 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_rmse,5,0.401891914348534,0.400056693343447,0.408313222434912,0.406888363248781 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_spearman,5,0.328404695790939,0.293718951070702,0.340256897739946,0.296933239332004 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_calibration_slope,5,1.02265042079081,0.949079646474498,1.06820491938664,1.03306130883064 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_prevalence,5,0.602816901408451,0.593809006916747,0.607790307126989,0.604735883424408 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_n,5,696,686.6,942.8,1098 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_auc,4,0.642530046696975,0.604052771943084,0.646988682070108, +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_deviance_explained,4,0.0177640077575169,-0.00914291472953676,0.0380006855045052, +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_rmse,4,0.423675312133193,0.412365569779127,0.4289659133495, +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_spearman,4,0.215041364313525,0.166273559830134,0.234657571247567, +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_calibration_slope,4,0.666986903656138,0.480343171377765,0.83150584600084, +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_prevalence,4,0.614967084834182,0.599715606114469,0.623570700713301, +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_n,5,402,155.2,411.4,0 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_auc,5,0.823493333333333,0.815129597967925,0.847125543751909,0.819927852628077 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_deviance_explained,5,0.240858392609539,0.229287932861753,0.282840102014879,0.234870911391229 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_rmse,5,0.223331046901821,0.21469247206876,0.227275887816135,0.223331046901821 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_spearman,5,0.319693927847967,0.314626273281237,0.331123877059782,0.313170610278462 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_calibration_slope,5,0.926166715024209,0.8521293240645,0.969181499315011,0.926166715024209 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_prevalence,5,0.0875912408759124,0.0815913826315997,0.0946898807160816,0.0874316939890711 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_n,5,693,685.8,936.8,1098 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_auc,4,0.77744050520223,0.771065167348639,0.803486958443855, +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_deviance_explained,4,0.17108179189974,0.0694866534919466,0.192858665045726, +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_rmse,4,0.226318832277226,0.216290927259541,0.250116289221731, +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_spearman,4,0.278455188286047,0.262015370235656,0.285433310292326, +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_calibration_slope,4,0.751176575138291,0.529405518004174,0.815471311990914, +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_prevalence,4,0.0837295205104187,0.0742110480309994,0.0991029746633899, +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_n,5,405,161.2,412.2,0 +mite,mite,north,,,Ceratozetes.gracilis,insample_auc,5,0.793023395932593,0.785116760768433,0.797585561245424,0.791183069113511 +mite,mite,north,,,Ceratozetes.gracilis,insample_deviance_explained,5,0.134692532005047,0.108608328871156,0.141811919550427,0.125527507164404 +mite,mite,north,,,Ceratozetes.gracilis,insample_rmse,5,0.364641744759417,0.36299256091057,0.368618183340602,0.364308079016483 +mite,mite,north,,,Ceratozetes.gracilis,insample_spearman,5,0.41429348998048,0.402422002613553,0.419681351800533,0.409677886636093 +mite,mite,north,,,Ceratozetes.gracilis,insample_calibration_slope,5,1.0224894029886,1.00755092646514,1.03915812721702,1.0224894029886 +mite,mite,north,,,Ceratozetes.gracilis,insample_prevalence,5,0.211169769380383,0.208505864577966,0.211369634473166,0.208369812642269 +mite,mite,north,,,Ceratozetes.gracilis,insample_n,5,3651,3606.6,4890.2,5711 +mite,mite,north,,,Ceratozetes.gracilis,oob_auc,4,0.779665972511523,0.773198985489411,0.798395168992114, +mite,mite,north,,,Ceratozetes.gracilis,oob_deviance_explained,4,0.0923986988857812,0.0862667569754759,0.144304465844404, +mite,mite,north,,,Ceratozetes.gracilis,oob_rmse,4,0.36680003014665,0.360411853868392,0.368997514633471, +mite,mite,north,,,Ceratozetes.gracilis,oob_spearman,4,0.389977816116695,0.383012434237582,0.415943717902066, +mite,mite,north,,,Ceratozetes.gracilis,oob_calibration_slope,4,0.956222238793897,0.921365026616042,1.05973298874715, +mite,mite,north,,,Ceratozetes.gracilis,oob_prevalence,4,0.203407429558746,0.203105380508127,0.206516438658429, +mite,mite,north,,,Ceratozetes.gracilis,oob_n,5,2060,820.8,2104.4,0 +mite,mite,north,,,Ceratozetes.gracilis,v2val_Climate,5,0.738382414749567,0.734358129806975,0.742005285315151,0.738382414749567 +mite,mite,north,,,Ceratozetes.gracilis,v2val_Climate_Truncated,5,0.738392463572007,0.734342356311168,0.742026178178654,0.738392463572007 +mite,mite,north,,,Ceratozetes.gracilis,v2val_Landcover,5,0.766722893536977,0.759062628411847,0.772422596192916,0.766722893536977 +mite,mite,north,,,Ceratozetes.gracilis,v2val_Full,5,0.793023395932593,0.785116760768433,0.797585561245424,0.791183069113511 +mite,mite,north,,,Ceratozetes.gracilis,v2val_Full_Truncated,5,0.793016443892401,0.785027851595894,0.797500866905145,0.791105466738786 +mite,mite,north,,,Ceratozetes.gracilis,v2val_Full_Joint,5,0.793386060695946,0.785055839040043,0.797509252679056,0.791225262500488 +mite,mite,north,,,Ceratozetes.gracilis,v2val_Full_Joint_Truncated,5,0.793386524165292,0.784963217939285,0.797444970586129,0.7911589984368 +mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Climate,4,0.731027419469463,0.725410991997312,0.741834431700471, +mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Climate_Truncated,4,0.731045119285728,0.72540173801145,0.741842884282973, +mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Landcover,4,0.752661723212296,0.748458309671417,0.773156655512682, +mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Full,4,0.779665972511523,0.773198985489411,0.798395168992114, +mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Full_Truncated,4,0.77962848748914,0.773216243029163,0.798382692848602, +mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Full_Joint,4,0.779066438961531,0.77354347637541,0.798343558984922, +mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Full_Joint_Truncated,4,0.779044896212606,0.773564180389716,0.798356007315929, +mite,mite,north,,,Trhypochthonius.tectorum,insample_auc,5,0.672907942808574,0.669208813819547,0.682343647003947,0.669778092188547 +mite,mite,north,,,Trhypochthonius.tectorum,insample_deviance_explained,5,-0.0324180258517079,-0.0527646417815135,-0.0101623689114898,-0.0407269697080057 +mite,mite,north,,,Trhypochthonius.tectorum,insample_rmse,5,0.288562681524747,0.286522184662904,0.291945228269945,0.288562681524747 +mite,mite,north,,,Trhypochthonius.tectorum,insample_spearman,5,0.174619892294846,0.172564649955749,0.187939106716607,0.1729413278484 +mite,mite,north,,,Trhypochthonius.tectorum,insample_calibration_slope,5,0.938290627841302,0.909627160028179,0.994839719200875,0.931192865479756 +mite,mite,north,,,Trhypochthonius.tectorum,insample_prevalence,5,0.0956049728593941,0.0940001763114542,0.0987931854359719,0.0956049728593941 +mite,mite,north,,,Trhypochthonius.tectorum,insample_n,5,3624,3599.2,4881,5711 +mite,mite,north,,,Trhypochthonius.tectorum,oob_auc,4,0.651421835190664,0.64513479278205,0.663121005511504, +mite,mite,north,,,Trhypochthonius.tectorum,oob_deviance_explained,4,-0.0625612551961812,-0.104386756333539,-0.0317884651562399, +mite,mite,north,,,Trhypochthonius.tectorum,oob_rmse,4,0.289482213990474,0.281791769789717,0.293681830417276, +mite,mite,north,,,Trhypochthonius.tectorum,oob_spearman,4,0.153802350804888,0.145130738202924,0.167192976536939, +mite,mite,north,,,Trhypochthonius.tectorum,oob_calibration_slope,4,0.866440051991562,0.715195080326882,0.99057532202289, +mite,mite,north,,,Trhypochthonius.tectorum,oob_prevalence,4,0.0963264503316864,0.0893459374618542,0.0984905896614327, +mite,mite,north,,,Trhypochthonius.tectorum,oob_n,5,2087,830,2111.8,0 +mite,mite,north,,,Trhypochthonius.tectorum,v2val_Climate,5,0.646091585413555,0.643946189711462,0.652343816700896,0.646091585413555 +mite,mite,north,,,Trhypochthonius.tectorum,v2val_Climate_Truncated,5,0.646095557008706,0.643948358640746,0.65233771826661,0.646095557008706 +mite,mite,north,,,Trhypochthonius.tectorum,v2val_Landcover,5,0.637987440117159,0.627044747234771,0.648796943002273,0.637987440117159 +mite,mite,north,,,Trhypochthonius.tectorum,v2val_Full,5,0.672907942808574,0.669208813819547,0.682343647003947,0.669778092188547 +mite,mite,north,,,Trhypochthonius.tectorum,v2val_Full_Truncated,5,0.672968462835808,0.669234243838635,0.682370652186889,0.669767986128102 +mite,mite,north,,,Trhypochthonius.tectorum,v2val_Full_Joint,5,0.673039662867848,0.668775078579256,0.682456515305188,0.66926215120794 +mite,mite,north,,,Trhypochthonius.tectorum,v2val_Full_Joint_Truncated,5,0.673102852896284,0.66877285388055,0.682481051437855,0.669242116386356 +mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Climate,4,0.637448091750764,0.62319195321542,0.64083947116042, +mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Climate_Truncated,4,0.637447116712891,0.623191511787853,0.640852747518307, +mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Landcover,4,0.619482659509824,0.616517647587969,0.622452812919573, +mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Full,4,0.651421835190664,0.64513479278205,0.663121005511504, +mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Full_Truncated,4,0.651598760851872,0.645145346470754,0.66328863933151, +mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Full_Joint,4,0.650909465977038,0.643507260329979,0.663048883832917, +mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Full_Joint_Truncated,4,0.65107837071969,0.643490423905209,0.66321170510179, +mite,mite,south,,,Ceratozetes.gracilis,insample_auc,5,0.883740175681923,0.875951595662976,0.884218489485534,0.880842240129472 +mite,mite,south,,,Ceratozetes.gracilis,insample_deviance_explained,5,0.169227984866749,0.102917912757133,0.174897444771582,0.169227984866749 +mite,mite,south,,,Ceratozetes.gracilis,insample_rmse,5,0.223410917578014,0.207894263041054,0.228617168412238,0.215105469199925 +mite,mite,south,,,Ceratozetes.gracilis,insample_spearman,5,0.304054710362117,0.292604158893579,0.321411532274628,0.304054710362117 +mite,mite,south,,,Ceratozetes.gracilis,insample_calibration_slope,5,0.646501812554423,0.571714943118018,0.663896293625869,0.652084939529121 +mite,mite,south,,,Ceratozetes.gracilis,insample_prevalence,5,0.056970509383378,0.0521775638545351,0.0622115928022082,0.0562843842573 +mite,mite,south,,,Ceratozetes.gracilis,insample_n,5,1494,1479.4,2024.6,2363 +mite,mite,south,,,Ceratozetes.gracilis,oob_auc,4,0.877556363090999,0.870858501486971,0.891246533596325, +mite,mite,south,,,Ceratozetes.gracilis,oob_deviance_explained,4,0.149139947228324,0.081863654137057,0.211545016984438, +mite,mite,south,,,Ceratozetes.gracilis,oob_rmse,4,0.217549055983636,0.21158190570823,0.223701160718158, +mite,mite,south,,,Ceratozetes.gracilis,oob_spearman,4,0.297912570168464,0.269110530526911,0.325939210959734, +mite,mite,south,,,Ceratozetes.gracilis,oob_calibration_slope,4,0.588033894967732,0.50519914194533,0.720419749435623, +mite,mite,south,,,Ceratozetes.gracilis,oob_prevalence,4,0.0533392883804503,0.0452752248602848,0.0645232647455575, +mite,mite,south,,,Ceratozetes.gracilis,oob_n,5,869,338.4,883.6,0 +mite,mite,south,,,Ceratozetes.gracilis,v2val_Climate,5,0.738382414749567,0.734358129806975,0.742005285315151,0.738382414749567 +mite,mite,south,,,Ceratozetes.gracilis,v2val_Climate_Truncated,5,0.738392463572007,0.734342356311168,0.742026178178654,0.738392463572007 +mite,mite,south,,,Ceratozetes.gracilis,v2val_Landcover,5,0.722020131552721,0.71607655717679,0.728899344516339,0.719697225125594 +mite,mite,south,,,Ceratozetes.gracilis,v2val_Full,5,0.883740175681923,0.875951595662976,0.884218489485534,0.880842240129472 +mite,mite,south,,,Ceratozetes.gracilis,v2val_Full_Truncated,5,0.883740175681923,0.875951595662976,0.884218489485534,0.880842240129472 +mite,mite,south,,,Ceratozetes.gracilis,v2val_Full_Joint,5,0.883869625520111,0.877386169471364,0.884867266298163,0.880966991469706 +mite,mite,south,,,Ceratozetes.gracilis,v2val_Full_Joint_Truncated,5,0.883869625520111,0.877386169471364,0.884867266298163,0.880966991469706 +mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Climate,4,0.731027419469463,0.725410991997312,0.741834431700471, +mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Climate_Truncated,4,0.731045119285728,0.72540173801145,0.741842884282973, +mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Landcover,4,0.704830138651714,0.697578522816295,0.713165675388293, +mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Full,4,0.877556363090999,0.870858501486971,0.891246533596325, +mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Full_Truncated,4,0.877556363090999,0.870858501486971,0.891281973045494, +mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Full_Joint,4,0.87838605738981,0.870791888918913,0.892459363692493, +mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Full_Joint_Truncated,4,0.87838605738981,0.870791888918913,0.892494803141663, +mite,mite,south,,,Trhypochthonius.tectorum,insample_auc,5,0.714545787058589,0.69969622945697,0.724109648011322,0.705313075635924 +mite,mite,south,,,Trhypochthonius.tectorum,insample_deviance_explained,5,-2.20551740843788e-05,-0.00644243886806564,0.0163984110082346,0.01492775208855 +mite,mite,south,,,Trhypochthonius.tectorum,insample_rmse,5,0.269858367078513,0.266406986696229,0.272808873150662,0.270464873051431 +mite,mite,south,,,Trhypochthonius.tectorum,insample_spearman,5,0.210611679646456,0.189085620295154,0.213764285932634,0.196610759018781 +mite,mite,south,,,Trhypochthonius.tectorum,insample_calibration_slope,5,0.964366086336983,0.916309849664698,0.989356334697425,0.964366086336983 +mite,mite,south,,,Trhypochthonius.tectorum,insample_prevalence,5,0.0833685992382565,0.0807473443243282,0.0863035095821866,0.0833685992382565 +mite,mite,south,,,Trhypochthonius.tectorum,insample_n,5,1489,1484.4,2017.4,2363 +mite,mite,south,,,Trhypochthonius.tectorum,oob_auc,4,0.669707753515078,0.654014549095664,0.683226886999099, +mite,mite,south,,,Trhypochthonius.tectorum,oob_deviance_explained,4,0.0238861350837344,-0.00501344344448882,0.0319775842734965, +mite,mite,south,,,Trhypochthonius.tectorum,oob_rmse,4,0.275344693909917,0.2660800590245,0.279902566485838, +mite,mite,south,,,Trhypochthonius.tectorum,oob_spearman,4,0.16338068295489,0.142721241028181,0.180002438567577, +mite,mite,south,,,Trhypochthonius.tectorum,oob_calibration_slope,4,0.640530845430618,0.577798461860074,0.822553046730012, +mite,mite,south,,,Trhypochthonius.tectorum,oob_prevalence,4,0.0842873358196854,0.0775201528145626,0.0881856815952926, +mite,mite,south,,,Trhypochthonius.tectorum,oob_n,5,874,345.6,878.6,0 +mite,mite,south,,,Trhypochthonius.tectorum,v2val_Climate,5,0.646091585413555,0.643946189711462,0.652343816700896,0.646091585413555 +mite,mite,south,,,Trhypochthonius.tectorum,v2val_Climate_Truncated,5,0.646095557008706,0.643948358640746,0.65233771826661,0.646095557008706 +mite,mite,south,,,Trhypochthonius.tectorum,v2val_Landcover,5,0.671864124042916,0.659898184775652,0.684374697179488,0.660231262098608 +mite,mite,south,,,Trhypochthonius.tectorum,v2val_Full,5,0.714545787058589,0.69969622945697,0.724109648011322,0.705313075635924 +mite,mite,south,,,Trhypochthonius.tectorum,v2val_Full_Truncated,5,0.714545787058589,0.69969622945697,0.724109648011322,0.705313075635924 +mite,mite,south,,,Trhypochthonius.tectorum,v2val_Full_Joint,5,0.714906009620713,0.700143210072346,0.72490193539616,0.705786473932628 +mite,mite,south,,,Trhypochthonius.tectorum,v2val_Full_Joint_Truncated,5,0.714906009620713,0.700143210072346,0.72490193539616,0.705786473932628 +mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Climate,4,0.637448091750764,0.62319195321542,0.64083947116042, +mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Climate_Truncated,4,0.637447116712891,0.623191511787853,0.640852747518307, +mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Landcover,4,0.613895073569526,0.611766319340838,0.647057552774624, +mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Full,4,0.669707753515078,0.654014549095664,0.683226886999099, +mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Full_Truncated,4,0.669707753515078,0.654014549095664,0.683226886999099, +mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Full_Joint,4,0.670252865183779,0.654581402849557,0.683544630202293, +mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Full_Joint_Truncated,4,0.670252865183779,0.654581402849557,0.683544630202293, +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_auc,5,0.830322798090827,0.829752014715758,0.833521610487142,0.830322798090827 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_deviance_explained,5,0.169049735433044,0.156535489819263,0.180380243811949,0.172184312829234 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_rmse,5,0.406331801158912,0.404646760463192,0.406711203597052,0.406706951792596 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_spearman,5,0.564448272444098,0.564022722895439,0.568538539772008,0.564448272444098 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_calibration_slope,5,0.979847210350883,0.969126982244339,0.991954887525608,0.979847210350883 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_prevalence,5,0.418242653476869,0.411391418988775,0.421189975169674,0.418242653476869 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_n,5,4366,4320.2,5874.4,6874 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_auc,4,0.825970385744679,0.820899166013025,0.829858683383589, +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_deviance_explained,4,0.180338934815369,0.153363367618616,0.193673751289778, +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_rmse,4,0.409024585589369,0.407545829323972,0.412796643199926, +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_spearman,4,0.556036446141893,0.549781718602555,0.564239538039467, +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_calibration_slope,4,0.961989811631539,0.953282864779601,0.97698898933143, +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_prevalence,4,0.419241311741466,0.413108455574493,0.430771977433407, +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_n,5,2508,999.6,2553.8,0 +vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Climate,5,0.688882537608652,0.686220497467121,0.693315342224415,0.691923775211569 +vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Climate_Truncated,5,0.688853782361867,0.686211230349888,0.693311107621612,0.691928871889894 +vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Landcover,5,0.806658535413912,0.804749026795703,0.81034804923884,0.804887352272851 +vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Full,5,0.830322798090827,0.829752014715758,0.833521610487142,0.830322798090827 +vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Full_Truncated,5,0.830433260489035,0.829860825639713,0.833584571804586,0.830433260489035 +vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Full_Joint,5,0.82780564706394,0.827522559630011,0.831849313017971,0.82780564706394 +vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Full_Joint_Truncated,5,0.827924459375713,0.827636541171172,0.831943133083281,0.827924459375713 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Climate,4,0.69847723797285,0.691752649872066,0.699715919161363, +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Climate_Truncated,4,0.698467309951771,0.691745994349179,0.699715497383917, +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Landcover,4,0.798538423391199,0.793813753185317,0.801044488836154, +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Full,4,0.825970385744679,0.820899166013025,0.829858683383589, +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Full_Truncated,4,0.826084368160094,0.821025133464921,0.829955751376353, +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Full_Joint,4,0.822407455245542,0.816503165651276,0.825556259025818, +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Full_Joint_Truncated,4,0.822548387109745,0.816621603632805,0.825661726608092, +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_auc,5,0.836315133959189,0.831991084674704,0.837528607951877,0.834425701496386 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_deviance_explained,5,0.154953219466334,0.129409063699085,0.172774430677382,0.160280734393984 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_rmse,5,0.397835953480652,0.39520050591856,0.39953977885822,0.397892542228527 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_spearman,5,0.565718307196976,0.558075214292711,0.566158340164243,0.561646901356684 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_calibration_slope,5,1.00378490707536,0.996670213069317,1.00931321625889,1.00546871573532 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_prevalence,5,0.377654931626418,0.37492184315556,0.38072781584232,0.377654931626418 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_n,5,4329,4315.8,5874,6874 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_auc,4,0.829938952959948,0.828125419425383,0.835304874971869, +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_deviance_explained,4,0.177626825486026,0.135153586377154,0.21154877519812, +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_rmse,4,0.400006137187779,0.39713029702198,0.40231573999719, +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_spearman,4,0.554463344935879,0.551184680243305,0.562068414950895, +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_calibration_slope,4,0.988524116774644,0.97389136931948,1.00993315311349, +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_prevalence,4,0.375247544204322,0.372430611979277,0.382966913772923, +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_n,5,2545,1000,2558.2,0 +vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Climate,5,0.688388374288585,0.686629323150551,0.697141250977293,0.688388374288585 +vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Climate_Truncated,5,0.688377053340582,0.686621028690138,0.697132635984666,0.688377053340582 +vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Landcover,5,0.812599770966484,0.806923106797722,0.814411627611935,0.809938249660894 +vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Full,5,0.836315133959189,0.831991084674704,0.837528607951877,0.834425701496386 +vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Full_Truncated,5,0.836225603913632,0.831944005617998,0.837453646171789,0.834353666337466 +vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Full_Joint,5,0.836242738307649,0.831840647476923,0.837075962254889,0.833795663987679 +vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Full_Joint_Truncated,5,0.836167732781523,0.831822036390158,0.836995692851111,0.833746590035665 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Climate,4,0.687058088763642,0.673058403439112,0.691946304395709, +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Climate_Truncated,4,0.687038471404578,0.673051662415016,0.691940326726772, +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Landcover,4,0.807847376592108,0.801759141298583,0.811699920923116, +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Full,4,0.829938952959948,0.828125419425383,0.835304874971869, +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Full_Truncated,4,0.829888329553378,0.828175765215782,0.835181080251946, +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Full_Joint,4,0.828971535109331,0.826291764196716,0.83479597749998, +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Full_Joint_Truncated,4,0.828915617285276,0.826336395712055,0.834689140179746, +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_auc,5,0.890081979393699,0.886120541286867,0.900531693288428,0.890081979393699 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_deviance_explained,5,0.376511843709018,0.359648245967408,0.39273006526476,0.36183949121173 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_rmse,5,0.308360864442848,0.306833389069796,0.315704381717812,0.312233283277407 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_spearman,5,0.561632279820523,0.56034731464871,0.575734647134824,0.561632279820523 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_calibration_slope,5,0.980281716931255,0.970651842047086,0.998280590750127,0.982887664309838 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_prevalence,5,0.222088835534214,0.217190546592102,0.228625506806496,0.222054380664653 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_n,5,1692,1666,2267.2,2648 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_auc,4,0.884065848019888,0.870449780280702,0.894068384737495, +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_deviance_explained,4,0.334099694985671,0.299899048318077,0.344909076796622, +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_rmse,4,0.322280229393816,0.311448708149722,0.324570568538386, +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_spearman,4,0.558011118128369,0.532461517776284,0.559103143514103, +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_calibration_slope,4,0.947730194323529,0.912734464703454,0.971381900858514, +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_prevalence,4,0.218666030567013,0.210018355611084,0.23207994955219, +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_n,5,956,380.8,982,0 +vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Climate,5,0.688882537608652,0.686220497467121,0.693315342224415,0.691923775211569 +vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Climate_Truncated,5,0.688853782361867,0.686211230349888,0.693311107621612,0.691928871889894 +vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Landcover,5,0.795978634172116,0.790420342908561,0.808241109353126,0.795978634172116 +vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Full,5,0.890081979393699,0.886120541286867,0.900531693288428,0.890081979393699 +vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Full_Truncated,5,0.890081979393699,0.886107519131847,0.900531693288428,0.890081979393699 +vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Full_Joint,5,0.885428136469803,0.879749497228007,0.894203850953663,0.88338493164256 +vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Full_Joint_Truncated,5,0.885423965632299,0.87972024605796,0.894203850953663,0.88338493164256 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Climate,4,0.69847723797285,0.691752649872066,0.699715919161363, +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Climate_Truncated,4,0.698467309951771,0.691745994349179,0.699715497383917, +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Landcover,4,0.785174421252252,0.769559195023864,0.799812878397794, +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Full,4,0.884065848019888,0.870449780280702,0.894068384737495, +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Full_Truncated,4,0.884061344921756,0.870449780280702,0.894063477626334, +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Full_Joint,4,0.873729773605152,0.862934967954651,0.88650495339372, +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Full_Joint_Truncated,4,0.873725270507021,0.862934967954651,0.886486814768876, +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_auc,5,0.805930865573238,0.802524114144756,0.807930971919586,0.808012980346143 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_deviance_explained,5,0.166618669672263,0.15835736048416,0.197983766968233,0.179903957587885 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_rmse,5,0.381878187765555,0.378497935845721,0.383275373980955,0.380313032587985 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_spearman,5,0.465238638302507,0.460583361067045,0.473614426763325,0.470529100145484 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_calibration_slope,5,0.933688472158773,0.920475046205582,0.947214542702693,0.933688472158773 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_prevalence,5,0.264350453172205,0.25911663216011,0.270295509723619,0.264350453172205 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_n,5,1685,1649.4,2266.4,2648 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_auc,4,0.807298000134658,0.803023991535991,0.814183808910683, +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_deviance_explained,4,0.201855986026952,0.138430007183509,0.206184030963771, +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_rmse,4,0.37987633843542,0.378039277925496,0.38526074563498, +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_spearman,4,0.471049244528984,0.458945127185501,0.481459447588745, +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_calibration_slope,4,0.934673431866213,0.911850976434992,0.962640657947191, +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_prevalence,4,0.266148052343275,0.252246321440467,0.273763588267456, +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_n,5,963,381.6,998.6,0 +vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Climate,5,0.688388374288585,0.686629323150551,0.697141250977293,0.688388374288585 +vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Climate_Truncated,5,0.688377053340582,0.686621028690138,0.697132635984666,0.688377053340582 +vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Landcover,5,0.761379244969105,0.759537679717784,0.765001614229777,0.76658587562335 +vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Full,5,0.805930865573238,0.802524114144756,0.807930971919586,0.808012980346143 +vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Full_Truncated,5,0.805930865573238,0.802524057680271,0.807932999886811,0.808015180404811 +vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Full_Joint,5,0.802576290466739,0.799474271873651,0.804841725613092,0.804804561454972 +vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Full_Joint_Truncated,5,0.802576290466739,0.799476478074435,0.804843080852285,0.804805294807862 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Climate,4,0.687058088763642,0.673058403439112,0.691946304395709, +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Climate_Truncated,4,0.687038471404578,0.673051662415016,0.691940326726772, +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Landcover,4,0.774223898160634,0.769748999911181,0.777668369854279, +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Full,4,0.807298000134658,0.803023991535991,0.814183808910683, +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Full_Truncated,4,0.807292347351227,0.803023991535991,0.814176792476235, +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Full_Joint,4,0.805961431482898,0.801581678357063,0.812743710082227, +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Full_Joint_Truncated,4,0.805961431482898,0.801581678357063,0.812736460553446, diff --git a/3_output/exp_000_parity_v2/tables/parity_summary.csv b/3_output/exp_000_parity_v2/tables/parity_summary.csv index f85e0b6..bc9bbba 100644 --- a/3_output/exp_000_parity_v2/tables/parity_summary.csv +++ b/3_output/exp_000_parity_v2/tables/parity_summary.csv @@ -1,23 +1,23 @@ taxon,region,stage,comparison,species,terms_compared,min_draws,in_band_pct,reachable_terms,reachable_in_band_pct,median_standardized_difference,median_absolute_difference,max_absolute_difference,negligible_terms,median_spearman,median_band_ratio,verdict,indicative_verdict -bird,north,climate,median,2,20,100,100,20,100,0,0,2.2e-11,0,1,1,not gated (trial run),pass -bryophyte,north,climate,median,1,19,100,100,19,100,0.035,0,1.4,6,1,1.062,not gated (trial run),pass -lichen,north,climate,median,2,38,100,100,38,100,0,0,0.644,17,0.993,0.879,not gated (trial run),pass -mite,north,climate,median,2,38,100,100,38,100,0,0,1.95,20,0.905,0.953,not gated (trial run),pass -vascular_plant,north,climate,median,2,38,100,100,38,100,0,0,0.266,24,1,0.97,not gated (trial run),pass -bird,south,climate,median,2,20,100,100,20,100,0,0,2.2e-11,0,1,1,not gated (trial run),pass -bryophyte,south,climate,median,1,19,100,100,19,100,0.035,0,1.4,6,1,1.062,not gated (trial run),pass -lichen,south,climate,median,2,38,100,100,38,100,0,0,0.644,17,0.993,0.879,not gated (trial run),pass -mite,south,climate,median,2,38,100,100,38,100,0,0,1.95,20,0.905,0.953,not gated (trial run),pass -vascular_plant,south,climate,median,2,38,100,100,38,100,0,0,0.266,24,1,0.97,not gated (trial run),pass -bird,north,habitat,median,2,178,100,100,168,100,0,0,2.71e-11,0,1,1,not gated (trial run),pass -bryophyte,north,habitat,median,1,94,100,100,94,100,0.072,0.023,0.0808,0,0.997,0.911,not gated (trial run),pass -lichen,north,habitat,median,2,188,100,100,188,100,0.091,0.024,0.118,0,0.999,0.988,not gated (trial run),pass -mammal,north,habitat,iteration 1,2,448,65,100,436,100,0,0,9.77e-15,0,1,,not gated (trial run),pass -mite,north,habitat,median,1,94,100,100,94,100,0.14,0.035,0.148,0,0.999,0.993,not gated (trial run),pass -vascular_plant,north,habitat,median,2,188,100,100,188,100,0.108,0.022,0.125,0,0.999,0.95,not gated (trial run),pass -bird,south,habitat,median,2,46,100,100,40,100,0,0,5.61e-11,0,1,1,not gated (trial run),pass -bryophyte,south,habitat,median,1,19,100,100,19,100,0.047,0.021,0.0601,0,0.993,1.042,not gated (trial run),pass -lichen,south,habitat,median,2,40,100,100,40,100,0.088,0.029,0.278,1,0.994,0.961,not gated (trial run),pass -mammal,south,habitat,iteration 1,2,126,99,100,120,100,0,0,5.33e-15,0,1,,not gated (trial run),pass -mite,south,habitat,median,2,40,100,100,40,100,0.068,0.024,0.464,1,0.991,0.975,not gated (trial run),pass -vascular_plant,south,habitat,median,2,40,100,100,40,100,0.074,0.027,0.184,0,0.997,1.021,not gated (trial run),pass +bird,north,climate,median,2,20,5,90,20,90,0.351,0,0.651,0,1,0.694,not gated (store holds 5 draws), +bryophyte,north,climate,median,1,19,5,94.7,19,94.7,0.671,0,1.81,5,0.991,0.214,not gated (store holds 5 draws), +lichen,north,climate,median,2,38,5,89.5,38,89.5,0.003,0,1.99,17,0.991,0.301,not gated (store holds 5 draws), +mite,north,climate,median,2,38,5,94.7,38,94.7,0.082,0,3.79,20,0.973,0.656,not gated (store holds 5 draws), +vascular_plant,north,climate,median,2,38,5,97.4,38,97.4,0,0,0.12,24,0.982,0.602,not gated (store holds 5 draws), +bird,south,climate,median,2,20,5,90,20,90,0.351,0,0.651,0,1,0.694,not gated (store holds 5 draws), +bryophyte,south,climate,median,1,19,5,94.7,19,94.7,0.671,0,1.81,5,0.991,0.214,not gated (store holds 5 draws), +lichen,south,climate,median,2,38,5,89.5,38,89.5,0.003,0,1.99,17,0.991,0.301,not gated (store holds 5 draws), +mite,south,climate,median,2,38,5,94.7,38,94.7,0.082,0,3.79,20,0.973,0.656,not gated (store holds 5 draws), +vascular_plant,south,climate,median,2,38,5,97.4,38,97.4,0,0,0.12,24,0.982,0.602,not gated (store holds 5 draws), +bird,north,habitat,median,2,178,5,92.7,168,92.3,0.569,0.023,2.82,0,0.989,0.699,not gated (store holds 5 draws), +bryophyte,north,habitat,median,1,94,5,98.9,94,98.9,0.36,0.062,0.256,0,0.987,0.502,not gated (store holds 5 draws), +lichen,north,habitat,median,2,188,5,94.7,188,94.7,0.251,0.038,0.289,0,0.996,0.642,not gated (store holds 5 draws), +mammal,north,habitat,iteration 1,2,448,4,100,436,100,0,0,9.77e-15,0,1,,not gated (trial run), +mite,north,habitat,median,1,94,5,76.6,94,76.6,0.579,0.078,0.673,0,0.993,0.642,not gated (store holds 5 draws), +vascular_plant,north,habitat,median,2,188,5,91.5,188,91.5,0.303,0.034,0.326,0,0.997,0.596,not gated (store holds 5 draws), +bird,south,habitat,median,2,46,5,80.4,40,77.5,0.334,0.021,0.121,0,0.995,0.508,not gated (store holds 5 draws), +bryophyte,south,habitat,median,1,19,5,100,19,100,0.399,0.066,0.267,0,0.991,0.633,not gated (store holds 5 draws), +lichen,south,habitat,median,2,40,5,87.5,40,87.5,0.337,0.048,0.655,1,0.985,0.554,not gated (store holds 5 draws), +mammal,south,habitat,iteration 1,2,126,5,100,120,100,0,0,5.33e-15,0,1,,not gated (trial run), +mite,south,habitat,median,2,40,5,95,40,95,0.175,0.03,0.754,1,0.992,0.581,not gated (store holds 5 draws), +vascular_plant,south,habitat,median,2,40,5,75,40,75,0.585,0.07,0.552,0,0.977,0.566,not gated (store holds 5 draws), diff --git a/docs/getting_started.md b/docs/getting_started.md index 652d375..1f818f3 100644 --- a/docs/getting_started.md +++ b/docs/getting_started.md @@ -101,7 +101,7 @@ Everything lands in `3_output//`. Read these in order: habitat type, per species. The column definitions are in the -[README's output key](../README.md#output-key). +[README's outputs section](../README.md#outputs-2_pipeline-and-3_output). The model behind every metric and grid prediction is each stage's **final** model. That is the averaged one where v2 averages From 7de25de69307a7f6316c412d8b2e5605aed04e48 Mon Sep 17 00:00:00 2001 From: bgcasey Date: Mon, 5 Oct 2026 05:51:16 -0600 Subject: [PATCH 05/16] Enhance documentation for experiments and covariate handling - Updated README.md to include new engine `gbm` and details on `replace_stage_method()` and `extend_models()`. - Revised flowchart and steps in README.md to clarify experiment comparisons and outputs. - Added section in framework_design.md on handling new covariates not present in the dataset, detailing extraction and integration processes. - Expanded getting_started.md with instructions for adding covariates from experiments and automatic comparison with exp_000. --- .gitignore | 2 + 1_code/experiments/_template/README.md | 3 +- 1_code/experiments/_template/run.R | 13 +- 1_code/experiments/exp_001_gbm/README.md | 104 +++ 1_code/experiments/exp_001_gbm/run.R | 80 ++ .../01_extract_soilgrids_covariates.R | 146 ++++ .../experiments/exp_002_soilgrids/README.md | 128 ++++ 1_code/experiments/exp_002_soilgrids/run.R | 104 +++ 1_code/harness/compare.R | 26 + 1_code/harness/data_load.R | 138 +++- 1_code/harness/experiment.R | 169 ++++- 1_code/harness/model_sets.R | 32 + 1_code/harness/run_model.R | 6 +- 1_code/harness/run_record.R | 4 +- 1_code/harness/spec.R | 118 ++- 1_code/harness/summarise.R | 59 +- 1_code/methods/README.md | 1 + 1_code/methods/engines/gbm.R | 284 ++++++++ 1_code/tests/testthat/test-dataset.R | 35 + 1_code/tests/testthat/test-methods.R | 8 +- 1_code/tests/testthat/test-results.R | 71 ++ 3_output/exp_001_gbm/run_record.md | 193 +++++ .../exp_001_gbm/tables/comparison_grid.csv | 21 + .../exp_001_gbm/tables/comparison_summary.csv | 51 ++ 3_output/exp_001_gbm/tables/coverage.csv | 11 + 3_output/exp_001_gbm/tables/grid_summary.csv | 685 ++++++++++++++++++ .../exp_001_gbm/tables/metric_summary.csv | 281 +++++++ 3_output/exp_002_soilgrids/run_record.md | 193 +++++ .../tables/comparison_grid.csv | 21 + .../tables/comparison_summary.csv | 51 ++ .../exp_002_soilgrids/tables/coverage.csv | 11 + .../exp_002_soilgrids/tables/grid_summary.csv | 685 ++++++++++++++++++ .../tables/metric_summary.csv | 281 +++++++ README.md | 72 +- docs/framework_design.md | 38 +- docs/getting_started.md | 25 +- 36 files changed, 4057 insertions(+), 93 deletions(-) create mode 100644 1_code/experiments/exp_001_gbm/README.md create mode 100644 1_code/experiments/exp_001_gbm/run.R create mode 100644 1_code/experiments/exp_002_soilgrids/01_extract_soilgrids_covariates.R create mode 100644 1_code/experiments/exp_002_soilgrids/README.md create mode 100644 1_code/experiments/exp_002_soilgrids/run.R create mode 100644 1_code/methods/engines/gbm.R create mode 100644 3_output/exp_001_gbm/run_record.md create mode 100644 3_output/exp_001_gbm/tables/comparison_grid.csv create mode 100644 3_output/exp_001_gbm/tables/comparison_summary.csv create mode 100644 3_output/exp_001_gbm/tables/coverage.csv create mode 100644 3_output/exp_001_gbm/tables/grid_summary.csv create mode 100644 3_output/exp_001_gbm/tables/metric_summary.csv create mode 100644 3_output/exp_002_soilgrids/run_record.md create mode 100644 3_output/exp_002_soilgrids/tables/comparison_grid.csv create mode 100644 3_output/exp_002_soilgrids/tables/comparison_summary.csv create mode 100644 3_output/exp_002_soilgrids/tables/coverage.csv create mode 100644 3_output/exp_002_soilgrids/tables/grid_summary.csv create mode 100644 3_output/exp_002_soilgrids/tables/metric_summary.csv diff --git a/.gitignore b/.gitignore index 3b432fd..17d71bf 100644 --- a/.gitignore +++ b/.gitignore @@ -67,6 +67,8 @@ vignettes/*.pdf !3_output/**/tables/coverage.csv !3_output/**/tables/metric_summary.csv !3_output/**/tables/grid_summary.csv +!3_output/**/tables/comparison_summary.csv +!3_output/**/tables/comparison_grid.csv !3_output/**/tables/v2_self_agreement_summary.csv AGENTS.md diff --git a/1_code/experiments/_template/README.md b/1_code/experiments/_template/README.md index 5a72534..6c09659 100644 --- a/1_code/experiments/_template/README.md +++ b/1_code/experiments/_template/README.md @@ -18,8 +18,9 @@ One sentence: what does this experiment ask? ## How to read the result +Every experiment is compared with the v2 baseline (exp_000): `run_experiment()` writes three comparison tables to -`3_output//tables/`, against the v2 baseline (exp_000): +`3_output//tables/`: | File | One row per | Read it for | | --- | --- | --- | diff --git a/1_code/experiments/_template/run.R b/1_code/experiments/_template/run.R index f2d9c53..49d341d 100644 --- a/1_code/experiments/_template/run.R +++ b/1_code/experiments/_template/run.R @@ -22,6 +22,10 @@ # - The usual levers, from least to most invasive: # - `stage_models`: different candidate formulas for a stage # (new covariates, a different model set). +# - `covariate_files`: covariates the dataset does not hold, +# from a CSV this experiment's own script writes to +# 2_pipeline//inputs/. Never add them to 0_data/ or +# _setup/, which stay the v2 data. # - `specs`: a spec with a stage changed - a different engine # or selection rule. Build it from standard_specs() and # change the field; see docs/getting_started.md. @@ -62,12 +66,13 @@ config <- experiment_config( ) # 2. Run ---- -# Fit, summarize, and compare with the v2 baseline (exp_000). -# The comparison is written to tables/comparison_*.csv. +# Fit, summarize, and compare with the v2 baseline (exp_000); +# every experiment is compared with it. The comparison is +# written to tables/comparison_*.csv. Add `steps` for anything +# this experiment needs beyond that. results <- run_experiment( config, - translate = list(bird = bird_habitat_translation), - steps = list(compare = compare_to_baseline) + translate = list(bird = bird_habitat_translation) ) # End of script ---- diff --git a/1_code/experiments/exp_001_gbm/README.md b/1_code/experiments/exp_001_gbm/README.md new file mode 100644 index 0000000..d44f5bd --- /dev/null +++ b/1_code/experiments/exp_001_gbm/README.md @@ -0,0 +1,104 @@ +# exp_001_gbm + +![Status](https://img.shields.io/badge/Status-Test-lightgrey) +![Languages](https://img.shields.io/badge/Languages-R-blue) + +## Question + +Does a boosted regression tree (GBM) fit the habitat stage better than v2's +linear models, for the plant-group taxa and birds? + +This is a **test experiment**: its first job is to show that a method with +no coefficients runs through the pipeline and is compared with the v2 +baseline. Read its numbers as a result only after a run at 100 draws with +tuned settings. + +## Design + +| | exp_000 (baseline) | exp_001 (this) | +| --- | --- | --- | +| Climate stage | v2: GLM candidates, AICc model averaging | The same | +| Habitat stage (birds: landcover) | v2: GLM candidates; IVW averaging (plants) or staged BIC (birds); plant stand-age splines and footprint pooling | `gbm` with the `single` rule, on every covariate v2's habitat candidates use, `Climate` included | +| Climate → habitat | Carried as `Climate` | The same | +| Species, draws, seed | `parity_check`, 20260909 | The same | + +- **What changes:** the habitat stage's engine, selection rule and + candidate set, set in `run.R` with `replace_stage_method()`. +- **Why one formula:** a tree chooses its own variables, splits and + interactions, so it is given every candidate covariate once (as main + effects) rather than v2's competing formulas. +- **What is dropped with it:** v2's post-processing of habitat coefficients + (stand-age splines, cutblock convergence, pAspen, footprint pooling) and + v2's plant validation AUCs, which all read coefficients a tree does not + have. The metrics score the tree's own prediction. +- **Mammals are not run.** Their habitat stage is v2's hurdle model: two + linked GLMs with custom post-processing, so there is no single engine to + swap. + +## How to run + +From the repository root: + +```r +source("1_code/experiments/exp_001_gbm/run.R") +``` + +`run.R` uses 5 draws to check the pipeline. For a result, set +`n_bootstraps = 100`, and make sure the exp_000 tables it is compared +against are from a 100-draw run of the same species. + +## How to read the result + +`3_output/exp_001_gbm/tables/`: + +| File | Read it for | +| --- | --- | +| `comparison_summary.csv` | Per taxon, region and metric: the median difference from exp_000, and the share of species that did better | +| `comparison_metrics.csv` | Per species, both runs' out-of-bag metrics and 10–90% bands | +| `comparison_grid.csv` | Whether the habitat effects moved: rank correlation and absolute difference on the habitat grid | + +Out-of-bag metrics score each draw on the survey units it left out, which +matters here: a tree fits the units it trained on far more closely than a +GLM does, so in-sample metrics would flatter it. + +## Assumptions and caveats + +- **GBM settings are untuned.** 1000 trees at most, depth 3, learning rate + 0.05, bag fraction 0.5, minimum leaf 10; the number of trees is chosen by + the out-of-bag estimate, which tends to choose too few. A fair comparison + tunes these, ideally per taxon. +- **The grid compares like with like only roughly.** The grid holds each + habitat type as a pure stand at `Climate` 0. A GLM extrapolates to that + linearly; a tree holds the value of its nearest split. Where a type is + rare at the survey units, the two can differ for that reason alone. +- **The plant baseline includes v2's post-processing** (stand-age splines, + footprint pooling); the GBM run does not. A difference in the aged or + footprint habitat types partly reflects that. +- **Bird counts keep the QPAD offset**, which the engine adds on the link + scale in fitting and prediction. + +## Result + +_Not yet run at 100 draws._ + +**Pipeline check, 2026-10-03: 5 draws, `parity_check` species.** All 100 +species × region × draw jobs ran. Against an exp_000 run with the same +species, seed and draws: + +| Taxon | Out-of-bag AUC, north (v2 → GBM) | South (v2 → GBM) | +| --- | --- | --- | +| Birds | 0.729 → 0.760 | 0.702 → 0.719 | +| Bryophytes | 0.650 → 0.654 | 0.669 → 0.718 | +| Lichens | 0.803 → 0.814 | 0.792 → 0.847 | +| Soil mites | 0.716 → 0.730 | 0.774 → 0.805 | +| Vascular plants | 0.828 → 0.850 | 0.846 → 0.877 | + +GBM's out-of-bag AUC and deviance explained were higher in every taxon and +region, and its calibration slopes sat closer to 1 (0.93–1.07, against +0.61–0.99). Its habitat effects on the grid ranked broadly like v2's for +the plant taxa (rank correlation 0.4–0.97 by species), but not for American +robin in the north (0.08). + +**Do not read these as the finding.** Five draws give unstable bands, the +settings are untuned, and two species per taxon is a small sample. They +show the comparison works end to end. diff --git a/1_code/experiments/exp_001_gbm/run.R b/1_code/experiments/exp_001_gbm/run.R new file mode 100644 index 0000000..a69f0aa --- /dev/null +++ b/1_code/experiments/exp_001_gbm/run.R @@ -0,0 +1,80 @@ +# --- +# title: Run Experiment 001 - Boosted Regression Trees for Habitat +# author: Brendan Casey +# created: 2026-10-03 +# inputs: +# - 0_data/test_dataset/ +# - 3_output/exp_000_parity_v2/tables/, the v2 baseline +# outputs: +# in 2_pipeline/exp_001_gbm/: +# - // result stores, and run_log.csv +# in 3_output/exp_001_gbm/: +# - tables/ (summaries, and comparison_*.csv against +# exp_000), run_record.md +# notes: +# - A test experiment: does a boosted regression tree fit the +# habitat stage better than v2's linear models? See README.md. +# - One change from exp_000. Each taxon keeps v2's climate stage +# (a GLM, model-averaged) and carries its prediction into the +# habitat stage as `Climate`, as v2 does. Only the habitat +# stage - landcover for birds - is fitted with gbm, on every +# covariate v2's habitat candidates use, through +# replace_stage_method(). +# - Mammals are not run: their habitat stage is v2's hurdle +# model, two linked GLMs with custom post-processing, which +# has no single engine to swap. +# - The GBM settings are untuned starting points (see +# 1_code/methods/engines/gbm.R). Read the result as "does the +# pipeline run GBM and compare it", not as GBM's best. +# --- + +# 1. Setup ---- + +## 1.1 Load the framework ---- +source("1_code/harness/harness.R") +load_framework() + +## 1.2 The change: fit the habitat stage with gbm ---- +# Every other stage and setting stays v2's, so a difference from +# exp_000 is the habitat method's. +gbm_settings <- list( + n.trees = 1000, # the most trees; out-of-bag picks fewer + interaction.depth = 3, # tree complexity + shrinkage = 0.05, # learning rate + bag.fraction = 0.5, # share of rows each tree sees + n.minobsinnode = 10 # smallest leaf +) + +specs <- standard_specs() + +for (key in c("bryophyte", "lichen", "mite", "vascular_plant")) { + specs[[key]] <- replace_stage_method( + specs[[key]], "habitat", engine = "gbm", control = gbm_settings + ) +} + +specs$bird <- replace_stage_method( + specs$bird, "landcover", engine = "gbm", control = gbm_settings +) + +## 1.3 Configure the run ---- +# The same species, seed and draws as the exp_000 run it is +# compared against, so the comparison is like for like. +config <- experiment_config( + id = "exp_001_gbm", + taxa = c("bryophyte", "lichen", "mite", "vascular_plant", "bird"), + species = "parity_check", + # 5 checks the pipeline runs; 100 for a result to read + n_bootstraps = 5, + seed = 20260909, + specs = specs, + workers = 12 +) + +# 2. Run ---- +# Fit, summarize, and compare with exp_000; every experiment is +# compared with it. The comparison is written to +# tables/comparison_*.csv. +results <- run_experiment(config) + +# End of script ---- diff --git a/1_code/experiments/exp_002_soilgrids/01_extract_soilgrids_covariates.R b/1_code/experiments/exp_002_soilgrids/01_extract_soilgrids_covariates.R new file mode 100644 index 0000000..d471b25 --- /dev/null +++ b/1_code/experiments/exp_002_soilgrids/01_extract_soilgrids_covariates.R @@ -0,0 +1,146 @@ +# --- +# title: Extract SoilGrids Covariates for Experiment 002 +# author: Brendan Casey +# created: 2026-10-04 +# inputs: +# - SoilGrids 2.0, ABMI 1 km variant, from the sciSpatialR +# catalogue (geoscientificInformation/soilgrids_250_v2_ab/ +# abmi1km), on //ABMI-DATA2; SDM_SOILGRIDS overrides the path +# - 0_data/test_dataset/sites.csv, read only +# outputs: +# in 2_pipeline/exp_002_soilgrids/inputs/: +# - soilgrids_0_5cm.csv: survey_unit_id plus ten +# sg_*_0_5cm columns, one row per survey unit +# - soilgrids_0_5cm_source.csv: where the columns came from +# notes: +# - The experiment's own covariates. They are written here, not +# into 0_data/test_dataset/, which stays the frozen v2 data; +# run.R names the file in experiment_config(covariate_files =) +# and the harness joins it on survey_unit_id when loading. +# - The shallowest depth, 0-5 cm, of the ten SoilGrids +# properties published at it: bulk density, cation exchange +# capacity, coarse fragments, clay, nitrogen, pH, sand, silt, +# soil organic carbon and organic carbon density. Organic +# carbon stock is published for 0-30 cm only and is left out. +# Units are the layer's: kg/dm3, cmol(c)/kg, vol %, %, g/kg, +# pH, %, %, g/kg and kg/m3. +# - Each survey unit takes the value of the 1 km cell it falls +# in. The layer has no missing cells inside Alberta: gaps were +# filled from the nearest data (see the layer's readme), so a +# filled cell is an interpolation, not a measurement. +# - Survey units are located by their easting and northing, +# which are Alberta 10-TM (EPSG:3400), the layer's own grid: +# for plant units they match latitude and longitude projected +# to EPSG:3400 to within 1e-8 m, and bird units with v2's +# south-only flag fall 98% in the Grassland and Parkland +# natural regions (checked 2026-10-04). Mammal deployments +# carry no coordinates in the dataset, so their values are NA. +# - Values depend only on location, so one row per survey unit +# serves every taxon. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +library(data.table) # reading and writing tables (version: 1.18.0) +library(sciSpatialR) # catalogue access, extraction (version: 0.1.0) +library(sf) # survey unit points (version: 1.1.2) + +## 1.2 Resolve paths ---- +project_root <- normalizePath(getwd(), winslash = "/") +sites_path <- file.path( + project_root, "0_data", "test_dataset", "sites.csv" +) +out_dir <- file.path( + project_root, "2_pipeline", "exp_002_soilgrids", "inputs" +) + +layer_id <- "geoscientificInformation/soilgrids_250_v2_ab/abmi1km" +layer_path <- Sys.getenv("SDM_SOILGRIDS", unset = "") + +if (!file.exists(sites_path)) { + stop("Run this from the repository root.", call. = FALSE) +} + +dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) + +# 2. Read the layer's shallowest depth ---- +soil <- if (nzchar(layer_path)) { + terra::rast(layer_path) +} else { + get_layer(layer_id) +} + +shallow <- grep("_0-5cm_mean$", names(soil), value = TRUE) + +if (length(shallow) != 10) { + stop( + "Expected ten 0-5 cm bands in ", layer_id, "; found ", + length(shallow), ".", + call. = FALSE + ) +} + +soil <- soil[[shallow]] + +# Column names the formulas can use: sg_clay_0_5cm +names(soil) <- paste0( + "sg_", sub("_0-5cm_mean$", "", shallow), "_0_5cm" +) +soil_columns <- names(soil) + +# 3. Extract at every survey unit ---- +sites <- fread( + sites_path, + select = c("survey_unit_id", "easting", "northing"), + colClasses = list(character = "survey_unit_id") +) +located <- sites[!is.na(easting) & !is.na(northing)] + +points <- st_as_sf( + located, coords = c("easting", "northing"), crs = 3400 +) + +values <- as.data.table( + extract_points(soil, points, bind = FALSE) +) +values <- values[, soil_columns, with = FALSE] + +# One row per survey unit, NA where a unit has no location +soil_table <- data.table(survey_unit_id = sites$survey_unit_id) +rows <- match(sites$survey_unit_id, located$survey_unit_id) + +for (column in soil_columns) { + set(soil_table, j = column, value = values[[column]][rows]) +} + +## 3.1 Report ---- +cat( + "Survey units:", nrow(sites), "\n", + " located:", nrow(located), "\n", + " without coordinates (soil left NA):", + nrow(sites) - nrow(located), "\n", + " located but outside the layer:", + sum(!stats::complete.cases(values)), "\n" +) +print(summary(values)) + +# 4. Write ---- +fwrite(soil_table, file.path(out_dir, "soilgrids_0_5cm.csv"), + na = "") + +fwrite(data.table( + columns = paste(soil_columns, collapse = " "), + source = layer_id, + doi = paste0( + "10.17027/isric-soilgrids.", + "713396fa-1687-11ea-a7c0-a0481ca9e724" + ), + depth = "0-5 cm", + extracted = format(Sys.Date()), + method = "value of the 1 km cell each survey unit falls in" +), file.path(out_dir, "soilgrids_0_5cm_source.csv")) + +cat("Wrote", nrow(soil_table), "survey units to", out_dir, "\n") + +# End of script ---- diff --git a/1_code/experiments/exp_002_soilgrids/README.md b/1_code/experiments/exp_002_soilgrids/README.md new file mode 100644 index 0000000..dc6cee1 --- /dev/null +++ b/1_code/experiments/exp_002_soilgrids/README.md @@ -0,0 +1,128 @@ +# exp_002_soilgrids + +![Status](https://img.shields.io/badge/Status-Test-lightgrey) +![Languages](https://img.shields.io/badge/Languages-R-blue) + +## Question + +Does adding near-surface soil properties from SoilGrids 2.0 improve the +models, for the plant-group taxa and birds? + +This is a **test experiment**: its first job is to show that a covariate set +from the Science Centre's spatial catalogue +([sciSpatialR](https://github.com/ABbiodiversity/sciSpatialR)) can be tested +against the v2 baseline without changing the frozen dataset. Read its numbers as a +result only after a run at 100 draws. + +## The covariates + +SoilGrids 2.0 (Poggio et al. 2021, SOIL 7: 217–240; +doi:10.17027/isric-soilgrids.713396fa-1687-11ea-a7c0-a0481ca9e724), the ABMI +1 km variant in the catalogue (`geoscientificInformation/soilgrids_250_v2_ab/ +abmi1km`), at its shallowest depth, 0–5 cm. + +| Column | Property | Units | In the models | +| --- | --- | --- | --- | +| `sg_bdod_0_5cm` | Bulk density | kg/dm3 | yes | +| `sg_cec_0_5cm` | Cation exchange capacity | cmol(c)/kg | yes | +| `sg_cfvo_0_5cm` | Coarse fragments | vol % | yes | +| `sg_clay_0_5cm` | Clay | % | yes | +| `sg_sand_0_5cm` | Sand | % | yes | +| `sg_silt_0_5cm` | Silt | % | **no**: sand, silt and clay sum to 100%, so one is fixed by the other two | +| `sg_nitrogen_0_5cm` | Nitrogen | g/kg | yes | +| `sg_phh2o_0_5cm` | pH in water | pH | yes | +| `sg_soc_0_5cm` | Soil organic carbon | g/kg | yes | +| `sg_ocd_0_5cm` | Organic carbon density | kg/m3 | yes | + +They are extracted by `01_extract_soilgrids_covariates.R` in this folder, +which takes the value of the 1 km cell each survey unit falls in and writes +`2_pipeline/exp_002_soilgrids/inputs/soilgrids_0_5cm.csv` (one row per survey +unit) with its source in `soilgrids_0_5cm_source.csv`. `run.R` names that file +in `experiment_config(covariate_files = )`, and the harness joins it on +`survey_unit_id` when it loads the data. `0_data/` and `_setup/` are not +touched. Organic carbon stock is published for 0–30 cm only and is not +included. + +## Design + +| | exp_000 (baseline) | exp_002 (this) | +| --- | --- | --- | +| Climate stage | v2's candidates (plants 58, birds 25), model-averaged | The same candidates, each with the nine soil terms added | +| Climate → habitat | Carried as `Climate` | The same; the carried prediction now includes soil | +| Habitat stage | v2 | v2, unchanged | +| Species, draws, seed | `parity_check`, 20260909 | The same | + +- **Why the climate stage.** It is fitted once, province-wide, so one set of + formulas serves every region, and it is v2's broad-scale environmental + stage. Adding soil to the habitat stage instead would need different + formulas per region and a soil value for every row of the habitat grids. +- **Every candidate gets the terms** (`extend_models()`), so the comparison + between candidates is v2's and the only change is the soil. +- **Mammals are not run.** Their v2 climate is a precomputed prediction rather + than a fitted stage, and their deployments carry no coordinates in the + dataset, so they have no soil values. + +## How to run + +From the repository root: + +```r +source("1_code/experiments/exp_002_soilgrids/run.R") +``` + +`run.R` runs the extraction first if the soil file is missing. That step +reads the layer from the `//ABMI-DATA2` share; set `SDM_SOILGRIDS` to a local +copy of the raster to read it from there instead. Delete the file to extract +again. + +`run.R` uses 5 draws to check the pipeline. For a result, set +`n_bootstraps = 100` and compare against a 100-draw exp_000. + +## How to read the result + +Every experiment is compared with exp_000; see +`3_output/exp_002_soilgrids/tables/comparison_*.csv`. The habitat effects on +the grid (`comparison_grid.csv`) show whether adding soil to the climate stage +moved the habitat estimates through the carried `Climate` term. + +## Assumptions and caveats + +- **A 1 km cell is not a plot.** Each survey unit takes the mean of its 1 km + cell, aggregated from SoilGrids' 250 m predictions, which are themselves + model predictions, not measurements. Gap-filled cells are interpolated. +- **Some soil terms are correlated**: bulk density with coarse fragments + (r = −0.83) and pH (0.79), sand with clay (−0.80), nitrogen with organic + carbon (0.75). Model averaging spreads weight across them, so individual + soil coefficients are hard to interpret; the fit metrics and grid + predictions are the reliable read. +- **Raw units, unscaled.** As in v2's climate stage; `bayesglm` scales + predictors internally for its priors. +- **Twelve plant-group survey units have no soil value** (just outside the + 1 km grid), so the climate stage fits on those 12 fewer units than + exp_000. No bird unit is missing. +- **More parameters.** Each candidate gains nine terms; the AICc weights + penalize them, but the averaged model is larger than v2's. + +## Result + +_Not yet run at 100 draws._ + +**Pipeline check, 2026-10-04: 5 draws, `parity_check` species.** All 100 +species × region × draw jobs ran. Against exp_000 at the same species, seed +and draws: + +| Taxon | Out-of-bag AUC, north (v2 → soil) | South (v2 → soil) | +| --- | --- | --- | +| Birds | 0.729 → 0.732 | 0.702 → 0.715 | +| Bryophytes | 0.650 → 0.657 | 0.669 → 0.664 | +| Lichens | 0.803 → 0.803 | 0.792 → 0.811 | +| Soil mites | 0.716 → 0.716 | 0.774 → 0.787 | +| Vascular plants | 0.828 → 0.824 | 0.846 → 0.842 | + +The differences are small and mixed in sign, and calibration slopes moved +slightly away from 1 for most taxa. Habitat effects on the grid barely moved +(rank correlation with exp_000 of 0.86–1.00 by species). + +**Do not read these as the finding.** Five draws give unstable bands and two +species per taxon is a small sample. They show the covariates load and the +comparison works end to end. diff --git a/1_code/experiments/exp_002_soilgrids/run.R b/1_code/experiments/exp_002_soilgrids/run.R new file mode 100644 index 0000000..8597221 --- /dev/null +++ b/1_code/experiments/exp_002_soilgrids/run.R @@ -0,0 +1,104 @@ +# --- +# title: Run Experiment 002 - SoilGrids Terms in the Climate Stage +# author: Brendan Casey +# created: 2026-10-04 +# inputs: +# - 0_data/test_dataset/, the frozen v2 data, unchanged +# - 2_pipeline/exp_002_soilgrids/inputs/soilgrids_0_5cm.csv, the +# soil covariates, written by 01_extract_soilgrids_covariates.R +# in this folder (run here when the file is missing) +# - 3_output/exp_000_parity_v2/tables/, the v2 baseline +# outputs: +# in 2_pipeline/exp_002_soilgrids/: +# - // result stores, and run_log.csv +# in 3_output/exp_002_soilgrids/: +# - tables/ (summaries, and comparison_*.csv against +# exp_000), run_record.md +# notes: +# - A test experiment: does adding near-surface soil properties +# from SoilGrids improve the models? See README.md. +# - The soil columns come from this experiment's own file, joined +# on survey_unit_id through `covariate_files`; the dataset and +# the _setup scripts are not touched. +# - One change from exp_000: every candidate in each taxon's +# climate stage gains the same soil terms. Climate is fitted +# once, province-wide, so one set of formulas serves every +# region, and its prediction is still carried into the habitat +# stage as `Climate`, as v2 does. +# - Mammals are not run: their v2 climate is a precomputed +# prediction, not a stage that can take new terms, and their +# deployments carry no coordinates for a soil value. +# --- + +# 1. Setup ---- + +## 1.1 Load the framework ---- +source("1_code/harness/harness.R") +load_framework() + +## 1.2 The soil covariates ---- +# Extracted once from the sciSpatialR catalogue; needs the +# network share. Delete the file to extract again. +soil_file <- "2_pipeline/exp_002_soilgrids/inputs/soilgrids_0_5cm.csv" + +if (!file.exists(soil_file)) { + source(file.path( + "1_code", "experiments", "exp_002_soilgrids", + "01_extract_soilgrids_covariates.R" + )) +} + +## 1.3 The change: soil terms in every climate candidate ---- +# The 0-5 cm SoilGrids properties. Silt is left out because sand, +# silt and clay sum to 100%, so any one is fixed by the other two. +soil_terms <- c( + "sg_bdod_0_5cm", # bulk density, kg/dm3 + "sg_cec_0_5cm", # cation exchange capacity, cmol(c)/kg + "sg_cfvo_0_5cm", # coarse fragments, vol % + "sg_clay_0_5cm", # clay, % + "sg_sand_0_5cm", # sand, % + "sg_nitrogen_0_5cm", # nitrogen, g/kg + "sg_phh2o_0_5cm", # pH in water + "sg_soc_0_5cm", # soil organic carbon, g/kg + "sg_ocd_0_5cm" # organic carbon density, kg/m3 +) + +plant_taxa <- c("bryophyte", "lichen", "mite", "vascular_plant") + +# Keys are "taxon.stage". Each taxon keeps its own v2 climate set +# and adds the soil terms to every candidate in it. +stage_models <- c( + stats::setNames( + rep(list(extend_models("climate_plant_v2_full", soil_terms)), + length(plant_taxa)), + paste0(plant_taxa, ".climate") + ), + list(bird.climate = extend_models("climate_bird_v2", soil_terms)) +) + +## 1.4 Configure the run ---- +# The same species, seed and draws as the exp_000 run it is +# compared against, so the comparison is like for like. +config <- experiment_config( + id = "exp_002_soilgrids", + taxa = c(plant_taxa, "bird"), + species = "parity_check", + # 5 checks the pipeline runs; 100 for a result to read + n_bootstraps = 5, + seed = 20260909, + stage_models = stage_models, + # Where the soil columns named in stage_models are read from + covariate_files = soil_file, + workers = 12 +) + +# 2. Run ---- +# Fit, summarize, and compare with exp_000; every experiment is +# compared with it. The comparison is written to +# tables/comparison_*.csv. +results <- run_experiment( + config, + translate = list(bird = bird_habitat_translation) +) + +# End of script ---- diff --git a/1_code/harness/compare.R b/1_code/harness/compare.R index e5160d0..171c6dc 100644 --- a/1_code/harness/compare.R +++ b/1_code/harness/compare.R @@ -29,6 +29,9 @@ # - "Better" depends on the metric: higher AUC, deviance # explained and Spearman; lower RMSE; a calibration slope # closer to 1. better_direction() states it once. +# - Each side's draw count is kept in the summary +# (`draws_baseline`, `draws_candidate`), and a mismatch is +# warned about: a trial against a full run is not a result. # - A difference is a difference in medians over draws. Whether # it is larger than draw-to-draw noise is read from # `share_better` across species and from the p10-p90 bands in @@ -125,6 +128,12 @@ compare_experiments <- function( ) } + # The mean and sd ride along where both experiments have them; + # a baseline summarized before they were added lacks them + values <- c(values, intersect( + c("mean", "sd"), intersect(names(candidate), names(baseline)) + )) + pick <- function(rows) { rows[metric %in% metrics, c(keys, "metric", values), with = FALSE] } @@ -147,12 +156,29 @@ compare_experiments <- function( # Step 2: Per taxon, region and metric summary <- joined[, list( species = .N, + draws_baseline = stats::median(n_baseline, na.rm = TRUE), + draws_candidate = stats::median(n_candidate, na.rm = TRUE), median_baseline = stats::median(median_baseline, na.rm = TRUE), median_candidate = stats::median(median_candidate, na.rm = TRUE), median_difference = stats::median(difference, na.rm = TRUE), share_better = mean(better, na.rm = TRUE) ), by = c("taxon", "region", "season", "part", "metric")] + # A band from 5 draws is not comparable with one from 100, so a + # mismatch is said out loud rather than left in a column + mismatched <- summary[draws_baseline != draws_candidate] + + if (nrow(mismatched) > 0) { + warning( + "The two experiments hold different numbers of draws (", + paste(unique(mismatched$draws_baseline), collapse = ", "), + " in the baseline, ", + paste(unique(mismatched$draws_candidate), collapse = ", "), + " here). Compare like with like before reading the result.", + call. = FALSE + ) + } + # Step 3: Habitat effects on the grid, per species grid_candidate <- read_summary(candidate_dir, "grid_summary") grid_baseline <- read_summary(baseline_dir, "grid_summary") diff --git a/1_code/harness/data_load.R b/1_code/harness/data_load.R index f028808..a8b079a 100644 --- a/1_code/harness/data_load.R +++ b/1_code/harness/data_load.R @@ -36,6 +36,10 @@ # covariate_sets.R. That is how mammals reach TD, which their # own climate model set needs and their source file lacks. # Requires covariate_sets.R to be sourced first. +# - An experiment can add covariates the frozen dataset does not +# hold, from its own CSVs keyed on survey_unit_id +# (experiment_config(covariate_files = )). They are joined on +# load; 0_data/ is never changed by an experiment. # - Future improvement - a Parquet or duckdb backing store # would let a bird run select rows as well as columns. # --- @@ -411,6 +415,126 @@ load_covariates <- function( covariates[, unique(c("survey_unit_id", columns)), drop = FALSE] } +## 6.1 check_covariate_files() ---- + +#' Check the Covariate Files an Experiment Adds +#' +#' Each file must exist, be keyed on a unique survey_unit_id, and +#' add only columns that neither covariates.csv nor another file +#' already has, so no column has two possible sources. +#' +#' @param files Character vector of CSV paths. +#' @param data_dir Character. Path to 0_data/test_dataset. +#' @return `files`, invisibly; stops on the first problem. +#' +#' @example # Example usage of the function +#' # check_covariate_files("2_pipeline/exp_002/inputs/soil.csv", +#' # data_dir) +check_covariate_files <- function(files, data_dir) { + taken <- names(fread(file.path(data_dir, "covariates.csv"), + nrows = 0)) + + for (path in files) { + if (!file.exists(path)) { + stop( + "Covariate file not found: ", path, "\nRun the ", + "experiment's script that writes it first.", + call. = FALSE + ) + } + + header <- names(fread(path, nrows = 0)) + + if (!"survey_unit_id" %in% header) { + stop("Covariate file ", basename(path), " has no ", + "survey_unit_id column.", call. = FALSE) + } + + ids <- fread(path, select = "survey_unit_id", + colClasses = "character")$survey_unit_id + + if (anyDuplicated(ids) > 0) { + stop("Covariate file ", basename(path), " repeats a ", + "survey_unit_id; it needs one row per unit.", + call. = FALSE) + } + + added <- setdiff(header, "survey_unit_id") + clash <- intersect(added, taken) + + if (length(clash) > 0) { + stop( + "Covariate file ", basename(path), " repeats column(s) ", + "already in covariates.csv or another file: ", + paste(utils::head(clash, 10), collapse = ", "), + ". Give them new names.", + call. = FALSE + ) + } + + taken <- c(taken, added) + } + + invisible(files) +} + +## 6.2 covariate_file_columns() ---- + +#' The Columns a Set of Covariate Files Holds +#' +#' @param files Character vector of CSV paths, or NULL. +#' @return A character vector of column names, without +#' survey_unit_id. +#' +#' @example # Example usage of the function +#' # covariate_file_columns("2_pipeline/exp_002/inputs/soil.csv") +covariate_file_columns <- function(files) { + unique(unlist(lapply(files, function(path) { + setdiff(names(fread(path, nrows = 0)), "survey_unit_id") + }))) +} + +## 6.3 add_covariate_files() ---- + +#' Join Covariates from an Experiment's Own Files +#' +#' A unit a file does not list gets NA, as a unit missing a value +#' in covariates.csv does, and drops out of any model using it. +#' +#' @param x A data frame with survey_unit_id, from +#' load_covariates(). +#' @param files Character vector of CSV paths, or NULL. +#' @param columns Character vector of the columns to add. +#' @return `x` with the columns added. +#' +#' @example # Example usage of the function +#' # add_covariate_files(x, "2_pipeline/exp_002/inputs/soil.csv", +#' # "sg_clay_0_5cm") +add_covariate_files <- function(x, files, columns) { + for (path in files) { + table <- cached_read(path, function(p) { + as.data.frame(fread( + p, colClasses = list(character = "survey_unit_id") + )) + }, tag = "covariate_file") + + wanted <- setdiff( + intersect(columns, names(table)), + c("survey_unit_id", names(x)) + ) + + if (length(wanted) == 0) { + next + } + + rows <- match(as.character(x$survey_unit_id), + table$survey_unit_id) + x[wanted] <- table[rows, wanted, drop = FALSE] + } + + x +} + # 7. apply_factor_levels() ---- #' Restore Stored Factor Levels @@ -557,6 +681,9 @@ reference level and every contrast.", #' model set name a column the dataset stores otherwise. #' @param site_columns Character vector of sites.csv columns to #' carry, beyond survey_unit_id, or NULL for site_columns(). +#' @param covariate_files Character vector of an experiment's own +#' covariate CSVs, or NULL. Columns they hold are read from them +#' rather than from covariates.csv. #' @return A list with `covariates` (one row per unit, including #' the site columns), `response`, `offset` (or NULL), `units`, #' `taxon` and `region`. @@ -576,7 +703,8 @@ build_model_data <- function( region_filter = NULL, weight_column = NULL, aliases = list(), - site_columns = NULL + site_columns = NULL, + covariate_files = NULL ) { site_columns <- site_columns %||% site_columns() @@ -587,7 +715,13 @@ build_model_data <- function( covariates <- unique(c(covariates, weight_column)) } - x <- load_covariates(taxon, data_dir, covariates, region) + from_files <- intersect( + covariates, covariate_file_columns(covariate_files) + ) + x <- load_covariates( + taxon, data_dir, setdiff(covariates, from_files), region + ) + x <- add_covariate_files(x, covariate_files, from_files) y <- load_response(taxon, data_dir, species) off <- load_offsets(taxon, data_dir, species) sites <- load_sites(data_dir, taxon, site_columns) diff --git a/1_code/harness/experiment.R b/1_code/harness/experiment.R index 6796563..24bfc88 100644 --- a/1_code/harness/experiment.R +++ b/1_code/harness/experiment.R @@ -17,8 +17,13 @@ # workers - before anything is fitted. Every check that used # to sit in run.R lives here. # - run_experiment() fits (optionally), collects the stores -# into summary tables, runs the experiment's own steps in -# order, and writes the run record. +# into summary tables, compares them with the baseline +# experiment (exp_000, the v2 configuration), runs the +# experiment's own steps in order, and writes the run +# record. +# - Every experiment is compared with the baseline without +# asking, because that comparison is the point of an +# experiment here: a result is read as a difference from v2. # - Everything the steps need travels in the config and the # results passed to them; nothing is read from the global # environment, so a step can be run on its own. @@ -46,12 +51,20 @@ library(data.table) # run log writing (version: 1.16.4) #' draws unseeded, as v2 did. #' @param stage_models Named list of replacement candidate sets, #' or NULL for each spec's v2 sets; see apply_stage_models(). +#' @param covariate_files Character vector of CSVs holding +#' covariates the frozen dataset does not, keyed on +#' survey_unit_id, or NULL. Written by the experiment's own +#' scripts, never into 0_data/; their columns can then be named +#' in `stage_models`. #' @param specs Named list of specs, or NULL for #' standard_specs(plant_bootstrap). An experiment that changes #' a spec builds its own and passes it here. #' @param plant_bootstrap Character. Passed to standard_specs(). #' @param workers Integer. Species fitted at once. #' @param unit_predictions Character. "none", "oob" or "all". +#' @param baseline Character. The experiment every result is +#' compared with, by id; NULL for none. Ignored by the baseline +#' itself. #' @param v2_bootstraps Integer. v2's draw count, which a run must #' reach to be gated. #' @param project_root Character. The repository root. @@ -70,10 +83,12 @@ experiment_config <- function( n_bootstraps = 100L, seed = 20260909L, stage_models = NULL, + covariate_files = NULL, specs = NULL, plant_bootstrap = "spatial_block", workers = 1L, unit_predictions = "none", + baseline = "exp_000_parity_v2", v2_bootstraps = 100L, project_root = getOption("sdm.project_root", "."), data_dir = NULL, @@ -142,7 +157,21 @@ experiment_config <- function( ) } - # Step 3: The species. A taxon the set does not name runs every + # Step 3: Covariates the experiment adds from its own files. + # Absolute paths, so parallel workers find them too. + if (!is.null(covariate_files)) { + covariate_files <- normalizePath( + covariate_files, winslash = "/", mustWork = FALSE + ) + check_covariate_files(covariate_files, data_dir) + + specs <- lapply(specs, function(spec) { + spec$covariate_files <- covariate_files + spec + }) + } + + # Step 4: The species. A taxon the set does not name runs every # species, because an absent taxon means "no restriction". Said # out loud, because it makes a partial set the longest run. focal <- get_focal_species(species) @@ -178,9 +207,12 @@ experiment_config <- function( v2_bootstraps = as.integer(v2_bootstraps), seed = seed, stage_models = stage_models, + covariate_files = covariate_files, plant_bootstrap = plant_bootstrap, workers = as.integer(workers), unit_predictions = unit_predictions, + # The baseline does not compare with itself + baseline = if (identical(baseline, id)) NULL else baseline, project_root = project_root, data_dir = data_dir, pipeline_dir = pipeline_dir %||% @@ -212,12 +244,15 @@ print.experiment_config <- function(x, ...) { cat(" draws: ", x$n_bootstraps, " (v2: ", x$v2_bootstraps, ")\n", sep = "") cat(" seed: ", x$seed %||% "unseeded", "\n", sep = "") - cat(" models: ", if (is.null(x$stage_models)) { - "each spec's v2 candidate sets" + changes <- experiment_changes(x) + cat(" changes: ", if (length(changes) == 0) { + "none; every spec is v2's" } else { - paste(names(x$stage_models), collapse = ", ") + paste(changes, collapse = "\n ") }, "\n", sep = "") cat(" workers: ", x$workers, "\n", sep = "") + cat(" baseline: ", x$baseline %||% "none (this is the baseline)", + "\n", sep = "") cat(" writes: ", x$pipeline_dir, "\n ", x$out_dir, "\n", sep = "") @@ -226,7 +261,8 @@ print.experiment_config <- function(x, ...) { # 3. run_experiment() ---- -#' Fit, Summarize, Run the Experiment's Steps, and Record +#' Fit, Summarize, Compare with the Baseline, Run the +#' Experiment's Steps, and Record #' #' @param config An experiment_config(). #' @param fit Logical. FALSE skips fitting and re-summarizes the @@ -238,11 +274,11 @@ print.experiment_config <- function(x, ...) { #' taxon, passed to collect_results(). #' @param record Logical. Write run_record.md. #' @return The results list, invisibly: the summary tables, the -#' run log, and whatever the steps added. +#' run log, the comparison with the baseline, and whatever the +#' steps added. #' #' @example # Example usage of the function -#' # results <- run_experiment(config, -#' # steps = list(compare = compare_to_baseline)) +#' # results <- run_experiment(config) run_experiment <- function( config, fit = TRUE, @@ -282,13 +318,20 @@ run_experiment <- function( results$run_log <- run_log write_summaries(results, config$out_dir) - # Step 3: The experiment's own steps, in order + # Step 3: Compare with the baseline, for every experiment but + # the baseline itself + if (!is.null(config$baseline)) { + cat("\n== compare with ", config$baseline, " ==\n", sep = "") + results <- compare_to_baseline(config, results) + } + + # Step 4: The experiment's own steps, in order for (name in names(steps)) { cat("\n== ", name, " ==\n", sep = "") results <- steps[[name]](config, results) } - # Step 4: The committed record of what ran + # Step 5: The committed record of what ran if (record) { record_file <- run_record( pipeline_dir = config$pipeline_dir, @@ -357,8 +400,18 @@ record_config <- function(config, run_log = NULL) { } else { sort(names(config$stage_models)) }, + covariate_files = if (is.null(config$covariate_files)) { + "none" + } else { + basename(config$covariate_files) + }, + changes_from_v2 = { + changes <- experiment_changes(config) + if (length(changes) == 0) "none" else changes + }, engines = stage_values("engine"), selection = stage_values("selection"), + compared_with = config$baseline %||% "none (baseline)", data_dir = basename(config$data_dir) ) @@ -375,35 +428,99 @@ record_config <- function(config, run_log = NULL) { out } +## 4.1 experiment_changes() ---- + +#' What an Experiment Changes from the v2 Specs +#' +#' Changes made through `stage_models`, and through specs changed +#' with replace_stage_method(), which records them. +#' +#' @param config An experiment_config(). +#' @return A character vector, one entry per run and change. +#' +#' @example # Example usage of the function +#' # experiment_changes(config) +experiment_changes <- function(config) { + from_specs <- unlist(lapply(names(config$specs), function(key) { + changed <- config$specs[[key]]$models_overridden + + if (is.null(changed)) NULL else paste0(key, ": ", changed) + })) + + from_models <- if (is.null(config$stage_models)) { + NULL + } else { + paste0("stage_models: ", names(config$stage_models)) + } + + from_files <- if (is.null(config$covariate_files)) { + NULL + } else { + paste0("covariate_files: ", basename(config$covariate_files)) + } + + c(from_specs, from_models, from_files) +} + # 5. compare_to_baseline() ---- -#' An Experiment Step: Compare Against exp_000 +#' Compare an Experiment's Summaries with the Baseline's #' -#' Ready to pass in run_experiment()'s `steps`. Compares this -#' experiment's summaries with the v2 baseline's; see -#' compare_experiments(). +#' Run by run_experiment() for every experiment but the baseline. +#' Writes tables/comparison_summary.csv, comparison_metrics.csv +#' and comparison_grid.csv; see compare_experiments(). A baseline +#' that has not been run is reported and skipped rather than +#' stopping the experiment. #' #' @param config An experiment_config(). #' @param results The results so far. #' @param baseline Character. The baseline experiment's id. -#' @return `results`, with `comparison` added. +#' @return `results`, with `comparison` added when there was a +#' baseline to compare with. #' #' @example # Example usage of the function -#' # run_experiment(config, steps = list( -#' # compare = compare_to_baseline)) +#' # results <- compare_to_baseline(config, results) compare_to_baseline <- function( - config, results, baseline = "exp_000_parity_v2" + config, results, baseline = config$baseline ) { + baseline_dir <- file.path( + config$project_root, "3_output", baseline + ) + baseline_table <- file.path( + baseline_dir, "tables", "metric_summary.csv" + ) + + if (!file.exists(baseline_table)) { + message( + "No comparison: ", baseline, " has no summary tables yet. ", + "Run it first, then re-summarize this experiment with ", + "run_experiment(config, fit = FALSE)." + ) + return(results) + } + comparison <- compare_experiments( candidate_dir = config$out_dir, - baseline_dir = file.path( - config$project_root, "3_output", baseline - ) + baseline_dir = baseline_dir ) - cat("\nAgainst ", baseline, ", per taxon, region and metric:\n", - sep = "") - print(comparison$summary, row.names = FALSE) + # The headline, for the console; the full tables are written + shown <- comparison$summary[ + comparison$summary$metric %in% c( + "oob_auc", "oob_deviance_explained", "oob_calibration_slope" + ), + c("taxon", "region", "metric", "median_baseline", + "median_candidate", "median_difference", "share_better") + ] + numbers <- vapply(shown, is.numeric, logical(1)) + shown[numbers] <- lapply(shown[numbers], round, 3) + + cat( + "Against ", baseline, + " (out-of-bag; full tables in tables/comparison_*.csv):\n", + sep = "" + ) + print(shown, row.names = FALSE) results$comparison <- comparison results diff --git a/1_code/harness/model_sets.R b/1_code/harness/model_sets.R index 23c63bf..688480c 100644 --- a/1_code/harness/model_sets.R +++ b/1_code/harness/model_sets.R @@ -461,6 +461,38 @@ models_from_covariates <- function( unique(models) } +## 3.3 models_union() ---- + +#' One Formula Holding Every Covariate a Candidate Set Uses +#' +#' For an engine that selects its own variables and finds its own +#' curvature and interactions - a boosted tree, say - comparing a +#' v2 candidate set is meaningless; it is given every covariate any +#' candidate uses, once, as main effects. `I(x^2)` and `a:b` +#' contribute x, a and b. +#' +#' @param models Character vector of formulas, a list of groups of +#' them (a staged set), or a name in model_sets(). +#' @param sets Named list of model sets. +#' @return One formula, as text, in update form (". ~ . + ..."). +#' +#' @example # Example usage of the function +#' # models_union("climate_bird_v2") +models_union <- function(models, sets = model_sets()) { + formulas <- unlist(get_model_set(models, sets), use.names = FALSE) + + terms <- unique(unlist(lapply(formulas, function(one) { + all.vars(stats::as.formula(one)) + }))) + terms <- setdiff(terms, c(".", "response", "offset", "weight")) + + if (length(terms) == 0) { + return(". ~ .") + } + + paste0(". ~ . + ", paste(terms, collapse = " + ")) +} + # 4. get_model_set() ---- #' Look Up One Model Set diff --git a/1_code/harness/run_model.R b/1_code/harness/run_model.R index 0ca483f..0365302 100644 --- a/1_code/harness/run_model.R +++ b/1_code/harness/run_model.R @@ -345,7 +345,8 @@ prepare_region <- function(spec, region, species, data_dir) { region = region, region_filter = region_spec$filter, weight_column = weight_column, - aliases = spec$aliases %||% list() + aliases = spec$aliases %||% list(), + covariate_files = spec$covariate_files ) # Step 4: The grid. A spec may name its own; otherwise the @@ -444,7 +445,8 @@ province_context <- function(spec, data_dir, species) { region = NULL, region_filter = NULL, weight_column = NULL, - aliases = spec$aliases %||% list() + aliases = spec$aliases %||% list(), + covariate_files = spec$covariate_files ), stages = province_stages, draws = province_draws diff --git a/1_code/harness/run_record.R b/1_code/harness/run_record.R index 94b6137..bc16dcb 100644 --- a/1_code/harness/run_record.R +++ b/1_code/harness/run_record.R @@ -294,7 +294,9 @@ run_record <- function( n = .N, median = stats::median(value), p10 = stats::quantile(value, 0.1, names = FALSE), - p90 = stats::quantile(value, 0.9, names = FALSE) + p90 = stats::quantile(value, 0.9, names = FALSE), + mean = mean(value), + sd = if (.N < 2) NA_real_ else stats::sd(value) ), by = list(taxon = run, region, metric) ] diff --git a/1_code/harness/spec.R b/1_code/harness/spec.R index b9eafaa..b591932 100644 --- a/1_code/harness/spec.R +++ b/1_code/harness/spec.R @@ -50,7 +50,7 @@ spec_fields <- function() { "weight_column", "tier", "season", "part", "aliases", "regions", "stages", "resample", "v2_coverage", "validate", "final_prediction", "species_frame", "supplied_columns", - "notes", "models_overridden", + "notes", "models_overridden", "covariate_files", # Recorded facts a module keeps for its own reports "use_protocol", "protocol_is_v2", "climate_source" ), @@ -418,9 +418,115 @@ apply_stage_models <- function(spec, stage_models) { spec } -# 6. v2 coverage ---- +# 6. replace_stage_method() ---- -## 6.1 v2_status() ---- +#' Fit One Stage of a v2 Spec with a Different Method +#' +#' The lever for a methods experiment: the rest of the spec stays +#' v2's, so a difference in the result is the method's. Sets the +#' stage's engine, selection rule and settings, and gives it one +#' formula holding every covariate its v2 candidates use (see +#' models_union()), per region where the region supplies the +#' models. +#' +#' Removed, because they read v2 coefficient tables a different +#' engine may not produce: +#' +#' - the stage's `post_process` steps (the plant stand-age +#' splines, cutblock convergence, pAspen and footprint pooling); +#' - stage fields only the old rule took (`head_terms`, say); +#' - when the stage is the last, the spec's `final_prediction` and +#' `validate` (v2's plant prediction and validation AUCs), so the +#' harness scores the new method's own prediction. +#' +#' The stage's `v2_coverage` and the run's `models_overridden` +#' record the change. +#' +#' @param spec A taxon spec. +#' @param stage Character. The stage's name. +#' @param engine Character. A registered engine. +#' @param selection Character. A registered rule; "single" for an +#' engine with no information criterion. +#' @param control Named list of engine settings. +#' @param union Logical. Replace the candidate set with one formula +#' holding all its covariates. FALSE keeps the candidates, for a +#' rule that compares them. +#' @return The spec. +#' +#' @example # Example usage of the function +#' # spec <- replace_stage_method(lichen_spec(), "habitat", "gbm") +replace_stage_method <- function( + spec, stage, engine, selection = "single", control = list(), + union = TRUE +) { + names_in <- vapply(spec$stages, `[[`, character(1), "name") + index <- match(stage, names_in) + + if (is.na(index)) { + stop( + "Spec `", spec$taxon, "` has no stage `", stage, "`. Stages: ", + paste(names_in, collapse = ", "), + call. = FALSE + ) + } + + rule <- get_method("selection", selection) + get_engine(engine) + old <- spec$stages[[index]] + + # Step 1: The candidate formulas, per region where the region + # supplies them + if (union) { + if (is.null(old$models)) { + for (region in names(spec$regions)) { + spec$regions[[region]]$habitat_models <- models_union( + spec$regions[[region]]$habitat_models + ) + spec$regions[[region]]$intercept_cats <- NULL + } + } else { + old$models <- models_union(old$models) + } + } + + # Step 2: The stage, keeping only what the harness and the new + # rule read + known <- c(spec_fields()$stage, names(formals(rule))) + new <- old[intersect(names(old), known)] + new$engine <- engine + new$selection <- selection + new$control <- control + new$ic <- NULL + new$post_process <- NULL + spec$stages[[index]] <- new + + # Step 3: Hooks that read v2 coefficient tables + if (index == length(spec$stages)) { + spec$final_prediction <- NULL + spec$validate <- NULL + } + + # Step 4: Say so + label <- paste0( + engine, " with `", selection, "`", + if (union) ", on every covariate the v2 candidates use" else "" + ) + spec$v2_coverage[[stage]] <- v2_status( + "not reproduced", paste0("Replaced: ", label, ".") + ) + spec$models_overridden <- c( + spec$models_overridden, paste0(stage, " <- ", label) + ) + spec$notes <- paste0( + spec$notes %||% "", " Stage `", stage, "` fitted with ", label, "." + ) + + spec +} + +# 7. v2 coverage ---- + +## 7.1 v2_status() ---- #' State How Much of One v2 Stage a Spec Reproduces #' @@ -455,7 +561,7 @@ v2_status <- function(status, note) { list(status = status, note = note) } -## 6.2 spec_coverage() ---- +## 7.2 spec_coverage() ---- #' Tabulate What a Set of Specs Reproduces of v2 #' @@ -494,9 +600,9 @@ spec_coverage <- function(specs) { do.call(rbind, rows) } -# 7. Helpers ---- +# 8. Helpers ---- -## 7.1 `%||%` ---- +## 8.1 `%||%` ---- #' Default for NULL #' diff --git a/1_code/harness/summarise.R b/1_code/harness/summarise.R index 3187faf..53eb17a 100644 --- a/1_code/harness/summarise.R +++ b/1_code/harness/summarise.R @@ -147,31 +147,44 @@ store_meta <- function(dir) { #' @param rows A data frame with `boot` and the value column. #' @param value Character. The column to summarize. #' @param keys Character vector of grouping columns. +#' @param moments Logical. Add the mean and standard deviation. #' @return A data.table of the keys plus n, median, p10, p90 and -#' boot1. n counts the finite values; boot1 is the iteration-1 -#' value where there is exactly one. +#' boot1, and mean and sd when `moments` is TRUE. n counts the +#' finite values; boot1 is the iteration-1 value where there is +#' exactly one. #' #' @example # Example usage of the function -#' # summarise_draws(metrics, "value", c("species", "metric")) -summarise_draws <- function(rows, value, keys) { +#' # summarise_draws(metrics, "value", c("species", "metric"), +#' # moments = TRUE) +summarise_draws <- function(rows, value, keys, moments = FALSE) { rows <- as.data.table(rows) # The column is passed through .SDcols rather than named inside # the call, because a column may itself be called `value` - rows[, draw_summary(.SD[[1L]], boot), by = keys, .SDcols = value] + rows[, draw_summary(.SD[[1L]], boot, moments), + by = keys, .SDcols = value] } ## 3.2 draw_summary() ---- #' Summarize One Value over Its Draws #' +#' The median and 10-90% band are the summary every comparison +#' reads, because a distribution over draws is often skewed. The +#' mean and standard deviation are added where asked, for readers +#' and tools that expect them; with a skewed distribution they +#' describe it less well. +#' #' @param x Numeric vector, one value per draw. #' @param boot Integer vector of the draw each value came from. -#' @return A list of n, median, p10, p90 and boot1. +#' @param moments Logical. Add the mean and standard deviation. +#' @return A list of n, median, p10, p90 and boot1, then mean and +#' sd when `moments` is TRUE. sd is NA with fewer than two +#' values. #' #' @example # Example usage of the function -#' # draw_summary(c(0.1, 0.3, 0.2), 1:3) -draw_summary <- function(x, boot) { +#' # draw_summary(c(0.1, 0.3, 0.2), 1:3, moments = TRUE) +draw_summary <- function(x, boot, moments = FALSE) { first <- x[boot == 1L] first <- if (length(first) == 1 && is.finite(first)) { first @@ -180,17 +193,25 @@ draw_summary <- function(x, boot) { } finite <- x[is.finite(x)] - if (length(finite) == 0) { - return(list(n = 0, median = NA_real_, p10 = NA_real_, - p90 = NA_real_, boot1 = first)) + out <- if (length(finite) == 0) { + list(n = 0, median = NA_real_, p10 = NA_real_, + p90 = NA_real_, boot1 = first) + } else { + quantiles <- stats::quantile( + finite, c(0.1, 0.5, 0.9), names = FALSE + ) + + list(n = as.numeric(length(finite)), median = quantiles[2], + p10 = quantiles[1], p90 = quantiles[3], boot1 = first) } - quantiles <- stats::quantile( - finite, c(0.1, 0.5, 0.9), names = FALSE - ) + # Appended, so the columns before them keep their positions + if (moments) { + out$mean <- if (length(finite) == 0) NA_real_ else mean(finite) + out$sd <- if (length(finite) < 2) NA_real_ else stats::sd(finite) + } - list(n = as.numeric(length(finite)), median = quantiles[2], - p10 = quantiles[1], p90 = quantiles[3], boot1 = first) + out } # 4. collect_results() ---- @@ -258,12 +279,12 @@ collect_results <- function(pipeline_dir, data_dir = NULL, } } - summarised <- function(rows, value, keys) { + summarised <- function(rows, value, keys, moments = FALSE) { if (is.null(rows) || nrow(rows) == 0) { return(NULL) } - cbind(labels, summarise_draws(rows, value, keys)) + cbind(labels, summarise_draws(rows, value, keys, moments)) } list( @@ -283,7 +304,7 @@ collect_results <- function(pipeline_dir, data_dir = NULL, coefficients, "estimate", c("stage", "species", "term") ), metric_summary = summarised( - metrics, "value", c("species", "metric") + metrics, "value", c("species", "metric"), moments = TRUE ), grid_summary = summarised( grid, "prediction", c("species", "grid_unit") diff --git a/1_code/methods/README.md b/1_code/methods/README.md index 20f221e..66ce1aa 100644 --- a/1_code/methods/README.md +++ b/1_code/methods/README.md @@ -29,6 +29,7 @@ skeleton for an engine and a selection rule; it is not loaded. | --- | --- | --- | --- | | engine | `glm` | `stats::glm` (v2 mammals, birds) | | | engine | `bayesglm` | `arm::bayesglm`, weakly informative priors (v2 plants) | | +| engine | `gbm` | Boosted regression trees, `gbm::gbm.fit`; no coefficients, information criterion or standard errors, so use the `single` rule | | | selection | `single` | Fit the first candidate; no ranking | | | selection | `aic_best` | Keep the lowest-scoring candidate | ic | | selection | `aic_average` | Average coefficients by Akaike weight (v2 climate) | ic, coefficients | diff --git a/1_code/methods/engines/gbm.R b/1_code/methods/engines/gbm.R new file mode 100644 index 0000000..4f69ff5 --- /dev/null +++ b/1_code/methods/engines/gbm.R @@ -0,0 +1,284 @@ +# --- +# title: Engine - Boosted Regression Trees (gbm) +# author: Brendan Casey +# created: 2026-10-03 +# inputs: none +# outputs: registers the `gbm` engine +# notes: +# - gbm::gbm.fit. Trees choose their own variables, split points +# and interactions, so a stage fitted with this engine is given +# one formula holding every candidate covariate +# (models_union()) and the `single` rule. +# - It has no coefficients, no information criterion and no +# standard errors, and declares none. validate_spec() therefore +# refuses it with a rule that needs them (aic_average, +# ivw_grid, staged_bic); use `single`. +# - Only the formula's variables are used: `I(x^2)` and `a:b` +# contribute x, a and b, because a tree finds curvature and +# interactions itself. +# - The offset is honoured, on the link scale, in fitting and in +# prediction. predict.gbm() leaves it out, so it is added back +# here; without that, a bird prediction would be a rate, not a +# count. +# - The number of trees is chosen per fit by gbm.perf()'s +# out-of-bag estimate. It is fast but known to pick too few +# trees; cross-validation would be better and several times +# slower, and is not offered here. +# - Bagging draws at random, so each fit runs under a fixed seed +# (`seed` in control) and a run reproduces exactly. +# - Settings, through the stage's `control`: n.trees (the +# maximum), interaction.depth, shrinkage, bag.fraction, +# n.minobsinnode, seed. The defaults are starting points, not +# tuned values: tree depth and bag fraction are in the ranges +# Elith, Leathwick and Hastie (2008, J. Anim. Ecol.) discuss, +# but the learning rate (0.05) is higher than they generally +# advise, chosen to keep a test run quick. Tune before reading +# a GBM result as the method's best. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +# gbm, lazily, so a run that never uses this engine does not need +# it installed. + +# 2. engine_gbm() ---- + +#' Boosted Regression Trees +#' +#' @return An engine definition. +#' +#' @example # Example usage of the function +#' # check_engine(engine_gbm()) +engine_gbm <- function() { + list( + name = "gbm", + description = "Boosted regression trees (gbm::gbm.fit)", + capabilities = character(0), + fit = gbm_fit, + predict = gbm_predict + ) +} + +# 3. gbm_fit() ---- + +#' Fit Boosted Regression Trees, Catching Failure +#' +#' @param formula A model formula. Only its variables and any +#' `offset(offset)` term are used. +#' @param data A data frame. +#' @param family Character ("binomial", "poisson", "gaussian") or +#' a family object. +#' @param weights Numeric vector or NULL. +#' @param offset Unused; the offset comes from the formula. +#' @param control Named list of settings; see the header. +#' @return A list with `fit` (or NULL), `ok` and `message`. +#' +#' @example # Example usage of the function +#' # gbm_fit(response ~ MAP + FFP, d, "binomial") +gbm_fit <- function(formula, data, family, weights = NULL, + offset = NULL, control = list()) { + tryCatch( + { + if (!requireNamespace("gbm", quietly = TRUE)) { + stop("The gbm engine needs the gbm package.", call. = FALSE) + } + + settings <- utils::modifyList( + list( + n.trees = 1000, interaction.depth = 3, shrinkage = 0.05, + bag.fraction = 0.5, n.minobsinnode = 10, + seed = 20260909L + ), + control + ) + + # Step 1: The response, the predictors and any offset. A row + # missing its response, weight or offset is dropped, as a GLM + # drops it; a missing predictor is kept, because trees route + # missing values down a branch of their own. + terms <- gbm_terms(formula) + w_all <- if (is.null(weights)) rep(1, nrow(data)) else weights + keep <- !is.na(data[[terms$response]]) & !is.na(w_all) + + if (terms$offset) { + keep <- keep & !is.na(data$offset) + } + + x <- gbm_predictors(data[keep, , drop = FALSE], terms$variables) + y <- data[[terms$response]][keep] + w <- w_all[keep] + link_offset <- if (terms$offset) data$offset[keep] else NULL + + # Step 2: Fit, under a fixed seed, as many trees as allowed + model <- with_seed(settings$seed, gbm::gbm.fit( + x = x, y = y, offset = link_offset, w = w, + distribution = gbm_distribution(family), + n.trees = settings$n.trees, + interaction.depth = settings$interaction.depth, + shrinkage = settings$shrinkage, + bag.fraction = settings$bag.fraction, + n.minobsinnode = settings$n.minobsinnode, + keep.data = FALSE, + verbose = FALSE + )) + + # Step 3: Keep the number of trees the out-of-bag estimate + # prefers + best <- suppressWarnings(suppressMessages( + gbm::gbm.perf(model, method = "OOB", plot.it = FALSE) + )) + + list( + fit = list( + model = model, + n_trees = as.integer(best), + variables = terms$variables, + levels = lapply(x, levels), + offset = terms$offset, + linkinv = family_linkinv(family) + ), + ok = TRUE, + message = NA_character_ + ) + }, + error = function(e) { + list(fit = NULL, ok = FALSE, message = conditionMessage(e)) + } + ) +} + +# 4. gbm_predict() ---- + +#' Predict from a gbm Fit +#' +#' @param fit A list from gbm_fit(). +#' @param newdata A data frame to predict onto. +#' @param type Character. "link" or "response". +#' @param se Logical. Not supported; NULL is returned when TRUE. +#' @return A numeric vector, or NULL when the fit failed. +#' +#' @example # Example usage of the function +#' # gbm_predict(fit, newdata, "response") +gbm_predict <- function(fit, newdata, type = "link", se = FALSE) { + if (is.null(fit) || !isTRUE(fit$ok) || is.null(fit$fit) || se) { + return(NULL) + } + + tryCatch( + { + tree <- fit$fit + x <- gbm_predictors(newdata, tree$variables, tree$levels) + link <- gbm::predict.gbm( + tree$model, newdata = x, n.trees = tree$n_trees, + type = "link" + ) + + # predict.gbm() leaves the offset out + if (tree$offset) { + link <- link + newdata$offset + } + + if (type == "link") { + as.numeric(link) + } else { + as.numeric(tree$linkinv(link)) + } + }, + error = function(e) NULL + ) +} + +# 5. Helpers ---- + +## 5.1 gbm_terms() ---- + +#' Read a Formula as gbm Uses It +#' +#' @param formula A model formula. +#' @return A list of `response`, `variables` and `offset` (TRUE +#' when the formula has an `offset(offset)` term). +#' +#' @example # Example usage of the function +#' # gbm_terms(count ~ MAP + I(MAP^2) + offset(offset)) +gbm_terms <- function(formula) { + text <- paste(deparse(formula), collapse = " ") + + list( + response = all.vars(formula[[2]]), + variables = setdiff( + all.vars(formula[[3]]), c("offset", "weight") + ), + offset = grepl("offset(offset)", text, fixed = TRUE) + ) +} + +## 5.2 gbm_predictors() ---- + +#' The Predictor Frame gbm Takes +#' +#' Text columns become factors, with the fitted levels when +#' predicting, so a category on new data is read the way it was in +#' fitting. +#' +#' @param data A data frame. +#' @param variables Character vector of column names. +#' @param levels Named list of factor levels from the fit, or +#' NULL when fitting. +#' @return A data frame of the predictors. +#' +#' @example # Example usage of the function +#' # gbm_predictors(d, c("MAP", "vegc")) +gbm_predictors <- function(data, variables, levels = NULL) { + absent <- setdiff(variables, names(data)) + + if (length(absent) > 0) { + stop("Columns not in the data: ", paste(absent, collapse = ", "), + call. = FALSE) + } + + x <- as.data.frame(data)[, variables, drop = FALSE] + + for (column in variables) { + value <- x[[column]] + known <- levels[[column]] + + if (!is.null(known)) { + x[[column]] <- factor(as.character(value), levels = known) + } else if (is.character(value) || is.logical(value)) { + x[[column]] <- factor(value) + } + } + + x +} + +## 5.3 gbm_distribution() ---- + +#' The gbm Distribution for a GLM Family +#' +#' @param family Character or family object. +#' @return Character, a gbm distribution name. +#' +#' @example # Example usage of the function +#' # gbm_distribution("binomial") # "bernoulli" +gbm_distribution <- function(family) { + name <- if (is.character(family)) family else family$family + + switch( + name, + binomial = "bernoulli", + poisson = "poisson", + gaussian = "gaussian", + stop( + "The gbm engine has no distribution for family `", name, + "`. It supports binomial, poisson and gaussian.", + call. = FALSE + ) + ) +} + +# 6. Register ---- +register_engine(engine_gbm()) + +# End of script ---- diff --git a/1_code/tests/testthat/test-dataset.R b/1_code/tests/testthat/test-dataset.R index 951e6e6..6103e78 100644 --- a/1_code/tests/testthat/test-dataset.R +++ b/1_code/tests/testthat/test-dataset.R @@ -76,3 +76,38 @@ test_that("the covariate cache returns what a fresh read does", { expect_identical(wider, fresh) expect_identical(first$MAP, fresh$MAP) }) + +test_that("an experiment's covariate file is checked and joined", { + # A stand-in dataset, so the check runs without the 218 MB file + fake_dir <- withr::local_tempdir() + data.table::fwrite( + data.frame(survey_unit_id = c("a", "b"), taxon = "x", MAT = 1:2), + file.path(fake_dir, "covariates.csv") + ) + good <- file.path(fake_dir, "good.csv") + data.table::fwrite( + data.frame(survey_unit_id = c("b", "a"), new_1 = c(20, 10)), + good + ) + clash <- file.path(fake_dir, "clash.csv") + data.table::fwrite( + data.frame(survey_unit_id = "a", MAT = 5), clash + ) + repeated <- file.path(fake_dir, "repeated.csv") + data.table::fwrite( + data.frame(survey_unit_id = c("a", "a"), new_2 = 1:2), repeated + ) + + expect_silent(check_covariate_files(good, fake_dir)) + expect_error(check_covariate_files(clash, fake_dir), "already in") + expect_error(check_covariate_files(repeated, fake_dir), "repeats") + expect_error( + check_covariate_files(file.path(fake_dir, "none.csv"), fake_dir), + "not found" + ) + + # Joined on the id, NA for a unit the file does not list + x <- data.frame(survey_unit_id = c("a", "b", "c")) + joined <- add_covariate_files(x, good, "new_1") + expect_equal(joined$new_1, c(10, 20, NA)) +}) diff --git a/1_code/tests/testthat/test-methods.R b/1_code/tests/testthat/test-methods.R index ea9cea6..d5e2039 100644 --- a/1_code/tests/testthat/test-methods.R +++ b/1_code/tests/testthat/test-methods.R @@ -14,9 +14,9 @@ test_that("every registered engine passes check_engine()", { }) test_that("the v2 methods are all registered", { - expect_setequal( - registered_names("engine"), c("glm", "bayesglm") - ) + expect_true(all( + c("glm", "bayesglm", "gbm") %in% registered_names("engine") + )) expect_true(all(c( "single", "aic_best", "aic_average", "staged_bic", "ivw_grid", "aic_best_grid", "aic_best_onehot" @@ -26,7 +26,7 @@ test_that("the v2 methods are all registered", { }) test_that("an unknown method fails with the registered names", { - expect_error(get_engine("gbm"), "Registered: .*glm") + expect_error(get_engine("no_such_engine"), "Registered: .*glm") expect_error(get_method("selection", "best"), "aic_best") }) diff --git a/1_code/tests/testthat/test-results.R b/1_code/tests/testthat/test-results.R index 2d403e6..960dab3 100644 --- a/1_code/tests/testthat/test-results.R +++ b/1_code/tests/testthat/test-results.R @@ -110,3 +110,74 @@ test_that("spatial cross-validation holds out whole folds", { ) expect_equal(sum(lengths(held_out)), 400) }) + +test_that("an experiment is compared with its baseline by key", { + root <- file.path(tempdir(), "compare_test") + unlink(root, recursive = TRUE) + on.exit(unlink(root, recursive = TRUE)) + + write_summary <- function(dir, auc, draws) { + dir.create(file.path(dir, "tables"), recursive = TRUE) + data.table::fwrite( + data.frame( + taxon = "lichen", run = c("lichen", "lichen"), + region = "north", season = NA, part = NA, + species = c("sp1", "sp2"), metric = "oob_auc", + n = draws, median = auc, p10 = auc - 0.05, + p90 = auc + 0.05, boot1 = NA + ), + file.path(dir, "tables", "metric_summary.csv") + ) + } + + write_summary(file.path(root, "base"), c(0.70, 0.80), 100) + write_summary(file.path(root, "same"), c(0.75, 0.78), 100) + write_summary(file.path(root, "short"), c(0.75, 0.78), 5) + + out <- compare_experiments( + file.path(root, "same"), file.path(root, "base") + ) + expect_equal(out$summary$share_better, 0.5) + expect_equal(out$summary$draws_baseline, 100) + expect_true(file.exists( + file.path(root, "same", "tables", "comparison_summary.csv") + )) + + # A trial against a full run is warned about + expect_warning( + compare_experiments( + file.path(root, "short"), file.path(root, "base") + ), + "different numbers of draws" + ) +}) + +test_that("the baseline does not compare with itself", { + expect_null(experiment_config("exp_000_parity_v2")$baseline) + expect_equal( + experiment_config("exp_009_test")$baseline, "exp_000_parity_v2" + ) +}) + +test_that("metric summaries carry the mean and standard deviation", { + rows <- data.frame( + species = "sp", metric = "oob_auc", boot = 1:4, + value = c(0.6, 0.7, 0.8, NA) + ) + out <- summarise_draws(rows, "value", c("species", "metric"), + moments = TRUE) + + expect_equal(out$n, 3) + expect_equal(out$mean, 0.7) + expect_equal(out$sd, 0.1) + # Appended, so earlier columns keep their positions + expect_equal( + names(out), + c("species", "metric", "n", "median", "p10", "p90", "boot1", + "mean", "sd") + ) + # Coefficient and grid summaries are unchanged + expect_false("mean" %in% names( + summarise_draws(rows, "value", c("species", "metric")) + )) +}) diff --git a/3_output/exp_001_gbm/run_record.md b/3_output/exp_001_gbm/run_record.md new file mode 100644 index 0000000..f63a59e --- /dev/null +++ b/3_output/exp_001_gbm/run_record.md @@ -0,0 +1,193 @@ +# Run record: exp_001_gbm + +Written by `run_record()`. The result stores this describes are gitignored; this file is what remains. + +## Provenance + +_Volatile. Excluded from cross-run comparison._ + +- **git_commit**: 2b72a2b +- **pipeline_dir**: D:/local_projects/active/sdmMethodsDev/2_pipeline/exp_001_gbm +- **r_version**: 4.5.0 +- **written_at**: 2026-10-05 11:05:10 + +## Configuration + +- **boot_seed**: 20260909.0000 +- **changes_from_v2**: bryophyte: habitat <- gbm with `single`, on every covariate the v2 candidates use, lichen: habitat <- gbm with `single`, on every covariate the v2 candidates use, mite: habitat <- gbm with `single`, on every covariate the v2 candidates use, vascular_plant: habitat <- gbm with `single`, on every covariate the v2 candidates use, bird: landcover <- gbm with `single`, on every covariate the v2 candidates use +- **compared_with**: exp_000_parity_v2 +- **covariate_files**: none +- **data_dir**: test_dataset +- **engines**: bayesglm, gbm, glm +- **focal_species**: bird=AMRO, bird=YEWA, bryophyte=Bryum.All, bryophyte=Ceratodon.purpureus, lichen=Cladonia.chlorophaea, lichen=Physcia.adscendens, mammal=Coyote_Summer, mammal=Coyote_Winter, mammal=Moose_Summer, mammal=Moose_Winter, mite=Ceratozetes.gracilis, mite=Trhypochthonius.tectorum, vascular_plant=Galium.boreale, vascular_plant=Vicia.americana +- **jobs_not_ok**: 0 +- **jobs_ok**: 100 +- **jobs_total**: 100 +- **n_bootstraps**: 5 +- **plant_bootstrap**: spatial_block +- **selection**: aic_average, single +- **species_n**: 14 +- **stage_models**: spec defaults (v2 candidate sets) +- **taxa**: bird, bryophyte, lichen, mite, vascular_plant +- **v2_bootstraps**: 100 + +## Coverage + +| taxon | region | species | draws | coefficient_rows | metric_rows | grid_rows | +| --- | --- | --- | --- | --- | --- | --- | +| bird | north | 2 | 5 | 100 | 140 | 890 | +| bird | south | 2 | 5 | 100 | 140 | 170 | +| bryophyte | north | 2 | 5 | 190 | 140 | 430 | +| bryophyte | south | 2 | 5 | 190 | 140 | 160 | +| lichen | north | 2 | 5 | 190 | 140 | 430 | +| lichen | south | 2 | 5 | 190 | 140 | 160 | +| mite | north | 2 | 5 | 190 | 140 | 430 | +| mite | south | 2 | 5 | 190 | 140 | 160 | +| vascular_plant | north | 2 | 5 | 190 | 140 | 430 | +| vascular_plant | south | 2 | 5 | 190 | 140 | 160 | + +## Metrics + +| taxon | region | metric | n | median | p10 | p90 | mean | sd | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| bird | north | insample_auc | 10 | 0.7785 | 0.7489 | 0.8120 | 0.7803 | 0.0313 | +| bird | north | insample_calibration_slope | 10 | 1.0157 | 0.9398 | 1.0902 | 1.0143 | 0.0764 | +| bird | north | insample_deviance_explained | 10 | 0.2513 | 0.1907 | 0.3191 | 0.2536 | 0.0648 | +| bird | north | insample_n | 10 | 46747.0000 | 46744.0000 | 46750.0000 | 46747.6000 | 2.3664 | +| bird | north | insample_prevalence | 10 | 0.1851 | 0.1178 | 0.2520 | 0.1850 | 0.0702 | +| bird | north | insample_rmse | 10 | 0.5699 | 0.4958 | 0.6433 | 0.5696 | 0.0767 | +| bird | north | insample_spearman | 10 | 0.3669 | 0.3497 | 0.3859 | 0.3670 | 0.0184 | +| bird | north | oob_auc | 10 | 0.7577 | 0.7505 | 0.7677 | 0.7588 | 0.0081 | +| bird | north | oob_calibration_slope | 10 | 0.9984 | 0.8836 | 1.0873 | 0.9861 | 0.0985 | +| bird | north | oob_deviance_explained | 10 | 0.2094 | 0.1936 | 0.2312 | 0.2118 | 0.0181 | +| bird | north | oob_n | 10 | 124877.0000 | 124874.0000 | 124880.0000 | 124876.4000 | 2.3664 | +| bird | north | oob_prevalence | 10 | 0.1877 | 0.1343 | 0.2411 | 0.1877 | 0.0561 | +| bird | north | oob_rmse | 10 | 0.5970 | 0.5494 | 0.6433 | 0.5964 | 0.0487 | +| bird | north | oob_spearman | 10 | 0.3491 | 0.3173 | 0.3809 | 0.3491 | 0.0323 | +| bird | south | insample_auc | 10 | 0.7285 | 0.7218 | 0.7332 | 0.7273 | 0.0052 | +| bird | south | insample_calibration_slope | 10 | 1.0529 | 0.9549 | 1.1534 | 1.0555 | 0.1016 | +| bird | south | insample_deviance_explained | 10 | 0.1974 | 0.1381 | 0.2650 | 0.1993 | 0.0635 | +| bird | south | insample_n | 10 | 23761.0000 | 23761.0000 | 23762.0000 | 23761.2000 | 0.4216 | +| bird | south | insample_prevalence | 10 | 0.2140 | 0.1710 | 0.2587 | 0.2147 | 0.0458 | +| bird | south | insample_rmse | 10 | 0.6629 | 0.5920 | 0.7266 | 0.6604 | 0.0674 | +| bird | south | insample_spearman | 10 | 0.3249 | 0.3082 | 0.3425 | 0.3261 | 0.0169 | +| bird | south | oob_auc | 10 | 0.7187 | 0.7120 | 0.7265 | 0.7192 | 0.0064 | +| bird | south | oob_calibration_slope | 10 | 1.0383 | 0.8966 | 1.1462 | 1.0252 | 0.1141 | +| bird | south | oob_deviance_explained | 10 | 0.1766 | 0.1312 | 0.2252 | 0.1776 | 0.0473 | +| bird | south | oob_n | 10 | 67240.0000 | 67239.0000 | 67240.0000 | 67239.8000 | 0.4216 | +| bird | south | oob_prevalence | 10 | 0.2177 | 0.1756 | 0.2603 | 0.2179 | 0.0444 | +| bird | south | oob_rmse | 10 | 0.6723 | 0.6223 | 0.7223 | 0.6723 | 0.0523 | +| bird | south | oob_spearman | 10 | 0.3173 | 0.3034 | 0.3307 | 0.3170 | 0.0130 | +| bryophyte | north | insample_auc | 10 | 0.7086 | 0.6715 | 0.7459 | 0.7084 | 0.0308 | +| bryophyte | north | insample_calibration_slope | 10 | 1.4240 | 1.2679 | 1.6795 | 1.4476 | 0.1675 | +| bryophyte | north | insample_deviance_explained | 10 | 0.0925 | 0.0563 | 0.1338 | 0.0955 | 0.0313 | +| bryophyte | north | insample_n | 10 | 3091.0000 | 3041.1000 | 4852.0000 | 3429.3000 | 750.2771 | +| bryophyte | north | insample_prevalence | 10 | 0.4175 | 0.3976 | 0.4423 | 0.4194 | 0.0223 | +| bryophyte | north | insample_rmse | 10 | 0.4619 | 0.4513 | 0.4702 | 0.4609 | 0.0078 | +| bryophyte | north | insample_spearman | 10 | 0.3563 | 0.2904 | 0.4231 | 0.3562 | 0.0549 | +| bryophyte | north | oob_auc | 8 | 0.6584 | 0.6253 | 0.6892 | 0.6573 | 0.0287 | +| bryophyte | north | oob_calibration_slope | 8 | 0.9836 | 0.9203 | 1.2616 | 1.0484 | 0.2043 | +| bryophyte | north | oob_deviance_explained | 8 | 0.0546 | 0.0335 | 0.0839 | 0.0571 | 0.0233 | +| bryophyte | north | oob_n | 10 | 1761.0000 | 0.0000 | 1810.9000 | 1422.7000 | 750.2771 | +| bryophyte | north | oob_prevalence | 8 | 0.4201 | 0.4007 | 0.4503 | 0.4233 | 0.0233 | +| bryophyte | north | oob_rmse | 8 | 0.4753 | 0.4683 | 0.4789 | 0.4744 | 0.0049 | +| bryophyte | north | oob_spearman | 8 | 0.2708 | 0.2127 | 0.3255 | 0.2692 | 0.0509 | +| bryophyte | south | insample_auc | 10 | 0.7794 | 0.7467 | 0.8338 | 0.7873 | 0.0374 | +| bryophyte | south | insample_calibration_slope | 10 | 1.4260 | 1.2580 | 1.5426 | 1.4072 | 0.1245 | +| bryophyte | south | insample_deviance_explained | 10 | 0.1566 | 0.1188 | 0.2508 | 0.1742 | 0.0546 | +| bryophyte | south | insample_n | 10 | 1454.5000 | 1440.8000 | 2310.0000 | 1623.0000 | 362.3789 | +| bryophyte | south | insample_prevalence | 10 | 0.3052 | 0.2352 | 0.3713 | 0.3043 | 0.0687 | +| bryophyte | south | insample_rmse | 10 | 0.4105 | 0.3644 | 0.4427 | 0.4058 | 0.0377 | +| bryophyte | south | insample_spearman | 10 | 0.4487 | 0.4111 | 0.4920 | 0.4496 | 0.0374 | +| bryophyte | south | oob_auc | 8 | 0.7207 | 0.6806 | 0.7473 | 0.7181 | 0.0294 | +| bryophyte | south | oob_calibration_slope | 8 | 0.9618 | 0.8329 | 1.2123 | 1.0005 | 0.1715 | +| bryophyte | south | oob_deviance_explained | 8 | 0.1044 | 0.0719 | 0.1210 | 0.1000 | 0.0221 | +| bryophyte | south | oob_n | 10 | 855.5000 | 0.0000 | 869.2000 | 687.0000 | 362.3789 | +| bryophyte | south | oob_prevalence | 8 | 0.3139 | 0.2297 | 0.3751 | 0.3071 | 0.0716 | +| bryophyte | south | oob_rmse | 8 | 0.4332 | 0.3943 | 0.4605 | 0.4295 | 0.0315 | +| bryophyte | south | oob_spearman | 8 | 0.3453 | 0.3021 | 0.3715 | 0.3418 | 0.0279 | +| lichen | north | insample_auc | 10 | 0.8493 | 0.8126 | 0.8810 | 0.8475 | 0.0329 | +| lichen | north | insample_calibration_slope | 10 | 1.1590 | 1.1210 | 1.1941 | 1.1576 | 0.0325 | +| lichen | north | insample_deviance_explained | 10 | 0.2945 | 0.2280 | 0.3648 | 0.2963 | 0.0655 | +| lichen | north | insample_n | 10 | 3692.0000 | 3654.0000 | 5811.0000 | 4109.1000 | 897.3877 | +| lichen | north | insample_prevalence | 10 | 0.3839 | 0.3815 | 0.3891 | 0.3840 | 0.0037 | +| lichen | north | insample_rmse | 10 | 0.3910 | 0.3634 | 0.4162 | 0.3903 | 0.0253 | +| lichen | north | insample_spearman | 10 | 0.5882 | 0.5267 | 0.6415 | 0.5854 | 0.0551 | +| lichen | north | oob_auc | 8 | 0.8152 | 0.7659 | 0.8618 | 0.8143 | 0.0472 | +| lichen | north | oob_calibration_slope | 8 | 1.0450 | 0.9951 | 1.0841 | 1.0386 | 0.0452 | +| lichen | north | oob_deviance_explained | 8 | 0.2479 | 0.1757 | 0.3237 | 0.2488 | 0.0737 | +| lichen | north | oob_n | 10 | 2119.0000 | 0.0000 | 2157.0000 | 1701.9000 | 897.3877 | +| lichen | north | oob_prevalence | 8 | 0.3864 | 0.3761 | 0.3921 | 0.3853 | 0.0072 | +| lichen | north | oob_rmse | 8 | 0.4083 | 0.3782 | 0.4346 | 0.4072 | 0.0274 | +| lichen | north | oob_spearman | 8 | 0.5306 | 0.4488 | 0.6079 | 0.5298 | 0.0797 | +| lichen | south | insample_auc | 10 | 0.8956 | 0.8812 | 0.9057 | 0.8967 | 0.0122 | +| lichen | south | insample_calibration_slope | 10 | 1.3200 | 1.1592 | 1.5184 | 1.3383 | 0.1754 | +| lichen | south | insample_deviance_explained | 10 | 0.3397 | 0.2759 | 0.3865 | 0.3309 | 0.0483 | +| lichen | south | insample_n | 10 | 1484.5000 | 1478.5000 | 2346.0000 | 1657.8000 | 362.9370 | +| lichen | south | insample_prevalence | 10 | 0.1511 | 0.0868 | 0.2167 | 0.1525 | 0.0659 | +| lichen | south | insample_rmse | 10 | 0.2859 | 0.2441 | 0.3241 | 0.2854 | 0.0367 | +| lichen | south | insample_spearman | 10 | 0.4770 | 0.3889 | 0.5739 | 0.4802 | 0.0892 | +| lichen | south | oob_auc | 8 | 0.8479 | 0.8283 | 0.8594 | 0.8455 | 0.0183 | +| lichen | south | oob_calibration_slope | 8 | 1.0660 | 0.9709 | 1.2289 | 1.0928 | 0.1204 | +| lichen | south | oob_deviance_explained | 8 | 0.2402 | 0.1839 | 0.2955 | 0.2404 | 0.0553 | +| lichen | south | oob_n | 10 | 861.5000 | 0.0000 | 867.5000 | 688.2000 | 362.9370 | +| lichen | south | oob_prevalence | 8 | 0.1578 | 0.0943 | 0.2207 | 0.1582 | 0.0637 | +| lichen | south | oob_rmse | 8 | 0.3176 | 0.2721 | 0.3469 | 0.3122 | 0.0364 | +| lichen | south | oob_spearman | 8 | 0.4298 | 0.3408 | 0.5167 | 0.4288 | 0.0871 | +| mite | north | insample_auc | 10 | 0.7751 | 0.7246 | 0.8270 | 0.7771 | 0.0501 | +| mite | north | insample_calibration_slope | 10 | 1.3671 | 1.1895 | 1.5446 | 1.3738 | 0.1717 | +| mite | north | insample_deviance_explained | 10 | 0.1492 | 0.0874 | 0.2341 | 0.1586 | 0.0737 | +| mite | north | insample_n | 10 | 3630.0000 | 3598.5000 | 5711.0000 | 4041.0000 | 880.4163 | +| mite | north | insample_prevalence | 10 | 0.1545 | 0.0943 | 0.2113 | 0.1531 | 0.0602 | +| mite | north | insample_rmse | 10 | 0.3190 | 0.2812 | 0.3537 | 0.3185 | 0.0366 | +| mite | north | insample_spearman | 10 | 0.3397 | 0.2336 | 0.4623 | 0.3461 | 0.1176 | +| mite | north | oob_auc | 8 | 0.7280 | 0.6556 | 0.8020 | 0.7272 | 0.0740 | +| mite | north | oob_calibration_slope | 8 | 1.0507 | 1.0138 | 1.0967 | 1.0539 | 0.0425 | +| mite | north | oob_deviance_explained | 8 | 0.1142 | 0.0469 | 0.1936 | 0.1175 | 0.0732 | +| mite | north | oob_n | 10 | 2081.0000 | 0.0000 | 2112.5000 | 1670.0000 | 880.4163 | +| mite | north | oob_prevalence | 8 | 0.1509 | 0.0925 | 0.2048 | 0.1495 | 0.0588 | +| mite | north | oob_rmse | 8 | 0.3244 | 0.2836 | 0.3649 | 0.3242 | 0.0404 | +| mite | north | oob_spearman | 8 | 0.2862 | 0.1567 | 0.4212 | 0.2869 | 0.1352 | +| mite | south | insample_auc | 10 | 0.8847 | 0.8300 | 0.9505 | 0.8859 | 0.0628 | +| mite | south | insample_calibration_slope | 10 | 1.3229 | 1.2157 | 1.6087 | 1.3739 | 0.1840 | +| mite | south | insample_deviance_explained | 10 | 0.3208 | 0.1925 | 0.4704 | 0.3211 | 0.1336 | +| mite | south | insample_n | 10 | 1493.0000 | 1480.9000 | 2363.0000 | 1665.8000 | 367.6444 | +| mite | south | insample_prevalence | 10 | 0.0721 | 0.0556 | 0.0841 | 0.0703 | 0.0144 | +| mite | south | insample_rmse | 10 | 0.2145 | 0.1779 | 0.2555 | 0.2170 | 0.0377 | +| mite | south | insample_spearman | 10 | 0.3358 | 0.3165 | 0.3669 | 0.3365 | 0.0305 | +| mite | south | oob_auc | 8 | 0.8020 | 0.7046 | 0.9029 | 0.8030 | 0.0999 | +| mite | south | oob_calibration_slope | 8 | 0.9625 | 0.6221 | 1.2186 | 0.9225 | 0.2535 | +| mite | south | oob_deviance_explained | 8 | 0.1787 | 0.0568 | 0.3516 | 0.1970 | 0.1340 | +| mite | south | oob_n | 10 | 870.0000 | 0.0000 | 882.1000 | 697.2000 | 367.6444 | +| mite | south | oob_prevalence | 8 | 0.0719 | 0.0489 | 0.0868 | 0.0689 | 0.0174 | +| mite | south | oob_rmse | 8 | 0.2407 | 0.1866 | 0.2748 | 0.2330 | 0.0405 | +| mite | south | oob_spearman | 8 | 0.2440 | 0.1925 | 0.3314 | 0.2567 | 0.0647 | +| vascular_plant | north | insample_auc | 10 | 0.8813 | 0.8662 | 0.8883 | 0.8789 | 0.0088 | +| vascular_plant | north | insample_calibration_slope | 10 | 1.1149 | 1.1050 | 1.1230 | 1.1136 | 0.0114 | +| vascular_plant | north | insample_deviance_explained | 10 | 0.3633 | 0.3325 | 0.3847 | 0.3593 | 0.0209 | +| vascular_plant | north | insample_n | 10 | 4347.5000 | 4314.6000 | 6874.0000 | 4846.9000 | 1068.6395 | +| vascular_plant | north | insample_prevalence | 10 | 0.3951 | 0.3770 | 0.4211 | 0.3974 | 0.0209 | +| vascular_plant | north | insample_rmse | 10 | 0.3673 | 0.3621 | 0.3804 | 0.3692 | 0.0071 | +| vascular_plant | north | insample_spearman | 10 | 0.6425 | 0.6247 | 0.6639 | 0.6418 | 0.0168 | +| vascular_plant | north | oob_auc | 8 | 0.8530 | 0.8434 | 0.8579 | 0.8515 | 0.0066 | +| vascular_plant | north | oob_calibration_slope | 8 | 1.0172 | 1.0024 | 1.0567 | 1.0236 | 0.0239 | +| vascular_plant | north | oob_deviance_explained | 8 | 0.3088 | 0.2858 | 0.3170 | 0.3033 | 0.0140 | +| vascular_plant | north | oob_n | 10 | 2526.5000 | 0.0000 | 2559.4000 | 2027.1000 | 1068.6395 | +| vascular_plant | north | oob_prevalence | 8 | 0.3990 | 0.3725 | 0.4275 | 0.3991 | 0.0248 | +| vascular_plant | north | oob_rmse | 8 | 0.3900 | 0.3851 | 0.3925 | 0.3893 | 0.0040 | +| vascular_plant | north | oob_spearman | 8 | 0.6042 | 0.5762 | 0.6066 | 0.5956 | 0.0143 | +| vascular_plant | south | insample_auc | 10 | 0.9117 | 0.8709 | 0.9501 | 0.9112 | 0.0379 | +| vascular_plant | south | insample_calibration_slope | 10 | 1.1452 | 1.1004 | 1.1789 | 1.1412 | 0.0364 | +| vascular_plant | south | insample_deviance_explained | 10 | 0.4382 | 0.3407 | 0.5528 | 0.4445 | 0.1050 | +| vascular_plant | south | insample_n | 10 | 1688.5000 | 1654.9000 | 2648.0000 | 1869.6000 | 410.6067 | +| vascular_plant | south | insample_prevalence | 10 | 0.2438 | 0.2212 | 0.2654 | 0.2437 | 0.0227 | +| vascular_plant | south | insample_rmse | 10 | 0.3061 | 0.2623 | 0.3412 | 0.3038 | 0.0394 | +| vascular_plant | south | insample_spearman | 10 | 0.6124 | 0.5653 | 0.6498 | 0.6095 | 0.0391 | +| vascular_plant | south | oob_auc | 8 | 0.8853 | 0.8312 | 0.9205 | 0.8792 | 0.0429 | +| vascular_plant | south | oob_calibration_slope | 8 | 1.0210 | 0.9849 | 1.0742 | 1.0266 | 0.0484 | +| vascular_plant | south | oob_deviance_explained | 8 | 0.3656 | 0.2638 | 0.4639 | 0.3647 | 0.0958 | +| vascular_plant | south | oob_n | 10 | 959.5000 | 0.0000 | 993.1000 | 778.4000 | 410.6067 | +| vascular_plant | south | oob_prevalence | 8 | 0.2418 | 0.2131 | 0.2706 | 0.2421 | 0.0259 | +| vascular_plant | south | oob_rmse | 8 | 0.3303 | 0.2915 | 0.3670 | 0.3289 | 0.0371 | +| vascular_plant | south | oob_spearman | 8 | 0.5672 | 0.5040 | 0.6055 | 0.5602 | 0.0470 | + diff --git a/3_output/exp_001_gbm/tables/comparison_grid.csv b/3_output/exp_001_gbm/tables/comparison_grid.csv new file mode 100644 index 0000000..cc4cac7 --- /dev/null +++ b/3_output/exp_001_gbm/tables/comparison_grid.csv @@ -0,0 +1,21 @@ +taxon,region,season,part,species,grid_units,spearman,median_absolute_difference +bird,north,"","",AMRO,89,0.0772535544017262,0.0081177386175124 +bird,north,"","",YEWA,89,0.813071535610573,0.00763059575407907 +bird,south,"","",AMRO,17,0.639705882352941,0.0109101079212661 +bird,south,"","",YEWA,17,0.588235294117647,0.0371909371224444 +bryophyte,north,"","",Bryum.All,43,0.836465617251074,0.208759687709598 +bryophyte,north,"","",Ceratodon.purpureus,43,0.968594916783979,0.139269421701435 +bryophyte,south,"","",Bryum.All,16,0.852941176470588,0.240861314406181 +bryophyte,south,"","",Ceratodon.purpureus,16,0.764705882352941,0.0680748290852877 +lichen,north,"","",Cladonia.chlorophaea,43,0.883236283901947,0.0282813072574078 +lichen,north,"","",Physcia.adscendens,43,0.769073414652625,0.0833911844222717 +lichen,south,"","",Cladonia.chlorophaea,16,0.802651827768315,0.05023277777865 +lichen,south,"","",Physcia.adscendens,16,0.873529411764706,0.0464462624326966 +mite,north,"","",Ceratozetes.gracilis,43,0.547620379657449,0.0389254504624198 +mite,north,"","",Trhypochthonius.tectorum,43,0.61951833903172,0.0164529779384119 +mite,south,"","",Ceratozetes.gracilis,16,0.811813645078421,0.00708283812455275 +mite,south,"","",Trhypochthonius.tectorum,16,0.399116780413235,0.0117735342880326 +vascular_plant,north,"","",Galium.boreale,43,0.915296613379802,0.03922067085426 +vascular_plant,north,"","",Vicia.americana,43,0.731749820580387,0.084381195074565 +vascular_plant,south,"","",Galium.boreale,16,0.441176470588235,0.0386204129586174 +vascular_plant,south,"","",Vicia.americana,16,0.852941176470588,0.0388860141124145 diff --git a/3_output/exp_001_gbm/tables/comparison_summary.csv b/3_output/exp_001_gbm/tables/comparison_summary.csv new file mode 100644 index 0000000..583f536 --- /dev/null +++ b/3_output/exp_001_gbm/tables/comparison_summary.csv @@ -0,0 +1,51 @@ +taxon,region,season,part,metric,species,draws_baseline,draws_candidate,median_baseline,median_candidate,median_difference,share_better +bird,north,"","",oob_auc,2,5,5,0.729484461943779,0.759538559754648,0.0300540978108695,1 +bird,north,"","",oob_calibration_slope,2,5,5,0.774212093974031,0.986978291779158,0.212766197805128,1 +bird,north,"","",oob_deviance_explained,2,5,5,0.165570186112103,0.212707854173374,0.0471376680612715,1 +bird,north,"","",oob_rmse,2,5,5,0.624644013968721,0.596094719866439,-0.0285492941022815,1 +bird,north,"","",oob_spearman,2,5,5,0.3109374709378,0.350020694015218,0.0390832230774185,1 +bird,south,"","",oob_auc,2,5,5,0.702136429854496,0.719479257684166,0.01734282782967,1 +bird,south,"","",oob_calibration_slope,2,5,5,0.903072708091274,1.02177509555914,0.118702387467867,0.5 +bird,south,"","",oob_deviance_explained,2,5,5,0.150457127171694,0.17722885267149,0.026771725499796,1 +bird,south,"","",oob_rmse,2,5,5,0.686946466284977,0.672198696945138,-0.0147477693398386,1 +bird,south,"","",oob_spearman,2,5,5,0.291640797085428,0.317538334874728,0.0258975377893005,1 +bryophyte,north,"","",oob_auc,2,4,4,0.64999737456798,0.653979388217804,0.00398201364982354,0.5 +bryophyte,north,"","",oob_calibration_slope,2,4,4,0.770110822063579,0.97651395150318,0.206403129439601,1 +bryophyte,north,"","",oob_deviance_explained,2,4,4,-0.18848913667322,0.055471025248811,0.243960161922031,1 +bryophyte,north,"","",oob_rmse,2,4,4,0.477685026278507,0.475136280181214,-0.002548746097292,1 +bryophyte,north,"","",oob_spearman,2,4,4,0.256657246933472,0.263757278780134,0.00710003184666148,0.5 +bryophyte,south,"","",oob_auc,2,4,4,0.668840496946664,0.718428769960008,0.049588273013344,1 +bryophyte,south,"","",oob_calibration_slope,2,4,4,0.859428373309233,0.987603558104056,0.128175184794823,1 +bryophyte,south,"","",oob_deviance_explained,2,4,4,0.0095574817283275,0.0986340037785207,0.0890765220501932,1 +bryophyte,south,"","",oob_rmse,2,4,4,0.440793673928001,0.429487903524414,-0.0113057704035865,1 +bryophyte,south,"","",oob_spearman,2,4,4,0.260684119461907,0.340664673121688,0.079980553659781,1 +lichen,north,"","",oob_auc,2,4,4,0.802806546010246,0.814298806960144,0.0114922609498975,1 +lichen,north,"","",oob_calibration_slope,2,4,4,0.980606541125594,1.04230585591482,0.061699314789226,0.5 +lichen,north,"","",oob_deviance_explained,2,4,4,0.12872576435422,0.248034675550972,0.119308911196753,1 +lichen,north,"","",oob_rmse,2,4,4,0.413025371860499,0.406861975065378,-0.00616339679512051,1 +lichen,north,"","",oob_spearman,2,4,4,0.509892978412699,0.529977269607817,0.0200842911951175,1 +lichen,south,"","",oob_auc,2,4,4,0.79223256589659,0.846542386582297,0.0543098206857075,1 +lichen,south,"","",oob_calibration_slope,2,4,4,0.991922312776069,1.06672074683607,0.074798434060002,0.5 +lichen,south,"","",oob_deviance_explained,2,4,4,0.114894473111837,0.243889334577385,0.128994861465548,1 +lichen,south,"","",oob_rmse,2,4,4,0.323218486449386,0.312873274631208,-0.0103452118181775,1 +lichen,south,"","",oob_spearman,2,4,4,0.367603610275592,0.423231700322172,0.0556280900465805,1 +mite,north,"","",oob_auc,2,4,4,0.715543903851094,0.730053167890016,0.0145092640389225,1 +mite,north,"","",oob_calibration_slope,2,4,4,0.91133114539273,1.05674100071277,0.145409855320035,1 +mite,north,"","",oob_deviance_explained,2,4,4,0.0149187218448,0.116584579443938,0.101665857599138,1 +mite,north,"","",oob_rmse,2,4,4,0.328141122068562,0.325797519945506,-0.00234360212305601,1 +mite,north,"","",oob_spearman,2,4,4,0.271890083460792,0.289007646152262,0.01711756269147,1 +mite,south,"","",oob_auc,2,4,4,0.773632058303039,0.804547452568466,0.0309153942654279,1 +mite,south,"","",oob_calibration_slope,2,4,4,0.614282370199175,0.933805238529402,0.319522868330228,1 +mite,south,"","",oob_deviance_explained,2,4,4,0.0865130411560292,0.203074207636962,0.116561166480933,1 +mite,south,"","",oob_rmse,2,4,4,0.246446874946777,0.229893292423298,-0.016553582523479,1 +mite,south,"","",oob_spearman,2,4,4,0.230646626561677,0.255120867233179,0.024474240671502,1 +vascular_plant,north,"","",oob_auc,2,4,4,0.827954669352313,0.85044314905027,0.0224884796979565,1 +vascular_plant,north,"","",oob_calibration_slope,2,4,4,0.975256964203091,1.01544015587897,0.0401831916758785,0.5 +vascular_plant,north,"","",oob_deviance_explained,2,4,4,0.178982880150698,0.300357827072152,0.121374946921455,1 +vascular_plant,north,"","",oob_rmse,2,4,4,0.404515361388574,0.389819238453967,-0.0146961229346065,1 +vascular_plant,north,"","",oob_spearman,2,4,4,0.555249895538886,0.593460981646714,0.0382110861078275,1 +vascular_plant,south,"","",oob_auc,2,4,4,0.845681924077273,0.876856670002423,0.03117474592515,1 +vascular_plant,south,"","",oob_calibration_slope,2,4,4,0.941201813094871,1.02061001298349,0.079408199888619,1 +vascular_plant,south,"","",oob_deviance_explained,2,4,4,0.267977840506312,0.364476987381046,0.096499146874734,1 +vascular_plant,south,"","",oob_rmse,2,4,4,0.351078283914618,0.328886590048099,-0.0221916938665195,1 +vascular_plant,south,"","",oob_spearman,2,4,4,0.514530181328676,0.558932940948466,0.044402759619789,1 diff --git a/3_output/exp_001_gbm/tables/coverage.csv b/3_output/exp_001_gbm/tables/coverage.csv new file mode 100644 index 0000000..0937eae --- /dev/null +++ b/3_output/exp_001_gbm/tables/coverage.csv @@ -0,0 +1,11 @@ +taxon,run,region,season,part,species,draws,stages,has_coefficients,has_grid +bird,bird,north,,,2,5,climate,TRUE,TRUE +bird,bird,south,,,2,5,climate,TRUE,TRUE +bryophyte,bryophyte,north,,,2,5,climate,TRUE,TRUE +bryophyte,bryophyte,south,,,2,5,climate,TRUE,TRUE +lichen,lichen,north,,,2,5,climate,TRUE,TRUE +lichen,lichen,south,,,2,5,climate,TRUE,TRUE +mite,mite,north,,,2,5,climate,TRUE,TRUE +mite,mite,south,,,2,5,climate,TRUE,TRUE +vascular_plant,vascular_plant,north,,,2,5,climate,TRUE,TRUE +vascular_plant,vascular_plant,south,,,2,5,climate,TRUE,TRUE diff --git a/3_output/exp_001_gbm/tables/grid_summary.csv b/3_output/exp_001_gbm/tables/grid_summary.csv new file mode 100644 index 0000000..aa7c840 --- /dev/null +++ b/3_output/exp_001_gbm/tables/grid_summary.csv @@ -0,0 +1,685 @@ +taxon,run,region,season,part,species,grid_unit,n,median,p10,p90,boot1 +bird,bird,north,,,AMRO,SpruceR,5,0.0379077892605094,0.0357069840108991,0.0439180112333912,0.0371538184225494 +bird,bird,north,,,AMRO,Spruce1,5,0.0369434045233066,0.0344360027490483,0.0416351585155026,0.0361391093616067 +bird,bird,north,,,AMRO,Spruce2,5,0.0307150089765487,0.030109663351008,0.0329045319442051,0.0301337794475772 +bird,bird,north,,,AMRO,Spruce3,5,0.0307150089765487,0.0294054295740721,0.0325217250063317,0.0291659763427725 +bird,bird,north,,,AMRO,Spruce4,5,0.0307150089765487,0.0294054295740721,0.0325217250063317,0.0291659763427725 +bird,bird,north,,,AMRO,Spruce5,5,0.0299152293064818,0.0285956384200165,0.0314149891306962,0.0282358345707819 +bird,bird,north,,,AMRO,Spruce6,5,0.0288390264421012,0.0267705367224909,0.0295903404050516,0.0265696565030608 +bird,bird,north,,,AMRO,Spruce7,5,0.0292516197669962,0.0267705367224909,0.0313260648455419,0.0265696565030608 +bird,bird,north,,,AMRO,Spruce8,5,0.0292516197669962,0.025842614796773,0.0307697799995166,0.0254219885469663 +bird,bird,north,,,AMRO,PineR,5,0.0461811507069982,0.043560033533245,0.0475078285733581,0.0461811507069982 +bird,bird,north,,,AMRO,Pine1,5,0.0431887562367766,0.0376726145482274,0.0453268762409981,0.0380104675867715 +bird,bird,north,,,AMRO,Pine2,5,0.0352235570267497,0.0316693132829967,0.0367419235648345,0.0316941692031818 +bird,bird,north,,,AMRO,Pine3,5,0.0352235570267497,0.0309284394549282,0.0363061273499147,0.030676251241301 +bird,bird,north,,,AMRO,Pine4,5,0.0352235570267497,0.0309284394549282,0.0363061273499147,0.030676251241301 +bird,bird,north,,,AMRO,Pine5,5,0.0342273458387846,0.0300767085361846,0.0353415176234203,0.0296979447943549 +bird,bird,north,,,AMRO,Pine6,5,0.0320576976807911,0.028157076012081,0.0338734734725135,0.0279454885618782 +bird,bird,north,,,AMRO,Pine7,5,0.0316659202496991,0.028157076012081,0.0364862856995144,0.0279454885618782 +bird,bird,north,,,AMRO,Pine8,5,0.0316659202496991,0.0271810976137952,0.0358257460264925,0.0267383919727229 +bird,bird,north,,,AMRO,DecidR,5,0.0440204216314728,0.0383877389501861,0.0448538885359625,0.0451168754237399 +bird,bird,north,,,AMRO,Decid1,5,0.038134225919122,0.0347789407359524,0.042146742286011,0.0371344911215171 +bird,bird,north,,,AMRO,Decid2,5,0.0321866741194222,0.0303917567166961,0.0339973288709613,0.0309637560283268 +bird,bird,north,,,AMRO,Decid3,5,0.0321866741194222,0.0299857475339876,0.0335924814847933,0.0299692966617956 +bird,bird,north,,,AMRO,Decid4,5,0.0321866741194222,0.0299857475339876,0.0335924814847933,0.0299692966617956 +bird,bird,north,,,AMRO,Decid5,5,0.0316182073371432,0.0291585062645138,0.032780049223502,0.0290135359365346 +bird,bird,north,,,AMRO,Decid6,5,0.0304807396963572,0.0272978463308605,0.0310370504864283,0.0273014662216016 +bird,bird,north,,,AMRO,Decid7,5,0.0305718846678864,0.0272978463308605,0.0330521316283047,0.0273014662216016 +bird,bird,north,,,AMRO,Decid8,5,0.0305718846678864,0.0263501883999869,0.032464179270663,0.0261221879748799 +bird,bird,north,,,AMRO,MixedwoodR,5,0.0440114207729208,0.0403696634489452,0.0500068707296046,0.0505899724298507 +bird,bird,north,,,AMRO,Mixedwood1,5,0.0423873021137283,0.0384593421246513,0.0454987866928833,0.0423873021137283 +bird,bird,north,,,AMRO,Mixedwood2,5,0.0351898891530741,0.0333870235689893,0.0365493728589645,0.0353436937388909 +bird,bird,north,,,AMRO,Mixedwood3,5,0.0342559672568581,0.0331528742702994,0.0360473161801199,0.0342085644201385 +bird,bird,north,,,AMRO,Mixedwood4,5,0.0342559672568581,0.0331528742702994,0.0360473161801199,0.0342085644201385 +bird,bird,north,,,AMRO,Mixedwood5,5,0.0337558883354845,0.0324780326010398,0.0353256380164163,0.0337558883354845 +bird,bird,north,,,AMRO,Mixedwood6,5,0.031763975517748,0.0303665508315824,0.0337552637111679,0.031763975517748 +bird,bird,north,,,AMRO,Mixedwood7,5,0.031763975517748,0.030211851555252,0.0362811677239355,0.031763975517748 +bird,bird,north,,,AMRO,Mixedwood8,5,0.0312594253662686,0.0294734993372114,0.0356323891415271,0.0303919405855053 +bird,bird,north,,,AMRO,TreedBogR,5,0.0363680012226487,0.0338011078959166,0.0404484950265962,0.0360250767576048 +bird,bird,north,,,AMRO,TreedBog1,5,0.0341778223127492,0.0295331102950538,0.038368881440865,0.0311543804209376 +bird,bird,north,,,AMRO,TreedBog2,5,0.0286626967740724,0.025942097220258,0.0305695367250489,0.0259773758959264 +bird,bird,north,,,AMRO,TreedBog3,5,0.0286626967740724,0.0253399348528165,0.030125930914467,0.0251430635226481 +bird,bird,north,,,AMRO,TreedBog4,5,0.0286626967740724,0.0253399348528165,0.030125930914467,0.0251430635226481 +bird,bird,north,,,AMRO,TreedBog5,5,0.0280724074972567,0.0249235206740284,0.0296806842275161,0.0248103496615268 +bird,bird,north,,,AMRO,TreedBog6,5,0.026673806040427,0.023407774074153,0.028704054604167,0.0234667744849324 +bird,bird,north,,,AMRO,TreedBog7,5,0.026673806040427,0.023407774074153,0.0306640686571682,0.0234667744849324 +bird,bird,north,,,AMRO,TreedBog8,5,0.026673806040427,0.0228148996289312,0.0301212231236676,0.0227901759659883 +bird,bird,north,,,AMRO,TreedFenR,5,0.0358982711677089,0.0334501835066092,0.0410910335366983,0.0358982711677089 +bird,bird,north,,,AMRO,TreedFen1,5,0.0364156121262102,0.0341100003251102,0.0420658768525872,0.0354305776947177 +bird,bird,north,,,AMRO,TreedFen2,5,0.0310264395806072,0.0297375674124958,0.0335661095933966,0.029542986332893 +bird,bird,north,,,AMRO,TreedFen3,5,0.0310264395806072,0.0290369600932049,0.0331596134551163,0.0285941576621344 +bird,bird,north,,,AMRO,TreedFen4,5,0.0310264395806072,0.0290369600932049,0.0331596134551163,0.0285941576621344 +bird,bird,north,,,AMRO,TreedFen5,5,0.0307613686001069,0.0283698431964156,0.0324273896545031,0.0279009120989782 +bird,bird,north,,,AMRO,TreedFen6,5,0.029760487581681,0.0265826315132137,0.0308462528415929,0.026254497586519 +bird,bird,north,,,AMRO,TreedFen7,5,0.029396784377262,0.0265826315132137,0.0328834595388985,0.026254497586519 +bird,bird,north,,,AMRO,TreedFen8,5,0.029396784377262,0.0256628511989018,0.0323033542845377,0.0251204428207023 +bird,bird,north,,,AMRO,GrassHerb,5,0.0801490249699255,0.0744871079011608,0.0883363648053605,0.0805008329506624 +bird,bird,north,,,AMRO,Shrub,5,0.0560964904160333,0.0505842231815679,0.0657890598058789,0.0644625488613227 +bird,bird,north,,,AMRO,GraminoidFen,5,0.0447404943535554,0.039914721868518,0.0448997155618445,0.0449345249904682 +bird,bird,north,,,AMRO,Marsh,5,0.0392767096207199,0.0328128946987339,0.0419496871256143,0.0373953778596444 +bird,bird,north,,,AMRO,RoughP,5,0.0476529109883208,0.0370484800150533,0.0551260730079365,0.0586748398142023 +bird,bird,north,,,AMRO,TameP,5,0.0871570866610334,0.0686940179922636,0.0973743419031704,0.093809510937141 +bird,bird,north,,,AMRO,Crop,5,0.0573284903957228,0.0461482956997512,0.0646286436183915,0.0573284903957228 +bird,bird,north,,,AMRO,Industrial,5,0.0681043756959013,0.0645858296130797,0.0783275748453609,0.068858325809443 +bird,bird,north,,,AMRO,Mine,5,0.0596252847349992,0.0479249607958036,0.0630272264574224,0.0571066445731846 +bird,bird,north,,,AMRO,Rural,5,0.103581958984342,0.0907651727692093,0.10667546752033,0.103991752717406 +bird,bird,north,,,AMRO,Urban,5,0.0835908645318652,0.06842707474027,0.094462872178352,0.0715132167229806 +bird,bird,north,,,AMRO,CCSpruceR,5,0.0468145880701099,0.045654272611768,0.0538457656883563,0.0453188467712704 +bird,bird,north,,,AMRO,CCSpruce1,5,0.0402736104787464,0.0384616639181239,0.0494927799571566,0.0396438726329562 +bird,bird,north,,,AMRO,CCSpruce2,5,0.0307150089765487,0.0304334781693119,0.0349723653941306,0.030662079950808 +bird,bird,north,,,AMRO,CCSpruce3,5,0.0307150089765487,0.0297864060232559,0.0343823622234542,0.0296773094799221 +bird,bird,north,,,AMRO,CCSpruce4,5,0.0307150089765487,0.0295389018483663,0.0342431206709587,0.0293884301332627 +bird,bird,north,,,AMRO,CCPineR,5,0.0553258550850216,0.0538567213244314,0.058293013846362,0.0541637556145509 +bird,bird,north,,,AMRO,CCPine1,5,0.0470819397449997,0.0419639678398675,0.0535310423485348,0.0416967147876077 +bird,bird,north,,,AMRO,CCPine2,5,0.0364713907473729,0.0320098990768294,0.0382777256944494,0.0322498262049413 +bird,bird,north,,,AMRO,CCPine3,5,0.0360743773433313,0.0313291457476507,0.0377305959217591,0.0312140622714841 +bird,bird,north,,,AMRO,CCPine4,5,0.0360743773433313,0.031068823201108,0.0375798619818308,0.0309102241516008 +bird,bird,north,,,AMRO,CCDecidR,5,0.049772334942455,0.048632533949495,0.0556724839703326,0.0527581026990359 +bird,bird,north,,,AMRO,CCDecid1,5,0.038478792416282,0.0352221061937245,0.0457910619754098,0.0377855269592502 +bird,bird,north,,,AMRO,CCDecid2,5,0.0321866741194222,0.0307210810673669,0.0358718868586826,0.0315066075455133 +bird,bird,north,,,AMRO,CCDecid3,5,0.0321866741194222,0.0303163234410299,0.0354783192915802,0.0304947134796708 +bird,bird,north,,,AMRO,CCDecid4,5,0.0321866741194222,0.0299857475339876,0.0336015222263169,0.0299692966617956 +bird,bird,north,,,AMRO,CCMixedwoodR,5,0.0545576984992374,0.0513229146847854,0.0585075335743266,0.0591581517099264 +bird,bird,north,,,AMRO,CCMixedwood1,5,0.0431304293764813,0.0388098143461847,0.0489523732924516,0.0431304293764813 +bird,bird,north,,,AMRO,CCMixedwood2,5,0.0359633336091825,0.03388323283888,0.0376278083799636,0.0359633336091825 +bird,bird,north,,,AMRO,CCMixedwood3,5,0.0351898891530741,0.0335140696896582,0.0371604608127508,0.0348083033884748 +bird,bird,north,,,AMRO,CCMixedwood4,5,0.0342559672568581,0.0331528742702994,0.03605715386661,0.0342085644201385 +bird,bird,north,,,AMRO,ShrubbySwamp,5,0.0496591017325412,0.042861184291265,0.0551394397712599,0.0440443632715341 +bird,bird,north,,,AMRO,ShrubbyBog,5,0.0727490278097721,0.0313349231255729,0.0813576619885991,0.0761058124115116 +bird,bird,north,,,AMRO,ShrubbyFen,5,0.0427087834941854,0.0348342348306046,0.0448704121045177,0.0375338149823669 +bird,bird,north,,,AMRO,TreedSwamp,5,0.0328848718821178,0.0306190412094486,0.038519157698852,0.0317395218236918 +bird,bird,north,,,YEWA,SpruceR,5,0.0152872571687464,0.013485768713144,0.0161859905727812,0.0132378729656954 +bird,bird,north,,,YEWA,Spruce1,5,0.0161989293452335,0.0141785908075145,0.0166991104164551,0.0153407701002385 +bird,bird,north,,,YEWA,Spruce2,5,0.0153482944056184,0.0134422792322075,0.0163125707235945,0.0139740634811439 +bird,bird,north,,,YEWA,Spruce3,5,0.0153482944056184,0.0134422792322075,0.0163125707235945,0.0139740634811439 +bird,bird,north,,,YEWA,Spruce4,5,0.0154747518740089,0.0134422792322075,0.0163445361151842,0.0139740634811439 +bird,bird,north,,,YEWA,Spruce5,5,0.0147676991756156,0.0134179465002903,0.0159157956150026,0.0139132316513509 +bird,bird,north,,,YEWA,Spruce6,5,0.0147676991756156,0.0131538234674593,0.015692702740968,0.0137479186969233 +bird,bird,north,,,YEWA,Spruce7,5,0.0147676991756156,0.0131538234674593,0.015692702740968,0.0137479186969233 +bird,bird,north,,,YEWA,Spruce8,5,0.0147676991756156,0.0131538234674593,0.015692702740968,0.0137479186969233 +bird,bird,north,,,YEWA,PineR,5,0.0138475701618737,0.0132837576175213,0.0146094648346949,0.0132378729656954 +bird,bird,north,,,YEWA,Pine1,5,0.0152581809758663,0.0136067546966292,0.0153818216695528,0.0153407701002385 +bird,bird,north,,,YEWA,Pine2,5,0.0146439135337287,0.013156096597089,0.0151639499496742,0.0139740634811439 +bird,bird,north,,,YEWA,Pine3,5,0.0146439135337287,0.013156096597089,0.0151639499496742,0.0139740634811439 +bird,bird,north,,,YEWA,Pine4,5,0.014719421735982,0.013156096597089,0.0152127130535153,0.0139740634811439 +bird,bird,north,,,YEWA,Pine5,5,0.0142022195778863,0.0131317638651718,0.0149167883474754,0.0139132316513509 +bird,bird,north,,,YEWA,Pine6,5,0.0139569542170639,0.0128748566791004,0.0148065934814583,0.0137479186969233 +bird,bird,north,,,YEWA,Pine7,5,0.0139569542170639,0.0128748566791004,0.0148065934814583,0.0137479186969233 +bird,bird,north,,,YEWA,Pine8,5,0.0139569542170639,0.0128748566791004,0.0148065934814583,0.0137479186969233 +bird,bird,north,,,YEWA,DecidR,5,0.0675703241745523,0.0627767161006736,0.0702938844714476,0.0669041419573578 +bird,bird,north,,,YEWA,Decid1,5,0.0624217660583599,0.0575689854916319,0.0693836570512203,0.0624217660583599 +bird,bird,north,,,YEWA,Decid2,5,0.0571464094151976,0.0537808223830891,0.0594129800782725,0.0560005592464258 +bird,bird,north,,,YEWA,Decid3,5,0.0562948830841368,0.0537808223830891,0.0594129800782725,0.0560005592464258 +bird,bird,north,,,YEWA,Decid4,5,0.0567587071554002,0.0537808223830891,0.0595978658576664,0.0560005592464258 +bird,bird,north,,,YEWA,Decid5,5,0.0557567778657997,0.0530467428577415,0.0574413498371294,0.0557567778657997 +bird,bird,north,,,YEWA,Decid6,5,0.055094292117748,0.0522555082978965,0.0565812574287855,0.055094292117748 +bird,bird,north,,,YEWA,Decid7,5,0.055094292117748,0.0522555082978965,0.0565812574287855,0.055094292117748 +bird,bird,north,,,YEWA,Decid8,5,0.055094292117748,0.0522555082978965,0.0565812574287855,0.055094292117748 +bird,bird,north,,,YEWA,MixedwoodR,5,0.0263294278018144,0.0246051909455581,0.0304898931454611,0.0240150096029797 +bird,bird,north,,,YEWA,Mixedwood1,5,0.0280756504366122,0.026422361262982,0.0322980776714608,0.0278299045646552 +bird,bird,north,,,YEWA,Mixedwood2,5,0.027417472317543,0.0249167055783023,0.0300620807411239,0.024967095899502 +bird,bird,north,,,YEWA,Mixedwood3,5,0.027417472317543,0.0249167055783023,0.0300620807411239,0.024967095899502 +bird,bird,north,,,YEWA,Mixedwood4,5,0.0276433700001986,0.0249167055783023,0.0301214903483995,0.024967095899502 +bird,bird,north,,,YEWA,Mixedwood5,5,0.0265320313011314,0.0248682903628286,0.0293579534222626,0.0248584092508237 +bird,bird,north,,,YEWA,Mixedwood6,5,0.0260394400604634,0.0240411602226299,0.0289452390521485,0.0238981297326253 +bird,bird,north,,,YEWA,Mixedwood7,5,0.0260394400604634,0.0240411602226299,0.0289452390521485,0.0238981297326253 +bird,bird,north,,,YEWA,Mixedwood8,5,0.0260394400604634,0.0240411602226299,0.0289452390521485,0.0238981297326253 +bird,bird,north,,,YEWA,TreedBogR,5,0.0138475701618737,0.0130463040151519,0.0152564328925531,0.0132378729656954 +bird,bird,north,,,YEWA,TreedBog1,5,0.0152581809758663,0.0136067546966292,0.0153818216695528,0.0153407701002385 +bird,bird,north,,,YEWA,TreedBog2,5,0.0146439135337287,0.013156096597089,0.0151639499496742,0.0139740634811439 +bird,bird,north,,,YEWA,TreedBog3,5,0.0146439135337287,0.013156096597089,0.0151639499496742,0.0139740634811439 +bird,bird,north,,,YEWA,TreedBog4,5,0.014719421735982,0.013156096597089,0.0152127130535153,0.0139740634811439 +bird,bird,north,,,YEWA,TreedBog5,5,0.0142022195778863,0.0131317638651718,0.0149167883474754,0.0139132316513509 +bird,bird,north,,,YEWA,TreedBog6,5,0.0139569542170639,0.0128748566791004,0.0148065934814583,0.0137479186969233 +bird,bird,north,,,YEWA,TreedBog7,5,0.0139569542170639,0.0128748566791004,0.0148065934814583,0.0137479186969233 +bird,bird,north,,,YEWA,TreedBog8,5,0.0139569542170639,0.0128748566791004,0.0148065934814583,0.0137479186969233 +bird,bird,north,,,YEWA,TreedFenR,5,0.0143994539104511,0.0130463040151519,0.0149635734022189,0.0132378729656954 +bird,bird,north,,,YEWA,TreedFen1,5,0.0152581809758663,0.0136841747096025,0.0153818216695528,0.0153407701002385 +bird,bird,north,,,YEWA,TreedFen2,5,0.0147960908005419,0.013156096597089,0.0151804990559222,0.0139740634811439 +bird,bird,north,,,YEWA,TreedFen3,5,0.0147960908005419,0.013156096597089,0.0151804990559222,0.0139740634811439 +bird,bird,north,,,YEWA,TreedFen4,5,0.0149139697676838,0.013156096597089,0.0152127130535153,0.0139740634811439 +bird,bird,north,,,YEWA,TreedFen5,5,0.0143899316982559,0.0131317638651718,0.0149167883474754,0.0139132316513509 +bird,bird,north,,,YEWA,TreedFen6,5,0.0141414246412548,0.0128748566791004,0.0148065934814583,0.0137479186969233 +bird,bird,north,,,YEWA,TreedFen7,5,0.0141414246412548,0.0128748566791004,0.0148065934814583,0.0137479186969233 +bird,bird,north,,,YEWA,TreedFen8,5,0.0141414246412548,0.0128748566791004,0.0148065934814583,0.0137479186969233 +bird,bird,north,,,YEWA,GrassHerb,5,0.0367871900949649,0.0319836781606581,0.0768703748446776,0.0805944500301814 +bird,bird,north,,,YEWA,Shrub,5,0.0469869470845307,0.037642645627196,0.0536840486693118,0.0354415666356709 +bird,bird,north,,,YEWA,GraminoidFen,5,0.127521863595948,0.0739459105238275,0.25620629493653,0.127521863595948 +bird,bird,north,,,YEWA,Marsh,5,0.0662234795872427,0.0478838559733553,0.0998299868064359,0.0578083613563495 +bird,bird,north,,,YEWA,RoughP,5,0.0373939721353436,0.0337037577934417,0.0813577557002738,0.0673054145048082 +bird,bird,north,,,YEWA,TameP,5,0.0508152380210474,0.0497054248632837,0.0734386793616989,0.0494329351251097 +bird,bird,north,,,YEWA,Crop,5,0.0574125675380455,0.0487154446695811,0.0594750566185999,0.0511966478737243 +bird,bird,north,,,YEWA,Industrial,5,0.0231696674729654,0.018426259656728,0.0235045426217119,0.0165147767141114 +bird,bird,north,,,YEWA,Mine,5,0.0269432765757595,0.0250861435464223,0.0374450021319256,0.0337755961361192 +bird,bird,north,,,YEWA,Rural,5,0.123469877699348,0.0535065155989647,0.141447812861101,0.084075275040328 +bird,bird,north,,,YEWA,Urban,5,0.0192222493594217,0.0172614307419107,0.0247652871936472,0.0171371473558299 +bird,bird,north,,,YEWA,CCSpruceR,5,0.0152239296134922,0.0135727920222479,0.015795186262839,0.0132378729656954 +bird,bird,north,,,YEWA,CCSpruce1,5,0.0154527778412633,0.0143048510250552,0.0165928367367206,0.0153407701002385 +bird,bird,north,,,YEWA,CCSpruce2,5,0.0152262261077599,0.0134422792322075,0.0162525827608746,0.0139740634811439 +bird,bird,north,,,YEWA,CCSpruce3,5,0.0152262261077599,0.0134422792322075,0.0162525827608746,0.0139740634811439 +bird,bird,north,,,YEWA,CCSpruce4,5,0.0153047368800238,0.0134422792322075,0.0163031657482308,0.0139740634811439 +bird,bird,north,,,YEWA,CCPineR,5,0.0135622141599601,0.0132324096609,0.0146094648346949,0.0132378729656954 +bird,bird,north,,,YEWA,CCPine1,5,0.0152581809758663,0.0134666580025676,0.0153818216695528,0.0153407701002385 +bird,bird,north,,,YEWA,CCPine2,5,0.0146439135337287,0.013156096597089,0.0151639499496742,0.0139740634811439 +bird,bird,north,,,YEWA,CCPine3,5,0.0146439135337287,0.013156096597089,0.0151639499496742,0.0139740634811439 +bird,bird,north,,,YEWA,CCPine4,5,0.014719421735982,0.013156096597089,0.0152127130535153,0.0139740634811439 +bird,bird,north,,,YEWA,CCDecidR,5,0.0662117965045502,0.0623017143622268,0.0689763929386388,0.0643030870822108 +bird,bird,north,,,YEWA,CCDecid1,5,0.0599949740217044,0.0581029647442007,0.0675476795975803,0.0599949740217044 +bird,bird,north,,,YEWA,CCDecid2,5,0.0571464094151976,0.0529099613369571,0.0588195600318472,0.0538234066310957 +bird,bird,north,,,YEWA,CCDecid3,5,0.0562948830841368,0.0529099613369571,0.0588195600318472,0.0538234066310957 +bird,bird,north,,,YEWA,CCDecid4,5,0.0567587071554002,0.0532660337361667,0.0589652399644434,0.0547135876291197 +bird,bird,north,,,YEWA,CCMixedwoodR,5,0.0263294278018144,0.02453083432659,0.0294213209258698,0.0236242893789497 +bird,bird,north,,,YEWA,CCMixedwood1,5,0.0280756504366122,0.0264812984750028,0.0314548885696658,0.0273771166321912 +bird,bird,north,,,YEWA,CCMixedwood2,5,0.027417472317543,0.0246897760459168,0.029859840979945,0.0245608853893041 +bird,bird,north,,,YEWA,CCMixedwood3,5,0.027417472317543,0.0246897760459168,0.029859840979945,0.0245608853893041 +bird,bird,north,,,YEWA,CCMixedwood4,5,0.0276433700001986,0.0249167055783023,0.0299182077812278,0.024967095899502 +bird,bird,north,,,YEWA,ShrubbySwamp,5,0.0900247498619701,0.0628267175043494,0.130005469712865,0.0900247498619701 +bird,bird,north,,,YEWA,ShrubbyBog,5,0.0169638510546651,0.0150384231160003,0.0210515550630399,0.0169638510546651 +bird,bird,north,,,YEWA,ShrubbyFen,5,0.0605390113157542,0.0489000013969567,0.0829598355559298,0.0605390113157542 +bird,bird,north,,,YEWA,TreedSwamp,5,0.0445275398629097,0.0374072442508359,0.0525760300007124,0.0375916409761282 +bird,bird,south,,,AMRO,Loamy,5,0.0330303668254875,0.0246132930514146,0.0450293469478869,0.0356853516419985 +bird,bird,south,,,AMRO,Blowout,5,0.021088585697176,0.0173033888989037,0.0286221208950264,0.0221952093067217 +bird,bird,south,,,AMRO,ClaySub,5,0.0318713944339486,0.0273265130205711,0.0435182907807985,0.0329098509470428 +bird,bird,south,,,AMRO,Crop,5,0.0340033237102159,0.0317672668511563,0.0518819514292931,0.0394476530456092 +bird,bird,south,,,AMRO,Industrial,5,0.0585961696911928,0.0407932596782024,0.0967069032543936,0.0504188566426269 +bird,bird,south,,,AMRO,Mine,5,0.0433708543134233,0.0279654941161151,0.0922365244387607,0.0433708543134233 +bird,bird,south,,,AMRO,Other,5,0.0279130028226513,0.0208330528511193,0.032413626035389,0.0306589561513613 +bird,bird,south,,,AMRO,RapidDrain,5,0.0324169843045222,0.0286422650259653,0.0477446779451451,0.0380039278541435 +bird,bird,south,,,AMRO,RoughP,5,0.0228337535993323,0.0201215473942389,0.0316719043853148,0.0239282230521284 +bird,bird,south,,,AMRO,Rural,5,0.126410048161514,0.0906012519863266,0.176379447147091,0.127891983240797 +bird,bird,south,,,AMRO,SandyLoam,5,0.025042122546936,0.0214670384913766,0.0343658213178494,0.0276333618334017 +bird,bird,south,,,AMRO,SoilUnknown,5,0.0324496974133814,0.0256774415378297,0.049880608571366,0.0324496974133814 +bird,bird,south,,,AMRO,TameP,5,0.0356803988551642,0.0313829377593096,0.0552869938175378,0.0441765473945761 +bird,bird,south,,,AMRO,ThinBreak,5,0.039889274062052,0.034628443634563,0.0719999158707882,0.0392330475321601 +bird,bird,south,,,AMRO,Urban,5,0.142679018123273,0.113540926398101,0.22174675340104,0.142679018123273 +bird,bird,south,,,AMRO,Water,5,0.0953303189529314,0.0776377301804561,0.169049654726582,0.0920114906643601 +bird,bird,south,,,AMRO,Wellsites,5,0.0307302023824335,0.022594376238097,0.0492804951485044,0.0307302023824335 +bird,bird,south,,,YEWA,Loamy,5,0.0323777440375111,0.00955829503412574,0.131862420956728,0.0323777440375111 +bird,bird,south,,,YEWA,Blowout,5,0.0187270539268139,0.00630915767428754,0.0873903038436509,0.0187270539268139 +bird,bird,south,,,YEWA,ClaySub,5,0.0246186169686955,0.00822451241360055,0.0943919064117695,0.0246186169686955 +bird,bird,south,,,YEWA,Crop,5,0.017805705629003,0.00630915767428754,0.0873903038436509,0.017805705629003 +bird,bird,south,,,YEWA,Industrial,5,0.0209284382916916,0.00885117031734984,0.0896085806255624,0.0209284382916916 +bird,bird,south,,,YEWA,Mine,5,0.0444012010339026,0.0138456974462655,0.170585969762671,0.0444012010339026 +bird,bird,south,,,YEWA,Other,5,0.0336836299530274,0.00744409109190419,0.0823063460016796,0.0336836299530274 +bird,bird,south,,,YEWA,RapidDrain,5,0.0232435250881236,0.0078807868904486,0.0848844514363777,0.0232435250881236 +bird,bird,south,,,YEWA,RoughP,5,0.0201905740018633,0.00806971313607099,0.0727806828596159,0.0201905740018633 +bird,bird,south,,,YEWA,Rural,5,0.0244718795634426,0.00772287119105236,0.0836563883453448,0.0244718795634426 +bird,bird,south,,,YEWA,SandyLoam,5,0.0187690416244235,0.00638334099008439,0.0866261245673264,0.0187690416244235 +bird,bird,south,,,YEWA,SoilUnknown,5,0.0422572300082502,0.0144091300276581,0.0779063901484553,0.0422572300082502 +bird,bird,south,,,YEWA,TameP,5,0.0211657180120173,0.00623494395130275,0.0946726209245148,0.0211657180120173 +bird,bird,south,,,YEWA,ThinBreak,5,0.063840137540605,0.0219518119596434,0.322155592907038,0.063840137540605 +bird,bird,south,,,YEWA,Urban,5,0.0229978460411723,0.00689224987091747,0.0802358087203735,0.0229978460411723 +bird,bird,south,,,YEWA,Water,5,0.0258189921773528,0.00983857788675398,0.118016907827257,0.0258189921773528 +bird,bird,south,,,YEWA,Wellsites,5,0.0342200922325948,0.00919345730088931,0.120879962963517,0.0342200922325948 +bryophyte,bryophyte,north,,,Bryum.All,WhiteSpruce,5,0.31052610327228,0.248338396936217,0.336707388819424,0.31052610327228 +bryophyte,bryophyte,north,,,Bryum.All,Pine,5,0.230896057266559,0.201539861550839,0.257970760380322,0.238179472885008 +bryophyte,bryophyte,north,,,Bryum.All,Deciduous,5,0.299897959549428,0.249705887038526,0.340561918896338,0.299897959549428 +bryophyte,bryophyte,north,,,Bryum.All,Mixedwood,5,0.270844800165529,0.216204794009057,0.336421739102282,0.299897959549428 +bryophyte,bryophyte,north,,,Bryum.All,BlackSpruce,5,0.249755271611689,0.201937462499991,0.282882832099293,0.249755271611689 +bryophyte,bryophyte,north,,,Bryum.All,TreedFen,5,0.28542998008965,0.267678022557783,0.307770559983566,0.28542998008965 +bryophyte,bryophyte,north,,,Bryum.All,TreedSwamp,5,0.385968264421163,0.312920073721417,0.507687926665553,0.379312837038535 +bryophyte,bryophyte,north,,,Bryum.All,GraminoidFen,5,0.288431356317159,0.261305311033378,0.308274580487677,0.288431356317159 +bryophyte,bryophyte,north,,,Bryum.All,ShrubbyFen,5,0.337122721672387,0.279923429381735,0.375347800127838,0.289427389318102 +bryophyte,bryophyte,north,,,Bryum.All,ShrubbyBog,5,0.243845791018471,0.188891968355952,0.278167734708803,0.249755271611689 +bryophyte,bryophyte,north,,,Bryum.All,ShrubbySwamp,5,0.365585039270526,0.322127823272831,0.486835001159126,0.342314571401646 +bryophyte,bryophyte,north,,,Bryum.All,Marsh,5,0.258133844490492,0.232880042141218,0.28866312642649,0.276451114636988 +bryophyte,bryophyte,north,,,Bryum.All,Shrub,5,0.511760114579579,0.475673809179853,0.541572307155453,0.465299344833059 +bryophyte,bryophyte,north,,,Bryum.All,Grass,5,0.455089495341485,0.445945652452891,0.488540544028664,0.462024415092747 +bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruceR,5,0.438745026372702,0.355667206932491,0.51747149801794,0.390821903625069 +bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce1,5,0.410076213396168,0.36321346289653,0.503403710429919,0.410076213396168 +bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce2,5,0.508475878316926,0.401426445425866,0.617152865233015,0.451482229642779 +bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce3,5,0.508475878316926,0.401426445425866,0.617152865233015,0.451482229642779 +bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce4,5,0.508475878316926,0.401426445425866,0.617152865233015,0.451482229642779 +bryophyte,bryophyte,north,,,Bryum.All,CCPineR,5,0.412128914188184,0.355667206932491,0.443263730796442,0.390821903625069 +bryophyte,bryophyte,north,,,Bryum.All,CCPine1,5,0.390821903625069,0.333483847923572,0.490918114219784,0.390821903625069 +bryophyte,bryophyte,north,,,Bryum.All,CCPine2,5,0.390821903625069,0.333483847923572,0.471936338254226,0.390821903625069 +bryophyte,bryophyte,north,,,Bryum.All,CCPine3,5,0.390821903625069,0.333483847923572,0.471936338254226,0.390821903625069 +bryophyte,bryophyte,north,,,Bryum.All,CCPine4,5,0.390821903625069,0.333483847923572,0.471936338254226,0.390821903625069 +bryophyte,bryophyte,north,,,Bryum.All,CCDeciduousR,5,0.3545233293023,0.340961454275766,0.401849015007629,0.353793902874269 +bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous1,5,0.377647378614244,0.344523367153784,0.481806035488891,0.377647378614244 +bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous2,5,0.311505084119227,0.273440313742051,0.398615691230809,0.353793902874269 +bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous3,5,0.311505084119227,0.273440313742051,0.398615691230809,0.353793902874269 +bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous4,5,0.311505084119227,0.273440313742051,0.398615691230809,0.353793902874269 +bryophyte,bryophyte,north,,,Bryum.All,CCMixedwoodR,5,0.3545233293023,0.340961454275766,0.401849015007629,0.353793902874269 +bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood1,5,0.377647378614244,0.344523367153784,0.481806035488891,0.377647378614244 +bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood2,5,0.311505084119227,0.273440313742051,0.398615691230809,0.353793902874269 +bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood3,5,0.311505084119227,0.273440313742051,0.398615691230809,0.353793902874269 +bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood4,5,0.311505084119227,0.273440313742051,0.398615691230809,0.353793902874269 +bryophyte,bryophyte,north,,,Bryum.All,EnSeismic,5,0.341097356242628,0.254339326663875,0.382216705326462,0.359661940947613 +bryophyte,bryophyte,north,,,Bryum.All,EnSoftLin,5,0.426391247147487,0.394942557841774,0.445875722634301,0.421818669082998 +bryophyte,bryophyte,north,,,Bryum.All,TrSoftLin,5,0.386737032554824,0.265097009604921,0.458173565900464,0.386737032554824 +bryophyte,bryophyte,north,,,Bryum.All,HardLin,5,0.323072649069623,0.293407622711147,0.416473308213662,0.323072649069623 +bryophyte,bryophyte,north,,,Bryum.All,UrbInd,5,0.424027704910845,0.381663846244751,0.463627616313242,0.399416906097742 +bryophyte,bryophyte,north,,,Bryum.All,Wellsites,5,0.361293473135619,0.31554373807671,0.420742079367555,0.322173892143649 +bryophyte,bryophyte,north,,,Bryum.All,Crop,5,0.290782059818433,0.267062277753391,0.34063179003052,0.285993724435061 +bryophyte,bryophyte,north,,,Bryum.All,TameP,5,0.404746251805957,0.346962846238019,0.481020108462059,0.36532086124143 +bryophyte,bryophyte,north,,,Bryum.All,RoughP,5,0.436471197253669,0.367166435228872,0.524716833594427,0.359834899806343 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,WhiteSpruce,5,0.251591937433264,0.19328280334971,0.29754847866803,0.319776969895412 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Pine,5,0.25442905967516,0.207735305986921,0.301106271785144,0.300217413697282 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Deciduous,5,0.247607125855898,0.211625878068664,0.286984690369508,0.305614800703084 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Mixedwood,5,0.276949471099766,0.218766636289073,0.298700970564076,0.305614800703084 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,BlackSpruce,5,0.172094265429733,0.152533139774685,0.21423892964757,0.229117543296424 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,TreedFen,5,0.186901168373081,0.149288135342749,0.225428671383715,0.248756242772099 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,TreedSwamp,5,0.252021427357509,0.166065027674746,0.267810054333897,0.261376708052281 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,GraminoidFen,5,0.198085627837465,0.157142321184557,0.283883462130525,0.26732140886329 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,ShrubbyFen,5,0.208533596077771,0.157167384430436,0.257533680773337,0.256461346102025 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,ShrubbyBog,5,0.182349056567479,0.163531481068247,0.212556808099928,0.230953876004402 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,ShrubbySwamp,5,0.223528109605295,0.149138005720763,0.250584515752217,0.2536134546523 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Marsh,5,0.22228072784748,0.168620881682535,0.241858086991686,0.250063994783192 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Shrub,5,0.389503190030972,0.320960444751684,0.448650044782782,0.44894769329765 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Grass,5,0.428284581743718,0.374366055130338,0.457199281432459,0.451204171652615 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruceR,5,0.530331249227848,0.491517829025308,0.568628662224273,0.561769401366854 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce1,5,0.473700459331479,0.407758990464968,0.529762260621459,0.561769401366854 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce2,5,0.565706576549555,0.544873249991517,0.577412027160795,0.580219043404069 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce3,5,0.565706576549555,0.544873249991517,0.577412027160795,0.580219043404069 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce4,5,0.565706576549555,0.544873249991517,0.577412027160795,0.580219043404069 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPineR,5,0.530331249227848,0.469339100269507,0.568628662224273,0.561769401366854 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine1,5,0.576477975210023,0.517401061347545,0.618584653615194,0.610401546827348 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine2,5,0.580568836679176,0.512283566749051,0.626511408106236,0.628158974750111 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine3,5,0.580568836679176,0.512283566749051,0.626511408106236,0.628158974750111 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine4,5,0.580568836679176,0.512283566749051,0.626511408106236,0.628158974750111 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduousR,5,0.514179795355911,0.460394976449055,0.543235458278474,0.554666644352137 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous1,5,0.521363617640473,0.489165762731297,0.549095286648067,0.540760634909747 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous2,5,0.488937533270703,0.421362183597221,0.53489185261304,0.540760634909747 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous3,5,0.488937533270703,0.421362183597221,0.53489185261304,0.540760634909747 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous4,5,0.488937533270703,0.421362183597221,0.53489185261304,0.540760634909747 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwoodR,5,0.514179795355911,0.460394976449055,0.543235458278474,0.554666644352137 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood1,5,0.521363617640473,0.489165762731297,0.549095286648067,0.540760634909747 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood2,5,0.488937533270703,0.421362183597221,0.53489185261304,0.540760634909747 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood3,5,0.488937533270703,0.421362183597221,0.53489185261304,0.540760634909747 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood4,5,0.488937533270703,0.421362183597221,0.53489185261304,0.540760634909747 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,EnSeismic,5,0.268196524768211,0.192667243771779,0.340326477131138,0.268196524768211 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,EnSoftLin,5,0.244367475533093,0.215342705344895,0.2869525867514,0.286080607309579 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,TrSoftLin,5,0.235180164284642,0.199569465204302,0.271701707407358,0.263190120831396 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,HardLin,5,0.207740633319783,0.165745519163095,0.245334290325378,0.248342842340082 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,UrbInd,5,0.248167225413181,0.216158769538292,0.276453619429614,0.294363832011227 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Wellsites,5,0.241368099314559,0.204081781790476,0.285621981421162,0.30357975402055 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Crop,5,0.153338330749787,0.125166497619391,0.187155651429452,0.203373038350339 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,TameP,5,0.2360577788098,0.15146756653851,0.278805743751533,0.293635365377072 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,RoughP,5,0.248101456253159,0.17939976633513,0.28974907017417,0.304637156738226 +bryophyte,bryophyte,south,,,Bryum.All,Loamy,5,0.416120093876595,0.37588141337936,0.645006923204712,0.365260102242254 +bryophyte,bryophyte,south,,,Bryum.All,SandyLoam,5,0.619490321907823,0.571842714254661,0.80979481401128,0.607423905307247 +bryophyte,bryophyte,south,,,Bryum.All,ClaySub,5,0.436094713078908,0.368859588919056,0.633860185031799,0.371820192793253 +bryophyte,bryophyte,south,,,Bryum.All,RapidDrain,5,0.456977920971507,0.350656462997717,0.602047684045733,0.357347445845226 +bryophyte,bryophyte,south,,,Bryum.All,Blowout,5,0.607668074509399,0.523747808515383,0.70418139924581,0.512755733192383 +bryophyte,bryophyte,south,,,Bryum.All,ThinBreak,5,0.276421207240453,0.234243734811806,0.553558265823947,0.263177360284511 +bryophyte,bryophyte,south,,,Bryum.All,Other,5,0.41264588487935,0.327198320518323,0.635082952307308,0.360344017110773 +bryophyte,bryophyte,south,,,Bryum.All,EnSeismic,5,0.522319000857861,0.399218908081566,0.636854296953491,0.408965070806465 +bryophyte,bryophyte,south,,,Bryum.All,EnSoftLin,5,0.542366306552096,0.418673824797896,0.667261504642721,0.408965070806465 +bryophyte,bryophyte,south,,,Bryum.All,TrSoftLin,5,0.582058216553865,0.467952449741473,0.716189011332954,0.495720932725553 +bryophyte,bryophyte,south,,,Bryum.All,HardLin,5,0.391764572829346,0.378724568424972,0.661286858593419,0.373724056414033 +bryophyte,bryophyte,south,,,Bryum.All,UrbInd,5,0.320657317261889,0.291719628629963,0.523915516885558,0.320657317261889 +bryophyte,bryophyte,south,,,Bryum.All,Wellsites,5,0.340618063070173,0.31404505067305,0.50823297134187,0.308138000510144 +bryophyte,bryophyte,south,,,Bryum.All,Crop,5,0.255711828549599,0.191335491740303,0.359969290806234,0.215818605966159 +bryophyte,bryophyte,south,,,Bryum.All,TameP,5,0.505439556859908,0.396113322424557,0.636140218067136,0.423763233141184 +bryophyte,bryophyte,south,,,Bryum.All,RoughP,5,0.310286393711026,0.279902944450483,0.51172852986617,0.307590528971142 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,Loamy,5,0.132569583210694,0.12376990951612,0.1681332339599,0.175508505383722 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,SandyLoam,5,0.180935722809544,0.143219232348468,0.247499568755017,0.180935722809544 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,ClaySub,5,0.0955502752062349,0.0835228695470458,0.115430005478976,0.125560259747383 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,RapidDrain,5,0.170316515598064,0.134787163637048,0.189478331248127,0.170316515598064 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,Blowout,5,0.331650705809394,0.263483183452409,0.41683746363425,0.331650705809394 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,ThinBreak,5,0.088992793864096,0.0683983631632044,0.11144869687598,0.120320619518073 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,Other,5,0.116827949140509,0.104568234119555,0.136377233935107,0.147914160622709 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,EnSeismic,5,0.184777604878253,0.133157157553358,0.256182600941271,0.184777604878253 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,EnSoftLin,5,0.18960176284805,0.133729653510496,0.231746869378038,0.18960176284805 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,TrSoftLin,5,0.178923569445442,0.143210461378198,0.250163725219165,0.19463526295952 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,HardLin,5,0.103319417802398,0.0907655995972361,0.194337035061578,0.156877644728103 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,UrbInd,5,0.112373845753338,0.0780567564927782,0.136399538594886,0.148163843735697 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,Wellsites,5,0.148163843735697,0.114501331647299,0.199664316467067,0.148163843735697 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,Crop,5,0.0574193192396884,0.0479531340586393,0.0718040855803864,0.0794498699370868 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,TameP,5,0.15395519000634,0.143956590463813,0.196722867254869,0.142118670690943 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,RoughP,5,0.123737028722151,0.114310856475943,0.138533337835175,0.142118670690943 +lichen,lichen,north,,,Cladonia.chlorophaea,WhiteSpruce,5,0.378528930185299,0.343164757264289,0.409303490973553,0.409882025815726 +lichen,lichen,north,,,Cladonia.chlorophaea,Pine,5,0.214810607241955,0.192805752220545,0.257069995687071,0.257936491915899 +lichen,lichen,north,,,Cladonia.chlorophaea,Deciduous,5,0.240752030744251,0.20912694966148,0.247964848974772,0.250552648638313 +lichen,lichen,north,,,Cladonia.chlorophaea,Mixedwood,5,0.228926035888583,0.211633374799085,0.242386877298821,0.228926035888583 +lichen,lichen,north,,,Cladonia.chlorophaea,BlackSpruce,5,0.36321132272695,0.338474435075031,0.436442696240511,0.345263346637588 +lichen,lichen,north,,,Cladonia.chlorophaea,TreedFen,5,0.43781321841701,0.410489851717659,0.499304260970258,0.405060810470343 +lichen,lichen,north,,,Cladonia.chlorophaea,TreedSwamp,5,0.549046514153994,0.518862336036897,0.565761450167424,0.515831477476504 +lichen,lichen,north,,,Cladonia.chlorophaea,GraminoidFen,5,0.224972190973397,0.197696523929581,0.283874625616325,0.224972190973397 +lichen,lichen,north,,,Cladonia.chlorophaea,ShrubbyFen,5,0.243466449821388,0.215332062382355,0.289114928666847,0.211312188596235 +lichen,lichen,north,,,Cladonia.chlorophaea,ShrubbyBog,5,0.128300015991666,0.0985187039908041,0.251831718971134,0.203711446078008 +lichen,lichen,north,,,Cladonia.chlorophaea,ShrubbySwamp,5,0.21987841922692,0.209467015915907,0.23444095326273,0.24383060534444 +lichen,lichen,north,,,Cladonia.chlorophaea,Marsh,5,0.123842492375801,0.100499634456034,0.151981623919593,0.131750839186132 +lichen,lichen,north,,,Cladonia.chlorophaea,Shrub,5,0.132890653452007,0.104814754672874,0.141912803133103,0.143902506854364 +lichen,lichen,north,,,Cladonia.chlorophaea,Grass,5,0.154319617074146,0.134870683039677,0.173461142584191,0.154319617074146 +lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruceR,5,0.151499118687363,0.0915366451455441,0.16845359000274,0.151499118687363 +lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce1,5,0.186353641165977,0.138373870189204,0.252181018717091,0.239508685584178 +lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce2,5,0.377534688726288,0.260167677273098,0.454098568949144,0.378784087287339 +lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce3,5,0.377534688726288,0.260167677273098,0.454098568949144,0.378784087287339 +lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce4,5,0.377534688726288,0.260167677273098,0.454098568949144,0.378784087287339 +lichen,lichen,north,,,Cladonia.chlorophaea,CCPineR,5,0.0750230500848066,0.0550091773940399,0.0982709743832956,0.105449853988483 +lichen,lichen,north,,,Cladonia.chlorophaea,CCPine1,5,0.271712589493789,0.238759144486381,0.304756548867243,0.319597789689957 +lichen,lichen,north,,,Cladonia.chlorophaea,CCPine2,5,0.290104622505058,0.237595089705377,0.311149584206335,0.307849799987954 +lichen,lichen,north,,,Cladonia.chlorophaea,CCPine3,5,0.290104622505058,0.237595089705377,0.311149584206335,0.307849799987954 +lichen,lichen,north,,,Cladonia.chlorophaea,CCPine4,5,0.290104622505058,0.237595089705377,0.311149584206335,0.307849799987954 +lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduousR,5,0.187574421192804,0.15733716136317,0.223723645176414,0.187574421192804 +lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous1,5,0.191782883865359,0.17123231215737,0.19758581884282,0.187574421192804 +lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous2,5,0.215834612686347,0.180622238731231,0.227416125679361,0.229118576454769 +lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous3,5,0.215834612686347,0.180622238731231,0.227416125679361,0.229118576454769 +lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous4,5,0.215834612686347,0.180622238731231,0.227416125679361,0.229118576454769 +lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwoodR,5,0.187574421192804,0.15733716136317,0.223723645176414,0.187574421192804 +lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood1,5,0.191782883865359,0.17123231215737,0.19758581884282,0.187574421192804 +lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood2,5,0.215834612686347,0.180622238731231,0.227416125679361,0.229118576454769 +lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood3,5,0.215834612686347,0.180622238731231,0.227416125679361,0.229118576454769 +lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood4,5,0.215834612686347,0.180622238731231,0.227416125679361,0.229118576454769 +lichen,lichen,north,,,Cladonia.chlorophaea,EnSeismic,5,0.121739756611421,0.0944249926684191,0.145465668153221,0.121739756611421 +lichen,lichen,north,,,Cladonia.chlorophaea,EnSoftLin,5,0.0884849561820664,0.0624884990818155,0.0977854819560458,0.0913365122199381 +lichen,lichen,north,,,Cladonia.chlorophaea,TrSoftLin,5,0.105602801323576,0.0757943177763908,0.131649653684006,0.105639976516185 +lichen,lichen,north,,,Cladonia.chlorophaea,HardLin,5,0.0532991681393098,0.0500648905532383,0.061074473783056,0.0650642476107745 +lichen,lichen,north,,,Cladonia.chlorophaea,UrbInd,5,0.0532991681393098,0.0499817131634582,0.0615848565365234,0.0650642476107745 +lichen,lichen,north,,,Cladonia.chlorophaea,Wellsites,5,0.0532991681393098,0.0499817131634582,0.0609767009879319,0.0650642476107745 +lichen,lichen,north,,,Cladonia.chlorophaea,Crop,5,0.0380044095359793,0.0341184540291455,0.0454004736227428,0.0460081436400004 +lichen,lichen,north,,,Cladonia.chlorophaea,TameP,5,0.0532991681393098,0.0528511343261779,0.0628169420376141,0.0650642476107745 +lichen,lichen,north,,,Cladonia.chlorophaea,RoughP,5,0.0532991681393098,0.0500648905532383,0.0628169420376141,0.0650642476107745 +lichen,lichen,north,,,Physcia.adscendens,WhiteSpruce,5,0.0806629600971171,0.0698994722058475,0.0866333146962459,0.0822000954374391 +lichen,lichen,north,,,Physcia.adscendens,Pine,5,0.0626159340188821,0.0570811905265671,0.0748186407434193,0.0714547700772653 +lichen,lichen,north,,,Physcia.adscendens,Deciduous,5,0.500089448767689,0.438222461763524,0.508535269344923,0.497979687375402 +lichen,lichen,north,,,Physcia.adscendens,Mixedwood,5,0.265269526065118,0.186373005275984,0.299702134864734,0.23822741546479 +lichen,lichen,north,,,Physcia.adscendens,BlackSpruce,5,0.0516397924145044,0.0483242273287214,0.0604606609752789,0.058549049308985 +lichen,lichen,north,,,Physcia.adscendens,TreedFen,5,0.0492807051069703,0.0470970183357062,0.0571078486023795,0.0564754268980052 +lichen,lichen,north,,,Physcia.adscendens,TreedSwamp,5,0.264332166092181,0.205485076993652,0.316781681540438,0.264332166092181 +lichen,lichen,north,,,Physcia.adscendens,GraminoidFen,5,0.111936676169408,0.0582126431029275,0.17425887927067,0.071855678171669 +lichen,lichen,north,,,Physcia.adscendens,ShrubbyFen,5,0.0549818690600283,0.0521383439087348,0.0633011429361176,0.0612276717910056 +lichen,lichen,north,,,Physcia.adscendens,ShrubbyBog,5,0.0524856406925512,0.049935694332593,0.0609962862836668,0.0598881125799547 +lichen,lichen,north,,,Physcia.adscendens,ShrubbySwamp,5,0.132036305569302,0.113451385792694,0.143177926984209,0.132036305569302 +lichen,lichen,north,,,Physcia.adscendens,Marsh,5,0.0659585953546897,0.0525497281122027,0.0713124398527733,0.0748629122971409 +lichen,lichen,north,,,Physcia.adscendens,Shrub,5,0.128475604166803,0.108330933618258,0.159954843138826,0.154369474824948 +lichen,lichen,north,,,Physcia.adscendens,Grass,5,0.183795602074123,0.168710801800108,0.201226759181919,0.207207009991177 +lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruceR,5,0.0408768378358444,0.0313317711922702,0.0558914917339861,0.0572556637143324 +lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce1,5,0.236777358748675,0.19180780861585,0.277591115395575,0.205104755449968 +lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce2,5,0.370744080718217,0.335806723827853,0.441342374887105,0.370744080718217 +lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce3,5,0.370744080718217,0.335806723827853,0.441342374887105,0.370744080718217 +lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce4,5,0.370744080718217,0.335806723827853,0.441342374887105,0.370744080718217 +lichen,lichen,north,,,Physcia.adscendens,CCPineR,5,0.0435966817775946,0.0348977738738095,0.057064038290726,0.0572556637143324 +lichen,lichen,north,,,Physcia.adscendens,CCPine1,5,0.0728828084245059,0.0498040266840263,0.0814788554074896,0.0816075246763179 +lichen,lichen,north,,,Physcia.adscendens,CCPine2,5,0.140955439826354,0.0729397389591036,0.196393912110452,0.153093914587714 +lichen,lichen,north,,,Physcia.adscendens,CCPine3,5,0.140955439826354,0.0729397389591036,0.196393912110452,0.153093914587714 +lichen,lichen,north,,,Physcia.adscendens,CCPine4,5,0.140955439826354,0.0729397389591036,0.196393912110452,0.153093914587714 +lichen,lichen,north,,,Physcia.adscendens,CCDeciduousR,5,0.181095023333984,0.132249215424742,0.206204938021702,0.210422112694386 +lichen,lichen,north,,,Physcia.adscendens,CCDeciduous1,5,0.267690593841598,0.240572859472401,0.301213097103537,0.261185107768382 +lichen,lichen,north,,,Physcia.adscendens,CCDeciduous2,5,0.220688225353536,0.18926200686686,0.282163359914917,0.220688225353536 +lichen,lichen,north,,,Physcia.adscendens,CCDeciduous3,5,0.220688225353536,0.18926200686686,0.282163359914917,0.220688225353536 +lichen,lichen,north,,,Physcia.adscendens,CCDeciduous4,5,0.220688225353536,0.18926200686686,0.282163359914917,0.220688225353536 +lichen,lichen,north,,,Physcia.adscendens,CCMixedwoodR,5,0.181095023333984,0.132249215424742,0.206204938021702,0.210422112694386 +lichen,lichen,north,,,Physcia.adscendens,CCMixedwood1,5,0.267690593841598,0.240572859472401,0.301213097103537,0.261185107768382 +lichen,lichen,north,,,Physcia.adscendens,CCMixedwood2,5,0.220688225353536,0.18926200686686,0.282163359914917,0.220688225353536 +lichen,lichen,north,,,Physcia.adscendens,CCMixedwood3,5,0.220688225353536,0.18926200686686,0.282163359914917,0.220688225353536 +lichen,lichen,north,,,Physcia.adscendens,CCMixedwood4,5,0.220688225353536,0.18926200686686,0.282163359914917,0.220688225353536 +lichen,lichen,north,,,Physcia.adscendens,EnSeismic,5,0.0583394560708704,0.0363880943275738,0.0633539998563236,0.0583394560708704 +lichen,lichen,north,,,Physcia.adscendens,EnSoftLin,5,0.058707620951148,0.0489130320224212,0.0773731260289573,0.058707620951148 +lichen,lichen,north,,,Physcia.adscendens,TrSoftLin,5,0.0495423079807509,0.0358957612064444,0.0521226681142616,0.0500921263173159 +lichen,lichen,north,,,Physcia.adscendens,HardLin,5,0.0752671644650605,0.069964335873053,0.0934517871592518,0.0733681504030698 +lichen,lichen,north,,,Physcia.adscendens,UrbInd,5,0.0854103497317977,0.0718138809056833,0.0912876639458869,0.0927667100115855 +lichen,lichen,north,,,Physcia.adscendens,Wellsites,5,0.0705807137451294,0.0640466875595764,0.0743465556159333,0.0713549733394766 +lichen,lichen,north,,,Physcia.adscendens,Crop,5,0.0516888781546591,0.0460708739606524,0.0548513064460412,0.055960451606295 +lichen,lichen,north,,,Physcia.adscendens,TameP,5,0.0855457668904207,0.0656920901562321,0.0990178703104062,0.0713549733394766 +lichen,lichen,north,,,Physcia.adscendens,RoughP,5,0.224250176595246,0.211122574934919,0.241416808669401,0.204523553351491 +lichen,lichen,south,,,Cladonia.chlorophaea,Loamy,5,0.052195559133926,0.0298034654721256,0.0565211405800403,0.052195559133926 +lichen,lichen,south,,,Cladonia.chlorophaea,SandyLoam,5,0.0425856522861778,0.0302726475798714,0.0497195180448668,0.0487452256562415 +lichen,lichen,south,,,Cladonia.chlorophaea,ClaySub,5,0.0413784697032066,0.0276654396738082,0.0457685923896542,0.0479897327403985 +lichen,lichen,south,,,Cladonia.chlorophaea,RapidDrain,5,0.0546149210507219,0.041080392280561,0.0708567634834832,0.0546149210507219 +lichen,lichen,south,,,Cladonia.chlorophaea,Blowout,5,0.0780094820043586,0.0596067533240845,0.096773096395934,0.0639696574300574 +lichen,lichen,south,,,Cladonia.chlorophaea,ThinBreak,5,0.0537735974901693,0.0397111361448846,0.0757908338691028,0.0537735974901693 +lichen,lichen,south,,,Cladonia.chlorophaea,Other,5,0.036227904757085,0.0283715150135987,0.0414842387317306,0.0445628614577478 +lichen,lichen,south,,,Cladonia.chlorophaea,EnSeismic,5,0.0529347843674136,0.0429035640395056,0.0545282781036341,0.0529170529631366 +lichen,lichen,south,,,Cladonia.chlorophaea,EnSoftLin,5,0.0429548569110704,0.0291341303978379,0.0505046848379649,0.0529170529631366 +lichen,lichen,south,,,Cladonia.chlorophaea,TrSoftLin,5,0.036227904757085,0.0274973236575878,0.0467486393575298,0.0529170529631366 +lichen,lichen,south,,,Cladonia.chlorophaea,HardLin,5,0.0325250266364422,0.0257919425493649,0.0389494519399109,0.0405311339177189 +lichen,lichen,south,,,Cladonia.chlorophaea,UrbInd,5,0.0325250266364422,0.025487274593689,0.0396805614107728,0.0417496497024888 +lichen,lichen,south,,,Cladonia.chlorophaea,Wellsites,5,0.0468994772272502,0.0335218551537618,0.110108450064424,0.0471574097791665 +lichen,lichen,south,,,Cladonia.chlorophaea,Crop,5,0.017126601937958,0.013984561064807,0.0202956706941388,0.0211712603591146 +lichen,lichen,south,,,Cladonia.chlorophaea,TameP,5,0.0380699708892799,0.0303114843572072,0.0428565295124077,0.0413582644084717 +lichen,lichen,south,,,Cladonia.chlorophaea,RoughP,5,0.0329099405296737,0.0273239725961271,0.0524931851726732,0.0493820842827578 +lichen,lichen,south,,,Physcia.adscendens,Loamy,5,0.179065767990214,0.128970289310936,0.237812775921372,0.179065767990214 +lichen,lichen,south,,,Physcia.adscendens,SandyLoam,5,0.403266885170568,0.389243097258811,0.414990358648874,0.403266885170568 +lichen,lichen,south,,,Physcia.adscendens,ClaySub,5,0.164263617137536,0.104770475168156,0.186605338887168,0.164263617137536 +lichen,lichen,south,,,Physcia.adscendens,RapidDrain,5,0.352363897448269,0.309864605279309,0.392953327889898,0.352363897448269 +lichen,lichen,south,,,Physcia.adscendens,Blowout,5,0.111284827489066,0.0855370985406267,0.139401128948304,0.133159184545919 +lichen,lichen,south,,,Physcia.adscendens,ThinBreak,5,0.170038630939121,0.136254906740026,0.182630845073522,0.183922674718338 +lichen,lichen,south,,,Physcia.adscendens,Other,5,0.158615578426656,0.106589675851018,0.212349783562352,0.158615578426656 +lichen,lichen,south,,,Physcia.adscendens,EnSeismic,5,0.207352039272678,0.13417780130087,0.270959386283416,0.172762769323312 +lichen,lichen,south,,,Physcia.adscendens,EnSoftLin,5,0.12612821551612,0.10269196061674,0.153354180787079,0.12612821551612 +lichen,lichen,south,,,Physcia.adscendens,TrSoftLin,5,0.154917422019291,0.139408500150615,0.193091674009417,0.197237290145073 +lichen,lichen,south,,,Physcia.adscendens,HardLin,5,0.087199922727172,0.0771298067728728,0.117889353745431,0.087199922727172 +lichen,lichen,south,,,Physcia.adscendens,UrbInd,5,0.10895445880468,0.0865455578561292,0.172817598513946,0.111165041122629 +lichen,lichen,south,,,Physcia.adscendens,Wellsites,5,0.10751617068656,0.0891435413108165,0.172860839275773,0.103035535299215 +lichen,lichen,south,,,Physcia.adscendens,Crop,5,0.0313693504932321,0.0273192438632444,0.0380055782684392,0.0381167435416052 +lichen,lichen,south,,,Physcia.adscendens,TameP,5,0.0698273794292601,0.0637639761558689,0.0872800783846081,0.0909427875505156 +lichen,lichen,south,,,Physcia.adscendens,RoughP,5,0.0763312963816246,0.0587904841957844,0.0870681778044053,0.0916742413946083 +mite,mite,north,,,Ceratozetes.gracilis,WhiteSpruce,5,0.0669749672760506,0.0622129841230631,0.0689199644525355,0.0696997934439586 +mite,mite,north,,,Ceratozetes.gracilis,Pine,5,0.04256789244931,0.0408764615452013,0.0516686038844872,0.0571993734275427 +mite,mite,north,,,Ceratozetes.gracilis,Deciduous,5,0.217494218755039,0.17945618366329,0.223828209314943,0.192711999446898 +mite,mite,north,,,Ceratozetes.gracilis,Mixedwood,5,0.0994123995656655,0.094977309807823,0.151696915478468,0.0966892300457536 +mite,mite,north,,,Ceratozetes.gracilis,BlackSpruce,5,0.0516770601449564,0.0454005393731902,0.0617733870966172,0.0659380709353549 +mite,mite,north,,,Ceratozetes.gracilis,TreedFen,5,0.0641717697840856,0.0567526855589949,0.0688723813089783,0.0701990130450116 +mite,mite,north,,,Ceratozetes.gracilis,TreedSwamp,5,0.193916946829892,0.156060825979128,0.33101395465164,0.15953971410373 +mite,mite,north,,,Ceratozetes.gracilis,GraminoidFen,5,0.0633035735611179,0.0571414697682801,0.0678135990329456,0.0701990130450116 +mite,mite,north,,,Ceratozetes.gracilis,ShrubbyFen,5,0.0633035735611179,0.0571414697682801,0.0678135990329456,0.0701990130450116 +mite,mite,north,,,Ceratozetes.gracilis,ShrubbyBog,5,0.0516770601449564,0.0454005393731902,0.0617733870966172,0.0659380709353549 +mite,mite,north,,,Ceratozetes.gracilis,ShrubbySwamp,5,0.203439597738164,0.168584557068857,0.27067771482627,0.148627319407195 +mite,mite,north,,,Ceratozetes.gracilis,Marsh,5,0.0952742474787555,0.0655242603774862,0.283125156180583,0.0760020275170621 +mite,mite,north,,,Ceratozetes.gracilis,Shrub,5,0.0627865958807114,0.059835532483509,0.0852807087169419,0.0721657250276492 +mite,mite,north,,,Ceratozetes.gracilis,Grass,5,0.0718546290377943,0.056343833299908,0.0809049805637031,0.0721657250276492 +mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruceR,5,0.0588143710260348,0.0522836703403517,0.0689698311930399,0.0734118003088178 +mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce1,5,0.135555599764672,0.121959952490186,0.172439011313113,0.132835115520776 +mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce2,5,0.1019083393474,0.0554698895240797,0.128648719550788,0.1019083393474 +mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce3,5,0.1019083393474,0.0554698895240797,0.128648719550788,0.1019083393474 +mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce4,5,0.1019083393474,0.0554698895240797,0.128648719550788,0.1019083393474 +mite,mite,north,,,Ceratozetes.gracilis,CCPineR,5,0.0588143710260348,0.0522836703403517,0.0689698311930399,0.0734118003088178 +mite,mite,north,,,Ceratozetes.gracilis,CCPine1,5,0.0588143710260348,0.0535617472998535,0.0689698311930399,0.0734118003088178 +mite,mite,north,,,Ceratozetes.gracilis,CCPine2,5,0.0588143710260348,0.0503436986652951,0.0716778074468958,0.0779250940652443 +mite,mite,north,,,Ceratozetes.gracilis,CCPine3,5,0.0588143710260348,0.0503436986652951,0.0716778074468958,0.0779250940652443 +mite,mite,north,,,Ceratozetes.gracilis,CCPine4,5,0.0588143710260348,0.0503436986652951,0.0716778074468958,0.0779250940652443 +mite,mite,north,,,Ceratozetes.gracilis,CCDeciduousR,5,0.105593505368177,0.0798277019137626,0.173923462313821,0.14281075430705 +mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous1,5,0.225331462315651,0.1758949902012,0.316107212350169,0.244185099126181 +mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous2,5,0.0872563275595971,0.0705478286725866,0.158331259342934,0.14281075430705 +mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous3,5,0.0872563275595971,0.0705478286725866,0.158331259342934,0.14281075430705 +mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous4,5,0.0872563275595971,0.0705478286725866,0.158331259342934,0.14281075430705 +mite,mite,north,,,Ceratozetes.gracilis,CCMixedwoodR,5,0.105593505368177,0.0798277019137626,0.173923462313821,0.14281075430705 +mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood1,5,0.225331462315651,0.1758949902012,0.316107212350169,0.244185099126181 +mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood2,5,0.0872563275595971,0.0705478286725866,0.158331259342934,0.14281075430705 +mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood3,5,0.0872563275595971,0.0705478286725866,0.158331259342934,0.14281075430705 +mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood4,5,0.0872563275595971,0.0705478286725866,0.158331259342934,0.14281075430705 +mite,mite,north,,,Ceratozetes.gracilis,EnSeismic,5,0.0849102162502049,0.0740619229939614,0.13721658955695,0.0849102162502049 +mite,mite,north,,,Ceratozetes.gracilis,EnSoftLin,5,0.0915906950067975,0.0770152385279824,0.118814379220065,0.0802815157979349 +mite,mite,north,,,Ceratozetes.gracilis,TrSoftLin,5,0.0663694973434072,0.0657385973301974,0.0734803475031907,0.0772202736623088 +mite,mite,north,,,Ceratozetes.gracilis,HardLin,5,0.0587135033801385,0.0509538282426539,0.0657184723912073,0.0703715576369905 +mite,mite,north,,,Ceratozetes.gracilis,UrbInd,5,0.0964962847879036,0.0764451513903517,0.121682767362242,0.0844134434753489 +mite,mite,north,,,Ceratozetes.gracilis,Wellsites,5,0.0739763395051338,0.0598756252832297,0.0904450143610713,0.0739763395051338 +mite,mite,north,,,Ceratozetes.gracilis,Crop,5,0.0582196475160354,0.0478134747634196,0.067397377794943,0.0662962909115865 +mite,mite,north,,,Ceratozetes.gracilis,TameP,5,0.0623068775193731,0.0535673460289789,0.0673375729344789,0.0703715576369905 +mite,mite,north,,,Ceratozetes.gracilis,RoughP,5,0.15093199187711,0.125635623078688,0.232703414984325,0.15093199187711 +mite,mite,north,,,Trhypochthonius.tectorum,WhiteSpruce,5,0.0577755747362142,0.0538019452873725,0.0695318781053339,0.0641664571793333 +mite,mite,north,,,Trhypochthonius.tectorum,Pine,5,0.0671952817921155,0.0604179332609355,0.0837975300991683,0.0780420695640347 +mite,mite,north,,,Trhypochthonius.tectorum,Deciduous,5,0.0591776854284389,0.0538019452873725,0.0708434212620666,0.0641664571793333 +mite,mite,north,,,Trhypochthonius.tectorum,Mixedwood,5,0.0577755747362142,0.0542315511008591,0.069917634425821,0.0641664571793333 +mite,mite,north,,,Trhypochthonius.tectorum,BlackSpruce,5,0.0718834766092794,0.0578186846481628,0.0793309673711368,0.0718834766092794 +mite,mite,north,,,Trhypochthonius.tectorum,TreedFen,5,0.0544560962914867,0.0493066233077781,0.0667855423630775,0.0665924879139367 +mite,mite,north,,,Trhypochthonius.tectorum,TreedSwamp,5,0.0517004780663654,0.0496562190049392,0.0678805488864248,0.0778968506573017 +mite,mite,north,,,Trhypochthonius.tectorum,GraminoidFen,5,0.0652055996070153,0.0493066233077781,0.068571394636323,0.0665924879139367 +mite,mite,north,,,Trhypochthonius.tectorum,ShrubbyFen,5,0.0652055996070153,0.0532779842531473,0.0673491269294197,0.0665924879139367 +mite,mite,north,,,Trhypochthonius.tectorum,ShrubbyBog,5,0.0539275025282014,0.0493066233077781,0.0660377325911681,0.0665924879139367 +mite,mite,north,,,Trhypochthonius.tectorum,ShrubbySwamp,5,0.0495941603886875,0.044439849505053,0.0540875339013449,0.0569796852160303 +mite,mite,north,,,Trhypochthonius.tectorum,Marsh,5,0.0528560962301094,0.0504011279043729,0.0651312347515791,0.0628200790094008 +mite,mite,north,,,Trhypochthonius.tectorum,Shrub,5,0.0528560962301094,0.0485709019332074,0.0617348050746604,0.0628200790094008 +mite,mite,north,,,Trhypochthonius.tectorum,Grass,5,0.0528560962301094,0.0473251458076707,0.0715616899357351,0.0690489152512388 +mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruceR,5,0.0785412589787557,0.0575294702367993,0.0949478912990213,0.0863413666769157 +mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce1,5,0.0558111876129656,0.0506179022680299,0.0617348050746604,0.0628200790094008 +mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce2,5,0.0558111876129656,0.0506179022680299,0.0617348050746604,0.0628200790094008 +mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce3,5,0.0558111876129656,0.0506179022680299,0.0617348050746604,0.0628200790094008 +mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce4,5,0.0558111876129656,0.0506179022680299,0.0617348050746604,0.0628200790094008 +mite,mite,north,,,Trhypochthonius.tectorum,CCPineR,5,0.145915212047275,0.0941318069154416,0.219519917662366,0.145915212047275 +mite,mite,north,,,Trhypochthonius.tectorum,CCPine1,5,0.0590717631474358,0.0506179022680299,0.0820899853270626,0.0628200790094008 +mite,mite,north,,,Trhypochthonius.tectorum,CCPine2,5,0.0590717631474358,0.0506179022680299,0.0820899853270626,0.0628200790094008 +mite,mite,north,,,Trhypochthonius.tectorum,CCPine3,5,0.0590717631474358,0.0506179022680299,0.0820899853270626,0.0628200790094008 +mite,mite,north,,,Trhypochthonius.tectorum,CCPine4,5,0.0590717631474358,0.0506179022680299,0.0820899853270626,0.0628200790094008 +mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduousR,5,0.0725545296228128,0.0528016508160498,0.138396691591419,0.0725545296228128 +mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous1,5,0.0580272550712131,0.0477341689597153,0.0617348050746604,0.0628200790094008 +mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous2,5,0.0580272550712131,0.0477341689597153,0.0617348050746604,0.0628200790094008 +mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous3,5,0.0580272550712131,0.0477341689597153,0.0617348050746604,0.0628200790094008 +mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous4,5,0.0580272550712131,0.0477341689597153,0.0617348050746604,0.0628200790094008 +mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwoodR,5,0.0725545296228128,0.0528016508160498,0.138396691591419,0.0725545296228128 +mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood1,5,0.0580272550712131,0.0477341689597153,0.0617348050746604,0.0628200790094008 +mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood2,5,0.0580272550712131,0.0477341689597153,0.0617348050746604,0.0628200790094008 +mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood3,5,0.0580272550712131,0.0477341689597153,0.0617348050746604,0.0628200790094008 +mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood4,5,0.0580272550712131,0.0477341689597153,0.0617348050746604,0.0628200790094008 +mite,mite,north,,,Trhypochthonius.tectorum,EnSeismic,5,0.0910582138455917,0.0533313162094705,0.0983231441298929,0.0913601067139062 +mite,mite,north,,,Trhypochthonius.tectorum,EnSoftLin,5,0.0601068941725498,0.0485709019332074,0.0647553700470357,0.0628200790094008 +mite,mite,north,,,Trhypochthonius.tectorum,TrSoftLin,5,0.0601068941725498,0.0485709019332074,0.062920352038396,0.0628200790094008 +mite,mite,north,,,Trhypochthonius.tectorum,HardLin,5,0.0480451166856463,0.0431158598923391,0.055201471005683,0.0548416115308383 +mite,mite,north,,,Trhypochthonius.tectorum,UrbInd,5,0.0480451166856463,0.0414026064580054,0.055201471005683,0.0548416115308383 +mite,mite,north,,,Trhypochthonius.tectorum,Wellsites,5,0.0548416115308383,0.0435499729795206,0.0734624155408599,0.0548416115308383 +mite,mite,north,,,Trhypochthonius.tectorum,Crop,5,0.0428533863920896,0.0414026064580054,0.0485932244491473,0.0495027940540152 +mite,mite,north,,,Trhypochthonius.tectorum,TameP,5,0.0480451166856463,0.0414026064580054,0.055201471005683,0.0548416115308383 +mite,mite,north,,,Trhypochthonius.tectorum,RoughP,5,0.0586935984593829,0.0444195517869312,0.0733712043527113,0.0586935984593829 +mite,mite,south,,,Ceratozetes.gracilis,Loamy,5,0.0118091460727822,0.0091958478526172,0.0130941529470914,0.0138446843806268 +mite,mite,south,,,Ceratozetes.gracilis,SandyLoam,5,0.011658132266668,0.00952673996191176,0.0133748258168454,0.0144186123128876 +mite,mite,south,,,Ceratozetes.gracilis,ClaySub,5,0.011178405272004,0.00853544536195953,0.0128204034708154,0.0134945750695042 +mite,mite,south,,,Ceratozetes.gracilis,RapidDrain,5,0.0112975910152107,0.00870305149571039,0.0134642923732254,0.0144186123128876 +mite,mite,south,,,Ceratozetes.gracilis,Blowout,5,0.0112462955756537,0.00914953810155372,0.0126157814477868,0.0134945750695042 +mite,mite,south,,,Ceratozetes.gracilis,ThinBreak,5,0.010832537525368,0.00849770905858164,0.012595263271964,0.0134945750695042 +mite,mite,south,,,Ceratozetes.gracilis,Other,5,0.0111962149229347,0.00867867842028293,0.012595263271964,0.0134945750695042 +mite,mite,south,,,Ceratozetes.gracilis,EnSeismic,5,0.0113731403877682,0.00908815417692333,0.0204970908560639,0.0159170215706303 +mite,mite,south,,,Ceratozetes.gracilis,EnSoftLin,5,0.0113731403877682,0.00908815417692333,0.0332645388954519,0.0159170215706303 +mite,mite,south,,,Ceratozetes.gracilis,TrSoftLin,5,0.0159170215706303,0.00908815417692333,0.0247497593181276,0.0159170215706303 +mite,mite,south,,,Ceratozetes.gracilis,HardLin,5,0.0103529092184937,0.00802174937917919,0.0119472028262867,0.0124144743267087 +mite,mite,south,,,Ceratozetes.gracilis,UrbInd,5,0.0103893155644195,0.00906812989470643,0.0111284172276856,0.011472604195203 +mite,mite,south,,,Ceratozetes.gracilis,Wellsites,5,0.0103529092184937,0.00802174937917919,0.0119472028262867,0.0124144743267087 +mite,mite,south,,,Ceratozetes.gracilis,Crop,5,0.0101310267749695,0.00778269757271738,0.0117481079577554,0.0119305082254496 +mite,mite,south,,,Ceratozetes.gracilis,TameP,5,0.00993830120627124,0.00752459835016003,0.0117317368241024,0.0119534067865342 +mite,mite,south,,,Ceratozetes.gracilis,RoughP,5,0.0103529092184937,0.00801410107291135,0.0120083773482071,0.0124144743267087 +mite,mite,south,,,Trhypochthonius.tectorum,Loamy,5,0.0351643832387039,0.0294309160724408,0.0419800441301916,0.0453560940842288 +mite,mite,south,,,Trhypochthonius.tectorum,SandyLoam,5,0.0317217130098143,0.0270112459897541,0.0422091417345682,0.0445529864231478 +mite,mite,south,,,Trhypochthonius.tectorum,ClaySub,5,0.0271760098648568,0.0252725299050298,0.0400391206090229,0.0445529864231478 +mite,mite,south,,,Trhypochthonius.tectorum,RapidDrain,5,0.0306487453560001,0.0221083702615456,0.0391376921951299,0.0445529864231478 +mite,mite,south,,,Trhypochthonius.tectorum,Blowout,5,0.0576094249553107,0.0313945523695571,0.081500559049622,0.0576094249553107 +mite,mite,south,,,Trhypochthonius.tectorum,ThinBreak,5,0.0287383827719498,0.0226198278220152,0.039844730787817,0.0445529864231478 +mite,mite,south,,,Trhypochthonius.tectorum,Other,5,0.0312153329695141,0.0270927496568076,0.0471808350380845,0.0445529864231478 +mite,mite,south,,,Trhypochthonius.tectorum,EnSeismic,5,0.0296292424772318,0.0211180474977249,0.0386096543638731,0.0445529864231478 +mite,mite,south,,,Trhypochthonius.tectorum,EnSoftLin,5,0.0296292424772318,0.0211180474977249,0.0386096543638731,0.0445529864231478 +mite,mite,south,,,Trhypochthonius.tectorum,TrSoftLin,5,0.0246060034370251,0.020255919275666,0.0379429581936407,0.0445529864231478 +mite,mite,south,,,Trhypochthonius.tectorum,HardLin,5,0.0407568519468657,0.0295582515338898,0.070236155360768,0.0407568519468657 +mite,mite,south,,,Trhypochthonius.tectorum,UrbInd,5,0.0304390063860564,0.0230296933985166,0.0375670501020477,0.0407568519468657 +mite,mite,south,,,Trhypochthonius.tectorum,Wellsites,5,0.035906973044058,0.0269422420630365,0.0424189684361255,0.0459508545998354 +mite,mite,south,,,Trhypochthonius.tectorum,Crop,5,0.0260558215803738,0.0217135944946595,0.0373501944737719,0.0416046766694066 +mite,mite,south,,,Trhypochthonius.tectorum,TameP,5,0.0359245552961453,0.0238905721090203,0.0390016511379287,0.0407568519468657 +mite,mite,south,,,Trhypochthonius.tectorum,RoughP,5,0.0407568519468657,0.0235432893681054,0.0417533961232613,0.0407568519468657 +vascular_plant,vascular_plant,north,,,Galium.boreale,WhiteSpruce,5,0.0905261600791059,0.0726539987119275,0.105465942868795,0.109940308173042 +vascular_plant,vascular_plant,north,,,Galium.boreale,Pine,5,0.0882177641944994,0.0780829990507653,0.0990858286878633,0.0882177641944994 +vascular_plant,vascular_plant,north,,,Galium.boreale,Deciduous,5,0.465299532424074,0.433296638965715,0.475383165890563,0.456521289512612 +vascular_plant,vascular_plant,north,,,Galium.boreale,Mixedwood,5,0.205926105528394,0.161700999063794,0.215030784759387,0.189429440007921 +vascular_plant,vascular_plant,north,,,Galium.boreale,BlackSpruce,5,0.0478785132484108,0.0341393328381514,0.0550709099126156,0.0491594576902939 +vascular_plant,vascular_plant,north,,,Galium.boreale,TreedFen,5,0.0390244960628199,0.0323991389608112,0.0476952661693537,0.0498565474064884 +vascular_plant,vascular_plant,north,,,Galium.boreale,TreedSwamp,5,0.163110948575593,0.153077522516154,0.230612133392176,0.163110948575593 +vascular_plant,vascular_plant,north,,,Galium.boreale,GraminoidFen,5,0.0482626042376281,0.0348396270394228,0.0549132963187686,0.0557946360258168 +vascular_plant,vascular_plant,north,,,Galium.boreale,ShrubbyFen,5,0.0486375982349556,0.0346089602336751,0.0521306580968099,0.0534252909715577 +vascular_plant,vascular_plant,north,,,Galium.boreale,ShrubbyBog,5,0.044130192624148,0.031163942092392,0.0486470799135407,0.0491594576902939 +vascular_plant,vascular_plant,north,,,Galium.boreale,ShrubbySwamp,5,0.083709111718631,0.0609964454455046,0.0941791378292602,0.083709111718631 +vascular_plant,vascular_plant,north,,,Galium.boreale,Marsh,5,0.0698959810812024,0.0529936392525844,0.0843514654717594,0.0880256124111306 +vascular_plant,vascular_plant,north,,,Galium.boreale,Shrub,5,0.204684354936933,0.127212036636942,0.26235561958285,0.181675403633832 +vascular_plant,vascular_plant,north,,,Galium.boreale,Grass,5,0.175738621829022,0.107442058241296,0.203385998163264,0.152213120330482 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruceR,5,0.380414005666068,0.29754976604351,0.431319823216388,0.371243492127191 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce1,5,0.442218169166312,0.345601963663094,0.534892341530778,0.358244182378353 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce2,5,0.350930709571412,0.236898333085665,0.455250381120309,0.285560235072748 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce3,5,0.350930709571412,0.236898333085665,0.455250381120309,0.285560235072748 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce4,5,0.350930709571412,0.236898333085665,0.455250381120309,0.285560235072748 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCPineR,5,0.148154982777589,0.111507204449231,0.334027199025936,0.131260898266157 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine1,5,0.154376654469905,0.106263214861255,0.171861231246759,0.15442465933251 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine2,5,0.105512538646366,0.0965888866874318,0.136635832703976,0.138277996063961 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine3,5,0.105512538646366,0.0965888866874318,0.136635832703976,0.138277996063961 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine4,5,0.105512538646366,0.0965888866874318,0.136635832703976,0.138277996063961 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduousR,5,0.356334997841159,0.32007286426474,0.384825825197441,0.356334997841159 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous1,5,0.608707074035124,0.567612457808335,0.665013792414914,0.553877504464074 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous2,5,0.393947566692306,0.357535477315663,0.442738415728514,0.389522338833368 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous3,5,0.393947566692306,0.357535477315663,0.442738415728514,0.389522338833368 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous4,5,0.393947566692306,0.357535477315663,0.442738415728514,0.389522338833368 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwoodR,5,0.356334997841159,0.32007286426474,0.384825825197441,0.356334997841159 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood1,5,0.608707074035124,0.567612457808335,0.665013792414914,0.553877504464074 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood2,5,0.393947566692306,0.357535477315663,0.442738415728514,0.389522338833368 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood3,5,0.393947566692306,0.357535477315663,0.442738415728514,0.389522338833368 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood4,5,0.393947566692306,0.357535477315663,0.442738415728514,0.389522338833368 +vascular_plant,vascular_plant,north,,,Galium.boreale,EnSeismic,5,0.057590680417951,0.0510600219459448,0.10016910379681,0.101329985556375 +vascular_plant,vascular_plant,north,,,Galium.boreale,EnSoftLin,5,0.09564011072873,0.0441515996588241,0.100455007573555,0.10270284784644 +vascular_plant,vascular_plant,north,,,Galium.boreale,TrSoftLin,5,0.0709020534317746,0.0450965505256889,0.109751826577989,0.114356175129852 +vascular_plant,vascular_plant,north,,,Galium.boreale,HardLin,5,0.0748632969541923,0.0639691941447502,0.0974711299865728,0.0748632969541923 +vascular_plant,vascular_plant,north,,,Galium.boreale,UrbInd,5,0.073863307370164,0.0485947520789427,0.0815875653608419,0.073863307370164 +vascular_plant,vascular_plant,north,,,Galium.boreale,Wellsites,5,0.0573058985665059,0.0468204045772708,0.0851247381100821,0.0698044961284464 +vascular_plant,vascular_plant,north,,,Galium.boreale,Crop,5,0.037298697978295,0.0274503557014551,0.0405043959144592,0.037298697978295 +vascular_plant,vascular_plant,north,,,Galium.boreale,TameP,5,0.060587407386995,0.0492885202663003,0.0702078577975504,0.0684941331197969 +vascular_plant,vascular_plant,north,,,Galium.boreale,RoughP,5,0.218687359756944,0.128866866907942,0.277667355018981,0.218687359756944 +vascular_plant,vascular_plant,north,,,Vicia.americana,WhiteSpruce,5,0.0486581668699057,0.037714432509289,0.0577571994569696,0.0618662503281404 +vascular_plant,vascular_plant,north,,,Vicia.americana,Pine,5,0.0591982401531878,0.0556506192021974,0.0700348774453486,0.0756981766456566 +vascular_plant,vascular_plant,north,,,Vicia.americana,Deciduous,5,0.489665218569576,0.389112756254434,0.595028218954258,0.46933882924525 +vascular_plant,vascular_plant,north,,,Vicia.americana,Mixedwood,5,0.272598714730191,0.241629222739608,0.295371592297177,0.242428955682496 +vascular_plant,vascular_plant,north,,,Vicia.americana,BlackSpruce,5,0.0392530076125695,0.0278355698570972,0.0474674347295187,0.0519945996737369 +vascular_plant,vascular_plant,north,,,Vicia.americana,TreedFen,5,0.0361399521075309,0.027592110740187,0.0450886892443672,0.0497769927854594 +vascular_plant,vascular_plant,north,,,Vicia.americana,TreedSwamp,5,0.164791871233975,0.145735616086114,0.212770602791757,0.152857577632565 +vascular_plant,vascular_plant,north,,,Vicia.americana,GraminoidFen,5,0.0491591419155907,0.0370475507603448,0.0593760829111141,0.0617833825466608 +vascular_plant,vascular_plant,north,,,Vicia.americana,ShrubbyFen,5,0.0441086268205254,0.0378698624103314,0.0547096597754249,0.058914436404479 +vascular_plant,vascular_plant,north,,,Vicia.americana,ShrubbyBog,5,0.0392530076125695,0.0278355698570972,0.0474674347295187,0.0519945996737369 +vascular_plant,vascular_plant,north,,,Vicia.americana,ShrubbySwamp,5,0.0694420473317629,0.052752882212602,0.109505561707169,0.103388339424152 +vascular_plant,vascular_plant,north,,,Vicia.americana,Marsh,5,0.10008164429858,0.0669974258535409,0.128198215403346,0.11042459286386 +vascular_plant,vascular_plant,north,,,Vicia.americana,Shrub,5,0.080955082403376,0.0431671757631007,0.0984802598877385,0.080955082403376 +vascular_plant,vascular_plant,north,,,Vicia.americana,Grass,5,0.112947239823599,0.0847241848287774,0.160950439530741,0.112947239823599 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruceR,5,0.10352021676731,0.0624529922352498,0.11468832026785,0.114834301444234 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce1,5,0.385404780569015,0.350618209593138,0.432581524092722,0.385404780569015 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce2,5,0.315071018848474,0.258440706793436,0.373089412237812,0.315071018848474 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce3,5,0.315071018848474,0.258440706793436,0.373089412237812,0.315071018848474 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce4,5,0.315071018848474,0.258440706793436,0.373089412237812,0.315071018848474 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCPineR,5,0.0621592968655072,0.0462697444564951,0.126352771620468,0.105151707738167 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine1,5,0.196600026133365,0.0728022972597945,0.257951068699789,0.196600026133365 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine2,5,0.0730762167894711,0.0615850109397236,0.122782775884628,0.143327431424619 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine3,5,0.0730762167894711,0.0615850109397236,0.122782775884628,0.143327431424619 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine4,5,0.0730762167894711,0.0615850109397236,0.122782775884628,0.143327431424619 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduousR,5,0.230881388349581,0.130814312137481,0.26028552835072,0.273809006571826 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous1,5,0.421098934210828,0.359913539297426,0.521048356830173,0.421098934210828 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous2,5,0.358824924265736,0.309864266971754,0.406894615895366,0.358824924265736 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous3,5,0.358824924265736,0.309864266971754,0.406894615895366,0.358824924265736 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous4,5,0.358824924265736,0.309864266971754,0.406894615895366,0.358824924265736 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwoodR,5,0.230881388349581,0.130814312137481,0.26028552835072,0.273809006571826 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood1,5,0.421098934210828,0.359913539297426,0.521048356830173,0.421098934210828 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood2,5,0.358824924265736,0.309864266971754,0.406894615895366,0.358824924265736 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood3,5,0.358824924265736,0.309864266971754,0.406894615895366,0.358824924265736 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood4,5,0.358824924265736,0.309864266971754,0.406894615895366,0.358824924265736 +vascular_plant,vascular_plant,north,,,Vicia.americana,EnSeismic,5,0.0762321492471983,0.0613857483749441,0.0979909210157939,0.0899187113257272 +vascular_plant,vascular_plant,north,,,Vicia.americana,EnSoftLin,5,0.12733730866857,0.10075226992879,0.197337696065495,0.208940739128041 +vascular_plant,vascular_plant,north,,,Vicia.americana,TrSoftLin,5,0.074023652005133,0.0603555484247621,0.0837173215407327,0.0899187113257272 +vascular_plant,vascular_plant,north,,,Vicia.americana,HardLin,5,0.108750813528169,0.0895787634706335,0.129445541476669,0.0952871947265366 +vascular_plant,vascular_plant,north,,,Vicia.americana,UrbInd,5,0.153307323213793,0.123411601132576,0.18591728264388,0.128387927000459 +vascular_plant,vascular_plant,north,,,Vicia.americana,Wellsites,5,0.0682550280437768,0.0559809263160038,0.112755807097797,0.10605346247 +vascular_plant,vascular_plant,north,,,Vicia.americana,Crop,5,0.0723599505335915,0.0608480634532804,0.0844100942475774,0.0851583829577764 +vascular_plant,vascular_plant,north,,,Vicia.americana,TameP,5,0.0924645904804092,0.0677790896216975,0.10400694518922,0.0929616308472977 +vascular_plant,vascular_plant,north,,,Vicia.americana,RoughP,5,0.085207793662974,0.0630224628711018,0.0949750448358125,0.0873014522562282 +vascular_plant,vascular_plant,south,,,Galium.boreale,Loamy,5,0.212139905840749,0.148719920801159,0.292642465432035,0.210161149652298 +vascular_plant,vascular_plant,south,,,Galium.boreale,SandyLoam,5,0.0456788630680879,0.035676304073348,0.0693622104376604,0.0588351608030491 +vascular_plant,vascular_plant,south,,,Galium.boreale,ClaySub,5,0.0469005828979151,0.0347792218772668,0.0547981020364095,0.058878554652313 +vascular_plant,vascular_plant,south,,,Galium.boreale,RapidDrain,5,0.0931603169732577,0.0588802338799269,0.23663603931149,0.167009266886178 +vascular_plant,vascular_plant,south,,,Galium.boreale,Blowout,5,0.0823148949158589,0.0523330806846195,0.163851755010256,0.152580627898323 +vascular_plant,vascular_plant,south,,,Galium.boreale,ThinBreak,5,0.0862703200466514,0.0610726202072316,0.128881001140756,0.155463849759419 +vascular_plant,vascular_plant,south,,,Galium.boreale,Other,5,0.0495568717372316,0.0338825773074383,0.0715239811195146,0.058878554652313 +vascular_plant,vascular_plant,south,,,Galium.boreale,EnSeismic,5,0.127066760394741,0.0577731413511546,0.226427466989801,0.0662234226244739 +vascular_plant,vascular_plant,south,,,Galium.boreale,EnSoftLin,5,0.0567918031928038,0.0369984063170848,0.0684952500425984,0.0578723417459656 +vascular_plant,vascular_plant,south,,,Galium.boreale,TrSoftLin,5,0.0501430149079961,0.0330303416893626,0.064297657939305,0.0606337080894297 +vascular_plant,vascular_plant,south,,,Galium.boreale,HardLin,5,0.0503229809766815,0.0328390471821546,0.102986779321736,0.0433047049321723 +vascular_plant,vascular_plant,south,,,Galium.boreale,UrbInd,5,0.0591976313142742,0.031268240954506,0.0712880441203804,0.0453650100325084 +vascular_plant,vascular_plant,south,,,Galium.boreale,Wellsites,5,0.11417242560448,0.0982178611568288,0.180973668182285,0.093589716378948 +vascular_plant,vascular_plant,south,,,Galium.boreale,Crop,5,0.0200193854225638,0.0135882011571378,0.0257681136118826,0.0259535140763464 +vascular_plant,vascular_plant,south,,,Galium.boreale,TameP,5,0.0349121367369461,0.0240991689034394,0.0505300747425592,0.0415579776559811 +vascular_plant,vascular_plant,south,,,Galium.boreale,RoughP,5,0.0414330370506466,0.0270771081472065,0.0542968411123968,0.0492107620062856 +vascular_plant,vascular_plant,south,,,Vicia.americana,Loamy,5,0.434895743635103,0.370156898788599,0.471709090663466,0.425663642968388 +vascular_plant,vascular_plant,south,,,Vicia.americana,SandyLoam,5,0.308277110708811,0.249167602859829,0.364013125892321,0.362183245685185 +vascular_plant,vascular_plant,south,,,Vicia.americana,ClaySub,5,0.692420938953158,0.646910248782837,0.760947490387763,0.708313756435149 +vascular_plant,vascular_plant,south,,,Vicia.americana,RapidDrain,5,0.305734727481026,0.21343920377989,0.355060033690606,0.317562407048366 +vascular_plant,vascular_plant,south,,,Vicia.americana,Blowout,5,0.115621281621045,0.0748651128893112,0.173014522689943,0.164080658380067 +vascular_plant,vascular_plant,south,,,Vicia.americana,ThinBreak,5,0.595140891251659,0.550391755875328,0.694919842305117,0.595140891251659 +vascular_plant,vascular_plant,south,,,Vicia.americana,Other,5,0.11234284222868,0.0980319879486246,0.167761582798757,0.160639309973368 +vascular_plant,vascular_plant,south,,,Vicia.americana,EnSeismic,5,0.170991805367137,0.136116899020984,0.277205807476619,0.283519777926939 +vascular_plant,vascular_plant,south,,,Vicia.americana,EnSoftLin,5,0.091369478600897,0.0822046598933772,0.153633319815548,0.191338931119729 +vascular_plant,vascular_plant,south,,,Vicia.americana,TrSoftLin,5,0.0715361502192472,0.0595000714560617,0.101560333332767,0.11627836989392 +vascular_plant,vascular_plant,south,,,Vicia.americana,HardLin,5,0.0710886934960088,0.0476502168943391,0.0762637897306265,0.0771096238897843 +vascular_plant,vascular_plant,south,,,Vicia.americana,UrbInd,5,0.0732336694531538,0.0606862406271869,0.0800777743591856,0.0732336694531538 +vascular_plant,vascular_plant,south,,,Vicia.americana,Wellsites,5,0.117723717187198,0.0743439024462338,0.204963787267155,0.0803771595830667 +vascular_plant,vascular_plant,south,,,Vicia.americana,Crop,5,0.043757799438472,0.042083002255709,0.0614856258080756,0.0654082704160852 +vascular_plant,vascular_plant,south,,,Vicia.americana,TameP,5,0.0608758486486179,0.049319172695898,0.071264012595995,0.0722322895776223 +vascular_plant,vascular_plant,south,,,Vicia.americana,RoughP,5,0.0581967167689662,0.0398767269402306,0.0640896379791293,0.0637514185018053 diff --git a/3_output/exp_001_gbm/tables/metric_summary.csv b/3_output/exp_001_gbm/tables/metric_summary.csv new file mode 100644 index 0000000..d887a30 --- /dev/null +++ b/3_output/exp_001_gbm/tables/metric_summary.csv @@ -0,0 +1,281 @@ +taxon,run,region,season,part,species,metric,n,median,p10,p90,boot1,mean,sd +bird,bird,north,,,AMRO,insample_auc,5,0.751740281295548,0.748729848139245,0.752022814022201,0.748581694622527,0.750648483680412,0.00173091244575163 +bird,bird,north,,,AMRO,insample_deviance_explained,5,0.191190989633939,0.190251890038755,0.194928603999058,0.191190989633939,0.192280588871852,0.00239124459846264 +bird,bird,north,,,AMRO,insample_rmse,5,0.642541775981535,0.641083414132321,0.643420940690511,0.643506042942691,0.642397629501167,0.00134550527847958 +bird,bird,north,,,AMRO,insample_spearman,5,0.385374770676258,0.381242278468797,0.38659237208208,0.380930969830349,0.384183814278661,0.00271095979285837 +bird,bird,north,,,AMRO,insample_calibration_slope,5,1.08589957145208,1.08310192621792,1.09021157940199,1.09024810835911,1.08667181779307,0.00368628187241485 +bird,bird,north,,,AMRO,insample_prevalence,5,0.251486631016043,0.251004373826971,0.252433263182893,0.250861017819325,0.251649276245993,0.000745639638422784 +bird,bird,north,,,AMRO,insample_n,5,46747,46745.2,46750,46747,46747.6,2.50998007960223 +bird,bird,north,,,AMRO,oob_auc,5,0.751837536078181,0.749980991530943,0.752193002137178,0.752193306467962,0.751281770799678,0.00116417482564863 +bird,bird,north,,,AMRO,oob_deviance_explained,5,0.19506532949998,0.193175947371306,0.196246931283065,0.196037133851581,0.194799360802435,0.0015168467458848 +bird,bird,north,,,AMRO,oob_rmse,5,0.642604598564083,0.641926501943516,0.643291716888183,0.642604598564083,0.642641892983815,0.000706719487871539 +bird,bird,north,,,AMRO,oob_spearman,5,0.380533676681413,0.37790922288039,0.380928318902458,0.380973137935308,0.379704839415122,0.00160868603847367 +bird,bird,north,,,AMRO,oob_calibration_slope,5,1.08396500531425,1.06486533991524,1.08850856529205,1.08700414220795,1.0781206536837,0.0121020437956378 +bird,bird,north,,,AMRO,oob_prevalence,5,0.241010939026539,0.240656718532255,0.241191818078906,0.241245385459292,0.240950250724789,0.000279167052473422 +bird,bird,north,,,AMRO,oob_n,5,124877,124874,124878.8,124877,124876.4,2.50998007960223 +bird,bird,north,,,YEWA,insample_auc,5,0.810652011115167,0.806905535915858,0.812061598522145,0.810652011115167,0.809920788969429,0.00298158641518445 +bird,bird,north,,,YEWA,insample_deviance_explained,5,0.314909273242783,0.309871591670546,0.319492805728457,0.31433273616762,0.314995319620847,0.00513387705415809 +bird,bird,north,,,YEWA,insample_rmse,5,0.497860576515493,0.493156373425077,0.499626705028419,0.49962409848944,0.496894111802444,0.00354200714107103 +bird,bird,north,,,YEWA,insample_spearman,5,0.351308203222811,0.346096725958007,0.352294768113019,0.350436724901658,0.34985084765685,0.00381643530797194 +bird,bird,north,,,YEWA,insample_calibration_slope,5,0.940448485992357,0.93822970227144,0.946840163927796,0.940448485992357,0.941932935374091,0.00487053160829021 +bird,bird,north,,,YEWA,insample_prevalence,5,0.118296361263824,0.117706951871658,0.119214980837802,0.118296361263824,0.118418937588893,0.00074585019883292 +bird,bird,north,,,YEWA,insample_n,5,46747,46745.2,46750,46747,46747.6,2.50998007960223 +bird,bird,north,,,YEWA,oob_auc,5,0.767239583431115,0.764036842512678,0.768086586341435,0.767239583431115,0.766350786125575,0.00209862831085928 +bird,bird,north,,,YEWA,oob_deviance_explained,5,0.230350378846768,0.224665925779611,0.231551778310879,0.227959760380667,0.22874856387184,0.00380105487185568 +bird,bird,north,,,YEWA,oob_rmse,5,0.549584841168796,0.549414228967452,0.551458313386524,0.550162464024828,0.55017969127946,0.00123649457889191 +bird,bird,north,,,YEWA,oob_spearman,5,0.319507711349023,0.316083429490712,0.320378488857948,0.319623833929528,0.318537008565272,0.00226374788033266 +bird,bird,north,,,YEWA,oob_calibration_slope,5,0.889991578244066,0.876082723316741,0.916820195435995,0.892963322385412,0.894170469859029,0.0232833872561715 +bird,bird,north,,,YEWA,oob_prevalence,5,0.13458843502006,0.134244406707603,0.134809487963868,0.13458843502006,0.134542639141448,0.000279456693593184 +bird,bird,north,,,YEWA,oob_n,5,124877,124874,124878.8,124877,124876.4,2.50998007960223 +bird,bird,south,,,AMRO,insample_auc,5,0.722457651450059,0.720375297518667,0.726600629615675,0.719209687405594,0.723173174223035,0.00352104706258787 +bird,bird,south,,,AMRO,insample_deviance_explained,5,0.138527656609622,0.136691146222818,0.142417135845419,0.135600586309404,0.139234587345557,0.00331236105235091 +bird,bird,south,,,AMRO,insample_rmse,5,0.723153001504509,0.721335031591462,0.727536148551106,0.728292130677616,0.724159617526551,0.00310303019322092 +bird,bird,south,,,AMRO,insample_spearman,5,0.340977632563199,0.337015292025713,0.346671247584847,0.334834651737548,0.341554550754961,0.00544445726779651 +bird,bird,south,,,AMRO,insample_calibration_slope,5,1.15022007411034,1.14276766077164,1.16236750302668,1.15022007411034,1.15156485355994,0.010905701466581 +bird,bird,south,,,AMRO,insample_prevalence,5,0.258280375405076,0.256689533268802,0.259336584790035,0.256218172635832,0.2580593533773,0.00136065688529854 +bird,bird,south,,,AMRO,insample_n,5,23761,23761,23761.6,23761,23761.2,0.447213595499958 +bird,bird,south,,,AMRO,oob_auc,5,0.714059436464857,0.711480500190566,0.714962411335227,0.714448876140363,0.713392647100118,0.00175148482002703 +bird,bird,south,,,AMRO,oob_deviance_explained,5,0.132856954481043,0.130598469407397,0.134794332682706,0.132856954481043,0.132776377523986,0.00207997237439086 +bird,bird,south,,,AMRO,oob_rmse,5,0.721746467048822,0.720680130610468,0.723305061950612,0.721188075251643,0.721900682780814,0.00139074085657849 +bird,bird,south,,,AMRO,oob_spearman,5,0.330248605915095,0.326193681128825,0.331484334016897,0.330591093630504,0.329111121655051,0.00267737137591811 +bird,bird,south,,,AMRO,oob_calibration_slope,5,1.12678967221639,1.10327355597656,1.15730924321681,1.14400371236361,1.12954040808678,0.0271419352715798 +bird,bird,south,,,AMRO,oob_prevalence,5,0.259904818560381,0.259531587266211,0.260466983938132,0.260633551457466,0.259982926292237,0.000480821801997171 +bird,bird,south,,,AMRO,oob_n,5,67240,67239.4,67240,67240,67239.8,0.447213595499958 +bird,bird,south,,,YEWA,insample_auc,5,0.731707710515796,0.728700013949457,0.733719201164071,0.729660608631109,0.731334936728352,0.00248007478364079 +bird,bird,south,,,YEWA,insample_deviance_explained,5,0.262640095914395,0.250569964296155,0.266480536201697,0.251335314102402,0.259283325711143,0.00804887140604942 +bird,bird,south,,,YEWA,insample_rmse,5,0.596757323379492,0.591627562751247,0.60212670002895,0.604986782449959,0.596598484036104,0.00547958963785054 +bird,bird,south,,,YEWA,insample_spearman,5,0.310870671271116,0.306715657634868,0.314188647985749,0.308461211669207,0.310573221086041,0.00371069473054041 +bird,bird,south,,,YEWA,insample_calibration_slope,5,0.963186027281322,0.952262721063744,0.964499623104985,0.950131266698914,0.959505385451777,0.00644183692361723 +bird,bird,south,,,YEWA,insample_prevalence,5,0.17124700138883,0.17077564075586,0.171722441305838,0.171625773326038,0.171262389740443,0.000478416642385765 +bird,bird,south,,,YEWA,insample_n,5,23761,23761,23761.6,23761,23761.2,0.447213595499958 +bird,bird,south,,,YEWA,oob_auc,5,0.724899078903474,0.722729775346807,0.727288181732548,0.722021476613265,0.724992280834132,0.00227531731608106 +bird,bird,south,,,YEWA,oob_deviance_explained,5,0.221600750861936,0.219475584782023,0.225789364125433,0.218421768576217,0.222482702236073,0.00317537195719995 +bird,bird,south,,,YEWA,oob_rmse,5,0.622650926841455,0.621699495926355,0.623907258037217,0.622650926841455,0.622779894995154,0.00114370759880926 +bird,bird,south,,,YEWA,oob_spearman,5,0.304828063834361,0.302056249953096,0.307765081764427,0.300949548659939,0.304898251507847,0.00291835886538884 +bird,bird,south,,,YEWA,oob_calibration_slope,5,0.916760518901893,0.891012316043227,0.957680972925801,0.921680221515519,0.920877884724876,0.0368442823890579 +bird,bird,south,,,YEWA,oob_prevalence,5,0.175758477096966,0.175590501794327,0.1759250446163,0.175624628197501,0.175753050469217,0.000169045533323201 +bird,bird,south,,,YEWA,oob_n,5,67240,67239.4,67240,67240,67239.8,0.447213595499958 +bryophyte,bryophyte,north,,,Bryum.All,insample_auc,5,0.686293255534428,0.665800073960684,0.699683279591766,0.661241066989767,0.68307757480868,0.0175629521500816 +bryophyte,bryophyte,north,,,Bryum.All,insample_deviance_explained,5,0.0734038482438816,0.0540739919142967,0.0836319939259369,0.0522782686686087,0.0693495889508644,0.0150314273449335 +bryophyte,bryophyte,north,,,Bryum.All,insample_rmse,5,0.465559659863795,0.462031877723535,0.471529026088212,0.472600851904357,0.466651482063344,0.00489281173279605 +bryophyte,bryophyte,north,,,Bryum.All,insample_spearman,5,0.316563440467368,0.281110209746659,0.33861190135575,0.27367992317064,0.310537684786552,0.029806308637125 +bryophyte,bryophyte,north,,,Bryum.All,insample_calibration_slope,5,1.55293080862373,1.50462808553216,1.70248737696564,1.72087717642957,1.59166328355968,0.100269909956927 +bryophyte,bryophyte,north,,,Bryum.All,insample_prevalence,5,0.398261429491307,0.395579807718977,0.401857219116663,0.400041220115416,0.3986710498744,0.00332558122320578 +bryophyte,bryophyte,north,,,Bryum.All,insample_n,5,3097,3072.4,4153.6,4852,3440.8,789.041633882522 +bryophyte,bryophyte,north,,,Bryum.All,oob_auc,4,0.628064204051684,0.625138413790667,0.646280308937115,,0.633525030703261,0.0132070860232767 +bryophyte,bryophyte,north,,,Bryum.All,oob_deviance_explained,4,0.036439016722082,0.0317561312930693,0.0440728530358992,,0.0374929277523693,0.0068635854360685 +bryophyte,bryophyte,north,,,Bryum.All,oob_rmse,4,0.478431484595725,0.476961325866792,0.479086777965519,,0.478140461253175,0.00119501147163414 +bryophyte,bryophyte,north,,,Bryum.All,oob_spearman,4,0.217634716993625,0.212132096434835,0.249146496410386,,0.226923702300043,0.0229954074379961 +bryophyte,bryophyte,north,,,Bryum.All,oob_calibration_slope,4,0.96776722194435,0.94200366187995,1.3568526967472,,1.09752504863665,0.27853178520469 +bryophyte,bryophyte,north,,,Bryum.All,oob_prevalence,4,0.403358051486104,0.397360409603543,0.408630979157295,,0.403099224982043,0.006528394280969 +bryophyte,bryophyte,north,,,Bryum.All,oob_n,5,1755,698.4,1779.6,0,1411.2,789.041633882522 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_auc,5,0.735613998678571,0.718222728085638,0.746101294127716,0.709292380007168,0.733731795207852,0.0150804186552806 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_deviance_explained,5,0.12490667611225,0.104325275461427,0.135175042848528,0.0953376234923402,0.121570060412617,0.0163751607020792 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_rmse,5,0.452991324433859,0.451258984328921,0.460870507073951,0.464032502395272,0.455137062107035,0.00535425625592767 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_spearman,5,0.404307013373254,0.375204457000438,0.423722498955401,0.359990780271843,0.401905540174473,0.0260763622516296 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_calibration_slope,5,1.31541945732773,1.26664784775092,1.33634930896402,1.3440848137311,1.30361261621168,0.0350786971646647 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_prevalence,5,0.441055234954658,0.434155026365629,0.445516968426104,0.441055234954658,0.440040906513639,0.00592042164227121 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_n,5,3068,3031.6,4152,4852,3417.8,802.273768734838 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_auc,4,0.679894572383923,0.667299950817496,0.695755923530706,,0.681061261519765,0.0155469948161902 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_deviance_explained,4,0.07450303377554,0.0646601702985125,0.0902453951194536,,0.0766099972994279,0.0140343604370956 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_rmse,4,0.471841075766704,0.46640710015749,0.474078424869381,,0.470699423442941,0.00432285345077317 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_spearman,4,0.309879840566642,0.287455251551771,0.337017143093863,,0.311562952535339,0.0271492996990131 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_calibration_slope,4,0.98526068106201,0.904217179229263,1.10544136124084,,0.999238244757039,0.115788682744061 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_prevalence,4,0.443665764352131,0.432608384046217,0.454192825112108,,0.443476364514296,0.0116999631210214 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_n,5,1784,700,1820.4,0,1434.2,802.273768734838 +bryophyte,bryophyte,south,,,Bryum.All,insample_auc,5,0.759638524978058,0.738336536329941,0.771587276369297,0.731612519122241,0.756480820968939,0.0168737687046497 +bryophyte,bryophyte,south,,,Bryum.All,insample_deviance_explained,5,0.130776426233582,0.10969644283403,0.147363316849535,0.102374726573718,0.129595683177172,0.0189542536960939 +bryophyte,bryophyte,south,,,Bryum.All,insample_rmse,5,0.441215418737585,0.435312258575529,0.446819603304355,0.45014802962199,0.440801099915064,0.00606679511585792 +bryophyte,bryophyte,south,,,Bryum.All,insample_spearman,5,0.43469237225877,0.397994649236681,0.454435815679314,0.38752743127734,0.428799374742123,0.0284968826014846 +bryophyte,bryophyte,south,,,Bryum.All,insample_calibration_slope,5,1.50578686836735,1.49163983954254,1.55558377160668,1.56596956813893,1.51918368602666,0.0327144075920258 +bryophyte,bryophyte,south,,,Bryum.All,insample_prevalence,5,0.370562770562771,0.365528360602252,0.371569237798783,0.370562770562771,0.369235286484943,0.00385091464779508 +bryophyte,bryophyte,south,,,Bryum.All,insample_n,5,1444,1429.8,1968,2310,1614.6,388.936113005722 +bryophyte,bryophyte,south,,,Bryum.All,oob_auc,4,0.692003745675621,0.680380055385506,0.703976086037884,,0.692128263558531,0.01343490275736 +bryophyte,bryophyte,south,,,Bryum.All,oob_deviance_explained,4,0.0783027482734894,0.0716373879344079,0.0915333603750256,,0.0806474810457946,0.0110392449625809 +bryophyte,bryophyte,south,,,Bryum.All,oob_rmse,4,0.45863474562491,0.45604067899051,0.46061169737193,,0.458414347450846,0.00250844418690233 +bryophyte,bryophyte,south,,,Bryum.All,oob_spearman,4,0.320939082483711,0.301815094565766,0.342841823640355,,0.321931494354675,0.0231435360059765 +bryophyte,bryophyte,south,,,Bryum.All,oob_calibration_slope,4,1.09662904012228,0.993529866018111,1.27630326550145,,1.12397727272049,0.154913771982226 +bryophyte,bryophyte,south,,,Bryum.All,oob_prevalence,4,0.3703593055487,0.368749240306309,0.380219211352906,,0.37330567717792,0.0072755089177001 +bryophyte,bryophyte,south,,,Bryum.All,oob_n,5,866,342,880.2,0,695.4,388.936113005722 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_auc,5,0.823147551216717,0.794203835429771,0.838336082555962,0.786377083624582,0.818061643861135,0.0221814728437685 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_deviance_explained,5,0.225042105967546,0.178940106465417,0.252212316358221,0.164584891724021,0.218793167566273,0.0371268460820209 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_rmse,5,0.370587371751454,0.36196274314068,0.380460190301878,0.386051104257128,0.370724878175682,0.00981894013326031 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_spearman,5,0.48152153022619,0.432516252628978,0.502880609345115,0.423916836734411,0.470448834163866,0.0352951485472676 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_calibration_slope,5,1.29145219413511,1.24692821558315,1.34705144837751,1.36205696748937,1.29527079227154,0.0495806136224783 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_prevalence,5,0.23982683982684,0.231460603487586,0.246697056850865,0.23982683982684,0.239405392468179,0.00765174673579537 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_n,5,1462,1452.8,1977.6,2310,1631.4,379.498089586759 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_auc,4,0.744853794244395,0.739000361169365,0.748758050361756,,0.744157659616656,0.00538762517048332 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_deviance_explained,4,0.118965259283552,0.115595923326165,0.123304867424306,,0.119311785063326,0.00442770121306163 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_rmse,4,0.400341061423918,0.39253928664869,0.409042917617396,,0.400662519073293,0.00886215457460649 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_spearman,4,0.360390263759665,0.348330519761875,0.376247023241453,,0.361746340718236,0.0150496475888219 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_calibration_slope,4,0.878578076085833,0.817528482883878,0.935472134856519,,0.877093956646094,0.0633289046204762 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_prevalence,4,0.238999572635154,0.227667581639544,0.255610993801512,,0.240885083410421,0.0151422609821477 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_n,5,848,332.4,857.2,0,678.6,379.498089586759 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_auc,5,0.815376104342893,0.806408743486995,0.829192366991812,0.801446263932847,0.817422800660919,0.0117541725407816 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_deviance_explained,5,0.235256336112931,0.218486399077719,0.253159862238942,0.210892705603289,0.235879058660233,0.0178127519901138 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_rmse,5,0.414299254942218,0.408000062905618,0.419452093871422,0.422064990629647,0.413799314397516,0.00595401347945583 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_spearman,5,0.531716539881804,0.516357063924267,0.554895667802972,0.508116650782436,0.53509161754183,0.0197355600183397 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_calibration_slope,5,1.18690970286461,1.17728682203218,1.19602646436075,1.19367118382492,1.18706175198594,0.0097573778655505 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_prevalence,5,0.384787472035794,0.382719077877937,0.387875670039505,0.384787472035794,0.385092893007771,0.00278105998275642 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_n,5,3685,3644,4976.6,5811,4102.6,955.610956404331 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_auc,4,0.772594279582646,0.761956780012735,0.777979733363127,,0.770718548943564,0.00886647282464756 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_deviance_explained,4,0.183035722855659,0.169942245460023,0.189811598246844,,0.180779436425498,0.0111322833286256 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_rmse,4,0.431781940585943,0.428745826590577,0.436558683188472,,0.43240359365993,0.00429936332656117 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_spearman,4,0.459548984924136,0.442333376456973,0.467058185790501,,0.456082410780994,0.013851497043406 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_calibration_slope,4,1.01963260828438,0.967252467250619,1.0506427890174,,1.01200047960554,0.0482450962787272 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_prevalence,4,0.385212683681362,0.378550429000763,0.388624647224836,,0.384051865418103,0.00565743785692542 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_n,5,2126,834.4,2167,0,1708.4,955.610956404331 +lichen,lichen,north,,,Physcia.adscendens,insample_auc,5,0.87986382101311,0.871189876670825,0.881324115281201,0.86548931140534,0.877518812853977,0.00676874818668662 +lichen,lichen,north,,,Physcia.adscendens,insample_deviance_explained,5,0.361431267817238,0.342129041991733,0.366051325747558,0.329951414540256,0.356672956966753,0.0151676451256419 +lichen,lichen,north,,,Physcia.adscendens,insample_rmse,5,0.365880641585659,0.363099981508384,0.372140135732855,0.37622420720278,0.366887887993744,0.0054064068105167 +lichen,lichen,north,,,Physcia.adscendens,insample_spearman,5,0.641244299615411,0.624485568613088,0.642109429604184,0.615824694732003,0.635701141978883,0.0112764989620447 +lichen,lichen,north,,,Physcia.adscendens,insample_calibration_slope,5,1.12508500469074,1.1209608311491,1.13852408174148,1.12752423275806,1.12808101707466,0.0103252165646239 +lichen,lichen,north,,,Physcia.adscendens,insample_prevalence,5,0.382961350027218,0.378754207234193,0.387054085275807,0.384099122354156,0.382969715660275,0.00456567123234541 +lichen,lichen,north,,,Physcia.adscendens,insample_n,5,3699,3673.4,4975,5811,4115.6,947.965083745177 +lichen,lichen,north,,,Physcia.adscendens,oob_auc,4,0.856003334337641,0.852007093367877,0.865183268309771,,0.857854653267057,0.00738034558423486 +lichen,lichen,north,,,Physcia.adscendens,oob_deviance_explained,4,0.313033628246285,0.305358149608293,0.331182817389373,,0.316774239140962,0.0145679637434759 +lichen,lichen,north,,,Physcia.adscendens,oob_rmse,4,0.381942009544814,0.376585949453844,0.387388683261567,,0.381974371554022,0.00579919914131507 +lichen,lichen,north,,,Physcia.adscendens,oob_spearman,4,0.600405554291497,0.594784028409698,0.614909642835288,,0.603577898099351,0.0116809529318417 +lichen,lichen,north,,,Physcia.adscendens,oob_calibration_slope,4,1.06497910354526,1.04388551817711,1.08680446461778,,1.06524045201111,0.0236225750177993 +lichen,lichen,north,,,Physcia.adscendens,oob_prevalence,4,0.386432660247333,0.378648004672367,0.394703317951312,,0.386606232436266,0.00923888826136022 +lichen,lichen,north,,,Physcia.adscendens,oob_n,5,2112,836,2137.6,0,1695.4,947.965083745177 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_auc,5,0.895073823888345,0.885054972678555,0.912505531930283,0.880547483962199,0.89739469941863,0.0158211706487135 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_deviance_explained,5,0.287858557394288,0.261555579842225,0.33138105957702,0.250053679466143,0.294257546956107,0.0362440397559265 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_rmse,5,0.255403849344309,0.240395026711506,0.260690871678816,0.26261328351279,0.251621365864084,0.010257945984937 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_spearman,5,0.396635614172772,0.386400172422742,0.406301961239085,0.38439016948612,0.396212422390736,0.010010523859884 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_calibration_slope,5,1.50390376190998,1.44299525909841,1.5522457539243,1.51164139244749,1.49918808814396,0.0595338432590377 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_prevalence,5,0.0907849829351536,0.0854880550520455,0.0942546707117982,0.092924126172208,0.0900691492139895,0.00433337917377339 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_n,5,1482,1471.8,2004.4,2346,1653.4,387.296785424305 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_auc,4,0.842037571011741,0.816879244759755,0.849698072560503,,0.835788347903447,0.0192442467075879 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_deviance_explained,4,0.207749940162943,0.163009470288789,0.217109435251056,,0.195113877739357,0.032868723867473 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_rmse,4,0.279273385070431,0.267174689702332,0.290817607904244,,0.279075359165329,0.0128855810525773 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_spearman,4,0.345988121828092,0.336331866646148,0.365185084504574,,0.349395517361856,0.016744190341194 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_calibration_slope,4,1.14299961335438,1.06540128461577,1.24284860727251,,1.15094627948992,0.0991149034790211 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_prevalence,4,0.0997452652709462,0.0913286406440493,0.106312613843352,,0.0990848095371992,0.00808662138066247 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_n,5,864,341.6,874.2,0,692.6,387.296785424305 +lichen,lichen,south,,,Physcia.adscendens,insample_auc,5,0.898871357029697,0.886200382437962,0.903437983597461,0.881318203299536,0.896085000631829,0.00919852367118239 +lichen,lichen,south,,,Physcia.adscendens,insample_deviance_explained,5,0.373699047561297,0.341388570686875,0.388440078849794,0.331631552338401,0.367492535342302,0.024026318803441 +lichen,lichen,south,,,Physcia.adscendens,insample_rmse,5,0.320644442407283,0.310586201524553,0.327242449222737,0.329726334532187,0.319146666602479,0.00827946600716445 +lichen,lichen,south,,,Physcia.adscendens,insample_spearman,5,0.565897493706032,0.551126197259348,0.574711543243248,0.543740974860115,0.564187557612995,0.0126582674773541 +lichen,lichen,south,,,Physcia.adscendens,insample_calibration_slope,5,1.17334993479259,1.15247324968426,1.20766461026711,1.17842325405417,1.17731780414909,0.0303991171485092 +lichen,lichen,south,,,Physcia.adscendens,insample_prevalence,5,0.215686274509804,0.210370852380551,0.218705697782215,0.215686274509804,0.214933253293698,0.00478783760132252 +lichen,lichen,south,,,Physcia.adscendens,insample_n,5,1487,1480.8,2014,2346,1662.2,382.531305908418 +lichen,lichen,south,,,Physcia.adscendens,oob_auc,4,0.851047202152853,0.846405376941337,0.867340891167645,,0.855208582082595,0.0124964664063059 +lichen,lichen,south,,,Physcia.adscendens,oob_deviance_explained,4,0.280028728991827,0.266399727053094,0.309248288520692,,0.285596785274017,0.0244176929799479 +lichen,lichen,south,,,Physcia.adscendens,oob_rmse,4,0.346473164191985,0.342472926296628,0.347077228803126,,0.345260245161908,0.00296068154719772 +lichen,lichen,south,,,Physcia.adscendens,oob_spearman,4,0.500475278816252,0.489682287766023,0.532656797548951,,0.508114038702848,0.0253990413096135 +lichen,lichen,south,,,Physcia.adscendens,oob_calibration_slope,4,0.990441880317761,0.95495248678548,1.14980122597578,,1.0346811489341,0.122347688811475 +lichen,lichen,south,,,Physcia.adscendens,oob_prevalence,4,0.21549434057534,0.209833885194357,0.226186106799465,,0.217291237305033,0.00944381193189753 +lichen,lichen,south,,,Physcia.adscendens,oob_n,5,859,332,865.2,0,683.8,382.531305908418 +mite,mite,north,,,Ceratozetes.gracilis,insample_auc,5,0.826182278028632,0.816521754811759,0.829455937159375,0.810417863230229,0.824044783777931,0.00795552173287048 +mite,mite,north,,,Ceratozetes.gracilis,insample_deviance_explained,5,0.231267297848416,0.213201098763747,0.238324197836685,0.201445529059475,0.227699115159987,0.0153219192362521 +mite,mite,north,,,Ceratozetes.gracilis,insample_rmse,5,0.352364410091925,0.349879967947193,0.356659764939223,0.358997802596467,0.353003173103352,0.0038204828240045 +mite,mite,north,,,Ceratozetes.gracilis,insample_spearman,5,0.461401757448599,0.446250390127651,0.464642687155511,0.43677266997156,0.457396167887806,0.0117659480925826 +mite,mite,north,,,Ceratozetes.gracilis,insample_calibration_slope,5,1.21678683407768,1.18937120711011,1.23621444478937,1.24294686598034,1.2129265803526,0.0234407640151893 +mite,mite,north,,,Ceratozetes.gracilis,insample_prevalence,5,0.211169769380383,0.208505864577966,0.211369634473166,0.208369812642269,0.210190443530451,0.00151474200965215 +mite,mite,north,,,Ceratozetes.gracilis,insample_n,5,3651,3606.6,4890.2,5711,4047.6,930.188045504779 +mite,mite,north,,,Ceratozetes.gracilis,oob_auc,4,0.79426775302943,0.787956043932085,0.804223230874757,,0.795569099010852,0.00900575889899819 +mite,mite,north,,,Ceratozetes.gracilis,oob_deviance_explained,4,0.181240697775308,0.173156276419376,0.200349686942691,,0.185178043422255,0.0152725036847127 +mite,mite,north,,,Ceratozetes.gracilis,oob_rmse,4,0.362345634708091,0.35679591208279,0.365726663308442,,0.361571101127752,0.00488165927975959 +mite,mite,north,,,Ceratozetes.gracilis,oob_spearman,4,0.411784338169553,0.402576511113279,0.424080827132331,,0.41288743170759,0.0116887396514023 +mite,mite,north,,,Ceratozetes.gracilis,oob_calibration_slope,4,1.03416883570894,0.995383257319488,1.07370097484877,,1.03443546454836,0.0452258906146394 +mite,mite,north,,,Ceratozetes.gracilis,oob_prevalence,4,0.203407429558746,0.203105380508127,0.206516438658429,,0.204409915290554,0.0022495255846381 +mite,mite,north,,,Ceratozetes.gracilis,oob_n,5,2060,820.8,2104.4,0,1663.4,930.188045504779 +mite,mite,north,,,Trhypochthonius.tectorum,insample_auc,5,0.731788486098831,0.721501432798366,0.737801366376397,0.719034144300359,0.730136069029822,0.00813913725778266 +mite,mite,north,,,Trhypochthonius.tectorum,insample_deviance_explained,5,0.089499141646384,0.0821495255764537,0.0960602274910759,0.0779330791197977,0.0895245403852761,0.00737795356490991 +mite,mite,north,,,Trhypochthonius.tectorum,insample_rmse,5,0.283410154150045,0.280940933784026,0.287680898441404,0.284893639283448,0.283967624826095,0.00353594946086111 +mite,mite,north,,,Trhypochthonius.tectorum,insample_spearman,5,0.236608716108323,0.227773764176821,0.240562377561535,0.223150481665208,0.234902163775881,0.00721275854062407 +mite,mite,north,,,Trhypochthonius.tectorum,insample_calibration_slope,5,1.54050924512857,1.50382184576707,1.56345024448917,1.52280871270927,1.53476818649162,0.0317387254550959 +mite,mite,north,,,Trhypochthonius.tectorum,insample_prevalence,5,0.0956049728593941,0.0940001763114542,0.0987931854359719,0.0956049728593941,0.0960754727002272,0.00270898671716411 +mite,mite,north,,,Trhypochthonius.tectorum,insample_n,5,3624,3599.2,4881,5711,4034.4,937.384819591186 +mite,mite,north,,,Trhypochthonius.tectorum,oob_auc,4,0.665838582750602,0.644373925527224,0.667941841641007,,0.658923797631683,0.0154266815569887 +mite,mite,north,,,Trhypochthonius.tectorum,oob_deviance_explained,4,0.0519284611125678,0.0429411996388765,0.0550247457278241,,0.0498245408059838,0.00699156135214757 +mite,mite,north,,,Trhypochthonius.tectorum,oob_rmse,4,0.289249405182921,0.278984643806527,0.292884990099047,,0.286881842161397,0.00803889505487629 +mite,mite,north,,,Trhypochthonius.tectorum,oob_spearman,4,0.16623095413497,0.147468104006897,0.170095199986913,,0.160910024036352,0.0139031946555173 +mite,mite,north,,,Trhypochthonius.tectorum,oob_calibration_slope,4,1.07931316571659,1.03972983697462,1.10202080016984,,1.07328613204205,0.0341915886247604 +mite,mite,north,,,Trhypochthonius.tectorum,oob_prevalence,4,0.0963264503316864,0.0893459374618542,0.0984905896614327,,0.0946063169245129,0.00535078906761863 +mite,mite,north,,,Trhypochthonius.tectorum,oob_n,5,2087,830,2111.8,0,1676.6,937.384819591186 +mite,mite,south,,,Ceratozetes.gracilis,insample_auc,5,0.942715600292339,0.932112922455432,0.953301387433802,0.926042685188307,0.943090227395079,0.0111389544465627 +mite,mite,south,,,Ceratozetes.gracilis,insample_deviance_explained,5,0.427953599539456,0.413784649241568,0.480600172487078,0.405285180679334,0.443379656003744,0.0341181163398782 +mite,mite,south,,,Ceratozetes.gracilis,insample_rmse,5,0.184823162519783,0.176047681018203,0.185141671619161,0.185304259029678,0.181569331289641,0.00488436751438256 +mite,mite,south,,,Ceratozetes.gracilis,insample_spearman,5,0.35620257400788,0.340678404454552,0.379056424974169,0.34190797405616,0.358247165802908,0.0198680837526217 +mite,mite,south,,,Ceratozetes.gracilis,insample_calibration_slope,5,1.25875319096791,1.18792873308144,1.26769206713498,1.22128545305663,1.23580508870431,0.0436191039746415 +mite,mite,south,,,Ceratozetes.gracilis,insample_prevalence,5,0.056970509383378,0.0521775638545351,0.0622115928022082,0.0562843842573,0.0572190090351997,0.00535467847864499 +mite,mite,south,,,Ceratozetes.gracilis,insample_n,5,1494,1479.4,2024.6,2363,1667.4,389.193139713433 +mite,mite,south,,,Ceratozetes.gracilis,oob_auc,4,0.899513670078415,0.885097180565786,0.904114554742769,,0.896008096918317,0.0111850562409658 +mite,mite,south,,,Ceratozetes.gracilis,oob_deviance_explained,4,0.330461644197965,0.273903739632069,0.353307724359802,,0.318421706910801,0.0447811919440956 +mite,mite,south,,,Ceratozetes.gracilis,oob_rmse,4,0.19006583026612,0.186341206112452,0.212559607487313,,0.196769099218808,0.0163471621353765 +mite,mite,south,,,Ceratozetes.gracilis,oob_spearman,4,0.314444039218996,0.278883116159444,0.344185767138818,,0.312365755240521,0.0361037411808717 +mite,mite,south,,,Ceratozetes.gracilis,oob_calibration_slope,4,1.06107071860598,0.803554353024927,1.27392143861765,,1.0451187023312,0.25286328994353 +mite,mite,south,,,Ceratozetes.gracilis,oob_prevalence,4,0.0533392883804503,0.0452752248602848,0.0645232647455575,,0.0544535429679295,0.0107814199736608 +mite,mite,south,,,Ceratozetes.gracilis,oob_n,5,869,338.4,883.6,0,695.6,389.193139713433 +mite,mite,south,,,Trhypochthonius.tectorum,insample_auc,5,0.837855511959389,0.805765764097379,0.84231766500586,0.786388392836218,0.828631832042505,0.0238300319446749 +mite,mite,south,,,Trhypochthonius.tectorum,insample_deviance_explained,5,0.209230848054206,0.158595489219605,0.229031165924718,0.13149934388309,0.198880441235109,0.0400562446987762 +mite,mite,south,,,Trhypochthonius.tectorum,insample_rmse,5,0.251247166617746,0.24633782963714,0.259093975322127,0.261989594963612,0.252389725672996,0.00667483988429221 +mite,mite,south,,,Trhypochthonius.tectorum,insample_spearman,5,0.322695119515102,0.29322152947867,0.328515154391205,0.274559246907003,0.314784280029552,0.0228478751930695 +mite,mite,south,,,Trhypochthonius.tectorum,insample_calibration_slope,5,1.44186841542906,1.38107930908262,1.69286838979393,1.7601996033358,1.51193828017518,0.163101488371433 +mite,mite,south,,,Trhypochthonius.tectorum,insample_prevalence,5,0.0833685992382565,0.0807473443243282,0.0863035095821866,0.0833685992382565,0.083401335320589,0.00299510185415199 +mite,mite,south,,,Trhypochthonius.tectorum,insample_n,5,1489,1484.4,2017.4,2363,1664.2,390.68875079787 +mite,mite,south,,,Trhypochthonius.tectorum,oob_auc,4,0.709581235058518,0.700263968081739,0.720188804650318,,0.710042057421026,0.011106114271277 +mite,mite,south,,,Trhypochthonius.tectorum,oob_deviance_explained,4,0.0756867710759595,0.0537734694408186,0.0971274171666329,,0.075517965524364,0.0237215881650346 +mite,mite,south,,,Trhypochthonius.tectorum,oob_rmse,4,0.269720754580475,0.262049411388901,0.276021187676139,,0.269231143831936,0.00752532738911156 +mite,mite,south,,,Trhypochthonius.tectorum,oob_spearman,4,0.195797695247362,0.19170761239436,0.214434288798715,,0.20099287763963,0.0138755383091438 +mite,mite,south,,,Trhypochthonius.tectorum,oob_calibration_slope,4,0.806539758452825,0.607652989317457,0.986918071629174,,0.799929595610318,0.214213885655849 +mite,mite,south,,,Trhypochthonius.tectorum,oob_prevalence,4,0.0842873358196854,0.0775201528145626,0.0881856815952926,,0.0832627510948584,0.00595703320150957 +mite,mite,south,,,Trhypochthonius.tectorum,oob_n,5,874,345.6,878.6,0,698.8,390.68875079787 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_auc,5,0.88074391437416,0.870230840102412,0.889917229276511,0.866574078302184,0.880444461635148,0.00984236243578891 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_deviance_explained,5,0.366033789516191,0.340896204768951,0.387063961911437,0.333940767583082,0.364894595014137,0.0228902383131863 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_rmse,5,0.368658494477631,0.361033107966769,0.377805347943015,0.380294274281245,0.369101499001343,0.00830529500422763 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_spearman,5,0.649750548197459,0.632914011655006,0.665283576748038,0.626449726132344,0.649764465281971,0.0163034666515923 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_calibration_slope,5,1.11607404452359,1.11062727390296,1.12573590395919,1.11607404452359,1.11761659226476,0.00852003589446049 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_prevalence,5,0.418242653476869,0.411391418988775,0.421189975169674,0.418242653476869,0.416870814782784,0.00501851999449775 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_n,5,4366,4320.2,5874.4,6874,4851.6,1130.83522230252 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_auc,4,0.854194011002684,0.852836376582826,0.856365562566068,,0.854484695696801,0.00192352569739418 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_deviance_explained,4,0.309213966420281,0.308762924652017,0.313755743334223,,0.310674943258023,0.00327836318990379 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_rmse,4,0.389483536954601,0.387341624018246,0.39094551367838,,0.389240702592967,0.0019799573837795 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_spearman,4,0.605437925396632,0.605207578609941,0.607856758412568,,0.606219527621362,0.00174298051123629 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_calibration_slope,4,1.01719167926395,1.01054630230644,1.05282657723447,,1.02754507962574,0.0266664444355038 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_prevalence,4,0.419241311741466,0.413108455574493,0.430771977433407,,0.421169100857526,0.00978800188867454 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_n,5,2508,999.6,2553.8,0,2022.4,1130.83522230252 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_auc,5,0.881757970386191,0.868733773176606,0.882173763868626,0.862677170473365,0.877303720450926,0.00837793542426503 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_deviance_explained,5,0.363142598073144,0.333942993757039,0.365654455856863,0.319506008380831,0.353769821482049,0.0196047485097617 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_rmse,5,0.366466023093134,0.365620628913175,0.375834932888311,0.381006138302117,0.369388868935656,0.00657216168154903 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_spearman,5,0.641069730267089,0.618664226200737,0.642838911555516,0.609089248685926,0.633743976157725,0.0143625229671699 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_calibration_slope,5,1.11310604804308,1.09708327815688,1.1187942896737,1.11244002667966,1.10966268491777,0.0133476761372488 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_prevalence,5,0.377654931626418,0.37492184315556,0.38072781584232,0.377654931626418,0.377957278345016,0.00308047552556824 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_n,5,4329,4315.8,5874,6874,4842.2,1136.06104589498 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_auc,4,0.846692287097856,0.841593097515866,0.856729668658842,,0.848455927090355,0.00854263183105512 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_deviance_explained,4,0.291501687724023,0.282642104291016,0.312749948065533,,0.295926215191346,0.0173811594692309 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_rmse,4,0.390154939953334,0.384057871104944,0.393796023171734,,0.389277802228338,0.00572214548785396 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_spearman,4,0.581484037896795,0.574690787450859,0.597964897183734,,0.584943898197153,0.0132029847944197 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_calibration_slope,4,1.01368863249399,1.00049931558218,1.04367662745386,,1.0196881603683,0.0241869209030404 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_prevalence,4,0.375247544204322,0.372430611979277,0.382966913772923,,0.376998414684163,0.00599903919350225 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_n,5,2545,1000,2558.2,0,2031.8,1136.06104589498 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_auc,5,0.943960649050962,0.94037488755184,0.953667784494273,0.938366026022059,0.946326517919348,0.00690479709509673 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_deviance_explained,5,0.539980665738958,0.514007725679396,0.570793158649015,0.507219536497198,0.541158084617766,0.0293385503108723 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_rmse,5,0.265995836177662,0.257552096970539,0.276634861788926,0.277737776076124,0.267144244420744,0.00961165228723267 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_spearman,5,0.640807188108982,0.634811703863048,0.656313927462278,0.63231197808786,0.644341202447442,0.0112139813302095 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_calibration_slope,5,1.10742155745054,1.09687391571867,1.12220331399304,1.10996859334024,1.10858309586985,0.0136439671103682 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_prevalence,5,0.222088835534214,0.217190546592102,0.228625506806496,0.222054380664653,0.222881775063893,0.00607679419012681 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_n,5,1692,1666,2267.2,2648,1873.6,433.131388841769 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_auc,4,0.91731096661857,0.91517450234187,0.923219533485924,,0.918658146115232,0.00464588817224989 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_deviance_explained,4,0.456133338222218,0.436887020577346,0.466721499977668,,0.453041139690281,0.0164852708364197 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_rmse,4,0.293625325159631,0.289095652529961,0.300739675613614,,0.2945484243826,0.00674971747803409 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_spearman,4,0.599539540852002,0.593160431622561,0.611607278951094,,0.601571194019734,0.0105902203347522 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_calibration_slope,4,1.01326709065303,0.998581835979821,1.04432711374091,,1.0191152222297,0.0254810730539049 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_prevalence,4,0.218666030567013,0.210018355611084,0.23207994955219,,0.220368260577459,0.0121728164316861 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_n,5,956,380.8,982,0,774.4,433.131388841769 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_auc,5,0.879824378126777,0.864927662300972,0.884353155373554,0.860127236726313,0.876088454793656,0.0102086188258615 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_deviance_explained,5,0.349160779018402,0.323379089314297,0.368399062432554,0.309561218127728,0.347852366898373,0.0240471001432219 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_rmse,5,0.338681607339072,0.335417339645378,0.347191482469894,0.351945008361129,0.340392292809667,0.00678489045930976 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_spearman,5,0.575132441938743,0.557119084277288,0.590747182044567,0.550545432101814,0.574666097531388,0.016886854089622 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_calibration_slope,5,1.17670373526123,1.16179305211448,1.18513327894921,1.19013393137727,1.17379625326662,0.0119075535077798 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_prevalence,5,0.264350453172205,0.25911663216011,0.270295509723619,0.264350453172205,0.264443478235907,0.00620048832939598 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_n,5,1685,1649.4,2266.4,2648,1865.6,437.838212128635 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_auc,4,0.836402373386276,0.830983973583734,0.851439412911307,,0.839837601858593,0.0116626937193136 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_deviance_explained,4,0.272820636539873,0.261425006488755,0.294029649611213,,0.276325416189953,0.0179744147351422 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_rmse,4,0.364147854936566,0.358309639843644,0.367346505676391,,0.363205153381889,0.00496976655195017 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_spearman,4,0.518326341044929,0.498931183602572,0.538964636529514,,0.518770318917153,0.0214671251034815 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_calibration_slope,4,1.02795293531395,0.97591680326038,1.09728108500476,,1.03412865589868,0.0683334106009871 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_prevalence,4,0.266148052343275,0.252246321440467,0.273763588267456,,0.263902982708051,0.0122396324927964 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_n,5,963,381.6,998.6,0,782.4,437.838212128635 diff --git a/3_output/exp_002_soilgrids/run_record.md b/3_output/exp_002_soilgrids/run_record.md new file mode 100644 index 0000000..f87cebc --- /dev/null +++ b/3_output/exp_002_soilgrids/run_record.md @@ -0,0 +1,193 @@ +# Run record: exp_002_soilgrids + +Written by `run_record()`. The result stores this describes are gitignored; this file is what remains. + +## Provenance + +_Volatile. Excluded from cross-run comparison._ + +- **git_commit**: 2b72a2b +- **pipeline_dir**: D:/local_projects/active/sdmMethodsDev/2_pipeline/exp_002_soilgrids +- **r_version**: 4.5.0 +- **written_at**: 2026-10-05 11:17:49 + +## Configuration + +- **boot_seed**: 20260909.0000 +- **changes_from_v2**: stage_models: bryophyte.climate, stage_models: lichen.climate, stage_models: mite.climate, stage_models: vascular_plant.climate, stage_models: bird.climate, covariate_files: soilgrids_0_5cm.csv +- **compared_with**: exp_000_parity_v2 +- **covariate_files**: soilgrids_0_5cm.csv +- **data_dir**: test_dataset +- **engines**: bayesglm, glm +- **focal_species**: bird=AMRO, bird=YEWA, bryophyte=Bryum.All, bryophyte=Ceratodon.purpureus, lichen=Cladonia.chlorophaea, lichen=Physcia.adscendens, mammal=Coyote_Summer, mammal=Coyote_Winter, mammal=Moose_Summer, mammal=Moose_Winter, mite=Ceratozetes.gracilis, mite=Trhypochthonius.tectorum, vascular_plant=Galium.boreale, vascular_plant=Vicia.americana +- **jobs_not_ok**: 0 +- **jobs_ok**: 100 +- **jobs_total**: 100 +- **n_bootstraps**: 5 +- **plant_bootstrap**: spatial_block +- **selection**: aic_average, ivw_grid, staged_bic +- **species_n**: 14 +- **stage_models**: bird.climate, bryophyte.climate, lichen.climate, mite.climate, vascular_plant.climate +- **taxa**: bird, bryophyte, lichen, mite, vascular_plant +- **v2_bootstraps**: 100 + +## Coverage + +| taxon | region | species | draws | coefficient_rows | metric_rows | grid_rows | +| --- | --- | --- | --- | --- | --- | --- | +| bird | north | 2 | 5 | 557 | 140 | 890 | +| bird | south | 2 | 5 | 440 | 140 | 170 | +| bryophyte | north | 2 | 5 | 1190 | 140 | 430 | +| bryophyte | south | 2 | 5 | 480 | 140 | 160 | +| lichen | north | 2 | 5 | 1190 | 140 | 430 | +| lichen | south | 2 | 5 | 480 | 140 | 160 | +| mite | north | 2 | 5 | 1180 | 140 | 430 | +| mite | south | 2 | 5 | 470 | 140 | 160 | +| vascular_plant | north | 2 | 5 | 1180 | 140 | 430 | +| vascular_plant | south | 2 | 5 | 470 | 140 | 160 | + +## Metrics + +| taxon | region | metric | n | median | p10 | p90 | mean | sd | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| bird | north | insample_auc | 10 | 0.7541 | 0.7265 | 0.7797 | 0.7534 | 0.0272 | +| bird | north | insample_calibration_slope | 10 | 0.7426 | 0.6693 | 0.8183 | 0.7415 | 0.0763 | +| bird | north | insample_deviance_explained | 10 | 0.1980 | 0.1450 | 0.2531 | 0.1983 | 0.0554 | +| bird | north | insample_n | 10 | 46747.0000 | 46744.0000 | 46750.0000 | 46747.6000 | 2.3664 | +| bird | north | insample_prevalence | 10 | 0.1851 | 0.1178 | 0.2520 | 0.1850 | 0.0702 | +| bird | north | insample_rmse | 10 | 0.6097 | 0.5551 | 0.6618 | 0.6085 | 0.0554 | +| bird | north | insample_spearman | 10 | 0.3308 | 0.3152 | 0.3508 | 0.3321 | 0.0174 | +| bird | north | oob_auc | 10 | 0.7320 | 0.7284 | 0.7342 | 0.7316 | 0.0027 | +| bird | north | oob_calibration_slope | 10 | 0.7087 | 0.5676 | 0.8262 | 0.7015 | 0.1264 | +| bird | north | oob_deviance_explained | 10 | 0.1607 | 0.1527 | 0.1701 | 0.1611 | 0.0085 | +| bird | north | oob_n | 10 | 124877.0000 | 124874.0000 | 124880.0000 | 124876.4000 | 2.3664 | +| bird | north | oob_prevalence | 10 | 0.1877 | 0.1343 | 0.2411 | 0.1877 | 0.0561 | +| bird | north | oob_rmse | 10 | 0.6351 | 0.5991 | 0.6592 | 0.6308 | 0.0299 | +| bird | north | oob_spearman | 10 | 0.3143 | 0.2731 | 0.3536 | 0.3139 | 0.0416 | +| bird | south | insample_auc | 10 | 0.7199 | 0.7050 | 0.7330 | 0.7193 | 0.0130 | +| bird | south | insample_calibration_slope | 10 | 0.8244 | 0.7483 | 0.8920 | 0.8215 | 0.0726 | +| bird | south | insample_deviance_explained | 10 | 0.1618 | 0.1076 | 0.2277 | 0.1653 | 0.0602 | +| bird | south | insample_n | 10 | 23639.0000 | 23636.0000 | 23640.0000 | 23638.4000 | 1.4298 | +| bird | south | insample_prevalence | 10 | 0.2142 | 0.1711 | 0.2590 | 0.2149 | 0.0459 | +| bird | south | insample_rmse | 10 | 0.6964 | 0.6536 | 0.7409 | 0.6963 | 0.0446 | +| bird | south | insample_spearman | 10 | 0.3123 | 0.3086 | 0.3190 | 0.3130 | 0.0049 | +| bird | south | oob_auc | 10 | 0.7138 | 0.7067 | 0.7233 | 0.7148 | 0.0083 | +| bird | south | oob_calibration_slope | 10 | 0.8552 | 0.7698 | 0.9213 | 0.8423 | 0.0664 | +| bird | south | oob_deviance_explained | 10 | 0.1520 | 0.1115 | 0.1988 | 0.1535 | 0.0434 | +| bird | south | oob_n | 10 | 67168.0000 | 67167.0000 | 67171.0000 | 67168.6000 | 1.4298 | +| bird | south | oob_prevalence | 10 | 0.2178 | 0.1757 | 0.2603 | 0.2180 | 0.0444 | +| bird | south | oob_rmse | 10 | 0.6957 | 0.6590 | 0.7327 | 0.6958 | 0.0384 | +| bird | south | oob_spearman | 10 | 0.3092 | 0.3014 | 0.3182 | 0.3096 | 0.0083 | +| bryophyte | north | insample_auc | 10 | 0.6745 | 0.6438 | 0.7147 | 0.6758 | 0.0333 | +| bryophyte | north | insample_calibration_slope | 10 | 0.8566 | 0.7743 | 0.9035 | 0.8452 | 0.0569 | +| bryophyte | north | insample_deviance_explained | 10 | -0.1839 | -0.2821 | -0.0897 | -0.1872 | 0.0875 | +| bryophyte | north | insample_n | 10 | 3082.5000 | 3033.0000 | 4840.0000 | 3420.2000 | 748.7630 | +| bryophyte | north | insample_prevalence | 10 | 0.4173 | 0.3971 | 0.4428 | 0.4192 | 0.0226 | +| bryophyte | north | insample_rmse | 10 | 0.4717 | 0.4613 | 0.4780 | 0.4708 | 0.0074 | +| bryophyte | north | insample_spearman | 10 | 0.2983 | 0.2437 | 0.3686 | 0.3006 | 0.0590 | +| bryophyte | north | oob_auc | 8 | 0.6598 | 0.6322 | 0.6871 | 0.6600 | 0.0250 | +| bryophyte | north | oob_calibration_slope | 8 | 0.7792 | 0.7056 | 0.8636 | 0.7830 | 0.0679 | +| bryophyte | north | oob_deviance_explained | 8 | -0.1849 | -0.2080 | -0.1268 | -0.1777 | 0.0375 | +| bryophyte | north | oob_n | 10 | 1757.5000 | 0.0000 | 1807.0000 | 1419.8000 | 748.7630 | +| bryophyte | north | oob_prevalence | 8 | 0.4207 | 0.3999 | 0.4507 | 0.4233 | 0.0238 | +| bryophyte | north | oob_rmse | 8 | 0.4788 | 0.4695 | 0.4806 | 0.4767 | 0.0053 | +| bryophyte | north | oob_spearman | 8 | 0.2736 | 0.2243 | 0.3214 | 0.2738 | 0.0446 | +| bryophyte | south | insample_auc | 10 | 0.6764 | 0.6294 | 0.7213 | 0.6751 | 0.0458 | +| bryophyte | south | insample_calibration_slope | 10 | 0.8915 | 0.8418 | 0.9308 | 0.8875 | 0.0505 | +| bryophyte | south | insample_deviance_explained | 10 | -0.0045 | -0.1013 | 0.0597 | -0.0151 | 0.0810 | +| bryophyte | south | insample_n | 10 | 1454.5000 | 1440.8000 | 2310.0000 | 1623.0000 | 362.3789 | +| bryophyte | south | insample_prevalence | 10 | 0.3052 | 0.2352 | 0.3713 | 0.3043 | 0.0687 | +| bryophyte | south | insample_rmse | 10 | 0.4397 | 0.3995 | 0.4742 | 0.4378 | 0.0375 | +| bryophyte | south | insample_spearman | 10 | 0.2745 | 0.2165 | 0.3280 | 0.2716 | 0.0546 | +| bryophyte | south | oob_auc | 8 | 0.6723 | 0.6100 | 0.7113 | 0.6648 | 0.0465 | +| bryophyte | south | oob_calibration_slope | 8 | 0.8245 | 0.7429 | 0.8828 | 0.8190 | 0.0712 | +| bryophyte | south | oob_deviance_explained | 8 | 0.0152 | -0.0449 | 0.0489 | 0.0069 | 0.0399 | +| bryophyte | south | oob_n | 10 | 855.5000 | 0.0000 | 869.2000 | 687.0000 | 362.3789 | +| bryophyte | south | oob_prevalence | 8 | 0.3139 | 0.2297 | 0.3751 | 0.3071 | 0.0716 | +| bryophyte | south | oob_rmse | 8 | 0.4450 | 0.4014 | 0.4768 | 0.4420 | 0.0365 | +| bryophyte | south | oob_spearman | 8 | 0.2677 | 0.1840 | 0.3107 | 0.2559 | 0.0577 | +| lichen | north | insample_auc | 10 | 0.8108 | 0.7822 | 0.8398 | 0.8110 | 0.0287 | +| lichen | north | insample_calibration_slope | 10 | 0.9970 | 0.9817 | 1.0040 | 0.9950 | 0.0122 | +| lichen | north | insample_deviance_explained | 10 | 0.1447 | 0.1127 | 0.1682 | 0.1437 | 0.0233 | +| lichen | north | insample_n | 10 | 3683.5000 | 3648.0000 | 5799.0000 | 4101.0000 | 895.3279 | +| lichen | north | insample_prevalence | 10 | 0.3838 | 0.3809 | 0.3889 | 0.3839 | 0.0037 | +| lichen | north | insample_rmse | 10 | 0.4098 | 0.3943 | 0.4274 | 0.4103 | 0.0166 | +| lichen | north | insample_spearman | 10 | 0.5233 | 0.4764 | 0.5719 | 0.5239 | 0.0482 | +| lichen | north | oob_auc | 8 | 0.7988 | 0.7671 | 0.8385 | 0.8014 | 0.0360 | +| lichen | north | oob_calibration_slope | 8 | 0.9671 | 0.9172 | 1.0156 | 0.9636 | 0.0425 | +| lichen | north | oob_deviance_explained | 8 | 0.1175 | 0.0897 | 0.1810 | 0.1312 | 0.0457 | +| lichen | north | oob_n | 10 | 2115.5000 | 0.0000 | 2151.0000 | 1698.0000 | 895.3279 | +| lichen | north | oob_prevalence | 8 | 0.3867 | 0.3758 | 0.3919 | 0.3854 | 0.0074 | +| lichen | north | oob_rmse | 8 | 0.4177 | 0.3946 | 0.4339 | 0.4154 | 0.0192 | +| lichen | north | oob_spearman | 8 | 0.5050 | 0.4502 | 0.5688 | 0.5081 | 0.0609 | +| lichen | south | insample_auc | 10 | 0.8159 | 0.8090 | 0.8227 | 0.8145 | 0.0081 | +| lichen | south | insample_calibration_slope | 10 | 0.9040 | 0.8837 | 0.9858 | 0.9213 | 0.0510 | +| lichen | south | insample_deviance_explained | 10 | 0.1833 | 0.1122 | 0.2365 | 0.1800 | 0.0594 | +| lichen | south | insample_n | 10 | 1484.5000 | 1478.5000 | 2346.0000 | 1657.8000 | 362.9370 | +| lichen | south | insample_prevalence | 10 | 0.1511 | 0.0868 | 0.2167 | 0.1525 | 0.0659 | +| lichen | south | insample_rmse | 10 | 0.3165 | 0.2665 | 0.3571 | 0.3136 | 0.0448 | +| lichen | south | insample_spearman | 10 | 0.3796 | 0.3059 | 0.4536 | 0.3801 | 0.0749 | +| lichen | south | oob_auc | 8 | 0.8102 | 0.8051 | 0.8167 | 0.8106 | 0.0052 | +| lichen | south | oob_calibration_slope | 8 | 0.9501 | 0.8320 | 1.0148 | 0.9351 | 0.0882 | +| lichen | south | oob_deviance_explained | 8 | 0.1248 | 0.0288 | 0.2400 | 0.1297 | 0.1064 | +| lichen | south | oob_n | 10 | 861.5000 | 0.0000 | 867.5000 | 688.2000 | 362.9370 | +| lichen | south | oob_prevalence | 8 | 0.1578 | 0.0943 | 0.2207 | 0.1582 | 0.0637 | +| lichen | south | oob_rmse | 8 | 0.3253 | 0.2761 | 0.3630 | 0.3220 | 0.0415 | +| lichen | south | oob_spearman | 8 | 0.3824 | 0.3133 | 0.4564 | 0.3831 | 0.0708 | +| mite | north | insample_auc | 10 | 0.7389 | 0.6689 | 0.8071 | 0.7375 | 0.0683 | +| mite | north | insample_calibration_slope | 10 | 0.9673 | 0.9418 | 1.0141 | 0.9757 | 0.0339 | +| mite | north | insample_deviance_explained | 10 | 0.0604 | -0.0403 | 0.1524 | 0.0561 | 0.0924 | +| mite | north | insample_n | 10 | 3625.0000 | 3591.6000 | 5699.0000 | 4033.4000 | 878.0981 | +| mite | north | insample_prevalence | 10 | 0.1545 | 0.0942 | 0.2110 | 0.1529 | 0.0599 | +| mite | north | insample_rmse | 10 | 0.3251 | 0.2868 | 0.3645 | 0.3251 | 0.0388 | +| mite | north | insample_spearman | 10 | 0.3036 | 0.1717 | 0.4335 | 0.3012 | 0.1316 | +| mite | north | oob_auc | 8 | 0.7219 | 0.6345 | 0.7914 | 0.7182 | 0.0766 | +| mite | north | oob_calibration_slope | 8 | 0.8853 | 0.7204 | 1.0177 | 0.8727 | 0.1335 | +| mite | north | oob_deviance_explained | 8 | 0.0326 | -0.0820 | 0.1157 | 0.0210 | 0.1014 | +| mite | north | oob_n | 10 | 2074.0000 | 0.0000 | 2107.4000 | 1665.6000 | 878.0981 | +| mite | north | oob_prevalence | 8 | 0.1509 | 0.0926 | 0.2051 | 0.1496 | 0.0589 | +| mite | north | oob_rmse | 8 | 0.3269 | 0.2857 | 0.3682 | 0.3271 | 0.0417 | +| mite | north | oob_spearman | 8 | 0.2814 | 0.1360 | 0.4065 | 0.2767 | 0.1366 | +| mite | south | insample_auc | 10 | 0.8090 | 0.7263 | 0.8899 | 0.8085 | 0.0824 | +| mite | south | insample_calibration_slope | 10 | 0.8655 | 0.6364 | 1.0239 | 0.8420 | 0.1769 | +| mite | south | insample_deviance_explained | 10 | 0.0741 | 0.0211 | 0.2135 | 0.1104 | 0.0917 | +| mite | south | insample_n | 10 | 1493.0000 | 1480.9000 | 2363.0000 | 1665.8000 | 367.6444 | +| mite | south | insample_prevalence | 10 | 0.0721 | 0.0556 | 0.0841 | 0.0703 | 0.0144 | +| mite | south | insample_rmse | 10 | 0.2418 | 0.2082 | 0.2675 | 0.2389 | 0.0293 | +| mite | south | insample_spearman | 10 | 0.2617 | 0.2163 | 0.3199 | 0.2658 | 0.0493 | +| mite | south | oob_auc | 8 | 0.7973 | 0.6948 | 0.8805 | 0.7897 | 0.0920 | +| mite | south | oob_calibration_slope | 8 | 0.6161 | 0.5692 | 0.8871 | 0.7014 | 0.2137 | +| mite | south | oob_deviance_explained | 8 | 0.0782 | 0.0309 | 0.2029 | 0.1035 | 0.0744 | +| mite | south | oob_n | 10 | 870.0000 | 0.0000 | 882.1000 | 697.2000 | 367.6444 | +| mite | south | oob_prevalence | 8 | 0.0719 | 0.0489 | 0.0868 | 0.0689 | 0.0174 | +| mite | south | oob_rmse | 8 | 0.2425 | 0.2097 | 0.2762 | 0.2428 | 0.0311 | +| mite | south | oob_spearman | 8 | 0.2435 | 0.1802 | 0.3147 | 0.2449 | 0.0581 | +| vascular_plant | north | insample_auc | 10 | 0.8299 | 0.8275 | 0.8344 | 0.8306 | 0.0031 | +| vascular_plant | north | insample_calibration_slope | 10 | 0.9989 | 0.9805 | 1.0079 | 0.9964 | 0.0112 | +| vascular_plant | north | insample_deviance_explained | 10 | 0.1577 | 0.1325 | 0.1769 | 0.1561 | 0.0207 | +| vascular_plant | north | insample_n | 10 | 4338.5000 | 4308.5000 | 6862.0000 | 4838.4000 | 1066.7948 | +| vascular_plant | north | insample_prevalence | 10 | 0.3951 | 0.3773 | 0.4205 | 0.3973 | 0.0204 | +| vascular_plant | north | insample_rmse | 10 | 0.4028 | 0.3977 | 0.4063 | 0.4025 | 0.0036 | +| vascular_plant | north | insample_spearman | 10 | 0.5607 | 0.5560 | 0.5626 | 0.5599 | 0.0044 | +| vascular_plant | north | oob_auc | 8 | 0.8248 | 0.8193 | 0.8282 | 0.8239 | 0.0057 | +| vascular_plant | north | oob_calibration_slope | 8 | 0.9729 | 0.9608 | 0.9918 | 0.9756 | 0.0206 | +| vascular_plant | north | oob_deviance_explained | 8 | 0.1764 | 0.1264 | 0.2002 | 0.1683 | 0.0334 | +| vascular_plant | north | oob_n | 10 | 2523.5000 | 0.0000 | 2553.5000 | 2023.6000 | 1066.7948 | +| vascular_plant | north | oob_prevalence | 8 | 0.3990 | 0.3730 | 0.4273 | 0.3992 | 0.0244 | +| vascular_plant | north | oob_rmse | 8 | 0.4067 | 0.4013 | 0.4115 | 0.4067 | 0.0053 | +| vascular_plant | north | oob_spearman | 8 | 0.5488 | 0.5418 | 0.5583 | 0.5489 | 0.0072 | +| vascular_plant | south | insample_auc | 10 | 0.8434 | 0.8003 | 0.8883 | 0.8446 | 0.0436 | +| vascular_plant | south | insample_calibration_slope | 10 | 0.9422 | 0.9125 | 0.9698 | 0.9389 | 0.0248 | +| vascular_plant | south | insample_deviance_explained | 10 | 0.2676 | 0.1548 | 0.3656 | 0.2616 | 0.0993 | +| vascular_plant | south | insample_n | 10 | 1688.5000 | 1654.9000 | 2648.0000 | 1869.6000 | 410.6067 | +| vascular_plant | south | insample_prevalence | 10 | 0.2438 | 0.2212 | 0.2654 | 0.2437 | 0.0227 | +| vascular_plant | south | insample_rmse | 10 | 0.3499 | 0.3139 | 0.3859 | 0.3501 | 0.0355 | +| vascular_plant | south | insample_spearman | 10 | 0.5101 | 0.4587 | 0.5581 | 0.5098 | 0.0494 | +| vascular_plant | south | oob_auc | 8 | 0.8358 | 0.8038 | 0.8840 | 0.8404 | 0.0376 | +| vascular_plant | south | oob_calibration_slope | 8 | 0.9177 | 0.8994 | 0.9463 | 0.9212 | 0.0221 | +| vascular_plant | south | oob_deviance_explained | 8 | 0.2348 | 0.1654 | 0.3159 | 0.2393 | 0.0767 | +| vascular_plant | south | oob_n | 10 | 959.5000 | 0.0000 | 993.1000 | 778.4000 | 410.6067 | +| vascular_plant | south | oob_prevalence | 8 | 0.2418 | 0.2131 | 0.2706 | 0.2421 | 0.0259 | +| vascular_plant | south | oob_rmse | 8 | 0.3552 | 0.3225 | 0.3848 | 0.3544 | 0.0311 | +| vascular_plant | south | oob_spearman | 8 | 0.4955 | 0.4610 | 0.5476 | 0.5025 | 0.0399 | + diff --git a/3_output/exp_002_soilgrids/tables/comparison_grid.csv b/3_output/exp_002_soilgrids/tables/comparison_grid.csv new file mode 100644 index 0000000..b169005 --- /dev/null +++ b/3_output/exp_002_soilgrids/tables/comparison_grid.csv @@ -0,0 +1,21 @@ +taxon,region,season,part,species,grid_units,spearman,median_absolute_difference +bird,north,"","",AMRO,89,0.914334354783793,0.0045059319526291 +bird,north,"","",YEWA,89,0.985342185903984,0.0056219561479154 +bird,south,"","",AMRO,17,0.941176470588235,0.0041633429827389 +bird,south,"","",YEWA,17,0.948529411764706,0.0182708517448599 +bryophyte,north,"","",Bryum.All,43,0.941965300401545,0.0079235035767633 +bryophyte,north,"","",Ceratodon.purpureus,43,0.957421016743693,0.007562873229779 +bryophyte,south,"","",Bryum.All,16,0.955882352941176,0.0054615344594325 +bryophyte,south,"","",Ceratodon.purpureus,16,0.997058823529412,0.00364637570802135 +lichen,north,"","",Cladonia.chlorophaea,43,0.945904992802485,0.031749292791541 +lichen,north,"","",Physcia.adscendens,43,0.980756117887719,0.0827843883077536 +lichen,south,"","",Cladonia.chlorophaea,16,0.882352941176471,0.0320775702380878 +lichen,south,"","",Physcia.adscendens,16,0.955882352941176,0.00822499086530675 +mite,north,"","",Ceratozetes.gracilis,43,0.992575195090537,0.006634774688347 +mite,north,"","",Trhypochthonius.tectorum,43,0.91044776119403,0.0050861271852064 +mite,south,"","",Ceratozetes.gracilis,16,0.858823529411765,0.00236272301951765 +mite,south,"","",Trhypochthonius.tectorum,16,0.976470588235294,0.00481353207621055 +vascular_plant,north,"","",Galium.boreale,43,0.986059549965907,0.034587657498138 +vascular_plant,north,"","",Vicia.americana,43,0.997120994014698,0.032531808970894 +vascular_plant,south,"","",Galium.boreale,16,0.991176470588235,0.00534703424256875 +vascular_plant,south,"","",Vicia.americana,16,0.997058823529412,0.00553094497460875 diff --git a/3_output/exp_002_soilgrids/tables/comparison_summary.csv b/3_output/exp_002_soilgrids/tables/comparison_summary.csv new file mode 100644 index 0000000..5bb5d48 --- /dev/null +++ b/3_output/exp_002_soilgrids/tables/comparison_summary.csv @@ -0,0 +1,51 @@ +taxon,region,season,part,metric,species,draws_baseline,draws_candidate,median_baseline,median_candidate,median_difference,share_better +bird,north,"","",oob_auc,2,5,5,0.729484461943779,0.731580679812868,0.00209621786908992,1 +bird,north,"","",oob_calibration_slope,2,5,5,0.774212093974031,0.704964688661807,-0.069247405312224,0 +bird,north,"","",oob_deviance_explained,2,5,5,0.165570186112103,0.161466004535857,-0.00410418157624549,0.5 +bird,north,"","",oob_rmse,2,5,5,0.624644013968721,0.629628148414794,0.00498413444607304,0 +bird,north,"","",oob_spearman,2,5,5,0.3109374709378,0.314033928676767,0.00309645773896752,1 +bird,south,"","",oob_auc,2,5,5,0.702136429854496,0.715239415400459,0.013102985545963,1 +bird,south,"","",oob_calibration_slope,2,5,5,0.903072708091274,0.832174369755742,-0.070898338335532,0 +bird,south,"","",oob_deviance_explained,2,5,5,0.150457127171694,0.15497879311708,0.00452166594538594,0.5 +bird,south,"","",oob_rmse,2,5,5,0.686946466284977,0.695748803191955,0.00880233690697796,0.5 +bird,south,"","",oob_spearman,2,5,5,0.291640797085428,0.310306397770022,0.0186656006845945,1 +bryophyte,north,"","",oob_auc,2,4,4,0.64999737456798,0.656797877502313,0.00680050293433304,1 +bryophyte,north,"","",oob_calibration_slope,2,4,4,0.770110822063579,0.771070141106093,0.000959319042513507,0.5 +bryophyte,north,"","",oob_deviance_explained,2,4,4,-0.18848913667322,-0.183879686398786,0.00460945027443349,1 +bryophyte,north,"","",oob_rmse,2,4,4,0.477685026278507,0.476971933535884,-0.000713092742622989,1 +bryophyte,north,"","",oob_spearman,2,4,4,0.256657246933472,0.268292336613232,0.0116350896797595,1 +bryophyte,south,"","",oob_auc,2,4,4,0.668840496946664,0.664104015964309,-0.00473648098235552,0 +bryophyte,south,"","",oob_calibration_slope,2,4,4,0.859428373309233,0.819171579377685,-0.040256793931548,0 +bryophyte,south,"","",oob_deviance_explained,2,4,4,0.0095574817283275,0.00510033180576335,-0.00445714992256415,0 +bryophyte,south,"","",oob_rmse,2,4,4,0.440793673928001,0.442539558009466,0.00174588408146498,0 +bryophyte,south,"","",oob_spearman,2,4,4,0.260684119461907,0.253521461868173,-0.00716265759373452,0 +lichen,north,"","",oob_auc,2,4,4,0.802806546010246,0.802528502016778,-0.000278043993468535,0.5 +lichen,north,"","",oob_calibration_slope,2,4,4,0.980606541125594,0.960270266301661,-0.020336274823933,0.5 +lichen,north,"","",oob_deviance_explained,2,4,4,0.12872576435422,0.124089984355713,-0.0046357799985065,0.5 +lichen,north,"","",oob_rmse,2,4,4,0.413025371860499,0.414272782350542,0.00124741049004301,0.5 +lichen,north,"","",oob_spearman,2,4,4,0.509892978412699,0.509115001285671,-0.000777977127028484,0.5 +lichen,south,"","",oob_auc,2,4,4,0.79223256589659,0.810937582645225,0.0187050167486355,0.5 +lichen,south,"","",oob_calibration_slope,2,4,4,0.991922312776069,0.927486319260971,-0.0644359935150971,1 +lichen,south,"","",oob_deviance_explained,2,4,4,0.114894473111837,0.129223065938884,0.0143285928270465,0.5 +lichen,south,"","",oob_rmse,2,4,4,0.323218486449386,0.322423615458131,-0.000794870991253999,1 +lichen,south,"","",oob_spearman,2,4,4,0.367603610275592,0.383206815873694,0.0156032055981025,0.5 +mite,north,"","",oob_auc,2,4,4,0.715543903851094,0.715854203619342,0.000310299768248479,0.5 +mite,north,"","",oob_calibration_slope,2,4,4,0.91133114539273,0.859654462255643,-0.051676683137087,0 +mite,north,"","",oob_deviance_explained,2,4,4,0.0149187218448,0.0148124579015737,-0.000106263943226347,0.5 +mite,north,"","",oob_rmse,2,4,4,0.328141122068562,0.328360500478674,0.000219378410111964,0 +mite,north,"","",oob_spearman,2,4,4,0.271890083460792,0.273513348651177,0.00162326519038498,0.5 +mite,south,"","",oob_auc,2,4,4,0.773632058303039,0.787193489649906,0.0135614313468669,0.5 +mite,south,"","",oob_calibration_slope,2,4,4,0.614282370199175,0.632818712454851,0.018536342255676,1 +mite,south,"","",oob_deviance_explained,2,4,4,0.0865130411560292,0.110514557582228,0.0240015164261991,1 +mite,south,"","",oob_rmse,2,4,4,0.246446874946777,0.244497145209814,-0.001949729736963,1 +mite,south,"","",oob_spearman,2,4,4,0.230646626561677,0.241579260530077,0.0109326339683995,0.5 +vascular_plant,north,"","",oob_auc,2,4,4,0.827954669352313,0.823650732630277,-0.0043039367220365,0 +vascular_plant,north,"","",oob_calibration_slope,2,4,4,0.975256964203091,0.973573640872107,-0.00168332333098448,0.5 +vascular_plant,north,"","",oob_deviance_explained,2,4,4,0.178982880150698,0.172574033606171,-0.0064088465445265,0 +vascular_plant,north,"","",oob_rmse,2,4,4,0.404515361388574,0.406428952923423,0.00191359153484899,0 +vascular_plant,north,"","",oob_spearman,2,4,4,0.555249895538886,0.548361795052128,-0.00688810048675798,0 +vascular_plant,south,"","",oob_auc,2,4,4,0.845681924077273,0.841962619364344,-0.00371930471292947,0 +vascular_plant,south,"","",oob_calibration_slope,2,4,4,0.941201813094871,0.921129403736588,-0.0200724093582835,0 +vascular_plant,south,"","",oob_deviance_explained,2,4,4,0.267977840506312,0.254772660423712,-0.0132051800826,0 +vascular_plant,south,"","",oob_rmse,2,4,4,0.351078283914618,0.354870002200482,0.00379171828586347,0 +vascular_plant,south,"","",oob_spearman,2,4,4,0.514530181328676,0.504910925504031,-0.00961925582464548,0 diff --git a/3_output/exp_002_soilgrids/tables/coverage.csv b/3_output/exp_002_soilgrids/tables/coverage.csv new file mode 100644 index 0000000..83b5b55 --- /dev/null +++ b/3_output/exp_002_soilgrids/tables/coverage.csv @@ -0,0 +1,11 @@ +taxon,run,region,season,part,species,draws,stages,has_coefficients,has_grid +bird,bird,north,,,2,5,"climate, landcover, habitat",TRUE,TRUE +bird,bird,south,,,2,5,"climate, landcover, habitat",TRUE,TRUE +bryophyte,bryophyte,north,,,2,5,"climate, habitat",TRUE,TRUE +bryophyte,bryophyte,south,,,2,5,"climate, habitat",TRUE,TRUE +lichen,lichen,north,,,2,5,"climate, habitat",TRUE,TRUE +lichen,lichen,south,,,2,5,"climate, habitat",TRUE,TRUE +mite,mite,north,,,2,5,"climate, habitat",TRUE,TRUE +mite,mite,south,,,2,5,"climate, habitat",TRUE,TRUE +vascular_plant,vascular_plant,north,,,2,5,"climate, habitat",TRUE,TRUE +vascular_plant,vascular_plant,south,,,2,5,"climate, habitat",TRUE,TRUE diff --git a/3_output/exp_002_soilgrids/tables/grid_summary.csv b/3_output/exp_002_soilgrids/tables/grid_summary.csv new file mode 100644 index 0000000..cc60c20 --- /dev/null +++ b/3_output/exp_002_soilgrids/tables/grid_summary.csv @@ -0,0 +1,685 @@ +taxon,run,region,season,part,species,grid_unit,n,median,p10,p90,boot1 +bird,bird,north,,,AMRO,SpruceR,5,0.0450306010335692,0.044571725544185,0.0474530097305696,0.0444732303912678 +bird,bird,north,,,AMRO,Spruce1,5,0.0369049864408053,0.0354477266615211,0.0380662303850037,0.0369049864408053 +bird,bird,north,,,AMRO,Spruce2,5,0.0344734330871671,0.032591110474184,0.0353233803281887,0.0344734330871671 +bird,bird,north,,,AMRO,Spruce3,5,0.0311838058329295,0.0295688166054224,0.0321000103612484,0.0315921740962619 +bird,bird,north,,,AMRO,Spruce4,5,0.029155374544378,0.0279225316056106,0.0299175123617578,0.0297602746935337 +bird,bird,north,,,AMRO,Spruce5,5,0.0277796587789024,0.0268756245636124,0.0283007702983259,0.0284371830806022 +bird,bird,north,,,AMRO,Spruce6,5,0.0266226209468198,0.0261467555083038,0.0271693456179282,0.0274216371517897 +bird,bird,north,,,AMRO,Spruce7,5,0.0260602636053119,0.0251895913485928,0.0265437982486813,0.0266140570852783 +bird,bird,north,,,AMRO,Spruce8,5,0.0255150965109921,0.0242881502062906,0.0262587777387366,0.0259572541830633 +bird,bird,north,,,AMRO,PineR,5,0.0575770770538387,0.0538048481530726,0.0599204937226142,0.0536510345662382 +bird,bird,north,,,AMRO,Pine1,5,0.0455851175396193,0.044872781131998,0.0466957376398946,0.044520955320371 +bird,bird,north,,,AMRO,Pine2,5,0.0420729073522447,0.041590013003567,0.0431860530017518,0.041587609757704 +bird,bird,north,,,AMRO,Pine3,5,0.0381900752503732,0.0378791497315541,0.0390046706245211,0.0381117541844669 +bird,bird,north,,,AMRO,Pine4,5,0.0359249289090252,0.0358029354802995,0.0363205477604043,0.0359018113196702 +bird,bird,north,,,AMRO,Pine5,5,0.0344241617073655,0.0339510682208461,0.0347267842965087,0.034305677347949 +bird,bird,north,,,AMRO,Pine6,5,0.0333777733977502,0.0322979031730474,0.0338441623438736,0.0330805563200639 +bird,bird,north,,,AMRO,Pine7,5,0.0326356964846518,0.0309027180634981,0.033336804794813,0.0321063184317383 +bird,bird,north,,,AMRO,Pine8,5,0.0319574676153442,0.0296987458736407,0.0331424980340867,0.0313139731287341 +bird,bird,north,,,AMRO,DecidR,5,0.0252018762511246,0.0244619502584976,0.0255568492291211,0.0252018762511246 +bird,bird,north,,,AMRO,Decid1,5,0.0335884716457358,0.032689171267138,0.033968480466957,0.0333769631758176 +bird,bird,north,,,AMRO,Decid2,5,0.0355512452128433,0.0345710960681771,0.0358539881023548,0.0351807774115782 +bird,bird,north,,,AMRO,Decid3,5,0.0360411283306339,0.0351592945209957,0.0363073085797116,0.0355591338528808 +bird,bird,north,,,AMRO,Decid4,5,0.034543893742064,0.0338983051606382,0.0348464191698872,0.0340820843609406 +bird,bird,north,,,AMRO,Decid5,5,0.0321609611805336,0.0317880457661548,0.0325285867886383,0.0317803598135471 +bird,bird,north,,,AMRO,Decid6,5,0.029412613194709,0.0292274118671895,0.0298309545192382,0.0291178751372939 +bird,bird,north,,,AMRO,Decid7,5,0.0267870744463485,0.0264121259306585,0.0270452897321424,0.0263475022321454 +bird,bird,north,,,AMRO,Decid8,5,0.0240135764059459,0.0236383354339827,0.0243472924044383,0.0236162738600671 +bird,bird,north,,,AMRO,MixedwoodR,5,0.0259362674984067,0.0252294734619135,0.0266079674335463,0.0268492331714843 +bird,bird,north,,,AMRO,Mixedwood1,5,0.0345392369907384,0.0335997436692334,0.0354778712935079,0.0355586964214057 +bird,bird,north,,,AMRO,Mixedwood2,5,0.0364717349519842,0.0355504711742028,0.0374573442854081,0.0374804195713563 +bird,bird,north,,,AMRO,Mixedwood3,5,0.036940858007879,0.0361810697062966,0.0379164448505339,0.0378835078261054 +bird,bird,north,,,AMRO,Mixedwood4,5,0.0354497384144614,0.0349040538265609,0.0363413741235071,0.036309908867847 +bird,bird,north,,,AMRO,Mixedwood5,5,0.0330813576042224,0.0327350942531992,0.0338562277616714,0.0338577287819798 +bird,bird,north,,,AMRO,Mixedwood6,5,0.0303258809799204,0.0301282056676619,0.0309883056387911,0.0310212069621 +bird,bird,north,,,AMRO,Mixedwood7,5,0.0276983344953053,0.0272834932176787,0.0280036666357688,0.0280697446439334 +bird,bird,north,,,AMRO,Mixedwood8,5,0.0249175374276715,0.0244725490786662,0.025119214718372,0.0251599855975912 +bird,bird,north,,,AMRO,TreedBogR,5,0.0327292446027415,0.0310258296669675,0.046339541897051,0.0300077319293345 +bird,bird,north,,,AMRO,TreedBog1,5,0.0434496454510686,0.0293790297197476,0.0446696296500574,0.0397417618281698 +bird,bird,north,,,AMRO,TreedBog2,5,0.0460568397524793,0.0277125593407982,0.0471928903574085,0.0418895532663015 +bird,bird,north,,,AMRO,TreedBog3,5,0.0470383711450926,0.0265284501931942,0.0478066647599357,0.042340060147266 +bird,bird,north,,,AMRO,TreedBog4,5,0.0453444013570792,0.0260712546897049,0.0459361029407942,0.0405813456468515 +bird,bird,north,,,AMRO,TreedBog5,5,0.0422164201490629,0.0260895197651126,0.043031812968299,0.0378406952085624 +bird,bird,north,,,AMRO,TreedBog6,5,0.0385813429271065,0.0267179133745422,0.0396200944364367,0.0346704897193024 +bird,bird,north,,,AMRO,TreedBog7,5,0.0347973952285992,0.0281946869289196,0.0360690723928872,0.0313718223243192 +bird,bird,north,,,AMRO,TreedBog8,5,0.0321686860956519,0.0293008768081094,0.03272145756867,0.0281197641041118 +bird,bird,north,,,AMRO,TreedFenR,5,0.041392481969325,0.0394777931125241,0.0607255147275816,0.039094822157232 +bird,bird,north,,,AMRO,TreedFen1,5,0.0534591991728007,0.0383776325214105,0.057933763966192,0.0517765592729963 +bird,bird,north,,,AMRO,TreedFen2,5,0.0566670163596698,0.0361874249519384,0.0612484039648646,0.0545747555679486 +bird,bird,north,,,AMRO,TreedFen3,5,0.057874664469737,0.0346344265412988,0.0620626881077254,0.0551616871772215 +bird,bird,north,,,AMRO,TreedFen4,5,0.0560220420127772,0.0340406422875781,0.0595170985403775,0.0528703900281746 +bird,bird,north,,,AMRO,TreedFen5,5,0.0526109358389695,0.0340728620559019,0.055524724946571,0.0492998022299241 +bird,bird,north,,,AMRO,TreedFen6,5,0.048261533306927,0.0349058824828052,0.0509767093532865,0.0451695793894787 +bird,bird,north,,,AMRO,TreedFen7,5,0.0437196360965119,0.0368509938915961,0.0462001721318392,0.0408719931718193 +bird,bird,north,,,AMRO,TreedFen8,5,0.0403107684230099,0.0376732287163421,0.0425703710963361,0.0366351305504331 +bird,bird,north,,,AMRO,GrassHerb,5,0.0371256973606207,0.0359580073120721,0.0381375696101985,0.0386266935457576 +bird,bird,north,,,AMRO,Shrub,5,0.0330756260069349,0.0320139887948401,0.0336828747763024,0.0331819431905013 +bird,bird,north,,,AMRO,GraminoidFen,5,0.0247177613416937,0.0242271033503161,0.0268557722625418,0.024168029936823 +bird,bird,north,,,AMRO,Marsh,5,0.0193701289185875,0.0184253134754564,0.0219494052041053,0.020352828135632 +bird,bird,north,,,AMRO,RoughP,5,0.0265372818353795,0.0251477121094877,0.0269637067187881,0.0255711198380556 +bird,bird,north,,,AMRO,TameP,5,0.0330575493104984,0.0320130232760746,0.0347368830052408,0.0350171315133072 +bird,bird,north,,,AMRO,Crop,5,0.02807659058865,0.0277614011130861,0.0291120212936105,0.0290263196746749 +bird,bird,north,,,AMRO,Industrial,5,0.0393659241708082,0.0372587982862676,0.039808432216979,0.0393659241708082 +bird,bird,north,,,AMRO,Mine,5,0.0493178763992183,0.0453376334014803,0.0531615190534469,0.0493178763992183 +bird,bird,north,,,AMRO,Rural,5,0.0455273859657732,0.0435777215325513,0.045828239618108,0.0458842207211444 +bird,bird,north,,,AMRO,Urban,5,0.0419600379202085,0.0391235420791781,0.0441577354096199,0.0385992213816763 +bird,bird,north,,,AMRO,CCSpruceR,5,0.0558357621193879,0.0539620846872051,0.0576525658561066,0.0549309230606425 +bird,bird,north,,,AMRO,CCSpruce1,5,0.0441634723294924,0.0434720589358612,0.0448660206997173,0.0448809438427601 +bird,bird,north,,,AMRO,CCSpruce2,5,0.0393027278563411,0.0383422157219434,0.0404675025787087,0.0403047302330232 +bird,bird,north,,,AMRO,CCSpruce3,5,0.0327994645032277,0.0315339973286662,0.0338940629483135,0.0336087958502303 +bird,bird,north,,,AMRO,CCSpruce4,5,0.0295449871659099,0.0284004511809817,0.0303484708124987,0.0302481792868563 +bird,bird,north,,,AMRO,CCPineR,5,0.0713276012510373,0.0648935793540777,0.0733406581969425,0.0662668492024038 +bird,bird,north,,,AMRO,CCPine1,5,0.0553144189026634,0.0539438837936989,0.0558221592684679,0.0541428865924277 +bird,bird,north,,,AMRO,CCPine2,5,0.0488752064730688,0.0486494492055619,0.0494415430345936,0.0486222938133906 +bird,bird,north,,,AMRO,CCPine3,5,0.0407568253692303,0.0403452222510076,0.0410087371253334,0.0405445399856628 +bird,bird,north,,,AMRO,CCPine4,5,0.0364976196146396,0.0364013470282191,0.0368206550076597,0.0364904032877167 +bird,bird,north,,,AMRO,CCDecidR,5,0.0301501346602357,0.0297627205373979,0.0316423215749299,0.0311279912242709 +bird,bird,north,,,AMRO,CCDecid1,5,0.0385749137936479,0.0385074456932607,0.0401836160614351,0.0395078884399461 +bird,bird,north,,,AMRO,CCDecid2,5,0.0389392412272624,0.0386137727786782,0.0399857214504753,0.0393307884464912 +bird,bird,north,,,AMRO,CCDecid3,5,0.036976928307573,0.0363260019089999,0.0374082096393738,0.0367036206000337 +bird,bird,north,,,AMRO,CCDecid4,5,0.0349030707581111,0.0343438993312635,0.035263963769853,0.0345166978075922 +bird,bird,north,,,AMRO,CCMixedwoodR,5,0.0311843531555516,0.0308596319454893,0.032695518823591,0.0331627171807524 +bird,bird,north,,,AMRO,CCMixedwood1,5,0.0405748180173994,0.0395863786103405,0.0415127015634363,0.0420903784411594 +bird,bird,north,,,AMRO,CCMixedwood2,5,0.0404343655780943,0.0397132366851991,0.0415366524382917,0.0419017020516891 +bird,bird,north,,,AMRO,CCMixedwood3,5,0.0378886983782135,0.0373971627799961,0.0390345981314523,0.0391028055970247 +bird,bird,north,,,AMRO,CCMixedwood4,5,0.0358108078121927,0.035368690258796,0.0367599331679755,0.0367729314480841 +bird,bird,north,,,AMRO,ShrubbySwamp,5,0.0309380929530988,0.0305595770162317,0.0333403421915389,0.0309380929530988 +bird,bird,north,,,AMRO,ShrubbyBog,5,0.0311768130991629,2.53942646229331e-06,0.0950089692027342,0.10025698273071 +bird,bird,north,,,AMRO,ShrubbyFen,5,0.021559870005797,0.0186965927618169,0.0220392395402607,0.0186170779350886 +bird,bird,north,,,AMRO,TreedSwamp,5,0.017575609032917,0.0160761095775931,0.0181535884010063,0.0161624219817385 +bird,bird,north,,,YEWA,SpruceR,5,0.0367572798053502,0.0341055299504178,0.038707942647361,0.0355328583090363 +bird,bird,north,,,YEWA,Spruce1,5,0.0316259186996796,0.0309555128890867,0.0341550777898595,0.031293520025165 +bird,bird,north,,,YEWA,Spruce2,5,0.0282660242075625,0.027382234716967,0.0300960970121501,0.0275300505899205 +bird,bird,north,,,YEWA,Spruce3,5,0.0213817425977471,0.0207764753451668,0.0240556204282854,0.0212371948632942 +bird,bird,north,,,YEWA,Spruce4,5,0.0163117505612501,0.0157631768483898,0.0189013384217116,0.0163117505612501 +bird,bird,north,,,YEWA,Spruce5,5,0.0124743311359287,0.0120336756903989,0.0145522098971786,0.0124743311359287 +bird,bird,north,,,YEWA,Spruce6,5,0.00949832974019732,0.00926948315950662,0.0109651201694659,0.00949832974019732 +bird,bird,north,,,YEWA,Spruce7,5,0.00721627174091202,0.00719324279888033,0.008075689738709,0.00720096157277882 +bird,bird,north,,,YEWA,Spruce8,5,0.00570092052922977,0.00548614717152713,0.00583394820566021,0.00543559413734789 +bird,bird,north,,,YEWA,PineR,5,0.0242184745215459,0.0195080608387248,0.0250541277791329,0.0242184745215459 +bird,bird,north,,,YEWA,Pine1,5,0.0213290276517442,0.017829012402674,0.0215741207028999,0.0213290276517442 +bird,bird,north,,,YEWA,Pine2,5,0.0184937643195764,0.0161869189129315,0.0187395561869485,0.0187639233238746 +bird,bird,north,,,YEWA,Pine3,5,0.0138578383912828,0.0129998011829166,0.0142976050504877,0.0144748406737376 +bird,bird,north,,,YEWA,Pine4,5,0.0106402812586339,0.010100107453278,0.0109735983058322,0.011117757877333 +bird,bird,north,,,YEWA,Pine5,5,0.00815520833173646,0.00769520535698271,0.00844744658563061,0.00850225073821286 +bird,bird,north,,,YEWA,Pine6,5,0.0063085916060275,0.00582698272194181,0.00641139387624851,0.00647386863194483 +bird,bird,north,,,YEWA,Pine7,5,0.00465871691295771,0.00436837164543369,0.00493126985088173,0.00490802915048983 +bird,bird,north,,,YEWA,Pine8,5,0.00360480321976679,0.00315132145955147,0.00383088130391455,0.00370479056258039 +bird,bird,north,,,YEWA,DecidR,5,0.079995814061574,0.0769605434824128,0.0850967983292718,0.079995814061574 +bird,bird,north,,,YEWA,Decid1,5,0.0903380382934353,0.0869067232191482,0.0953287285016954,0.0903380382934353 +bird,bird,north,,,YEWA,Decid2,5,0.0995341164552507,0.0957367843732218,0.104227909678306,0.0995341164552507 +bird,bird,north,,,YEWA,Decid3,5,0.112219501820509,0.107852602210229,0.1158374375809,0.112219501820509 +bird,bird,north,,,YEWA,Decid4,5,0.11402414720434,0.110026705773509,0.117064135238781,0.114645331518343 +bird,bird,north,,,YEWA,Decid5,5,0.104694853815161,0.10150447480515,0.107602596525843,0.106129490653997 +bird,bird,north,,,YEWA,Decid6,5,0.0867646872628975,0.08491739832239,0.0897677835291108,0.0890240714891304 +bird,bird,north,,,YEWA,Decid7,5,0.0648922995849895,0.0644290342563012,0.0679688116717525,0.0676659982036025 +bird,bird,north,,,YEWA,Decid8,5,0.0446363237650192,0.0437953149070192,0.0467073256695869,0.0466042153493005 +bird,bird,north,,,YEWA,MixedwoodR,5,0.0383891155991594,0.0374674429646435,0.0410259152252722,0.0383891155991594 +bird,bird,north,,,YEWA,Mixedwood1,5,0.0433522358104713,0.0423080132861376,0.0460130368758883,0.0433522358104713 +bird,bird,north,,,YEWA,Mixedwood2,5,0.0477653330675491,0.0466052584274416,0.050358850016108,0.0477653330675491 +bird,bird,north,,,YEWA,Mixedwood3,5,0.0538529106604458,0.0525014049255744,0.056050300285319,0.0538529106604458 +bird,bird,north,,,YEWA,Mixedwood4,5,0.0550170397812813,0.053559529261408,0.0565662973088049,0.0550170397812813 +bird,bird,north,,,YEWA,Mixedwood5,5,0.0508399197395948,0.0494800057134559,0.0517982578302953,0.0509303809579364 +bird,bird,north,,,YEWA,Mixedwood6,5,0.0422618945414964,0.0413970999160487,0.0431315708474242,0.0427216775226953 +bird,bird,north,,,YEWA,Mixedwood7,5,0.0319178790535977,0.0313281598572462,0.0325322692125466,0.0324721719210353 +bird,bird,north,,,YEWA,Mixedwood8,5,0.0219008032956106,0.0213626951128278,0.0222727518225707,0.0223648528543671 +bird,bird,north,,,YEWA,TreedBogR,5,0.0134437565548244,0.0127330041369964,0.0177195061739771,0.0153413316623009 +bird,bird,north,,,YEWA,TreedBog1,5,0.0152717509634018,0.0143149518055577,0.0198783356167138,0.0173247290928807 +bird,bird,north,,,YEWA,TreedBog2,5,0.0169022360116829,0.0157047272761886,0.021767221975489,0.0190883224349556 +bird,bird,north,,,YEWA,TreedBog3,5,0.0191476826491807,0.017565387449865,0.0242731151279662,0.0215210835292139 +bird,bird,north,,,YEWA,TreedBog4,5,0.0195450514255811,0.0178163586339242,0.0245700434562337,0.0219863010957492 +bird,bird,north,,,YEWA,TreedBog5,5,0.0179765336139994,0.0163879256867039,0.0225752716850921,0.0203531614044306 +bird,bird,north,,,YEWA,TreedBog6,5,0.0148978508518034,0.0136705730901961,0.0188277086710174,0.0170727409010664 +bird,bird,north,,,YEWA,TreedBog7,5,0.0111247389864847,0.0103424869228293,0.0142525378169471,0.0129767605077822 +bird,bird,north,,,YEWA,TreedBog8,5,0.00751677210399456,0.00708414706202263,0.00979291735238801,0.00893760170981683 +bird,bird,north,,,YEWA,TreedFenR,5,0.0281648223647082,0.0209758129677249,0.029311879638463,0.0281648223647082 +bird,bird,north,,,YEWA,TreedFen1,5,0.0318060992460478,0.0235840201967198,0.0330913987114431,0.0318060992460478 +bird,bird,north,,,YEWA,TreedFen2,5,0.0347584920977932,0.0258798188594928,0.036542763331323,0.0350438425069657 +bird,bird,north,,,YEWA,TreedFen3,5,0.0385285053879006,0.0289722985046187,0.0413217207081671,0.0395100965182738 +bird,bird,north,,,YEWA,TreedFen4,5,0.0388011282068827,0.0294299908263146,0.0421929182463301,0.0403641794890895 +bird,bird,north,,,YEWA,TreedFen5,5,0.0355015653233373,0.0271264425447751,0.0389032916785662,0.0373659332927849 +bird,bird,north,,,YEWA,TreedFen6,5,0.0295115219976326,0.0226884627441325,0.0323914195241825,0.0313434795193721 +bird,bird,north,,,YEWA,TreedFen7,5,0.0222882859376581,0.0172204554750494,0.0243551898876511,0.0238237568039273 +bird,bird,north,,,YEWA,TreedFen8,5,0.0152933522085627,0.0118613233746333,0.0165387236096846,0.0164083516388661 +bird,bird,north,,,YEWA,GrassHerb,5,0.0802836786989502,0.0795287355207288,0.0862465391862733,0.0790412932282508 +bird,bird,north,,,YEWA,Shrub,5,0.041782755940795,0.0410113928303673,0.0451673938443427,0.041782755940795 +bird,bird,north,,,YEWA,GraminoidFen,5,0.0550886568771179,0.0477079306422831,0.0598057124402735,0.0550886568771179 +bird,bird,north,,,YEWA,Marsh,5,0.0608131274278961,0.0593822424469885,0.0662609283596842,0.0584828822046217 +bird,bird,north,,,YEWA,RoughP,5,0.0648606709310505,0.064173747140704,0.066827386320451,0.0639576905047648 +bird,bird,north,,,YEWA,TameP,5,0.0473366546747388,0.0423227012841368,0.0480359807286109,0.0473366546747388 +bird,bird,north,,,YEWA,Crop,5,0.0560125795444514,0.0553293575725306,0.058859823339486,0.0578503523220757 +bird,bird,north,,,YEWA,Industrial,5,0.0229305935028794,0.0195960434990188,0.0310021005423718,0.0179089966805184 +bird,bird,north,,,YEWA,Mine,5,0.0350784986969313,0.0297506776744703,0.0518710430703768,0.0506365143271511 +bird,bird,north,,,YEWA,Rural,5,0.0695811953334875,0.0694104751733446,0.0792452570429543,0.0695636813949621 +bird,bird,north,,,YEWA,Urban,5,0.0228895244544648,0.022123241483597,0.0282576648219082,0.0218425009327041 +bird,bird,north,,,YEWA,CCSpruceR,5,0.0226750882206096,0.0206227152383262,0.0248333552645425,0.0202994437908492 +bird,bird,north,,,YEWA,CCSpruce1,5,0.0211187818124099,0.0192670195755631,0.0220657169124125,0.0186285753488761 +bird,bird,north,,,YEWA,CCSpruce2,5,0.0202373408472251,0.018819961637627,0.0210232204774445,0.0181919379142952 +bird,bird,north,,,YEWA,CCSpruce3,5,0.0189846248953531,0.0180188758569354,0.0207400218558154,0.0180241740407853 +bird,bird,north,,,YEWA,CCSpruce4,5,0.0156289959875875,0.0152551727827782,0.0181795616097978,0.015623499906958 +bird,bird,north,,,YEWA,CCPineR,5,0.0138356885892631,0.0119080420027828,0.0164503687042776,0.0138356885892631 +bird,bird,north,,,YEWA,CCPine1,5,0.0126968585959413,0.01122503761181,0.0146132935265518,0.0126968585959413 +bird,bird,north,,,YEWA,CCPine2,5,0.0123992553890003,0.0111428014372548,0.0136364825455614,0.0123992553890003 +bird,bird,north,,,YEWA,CCPine3,5,0.0122849109402397,0.0112151849061931,0.0123314166366251,0.0122849109402397 +bird,bird,north,,,YEWA,CCPine4,5,0.010289114941869,0.00972981539396672,0.0105451070895499,0.0106486602103105 +bird,bird,north,,,YEWA,CCDecidR,5,0.0484304104372555,0.0465174820752366,0.0550961425602118,0.0457005320799982 +bird,bird,north,,,YEWA,CCDecid1,5,0.0598470602158345,0.058524671205765,0.0673885214152555,0.057772155286431 +bird,bird,north,,,YEWA,CCDecid2,5,0.0759672964532725,0.0740307082304135,0.0827651032328641,0.0740612221753056 +bird,bird,north,,,YEWA,CCDecid3,5,0.104029645311698,0.100376664128204,0.108313203771721,0.103180216671241 +bird,bird,north,,,YEWA,CCDecid4,5,0.110858146764504,0.106922991084111,0.113849767606103,0.110858146764504 +bird,bird,north,,,YEWA,CCMixedwoodR,5,0.0239642905030341,0.0226505418193658,0.0260812500527858,0.0219311851444096 +bird,bird,north,,,YEWA,CCMixedwood1,5,0.0300399038273747,0.0283259577674626,0.0319050649884758,0.0277242249950265 +bird,bird,north,,,YEWA,CCMixedwood2,5,0.0377149611413974,0.0358299241060057,0.0393576975738322,0.0355411699081457 +bird,bird,north,,,YEWA,CCMixedwood3,5,0.0503774477789108,0.0487656494596741,0.0520967082731699,0.0495150566539614 +bird,bird,north,,,YEWA,CCMixedwood4,5,0.0534801450498838,0.0520358909329982,0.0549341742216507,0.0531996112693525 +bird,bird,north,,,YEWA,ShrubbySwamp,5,0.086597539800951,0.084055029237436,0.0909795835768917,0.0826099062325901 +bird,bird,north,,,YEWA,ShrubbyBog,5,5.22864620129351e-06,4.79456387775674e-06,6.01541502822778e-06,5.00374737318726e-06 +bird,bird,north,,,YEWA,ShrubbyFen,5,0.0456263828230286,0.04225503139066,0.0547836897172858,0.0536267940761029 +bird,bird,north,,,YEWA,TreedSwamp,5,0.0449124831485375,0.0445730709929603,0.0475671631330189,0.0454886673359079 +bird,bird,south,,,AMRO,Loamy,5,0.0291922912510665,0.0281644138383775,0.0296124547592108,0.0274902201149451 +bird,bird,south,,,AMRO,Blowout,5,0.00667198173709311,0.0060128085269059,0.00688172308242794,0.00667198173709311 +bird,bird,south,,,AMRO,ClaySub,5,0.0295587836896161,0.0277441790614316,0.031239737654479,0.0307952642599971 +bird,bird,south,,,AMRO,Crop,5,0.0258687210141929,0.0252260478188873,0.0261275938373897,0.0250482675299361 +bird,bird,south,,,AMRO,Industrial,5,0.029940246172213,0.0254957147432293,0.0334457363668366,0.0248524332035774 +bird,bird,south,,,AMRO,Mine,5,0.0185499067877044,0.0172724537686133,0.0318063459558871,0.0185499067877044 +bird,bird,south,,,AMRO,Other,5,0.0188307309327604,0.0152565993015167,0.0237857617757627,0.0235084279470756 +bird,bird,south,,,AMRO,RapidDrain,5,0.0277828212599136,0.0268493146818108,0.0289236033371655,0.0277828212599136 +bird,bird,south,,,AMRO,RoughP,5,0.0142479032315455,0.0126470444300615,0.0146419546169455,0.0126819880435036 +bird,bird,south,,,AMRO,Rural,5,0.0503092131493802,0.0479039708505735,0.0513481701958057,0.0478267043313275 +bird,bird,south,,,AMRO,SandyLoam,5,0.0186085280919187,0.0179686231161396,0.0192748672388384,0.0178285135772958 +bird,bird,south,,,AMRO,SoilUnknown,5,0.0287604463028414,0.027066847135705,0.0296773643792734,0.026739961074574 +bird,bird,south,,,AMRO,TameP,5,0.0293346373236641,0.0284429796142141,0.0298498516962281,0.0299140169785546 +bird,bird,south,,,AMRO,ThinBreak,5,0.0380144217456129,0.0373400347480435,0.043882119155875,0.0371377373002769 +bird,bird,south,,,AMRO,Urban,5,0.0618760821930239,0.0583441539584977,0.063550035982972,0.0561688758598976 +bird,bird,south,,,AMRO,Water,5,0.0282556179599498,0.0255536345813971,0.0509554858358808,0.0568206896317378 +bird,bird,south,,,AMRO,Wellsites,5,0.0467600892027461,0.0153517351358807,0.0489636898395014,0.0499077453687576 +bird,bird,south,,,YEWA,Loamy,5,0.134526409958102,0.126405513689408,0.136680555958092,0.134526409958102 +bird,bird,south,,,YEWA,Blowout,5,0.0535495298463814,0.051248307858084,0.0549239598093458,0.0536483274206612 +bird,bird,south,,,YEWA,ClaySub,5,0.106527151318807,0.101383783908728,0.11159053911593,0.105591694461995 +bird,bird,south,,,YEWA,Crop,5,0.0659967427172584,0.0619595016340135,0.0663954272814431,0.06629563562839 +bird,bird,south,,,YEWA,Industrial,5,0.0662203315149881,0.0501934217109474,0.0922445646152326,0.0410989813526814 +bird,bird,south,,,YEWA,Mine,5,0.152555685598947,0.134075821491524,0.196437019860849,0.179960603667866 +bird,bird,south,,,YEWA,Other,5,0.109185121251093,0.0993364014740049,0.122598872228397,0.127485109835406 +bird,bird,south,,,YEWA,RapidDrain,5,0.0778169714301954,0.0708273100518306,0.0821794142839099,0.0725172020709401 +bird,bird,south,,,YEWA,RoughP,5,0.066045108387413,0.062045264761855,0.0702840662372563,0.0643409160027002 +bird,bird,south,,,YEWA,Rural,5,0.0952302923581463,0.0921419589336165,0.100610490646613,0.0947780071844017 +bird,bird,south,,,YEWA,SandyLoam,5,0.0715893150069139,0.0610031838903591,0.075320230847346,0.0648495147153949 +bird,bird,south,,,YEWA,SoilUnknown,5,0.100532258227308,0.0976688148980104,0.102789806865784,0.0978502498242738 +bird,bird,south,,,YEWA,TameP,5,0.0595828575915241,0.0570391407691305,0.0698608591684353,0.065747915905378 +bird,bird,south,,,YEWA,ThinBreak,5,0.225031423469922,0.221484029295082,0.22870234576568,0.221050448552718 +bird,bird,south,,,YEWA,Urban,5,0.0733188366605843,0.065512492441444,0.0755163882129746,0.0733188366605843 +bird,bird,south,,,YEWA,Water,5,5.83955050155696e-07,4.51125775799348e-07,1.24094045655262e-06,6.69890288890188e-07 +bird,bird,south,,,YEWA,Wellsites,5,1.19484544293603e-05,9.33681348617776e-06,0.54439487438398,0.618361300864748 +bryophyte,bryophyte,north,,,Bryum.All,WhiteSpruce,5,0.110415973677831,0.0993226062654867,0.114939468404023,0.115215376996505 +bryophyte,bryophyte,north,,,Bryum.All,Pine,5,0.0732712185712904,0.0676816737140383,0.0754950530580033,0.0735478149583182 +bryophyte,bryophyte,north,,,Bryum.All,Deciduous,5,0.0982993258115714,0.091555777644929,0.101778999244279,0.101538830121272 +bryophyte,bryophyte,north,,,Bryum.All,Mixedwood,5,0.0970830453814964,0.0950873276235255,0.10519765727931,0.105175687714993 +bryophyte,bryophyte,north,,,Bryum.All,BlackSpruce,5,0.0900972913978518,0.0802198655797255,0.104879861064367,0.0900972913978518 +bryophyte,bryophyte,north,,,Bryum.All,TreedFen,5,0.111826552448623,0.0961384431787617,0.121644036418605,0.111826552448623 +bryophyte,bryophyte,north,,,Bryum.All,TreedSwamp,5,0.153975146225378,0.140864399624763,0.168732755030284,0.162677396367447 +bryophyte,bryophyte,north,,,Bryum.All,GraminoidFen,5,0.111519656127773,0.0958594026332456,0.120688812796236,0.111519656127773 +bryophyte,bryophyte,north,,,Bryum.All,ShrubbyFen,5,0.116787360885845,0.102577321252262,0.127115475225946,0.116787360885845 +bryophyte,bryophyte,north,,,Bryum.All,ShrubbyBog,5,0.0921347089686784,0.0816597558441945,0.106022759898265,0.0921347089686784 +bryophyte,bryophyte,north,,,Bryum.All,ShrubbySwamp,5,0.152523733089979,0.145395948157023,0.160559274769321,0.161397445151754 +bryophyte,bryophyte,north,,,Bryum.All,Marsh,5,0.124337741226101,0.108680728116929,0.125797969145284,0.125098644300504 +bryophyte,bryophyte,north,,,Bryum.All,Shrub,5,0.235718817098737,0.220825952340946,0.269697088833143,0.235718817098737 +bryophyte,bryophyte,north,,,Bryum.All,Grass,5,0.242421923187829,0.221768939953578,0.262943186856921,0.242421923187829 +bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruceR,5,0.174432259925114,0.145425901518285,0.203026922961719,0.174432259925114 +bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce1,5,0.174070170275431,0.167251223908436,0.207046652146925,0.187418065959538 +bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce2,5,0.198030551545983,0.171997119664378,0.218326463919521,0.202539400112526 +bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce3,5,0.198030551545983,0.171997119664378,0.218326463919521,0.202539400112526 +bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce4,5,0.198030551545983,0.171997119664378,0.218326463919521,0.202539400112526 +bryophyte,bryophyte,north,,,Bryum.All,CCPineR,5,0.164989039877247,0.141345997878962,0.186530505888224,0.164989039877247 +bryophyte,bryophyte,north,,,Bryum.All,CCPine1,5,0.155138968619268,0.139861471567462,0.192460587637597,0.165446539953247 +bryophyte,bryophyte,north,,,Bryum.All,CCPine2,5,0.158038032976691,0.139679584462011,0.194504534966988,0.167012010783229 +bryophyte,bryophyte,north,,,Bryum.All,CCPine3,5,0.158038032976691,0.139679584462011,0.194504534966988,0.167012010783229 +bryophyte,bryophyte,north,,,Bryum.All,CCPine4,5,0.158038032976691,0.139679584462011,0.194504534966988,0.167012010783229 +bryophyte,bryophyte,north,,,Bryum.All,CCDeciduousR,5,0.173658411668211,0.148355970574154,0.181886492629286,0.173658411668211 +bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous1,5,0.191208660329663,0.161436824332306,0.195603792147788,0.191208660329663 +bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous2,5,0.158087794218451,0.137781353195513,0.170871546675111,0.166583870583856 +bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous3,5,0.158087794218451,0.137781353195513,0.170871546675111,0.166583870583856 +bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous4,5,0.158087794218451,0.137781353195513,0.170871546675111,0.166583870583856 +bryophyte,bryophyte,north,,,Bryum.All,CCMixedwoodR,5,0.173658411668211,0.148355970574154,0.181886492629286,0.173658411668211 +bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood1,5,0.191208660329663,0.161436824332306,0.195603792147788,0.191208660329663 +bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood2,5,0.158087794218451,0.137781353195513,0.170871546675111,0.166583870583856 +bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood3,5,0.158087794218451,0.137781353195513,0.170871546675111,0.166583870583856 +bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood4,5,0.158087794218451,0.137781353195513,0.170871546675111,0.166583870583856 +bryophyte,bryophyte,north,,,Bryum.All,EnSeismic,5,0.149792539521889,0.133484198071788,0.167040379630539,0.149792539521889 +bryophyte,bryophyte,north,,,Bryum.All,EnSoftLin,5,0.178639111318971,0.163172428234268,0.203859656661424,0.178639111318971 +bryophyte,bryophyte,north,,,Bryum.All,TrSoftLin,5,0.166870020434104,0.140258705398725,0.202243973746201,0.1693722557785 +bryophyte,bryophyte,north,,,Bryum.All,HardLin,5,0.127853148191855,0.109823474579183,0.133157841274153,0.131652017457417 +bryophyte,bryophyte,north,,,Bryum.All,UrbInd,5,0.159637736318865,0.150407444828966,0.177274100478006,0.16916691958541 +bryophyte,bryophyte,north,,,Bryum.All,Wellsites,5,0.140982987312238,0.133365698592971,0.155817256776231,0.140982987312238 +bryophyte,bryophyte,north,,,Bryum.All,Crop,5,0.0940376978687642,0.0899987630504781,0.110660066786441,0.0978326110229252 +bryophyte,bryophyte,north,,,Bryum.All,TameP,5,0.154440810964465,0.133385507280867,0.164325677216723,0.16109223722038 +bryophyte,bryophyte,north,,,Bryum.All,RoughP,5,0.157759327815285,0.143538137132488,0.164451253730716,0.163242142114815 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,WhiteSpruce,5,0.165627768004817,0.151928760617595,0.171534060971517,0.168208385349475 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Pine,5,0.158733418454601,0.147521820946892,0.165417982479068,0.165013057948764 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Deciduous,5,0.155994488829953,0.145816710307605,0.166004951827683,0.155994488829953 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Mixedwood,5,0.163287919460556,0.137336226158525,0.166182750850469,0.149700892482234 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,BlackSpruce,5,0.0683597653431626,0.0569963521398305,0.0734303525767806,0.0683597653431626 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,TreedFen,5,0.0726386632508278,0.0641923952781423,0.0771995540104918,0.0760740114345748 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,TreedSwamp,5,0.107742743867827,0.0967194889622052,0.123491242018384,0.107742743867827 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,GraminoidFen,5,0.0731187962144143,0.067986774636249,0.0778584619995782,0.079113492600299 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,ShrubbyFen,5,0.0720058680858197,0.0682089995489225,0.0784102067511301,0.0786813531326592 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,ShrubbyBog,5,0.0689625913699598,0.0587005136001076,0.0732347273790514,0.0689625913699598 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,ShrubbySwamp,5,0.106847436238587,0.0912084812502728,0.119061352686345,0.106847436238587 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Marsh,5,0.110480514512807,0.0935669349016278,0.125658260647233,0.110480514512807 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Shrub,5,0.246189235492773,0.222738280838388,0.289562694835372,0.276305207206077 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Grass,5,0.273783096089869,0.255370954335418,0.321696938995014,0.294205231954175 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruceR,5,0.318375986707693,0.307767240972559,0.330413377206836,0.30792010683838 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce1,5,0.29408010882671,0.277432527949068,0.306102407843316,0.281679484636516 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce2,5,0.31706590096387,0.308904766691969,0.341436774814665,0.31706590096387 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce3,5,0.31706590096387,0.308904766691969,0.341436774814665,0.31706590096387 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce4,5,0.31706590096387,0.308904766691969,0.341436774814665,0.31706590096387 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPineR,5,0.295551185115894,0.295152181657874,0.322716397566225,0.295367399735926 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine1,5,0.314490820704288,0.309413279544398,0.336821166638915,0.314490820704288 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine2,5,0.318968574487083,0.312664251378097,0.340752326736474,0.318968574487083 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine3,5,0.318968574487083,0.312664251378097,0.340752326736474,0.318968574487083 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine4,5,0.318968574487083,0.312664251378097,0.340752326736474,0.318968574487083 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduousR,5,0.295824973644283,0.274293911569587,0.305668701087848,0.299876764604473 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous1,5,0.290173751105067,0.274506319298186,0.297478437407106,0.290173751105067 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous2,5,0.296757762231961,0.27182871307388,0.310837045047674,0.282319530090122 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous3,5,0.296757762231961,0.27182871307388,0.310837045047674,0.282319530090122 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous4,5,0.296757762231961,0.27182871307388,0.310837045047674,0.282319530090122 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwoodR,5,0.295824973644283,0.274293911569587,0.305668701087848,0.299876764604473 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood1,5,0.290173751105067,0.274506319298186,0.297478437407106,0.290173751105067 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood2,5,0.296757762231961,0.27182871307388,0.310837045047674,0.282319530090122 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood3,5,0.296757762231961,0.27182871307388,0.310837045047674,0.282319530090122 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood4,5,0.296757762231961,0.27182871307388,0.310837045047674,0.282319530090122 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,EnSeismic,5,0.141481841862143,0.101037454530666,0.155166019303452,0.141481841862143 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,EnSoftLin,5,0.145944122806755,0.111102583696747,0.152394694180028,0.145944122806755 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,TrSoftLin,5,0.151254404249002,0.111257162421822,0.169677475206313,0.151254404249002 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,HardLin,5,0.10581791027976,0.103285274866497,0.118805095513593,0.105464252479911 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,UrbInd,5,0.120554188125188,0.111490589837141,0.126429967967973,0.118831278861568 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Wellsites,5,0.118436951846217,0.100854555870935,0.12993852554848,0.118436951846217 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Crop,5,0.0787295250879479,0.0740709443841557,0.0817668485743107,0.0818907773645947 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,TameP,5,0.140827938812827,0.132759271224765,0.142962300036123,0.143304381786149 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,RoughP,5,0.144446534572736,0.131677156256055,0.149603889375921,0.144446534572736 +bryophyte,bryophyte,south,,,Bryum.All,Loamy,5,0.131351453900602,0.113692881823653,0.149554299791616,0.131351453900602 +bryophyte,bryophyte,south,,,Bryum.All,SandyLoam,5,0.168230588091749,0.13889898295342,0.194572600559702,0.168230588091749 +bryophyte,bryophyte,south,,,Bryum.All,ClaySub,5,0.134286972411218,0.115350655753102,0.147581797271814,0.132491792910693 +bryophyte,bryophyte,south,,,Bryum.All,RapidDrain,5,0.138449032992975,0.107907415094888,0.158100158480083,0.138449032992975 +bryophyte,bryophyte,south,,,Bryum.All,Blowout,5,0.141281233599798,0.10590070908767,0.166599116669043,0.141281233599798 +bryophyte,bryophyte,south,,,Bryum.All,ThinBreak,5,0.102411988424327,0.0844319362305818,0.112194708206142,0.10078405090107 +bryophyte,bryophyte,south,,,Bryum.All,Other,5,0.148997099710925,0.120678108469341,0.172696997297406,0.148997099710925 +bryophyte,bryophyte,south,,,Bryum.All,EnSeismic,5,0.270563729991131,0.145046738199297,0.399688830154759,0.270563729991131 +bryophyte,bryophyte,south,,,Bryum.All,EnSoftLin,5,0.264644772924918,0.149978812317139,0.43220956298513,0.264644772924918 +bryophyte,bryophyte,south,,,Bryum.All,TrSoftLin,5,0.282251573455878,0.170146701846002,0.43872727192627,0.317476910733227 +bryophyte,bryophyte,south,,,Bryum.All,HardLin,5,0.110629365723211,0.0810552521703511,0.151383806625905,0.110629365723211 +bryophyte,bryophyte,south,,,Bryum.All,UrbInd,5,0.108488833988913,0.0887323594322194,0.134141975996618,0.123137137219075 +bryophyte,bryophyte,south,,,Bryum.All,Wellsites,5,0.106656778225908,0.0851862575176286,0.131281759936394,0.114187844972883 +bryophyte,bryophyte,south,,,Bryum.All,Crop,5,0.0867723303608381,0.0719240515933601,0.0958865637087293,0.0867723303608381 +bryophyte,bryophyte,south,,,Bryum.All,TameP,5,0.130799444923102,0.100385963954449,0.133092687645548,0.131419200025382 +bryophyte,bryophyte,south,,,Bryum.All,RoughP,5,0.103079667833238,0.0879325257825222,0.108659699342939,0.105266209818982 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,Loamy,5,0.0658708529500316,0.0584170946124704,0.0732113409978297,0.0771500174013531 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,SandyLoam,5,0.0784771746495728,0.0669172034598962,0.0827367737015256,0.0845972096521121 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,ClaySub,5,0.0593845344002184,0.0549200028177223,0.0682680361913014,0.0703623858645358 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,RapidDrain,5,0.0962093454216259,0.0880220023238594,0.110546571991018,0.105235032366013 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,Blowout,5,0.0999344735223918,0.0879642270626199,0.114921019752446,0.11187246078917 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,ThinBreak,5,0.0832243161317533,0.0736759573237151,0.0872000168488827,0.08712969567306 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,Other,5,0.0350044159117947,0.0235240621773317,0.0465393309558795,0.0350044159117947 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,EnSeismic,5,0.174870896576241,0.131592672388024,0.232107751329401,0.174870896576241 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,EnSoftLin,5,0.170575229823803,0.132556088455842,0.203575202927324,0.174217020115512 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,TrSoftLin,5,0.167902857062929,0.134348895822696,0.227103388452211,0.167902857062929 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,HardLin,5,0.0350083307658359,0.0274183527715826,0.0431293993878657,0.0361036893881717 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,UrbInd,5,0.0366482612921616,0.0291165330654948,0.0390926018812285,0.0376936852658235 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,Wellsites,5,0.0402046073308911,0.0328353055362516,0.0535245003211711,0.0443655892619766 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,Crop,5,0.0280314481170995,0.0209128118965215,0.0308832991228334,0.0299952896731918 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,TameP,5,0.0603000878520825,0.0478738235167801,0.0692822585547884,0.0603000878520825 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,RoughP,5,0.05896330594214,0.0446846678988854,0.0632857593790237,0.05896330594214 +lichen,lichen,north,,,Cladonia.chlorophaea,WhiteSpruce,5,0.252558111603793,0.252233623501813,0.257568055301073,0.260735061777734 +lichen,lichen,north,,,Cladonia.chlorophaea,Pine,5,0.184365102576736,0.172889143030735,0.195249655172753,0.190839774983851 +lichen,lichen,north,,,Cladonia.chlorophaea,Deciduous,5,0.210876039041784,0.209789576719078,0.216360686080576,0.219920153696273 +lichen,lichen,north,,,Cladonia.chlorophaea,Mixedwood,5,0.206334473377505,0.200639373428878,0.211931951451974,0.21453093448714 +lichen,lichen,north,,,Cladonia.chlorophaea,BlackSpruce,5,0.194704875028495,0.180230712019276,0.200878568629445,0.197799504514728 +lichen,lichen,north,,,Cladonia.chlorophaea,TreedFen,5,0.196642101320525,0.181759365439195,0.199290475631995,0.19833896913885 +lichen,lichen,north,,,Cladonia.chlorophaea,TreedSwamp,5,0.218674219617792,0.205993590419692,0.225216309481972,0.228583589737506 +lichen,lichen,north,,,Cladonia.chlorophaea,GraminoidFen,5,0.181309655298167,0.168711402161303,0.182689299406762,0.181882976941668 +lichen,lichen,north,,,Cladonia.chlorophaea,ShrubbyFen,5,0.179886394489853,0.169069502842255,0.182265491214641,0.179886394489853 +lichen,lichen,north,,,Cladonia.chlorophaea,ShrubbyBog,5,0.192422125147435,0.178636161743157,0.19612891664086,0.194055487017162 +lichen,lichen,north,,,Cladonia.chlorophaea,ShrubbySwamp,5,0.189367176334449,0.174310177856253,0.197153533227337,0.199324860586018 +lichen,lichen,north,,,Cladonia.chlorophaea,Marsh,5,0.168597453494083,0.159518176998486,0.172794767606744,0.175486219415395 +lichen,lichen,north,,,Cladonia.chlorophaea,Shrub,5,0.132697975114608,0.110141045089634,0.146120700583706,0.145643541949497 +lichen,lichen,north,,,Cladonia.chlorophaea,Grass,5,0.118998503542502,0.114328830146678,0.13821038157821,0.140985698209627 +lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruceR,5,0.137481143553962,0.106121056053495,0.147800100708259,0.143158797725952 +lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce1,5,0.141648889755391,0.110574180596469,0.158070421629081,0.156240951661254 +lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce2,5,0.163146230734557,0.12755172113055,0.176699103321581,0.171754210954791 +lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce3,5,0.163146230734557,0.12755172113055,0.176699103321581,0.171754210954791 +lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce4,5,0.163146230734557,0.12755172113055,0.176699103321581,0.171754210954791 +lichen,lichen,north,,,Cladonia.chlorophaea,CCPineR,5,0.126778077644044,0.104149585698727,0.140294916114714,0.136417758599666 +lichen,lichen,north,,,Cladonia.chlorophaea,CCPine1,5,0.146182096026708,0.119148216693373,0.157131883875635,0.160265005565932 +lichen,lichen,north,,,Cladonia.chlorophaea,CCPine2,5,0.151061631522583,0.121802316338301,0.159508910028366,0.16261964666158 +lichen,lichen,north,,,Cladonia.chlorophaea,CCPine3,5,0.151061631522583,0.121802316338301,0.159508910028366,0.16261964666158 +lichen,lichen,north,,,Cladonia.chlorophaea,CCPine4,5,0.151061631522583,0.121802316338301,0.159508910028366,0.16261964666158 +lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduousR,5,0.132763606916402,0.111538020217543,0.145143112593902,0.143918628709584 +lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous1,5,0.124913970764929,0.115594531384545,0.142985113106185,0.144096912347687 +lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous2,5,0.140064631463177,0.121957667760874,0.150503112004934,0.156067195712122 +lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous3,5,0.140064631463177,0.121957667760874,0.150503112004934,0.156067195712122 +lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous4,5,0.140064631463177,0.121957667760874,0.150503112004934,0.156067195712122 +lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwoodR,5,0.132763606916402,0.111538020217543,0.145143112593902,0.143918628709584 +lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood1,5,0.124913970764929,0.115594531384545,0.142985113106185,0.144096912347687 +lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood2,5,0.140064631463177,0.121957667760874,0.150503112004934,0.156067195712122 +lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood3,5,0.140064631463177,0.121957667760874,0.150503112004934,0.156067195712122 +lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood4,5,0.140064631463177,0.121957667760874,0.150503112004934,0.156067195712122 +lichen,lichen,north,,,Cladonia.chlorophaea,EnSeismic,5,0.0430073866645988,0.0324898942505744,0.0544453854357603,0.0534506641135193 +lichen,lichen,north,,,Cladonia.chlorophaea,EnSoftLin,5,0.035163771867477,0.0288448203971999,0.0472410789647077,0.0472517824771714 +lichen,lichen,north,,,Cladonia.chlorophaea,TrSoftLin,5,0.0399168640327046,0.0294343698729292,0.0497101440576558,0.0502003843595238 +lichen,lichen,north,,,Cladonia.chlorophaea,HardLin,5,0.0214477931276479,0.01989719764426,0.0251663257355368,0.0221025930369697 +lichen,lichen,north,,,Cladonia.chlorophaea,UrbInd,5,0.0277038033657465,0.0236386443718993,0.0316896276821167,0.0300820556387816 +lichen,lichen,north,,,Cladonia.chlorophaea,Wellsites,5,0.0304612273664742,0.0218701670800133,0.0307646339552465,0.0309397188855785 +lichen,lichen,north,,,Cladonia.chlorophaea,Crop,5,0.0144023872928233,0.0128873369304996,0.0166180473618662,0.0144023872928233 +lichen,lichen,north,,,Cladonia.chlorophaea,TameP,5,0.0364155726464503,0.0323758564806015,0.0390656860204695,0.0347219123602915 +lichen,lichen,north,,,Cladonia.chlorophaea,RoughP,5,0.0312286077240493,0.0267039548887538,0.0331277982006694,0.0322013735700394 +lichen,lichen,north,,,Physcia.adscendens,WhiteSpruce,5,0.148117254390208,0.119524154763346,0.15659993385618,0.148117254390208 +lichen,lichen,north,,,Physcia.adscendens,Pine,5,0.120090507975572,0.0919928899086283,0.128219106511953,0.120090507975572 +lichen,lichen,north,,,Physcia.adscendens,Deciduous,5,0.312973172865495,0.272877568468071,0.328143934979411,0.320438568077181 +lichen,lichen,north,,,Physcia.adscendens,Mixedwood,5,0.223900055414834,0.175898143626776,0.241603354332382,0.223900055414834 +lichen,lichen,north,,,Physcia.adscendens,BlackSpruce,5,0.0303366775647651,0.0230567867693455,0.0372187660846359,0.0303366775647651 +lichen,lichen,north,,,Physcia.adscendens,TreedFen,5,0.033496884636421,0.0258181349816666,0.0405214391906766,0.033496884636421 +lichen,lichen,north,,,Physcia.adscendens,TreedSwamp,5,0.127824312427682,0.10439457327628,0.145753212080394,0.129977987858867 +lichen,lichen,north,,,Physcia.adscendens,GraminoidFen,5,0.0356574590224908,0.027239235299551,0.0458342153511507,0.0356574590224908 +lichen,lichen,north,,,Physcia.adscendens,ShrubbyFen,5,0.0342140335652919,0.0263641316624369,0.0432073837702072,0.0342140335652919 +lichen,lichen,north,,,Physcia.adscendens,ShrubbyBog,5,0.0314996512622481,0.0240617272622188,0.038642920620014,0.0314996512622481 +lichen,lichen,north,,,Physcia.adscendens,ShrubbySwamp,5,0.125349216770516,0.0973424296954802,0.141693661653428,0.125349216770516 +lichen,lichen,north,,,Physcia.adscendens,Marsh,5,0.0879264969679957,0.0638894252481001,0.10413661309277,0.0879264969679957 +lichen,lichen,north,,,Physcia.adscendens,Shrub,5,0.217306768306839,0.177722116469092,0.25094240615165,0.21909619000621 +lichen,lichen,north,,,Physcia.adscendens,Grass,5,0.255752574873662,0.202798368718069,0.309494641621698,0.255752574873662 +lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruceR,5,0.134579505041404,0.106566359078164,0.169762093411919,0.153137318561862 +lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce1,5,0.159356985870333,0.12551730686296,0.195733003247481,0.17472233290389 +lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce2,5,0.169427157082784,0.137926073308418,0.206625607964919,0.18730277633201 +lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce3,5,0.169427157082784,0.137926073308418,0.206625607964919,0.18730277633201 +lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce4,5,0.169427157082784,0.137926073308418,0.206625607964919,0.18730277633201 +lichen,lichen,north,,,Physcia.adscendens,CCPineR,5,0.135853106606989,0.107830700849556,0.173113188535039,0.154865202960644 +lichen,lichen,north,,,Physcia.adscendens,CCPine1,5,0.138925991399608,0.107733167901106,0.172357890555549,0.15476838066826 +lichen,lichen,north,,,Physcia.adscendens,CCPine2,5,0.143206092810703,0.111694247227964,0.175719884276117,0.159242837884132 +lichen,lichen,north,,,Physcia.adscendens,CCPine3,5,0.143206092810703,0.111694247227964,0.175719884276117,0.159242837884132 +lichen,lichen,north,,,Physcia.adscendens,CCPine4,5,0.143206092810703,0.111694247227964,0.175719884276117,0.159242837884132 +lichen,lichen,north,,,Physcia.adscendens,CCDeciduousR,5,0.187270582074541,0.148230815026816,0.221215741742339,0.206132428707949 +lichen,lichen,north,,,Physcia.adscendens,CCDeciduous1,5,0.206290169521746,0.178800568851486,0.255646063347353,0.235377679781569 +lichen,lichen,north,,,Physcia.adscendens,CCDeciduous2,5,0.181421847748252,0.15506968127878,0.222972690878233,0.208199852243512 +lichen,lichen,north,,,Physcia.adscendens,CCDeciduous3,5,0.181421847748252,0.15506968127878,0.222972690878233,0.208199852243512 +lichen,lichen,north,,,Physcia.adscendens,CCDeciduous4,5,0.181421847748252,0.15506968127878,0.222972690878233,0.208199852243512 +lichen,lichen,north,,,Physcia.adscendens,CCMixedwoodR,5,0.187270582074541,0.148230815026816,0.221215741742339,0.206132428707949 +lichen,lichen,north,,,Physcia.adscendens,CCMixedwood1,5,0.206290169521746,0.178800568851486,0.255646063347353,0.235377679781569 +lichen,lichen,north,,,Physcia.adscendens,CCMixedwood2,5,0.181421847748252,0.15506968127878,0.222972690878233,0.208199852243512 +lichen,lichen,north,,,Physcia.adscendens,CCMixedwood3,5,0.181421847748252,0.15506968127878,0.222972690878233,0.208199852243512 +lichen,lichen,north,,,Physcia.adscendens,CCMixedwood4,5,0.181421847748252,0.15506968127878,0.222972690878233,0.208199852243512 +lichen,lichen,north,,,Physcia.adscendens,EnSeismic,5,0.0559902156495264,0.0450389996829794,0.063162022530209,0.0655134588345379 +lichen,lichen,north,,,Physcia.adscendens,EnSoftLin,5,0.064110069904926,0.0486128343835806,0.0678688597629154,0.0697768863416448 +lichen,lichen,north,,,Physcia.adscendens,TrSoftLin,5,0.0467228650364718,0.0399577706600269,0.0576384467148874,0.058881483254521 +lichen,lichen,north,,,Physcia.adscendens,HardLin,5,0.0493451495047422,0.0391666686866418,0.0577595877606325,0.0487714656813048 +lichen,lichen,north,,,Physcia.adscendens,UrbInd,5,0.0764072515832514,0.0555226885679041,0.0933507532983004,0.0802096731192145 +lichen,lichen,north,,,Physcia.adscendens,Wellsites,5,0.0559024707707845,0.042698324468837,0.0713214459680398,0.0566484650167523 +lichen,lichen,north,,,Physcia.adscendens,Crop,5,0.0233600076765896,0.0162994624790713,0.0277077382676924,0.0239064995186528 +lichen,lichen,north,,,Physcia.adscendens,TameP,5,0.0647720336265828,0.0536621746759276,0.0746944108751399,0.0682683436932 +lichen,lichen,north,,,Physcia.adscendens,RoughP,5,0.0903485647539736,0.0764681003778962,0.107526408414187,0.0972957355532777 +lichen,lichen,south,,,Cladonia.chlorophaea,Loamy,5,0.0711095523804057,0.0615396544039222,0.0873640023441287,0.0778696228615501 +lichen,lichen,south,,,Cladonia.chlorophaea,SandyLoam,5,0.0669558263884111,0.0566416289689753,0.0767354645648717,0.0735391670882838 +lichen,lichen,south,,,Cladonia.chlorophaea,ClaySub,5,0.0670997262389032,0.0570566717431534,0.07783198623285,0.0735811496014876 +lichen,lichen,south,,,Cladonia.chlorophaea,RapidDrain,5,0.0666115068409651,0.0589181268496328,0.0705625490223415,0.0666115068409651 +lichen,lichen,south,,,Cladonia.chlorophaea,Blowout,5,0.0672990975495349,0.0617561190617265,0.0790852576828609,0.0672990975495349 +lichen,lichen,south,,,Cladonia.chlorophaea,ThinBreak,5,0.0686854871706772,0.0600881372034139,0.0718571895633798,0.0697591311347333 +lichen,lichen,south,,,Cladonia.chlorophaea,Other,5,0.00492116576724179,0.00179328595521191,0.0119142807694122,0.00492116576724179 +lichen,lichen,south,,,Cladonia.chlorophaea,EnSeismic,5,0.0622453464495927,0.0373574808760262,0.17872539502998,0.0466577038779196 +lichen,lichen,south,,,Cladonia.chlorophaea,EnSoftLin,5,0.0517567487465455,0.0403776037340564,0.184954973971726,0.038040565126713 +lichen,lichen,south,,,Cladonia.chlorophaea,TrSoftLin,5,0.0746140587297936,0.0357419097042295,0.219397411664499,0.0746140587297936 +lichen,lichen,south,,,Cladonia.chlorophaea,HardLin,5,0.013592607475638,0.0124634689890908,0.0155920066979704,0.0144144755450307 +lichen,lichen,south,,,Cladonia.chlorophaea,UrbInd,5,0.019379766458095,0.015692772230751,0.0225304733957075,0.019379766458095 +lichen,lichen,south,,,Cladonia.chlorophaea,Wellsites,5,0.022701154024468,0.0161827490300401,0.0286348700264202,0.022701154024468 +lichen,lichen,south,,,Cladonia.chlorophaea,Crop,5,0.00722850800015048,0.00618502948824642,0.00810592354133653,0.00722850800015048 +lichen,lichen,south,,,Cladonia.chlorophaea,TameP,5,0.0328421283698632,0.0305419870935615,0.0410321694106379,0.034808485051759 +lichen,lichen,south,,,Cladonia.chlorophaea,RoughP,5,0.0416452198287593,0.0380392683844879,0.0445156285504701,0.0418495106240208 +lichen,lichen,south,,,Physcia.adscendens,Loamy,5,0.185307491209447,0.168563448767941,0.198558700549421,0.185307491209447 +lichen,lichen,south,,,Physcia.adscendens,SandyLoam,5,0.187090337348794,0.168874063927985,0.207009934471911,0.187090337348794 +lichen,lichen,south,,,Physcia.adscendens,ClaySub,5,0.176847565312956,0.158930872004024,0.182796159194229,0.176847565312956 +lichen,lichen,south,,,Physcia.adscendens,RapidDrain,5,0.138998813516194,0.125734288859981,0.163845851123751,0.144844119510702 +lichen,lichen,south,,,Physcia.adscendens,Blowout,5,0.090304444350133,0.0670759368888286,0.106271276792021,0.090304444350133 +lichen,lichen,south,,,Physcia.adscendens,ThinBreak,5,0.111528415594478,0.0946979216799158,0.123434137285909,0.116292731708507 +lichen,lichen,south,,,Physcia.adscendens,Other,5,0.120972696681424,0.0901665330121894,0.176380105055838,0.154236617960994 +lichen,lichen,south,,,Physcia.adscendens,EnSeismic,5,0.133188070434216,0.108901350927189,0.151918850008194,0.10132273891866 +lichen,lichen,south,,,Physcia.adscendens,EnSoftLin,5,0.0838217618215749,0.0695606558073624,0.10949184990719,0.0657065549387281 +lichen,lichen,south,,,Physcia.adscendens,TrSoftLin,5,0.11700351234635,0.113381730844819,0.157602625994612,0.11700351234635 +lichen,lichen,south,,,Physcia.adscendens,HardLin,5,0.0234448746292444,0.0196758055138019,0.0253771487509822,0.0234448746292444 +lichen,lichen,south,,,Physcia.adscendens,UrbInd,5,0.0468717681891792,0.045915776072149,0.0680328278732017,0.0584978409080957 +lichen,lichen,south,,,Physcia.adscendens,Wellsites,5,0.0421096796706268,0.0417593426901775,0.0633167830463054,0.0539013816491975 +lichen,lichen,south,,,Physcia.adscendens,Crop,5,0.0115919080663084,0.00990369527975602,0.0121688285896611,0.0115919080663084 +lichen,lichen,south,,,Physcia.adscendens,TameP,5,0.0342785003876693,0.0267084511897149,0.0366998366344221,0.0342785003876693 +lichen,lichen,south,,,Physcia.adscendens,RoughP,5,0.0465936362218578,0.0388958541269103,0.0493968310675019,0.0477217933404628 +mite,mite,north,,,Ceratozetes.gracilis,WhiteSpruce,5,0.086563572861179,0.0767167182783778,0.103850297944825,0.0829175174899254 +mite,mite,north,,,Ceratozetes.gracilis,Pine,5,0.0676057357161677,0.0597889626226881,0.0808299073096749,0.0653737066067143 +mite,mite,north,,,Ceratozetes.gracilis,Deciduous,5,0.125632351831133,0.120257214804358,0.152116666252485,0.124987504484192 +mite,mite,north,,,Ceratozetes.gracilis,Mixedwood,5,0.102740054896251,0.0911162039820542,0.114888055268197,0.0961141497193831 +mite,mite,north,,,Ceratozetes.gracilis,BlackSpruce,5,0.0241266699970548,0.0221486160226852,0.0300508961337641,0.0232136037108846 +mite,mite,north,,,Ceratozetes.gracilis,TreedFen,5,0.0291436983742907,0.0266313578911309,0.0388477421265816,0.0291436983742907 +mite,mite,north,,,Ceratozetes.gracilis,TreedSwamp,5,0.0725645819253046,0.0620412036955493,0.0922586517345771,0.0725645819253046 +mite,mite,north,,,Ceratozetes.gracilis,GraminoidFen,5,0.029582506161117,0.0259755010707075,0.0371786434883822,0.0283799451413344 +mite,mite,north,,,Ceratozetes.gracilis,ShrubbyFen,5,0.0293003051542226,0.0259026482084509,0.0371425650287273,0.0284231983154652 +mite,mite,north,,,Ceratozetes.gracilis,ShrubbyBog,5,0.0250920755648613,0.0229629923604966,0.0314506787507892,0.024249472496002 +mite,mite,north,,,Ceratozetes.gracilis,ShrubbySwamp,5,0.0751382459063968,0.0617421810307777,0.0922584405695148,0.0751382459063968 +mite,mite,north,,,Ceratozetes.gracilis,Marsh,5,0.0597546799051676,0.0481667736774781,0.076011176791874,0.0549517667193043 +mite,mite,north,,,Ceratozetes.gracilis,Shrub,5,0.0762627142444002,0.0640387404617767,0.0890037195393509,0.0742012125044249 +mite,mite,north,,,Ceratozetes.gracilis,Grass,5,0.0822637736900863,0.0730158192233545,0.113159024184108,0.0822637736900863 +mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruceR,5,0.10299620507702,0.0939911339005037,0.127360184892372,0.10299620507702 +mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce1,5,0.119405831109742,0.105395916236163,0.143377668576338,0.119405831109742 +mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce2,5,0.119820585887542,0.106500697859523,0.135874182106685,0.117438284823892 +mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce3,5,0.119820585887542,0.106500697859523,0.135874182106685,0.117438284823892 +mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce4,5,0.119820585887542,0.106500697859523,0.135874182106685,0.117438284823892 +mite,mite,north,,,Ceratozetes.gracilis,CCPineR,5,0.107138745801614,0.0991111184906569,0.1310627193558,0.107138745801614 +mite,mite,north,,,Ceratozetes.gracilis,CCPine1,5,0.106322388686437,0.0984881924309444,0.12972104617042,0.106322388686437 +mite,mite,north,,,Ceratozetes.gracilis,CCPine2,5,0.106836815104621,0.0985247503643216,0.128561640199984,0.105801123187711 +mite,mite,north,,,Ceratozetes.gracilis,CCPine3,5,0.106836815104621,0.0985247503643216,0.128561640199984,0.105801123187711 +mite,mite,north,,,Ceratozetes.gracilis,CCPine4,5,0.106836815104621,0.0985247503643216,0.128561640199984,0.105801123187711 +mite,mite,north,,,Ceratozetes.gracilis,CCDeciduousR,5,0.132936133655999,0.128067434242984,0.155537027640493,0.128619054270295 +mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous1,5,0.164273889818037,0.151347125614095,0.185063646453912,0.152770868236052 +mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous2,5,0.124259292424775,0.120923587625806,0.145196460272158,0.124259292424775 +mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous3,5,0.124259292424775,0.120923587625806,0.145196460272158,0.124259292424775 +mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous4,5,0.124259292424775,0.120923587625806,0.145196460272158,0.124259292424775 +mite,mite,north,,,Ceratozetes.gracilis,CCMixedwoodR,5,0.132936133655999,0.128067434242984,0.155537027640493,0.128619054270295 +mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood1,5,0.164273889818037,0.151347125614095,0.185063646453912,0.152770868236052 +mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood2,5,0.124259292424775,0.120923587625806,0.145196460272158,0.124259292424775 +mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood3,5,0.124259292424775,0.120923587625806,0.145196460272158,0.124259292424775 +mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood4,5,0.124259292424775,0.120923587625806,0.145196460272158,0.124259292424775 +mite,mite,north,,,Ceratozetes.gracilis,EnSeismic,5,0.0892000327566164,0.0852924765426569,0.105651698869338,0.0863863188118811 +mite,mite,north,,,Ceratozetes.gracilis,EnSoftLin,5,0.0971724964558532,0.074607713107594,0.109467130555906,0.0835598316938897 +mite,mite,north,,,Ceratozetes.gracilis,TrSoftLin,5,0.0966485243715561,0.0727021177007835,0.107989309206506,0.0796090919531723 +mite,mite,north,,,Ceratozetes.gracilis,HardLin,5,0.030285389017103,0.0280919388876705,0.0430527922930095,0.030285389017103 +mite,mite,north,,,Ceratozetes.gracilis,UrbInd,5,0.0531877107104781,0.0413567979216014,0.0723145731703991,0.0499213392018499 +mite,mite,north,,,Ceratozetes.gracilis,Wellsites,5,0.0364783044505167,0.0327093739032554,0.0582351324661563,0.0364783044505167 +mite,mite,north,,,Ceratozetes.gracilis,Crop,5,0.0272509324404124,0.0242622005749426,0.0406762833651796,0.0272509324404124 +mite,mite,north,,,Ceratozetes.gracilis,TameP,5,0.0395987782723833,0.0328755530427585,0.052231246098323,0.0357630567524386 +mite,mite,north,,,Ceratozetes.gracilis,RoughP,5,0.0623490757063713,0.0519824292494706,0.0707941485092565,0.0565630088699719 +mite,mite,north,,,Trhypochthonius.tectorum,WhiteSpruce,5,0.0528174416220476,0.0470429073757102,0.0551954091231743,0.0492385519910045 +mite,mite,north,,,Trhypochthonius.tectorum,Pine,5,0.0584140684512024,0.052614647046147,0.0683527213169536,0.0584140684512024 +mite,mite,north,,,Trhypochthonius.tectorum,Deciduous,5,0.0524337030605855,0.0460399144908319,0.0583819302245161,0.0511347536386993 +mite,mite,north,,,Trhypochthonius.tectorum,Mixedwood,5,0.0530888311401915,0.0459989852364304,0.0572300804806354,0.0503188069652154 +mite,mite,north,,,Trhypochthonius.tectorum,BlackSpruce,5,0.0466153767699601,0.0390312782230719,0.0489398248022537,0.0466153767699601 +mite,mite,north,,,Trhypochthonius.tectorum,TreedFen,5,0.0397868461458001,0.0347684587689401,0.0425603168326677,0.0398306061756154 +mite,mite,north,,,Trhypochthonius.tectorum,TreedSwamp,5,0.0336045959652836,0.030272090513297,0.0364699382664357,0.0336045959652836 +mite,mite,north,,,Trhypochthonius.tectorum,GraminoidFen,5,0.0399575797477027,0.0348234370026121,0.0422700413774057,0.0399575797477027 +mite,mite,north,,,Trhypochthonius.tectorum,ShrubbyFen,5,0.0399074377327824,0.0354444041339281,0.0421067187992337,0.0399074377327824 +mite,mite,north,,,Trhypochthonius.tectorum,ShrubbyBog,5,0.0456537678977006,0.0386573508681974,0.0476945372943053,0.0456537678977006 +mite,mite,north,,,Trhypochthonius.tectorum,ShrubbySwamp,5,0.0287853968916506,0.026955528084015,0.0307101136832832,0.0287853968916506 +mite,mite,north,,,Trhypochthonius.tectorum,Marsh,5,0.0349094566129046,0.0315766837905335,0.0375194490158177,0.0342204386832978 +mite,mite,north,,,Trhypochthonius.tectorum,Shrub,5,0.0292239621535654,0.0231420017131017,0.0331576234294524,0.0322425562283813 +mite,mite,north,,,Trhypochthonius.tectorum,Grass,5,0.0444527060764193,0.0315734249567915,0.0481385394142575,0.0452693650218574 +mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruceR,5,0.0427572042195979,0.0385465979484639,0.0468834080024041,0.0427572042195979 +mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce1,5,0.0385213851479223,0.0376602801079395,0.0427534270225092,0.0388538182932539 +mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce2,5,0.0386033003986392,0.0381241227189354,0.0425410934782636,0.0394968698022702 +mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce3,5,0.0386033003986392,0.0381241227189354,0.0425410934782636,0.0394968698022702 +mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce4,5,0.0386033003986392,0.0381241227189354,0.0425410934782636,0.0394968698022702 +mite,mite,north,,,Trhypochthonius.tectorum,CCPineR,5,0.0463951493037776,0.0417507590889956,0.0531914251239524,0.0463951493037776 +mite,mite,north,,,Trhypochthonius.tectorum,CCPine1,5,0.0404378910028256,0.0390901164042141,0.0437866917404038,0.0404378910028256 +mite,mite,north,,,Trhypochthonius.tectorum,CCPine2,5,0.0405732816727818,0.0391296471473719,0.0442128755860879,0.0405732816727818 +mite,mite,north,,,Trhypochthonius.tectorum,CCPine3,5,0.0405732816727818,0.0391296471473719,0.0442128755860879,0.0405732816727818 +mite,mite,north,,,Trhypochthonius.tectorum,CCPine4,5,0.0405732816727818,0.0391296471473719,0.0442128755860879,0.0405732816727818 +mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduousR,5,0.0456285665859081,0.0424389773446854,0.0477117305649164,0.0417930832945295 +mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous1,5,0.0350894879155433,0.0346069477032076,0.0399950253825593,0.0344296436156036 +mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous2,5,0.0372909762227814,0.036816488022243,0.0412039115200715,0.0368933081231406 +mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous3,5,0.0372909762227814,0.036816488022243,0.0412039115200715,0.0368933081231406 +mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous4,5,0.0372909762227814,0.036816488022243,0.0412039115200715,0.0368933081231406 +mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwoodR,5,0.0456285665859081,0.0424389773446854,0.0477117305649164,0.0417930832945295 +mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood1,5,0.0350894879155433,0.0346069477032076,0.0399950253825593,0.0344296436156036 +mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood2,5,0.0372909762227814,0.036816488022243,0.0412039115200715,0.0368933081231406 +mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood3,5,0.0372909762227814,0.036816488022243,0.0412039115200715,0.0368933081231406 +mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood4,5,0.0372909762227814,0.036816488022243,0.0412039115200715,0.0368933081231406 +mite,mite,north,,,Trhypochthonius.tectorum,EnSeismic,5,0.0485139348560335,0.022299209632709,0.0631853341861569,0.0524369464232436 +mite,mite,north,,,Trhypochthonius.tectorum,EnSoftLin,5,0.0307123644746215,0.0170391108634837,0.0603209779022436,0.0382901264037748 +mite,mite,north,,,Trhypochthonius.tectorum,TrSoftLin,5,0.0283023906701695,0.0140472504901697,0.0484536423700281,0.0349855097212285 +mite,mite,north,,,Trhypochthonius.tectorum,HardLin,5,0.0275631110632781,0.0271011198512758,0.0299860657729306,0.0275631110632781 +mite,mite,north,,,Trhypochthonius.tectorum,UrbInd,5,0.02102789586149,0.0185209876556111,0.0277404823197269,0.02102789586149 +mite,mite,north,,,Trhypochthonius.tectorum,Wellsites,5,0.0255632683926702,0.022909238965072,0.0333254456849068,0.0255632683926702 +mite,mite,north,,,Trhypochthonius.tectorum,Crop,5,0.0189924168473029,0.0183738529763355,0.0201135533663764,0.0186828185710372 +mite,mite,north,,,Trhypochthonius.tectorum,TameP,5,0.0297706120995112,0.0261277769234512,0.0304412146651425,0.0297507770299335 +mite,mite,north,,,Trhypochthonius.tectorum,RoughP,5,0.0385430595610164,0.0364209049362696,0.0448310802520045,0.0442413576652145 +mite,mite,south,,,Ceratozetes.gracilis,Loamy,5,0.0238103122136407,0.0162916053812498,0.0254517325212418,0.0238103122136407 +mite,mite,south,,,Ceratozetes.gracilis,SandyLoam,5,0.0210959451329293,0.0157461340650897,0.0226226359663402,0.0210959451329293 +mite,mite,south,,,Ceratozetes.gracilis,ClaySub,5,0.0216053741377964,0.0166034445295144,0.0233693381933055,0.0216053741377964 +mite,mite,south,,,Ceratozetes.gracilis,RapidDrain,5,0.0133718783216547,0.00932138792451844,0.0250935825846901,0.0161752361101314 +mite,mite,south,,,Ceratozetes.gracilis,Blowout,5,0.0147755241581397,0.0105588510912554,0.0299668530715488,0.0159723022796187 +mite,mite,south,,,Ceratozetes.gracilis,ThinBreak,5,0.0119568306299684,0.0091383082572202,0.027039830856063,0.01486607926369 +mite,mite,south,,,Ceratozetes.gracilis,Other,5,0.00701396379096207,0.00252926113611137,0.0131961873214771,0.00579166660810339 +mite,mite,south,,,Ceratozetes.gracilis,EnSeismic,5,0.0295519285237416,0.0158705851196106,0.0793874276023725,0.0194759862111175 +mite,mite,south,,,Ceratozetes.gracilis,EnSoftLin,5,0.0282791090982643,0.0136535818975881,0.0665632634992758,0.015566543920319 +mite,mite,south,,,Ceratozetes.gracilis,TrSoftLin,5,0.030376609296344,0.0131656411945635,0.0724120783763525,0.0152056472563868 +mite,mite,south,,,Ceratozetes.gracilis,HardLin,5,0.00234013650199867,0.00157408130932093,0.00269640828134894,0.0028422579664061 +mite,mite,south,,,Ceratozetes.gracilis,UrbInd,5,0.00442694915749631,0.00259403504949584,0.004966609916281,0.00517914509861752 +mite,mite,south,,,Ceratozetes.gracilis,Wellsites,5,0.00327542265646592,0.00215915551000519,0.00376220379943654,0.00372749149596442 +mite,mite,south,,,Ceratozetes.gracilis,Crop,5,0.00127563611072267,0.000977139985559572,0.00177900764903674,0.00127563611072267 +mite,mite,south,,,Ceratozetes.gracilis,TameP,5,0.00344276486224722,0.0026343955073118,0.0049035086422344,0.00296970904161235 +mite,mite,south,,,Ceratozetes.gracilis,RoughP,5,0.00293393048720782,0.00272051771091779,0.00397145156682642,0.00293393048720782 +mite,mite,south,,,Trhypochthonius.tectorum,Loamy,5,0.0433762765721693,0.041575380974286,0.0456813889614279,0.0404535282457183 +mite,mite,south,,,Trhypochthonius.tectorum,SandyLoam,5,0.0370412611293415,0.0320849760745711,0.0388955310505179,0.033421514854404 +mite,mite,south,,,Trhypochthonius.tectorum,ClaySub,5,0.0397182245219592,0.0370378244744747,0.0425974265916945,0.0373334902833867 +mite,mite,south,,,Trhypochthonius.tectorum,RapidDrain,5,0.0348446652342381,0.0288876202906726,0.0373550679573903,0.0348446652342381 +mite,mite,south,,,Trhypochthonius.tectorum,Blowout,5,0.0493616083130368,0.0378196408421891,0.0615700842593314,0.0493616083130368 +mite,mite,south,,,Trhypochthonius.tectorum,ThinBreak,5,0.0391231265813762,0.0305066086263429,0.0433017470186029,0.0391231265813762 +mite,mite,south,,,Trhypochthonius.tectorum,Other,5,0.0267430656749916,0.0150331179914083,0.0615077965759264,0.0348200299289801 +mite,mite,south,,,Trhypochthonius.tectorum,EnSeismic,5,0.00395303813767026,0.000679143589089828,0.0077282875958993,0.00752231978083473 +mite,mite,south,,,Trhypochthonius.tectorum,EnSoftLin,5,0.0022394327419296,0.000250159707076951,0.00572219450269663,0.00532089527348282 +mite,mite,south,,,Trhypochthonius.tectorum,TrSoftLin,5,0.0018128522182454,0.000227022143876293,0.00421995140238705,0.0033920330144409 +mite,mite,south,,,Trhypochthonius.tectorum,HardLin,5,0.029746207849259,0.0230572595904927,0.0372347856944118,0.0249718244194546 +mite,mite,south,,,Trhypochthonius.tectorum,UrbInd,5,0.0184447426669055,0.0152714841534473,0.0221858027757421,0.0184447426669055 +mite,mite,south,,,Trhypochthonius.tectorum,Wellsites,5,0.0198084112982138,0.0160582694985444,0.0252779575385323,0.0198084112982138 +mite,mite,south,,,Trhypochthonius.tectorum,Crop,5,0.0167510174427364,0.0138665410123,0.0181835138663833,0.0167510174427364 +mite,mite,south,,,Trhypochthonius.tectorum,TameP,5,0.0294892078953274,0.0236923538570104,0.0371048913821795,0.0294892078953274 +mite,mite,south,,,Trhypochthonius.tectorum,RoughP,5,0.0285996367194483,0.0230952943982221,0.0327451288432799,0.0282098095755803 +vascular_plant,vascular_plant,north,,,Galium.boreale,WhiteSpruce,5,0.183121673715808,0.175017147461159,0.187146010646516,0.179937811836484 +vascular_plant,vascular_plant,north,,,Galium.boreale,Pine,5,0.160822240519723,0.153671777206748,0.16880386031362,0.157886997041383 +vascular_plant,vascular_plant,north,,,Galium.boreale,Deciduous,5,0.323838640092258,0.320902205843942,0.326165879340272,0.321302577635538 +vascular_plant,vascular_plant,north,,,Galium.boreale,Mixedwood,5,0.248056652958635,0.241904139529187,0.248992876428385,0.240515818751538 +vascular_plant,vascular_plant,north,,,Galium.boreale,BlackSpruce,5,0.0286184131550186,0.0278268302521937,0.0298297418830873,0.0286184131550186 +vascular_plant,vascular_plant,north,,,Galium.boreale,TreedFen,5,0.0275490996527874,0.0273330267523449,0.0286093502773019,0.0285089456895415 +vascular_plant,vascular_plant,north,,,Galium.boreale,TreedSwamp,5,0.0763457648374208,0.0717744957804654,0.0854722892248052,0.0755880399019759 +vascular_plant,vascular_plant,north,,,Galium.boreale,GraminoidFen,5,0.0316620628444337,0.0296102771197122,0.0317493238797606,0.031783055532387 +vascular_plant,vascular_plant,north,,,Galium.boreale,ShrubbyFen,5,0.0306675631079006,0.028459267435357,0.030899682848497,0.0306675631079006 +vascular_plant,vascular_plant,north,,,Galium.boreale,ShrubbyBog,5,0.029050927009874,0.028126253304527,0.0301460009806379,0.029050927009874 +vascular_plant,vascular_plant,north,,,Galium.boreale,ShrubbySwamp,5,0.0706517671396776,0.0624874269706742,0.0785987941676256,0.0696735869368905 +vascular_plant,vascular_plant,north,,,Galium.boreale,Marsh,5,0.0650100888691628,0.0587961988201134,0.0682898949037326,0.0650100888691628 +vascular_plant,vascular_plant,north,,,Galium.boreale,Shrub,5,0.252023224803696,0.23116858341554,0.291923912797255,0.252023224803696 +vascular_plant,vascular_plant,north,,,Galium.boreale,Grass,5,0.273529817720032,0.235042245742591,0.302326820902852,0.25320192046881 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruceR,5,0.192040060293012,0.183858614935153,0.213460844580877,0.192040060293012 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce1,5,0.200328585816406,0.183875276951943,0.221395216421019,0.200328585816406 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce2,5,0.195024220701432,0.189933465252437,0.222305058749617,0.195024220701432 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce3,5,0.195024220701432,0.189933465252437,0.222305058749617,0.195024220701432 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce4,5,0.195024220701432,0.189933465252437,0.222305058749617,0.195024220701432 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCPineR,5,0.177728990894232,0.170528480101811,0.199319355800762,0.175481244356181 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine1,5,0.171918094970603,0.166298582262056,0.182650224642672,0.170696692484412 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine2,5,0.171068459774545,0.165967261527443,0.182144535119517,0.168683034103466 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine3,5,0.171068459774545,0.165967261527443,0.182144535119517,0.168683034103466 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine4,5,0.171068459774545,0.165967261527443,0.182144535119517,0.168683034103466 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduousR,5,0.243698742131102,0.228005718359401,0.255341310383756,0.233629236744504 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous1,5,0.289272344562207,0.278827384761615,0.314873495331392,0.281412031987215 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous2,5,0.238190521595173,0.229682650443223,0.259739317474075,0.238190521595173 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous3,5,0.238190521595173,0.229682650443223,0.259739317474075,0.238190521595173 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous4,5,0.238190521595173,0.229682650443223,0.259739317474075,0.238190521595173 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwoodR,5,0.243698742131102,0.228005718359401,0.255341310383756,0.233629236744504 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood1,5,0.289272344562207,0.278827384761615,0.314873495331392,0.281412031987215 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood2,5,0.238190521595173,0.229682650443223,0.259739317474075,0.238190521595173 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood3,5,0.238190521595173,0.229682650443223,0.259739317474075,0.238190521595173 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood4,5,0.238190521595173,0.229682650443223,0.259739317474075,0.238190521595173 +vascular_plant,vascular_plant,north,,,Galium.boreale,EnSeismic,5,0.0875105193731231,0.0732083686118318,0.0944803257900605,0.0875105193731231 +vascular_plant,vascular_plant,north,,,Galium.boreale,EnSoftLin,5,0.0886000656233342,0.077139983069639,0.0979615614665123,0.0886000656233342 +vascular_plant,vascular_plant,north,,,Galium.boreale,TrSoftLin,5,0.0874053978345603,0.0736681689001696,0.0937757064565243,0.0874053978345603 +vascular_plant,vascular_plant,north,,,Galium.boreale,HardLin,5,0.0559027986831825,0.0502145592934445,0.0652680752808498,0.0559027986831825 +vascular_plant,vascular_plant,north,,,Galium.boreale,UrbInd,5,0.0561313834575388,0.0508538103223802,0.0641692994614501,0.0561313834575388 +vascular_plant,vascular_plant,north,,,Galium.boreale,Wellsites,5,0.0530243957815623,0.0453484536105281,0.0640958472423716,0.0530243957815623 +vascular_plant,vascular_plant,north,,,Galium.boreale,Crop,5,0.0258110195330383,0.0221573451465345,0.0287061904273492,0.0258110195330383 +vascular_plant,vascular_plant,north,,,Galium.boreale,TameP,5,0.0613931977354205,0.0569873262354261,0.0679942754753597,0.0589997552075799 +vascular_plant,vascular_plant,north,,,Galium.boreale,RoughP,5,0.0979808674648413,0.0890803699445946,0.117007581054317,0.0961185940775852 +vascular_plant,vascular_plant,north,,,Vicia.americana,WhiteSpruce,5,0.101553761027206,0.0913929554412134,0.103144305327603,0.101553761027206 +vascular_plant,vascular_plant,north,,,Vicia.americana,Pine,5,0.0998247211617761,0.0888576317158279,0.106866967953181,0.100377545526554 +vascular_plant,vascular_plant,north,,,Vicia.americana,Deciduous,5,0.223504144576426,0.209303224861102,0.229143320183743,0.225270102028411 +vascular_plant,vascular_plant,north,,,Vicia.americana,Mixedwood,5,0.166020096402123,0.157521812078803,0.169401092615307,0.166442718248815 +vascular_plant,vascular_plant,north,,,Vicia.americana,BlackSpruce,5,0.0152382225104409,0.0131815651592785,0.0156933953833105,0.0158904616319235 +vascular_plant,vascular_plant,north,,,Vicia.americana,TreedFen,5,0.0148150262651934,0.0131140873613808,0.0159433848997332,0.0161609410518398 +vascular_plant,vascular_plant,north,,,Vicia.americana,TreedSwamp,5,0.0626854739607867,0.0578234419599208,0.0726342763088379,0.0675081415730946 +vascular_plant,vascular_plant,north,,,Vicia.americana,GraminoidFen,5,0.0172289489029456,0.0148633347804432,0.0179211695883927,0.0182945565459449 +vascular_plant,vascular_plant,north,,,Vicia.americana,ShrubbyFen,5,0.0170030528799768,0.015145514732073,0.0178813511526892,0.0181281737827822 +vascular_plant,vascular_plant,north,,,Vicia.americana,ShrubbyBog,5,0.0156367177151313,0.0136590554777173,0.0161282336201734,0.0163927557010309 +vascular_plant,vascular_plant,north,,,Vicia.americana,ShrubbySwamp,5,0.0583505124998893,0.0530026160375959,0.0660615188685165,0.0634022552382413 +vascular_plant,vascular_plant,north,,,Vicia.americana,Marsh,5,0.0557898212495504,0.0528857121313063,0.0648596355824789,0.0604419474510517 +vascular_plant,vascular_plant,north,,,Vicia.americana,Shrub,5,0.164232328257922,0.152471445214372,0.189356863032936,0.172247590325508 +vascular_plant,vascular_plant,north,,,Vicia.americana,Grass,5,0.189591812325837,0.180789380071826,0.195223068881098,0.193480328766703 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruceR,5,0.138865647030093,0.133170222713371,0.144891610906666,0.147784161910856 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce1,5,0.167515719027838,0.160357501021988,0.176063584763535,0.177990441786736 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce2,5,0.156294302850796,0.144320379020152,0.170257316425211,0.164040271666844 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce3,5,0.156294302850796,0.144320379020152,0.170257316425211,0.164040271666844 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce4,5,0.156294302850796,0.144320379020152,0.170257316425211,0.164040271666844 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCPineR,5,0.140410555161451,0.131933181529334,0.146001243719552,0.146947892442068 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine1,5,0.144746387069471,0.135879363458001,0.156740570136221,0.155709937975558 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine2,5,0.140463102773397,0.132291852364442,0.154362590654316,0.15194678637839 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine3,5,0.140463102773397,0.132291852364442,0.154362590654316,0.15194678637839 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine4,5,0.140463102773397,0.132291852364442,0.154362590654316,0.15194678637839 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduousR,5,0.186268009445281,0.179873753389021,0.193726144287162,0.194965312502246 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous1,5,0.226880224259965,0.213353736860118,0.232208272227364,0.232880630175656 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous2,5,0.190428075875072,0.18281204800814,0.201313954413402,0.199972978968214 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous3,5,0.190428075875072,0.18281204800814,0.201313954413402,0.199972978968214 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous4,5,0.190428075875072,0.18281204800814,0.201313954413402,0.199972978968214 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwoodR,5,0.186268009445281,0.179873753389021,0.193726144287162,0.194965312502246 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood1,5,0.226880224259965,0.213353736860118,0.232208272227364,0.232880630175656 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood2,5,0.190428075875072,0.18281204800814,0.201313954413402,0.199972978968214 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood3,5,0.190428075875072,0.18281204800814,0.201313954413402,0.199972978968214 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood4,5,0.190428075875072,0.18281204800814,0.201313954413402,0.199972978968214 +vascular_plant,vascular_plant,north,,,Vicia.americana,EnSeismic,5,0.265392025080583,0.214389458724113,0.29690478942424,0.265392025080583 +vascular_plant,vascular_plant,north,,,Vicia.americana,EnSoftLin,5,0.298814173633524,0.236929158251934,0.340754085784134,0.298814173633524 +vascular_plant,vascular_plant,north,,,Vicia.americana,TrSoftLin,5,0.227845819559914,0.184048162622374,0.253779885488772,0.227845819559914 +vascular_plant,vascular_plant,north,,,Vicia.americana,HardLin,5,0.0748385066486699,0.0709465060040099,0.0759426399863492,0.074608145928891 +vascular_plant,vascular_plant,north,,,Vicia.americana,UrbInd,5,0.0854741045400396,0.0784174133968789,0.093873670322466,0.0853653032495656 +vascular_plant,vascular_plant,north,,,Vicia.americana,Wellsites,5,0.0737419729385725,0.0663486071752425,0.091252322788661,0.0843795108863626 +vascular_plant,vascular_plant,north,,,Vicia.americana,Crop,5,0.036655361677642,0.0337129300431386,0.0375198866500137,0.0380361941275467 +vascular_plant,vascular_plant,north,,,Vicia.americana,TameP,5,0.0748761999347293,0.0671002609890585,0.0846241909092322,0.0748761999347293 +vascular_plant,vascular_plant,north,,,Vicia.americana,RoughP,5,0.0717382740038997,0.062013045721503,0.081268618052669,0.0717382740038997 +vascular_plant,vascular_plant,south,,,Galium.boreale,Loamy,5,0.134365402417369,0.123106543128346,0.150976516544205,0.144796630860666 +vascular_plant,vascular_plant,south,,,Galium.boreale,SandyLoam,5,0.091938282951146,0.0834941504262747,0.0993411400257454,0.0960115962056319 +vascular_plant,vascular_plant,south,,,Galium.boreale,ClaySub,5,0.114046654257758,0.100318358261911,0.128310081890109,0.120945237158297 +vascular_plant,vascular_plant,south,,,Galium.boreale,RapidDrain,5,0.05310323606415,0.0444694077828011,0.0592230385085375,0.0560393911252958 +vascular_plant,vascular_plant,south,,,Galium.boreale,Blowout,5,0.0714452374990417,0.057084703882324,0.0762765469979775,0.0714452374990417 +vascular_plant,vascular_plant,south,,,Galium.boreale,ThinBreak,5,0.0671197829074706,0.052166883497761,0.0686688886106393,0.0671197829074706 +vascular_plant,vascular_plant,south,,,Galium.boreale,Other,5,0.0164649507555984,0.00993121036277023,0.0253623429302738,0.0228159947658059 +vascular_plant,vascular_plant,south,,,Galium.boreale,EnSeismic,5,0.0415016553380274,0.0231540080687652,0.085101406270251,0.0229861380647585 +vascular_plant,vascular_plant,south,,,Galium.boreale,EnSoftLin,5,0.0407276571975449,0.0286326189698712,0.107018561270878,0.0279355914860159 +vascular_plant,vascular_plant,south,,,Galium.boreale,TrSoftLin,5,0.0226385168950732,0.00835865355823153,0.0475095701843972,0.010693670158572 +vascular_plant,vascular_plant,south,,,Galium.boreale,HardLin,5,0.00673426222555851,0.00531954014393854,0.0106092249476061,0.00976625629745091 +vascular_plant,vascular_plant,south,,,Galium.boreale,UrbInd,5,0.00985092254439493,0.00851868437300072,0.0111799736158844,0.00940783365535566 +vascular_plant,vascular_plant,south,,,Galium.boreale,Wellsites,5,0.0119568557789859,0.0100635722829671,0.0139439952155709,0.0119372766800421 +vascular_plant,vascular_plant,south,,,Galium.boreale,Crop,5,0.0035421828121118,0.0029236779346984,0.0044376576473726,0.00423757624145812 +vascular_plant,vascular_plant,south,,,Galium.boreale,TameP,5,0.00753117359803952,0.00544538332822283,0.00848441500382163,0.00815694324953152 +vascular_plant,vascular_plant,south,,,Galium.boreale,RoughP,5,0.0103140314496203,0.00799607214712183,0.0132882007874275,0.0115163243840628 +vascular_plant,vascular_plant,south,,,Vicia.americana,Loamy,5,0.290256170393407,0.27517564488482,0.305591641737234,0.28326053160004 +vascular_plant,vascular_plant,south,,,Vicia.americana,SandyLoam,5,0.247694102021608,0.240243796194645,0.264898126840318,0.246992793299344 +vascular_plant,vascular_plant,south,,,Vicia.americana,ClaySub,5,0.304804176654528,0.288824323211772,0.319488697106166,0.298730042472979 +vascular_plant,vascular_plant,south,,,Vicia.americana,RapidDrain,5,0.161543641211127,0.14461304867818,0.187076574600276,0.161543641211127 +vascular_plant,vascular_plant,south,,,Vicia.americana,Blowout,5,0.118486235053307,0.106602712514188,0.133493364719528,0.118464883887892 +vascular_plant,vascular_plant,south,,,Vicia.americana,ThinBreak,5,0.178106045017269,0.168348667462815,0.19813445742055,0.178391738601418 +vascular_plant,vascular_plant,south,,,Vicia.americana,Other,5,0.105690469757533,0.0622060495880062,0.119017839454214,0.105690469757533 +vascular_plant,vascular_plant,south,,,Vicia.americana,EnSeismic,5,0.0980197206348814,0.0533787007453977,0.12395969266943,0.138807834520618 +vascular_plant,vascular_plant,south,,,Vicia.americana,EnSoftLin,5,0.123299345466385,0.0671820694144946,0.170108003098189,0.184229861785201 +vascular_plant,vascular_plant,south,,,Vicia.americana,TrSoftLin,5,0.061746168627948,0.0310306329082704,0.0818736395608765,0.0834557721649041 +vascular_plant,vascular_plant,south,,,Vicia.americana,HardLin,5,0.0400414879581075,0.0377218470887579,0.0460915895820948,0.0366124257600541 +vascular_plant,vascular_plant,south,,,Vicia.americana,UrbInd,5,0.0397873604916118,0.0333793697344656,0.0421853226025111,0.0305480068381504 +vascular_plant,vascular_plant,south,,,Vicia.americana,Wellsites,5,0.0394794040260986,0.0345420466372147,0.0484006240004426,0.0313886488169569 +vascular_plant,vascular_plant,south,,,Vicia.americana,Crop,5,0.0276163960433134,0.0254603950739441,0.0315801144177112,0.0267332266250596 +vascular_plant,vascular_plant,south,,,Vicia.americana,TameP,5,0.0369597153253211,0.0340452379630624,0.0420353017354891,0.0362057249277776 +vascular_plant,vascular_plant,south,,,Vicia.americana,RoughP,5,0.044197627974472,0.0423406929386505,0.0510202256161932,0.044197627974472 diff --git a/3_output/exp_002_soilgrids/tables/metric_summary.csv b/3_output/exp_002_soilgrids/tables/metric_summary.csv new file mode 100644 index 0000000..1dc2d7e --- /dev/null +++ b/3_output/exp_002_soilgrids/tables/metric_summary.csv @@ -0,0 +1,281 @@ +taxon,run,region,season,part,species,metric,n,median,p10,p90,boot1,mean,sd +bird,bird,north,,,AMRO,insample_auc,5,0.727303456784837,0.725711038181871,0.729613951409614,0.725093042132072,0.727630018238359,0.00194404337247345 +bird,bird,north,,,AMRO,insample_deviance_explained,5,0.14519328133972,0.144668154403979,0.147396983871279,0.144398414502294,0.145796688518119,0.00153117084983031 +bird,bird,north,,,AMRO,insample_rmse,5,0.661354037764462,0.65968432238753,0.662286211491476,0.661681263586436,0.66105335849383,0.00130634684915172 +bird,bird,north,,,AMRO,insample_spearman,5,0.348368446682244,0.345642286335333,0.351427749339817,0.344594857009641,0.348554800791249,0.00288989339610282 +bird,bird,north,,,AMRO,insample_calibration_slope,5,0.815509206232624,0.806415655970331,0.819035107673148,0.815509206232624,0.813374829717896,0.00632802625293927 +bird,bird,north,,,AMRO,insample_prevalence,5,0.251486631016043,0.251004373826971,0.252433263182893,0.250861017819325,0.251649276245993,0.000745639638422784 +bird,bird,north,,,AMRO,insample_n,5,46747,46745.2,46750,46747,46747.6,2.50998007960223 +bird,bird,north,,,AMRO,oob_auc,5,0.734023343536981,0.733817272156733,0.734279956659434,0.734199105714746,0.734045152660858,0.000229847931860535 +bird,bird,north,,,AMRO,oob_deviance_explained,5,0.153724433176458,0.152069194049738,0.153798394539067,0.153798057275933,0.153142433592363,0.000973451190872636 +bird,bird,north,,,AMRO,oob_rmse,5,0.658706291419864,0.658263249373708,0.659821973453664,0.658706291419864,0.658949208075237,0.000853758653717189 +bird,bird,north,,,AMRO,oob_spearman,5,0.353344172753754,0.353135398164249,0.353590234827781,0.353591885806112,0.353366644108331,0.000228364243061001 +bird,bird,north,,,AMRO,oob_calibration_slope,5,0.823855891796677,0.808483620525582,0.826773167710649,0.82610692899831,0.819671413052643,0.0112069606528229 +bird,bird,north,,,AMRO,oob_prevalence,5,0.241010939026539,0.240656718532255,0.241191818078906,0.241245385459292,0.240950250724789,0.000279167052473422 +bird,bird,north,,,AMRO,oob_n,5,124877,124874,124878.8,124877,124876.4,2.50998007960223 +bird,bird,north,,,YEWA,insample_auc,5,0.779655634201043,0.778396232776986,0.779664529278336,0.779655634201043,0.779158503768779,0.000689345639250155 +bird,bird,north,,,YEWA,insample_deviance_explained,5,0.250380022780984,0.248514326933616,0.253214564643268,0.249855757239124,0.250847686168765,0.0023786804698449 +bird,bird,north,,,YEWA,insample_rmse,5,0.557238273909436,0.551558931771127,0.559373118006877,0.557238273909436,0.556039843202715,0.00438515558268098 +bird,bird,north,,,YEWA,insample_spearman,5,0.316033669489273,0.314478245662591,0.316656919612435,0.316033669489273,0.315686345864597,0.00114608991736538 +bird,bird,north,,,YEWA,insample_calibration_slope,5,0.672203823921537,0.657965260572002,0.678074364196331,0.671594605439437,0.669548423592448,0.0120482095631841 +bird,bird,north,,,YEWA,insample_prevalence,5,0.118296361263824,0.117706951871658,0.119214980837802,0.118296361263824,0.118418937588893,0.00074585019883292 +bird,bird,north,,,YEWA,insample_n,5,46747,46745.2,46750,46747,46747.6,2.50998007960223 +bird,bird,north,,,YEWA,oob_auc,5,0.729138016088756,0.727968360006595,0.730087521535925,0.72989285100549,0.729068486279537,0.00104890018238483 +bird,bird,north,,,YEWA,oob_deviance_explained,5,0.169207575895256,0.167584664917222,0.170806750066792,0.169964339278164,0.169146219790066,0.00161452447621064 +bird,bird,north,,,YEWA,oob_rmse,5,0.600550005409724,0.597811431708625,0.609178290908106,0.599341474068351,0.602705702790408,0.00601772200467047 +bird,bird,north,,,YEWA,oob_spearman,5,0.27472368459978,0.273109972454328,0.275489130796922,0.275344718858053,0.274375927216791,0.00119511184350679 +bird,bird,north,,,YEWA,oob_calibration_slope,5,0.586073485526936,0.552280783456896,0.611309961382017,0.602383790654002,0.583277960002652,0.0298155988242715 +bird,bird,north,,,YEWA,oob_prevalence,5,0.13458843502006,0.134244406707603,0.134809487963868,0.13458843502006,0.134542639141448,0.000279456693593184 +bird,bird,north,,,YEWA,oob_n,5,124877,124874,124878.8,124877,124876.4,2.50998007960223 +bird,bird,south,,,AMRO,insample_auc,5,0.705575013613627,0.704878350329605,0.710655998018277,0.704976763112746,0.707213557939715,0.00307322647675945 +bird,bird,south,,,AMRO,insample_deviance_explained,5,0.108018376409751,0.106308908870441,0.110833171681397,0.105268282244838,0.108400467273317,0.00259009012122253 +bird,bird,south,,,AMRO,insample_rmse,5,0.737871848095843,0.735232492006093,0.741723824033828,0.742374907127595,0.738450643072423,0.00334705812434499 +bird,bird,south,,,AMRO,insample_spearman,5,0.314020783349143,0.311284333117702,0.320905207221841,0.310700164999667,0.315586379723976,0.00484940045804023 +bird,bird,south,,,AMRO,insample_calibration_slope,5,0.887686200684523,0.884964799297751,0.897197822968249,0.884727765191459,0.890009442156545,0.00680212573461749 +bird,bird,south,,,AMRO,insample_prevalence,5,0.258598079444985,0.257039179794386,0.259660332963851,0.25655668358714,0.258393144664086,0.00135079625989253 +bird,bird,south,,,AMRO,insample_n,5,23639,23636.8,23639.6,23640,23638.4,1.51657508881031 +bird,bird,south,,,AMRO,oob_auc,5,0.707409744327906,0.705964827996741,0.70752324068811,0.707445220375046,0.706932664928734,0.000920100309312525 +bird,bird,south,,,AMRO,oob_deviance_explained,5,0.114411048006673,0.108972083391834,0.114596483929917,0.11445736631275,0.112506356756515,0.00330499518342422 +bird,bird,south,,,AMRO,oob_rmse,5,0.732117993456783,0.730870577009875,0.733679457796853,0.730608101449593,0.732195156099169,0.00145794407999724 +bird,bird,south,,,AMRO,oob_spearman,5,0.317998227692073,0.315895688582247,0.318168123637075,0.318148117020463,0.317324033331328,0.00139470561444103 +bird,bird,south,,,AMRO,oob_calibration_slope,5,0.891948751621871,0.88417698425351,0.9243603899157,0.92680845181501,0.901598612020095,0.0205781437164769 +bird,bird,south,,,AMRO,oob_prevalence,5,0.259989876131491,0.259616009340861,0.260538534890505,0.260708383581223,0.260061995930024,0.000475417680104008 +bird,bird,south,,,AMRO,oob_n,5,67168,67167.4,67170.2,67167,67168.6,1.51657508881031 +bird,bird,south,,,YEWA,insample_auc,5,0.731273312869415,0.728979187764324,0.733778454513336,0.732857457343122,0.731400772585055,0.0024409495926968 +bird,bird,south,,,YEWA,insample_deviance_explained,5,0.222275180051316,0.215162325650453,0.228589061242964,0.221075298479638,0.222282103086541,0.00708156788774878 +bird,bird,south,,,YEWA,insample_rmse,5,0.655192203198479,0.648944241354543,0.65835094366001,0.659248385050619,0.654236654570076,0.00535259625305425 +bird,bird,south,,,YEWA,insample_spearman,5,0.310524235319594,0.306732626579317,0.313999231774709,0.31237582191587,0.310442303010522,0.00369862060585044 +bird,bird,south,,,YEWA,insample_calibration_slope,5,0.750968052780445,0.744668030119233,0.762228995766277,0.741762815386072,0.753048899664469,0.00881564860206595 +bird,bird,south,,,YEWA,insample_prevalence,5,0.171376597004823,0.170895553957443,0.17183640258529,0.171742808798646,0.171382167859753,0.000475861876686407 +bird,bird,south,,,YEWA,insample_n,5,23639,23636.8,23639.6,23640,23638.4,1.51657508881031 +bird,bird,south,,,YEWA,oob_auc,5,0.723069086473011,0.721099688539643,0.723649863813712,0.723240712067429,0.722599124483331,0.00152663967854732 +bird,bird,south,,,YEWA,oob_deviance_explained,5,0.195546538227486,0.189290746501375,0.199214435413595,0.198719114435923,0.194480092916936,0.00496301250858806 +bird,bird,south,,,YEWA,oob_rmse,5,0.659379612927127,0.658580248033203,0.660226057455577,0.659379612927127,0.659381455069292,0.000883092520734529 +bird,bird,south,,,YEWA,oob_spearman,5,0.302614567847971,0.299809993407358,0.303213205497054,0.302614567847971,0.301825236336348,0.00195694103505098 +bird,bird,south,,,YEWA,oob_calibration_slope,5,0.772399987889613,0.762518560243982,0.811242635717965,0.771312410978423,0.783032507339127,0.0267993169878693 +bird,bird,south,,,YEWA,oob_prevalence,5,0.175869820899522,0.175707986864887,0.176039185326346,0.175741063319785,0.175867891893267,0.000167508533766851 +bird,bird,south,,,YEWA,oob_n,5,67168,67167.4,67170.2,67167,67168.6,1.51657508881031 +bryophyte,bryophyte,north,,,Bryum.All,insample_auc,5,0.645438678319358,0.640143013693698,0.648974650481031,0.646288106268029,0.644846880590306,0.00488802735998912 +bryophyte,bryophyte,north,,,Bryum.All,insample_deviance_explained,5,-0.268716508542459,-0.29525925153349,-0.240839067741261,-0.238530728778354,-0.267362689418132,0.0273270798206204 +bryophyte,bryophyte,north,,,Bryum.All,insample_rmse,5,0.477508024217118,0.477302092283144,0.478058916137398,0.477318125770032,0.477640486663788,0.000380797902274672 +bryophyte,bryophyte,north,,,Bryum.All,insample_spearman,5,0.246623426325212,0.237316943922339,0.252978025431068,0.248223059030884,0.245638041034033,0.00864982717367011 +bryophyte,bryophyte,north,,,Bryum.All,insample_calibration_slope,5,0.790944719763504,0.767041947392787,0.822153724629447,0.819300114289679,0.794258597462813,0.0271987552660851 +bryophyte,bryophyte,north,,,Bryum.All,insample_prevalence,5,0.398064516129032,0.394842178778593,0.401444131744783,0.399586776859504,0.398187077076464,0.00351289819778104 +bryophyte,bryophyte,north,,,Bryum.All,insample_n,5,3089,3064.6,4144,4840,3432.4,787.035132633862 +bryophyte,bryophyte,north,,,Bryum.All,oob_auc,4,0.636724713746148,0.631907442524219,0.648178011550941,,0.639094723240028,0.00914178303436269 +bryophyte,bryophyte,north,,,Bryum.All,oob_deviance_explained,4,-0.18718781209728,-0.226145587790541,-0.143242634351008,,-0.185406597078347,0.0462486042853763 +bryophyte,bryophyte,north,,,Bryum.All,oob_rmse,4,0.48001304026787,0.478369042353368,0.480787747743882,,0.479702579396981,0.00144911502030775 +bryophyte,bryophyte,north,,,Bryum.All,oob_spearman,4,0.232291133424443,0.223539070480554,0.252350619810064,,0.236329498939347,0.0161333315493219 +bryophyte,bryophyte,north,,,Bryum.All,oob_calibration_slope,4,0.762915294786881,0.704496017683124,0.844033190168284,,0.771021944171754,0.0775320732914624 +bryophyte,bryophyte,north,,,Bryum.All,oob_prevalence,4,0.402680037532254,0.396685168352447,0.408753889905477,,0.402708245815617,0.00691232105373736 +bryophyte,bryophyte,north,,,Bryum.All,oob_n,5,1751,696,1775.4,0,1407.6,787.035132633862 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_auc,5,0.703665242626544,0.699417664956064,0.715701201445071,0.70133700524123,0.706831765387237,0.00818899470920308 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_deviance_explained,5,-0.109817229270958,-0.126658087878109,-0.0858853484418814,-0.122879347229834,-0.107036376437477,0.0200585065427151 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_rmse,5,0.465231802567325,0.461064322301624,0.466055809513769,0.465943776290589,0.463907838623387,0.00257667724658725 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_spearman,5,0.350858773598705,0.342841129941644,0.370723935658011,0.346325629014874,0.355659270007706,0.0139378464407726 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_calibration_slope,5,0.893720303659002,0.889259975708755,0.904410242357111,0.903354628974708,0.896155070619309,0.00761986167242145 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_prevalence,5,0.441322314049587,0.434239459960079,0.445725573122853,0.441322314049587,0.440243382720893,0.00595720988661147 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_n,5,3057,3023,4141.2,4840,3408,801.034955541891 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_auc,4,0.676871041258478,0.669683864782122,0.695297817033519,,0.680885183865151,0.0146667878363095 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_deviance_explained,4,-0.180571560700292,-0.192631476235452,-0.13911966790968,,-0.170074425966202,0.031407480332948 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_rmse,4,0.473930826803897,0.467822620482704,0.479418141958958,,0.47370907995885,0.00622242177049125 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_spearman,4,0.30429353980202,0.292108575222129,0.336008386942175,,0.311268497859257,0.0253124609282549 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_calibration_slope,4,0.779224987425304,0.742387693307393,0.860199366409052,,0.794988232020246,0.0660024140343829 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_prevalence,4,0.443724744159599,0.433062649413729,0.454817600944621,,0.443878587745011,0.011771212136753 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_n,5,1783,698.8,1817,0,1432,801.034955541891 +bryophyte,bryophyte,south,,,Bryum.All,insample_auc,5,0.633062660266947,0.624852536030857,0.637944803008397,0.635297889161707,0.631916018932487,0.00689440976052932 +bryophyte,bryophyte,south,,,Bryum.All,insample_deviance_explained,5,-0.0858218633162591,-0.111998906299959,-0.0712451207745009,-0.0624738751774538,-0.090483994765603,0.0213468095916658 +bryophyte,bryophyte,south,,,Bryum.All,insample_rmse,5,0.472776421038776,0.472216517752835,0.474378078636802,0.472373364601682,0.47318714273551,0.00108577964303642 +bryophyte,bryophyte,south,,,Bryum.All,insample_spearman,5,0.222693069262357,0.208373548006976,0.23075269704811,0.226355286746908,0.220543810327988,0.0118833816026941 +bryophyte,bryophyte,south,,,Bryum.All,insample_calibration_slope,5,0.870684175888943,0.807376857509114,0.894623019255288,0.906917413794925,0.856457310150308,0.0476012112351322 +bryophyte,bryophyte,south,,,Bryum.All,insample_prevalence,5,0.370562770562771,0.365528360602252,0.371569237798783,0.370562770562771,0.369235286484943,0.00385091464779508 +bryophyte,bryophyte,south,,,Bryum.All,insample_n,5,1444,1429.8,1968,2310,1614.6,388.936113005722 +bryophyte,bryophyte,south,,,Bryum.All,oob_auc,4,0.621173595565957,0.607145109009208,0.639722642653354,,0.62278808146976,0.0175700311126117 +bryophyte,bryophyte,south,,,Bryum.All,oob_deviance_explained,4,-0.0313682868448359,-0.0462566766703623,0.0140859438332701,,-0.0204519151117717,0.0348305979615314 +bryophyte,bryophyte,south,,,Bryum.All,oob_rmse,4,0.476185031434622,0.473162308921676,0.477433831677277,,0.475551487766661,0.00253520611918453 +bryophyte,bryophyte,south,,,Bryum.All,oob_spearman,4,0.202540064848457,0.179266074147793,0.234873537862193,,0.205775594245983,0.0300466681758383 +bryophyte,bryophyte,south,,,Bryum.All,oob_calibration_slope,4,0.799096498905282,0.708396090257747,0.892909581894416,,0.800208168312996,0.100120405827101 +bryophyte,bryophyte,south,,,Bryum.All,oob_prevalence,4,0.3703593055487,0.368749240306309,0.380219211352906,,0.37330567717792,0.0072755089177001 +bryophyte,bryophyte,south,,,Bryum.All,oob_n,5,866,342,880.2,0,695.4,388.936113005722 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_auc,5,0.717378917378917,0.71461619233714,0.722175713645606,0.713148524296276,0.718267029332557,0.00382481350373052 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_deviance_explained,5,0.0577459950691459,0.0542994597632856,0.0695275141467229,0.0554096499355417,0.0603692931433182,0.0096677330437089 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_rmse,5,0.403965442055384,0.397668598081279,0.406131051827123,0.403965442055384,0.402354383454589,0.00432958519192562 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_spearman,5,0.325166516189611,0.315293386747645,0.328738238419939,0.315268092689319,0.322589671329052,0.00681995223260615 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_calibration_slope,5,0.92280053956249,0.886837665277935,0.947888657401389,0.927407939357416,0.918575489228226,0.0324245065296268 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_prevalence,5,0.23982683982684,0.231460603487586,0.246697056850865,0.23982683982684,0.239405392468179,0.00765174673579537 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_n,5,1462,1452.8,1977.6,2310,1631.4,379.498089586759 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_auc,4,0.70703443636266,0.701421466371831,0.711824331273482,,0.706740480976943,0.00569891524322932 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_deviance_explained,4,0.0415689504563626,0.0121874766554518,0.0506555169584511,,0.0343207692782117,0.0225256638228509 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_rmse,4,0.408894084584309,0.399396869015362,0.417128693284692,,0.408443153559822,0.00959431503169061 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_spearman,4,0.304502858887888,0.296206515552306,0.317248514858176,,0.306091899114569,0.012022350172382 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_calibration_slope,4,0.839246659850089,0.809858413754445,0.864400937806387,,0.837734528371751,0.0296993676771054 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_prevalence,4,0.238999572635154,0.227667581639544,0.255610993801512,,0.240885083410421,0.0151422609821477 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_n,5,848,332.4,857.2,0,678.6,379.498089586759 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_auc,5,0.783237260697859,0.781487479767949,0.786671599836317,0.780923603112445,0.783861265400286,0.00263775798107652 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_deviance_explained,5,0.137342514714242,0.121421932718737,0.145883580721616,0.133888416735623,0.13489867770702,0.0134301264311669 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_rmse,5,0.426114904794538,0.424264497417503,0.4274526775471,0.427385888102775,0.426003331288231,0.00170417089837305 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_spearman,5,0.476886408875258,0.474719116290542,0.482676996198193,0.473354009165843,0.478324570169764,0.00411547232485785 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_calibration_slope,5,0.989718900696207,0.981326629686782,0.996985784785985,0.997023400638047,0.989486520430772,0.00779896464749282 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_prevalence,5,0.384204173133299,0.381893542208114,0.387115636781761,0.384204173133299,0.384330705113001,0.00279131193903544 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_n,5,3676,3638,4966.2,5799,4094.4,953.455452551403 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_auc,4,0.771310560959278,0.762056268764211,0.772250576534378,,0.768341176452147,0.00672699366572193 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_deviance_explained,4,0.117490005669621,0.103262921986508,0.150457237410583,,0.124182915690282,0.0282483474578221 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_rmse,4,0.431824728761291,0.43048108970798,0.436237870645491,,0.432920979772323,0.0035114338910967 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_spearman,4,0.456663596155076,0.44222006455884,0.458143565227635,,0.45203375239662,0.0105701071068138 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_calibration_slope,4,0.926285735927852,0.91108824483025,0.96072447542169,,0.933157610355079,0.0287297046261996 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_prevalence,4,0.385124177756667,0.378286730776194,0.388394707507644,,0.383850278746133,0.00567425629039097 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_n,5,2123,832.8,2161,0,1704.6,953.455452551403 +lichen,lichen,north,,,Physcia.adscendens,insample_auc,5,0.837981396856589,0.835408777911362,0.840847400231011,0.837981396856589,0.83816016075209,0.00285756162759401 +lichen,lichen,north,,,Physcia.adscendens,insample_deviance_explained,5,0.150858112854467,0.124726199931071,0.179496166065445,0.150858112854467,0.152522680589894,0.0291129797670772 +lichen,lichen,north,,,Physcia.adscendens,insample_rmse,5,0.394820754960351,0.392667616142332,0.396154685017306,0.394820754960351,0.39460107285766,0.00193621279917695 +lichen,lichen,north,,,Physcia.adscendens,insample_spearman,5,0.570408138071689,0.565308122546403,0.5728420990876,0.569591916604078,0.569551967433476,0.00424724258559519 +lichen,lichen,north,,,Physcia.adscendens,insample_calibration_slope,5,1.000290161986,0.988102059692486,1.01367917252104,0.997203566574363,1.00060473760024,0.0140656728794095 +lichen,lichen,north,,,Physcia.adscendens,insample_prevalence,5,0.383356070941337,0.379090148277938,0.387739970862604,0.38454906018279,0.383424630025594,0.0046908207984694 +lichen,lichen,north,,,Physcia.adscendens,insample_n,5,3691,3665.8,4965.8,5799,4107.6,945.748803858615 +lichen,lichen,north,,,Physcia.adscendens,oob_auc,4,0.833746443074277,0.827096210758832,0.842180494053308,,0.834383521168415,0.00828029344536092 +lichen,lichen,north,,,Physcia.adscendens,oob_deviance_explained,4,0.130689963041805,0.0842824132973602,0.19816633365152,,0.138214541922259,0.0628713317863323 +lichen,lichen,north,,,Physcia.adscendens,oob_rmse,4,0.396720835939793,0.393608392544539,0.403181595620625,,0.397916663184642,0.00539358995378622 +lichen,lichen,north,,,Physcia.adscendens,oob_spearman,4,0.561566406416265,0.5539539957114,0.576267521465914,,0.564098086539402,0.0128324047104354 +lichen,lichen,north,,,Physcia.adscendens,oob_calibration_slope,4,0.99425479667547,0.96583071260042,1.02232559105062,,0.994128621782647,0.0303243288377914 +lichen,lichen,north,,,Physcia.adscendens,oob_prevalence,4,0.387248312411753,0.378645415598897,0.395294233944223,,0.387049392668758,0.0094998395350021 +lichen,lichen,north,,,Physcia.adscendens,oob_n,5,2108,833.2,2133.2,0,1691.4,945.748803858615 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_auc,5,0.813944894205813,0.802139699004952,0.820255759947036,0.815184822721943,0.812174579511239,0.0107073329739588 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_deviance_explained,5,0.132809057341494,0.107757203971166,0.136465203835159,0.10417172717523,0.124571663519358,0.0149473601139226 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_rmse,5,0.272060134079996,0.264559358278556,0.278043736043677,0.274052391295891,0.271343833523729,0.00679852555171967 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_spearman,5,0.311739047711193,0.302221042942702,0.315045793085297,0.316988071708866,0.309350773106221,0.00671091487219379 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_calibration_slope,5,0.967998007245475,0.87648571034736,0.987344230685411,0.967998007245475,0.943987368969544,0.0672740117824239 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_prevalence,5,0.0907849829351536,0.0854880550520455,0.0942546707117982,0.092924126172208,0.0900691492139895,0.00433337917377339 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_n,5,1482,1471.8,2004.4,2346,1653.4,387.296785424305 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_auc,4,0.807809199458369,0.803361127207599,0.810079558826688,,0.807031444857494,0.00372095548943939 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_deviance_explained,4,0.0301669928914464,0.0277952649888228,0.033711645379568,,0.0305858945291243,0.00332279854407552 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_rmse,4,0.284550004449721,0.27321345747823,0.294043863503816,,0.28389190162208,0.0112173275826891 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_spearman,4,0.317188326127429,0.30936492556465,0.325750823196505,,0.317452289165392,0.00927805439442853 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_calibration_slope,4,0.972194322758161,0.904703016411184,1.05371273927906,,0.977204004963134,0.0865994388567178 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_prevalence,4,0.0997452652709462,0.0913286406440493,0.106312613843352,,0.0990848095371992,0.00808662138066247 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_n,5,864,341.6,874.2,0,692.6,387.296785424305 +lichen,lichen,south,,,Physcia.adscendens,insample_auc,5,0.817087809272992,0.813037342545539,0.820474612803467,0.816663086440969,0.816851497717378,0.00424728218981904 +lichen,lichen,south,,,Physcia.adscendens,insample_deviance_explained,5,0.235192341412028,0.229872784769115,0.241988389209502,0.235408303000742,0.235347494067659,0.00673438326370476 +lichen,lichen,south,,,Physcia.adscendens,insample_rmse,5,0.356650473622047,0.353611676138424,0.357529624526682,0.356650473622047,0.35588631711907,0.00216669907652055 +lichen,lichen,south,,,Physcia.adscendens,insample_spearman,5,0.451175206185996,0.443383258393679,0.458909594715483,0.451175206185996,0.450847910018878,0.00808059562085627 +lichen,lichen,south,,,Physcia.adscendens,insample_calibration_slope,5,0.90001396346683,0.891888831788973,0.904185893110986,0.905103249304583,0.898524852414401,0.00613831133508995 +lichen,lichen,south,,,Physcia.adscendens,insample_prevalence,5,0.215686274509804,0.210370852380551,0.218705697782215,0.215686274509804,0.214933253293698,0.00478783760132252 +lichen,lichen,south,,,Physcia.adscendens,insample_n,5,1487,1480.8,2014,2346,1662.2,382.531305908418 +lichen,lichen,south,,,Physcia.adscendens,oob_auc,4,0.814065965832081,0.810710682597986,0.81775498220477,,0.814185156238722,0.00377866148959288 +lichen,lichen,south,,,Physcia.adscendens,oob_deviance_explained,4,0.228279138986321,0.215722116911015,0.242259716890987,,0.228787551782521,0.0145199676101097 +lichen,lichen,south,,,Physcia.adscendens,oob_rmse,4,0.360297226466542,0.356022135348727,0.363910361964184,,0.360060813745052,0.00423737026304547 +lichen,lichen,south,,,Physcia.adscendens,oob_spearman,4,0.449225305619959,0.438263017046972,0.458876473384581,,0.4487570481884,0.0110632749457198 +lichen,lichen,south,,,Physcia.adscendens,oob_calibration_slope,4,0.882778315763782,0.82674378263151,0.967284088785534,,0.892946615724311,0.0768071867219681 +lichen,lichen,south,,,Physcia.adscendens,oob_prevalence,4,0.21549434057534,0.209833885194357,0.226186106799465,,0.217291237305033,0.00944381193189753 +lichen,lichen,south,,,Physcia.adscendens,oob_n,5,859,332,865.2,0,683.8,382.531305908418 +mite,mite,north,,,Ceratozetes.gracilis,insample_auc,5,0.801217225560485,0.796009986987395,0.807796400945135,0.801217225560485,0.801935233828928,0.00592563380468369 +mite,mite,north,,,Ceratozetes.gracilis,insample_deviance_explained,5,0.142120659127812,0.126146699266542,0.156639532765444,0.139301595779978,0.142080014233308,0.0160442605374148 +mite,mite,north,,,Ceratozetes.gracilis,insample_rmse,5,0.362719793346354,0.358308603073014,0.364637670875494,0.360543277242677,0.36186174915299,0.00328171424375611 +mite,mite,north,,,Ceratozetes.gracilis,insample_spearman,5,0.423598113829231,0.418409593647659,0.433581405703742,0.423598113829231,0.425831746839698,0.00781925064319009 +mite,mite,north,,,Ceratozetes.gracilis,insample_calibration_slope,5,1.01201219242674,0.986077497804326,1.01674693503142,1.01351601201869,1.00472045079216,0.0187441183939002 +mite,mite,north,,,Ceratozetes.gracilis,insample_prevalence,5,0.210569550930997,0.20808483720579,0.211023450370342,0.208106685383401,0.209758576910219,0.00153584552056836 +mite,mite,north,,,Ceratozetes.gracilis,insample_n,5,3643,3599.6,4880.2,5699,4039.4,928.059426976527 +mite,mite,north,,,Ceratozetes.gracilis,oob_auc,4,0.785129200940495,0.781637849320184,0.799206624551212,,0.788909940937068,0.0109882833051334 +mite,mite,north,,,Ceratozetes.gracilis,oob_deviance_explained,4,0.0956359354311148,0.090833326798326,0.141790231293364,,0.110404395155922,0.0340949363235628 +mite,mite,north,,,Ceratozetes.gracilis,oob_rmse,4,0.367144037280097,0.361382086147396,0.369120989699405,,0.365792252025314,0.00465197173032941 +mite,mite,north,,,Ceratozetes.gracilis,oob_spearman,4,0.397605832828841,0.395025142122763,0.417104681676371,,0.403648032165074,0.0143910534185692 +mite,mite,north,,,Ceratozetes.gracilis,oob_calibration_slope,4,0.910468238601677,0.883497871550647,0.987822408860668,,0.928462454033092,0.0599330094862127 +mite,mite,north,,,Ceratozetes.gracilis,oob_prevalence,4,0.203422583061695,0.203085318596832,0.206833669467894,,0.204520376612172,0.00245118903973748 +mite,mite,north,,,Ceratozetes.gracilis,oob_n,5,2056,818.8,2099.4,0,1659.6,928.059426976527 +mite,mite,north,,,Trhypochthonius.tectorum,insample_auc,5,0.66997177969959,0.667007728367672,0.680894220635728,0.669229920289932,0.672979870369456,0.00728591529226797 +mite,mite,north,,,Trhypochthonius.tectorum,insample_deviance_explained,5,-0.0302662507908158,-0.0499128471498866,-0.00840434838738655,-0.0383705826593046,-0.0297973209993642,0.0221712433015747 +mite,mite,north,,,Trhypochthonius.tectorum,insample_rmse,5,0.288027083127174,0.285957704654159,0.291335506217548,0.288027083127174,0.288376263195021,0.0030554844291286 +mite,mite,north,,,Trhypochthonius.tectorum,insample_spearman,5,0.172403791407594,0.170121549997943,0.186377850676853,0.172403791407594,0.176637165437612,0.00920813423498148 +mite,mite,north,,,Trhypochthonius.tectorum,insample_calibration_slope,5,0.946932629769632,0.935568906799778,0.957718024619598,0.943019827969962,0.946707182897605,0.0116164653959112 +mite,mite,north,,,Trhypochthonius.tectorum,insample_prevalence,5,0.0956308124232321,0.0939982527316028,0.0988743433784902,0.0956308124232321,0.0960929449878075,0.00279551913105558 +mite,mite,north,,,Trhypochthonius.tectorum,insample_n,5,3617,3592.8,4872.6,5699,4027.4,934.608099686708 +mite,mite,north,,,Trhypochthonius.tectorum,oob_auc,4,0.646579206298189,0.633926915266307,0.661924506150991,,0.647540995162803,0.0155642227569514 +mite,mite,north,,,Trhypochthonius.tectorum,oob_deviance_explained,4,-0.0660110196279675,-0.10258156519042,-0.0362613374429411,,-0.0684470422627627,0.038573024004172 +mite,mite,north,,,Trhypochthonius.tectorum,oob_rmse,4,0.289576963677251,0.282248420255841,0.293606811899539,,0.288398858248993,0.00639838264774201 +mite,mite,north,,,Trhypochthonius.tectorum,oob_spearman,4,0.149420864473512,0.133427886347194,0.166153210288316,,0.149684924362257,0.0177429471480539 +mite,mite,north,,,Trhypochthonius.tectorum,oob_calibration_slope,4,0.808840685909608,0.662489937268437,0.977660836333191,,0.816865472260469,0.172279433354971 +mite,mite,north,,,Trhypochthonius.tectorum,oob_prevalence,4,0.0965793285343548,0.0892258286847175,0.098536408422576,,0.0946520356909919,0.00552669238515783 +mite,mite,north,,,Trhypochthonius.tectorum,oob_n,5,2082,826.4,2106.2,0,1671.6,934.608099686708 +mite,mite,south,,,Ceratozetes.gracilis,insample_auc,5,0.887845584835876,0.879908150593573,0.890901982971773,0.884763478202232,0.88613949639659,0.00587526273174796 +mite,mite,south,,,Ceratozetes.gracilis,insample_deviance_explained,5,0.205002890118294,0.145097111873623,0.224802087320282,0.199874340284867,0.191703967200446,0.0482488383963572 +mite,mite,south,,,Ceratozetes.gracilis,insample_rmse,5,0.21181979715958,0.202230453597483,0.220327887960157,0.209399341912154,0.211801337141433,0.00939387951104137 +mite,mite,south,,,Ceratozetes.gracilis,insample_spearman,5,0.307185236514686,0.295732307814018,0.327014528084331,0.307185236514686,0.310414239991134,0.0158334563837542 +mite,mite,south,,,Ceratozetes.gracilis,insample_calibration_slope,5,0.684125285326982,0.618880455073528,0.763065067681521,0.690489399477283,0.686164883796781,0.0782117931240002 +mite,mite,south,,,Ceratozetes.gracilis,insample_prevalence,5,0.056970509383378,0.0521775638545351,0.0622115928022082,0.0562843842573,0.0572190090351997,0.00535467847864499 +mite,mite,south,,,Ceratozetes.gracilis,insample_n,5,1494,1479.4,2024.6,2363,1667.4,389.193139713433 +mite,mite,south,,,Ceratozetes.gracilis,oob_auc,4,0.872768272021483,0.864778620916601,0.886024363582252,,0.874649143612871,0.0117157621181945 +mite,mite,south,,,Ceratozetes.gracilis,oob_deviance_explained,4,0.176452540772138,0.115875607967149,0.20549875324236,,0.165191569224007,0.0497840108483084 +mite,mite,south,,,Ceratozetes.gracilis,oob_rmse,4,0.216227617782984,0.205367186353172,0.222584703085702,,0.21461927988045,0.00947487076592404 +mite,mite,south,,,Ceratozetes.gracilis,oob_spearman,4,0.293219352185584,0.264147692272067,0.323152357497,,0.293526975541977,0.0316318609700901 +mite,mite,south,,,Ceratozetes.gracilis,oob_calibration_slope,4,0.591368783360259,0.540938320497454,0.706039267822132,,0.614311648217069,0.099555842641514 +mite,mite,south,,,Ceratozetes.gracilis,oob_prevalence,4,0.0533392883804503,0.0452752248602848,0.0645232647455575,,0.0544535429679295,0.0107814199736608 +mite,mite,south,,,Ceratozetes.gracilis,oob_n,5,869,338.4,883.6,0,695.6,389.193139713433 +mite,mite,south,,,Trhypochthonius.tectorum,insample_auc,5,0.736544301833256,0.716649452845184,0.740321607515676,0.728172120121303,0.730767023052466,0.0131495827970378 +mite,mite,south,,,Trhypochthonius.tectorum,insample_deviance_explained,5,0.0312613160971673,0.0210930152816536,0.0368485695417519,0.03966339018057,0.0291478433785425,0.00801357431192425 +mite,mite,south,,,Trhypochthonius.tectorum,insample_rmse,5,0.266083559383337,0.263266906276206,0.268584469455657,0.267225136735442,0.265932548289368,0.00265613228584214 +mite,mite,south,,,Trhypochthonius.tectorum,insample_spearman,5,0.226992372261537,0.205177680757182,0.231907375222418,0.218500908635375,0.221090772923679,0.0148945551358966 +mite,mite,south,,,Trhypochthonius.tectorum,insample_calibration_slope,5,1.00266595913445,0.939298726279135,1.05528781962027,1.01766256952521,0.997841009791226,0.0595774812188343 +mite,mite,south,,,Trhypochthonius.tectorum,insample_prevalence,5,0.0833685992382565,0.0807473443243282,0.0863035095821866,0.0833685992382565,0.083401335320589,0.00299510185415199 +mite,mite,south,,,Trhypochthonius.tectorum,insample_n,5,1489,1484.4,2017.4,2363,1664.2,390.68875079787 +mite,mite,south,,,Trhypochthonius.tectorum,oob_auc,4,0.701618707278328,0.688898154720992,0.723347226195078,,0.704835838120976,0.01968948818001 +mite,mite,south,,,Trhypochthonius.tectorum,oob_deviance_explained,4,0.0445765743923185,0.0256582727115539,0.05554754449327,,0.0417382416852424,0.0164474015566564 +mite,mite,south,,,Trhypochthonius.tectorum,oob_rmse,4,0.272766672636643,0.263594614475781,0.276687956242601,,0.270891396009892,0.00735009518242229 +mite,mite,south,,,Trhypochthonius.tectorum,oob_spearman,4,0.189939168874569,0.177925193921519,0.219486233616825,,0.196200986656428,0.0235533891548608 +mite,mite,south,,,Trhypochthonius.tectorum,oob_calibration_slope,4,0.674268641549443,0.613496188127419,1.05483503440303,,0.788480762775003,0.276486512827844 +mite,mite,south,,,Trhypochthonius.tectorum,oob_prevalence,4,0.0842873358196854,0.0775201528145626,0.0881856815952926,,0.0832627510948584,0.00595703320150957 +mite,mite,south,,,Trhypochthonius.tectorum,oob_n,5,874,345.6,878.6,0,698.8,390.68875079787 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_auc,5,0.82831417568632,0.827829342621671,0.831061038850059,0.827557030871778,0.829064221811278,0.00215769050020316 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_deviance_explained,5,0.165979078979945,0.155461728861985,0.178821619274117,0.169551786433802,0.16667542865541,0.0122576132972967 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_rmse,5,0.405873635942447,0.403822607612654,0.406433479523304,0.40652594079989,0.405399660183333,0.0016455855240679 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_spearman,5,0.561437420216406,0.559785436863976,0.564783577961203,0.559640328619534,0.561912104014628,0.00294321362126292 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_calibration_slope,5,0.988453705168321,0.978178810819463,1.00034731073572,0.988453705168321,0.988989271295434,0.0109310895098145 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_prevalence,5,0.417808219178082,0.410889577594123,0.42067860776958,0.417808219178082,0.416364204160936,0.00499744401668531 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_n,5,4356,4313.4,5864.4,6862,4843,1128.919837721 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_auc,4,0.822198810750936,0.81560581265128,0.824794808143176,,0.820771310498288,0.00555068822310945 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_deviance_explained,4,0.176471876674577,0.144853523479,0.187951524486478,,0.169279481894693,0.0259144695058964 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_rmse,4,0.409435609031745,0.408293617479497,0.414150700111685,,0.410711716005921,0.00371192530179639 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_spearman,4,0.54954561529011,0.540668954507633,0.55551892165865,,0.548508702999418,0.00866587695211289 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_calibration_slope,4,0.969747328840738,0.95185222454497,0.972523534978746,,0.964347722355823,0.0130007904312307 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_prevalence,4,0.419109687083941,0.412784949448594,0.430405107992588,,0.42088493111012,0.00973543990382733 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_n,5,2506,997.6,2548.6,0,2019,1128.919837721 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_auc,5,0.833417967504123,0.828616127681329,0.834581904450967,0.831410068581594,0.832137239234312,0.00327348223832293 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_deviance_explained,5,0.149398462552943,0.122091670146786,0.167226288447802,0.154102067369655,0.14556619228262,0.0231557534900957 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_rmse,5,0.399805863236473,0.397504109733844,0.401936461822335,0.400200692605579,0.399638526065876,0.00229815259865776 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_spearman,5,0.560411243149642,0.552484615515389,0.561657558553018,0.556689131096968,0.557971496083213,0.0050614513090993 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_calibration_slope,5,1.00527123585172,0.998253837968957,1.00814249377064,1.00781504982717,1.00383560269565,0.00515954079683497 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_prevalence,5,0.378023899737686,0.375262469872135,0.381023040112991,0.378023899737686,0.378278456138998,0.00304497900182098 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_n,5,4321,4308,5864.4,6862,4833.8,1134.06446024906 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_auc,4,0.825102654509618,0.824752717050236,0.831113799725201,,0.827124514422547,0.0043461980338858 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_deviance_explained,4,0.168676190537765,0.126934776957537,0.206715311508099,,0.167353943177089,0.0439500114488177 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_rmse,4,0.403422296815101,0.3996544111573,0.40516595552268,,0.402699358618593,0.00311914632283807 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_spearman,4,0.547177974814146,0.544498037945177,0.55577804768904,,0.549292309101977,0.00670360547060373 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_calibration_slope,4,0.977399952903476,0.973581045957183,1.00762672707733,,0.986831334056175,0.0219868182926184 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_prevalence,4,0.375794942099527,0.372913450186178,0.383372698071932,,0.377472179263476,0.00593181957439513 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_n,5,2541,997.6,2554,0,2028.2,1134.06446024906 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_auc,5,0.886704412746079,0.880512445106482,0.891248430868751,0.880433508354798,0.885813927854308,0.00550612768601824 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_deviance_explained,5,0.354237680381199,0.339989741312822,0.368315560956819,0.33418980862939,0.354533269980195,0.01425999095328 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_rmse,5,0.315549333998249,0.312733031715415,0.320617964247754,0.320396236550522,0.316528782847702,0.00393610790228577 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_spearman,5,0.555303565396909,0.548928414774929,0.564816726447308,0.547740603012528,0.556143122817966,0.00862782581315939 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_calibration_slope,5,0.949139956016074,0.942535498741131,0.977717474233021,0.943663513708022,0.957369958548551,0.0182229328410624 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_prevalence,5,0.222088835534214,0.217190546592102,0.228625506806496,0.222054380664653,0.222881775063893,0.00607679419012681 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_n,5,1692,1666,2267.2,2648,1873.6,433.131388841769 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_auc,4,0.877097862167819,0.862376456261017,0.884817887899072,,0.87459736924798,0.0123812341346909 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_deviance_explained,4,0.312957117701116,0.280568560352726,0.318443805255701,,0.303349307060471,0.0244038726381955 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_rmse,4,0.327279602461398,0.319198756717709,0.330873222003822,,0.325677021675232,0.00655942333596088 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_spearman,4,0.543643931275205,0.52011736981388,0.550124714153978,,0.537556153210008,0.018281121106182 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_calibration_slope,4,0.917557052489063,0.892952703125712,0.938899596567509,,0.916392122030168,0.0250405061655401 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_prevalence,4,0.218666030567013,0.210018355611084,0.23207994955219,,0.220368260577459,0.0121728164316861 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_n,5,956,380.8,982,0,774.4,433.131388841769 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_auc,5,0.805642612002956,0.799527929288648,0.806080866808033,0.806345335875623,0.80341093560295,0.00345559335186376 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_deviance_explained,5,0.160784539742298,0.15366075168876,0.190053887071333,0.173622047662139,0.168638524084192,0.0198244907623526 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_rmse,5,0.384505101990356,0.380582285473126,0.38596821415799,0.38281501071234,0.383666277594932,0.00286579147356738 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_spearman,5,0.462749382191396,0.45683296378463,0.470626204818291,0.467981560586618,0.463510150245734,0.0068185467774117 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_calibration_slope,5,0.920164872108487,0.908190878252055,0.933886039669075,0.920853654327026,0.920339104306229,0.0140227158505247 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_prevalence,5,0.264350453172205,0.25911663216011,0.270295509723619,0.264350453172205,0.264443478235907,0.00620048832939598 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_n,5,1685,1649.4,2266.4,2648,1865.6,437.838212128635 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_auc,4,0.806827376560868,0.800860167357028,0.811284849004147,,0.806288184860668,0.00587182189313485 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_deviance_explained,4,0.196588203146307,0.131181364531475,0.202390555132719,,0.1753008864933,0.0468108554441553 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_rmse,4,0.382460401939565,0.379775408089825,0.387088293380048,,0.383154293936259,0.00413862592807385 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_spearman,4,0.466177919732857,0.458868288315183,0.477016318356347,,0.467438193734934,0.00988132752159103 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_calibration_slope,4,0.924701754984112,0.907012114553472,0.946067960340358,,0.926014813886114,0.0212604040085512 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_prevalence,4,0.266148052343275,0.252246321440467,0.273763588267456,,0.263902982708051,0.0122396324927964 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_n,5,963,381.6,998.6,0,782.4,437.838212128635 diff --git a/README.md b/README.md index 792e5ec..939e6a8 100644 --- a/README.md +++ b/README.md @@ -230,13 +230,19 @@ name. Adding a method is adding a file; no harness code changes. | Kind | Folder | Registered | | --- | --- | --- | -| Engines: how a model is fitted | `methods/engines/` | `glm`, `bayesglm` | +| Engines: how a model is fitted | `methods/engines/` | `glm`, `bayesglm`, `gbm` (boosted regression trees) | | Selection rules: how candidates become one result | `methods/selection/` | `single`, `aic_best`, `aic_average`, `staged_bic`, `ivw_grid`, `aic_best_grid`, `aic_best_onehot` | | Resampling: which units each draw fits | `methods/resampling/` | `precomputed`, `spatial_block`, `spatial_cv` | | Metrics: how a prediction is scored | `methods/metrics/` | `auc`, `deviance_explained`, `rmse`, `spearman`, `calibration_slope`, `prevalence`, `n` | A selection rule states the engine capabilities it needs (coefficients, an information criterion, standard errors), and `validate_spec()` checks them. +`replace_stage_method()` swaps one stage of a v2 spec to another engine and +rule, leaving the rest v2's; `exp_001_gbm` uses it to fit the habitat +stage with boosted regression trees. `extend_models()` adds terms to every +candidate in a model set, and `covariate_files` supplies terms the dataset +does not hold; `exp_002_soilgrids` uses both to add SoilGrids soil +properties to the climate stage. `check_engine()` tests a new engine against the contract on synthetic data. The contracts are in [`1_code/methods/README.md`](1_code/methods/README.md). @@ -272,13 +278,14 @@ flowchart TD ST["result stores
2_pipeline/id/run/region/"] CR["collect_results()
per-species summaries"] T["3_output/id/tables/"] - X["the experiment's own steps
exp_000: compare to v2 · plot · report
later: compare_to_baseline"] + B["compare with exp_000
comparison_*.csv
every experiment but exp_000"] + X["the experiment's own steps
exp_000: compare to v2 · plot · report"] RR["run_record.md"] V --> P --> J J --> W1 & W2 & WN W1 & W2 & WN --> S --> ST - ST --> CR --> T --> X --> RR + ST --> CR --> T --> B --> X --> RR end C --> V @@ -307,6 +314,7 @@ flowchart TD %% Outputs style ST fill:#ffffff,stroke:#2D415B,stroke-width:1px,stroke-dasharray: 5 5 style T fill:#E8A396,stroke:#2D415B,stroke-width:4px + style B fill:#E8A396,stroke:#2D415B,stroke-width:2px style X fill:#A3B4C7,stroke:#2D415B,stroke-width:1px style RR fill:#E8A396,stroke:#2D415B,stroke-width:2px ``` @@ -323,9 +331,12 @@ flowchart TD store per run and region in `2_pipeline//`. 5. **Summarize.** `collect_results()` reduces the stores to per-species tables in `3_output//tables/`. -6. **The experiment's own steps**, in order. For exp_000: compare with v2, - plot, write the report. For later experiments: compare with exp_000. -7. **Record.** `run_record.md` says what ran, for the commit. +6. **Compare with exp_000.** Every experiment except exp_000 itself is + compared with the v2 baseline: `tables/comparison_*.csv`, with the + headline printed. Set `baseline = NULL` in `experiment_config()` to skip. +7. **The experiment's own steps**, in order. For exp_000: compare with v2, + plot, write the report. +8. **Record.** `run_record.md` says what ran, for the commit. Nothing outside `2_pipeline//` and `3_output//` is written during a run, and `0_data/` is never written outside `1_code/_setup/`. @@ -555,9 +566,12 @@ sdmMethodsDev/ │ ├── experiments/ │ │ ├── _shared/ # named focal-species sets │ │ ├── _template/ # copy to start an experiment -│ │ └── exp_000_parity_v2/ # run.R, 01_compare_to_v2.R, 02_plot_parity.R, -│ │ # 03_build_report.R, utils/parity_targets.R -│ ├── _setup/ # 01–09: build 0_data/; run by hand +│ │ ├── exp_000_parity_v2/ # run.R, 01_compare_to_v2.R, 02_plot_parity.R, +│ │ │ # 03_build_report.R, utils/parity_targets.R +│ │ ├── exp_001_gbm/ # test: habitat stage fitted with gbm +│ │ └── exp_002_soilgrids/ # test: SoilGrids terms in the climate stage; +│ │ # 01_extract_soilgrids_covariates.R, run.R +│ ├── _setup/ # 01–09: build the v2 data in 0_data/; fixed │ ├── tests/ # run_tests.R; compare_stores.R │ └── _scratch.R # dated workspace for exploration │ @@ -590,8 +604,10 @@ Read-only during experiments, and gitignored except `v2_scripts/`. ### `test_dataset/` -The frozen cross-taxa dataset. It does not change between experiments; an -amendment is a rebuild by `_setup/`, checked by `_setup/02`. +The frozen cross-taxa dataset: the data the v2 models were fitted on. It +does not change between experiments, and neither do the `_setup/` scripts +that build it; a rebuild happens only when the v2 sources change, checked by +`_setup/02`. Anything an experiment adds lives in that experiment's folder. | File | Holds | | --- | --- | @@ -627,6 +643,11 @@ Things to know about the data: v2 excludes them. - **The bird grids** are v2's translation matrix rebuilt in covariate space by `_setup/09`, checked to reproduce it exactly. +- **Covariates v2 did not use are not added here.** An experiment that + tests new covariates extracts them with a script in its own folder, writes + them to `2_pipeline//inputs/` keyed on `survey_unit_id`, and names that + file in `experiment_config(covariate_files = )`; the harness joins it on + load. `exp_002_soilgrids` is the example. ### `v2_results/` @@ -703,8 +724,8 @@ flowchart LR ``` The red files are written for every experiment by the harness; the blue ones -are exp_000's own steps. A later experiment made from the template writes -`comparison_*.csv` against exp_000 instead. +are exp_000's own steps. Every other experiment also writes +`comparison_*.csv` against exp_000. A *draw* is one bootstrap iteration; draw 1 is the full data. Every summary reduces the draws to a median and a 10th–90th percentile band (`p10`, `p90`) @@ -731,7 +752,8 @@ often skewed. `boot1` is the draw-1 value. | `run_record.md`, `report.md` | `figures/` | | `tables/coverage.csv` | `tables/coefficient_summary.csv` | | `tables/metric_summary.csv` | `tables/parity_terms.csv` | -| `tables/grid_summary.csv` | | +| `tables/grid_summary.csv` | `tables/comparison_metrics.csv` | +| `tables/comparison_summary.csv`, `tables/comparison_grid.csv` (experiments after exp_000) | | | `tables/parity_summary.csv`, `tables/v2_self_agreement_summary.csv` | | **Commit only runs that count.** A trial writes the same files as a full run. @@ -750,7 +772,7 @@ tables describe a trial. | Provenance | Git commit, R version, time written. Volatile; ignored when comparing records | | Configuration | Runs, focal species, draws, seed, candidate model sets, engines, selection rules, jobs ok / not ok | | Coverage | Rows written per run and region | -| Metrics | Metrics pooled over species and draws | +| Metrics | Metrics pooled over species and draws: median, 10–90% band, mean and standard deviation | **`tables/coverage.csv`** — what ran, one row per run × region: `taxon`, `run`, `region`, `season` and `part` (mammals), `species`, `draws`, `stages`, @@ -758,7 +780,10 @@ tables describe a trial. the reason is in `run_log.csv`. **`tables/metric_summary.csv`** — how well the models fit. One row per -taxon × region × species × metric, with `n`, `median`, `p10` and `p90`. +taxon × region × species × metric, with `n`, `median`, `p10`, `p90`, +`boot1`, `mean` and `sd` over draws. The median and band are what comparisons +read, because the spread over draws is often skewed; the mean and standard +deviation are there for readers and tools that expect them. | Prefix | Scored on | | --- | --- | @@ -800,10 +825,12 @@ and stage: | Birds, `landcover` | Raw `glm` coefficients (e.g. `vegcCrop`) | | Birds, `habitat` | The same, translated onto v2's standardized habitat types, log scale | -**`tables/comparison_*.csv`** (experiments made from the template) — against -exp_000: `comparison_summary.csv` per taxon, region and metric, with the -median difference and the share of species that did better; -`comparison_metrics.csv` per species; `comparison_grid.csv` with the rank +**`tables/comparison_*.csv`** (every experiment except exp_000) — against +exp_000, written automatically by `run_experiment()`: `comparison_summary.csv` per taxon, region and metric, with the +median difference, the share of species that did better, and each side's +draw count (a mismatch is warned about); +`comparison_metrics.csv` per species, with both sides' median, band, mean and +standard deviation; `comparison_grid.csv` with the rank correlation of habitat effects on the grid. "Better" is higher AUC, deviance explained and Spearman, lower RMSE, and a calibration slope closer to 1. @@ -890,8 +917,9 @@ and [`docs/taxon_quirks.md`](docs/taxon_quirks.md). 4. Change one thing relative to exp_000: `stage_models` for different candidate formulas, or `specs` for a different engine or selection rule. Keep exp_000's species, draws and seed unless they are the question. -5. Run it, first at 5 draws to check it works. The template's - `compare_to_baseline` step writes `tables/comparison_*.csv` against exp_000. +5. Run it, first at 5 draws to check it works. It is compared with exp_000 + automatically, in `tables/comparison_*.csv`. Compare like with like: run + exp_000 at the same number of draws; a mismatch is warned about. [`docs/getting_started.md`](docs/getting_started.md#test-a-change) walks through each lever. diff --git a/docs/framework_design.md b/docs/framework_design.md index dcb50d3..312a9d4 100644 --- a/docs/framework_design.md +++ b/docs/framework_design.md @@ -263,7 +263,9 @@ That means a spec cannot name a term it forgot to load, and it means selecting covariates on their own would do nothing: loading `elevation` while every candidate still fits `MAP + FFP` changes only the I/O. -So **the model set is the lever**, and an experiment sets it directly: +So **the model set is the lever**, and an experiment sets it directly +(the extra terms here must be ones the dataset or a covariate file +holds; see below): ```r stage_models <- list( @@ -311,6 +313,27 @@ catalogue, with a dataset version bump, so the frozen dataset stays the single source of truth and `02_validate_test_dataset.R` keeps covering everything. +### Covariates the dataset does not hold + +`0_data/test_dataset/` and the `_setup/` scripts that build it are +the v2 data and stay fixed. An experiment that tests a new covariate +brings it itself: + +1. A script in the experiment's folder (e.g. + `exp_002_soilgrids/01_extract_soilgrids_covariates.R`) extracts + it and writes a CSV to `2_pipeline//inputs/`: one row per + `survey_unit_id`, one column per covariate, `NA` where a unit has + no value. +2. `run.R` names the file in + `experiment_config(covariate_files = )` and the new columns in + `stage_models`. +3. The harness joins the file on `survey_unit_id` when it loads each + region. `experiment_config()` checks the file first: unique ids, + and no column that `covariates.csv` already has. + +A covariate that later becomes part of the standard data goes through +a new dataset build, not through an experiment. + ## Parity ledger Parity is strict by default. This section records every place it is @@ -450,9 +473,16 @@ It sits on a regularization axis. A Bayesian framework comparison needs experiment template and `compare_experiments()`; contract tests. Checked against the previous code at 5 draws for the 14 parity species: every stage's coefficients identical. -6. New engines (`gbm`, `mgcv` GAMs, `brms`) as method files; the - topography and remote-sensing covariate extension; spatial - prediction onto the 1 km grid; exp_001 onward. +6. **Started (2026-10-03).** The `gbm` engine and + `replace_stage_method()`; `exp_001_gbm`, a test + experiment fitting the habitat stage with boosted regression + trees. `covariate_files` lets an experiment add covariates the + frozen dataset does not hold, from its own files; + `exp_002_soilgrids` adds SoilGrids at 0–5 cm from the + sciSpatialR catalogue to the climate stage. Still to come: + `mgcv` GAMs and `brms` as method files, the topography and + remote-sensing covariates, and + spatial prediction onto the 1 km grid. ### What steps 1-3 settled diff --git a/docs/getting_started.md b/docs/getting_started.md index 1f818f3..0259d12 100644 --- a/docs/getting_started.md +++ b/docs/getting_started.md @@ -136,6 +136,25 @@ Keys are `stage` (every taxon) or `taxon.stage` (one taxon). `meta.json` records the override, so a run that did not fit the v2 sets cannot be mistaken for one that did. +A covariate the dataset does not hold comes from the experiment +itself. Write a script in the experiment's folder that saves a CSV +to `2_pipeline//inputs/`, with one row per `survey_unit_id`, +and name the file in the config: + +```r +config <- experiment_config( + ..., + stage_models = list( + climate = extend_models("climate_plant_v2_full", "sg_clay_0_5cm") + ), + covariate_files = "2_pipeline/exp_NNN/inputs/my_covariates.csv" +) +``` + +Never add columns to `0_data/` or change `_setup/` for an +experiment: those hold the v2 data every experiment is compared +against. `exp_002_soilgrids` is a worked example. + ### 2. A different engine or rule: `specs` Build the standard specs, change a stage, and pass them in. For @@ -174,8 +193,10 @@ that, it is a name in a spec, as in lever 2. ### Reading the comparison -The template's `run.R` ends with `compare_to_baseline`, which -writes three tables: +Every experiment is compared with exp_000 automatically: +`run_experiment()` writes three tables to `tables/`, and prints +the headline (set `baseline = NULL` in `experiment_config()` to +skip it): | File | Holds | | --- | --- | From 98e89243603d9bd1639765a4bcc87512009beda5 Mon Sep 17 00:00:00 2001 From: bgcasey Date: Mon, 5 Oct 2026 11:49:15 -0600 Subject: [PATCH 06/16] Update README and documentation for xgboost integration - Replaced `gbm` with `xgboost` in the engines section of README.md and framework_design.md. - Updated selection rules to include `hurdle` in README.md and framework_design.md. - Modified experiment configuration in framework_design.md to use `xgboost`. - Clarified hurdle structure in taxon_quirks.md to reflect the new generic `hurdle` rule. - Adjusted experiment names and descriptions to align with the new engine and its capabilities. --- 1_code/experiments/_template/run.R | 7 +- 1_code/experiments/exp_001_gbm/README.md | 104 -- 1_code/experiments/exp_001_gbm/run.R | 80 -- 1_code/experiments/exp_001_xgboost/README.md | 131 +++ 1_code/experiments/exp_001_xgboost/run.R | 77 ++ 1_code/harness/run_model.R | 22 +- 1_code/harness/spec.R | 85 +- 1_code/methods/README.md | 27 +- 1_code/methods/engines/_glm_family.R | 13 + 1_code/methods/engines/gbm.R | 284 ------ 1_code/methods/engines/xgboost.R | 371 +++++++ 1_code/methods/selection/aic_best_grid.R | 109 -- 1_code/methods/selection/aic_best_onehot.R | 184 ---- 1_code/methods/selection/hurdle.R | 261 +++++ 1_code/modules/_shared/plant_group.R | 2 + 1_code/modules/birds/spec.R | 2 + 1_code/modules/mammals/hurdle.R | 687 +++++++------ 1_code/modules/mammals/spec.R | 208 ++-- 1_code/tests/testthat/test-methods.R | 4 +- 1_code/tests/testthat/test-specs.R | 63 ++ 3_output/exp_001_gbm/run_record.md | 193 ---- .../exp_001_gbm/tables/comparison_grid.csv | 21 - .../exp_001_gbm/tables/comparison_summary.csv | 51 - 3_output/exp_001_gbm/tables/grid_summary.csv | 685 ------------- .../exp_001_gbm/tables/metric_summary.csv | 281 ------ 3_output/exp_001_xgboost/run_record.md | 253 +++++ .../tables/comparison_grid.csv | 29 + .../tables/comparison_summary.csv | 71 ++ .../tables/coverage.csv | 4 + .../exp_001_xgboost/tables/grid_summary.csv | 945 ++++++++++++++++++ .../exp_001_xgboost/tables/metric_summary.csv | 393 ++++++++ README.md | 15 +- docs/framework_design.md | 20 +- docs/taxon_quirks.md | 2 +- 34 files changed, 3233 insertions(+), 2451 deletions(-) delete mode 100644 1_code/experiments/exp_001_gbm/README.md delete mode 100644 1_code/experiments/exp_001_gbm/run.R create mode 100644 1_code/experiments/exp_001_xgboost/README.md create mode 100644 1_code/experiments/exp_001_xgboost/run.R delete mode 100644 1_code/methods/engines/gbm.R create mode 100644 1_code/methods/engines/xgboost.R delete mode 100644 1_code/methods/selection/aic_best_grid.R delete mode 100644 1_code/methods/selection/aic_best_onehot.R create mode 100644 1_code/methods/selection/hurdle.R delete mode 100644 3_output/exp_001_gbm/run_record.md delete mode 100644 3_output/exp_001_gbm/tables/comparison_grid.csv delete mode 100644 3_output/exp_001_gbm/tables/comparison_summary.csv delete mode 100644 3_output/exp_001_gbm/tables/grid_summary.csv delete mode 100644 3_output/exp_001_gbm/tables/metric_summary.csv create mode 100644 3_output/exp_001_xgboost/run_record.md create mode 100644 3_output/exp_001_xgboost/tables/comparison_grid.csv create mode 100644 3_output/exp_001_xgboost/tables/comparison_summary.csv rename 3_output/{exp_001_gbm => exp_001_xgboost}/tables/coverage.csv (55%) create mode 100644 3_output/exp_001_xgboost/tables/grid_summary.csv create mode 100644 3_output/exp_001_xgboost/tables/metric_summary.csv diff --git a/1_code/experiments/_template/run.R b/1_code/experiments/_template/run.R index 49d341d..ecb698f 100644 --- a/1_code/experiments/_template/run.R +++ b/1_code/experiments/_template/run.R @@ -27,8 +27,11 @@ # 2_pipeline//inputs/. Never add them to 0_data/ or # _setup/, which stay the v2 data. # - `specs`: a spec with a stage changed - a different engine -# or selection rule. Build it from standard_specs() and -# change the field; see docs/getting_started.md. +# or selection rule. For a new habitat method in every +# taxon, mammals included, one call: +# specs <- lapply(standard_specs(), replace_stage_method, +# engine = "xgboost") +# See exp_001_xgboost and docs/getting_started.md. # - A new method in 1_code/methods/, then named in a spec; # see 1_code/methods/README.md. # --- diff --git a/1_code/experiments/exp_001_gbm/README.md b/1_code/experiments/exp_001_gbm/README.md deleted file mode 100644 index d44f5bd..0000000 --- a/1_code/experiments/exp_001_gbm/README.md +++ /dev/null @@ -1,104 +0,0 @@ -# exp_001_gbm - -![Status](https://img.shields.io/badge/Status-Test-lightgrey) -![Languages](https://img.shields.io/badge/Languages-R-blue) - -## Question - -Does a boosted regression tree (GBM) fit the habitat stage better than v2's -linear models, for the plant-group taxa and birds? - -This is a **test experiment**: its first job is to show that a method with -no coefficients runs through the pipeline and is compared with the v2 -baseline. Read its numbers as a result only after a run at 100 draws with -tuned settings. - -## Design - -| | exp_000 (baseline) | exp_001 (this) | -| --- | --- | --- | -| Climate stage | v2: GLM candidates, AICc model averaging | The same | -| Habitat stage (birds: landcover) | v2: GLM candidates; IVW averaging (plants) or staged BIC (birds); plant stand-age splines and footprint pooling | `gbm` with the `single` rule, on every covariate v2's habitat candidates use, `Climate` included | -| Climate → habitat | Carried as `Climate` | The same | -| Species, draws, seed | `parity_check`, 20260909 | The same | - -- **What changes:** the habitat stage's engine, selection rule and - candidate set, set in `run.R` with `replace_stage_method()`. -- **Why one formula:** a tree chooses its own variables, splits and - interactions, so it is given every candidate covariate once (as main - effects) rather than v2's competing formulas. -- **What is dropped with it:** v2's post-processing of habitat coefficients - (stand-age splines, cutblock convergence, pAspen, footprint pooling) and - v2's plant validation AUCs, which all read coefficients a tree does not - have. The metrics score the tree's own prediction. -- **Mammals are not run.** Their habitat stage is v2's hurdle model: two - linked GLMs with custom post-processing, so there is no single engine to - swap. - -## How to run - -From the repository root: - -```r -source("1_code/experiments/exp_001_gbm/run.R") -``` - -`run.R` uses 5 draws to check the pipeline. For a result, set -`n_bootstraps = 100`, and make sure the exp_000 tables it is compared -against are from a 100-draw run of the same species. - -## How to read the result - -`3_output/exp_001_gbm/tables/`: - -| File | Read it for | -| --- | --- | -| `comparison_summary.csv` | Per taxon, region and metric: the median difference from exp_000, and the share of species that did better | -| `comparison_metrics.csv` | Per species, both runs' out-of-bag metrics and 10–90% bands | -| `comparison_grid.csv` | Whether the habitat effects moved: rank correlation and absolute difference on the habitat grid | - -Out-of-bag metrics score each draw on the survey units it left out, which -matters here: a tree fits the units it trained on far more closely than a -GLM does, so in-sample metrics would flatter it. - -## Assumptions and caveats - -- **GBM settings are untuned.** 1000 trees at most, depth 3, learning rate - 0.05, bag fraction 0.5, minimum leaf 10; the number of trees is chosen by - the out-of-bag estimate, which tends to choose too few. A fair comparison - tunes these, ideally per taxon. -- **The grid compares like with like only roughly.** The grid holds each - habitat type as a pure stand at `Climate` 0. A GLM extrapolates to that - linearly; a tree holds the value of its nearest split. Where a type is - rare at the survey units, the two can differ for that reason alone. -- **The plant baseline includes v2's post-processing** (stand-age splines, - footprint pooling); the GBM run does not. A difference in the aged or - footprint habitat types partly reflects that. -- **Bird counts keep the QPAD offset**, which the engine adds on the link - scale in fitting and prediction. - -## Result - -_Not yet run at 100 draws._ - -**Pipeline check, 2026-10-03: 5 draws, `parity_check` species.** All 100 -species × region × draw jobs ran. Against an exp_000 run with the same -species, seed and draws: - -| Taxon | Out-of-bag AUC, north (v2 → GBM) | South (v2 → GBM) | -| --- | --- | --- | -| Birds | 0.729 → 0.760 | 0.702 → 0.719 | -| Bryophytes | 0.650 → 0.654 | 0.669 → 0.718 | -| Lichens | 0.803 → 0.814 | 0.792 → 0.847 | -| Soil mites | 0.716 → 0.730 | 0.774 → 0.805 | -| Vascular plants | 0.828 → 0.850 | 0.846 → 0.877 | - -GBM's out-of-bag AUC and deviance explained were higher in every taxon and -region, and its calibration slopes sat closer to 1 (0.93–1.07, against -0.61–0.99). Its habitat effects on the grid ranked broadly like v2's for -the plant taxa (rank correlation 0.4–0.97 by species), but not for American -robin in the north (0.08). - -**Do not read these as the finding.** Five draws give unstable bands, the -settings are untuned, and two species per taxon is a small sample. They -show the comparison works end to end. diff --git a/1_code/experiments/exp_001_gbm/run.R b/1_code/experiments/exp_001_gbm/run.R deleted file mode 100644 index a69f0aa..0000000 --- a/1_code/experiments/exp_001_gbm/run.R +++ /dev/null @@ -1,80 +0,0 @@ -# --- -# title: Run Experiment 001 - Boosted Regression Trees for Habitat -# author: Brendan Casey -# created: 2026-10-03 -# inputs: -# - 0_data/test_dataset/ -# - 3_output/exp_000_parity_v2/tables/, the v2 baseline -# outputs: -# in 2_pipeline/exp_001_gbm/: -# - // result stores, and run_log.csv -# in 3_output/exp_001_gbm/: -# - tables/ (summaries, and comparison_*.csv against -# exp_000), run_record.md -# notes: -# - A test experiment: does a boosted regression tree fit the -# habitat stage better than v2's linear models? See README.md. -# - One change from exp_000. Each taxon keeps v2's climate stage -# (a GLM, model-averaged) and carries its prediction into the -# habitat stage as `Climate`, as v2 does. Only the habitat -# stage - landcover for birds - is fitted with gbm, on every -# covariate v2's habitat candidates use, through -# replace_stage_method(). -# - Mammals are not run: their habitat stage is v2's hurdle -# model, two linked GLMs with custom post-processing, which -# has no single engine to swap. -# - The GBM settings are untuned starting points (see -# 1_code/methods/engines/gbm.R). Read the result as "does the -# pipeline run GBM and compare it", not as GBM's best. -# --- - -# 1. Setup ---- - -## 1.1 Load the framework ---- -source("1_code/harness/harness.R") -load_framework() - -## 1.2 The change: fit the habitat stage with gbm ---- -# Every other stage and setting stays v2's, so a difference from -# exp_000 is the habitat method's. -gbm_settings <- list( - n.trees = 1000, # the most trees; out-of-bag picks fewer - interaction.depth = 3, # tree complexity - shrinkage = 0.05, # learning rate - bag.fraction = 0.5, # share of rows each tree sees - n.minobsinnode = 10 # smallest leaf -) - -specs <- standard_specs() - -for (key in c("bryophyte", "lichen", "mite", "vascular_plant")) { - specs[[key]] <- replace_stage_method( - specs[[key]], "habitat", engine = "gbm", control = gbm_settings - ) -} - -specs$bird <- replace_stage_method( - specs$bird, "landcover", engine = "gbm", control = gbm_settings -) - -## 1.3 Configure the run ---- -# The same species, seed and draws as the exp_000 run it is -# compared against, so the comparison is like for like. -config <- experiment_config( - id = "exp_001_gbm", - taxa = c("bryophyte", "lichen", "mite", "vascular_plant", "bird"), - species = "parity_check", - # 5 checks the pipeline runs; 100 for a result to read - n_bootstraps = 5, - seed = 20260909, - specs = specs, - workers = 12 -) - -# 2. Run ---- -# Fit, summarize, and compare with exp_000; every experiment is -# compared with it. The comparison is written to -# tables/comparison_*.csv. -results <- run_experiment(config) - -# End of script ---- diff --git a/1_code/experiments/exp_001_xgboost/README.md b/1_code/experiments/exp_001_xgboost/README.md new file mode 100644 index 0000000..e52ae9b --- /dev/null +++ b/1_code/experiments/exp_001_xgboost/README.md @@ -0,0 +1,131 @@ +# exp_001_xgboost + +![Status](https://img.shields.io/badge/Status-Test-lightgrey) +![Languages](https://img.shields.io/badge/Languages-R-blue) + +## Question + +Does a boosted regression tree fit the habitat stage better than v2's linear +models, for every taxon: the plant-group taxa, mammals and birds? + +This is a **test experiment**: its first job is to show that a method with +no coefficients runs through the pipeline for every taxon and is compared +with the v2 baseline. Read its numbers as a result only after a run at 100 +draws with tuned settings. + +## Design + +| | exp_000 (baseline) | exp_001 (this) | +| --- | --- | --- | +| Climate stage | v2: GLM candidates, AICc model averaging (mammals: v2's precomputed prediction) | The same | +| Habitat stage (each spec's `habitat_stage`; birds: landcover) | v2: GLM candidates; IVW averaging (plants), staged BIC (birds), or the hurdle with best-by-AICc halves (mammals); v2's post-processing | `xgboost` with the `single` rule, on every covariate v2's habitat candidates use, `Climate` included | +| Climate → habitat | Carried as `Climate` | The same | +| Species, draws, seed | `parity_check`, 20260909 | The same | + +- **What changes:** the habitat stage's engine, selection rule and + candidate set. `run.R` makes the change with one call for every run: + `lapply(standard_specs(), replace_stage_method, engine = "xgboost")`. +- **Why one formula:** a tree chooses its own variables, splits and + interactions, so it is given every candidate covariate once (as main + effects) rather than v2's competing formulas. +- **Mammals.** The habitat stage is the generic `hurdle` rule. Its + structure stays: presence on every deployment, on v2's lure-scaled + response (`binary:logistic`, which takes a proportion), then abundance + given presence on the deployments with detections (`reg:gamma`, a + log-link Gamma), unweighted and without `Climate`, as in v2. Boosted + trees fit both halves. The hurdle writes `habitat_presence`, + `habitat_abundance` and `habitat_total` (their product) as grid + predictions, the same tables v2 publishes. +- **What is dropped:** + - v2's post-processing of habitat coefficients: the plant stand-age + splines, cutblock convergence, pAspen and footprint pooling, and v2's + plant validation AUCs; + - the mammal one-hot tables, calibration, stand-age splines, Mule Deer + adjustment and cutblock convergence. + + These all read coefficients a tree does not have. The metrics score the + tree's own prediction: presence, for mammals. + +## How to run + +From the repository root: + +```r +source("1_code/experiments/exp_001_xgboost/run.R") +``` + +`run.R` uses 5 draws to check the pipeline. For a result, set +`n_bootstraps = 100`, and make sure the exp_000 tables it is compared +against are from a 100-draw run of the same species. + +## How to read the result + +`3_output/exp_001_xgboost/tables/`: + +| File | Read it for | +| --- | --- | +| `comparison_summary.csv` | Per taxon, region (and mammal season) and metric: the median difference from exp_000, and the share of species that did better | +| `comparison_metrics.csv` | Per species, both runs' out-of-bag metrics and 10–90% bands | +| `comparison_grid.csv` | Whether the habitat effects moved: rank correlation and absolute difference on the habitat grid | + +Out-of-bag metrics score each draw on the survey units it left out, which +matters here: a tree fits the units it trained on far more closely than a +GLM does, so in-sample metrics would flatter it. + +## Assumptions and caveats + +- **The xgboost settings are untuned.** At most 1000 rounds, learning + rate 0.05, depth 3, subsample 0.5, minimum child weight 1. The number of + rounds is chosen by early stopping on a seeded 20% holdout of each draw, + then the model is refitted on all of the draw. A fair comparison tunes + these, ideally per taxon. +- **The grid compares like with like only roughly.** The grid holds each + habitat type as a pure stand at `Climate` 0. A GLM extrapolates to that + linearly; a tree holds the value of its nearest split. Where a type is + rare at the survey units, the two can differ for that reason alone. +- **The baseline includes v2's post-processing** (stand-age splines, + footprint pooling, and for mammals calibration and convergence); this + run does not. A difference in the aged, cutblock or footprint habitat + types partly reflects that. +- **Mammal grid predictions are presence**, as in exp_000. Abundance and + total are compared through the `habitat_abundance` and `habitat_total` + coefficient summaries. Note that exp_000's mammal tables are v2's + calibrated tables, so they are not like for like with this run's + uncalibrated grid predictions. +- **Bird counts keep the QPAD offset**, which the engine passes as the + base margin in fitting and prediction. +- **gbm was replaced.** The first version of this experiment + (`exp_001_gbm`, 2026-10-03; its output is kept in + `3_output/exp_001_gbm/`) used `gbm`, which cannot fit the mammal hurdle: + its bernoulli rejects a 0–1 proportion and it has no Gamma family. + +## Result + +_Not yet run at 100 draws._ + +**Pipeline check, 2026-10-05: 5 draws, `parity_check` species.** All 160 +species × region × draw jobs ran, mammals included. Against the exp_000 +tables (whose draw counts match): + +| Taxon | Out-of-bag AUC, north (v2 → xgboost) | South (v2 → xgboost) | +| --- | --- | --- | +| Birds | 0.729 → 0.769 | 0.702 → 0.745 | +| Bryophytes | 0.650 → 0.681 | 0.669 → 0.754 | +| Lichens | 0.803 → 0.827 | 0.792 → 0.860 | +| Mammals, summer | 0.704 → 0.727 | 0.660 → 0.684 | +| Mammals, winter | 0.741 → 0.768 | 0.710 → 0.725 | +| Soil mites | 0.716 → 0.739 | 0.774 → 0.811 | +| Vascular plants | 0.828 → 0.869 | 0.846 → 0.905 | + +xgboost's out-of-bag AUC was higher in every taxon, region and season. +Except for birds, and soil mites in the south, its calibration slopes were +further from 1 than v2's. +Mammal slopes fell from 0.65–0.85 to 0.53–0.72, so the untuned trees are +overconfident there. The median rank correlation of the habitat grid +effects with v2's was 0.28–0.73 by taxon and region, but about 0 for +soil mites in the north. Mammals were 0.69 in the north and 0.68 in the +south. + +**Do not read these as the finding.** Five draws give unstable bands, the +settings are untuned, and two species per taxon is a small sample. They +show the comparison works end to end, for every taxon. diff --git a/1_code/experiments/exp_001_xgboost/run.R b/1_code/experiments/exp_001_xgboost/run.R new file mode 100644 index 0000000..2980338 --- /dev/null +++ b/1_code/experiments/exp_001_xgboost/run.R @@ -0,0 +1,77 @@ +# --- +# title: Run Experiment 001 - Boosted Regression Trees for Habitat +# author: Brendan Casey +# created: 2026-10-03 +# inputs: +# - 0_data/test_dataset/ +# - 3_output/exp_000_parity_v2/tables/, the v2 baseline +# outputs: +# in 2_pipeline/exp_001_xgboost/: +# - // result stores, and run_log.csv +# in 3_output/exp_001_xgboost/: +# - tables/ (summaries, and comparison_*.csv against +# exp_000), run_record.md +# notes: +# - A test experiment: does a boosted regression tree fit the +# habitat stage better than v2's linear models? See README.md. +# - One change from exp_000, made the same way for every taxon. +# Each keeps v2's climate stage (a GLM) and carries it into the +# habitat stage as `Climate`, as v2 does. Only the habitat +# stage - each spec's `habitat_stage`, landcover for birds - +# is fitted with xgboost, on every covariate v2's habitat +# candidates use, through replace_stage_method(). +# - Mammals run too. Their habitat stage is the generic `hurdle` +# rule, so the boosted trees fit both halves: presence on the +# lure-scaled response, abundance given presence on a log-link +# Gamma. v2's table-building, which reads GLM coefficients, is +# removed with the GLMs. +# - The settings are untuned starting points (see +# 1_code/methods/engines/xgboost.R). Read the result as "does +# the pipeline run boosted trees and compare them", not as +# their best. +# --- + +# 1. Setup ---- + +## 1.1 Load the framework ---- +source("1_code/harness/harness.R") +load_framework() + +## 1.2 The change: fit the habitat stage with xgboost ---- +# Every other stage and setting stays v2's, so a difference from +# exp_000 is the habitat method's. +xgb_settings <- list( + nrounds = 1000, # the most rounds; early stopping picks + eta = 0.05, # learning rate + max_depth = 3, # tree complexity + subsample = 0.5, # share of rows each tree sees + min_child_weight = 1 # smallest leaf, in weighted rows +) + +# One call per run: each spec names its own habitat stage +specs <- lapply( + standard_specs(), replace_stage_method, + engine = "xgboost", control = xgb_settings +) + +## 1.3 Configure the run ---- +# The same species, seed and draws as the exp_000 run it is +# compared against, so the comparison is like for like. +config <- experiment_config( + id = "exp_001_xgboost", + taxa = names(specs), + species = "parity_check", + # 5 checks the pipeline runs; 100 for a result to read + n_bootstraps = 5, + seed = 20260909, + specs = specs, + workers = 12 +) + +# 2. Run ---- +# Fit, summarize, and compare with exp_000; every experiment is +# compared with it. The comparison is written to +# tables/comparison_*.csv. +results <- run_experiment(config) + +# End of script ---- diff --git a/1_code/harness/run_model.R b/1_code/harness/run_model.R index 0365302..a2b2ad8 100644 --- a/1_code/harness/run_model.R +++ b/1_code/harness/run_model.R @@ -923,9 +923,13 @@ fit_one_stage <- function(stage, fitting, spec, grid = NULL, # A stage may reshape its result after selection with steps its # spec supplies, applied in order: the plant stand-age splines, # cutblock convergence and footprint pooling. Each takes and - # returns the selection result, and sees the stage's data. + # returns the selection result, and sees the stage's data. A + # step that declares `grid`, `species` or `stage` is given them, + # as a rule is: the mammal v2 tables read all three. for (step in stage$post_process) { - selected <- step(selected, stage_data) + context <- list(grid = grid, species = species, stage = stage) + context <- context[names(context) %in% names(formals(step))] + selected <- do.call(step, c(list(selected, stage_data), context)) } list(status = "ok", note = NA_character_, selected = selected) @@ -1228,11 +1232,17 @@ run_meta <- function(p, region) { list( taxon = spec$taxon, region = region$name, - # Mammal specs are fitted per season and per hurdle part, and - # the comparison needs both to find the right reference. NA - # for every other taxon. + # Mammal specs are fitted per season, as a hurdle, and the + # comparison needs both to find the right reference. NA for + # every other taxon. season = spec$season %||% NA_character_, - part = spec$part %||% NA_character_, + part = if (any(vapply( + stages, function(s) identical(s$selection, "hurdle"), logical(1) + ))) { + "hurdle" + } else { + NA_character_ + }, species_n = length(region$species), iterations = length(p$iterations), stages = vapply(stages, `[[`, character(1), "name"), diff --git a/1_code/harness/spec.R b/1_code/harness/spec.R index b591932..b7afd06 100644 --- a/1_code/harness/spec.R +++ b/1_code/harness/spec.R @@ -47,10 +47,12 @@ spec_fields <- function() { list( spec = c( "taxon", "response_name", "response_transform", "family", - "weight_column", "tier", "season", "part", "aliases", + "weight_column", "tier", "season", "aliases", "regions", "stages", "resample", "v2_coverage", "validate", "final_prediction", "species_frame", "supplied_columns", "notes", "models_overridden", "covariate_files", + # The stage a methods experiment replaces by default + "habitat_stage", # Recorded facts a module keeps for its own reports "use_protocol", "protocol_is_v2", "climate_source" ), @@ -186,6 +188,32 @@ validate_spec <- function(spec, stop_on_error = TRUE) { } } + # A composite rule (the hurdle) runs an inner rule per part; + # that rule's requirements are checked against the engine too + if (!is.null(engine) && !is.null(rule) && + "part_selection" %in% names(formals(rule))) { + inner <- stage$part_selection %||% formals(rule)$part_selection + entry <- tryCatch( + get_method("selection", inner, entry = TRUE), + error = function(e) { + problem(where, ": `part_selection`: ", conditionMessage(e)) + NULL + } + ) + missing_capabilities <- setdiff( + entry$requires, engine$capabilities + ) + + if (!is.null(entry) && length(missing_capabilities) > 0) { + problem( + where, ": inner rule `", inner, "` needs ", + paste(missing_capabilities, collapse = ", "), + ", which engine `", engine$name, "` does not provide. ", + "Use `single` as the part_selection." + ) + } + } + if (!is.null(stage$ic) && !stage$ic %in% c("AIC", "AICc", "BIC")) { problem(where, ": `ic` must be \"AIC\", \"AICc\" or \"BIC\".") @@ -429,11 +457,22 @@ apply_stage_models <- function(spec, stage_models) { #' models_union()), per region where the region supplies the #' models. #' +#' The stage defaults to the spec's `habitat_stage`, so one call +#' serves every taxon: +#' `lapply(standard_specs(), replace_stage_method, engine = "x")`. +#' +#' A stage whose rule is composite - it declares +#' `part_selection`, as the mammal `hurdle` does - keeps its rule, +#' and the new rule becomes the one each part runs. The hurdle's +#' structure (presence, then abundance given presence) is a +#' property of the data, not of the method, so it stays. +#' #' Removed, because they read v2 coefficient tables a different #' engine may not produce: #' #' - the stage's `post_process` steps (the plant stand-age -#' splines, cutblock convergence, pAspen and footprint pooling); +#' splines, cutblock convergence, pAspen and footprint pooling; +#' the mammal v2 habitat tables); #' - stage fields only the old rule took (`head_terms`, say); #' - when the stage is the last, the spec's `final_prediction` and #' `validate` (v2's plant prediction and validation AUCs), so the @@ -443,7 +482,8 @@ apply_stage_models <- function(spec, stage_models) { #' record the change. #' #' @param spec A taxon spec. -#' @param stage Character. The stage's name. +#' @param stage Character. The stage's name; the spec's +#' `habitat_stage` by default. #' @param engine Character. A registered engine. #' @param selection Character. A registered rule; "single" for an #' engine with no information criterion. @@ -454,12 +494,21 @@ apply_stage_models <- function(spec, stage_models) { #' @return The spec. #' #' @example # Example usage of the function -#' # spec <- replace_stage_method(lichen_spec(), "habitat", "gbm") +#' # spec <- replace_stage_method(lichen_spec(), engine = "xgboost") replace_stage_method <- function( - spec, stage, engine, selection = "single", control = list(), - union = TRUE + spec, stage = spec$habitat_stage, engine, selection = "single", + control = list(), union = TRUE ) { names_in <- vapply(spec$stages, `[[`, character(1), "name") + + if (is.null(stage)) { + stop( + "Spec `", spec$taxon, "` names no `habitat_stage`; pass ", + "`stage`. Stages: ", paste(names_in, collapse = ", "), + call. = FALSE + ) + } + index <- match(stage, names_in) if (is.na(index)) { @@ -470,10 +519,23 @@ replace_stage_method <- function( ) } - rule <- get_method("selection", selection) + get_method("selection", selection) get_engine(engine) old <- spec$stages[[index]] + # A composite rule keeps its place and takes the new rule inside + old_rule <- if (is.function(old$selection)) { + old$selection + } else { + get_method("selection", old$selection) + } + composite <- "part_selection" %in% names(formals(old_rule)) + rule <- if (composite) { + old_rule + } else { + get_method("selection", selection) + } + # Step 1: The candidate formulas, per region where the region # supplies them if (union) { @@ -494,10 +556,16 @@ replace_stage_method <- function( known <- c(spec_fields()$stage, names(formals(rule))) new <- old[intersect(names(old), known)] new$engine <- engine - new$selection <- selection new$control <- control new$ic <- NULL new$post_process <- NULL + + if (composite) { + new$part_selection <- selection + } else { + new$selection <- selection + } + spec$stages[[index]] <- new # Step 3: Hooks that read v2 coefficient tables @@ -509,6 +577,7 @@ replace_stage_method <- function( # Step 4: Say so label <- paste0( engine, " with `", selection, "`", + if (composite) paste0(" inside `", old$selection, "`") else "", if (union) ", on every covariate the v2 candidates use" else "" ) spec$v2_coverage[[stage]] <- v2_status( diff --git a/1_code/methods/README.md b/1_code/methods/README.md index 66ce1aa..d1ecdd5 100644 --- a/1_code/methods/README.md +++ b/1_code/methods/README.md @@ -29,14 +29,13 @@ skeleton for an engine and a selection rule; it is not loaded. | --- | --- | --- | --- | | engine | `glm` | `stats::glm` (v2 mammals, birds) | | | engine | `bayesglm` | `arm::bayesglm`, weakly informative priors (v2 plants) | | -| engine | `gbm` | Boosted regression trees, `gbm::gbm.fit`; no coefficients, information criterion or standard errors, so use the `single` rule | | +| engine | `xgboost` | Boosted regression trees, `xgboost::xgb.train`; binomial (proportions too), Poisson, log-link Gamma, Gaussian; no coefficients, information criterion or standard errors, so use the `single` rule | | | selection | `single` | Fit the first candidate; no ranking | | | selection | `aic_best` | Keep the lowest-scoring candidate | ic | | selection | `aic_average` | Average coefficients by Akaike weight (v2 climate) | ic, coefficients | | selection | `staged_bic` | Forward selection through groups (v2 bird landcover) | ic, coefficients | | selection | `ivw_grid` | Inverse-variance average onto the habitat grid (v2 plant habitat) | coefficients, se | -| selection | `aic_best_grid` | Best candidate, predicted onto the grid (v2 mammal abundance) | ic, se | -| selection | `aic_best_onehot` | Best candidate, one habitat type at a time (v2 mammal presence) | ic, coefficients, se | +| selection | `hurdle` | Presence, then abundance given presence, each through an inner rule (`part_selection`); reports both and their product on the grid (v2 mammals) | those of `part_selection` | | resampler | `precomputed` | Replay draws stored with the dataset (v2 birds; plant `v2_ids`) | | | resampler | `spatial_block` | Bootstrap within coarse spatial blocks (v2 plants, mammals) | | | resampler | `spatial_cv` | Spatial block cross-validation; each draw holds out one fold | | @@ -67,7 +66,7 @@ argument: an offset argument is not carried onto new data by `family` arrives as a name (`"binomial"`, `"poisson"`) or a family object (`Gamma(link = "log")`). An engine with its own vocabulary, -such as `gbm`'s `distribution = "bernoulli"`, translates it. +such as `xgboost`'s `objective = "binary:logistic"`, translates it. ### Testing an engine @@ -91,6 +90,26 @@ v2 post-processing steps that read coefficients (the plant stand-age splines, say) then do not apply, and the stage should drop them; see `docs/getting_started.md`. +`replace_stage_method()` does all of this in one call. Its stage +defaults to the spec's `habitat_stage`, so the same call serves +every taxon: + +```r +specs <- lapply(standard_specs(), replace_stage_method, + engine = "xgboost") +``` + +A **composite** rule - one that declares `part_selection`, as +`hurdle` does - keeps its place, and the new rule becomes the one +each part runs. The mammal hurdle's structure (presence on every +unit, abundance where the species was found) is a property of the +data, so it stays; the new engine fits both halves, and v2's +table-building (`post_process`) is removed. + +A `post_process` step is a function of the selection result and +the stage's data. A step that also declares `grid`, `species` or +`stage` is given them. + A stage carried into the next one (`carry_as`) is carried from the stage's final model: its averaged coefficients where it has them, its prediction otherwise. diff --git a/1_code/methods/engines/_glm_family.R b/1_code/methods/engines/_glm_family.R index 84c3eb7..719b4b1 100644 --- a/1_code/methods/engines/_glm_family.R +++ b/1_code/methods/engines/_glm_family.R @@ -62,6 +62,19 @@ fit_glm_family <- function( args$offset <- offset } + # A Gamma fit starts at the mean response unless told otherwise. + # The default start, y itself, spans orders of magnitude for a + # right-skewed density and sends the fitting off; v2's mammal + # abundance models start at the mean for that reason. + family_name <- if (is.character(family)) family else family$family + starts <- c("mustart", "start", "etastart") + + if (identical(family_name, "Gamma") && + !any(starts %in% names(control))) { + y <- data[[all.vars(formula[[2]])[1]]] + args$mustart <- rep(mean(y, na.rm = TRUE), nrow(data)) + } + # A convergence warning still leaves a usable fit, so it is # recorded rather than treated as a failure. It is caught with # withCallingHandlers() and muffled, so the model is fitted diff --git a/1_code/methods/engines/gbm.R b/1_code/methods/engines/gbm.R deleted file mode 100644 index 4f69ff5..0000000 --- a/1_code/methods/engines/gbm.R +++ /dev/null @@ -1,284 +0,0 @@ -# --- -# title: Engine - Boosted Regression Trees (gbm) -# author: Brendan Casey -# created: 2026-10-03 -# inputs: none -# outputs: registers the `gbm` engine -# notes: -# - gbm::gbm.fit. Trees choose their own variables, split points -# and interactions, so a stage fitted with this engine is given -# one formula holding every candidate covariate -# (models_union()) and the `single` rule. -# - It has no coefficients, no information criterion and no -# standard errors, and declares none. validate_spec() therefore -# refuses it with a rule that needs them (aic_average, -# ivw_grid, staged_bic); use `single`. -# - Only the formula's variables are used: `I(x^2)` and `a:b` -# contribute x, a and b, because a tree finds curvature and -# interactions itself. -# - The offset is honoured, on the link scale, in fitting and in -# prediction. predict.gbm() leaves it out, so it is added back -# here; without that, a bird prediction would be a rate, not a -# count. -# - The number of trees is chosen per fit by gbm.perf()'s -# out-of-bag estimate. It is fast but known to pick too few -# trees; cross-validation would be better and several times -# slower, and is not offered here. -# - Bagging draws at random, so each fit runs under a fixed seed -# (`seed` in control) and a run reproduces exactly. -# - Settings, through the stage's `control`: n.trees (the -# maximum), interaction.depth, shrinkage, bag.fraction, -# n.minobsinnode, seed. The defaults are starting points, not -# tuned values: tree depth and bag fraction are in the ranges -# Elith, Leathwick and Hastie (2008, J. Anim. Ecol.) discuss, -# but the learning rate (0.05) is higher than they generally -# advise, chosen to keep a test run quick. Tune before reading -# a GBM result as the method's best. -# --- - -# 1. Setup ---- - -## 1.1 Load packages ---- -# gbm, lazily, so a run that never uses this engine does not need -# it installed. - -# 2. engine_gbm() ---- - -#' Boosted Regression Trees -#' -#' @return An engine definition. -#' -#' @example # Example usage of the function -#' # check_engine(engine_gbm()) -engine_gbm <- function() { - list( - name = "gbm", - description = "Boosted regression trees (gbm::gbm.fit)", - capabilities = character(0), - fit = gbm_fit, - predict = gbm_predict - ) -} - -# 3. gbm_fit() ---- - -#' Fit Boosted Regression Trees, Catching Failure -#' -#' @param formula A model formula. Only its variables and any -#' `offset(offset)` term are used. -#' @param data A data frame. -#' @param family Character ("binomial", "poisson", "gaussian") or -#' a family object. -#' @param weights Numeric vector or NULL. -#' @param offset Unused; the offset comes from the formula. -#' @param control Named list of settings; see the header. -#' @return A list with `fit` (or NULL), `ok` and `message`. -#' -#' @example # Example usage of the function -#' # gbm_fit(response ~ MAP + FFP, d, "binomial") -gbm_fit <- function(formula, data, family, weights = NULL, - offset = NULL, control = list()) { - tryCatch( - { - if (!requireNamespace("gbm", quietly = TRUE)) { - stop("The gbm engine needs the gbm package.", call. = FALSE) - } - - settings <- utils::modifyList( - list( - n.trees = 1000, interaction.depth = 3, shrinkage = 0.05, - bag.fraction = 0.5, n.minobsinnode = 10, - seed = 20260909L - ), - control - ) - - # Step 1: The response, the predictors and any offset. A row - # missing its response, weight or offset is dropped, as a GLM - # drops it; a missing predictor is kept, because trees route - # missing values down a branch of their own. - terms <- gbm_terms(formula) - w_all <- if (is.null(weights)) rep(1, nrow(data)) else weights - keep <- !is.na(data[[terms$response]]) & !is.na(w_all) - - if (terms$offset) { - keep <- keep & !is.na(data$offset) - } - - x <- gbm_predictors(data[keep, , drop = FALSE], terms$variables) - y <- data[[terms$response]][keep] - w <- w_all[keep] - link_offset <- if (terms$offset) data$offset[keep] else NULL - - # Step 2: Fit, under a fixed seed, as many trees as allowed - model <- with_seed(settings$seed, gbm::gbm.fit( - x = x, y = y, offset = link_offset, w = w, - distribution = gbm_distribution(family), - n.trees = settings$n.trees, - interaction.depth = settings$interaction.depth, - shrinkage = settings$shrinkage, - bag.fraction = settings$bag.fraction, - n.minobsinnode = settings$n.minobsinnode, - keep.data = FALSE, - verbose = FALSE - )) - - # Step 3: Keep the number of trees the out-of-bag estimate - # prefers - best <- suppressWarnings(suppressMessages( - gbm::gbm.perf(model, method = "OOB", plot.it = FALSE) - )) - - list( - fit = list( - model = model, - n_trees = as.integer(best), - variables = terms$variables, - levels = lapply(x, levels), - offset = terms$offset, - linkinv = family_linkinv(family) - ), - ok = TRUE, - message = NA_character_ - ) - }, - error = function(e) { - list(fit = NULL, ok = FALSE, message = conditionMessage(e)) - } - ) -} - -# 4. gbm_predict() ---- - -#' Predict from a gbm Fit -#' -#' @param fit A list from gbm_fit(). -#' @param newdata A data frame to predict onto. -#' @param type Character. "link" or "response". -#' @param se Logical. Not supported; NULL is returned when TRUE. -#' @return A numeric vector, or NULL when the fit failed. -#' -#' @example # Example usage of the function -#' # gbm_predict(fit, newdata, "response") -gbm_predict <- function(fit, newdata, type = "link", se = FALSE) { - if (is.null(fit) || !isTRUE(fit$ok) || is.null(fit$fit) || se) { - return(NULL) - } - - tryCatch( - { - tree <- fit$fit - x <- gbm_predictors(newdata, tree$variables, tree$levels) - link <- gbm::predict.gbm( - tree$model, newdata = x, n.trees = tree$n_trees, - type = "link" - ) - - # predict.gbm() leaves the offset out - if (tree$offset) { - link <- link + newdata$offset - } - - if (type == "link") { - as.numeric(link) - } else { - as.numeric(tree$linkinv(link)) - } - }, - error = function(e) NULL - ) -} - -# 5. Helpers ---- - -## 5.1 gbm_terms() ---- - -#' Read a Formula as gbm Uses It -#' -#' @param formula A model formula. -#' @return A list of `response`, `variables` and `offset` (TRUE -#' when the formula has an `offset(offset)` term). -#' -#' @example # Example usage of the function -#' # gbm_terms(count ~ MAP + I(MAP^2) + offset(offset)) -gbm_terms <- function(formula) { - text <- paste(deparse(formula), collapse = " ") - - list( - response = all.vars(formula[[2]]), - variables = setdiff( - all.vars(formula[[3]]), c("offset", "weight") - ), - offset = grepl("offset(offset)", text, fixed = TRUE) - ) -} - -## 5.2 gbm_predictors() ---- - -#' The Predictor Frame gbm Takes -#' -#' Text columns become factors, with the fitted levels when -#' predicting, so a category on new data is read the way it was in -#' fitting. -#' -#' @param data A data frame. -#' @param variables Character vector of column names. -#' @param levels Named list of factor levels from the fit, or -#' NULL when fitting. -#' @return A data frame of the predictors. -#' -#' @example # Example usage of the function -#' # gbm_predictors(d, c("MAP", "vegc")) -gbm_predictors <- function(data, variables, levels = NULL) { - absent <- setdiff(variables, names(data)) - - if (length(absent) > 0) { - stop("Columns not in the data: ", paste(absent, collapse = ", "), - call. = FALSE) - } - - x <- as.data.frame(data)[, variables, drop = FALSE] - - for (column in variables) { - value <- x[[column]] - known <- levels[[column]] - - if (!is.null(known)) { - x[[column]] <- factor(as.character(value), levels = known) - } else if (is.character(value) || is.logical(value)) { - x[[column]] <- factor(value) - } - } - - x -} - -## 5.3 gbm_distribution() ---- - -#' The gbm Distribution for a GLM Family -#' -#' @param family Character or family object. -#' @return Character, a gbm distribution name. -#' -#' @example # Example usage of the function -#' # gbm_distribution("binomial") # "bernoulli" -gbm_distribution <- function(family) { - name <- if (is.character(family)) family else family$family - - switch( - name, - binomial = "bernoulli", - poisson = "poisson", - gaussian = "gaussian", - stop( - "The gbm engine has no distribution for family `", name, - "`. It supports binomial, poisson and gaussian.", - call. = FALSE - ) - ) -} - -# 6. Register ---- -register_engine(engine_gbm()) - -# End of script ---- diff --git a/1_code/methods/engines/xgboost.R b/1_code/methods/engines/xgboost.R new file mode 100644 index 0000000..b5f920e --- /dev/null +++ b/1_code/methods/engines/xgboost.R @@ -0,0 +1,371 @@ +# --- +# title: Engine - Boosted Regression Trees (xgboost) +# author: Brendan Casey +# created: 2026-10-05 +# inputs: none +# outputs: registers the `xgboost` engine +# notes: +# - xgboost::xgb.train. Trees choose their own variables, split +# points and interactions, so a stage fitted with this engine +# is given one formula holding every candidate covariate +# (models_union()) and the `single` rule, through +# replace_stage_method(). +# - It replaces the earlier gbm engine, which could not fit the +# mammal hurdle: gbm's bernoulli refuses a response between 0 +# and 1 (v2's lure-scaled presence), and gbm has no Gamma. +# xgboost's `binary:logistic` takes a proportion as the label, +# and `reg:gamma` is a log-link Gamma. +# - It has no coefficients, no information criterion and no +# standard errors, and declares none. validate_spec() therefore +# refuses it with a rule that needs them; use `single`. +# - Only the formula's variables are used: `I(x^2)` and `a:b` +# contribute x, a and b, because a tree finds curvature and +# interactions itself. Text and factor columns are one-hot +# coded with the fitted levels. A missing value stays missing: +# xgboost routes it down a branch of its own. +# - The offset is honoured on the link scale, in fitting and in +# prediction, as xgboost's `base_margin`. Without it on new +# data xgboost would substitute its own fitted intercept, so a +# bird prediction would be neither a rate nor a count. +# - The number of rounds is chosen per fit by early stopping on +# a held-out share of the rows (`valid_fraction`, 20%), then +# the model is refitted on every row at that number. The +# holdout is drawn under the fit's seed, so a run reproduces +# exactly. Pitfall: on a small draw the holdout is small and +# the chosen number of rounds noisy. +# - Settings, through the stage's `control`: nrounds (the most), +# eta, max_depth, subsample, colsample_bytree, +# min_child_weight, early_stopping_rounds, valid_fraction, +# seed. The defaults are untuned starting points chosen to +# keep a test run quick (eta 0.05 is higher than Elith, +# Leathwick and Hastie 2008 generally advise for boosted +# trees). Tune before reading a result as the method's best. +# - One thread per fit, because the harness already runs one +# species per worker. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +# xgboost (version: 3.2.1), lazily, so a run that never uses this +# engine does not need it installed. + +# 2. engine_xgboost() ---- + +#' Boosted Regression Trees with xgboost +#' +#' @return An engine definition. +#' +#' @example # Example usage of the function +#' # check_engine(engine_xgboost()) +engine_xgboost <- function() { + list( + name = "xgboost", + description = "Boosted regression trees (xgboost::xgb.train)", + capabilities = character(0), + fit = xgboost_fit, + predict = xgboost_predict + ) +} + +# 3. xgboost_fit() ---- + +#' Fit Boosted Regression Trees, Catching Failure +#' +#' @param formula A model formula. Only its variables and any +#' `offset(offset)` term are used. +#' @param data A data frame. +#' @param family Character ("binomial", "poisson", "gaussian") or +#' a family object (Gamma with a log link). +#' @param weights Numeric vector or NULL. +#' @param offset Unused; the offset comes from the formula. +#' @param control Named list of settings; see the header. +#' @return A list with `fit` (or NULL), `ok` and `message`. +#' +#' @example # Example usage of the function +#' # xgboost_fit(response ~ MAP + FFP, d, "binomial") +xgboost_fit <- function(formula, data, family, weights = NULL, + offset = NULL, control = list()) { + tryCatch( + { + if (!requireNamespace("xgboost", quietly = TRUE)) { + stop("The xgboost engine needs the xgboost package.", + call. = FALSE) + } + + settings <- utils::modifyList( + list( + nrounds = 1000, eta = 0.05, max_depth = 3, + subsample = 0.5, colsample_bytree = 1, + min_child_weight = 1, early_stopping_rounds = 50, + valid_fraction = 0.2, seed = 20260909L + ), + control + ) + + # Step 1: The response, the predictors and any offset. A row + # missing its response, weight or offset is dropped, as a GLM + # drops it; a missing predictor is kept. + terms <- xgboost_terms(formula) + w_all <- if (is.null(weights)) rep(1, nrow(data)) else weights + keep <- !is.na(data[[terms$response]]) & !is.na(w_all) + + if (terms$offset) { + keep <- keep & !is.na(data$offset) + } + + rows <- data[keep, , drop = FALSE] + design <- xgboost_design(rows, terms$variables) + y <- rows[[terms$response]] + w <- w_all[keep] + margin <- if (terms$offset) rows$offset else NULL + + params <- list( + objective = xgboost_objective(family), + eta = settings$eta, + max_depth = settings$max_depth, + subsample = settings$subsample, + colsample_bytree = settings$colsample_bytree, + min_child_weight = settings$min_child_weight, + nthread = 1 + ) + + matrix_of <- function(index) { + xgboost::xgb.DMatrix( + design$x[index, , drop = FALSE], label = y[index], + weight = w[index], + base_margin = if (is.null(margin)) NULL else margin[index] + ) + } + + # Step 2: The number of rounds, by early stopping on a + # held-out share, then a refit on every row at that number + model <- with_seed(settings$seed, { + n <- length(y) + held <- sample.int( + n, max(1L, floor(n * settings$valid_fraction)) + ) + trial <- xgboost::xgb.train( + params = params, data = matrix_of(-held), + nrounds = settings$nrounds, + evals = list(valid = matrix_of(held)), + early_stopping_rounds = settings$early_stopping_rounds, + verbose = 0 + ) + rounds <- xgboost_best_rounds(trial, settings$nrounds) + + xgboost::xgb.train( + params = params, data = matrix_of(seq_len(n)), + nrounds = rounds, verbose = 0 + ) + }) + + list( + fit = list( + model = model, + variables = terms$variables, + columns = colnames(design$x), + levels = design$levels, + offset = terms$offset, + linkinv = family_linkinv(family) + ), + ok = TRUE, + message = NA_character_ + ) + }, + error = function(e) { + list(fit = NULL, ok = FALSE, message = conditionMessage(e)) + } + ) +} + +# 4. xgboost_predict() ---- + +#' Predict from an xgboost Fit +#' +#' @param fit A list from xgboost_fit(). +#' @param newdata A data frame to predict onto. +#' @param type Character. "link" or "response". +#' @param se Logical. Not supported; NULL is returned when TRUE. +#' @return A numeric vector, or NULL when the fit failed. +#' +#' @example # Example usage of the function +#' # xgboost_predict(fit, newdata, "response") +xgboost_predict <- function(fit, newdata, type = "link", se = FALSE) { + if (is.null(fit) || !isTRUE(fit$ok) || is.null(fit$fit) || se) { + return(NULL) + } + + tryCatch( + { + tree <- fit$fit + design <- xgboost_design(newdata, tree$variables, tree$levels) + + # A model fitted with an offset reads it as the base margin; + # a model fitted without one uses its own fitted intercept + matrix <- xgboost::xgb.DMatrix( + design$x[, tree$columns, drop = FALSE], + base_margin = if (tree$offset) newdata$offset else NULL + ) + + link <- stats::predict(tree$model, matrix, outputmargin = TRUE) + + if (type == "link") { + as.numeric(link) + } else { + as.numeric(tree$linkinv(link)) + } + }, + error = function(e) NULL + ) +} + +# 5. Helpers ---- + +## 5.1 xgboost_terms() ---- + +#' Read a Formula as the Engine Uses It +#' +#' @param formula A model formula. +#' @return A list of `response`, `variables` and `offset` (TRUE +#' when the formula has an `offset(offset)` term). +#' +#' @example # Example usage of the function +#' # xgboost_terms(count ~ MAP + I(MAP^2) + offset(offset)) +xgboost_terms <- function(formula) { + text <- paste(deparse(formula), collapse = " ") + + list( + response = all.vars(formula[[2]]), + variables = setdiff( + all.vars(formula[[3]]), c("offset", "weight") + ), + offset = grepl("offset(offset)", text, fixed = TRUE) + ) +} + +## 5.2 xgboost_design() ---- + +#' The Numeric Matrix xgboost Takes +#' +#' Numeric columns pass through, missing values included. Text, +#' logical and factor columns become one indicator column per +#' level, with the fitted levels when predicting, so a category is +#' read on new data as it was in fitting. A missing category is +#' missing in every indicator rather than a level of its own. +#' +#' @param data A data frame. +#' @param variables Character vector of column names. +#' @param levels Named list of factor levels from the fit, or +#' NULL when fitting. +#' @return A list of `x` (a numeric matrix) and `levels`. +#' +#' @example # Example usage of the function +#' # xgboost_design(d, c("MAP", "Protocol"))$x +xgboost_design <- function(data, variables, levels = NULL) { + absent <- setdiff(variables, names(data)) + + if (length(absent) > 0) { + stop("Columns not in the data: ", paste(absent, collapse = ", "), + call. = FALSE) + } + + fitting <- is.null(levels) + levels <- levels %||% list() + columns <- list() + + for (column in variables) { + value <- data[[column]] + categorical <- column %in% names(levels) || + (fitting && (is.character(value) || is.logical(value) || + is.factor(value))) + + if (!categorical) { + columns[[column]] <- as.numeric(value) + next + } + + if (fitting) { + levels[[column]] <- sort(unique(as.character( + value[!is.na(value)] + ))) + } + + text <- as.character(value) + + for (level in levels[[column]]) { + columns[[paste0(column, "_", level)]] <- ifelse( + is.na(text), NA_real_, as.numeric(text == level) + ) + } + } + + x <- do.call(cbind, columns) + + if (is.null(dim(x))) { + x <- matrix(x, ncol = length(columns)) + } + + colnames(x) <- names(columns) + + list(x = x, levels = levels) +} + +## 5.3 xgboost_objective() ---- + +#' The xgboost Objective for a GLM Family +#' +#' @param family Character or family object. +#' @return Character, an xgboost objective. +#' +#' @example # Example usage of the function +#' # xgboost_objective("binomial") # "binary:logistic" +xgboost_objective <- function(family) { + name <- if (is.character(family)) family else family$family + link <- if (is.character(family)) NA_character_ else family$link + + if (name == "Gamma" && !identical(link, "log")) { + stop("The xgboost engine fits Gamma on the log link only.", + call. = FALSE) + } + + switch( + name, + binomial = "binary:logistic", + poisson = "count:poisson", + Gamma = "reg:gamma", + gaussian = "reg:squarederror", + stop( + "The xgboost engine has no objective for family `", name, + "`. It supports binomial, poisson, Gamma and gaussian.", + call. = FALSE + ) + ) +} + +## 5.4 xgboost_best_rounds() ---- + +#' The Number of Rounds Early Stopping Chose +#' +#' @param model An xgb.Booster trained with early stopping. +#' @param most Integer. The ceiling, used when none was recorded. +#' @return An integer of at least 1. +#' +#' @example # Example usage of the function +#' # xgboost_best_rounds(trial, 1000) +xgboost_best_rounds <- function(model, most) { + best <- suppressWarnings(as.integer( + xgboost::xgb.attr(model, "best_iteration") + )) + + if (length(best) != 1L || is.na(best)) { + best <- most + } + + max(1L, best) +} + +# 6. Register ---- +register_engine(engine_xgboost()) + +# End of script ---- diff --git a/1_code/methods/selection/aic_best_grid.R b/1_code/methods/selection/aic_best_grid.R deleted file mode 100644 index 8745fb7..0000000 --- a/1_code/methods/selection/aic_best_grid.R +++ /dev/null @@ -1,109 +0,0 @@ -# --- -# title: Selection Rule - Best Model, Predicted onto a Grid -# author: Brendan Casey -# created: 2026-09-09 -# inputs: none -# outputs: registers the `aic_best_grid` rule -# notes: -# - The v2 mammal abundance-given-presence rule. Predicts the -# winning model onto the shared prediction matrix and reports -# one effect per grid row. -# - No calibration is applied. v2 calibrates the product of the -# two hurdle halves multiplicatively rather than each half -# separately, because an additive shift on a log-scale -# abundance can send a small prediction negative and `log` of -# that is not a number. -# --- - -# 1. Setup ---- - -## 1.1 Load packages ---- -# Base R only. - -# 2. select_aic_best_grid() ---- - -#' Best Model, Predicted onto a Prediction Grid -#' -#' @inheritParams select_single -#' @param grid A prediction grid. -#' @param constants Named list of values held fixed across the -#' grid - sampling effort and climate. -#' @param scale Character. "link" reports the linear predictor, -#' which for a log-link Gamma is log abundance; "response" -#' exponentiates it. -#' @return A selection result, one effect per grid row. -#' -#' @example # Example usage of the function -#' # select_aic_best_grid(models, response ~ 1, d, engine, -#' # Gamma(link = "log"), grid = grid) -select_aic_best_grid <- function( - models, base, data, engine, family, - weights = NULL, offset = NULL, ic = "AICc", control = list(), - grid = NULL, constants = list(), scale = "link" -) { - if (is.null(grid)) { - stop( - "The aic_best_grid rule needs a prediction grid.", - call. = FALSE - ) - } - - fitted <- fit_candidates( - models, base, data, engine, family, weights, offset, ic, - control - ) - - table <- candidate_table(fitted) - - if (!any(table$ok)) { - return(selection_result(NULL, NULL, table, fitted)) - } - - winner <- which.min(fitted$scores) - best <- fitted$fits[[winner]] - - newdata <- grid - - for (one in names(constants)) { - newdata[[one]] <- constants[[one]] - } - - # A grid row describes a pure stand, so a term the grid has no - # column for is genuinely absent rather than unknown. - terms <- formula_variables(fitted$formulas[[winner]]) - - for (one in setdiff(terms, names(newdata))) { - newdata[[one]] <- 0 - } - - predicted <- engine$predict(best, newdata, scale, se = TRUE) - - if (is.null(predicted)) { - return(selection_result(NULL, NULL, table, fitted)) - } - - selection_result( - fit = best, - coefficients = data.frame( - term = rownames(grid), - estimate = predicted$fit, - se = predicted$se.fit, - stringsAsFactors = FALSE - ), - ic_table = table, - fitted = fitted, - engine = engine - ) -} - -# 3. Register ---- -register_selection( - "aic_best_grid", select_aic_best_grid, - paste( - "Best candidate by AICc, predicted onto the habitat grid", - "(v2 mammal abundance)" - ), - requires = c("ic", "se") -) - -# End of script ---- diff --git a/1_code/methods/selection/aic_best_onehot.R b/1_code/methods/selection/aic_best_onehot.R deleted file mode 100644 index 835a4d6..0000000 --- a/1_code/methods/selection/aic_best_onehot.R +++ /dev/null @@ -1,184 +0,0 @@ -# --- -# title: Selection Rule - Best Model, Read One Habitat at a Time -# author: Brendan Casey -# created: 2026-09-09 -# inputs: none -# outputs: registers the `aic_best_onehot` rule -# notes: -# - The v2 mammal presence rule. Unlike the plant habitat stage -# there is no fixed prediction matrix: v2 reads each effect by -# setting that one term to 1 and every other to 0, so the grid -# is an identity over whichever terms the winning model -# happens to carry. -# - Three things make the result a probability rather than a -# coefficient: -# - Each prediction is passed through the logistic, so an -# effect is the modelled probability of presence in a pure -# stand of that type. -# - `Climate` is a slope, not a habitat type, so it is taken -# from the fitted coefficient rather than from a one-hot -# prediction, and is left out of the calibration below. -# - The whole set is shifted on the logit scale so that mean -# fitted presence matches mean observed presence. -# - The reference category - the land cover the winning formula -# omits - is reported alongside the fitted terms, because a -# coefficient here means "relative to that type". -# --- - -# 1. Setup ---- - -## 1.1 Load packages ---- -# Base R only. - -# 2. select_aic_best_onehot() ---- - -#' Best Model, Read One Habitat Type at a Time -#' -#' @inheritParams select_single -#' @param intercept_cats Character vector, parallel to `models`, -#' naming each candidate's reference category. -#' @param constants Named list of values every one-hot -#' prediction holds fixed. The mammal specs set v2's 100 -#' sampling days at zero climate per region. -#' @param calibrate_against Numeric vector of observed responses -#' to calibrate the level against, or NULL to skip. Filled by -#' the harness when the stage sets `calibrate = TRUE`. -#' @param slope_terms Character vector of terms that are slopes -#' rather than habitat types. -#' @return A selection result whose `coefficients` are -#' probabilities of presence per habitat type. -#' -#' @example # Example usage of the function -#' # select_aic_best_onehot(models, response ~ 1, d, engine, -#' # "binomial", intercept_cats = cats) -select_aic_best_onehot <- function( - models, base, data, engine, family, - weights = NULL, offset = NULL, ic = "AICc", control = list(), - intercept_cats = NULL, - constants = list(), - calibrate_against = NULL, - slope_terms = "Climate" -) { - fitted <- fit_candidates( - models, base, data, engine, family, weights, offset, ic, - control - ) - - table <- candidate_table(fitted) - - if (!any(table$ok)) { - return(selection_result(NULL, NULL, table, fitted)) - } - - winner <- which.min(fitted$scores) - best <- fitted$fits[[winner]] - - # Step 1: The terms to read are the winning model's own, plus - # the category it leaves out. - terms <- attr( - stats::terms(fitted$formulas[[winner]]), "term.labels" - ) - reference <- if (is.null(intercept_cats)) { - NULL - } else { - intercept_cats[winner] - } - - # A slope stays in the reported set even though it is held at - # a constant for the one-hot predictions: its value is taken - # from the fitted coefficient below, and dropping it here would - # make that an append rather than a replacement. Pure design - # constants - sampling effort - are not reported at all. - terms <- setdiff( - c(terms, reference), - setdiff(names(constants), slope_terms) - ) - - if (length(terms) == 0) { - return(selection_result( - best, engine_coef(engine, best), table, fitted, - engine = engine - )) - } - - # Step 2: One prediction per term, at 100 per cent of that type - onehot <- as.data.frame(diag(length(terms))) - names(onehot) <- terms - - for (one in names(constants)) { - onehot[[one]] <- constants[[one]] - } - - predicted <- engine$predict(best, onehot, "link", se = TRUE) - - if (is.null(predicted)) { - return(selection_result(NULL, NULL, table, fitted)) - } - - estimate <- stats::plogis(predicted$fit) - error <- predicted$se.fit - names(estimate) <- names(error) <- terms - - # Step 3: Shift the level so mean fitted presence matches mean - # observed. Slopes are exempt: the shift is an intercept - # change, and applying it to a slope would be meaningless. - if (!is.null(calibrate_against)) { - on_scale <- engine$predict(best, data, "link") - - if (!is.null(on_scale)) { - shift <- stats::qlogis(mean(calibrate_against)) - - stats::qlogis(mean(stats::plogis(on_scale))) - - if (is.finite(shift)) { - habitat <- setdiff(names(estimate), slope_terms) - estimate[habitat] <- stats::plogis( - stats::qlogis(estimate[habitat]) + shift - ) - } - } - } - - # Step 4: A slope is reported from its own coefficient, not - # from a one-hot prediction of a type that does not exist. - best_coefficients <- engine_coef(engine, best) - coefficients <- stats::setNames( - best_coefficients$estimate, best_coefficients$term - ) - - for (one in intersect(slope_terms, names(coefficients))) { - if (!one %in% names(estimate)) { - next - } - - estimate[one] <- stats::plogis(coefficients[[one]]) - } - - result <- selection_result( - fit = best, - coefficients = data.frame( - term = names(estimate), - estimate = unname(estimate), - se = unname(error), - stringsAsFactors = FALSE - ), - ic_table = table, - fitted = fitted, - engine = engine - ) - - result$reference_category <- reference - - result -} - -# 3. Register ---- -register_selection( - "aic_best_onehot", select_aic_best_onehot, - paste( - "Best candidate by AICc, read one habitat type at a time", - "and calibrated (v2 mammal presence)" - ), - requires = c("ic", "coefficients", "se") -) - -# End of script ---- diff --git a/1_code/methods/selection/hurdle.R b/1_code/methods/selection/hurdle.R new file mode 100644 index 0000000..e241475 --- /dev/null +++ b/1_code/methods/selection/hurdle.R @@ -0,0 +1,261 @@ +# --- +# title: Selection Rule - Hurdle: Presence, Then Abundance Given +# Presence +# author: Brendan Casey +# created: 2026-10-05 +# inputs: none +# outputs: registers the `hurdle` rule +# notes: +# - A two-part model for a response that is zero at most units +# and a right-skewed amount where it is not. Presence is fitted +# on every unit; abundance given presence on the units where +# the species was found. Their product is total abundance. +# v2's mammal habitat models are this shape. +# - Engine-agnostic. Both halves are fitted with the stage's +# engine through an inner rule, `part_selection`: `aic_best` +# for v2's GLMs, `single` for an engine with no information +# criterion. replace_stage_method() swaps the inner rule and +# the engine, so a boosted tree fits both halves. +# - What the rule reports works for any engine: each half and +# their product predicted onto the prediction grid, one value +# per habitat type, as three outputs (`presence`, `abundance`, +# `total`). The harness writes them as the stages +# `_presence`, `_abundance` and `_total`. +# v2's own post-processing (modules/mammals/hurdle.R) replaces +# them with v2's tables when the stage keeps v2's GLMs. +# - The final model the harness scores and projects is the +# presence half, so metrics compare like with like across +# engines and with the presence response. +# - The abundance candidates are the presence candidates with +# `abundance_drop` removed - v2 notes that climate effects on +# abundance given presence are minimal - plus a null carrying +# sampling effort. For an engine with coefficients, a +# candidate whose cover terms account for all the cover at +# every present unit is left out, as v2 leaves it out: with an +# intercept as well it cannot be estimated. Terms the stage +# holds constant (Climate, sampling effort, pAspen) are not +# cover. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +# Base R only. + +# 2. select_hurdle() ---- + +#' Fit a Hurdle Model: Presence, Then Abundance Given Presence +#' +#' @inheritParams select_single +#' @param grid A prediction grid, or NULL; without one there are +#' no outputs, only the presence half's coefficients. +#' @param constants,grid_constants Named lists of values held +#' fixed on the grid: sampling effort, Climate, pAspen. Their +#' names are also the terms that are not cover. +#' @param intercept_cats Character vector, parallel to `models`, +#' naming each candidate's reference category, or NULL. +#' @param part_selection Character. The rule each half runs. +#' @param abundance_family A family for the abundance half. +#' @param abundance_response A function(values, data) computing +#' the abundance response from the raw values, or NULL to take +#' the raw values as they are. +#' @param abundance_drop Character vector of terms the abundance +#' half leaves out. +#' @param abundance_null Character. An extra abundance candidate, +#' or NULL for none. +#' @param abundance_weighted Logical. Weight the abundance half +#' as the presence half is weighted. v2 does not. +#' @return A selection result for the presence half, with `parts` +#' (both halves' selection results), `winner` (the presence +#' candidate chosen), `reference_category` and `outputs`. +#' +#' @example # Example usage of the function +#' # select_hurdle(models, response ~ 1, d, get_engine("glm"), +#' # "binomial", grid = grid) +select_hurdle <- function( + models, base, data, engine, family, + weights = NULL, offset = NULL, ic = "AICc", control = list(), + grid = NULL, constants = list(), grid_constants = list(), + intercept_cats = NULL, + part_selection = "aic_best", + abundance_family = stats::Gamma(link = "log"), + abundance_response = NULL, + abundance_drop = "Climate", + abundance_null = ". ~ . + seas_days", + abundance_weighted = FALSE +) { + response <- all.vars(base[[2]]) + raw <- if ("response_raw" %in% names(data)) { + data$response_raw + } else { + data[[response]] + } + failed <- function(table) { + selection_result(NULL, NULL, table) + } + + # Step 1: Presence, on every unit + presence <- selection_run( + part_selection, models, base, data, engine, family, + weights, offset, ic, control + ) + + if (is.null(presence$fit) || !isTRUE(presence$fit$ok)) { + return(failed(presence$ic_table)) + } + + scores <- presence$ic_table$ic + winner <- if (any(is.finite(scores))) which.min(scores) else 1L + + # Step 2: Abundance given presence, on the units with any + present <- !is.na(raw) & raw > 0 + + if (sum(present) < 2) { + return(failed(presence$ic_table)) + } + + d_p <- data[present, , drop = FALSE] + d_p[[response]] <- if (is.function(abundance_response)) { + abundance_response(raw[present], d_p) + } else { + raw[present] + } + + abundance_models <- hurdle_abundance_models( + presence, models, base, d_p, engine, abundance_drop, + abundance_null, held = names(c(constants, grid_constants)) + ) + + abundance <- selection_run( + part_selection, abundance_models, base, d_p, engine, + abundance_family, + weights = if (abundance_weighted && !is.null(weights)) { + weights[present] + } else { + NULL + }, + offset = NULL, ic = ic, control = control + ) + + if (is.null(abundance$fit) || !isTRUE(abundance$fit$ok)) { + return(failed(presence$ic_table)) + } + + # Step 3: Each half, and their product, on the grid + result <- presence + result$parts <- list(presence = presence, abundance = abundance) + result$winner <- winner + result$reference_category <- if (is.null(intercept_cats)) { + NULL + } else { + intercept_cats[winner] + } + + if (!is.null(grid)) { + held <- c(constants, grid_constants) + on_grid <- lapply(result$parts, predict_grid, grid = grid, + constants = held) + + if (!any(vapply(on_grid, is.null, logical(1)))) { + table_of <- function(values) { + data.frame( + term = names(values), estimate = unname(values), + se = NA_real_, stringsAsFactors = FALSE + ) + } + + result$outputs <- list( + presence = table_of(on_grid$presence), + abundance = table_of(on_grid$abundance), + total = table_of(on_grid$presence * on_grid$abundance) + ) + } + } + + result +} + +# 3. hurdle_abundance_models() ---- + +#' The Abundance Half's Candidates +#' +#' @param presence The presence half's selection result. +#' @param models The presence candidates as given. +#' @param base The base formula. +#' @param d_p The units where the species was present. +#' @param engine An engine definition. +#' @param drop,null As `abundance_drop` and `abundance_null`. +#' @param held Character vector of terms that are not cover. +#' @return A list of formulas. +#' +#' @example # Example usage of the function +#' # hurdle_abundance_models(presence, models, response ~ 1, d_p, +#' # engine, "Climate", NULL, "seas_days") +hurdle_abundance_models <- function(presence, models, base, d_p, + engine, drop, null, held) { + response <- all.vars(base[[2]]) + base_text <- paste(deparse(base[[3]]), collapse = " ") + has_offset <- grepl("offset(offset)", base_text, fixed = TRUE) + + # A presence candidate that could not be fitted has no abundance + # counterpart, as in v2. A rule that fits only some candidates + # (single) reports only those. + table <- presence$ic_table + formulas <- lapply(models, resolve_formula, base = base) + + fitted_n <- if (is.null(table)) 1L else nrow(table) + + formulas <- if (fitted_n == length(formulas)) { + formulas[table$ok] + } else { + formulas[seq_len(min(fitted_n, length(formulas)))] + } + + check_cover <- engine_has(engine, "coefficients") + + candidates <- lapply(formulas, function(f) { + terms <- attr(stats::terms(f), "term.labels") + + # Identifiable with an intercept only if some cover is left + # unaccounted for at some unit + if (check_cover) { + cover <- intersect(setdiff(terms, held), names(d_p)) + used <- sum(colSums(d_p[, cover, drop = FALSE])) + + if ((nrow(d_p) - used) <= 0) { + return(NULL) + } + } + + kept <- setdiff(terms, drop) + + stats::as.formula(paste( + response, "~", + paste(c(if (length(kept) == 0) "1" else kept, + if (has_offset) "offset(offset)"), + collapse = " + ") + )) + }) + + candidates <- Filter(Negate(is.null), candidates) + + if (!is.null(null)) { + candidates <- c( + candidates, list(resolve_formula(stats::as.formula(null), base)) + ) + } + + candidates +} + +# 4. Register ---- +register_selection( + "hurdle", select_hurdle, + paste( + "Presence, then abundance given presence, each with an inner", + "rule (v2 mammals)" + ), + requires = character(0) +) + +# End of script ---- diff --git a/1_code/modules/_shared/plant_group.R b/1_code/modules/_shared/plant_group.R index e42c6ba..7460c4b 100644 --- a/1_code/modules/_shared/plant_group.R +++ b/1_code/modules/_shared/plant_group.R @@ -107,6 +107,8 @@ plant_group_spec <- function( list( taxon = taxon, response_name = "response", + # The stage a methods experiment replaces by default + habitat_stage = "habitat", # Plant-group responses are cover or abundance values; v2 # models presence, so anything above zero is a detection. diff --git a/1_code/modules/birds/spec.R b/1_code/modules/birds/spec.R index cc30cc8..0563257 100644 --- a/1_code/modules/birds/spec.R +++ b/1_code/modules/birds/spec.R @@ -45,6 +45,8 @@ bird_spec <- function() { list( taxon = "bird", + # The stage a methods experiment replaces by default + habitat_stage = "landcover", response_name = "response", # Counts are modelled as given; the offset carries effort. diff --git a/1_code/modules/mammals/hurdle.R b/1_code/modules/mammals/hurdle.R index 1890fec..7de1417 100644 --- a/1_code/modules/mammals/hurdle.R +++ b/1_code/modules/mammals/hurdle.R @@ -1,5 +1,5 @@ # --- -# title: The v2 Mammal Hurdle Model +# title: The v2 Mammal Hurdle Tables # author: Brendan Casey; model logic by Marcus Becker and David J. # Huggard (v2) # created: 2026-09-29 @@ -9,18 +9,18 @@ # - species_queue.csv (each species' v2 name) # outputs: none; returns objects in memory # notes: -# - A port of the per-species, per-season body of v2's -# 03_basic-models.R, north (sections 6.1 to 6.6 and 6.11) and -# south (6.1 to 6.6), for one species, season and region. It -# is registered as the habitat stage's selection rule, so the -# harness runs it once per draw. -# - v2 couples the two halves of the hurdle, so they are fitted -# together here: presence (binomial, best of the candidates by -# AICc), abundance given presence (Gamma on the log scale, over -# the presence candidates that leave some cover unaccounted -# for, plus an effort-only null), their product as total -# abundance, calibrated to the observed mean, and in the north -# stand-age splines and cutblock convergence. +# - The hurdle itself - presence, then abundance given presence - +# is fitted by the generic `hurdle` rule +# (methods/selection/hurdle.R), through whatever engine the +# stage names. This file holds what is v2's own: how v2 turns +# the two fitted GLMs into its published tables. It is a port +# of the per-species, per-season body of v2's 03_basic-models.R +# after the fits, north (sections 6.3 to 6.6 and 6.11) and +# south (6.3 to 6.6). +# - mammal_v2_habitat_tables() runs as the habitat stage's +# post_process step, so replace_stage_method() removes it with +# the GLMs: an engine experiment reports the hurdle rule's own +# grid tables instead. It stops if either half is not a GLM. # - Effects are reported on v2's full habitat set, not the # winning model's categories: each category is spread over # the fine types the prediction matrix assigns to it. @@ -95,7 +95,7 @@ mammal_precomputed_climate <- function(frame, species, data_dir, frame } -# 3. The hurdle model ---- +# 3. Helpers ---- ## 3.1 mammal_aicc() ---- @@ -132,41 +132,70 @@ mammal_lure_ratio <- function(values, lured, location) { unname(q["Yes"] / q["No"]) } -## 3.3 select_mammal_v2_hurdle() ---- +## 3.3 mammal_held_constants() ---- -#' Fit v2's Mammal Hurdle Model for One Species and Season +#' The Values v2 Holds Fixed for Its One-Hot Predictions #' -#' Registered as the mammal habitat stage's selection rule. See -#' the header for the steps. +#' @param has_aspen Logical. Whether the region fits pAspen (the +#' south). +#' @return A named list. #' -#' @param models List of presence candidate formulas. -#' @param base,engine,family,weights,offset,ic,control As passed -#' to every selection rule; `weights` is the season weight. -#' @param data The draw's rows: `response_raw` is the count, and -#' `lured`, `location`, `seas_days`, `Climate`, the habitat -#' columns and, in the north, the aged stand-cover columns. +#' @example # Example usage of the function +#' # mammal_held_constants(TRUE) +mammal_held_constants <- function(has_aspen) { + constants <- list(seas_days = 100, Climate = 0) + if (has_aspen) constants$pAspen <- 0 + constants +} + +# 4. The v2 tables ---- + +## 4.1 mammal_v2_habitat_tables() ---- + +#' Turn the Fitted Hurdle into v2's Three Habitat Tables +#' +#' The habitat stage's post_process step. Reads the two GLMs the +#' `hurdle` rule chose and replaces its outputs with v2's +#' presence, abundance and total tables. +#' +#' @param selected The `hurdle` rule's selection result. +#' @param data The stage's data: `response` is the lure-scaled +#' presence, `response_raw` the count, `weight` the season +#' weight, and `lured`, `location`, `seas_days`, `Climate`, the +#' habitat columns and, in the north, the aged stand-cover +#' columns. #' @param grid The prediction matrix, with v2's rows dropped. -#' @param intercept_cats Character vector: each candidate's -#' reference category. #' @param species Character. The harness species name. -#' @param stage The stage definition. Unused; the stand-age steps -#' run where the aged cover columns are present (the north). -#' @return A selection result: `fit` is the presence model, -#' `coefficients` the presence table, and `outputs` the -#' presence, abundance and total tables. +#' @return The selection result, with `coefficients` the presence +#' table and `outputs` v2's three tables. #' #' @example # Example usage of the function -#' # select_mammal_v2_hurdle(models, response ~ 1, d, engine, -#' # "binomial", grid = pm, ...) -select_mammal_v2_hurdle <- function( - models, base, data, engine, family, - weights = NULL, offset = NULL, ic = "AICc", control = list(), - grid = NULL, intercept_cats = NULL, species = NA_character_, - stage = list() -) { +#' # selected <- mammal_v2_habitat_tables(selected, d, pm, +#' # "MuleDeer_Summer") +mammal_v2_habitat_tables <- function(selected, data, grid, + species = NA_character_) { if (!requireNamespace("MuMIn", quietly = TRUE) || !requireNamespace("mgcv", quietly = TRUE)) { - stop("The mammal hurdle model needs MuMIn and mgcv.", + stop("The mammal v2 tables need MuMIn and mgcv.", call. = FALSE) + } + + pa <- selected$parts$presence$fit$fit + agp <- selected$parts$abundance$fit$fit + + # v2's tables are read from GLM coefficients. A stage fitted + # with another engine should have had this step removed by + # replace_stage_method(); say so rather than mix the two. + if (!inherits(pa, "glm") || !inherits(agp, "glm")) { + stop( + "The mammal v2 tables read GLM fits, but this hurdle was ", + "fitted with another engine. Replace the stage's method ", + "with replace_stage_method(), which removes this step.", + call. = FALSE + ) + } + + if (is.null(grid)) { + stop("The mammal v2 tables need the prediction matrix.", call. = FALSE) } @@ -175,94 +204,105 @@ select_mammal_v2_hurdle <- function( ages <- "SpruceR" %in% names(data) has_aspen <- "pAspen" %in% names(data) count <- data$response_raw - seas_wt <- weights - fail <- function(message) { - stop("mammal hurdle: ", message, call. = FALSE) - } - - # Step 1: Presence (6.1) lure_pa <- mammal_lure_ratio(sign(count), data$lured, data$location) - data$p_count_pa <- sign(count) / ifelse(data$lured == "Yes", lure_pa, 1) - data$p_count_pa <- data$p_count_pa / max(data$p_count_pa) + lure_agp <- mammal_lure_ratio( + count[count > 0], data$lured[count > 0], data$location[count > 0] + ) - formulas <- lapply(models, function(m) { - stats::update(p_count_pa ~ 1, m) - }) + # Step 1: Presence effects, one category at a time (6.3) + presence <- mammal_presence_effects( + pa, data, selected$reference_category, lure_pa, has_aspen + ) - m_pa <- lapply(formulas, function(f) { - try(stats::glm(f, family = "binomial", data = data, - weights = seas_wt), silent = TRUE) - }) - aic_pa <- vapply(m_pa, mammal_aicc, numeric(1)) + # Site-level logits: the age splines' offset + data$p <- stats::predict(pa, newdata = data) + + # Step 2: Abundance effects on the prediction matrix (6.4) + abundance <- mammal_abundance_effects(agp, grid, has_aspen) - if (!any(is.finite(aic_pa))) { - fail("every presence model failed") + # Step 3: Stand-age splines, north only (6.5) + aged <- if (ages) { + mammal_age_splines(data, presence$coef, presence$terms) + } else { + list(p_age = list(), p_age_se = list()) } - best_pa <- which.min(aic_pa) - pa <- m_pa[[best_pa]] - - # Step 2: Abundance given presence (6.2) - d_p <- data[count > 0, , drop = FALSE] - count_p <- count[count > 0] - lure_agp <- mammal_lure_ratio(count_p, d_p$lured, d_p$location) - d_p$p_count_agp <- count_p / - ifelse(d_p$lured == "Yes", lure_agp, 1) - d_p$p_count_agp <- pmin( - d_p$p_count_agp, stats::quantile(d_p$p_count_agp, 0.99) + # Step 4: Spread each category over its fine types (6.5) + spread <- mammal_spread( + presence, abundance$coef, aged, grid, ages ) - agp_start <- rep(mean(d_p$p_count_agp), nrow(d_p)) - m_agp <- list() + # Step 5: v2's Mule Deer adjustment + spread$mean <- mammal_mule_deer(spread$mean, species) - for (i in seq_along(m_pa)) { - if (inherits(m_pa[[i]], "try-error")) { - next - } + # Step 6: Calibrate total abundance to the observed mean (6.6) + spread$mean <- spread$mean * mammal_total_calibration( + pa, agp, data, presence$at_constants, lure_pa, lure_agp, + has_aspen + ) - terms_i <- attr(m_pa[[i]]$terms, "term.labels") - cover <- colSums(d_p[, terms_i, drop = FALSE]) - # pAspen is not cover; v2's south leaves it out of the sum - # (the north has none) - cover <- cover[ - !names(cover) %in% c("Climate", "seas_days", "pAspen") - ] - - if ((nrow(d_p) - sum(cover)) > 0) { - f <- stats::as.formula(paste( - "p_count_agp ~", paste(setdiff(terms_i, "Climate"), - collapse = " + ") - )) - m_agp[[length(m_agp) + 1]] <- try(stats::glm( - f, data = d_p, family = stats::Gamma(link = "log"), - mustart = agp_start - ), silent = TRUE) - } + # Step 7: Cutblock convergence, north only (6.11) + if (ages) { + spread$mean <- mammal_cutblock_convergence(spread$mean) } - m_agp[[length(m_agp) + 1]] <- try(stats::glm( - p_count_agp ~ seas_days, data = d_p, - family = stats::Gamma(link = "log"), mustart = agp_start - ), silent = TRUE) - - aic_agp <- vapply(m_agp, mammal_aicc, numeric(1)) + # v2 adds Bare and Water at zero to every table (7.1) + coef_agp <- abundance$coef + coef_agp_se <- abundance$se + spread$pa[c("Bare", "Water")] <- 0 + spread$pa_se[c("Bare", "Water")] <- 0 + spread$mean[c("Bare", "Water")] <- 0 + coef_agp[c("Bare", "Water")] <- 0 + coef_agp_se[c("Bare", "Water")] <- 0 - if (!any(is.finite(aic_agp))) { - fail("every abundance model failed") + table_of <- function(values, se = NA_real_) { + data.frame( + term = names(values), estimate = unname(values), + se = if (length(se) == length(values)) unname(se) else NA_real_, + stringsAsFactors = FALSE + ) } - agp <- m_agp[[which.min(aic_agp)]] + presence_table <- table_of(spread$pa, spread$pa_se) - # Step 3: Presence effects, one category at a time (6.3) - terms_pa <- c(attr(pa$terms, "term.labels"), - intercept_cats[best_pa]) - held <- c("seas_days", "Climate", if (has_aspen) "pAspen") - constants <- list(seas_days = 100, Climate = 0) - if (has_aspen) constants$pAspen <- 0 + selected$coefficients <- presence_table + selected$outputs <- list( + presence = presence_table, + abundance = table_of(coef_agp, coef_agp_se), + total = table_of(spread$mean) + ) + + selected +} + +## 4.2 mammal_presence_effects() ---- + +#' Presence per Habitat Category, Calibrated (v2 6.3) +#' +#' Every one-hot row is read at seas_days = 100, Climate = 0 and +#' pAspen = 0, including the rows for those terms themselves, as +#' v2's duplicated data-frame columns make it. The level is then +#' shifted on the logit scale so mean fitted presence matches mean +#' observed; Climate is a slope and keeps its own coefficient. +#' +#' @param pa The presence GLM. +#' @param data The stage's data. +#' @param reference Character. The category the winning presence +#' candidate leaves out. +#' @param lure_pa Numeric. The presence lure ratio. +#' @param has_aspen Logical. +#' @return A list of `coef` and `se` (named by term), `terms`, and +#' `at_constants` (the data at v2's held values). +#' +#' @example # Example usage of the function +#' # mammal_presence_effects(pa, d, "Shrub", 1.4, FALSE) +mammal_presence_effects <- function(pa, data, reference, lure_pa, + has_aspen) { + count <- data$response_raw + terms_pa <- c(attr(pa$terms, "term.labels"), reference) + constants <- mammal_held_constants(has_aspen) + held <- names(constants) - # Every one-hot row is read at seas_days = 100, Climate = 0 and - # pAspen = 0, including the rows for those terms themselves, - # as v2's duplicated data-frame columns make it pa_link <- vapply(terms_pa, function(term) { onehot <- stats::setNames( as.list(as.numeric(terms_pa == term)), terms_pa @@ -281,13 +321,6 @@ select_mammal_v2_hurdle <- function( coef_pa[["Climate"]] <- stats::plogis(stats::coef(pa)[["Climate"]]) climate_se <- coef_pa_se[["Climate"]] - # The pAspen slope, added back in the calibration (south) - paspen_pa <- if ("pAspen" %in% names(stats::coef(pa))) { - stats::coef(pa)[["pAspen"]] - } else { - 0 - } - # Calibrate the level: mean fitted presence to mean observed at_constants <- data at_constants$seas_days <- 100 @@ -305,119 +338,170 @@ select_mammal_v2_hurdle <- function( coef_pa[["Climate"]] <- climate_pa coef_pa_se[["Climate"]] <- climate_se - # Site-level logits: the age splines' offset - data$p <- stats::predict(pa, newdata = data) + list( + coef = coef_pa, se = coef_pa_se, terms = terms_pa, + at_constants = at_constants + ) +} + +## 4.3 mammal_abundance_effects() ---- - # Step 4: Abundance effects on the prediction matrix (6.4) - pm <- grid - newdata <- pm +#' Abundance Given Presence on the Prediction Matrix (v2 6.4) +#' +#' @param agp The abundance GLM. +#' @param grid The prediction matrix. +#' @param has_aspen Logical. +#' @return A list of `coef` and `se`, on the response scale, with +#' Climate first at 1 (no effect on abundance). +#' +#' @example # Example usage of the function +#' # mammal_abundance_effects(agp, pm, FALSE) +mammal_abundance_effects <- function(agp, grid, has_aspen) { + constants <- mammal_held_constants(has_aspen) + newdata <- grid for (one in names(constants)) newdata[[one]] <- constants[[one]] agp_pred <- stats::predict(agp, newdata = newdata, se.fit = TRUE) - t_mean_agp <- stats::setNames(as.numeric(agp_pred$fit), rownames(pm)) - t_se_agp <- stats::setNames(as.numeric(agp_pred$se.fit), rownames(pm)) + t_mean_agp <- stats::setNames( + as.numeric(agp_pred$fit), rownames(grid) + ) + t_se_agp <- stats::setNames( + as.numeric(agp_pred$se.fit), rownames(grid) + ) - paspen_agp <- if ("pAspen" %in% names(stats::coef(agp))) { - stats::coef(agp)[["pAspen"]] - } else { - 0 - } + list( + coef = c(Climate = 1, exp(t_mean_agp)), + se = c(Climate = 0, t_se_agp) + ) +} - coef_agp <- c(Climate = 1, exp(t_mean_agp)) - coef_agp_se <- c(Climate = 0, t_se_agp) +## 4.4 mammal_age_splines() ---- - # Step 5: Stand-age splines, north only (6.5) +#' Presence by Stand Age, from v2's Splines (v2 6.5) +#' +#' One frame per stand type from units where an age class covers +#' more than 10%, a binomial GAM on sqrt(age) with the site-level +#' presence logit as offset, used where it beats the +#' intercept-only model by AICc weight. +#' +#' @param data The stage's data, with `p`, the site-level logits. +#' @param coef_pa Named numeric. Calibrated presence per term. +#' @param terms_pa Character. The presence terms. +#' @return A list of `p_age` and `p_age_se`, per term that took a +#' spline: nine values, R and 1 to 8. +#' +#' @example # Example usage of the function +#' # mammal_age_splines(d, coef_pa, names(coef_pa)) +mammal_age_splines <- function(data, coef_pa, terms_pa) { stand_types <- c("Spruce", "Pine", "Decid", "Mixedwood", "TreedBog") + seas_wt <- data$weight p_age <- p_age_se <- list() - - if (ages) { - stand <- stats::setNames(vector("list", 5), stand_types) - - for (i in 0:8) { - label <- if (i == 0) "R" else i - age <- if (i == 0) 0.5 else i - - for (type in stand_types) { - column <- paste0(type, label) - if (!column %in% names(data)) next - rows <- which(data[[column]] > 0.1) - if (length(rows) == 0) next - - stand[[type]] <- rbind(stand[[type]], data.frame( - p_count = data$p_count_pa[rows], age = age, - wt1 = data[[column]][rows] * seas_wt[rows], - p = data$p[rows] - )) - } + stand <- stats::setNames(vector("list", 5), stand_types) + + for (i in 0:8) { + label <- if (i == 0) "R" else i + age <- if (i == 0) 0.5 else i + + for (type in stand_types) { + column <- paste0(type, label) + if (!column %in% names(data)) next + rows <- which(data[[column]] > 0.1) + if (length(rows) == 0) next + + stand[[type]] <- rbind(stand[[type]], data.frame( + p_count = data$response[rows], age = age, + wt1 = data[[column]][rows] * seas_wt[rows], + p = data$p[rows] + )) } + } - frames <- c(stand, list( - UpCon = rbind(stand$Spruce, stand$Pine), - DecidMixed = rbind(stand$Decid, stand$Mixedwood), - TreedAll = do.call(rbind, stand) + frames <- c(stand, list( + UpCon = rbind(stand$Spruce, stand$Pine), + DecidMixed = rbind(stand$Decid, stand$Mixedwood), + TreedAll = do.call(rbind, stand) + )) + + fit_gam <- function(df, spline) { + f <- if (spline) { + p_count ~ s(sqrt(age), k = 4, m = 2) + offset(p) + } else { + p_count ~ 1 + offset(p) + } + suppressWarnings(mgcv::gam( + f, data = df, family = "binomial", weights = df$wt1 )) + } - fit_gam <- function(df, spline) { - f <- if (spline) { - p_count ~ s(sqrt(age), k = 4, m = 2) + offset(p) - } else { - p_count ~ 1 + offset(p) - } - suppressWarnings(mgcv::gam( - f, data = df, family = "binomial", weights = df$wt1 - )) + null_age <- lapply(frames, fit_gam, spline = FALSE) + spline_age <- lapply(seq_along(frames), function(i) { + if (sum(sign(frames[[i]]$p_count)) > 4) { + fit_gam(frames[[i]], TRUE) + } else { + null_age[[i]] } + }) + names(spline_age) <- names(frames) + + # The spline is used where it beats the null by AICc weight + spline_weight <- vapply(names(frames), function(nm) { + q <- c(mammal_aicc(spline_age[[nm]]), mammal_aicc(null_age[[nm]])) + q <- q - min(q) + exp(-0.5 * q[1]) / sum(exp(-0.5 * q)) + }, numeric(1)) + + age_map <- list( + Spruce = "Spruce", Pine = "Pine", Decid = "Decid", + Mixedwood = "Mixedwood", TreedBog = "TreedBog", + TreedWet = "TreedBog", UpCon = "UpCon", + DecidMixed = "DecidMixed", UplandForest = "TreedAll", + TreedAll = "TreedAll" + ) - null_age <- lapply(frames, fit_gam, spline = FALSE) - spline_age <- lapply(seq_along(frames), function(i) { - if (sum(sign(frames[[i]]$p_count)) > 4) { - fit_gam(frames[[i]], TRUE) - } else { - null_age[[i]] - } - }) - names(spline_age) <- names(frames) - - # The spline is used where it beats the null by AICc weight - spline_weight <- vapply(names(frames), function(nm) { - q <- c(mammal_aicc(spline_age[[nm]]), mammal_aicc(null_age[[nm]])) - q <- q - min(q) - exp(-0.5 * q[1]) / sum(exp(-0.5 * q)) - }, numeric(1)) - - age_map <- list( - Spruce = "Spruce", Pine = "Pine", Decid = "Decid", - Mixedwood = "Mixedwood", TreedBog = "TreedBog", - TreedWet = "TreedBog", UpCon = "UpCon", - DecidMixed = "DecidMixed", UplandForest = "TreedAll", - TreedAll = "TreedAll" - ) + smooth <- function(y) { + c(mean(y[1:2]), y[2:4], mean(y[4:6]), mean(y[5:7]), + mean(y[6:8]), mean(y[7:9]), mean(y[8:9])) + } - smooth <- function(y) { - c(mean(y[1:2]), y[2:4], mean(y[4:6]), mean(y[5:7]), - mean(y[6:8]), mean(y[7:9]), mean(y[8:9])) - } + for (term in names(age_map)) { + model_key <- age_map[[term]] + if (!term %in% terms_pa) next + if (spline_weight[[model_key]] <= 0.5) next - for (term in names(age_map)) { - model_key <- age_map[[term]] - if (!term %in% terms_pa) next - if (spline_weight[[model_key]] <= 0.5) next - - predicted <- stats::predict( - spline_age[[model_key]], - newdata = data.frame( - age = c(0.5, 1:8), p = stats::qlogis(coef_pa[[term]]) - ), - se.fit = TRUE - ) - p_age[[term]] <- smooth(stats::plogis(as.numeric(predicted$fit))) - p_age_se[[term]] <- smooth(as.numeric(predicted$se.fit)) - } + predicted <- stats::predict( + spline_age[[model_key]], + newdata = data.frame( + age = c(0.5, 1:8), p = stats::qlogis(coef_pa[[term]]) + ), + se.fit = TRUE + ) + p_age[[term]] <- smooth(stats::plogis(as.numeric(predicted$fit))) + p_age_se[[term]] <- smooth(as.numeric(predicted$se.fit)) } - # Step 6: Spread each category over its fine types (6.5) + list(p_age = p_age, p_age_se = p_age_se) +} + +## 4.5 mammal_spread() ---- + +#' Spread Each Category over Its Fine Types (v2 6.5) +#' +#' @param presence A mammal_presence_effects() result. +#' @param coef_agp Named numeric. Abundance per fine type. +#' @param aged A mammal_age_splines() result. +#' @param grid The prediction matrix. +#' @param ages Logical. Whether the region has stand ages. +#' @return A list of `pa`, `pa_se` and `mean` (presence times +#' abundance), each named by fine type. +#' +#' @example # Example usage of the function +#' # mammal_spread(presence, coef_agp, aged, pm, TRUE) +mammal_spread <- function(presence, coef_agp, aged, grid, ages) { + stand_types <- c("Spruce", "Pine", "Decid", "Mixedwood", "TreedBog") + coef_pa <- presence$coef + coef_pa_se <- presence$se out_pa <- out_pa_se <- out_mean <- numeric(0) - terms_pa1 <- setdiff(terms_pa, c("seas_days", "pAspen")) + terms_pa1 <- setdiff(presence$terms, c("seas_days", "pAspen")) put <- function(names_in, pa_values, pa_se, agp_value) { out_pa[names_in] <<- pa_values @@ -431,17 +515,22 @@ select_mammal_v2_hurdle <- function( next } - if (!term %in% names(pm)) next - fine_types <- rownames(pm)[pm[[term]] == 1] + if (!term %in% names(grid)) next + fine_types <- rownames(grid)[grid[[term]] == 1] for (fine in fine_types) { - agp_value <- if (fine %in% names(coef_agp)) coef_agp[[fine]] else 0 + agp_value <- if (fine %in% names(coef_agp)) { + coef_agp[[fine]] + } else { + 0 + } if (ages && fine %in% stand_types) { age_names <- paste0(fine, c("R", 1:8)) - if (!is.null(p_age[[term]])) { - put(age_names, p_age[[term]], p_age_se[[term]], agp_value) + if (!is.null(aged$p_age[[term]])) { + put(age_names, aged$p_age[[term]], aged$p_age_se[[term]], + agp_value) } else { put(age_names, rep(coef_pa[[term]], 9), rep(coef_pa_se[[term]], 9), agp_value) @@ -452,94 +541,120 @@ select_mammal_v2_hurdle <- function( } } - # v2's Mule Deer adjustment: old pine, and in winter old - # deciduous, stands are pulled toward the 100-119 class + list(pa = out_pa, pa_se = out_pa_se, mean = out_mean) +} + +## 4.6 mammal_mule_deer() ---- + +#' v2's Mule Deer Adjustment to Old Stands +#' +#' Old pine, and in winter old deciduous, stands are pulled +#' toward the 100-119 class. +#' +#' @param out_mean Named numeric. Total abundance per fine type. +#' @param species Character. The harness species name. +#' @return `out_mean`, adjusted for Mule Deer and unchanged +#' otherwise. +#' +#' @example # Example usage of the function +#' # mammal_mule_deer(out_mean, "MuleDeer_Winter") +mammal_mule_deer <- function(out_mean, species) { base_species <- sub("_(Summer|Winter)$", "", species) - if (identical(base_species, "MuleDeer")) { - types <- c("Pine", if (grepl("_Winter$", species)) "Decid") - for (type in types) { - old <- paste0(type, c("7", "8")) - ref <- paste0(type, "6") - if (all(c(old, ref) %in% names(out_mean))) { - out_mean[old] <- (out_mean[old] + out_mean[[ref]]) / 2 - } + if (!identical(base_species, "MuleDeer")) { + return(out_mean) + } + + types <- c("Pine", if (grepl("_Winter$", species)) "Decid") + + for (type in types) { + old <- paste0(type, c("7", "8")) + ref <- paste0(type, "6") + if (all(c(old, ref) %in% names(out_mean))) { + out_mean[old] <- (out_mean[old] + out_mean[[ref]]) / 2 } } - # Step 7: Calibrate total abundance to the observed mean (6.6) + out_mean +} + +## 4.7 mammal_total_calibration() ---- + +#' The Factor That Calibrates Total Abundance (v2 6.6) +#' +#' Mean observed lure-corrected count over mean predicted +#' presence times abundance, both at v2's held values with the +#' pAspen slopes added back. +#' +#' @param pa,agp The presence and abundance GLMs. +#' @param data The stage's data. +#' @param at_constants The data at v2's held values. +#' @param lure_pa,lure_agp Numeric. The two lure ratios. +#' @param has_aspen Logical. +#' @return A number. +#' +#' @example # Example usage of the function +#' # mammal_total_calibration(pa, agp, d, at, 1.4, 1.1, FALSE) +mammal_total_calibration <- function(pa, agp, data, at_constants, + lure_pa, lure_agp, has_aspen) { + slope <- function(model) { + if ("pAspen" %in% names(stats::coef(model))) { + stats::coef(model)[["pAspen"]] + } else { + 0 + } + } + aspen <- if (has_aspen) data$pAspen else 0 + count <- data$response_raw + t_p_pa <- stats::plogis( - stats::predict(pa, newdata = at_constants) + - paspen_pa * (if (has_aspen) data$pAspen else 0) + stats::predict(pa, newdata = at_constants) + slope(pa) * aspen ) t_p_agp <- stats::predict(agp, newdata = at_constants) + - paspen_agp * (if (has_aspen) data$pAspen else 0) + slope(agp) * aspen p_obs_total <- ifelse( data$lured == "Yes", count / (lure_pa * lure_agp), count ) - out_mean <- out_mean * - (mean(p_obs_total) / mean(t_p_pa * exp(t_p_agp))) - # Step 8: Cutblock convergence, north only (6.11) - if (ages) { - # The same recovery weights as the plant pipeline - recovery <- cutblock_recovery_weights() - convergence <- list( - CCSpruce = list("Spruce", recovery$conifer), - CCPine = list("Pine", recovery$conifer), - CCMixedwood = list("Mixedwood", recovery$deciduous), - CCDecid = list("Decid", recovery$deciduous) - ) + mean(p_obs_total) / mean(t_p_pa * exp(t_p_agp)) +} - for (cc in names(convergence)) { - for (k in 1:3) { - age <- k + 1 - w <- convergence[[cc]][[2]][k] - cc_name <- paste0(cc, age) - natural <- paste0(convergence[[cc]][[1]], age) +## 4.8 mammal_cutblock_convergence() ---- - if (all(c(cc_name, natural) %in% names(out_mean))) { - out_mean[[cc_name]] <- out_mean[[cc_name]] * (1 - w) + - out_mean[[natural]] * w - } - } - } - } +#' Converge Young Cutblocks onto Natural Stands (v2 6.11) +#' +#' The same recovery weights as the plant pipeline, applied to +#' age classes 2 to 4. +#' +#' @param out_mean Named numeric. Total abundance per fine type. +#' @return `out_mean`, converged. +#' +#' @example # Example usage of the function +#' # mammal_cutblock_convergence(out_mean) +mammal_cutblock_convergence <- function(out_mean) { + recovery <- cutblock_recovery_weights() + convergence <- list( + CCSpruce = list("Spruce", recovery$conifer), + CCPine = list("Pine", recovery$conifer), + CCMixedwood = list("Mixedwood", recovery$deciduous), + CCDecid = list("Decid", recovery$deciduous) + ) - # v2 adds Bare and Water at zero to every table (7.1) - out_pa[c("Bare", "Water")] <- 0 - out_pa_se[c("Bare", "Water")] <- 0 - out_mean[c("Bare", "Water")] <- 0 - coef_agp[c("Bare", "Water")] <- 0 - coef_agp_se[c("Bare", "Water")] <- 0 + for (cc in names(convergence)) { + for (k in 1:3) { + age <- k + 1 + w <- convergence[[cc]][[2]][k] + cc_name <- paste0(cc, age) + natural <- paste0(convergence[[cc]][[1]], age) - table_of <- function(values, se = NA_real_) { - data.frame( - term = names(values), estimate = unname(values), - se = if (length(se) == length(values)) unname(se) else NA_real_, - stringsAsFactors = FALSE - ) + if (all(c(cc_name, natural) %in% names(out_mean))) { + out_mean[[cc_name]] <- out_mean[[cc_name]] * (1 - w) + + out_mean[[natural]] * w + } + } } - presence <- table_of(out_pa, out_pa_se) - abundance <- table_of(coef_agp, coef_agp_se) - - result <- selection_result( - fit = list(fit = pa, ok = TRUE, message = NA_character_), - coefficients = presence, - ic_table = data.frame( - model = paste0("pa_", seq_along(aic_pa)), ic = aic_pa, - ok = is.finite(aic_pa), stringsAsFactors = FALSE - ) - ) - - result$outputs <- list( - presence = presence, - abundance = abundance, - total = table_of(out_mean) - ) - - result + out_mean } # End of script ---- diff --git a/1_code/modules/mammals/spec.R b/1_code/modules/mammals/spec.R index c1d854f..527d10b 100644 --- a/1_code/modules/mammals/spec.R +++ b/1_code/modules/mammals/spec.R @@ -28,6 +28,11 @@ # - Weights are season days. The season a species is modelled # in is part of its name, so the weight column follows the # species rather than the taxon. +# - The habitat stage is the generic `hurdle` rule with v2's +# GLMs, and v2's table-building as a post_process step +# (hurdle.R). It has the same shape as the plant habitat +# stage, so replace_stage_method() swaps its engine for both +# halves of the hurdle. # --- # 1. Setup ---- @@ -150,6 +155,13 @@ mammal_agp_response <- function(values, frame) { #' Build the v2 Spec for Mammals #' +#' The habitat stage is v2's hurdle: presence, then abundance +#' given presence, fitted by the generic `hurdle` rule with v2's +#' GLMs and best-by-AICc selection, then turned into v2's three +#' tables by mammal_v2_habitat_tables() (hurdle.R). A methods +#' experiment swaps the engine for both halves with one +#' replace_stage_method() call, as for any taxon. +#' #' @param climate_source Character. "precomputed", the v2 #' default, reads each species' climate prediction from #' mammal_climate_predictions.csv and drops the deployments @@ -160,46 +172,18 @@ mammal_agp_response <- function(values, frame) { #' @param tier Character. "modelled" is the full habitat model, #' fitted for species with at least 20 detections; "ua" is the #' use-availability model, at least 3. -#' @param part Character. "hurdle", v2's model, fits both halves -#' together (hurdle.R) and reports presence, abundance and -#' total abundance on v2's full habitat set, with the stand-age -#' splines and cutblock convergence. "presence" and -#' "abundance" fit one half alone with the harness's generic -#' rules and report the winning model's own categories. #' @return A spec list, as run_spec() consumes. #' #' @example # Example usage of the function #' # spec <- mammal_spec() -#' # spec <- mammal_spec(climate_source = "fitted", -#' # part = "presence") +#' # spec <- mammal_spec(climate_source = "fitted") mammal_spec <- function( climate_source = c("precomputed", "fitted"), season = c("summer", "winter"), - tier = "modelled", - part = c("hurdle", "presence", "abundance") + tier = "modelled" ) { climate_source <- match.arg(climate_source) season <- match.arg(season) - part <- match.arg(part) - hurdle <- part == "hurdle" - - # The abundance half fits the same candidates with Climate - # dropped - v2's note is that climate effects on abundance - # given presence are minimal - plus a null carrying only - # sampling effort. - habitat_models <- function(set) { - models <- get_model_set(set) - - # The hurdle rule derives its abundance candidates itself - if (part %in% c("presence", "hurdle")) { - return(models) - } - - c( - gsub(" \\+ Climate", "", models), - ". ~ . + seas_days" - ) - } stages <- list() @@ -214,10 +198,9 @@ mammal_spec <- function( selection = "aic_average", ic = "AICc", carry_as = "Climate", - # Climate is modelled on presence whichever half of the - # hurdle is being fitted: the abundance half takes the - # same climate offset, and fitting a binomial on counts - # would fail outright. + # Climate is modelled on presence: the abundance half + # takes the same climate term, and fitting a binomial on + # counts would fail outright. response_transform = mammal_pa_response ) ) @@ -226,15 +209,12 @@ mammal_spec <- function( list( taxon = "mammal", response_name = "response", + # The stage a methods experiment replaces by default + habitat_stage = "habitat", - # v2 models presence rather than the recorded density. The - # hurdle rule recomputes both halves' responses from the raw - # count itself. - response_transform = if (part == "abundance") { - mammal_agp_response - } else { - mammal_pa_response - }, + # v2 models presence rather than the recorded density; the + # abundance half reads the raw count (see the habitat stage). + response_transform = mammal_pa_response, # v2 reads climate from a separate pipeline's prediction species_frame = if (climate_source == "precomputed") { @@ -272,17 +252,13 @@ mammal_spec <- function( grid_drop_rows = c("WetlandMargin", "Climate"), grid_drop_cols = "WetlandMargin", term_block = "veg", - habitat_models = habitat_models("habitat_mammal_north_pa_v2"), + habitat_models = "habitat_mammal_north_pa_v2", intercept_cats = "intercept_mammal_north_pa_v2", - # The stand-age splines read the aged cover columns - extra_covariates = if (hurdle) { - as.vector(t(outer( - c("Spruce", "Pine", "Decid", "Mixedwood", "TreedBog"), - c("R", 1:8), paste0 - ))) - } else { - NULL - } + # The v2 stand-age splines read the aged cover columns + extra_covariates = as.vector(t(outer( + c("Spruce", "Pine", "Decid", "Mixedwood", "TreedBog"), + c("R", 1:8), paste0 + ))) ), south = list( # The south drops all-water deployments instead @@ -295,77 +271,47 @@ mammal_spec <- function( grid_drop_rows = "Climate", term_block = "soil", # v2's 30 south candidates, from south-models/00_models.R - habitat_models = habitat_models("habitat_mammal_south_pa_v2"), + habitat_models = "habitat_mammal_south_pa_v2", intercept_cats = "intercept_mammal_south_pa_v2", # Half the south candidates carry pAspen. Like sampling - # effort, it is held fixed for the one-hot predictions - # rather than read as a habitat type. + # effort, it is held fixed on the grid rather than read + # as a habitat type, and it is not cover. constants = list(seas_days = 100, Climate = 0, pAspen = 0) ) ), stages = c(stages, list( - if (hurdle) { - list( - name = "habitat", - models = NULL, - engine = "glm", - # Both halves of v2's hurdle together; see hurdle.R. - # Writes stages habitat_presence, habitat_abundance and - # habitat_total. - selection = select_mammal_v2_hurdle, - ic = "AICc", - carry_from = "climate", - carry_from_as = "Climate", - # The grid prediction reads each habitat type at v2's - # 100 sampling days and zero climate, as its one-hot - # effects are read. Not passed to the hurdle itself. - grid_constants = list(seas_days = 100, Climate = 0) - ) - } else if (part == "presence") { - list( - name = "habitat", - models = NULL, - engine = "glm", - selection = "aic_best_onehot", - ic = "AICc", - carry_from = "climate", - carry_from_as = "Climate", - # Each candidate leaves one land cover out; the rule - # reports it, because every other effect is relative - # to it. Set per region, with the region's models. - constants = list(seas_days = 100, Climate = 0), - slope_terms = "Climate", - # v2 shifts the whole set on the logit scale so mean - # fitted presence matches mean observed. Without it - # the effects are internally consistent but sit at - # the wrong level. - calibrate = TRUE - ) - } else { - list( - name = "habitat", - models = NULL, - engine = "glm", - selection = "aic_best_grid", - ic = "AICc", - # Gamma on the log scale. mustart is set to the mean - # rather than left at the default of y itself, which - # spans orders of magnitude for a right-skewed density - # and sends the fitting algorithm off. - family = stats::Gamma(link = "log"), - control = list(), - # Abundance given presence is undefined where there - # was no presence. - row_filter = function(d) d$response > 0, - constants = list(seas_days = 100, Climate = 0), - # Coef.agp.all is stored on the response scale - - # abundance, not log abundance - despite the source - # comment describing it as raw log-scale predictions. - # Its published range runs 0 to 10.4. - scale = "response" - ) - } + list( + name = "habitat", + models = NULL, + engine = "glm", + # Presence, then abundance given presence, each the best + # of its candidates by AICc. See + # methods/selection/hurdle.R. + selection = "hurdle", + part_selection = "aic_best", + ic = "AICc", + carry_from = "climate", + carry_from_as = "Climate", + # The presence response, recomputed on each draw because + # the lure ratio and scaling depend on which units are in + response_transform = mammal_pa_response, + # Abundance given presence: the lure-corrected count, + # winsorized, on a log-link Gamma, unweighted, without + # Climate, plus an effort-only null - all as v2 + abundance_response = mammal_agp_response, + abundance_family = stats::Gamma(link = "log"), + abundance_drop = "Climate", + abundance_null = ". ~ . + seas_days", + abundance_weighted = FALSE, + # Each habitat type is read at v2's 100 sampling days and + # zero climate + grid_constants = list(seas_days = 100, Climate = 0), + # v2's own tables from the two GLMs: the full habitat + # set, calibration, stand-age splines, Mule Deer and + # cutblock convergence. Removed by replace_stage_method(). + post_process = list(mammal_v2_habitat_tables) + ) )), resample = list( @@ -377,7 +323,6 @@ mammal_spec <- function( ), climate_source = climate_source, - part = part, # What this spec reproduces of v2, per stage. The single # source of truth for coverage: the report reads it. @@ -400,25 +345,15 @@ mammal_spec <- function( ) ) }, - habitat = if (hurdle) { - v2_status( - "reproduced", - paste( - "v2's hurdle: presence, abundance and total abundance", - "on the full habitat set, with the stand-age splines,", - "calibration and cutblock convergence. Matches v2's", - "published tables to 2e-14, north and south." - ) - ) - } else { - v2_status( - "partial", - paste( - "One half of the hurdle alone, reporting the winning", - "model's own categories; use part = \"hurdle\" for v2." - ) + habitat = v2_status( + "reproduced", + paste( + "v2's hurdle: presence, abundance and total abundance", + "on the full habitat set, with the stand-age splines,", + "calibration and cutblock convergence. Matches v2's", + "published tables to 2e-14, north and south." ) - }, + ), resampling = v2_status( "partial", paste( @@ -444,8 +379,7 @@ mammal_spec <- function( } else { "Climate read from v2's precomputed predictions." }, - " Season: ", season, ". Hurdle part: ", part, - ". Tier: ", tier, "." + " Season: ", season, ". Tier: ", tier, "." ) ) } diff --git a/1_code/tests/testthat/test-methods.R b/1_code/tests/testthat/test-methods.R index d5e2039..a6bdc85 100644 --- a/1_code/tests/testthat/test-methods.R +++ b/1_code/tests/testthat/test-methods.R @@ -15,11 +15,11 @@ test_that("every registered engine passes check_engine()", { test_that("the v2 methods are all registered", { expect_true(all( - c("glm", "bayesglm", "gbm") %in% registered_names("engine") + c("glm", "bayesglm", "xgboost") %in% registered_names("engine") )) expect_true(all(c( "single", "aic_best", "aic_average", "staged_bic", "ivw_grid", - "aic_best_grid", "aic_best_onehot" + "hurdle" ) %in% registered_names("selection"))) expect_true(all(c("precomputed", "spatial_block", "spatial_cv") %in% registered_names("resampler"))) diff --git a/1_code/tests/testthat/test-specs.R b/1_code/tests/testthat/test-specs.R index f8bb906..a21da9e 100644 --- a/1_code/tests/testthat/test-specs.R +++ b/1_code/tests/testthat/test-specs.R @@ -10,6 +10,69 @@ test_that("every standard spec validates", { )) }) +test_that("one call swaps the habitat method of every run", { + specs <- lapply( + standard_specs(), replace_stage_method, engine = "xgboost" + ) + + for (key in names(specs)) { + expect_silent(validate_spec(specs[[key]])) + } + + # The mammal hurdle keeps its structure; both halves take the + # new engine, and v2's GLM table-building is removed with them + habitat <- specs$mammal_summer$stages[[1]] + expect_equal(habitat$selection, "hurdle") + expect_equal(habitat$part_selection, "single") + expect_equal(habitat$engine, "xgboost") + expect_null(habitat$post_process) + expect_equal(specs$bird$stages[[2]]$engine, "xgboost") +}) + +test_that("a hurdle's inner rule is checked against its engine", { + spec <- replace_stage_method( + mammal_spec(), engine = "xgboost", selection = "aic_best" + ) + + expect_error(validate_spec(spec), "inner rule `aic_best` needs") +}) + +test_that("the hurdle fits both halves with any engine", { + set.seed(1) + n <- 300 + data <- data.frame( + x = stats::runif(n), cover = stats::rbinom(n, 1, 0.5), + seas_days = 100 + ) + data$response_raw <- stats::rbinom(n, 1, 0.4) * + stats::rgamma(n, 2, 1) + data$response <- sign(data$response_raw) + grid <- data.frame(cover = c(0, 1), row.names = c("A", "B")) + + for (engine in c("glm", "xgboost")) { + selected <- selection_run( + "hurdle", list(stats::as.formula(". ~ . + x + cover")), + response ~ 1, data, get_engine(engine), "binomial", + grid = grid, + constants = list(x = 0.5), + # seas_days is constant here, so the effort-only null + # candidate would be rank-deficient + abundance_null = NULL, + part_selection = if (engine == "glm") "aic_best" else "single" + ) + + expect_named( + selected$outputs, c("presence", "abundance", "total") + ) + expect_equal( + selected$outputs$total$estimate, + selected$outputs$presence$estimate * + selected$outputs$abundance$estimate + ) + expect_length(selected$predict(data, "response"), n) + } +}) + test_that("a misspelt field is reported, not ignored", { spec <- bird_spec() spec$stages[[2]]$selction <- "staged_bic" diff --git a/3_output/exp_001_gbm/run_record.md b/3_output/exp_001_gbm/run_record.md deleted file mode 100644 index f63a59e..0000000 --- a/3_output/exp_001_gbm/run_record.md +++ /dev/null @@ -1,193 +0,0 @@ -# Run record: exp_001_gbm - -Written by `run_record()`. The result stores this describes are gitignored; this file is what remains. - -## Provenance - -_Volatile. Excluded from cross-run comparison._ - -- **git_commit**: 2b72a2b -- **pipeline_dir**: D:/local_projects/active/sdmMethodsDev/2_pipeline/exp_001_gbm -- **r_version**: 4.5.0 -- **written_at**: 2026-10-05 11:05:10 - -## Configuration - -- **boot_seed**: 20260909.0000 -- **changes_from_v2**: bryophyte: habitat <- gbm with `single`, on every covariate the v2 candidates use, lichen: habitat <- gbm with `single`, on every covariate the v2 candidates use, mite: habitat <- gbm with `single`, on every covariate the v2 candidates use, vascular_plant: habitat <- gbm with `single`, on every covariate the v2 candidates use, bird: landcover <- gbm with `single`, on every covariate the v2 candidates use -- **compared_with**: exp_000_parity_v2 -- **covariate_files**: none -- **data_dir**: test_dataset -- **engines**: bayesglm, gbm, glm -- **focal_species**: bird=AMRO, bird=YEWA, bryophyte=Bryum.All, bryophyte=Ceratodon.purpureus, lichen=Cladonia.chlorophaea, lichen=Physcia.adscendens, mammal=Coyote_Summer, mammal=Coyote_Winter, mammal=Moose_Summer, mammal=Moose_Winter, mite=Ceratozetes.gracilis, mite=Trhypochthonius.tectorum, vascular_plant=Galium.boreale, vascular_plant=Vicia.americana -- **jobs_not_ok**: 0 -- **jobs_ok**: 100 -- **jobs_total**: 100 -- **n_bootstraps**: 5 -- **plant_bootstrap**: spatial_block -- **selection**: aic_average, single -- **species_n**: 14 -- **stage_models**: spec defaults (v2 candidate sets) -- **taxa**: bird, bryophyte, lichen, mite, vascular_plant -- **v2_bootstraps**: 100 - -## Coverage - -| taxon | region | species | draws | coefficient_rows | metric_rows | grid_rows | -| --- | --- | --- | --- | --- | --- | --- | -| bird | north | 2 | 5 | 100 | 140 | 890 | -| bird | south | 2 | 5 | 100 | 140 | 170 | -| bryophyte | north | 2 | 5 | 190 | 140 | 430 | -| bryophyte | south | 2 | 5 | 190 | 140 | 160 | -| lichen | north | 2 | 5 | 190 | 140 | 430 | -| lichen | south | 2 | 5 | 190 | 140 | 160 | -| mite | north | 2 | 5 | 190 | 140 | 430 | -| mite | south | 2 | 5 | 190 | 140 | 160 | -| vascular_plant | north | 2 | 5 | 190 | 140 | 430 | -| vascular_plant | south | 2 | 5 | 190 | 140 | 160 | - -## Metrics - -| taxon | region | metric | n | median | p10 | p90 | mean | sd | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| bird | north | insample_auc | 10 | 0.7785 | 0.7489 | 0.8120 | 0.7803 | 0.0313 | -| bird | north | insample_calibration_slope | 10 | 1.0157 | 0.9398 | 1.0902 | 1.0143 | 0.0764 | -| bird | north | insample_deviance_explained | 10 | 0.2513 | 0.1907 | 0.3191 | 0.2536 | 0.0648 | -| bird | north | insample_n | 10 | 46747.0000 | 46744.0000 | 46750.0000 | 46747.6000 | 2.3664 | -| bird | north | insample_prevalence | 10 | 0.1851 | 0.1178 | 0.2520 | 0.1850 | 0.0702 | -| bird | north | insample_rmse | 10 | 0.5699 | 0.4958 | 0.6433 | 0.5696 | 0.0767 | -| bird | north | insample_spearman | 10 | 0.3669 | 0.3497 | 0.3859 | 0.3670 | 0.0184 | -| bird | north | oob_auc | 10 | 0.7577 | 0.7505 | 0.7677 | 0.7588 | 0.0081 | -| bird | north | oob_calibration_slope | 10 | 0.9984 | 0.8836 | 1.0873 | 0.9861 | 0.0985 | -| bird | north | oob_deviance_explained | 10 | 0.2094 | 0.1936 | 0.2312 | 0.2118 | 0.0181 | -| bird | north | oob_n | 10 | 124877.0000 | 124874.0000 | 124880.0000 | 124876.4000 | 2.3664 | -| bird | north | oob_prevalence | 10 | 0.1877 | 0.1343 | 0.2411 | 0.1877 | 0.0561 | -| bird | north | oob_rmse | 10 | 0.5970 | 0.5494 | 0.6433 | 0.5964 | 0.0487 | -| bird | north | oob_spearman | 10 | 0.3491 | 0.3173 | 0.3809 | 0.3491 | 0.0323 | -| bird | south | insample_auc | 10 | 0.7285 | 0.7218 | 0.7332 | 0.7273 | 0.0052 | -| bird | south | insample_calibration_slope | 10 | 1.0529 | 0.9549 | 1.1534 | 1.0555 | 0.1016 | -| bird | south | insample_deviance_explained | 10 | 0.1974 | 0.1381 | 0.2650 | 0.1993 | 0.0635 | -| bird | south | insample_n | 10 | 23761.0000 | 23761.0000 | 23762.0000 | 23761.2000 | 0.4216 | -| bird | south | insample_prevalence | 10 | 0.2140 | 0.1710 | 0.2587 | 0.2147 | 0.0458 | -| bird | south | insample_rmse | 10 | 0.6629 | 0.5920 | 0.7266 | 0.6604 | 0.0674 | -| bird | south | insample_spearman | 10 | 0.3249 | 0.3082 | 0.3425 | 0.3261 | 0.0169 | -| bird | south | oob_auc | 10 | 0.7187 | 0.7120 | 0.7265 | 0.7192 | 0.0064 | -| bird | south | oob_calibration_slope | 10 | 1.0383 | 0.8966 | 1.1462 | 1.0252 | 0.1141 | -| bird | south | oob_deviance_explained | 10 | 0.1766 | 0.1312 | 0.2252 | 0.1776 | 0.0473 | -| bird | south | oob_n | 10 | 67240.0000 | 67239.0000 | 67240.0000 | 67239.8000 | 0.4216 | -| bird | south | oob_prevalence | 10 | 0.2177 | 0.1756 | 0.2603 | 0.2179 | 0.0444 | -| bird | south | oob_rmse | 10 | 0.6723 | 0.6223 | 0.7223 | 0.6723 | 0.0523 | -| bird | south | oob_spearman | 10 | 0.3173 | 0.3034 | 0.3307 | 0.3170 | 0.0130 | -| bryophyte | north | insample_auc | 10 | 0.7086 | 0.6715 | 0.7459 | 0.7084 | 0.0308 | -| bryophyte | north | insample_calibration_slope | 10 | 1.4240 | 1.2679 | 1.6795 | 1.4476 | 0.1675 | -| bryophyte | north | insample_deviance_explained | 10 | 0.0925 | 0.0563 | 0.1338 | 0.0955 | 0.0313 | -| bryophyte | north | insample_n | 10 | 3091.0000 | 3041.1000 | 4852.0000 | 3429.3000 | 750.2771 | -| bryophyte | north | insample_prevalence | 10 | 0.4175 | 0.3976 | 0.4423 | 0.4194 | 0.0223 | -| bryophyte | north | insample_rmse | 10 | 0.4619 | 0.4513 | 0.4702 | 0.4609 | 0.0078 | -| bryophyte | north | insample_spearman | 10 | 0.3563 | 0.2904 | 0.4231 | 0.3562 | 0.0549 | -| bryophyte | north | oob_auc | 8 | 0.6584 | 0.6253 | 0.6892 | 0.6573 | 0.0287 | -| bryophyte | north | oob_calibration_slope | 8 | 0.9836 | 0.9203 | 1.2616 | 1.0484 | 0.2043 | -| bryophyte | north | oob_deviance_explained | 8 | 0.0546 | 0.0335 | 0.0839 | 0.0571 | 0.0233 | -| bryophyte | north | oob_n | 10 | 1761.0000 | 0.0000 | 1810.9000 | 1422.7000 | 750.2771 | -| bryophyte | north | oob_prevalence | 8 | 0.4201 | 0.4007 | 0.4503 | 0.4233 | 0.0233 | -| bryophyte | north | oob_rmse | 8 | 0.4753 | 0.4683 | 0.4789 | 0.4744 | 0.0049 | -| bryophyte | north | oob_spearman | 8 | 0.2708 | 0.2127 | 0.3255 | 0.2692 | 0.0509 | -| bryophyte | south | insample_auc | 10 | 0.7794 | 0.7467 | 0.8338 | 0.7873 | 0.0374 | -| bryophyte | south | insample_calibration_slope | 10 | 1.4260 | 1.2580 | 1.5426 | 1.4072 | 0.1245 | -| bryophyte | south | insample_deviance_explained | 10 | 0.1566 | 0.1188 | 0.2508 | 0.1742 | 0.0546 | -| bryophyte | south | insample_n | 10 | 1454.5000 | 1440.8000 | 2310.0000 | 1623.0000 | 362.3789 | -| bryophyte | south | insample_prevalence | 10 | 0.3052 | 0.2352 | 0.3713 | 0.3043 | 0.0687 | -| bryophyte | south | insample_rmse | 10 | 0.4105 | 0.3644 | 0.4427 | 0.4058 | 0.0377 | -| bryophyte | south | insample_spearman | 10 | 0.4487 | 0.4111 | 0.4920 | 0.4496 | 0.0374 | -| bryophyte | south | oob_auc | 8 | 0.7207 | 0.6806 | 0.7473 | 0.7181 | 0.0294 | -| bryophyte | south | oob_calibration_slope | 8 | 0.9618 | 0.8329 | 1.2123 | 1.0005 | 0.1715 | -| bryophyte | south | oob_deviance_explained | 8 | 0.1044 | 0.0719 | 0.1210 | 0.1000 | 0.0221 | -| bryophyte | south | oob_n | 10 | 855.5000 | 0.0000 | 869.2000 | 687.0000 | 362.3789 | -| bryophyte | south | oob_prevalence | 8 | 0.3139 | 0.2297 | 0.3751 | 0.3071 | 0.0716 | -| bryophyte | south | oob_rmse | 8 | 0.4332 | 0.3943 | 0.4605 | 0.4295 | 0.0315 | -| bryophyte | south | oob_spearman | 8 | 0.3453 | 0.3021 | 0.3715 | 0.3418 | 0.0279 | -| lichen | north | insample_auc | 10 | 0.8493 | 0.8126 | 0.8810 | 0.8475 | 0.0329 | -| lichen | north | insample_calibration_slope | 10 | 1.1590 | 1.1210 | 1.1941 | 1.1576 | 0.0325 | -| lichen | north | insample_deviance_explained | 10 | 0.2945 | 0.2280 | 0.3648 | 0.2963 | 0.0655 | -| lichen | north | insample_n | 10 | 3692.0000 | 3654.0000 | 5811.0000 | 4109.1000 | 897.3877 | -| lichen | north | insample_prevalence | 10 | 0.3839 | 0.3815 | 0.3891 | 0.3840 | 0.0037 | -| lichen | north | insample_rmse | 10 | 0.3910 | 0.3634 | 0.4162 | 0.3903 | 0.0253 | -| lichen | north | insample_spearman | 10 | 0.5882 | 0.5267 | 0.6415 | 0.5854 | 0.0551 | -| lichen | north | oob_auc | 8 | 0.8152 | 0.7659 | 0.8618 | 0.8143 | 0.0472 | -| lichen | north | oob_calibration_slope | 8 | 1.0450 | 0.9951 | 1.0841 | 1.0386 | 0.0452 | -| lichen | north | oob_deviance_explained | 8 | 0.2479 | 0.1757 | 0.3237 | 0.2488 | 0.0737 | -| lichen | north | oob_n | 10 | 2119.0000 | 0.0000 | 2157.0000 | 1701.9000 | 897.3877 | -| lichen | north | oob_prevalence | 8 | 0.3864 | 0.3761 | 0.3921 | 0.3853 | 0.0072 | -| lichen | north | oob_rmse | 8 | 0.4083 | 0.3782 | 0.4346 | 0.4072 | 0.0274 | -| lichen | north | oob_spearman | 8 | 0.5306 | 0.4488 | 0.6079 | 0.5298 | 0.0797 | -| lichen | south | insample_auc | 10 | 0.8956 | 0.8812 | 0.9057 | 0.8967 | 0.0122 | -| lichen | south | insample_calibration_slope | 10 | 1.3200 | 1.1592 | 1.5184 | 1.3383 | 0.1754 | -| lichen | south | insample_deviance_explained | 10 | 0.3397 | 0.2759 | 0.3865 | 0.3309 | 0.0483 | -| lichen | south | insample_n | 10 | 1484.5000 | 1478.5000 | 2346.0000 | 1657.8000 | 362.9370 | -| lichen | south | insample_prevalence | 10 | 0.1511 | 0.0868 | 0.2167 | 0.1525 | 0.0659 | -| lichen | south | insample_rmse | 10 | 0.2859 | 0.2441 | 0.3241 | 0.2854 | 0.0367 | -| lichen | south | insample_spearman | 10 | 0.4770 | 0.3889 | 0.5739 | 0.4802 | 0.0892 | -| lichen | south | oob_auc | 8 | 0.8479 | 0.8283 | 0.8594 | 0.8455 | 0.0183 | -| lichen | south | oob_calibration_slope | 8 | 1.0660 | 0.9709 | 1.2289 | 1.0928 | 0.1204 | -| lichen | south | oob_deviance_explained | 8 | 0.2402 | 0.1839 | 0.2955 | 0.2404 | 0.0553 | -| lichen | south | oob_n | 10 | 861.5000 | 0.0000 | 867.5000 | 688.2000 | 362.9370 | -| lichen | south | oob_prevalence | 8 | 0.1578 | 0.0943 | 0.2207 | 0.1582 | 0.0637 | -| lichen | south | oob_rmse | 8 | 0.3176 | 0.2721 | 0.3469 | 0.3122 | 0.0364 | -| lichen | south | oob_spearman | 8 | 0.4298 | 0.3408 | 0.5167 | 0.4288 | 0.0871 | -| mite | north | insample_auc | 10 | 0.7751 | 0.7246 | 0.8270 | 0.7771 | 0.0501 | -| mite | north | insample_calibration_slope | 10 | 1.3671 | 1.1895 | 1.5446 | 1.3738 | 0.1717 | -| mite | north | insample_deviance_explained | 10 | 0.1492 | 0.0874 | 0.2341 | 0.1586 | 0.0737 | -| mite | north | insample_n | 10 | 3630.0000 | 3598.5000 | 5711.0000 | 4041.0000 | 880.4163 | -| mite | north | insample_prevalence | 10 | 0.1545 | 0.0943 | 0.2113 | 0.1531 | 0.0602 | -| mite | north | insample_rmse | 10 | 0.3190 | 0.2812 | 0.3537 | 0.3185 | 0.0366 | -| mite | north | insample_spearman | 10 | 0.3397 | 0.2336 | 0.4623 | 0.3461 | 0.1176 | -| mite | north | oob_auc | 8 | 0.7280 | 0.6556 | 0.8020 | 0.7272 | 0.0740 | -| mite | north | oob_calibration_slope | 8 | 1.0507 | 1.0138 | 1.0967 | 1.0539 | 0.0425 | -| mite | north | oob_deviance_explained | 8 | 0.1142 | 0.0469 | 0.1936 | 0.1175 | 0.0732 | -| mite | north | oob_n | 10 | 2081.0000 | 0.0000 | 2112.5000 | 1670.0000 | 880.4163 | -| mite | north | oob_prevalence | 8 | 0.1509 | 0.0925 | 0.2048 | 0.1495 | 0.0588 | -| mite | north | oob_rmse | 8 | 0.3244 | 0.2836 | 0.3649 | 0.3242 | 0.0404 | -| mite | north | oob_spearman | 8 | 0.2862 | 0.1567 | 0.4212 | 0.2869 | 0.1352 | -| mite | south | insample_auc | 10 | 0.8847 | 0.8300 | 0.9505 | 0.8859 | 0.0628 | -| mite | south | insample_calibration_slope | 10 | 1.3229 | 1.2157 | 1.6087 | 1.3739 | 0.1840 | -| mite | south | insample_deviance_explained | 10 | 0.3208 | 0.1925 | 0.4704 | 0.3211 | 0.1336 | -| mite | south | insample_n | 10 | 1493.0000 | 1480.9000 | 2363.0000 | 1665.8000 | 367.6444 | -| mite | south | insample_prevalence | 10 | 0.0721 | 0.0556 | 0.0841 | 0.0703 | 0.0144 | -| mite | south | insample_rmse | 10 | 0.2145 | 0.1779 | 0.2555 | 0.2170 | 0.0377 | -| mite | south | insample_spearman | 10 | 0.3358 | 0.3165 | 0.3669 | 0.3365 | 0.0305 | -| mite | south | oob_auc | 8 | 0.8020 | 0.7046 | 0.9029 | 0.8030 | 0.0999 | -| mite | south | oob_calibration_slope | 8 | 0.9625 | 0.6221 | 1.2186 | 0.9225 | 0.2535 | -| mite | south | oob_deviance_explained | 8 | 0.1787 | 0.0568 | 0.3516 | 0.1970 | 0.1340 | -| mite | south | oob_n | 10 | 870.0000 | 0.0000 | 882.1000 | 697.2000 | 367.6444 | -| mite | south | oob_prevalence | 8 | 0.0719 | 0.0489 | 0.0868 | 0.0689 | 0.0174 | -| mite | south | oob_rmse | 8 | 0.2407 | 0.1866 | 0.2748 | 0.2330 | 0.0405 | -| mite | south | oob_spearman | 8 | 0.2440 | 0.1925 | 0.3314 | 0.2567 | 0.0647 | -| vascular_plant | north | insample_auc | 10 | 0.8813 | 0.8662 | 0.8883 | 0.8789 | 0.0088 | -| vascular_plant | north | insample_calibration_slope | 10 | 1.1149 | 1.1050 | 1.1230 | 1.1136 | 0.0114 | -| vascular_plant | north | insample_deviance_explained | 10 | 0.3633 | 0.3325 | 0.3847 | 0.3593 | 0.0209 | -| vascular_plant | north | insample_n | 10 | 4347.5000 | 4314.6000 | 6874.0000 | 4846.9000 | 1068.6395 | -| vascular_plant | north | insample_prevalence | 10 | 0.3951 | 0.3770 | 0.4211 | 0.3974 | 0.0209 | -| vascular_plant | north | insample_rmse | 10 | 0.3673 | 0.3621 | 0.3804 | 0.3692 | 0.0071 | -| vascular_plant | north | insample_spearman | 10 | 0.6425 | 0.6247 | 0.6639 | 0.6418 | 0.0168 | -| vascular_plant | north | oob_auc | 8 | 0.8530 | 0.8434 | 0.8579 | 0.8515 | 0.0066 | -| vascular_plant | north | oob_calibration_slope | 8 | 1.0172 | 1.0024 | 1.0567 | 1.0236 | 0.0239 | -| vascular_plant | north | oob_deviance_explained | 8 | 0.3088 | 0.2858 | 0.3170 | 0.3033 | 0.0140 | -| vascular_plant | north | oob_n | 10 | 2526.5000 | 0.0000 | 2559.4000 | 2027.1000 | 1068.6395 | -| vascular_plant | north | oob_prevalence | 8 | 0.3990 | 0.3725 | 0.4275 | 0.3991 | 0.0248 | -| vascular_plant | north | oob_rmse | 8 | 0.3900 | 0.3851 | 0.3925 | 0.3893 | 0.0040 | -| vascular_plant | north | oob_spearman | 8 | 0.6042 | 0.5762 | 0.6066 | 0.5956 | 0.0143 | -| vascular_plant | south | insample_auc | 10 | 0.9117 | 0.8709 | 0.9501 | 0.9112 | 0.0379 | -| vascular_plant | south | insample_calibration_slope | 10 | 1.1452 | 1.1004 | 1.1789 | 1.1412 | 0.0364 | -| vascular_plant | south | insample_deviance_explained | 10 | 0.4382 | 0.3407 | 0.5528 | 0.4445 | 0.1050 | -| vascular_plant | south | insample_n | 10 | 1688.5000 | 1654.9000 | 2648.0000 | 1869.6000 | 410.6067 | -| vascular_plant | south | insample_prevalence | 10 | 0.2438 | 0.2212 | 0.2654 | 0.2437 | 0.0227 | -| vascular_plant | south | insample_rmse | 10 | 0.3061 | 0.2623 | 0.3412 | 0.3038 | 0.0394 | -| vascular_plant | south | insample_spearman | 10 | 0.6124 | 0.5653 | 0.6498 | 0.6095 | 0.0391 | -| vascular_plant | south | oob_auc | 8 | 0.8853 | 0.8312 | 0.9205 | 0.8792 | 0.0429 | -| vascular_plant | south | oob_calibration_slope | 8 | 1.0210 | 0.9849 | 1.0742 | 1.0266 | 0.0484 | -| vascular_plant | south | oob_deviance_explained | 8 | 0.3656 | 0.2638 | 0.4639 | 0.3647 | 0.0958 | -| vascular_plant | south | oob_n | 10 | 959.5000 | 0.0000 | 993.1000 | 778.4000 | 410.6067 | -| vascular_plant | south | oob_prevalence | 8 | 0.2418 | 0.2131 | 0.2706 | 0.2421 | 0.0259 | -| vascular_plant | south | oob_rmse | 8 | 0.3303 | 0.2915 | 0.3670 | 0.3289 | 0.0371 | -| vascular_plant | south | oob_spearman | 8 | 0.5672 | 0.5040 | 0.6055 | 0.5602 | 0.0470 | - diff --git a/3_output/exp_001_gbm/tables/comparison_grid.csv b/3_output/exp_001_gbm/tables/comparison_grid.csv deleted file mode 100644 index cc4cac7..0000000 --- a/3_output/exp_001_gbm/tables/comparison_grid.csv +++ /dev/null @@ -1,21 +0,0 @@ -taxon,region,season,part,species,grid_units,spearman,median_absolute_difference -bird,north,"","",AMRO,89,0.0772535544017262,0.0081177386175124 -bird,north,"","",YEWA,89,0.813071535610573,0.00763059575407907 -bird,south,"","",AMRO,17,0.639705882352941,0.0109101079212661 -bird,south,"","",YEWA,17,0.588235294117647,0.0371909371224444 -bryophyte,north,"","",Bryum.All,43,0.836465617251074,0.208759687709598 -bryophyte,north,"","",Ceratodon.purpureus,43,0.968594916783979,0.139269421701435 -bryophyte,south,"","",Bryum.All,16,0.852941176470588,0.240861314406181 -bryophyte,south,"","",Ceratodon.purpureus,16,0.764705882352941,0.0680748290852877 -lichen,north,"","",Cladonia.chlorophaea,43,0.883236283901947,0.0282813072574078 -lichen,north,"","",Physcia.adscendens,43,0.769073414652625,0.0833911844222717 -lichen,south,"","",Cladonia.chlorophaea,16,0.802651827768315,0.05023277777865 -lichen,south,"","",Physcia.adscendens,16,0.873529411764706,0.0464462624326966 -mite,north,"","",Ceratozetes.gracilis,43,0.547620379657449,0.0389254504624198 -mite,north,"","",Trhypochthonius.tectorum,43,0.61951833903172,0.0164529779384119 -mite,south,"","",Ceratozetes.gracilis,16,0.811813645078421,0.00708283812455275 -mite,south,"","",Trhypochthonius.tectorum,16,0.399116780413235,0.0117735342880326 -vascular_plant,north,"","",Galium.boreale,43,0.915296613379802,0.03922067085426 -vascular_plant,north,"","",Vicia.americana,43,0.731749820580387,0.084381195074565 -vascular_plant,south,"","",Galium.boreale,16,0.441176470588235,0.0386204129586174 -vascular_plant,south,"","",Vicia.americana,16,0.852941176470588,0.0388860141124145 diff --git a/3_output/exp_001_gbm/tables/comparison_summary.csv b/3_output/exp_001_gbm/tables/comparison_summary.csv deleted file mode 100644 index 583f536..0000000 --- a/3_output/exp_001_gbm/tables/comparison_summary.csv +++ /dev/null @@ -1,51 +0,0 @@ -taxon,region,season,part,metric,species,draws_baseline,draws_candidate,median_baseline,median_candidate,median_difference,share_better -bird,north,"","",oob_auc,2,5,5,0.729484461943779,0.759538559754648,0.0300540978108695,1 -bird,north,"","",oob_calibration_slope,2,5,5,0.774212093974031,0.986978291779158,0.212766197805128,1 -bird,north,"","",oob_deviance_explained,2,5,5,0.165570186112103,0.212707854173374,0.0471376680612715,1 -bird,north,"","",oob_rmse,2,5,5,0.624644013968721,0.596094719866439,-0.0285492941022815,1 -bird,north,"","",oob_spearman,2,5,5,0.3109374709378,0.350020694015218,0.0390832230774185,1 -bird,south,"","",oob_auc,2,5,5,0.702136429854496,0.719479257684166,0.01734282782967,1 -bird,south,"","",oob_calibration_slope,2,5,5,0.903072708091274,1.02177509555914,0.118702387467867,0.5 -bird,south,"","",oob_deviance_explained,2,5,5,0.150457127171694,0.17722885267149,0.026771725499796,1 -bird,south,"","",oob_rmse,2,5,5,0.686946466284977,0.672198696945138,-0.0147477693398386,1 -bird,south,"","",oob_spearman,2,5,5,0.291640797085428,0.317538334874728,0.0258975377893005,1 -bryophyte,north,"","",oob_auc,2,4,4,0.64999737456798,0.653979388217804,0.00398201364982354,0.5 -bryophyte,north,"","",oob_calibration_slope,2,4,4,0.770110822063579,0.97651395150318,0.206403129439601,1 -bryophyte,north,"","",oob_deviance_explained,2,4,4,-0.18848913667322,0.055471025248811,0.243960161922031,1 -bryophyte,north,"","",oob_rmse,2,4,4,0.477685026278507,0.475136280181214,-0.002548746097292,1 -bryophyte,north,"","",oob_spearman,2,4,4,0.256657246933472,0.263757278780134,0.00710003184666148,0.5 -bryophyte,south,"","",oob_auc,2,4,4,0.668840496946664,0.718428769960008,0.049588273013344,1 -bryophyte,south,"","",oob_calibration_slope,2,4,4,0.859428373309233,0.987603558104056,0.128175184794823,1 -bryophyte,south,"","",oob_deviance_explained,2,4,4,0.0095574817283275,0.0986340037785207,0.0890765220501932,1 -bryophyte,south,"","",oob_rmse,2,4,4,0.440793673928001,0.429487903524414,-0.0113057704035865,1 -bryophyte,south,"","",oob_spearman,2,4,4,0.260684119461907,0.340664673121688,0.079980553659781,1 -lichen,north,"","",oob_auc,2,4,4,0.802806546010246,0.814298806960144,0.0114922609498975,1 -lichen,north,"","",oob_calibration_slope,2,4,4,0.980606541125594,1.04230585591482,0.061699314789226,0.5 -lichen,north,"","",oob_deviance_explained,2,4,4,0.12872576435422,0.248034675550972,0.119308911196753,1 -lichen,north,"","",oob_rmse,2,4,4,0.413025371860499,0.406861975065378,-0.00616339679512051,1 -lichen,north,"","",oob_spearman,2,4,4,0.509892978412699,0.529977269607817,0.0200842911951175,1 -lichen,south,"","",oob_auc,2,4,4,0.79223256589659,0.846542386582297,0.0543098206857075,1 -lichen,south,"","",oob_calibration_slope,2,4,4,0.991922312776069,1.06672074683607,0.074798434060002,0.5 -lichen,south,"","",oob_deviance_explained,2,4,4,0.114894473111837,0.243889334577385,0.128994861465548,1 -lichen,south,"","",oob_rmse,2,4,4,0.323218486449386,0.312873274631208,-0.0103452118181775,1 -lichen,south,"","",oob_spearman,2,4,4,0.367603610275592,0.423231700322172,0.0556280900465805,1 -mite,north,"","",oob_auc,2,4,4,0.715543903851094,0.730053167890016,0.0145092640389225,1 -mite,north,"","",oob_calibration_slope,2,4,4,0.91133114539273,1.05674100071277,0.145409855320035,1 -mite,north,"","",oob_deviance_explained,2,4,4,0.0149187218448,0.116584579443938,0.101665857599138,1 -mite,north,"","",oob_rmse,2,4,4,0.328141122068562,0.325797519945506,-0.00234360212305601,1 -mite,north,"","",oob_spearman,2,4,4,0.271890083460792,0.289007646152262,0.01711756269147,1 -mite,south,"","",oob_auc,2,4,4,0.773632058303039,0.804547452568466,0.0309153942654279,1 -mite,south,"","",oob_calibration_slope,2,4,4,0.614282370199175,0.933805238529402,0.319522868330228,1 -mite,south,"","",oob_deviance_explained,2,4,4,0.0865130411560292,0.203074207636962,0.116561166480933,1 -mite,south,"","",oob_rmse,2,4,4,0.246446874946777,0.229893292423298,-0.016553582523479,1 -mite,south,"","",oob_spearman,2,4,4,0.230646626561677,0.255120867233179,0.024474240671502,1 -vascular_plant,north,"","",oob_auc,2,4,4,0.827954669352313,0.85044314905027,0.0224884796979565,1 -vascular_plant,north,"","",oob_calibration_slope,2,4,4,0.975256964203091,1.01544015587897,0.0401831916758785,0.5 -vascular_plant,north,"","",oob_deviance_explained,2,4,4,0.178982880150698,0.300357827072152,0.121374946921455,1 -vascular_plant,north,"","",oob_rmse,2,4,4,0.404515361388574,0.389819238453967,-0.0146961229346065,1 -vascular_plant,north,"","",oob_spearman,2,4,4,0.555249895538886,0.593460981646714,0.0382110861078275,1 -vascular_plant,south,"","",oob_auc,2,4,4,0.845681924077273,0.876856670002423,0.03117474592515,1 -vascular_plant,south,"","",oob_calibration_slope,2,4,4,0.941201813094871,1.02061001298349,0.079408199888619,1 -vascular_plant,south,"","",oob_deviance_explained,2,4,4,0.267977840506312,0.364476987381046,0.096499146874734,1 -vascular_plant,south,"","",oob_rmse,2,4,4,0.351078283914618,0.328886590048099,-0.0221916938665195,1 -vascular_plant,south,"","",oob_spearman,2,4,4,0.514530181328676,0.558932940948466,0.044402759619789,1 diff --git a/3_output/exp_001_gbm/tables/grid_summary.csv b/3_output/exp_001_gbm/tables/grid_summary.csv deleted file mode 100644 index aa7c840..0000000 --- a/3_output/exp_001_gbm/tables/grid_summary.csv +++ /dev/null @@ -1,685 +0,0 @@ -taxon,run,region,season,part,species,grid_unit,n,median,p10,p90,boot1 -bird,bird,north,,,AMRO,SpruceR,5,0.0379077892605094,0.0357069840108991,0.0439180112333912,0.0371538184225494 -bird,bird,north,,,AMRO,Spruce1,5,0.0369434045233066,0.0344360027490483,0.0416351585155026,0.0361391093616067 -bird,bird,north,,,AMRO,Spruce2,5,0.0307150089765487,0.030109663351008,0.0329045319442051,0.0301337794475772 -bird,bird,north,,,AMRO,Spruce3,5,0.0307150089765487,0.0294054295740721,0.0325217250063317,0.0291659763427725 -bird,bird,north,,,AMRO,Spruce4,5,0.0307150089765487,0.0294054295740721,0.0325217250063317,0.0291659763427725 -bird,bird,north,,,AMRO,Spruce5,5,0.0299152293064818,0.0285956384200165,0.0314149891306962,0.0282358345707819 -bird,bird,north,,,AMRO,Spruce6,5,0.0288390264421012,0.0267705367224909,0.0295903404050516,0.0265696565030608 -bird,bird,north,,,AMRO,Spruce7,5,0.0292516197669962,0.0267705367224909,0.0313260648455419,0.0265696565030608 -bird,bird,north,,,AMRO,Spruce8,5,0.0292516197669962,0.025842614796773,0.0307697799995166,0.0254219885469663 -bird,bird,north,,,AMRO,PineR,5,0.0461811507069982,0.043560033533245,0.0475078285733581,0.0461811507069982 -bird,bird,north,,,AMRO,Pine1,5,0.0431887562367766,0.0376726145482274,0.0453268762409981,0.0380104675867715 -bird,bird,north,,,AMRO,Pine2,5,0.0352235570267497,0.0316693132829967,0.0367419235648345,0.0316941692031818 -bird,bird,north,,,AMRO,Pine3,5,0.0352235570267497,0.0309284394549282,0.0363061273499147,0.030676251241301 -bird,bird,north,,,AMRO,Pine4,5,0.0352235570267497,0.0309284394549282,0.0363061273499147,0.030676251241301 -bird,bird,north,,,AMRO,Pine5,5,0.0342273458387846,0.0300767085361846,0.0353415176234203,0.0296979447943549 -bird,bird,north,,,AMRO,Pine6,5,0.0320576976807911,0.028157076012081,0.0338734734725135,0.0279454885618782 -bird,bird,north,,,AMRO,Pine7,5,0.0316659202496991,0.028157076012081,0.0364862856995144,0.0279454885618782 -bird,bird,north,,,AMRO,Pine8,5,0.0316659202496991,0.0271810976137952,0.0358257460264925,0.0267383919727229 -bird,bird,north,,,AMRO,DecidR,5,0.0440204216314728,0.0383877389501861,0.0448538885359625,0.0451168754237399 -bird,bird,north,,,AMRO,Decid1,5,0.038134225919122,0.0347789407359524,0.042146742286011,0.0371344911215171 -bird,bird,north,,,AMRO,Decid2,5,0.0321866741194222,0.0303917567166961,0.0339973288709613,0.0309637560283268 -bird,bird,north,,,AMRO,Decid3,5,0.0321866741194222,0.0299857475339876,0.0335924814847933,0.0299692966617956 -bird,bird,north,,,AMRO,Decid4,5,0.0321866741194222,0.0299857475339876,0.0335924814847933,0.0299692966617956 -bird,bird,north,,,AMRO,Decid5,5,0.0316182073371432,0.0291585062645138,0.032780049223502,0.0290135359365346 -bird,bird,north,,,AMRO,Decid6,5,0.0304807396963572,0.0272978463308605,0.0310370504864283,0.0273014662216016 -bird,bird,north,,,AMRO,Decid7,5,0.0305718846678864,0.0272978463308605,0.0330521316283047,0.0273014662216016 -bird,bird,north,,,AMRO,Decid8,5,0.0305718846678864,0.0263501883999869,0.032464179270663,0.0261221879748799 -bird,bird,north,,,AMRO,MixedwoodR,5,0.0440114207729208,0.0403696634489452,0.0500068707296046,0.0505899724298507 -bird,bird,north,,,AMRO,Mixedwood1,5,0.0423873021137283,0.0384593421246513,0.0454987866928833,0.0423873021137283 -bird,bird,north,,,AMRO,Mixedwood2,5,0.0351898891530741,0.0333870235689893,0.0365493728589645,0.0353436937388909 -bird,bird,north,,,AMRO,Mixedwood3,5,0.0342559672568581,0.0331528742702994,0.0360473161801199,0.0342085644201385 -bird,bird,north,,,AMRO,Mixedwood4,5,0.0342559672568581,0.0331528742702994,0.0360473161801199,0.0342085644201385 -bird,bird,north,,,AMRO,Mixedwood5,5,0.0337558883354845,0.0324780326010398,0.0353256380164163,0.0337558883354845 -bird,bird,north,,,AMRO,Mixedwood6,5,0.031763975517748,0.0303665508315824,0.0337552637111679,0.031763975517748 -bird,bird,north,,,AMRO,Mixedwood7,5,0.031763975517748,0.030211851555252,0.0362811677239355,0.031763975517748 -bird,bird,north,,,AMRO,Mixedwood8,5,0.0312594253662686,0.0294734993372114,0.0356323891415271,0.0303919405855053 -bird,bird,north,,,AMRO,TreedBogR,5,0.0363680012226487,0.0338011078959166,0.0404484950265962,0.0360250767576048 -bird,bird,north,,,AMRO,TreedBog1,5,0.0341778223127492,0.0295331102950538,0.038368881440865,0.0311543804209376 -bird,bird,north,,,AMRO,TreedBog2,5,0.0286626967740724,0.025942097220258,0.0305695367250489,0.0259773758959264 -bird,bird,north,,,AMRO,TreedBog3,5,0.0286626967740724,0.0253399348528165,0.030125930914467,0.0251430635226481 -bird,bird,north,,,AMRO,TreedBog4,5,0.0286626967740724,0.0253399348528165,0.030125930914467,0.0251430635226481 -bird,bird,north,,,AMRO,TreedBog5,5,0.0280724074972567,0.0249235206740284,0.0296806842275161,0.0248103496615268 -bird,bird,north,,,AMRO,TreedBog6,5,0.026673806040427,0.023407774074153,0.028704054604167,0.0234667744849324 -bird,bird,north,,,AMRO,TreedBog7,5,0.026673806040427,0.023407774074153,0.0306640686571682,0.0234667744849324 -bird,bird,north,,,AMRO,TreedBog8,5,0.026673806040427,0.0228148996289312,0.0301212231236676,0.0227901759659883 -bird,bird,north,,,AMRO,TreedFenR,5,0.0358982711677089,0.0334501835066092,0.0410910335366983,0.0358982711677089 -bird,bird,north,,,AMRO,TreedFen1,5,0.0364156121262102,0.0341100003251102,0.0420658768525872,0.0354305776947177 -bird,bird,north,,,AMRO,TreedFen2,5,0.0310264395806072,0.0297375674124958,0.0335661095933966,0.029542986332893 -bird,bird,north,,,AMRO,TreedFen3,5,0.0310264395806072,0.0290369600932049,0.0331596134551163,0.0285941576621344 -bird,bird,north,,,AMRO,TreedFen4,5,0.0310264395806072,0.0290369600932049,0.0331596134551163,0.0285941576621344 -bird,bird,north,,,AMRO,TreedFen5,5,0.0307613686001069,0.0283698431964156,0.0324273896545031,0.0279009120989782 -bird,bird,north,,,AMRO,TreedFen6,5,0.029760487581681,0.0265826315132137,0.0308462528415929,0.026254497586519 -bird,bird,north,,,AMRO,TreedFen7,5,0.029396784377262,0.0265826315132137,0.0328834595388985,0.026254497586519 -bird,bird,north,,,AMRO,TreedFen8,5,0.029396784377262,0.0256628511989018,0.0323033542845377,0.0251204428207023 -bird,bird,north,,,AMRO,GrassHerb,5,0.0801490249699255,0.0744871079011608,0.0883363648053605,0.0805008329506624 -bird,bird,north,,,AMRO,Shrub,5,0.0560964904160333,0.0505842231815679,0.0657890598058789,0.0644625488613227 -bird,bird,north,,,AMRO,GraminoidFen,5,0.0447404943535554,0.039914721868518,0.0448997155618445,0.0449345249904682 -bird,bird,north,,,AMRO,Marsh,5,0.0392767096207199,0.0328128946987339,0.0419496871256143,0.0373953778596444 -bird,bird,north,,,AMRO,RoughP,5,0.0476529109883208,0.0370484800150533,0.0551260730079365,0.0586748398142023 -bird,bird,north,,,AMRO,TameP,5,0.0871570866610334,0.0686940179922636,0.0973743419031704,0.093809510937141 -bird,bird,north,,,AMRO,Crop,5,0.0573284903957228,0.0461482956997512,0.0646286436183915,0.0573284903957228 -bird,bird,north,,,AMRO,Industrial,5,0.0681043756959013,0.0645858296130797,0.0783275748453609,0.068858325809443 -bird,bird,north,,,AMRO,Mine,5,0.0596252847349992,0.0479249607958036,0.0630272264574224,0.0571066445731846 -bird,bird,north,,,AMRO,Rural,5,0.103581958984342,0.0907651727692093,0.10667546752033,0.103991752717406 -bird,bird,north,,,AMRO,Urban,5,0.0835908645318652,0.06842707474027,0.094462872178352,0.0715132167229806 -bird,bird,north,,,AMRO,CCSpruceR,5,0.0468145880701099,0.045654272611768,0.0538457656883563,0.0453188467712704 -bird,bird,north,,,AMRO,CCSpruce1,5,0.0402736104787464,0.0384616639181239,0.0494927799571566,0.0396438726329562 -bird,bird,north,,,AMRO,CCSpruce2,5,0.0307150089765487,0.0304334781693119,0.0349723653941306,0.030662079950808 -bird,bird,north,,,AMRO,CCSpruce3,5,0.0307150089765487,0.0297864060232559,0.0343823622234542,0.0296773094799221 -bird,bird,north,,,AMRO,CCSpruce4,5,0.0307150089765487,0.0295389018483663,0.0342431206709587,0.0293884301332627 -bird,bird,north,,,AMRO,CCPineR,5,0.0553258550850216,0.0538567213244314,0.058293013846362,0.0541637556145509 -bird,bird,north,,,AMRO,CCPine1,5,0.0470819397449997,0.0419639678398675,0.0535310423485348,0.0416967147876077 -bird,bird,north,,,AMRO,CCPine2,5,0.0364713907473729,0.0320098990768294,0.0382777256944494,0.0322498262049413 -bird,bird,north,,,AMRO,CCPine3,5,0.0360743773433313,0.0313291457476507,0.0377305959217591,0.0312140622714841 -bird,bird,north,,,AMRO,CCPine4,5,0.0360743773433313,0.031068823201108,0.0375798619818308,0.0309102241516008 -bird,bird,north,,,AMRO,CCDecidR,5,0.049772334942455,0.048632533949495,0.0556724839703326,0.0527581026990359 -bird,bird,north,,,AMRO,CCDecid1,5,0.038478792416282,0.0352221061937245,0.0457910619754098,0.0377855269592502 -bird,bird,north,,,AMRO,CCDecid2,5,0.0321866741194222,0.0307210810673669,0.0358718868586826,0.0315066075455133 -bird,bird,north,,,AMRO,CCDecid3,5,0.0321866741194222,0.0303163234410299,0.0354783192915802,0.0304947134796708 -bird,bird,north,,,AMRO,CCDecid4,5,0.0321866741194222,0.0299857475339876,0.0336015222263169,0.0299692966617956 -bird,bird,north,,,AMRO,CCMixedwoodR,5,0.0545576984992374,0.0513229146847854,0.0585075335743266,0.0591581517099264 -bird,bird,north,,,AMRO,CCMixedwood1,5,0.0431304293764813,0.0388098143461847,0.0489523732924516,0.0431304293764813 -bird,bird,north,,,AMRO,CCMixedwood2,5,0.0359633336091825,0.03388323283888,0.0376278083799636,0.0359633336091825 -bird,bird,north,,,AMRO,CCMixedwood3,5,0.0351898891530741,0.0335140696896582,0.0371604608127508,0.0348083033884748 -bird,bird,north,,,AMRO,CCMixedwood4,5,0.0342559672568581,0.0331528742702994,0.03605715386661,0.0342085644201385 -bird,bird,north,,,AMRO,ShrubbySwamp,5,0.0496591017325412,0.042861184291265,0.0551394397712599,0.0440443632715341 -bird,bird,north,,,AMRO,ShrubbyBog,5,0.0727490278097721,0.0313349231255729,0.0813576619885991,0.0761058124115116 -bird,bird,north,,,AMRO,ShrubbyFen,5,0.0427087834941854,0.0348342348306046,0.0448704121045177,0.0375338149823669 -bird,bird,north,,,AMRO,TreedSwamp,5,0.0328848718821178,0.0306190412094486,0.038519157698852,0.0317395218236918 -bird,bird,north,,,YEWA,SpruceR,5,0.0152872571687464,0.013485768713144,0.0161859905727812,0.0132378729656954 -bird,bird,north,,,YEWA,Spruce1,5,0.0161989293452335,0.0141785908075145,0.0166991104164551,0.0153407701002385 -bird,bird,north,,,YEWA,Spruce2,5,0.0153482944056184,0.0134422792322075,0.0163125707235945,0.0139740634811439 -bird,bird,north,,,YEWA,Spruce3,5,0.0153482944056184,0.0134422792322075,0.0163125707235945,0.0139740634811439 -bird,bird,north,,,YEWA,Spruce4,5,0.0154747518740089,0.0134422792322075,0.0163445361151842,0.0139740634811439 -bird,bird,north,,,YEWA,Spruce5,5,0.0147676991756156,0.0134179465002903,0.0159157956150026,0.0139132316513509 -bird,bird,north,,,YEWA,Spruce6,5,0.0147676991756156,0.0131538234674593,0.015692702740968,0.0137479186969233 -bird,bird,north,,,YEWA,Spruce7,5,0.0147676991756156,0.0131538234674593,0.015692702740968,0.0137479186969233 -bird,bird,north,,,YEWA,Spruce8,5,0.0147676991756156,0.0131538234674593,0.015692702740968,0.0137479186969233 -bird,bird,north,,,YEWA,PineR,5,0.0138475701618737,0.0132837576175213,0.0146094648346949,0.0132378729656954 -bird,bird,north,,,YEWA,Pine1,5,0.0152581809758663,0.0136067546966292,0.0153818216695528,0.0153407701002385 -bird,bird,north,,,YEWA,Pine2,5,0.0146439135337287,0.013156096597089,0.0151639499496742,0.0139740634811439 -bird,bird,north,,,YEWA,Pine3,5,0.0146439135337287,0.013156096597089,0.0151639499496742,0.0139740634811439 -bird,bird,north,,,YEWA,Pine4,5,0.014719421735982,0.013156096597089,0.0152127130535153,0.0139740634811439 -bird,bird,north,,,YEWA,Pine5,5,0.0142022195778863,0.0131317638651718,0.0149167883474754,0.0139132316513509 -bird,bird,north,,,YEWA,Pine6,5,0.0139569542170639,0.0128748566791004,0.0148065934814583,0.0137479186969233 -bird,bird,north,,,YEWA,Pine7,5,0.0139569542170639,0.0128748566791004,0.0148065934814583,0.0137479186969233 -bird,bird,north,,,YEWA,Pine8,5,0.0139569542170639,0.0128748566791004,0.0148065934814583,0.0137479186969233 -bird,bird,north,,,YEWA,DecidR,5,0.0675703241745523,0.0627767161006736,0.0702938844714476,0.0669041419573578 -bird,bird,north,,,YEWA,Decid1,5,0.0624217660583599,0.0575689854916319,0.0693836570512203,0.0624217660583599 -bird,bird,north,,,YEWA,Decid2,5,0.0571464094151976,0.0537808223830891,0.0594129800782725,0.0560005592464258 -bird,bird,north,,,YEWA,Decid3,5,0.0562948830841368,0.0537808223830891,0.0594129800782725,0.0560005592464258 -bird,bird,north,,,YEWA,Decid4,5,0.0567587071554002,0.0537808223830891,0.0595978658576664,0.0560005592464258 -bird,bird,north,,,YEWA,Decid5,5,0.0557567778657997,0.0530467428577415,0.0574413498371294,0.0557567778657997 -bird,bird,north,,,YEWA,Decid6,5,0.055094292117748,0.0522555082978965,0.0565812574287855,0.055094292117748 -bird,bird,north,,,YEWA,Decid7,5,0.055094292117748,0.0522555082978965,0.0565812574287855,0.055094292117748 -bird,bird,north,,,YEWA,Decid8,5,0.055094292117748,0.0522555082978965,0.0565812574287855,0.055094292117748 -bird,bird,north,,,YEWA,MixedwoodR,5,0.0263294278018144,0.0246051909455581,0.0304898931454611,0.0240150096029797 -bird,bird,north,,,YEWA,Mixedwood1,5,0.0280756504366122,0.026422361262982,0.0322980776714608,0.0278299045646552 -bird,bird,north,,,YEWA,Mixedwood2,5,0.027417472317543,0.0249167055783023,0.0300620807411239,0.024967095899502 -bird,bird,north,,,YEWA,Mixedwood3,5,0.027417472317543,0.0249167055783023,0.0300620807411239,0.024967095899502 -bird,bird,north,,,YEWA,Mixedwood4,5,0.0276433700001986,0.0249167055783023,0.0301214903483995,0.024967095899502 -bird,bird,north,,,YEWA,Mixedwood5,5,0.0265320313011314,0.0248682903628286,0.0293579534222626,0.0248584092508237 -bird,bird,north,,,YEWA,Mixedwood6,5,0.0260394400604634,0.0240411602226299,0.0289452390521485,0.0238981297326253 -bird,bird,north,,,YEWA,Mixedwood7,5,0.0260394400604634,0.0240411602226299,0.0289452390521485,0.0238981297326253 -bird,bird,north,,,YEWA,Mixedwood8,5,0.0260394400604634,0.0240411602226299,0.0289452390521485,0.0238981297326253 -bird,bird,north,,,YEWA,TreedBogR,5,0.0138475701618737,0.0130463040151519,0.0152564328925531,0.0132378729656954 -bird,bird,north,,,YEWA,TreedBog1,5,0.0152581809758663,0.0136067546966292,0.0153818216695528,0.0153407701002385 -bird,bird,north,,,YEWA,TreedBog2,5,0.0146439135337287,0.013156096597089,0.0151639499496742,0.0139740634811439 -bird,bird,north,,,YEWA,TreedBog3,5,0.0146439135337287,0.013156096597089,0.0151639499496742,0.0139740634811439 -bird,bird,north,,,YEWA,TreedBog4,5,0.014719421735982,0.013156096597089,0.0152127130535153,0.0139740634811439 -bird,bird,north,,,YEWA,TreedBog5,5,0.0142022195778863,0.0131317638651718,0.0149167883474754,0.0139132316513509 -bird,bird,north,,,YEWA,TreedBog6,5,0.0139569542170639,0.0128748566791004,0.0148065934814583,0.0137479186969233 -bird,bird,north,,,YEWA,TreedBog7,5,0.0139569542170639,0.0128748566791004,0.0148065934814583,0.0137479186969233 -bird,bird,north,,,YEWA,TreedBog8,5,0.0139569542170639,0.0128748566791004,0.0148065934814583,0.0137479186969233 -bird,bird,north,,,YEWA,TreedFenR,5,0.0143994539104511,0.0130463040151519,0.0149635734022189,0.0132378729656954 -bird,bird,north,,,YEWA,TreedFen1,5,0.0152581809758663,0.0136841747096025,0.0153818216695528,0.0153407701002385 -bird,bird,north,,,YEWA,TreedFen2,5,0.0147960908005419,0.013156096597089,0.0151804990559222,0.0139740634811439 -bird,bird,north,,,YEWA,TreedFen3,5,0.0147960908005419,0.013156096597089,0.0151804990559222,0.0139740634811439 -bird,bird,north,,,YEWA,TreedFen4,5,0.0149139697676838,0.013156096597089,0.0152127130535153,0.0139740634811439 -bird,bird,north,,,YEWA,TreedFen5,5,0.0143899316982559,0.0131317638651718,0.0149167883474754,0.0139132316513509 -bird,bird,north,,,YEWA,TreedFen6,5,0.0141414246412548,0.0128748566791004,0.0148065934814583,0.0137479186969233 -bird,bird,north,,,YEWA,TreedFen7,5,0.0141414246412548,0.0128748566791004,0.0148065934814583,0.0137479186969233 -bird,bird,north,,,YEWA,TreedFen8,5,0.0141414246412548,0.0128748566791004,0.0148065934814583,0.0137479186969233 -bird,bird,north,,,YEWA,GrassHerb,5,0.0367871900949649,0.0319836781606581,0.0768703748446776,0.0805944500301814 -bird,bird,north,,,YEWA,Shrub,5,0.0469869470845307,0.037642645627196,0.0536840486693118,0.0354415666356709 -bird,bird,north,,,YEWA,GraminoidFen,5,0.127521863595948,0.0739459105238275,0.25620629493653,0.127521863595948 -bird,bird,north,,,YEWA,Marsh,5,0.0662234795872427,0.0478838559733553,0.0998299868064359,0.0578083613563495 -bird,bird,north,,,YEWA,RoughP,5,0.0373939721353436,0.0337037577934417,0.0813577557002738,0.0673054145048082 -bird,bird,north,,,YEWA,TameP,5,0.0508152380210474,0.0497054248632837,0.0734386793616989,0.0494329351251097 -bird,bird,north,,,YEWA,Crop,5,0.0574125675380455,0.0487154446695811,0.0594750566185999,0.0511966478737243 -bird,bird,north,,,YEWA,Industrial,5,0.0231696674729654,0.018426259656728,0.0235045426217119,0.0165147767141114 -bird,bird,north,,,YEWA,Mine,5,0.0269432765757595,0.0250861435464223,0.0374450021319256,0.0337755961361192 -bird,bird,north,,,YEWA,Rural,5,0.123469877699348,0.0535065155989647,0.141447812861101,0.084075275040328 -bird,bird,north,,,YEWA,Urban,5,0.0192222493594217,0.0172614307419107,0.0247652871936472,0.0171371473558299 -bird,bird,north,,,YEWA,CCSpruceR,5,0.0152239296134922,0.0135727920222479,0.015795186262839,0.0132378729656954 -bird,bird,north,,,YEWA,CCSpruce1,5,0.0154527778412633,0.0143048510250552,0.0165928367367206,0.0153407701002385 -bird,bird,north,,,YEWA,CCSpruce2,5,0.0152262261077599,0.0134422792322075,0.0162525827608746,0.0139740634811439 -bird,bird,north,,,YEWA,CCSpruce3,5,0.0152262261077599,0.0134422792322075,0.0162525827608746,0.0139740634811439 -bird,bird,north,,,YEWA,CCSpruce4,5,0.0153047368800238,0.0134422792322075,0.0163031657482308,0.0139740634811439 -bird,bird,north,,,YEWA,CCPineR,5,0.0135622141599601,0.0132324096609,0.0146094648346949,0.0132378729656954 -bird,bird,north,,,YEWA,CCPine1,5,0.0152581809758663,0.0134666580025676,0.0153818216695528,0.0153407701002385 -bird,bird,north,,,YEWA,CCPine2,5,0.0146439135337287,0.013156096597089,0.0151639499496742,0.0139740634811439 -bird,bird,north,,,YEWA,CCPine3,5,0.0146439135337287,0.013156096597089,0.0151639499496742,0.0139740634811439 -bird,bird,north,,,YEWA,CCPine4,5,0.014719421735982,0.013156096597089,0.0152127130535153,0.0139740634811439 -bird,bird,north,,,YEWA,CCDecidR,5,0.0662117965045502,0.0623017143622268,0.0689763929386388,0.0643030870822108 -bird,bird,north,,,YEWA,CCDecid1,5,0.0599949740217044,0.0581029647442007,0.0675476795975803,0.0599949740217044 -bird,bird,north,,,YEWA,CCDecid2,5,0.0571464094151976,0.0529099613369571,0.0588195600318472,0.0538234066310957 -bird,bird,north,,,YEWA,CCDecid3,5,0.0562948830841368,0.0529099613369571,0.0588195600318472,0.0538234066310957 -bird,bird,north,,,YEWA,CCDecid4,5,0.0567587071554002,0.0532660337361667,0.0589652399644434,0.0547135876291197 -bird,bird,north,,,YEWA,CCMixedwoodR,5,0.0263294278018144,0.02453083432659,0.0294213209258698,0.0236242893789497 -bird,bird,north,,,YEWA,CCMixedwood1,5,0.0280756504366122,0.0264812984750028,0.0314548885696658,0.0273771166321912 -bird,bird,north,,,YEWA,CCMixedwood2,5,0.027417472317543,0.0246897760459168,0.029859840979945,0.0245608853893041 -bird,bird,north,,,YEWA,CCMixedwood3,5,0.027417472317543,0.0246897760459168,0.029859840979945,0.0245608853893041 -bird,bird,north,,,YEWA,CCMixedwood4,5,0.0276433700001986,0.0249167055783023,0.0299182077812278,0.024967095899502 -bird,bird,north,,,YEWA,ShrubbySwamp,5,0.0900247498619701,0.0628267175043494,0.130005469712865,0.0900247498619701 -bird,bird,north,,,YEWA,ShrubbyBog,5,0.0169638510546651,0.0150384231160003,0.0210515550630399,0.0169638510546651 -bird,bird,north,,,YEWA,ShrubbyFen,5,0.0605390113157542,0.0489000013969567,0.0829598355559298,0.0605390113157542 -bird,bird,north,,,YEWA,TreedSwamp,5,0.0445275398629097,0.0374072442508359,0.0525760300007124,0.0375916409761282 -bird,bird,south,,,AMRO,Loamy,5,0.0330303668254875,0.0246132930514146,0.0450293469478869,0.0356853516419985 -bird,bird,south,,,AMRO,Blowout,5,0.021088585697176,0.0173033888989037,0.0286221208950264,0.0221952093067217 -bird,bird,south,,,AMRO,ClaySub,5,0.0318713944339486,0.0273265130205711,0.0435182907807985,0.0329098509470428 -bird,bird,south,,,AMRO,Crop,5,0.0340033237102159,0.0317672668511563,0.0518819514292931,0.0394476530456092 -bird,bird,south,,,AMRO,Industrial,5,0.0585961696911928,0.0407932596782024,0.0967069032543936,0.0504188566426269 -bird,bird,south,,,AMRO,Mine,5,0.0433708543134233,0.0279654941161151,0.0922365244387607,0.0433708543134233 -bird,bird,south,,,AMRO,Other,5,0.0279130028226513,0.0208330528511193,0.032413626035389,0.0306589561513613 -bird,bird,south,,,AMRO,RapidDrain,5,0.0324169843045222,0.0286422650259653,0.0477446779451451,0.0380039278541435 -bird,bird,south,,,AMRO,RoughP,5,0.0228337535993323,0.0201215473942389,0.0316719043853148,0.0239282230521284 -bird,bird,south,,,AMRO,Rural,5,0.126410048161514,0.0906012519863266,0.176379447147091,0.127891983240797 -bird,bird,south,,,AMRO,SandyLoam,5,0.025042122546936,0.0214670384913766,0.0343658213178494,0.0276333618334017 -bird,bird,south,,,AMRO,SoilUnknown,5,0.0324496974133814,0.0256774415378297,0.049880608571366,0.0324496974133814 -bird,bird,south,,,AMRO,TameP,5,0.0356803988551642,0.0313829377593096,0.0552869938175378,0.0441765473945761 -bird,bird,south,,,AMRO,ThinBreak,5,0.039889274062052,0.034628443634563,0.0719999158707882,0.0392330475321601 -bird,bird,south,,,AMRO,Urban,5,0.142679018123273,0.113540926398101,0.22174675340104,0.142679018123273 -bird,bird,south,,,AMRO,Water,5,0.0953303189529314,0.0776377301804561,0.169049654726582,0.0920114906643601 -bird,bird,south,,,AMRO,Wellsites,5,0.0307302023824335,0.022594376238097,0.0492804951485044,0.0307302023824335 -bird,bird,south,,,YEWA,Loamy,5,0.0323777440375111,0.00955829503412574,0.131862420956728,0.0323777440375111 -bird,bird,south,,,YEWA,Blowout,5,0.0187270539268139,0.00630915767428754,0.0873903038436509,0.0187270539268139 -bird,bird,south,,,YEWA,ClaySub,5,0.0246186169686955,0.00822451241360055,0.0943919064117695,0.0246186169686955 -bird,bird,south,,,YEWA,Crop,5,0.017805705629003,0.00630915767428754,0.0873903038436509,0.017805705629003 -bird,bird,south,,,YEWA,Industrial,5,0.0209284382916916,0.00885117031734984,0.0896085806255624,0.0209284382916916 -bird,bird,south,,,YEWA,Mine,5,0.0444012010339026,0.0138456974462655,0.170585969762671,0.0444012010339026 -bird,bird,south,,,YEWA,Other,5,0.0336836299530274,0.00744409109190419,0.0823063460016796,0.0336836299530274 -bird,bird,south,,,YEWA,RapidDrain,5,0.0232435250881236,0.0078807868904486,0.0848844514363777,0.0232435250881236 -bird,bird,south,,,YEWA,RoughP,5,0.0201905740018633,0.00806971313607099,0.0727806828596159,0.0201905740018633 -bird,bird,south,,,YEWA,Rural,5,0.0244718795634426,0.00772287119105236,0.0836563883453448,0.0244718795634426 -bird,bird,south,,,YEWA,SandyLoam,5,0.0187690416244235,0.00638334099008439,0.0866261245673264,0.0187690416244235 -bird,bird,south,,,YEWA,SoilUnknown,5,0.0422572300082502,0.0144091300276581,0.0779063901484553,0.0422572300082502 -bird,bird,south,,,YEWA,TameP,5,0.0211657180120173,0.00623494395130275,0.0946726209245148,0.0211657180120173 -bird,bird,south,,,YEWA,ThinBreak,5,0.063840137540605,0.0219518119596434,0.322155592907038,0.063840137540605 -bird,bird,south,,,YEWA,Urban,5,0.0229978460411723,0.00689224987091747,0.0802358087203735,0.0229978460411723 -bird,bird,south,,,YEWA,Water,5,0.0258189921773528,0.00983857788675398,0.118016907827257,0.0258189921773528 -bird,bird,south,,,YEWA,Wellsites,5,0.0342200922325948,0.00919345730088931,0.120879962963517,0.0342200922325948 -bryophyte,bryophyte,north,,,Bryum.All,WhiteSpruce,5,0.31052610327228,0.248338396936217,0.336707388819424,0.31052610327228 -bryophyte,bryophyte,north,,,Bryum.All,Pine,5,0.230896057266559,0.201539861550839,0.257970760380322,0.238179472885008 -bryophyte,bryophyte,north,,,Bryum.All,Deciduous,5,0.299897959549428,0.249705887038526,0.340561918896338,0.299897959549428 -bryophyte,bryophyte,north,,,Bryum.All,Mixedwood,5,0.270844800165529,0.216204794009057,0.336421739102282,0.299897959549428 -bryophyte,bryophyte,north,,,Bryum.All,BlackSpruce,5,0.249755271611689,0.201937462499991,0.282882832099293,0.249755271611689 -bryophyte,bryophyte,north,,,Bryum.All,TreedFen,5,0.28542998008965,0.267678022557783,0.307770559983566,0.28542998008965 -bryophyte,bryophyte,north,,,Bryum.All,TreedSwamp,5,0.385968264421163,0.312920073721417,0.507687926665553,0.379312837038535 -bryophyte,bryophyte,north,,,Bryum.All,GraminoidFen,5,0.288431356317159,0.261305311033378,0.308274580487677,0.288431356317159 -bryophyte,bryophyte,north,,,Bryum.All,ShrubbyFen,5,0.337122721672387,0.279923429381735,0.375347800127838,0.289427389318102 -bryophyte,bryophyte,north,,,Bryum.All,ShrubbyBog,5,0.243845791018471,0.188891968355952,0.278167734708803,0.249755271611689 -bryophyte,bryophyte,north,,,Bryum.All,ShrubbySwamp,5,0.365585039270526,0.322127823272831,0.486835001159126,0.342314571401646 -bryophyte,bryophyte,north,,,Bryum.All,Marsh,5,0.258133844490492,0.232880042141218,0.28866312642649,0.276451114636988 -bryophyte,bryophyte,north,,,Bryum.All,Shrub,5,0.511760114579579,0.475673809179853,0.541572307155453,0.465299344833059 -bryophyte,bryophyte,north,,,Bryum.All,Grass,5,0.455089495341485,0.445945652452891,0.488540544028664,0.462024415092747 -bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruceR,5,0.438745026372702,0.355667206932491,0.51747149801794,0.390821903625069 -bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce1,5,0.410076213396168,0.36321346289653,0.503403710429919,0.410076213396168 -bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce2,5,0.508475878316926,0.401426445425866,0.617152865233015,0.451482229642779 -bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce3,5,0.508475878316926,0.401426445425866,0.617152865233015,0.451482229642779 -bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce4,5,0.508475878316926,0.401426445425866,0.617152865233015,0.451482229642779 -bryophyte,bryophyte,north,,,Bryum.All,CCPineR,5,0.412128914188184,0.355667206932491,0.443263730796442,0.390821903625069 -bryophyte,bryophyte,north,,,Bryum.All,CCPine1,5,0.390821903625069,0.333483847923572,0.490918114219784,0.390821903625069 -bryophyte,bryophyte,north,,,Bryum.All,CCPine2,5,0.390821903625069,0.333483847923572,0.471936338254226,0.390821903625069 -bryophyte,bryophyte,north,,,Bryum.All,CCPine3,5,0.390821903625069,0.333483847923572,0.471936338254226,0.390821903625069 -bryophyte,bryophyte,north,,,Bryum.All,CCPine4,5,0.390821903625069,0.333483847923572,0.471936338254226,0.390821903625069 -bryophyte,bryophyte,north,,,Bryum.All,CCDeciduousR,5,0.3545233293023,0.340961454275766,0.401849015007629,0.353793902874269 -bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous1,5,0.377647378614244,0.344523367153784,0.481806035488891,0.377647378614244 -bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous2,5,0.311505084119227,0.273440313742051,0.398615691230809,0.353793902874269 -bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous3,5,0.311505084119227,0.273440313742051,0.398615691230809,0.353793902874269 -bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous4,5,0.311505084119227,0.273440313742051,0.398615691230809,0.353793902874269 -bryophyte,bryophyte,north,,,Bryum.All,CCMixedwoodR,5,0.3545233293023,0.340961454275766,0.401849015007629,0.353793902874269 -bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood1,5,0.377647378614244,0.344523367153784,0.481806035488891,0.377647378614244 -bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood2,5,0.311505084119227,0.273440313742051,0.398615691230809,0.353793902874269 -bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood3,5,0.311505084119227,0.273440313742051,0.398615691230809,0.353793902874269 -bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood4,5,0.311505084119227,0.273440313742051,0.398615691230809,0.353793902874269 -bryophyte,bryophyte,north,,,Bryum.All,EnSeismic,5,0.341097356242628,0.254339326663875,0.382216705326462,0.359661940947613 -bryophyte,bryophyte,north,,,Bryum.All,EnSoftLin,5,0.426391247147487,0.394942557841774,0.445875722634301,0.421818669082998 -bryophyte,bryophyte,north,,,Bryum.All,TrSoftLin,5,0.386737032554824,0.265097009604921,0.458173565900464,0.386737032554824 -bryophyte,bryophyte,north,,,Bryum.All,HardLin,5,0.323072649069623,0.293407622711147,0.416473308213662,0.323072649069623 -bryophyte,bryophyte,north,,,Bryum.All,UrbInd,5,0.424027704910845,0.381663846244751,0.463627616313242,0.399416906097742 -bryophyte,bryophyte,north,,,Bryum.All,Wellsites,5,0.361293473135619,0.31554373807671,0.420742079367555,0.322173892143649 -bryophyte,bryophyte,north,,,Bryum.All,Crop,5,0.290782059818433,0.267062277753391,0.34063179003052,0.285993724435061 -bryophyte,bryophyte,north,,,Bryum.All,TameP,5,0.404746251805957,0.346962846238019,0.481020108462059,0.36532086124143 -bryophyte,bryophyte,north,,,Bryum.All,RoughP,5,0.436471197253669,0.367166435228872,0.524716833594427,0.359834899806343 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,WhiteSpruce,5,0.251591937433264,0.19328280334971,0.29754847866803,0.319776969895412 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Pine,5,0.25442905967516,0.207735305986921,0.301106271785144,0.300217413697282 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Deciduous,5,0.247607125855898,0.211625878068664,0.286984690369508,0.305614800703084 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Mixedwood,5,0.276949471099766,0.218766636289073,0.298700970564076,0.305614800703084 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,BlackSpruce,5,0.172094265429733,0.152533139774685,0.21423892964757,0.229117543296424 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,TreedFen,5,0.186901168373081,0.149288135342749,0.225428671383715,0.248756242772099 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,TreedSwamp,5,0.252021427357509,0.166065027674746,0.267810054333897,0.261376708052281 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,GraminoidFen,5,0.198085627837465,0.157142321184557,0.283883462130525,0.26732140886329 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,ShrubbyFen,5,0.208533596077771,0.157167384430436,0.257533680773337,0.256461346102025 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,ShrubbyBog,5,0.182349056567479,0.163531481068247,0.212556808099928,0.230953876004402 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,ShrubbySwamp,5,0.223528109605295,0.149138005720763,0.250584515752217,0.2536134546523 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Marsh,5,0.22228072784748,0.168620881682535,0.241858086991686,0.250063994783192 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Shrub,5,0.389503190030972,0.320960444751684,0.448650044782782,0.44894769329765 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Grass,5,0.428284581743718,0.374366055130338,0.457199281432459,0.451204171652615 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruceR,5,0.530331249227848,0.491517829025308,0.568628662224273,0.561769401366854 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce1,5,0.473700459331479,0.407758990464968,0.529762260621459,0.561769401366854 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce2,5,0.565706576549555,0.544873249991517,0.577412027160795,0.580219043404069 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce3,5,0.565706576549555,0.544873249991517,0.577412027160795,0.580219043404069 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce4,5,0.565706576549555,0.544873249991517,0.577412027160795,0.580219043404069 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPineR,5,0.530331249227848,0.469339100269507,0.568628662224273,0.561769401366854 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine1,5,0.576477975210023,0.517401061347545,0.618584653615194,0.610401546827348 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine2,5,0.580568836679176,0.512283566749051,0.626511408106236,0.628158974750111 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine3,5,0.580568836679176,0.512283566749051,0.626511408106236,0.628158974750111 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine4,5,0.580568836679176,0.512283566749051,0.626511408106236,0.628158974750111 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduousR,5,0.514179795355911,0.460394976449055,0.543235458278474,0.554666644352137 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous1,5,0.521363617640473,0.489165762731297,0.549095286648067,0.540760634909747 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous2,5,0.488937533270703,0.421362183597221,0.53489185261304,0.540760634909747 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous3,5,0.488937533270703,0.421362183597221,0.53489185261304,0.540760634909747 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous4,5,0.488937533270703,0.421362183597221,0.53489185261304,0.540760634909747 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwoodR,5,0.514179795355911,0.460394976449055,0.543235458278474,0.554666644352137 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood1,5,0.521363617640473,0.489165762731297,0.549095286648067,0.540760634909747 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood2,5,0.488937533270703,0.421362183597221,0.53489185261304,0.540760634909747 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood3,5,0.488937533270703,0.421362183597221,0.53489185261304,0.540760634909747 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood4,5,0.488937533270703,0.421362183597221,0.53489185261304,0.540760634909747 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,EnSeismic,5,0.268196524768211,0.192667243771779,0.340326477131138,0.268196524768211 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,EnSoftLin,5,0.244367475533093,0.215342705344895,0.2869525867514,0.286080607309579 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,TrSoftLin,5,0.235180164284642,0.199569465204302,0.271701707407358,0.263190120831396 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,HardLin,5,0.207740633319783,0.165745519163095,0.245334290325378,0.248342842340082 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,UrbInd,5,0.248167225413181,0.216158769538292,0.276453619429614,0.294363832011227 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Wellsites,5,0.241368099314559,0.204081781790476,0.285621981421162,0.30357975402055 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Crop,5,0.153338330749787,0.125166497619391,0.187155651429452,0.203373038350339 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,TameP,5,0.2360577788098,0.15146756653851,0.278805743751533,0.293635365377072 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,RoughP,5,0.248101456253159,0.17939976633513,0.28974907017417,0.304637156738226 -bryophyte,bryophyte,south,,,Bryum.All,Loamy,5,0.416120093876595,0.37588141337936,0.645006923204712,0.365260102242254 -bryophyte,bryophyte,south,,,Bryum.All,SandyLoam,5,0.619490321907823,0.571842714254661,0.80979481401128,0.607423905307247 -bryophyte,bryophyte,south,,,Bryum.All,ClaySub,5,0.436094713078908,0.368859588919056,0.633860185031799,0.371820192793253 -bryophyte,bryophyte,south,,,Bryum.All,RapidDrain,5,0.456977920971507,0.350656462997717,0.602047684045733,0.357347445845226 -bryophyte,bryophyte,south,,,Bryum.All,Blowout,5,0.607668074509399,0.523747808515383,0.70418139924581,0.512755733192383 -bryophyte,bryophyte,south,,,Bryum.All,ThinBreak,5,0.276421207240453,0.234243734811806,0.553558265823947,0.263177360284511 -bryophyte,bryophyte,south,,,Bryum.All,Other,5,0.41264588487935,0.327198320518323,0.635082952307308,0.360344017110773 -bryophyte,bryophyte,south,,,Bryum.All,EnSeismic,5,0.522319000857861,0.399218908081566,0.636854296953491,0.408965070806465 -bryophyte,bryophyte,south,,,Bryum.All,EnSoftLin,5,0.542366306552096,0.418673824797896,0.667261504642721,0.408965070806465 -bryophyte,bryophyte,south,,,Bryum.All,TrSoftLin,5,0.582058216553865,0.467952449741473,0.716189011332954,0.495720932725553 -bryophyte,bryophyte,south,,,Bryum.All,HardLin,5,0.391764572829346,0.378724568424972,0.661286858593419,0.373724056414033 -bryophyte,bryophyte,south,,,Bryum.All,UrbInd,5,0.320657317261889,0.291719628629963,0.523915516885558,0.320657317261889 -bryophyte,bryophyte,south,,,Bryum.All,Wellsites,5,0.340618063070173,0.31404505067305,0.50823297134187,0.308138000510144 -bryophyte,bryophyte,south,,,Bryum.All,Crop,5,0.255711828549599,0.191335491740303,0.359969290806234,0.215818605966159 -bryophyte,bryophyte,south,,,Bryum.All,TameP,5,0.505439556859908,0.396113322424557,0.636140218067136,0.423763233141184 -bryophyte,bryophyte,south,,,Bryum.All,RoughP,5,0.310286393711026,0.279902944450483,0.51172852986617,0.307590528971142 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,Loamy,5,0.132569583210694,0.12376990951612,0.1681332339599,0.175508505383722 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,SandyLoam,5,0.180935722809544,0.143219232348468,0.247499568755017,0.180935722809544 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,ClaySub,5,0.0955502752062349,0.0835228695470458,0.115430005478976,0.125560259747383 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,RapidDrain,5,0.170316515598064,0.134787163637048,0.189478331248127,0.170316515598064 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,Blowout,5,0.331650705809394,0.263483183452409,0.41683746363425,0.331650705809394 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,ThinBreak,5,0.088992793864096,0.0683983631632044,0.11144869687598,0.120320619518073 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,Other,5,0.116827949140509,0.104568234119555,0.136377233935107,0.147914160622709 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,EnSeismic,5,0.184777604878253,0.133157157553358,0.256182600941271,0.184777604878253 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,EnSoftLin,5,0.18960176284805,0.133729653510496,0.231746869378038,0.18960176284805 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,TrSoftLin,5,0.178923569445442,0.143210461378198,0.250163725219165,0.19463526295952 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,HardLin,5,0.103319417802398,0.0907655995972361,0.194337035061578,0.156877644728103 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,UrbInd,5,0.112373845753338,0.0780567564927782,0.136399538594886,0.148163843735697 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,Wellsites,5,0.148163843735697,0.114501331647299,0.199664316467067,0.148163843735697 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,Crop,5,0.0574193192396884,0.0479531340586393,0.0718040855803864,0.0794498699370868 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,TameP,5,0.15395519000634,0.143956590463813,0.196722867254869,0.142118670690943 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,RoughP,5,0.123737028722151,0.114310856475943,0.138533337835175,0.142118670690943 -lichen,lichen,north,,,Cladonia.chlorophaea,WhiteSpruce,5,0.378528930185299,0.343164757264289,0.409303490973553,0.409882025815726 -lichen,lichen,north,,,Cladonia.chlorophaea,Pine,5,0.214810607241955,0.192805752220545,0.257069995687071,0.257936491915899 -lichen,lichen,north,,,Cladonia.chlorophaea,Deciduous,5,0.240752030744251,0.20912694966148,0.247964848974772,0.250552648638313 -lichen,lichen,north,,,Cladonia.chlorophaea,Mixedwood,5,0.228926035888583,0.211633374799085,0.242386877298821,0.228926035888583 -lichen,lichen,north,,,Cladonia.chlorophaea,BlackSpruce,5,0.36321132272695,0.338474435075031,0.436442696240511,0.345263346637588 -lichen,lichen,north,,,Cladonia.chlorophaea,TreedFen,5,0.43781321841701,0.410489851717659,0.499304260970258,0.405060810470343 -lichen,lichen,north,,,Cladonia.chlorophaea,TreedSwamp,5,0.549046514153994,0.518862336036897,0.565761450167424,0.515831477476504 -lichen,lichen,north,,,Cladonia.chlorophaea,GraminoidFen,5,0.224972190973397,0.197696523929581,0.283874625616325,0.224972190973397 -lichen,lichen,north,,,Cladonia.chlorophaea,ShrubbyFen,5,0.243466449821388,0.215332062382355,0.289114928666847,0.211312188596235 -lichen,lichen,north,,,Cladonia.chlorophaea,ShrubbyBog,5,0.128300015991666,0.0985187039908041,0.251831718971134,0.203711446078008 -lichen,lichen,north,,,Cladonia.chlorophaea,ShrubbySwamp,5,0.21987841922692,0.209467015915907,0.23444095326273,0.24383060534444 -lichen,lichen,north,,,Cladonia.chlorophaea,Marsh,5,0.123842492375801,0.100499634456034,0.151981623919593,0.131750839186132 -lichen,lichen,north,,,Cladonia.chlorophaea,Shrub,5,0.132890653452007,0.104814754672874,0.141912803133103,0.143902506854364 -lichen,lichen,north,,,Cladonia.chlorophaea,Grass,5,0.154319617074146,0.134870683039677,0.173461142584191,0.154319617074146 -lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruceR,5,0.151499118687363,0.0915366451455441,0.16845359000274,0.151499118687363 -lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce1,5,0.186353641165977,0.138373870189204,0.252181018717091,0.239508685584178 -lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce2,5,0.377534688726288,0.260167677273098,0.454098568949144,0.378784087287339 -lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce3,5,0.377534688726288,0.260167677273098,0.454098568949144,0.378784087287339 -lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce4,5,0.377534688726288,0.260167677273098,0.454098568949144,0.378784087287339 -lichen,lichen,north,,,Cladonia.chlorophaea,CCPineR,5,0.0750230500848066,0.0550091773940399,0.0982709743832956,0.105449853988483 -lichen,lichen,north,,,Cladonia.chlorophaea,CCPine1,5,0.271712589493789,0.238759144486381,0.304756548867243,0.319597789689957 -lichen,lichen,north,,,Cladonia.chlorophaea,CCPine2,5,0.290104622505058,0.237595089705377,0.311149584206335,0.307849799987954 -lichen,lichen,north,,,Cladonia.chlorophaea,CCPine3,5,0.290104622505058,0.237595089705377,0.311149584206335,0.307849799987954 -lichen,lichen,north,,,Cladonia.chlorophaea,CCPine4,5,0.290104622505058,0.237595089705377,0.311149584206335,0.307849799987954 -lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduousR,5,0.187574421192804,0.15733716136317,0.223723645176414,0.187574421192804 -lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous1,5,0.191782883865359,0.17123231215737,0.19758581884282,0.187574421192804 -lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous2,5,0.215834612686347,0.180622238731231,0.227416125679361,0.229118576454769 -lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous3,5,0.215834612686347,0.180622238731231,0.227416125679361,0.229118576454769 -lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous4,5,0.215834612686347,0.180622238731231,0.227416125679361,0.229118576454769 -lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwoodR,5,0.187574421192804,0.15733716136317,0.223723645176414,0.187574421192804 -lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood1,5,0.191782883865359,0.17123231215737,0.19758581884282,0.187574421192804 -lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood2,5,0.215834612686347,0.180622238731231,0.227416125679361,0.229118576454769 -lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood3,5,0.215834612686347,0.180622238731231,0.227416125679361,0.229118576454769 -lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood4,5,0.215834612686347,0.180622238731231,0.227416125679361,0.229118576454769 -lichen,lichen,north,,,Cladonia.chlorophaea,EnSeismic,5,0.121739756611421,0.0944249926684191,0.145465668153221,0.121739756611421 -lichen,lichen,north,,,Cladonia.chlorophaea,EnSoftLin,5,0.0884849561820664,0.0624884990818155,0.0977854819560458,0.0913365122199381 -lichen,lichen,north,,,Cladonia.chlorophaea,TrSoftLin,5,0.105602801323576,0.0757943177763908,0.131649653684006,0.105639976516185 -lichen,lichen,north,,,Cladonia.chlorophaea,HardLin,5,0.0532991681393098,0.0500648905532383,0.061074473783056,0.0650642476107745 -lichen,lichen,north,,,Cladonia.chlorophaea,UrbInd,5,0.0532991681393098,0.0499817131634582,0.0615848565365234,0.0650642476107745 -lichen,lichen,north,,,Cladonia.chlorophaea,Wellsites,5,0.0532991681393098,0.0499817131634582,0.0609767009879319,0.0650642476107745 -lichen,lichen,north,,,Cladonia.chlorophaea,Crop,5,0.0380044095359793,0.0341184540291455,0.0454004736227428,0.0460081436400004 -lichen,lichen,north,,,Cladonia.chlorophaea,TameP,5,0.0532991681393098,0.0528511343261779,0.0628169420376141,0.0650642476107745 -lichen,lichen,north,,,Cladonia.chlorophaea,RoughP,5,0.0532991681393098,0.0500648905532383,0.0628169420376141,0.0650642476107745 -lichen,lichen,north,,,Physcia.adscendens,WhiteSpruce,5,0.0806629600971171,0.0698994722058475,0.0866333146962459,0.0822000954374391 -lichen,lichen,north,,,Physcia.adscendens,Pine,5,0.0626159340188821,0.0570811905265671,0.0748186407434193,0.0714547700772653 -lichen,lichen,north,,,Physcia.adscendens,Deciduous,5,0.500089448767689,0.438222461763524,0.508535269344923,0.497979687375402 -lichen,lichen,north,,,Physcia.adscendens,Mixedwood,5,0.265269526065118,0.186373005275984,0.299702134864734,0.23822741546479 -lichen,lichen,north,,,Physcia.adscendens,BlackSpruce,5,0.0516397924145044,0.0483242273287214,0.0604606609752789,0.058549049308985 -lichen,lichen,north,,,Physcia.adscendens,TreedFen,5,0.0492807051069703,0.0470970183357062,0.0571078486023795,0.0564754268980052 -lichen,lichen,north,,,Physcia.adscendens,TreedSwamp,5,0.264332166092181,0.205485076993652,0.316781681540438,0.264332166092181 -lichen,lichen,north,,,Physcia.adscendens,GraminoidFen,5,0.111936676169408,0.0582126431029275,0.17425887927067,0.071855678171669 -lichen,lichen,north,,,Physcia.adscendens,ShrubbyFen,5,0.0549818690600283,0.0521383439087348,0.0633011429361176,0.0612276717910056 -lichen,lichen,north,,,Physcia.adscendens,ShrubbyBog,5,0.0524856406925512,0.049935694332593,0.0609962862836668,0.0598881125799547 -lichen,lichen,north,,,Physcia.adscendens,ShrubbySwamp,5,0.132036305569302,0.113451385792694,0.143177926984209,0.132036305569302 -lichen,lichen,north,,,Physcia.adscendens,Marsh,5,0.0659585953546897,0.0525497281122027,0.0713124398527733,0.0748629122971409 -lichen,lichen,north,,,Physcia.adscendens,Shrub,5,0.128475604166803,0.108330933618258,0.159954843138826,0.154369474824948 -lichen,lichen,north,,,Physcia.adscendens,Grass,5,0.183795602074123,0.168710801800108,0.201226759181919,0.207207009991177 -lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruceR,5,0.0408768378358444,0.0313317711922702,0.0558914917339861,0.0572556637143324 -lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce1,5,0.236777358748675,0.19180780861585,0.277591115395575,0.205104755449968 -lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce2,5,0.370744080718217,0.335806723827853,0.441342374887105,0.370744080718217 -lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce3,5,0.370744080718217,0.335806723827853,0.441342374887105,0.370744080718217 -lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce4,5,0.370744080718217,0.335806723827853,0.441342374887105,0.370744080718217 -lichen,lichen,north,,,Physcia.adscendens,CCPineR,5,0.0435966817775946,0.0348977738738095,0.057064038290726,0.0572556637143324 -lichen,lichen,north,,,Physcia.adscendens,CCPine1,5,0.0728828084245059,0.0498040266840263,0.0814788554074896,0.0816075246763179 -lichen,lichen,north,,,Physcia.adscendens,CCPine2,5,0.140955439826354,0.0729397389591036,0.196393912110452,0.153093914587714 -lichen,lichen,north,,,Physcia.adscendens,CCPine3,5,0.140955439826354,0.0729397389591036,0.196393912110452,0.153093914587714 -lichen,lichen,north,,,Physcia.adscendens,CCPine4,5,0.140955439826354,0.0729397389591036,0.196393912110452,0.153093914587714 -lichen,lichen,north,,,Physcia.adscendens,CCDeciduousR,5,0.181095023333984,0.132249215424742,0.206204938021702,0.210422112694386 -lichen,lichen,north,,,Physcia.adscendens,CCDeciduous1,5,0.267690593841598,0.240572859472401,0.301213097103537,0.261185107768382 -lichen,lichen,north,,,Physcia.adscendens,CCDeciduous2,5,0.220688225353536,0.18926200686686,0.282163359914917,0.220688225353536 -lichen,lichen,north,,,Physcia.adscendens,CCDeciduous3,5,0.220688225353536,0.18926200686686,0.282163359914917,0.220688225353536 -lichen,lichen,north,,,Physcia.adscendens,CCDeciduous4,5,0.220688225353536,0.18926200686686,0.282163359914917,0.220688225353536 -lichen,lichen,north,,,Physcia.adscendens,CCMixedwoodR,5,0.181095023333984,0.132249215424742,0.206204938021702,0.210422112694386 -lichen,lichen,north,,,Physcia.adscendens,CCMixedwood1,5,0.267690593841598,0.240572859472401,0.301213097103537,0.261185107768382 -lichen,lichen,north,,,Physcia.adscendens,CCMixedwood2,5,0.220688225353536,0.18926200686686,0.282163359914917,0.220688225353536 -lichen,lichen,north,,,Physcia.adscendens,CCMixedwood3,5,0.220688225353536,0.18926200686686,0.282163359914917,0.220688225353536 -lichen,lichen,north,,,Physcia.adscendens,CCMixedwood4,5,0.220688225353536,0.18926200686686,0.282163359914917,0.220688225353536 -lichen,lichen,north,,,Physcia.adscendens,EnSeismic,5,0.0583394560708704,0.0363880943275738,0.0633539998563236,0.0583394560708704 -lichen,lichen,north,,,Physcia.adscendens,EnSoftLin,5,0.058707620951148,0.0489130320224212,0.0773731260289573,0.058707620951148 -lichen,lichen,north,,,Physcia.adscendens,TrSoftLin,5,0.0495423079807509,0.0358957612064444,0.0521226681142616,0.0500921263173159 -lichen,lichen,north,,,Physcia.adscendens,HardLin,5,0.0752671644650605,0.069964335873053,0.0934517871592518,0.0733681504030698 -lichen,lichen,north,,,Physcia.adscendens,UrbInd,5,0.0854103497317977,0.0718138809056833,0.0912876639458869,0.0927667100115855 -lichen,lichen,north,,,Physcia.adscendens,Wellsites,5,0.0705807137451294,0.0640466875595764,0.0743465556159333,0.0713549733394766 -lichen,lichen,north,,,Physcia.adscendens,Crop,5,0.0516888781546591,0.0460708739606524,0.0548513064460412,0.055960451606295 -lichen,lichen,north,,,Physcia.adscendens,TameP,5,0.0855457668904207,0.0656920901562321,0.0990178703104062,0.0713549733394766 -lichen,lichen,north,,,Physcia.adscendens,RoughP,5,0.224250176595246,0.211122574934919,0.241416808669401,0.204523553351491 -lichen,lichen,south,,,Cladonia.chlorophaea,Loamy,5,0.052195559133926,0.0298034654721256,0.0565211405800403,0.052195559133926 -lichen,lichen,south,,,Cladonia.chlorophaea,SandyLoam,5,0.0425856522861778,0.0302726475798714,0.0497195180448668,0.0487452256562415 -lichen,lichen,south,,,Cladonia.chlorophaea,ClaySub,5,0.0413784697032066,0.0276654396738082,0.0457685923896542,0.0479897327403985 -lichen,lichen,south,,,Cladonia.chlorophaea,RapidDrain,5,0.0546149210507219,0.041080392280561,0.0708567634834832,0.0546149210507219 -lichen,lichen,south,,,Cladonia.chlorophaea,Blowout,5,0.0780094820043586,0.0596067533240845,0.096773096395934,0.0639696574300574 -lichen,lichen,south,,,Cladonia.chlorophaea,ThinBreak,5,0.0537735974901693,0.0397111361448846,0.0757908338691028,0.0537735974901693 -lichen,lichen,south,,,Cladonia.chlorophaea,Other,5,0.036227904757085,0.0283715150135987,0.0414842387317306,0.0445628614577478 -lichen,lichen,south,,,Cladonia.chlorophaea,EnSeismic,5,0.0529347843674136,0.0429035640395056,0.0545282781036341,0.0529170529631366 -lichen,lichen,south,,,Cladonia.chlorophaea,EnSoftLin,5,0.0429548569110704,0.0291341303978379,0.0505046848379649,0.0529170529631366 -lichen,lichen,south,,,Cladonia.chlorophaea,TrSoftLin,5,0.036227904757085,0.0274973236575878,0.0467486393575298,0.0529170529631366 -lichen,lichen,south,,,Cladonia.chlorophaea,HardLin,5,0.0325250266364422,0.0257919425493649,0.0389494519399109,0.0405311339177189 -lichen,lichen,south,,,Cladonia.chlorophaea,UrbInd,5,0.0325250266364422,0.025487274593689,0.0396805614107728,0.0417496497024888 -lichen,lichen,south,,,Cladonia.chlorophaea,Wellsites,5,0.0468994772272502,0.0335218551537618,0.110108450064424,0.0471574097791665 -lichen,lichen,south,,,Cladonia.chlorophaea,Crop,5,0.017126601937958,0.013984561064807,0.0202956706941388,0.0211712603591146 -lichen,lichen,south,,,Cladonia.chlorophaea,TameP,5,0.0380699708892799,0.0303114843572072,0.0428565295124077,0.0413582644084717 -lichen,lichen,south,,,Cladonia.chlorophaea,RoughP,5,0.0329099405296737,0.0273239725961271,0.0524931851726732,0.0493820842827578 -lichen,lichen,south,,,Physcia.adscendens,Loamy,5,0.179065767990214,0.128970289310936,0.237812775921372,0.179065767990214 -lichen,lichen,south,,,Physcia.adscendens,SandyLoam,5,0.403266885170568,0.389243097258811,0.414990358648874,0.403266885170568 -lichen,lichen,south,,,Physcia.adscendens,ClaySub,5,0.164263617137536,0.104770475168156,0.186605338887168,0.164263617137536 -lichen,lichen,south,,,Physcia.adscendens,RapidDrain,5,0.352363897448269,0.309864605279309,0.392953327889898,0.352363897448269 -lichen,lichen,south,,,Physcia.adscendens,Blowout,5,0.111284827489066,0.0855370985406267,0.139401128948304,0.133159184545919 -lichen,lichen,south,,,Physcia.adscendens,ThinBreak,5,0.170038630939121,0.136254906740026,0.182630845073522,0.183922674718338 -lichen,lichen,south,,,Physcia.adscendens,Other,5,0.158615578426656,0.106589675851018,0.212349783562352,0.158615578426656 -lichen,lichen,south,,,Physcia.adscendens,EnSeismic,5,0.207352039272678,0.13417780130087,0.270959386283416,0.172762769323312 -lichen,lichen,south,,,Physcia.adscendens,EnSoftLin,5,0.12612821551612,0.10269196061674,0.153354180787079,0.12612821551612 -lichen,lichen,south,,,Physcia.adscendens,TrSoftLin,5,0.154917422019291,0.139408500150615,0.193091674009417,0.197237290145073 -lichen,lichen,south,,,Physcia.adscendens,HardLin,5,0.087199922727172,0.0771298067728728,0.117889353745431,0.087199922727172 -lichen,lichen,south,,,Physcia.adscendens,UrbInd,5,0.10895445880468,0.0865455578561292,0.172817598513946,0.111165041122629 -lichen,lichen,south,,,Physcia.adscendens,Wellsites,5,0.10751617068656,0.0891435413108165,0.172860839275773,0.103035535299215 -lichen,lichen,south,,,Physcia.adscendens,Crop,5,0.0313693504932321,0.0273192438632444,0.0380055782684392,0.0381167435416052 -lichen,lichen,south,,,Physcia.adscendens,TameP,5,0.0698273794292601,0.0637639761558689,0.0872800783846081,0.0909427875505156 -lichen,lichen,south,,,Physcia.adscendens,RoughP,5,0.0763312963816246,0.0587904841957844,0.0870681778044053,0.0916742413946083 -mite,mite,north,,,Ceratozetes.gracilis,WhiteSpruce,5,0.0669749672760506,0.0622129841230631,0.0689199644525355,0.0696997934439586 -mite,mite,north,,,Ceratozetes.gracilis,Pine,5,0.04256789244931,0.0408764615452013,0.0516686038844872,0.0571993734275427 -mite,mite,north,,,Ceratozetes.gracilis,Deciduous,5,0.217494218755039,0.17945618366329,0.223828209314943,0.192711999446898 -mite,mite,north,,,Ceratozetes.gracilis,Mixedwood,5,0.0994123995656655,0.094977309807823,0.151696915478468,0.0966892300457536 -mite,mite,north,,,Ceratozetes.gracilis,BlackSpruce,5,0.0516770601449564,0.0454005393731902,0.0617733870966172,0.0659380709353549 -mite,mite,north,,,Ceratozetes.gracilis,TreedFen,5,0.0641717697840856,0.0567526855589949,0.0688723813089783,0.0701990130450116 -mite,mite,north,,,Ceratozetes.gracilis,TreedSwamp,5,0.193916946829892,0.156060825979128,0.33101395465164,0.15953971410373 -mite,mite,north,,,Ceratozetes.gracilis,GraminoidFen,5,0.0633035735611179,0.0571414697682801,0.0678135990329456,0.0701990130450116 -mite,mite,north,,,Ceratozetes.gracilis,ShrubbyFen,5,0.0633035735611179,0.0571414697682801,0.0678135990329456,0.0701990130450116 -mite,mite,north,,,Ceratozetes.gracilis,ShrubbyBog,5,0.0516770601449564,0.0454005393731902,0.0617733870966172,0.0659380709353549 -mite,mite,north,,,Ceratozetes.gracilis,ShrubbySwamp,5,0.203439597738164,0.168584557068857,0.27067771482627,0.148627319407195 -mite,mite,north,,,Ceratozetes.gracilis,Marsh,5,0.0952742474787555,0.0655242603774862,0.283125156180583,0.0760020275170621 -mite,mite,north,,,Ceratozetes.gracilis,Shrub,5,0.0627865958807114,0.059835532483509,0.0852807087169419,0.0721657250276492 -mite,mite,north,,,Ceratozetes.gracilis,Grass,5,0.0718546290377943,0.056343833299908,0.0809049805637031,0.0721657250276492 -mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruceR,5,0.0588143710260348,0.0522836703403517,0.0689698311930399,0.0734118003088178 -mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce1,5,0.135555599764672,0.121959952490186,0.172439011313113,0.132835115520776 -mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce2,5,0.1019083393474,0.0554698895240797,0.128648719550788,0.1019083393474 -mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce3,5,0.1019083393474,0.0554698895240797,0.128648719550788,0.1019083393474 -mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce4,5,0.1019083393474,0.0554698895240797,0.128648719550788,0.1019083393474 -mite,mite,north,,,Ceratozetes.gracilis,CCPineR,5,0.0588143710260348,0.0522836703403517,0.0689698311930399,0.0734118003088178 -mite,mite,north,,,Ceratozetes.gracilis,CCPine1,5,0.0588143710260348,0.0535617472998535,0.0689698311930399,0.0734118003088178 -mite,mite,north,,,Ceratozetes.gracilis,CCPine2,5,0.0588143710260348,0.0503436986652951,0.0716778074468958,0.0779250940652443 -mite,mite,north,,,Ceratozetes.gracilis,CCPine3,5,0.0588143710260348,0.0503436986652951,0.0716778074468958,0.0779250940652443 -mite,mite,north,,,Ceratozetes.gracilis,CCPine4,5,0.0588143710260348,0.0503436986652951,0.0716778074468958,0.0779250940652443 -mite,mite,north,,,Ceratozetes.gracilis,CCDeciduousR,5,0.105593505368177,0.0798277019137626,0.173923462313821,0.14281075430705 -mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous1,5,0.225331462315651,0.1758949902012,0.316107212350169,0.244185099126181 -mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous2,5,0.0872563275595971,0.0705478286725866,0.158331259342934,0.14281075430705 -mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous3,5,0.0872563275595971,0.0705478286725866,0.158331259342934,0.14281075430705 -mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous4,5,0.0872563275595971,0.0705478286725866,0.158331259342934,0.14281075430705 -mite,mite,north,,,Ceratozetes.gracilis,CCMixedwoodR,5,0.105593505368177,0.0798277019137626,0.173923462313821,0.14281075430705 -mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood1,5,0.225331462315651,0.1758949902012,0.316107212350169,0.244185099126181 -mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood2,5,0.0872563275595971,0.0705478286725866,0.158331259342934,0.14281075430705 -mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood3,5,0.0872563275595971,0.0705478286725866,0.158331259342934,0.14281075430705 -mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood4,5,0.0872563275595971,0.0705478286725866,0.158331259342934,0.14281075430705 -mite,mite,north,,,Ceratozetes.gracilis,EnSeismic,5,0.0849102162502049,0.0740619229939614,0.13721658955695,0.0849102162502049 -mite,mite,north,,,Ceratozetes.gracilis,EnSoftLin,5,0.0915906950067975,0.0770152385279824,0.118814379220065,0.0802815157979349 -mite,mite,north,,,Ceratozetes.gracilis,TrSoftLin,5,0.0663694973434072,0.0657385973301974,0.0734803475031907,0.0772202736623088 -mite,mite,north,,,Ceratozetes.gracilis,HardLin,5,0.0587135033801385,0.0509538282426539,0.0657184723912073,0.0703715576369905 -mite,mite,north,,,Ceratozetes.gracilis,UrbInd,5,0.0964962847879036,0.0764451513903517,0.121682767362242,0.0844134434753489 -mite,mite,north,,,Ceratozetes.gracilis,Wellsites,5,0.0739763395051338,0.0598756252832297,0.0904450143610713,0.0739763395051338 -mite,mite,north,,,Ceratozetes.gracilis,Crop,5,0.0582196475160354,0.0478134747634196,0.067397377794943,0.0662962909115865 -mite,mite,north,,,Ceratozetes.gracilis,TameP,5,0.0623068775193731,0.0535673460289789,0.0673375729344789,0.0703715576369905 -mite,mite,north,,,Ceratozetes.gracilis,RoughP,5,0.15093199187711,0.125635623078688,0.232703414984325,0.15093199187711 -mite,mite,north,,,Trhypochthonius.tectorum,WhiteSpruce,5,0.0577755747362142,0.0538019452873725,0.0695318781053339,0.0641664571793333 -mite,mite,north,,,Trhypochthonius.tectorum,Pine,5,0.0671952817921155,0.0604179332609355,0.0837975300991683,0.0780420695640347 -mite,mite,north,,,Trhypochthonius.tectorum,Deciduous,5,0.0591776854284389,0.0538019452873725,0.0708434212620666,0.0641664571793333 -mite,mite,north,,,Trhypochthonius.tectorum,Mixedwood,5,0.0577755747362142,0.0542315511008591,0.069917634425821,0.0641664571793333 -mite,mite,north,,,Trhypochthonius.tectorum,BlackSpruce,5,0.0718834766092794,0.0578186846481628,0.0793309673711368,0.0718834766092794 -mite,mite,north,,,Trhypochthonius.tectorum,TreedFen,5,0.0544560962914867,0.0493066233077781,0.0667855423630775,0.0665924879139367 -mite,mite,north,,,Trhypochthonius.tectorum,TreedSwamp,5,0.0517004780663654,0.0496562190049392,0.0678805488864248,0.0778968506573017 -mite,mite,north,,,Trhypochthonius.tectorum,GraminoidFen,5,0.0652055996070153,0.0493066233077781,0.068571394636323,0.0665924879139367 -mite,mite,north,,,Trhypochthonius.tectorum,ShrubbyFen,5,0.0652055996070153,0.0532779842531473,0.0673491269294197,0.0665924879139367 -mite,mite,north,,,Trhypochthonius.tectorum,ShrubbyBog,5,0.0539275025282014,0.0493066233077781,0.0660377325911681,0.0665924879139367 -mite,mite,north,,,Trhypochthonius.tectorum,ShrubbySwamp,5,0.0495941603886875,0.044439849505053,0.0540875339013449,0.0569796852160303 -mite,mite,north,,,Trhypochthonius.tectorum,Marsh,5,0.0528560962301094,0.0504011279043729,0.0651312347515791,0.0628200790094008 -mite,mite,north,,,Trhypochthonius.tectorum,Shrub,5,0.0528560962301094,0.0485709019332074,0.0617348050746604,0.0628200790094008 -mite,mite,north,,,Trhypochthonius.tectorum,Grass,5,0.0528560962301094,0.0473251458076707,0.0715616899357351,0.0690489152512388 -mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruceR,5,0.0785412589787557,0.0575294702367993,0.0949478912990213,0.0863413666769157 -mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce1,5,0.0558111876129656,0.0506179022680299,0.0617348050746604,0.0628200790094008 -mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce2,5,0.0558111876129656,0.0506179022680299,0.0617348050746604,0.0628200790094008 -mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce3,5,0.0558111876129656,0.0506179022680299,0.0617348050746604,0.0628200790094008 -mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce4,5,0.0558111876129656,0.0506179022680299,0.0617348050746604,0.0628200790094008 -mite,mite,north,,,Trhypochthonius.tectorum,CCPineR,5,0.145915212047275,0.0941318069154416,0.219519917662366,0.145915212047275 -mite,mite,north,,,Trhypochthonius.tectorum,CCPine1,5,0.0590717631474358,0.0506179022680299,0.0820899853270626,0.0628200790094008 -mite,mite,north,,,Trhypochthonius.tectorum,CCPine2,5,0.0590717631474358,0.0506179022680299,0.0820899853270626,0.0628200790094008 -mite,mite,north,,,Trhypochthonius.tectorum,CCPine3,5,0.0590717631474358,0.0506179022680299,0.0820899853270626,0.0628200790094008 -mite,mite,north,,,Trhypochthonius.tectorum,CCPine4,5,0.0590717631474358,0.0506179022680299,0.0820899853270626,0.0628200790094008 -mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduousR,5,0.0725545296228128,0.0528016508160498,0.138396691591419,0.0725545296228128 -mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous1,5,0.0580272550712131,0.0477341689597153,0.0617348050746604,0.0628200790094008 -mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous2,5,0.0580272550712131,0.0477341689597153,0.0617348050746604,0.0628200790094008 -mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous3,5,0.0580272550712131,0.0477341689597153,0.0617348050746604,0.0628200790094008 -mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous4,5,0.0580272550712131,0.0477341689597153,0.0617348050746604,0.0628200790094008 -mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwoodR,5,0.0725545296228128,0.0528016508160498,0.138396691591419,0.0725545296228128 -mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood1,5,0.0580272550712131,0.0477341689597153,0.0617348050746604,0.0628200790094008 -mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood2,5,0.0580272550712131,0.0477341689597153,0.0617348050746604,0.0628200790094008 -mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood3,5,0.0580272550712131,0.0477341689597153,0.0617348050746604,0.0628200790094008 -mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood4,5,0.0580272550712131,0.0477341689597153,0.0617348050746604,0.0628200790094008 -mite,mite,north,,,Trhypochthonius.tectorum,EnSeismic,5,0.0910582138455917,0.0533313162094705,0.0983231441298929,0.0913601067139062 -mite,mite,north,,,Trhypochthonius.tectorum,EnSoftLin,5,0.0601068941725498,0.0485709019332074,0.0647553700470357,0.0628200790094008 -mite,mite,north,,,Trhypochthonius.tectorum,TrSoftLin,5,0.0601068941725498,0.0485709019332074,0.062920352038396,0.0628200790094008 -mite,mite,north,,,Trhypochthonius.tectorum,HardLin,5,0.0480451166856463,0.0431158598923391,0.055201471005683,0.0548416115308383 -mite,mite,north,,,Trhypochthonius.tectorum,UrbInd,5,0.0480451166856463,0.0414026064580054,0.055201471005683,0.0548416115308383 -mite,mite,north,,,Trhypochthonius.tectorum,Wellsites,5,0.0548416115308383,0.0435499729795206,0.0734624155408599,0.0548416115308383 -mite,mite,north,,,Trhypochthonius.tectorum,Crop,5,0.0428533863920896,0.0414026064580054,0.0485932244491473,0.0495027940540152 -mite,mite,north,,,Trhypochthonius.tectorum,TameP,5,0.0480451166856463,0.0414026064580054,0.055201471005683,0.0548416115308383 -mite,mite,north,,,Trhypochthonius.tectorum,RoughP,5,0.0586935984593829,0.0444195517869312,0.0733712043527113,0.0586935984593829 -mite,mite,south,,,Ceratozetes.gracilis,Loamy,5,0.0118091460727822,0.0091958478526172,0.0130941529470914,0.0138446843806268 -mite,mite,south,,,Ceratozetes.gracilis,SandyLoam,5,0.011658132266668,0.00952673996191176,0.0133748258168454,0.0144186123128876 -mite,mite,south,,,Ceratozetes.gracilis,ClaySub,5,0.011178405272004,0.00853544536195953,0.0128204034708154,0.0134945750695042 -mite,mite,south,,,Ceratozetes.gracilis,RapidDrain,5,0.0112975910152107,0.00870305149571039,0.0134642923732254,0.0144186123128876 -mite,mite,south,,,Ceratozetes.gracilis,Blowout,5,0.0112462955756537,0.00914953810155372,0.0126157814477868,0.0134945750695042 -mite,mite,south,,,Ceratozetes.gracilis,ThinBreak,5,0.010832537525368,0.00849770905858164,0.012595263271964,0.0134945750695042 -mite,mite,south,,,Ceratozetes.gracilis,Other,5,0.0111962149229347,0.00867867842028293,0.012595263271964,0.0134945750695042 -mite,mite,south,,,Ceratozetes.gracilis,EnSeismic,5,0.0113731403877682,0.00908815417692333,0.0204970908560639,0.0159170215706303 -mite,mite,south,,,Ceratozetes.gracilis,EnSoftLin,5,0.0113731403877682,0.00908815417692333,0.0332645388954519,0.0159170215706303 -mite,mite,south,,,Ceratozetes.gracilis,TrSoftLin,5,0.0159170215706303,0.00908815417692333,0.0247497593181276,0.0159170215706303 -mite,mite,south,,,Ceratozetes.gracilis,HardLin,5,0.0103529092184937,0.00802174937917919,0.0119472028262867,0.0124144743267087 -mite,mite,south,,,Ceratozetes.gracilis,UrbInd,5,0.0103893155644195,0.00906812989470643,0.0111284172276856,0.011472604195203 -mite,mite,south,,,Ceratozetes.gracilis,Wellsites,5,0.0103529092184937,0.00802174937917919,0.0119472028262867,0.0124144743267087 -mite,mite,south,,,Ceratozetes.gracilis,Crop,5,0.0101310267749695,0.00778269757271738,0.0117481079577554,0.0119305082254496 -mite,mite,south,,,Ceratozetes.gracilis,TameP,5,0.00993830120627124,0.00752459835016003,0.0117317368241024,0.0119534067865342 -mite,mite,south,,,Ceratozetes.gracilis,RoughP,5,0.0103529092184937,0.00801410107291135,0.0120083773482071,0.0124144743267087 -mite,mite,south,,,Trhypochthonius.tectorum,Loamy,5,0.0351643832387039,0.0294309160724408,0.0419800441301916,0.0453560940842288 -mite,mite,south,,,Trhypochthonius.tectorum,SandyLoam,5,0.0317217130098143,0.0270112459897541,0.0422091417345682,0.0445529864231478 -mite,mite,south,,,Trhypochthonius.tectorum,ClaySub,5,0.0271760098648568,0.0252725299050298,0.0400391206090229,0.0445529864231478 -mite,mite,south,,,Trhypochthonius.tectorum,RapidDrain,5,0.0306487453560001,0.0221083702615456,0.0391376921951299,0.0445529864231478 -mite,mite,south,,,Trhypochthonius.tectorum,Blowout,5,0.0576094249553107,0.0313945523695571,0.081500559049622,0.0576094249553107 -mite,mite,south,,,Trhypochthonius.tectorum,ThinBreak,5,0.0287383827719498,0.0226198278220152,0.039844730787817,0.0445529864231478 -mite,mite,south,,,Trhypochthonius.tectorum,Other,5,0.0312153329695141,0.0270927496568076,0.0471808350380845,0.0445529864231478 -mite,mite,south,,,Trhypochthonius.tectorum,EnSeismic,5,0.0296292424772318,0.0211180474977249,0.0386096543638731,0.0445529864231478 -mite,mite,south,,,Trhypochthonius.tectorum,EnSoftLin,5,0.0296292424772318,0.0211180474977249,0.0386096543638731,0.0445529864231478 -mite,mite,south,,,Trhypochthonius.tectorum,TrSoftLin,5,0.0246060034370251,0.020255919275666,0.0379429581936407,0.0445529864231478 -mite,mite,south,,,Trhypochthonius.tectorum,HardLin,5,0.0407568519468657,0.0295582515338898,0.070236155360768,0.0407568519468657 -mite,mite,south,,,Trhypochthonius.tectorum,UrbInd,5,0.0304390063860564,0.0230296933985166,0.0375670501020477,0.0407568519468657 -mite,mite,south,,,Trhypochthonius.tectorum,Wellsites,5,0.035906973044058,0.0269422420630365,0.0424189684361255,0.0459508545998354 -mite,mite,south,,,Trhypochthonius.tectorum,Crop,5,0.0260558215803738,0.0217135944946595,0.0373501944737719,0.0416046766694066 -mite,mite,south,,,Trhypochthonius.tectorum,TameP,5,0.0359245552961453,0.0238905721090203,0.0390016511379287,0.0407568519468657 -mite,mite,south,,,Trhypochthonius.tectorum,RoughP,5,0.0407568519468657,0.0235432893681054,0.0417533961232613,0.0407568519468657 -vascular_plant,vascular_plant,north,,,Galium.boreale,WhiteSpruce,5,0.0905261600791059,0.0726539987119275,0.105465942868795,0.109940308173042 -vascular_plant,vascular_plant,north,,,Galium.boreale,Pine,5,0.0882177641944994,0.0780829990507653,0.0990858286878633,0.0882177641944994 -vascular_plant,vascular_plant,north,,,Galium.boreale,Deciduous,5,0.465299532424074,0.433296638965715,0.475383165890563,0.456521289512612 -vascular_plant,vascular_plant,north,,,Galium.boreale,Mixedwood,5,0.205926105528394,0.161700999063794,0.215030784759387,0.189429440007921 -vascular_plant,vascular_plant,north,,,Galium.boreale,BlackSpruce,5,0.0478785132484108,0.0341393328381514,0.0550709099126156,0.0491594576902939 -vascular_plant,vascular_plant,north,,,Galium.boreale,TreedFen,5,0.0390244960628199,0.0323991389608112,0.0476952661693537,0.0498565474064884 -vascular_plant,vascular_plant,north,,,Galium.boreale,TreedSwamp,5,0.163110948575593,0.153077522516154,0.230612133392176,0.163110948575593 -vascular_plant,vascular_plant,north,,,Galium.boreale,GraminoidFen,5,0.0482626042376281,0.0348396270394228,0.0549132963187686,0.0557946360258168 -vascular_plant,vascular_plant,north,,,Galium.boreale,ShrubbyFen,5,0.0486375982349556,0.0346089602336751,0.0521306580968099,0.0534252909715577 -vascular_plant,vascular_plant,north,,,Galium.boreale,ShrubbyBog,5,0.044130192624148,0.031163942092392,0.0486470799135407,0.0491594576902939 -vascular_plant,vascular_plant,north,,,Galium.boreale,ShrubbySwamp,5,0.083709111718631,0.0609964454455046,0.0941791378292602,0.083709111718631 -vascular_plant,vascular_plant,north,,,Galium.boreale,Marsh,5,0.0698959810812024,0.0529936392525844,0.0843514654717594,0.0880256124111306 -vascular_plant,vascular_plant,north,,,Galium.boreale,Shrub,5,0.204684354936933,0.127212036636942,0.26235561958285,0.181675403633832 -vascular_plant,vascular_plant,north,,,Galium.boreale,Grass,5,0.175738621829022,0.107442058241296,0.203385998163264,0.152213120330482 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruceR,5,0.380414005666068,0.29754976604351,0.431319823216388,0.371243492127191 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce1,5,0.442218169166312,0.345601963663094,0.534892341530778,0.358244182378353 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce2,5,0.350930709571412,0.236898333085665,0.455250381120309,0.285560235072748 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce3,5,0.350930709571412,0.236898333085665,0.455250381120309,0.285560235072748 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce4,5,0.350930709571412,0.236898333085665,0.455250381120309,0.285560235072748 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCPineR,5,0.148154982777589,0.111507204449231,0.334027199025936,0.131260898266157 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine1,5,0.154376654469905,0.106263214861255,0.171861231246759,0.15442465933251 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine2,5,0.105512538646366,0.0965888866874318,0.136635832703976,0.138277996063961 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine3,5,0.105512538646366,0.0965888866874318,0.136635832703976,0.138277996063961 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine4,5,0.105512538646366,0.0965888866874318,0.136635832703976,0.138277996063961 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduousR,5,0.356334997841159,0.32007286426474,0.384825825197441,0.356334997841159 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous1,5,0.608707074035124,0.567612457808335,0.665013792414914,0.553877504464074 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous2,5,0.393947566692306,0.357535477315663,0.442738415728514,0.389522338833368 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous3,5,0.393947566692306,0.357535477315663,0.442738415728514,0.389522338833368 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous4,5,0.393947566692306,0.357535477315663,0.442738415728514,0.389522338833368 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwoodR,5,0.356334997841159,0.32007286426474,0.384825825197441,0.356334997841159 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood1,5,0.608707074035124,0.567612457808335,0.665013792414914,0.553877504464074 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood2,5,0.393947566692306,0.357535477315663,0.442738415728514,0.389522338833368 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood3,5,0.393947566692306,0.357535477315663,0.442738415728514,0.389522338833368 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood4,5,0.393947566692306,0.357535477315663,0.442738415728514,0.389522338833368 -vascular_plant,vascular_plant,north,,,Galium.boreale,EnSeismic,5,0.057590680417951,0.0510600219459448,0.10016910379681,0.101329985556375 -vascular_plant,vascular_plant,north,,,Galium.boreale,EnSoftLin,5,0.09564011072873,0.0441515996588241,0.100455007573555,0.10270284784644 -vascular_plant,vascular_plant,north,,,Galium.boreale,TrSoftLin,5,0.0709020534317746,0.0450965505256889,0.109751826577989,0.114356175129852 -vascular_plant,vascular_plant,north,,,Galium.boreale,HardLin,5,0.0748632969541923,0.0639691941447502,0.0974711299865728,0.0748632969541923 -vascular_plant,vascular_plant,north,,,Galium.boreale,UrbInd,5,0.073863307370164,0.0485947520789427,0.0815875653608419,0.073863307370164 -vascular_plant,vascular_plant,north,,,Galium.boreale,Wellsites,5,0.0573058985665059,0.0468204045772708,0.0851247381100821,0.0698044961284464 -vascular_plant,vascular_plant,north,,,Galium.boreale,Crop,5,0.037298697978295,0.0274503557014551,0.0405043959144592,0.037298697978295 -vascular_plant,vascular_plant,north,,,Galium.boreale,TameP,5,0.060587407386995,0.0492885202663003,0.0702078577975504,0.0684941331197969 -vascular_plant,vascular_plant,north,,,Galium.boreale,RoughP,5,0.218687359756944,0.128866866907942,0.277667355018981,0.218687359756944 -vascular_plant,vascular_plant,north,,,Vicia.americana,WhiteSpruce,5,0.0486581668699057,0.037714432509289,0.0577571994569696,0.0618662503281404 -vascular_plant,vascular_plant,north,,,Vicia.americana,Pine,5,0.0591982401531878,0.0556506192021974,0.0700348774453486,0.0756981766456566 -vascular_plant,vascular_plant,north,,,Vicia.americana,Deciduous,5,0.489665218569576,0.389112756254434,0.595028218954258,0.46933882924525 -vascular_plant,vascular_plant,north,,,Vicia.americana,Mixedwood,5,0.272598714730191,0.241629222739608,0.295371592297177,0.242428955682496 -vascular_plant,vascular_plant,north,,,Vicia.americana,BlackSpruce,5,0.0392530076125695,0.0278355698570972,0.0474674347295187,0.0519945996737369 -vascular_plant,vascular_plant,north,,,Vicia.americana,TreedFen,5,0.0361399521075309,0.027592110740187,0.0450886892443672,0.0497769927854594 -vascular_plant,vascular_plant,north,,,Vicia.americana,TreedSwamp,5,0.164791871233975,0.145735616086114,0.212770602791757,0.152857577632565 -vascular_plant,vascular_plant,north,,,Vicia.americana,GraminoidFen,5,0.0491591419155907,0.0370475507603448,0.0593760829111141,0.0617833825466608 -vascular_plant,vascular_plant,north,,,Vicia.americana,ShrubbyFen,5,0.0441086268205254,0.0378698624103314,0.0547096597754249,0.058914436404479 -vascular_plant,vascular_plant,north,,,Vicia.americana,ShrubbyBog,5,0.0392530076125695,0.0278355698570972,0.0474674347295187,0.0519945996737369 -vascular_plant,vascular_plant,north,,,Vicia.americana,ShrubbySwamp,5,0.0694420473317629,0.052752882212602,0.109505561707169,0.103388339424152 -vascular_plant,vascular_plant,north,,,Vicia.americana,Marsh,5,0.10008164429858,0.0669974258535409,0.128198215403346,0.11042459286386 -vascular_plant,vascular_plant,north,,,Vicia.americana,Shrub,5,0.080955082403376,0.0431671757631007,0.0984802598877385,0.080955082403376 -vascular_plant,vascular_plant,north,,,Vicia.americana,Grass,5,0.112947239823599,0.0847241848287774,0.160950439530741,0.112947239823599 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruceR,5,0.10352021676731,0.0624529922352498,0.11468832026785,0.114834301444234 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce1,5,0.385404780569015,0.350618209593138,0.432581524092722,0.385404780569015 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce2,5,0.315071018848474,0.258440706793436,0.373089412237812,0.315071018848474 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce3,5,0.315071018848474,0.258440706793436,0.373089412237812,0.315071018848474 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce4,5,0.315071018848474,0.258440706793436,0.373089412237812,0.315071018848474 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCPineR,5,0.0621592968655072,0.0462697444564951,0.126352771620468,0.105151707738167 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine1,5,0.196600026133365,0.0728022972597945,0.257951068699789,0.196600026133365 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine2,5,0.0730762167894711,0.0615850109397236,0.122782775884628,0.143327431424619 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine3,5,0.0730762167894711,0.0615850109397236,0.122782775884628,0.143327431424619 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine4,5,0.0730762167894711,0.0615850109397236,0.122782775884628,0.143327431424619 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduousR,5,0.230881388349581,0.130814312137481,0.26028552835072,0.273809006571826 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous1,5,0.421098934210828,0.359913539297426,0.521048356830173,0.421098934210828 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous2,5,0.358824924265736,0.309864266971754,0.406894615895366,0.358824924265736 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous3,5,0.358824924265736,0.309864266971754,0.406894615895366,0.358824924265736 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous4,5,0.358824924265736,0.309864266971754,0.406894615895366,0.358824924265736 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwoodR,5,0.230881388349581,0.130814312137481,0.26028552835072,0.273809006571826 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood1,5,0.421098934210828,0.359913539297426,0.521048356830173,0.421098934210828 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood2,5,0.358824924265736,0.309864266971754,0.406894615895366,0.358824924265736 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood3,5,0.358824924265736,0.309864266971754,0.406894615895366,0.358824924265736 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood4,5,0.358824924265736,0.309864266971754,0.406894615895366,0.358824924265736 -vascular_plant,vascular_plant,north,,,Vicia.americana,EnSeismic,5,0.0762321492471983,0.0613857483749441,0.0979909210157939,0.0899187113257272 -vascular_plant,vascular_plant,north,,,Vicia.americana,EnSoftLin,5,0.12733730866857,0.10075226992879,0.197337696065495,0.208940739128041 -vascular_plant,vascular_plant,north,,,Vicia.americana,TrSoftLin,5,0.074023652005133,0.0603555484247621,0.0837173215407327,0.0899187113257272 -vascular_plant,vascular_plant,north,,,Vicia.americana,HardLin,5,0.108750813528169,0.0895787634706335,0.129445541476669,0.0952871947265366 -vascular_plant,vascular_plant,north,,,Vicia.americana,UrbInd,5,0.153307323213793,0.123411601132576,0.18591728264388,0.128387927000459 -vascular_plant,vascular_plant,north,,,Vicia.americana,Wellsites,5,0.0682550280437768,0.0559809263160038,0.112755807097797,0.10605346247 -vascular_plant,vascular_plant,north,,,Vicia.americana,Crop,5,0.0723599505335915,0.0608480634532804,0.0844100942475774,0.0851583829577764 -vascular_plant,vascular_plant,north,,,Vicia.americana,TameP,5,0.0924645904804092,0.0677790896216975,0.10400694518922,0.0929616308472977 -vascular_plant,vascular_plant,north,,,Vicia.americana,RoughP,5,0.085207793662974,0.0630224628711018,0.0949750448358125,0.0873014522562282 -vascular_plant,vascular_plant,south,,,Galium.boreale,Loamy,5,0.212139905840749,0.148719920801159,0.292642465432035,0.210161149652298 -vascular_plant,vascular_plant,south,,,Galium.boreale,SandyLoam,5,0.0456788630680879,0.035676304073348,0.0693622104376604,0.0588351608030491 -vascular_plant,vascular_plant,south,,,Galium.boreale,ClaySub,5,0.0469005828979151,0.0347792218772668,0.0547981020364095,0.058878554652313 -vascular_plant,vascular_plant,south,,,Galium.boreale,RapidDrain,5,0.0931603169732577,0.0588802338799269,0.23663603931149,0.167009266886178 -vascular_plant,vascular_plant,south,,,Galium.boreale,Blowout,5,0.0823148949158589,0.0523330806846195,0.163851755010256,0.152580627898323 -vascular_plant,vascular_plant,south,,,Galium.boreale,ThinBreak,5,0.0862703200466514,0.0610726202072316,0.128881001140756,0.155463849759419 -vascular_plant,vascular_plant,south,,,Galium.boreale,Other,5,0.0495568717372316,0.0338825773074383,0.0715239811195146,0.058878554652313 -vascular_plant,vascular_plant,south,,,Galium.boreale,EnSeismic,5,0.127066760394741,0.0577731413511546,0.226427466989801,0.0662234226244739 -vascular_plant,vascular_plant,south,,,Galium.boreale,EnSoftLin,5,0.0567918031928038,0.0369984063170848,0.0684952500425984,0.0578723417459656 -vascular_plant,vascular_plant,south,,,Galium.boreale,TrSoftLin,5,0.0501430149079961,0.0330303416893626,0.064297657939305,0.0606337080894297 -vascular_plant,vascular_plant,south,,,Galium.boreale,HardLin,5,0.0503229809766815,0.0328390471821546,0.102986779321736,0.0433047049321723 -vascular_plant,vascular_plant,south,,,Galium.boreale,UrbInd,5,0.0591976313142742,0.031268240954506,0.0712880441203804,0.0453650100325084 -vascular_plant,vascular_plant,south,,,Galium.boreale,Wellsites,5,0.11417242560448,0.0982178611568288,0.180973668182285,0.093589716378948 -vascular_plant,vascular_plant,south,,,Galium.boreale,Crop,5,0.0200193854225638,0.0135882011571378,0.0257681136118826,0.0259535140763464 -vascular_plant,vascular_plant,south,,,Galium.boreale,TameP,5,0.0349121367369461,0.0240991689034394,0.0505300747425592,0.0415579776559811 -vascular_plant,vascular_plant,south,,,Galium.boreale,RoughP,5,0.0414330370506466,0.0270771081472065,0.0542968411123968,0.0492107620062856 -vascular_plant,vascular_plant,south,,,Vicia.americana,Loamy,5,0.434895743635103,0.370156898788599,0.471709090663466,0.425663642968388 -vascular_plant,vascular_plant,south,,,Vicia.americana,SandyLoam,5,0.308277110708811,0.249167602859829,0.364013125892321,0.362183245685185 -vascular_plant,vascular_plant,south,,,Vicia.americana,ClaySub,5,0.692420938953158,0.646910248782837,0.760947490387763,0.708313756435149 -vascular_plant,vascular_plant,south,,,Vicia.americana,RapidDrain,5,0.305734727481026,0.21343920377989,0.355060033690606,0.317562407048366 -vascular_plant,vascular_plant,south,,,Vicia.americana,Blowout,5,0.115621281621045,0.0748651128893112,0.173014522689943,0.164080658380067 -vascular_plant,vascular_plant,south,,,Vicia.americana,ThinBreak,5,0.595140891251659,0.550391755875328,0.694919842305117,0.595140891251659 -vascular_plant,vascular_plant,south,,,Vicia.americana,Other,5,0.11234284222868,0.0980319879486246,0.167761582798757,0.160639309973368 -vascular_plant,vascular_plant,south,,,Vicia.americana,EnSeismic,5,0.170991805367137,0.136116899020984,0.277205807476619,0.283519777926939 -vascular_plant,vascular_plant,south,,,Vicia.americana,EnSoftLin,5,0.091369478600897,0.0822046598933772,0.153633319815548,0.191338931119729 -vascular_plant,vascular_plant,south,,,Vicia.americana,TrSoftLin,5,0.0715361502192472,0.0595000714560617,0.101560333332767,0.11627836989392 -vascular_plant,vascular_plant,south,,,Vicia.americana,HardLin,5,0.0710886934960088,0.0476502168943391,0.0762637897306265,0.0771096238897843 -vascular_plant,vascular_plant,south,,,Vicia.americana,UrbInd,5,0.0732336694531538,0.0606862406271869,0.0800777743591856,0.0732336694531538 -vascular_plant,vascular_plant,south,,,Vicia.americana,Wellsites,5,0.117723717187198,0.0743439024462338,0.204963787267155,0.0803771595830667 -vascular_plant,vascular_plant,south,,,Vicia.americana,Crop,5,0.043757799438472,0.042083002255709,0.0614856258080756,0.0654082704160852 -vascular_plant,vascular_plant,south,,,Vicia.americana,TameP,5,0.0608758486486179,0.049319172695898,0.071264012595995,0.0722322895776223 -vascular_plant,vascular_plant,south,,,Vicia.americana,RoughP,5,0.0581967167689662,0.0398767269402306,0.0640896379791293,0.0637514185018053 diff --git a/3_output/exp_001_gbm/tables/metric_summary.csv b/3_output/exp_001_gbm/tables/metric_summary.csv deleted file mode 100644 index d887a30..0000000 --- a/3_output/exp_001_gbm/tables/metric_summary.csv +++ /dev/null @@ -1,281 +0,0 @@ -taxon,run,region,season,part,species,metric,n,median,p10,p90,boot1,mean,sd -bird,bird,north,,,AMRO,insample_auc,5,0.751740281295548,0.748729848139245,0.752022814022201,0.748581694622527,0.750648483680412,0.00173091244575163 -bird,bird,north,,,AMRO,insample_deviance_explained,5,0.191190989633939,0.190251890038755,0.194928603999058,0.191190989633939,0.192280588871852,0.00239124459846264 -bird,bird,north,,,AMRO,insample_rmse,5,0.642541775981535,0.641083414132321,0.643420940690511,0.643506042942691,0.642397629501167,0.00134550527847958 -bird,bird,north,,,AMRO,insample_spearman,5,0.385374770676258,0.381242278468797,0.38659237208208,0.380930969830349,0.384183814278661,0.00271095979285837 -bird,bird,north,,,AMRO,insample_calibration_slope,5,1.08589957145208,1.08310192621792,1.09021157940199,1.09024810835911,1.08667181779307,0.00368628187241485 -bird,bird,north,,,AMRO,insample_prevalence,5,0.251486631016043,0.251004373826971,0.252433263182893,0.250861017819325,0.251649276245993,0.000745639638422784 -bird,bird,north,,,AMRO,insample_n,5,46747,46745.2,46750,46747,46747.6,2.50998007960223 -bird,bird,north,,,AMRO,oob_auc,5,0.751837536078181,0.749980991530943,0.752193002137178,0.752193306467962,0.751281770799678,0.00116417482564863 -bird,bird,north,,,AMRO,oob_deviance_explained,5,0.19506532949998,0.193175947371306,0.196246931283065,0.196037133851581,0.194799360802435,0.0015168467458848 -bird,bird,north,,,AMRO,oob_rmse,5,0.642604598564083,0.641926501943516,0.643291716888183,0.642604598564083,0.642641892983815,0.000706719487871539 -bird,bird,north,,,AMRO,oob_spearman,5,0.380533676681413,0.37790922288039,0.380928318902458,0.380973137935308,0.379704839415122,0.00160868603847367 -bird,bird,north,,,AMRO,oob_calibration_slope,5,1.08396500531425,1.06486533991524,1.08850856529205,1.08700414220795,1.0781206536837,0.0121020437956378 -bird,bird,north,,,AMRO,oob_prevalence,5,0.241010939026539,0.240656718532255,0.241191818078906,0.241245385459292,0.240950250724789,0.000279167052473422 -bird,bird,north,,,AMRO,oob_n,5,124877,124874,124878.8,124877,124876.4,2.50998007960223 -bird,bird,north,,,YEWA,insample_auc,5,0.810652011115167,0.806905535915858,0.812061598522145,0.810652011115167,0.809920788969429,0.00298158641518445 -bird,bird,north,,,YEWA,insample_deviance_explained,5,0.314909273242783,0.309871591670546,0.319492805728457,0.31433273616762,0.314995319620847,0.00513387705415809 -bird,bird,north,,,YEWA,insample_rmse,5,0.497860576515493,0.493156373425077,0.499626705028419,0.49962409848944,0.496894111802444,0.00354200714107103 -bird,bird,north,,,YEWA,insample_spearman,5,0.351308203222811,0.346096725958007,0.352294768113019,0.350436724901658,0.34985084765685,0.00381643530797194 -bird,bird,north,,,YEWA,insample_calibration_slope,5,0.940448485992357,0.93822970227144,0.946840163927796,0.940448485992357,0.941932935374091,0.00487053160829021 -bird,bird,north,,,YEWA,insample_prevalence,5,0.118296361263824,0.117706951871658,0.119214980837802,0.118296361263824,0.118418937588893,0.00074585019883292 -bird,bird,north,,,YEWA,insample_n,5,46747,46745.2,46750,46747,46747.6,2.50998007960223 -bird,bird,north,,,YEWA,oob_auc,5,0.767239583431115,0.764036842512678,0.768086586341435,0.767239583431115,0.766350786125575,0.00209862831085928 -bird,bird,north,,,YEWA,oob_deviance_explained,5,0.230350378846768,0.224665925779611,0.231551778310879,0.227959760380667,0.22874856387184,0.00380105487185568 -bird,bird,north,,,YEWA,oob_rmse,5,0.549584841168796,0.549414228967452,0.551458313386524,0.550162464024828,0.55017969127946,0.00123649457889191 -bird,bird,north,,,YEWA,oob_spearman,5,0.319507711349023,0.316083429490712,0.320378488857948,0.319623833929528,0.318537008565272,0.00226374788033266 -bird,bird,north,,,YEWA,oob_calibration_slope,5,0.889991578244066,0.876082723316741,0.916820195435995,0.892963322385412,0.894170469859029,0.0232833872561715 -bird,bird,north,,,YEWA,oob_prevalence,5,0.13458843502006,0.134244406707603,0.134809487963868,0.13458843502006,0.134542639141448,0.000279456693593184 -bird,bird,north,,,YEWA,oob_n,5,124877,124874,124878.8,124877,124876.4,2.50998007960223 -bird,bird,south,,,AMRO,insample_auc,5,0.722457651450059,0.720375297518667,0.726600629615675,0.719209687405594,0.723173174223035,0.00352104706258787 -bird,bird,south,,,AMRO,insample_deviance_explained,5,0.138527656609622,0.136691146222818,0.142417135845419,0.135600586309404,0.139234587345557,0.00331236105235091 -bird,bird,south,,,AMRO,insample_rmse,5,0.723153001504509,0.721335031591462,0.727536148551106,0.728292130677616,0.724159617526551,0.00310303019322092 -bird,bird,south,,,AMRO,insample_spearman,5,0.340977632563199,0.337015292025713,0.346671247584847,0.334834651737548,0.341554550754961,0.00544445726779651 -bird,bird,south,,,AMRO,insample_calibration_slope,5,1.15022007411034,1.14276766077164,1.16236750302668,1.15022007411034,1.15156485355994,0.010905701466581 -bird,bird,south,,,AMRO,insample_prevalence,5,0.258280375405076,0.256689533268802,0.259336584790035,0.256218172635832,0.2580593533773,0.00136065688529854 -bird,bird,south,,,AMRO,insample_n,5,23761,23761,23761.6,23761,23761.2,0.447213595499958 -bird,bird,south,,,AMRO,oob_auc,5,0.714059436464857,0.711480500190566,0.714962411335227,0.714448876140363,0.713392647100118,0.00175148482002703 -bird,bird,south,,,AMRO,oob_deviance_explained,5,0.132856954481043,0.130598469407397,0.134794332682706,0.132856954481043,0.132776377523986,0.00207997237439086 -bird,bird,south,,,AMRO,oob_rmse,5,0.721746467048822,0.720680130610468,0.723305061950612,0.721188075251643,0.721900682780814,0.00139074085657849 -bird,bird,south,,,AMRO,oob_spearman,5,0.330248605915095,0.326193681128825,0.331484334016897,0.330591093630504,0.329111121655051,0.00267737137591811 -bird,bird,south,,,AMRO,oob_calibration_slope,5,1.12678967221639,1.10327355597656,1.15730924321681,1.14400371236361,1.12954040808678,0.0271419352715798 -bird,bird,south,,,AMRO,oob_prevalence,5,0.259904818560381,0.259531587266211,0.260466983938132,0.260633551457466,0.259982926292237,0.000480821801997171 -bird,bird,south,,,AMRO,oob_n,5,67240,67239.4,67240,67240,67239.8,0.447213595499958 -bird,bird,south,,,YEWA,insample_auc,5,0.731707710515796,0.728700013949457,0.733719201164071,0.729660608631109,0.731334936728352,0.00248007478364079 -bird,bird,south,,,YEWA,insample_deviance_explained,5,0.262640095914395,0.250569964296155,0.266480536201697,0.251335314102402,0.259283325711143,0.00804887140604942 -bird,bird,south,,,YEWA,insample_rmse,5,0.596757323379492,0.591627562751247,0.60212670002895,0.604986782449959,0.596598484036104,0.00547958963785054 -bird,bird,south,,,YEWA,insample_spearman,5,0.310870671271116,0.306715657634868,0.314188647985749,0.308461211669207,0.310573221086041,0.00371069473054041 -bird,bird,south,,,YEWA,insample_calibration_slope,5,0.963186027281322,0.952262721063744,0.964499623104985,0.950131266698914,0.959505385451777,0.00644183692361723 -bird,bird,south,,,YEWA,insample_prevalence,5,0.17124700138883,0.17077564075586,0.171722441305838,0.171625773326038,0.171262389740443,0.000478416642385765 -bird,bird,south,,,YEWA,insample_n,5,23761,23761,23761.6,23761,23761.2,0.447213595499958 -bird,bird,south,,,YEWA,oob_auc,5,0.724899078903474,0.722729775346807,0.727288181732548,0.722021476613265,0.724992280834132,0.00227531731608106 -bird,bird,south,,,YEWA,oob_deviance_explained,5,0.221600750861936,0.219475584782023,0.225789364125433,0.218421768576217,0.222482702236073,0.00317537195719995 -bird,bird,south,,,YEWA,oob_rmse,5,0.622650926841455,0.621699495926355,0.623907258037217,0.622650926841455,0.622779894995154,0.00114370759880926 -bird,bird,south,,,YEWA,oob_spearman,5,0.304828063834361,0.302056249953096,0.307765081764427,0.300949548659939,0.304898251507847,0.00291835886538884 -bird,bird,south,,,YEWA,oob_calibration_slope,5,0.916760518901893,0.891012316043227,0.957680972925801,0.921680221515519,0.920877884724876,0.0368442823890579 -bird,bird,south,,,YEWA,oob_prevalence,5,0.175758477096966,0.175590501794327,0.1759250446163,0.175624628197501,0.175753050469217,0.000169045533323201 -bird,bird,south,,,YEWA,oob_n,5,67240,67239.4,67240,67240,67239.8,0.447213595499958 -bryophyte,bryophyte,north,,,Bryum.All,insample_auc,5,0.686293255534428,0.665800073960684,0.699683279591766,0.661241066989767,0.68307757480868,0.0175629521500816 -bryophyte,bryophyte,north,,,Bryum.All,insample_deviance_explained,5,0.0734038482438816,0.0540739919142967,0.0836319939259369,0.0522782686686087,0.0693495889508644,0.0150314273449335 -bryophyte,bryophyte,north,,,Bryum.All,insample_rmse,5,0.465559659863795,0.462031877723535,0.471529026088212,0.472600851904357,0.466651482063344,0.00489281173279605 -bryophyte,bryophyte,north,,,Bryum.All,insample_spearman,5,0.316563440467368,0.281110209746659,0.33861190135575,0.27367992317064,0.310537684786552,0.029806308637125 -bryophyte,bryophyte,north,,,Bryum.All,insample_calibration_slope,5,1.55293080862373,1.50462808553216,1.70248737696564,1.72087717642957,1.59166328355968,0.100269909956927 -bryophyte,bryophyte,north,,,Bryum.All,insample_prevalence,5,0.398261429491307,0.395579807718977,0.401857219116663,0.400041220115416,0.3986710498744,0.00332558122320578 -bryophyte,bryophyte,north,,,Bryum.All,insample_n,5,3097,3072.4,4153.6,4852,3440.8,789.041633882522 -bryophyte,bryophyte,north,,,Bryum.All,oob_auc,4,0.628064204051684,0.625138413790667,0.646280308937115,,0.633525030703261,0.0132070860232767 -bryophyte,bryophyte,north,,,Bryum.All,oob_deviance_explained,4,0.036439016722082,0.0317561312930693,0.0440728530358992,,0.0374929277523693,0.0068635854360685 -bryophyte,bryophyte,north,,,Bryum.All,oob_rmse,4,0.478431484595725,0.476961325866792,0.479086777965519,,0.478140461253175,0.00119501147163414 -bryophyte,bryophyte,north,,,Bryum.All,oob_spearman,4,0.217634716993625,0.212132096434835,0.249146496410386,,0.226923702300043,0.0229954074379961 -bryophyte,bryophyte,north,,,Bryum.All,oob_calibration_slope,4,0.96776722194435,0.94200366187995,1.3568526967472,,1.09752504863665,0.27853178520469 -bryophyte,bryophyte,north,,,Bryum.All,oob_prevalence,4,0.403358051486104,0.397360409603543,0.408630979157295,,0.403099224982043,0.006528394280969 -bryophyte,bryophyte,north,,,Bryum.All,oob_n,5,1755,698.4,1779.6,0,1411.2,789.041633882522 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_auc,5,0.735613998678571,0.718222728085638,0.746101294127716,0.709292380007168,0.733731795207852,0.0150804186552806 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_deviance_explained,5,0.12490667611225,0.104325275461427,0.135175042848528,0.0953376234923402,0.121570060412617,0.0163751607020792 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_rmse,5,0.452991324433859,0.451258984328921,0.460870507073951,0.464032502395272,0.455137062107035,0.00535425625592767 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_spearman,5,0.404307013373254,0.375204457000438,0.423722498955401,0.359990780271843,0.401905540174473,0.0260763622516296 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_calibration_slope,5,1.31541945732773,1.26664784775092,1.33634930896402,1.3440848137311,1.30361261621168,0.0350786971646647 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_prevalence,5,0.441055234954658,0.434155026365629,0.445516968426104,0.441055234954658,0.440040906513639,0.00592042164227121 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_n,5,3068,3031.6,4152,4852,3417.8,802.273768734838 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_auc,4,0.679894572383923,0.667299950817496,0.695755923530706,,0.681061261519765,0.0155469948161902 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_deviance_explained,4,0.07450303377554,0.0646601702985125,0.0902453951194536,,0.0766099972994279,0.0140343604370956 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_rmse,4,0.471841075766704,0.46640710015749,0.474078424869381,,0.470699423442941,0.00432285345077317 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_spearman,4,0.309879840566642,0.287455251551771,0.337017143093863,,0.311562952535339,0.0271492996990131 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_calibration_slope,4,0.98526068106201,0.904217179229263,1.10544136124084,,0.999238244757039,0.115788682744061 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_prevalence,4,0.443665764352131,0.432608384046217,0.454192825112108,,0.443476364514296,0.0116999631210214 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_n,5,1784,700,1820.4,0,1434.2,802.273768734838 -bryophyte,bryophyte,south,,,Bryum.All,insample_auc,5,0.759638524978058,0.738336536329941,0.771587276369297,0.731612519122241,0.756480820968939,0.0168737687046497 -bryophyte,bryophyte,south,,,Bryum.All,insample_deviance_explained,5,0.130776426233582,0.10969644283403,0.147363316849535,0.102374726573718,0.129595683177172,0.0189542536960939 -bryophyte,bryophyte,south,,,Bryum.All,insample_rmse,5,0.441215418737585,0.435312258575529,0.446819603304355,0.45014802962199,0.440801099915064,0.00606679511585792 -bryophyte,bryophyte,south,,,Bryum.All,insample_spearman,5,0.43469237225877,0.397994649236681,0.454435815679314,0.38752743127734,0.428799374742123,0.0284968826014846 -bryophyte,bryophyte,south,,,Bryum.All,insample_calibration_slope,5,1.50578686836735,1.49163983954254,1.55558377160668,1.56596956813893,1.51918368602666,0.0327144075920258 -bryophyte,bryophyte,south,,,Bryum.All,insample_prevalence,5,0.370562770562771,0.365528360602252,0.371569237798783,0.370562770562771,0.369235286484943,0.00385091464779508 -bryophyte,bryophyte,south,,,Bryum.All,insample_n,5,1444,1429.8,1968,2310,1614.6,388.936113005722 -bryophyte,bryophyte,south,,,Bryum.All,oob_auc,4,0.692003745675621,0.680380055385506,0.703976086037884,,0.692128263558531,0.01343490275736 -bryophyte,bryophyte,south,,,Bryum.All,oob_deviance_explained,4,0.0783027482734894,0.0716373879344079,0.0915333603750256,,0.0806474810457946,0.0110392449625809 -bryophyte,bryophyte,south,,,Bryum.All,oob_rmse,4,0.45863474562491,0.45604067899051,0.46061169737193,,0.458414347450846,0.00250844418690233 -bryophyte,bryophyte,south,,,Bryum.All,oob_spearman,4,0.320939082483711,0.301815094565766,0.342841823640355,,0.321931494354675,0.0231435360059765 -bryophyte,bryophyte,south,,,Bryum.All,oob_calibration_slope,4,1.09662904012228,0.993529866018111,1.27630326550145,,1.12397727272049,0.154913771982226 -bryophyte,bryophyte,south,,,Bryum.All,oob_prevalence,4,0.3703593055487,0.368749240306309,0.380219211352906,,0.37330567717792,0.0072755089177001 -bryophyte,bryophyte,south,,,Bryum.All,oob_n,5,866,342,880.2,0,695.4,388.936113005722 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_auc,5,0.823147551216717,0.794203835429771,0.838336082555962,0.786377083624582,0.818061643861135,0.0221814728437685 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_deviance_explained,5,0.225042105967546,0.178940106465417,0.252212316358221,0.164584891724021,0.218793167566273,0.0371268460820209 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_rmse,5,0.370587371751454,0.36196274314068,0.380460190301878,0.386051104257128,0.370724878175682,0.00981894013326031 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_spearman,5,0.48152153022619,0.432516252628978,0.502880609345115,0.423916836734411,0.470448834163866,0.0352951485472676 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_calibration_slope,5,1.29145219413511,1.24692821558315,1.34705144837751,1.36205696748937,1.29527079227154,0.0495806136224783 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_prevalence,5,0.23982683982684,0.231460603487586,0.246697056850865,0.23982683982684,0.239405392468179,0.00765174673579537 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_n,5,1462,1452.8,1977.6,2310,1631.4,379.498089586759 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_auc,4,0.744853794244395,0.739000361169365,0.748758050361756,,0.744157659616656,0.00538762517048332 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_deviance_explained,4,0.118965259283552,0.115595923326165,0.123304867424306,,0.119311785063326,0.00442770121306163 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_rmse,4,0.400341061423918,0.39253928664869,0.409042917617396,,0.400662519073293,0.00886215457460649 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_spearman,4,0.360390263759665,0.348330519761875,0.376247023241453,,0.361746340718236,0.0150496475888219 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_calibration_slope,4,0.878578076085833,0.817528482883878,0.935472134856519,,0.877093956646094,0.0633289046204762 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_prevalence,4,0.238999572635154,0.227667581639544,0.255610993801512,,0.240885083410421,0.0151422609821477 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_n,5,848,332.4,857.2,0,678.6,379.498089586759 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_auc,5,0.815376104342893,0.806408743486995,0.829192366991812,0.801446263932847,0.817422800660919,0.0117541725407816 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_deviance_explained,5,0.235256336112931,0.218486399077719,0.253159862238942,0.210892705603289,0.235879058660233,0.0178127519901138 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_rmse,5,0.414299254942218,0.408000062905618,0.419452093871422,0.422064990629647,0.413799314397516,0.00595401347945583 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_spearman,5,0.531716539881804,0.516357063924267,0.554895667802972,0.508116650782436,0.53509161754183,0.0197355600183397 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_calibration_slope,5,1.18690970286461,1.17728682203218,1.19602646436075,1.19367118382492,1.18706175198594,0.0097573778655505 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_prevalence,5,0.384787472035794,0.382719077877937,0.387875670039505,0.384787472035794,0.385092893007771,0.00278105998275642 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_n,5,3685,3644,4976.6,5811,4102.6,955.610956404331 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_auc,4,0.772594279582646,0.761956780012735,0.777979733363127,,0.770718548943564,0.00886647282464756 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_deviance_explained,4,0.183035722855659,0.169942245460023,0.189811598246844,,0.180779436425498,0.0111322833286256 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_rmse,4,0.431781940585943,0.428745826590577,0.436558683188472,,0.43240359365993,0.00429936332656117 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_spearman,4,0.459548984924136,0.442333376456973,0.467058185790501,,0.456082410780994,0.013851497043406 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_calibration_slope,4,1.01963260828438,0.967252467250619,1.0506427890174,,1.01200047960554,0.0482450962787272 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_prevalence,4,0.385212683681362,0.378550429000763,0.388624647224836,,0.384051865418103,0.00565743785692542 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_n,5,2126,834.4,2167,0,1708.4,955.610956404331 -lichen,lichen,north,,,Physcia.adscendens,insample_auc,5,0.87986382101311,0.871189876670825,0.881324115281201,0.86548931140534,0.877518812853977,0.00676874818668662 -lichen,lichen,north,,,Physcia.adscendens,insample_deviance_explained,5,0.361431267817238,0.342129041991733,0.366051325747558,0.329951414540256,0.356672956966753,0.0151676451256419 -lichen,lichen,north,,,Physcia.adscendens,insample_rmse,5,0.365880641585659,0.363099981508384,0.372140135732855,0.37622420720278,0.366887887993744,0.0054064068105167 -lichen,lichen,north,,,Physcia.adscendens,insample_spearman,5,0.641244299615411,0.624485568613088,0.642109429604184,0.615824694732003,0.635701141978883,0.0112764989620447 -lichen,lichen,north,,,Physcia.adscendens,insample_calibration_slope,5,1.12508500469074,1.1209608311491,1.13852408174148,1.12752423275806,1.12808101707466,0.0103252165646239 -lichen,lichen,north,,,Physcia.adscendens,insample_prevalence,5,0.382961350027218,0.378754207234193,0.387054085275807,0.384099122354156,0.382969715660275,0.00456567123234541 -lichen,lichen,north,,,Physcia.adscendens,insample_n,5,3699,3673.4,4975,5811,4115.6,947.965083745177 -lichen,lichen,north,,,Physcia.adscendens,oob_auc,4,0.856003334337641,0.852007093367877,0.865183268309771,,0.857854653267057,0.00738034558423486 -lichen,lichen,north,,,Physcia.adscendens,oob_deviance_explained,4,0.313033628246285,0.305358149608293,0.331182817389373,,0.316774239140962,0.0145679637434759 -lichen,lichen,north,,,Physcia.adscendens,oob_rmse,4,0.381942009544814,0.376585949453844,0.387388683261567,,0.381974371554022,0.00579919914131507 -lichen,lichen,north,,,Physcia.adscendens,oob_spearman,4,0.600405554291497,0.594784028409698,0.614909642835288,,0.603577898099351,0.0116809529318417 -lichen,lichen,north,,,Physcia.adscendens,oob_calibration_slope,4,1.06497910354526,1.04388551817711,1.08680446461778,,1.06524045201111,0.0236225750177993 -lichen,lichen,north,,,Physcia.adscendens,oob_prevalence,4,0.386432660247333,0.378648004672367,0.394703317951312,,0.386606232436266,0.00923888826136022 -lichen,lichen,north,,,Physcia.adscendens,oob_n,5,2112,836,2137.6,0,1695.4,947.965083745177 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_auc,5,0.895073823888345,0.885054972678555,0.912505531930283,0.880547483962199,0.89739469941863,0.0158211706487135 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_deviance_explained,5,0.287858557394288,0.261555579842225,0.33138105957702,0.250053679466143,0.294257546956107,0.0362440397559265 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_rmse,5,0.255403849344309,0.240395026711506,0.260690871678816,0.26261328351279,0.251621365864084,0.010257945984937 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_spearman,5,0.396635614172772,0.386400172422742,0.406301961239085,0.38439016948612,0.396212422390736,0.010010523859884 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_calibration_slope,5,1.50390376190998,1.44299525909841,1.5522457539243,1.51164139244749,1.49918808814396,0.0595338432590377 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_prevalence,5,0.0907849829351536,0.0854880550520455,0.0942546707117982,0.092924126172208,0.0900691492139895,0.00433337917377339 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_n,5,1482,1471.8,2004.4,2346,1653.4,387.296785424305 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_auc,4,0.842037571011741,0.816879244759755,0.849698072560503,,0.835788347903447,0.0192442467075879 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_deviance_explained,4,0.207749940162943,0.163009470288789,0.217109435251056,,0.195113877739357,0.032868723867473 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_rmse,4,0.279273385070431,0.267174689702332,0.290817607904244,,0.279075359165329,0.0128855810525773 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_spearman,4,0.345988121828092,0.336331866646148,0.365185084504574,,0.349395517361856,0.016744190341194 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_calibration_slope,4,1.14299961335438,1.06540128461577,1.24284860727251,,1.15094627948992,0.0991149034790211 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_prevalence,4,0.0997452652709462,0.0913286406440493,0.106312613843352,,0.0990848095371992,0.00808662138066247 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_n,5,864,341.6,874.2,0,692.6,387.296785424305 -lichen,lichen,south,,,Physcia.adscendens,insample_auc,5,0.898871357029697,0.886200382437962,0.903437983597461,0.881318203299536,0.896085000631829,0.00919852367118239 -lichen,lichen,south,,,Physcia.adscendens,insample_deviance_explained,5,0.373699047561297,0.341388570686875,0.388440078849794,0.331631552338401,0.367492535342302,0.024026318803441 -lichen,lichen,south,,,Physcia.adscendens,insample_rmse,5,0.320644442407283,0.310586201524553,0.327242449222737,0.329726334532187,0.319146666602479,0.00827946600716445 -lichen,lichen,south,,,Physcia.adscendens,insample_spearman,5,0.565897493706032,0.551126197259348,0.574711543243248,0.543740974860115,0.564187557612995,0.0126582674773541 -lichen,lichen,south,,,Physcia.adscendens,insample_calibration_slope,5,1.17334993479259,1.15247324968426,1.20766461026711,1.17842325405417,1.17731780414909,0.0303991171485092 -lichen,lichen,south,,,Physcia.adscendens,insample_prevalence,5,0.215686274509804,0.210370852380551,0.218705697782215,0.215686274509804,0.214933253293698,0.00478783760132252 -lichen,lichen,south,,,Physcia.adscendens,insample_n,5,1487,1480.8,2014,2346,1662.2,382.531305908418 -lichen,lichen,south,,,Physcia.adscendens,oob_auc,4,0.851047202152853,0.846405376941337,0.867340891167645,,0.855208582082595,0.0124964664063059 -lichen,lichen,south,,,Physcia.adscendens,oob_deviance_explained,4,0.280028728991827,0.266399727053094,0.309248288520692,,0.285596785274017,0.0244176929799479 -lichen,lichen,south,,,Physcia.adscendens,oob_rmse,4,0.346473164191985,0.342472926296628,0.347077228803126,,0.345260245161908,0.00296068154719772 -lichen,lichen,south,,,Physcia.adscendens,oob_spearman,4,0.500475278816252,0.489682287766023,0.532656797548951,,0.508114038702848,0.0253990413096135 -lichen,lichen,south,,,Physcia.adscendens,oob_calibration_slope,4,0.990441880317761,0.95495248678548,1.14980122597578,,1.0346811489341,0.122347688811475 -lichen,lichen,south,,,Physcia.adscendens,oob_prevalence,4,0.21549434057534,0.209833885194357,0.226186106799465,,0.217291237305033,0.00944381193189753 -lichen,lichen,south,,,Physcia.adscendens,oob_n,5,859,332,865.2,0,683.8,382.531305908418 -mite,mite,north,,,Ceratozetes.gracilis,insample_auc,5,0.826182278028632,0.816521754811759,0.829455937159375,0.810417863230229,0.824044783777931,0.00795552173287048 -mite,mite,north,,,Ceratozetes.gracilis,insample_deviance_explained,5,0.231267297848416,0.213201098763747,0.238324197836685,0.201445529059475,0.227699115159987,0.0153219192362521 -mite,mite,north,,,Ceratozetes.gracilis,insample_rmse,5,0.352364410091925,0.349879967947193,0.356659764939223,0.358997802596467,0.353003173103352,0.0038204828240045 -mite,mite,north,,,Ceratozetes.gracilis,insample_spearman,5,0.461401757448599,0.446250390127651,0.464642687155511,0.43677266997156,0.457396167887806,0.0117659480925826 -mite,mite,north,,,Ceratozetes.gracilis,insample_calibration_slope,5,1.21678683407768,1.18937120711011,1.23621444478937,1.24294686598034,1.2129265803526,0.0234407640151893 -mite,mite,north,,,Ceratozetes.gracilis,insample_prevalence,5,0.211169769380383,0.208505864577966,0.211369634473166,0.208369812642269,0.210190443530451,0.00151474200965215 -mite,mite,north,,,Ceratozetes.gracilis,insample_n,5,3651,3606.6,4890.2,5711,4047.6,930.188045504779 -mite,mite,north,,,Ceratozetes.gracilis,oob_auc,4,0.79426775302943,0.787956043932085,0.804223230874757,,0.795569099010852,0.00900575889899819 -mite,mite,north,,,Ceratozetes.gracilis,oob_deviance_explained,4,0.181240697775308,0.173156276419376,0.200349686942691,,0.185178043422255,0.0152725036847127 -mite,mite,north,,,Ceratozetes.gracilis,oob_rmse,4,0.362345634708091,0.35679591208279,0.365726663308442,,0.361571101127752,0.00488165927975959 -mite,mite,north,,,Ceratozetes.gracilis,oob_spearman,4,0.411784338169553,0.402576511113279,0.424080827132331,,0.41288743170759,0.0116887396514023 -mite,mite,north,,,Ceratozetes.gracilis,oob_calibration_slope,4,1.03416883570894,0.995383257319488,1.07370097484877,,1.03443546454836,0.0452258906146394 -mite,mite,north,,,Ceratozetes.gracilis,oob_prevalence,4,0.203407429558746,0.203105380508127,0.206516438658429,,0.204409915290554,0.0022495255846381 -mite,mite,north,,,Ceratozetes.gracilis,oob_n,5,2060,820.8,2104.4,0,1663.4,930.188045504779 -mite,mite,north,,,Trhypochthonius.tectorum,insample_auc,5,0.731788486098831,0.721501432798366,0.737801366376397,0.719034144300359,0.730136069029822,0.00813913725778266 -mite,mite,north,,,Trhypochthonius.tectorum,insample_deviance_explained,5,0.089499141646384,0.0821495255764537,0.0960602274910759,0.0779330791197977,0.0895245403852761,0.00737795356490991 -mite,mite,north,,,Trhypochthonius.tectorum,insample_rmse,5,0.283410154150045,0.280940933784026,0.287680898441404,0.284893639283448,0.283967624826095,0.00353594946086111 -mite,mite,north,,,Trhypochthonius.tectorum,insample_spearman,5,0.236608716108323,0.227773764176821,0.240562377561535,0.223150481665208,0.234902163775881,0.00721275854062407 -mite,mite,north,,,Trhypochthonius.tectorum,insample_calibration_slope,5,1.54050924512857,1.50382184576707,1.56345024448917,1.52280871270927,1.53476818649162,0.0317387254550959 -mite,mite,north,,,Trhypochthonius.tectorum,insample_prevalence,5,0.0956049728593941,0.0940001763114542,0.0987931854359719,0.0956049728593941,0.0960754727002272,0.00270898671716411 -mite,mite,north,,,Trhypochthonius.tectorum,insample_n,5,3624,3599.2,4881,5711,4034.4,937.384819591186 -mite,mite,north,,,Trhypochthonius.tectorum,oob_auc,4,0.665838582750602,0.644373925527224,0.667941841641007,,0.658923797631683,0.0154266815569887 -mite,mite,north,,,Trhypochthonius.tectorum,oob_deviance_explained,4,0.0519284611125678,0.0429411996388765,0.0550247457278241,,0.0498245408059838,0.00699156135214757 -mite,mite,north,,,Trhypochthonius.tectorum,oob_rmse,4,0.289249405182921,0.278984643806527,0.292884990099047,,0.286881842161397,0.00803889505487629 -mite,mite,north,,,Trhypochthonius.tectorum,oob_spearman,4,0.16623095413497,0.147468104006897,0.170095199986913,,0.160910024036352,0.0139031946555173 -mite,mite,north,,,Trhypochthonius.tectorum,oob_calibration_slope,4,1.07931316571659,1.03972983697462,1.10202080016984,,1.07328613204205,0.0341915886247604 -mite,mite,north,,,Trhypochthonius.tectorum,oob_prevalence,4,0.0963264503316864,0.0893459374618542,0.0984905896614327,,0.0946063169245129,0.00535078906761863 -mite,mite,north,,,Trhypochthonius.tectorum,oob_n,5,2087,830,2111.8,0,1676.6,937.384819591186 -mite,mite,south,,,Ceratozetes.gracilis,insample_auc,5,0.942715600292339,0.932112922455432,0.953301387433802,0.926042685188307,0.943090227395079,0.0111389544465627 -mite,mite,south,,,Ceratozetes.gracilis,insample_deviance_explained,5,0.427953599539456,0.413784649241568,0.480600172487078,0.405285180679334,0.443379656003744,0.0341181163398782 -mite,mite,south,,,Ceratozetes.gracilis,insample_rmse,5,0.184823162519783,0.176047681018203,0.185141671619161,0.185304259029678,0.181569331289641,0.00488436751438256 -mite,mite,south,,,Ceratozetes.gracilis,insample_spearman,5,0.35620257400788,0.340678404454552,0.379056424974169,0.34190797405616,0.358247165802908,0.0198680837526217 -mite,mite,south,,,Ceratozetes.gracilis,insample_calibration_slope,5,1.25875319096791,1.18792873308144,1.26769206713498,1.22128545305663,1.23580508870431,0.0436191039746415 -mite,mite,south,,,Ceratozetes.gracilis,insample_prevalence,5,0.056970509383378,0.0521775638545351,0.0622115928022082,0.0562843842573,0.0572190090351997,0.00535467847864499 -mite,mite,south,,,Ceratozetes.gracilis,insample_n,5,1494,1479.4,2024.6,2363,1667.4,389.193139713433 -mite,mite,south,,,Ceratozetes.gracilis,oob_auc,4,0.899513670078415,0.885097180565786,0.904114554742769,,0.896008096918317,0.0111850562409658 -mite,mite,south,,,Ceratozetes.gracilis,oob_deviance_explained,4,0.330461644197965,0.273903739632069,0.353307724359802,,0.318421706910801,0.0447811919440956 -mite,mite,south,,,Ceratozetes.gracilis,oob_rmse,4,0.19006583026612,0.186341206112452,0.212559607487313,,0.196769099218808,0.0163471621353765 -mite,mite,south,,,Ceratozetes.gracilis,oob_spearman,4,0.314444039218996,0.278883116159444,0.344185767138818,,0.312365755240521,0.0361037411808717 -mite,mite,south,,,Ceratozetes.gracilis,oob_calibration_slope,4,1.06107071860598,0.803554353024927,1.27392143861765,,1.0451187023312,0.25286328994353 -mite,mite,south,,,Ceratozetes.gracilis,oob_prevalence,4,0.0533392883804503,0.0452752248602848,0.0645232647455575,,0.0544535429679295,0.0107814199736608 -mite,mite,south,,,Ceratozetes.gracilis,oob_n,5,869,338.4,883.6,0,695.6,389.193139713433 -mite,mite,south,,,Trhypochthonius.tectorum,insample_auc,5,0.837855511959389,0.805765764097379,0.84231766500586,0.786388392836218,0.828631832042505,0.0238300319446749 -mite,mite,south,,,Trhypochthonius.tectorum,insample_deviance_explained,5,0.209230848054206,0.158595489219605,0.229031165924718,0.13149934388309,0.198880441235109,0.0400562446987762 -mite,mite,south,,,Trhypochthonius.tectorum,insample_rmse,5,0.251247166617746,0.24633782963714,0.259093975322127,0.261989594963612,0.252389725672996,0.00667483988429221 -mite,mite,south,,,Trhypochthonius.tectorum,insample_spearman,5,0.322695119515102,0.29322152947867,0.328515154391205,0.274559246907003,0.314784280029552,0.0228478751930695 -mite,mite,south,,,Trhypochthonius.tectorum,insample_calibration_slope,5,1.44186841542906,1.38107930908262,1.69286838979393,1.7601996033358,1.51193828017518,0.163101488371433 -mite,mite,south,,,Trhypochthonius.tectorum,insample_prevalence,5,0.0833685992382565,0.0807473443243282,0.0863035095821866,0.0833685992382565,0.083401335320589,0.00299510185415199 -mite,mite,south,,,Trhypochthonius.tectorum,insample_n,5,1489,1484.4,2017.4,2363,1664.2,390.68875079787 -mite,mite,south,,,Trhypochthonius.tectorum,oob_auc,4,0.709581235058518,0.700263968081739,0.720188804650318,,0.710042057421026,0.011106114271277 -mite,mite,south,,,Trhypochthonius.tectorum,oob_deviance_explained,4,0.0756867710759595,0.0537734694408186,0.0971274171666329,,0.075517965524364,0.0237215881650346 -mite,mite,south,,,Trhypochthonius.tectorum,oob_rmse,4,0.269720754580475,0.262049411388901,0.276021187676139,,0.269231143831936,0.00752532738911156 -mite,mite,south,,,Trhypochthonius.tectorum,oob_spearman,4,0.195797695247362,0.19170761239436,0.214434288798715,,0.20099287763963,0.0138755383091438 -mite,mite,south,,,Trhypochthonius.tectorum,oob_calibration_slope,4,0.806539758452825,0.607652989317457,0.986918071629174,,0.799929595610318,0.214213885655849 -mite,mite,south,,,Trhypochthonius.tectorum,oob_prevalence,4,0.0842873358196854,0.0775201528145626,0.0881856815952926,,0.0832627510948584,0.00595703320150957 -mite,mite,south,,,Trhypochthonius.tectorum,oob_n,5,874,345.6,878.6,0,698.8,390.68875079787 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_auc,5,0.88074391437416,0.870230840102412,0.889917229276511,0.866574078302184,0.880444461635148,0.00984236243578891 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_deviance_explained,5,0.366033789516191,0.340896204768951,0.387063961911437,0.333940767583082,0.364894595014137,0.0228902383131863 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_rmse,5,0.368658494477631,0.361033107966769,0.377805347943015,0.380294274281245,0.369101499001343,0.00830529500422763 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_spearman,5,0.649750548197459,0.632914011655006,0.665283576748038,0.626449726132344,0.649764465281971,0.0163034666515923 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_calibration_slope,5,1.11607404452359,1.11062727390296,1.12573590395919,1.11607404452359,1.11761659226476,0.00852003589446049 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_prevalence,5,0.418242653476869,0.411391418988775,0.421189975169674,0.418242653476869,0.416870814782784,0.00501851999449775 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_n,5,4366,4320.2,5874.4,6874,4851.6,1130.83522230252 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_auc,4,0.854194011002684,0.852836376582826,0.856365562566068,,0.854484695696801,0.00192352569739418 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_deviance_explained,4,0.309213966420281,0.308762924652017,0.313755743334223,,0.310674943258023,0.00327836318990379 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_rmse,4,0.389483536954601,0.387341624018246,0.39094551367838,,0.389240702592967,0.0019799573837795 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_spearman,4,0.605437925396632,0.605207578609941,0.607856758412568,,0.606219527621362,0.00174298051123629 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_calibration_slope,4,1.01719167926395,1.01054630230644,1.05282657723447,,1.02754507962574,0.0266664444355038 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_prevalence,4,0.419241311741466,0.413108455574493,0.430771977433407,,0.421169100857526,0.00978800188867454 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_n,5,2508,999.6,2553.8,0,2022.4,1130.83522230252 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_auc,5,0.881757970386191,0.868733773176606,0.882173763868626,0.862677170473365,0.877303720450926,0.00837793542426503 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_deviance_explained,5,0.363142598073144,0.333942993757039,0.365654455856863,0.319506008380831,0.353769821482049,0.0196047485097617 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_rmse,5,0.366466023093134,0.365620628913175,0.375834932888311,0.381006138302117,0.369388868935656,0.00657216168154903 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_spearman,5,0.641069730267089,0.618664226200737,0.642838911555516,0.609089248685926,0.633743976157725,0.0143625229671699 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_calibration_slope,5,1.11310604804308,1.09708327815688,1.1187942896737,1.11244002667966,1.10966268491777,0.0133476761372488 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_prevalence,5,0.377654931626418,0.37492184315556,0.38072781584232,0.377654931626418,0.377957278345016,0.00308047552556824 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_n,5,4329,4315.8,5874,6874,4842.2,1136.06104589498 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_auc,4,0.846692287097856,0.841593097515866,0.856729668658842,,0.848455927090355,0.00854263183105512 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_deviance_explained,4,0.291501687724023,0.282642104291016,0.312749948065533,,0.295926215191346,0.0173811594692309 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_rmse,4,0.390154939953334,0.384057871104944,0.393796023171734,,0.389277802228338,0.00572214548785396 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_spearman,4,0.581484037896795,0.574690787450859,0.597964897183734,,0.584943898197153,0.0132029847944197 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_calibration_slope,4,1.01368863249399,1.00049931558218,1.04367662745386,,1.0196881603683,0.0241869209030404 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_prevalence,4,0.375247544204322,0.372430611979277,0.382966913772923,,0.376998414684163,0.00599903919350225 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_n,5,2545,1000,2558.2,0,2031.8,1136.06104589498 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_auc,5,0.943960649050962,0.94037488755184,0.953667784494273,0.938366026022059,0.946326517919348,0.00690479709509673 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_deviance_explained,5,0.539980665738958,0.514007725679396,0.570793158649015,0.507219536497198,0.541158084617766,0.0293385503108723 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_rmse,5,0.265995836177662,0.257552096970539,0.276634861788926,0.277737776076124,0.267144244420744,0.00961165228723267 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_spearman,5,0.640807188108982,0.634811703863048,0.656313927462278,0.63231197808786,0.644341202447442,0.0112139813302095 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_calibration_slope,5,1.10742155745054,1.09687391571867,1.12220331399304,1.10996859334024,1.10858309586985,0.0136439671103682 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_prevalence,5,0.222088835534214,0.217190546592102,0.228625506806496,0.222054380664653,0.222881775063893,0.00607679419012681 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_n,5,1692,1666,2267.2,2648,1873.6,433.131388841769 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_auc,4,0.91731096661857,0.91517450234187,0.923219533485924,,0.918658146115232,0.00464588817224989 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_deviance_explained,4,0.456133338222218,0.436887020577346,0.466721499977668,,0.453041139690281,0.0164852708364197 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_rmse,4,0.293625325159631,0.289095652529961,0.300739675613614,,0.2945484243826,0.00674971747803409 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_spearman,4,0.599539540852002,0.593160431622561,0.611607278951094,,0.601571194019734,0.0105902203347522 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_calibration_slope,4,1.01326709065303,0.998581835979821,1.04432711374091,,1.0191152222297,0.0254810730539049 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_prevalence,4,0.218666030567013,0.210018355611084,0.23207994955219,,0.220368260577459,0.0121728164316861 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_n,5,956,380.8,982,0,774.4,433.131388841769 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_auc,5,0.879824378126777,0.864927662300972,0.884353155373554,0.860127236726313,0.876088454793656,0.0102086188258615 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_deviance_explained,5,0.349160779018402,0.323379089314297,0.368399062432554,0.309561218127728,0.347852366898373,0.0240471001432219 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_rmse,5,0.338681607339072,0.335417339645378,0.347191482469894,0.351945008361129,0.340392292809667,0.00678489045930976 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_spearman,5,0.575132441938743,0.557119084277288,0.590747182044567,0.550545432101814,0.574666097531388,0.016886854089622 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_calibration_slope,5,1.17670373526123,1.16179305211448,1.18513327894921,1.19013393137727,1.17379625326662,0.0119075535077798 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_prevalence,5,0.264350453172205,0.25911663216011,0.270295509723619,0.264350453172205,0.264443478235907,0.00620048832939598 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_n,5,1685,1649.4,2266.4,2648,1865.6,437.838212128635 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_auc,4,0.836402373386276,0.830983973583734,0.851439412911307,,0.839837601858593,0.0116626937193136 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_deviance_explained,4,0.272820636539873,0.261425006488755,0.294029649611213,,0.276325416189953,0.0179744147351422 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_rmse,4,0.364147854936566,0.358309639843644,0.367346505676391,,0.363205153381889,0.00496976655195017 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_spearman,4,0.518326341044929,0.498931183602572,0.538964636529514,,0.518770318917153,0.0214671251034815 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_calibration_slope,4,1.02795293531395,0.97591680326038,1.09728108500476,,1.03412865589868,0.0683334106009871 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_prevalence,4,0.266148052343275,0.252246321440467,0.273763588267456,,0.263902982708051,0.0122396324927964 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_n,5,963,381.6,998.6,0,782.4,437.838212128635 diff --git a/3_output/exp_001_xgboost/run_record.md b/3_output/exp_001_xgboost/run_record.md new file mode 100644 index 0000000..b18aa2f --- /dev/null +++ b/3_output/exp_001_xgboost/run_record.md @@ -0,0 +1,253 @@ +# Run record: exp_001_xgboost + +Written by `run_record()`. The result stores this describes are gitignored; this file is what remains. + +## Provenance + +_Volatile. Excluded from cross-run comparison._ + +- **git_commit**: 7de25de +- **pipeline_dir**: D:/local_projects/active/sdmMethodsDev/2_pipeline/exp_001_xgboost +- **r_version**: 4.5.0 +- **written_at**: 2026-10-05 15:19:05 + +## Configuration + +- **boot_seed**: 20260909.0000 +- **changes_from_v2**: bryophyte: habitat <- xgboost with `single`, on every covariate the v2 candidates use, lichen: habitat <- xgboost with `single`, on every covariate the v2 candidates use, mite: habitat <- xgboost with `single`, on every covariate the v2 candidates use, vascular_plant: habitat <- xgboost with `single`, on every covariate the v2 candidates use, mammal_summer: habitat <- xgboost with `single` inside `hurdle`, on every covariate the v2 candidates use, mammal_winter: habitat <- xgboost with `single` inside `hurdle`, on every covariate the v2 candidates use, bird: landcover <- xgboost with `single`, on every covariate the v2 candidates use +- **compared_with**: exp_000_parity_v2 +- **covariate_files**: none +- **data_dir**: test_dataset +- **engines**: bayesglm, glm, xgboost +- **focal_species**: bird=AMRO, bird=YEWA, bryophyte=Bryum.All, bryophyte=Ceratodon.purpureus, lichen=Cladonia.chlorophaea, lichen=Physcia.adscendens, mammal=Coyote_Summer, mammal=Coyote_Winter, mammal=Moose_Summer, mammal=Moose_Winter, mite=Ceratozetes.gracilis, mite=Trhypochthonius.tectorum, vascular_plant=Galium.boreale, vascular_plant=Vicia.americana +- **jobs_not_ok**: 0 +- **jobs_ok**: 140 +- **jobs_total**: 140 +- **n_bootstraps**: 5 +- **plant_bootstrap**: spatial_block +- **selection**: aic_average, hurdle, single +- **species_n**: 14 +- **stage_models**: spec defaults (v2 candidate sets) +- **taxa**: bird, bryophyte, lichen, mammal_summer, mammal_winter, mite, vascular_plant +- **v2_bootstraps**: 100 + +## Coverage + +| taxon | region | species | draws | coefficient_rows | metric_rows | grid_rows | +| --- | --- | --- | --- | --- | --- | --- | +| bird | north | 2 | 5 | 100 | 140 | 890 | +| bird | south | 2 | 5 | 100 | 140 | 170 | +| bryophyte | north | 2 | 5 | 190 | 140 | 430 | +| bryophyte | south | 2 | 5 | 190 | 140 | 160 | +| lichen | north | 2 | 5 | 190 | 140 | 430 | +| lichen | south | 2 | 5 | 190 | 140 | 160 | +| mammal_summer | north | 2 | 5 | 1350 | 140 | 450 | +| mammal_summer | south | 2 | 5 | 600 | 140 | 200 | +| mammal_winter | north | 2 | 5 | 1350 | 140 | 450 | +| mammal_winter | south | 2 | 5 | 600 | 140 | 200 | +| mite | north | 2 | 5 | 190 | 140 | 430 | +| mite | south | 2 | 5 | 190 | 140 | 160 | +| vascular_plant | north | 2 | 5 | 190 | 140 | 430 | +| vascular_plant | south | 2 | 5 | 190 | 140 | 160 | + +## Metrics + +| taxon | region | metric | n | median | p10 | p90 | mean | sd | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| bird | north | insample_auc | 10 | 0.7994 | 0.7657 | 0.8325 | 0.7988 | 0.0344 | +| bird | north | insample_calibration_slope | 10 | 1.0349 | 0.9469 | 1.1278 | 1.0347 | 0.0896 | +| bird | north | insample_deviance_explained | 10 | 0.2915 | 0.2222 | 0.3641 | 0.2927 | 0.0734 | +| bird | north | insample_n | 10 | 46747.0000 | 46744.0000 | 46750.0000 | 46747.6000 | 2.3664 | +| bird | north | insample_prevalence | 10 | 0.1851 | 0.1178 | 0.2520 | 0.1850 | 0.0702 | +| bird | north | insample_rmse | 10 | 0.5619 | 0.4883 | 0.6343 | 0.5614 | 0.0758 | +| bird | north | insample_spearman | 10 | 0.3894 | 0.3723 | 0.4105 | 0.3913 | 0.0183 | +| bird | north | oob_auc | 10 | 0.7698 | 0.7568 | 0.7831 | 0.7698 | 0.0131 | +| bird | north | oob_calibration_slope | 10 | 0.9891 | 0.9030 | 1.0588 | 0.9794 | 0.0748 | +| bird | north | oob_deviance_explained | 10 | 0.2358 | 0.2089 | 0.2637 | 0.2361 | 0.0279 | +| bird | north | oob_n | 10 | 124877.0000 | 124874.0000 | 124880.0000 | 124876.4000 | 2.3664 | +| bird | north | oob_prevalence | 10 | 0.1877 | 0.1343 | 0.2411 | 0.1877 | 0.0561 | +| bird | north | oob_rmse | 10 | 0.5913 | 0.5422 | 0.6392 | 0.5908 | 0.0507 | +| bird | north | oob_spearman | 10 | 0.3634 | 0.3366 | 0.3901 | 0.3633 | 0.0272 | +| bird | south | insample_auc | 10 | 0.7737 | 0.7584 | 0.7861 | 0.7724 | 0.0134 | +| bird | south | insample_calibration_slope | 10 | 1.1005 | 0.9536 | 1.2339 | 1.0982 | 0.1427 | +| bird | south | insample_deviance_explained | 10 | 0.2678 | 0.1979 | 0.3324 | 0.2660 | 0.0690 | +| bird | south | insample_n | 10 | 23761.0000 | 23761.0000 | 23762.0000 | 23761.2000 | 0.4216 | +| bird | south | insample_prevalence | 10 | 0.2140 | 0.1710 | 0.2587 | 0.2147 | 0.0458 | +| bird | south | insample_rmse | 10 | 0.6438 | 0.5799 | 0.7083 | 0.6433 | 0.0653 | +| bird | south | insample_spearman | 10 | 0.3845 | 0.3773 | 0.4048 | 0.3899 | 0.0125 | +| bird | south | oob_auc | 10 | 0.7438 | 0.7318 | 0.7591 | 0.7446 | 0.0135 | +| bird | south | oob_calibration_slope | 10 | 1.0053 | 0.8916 | 1.1044 | 0.9973 | 0.0926 | +| bird | south | oob_deviance_explained | 10 | 0.2126 | 0.1601 | 0.2646 | 0.2126 | 0.0542 | +| bird | south | oob_n | 10 | 67240.0000 | 67239.0000 | 67240.0000 | 67239.8000 | 0.4216 | +| bird | south | oob_prevalence | 10 | 0.2177 | 0.1756 | 0.2603 | 0.2179 | 0.0444 | +| bird | south | oob_rmse | 10 | 0.6649 | 0.6147 | 0.7156 | 0.6651 | 0.0527 | +| bird | south | oob_spearman | 10 | 0.3524 | 0.3456 | 0.3586 | 0.3524 | 0.0058 | +| bryophyte | north | insample_auc | 10 | 0.8614 | 0.7699 | 0.8810 | 0.8447 | 0.0445 | +| bryophyte | north | insample_calibration_slope | 10 | 1.3758 | 1.2991 | 1.5011 | 1.3844 | 0.0860 | +| bryophyte | north | insample_deviance_explained | 10 | 0.2854 | 0.1545 | 0.3357 | 0.2691 | 0.0724 | +| bryophyte | north | insample_n | 10 | 3091.0000 | 3041.1000 | 4852.0000 | 3429.3000 | 750.2771 | +| bryophyte | north | insample_prevalence | 10 | 0.4175 | 0.3976 | 0.4423 | 0.4194 | 0.0223 | +| bryophyte | north | insample_rmse | 10 | 0.3948 | 0.3812 | 0.4407 | 0.4023 | 0.0237 | +| bryophyte | north | insample_spearman | 10 | 0.6135 | 0.4586 | 0.6543 | 0.5888 | 0.0773 | +| bryophyte | north | oob_auc | 8 | 0.6870 | 0.6446 | 0.7122 | 0.6829 | 0.0307 | +| bryophyte | north | oob_calibration_slope | 8 | 0.7215 | 0.6216 | 0.8656 | 0.7325 | 0.1018 | +| bryophyte | north | oob_deviance_explained | 8 | 0.0639 | 0.0214 | 0.0849 | 0.0585 | 0.0307 | +| bryophyte | north | oob_n | 10 | 1761.0000 | 0.0000 | 1810.9000 | 1422.7000 | 750.2771 | +| bryophyte | north | oob_prevalence | 8 | 0.4201 | 0.4007 | 0.4503 | 0.4233 | 0.0233 | +| bryophyte | north | oob_rmse | 8 | 0.4704 | 0.4663 | 0.4809 | 0.4716 | 0.0078 | +| bryophyte | north | oob_spearman | 8 | 0.3188 | 0.2457 | 0.3659 | 0.3129 | 0.0543 | +| bryophyte | south | insample_auc | 10 | 0.9033 | 0.8781 | 0.9252 | 0.8951 | 0.0386 | +| bryophyte | south | insample_calibration_slope | 10 | 1.2668 | 1.2203 | 1.3172 | 1.2782 | 0.0742 | +| bryophyte | south | insample_deviance_explained | 10 | 0.3912 | 0.3258 | 0.4512 | 0.3749 | 0.0794 | +| bryophyte | south | insample_n | 10 | 1454.5000 | 1440.8000 | 2310.0000 | 1623.0000 | 362.3789 | +| bryophyte | south | insample_prevalence | 10 | 0.3052 | 0.2352 | 0.3713 | 0.3043 | 0.0687 | +| bryophyte | south | insample_rmse | 10 | 0.3432 | 0.3058 | 0.3751 | 0.3441 | 0.0369 | +| bryophyte | south | insample_spearman | 10 | 0.6324 | 0.5665 | 0.6859 | 0.6207 | 0.0595 | +| bryophyte | south | oob_auc | 8 | 0.7517 | 0.7225 | 0.7802 | 0.7520 | 0.0273 | +| bryophyte | south | oob_calibration_slope | 8 | 0.7373 | 0.7015 | 0.8020 | 0.7471 | 0.0439 | +| bryophyte | south | oob_deviance_explained | 8 | 0.1116 | 0.0774 | 0.1399 | 0.1117 | 0.0272 | +| bryophyte | south | oob_n | 10 | 855.5000 | 0.0000 | 869.2000 | 687.0000 | 362.3789 | +| bryophyte | south | oob_prevalence | 8 | 0.3139 | 0.2297 | 0.3751 | 0.3071 | 0.0716 | +| bryophyte | south | oob_rmse | 8 | 0.4258 | 0.3890 | 0.4556 | 0.4235 | 0.0313 | +| bryophyte | south | oob_spearman | 8 | 0.3968 | 0.3723 | 0.4231 | 0.3953 | 0.0229 | +| lichen | north | insample_auc | 10 | 0.9092 | 0.8901 | 0.9416 | 0.9112 | 0.0322 | +| lichen | north | insample_calibration_slope | 10 | 1.1532 | 1.1179 | 1.1949 | 1.1548 | 0.0380 | +| lichen | north | insample_deviance_explained | 10 | 0.4173 | 0.3855 | 0.5321 | 0.4402 | 0.0848 | +| lichen | north | insample_n | 10 | 3692.0000 | 3654.0000 | 5811.0000 | 4109.1000 | 897.3877 | +| lichen | north | insample_prevalence | 10 | 0.3839 | 0.3815 | 0.3891 | 0.3840 | 0.0037 | +| lichen | north | insample_rmse | 10 | 0.3517 | 0.3052 | 0.3641 | 0.3413 | 0.0324 | +| lichen | north | insample_spearman | 10 | 0.6891 | 0.6572 | 0.7431 | 0.6928 | 0.0538 | +| lichen | north | oob_auc | 8 | 0.8279 | 0.7798 | 0.8701 | 0.8265 | 0.0450 | +| lichen | north | oob_calibration_slope | 8 | 0.9007 | 0.8358 | 0.9603 | 0.8959 | 0.0575 | +| lichen | north | oob_deviance_explained | 8 | 0.2584 | 0.1785 | 0.3420 | 0.2603 | 0.0816 | +| lichen | north | oob_n | 10 | 2119.0000 | 0.0000 | 2157.0000 | 1701.9000 | 897.3877 | +| lichen | north | oob_prevalence | 8 | 0.3864 | 0.3761 | 0.3921 | 0.3853 | 0.0072 | +| lichen | north | oob_rmse | 8 | 0.4044 | 0.3737 | 0.4325 | 0.4031 | 0.0286 | +| lichen | north | oob_spearman | 8 | 0.5535 | 0.4722 | 0.6241 | 0.5503 | 0.0760 | +| lichen | south | insample_auc | 10 | 0.9686 | 0.9482 | 0.9792 | 0.9663 | 0.0147 | +| lichen | south | insample_calibration_slope | 10 | 1.1831 | 1.1308 | 1.2935 | 1.1991 | 0.0688 | +| lichen | south | insample_deviance_explained | 10 | 0.6087 | 0.5214 | 0.6729 | 0.5882 | 0.0813 | +| lichen | south | insample_n | 10 | 1484.5000 | 1478.5000 | 2346.0000 | 1657.8000 | 362.9370 | +| lichen | south | insample_prevalence | 10 | 0.1511 | 0.0868 | 0.2167 | 0.1525 | 0.0659 | +| lichen | south | insample_rmse | 10 | 0.2174 | 0.1882 | 0.2497 | 0.2191 | 0.0286 | +| lichen | south | insample_spearman | 10 | 0.5637 | 0.4448 | 0.6833 | 0.5634 | 0.1102 | +| lichen | south | oob_auc | 8 | 0.8649 | 0.8298 | 0.8846 | 0.8581 | 0.0288 | +| lichen | south | oob_calibration_slope | 8 | 0.8251 | 0.6691 | 0.8954 | 0.8012 | 0.1214 | +| lichen | south | oob_deviance_explained | 8 | 0.2582 | 0.1012 | 0.3352 | 0.2293 | 0.1168 | +| lichen | south | oob_n | 10 | 861.5000 | 0.0000 | 867.5000 | 688.2000 | 362.9370 | +| lichen | south | oob_prevalence | 8 | 0.1578 | 0.0943 | 0.2207 | 0.1582 | 0.0637 | +| lichen | south | oob_rmse | 8 | 0.3147 | 0.2702 | 0.3334 | 0.3048 | 0.0292 | +| lichen | south | oob_spearman | 8 | 0.4496 | 0.3334 | 0.5524 | 0.4451 | 0.1063 | +| mammal_summer | north | insample_auc | 10 | 0.8510 | 0.7867 | 0.9224 | 0.8472 | 0.0788 | +| mammal_summer | north | insample_calibration_slope | 10 | 1.2105 | 1.0951 | 1.3878 | 1.2388 | 0.1326 | +| mammal_summer | north | insample_deviance_explained | 10 | 0.3169 | 0.2021 | 0.5029 | 0.3355 | 0.1508 | +| mammal_summer | north | insample_n | 10 | 2587.5000 | 2542.1000 | 4053.0000 | 2865.2000 | 626.3850 | +| mammal_summer | north | insample_prevalence | 10 | 0.2736 | 0.2243 | 0.3206 | 0.2726 | 0.0496 | +| mammal_summer | north | insample_rmse | 10 | 0.3414 | 0.2707 | 0.3961 | 0.3374 | 0.0617 | +| mammal_summer | north | insample_spearman | 10 | 0.5275 | 0.4545 | 0.6076 | 0.5196 | 0.1036 | +| mammal_summer | north | oob_auc | 8 | 0.7264 | 0.6348 | 0.8195 | 0.7274 | 0.0929 | +| mammal_summer | north | oob_calibration_slope | 8 | 0.7018 | 0.5771 | 0.8626 | 0.7166 | 0.1354 | +| mammal_summer | north | oob_deviance_explained | 8 | 0.1000 | 0.0198 | 0.2566 | 0.1270 | 0.1141 | +| mammal_summer | north | oob_n | 10 | 1465.5000 | 0.0000 | 1510.9000 | 1187.8000 | 626.3850 | +| mammal_summer | north | oob_prevalence | 8 | 0.2774 | 0.2208 | 0.3261 | 0.2746 | 0.0539 | +| mammal_summer | north | oob_rmse | 8 | 0.3953 | 0.3314 | 0.4438 | 0.3903 | 0.0567 | +| mammal_summer | north | oob_spearman | 8 | 0.3364 | 0.2091 | 0.4532 | 0.3341 | 0.1225 | +| mammal_summer | south | insample_auc | 10 | 0.9288 | 0.8453 | 0.9790 | 0.9117 | 0.0726 | +| mammal_summer | south | insample_calibration_slope | 10 | 1.3495 | 1.2208 | 1.5068 | 1.3944 | 0.2498 | +| mammal_summer | south | insample_deviance_explained | 10 | 0.4206 | 0.2223 | 0.7037 | 0.4326 | 0.2145 | +| mammal_summer | south | insample_n | 10 | 676.5000 | 670.8000 | 1065.0000 | 753.7000 | 164.1402 | +| mammal_summer | south | insample_prevalence | 10 | 0.4451 | 0.1814 | 0.7098 | 0.4419 | 0.2704 | +| mammal_summer | south | insample_rmse | 10 | 0.2920 | 0.2235 | 0.3561 | 0.2933 | 0.0622 | +| mammal_summer | south | insample_spearman | 10 | 0.5872 | 0.5123 | 0.6435 | 0.5691 | 0.0908 | +| mammal_summer | south | oob_auc | 8 | 0.6859 | 0.5980 | 0.7912 | 0.6933 | 0.0999 | +| mammal_summer | south | oob_calibration_slope | 8 | 0.5395 | 0.3744 | 0.8810 | 0.5899 | 0.2334 | +| mammal_summer | south | oob_deviance_explained | 8 | -0.0275 | -0.0673 | 0.1741 | 0.0253 | 0.1236 | +| mammal_summer | south | oob_n | 10 | 388.5000 | 0.0000 | 394.2000 | 311.3000 | 164.1402 | +| mammal_summer | south | oob_prevalence | 8 | 0.4195 | 0.1726 | 0.6930 | 0.4251 | 0.2678 | +| mammal_summer | south | oob_rmse | 8 | 0.4015 | 0.3273 | 0.4526 | 0.3937 | 0.0597 | +| mammal_summer | south | oob_spearman | 8 | 0.2479 | 0.1202 | 0.3897 | 0.2536 | 0.1325 | +| mammal_winter | north | insample_auc | 10 | 0.8918 | 0.8420 | 0.9162 | 0.8846 | 0.0355 | +| mammal_winter | north | insample_calibration_slope | 10 | 1.1597 | 1.0523 | 1.3024 | 1.1679 | 0.1117 | +| mammal_winter | north | insample_deviance_explained | 10 | 0.3971 | 0.2938 | 0.4736 | 0.3908 | 0.0848 | +| mammal_winter | north | insample_n | 10 | 2624.5000 | 2596.8000 | 4127.0000 | 2921.0000 | 635.9504 | +| mammal_winter | north | insample_prevalence | 10 | 0.1752 | 0.1467 | 0.2040 | 0.1753 | 0.0287 | +| mammal_winter | north | insample_rmse | 10 | 0.2768 | 0.2641 | 0.2973 | 0.2793 | 0.0151 | +| mammal_winter | north | insample_spearman | 10 | 0.5047 | 0.4253 | 0.5759 | 0.5032 | 0.0691 | +| mammal_winter | north | oob_auc | 8 | 0.7732 | 0.6849 | 0.8485 | 0.7690 | 0.0808 | +| mammal_winter | north | oob_calibration_slope | 8 | 0.7510 | 0.5146 | 0.8766 | 0.7196 | 0.1504 | +| mammal_winter | north | oob_deviance_explained | 8 | 0.1849 | 0.0312 | 0.2981 | 0.1708 | 0.1308 | +| mammal_winter | north | oob_n | 10 | 1502.5000 | 0.0000 | 1530.2000 | 1206.0000 | 635.9504 | +| mammal_winter | north | oob_prevalence | 8 | 0.1756 | 0.1450 | 0.2025 | 0.1746 | 0.0269 | +| mammal_winter | north | oob_rmse | 8 | 0.3147 | 0.3000 | 0.3429 | 0.3194 | 0.0203 | +| mammal_winter | north | oob_spearman | 8 | 0.3595 | 0.2344 | 0.4739 | 0.3548 | 0.1223 | +| mammal_winter | south | insample_auc | 10 | 0.9224 | 0.8432 | 0.9792 | 0.9074 | 0.0697 | +| mammal_winter | south | insample_calibration_slope | 10 | 1.2937 | 1.2545 | 1.5652 | 1.3634 | 0.1374 | +| mammal_winter | south | insample_deviance_explained | 10 | 0.4273 | 0.2637 | 0.6930 | 0.4422 | 0.1882 | +| mammal_winter | south | insample_n | 10 | 694.0000 | 684.8000 | 1098.0000 | 773.7000 | 171.0842 | +| mammal_winter | south | insample_prevalence | 10 | 0.3450 | 0.0865 | 0.6052 | 0.3446 | 0.2704 | +| mammal_winter | south | insample_rmse | 10 | 0.2487 | 0.1472 | 0.3456 | 0.2525 | 0.0902 | +| mammal_winter | south | insample_spearman | 10 | 0.4705 | 0.4147 | 0.7062 | 0.5243 | 0.1212 | +| mammal_winter | south | oob_auc | 8 | 0.6976 | 0.6411 | 0.8063 | 0.7182 | 0.0757 | +| mammal_winter | south | oob_calibration_slope | 8 | 0.5301 | 0.4351 | 0.7396 | 0.5684 | 0.1485 | +| mammal_winter | south | oob_deviance_explained | 8 | 0.0058 | -0.1998 | 0.1763 | -0.0059 | 0.1875 | +| mammal_winter | south | oob_n | 10 | 404.0000 | 0.0000 | 413.2000 | 324.3000 | 171.0842 | +| mammal_winter | south | oob_prevalence | 8 | 0.3501 | 0.0777 | 0.6225 | 0.3492 | 0.2818 | +| mammal_winter | south | oob_rmse | 8 | 0.3397 | 0.2197 | 0.4332 | 0.3307 | 0.1041 | +| mammal_winter | south | oob_spearman | 8 | 0.2590 | 0.2345 | 0.2899 | 0.2608 | 0.0276 | +| mite | north | insample_auc | 10 | 0.8861 | 0.8490 | 0.9130 | 0.8770 | 0.0512 | +| mite | north | insample_calibration_slope | 10 | 1.2393 | 1.1764 | 1.3996 | 1.2771 | 0.1014 | +| mite | north | insample_deviance_explained | 10 | 0.3175 | 0.2511 | 0.4143 | 0.3223 | 0.0980 | +| mite | north | insample_n | 10 | 3630.0000 | 3598.5000 | 5711.0000 | 4041.0000 | 880.4163 | +| mite | north | insample_prevalence | 10 | 0.1545 | 0.0943 | 0.2113 | 0.1531 | 0.0602 | +| mite | north | insample_rmse | 10 | 0.2930 | 0.2520 | 0.3097 | 0.2855 | 0.0279 | +| mite | north | insample_spearman | 10 | 0.4624 | 0.3562 | 0.5826 | 0.4640 | 0.1221 | +| mite | north | oob_auc | 8 | 0.7476 | 0.6487 | 0.8046 | 0.7358 | 0.0755 | +| mite | north | oob_calibration_slope | 8 | 0.7520 | 0.5290 | 0.8442 | 0.7104 | 0.1543 | +| mite | north | oob_deviance_explained | 8 | 0.1131 | -0.0237 | 0.1876 | 0.0947 | 0.1030 | +| mite | north | oob_n | 10 | 2081.0000 | 0.0000 | 2112.5000 | 1670.0000 | 880.4163 | +| mite | north | oob_prevalence | 8 | 0.1509 | 0.0925 | 0.2048 | 0.1495 | 0.0588 | +| mite | north | oob_rmse | 8 | 0.3281 | 0.2834 | 0.3631 | 0.3250 | 0.0388 | +| mite | north | oob_spearman | 8 | 0.3080 | 0.1536 | 0.4270 | 0.2969 | 0.1371 | +| mite | south | insample_auc | 10 | 0.9592 | 0.9376 | 0.9939 | 0.9618 | 0.0251 | +| mite | south | insample_calibration_slope | 10 | 1.2129 | 1.1367 | 1.3093 | 1.2269 | 0.0874 | +| mite | south | insample_deviance_explained | 10 | 0.5182 | 0.4315 | 0.7601 | 0.5606 | 0.1372 | +| mite | south | insample_n | 10 | 1493.0000 | 1480.9000 | 2363.0000 | 1665.8000 | 367.6444 | +| mite | south | insample_prevalence | 10 | 0.0721 | 0.0556 | 0.0841 | 0.0703 | 0.0144 | +| mite | south | insample_rmse | 10 | 0.1851 | 0.1250 | 0.2161 | 0.1770 | 0.0411 | +| mite | south | insample_spearman | 10 | 0.4054 | 0.3708 | 0.4408 | 0.4054 | 0.0280 | +| mite | south | oob_auc | 8 | 0.8217 | 0.7176 | 0.9044 | 0.8152 | 0.0913 | +| mite | south | oob_calibration_slope | 8 | 0.6549 | 0.4859 | 0.9202 | 0.6803 | 0.1978 | +| mite | south | oob_deviance_explained | 8 | 0.1333 | -0.0105 | 0.3578 | 0.1547 | 0.1687 | +| mite | south | oob_n | 10 | 870.0000 | 0.0000 | 882.1000 | 697.2000 | 367.6444 | +| mite | south | oob_prevalence | 8 | 0.0719 | 0.0489 | 0.0868 | 0.0689 | 0.0174 | +| mite | south | oob_rmse | 8 | 0.2426 | 0.1842 | 0.2757 | 0.2335 | 0.0451 | +| mite | south | oob_spearman | 8 | 0.2530 | 0.2087 | 0.3351 | 0.2668 | 0.0542 | +| vascular_plant | north | insample_auc | 10 | 0.9376 | 0.9310 | 0.9410 | 0.9367 | 0.0044 | +| vascular_plant | north | insample_calibration_slope | 10 | 1.1354 | 1.1200 | 1.1411 | 1.1330 | 0.0098 | +| vascular_plant | north | insample_deviance_explained | 10 | 0.5183 | 0.4948 | 0.5237 | 0.5139 | 0.0151 | +| vascular_plant | north | insample_n | 10 | 4347.5000 | 4314.6000 | 6874.0000 | 4846.9000 | 1068.6395 | +| vascular_plant | north | insample_prevalence | 10 | 0.3951 | 0.3770 | 0.4211 | 0.3974 | 0.0209 | +| vascular_plant | north | insample_rmse | 10 | 0.3144 | 0.3092 | 0.3227 | 0.3144 | 0.0058 | +| vascular_plant | north | insample_spearman | 10 | 0.7385 | 0.7305 | 0.7504 | 0.7397 | 0.0107 | +| vascular_plant | north | oob_auc | 8 | 0.8697 | 0.8604 | 0.8766 | 0.8691 | 0.0076 | +| vascular_plant | north | oob_calibration_slope | 8 | 0.9589 | 0.9312 | 0.9797 | 0.9563 | 0.0248 | +| vascular_plant | north | oob_deviance_explained | 8 | 0.3414 | 0.3159 | 0.3587 | 0.3391 | 0.0210 | +| vascular_plant | north | oob_n | 10 | 2526.5000 | 0.0000 | 2559.4000 | 2027.1000 | 1068.6395 | +| vascular_plant | north | oob_prevalence | 8 | 0.3990 | 0.3725 | 0.4275 | 0.3991 | 0.0248 | +| vascular_plant | north | oob_rmse | 8 | 0.3753 | 0.3705 | 0.3834 | 0.3765 | 0.0055 | +| vascular_plant | north | oob_spearman | 8 | 0.6268 | 0.6048 | 0.6427 | 0.6255 | 0.0160 | +| vascular_plant | south | insample_auc | 10 | 0.9750 | 0.9565 | 0.9889 | 0.9738 | 0.0136 | +| vascular_plant | south | insample_calibration_slope | 10 | 1.1189 | 1.0822 | 1.1506 | 1.1168 | 0.0321 | +| vascular_plant | south | insample_deviance_explained | 10 | 0.6677 | 0.5715 | 0.7691 | 0.6713 | 0.0805 | +| vascular_plant | south | insample_n | 10 | 1688.5000 | 1654.9000 | 2648.0000 | 1869.6000 | 410.6067 | +| vascular_plant | south | insample_prevalence | 10 | 0.2438 | 0.2212 | 0.2654 | 0.2437 | 0.0227 | +| vascular_plant | south | insample_rmse | 10 | 0.2318 | 0.1862 | 0.2693 | 0.2280 | 0.0344 | +| vascular_plant | south | insample_spearman | 10 | 0.7011 | 0.6914 | 0.7153 | 0.7029 | 0.0117 | +| vascular_plant | south | oob_auc | 8 | 0.9043 | 0.8724 | 0.9382 | 0.9053 | 0.0328 | +| vascular_plant | south | oob_calibration_slope | 8 | 0.9306 | 0.8921 | 0.9559 | 0.9256 | 0.0269 | +| vascular_plant | south | oob_deviance_explained | 8 | 0.4119 | 0.3408 | 0.5093 | 0.4192 | 0.0820 | +| vascular_plant | south | oob_n | 10 | 959.5000 | 0.0000 | 993.1000 | 778.4000 | 410.6067 | +| vascular_plant | south | oob_prevalence | 8 | 0.2418 | 0.2131 | 0.2706 | 0.2421 | 0.0259 | +| vascular_plant | south | oob_rmse | 8 | 0.3105 | 0.2780 | 0.3427 | 0.3108 | 0.0317 | +| vascular_plant | south | oob_spearman | 8 | 0.6007 | 0.5669 | 0.6277 | 0.5987 | 0.0306 | + diff --git a/3_output/exp_001_xgboost/tables/comparison_grid.csv b/3_output/exp_001_xgboost/tables/comparison_grid.csv new file mode 100644 index 0000000..d3c0575 --- /dev/null +++ b/3_output/exp_001_xgboost/tables/comparison_grid.csv @@ -0,0 +1,29 @@ +taxon,region,season,part,species,grid_units,spearman,median_absolute_difference +bird,north,"","",AMRO,89,-0.0763363976847123,0.009370065460805 +bird,north,"","",YEWA,89,0.632567245488594,0.010020663139576 +bird,south,"","",AMRO,17,0.692826617040601,0.0078450774802179 +bird,south,"","",YEWA,17,0.547913201751984,0.0391985808328686 +bryophyte,north,"","",Bryum.All,43,0.407227820289416,0.212234270449689 +bryophyte,north,"","",Ceratodon.purpureus,43,0.851503901810743,0.116998420947752 +bryophyte,south,"","",Bryum.All,16,0.476470588235294,0.252848715484176 +bryophyte,south,"","",Ceratodon.purpureus,16,0.2,0.0326931393823578 +lichen,north,"","",Cladonia.chlorophaea,43,0.727706644442761,0.081440431444869 +lichen,north,"","",Physcia.adscendens,43,0.638608985529207,0.021737265267572 +lichen,south,"","",Cladonia.chlorophaea,16,0.585294117647059,0.0810492570735384 +lichen,south,"","",Physcia.adscendens,16,0.794117647058824,0.0700528402174986 +mammal,north,summer,hurdle,Coyote_Summer,45,0.406210351015952,0.027096643314308 +mammal,north,summer,hurdle,Moose_Summer,45,0.626663695274847,0.159743478635358 +mammal,north,winter,hurdle,Coyote_Winter,45,0.756438212782176,0.0270155817515243 +mammal,north,winter,hurdle,Moose_Winter,45,0.75287196590407,0.201298626091961 +mammal,south,summer,hurdle,Coyote_Summer,20,0.650983852581882,0.0512172624465049 +mammal,south,summer,hurdle,Moose_Summer,20,0.776837682632211,0.00967291683006392 +mammal,south,winter,hurdle,Coyote_Winter,20,0.634727114238697,0.131871665317822 +mammal,south,winter,hurdle,Moose_Winter,20,0.709998032377615,0.00452107677607601 +mite,north,"","",Ceratozetes.gracilis,43,-0.336919463595727,0.077740689546667 +mite,north,"","",Trhypochthonius.tectorum,43,0.292219107508145,0.0222447522130691 +mite,south,"","",Ceratozetes.gracilis,16,0.744665396597154,0.00314975122744953 +mite,south,"","",Trhypochthonius.tectorum,16,0.528329797190471,0.0277535717410072 +vascular_plant,north,"","",Galium.boreale,43,0.809227971816047,0.0667940816213831 +vascular_plant,north,"","",Vicia.americana,43,0.65648912796424,0.0645127290355628 +vascular_plant,south,"","",Galium.boreale,16,0.0558823529411765,0.125807736377774 +vascular_plant,south,"","",Vicia.americana,16,0.873529411764706,0.0429591076945282 diff --git a/3_output/exp_001_xgboost/tables/comparison_summary.csv b/3_output/exp_001_xgboost/tables/comparison_summary.csv new file mode 100644 index 0000000..254530c --- /dev/null +++ b/3_output/exp_001_xgboost/tables/comparison_summary.csv @@ -0,0 +1,71 @@ +taxon,region,season,part,metric,species,draws_baseline,draws_candidate,median_baseline,median_candidate,median_difference,share_better +bird,north,"","",oob_auc,2,5,5,0.729484461943779,0.769348946012837,0.0398644840690585,1 +bird,north,"","",oob_calibration_slope,2,5,5,0.774212093974031,0.980942416621589,0.206730322647559,1 +bird,north,"","",oob_deviance_explained,2,5,5,0.165570186112103,0.236027838272926,0.0704576521608235,1 +bird,north,"","",oob_rmse,2,5,5,0.624644013968721,0.590479047469672,-0.0341649664990495,1 +bird,north,"","",oob_spearman,2,5,5,0.3109374709378,0.362790682770683,0.051853211832883,1 +bird,south,"","",oob_auc,2,5,5,0.702136429854496,0.744711576653555,0.0425751467990589,1 +bird,south,"","",oob_calibration_slope,2,5,5,0.903072708091274,0.988410072114907,0.0853373640236331,0.5 +bird,south,"","",oob_deviance_explained,2,5,5,0.150457127171694,0.212898482389737,0.0624413552180429,1 +bird,south,"","",oob_rmse,2,5,5,0.686946466284977,0.664727643219661,-0.022218823065316,1 +bird,south,"","",oob_spearman,2,5,5,0.291640797085428,0.352533436704584,0.0608926396191565,1 +bryophyte,north,"","",oob_auc,2,4,4,0.64999737456798,0.681320193098614,0.0313228185306345,1 +bryophyte,north,"","",oob_calibration_slope,2,4,4,0.770110822063579,0.707358689878709,-0.06275213218487,0 +bryophyte,north,"","",oob_deviance_explained,2,4,4,-0.18848913667322,0.0536170209107999,0.242106157584019,1 +bryophyte,north,"","",oob_rmse,2,4,4,0.477685026278507,0.472581758066048,-0.00510326821245896,1 +bryophyte,north,"","",oob_spearman,2,4,4,0.256657246933472,0.310694841692671,0.054037594759199,1 +bryophyte,south,"","",oob_auc,2,4,4,0.668840496946664,0.754044235208787,0.085203738262123,1 +bryophyte,south,"","",oob_calibration_slope,2,4,4,0.859428373309233,0.746971129761266,-0.112457243547968,0 +bryophyte,south,"","",oob_deviance_explained,2,4,4,0.0095574817283275,0.114484674469622,0.104927192741294,1 +bryophyte,south,"","",oob_rmse,2,4,4,0.440793673928001,0.423472017554872,-0.0173216563731285,1 +bryophyte,south,"","",oob_spearman,2,4,4,0.260684119461907,0.399183369633167,0.13849925017126,1 +lichen,north,"","",oob_auc,2,4,4,0.802806546010246,0.826728262766536,0.02392171675629,1 +lichen,north,"","",oob_calibration_slope,2,4,4,0.980606541125594,0.898785859245988,-0.081820681879606,0 +lichen,north,"","",oob_deviance_explained,2,4,4,0.12872576435422,0.262930632644152,0.134204868289933,1 +lichen,north,"","",oob_rmse,2,4,4,0.413025371860499,0.402576696699741,-0.010448675160758,1 +lichen,north,"","",oob_spearman,2,4,4,0.509892978412699,0.550148292994419,0.0402553145817195,1 +lichen,south,"","",oob_auc,2,4,4,0.79223256589659,0.859890666798608,0.0676581009020185,1 +lichen,south,"","",oob_calibration_slope,2,4,4,0.991922312776069,0.789037211584084,-0.202885101191985,0 +lichen,south,"","",oob_deviance_explained,2,4,4,0.114894473111837,0.226829452005767,0.11193497889393,1 +lichen,south,"","",oob_rmse,2,4,4,0.323218486449386,0.303145973636455,-0.0200725128129305,1 +lichen,south,"","",oob_spearman,2,4,4,0.367603610275592,0.44089952165737,0.073295911381779,1 +mammal,north,summer,hurdle,oob_auc,2,4,4,0.703613262852787,0.726922473911036,0.0233092110582485,1 +mammal,north,summer,hurdle,oob_calibration_slope,2,4,4,0.848546092009838,0.71608965082318,-0.132456441186657,0 +mammal,north,summer,hurdle,oob_deviance_explained,2,4,4,0.128594332790676,0.129285991085928,0.000691658295252105,0.5 +mammal,north,summer,hurdle,oob_rmse,2,4,4,0.389826626621835,0.390944915562518,0.00111828894068303,0.5 +mammal,north,summer,hurdle,oob_spearman,2,4,4,0.289511245096673,0.333047638929966,0.043536393833294,1 +mammal,north,winter,hurdle,oob_auc,2,4,4,0.740915617852812,0.767965958132812,0.0270503402800005,1 +mammal,north,winter,hurdle,oob_calibration_slope,2,4,4,0.822223168277882,0.716700705992882,-0.105522462285,0 +mammal,north,winter,hurdle,oob_deviance_explained,2,4,4,0.16408786923621,0.170803540529399,0.0067156712931891,1 +mammal,north,winter,hurdle,oob_rmse,2,4,4,0.320617152941719,0.320865029966542,0.000247877024823012,0.5 +mammal,north,winter,hurdle,oob_spearman,2,4,4,0.317877730167646,0.353818361682336,0.0359406315146905,1 +mammal,south,summer,hurdle,oob_auc,2,4,4,0.659879682564245,0.683558804148912,0.023679121584667,1 +mammal,south,summer,hurdle,oob_calibration_slope,2,4,4,0.651781981508862,0.56698576847298,-0.0847962130358825,0 +mammal,south,summer,hurdle,oob_deviance_explained,2,4,4,0.0445614263041746,0.0172117111003372,-0.0273497152038374,0 +mammal,south,summer,hurdle,oob_rmse,2,4,4,0.39442267626108,0.391115654795445,-0.003307021465635,0.5 +mammal,south,summer,hurdle,oob_spearman,2,4,4,0.20556454395683,0.242710772658295,0.037146228701465,1 +mammal,south,winter,hurdle,oob_auc,2,4,4,0.709985275949603,0.725345752575603,0.015360476626,1 +mammal,south,winter,hurdle,oob_calibration_slope,2,4,4,0.709081739397214,0.533347641577976,-0.175734097819239,0 +mammal,south,winter,hurdle,oob_deviance_explained,2,4,4,0.0944228998286284,0.0548525634368907,-0.0395703363917378,0 +mammal,south,winter,hurdle,oob_rmse,2,4,4,0.32499707220521,0.328686168782769,0.00368909657755902,0 +mammal,south,winter,hurdle,oob_spearman,2,4,4,0.246748276299786,0.261544559789032,0.0147962834892455,1 +mite,north,"","",oob_auc,2,4,4,0.715543903851094,0.73913990130773,0.023595997456637,1 +mite,north,"","",oob_calibration_slope,2,4,4,0.91133114539273,0.729109464995533,-0.182221680397197,0 +mite,north,"","",oob_deviance_explained,2,4,4,0.0149187218448,0.101320869461578,0.0864021476167777,1 +mite,north,"","",oob_rmse,2,4,4,0.328141122068562,0.326470551976542,-0.00167057009202054,0.5 +mite,north,"","",oob_spearman,2,4,4,0.271890083460792,0.299684150078939,0.0277940666181475,1 +mite,south,"","",oob_auc,2,4,4,0.773632058303039,0.811148950748457,0.0375168924454185,1 +mite,south,"","",oob_calibration_slope,2,4,4,0.614282370199175,0.68500389956616,0.0707215293669846,0.5 +mite,south,"","",oob_deviance_explained,2,4,4,0.0865130411560292,0.152698132467715,0.0661850913116854,0.5 +mite,south,"","",oob_rmse,2,4,4,0.246446874946777,0.230070074903374,-0.016376800043403,1 +mite,south,"","",oob_spearman,2,4,4,0.230646626561677,0.26964857560987,0.0390019490481925,1 +vascular_plant,north,"","",oob_auc,2,4,4,0.827954669352313,0.86852429313465,0.040569623782337,1 +vascular_plant,north,"","",oob_calibration_slope,2,4,4,0.975256964203091,0.958160650530104,-0.017096313672988,0 +vascular_plant,north,"","",oob_deviance_explained,2,4,4,0.178982880150698,0.339549650190438,0.160566770039741,1 +vascular_plant,north,"","",oob_rmse,2,4,4,0.404515361388574,0.375953908899234,-0.0285614524893405,1 +vascular_plant,north,"","",oob_spearman,2,4,4,0.555249895538886,0.624017960090769,0.0687680645518826,1 +vascular_plant,south,"","",oob_auc,2,4,4,0.845681924077273,0.904991132348347,0.059309208271074,1 +vascular_plant,south,"","",oob_calibration_slope,2,4,4,0.941201813094871,0.927675303215445,-0.0135265098794255,0 +vascular_plant,south,"","",oob_deviance_explained,2,4,4,0.267977840506312,0.420544901894971,0.15256706138866,1 +vascular_plant,south,"","",oob_rmse,2,4,4,0.351078283914618,0.310607470073221,-0.0404708138413975,1 +vascular_plant,south,"","",oob_spearman,2,4,4,0.514530181328676,0.597196199607974,0.082666018279298,1 diff --git a/3_output/exp_001_gbm/tables/coverage.csv b/3_output/exp_001_xgboost/tables/coverage.csv similarity index 55% rename from 3_output/exp_001_gbm/tables/coverage.csv rename to 3_output/exp_001_xgboost/tables/coverage.csv index 0937eae..6371257 100644 --- a/3_output/exp_001_gbm/tables/coverage.csv +++ b/3_output/exp_001_xgboost/tables/coverage.csv @@ -5,6 +5,10 @@ bryophyte,bryophyte,north,,,2,5,climate,TRUE,TRUE bryophyte,bryophyte,south,,,2,5,climate,TRUE,TRUE lichen,lichen,north,,,2,5,climate,TRUE,TRUE lichen,lichen,south,,,2,5,climate,TRUE,TRUE +mammal,mammal_summer,north,summer,hurdle,2,5,"habitat_presence, habitat_abundance, habitat_total",TRUE,TRUE +mammal,mammal_summer,south,summer,hurdle,2,5,"habitat_presence, habitat_abundance, habitat_total",TRUE,TRUE +mammal,mammal_winter,north,winter,hurdle,2,5,"habitat_presence, habitat_abundance, habitat_total",TRUE,TRUE +mammal,mammal_winter,south,winter,hurdle,2,5,"habitat_presence, habitat_abundance, habitat_total",TRUE,TRUE mite,mite,north,,,2,5,climate,TRUE,TRUE mite,mite,south,,,2,5,climate,TRUE,TRUE vascular_plant,vascular_plant,north,,,2,5,climate,TRUE,TRUE diff --git a/3_output/exp_001_xgboost/tables/grid_summary.csv b/3_output/exp_001_xgboost/tables/grid_summary.csv new file mode 100644 index 0000000..1867257 --- /dev/null +++ b/3_output/exp_001_xgboost/tables/grid_summary.csv @@ -0,0 +1,945 @@ +taxon,run,region,season,part,species,grid_unit,n,median,p10,p90,boot1 +bird,bird,north,,,AMRO,SpruceR,5,0.0442902566521419,0.0379413763365883,0.0557540594906282,0.0366555040643697 +bird,bird,north,,,AMRO,Spruce1,5,0.0408098016975667,0.0346595753237898,0.0505490074514786,0.0316824231384449 +bird,bird,north,,,AMRO,Spruce2,5,0.0223568138943468,0.0198452460371654,0.0314956944562484,0.0192954402592803 +bird,bird,north,,,AMRO,Spruce3,5,0.0282197876525702,0.0227226500369451,0.0334435815845432,0.0224877396498874 +bird,bird,north,,,AMRO,Spruce4,5,0.0286966101510099,0.0241515722810743,0.0355452381640002,0.0232956844547479 +bird,bird,north,,,AMRO,Spruce5,5,0.0259967783663826,0.0241061211328703,0.0333311345682544,0.0237136213353724 +bird,bird,north,,,AMRO,Spruce6,5,0.0256084396687642,0.0237326043053756,0.0301154335805333,0.0242932970642781 +bird,bird,north,,,AMRO,Spruce7,5,0.0355022119350248,0.0334883836268896,0.0371290000914802,0.0355022119350248 +bird,bird,north,,,AMRO,Spruce8,5,0.0259511693051065,0.0238440388296905,0.0355042866042287,0.0342038606878076 +bird,bird,north,,,AMRO,PineR,5,0.0530403796885895,0.0431398970535729,0.064260145919267,0.0530403796885895 +bird,bird,north,,,AMRO,Pine1,5,0.0445014547049733,0.0408394132453821,0.0593301117543581,0.0415420204206911 +bird,bird,north,,,AMRO,Pine2,5,0.022846537656256,0.0217571641323105,0.0342575390680767,0.022846537656256 +bird,bird,north,,,AMRO,Pine3,5,0.0277978308336986,0.0248246465856406,0.0362001025176557,0.0263660193170897 +bird,bird,north,,,AMRO,Pine4,5,0.0282675236362283,0.0260556190004267,0.0382395504881352,0.0265862768154634 +bird,bird,north,,,AMRO,Pine5,5,0.0270632486606675,0.0258485884345244,0.0362237879412676,0.0270632486606675 +bird,bird,north,,,AMRO,Pine6,5,0.0271726628907815,0.0256204751176008,0.0332529073959584,0.0280985457002906 +bird,bird,north,,,AMRO,Pine7,5,0.0397535674563186,0.0358143971689233,0.0406052378289512,0.0410632003502132 +bird,bird,north,,,AMRO,Pine8,5,0.0286959465035972,0.0253257652108301,0.037154133458552,0.0379560705308812 +bird,bird,north,,,AMRO,DecidR,5,0.0474674128228862,0.0414508731041969,0.0619980110530394,0.0440088010747368 +bird,bird,north,,,AMRO,Decid1,5,0.0444289945916352,0.034966624584059,0.0540921839374352,0.0342898880426625 +bird,bird,north,,,AMRO,Decid2,5,0.0245627636186317,0.0217303716974538,0.0342762042133,0.0218827520102022 +bird,bird,north,,,AMRO,Decid3,5,0.0279854499894029,0.0263224312622206,0.0365690989217634,0.0255902028483798 +bird,bird,north,,,AMRO,Decid4,5,0.0297592066443378,0.0274659579495495,0.038900114881078,0.0267508604288086 +bird,bird,north,,,AMRO,Decid5,5,0.0295837450015427,0.0263040965898498,0.0369294169551003,0.0261273274602881 +bird,bird,north,,,AMRO,Decid6,5,0.027182012927931,0.0267611173123457,0.0339362409246039,0.027182012927931 +bird,bird,north,,,AMRO,Decid7,5,0.0401616660364199,0.0369122073960956,0.0421184396441549,0.039822133423833 +bird,bird,north,,,AMRO,Decid8,5,0.0318205174224639,0.0261659250034069,0.0365730545427156,0.0367415739731917 +bird,bird,north,,,AMRO,MixedwoodR,5,0.0485429076421296,0.0439211281004497,0.0658125883973857,0.0470223955153463 +bird,bird,north,,,AMRO,Mixedwood1,5,0.048712396292556,0.0389357776121493,0.0579615565748635,0.038630648450565 +bird,bird,north,,,AMRO,Mixedwood2,5,0.026930860948549,0.0239341293229536,0.0367415341657149,0.0245900453148193 +bird,bird,north,,,AMRO,Mixedwood3,5,0.0297747561740773,0.0287644899418298,0.038894905950956,0.0280920013291388 +bird,bird,north,,,AMRO,Mixedwood4,5,0.0323139356150363,0.0297643631357146,0.0413834425114011,0.0293661293415373 +bird,bird,north,,,AMRO,Mixedwood5,5,0.0321234111734425,0.0288389037174122,0.0402602617128278,0.0296974295468082 +bird,bird,north,,,AMRO,Mixedwood6,5,0.0290913911754907,0.0280991244272848,0.0368478234006121,0.0286928542458694 +bird,bird,north,,,AMRO,Mixedwood7,5,0.0412524789933992,0.0392057309599574,0.0432773030422306,0.0412524789933992 +bird,bird,north,,,AMRO,Mixedwood8,5,0.0309977852248766,0.0280007101351719,0.0382628039634285,0.0374699974200187 +bird,bird,north,,,AMRO,TreedBogR,5,0.0337712977492606,0.0299890957799074,0.0371895501941989,0.028628369154061 +bird,bird,north,,,AMRO,TreedBog1,5,0.0272670817801905,0.0230814179127418,0.0331290327634357,0.023775423915051 +bird,bird,north,,,AMRO,TreedBog2,5,0.016869947271179,0.0140732244188988,0.0200044851625185,0.0152551161447426 +bird,bird,north,,,AMRO,TreedBog3,5,0.0181679501483436,0.016766559881425,0.0209588625668935,0.0164980014548875 +bird,bird,north,,,AMRO,TreedBog4,5,0.0186196302307698,0.0172603647904916,0.0220479655930649,0.0172462978508757 +bird,bird,north,,,AMRO,TreedBog5,5,0.0186200564051621,0.0167160341057898,0.0213458167499747,0.0173835763845229 +bird,bird,north,,,AMRO,TreedBog6,5,0.0186004269978386,0.0172687090678657,0.0213006894852984,0.0188125410572287 +bird,bird,north,,,AMRO,TreedBog7,5,0.0271996785649599,0.023202733146016,0.0283371608084944,0.0275607079581844 +bird,bird,north,,,AMRO,TreedBog8,5,0.0217917857354594,0.0162578166132046,0.0260000068895663,0.0262291429253524 +bird,bird,north,,,AMRO,TreedFenR,5,0.0409513136681608,0.0379405730091816,0.0561033525620416,0.037550082764674 +bird,bird,north,,,AMRO,TreedFen1,5,0.0381351455352466,0.0330098527614403,0.0507020390021051,0.0313131549498049 +bird,bird,north,,,AMRO,TreedFen2,5,0.0202719594648607,0.0197373502791868,0.0308336623276856,0.019983092495697 +bird,bird,north,,,AMRO,TreedFen3,5,0.0261986934884151,0.0222356459416357,0.0325304794148843,0.0224145726639231 +bird,bird,north,,,AMRO,TreedFen4,5,0.0265129573757243,0.0236596976737338,0.0350830360901622,0.0234311978086551 +bird,bird,north,,,AMRO,TreedFen5,5,0.0247151446652276,0.0238347809958303,0.0333746240820729,0.0236177130606111 +bird,bird,north,,,AMRO,TreedFen6,5,0.0259137573034399,0.0238497099836002,0.0312579186163124,0.0256593125465256 +bird,bird,north,,,AMRO,TreedFen7,5,0.0375913502248985,0.0350050227423771,0.0400889857932004,0.0375913502248985 +bird,bird,north,,,AMRO,TreedFen8,5,0.028017194534647,0.0247965498235974,0.0369147244287134,0.034513852292505 +bird,bird,north,,,AMRO,GrassHerb,5,0.0696717759059958,0.0563279318325428,0.103638548701311,0.0631701403962441 +bird,bird,north,,,AMRO,Shrub,5,0.0462257501706309,0.0450081545836438,0.0865074953678965,0.0449062836010245 +bird,bird,north,,,AMRO,GraminoidFen,5,0.0435039755068399,0.039609748875998,0.0644964879450108,0.0435039755068399 +bird,bird,north,,,AMRO,Marsh,5,0.0415707134371832,0.0364209630223156,0.0518665421315538,0.035979087249624 +bird,bird,north,,,AMRO,RoughP,5,0.0385563195351291,0.0363344070967659,0.055206517850837,0.0364825682256347 +bird,bird,north,,,AMRO,TameP,5,0.0774042250270197,0.0620028450245654,0.100882423985758,0.0941964189389792 +bird,bird,north,,,AMRO,Crop,5,0.0419157898842836,0.0401516559106409,0.0637727667227155,0.0419157898842836 +bird,bird,north,,,AMRO,Industrial,5,0.0792903661964029,0.0550460485321331,0.0894840137169307,0.0792903661964029 +bird,bird,north,,,AMRO,Mine,5,0.0588420456939569,0.0468716009484357,0.0785205294912552,0.047798489883647 +bird,bird,north,,,AMRO,Rural,5,0.0676446716794018,0.0528863624326318,0.0816216856968155,0.0506689540468929 +bird,bird,north,,,AMRO,Urban,5,0.0949196168449331,0.0631169659353919,0.123798691219467,0.0540813495950626 +bird,bird,north,,,AMRO,CCSpruceR,5,0.0548660825144456,0.0479933108748037,0.0590882159677304,0.0469419021512667 +bird,bird,north,,,AMRO,CCSpruce1,5,0.0447747119242866,0.0374941247843785,0.0482153089139789,0.0349383623549889 +bird,bird,north,,,AMRO,CCSpruce2,5,0.0273079319960431,0.0209617909724678,0.0293550035480702,0.020443862083685 +bird,bird,north,,,AMRO,CCSpruce3,5,0.0305351202782775,0.0280150152634986,0.0364973979957509,0.0266700280880372 +bird,bird,north,,,AMRO,CCSpruce4,5,0.0327584413564801,0.0296678771529882,0.0347720295728306,0.0282036918494542 +bird,bird,north,,,AMRO,CCPineR,5,0.0587289542125506,0.0545037899314608,0.0643275350286707,0.0648096538947272 +bird,bird,north,,,AMRO,CCPine1,5,0.0477764208349119,0.0465879214890008,0.0522375563049639,0.0458237948697835 +bird,bird,north,,,AMRO,CCPine2,5,0.0291278137079737,0.0234388210400162,0.031031150900466,0.024212962300131 +bird,bird,north,,,AMRO,CCPine3,5,0.0318883379552167,0.0314207012241382,0.0376296107300506,0.0312781830485466 +bird,bird,north,,,AMRO,CCPine4,5,0.034708581463643,0.0328511123216488,0.0351875395679085,0.0321963982534371 +bird,bird,north,,,AMRO,CCDecidR,5,0.0553033244032425,0.0530273535377752,0.061586724212623,0.0530085091755344 +bird,bird,north,,,AMRO,CCDecid1,5,0.043120628925648,0.0385491467386767,0.0444255720317088,0.0357037943333669 +bird,bird,north,,,AMRO,CCDecid2,5,0.0288558692670304,0.0260702229575784,0.0338566182926065,0.0246364397196421 +bird,bird,north,,,AMRO,CCDecid3,5,0.0347457154544072,0.0306724621978145,0.0384272847416732,0.0301948348653635 +bird,bird,north,,,AMRO,CCDecid4,5,0.0280404566387451,0.0242070491683396,0.0325757924771638,0.0230467936267909 +bird,bird,north,,,AMRO,CCMixedwoodR,5,0.0574889760040758,0.0557000226011299,0.0646503401706651,0.0572809332241251 +bird,bird,north,,,AMRO,CCMixedwood1,5,0.046785288228572,0.0424283166951076,0.0489337743858751,0.0405907218237436 +bird,bird,north,,,AMRO,CCMixedwood2,5,0.0315617719379096,0.028368125641873,0.0364177292376984,0.0276844141367307 +bird,bird,north,,,AMRO,CCMixedwood3,5,0.0376202384178729,0.0341651244180073,0.0400249432321056,0.0331468002108714 +bird,bird,north,,,AMRO,CCMixedwood4,5,0.0310755710481726,0.0262219679768314,0.0344681516878028,0.025299938458174 +bird,bird,north,,,AMRO,ShrubbySwamp,5,0.0527884304766592,0.0421723986574587,0.0569610179761949,0.0383530768124443 +bird,bird,north,,,AMRO,ShrubbyBog,5,0.0409723595332036,0.0372982692143881,0.058070128546272,0.0372286255705113 +bird,bird,north,,,AMRO,ShrubbyFen,5,0.0414726585254478,0.0357054841577196,0.0536777984447897,0.0354572437572338 +bird,bird,north,,,AMRO,TreedSwamp,5,0.0340052576529067,0.0300657914282681,0.0514556829568097,0.0298081110662516 +bird,bird,north,,,YEWA,SpruceR,5,0.0252172608541989,0.0211892448134565,0.0326420392030509,0.020075883166563 +bird,bird,north,,,YEWA,Spruce1,5,0.00957847171535926,0.00869474865056457,0.0186939282445539,0.00855962588062038 +bird,bird,north,,,YEWA,Spruce2,5,0.00671772006347785,0.00562631582377599,0.0127650836706242,0.00637785443019538 +bird,bird,north,,,YEWA,Spruce3,5,0.0079547936252342,0.00538982032166413,0.0128530874615283,0.00548514188142242 +bird,bird,north,,,YEWA,Spruce4,5,0.0073795800653621,0.00493987007123621,0.0119671443320609,0.00518331479834531 +bird,bird,north,,,YEWA,Spruce5,5,0.0059621166882862,0.00404771477128591,0.00925593320608986,0.004278041907003 +bird,bird,north,,,YEWA,Spruce6,5,0.00630005543757491,0.00420283717995631,0.00958821378462626,0.00506842968826455 +bird,bird,north,,,YEWA,Spruce7,5,0.00788860708930735,0.00546440539967634,0.0114170811282863,0.00631044917741408 +bird,bird,north,,,YEWA,Spruce8,5,0.00261191053216785,0.00221885152371783,0.00370631555130206,0.00261191053216785 +bird,bird,north,,,YEWA,PineR,5,0.0193326426396099,0.0161926065087714,0.0204550127337872,0.0150884357126666 +bird,bird,north,,,YEWA,Pine1,5,0.00692773851708771,0.00658236010905898,0.010096599139533,0.00635776860034215 +bird,bird,north,,,YEWA,Pine2,5,0.00482486303603439,0.00439512687098211,0.0073708482977548,0.00467969669325821 +bird,bird,north,,,YEWA,Pine3,5,0.00486016193692089,0.00419200286450482,0.00715262973465363,0.00402467641829798 +bird,bird,north,,,YEWA,Pine4,5,0.00437710020360468,0.00385034143157606,0.00667687943537023,0.00380321697838601 +bird,bird,north,,,YEWA,Pine5,5,0.0033079054436797,0.00318633798041322,0.00513434051538391,0.00315451903780948 +bird,bird,north,,,YEWA,Pine6,5,0.00372543470220038,0.00315876706844845,0.00518259365228388,0.00372543470220038 +bird,bird,north,,,YEWA,Pine7,5,0.00473941782333137,0.00413092293363815,0.00734108833835859,0.00473941782333137 +bird,bird,north,,,YEWA,Pine8,5,0.00222732045630849,0.0020500840283061,0.00357804579349459,0.00211934811922336 +bird,bird,north,,,YEWA,DecidR,5,0.0252963798429963,0.0221556356887623,0.0376747347333419,0.0212328199437469 +bird,bird,north,,,YEWA,Decid1,5,0.025305524684003,0.0244863874215621,0.0328499985926563,0.0245676481910559 +bird,bird,north,,,YEWA,Decid2,5,0.0219283251638807,0.0179230481106008,0.0242276446424189,0.0219283251638807 +bird,bird,north,,,YEWA,Decid3,5,0.0201057729275079,0.0193144044521349,0.0232604406483664,0.0201057729275079 +bird,bird,north,,,YEWA,Decid4,5,0.0203394901670688,0.0179697834656007,0.023842919270437,0.0203394901670688 +bird,bird,north,,,YEWA,Decid5,5,0.0166492147276428,0.0146717001943035,0.0179943753700752,0.0166492147276428 +bird,bird,north,,,YEWA,Decid6,5,0.0179261135307521,0.0146624584973657,0.0215661526608369,0.0221834770312075 +bird,bird,north,,,YEWA,Decid7,5,0.0287695199465869,0.0235838732493952,0.034634571956731,0.0322518452189387 +bird,bird,north,,,YEWA,Decid8,5,0.0130093210294573,0.0104906982842883,0.014422899738834,0.013814377734289 +bird,bird,north,,,YEWA,MixedwoodR,5,0.0123385275476214,0.0101784676984372,0.0137722286823989,0.0102526430752722 +bird,bird,north,,,YEWA,Mixedwood1,5,0.0129786260131255,0.0123421738860962,0.0144735342506947,0.0129786260131255 +bird,bird,north,,,YEWA,Mixedwood2,5,0.0113206338292679,0.00962976654406877,0.0127259559677431,0.0114689543598314 +bird,bird,north,,,YEWA,Mixedwood3,5,0.0108635699078252,0.0104406693439287,0.0130427864294105,0.0107527091542589 +bird,bird,north,,,YEWA,Mixedwood4,5,0.0108418040148146,0.00995943672919273,0.0128482717114086,0.0108418040148146 +bird,bird,north,,,YEWA,Mixedwood5,5,0.00903203258657993,0.00866222533500599,0.0102498206934353,0.00917189565999901 +bird,bird,north,,,YEWA,Mixedwood6,5,0.00791797939834463,0.00703451930522829,0.00989136822109605,0.00991274909224815 +bird,bird,north,,,YEWA,Mixedwood7,5,0.012105038008011,0.00963939148772853,0.0130343298073576,0.0122753952613342 +bird,bird,north,,,YEWA,Mixedwood8,5,0.00384730320245973,0.00351324693977617,0.00475114066512956,0.00508083101521146 +bird,bird,north,,,YEWA,TreedBogR,5,0.0175562622358644,0.0133762584925577,0.0210596918644798,0.014389064730396 +bird,bird,north,,,YEWA,TreedBog1,5,0.0190540711587852,0.0165229495850103,0.0269318503200431,0.0176170520836283 +bird,bird,north,,,YEWA,TreedBog2,5,0.0154493119415555,0.0134641074631472,0.0241948349934878,0.0154474924476239 +bird,bird,north,,,YEWA,TreedBog3,5,0.0164167330732665,0.0140825087649351,0.0243206882329333,0.0144827982262557 +bird,bird,north,,,YEWA,TreedBog4,5,0.0153123548753616,0.0136387830508213,0.0250559321808117,0.0146511553377372 +bird,bird,north,,,YEWA,TreedBog5,5,0.0123347862290518,0.0116778446420415,0.0191059217961641,0.0119928944561281 +bird,bird,north,,,YEWA,TreedBog6,5,0.0138212433111611,0.0115802309482353,0.0201637017802267,0.0146130323425916 +bird,bird,north,,,YEWA,TreedBog7,5,0.0185174886779727,0.0160949297319119,0.0296433944396947,0.0185174886779727 +bird,bird,north,,,YEWA,TreedBog8,5,0.00697135796057667,0.00559569983927094,0.0112330460075968,0.00791716013839676 +bird,bird,north,,,YEWA,TreedFenR,5,0.0196770970891706,0.0171397873180092,0.0255543074089766,0.0160209397065613 +bird,bird,north,,,YEWA,TreedFen1,5,0.0241467003393235,0.0210335703923148,0.0310635608996568,0.019615034312116 +bird,bird,north,,,YEWA,TreedFen2,5,0.0188566558879144,0.0176782515432501,0.0286933195887844,0.0175077663947453 +bird,bird,north,,,YEWA,TreedFen3,5,0.0214560480184915,0.017471466939646,0.0290915664428136,0.0164144317707266 +bird,bird,north,,,YEWA,TreedFen4,5,0.0201332733681646,0.0170731172366312,0.0298258946812116,0.016605243399554 +bird,bird,north,,,YEWA,TreedFen5,5,0.017809865405493,0.013882881437064,0.0240757814763859,0.0135924970801031 +bird,bird,north,,,YEWA,TreedFen6,5,0.0175700135857791,0.0150555535799166,0.0255388672839747,0.0163259597157937 +bird,bird,north,,,YEWA,TreedFen7,5,0.0264687460074498,0.0195992896981854,0.037700688275869,0.020948293345875 +bird,bird,north,,,YEWA,TreedFen8,5,0.00867052772108145,0.00714450679827112,0.0140520410758506,0.00867052772108145 +bird,bird,north,,,YEWA,GrassHerb,5,0.0247942665650597,0.0221220303088086,0.0309798943763234,0.021553211587486 +bird,bird,north,,,YEWA,Shrub,5,0.0167438292029234,0.0148803431886314,0.0207192004456286,0.0148960553874228 +bird,bird,north,,,YEWA,GraminoidFen,5,0.0672236019845667,0.04819197675831,0.0907936517006859,0.0719755044501624 +bird,bird,north,,,YEWA,Marsh,5,0.0269095330214598,0.0212589109161356,0.0299352297815013,0.018901297765308 +bird,bird,north,,,YEWA,RoughP,5,0.0216690652030281,0.0192720705780085,0.0263561170944069,0.0216163865037365 +bird,bird,north,,,YEWA,TameP,5,0.027205333993224,0.0236902654992096,0.0287640592573649,0.0252454982168646 +bird,bird,north,,,YEWA,Crop,5,0.019888188982052,0.0164180138007495,0.0231348064822868,0.0160202980115463 +bird,bird,north,,,YEWA,Industrial,5,0.0127836393693951,0.0109127278729873,0.0184800704038428,0.00969747700209829 +bird,bird,north,,,YEWA,Mine,5,0.0176618835086965,0.0145062853644596,0.0203471328269016,0.0156407135413358 +bird,bird,north,,,YEWA,Rural,5,0.0389064255981324,0.0308573431896291,0.0524950590036186,0.0257099309601401 +bird,bird,north,,,YEWA,Urban,5,0.0153901741959434,0.0120957238082637,0.0252033051037356,0.0153901741959434 +bird,bird,north,,,YEWA,CCSpruceR,5,0.0431720324932133,0.0337854142373539,0.044683567709013,0.0431720324932133 +bird,bird,north,,,YEWA,CCSpruce1,5,0.0199250044887163,0.0194796484443229,0.0212473229177172,0.0194079845551292 +bird,bird,north,,,YEWA,CCSpruce2,5,0.0130846107284879,0.0117191657740812,0.014020080588075,0.0124520266372939 +bird,bird,north,,,YEWA,CCSpruce3,5,0.0131765741882947,0.00997929370740508,0.0173580925525614,0.0107710137647838 +bird,bird,north,,,YEWA,CCSpruce4,5,0.00716844529547846,0.00638823134941302,0.0116302833192983,0.00628999073653532 +bird,bird,north,,,YEWA,CCPineR,5,0.0289343915901491,0.020644860474546,0.0306700835284104,0.0289343915901491 +bird,bird,north,,,YEWA,CCPine1,5,0.0132463244147424,0.011006209591813,0.0140314998178892,0.0132463244147424 +bird,bird,north,,,YEWA,CCPine2,5,0.0084879333840464,0.00735335029030174,0.00982332816094415,0.0084879333840464 +bird,bird,north,,,YEWA,CCPine3,5,0.00886991957290217,0.00728601602104798,0.00982723286093812,0.00729205786902497 +bird,bird,north,,,YEWA,CCPine4,5,0.00516291247775066,0.00430660768207869,0.0066519536744779,0.00425837541296146 +bird,bird,north,,,YEWA,CCDecidR,5,0.0393626865772772,0.0301395716602404,0.0415227531071398,0.0350621309510165 +bird,bird,north,,,YEWA,CCDecid1,5,0.038908243739496,0.0330547109098666,0.0437031104186482,0.037595948256428 +bird,bird,north,,,YEWA,CCDecid2,5,0.0323770641288264,0.0263794227769796,0.0359957237490745,0.0330340375452814 +bird,bird,north,,,YEWA,CCDecid3,5,0.0220952849763002,0.0209430213031278,0.02560050655137,0.0217166888209874 +bird,bird,north,,,YEWA,CCDecid4,5,0.020911571321784,0.0185039642913223,0.0249785106420815,0.0224941636382026 +bird,bird,north,,,YEWA,CCMixedwoodR,5,0.0172413150233895,0.0132921388591543,0.0201359650077028,0.0181353539877801 +bird,bird,north,,,YEWA,CCMixedwood1,5,0.0188644306889026,0.0146935152204791,0.020594294064939,0.0194923830129976 +bird,bird,north,,,YEWA,CCMixedwood2,5,0.0166088860776952,0.0135134348504827,0.0169800793110858,0.0169565961138062 +bird,bird,north,,,YEWA,CCMixedwood3,5,0.01180523920769,0.0112829421979872,0.0124906528648614,0.0116142383348088 +bird,bird,north,,,YEWA,CCMixedwood4,5,0.011875921631321,0.0103638695297408,0.0121459955969613,0.0119903213362338 +bird,bird,north,,,YEWA,ShrubbySwamp,5,0.0414061863826349,0.0279936578869992,0.0511835165171938,0.0298356911238971 +bird,bird,north,,,YEWA,ShrubbyBog,5,0.0189428249185002,0.0165112329076622,0.0224661894603479,0.0163103741569554 +bird,bird,north,,,YEWA,ShrubbyFen,5,0.025253631189968,0.0223710138106836,0.0394595137982641,0.0263073720097301 +bird,bird,north,,,YEWA,TreedSwamp,5,0.0201850421882363,0.0179719556877051,0.0232226609525522,0.0178409577340367 +bird,bird,south,,,AMRO,Loamy,5,0.0099453463633112,0.00904926905774915,0.0135583274885878,0.0122494221325064 +bird,bird,south,,,AMRO,Blowout,5,0.00486110061740811,0.00421930955070651,0.00629533845480345,0.00522184864445689 +bird,bird,south,,,AMRO,ClaySub,5,0.0102044208633063,0.00865310668774484,0.0145708244344866,0.0127204554639752 +bird,bird,south,,,AMRO,Crop,5,0.018307134359615,0.0140270505937466,0.0228525484793672,0.0203434815427071 +bird,bird,south,,,AMRO,Industrial,5,0.0117412015063187,0.0094957087536181,0.0155458757543567,0.0133075888731474 +bird,bird,south,,,AMRO,Mine,5,0.0130323495297585,0.0079974601153472,0.0246304535779822,0.0130323495297585 +bird,bird,south,,,AMRO,Other,5,0.0106156556959336,0.00874407821817452,0.0181453070565345,0.0144492880152384 +bird,bird,south,,,AMRO,RapidDrain,5,0.0157744007969568,0.0118602045037777,0.0174907076775697,0.0161200527605684 +bird,bird,south,,,AMRO,RoughP,5,0.00897317882459992,0.00688491300754547,0.0107816210770082,0.00944247099844065 +bird,bird,south,,,AMRO,Rural,5,0.0445427891266765,0.0389854478090171,0.0576151684176703,0.0445427891266765 +bird,bird,south,,,AMRO,SandyLoam,5,0.007362403427539,0.00628901832821767,0.0112450812995826,0.0110612341693847 +bird,bird,south,,,AMRO,SoilUnknown,5,0.0107728423429594,0.00851530170473417,0.0144778401126145,0.0128004563053197 +bird,bird,south,,,AMRO,TameP,5,0.0169805704866484,0.01512485640848,0.0225205235586839,0.0235183121766503 +bird,bird,south,,,AMRO,ThinBreak,5,0.0124633844842131,0.00978744684689209,0.0157921792805079,0.0124633844842131 +bird,bird,south,,,AMRO,Urban,5,0.142180457295616,0.0812075848191854,0.217757312251608,0.142180457295616 +bird,bird,south,,,AMRO,Water,5,0.0108631451435177,0.0092965912051215,0.0187902338365357,0.0205100044641106 +bird,bird,south,,,AMRO,Wellsites,5,0.0108631451435177,0.00904927920386456,0.0150493822863629,0.0133075888731474 +bird,bird,south,,,YEWA,Loamy,5,0.128184815106834,0.0943599547866642,0.156513006422996,0.128184815106834 +bird,bird,south,,,YEWA,Blowout,5,0.0635047587932724,0.0442653119260443,0.095362877645849,0.0600969786039604 +bird,bird,south,,,YEWA,ClaySub,5,0.0807532793450908,0.0546354399979166,0.107438431314813,0.0807532793450908 +bird,bird,south,,,YEWA,Crop,5,0.064398538697737,0.0342781226192859,0.0712609630801165,0.0492837942343025 +bird,bird,south,,,YEWA,Industrial,5,0.0861802941104247,0.0635451115499483,0.114863448437255,0.0861802941104247 +bird,bird,south,,,YEWA,Mine,5,0.138490472700304,0.0904304942454559,0.188041443007397,0.138490472700304 +bird,bird,south,,,YEWA,Other,5,0.120159717829991,0.0724723919799819,0.176787258963612,0.178911491281807 +bird,bird,south,,,YEWA,RapidDrain,5,0.165058608804408,0.126311501603039,0.199830460806787,0.136359582532564 +bird,bird,south,,,YEWA,RoughP,5,0.0809890109278188,0.0543779257767213,0.108034787965453,0.0809890109278188 +bird,bird,south,,,YEWA,Rural,5,0.105603244166847,0.0777190400181443,0.116904901322303,0.105603244166847 +bird,bird,south,,,YEWA,SandyLoam,5,0.0863971934450074,0.0688423393972756,0.0996537212799053,0.0808960129186022 +bird,bird,south,,,YEWA,SoilUnknown,5,0.106908351611248,0.074711285828843,0.139223230386544,0.106908351611248 +bird,bird,south,,,YEWA,TameP,5,0.105982875599298,0.0679657932040902,0.146561452065362,0.131510554897273 +bird,bird,south,,,YEWA,ThinBreak,5,0.344263735839286,0.191629158730364,0.449320780877375,0.230458877422009 +bird,bird,south,,,YEWA,Urban,5,0.390289654098494,0.218824596719039,0.413076872519566,0.398893447945759 +bird,bird,south,,,YEWA,Water,5,0.0861802941104247,0.0600925730335339,0.111068355802983,0.0861802941104247 +bird,bird,south,,,YEWA,Wellsites,5,0.0861802941104247,0.0600925730335339,0.111068355802983,0.0861802941104247 +bryophyte,bryophyte,north,,,Bryum.All,WhiteSpruce,5,0.308974089719752,0.162667711674282,0.58049049729367,0.308974089719752 +bryophyte,bryophyte,north,,,Bryum.All,Pine,5,0.143086686438155,0.101959571838194,0.271490309959373,0.143086686438155 +bryophyte,bryophyte,north,,,Bryum.All,Deciduous,5,0.304216233046491,0.207067131595531,0.707649631950251,0.304216233046491 +bryophyte,bryophyte,north,,,Bryum.All,Mixedwood,5,0.206895828865391,0.176280914491628,0.449479307274789,0.204213486775759 +bryophyte,bryophyte,north,,,Bryum.All,BlackSpruce,5,0.154133594755642,0.130529307725989,0.290255876710481,0.139795052022587 +bryophyte,bryophyte,north,,,Bryum.All,TreedFen,5,0.263116559135362,0.218961536741484,0.517232086547538,0.207464791255052 +bryophyte,bryophyte,north,,,Bryum.All,TreedSwamp,5,0.815095784757965,0.613698209188851,0.8887950843584,0.67700829253431 +bryophyte,bryophyte,north,,,Bryum.All,GraminoidFen,5,0.171069119701467,0.134580452270681,0.521185810220519,0.156682738198137 +bryophyte,bryophyte,north,,,Bryum.All,ShrubbyFen,5,0.281801007539748,0.189347181275031,0.478706276603859,0.17636896116634 +bryophyte,bryophyte,north,,,Bryum.All,ShrubbyBog,5,0.0409475283773597,0.0379518703302822,0.0795889388622797,0.093958166878054 +bryophyte,bryophyte,north,,,Bryum.All,ShrubbySwamp,5,0.57601652602753,0.518269332810099,0.850214247135039,0.568041308422661 +bryophyte,bryophyte,north,,,Bryum.All,Marsh,5,0.299551048338968,0.240457336852563,0.536393996082975,0.265932364478495 +bryophyte,bryophyte,north,,,Bryum.All,Shrub,5,0.785140006328676,0.638359637311813,0.874558344484121,0.597088876880074 +bryophyte,bryophyte,north,,,Bryum.All,Grass,5,0.627677988600761,0.603168387955282,0.862231778275789,0.603492417714662 +bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruceR,5,0.547338013644942,0.324685297155872,0.742520577481269,0.30250437064146 +bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce1,5,0.45281469880243,0.219766795975118,0.721581284485378,0.278377962303985 +bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce2,5,0.562227209630086,0.535022851511229,0.841620016486747,0.536296256580977 +bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce3,5,0.562227209630086,0.535022851511229,0.841620016486747,0.536296256580977 +bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce4,5,0.562227209630086,0.535022851511229,0.841620016486747,0.536296256580977 +bryophyte,bryophyte,north,,,Bryum.All,CCPineR,5,0.283100425771656,0.260490047434809,0.623296740885031,0.269948790634583 +bryophyte,bryophyte,north,,,Bryum.All,CCPine1,5,0.250672245063636,0.201013072771311,0.819851875755567,0.243336158729855 +bryophyte,bryophyte,north,,,Bryum.All,CCPine2,5,0.177776992554065,0.15209179815,0.529234295201501,0.177776992554065 +bryophyte,bryophyte,north,,,Bryum.All,CCPine3,5,0.177776992554065,0.15209179815,0.529234295201501,0.177776992554065 +bryophyte,bryophyte,north,,,Bryum.All,CCPine4,5,0.177776992554065,0.15209179815,0.529234295201501,0.177776992554065 +bryophyte,bryophyte,north,,,Bryum.All,CCDeciduousR,5,0.432670830991465,0.31945091421981,0.715789143388405,0.317023552189929 +bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous1,5,0.644228111973737,0.454777788779175,0.867817098652887,0.395089825659678 +bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous2,5,0.226184197371291,0.151317967361289,0.576183877009453,0.226184197371291 +bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous3,5,0.226184197371291,0.151317967361289,0.576183877009453,0.226184197371291 +bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous4,5,0.226184197371291,0.151317967361289,0.576183877009453,0.226184197371291 +bryophyte,bryophyte,north,,,Bryum.All,CCMixedwoodR,5,0.432670830991465,0.31945091421981,0.715789143388405,0.317023552189929 +bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood1,5,0.644228111973737,0.454777788779175,0.867817098652887,0.395089825659678 +bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood2,5,0.226184197371291,0.151317967361289,0.576183877009453,0.226184197371291 +bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood3,5,0.226184197371291,0.151317967361289,0.576183877009453,0.226184197371291 +bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood4,5,0.226184197371291,0.151317967361289,0.576183877009453,0.226184197371291 +bryophyte,bryophyte,north,,,Bryum.All,EnSeismic,5,0.340598817242695,0.164903453730557,0.475216060165671,0.38979785120101 +bryophyte,bryophyte,north,,,Bryum.All,EnSoftLin,5,0.575339131568557,0.386011407252868,0.730665491035266,0.486461633900538 +bryophyte,bryophyte,north,,,Bryum.All,TrSoftLin,5,0.47227081010632,0.235741429686737,0.750847668855231,0.47227081010632 +bryophyte,bryophyte,north,,,Bryum.All,HardLin,5,0.7373977983078,0.532551792762974,0.91043000185822,0.460642471347814 +bryophyte,bryophyte,north,,,Bryum.All,UrbInd,5,0.689315139494054,0.566505458572846,0.857816898557892,0.511165376404773 +bryophyte,bryophyte,north,,,Bryum.All,Wellsites,5,0.411336395969964,0.318776562474012,0.736533989633298,0.273190415567555 +bryophyte,bryophyte,north,,,Bryum.All,Crop,5,0.529838193126662,0.270335967783148,0.667836505703427,0.257936328703817 +bryophyte,bryophyte,north,,,Bryum.All,TameP,5,0.581630503211741,0.463194700792218,0.867999788159835,0.456666447201498 +bryophyte,bryophyte,north,,,Bryum.All,RoughP,5,0.866772814791908,0.638972254622208,0.941838203793737,0.594183706159022 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,WhiteSpruce,5,0.112030441670744,0.0696659201387489,0.190519538231417,0.222596977385881 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Pine,5,0.249304854609913,0.0858683703311142,0.401016629826849,0.249304854609913 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Deciduous,5,0.196301533531834,0.134743846618643,0.251578974362557,0.263472446516492 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Mixedwood,5,0.28984867231307,0.211611765728151,0.527409572727184,0.28984867231307 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,BlackSpruce,5,0.209325042709248,0.157364589900452,0.43032459148606,0.184070478469377 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,TreedFen,5,0.185539583090879,0.107342060621354,0.21609695209782,0.203630483476431 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,TreedSwamp,5,0.19978407964156,0.140968829729245,0.365880244478321,0.19978407964156 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,GraminoidFen,5,0.250130284855286,0.105483860712881,0.297872028079475,0.250130284855286 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,ShrubbyFen,5,0.184174254034198,0.121211900414639,0.351641434048576,0.184174254034198 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,ShrubbyBog,5,0.146502960363555,0.0843461819865189,0.376200094261977,0.146502960363555 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,ShrubbySwamp,5,0.126887900372566,0.0532492716902957,0.231295432501156,0.177195862366848 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Marsh,5,0.119568353016139,0.0669992768775582,0.168127130760379,0.141556993449759 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Shrub,5,0.335467673199442,0.215368376807265,0.376886184928062,0.335467673199442 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Grass,5,0.301992031448182,0.245107482109288,0.349762070532979,0.301992031448182 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruceR,5,0.540541329783748,0.489531021919014,0.677092207749945,0.614344233250936 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce1,5,0.36876636265707,0.282659851296721,0.454095289487264,0.393484602837274 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce2,5,0.617516371883879,0.52082154656563,0.644474767662898,0.657916313589466 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce3,5,0.617516371883879,0.52082154656563,0.644474767662898,0.657916313589466 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce4,5,0.617516371883879,0.52082154656563,0.644474767662898,0.657916313589466 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPineR,5,0.480591139636067,0.300132096455471,0.522346181448412,0.545659517771766 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine1,5,0.642056258107979,0.590222009726219,0.741787486015572,0.642056258107979 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine2,5,0.514021100368588,0.487034213838781,0.605436489905809,0.635584579586204 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine3,5,0.514021100368588,0.487034213838781,0.605436489905809,0.635584579586204 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine4,5,0.514021100368588,0.487034213838781,0.605436489905809,0.635584579586204 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduousR,5,0.519526869750587,0.224287814054948,0.654054999977486,0.519526869750587 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous1,5,0.623725635526479,0.495121615766693,0.753925058863849,0.558717718351746 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous2,5,0.421319056409492,0.362630119106827,0.533667018526809,0.462378918324272 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous3,5,0.421319056409492,0.362630119106827,0.533667018526809,0.462378918324272 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous4,5,0.421319056409492,0.362630119106827,0.533667018526809,0.462378918324272 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwoodR,5,0.519526869750587,0.224287814054948,0.654054999977486,0.519526869750587 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood1,5,0.623725635526479,0.495121615766693,0.753925058863849,0.558717718351746 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood2,5,0.421319056409492,0.362630119106827,0.533667018526809,0.462378918324272 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood3,5,0.421319056409492,0.362630119106827,0.533667018526809,0.462378918324272 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood4,5,0.421319056409492,0.362630119106827,0.533667018526809,0.462378918324272 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,EnSeismic,5,0.388128427369812,0.258835683025722,0.495653290143381,0.396042503380286 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,EnSoftLin,5,0.205319330222485,0.156215075713521,0.266969332444081,0.247714104517573 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,TrSoftLin,5,0.203417107358887,0.0742274262211549,0.219524545648246,0.228401728876471 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,HardLin,5,0.122797399764176,0.0939887495312262,0.20666499934502,0.179441300697741 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,UrbInd,5,0.406123828961622,0.260612579220148,0.530452617259494,0.23766538272575 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Wellsites,5,0.3952307188416,0.212207480419092,0.580201590110138,0.260455149462922 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Crop,5,0.108929703195768,0.0732266003436157,0.18350631077339,0.140345468378213 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,TameP,5,0.131867728043387,0.0594089848841243,0.229712409143828,0.218587144767863 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,RoughP,5,0.143912616354652,0.0964123257999556,0.294636874031917,0.270343789916824 +bryophyte,bryophyte,south,,,Bryum.All,Loamy,5,0.473274717845967,0.388779794566393,0.675182319369236,0.473274717845967 +bryophyte,bryophyte,south,,,Bryum.All,SandyLoam,5,0.623763404348959,0.566322630423459,0.745154176095475,0.623763404348959 +bryophyte,bryophyte,south,,,Bryum.All,ClaySub,5,0.488358302587387,0.296267965084076,0.665236178581072,0.513566279666649 +bryophyte,bryophyte,south,,,Bryum.All,RapidDrain,5,0.456383990460127,0.237610557468415,0.558335335911583,0.456383990460127 +bryophyte,bryophyte,south,,,Bryum.All,Blowout,5,0.748701430422861,0.692158041872183,0.872067048238866,0.748701430422861 +bryophyte,bryophyte,south,,,Bryum.All,ThinBreak,5,0.266696658689805,0.111551539338356,0.473660627342796,0.266696658689805 +bryophyte,bryophyte,south,,,Bryum.All,Other,5,0.422068857255918,0.347690301627597,0.50459481804185,0.407468292608129 +bryophyte,bryophyte,south,,,Bryum.All,EnSeismic,5,0.2642549982569,0.162743991940278,0.648645053131211,0.482117914307296 +bryophyte,bryophyte,south,,,Bryum.All,EnSoftLin,5,0.501251607148897,0.197878106605832,0.742572097882729,0.501672918253629 +bryophyte,bryophyte,south,,,Bryum.All,TrSoftLin,5,0.464054690971584,0.327967448587054,0.823776424800113,0.613016588965431 +bryophyte,bryophyte,south,,,Bryum.All,HardLin,5,0.666580102281647,0.422571263591126,0.752577207337811,0.491617478806848 +bryophyte,bryophyte,south,,,Bryum.All,UrbInd,5,0.293595436061992,0.236110436056845,0.377942466955349,0.393097858690561 +bryophyte,bryophyte,south,,,Bryum.All,Wellsites,5,0.340464655304631,0.192537600202446,0.490710004802023,0.440935456085658 +bryophyte,bryophyte,south,,,Bryum.All,Crop,5,0.243279336617522,0.134286113627049,0.408787918221202,0.277542390498237 +bryophyte,bryophyte,south,,,Bryum.All,TameP,5,0.473780817532282,0.349842132565912,0.717857443626538,0.473780817532282 +bryophyte,bryophyte,south,,,Bryum.All,RoughP,5,0.271246111822176,0.15231721307255,0.428317317922578,0.271246111822176 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,Loamy,5,0.0880328664557739,0.060672446934879,0.171165526702774,0.115177000810257 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,SandyLoam,5,0.105766760433591,0.0747221962388367,0.249076281498836,0.105766760433591 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,ClaySub,5,0.0253512685216928,0.0172411816348254,0.056696825478414,0.0253512685216928 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,RapidDrain,5,0.097554079442326,0.0535954887613747,0.187155247815362,0.097554079442326 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,Blowout,5,0.238386765241013,0.113319360495388,0.598722239747571,0.238386765241013 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,ThinBreak,5,0.0214468610011073,0.0179860306734782,0.0503719358306002,0.0214468610011073 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,Other,5,0.0515948099929371,0.0306226530126652,0.0653417445356725,0.0572581209142173 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,EnSeismic,5,0.0707043009314015,0.0526087589939201,0.279797400764095,0.0707043009314015 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,EnSoftLin,5,0.0747407719041711,0.0482948040936569,0.186301416057806,0.0747407719041711 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,TrSoftLin,5,0.0704598742384681,0.0411048017962768,0.240939894791207,0.0704598742384681 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,HardLin,5,0.206659396634555,0.0660432989408734,0.300572873503316,0.209126134191268 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,UrbInd,5,0.0456100567102081,0.0340727304509427,0.055332266120991,0.0456100567102081 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,Wellsites,5,0.124964688720392,0.0850184040726694,0.211206954512464,0.0830551181446699 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,Crop,5,0.0289140339897818,0.0247911726665589,0.0387368796783477,0.0262246644293447 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,TameP,5,0.0721421869825392,0.0543147066620201,0.199106705166252,0.0615457968167004 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,RoughP,5,0.0664591108088772,0.0543247164471347,0.120248724289744,0.067766730553001 +lichen,lichen,north,,,Cladonia.chlorophaea,WhiteSpruce,5,0.128661098958406,0.124855193556611,0.204427293912201,0.160230563800225 +lichen,lichen,north,,,Cladonia.chlorophaea,Pine,5,0.230079117098186,0.179813900174023,0.360273789571507,0.210249809820585 +lichen,lichen,north,,,Cladonia.chlorophaea,Deciduous,5,0.121324351142597,0.0872621019923896,0.143825952808245,0.136817798838928 +lichen,lichen,north,,,Cladonia.chlorophaea,Mixedwood,5,0.0984557553149279,0.0545777027772408,0.112248614682224,0.115802848220679 +lichen,lichen,north,,,Cladonia.chlorophaea,BlackSpruce,5,0.403292528595932,0.358505305104995,0.638298533379189,0.403292528595932 +lichen,lichen,north,,,Cladonia.chlorophaea,TreedFen,5,0.504617490382435,0.359879727321562,0.625746147914501,0.428659382012715 +lichen,lichen,north,,,Cladonia.chlorophaea,TreedSwamp,5,0.665693157587439,0.502645401327826,0.724461853810744,0.510515102256231 +lichen,lichen,north,,,Cladonia.chlorophaea,GraminoidFen,5,0.489256749567966,0.306540048579416,0.572984989962887,0.282411753463989 +lichen,lichen,north,,,Cladonia.chlorophaea,ShrubbyFen,5,0.370120126470694,0.270019373234564,0.53022889883459,0.242010054127684 +lichen,lichen,north,,,Cladonia.chlorophaea,ShrubbyBog,5,0.141260287480395,0.0567819895590906,0.188070804361037,0.141260287480395 +lichen,lichen,north,,,Cladonia.chlorophaea,ShrubbySwamp,5,0.184741026553176,0.0891963973945931,0.242278765896729,0.184741026553176 +lichen,lichen,north,,,Cladonia.chlorophaea,Marsh,5,0.0708898621598725,0.0404355920571795,0.079151424751504,0.0798473976304544 +lichen,lichen,north,,,Cladonia.chlorophaea,Shrub,5,0.0517359583674559,0.0195646082142656,0.0789531138661174,0.0938129845926235 +lichen,lichen,north,,,Cladonia.chlorophaea,Grass,5,0.173012452686917,0.104877761141144,0.209232964794269,0.141236544546189 +lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruceR,5,0.0525321876142188,0.0350483280392254,0.114018253460163,0.0906677860864298 +lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce1,5,0.0719899251215031,0.047780420145228,0.176916811492338,0.156992993462549 +lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce2,5,0.149413093693624,0.0870203001289966,0.270715725064737,0.179422836074818 +lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce3,5,0.149413093693624,0.0870203001289966,0.270715725064737,0.179422836074818 +lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce4,5,0.149413093693624,0.0870203001289966,0.270715725064737,0.179422836074818 +lichen,lichen,north,,,Cladonia.chlorophaea,CCPineR,5,0.00978986954755468,0.00822467671524218,0.0258486119323907,0.0333390984309549 +lichen,lichen,north,,,Cladonia.chlorophaea,CCPine1,5,0.189052904668437,0.0986219993844684,0.227152392530965,0.189052904668437 +lichen,lichen,north,,,Cladonia.chlorophaea,CCPine2,5,0.0817569760829207,0.0757953632359234,0.141554492521773,0.151392232102977 +lichen,lichen,north,,,Cladonia.chlorophaea,CCPine3,5,0.0817569760829207,0.0757953632359234,0.141554492521773,0.151392232102977 +lichen,lichen,north,,,Cladonia.chlorophaea,CCPine4,5,0.0817569760829207,0.0757953632359234,0.141554492521773,0.151392232102977 +lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduousR,5,0.0776736278278235,0.0505562323522782,0.152962326280761,0.131298522971376 +lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous1,5,0.111726716318103,0.0827932616193127,0.147085303560683,0.140986333328742 +lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous2,5,0.110758294842867,0.0856462436819334,0.176911768706607,0.188488762029281 +lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous3,5,0.110758294842867,0.0856462436819334,0.176911768706607,0.188488762029281 +lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous4,5,0.110758294842867,0.0856462436819334,0.176911768706607,0.188488762029281 +lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwoodR,5,0.0776736278278235,0.0505562323522782,0.152962326280761,0.131298522971376 +lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood1,5,0.111726716318103,0.0827932616193127,0.147085303560683,0.140986333328742 +lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood2,5,0.110758294842867,0.0856462436819334,0.176911768706607,0.188488762029281 +lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood3,5,0.110758294842867,0.0856462436819334,0.176911768706607,0.188488762029281 +lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood4,5,0.110758294842867,0.0856462436819334,0.176911768706607,0.188488762029281 +lichen,lichen,north,,,Cladonia.chlorophaea,EnSeismic,5,0.0562871342426963,0.0320229327626297,0.0877062042488125,0.103955648973456 +lichen,lichen,north,,,Cladonia.chlorophaea,EnSoftLin,5,0.0349744161875645,0.0135950566585377,0.0460307869610447,0.0520718837817988 +lichen,lichen,north,,,Cladonia.chlorophaea,TrSoftLin,5,0.103588894942155,0.0250811144006789,0.153774872898092,0.103588894942155 +lichen,lichen,north,,,Cladonia.chlorophaea,HardLin,5,0.0154890037249669,0.00969735705324304,0.0242295520251997,0.0194687233362852 +lichen,lichen,north,,,Cladonia.chlorophaea,UrbInd,5,0.0291298802009484,0.022170341246061,0.0394398808836477,0.0399831841699761 +lichen,lichen,north,,,Cladonia.chlorophaea,Wellsites,5,0.0312303611913381,0.01825340797697,0.0382450877069983,0.0405301490949005 +lichen,lichen,north,,,Cladonia.chlorophaea,Crop,5,0.00819135312232188,0.0032964347257604,0.0153259493459229,0.0106228365914737 +lichen,lichen,north,,,Cladonia.chlorophaea,TameP,5,0.0384099180416212,0.0291846782167506,0.0458757501630787,0.0384099180416212 +lichen,lichen,north,,,Cladonia.chlorophaea,RoughP,5,0.0501127937327384,0.0412289445446687,0.0800415714933927,0.0659587534674029 +lichen,lichen,north,,,Physcia.adscendens,WhiteSpruce,5,0.0280709179229579,0.0158823614277584,0.0370698471276619,0.0417321760259875 +lichen,lichen,north,,,Physcia.adscendens,Pine,5,0.0335554922949197,0.0328321333973256,0.0381993091153045,0.0388803690684755 +lichen,lichen,north,,,Physcia.adscendens,Deciduous,5,0.150111220381722,0.0982775269867873,0.204568198699545,0.182221182455449 +lichen,lichen,north,,,Physcia.adscendens,Mixedwood,5,0.066143481475221,0.0366744056160219,0.0822856468530477,0.0884733355341471 +lichen,lichen,north,,,Physcia.adscendens,BlackSpruce,5,0.0371166105774204,0.0180529526526415,0.0886332365829845,0.0297257197367906 +lichen,lichen,north,,,Physcia.adscendens,TreedFen,5,0.00283648668986138,0.00211085215363339,0.00798491034075052,0.0096330609515934 +lichen,lichen,north,,,Physcia.adscendens,TreedSwamp,5,0.151560668253984,0.0946381053489427,0.218379490579115,0.13750034253386 +lichen,lichen,north,,,Physcia.adscendens,GraminoidFen,5,0.0740408487785589,0.0218928131556558,0.106953471125693,0.0740408487785589 +lichen,lichen,north,,,Physcia.adscendens,ShrubbyFen,5,0.00624108474033991,0.00351153558550388,0.0123708425148104,0.0151140673106255 +lichen,lichen,north,,,Physcia.adscendens,ShrubbyBog,5,0.0101805161860488,0.00773748829404913,0.0212068238130188,0.018187687131778 +lichen,lichen,north,,,Physcia.adscendens,ShrubbySwamp,5,0.0362768598763018,0.0218314980950171,0.0418196022070653,0.0383343029334143 +lichen,lichen,north,,,Physcia.adscendens,Marsh,5,0.0108784278677345,0.0101742363969005,0.020592791623776,0.0233928964085336 +lichen,lichen,north,,,Physcia.adscendens,Shrub,5,0.0381488861896238,0.0304198903024431,0.0558421183865387,0.0666814246971562 +lichen,lichen,north,,,Physcia.adscendens,Grass,5,0.0768105720214742,0.050153486235137,0.0978256955825497,0.0901247981807328 +lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruceR,5,0.00547586911493163,0.00349714196841403,0.0129769451747226,0.0169696165447101 +lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce1,5,0.0989510919927337,0.0429150110336418,0.141802535687179,0.102505230126881 +lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce2,5,0.155036614912574,0.088233085428621,0.366327338728443,0.14765016798871 +lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce3,5,0.155036614912574,0.088233085428621,0.366327338728443,0.14765016798871 +lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce4,5,0.155036614912574,0.088233085428621,0.366327338728443,0.14765016798871 +lichen,lichen,north,,,Physcia.adscendens,CCPineR,5,0.0064962201386863,0.00421432892887562,0.0142770276673618,0.0171492164111918 +lichen,lichen,north,,,Physcia.adscendens,CCPine1,5,0.00696710027863156,0.00494066956859161,0.0245414990478204,0.0265625131932835 +lichen,lichen,north,,,Physcia.adscendens,CCPine2,5,0.0515635294496696,0.0159974691369398,0.104039850625823,0.0515635294496696 +lichen,lichen,north,,,Physcia.adscendens,CCPine3,5,0.0515635294496696,0.0159974691369398,0.104039850625823,0.0515635294496696 +lichen,lichen,north,,,Physcia.adscendens,CCPine4,5,0.0515635294496696,0.0159974691369398,0.104039850625823,0.0515635294496696 +lichen,lichen,north,,,Physcia.adscendens,CCDeciduousR,5,0.0370772388534196,0.0239941672310476,0.0704175667019601,0.0555525290793276 +lichen,lichen,north,,,Physcia.adscendens,CCDeciduous1,5,0.0638362385247109,0.0443950437751117,0.0960107914764775,0.0846489827961707 +lichen,lichen,north,,,Physcia.adscendens,CCDeciduous2,5,0.0631299062200761,0.0527345204338537,0.192845361167475,0.0932548262463118 +lichen,lichen,north,,,Physcia.adscendens,CCDeciduous3,5,0.0631299062200761,0.0527345204338537,0.192845361167475,0.0932548262463118 +lichen,lichen,north,,,Physcia.adscendens,CCDeciduous4,5,0.0631299062200761,0.0527345204338537,0.192845361167475,0.0932548262463118 +lichen,lichen,north,,,Physcia.adscendens,CCMixedwoodR,5,0.0370772388534196,0.0239941672310476,0.0704175667019601,0.0555525290793276 +lichen,lichen,north,,,Physcia.adscendens,CCMixedwood1,5,0.0638362385247109,0.0443950437751117,0.0960107914764775,0.0846489827961707 +lichen,lichen,north,,,Physcia.adscendens,CCMixedwood2,5,0.0631299062200761,0.0527345204338537,0.192845361167475,0.0932548262463118 +lichen,lichen,north,,,Physcia.adscendens,CCMixedwood3,5,0.0631299062200761,0.0527345204338537,0.192845361167475,0.0932548262463118 +lichen,lichen,north,,,Physcia.adscendens,CCMixedwood4,5,0.0631299062200761,0.0527345204338537,0.192845361167475,0.0932548262463118 +lichen,lichen,north,,,Physcia.adscendens,EnSeismic,5,0.00973533663743669,0.00761498586953942,0.0167468016732872,0.0189402458111425 +lichen,lichen,north,,,Physcia.adscendens,EnSoftLin,5,0.0280436433302379,0.0154713255752847,0.0341444951096086,0.0280436433302379 +lichen,lichen,north,,,Physcia.adscendens,TrSoftLin,5,0.00496005598877083,0.00471160489961,0.0161107262084194,0.0196590192362782 +lichen,lichen,north,,,Physcia.adscendens,HardLin,5,0.0348874368867459,0.0252558243773983,0.0454162343164239,0.0348874368867459 +lichen,lichen,north,,,Physcia.adscendens,UrbInd,5,0.0174279932552207,0.0130439461733558,0.0312426839236964,0.038226183628617 +lichen,lichen,north,,,Physcia.adscendens,Wellsites,5,0.0116376600198287,0.00721312434489467,0.0271997579619256,0.0195364714768302 +lichen,lichen,north,,,Physcia.adscendens,Crop,5,0.0187347369810745,0.00891380317133725,0.0251945259418885,0.0187347369810745 +lichen,lichen,north,,,Physcia.adscendens,TameP,5,0.0320140311491714,0.0181860445822102,0.0525560687925619,0.0320140311491714 +lichen,lichen,north,,,Physcia.adscendens,RoughP,5,0.108558416385157,0.0722935863539439,0.120255191852576,0.120604736486396 +lichen,lichen,south,,,Cladonia.chlorophaea,Loamy,5,0.0177145886237437,0.0052613407057454,0.0550296543748453,0.0597277251451078 +lichen,lichen,south,,,Cladonia.chlorophaea,SandyLoam,5,0.0174816561380657,0.0163692237823521,0.0463540119872417,0.0655647445815341 +lichen,lichen,south,,,Cladonia.chlorophaea,ClaySub,5,0.00555126453122542,0.00193376988801804,0.0246758086287448,0.0361988055512762 +lichen,lichen,south,,,Cladonia.chlorophaea,RapidDrain,5,0.0567337727522392,0.01648604582655,0.0977154360637852,0.0671288270967656 +lichen,lichen,south,,,Cladonia.chlorophaea,Blowout,5,0.0237324539823939,0.0159513708859139,0.0620732820621201,0.065567183985177 +lichen,lichen,south,,,Cladonia.chlorophaea,ThinBreak,5,0.0143707682934732,0.00636508094146172,0.0332345496567772,0.0456180486741436 +lichen,lichen,south,,,Cladonia.chlorophaea,Other,5,0.00501505269454619,0.00117718504049849,0.013492729542509,0.0188250605196629 +lichen,lichen,south,,,Cladonia.chlorophaea,EnSeismic,5,0.0118184764992799,0.00270684743301339,0.0194732488127343,0.0232927646410083 +lichen,lichen,south,,,Cladonia.chlorophaea,EnSoftLin,5,0.00440555784016973,0.00251986579899649,0.0127587507542381,0.0175964661762687 +lichen,lichen,south,,,Cladonia.chlorophaea,TrSoftLin,5,0.00378677049508389,0.002344807848226,0.0145741903219359,0.0210304145687519 +lichen,lichen,south,,,Cladonia.chlorophaea,HardLin,5,0.00459330109979107,0.000615727205925929,0.0123856767727841,0.0168326781004455 +lichen,lichen,south,,,Cladonia.chlorophaea,UrbInd,5,0.00406842553092113,0.000580716062808916,0.0128316513245183,0.0171046511598148 +lichen,lichen,south,,,Cladonia.chlorophaea,Wellsites,5,0.0255015614912696,0.00149219879902554,0.0741205245698955,0.075570998415282 +lichen,lichen,south,,,Cladonia.chlorophaea,Crop,5,0.000902822927314831,0.000313932467373215,0.00171206716954244,0.00219321929279424 +lichen,lichen,south,,,Cladonia.chlorophaea,TameP,5,0.00841687677986071,0.00273882035239516,0.0222008641778524,0.0222832297619207 +lichen,lichen,south,,,Cladonia.chlorophaea,RoughP,5,0.0146295350565741,0.00159564151079338,0.0209906652594332,0.0232570250948312 +lichen,lichen,south,,,Physcia.adscendens,Loamy,5,0.217277829333826,0.15704406708964,0.304047615408886,0.191539524792095 +lichen,lichen,south,,,Physcia.adscendens,SandyLoam,5,0.530458320080061,0.492263518720828,0.775018453077396,0.47212665072262 +lichen,lichen,south,,,Physcia.adscendens,ClaySub,5,0.0930616688338325,0.0600838876549339,0.130385692484933,0.0930616688338325 +lichen,lichen,south,,,Physcia.adscendens,RapidDrain,5,0.415291920210692,0.323952051051762,0.732495085467375,0.299819326285583 +lichen,lichen,south,,,Physcia.adscendens,Blowout,5,0.136557921316276,0.0312523714063513,0.218955487776077,0.0590335560161137 +lichen,lichen,south,,,Physcia.adscendens,ThinBreak,5,0.164143804877533,0.09801970065868,0.318344907386786,0.0887993397036373 +lichen,lichen,south,,,Physcia.adscendens,Other,5,0.302755037549603,0.195446719515116,0.349608006408001,0.253161029743585 +lichen,lichen,south,,,Physcia.adscendens,EnSeismic,5,0.427977544979326,0.305291789630875,0.529586269705453,0.392066598196877 +lichen,lichen,south,,,Physcia.adscendens,EnSoftLin,5,0.199606327527873,0.101306683994238,0.342484070807443,0.199606327527873 +lichen,lichen,south,,,Physcia.adscendens,TrSoftLin,5,0.468184625274239,0.246504828756221,0.554178811146563,0.384440449804642 +lichen,lichen,south,,,Physcia.adscendens,HardLin,5,0.0903428321717492,0.0726729054739433,0.177127641495429,0.0903428321717492 +lichen,lichen,south,,,Physcia.adscendens,UrbInd,5,0.105224161614799,0.0694355463481286,0.360295359522274,0.133640114131234 +lichen,lichen,south,,,Physcia.adscendens,Wellsites,5,0.19463004648108,0.0738642039995704,0.514233439827871,0.19463004648108 +lichen,lichen,south,,,Physcia.adscendens,Crop,5,0.00160433746227649,0.000870393463932428,0.00197844245618304,0.00200214957457342 +lichen,lichen,south,,,Physcia.adscendens,TameP,5,0.0118823041171665,0.00527250522779698,0.0197946310197383,0.0147630929337545 +lichen,lichen,south,,,Physcia.adscendens,RoughP,5,0.0111686428068464,0.00900506913750176,0.0136311119203765,0.0124711875346818 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Decid,5,0.0239265522425756,0.011090430138699,0.0262642294785886,0.0244438161537447 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Mixedwood,5,0.00876853407632136,0.00529693735610337,0.017282630905016,0.018244077073362 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Pine,5,0.0218156856543157,0.0176823052798924,0.026150184586927,0.0218156856543157 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Spruce,5,0.0249676695779629,0.0124713391918506,0.0841250161965133,0.0249676695779629 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,TreedBog,5,0.013440180346083,0.00768552288492119,0.0153841765853905,0.0163246075462524 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,TreedFen,5,0.0113397909731737,0.00790700341974478,0.0148681446174923,0.0162033353768527 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,TreedSwamp,5,0.00920452009478482,0.00678335792601969,0.0169590936891753,0.0169257400685579 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,GrassHerb,5,0.00764205077560037,0.00300303315040609,0.0170907681049233,0.0195189698246484 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Shrub,5,0.00792974468150597,0.00142053798784553,0.0152449495397204,0.0199070300314277 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,GraminoidFen,5,0.00515552261082155,0.00310834341821341,0.0110209792476925,0.0145397395835169 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Marsh,5,0.00515552261082155,0.00310834341821341,0.0110209792476925,0.0145397395835169 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,ShrubbyBog,5,0.00337978306315942,0.00173972936014788,0.00810369673048077,0.0106853868570127 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,ShrubbyFen,5,0.00337978306315942,0.00173972936014788,0.00810369673048077,0.0106853868570127 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,ShrubbySwamp,5,0.00386835087932868,0.00146921093276277,0.0105008781248198,0.0133868586272888 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCDecidR,5,0.032688169974919,0.00430418901138586,0.0426944107414556,0.0474178063842245 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCDecid1,5,0.0660310137716376,0.0123397104884087,0.0712652922206858,0.0714275332775695 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCDecid2,5,0.0227140044627329,0.00404663527542528,0.0396094548436344,0.0474178063842245 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCDecid3,5,0.0309640669359143,0.00430418901138586,0.0421006013923976,0.0474178063842245 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCDecid4,5,0.0309640669359143,0.00430418901138586,0.0421006013923976,0.0474178063842245 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCMixedwoodR,5,0.0309640669359143,0.00430418901138586,0.0421006013923976,0.0474178063842245 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCMixedwood1,5,0.0309640669359143,0.00457437404502943,0.0421006013923976,0.0474178063842245 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCMixedwood2,5,0.0341247939046573,0.00430418901138586,0.0443551497549623,0.0474178063842245 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCMixedwood3,5,0.0309640669359143,0.00430418901138586,0.0421006013923976,0.0474178063842245 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCMixedwood4,5,0.0309640669359143,0.00430418901138586,0.0421006013923976,0.0474178063842245 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCPineR,5,0.0158387074013367,0.00391553778673811,0.0461513941132943,0.0434754323748698 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCPine1,5,0.0158387074013367,0.00360797976148127,0.030600864615104,0.0353491995914119 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCPine2,5,0.0158387074013367,0.00391553778673811,0.041928615898253,0.0434754323748698 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCPine3,5,0.0158387074013367,0.00391553778673811,0.041928615898253,0.0434754323748698 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCPine4,5,0.0158387074013367,0.00391553778673811,0.041928615898253,0.0434754323748698 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCSpruceR,5,0.0192468112801372,0.00647034742518576,0.160357496833249,0.0430448429456243 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCSpruce1,5,0.0192468112801372,0.00647034742518576,0.0715373899275162,0.0430448429456243 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCSpruce2,5,0.0176558232248481,0.00587863502902288,0.0622007428604107,0.0414862808156023 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCSpruce3,5,0.0192468112801372,0.00647034742518576,0.0715373899275162,0.0430448429456243 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCSpruce4,5,0.0192468112801372,0.00647034742518576,0.0715373899275162,0.0430448429456243 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,HardLin,5,0.0235008608313258,0.00367071390415812,0.0304603017209443,0.0302656550259816 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,EnSoftLin,5,0.0217043128777652,0.00777176419384538,0.0816863159559975,0.056857687400326 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,EnSeismic,5,0.014218996636615,0.00427691149847948,0.0424456709769066,0.0433016920307201 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,TrSoftLin,5,0.018741290730221,0.00489485760606281,0.0621949534180226,0.0555281041055134 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Urban,5,0.0235008608313258,0.00367071390415812,0.0304603017209443,0.0302656550259816 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Rural,5,0.0235008608313258,0.00367071390415812,0.0304603017209443,0.0302656550259816 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Industrial,5,0.0235008608313258,0.00367071390415812,0.0304603017209443,0.0302656550259816 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Well,5,0.010823843674072,0.00168670480720688,0.0185050742594436,0.0220947826519 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Crop,5,0.0181351316304772,0.0058327472257548,0.0264818597212109,0.0287620934346421 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,TameP,5,0.0174776843450439,0.00843540987169354,0.0299780882426473,0.0348115991913053 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,RoughP,5,0.0136467739445996,0.00780690491350207,0.0258557029727057,0.0287620934346421 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Decid,5,0.201127843984686,0.0801674200792492,0.333839799881527,0.337362503626968 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Mixedwood,5,0.179039171535964,0.0403753215863673,0.273496031417048,0.324412645428585 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Pine,5,0.111232556011978,0.0290206403594057,0.197698849646192,0.233684453638651 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Spruce,5,0.149495893116987,0.0414920916323207,0.2031811829525,0.235565855911004 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,TreedBog,5,0.0831232149942555,0.0507157674962523,0.185404456677778,0.220086339128002 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,TreedFen,5,0.0661749005924134,0.0412152047072714,0.167991265723248,0.215755214969767 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,TreedSwamp,5,0.109938505131459,0.0696327925801873,0.168237000366661,0.206120898221515 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,GrassHerb,5,0.075628548099574,0.0261456535467499,0.177520264561312,0.217309032186079 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Shrub,5,0.0326122274234979,0.0136598579410703,0.141245574853981,0.21246000489003 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,GraminoidFen,5,0.0611928153891843,0.0382261984529277,0.151587380336666,0.209768209450013 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Marsh,5,0.0611928153891843,0.0382261984529277,0.151587380336666,0.209768209450013 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,ShrubbyBog,5,0.0339030847994837,0.0236988732741335,0.132447228737797,0.18495503014443 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,ShrubbyFen,5,0.0339030847994837,0.0236988732741335,0.132447228737797,0.18495503014443 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,ShrubbySwamp,5,0.0872497782130119,0.0335407714587239,0.167503406748117,0.209165825893222 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCDecidR,5,0.0822796132620831,0.0515235189051686,0.170474280421734,0.21808869173414 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCDecid1,5,0.069679309721374,0.0355218706336958,0.168620576756719,0.21808869173414 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCDecid2,5,0.032357214387318,0.0248595547128921,0.146396623132516,0.21808869173414 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCDecid3,5,0.0720473671206,0.0372344323687945,0.161805519680996,0.21808869173414 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCDecid4,5,0.0720473671206,0.0372344323687945,0.161805519680996,0.21808869173414 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCMixedwoodR,5,0.0773807616012798,0.0372344323687945,0.165444063073026,0.21808869173414 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCMixedwood1,5,0.0608761758239522,0.0364039570795283,0.156847885856327,0.21808869173414 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCMixedwood2,5,0.0773807616012798,0.0580351329278593,0.17631451751749,0.21808869173414 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCMixedwood3,5,0.0720473671206,0.0372344323687945,0.161805519680996,0.21808869173414 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCMixedwood4,5,0.0720473671206,0.0372344323687945,0.161805519680996,0.21808869173414 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCPineR,5,0.108777731131181,0.062471120402669,0.177229603530075,0.21808869173414 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCPine1,5,0.119039032137584,0.0513952512696187,0.188803760280334,0.21808869173414 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCPine2,5,0.115940971223978,0.053258397405848,0.18143790825132,0.21808869173414 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCPine3,5,0.115940971223978,0.053258397405848,0.18143790825132,0.21808869173414 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCPine4,5,0.115940971223978,0.053258397405848,0.18143790825132,0.21808869173414 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCSpruceR,5,0.10367101560494,0.0375393590984709,0.184191164454731,0.21808869173414 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCSpruce1,5,0.10367101560494,0.0463839033519437,0.184191164454731,0.21808869173414 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCSpruce2,5,0.106738230986072,0.0459739764621588,0.17484826458163,0.21808869173414 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCSpruce3,5,0.10367101560494,0.0463839033519437,0.184191164454731,0.21808869173414 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCSpruce4,5,0.10367101560494,0.0463839033519437,0.184191164454731,0.21808869173414 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,HardLin,5,0.0549356072841527,0.0175622239362563,0.146080863883223,0.199206486594685 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,EnSoftLin,5,0.123200481737908,0.0537508601064006,0.217041011876353,0.254675586066876 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,EnSeismic,5,0.246411221826881,0.155607707364388,0.398976010987935,0.335886269080349 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,TrSoftLin,5,0.0910848826238341,0.0453883298760255,0.188615144167118,0.229996454233121 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Urban,5,0.0549356072841527,0.0175622239362563,0.146080863883223,0.199206486594685 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Rural,5,0.0549356072841527,0.0175622239362563,0.146080863883223,0.199206486594685 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Industrial,5,0.0549356072841527,0.0175622239362563,0.146080863883223,0.199206486594685 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Well,5,0.058981013234745,0.0309053192126292,0.15075789028877,0.199206486594685 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Crop,5,0.0479480246139084,0.0268170909069881,0.145748422611594,0.199206486594685 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,TameP,5,0.0392496874966303,0.0274349443035048,0.146562544163904,0.1994381725463 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,RoughP,5,0.0550755736632679,0.0404684601258794,0.172883065458448,0.215418452552767 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,ClaySub,5,0.579435087877377,0.376740935259992,0.812560686850785,0.579435087877377 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Other,5,0.579435087877377,0.376740935259992,0.812560686850785,0.579435087877377 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,RapidDrain,5,0.567189218503969,0.47199498238142,0.863506270114337,0.567189218503969 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Loamy,5,0.619578949738156,0.532640086592042,0.853893944075329,0.619578949738156 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,SandyLoam,5,0.6537384667663,0.628666404398064,0.90339285272658,0.643635469946527 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,ThinBreak,5,0.579435087877377,0.339790490465082,0.785002657910113,0.579435087877377 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Blowout,5,0.579435087877377,0.339790490465082,0.785002657910113,0.579435087877377 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Urban,5,0.634662376939146,0.554815076281409,0.900026375504453,0.621422126393485 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Rural,5,0.634662376939146,0.554815076281409,0.900026375504453,0.621422126393485 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Industrial,5,0.634662376939146,0.554815076281409,0.900026375504453,0.621422126393485 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Well,5,0.589288197329797,0.429483104909735,0.784402715446441,0.589288197329797 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Mine,5,0.634662376939146,0.554815076281409,0.900026375504453,0.621422126393485 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,EnSoftLin,5,0.608027603006347,0.529391882081968,0.830531296526406,0.608027603006347 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,EnSeismic,5,0.608027603006347,0.529391882081968,0.830531296526406,0.608027603006347 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,HardLin,5,0.634662376939146,0.554815076281409,0.900026375504453,0.621422126393485 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,TrSoftLin,5,0.604343269149707,0.477137519935801,0.779049549335585,0.608027603006347 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Crop,5,0.745680570130594,0.669286588806116,0.895353896938071,0.662627063162264 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,RoughP,5,0.657949420464453,0.611717289607787,0.844775926434602,0.64533268938427 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,TameP,5,0.771468831258731,0.611861000519867,0.858254448348948,0.641768541833134 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,WetlandMargin,5,0.619578949738156,0.365152799625488,0.811842717994965,0.619578949738156 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,ClaySub,5,0.0638641563843588,0.00830012163249392,0.133193996743995,0.0638641563843588 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Other,5,0.0638641563843588,0.00830012163249392,0.133193996743995,0.0638641563843588 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,RapidDrain,5,0.0244338800355817,0.00676763034913233,0.0349890815973205,0.0244338800355817 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Loamy,5,0.0190323866592316,0.00443315765678557,0.0324013334670289,0.0190323866592316 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,SandyLoam,5,0.0172800345712338,0.00857253479874986,0.0229620525118943,0.0172800345712338 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,ThinBreak,5,0.0205618898372336,0.00420810578005255,0.0301979259993108,0.0205618898372336 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Blowout,5,0.0205618898372336,0.00420810578005255,0.0301979259993108,0.0205618898372336 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Urban,5,0.0132113537340821,0.00321917119188162,0.0218039143419396,0.0132113537340821 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Rural,5,0.0132113537340821,0.00321917119188162,0.0218039143419396,0.0132113537340821 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Industrial,5,0.0132113537340821,0.00321917119188162,0.0218039143419396,0.0132113537340821 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Well,5,0.0132113537340821,0.00309255815343757,0.0217557138231168,0.0132113537340821 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Mine,5,0.0132113537340821,0.00321917119188162,0.0218039143419396,0.0132113537340821 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,EnSoftLin,5,0.0161072340777825,0.00335300837512712,0.0275454895868135,0.0161072340777825 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,EnSeismic,5,0.0161072340777825,0.00335300837512712,0.0275454895868135,0.0161072340777825 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,HardLin,5,0.0132113537340821,0.00321917119188162,0.0218039143419396,0.0132113537340821 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,TrSoftLin,5,0.0154437684506216,0.00496082637311666,0.0214922669449421,0.0154437684506216 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Crop,5,0.0173445429282449,0.00350689556269019,0.0345286310448205,0.0218726499714427 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,RoughP,5,0.0139533680539032,0.00250898881213455,0.0206140837822618,0.0139533680539032 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,TameP,5,0.0127631165173143,0.00219426816829498,0.0190386598095673,0.0127631165173143 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,WetlandMargin,5,0.0190323866592316,0.00443315765678557,0.0324013334670289,0.0190323866592316 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Decid,5,0.0215247007459494,0.0169379028802803,0.0284874228107134,0.023929637133342 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Mixedwood,5,0.0176485137579288,0.0117453621845229,0.0267434314285739,0.0215965790600485 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Pine,5,0.0198346111234909,0.0193922334339949,0.0275704351286727,0.0198346111234909 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Spruce,5,0.0288083711793445,0.02276360207826,0.0432965026739425,0.0285640118330302 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,TreedBog,5,0.0231351271516251,0.0121621263662202,0.024585859437274,0.0231351271516251 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,TreedFen,5,0.0161703490073758,0.0103305688105141,0.022231837104831,0.0203256012952714 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,TreedSwamp,5,0.0363864950282561,0.0216431253096614,0.0499942531045655,0.0363864950282561 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,GrassHerb,5,0.0217737254053411,0.0139198944889084,0.0705741457755696,0.0349436819488887 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Shrub,5,0.0246271437529468,0.0136653439880979,0.0485886389206459,0.0349436819488887 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,GraminoidFen,5,0.0233764199613657,0.0204477614213053,0.0340810120636668,0.0233764199613657 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Marsh,5,0.0233764199613657,0.0204477614213053,0.0340810120636668,0.0233764199613657 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,ShrubbyBog,5,0.0147213637529,0.0121767957213658,0.0187511560816343,0.0185800194931585 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,ShrubbyFen,5,0.0147213637529,0.0121767957213658,0.0187511560816343,0.0185800194931585 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,ShrubbySwamp,5,0.0121644049723173,0.00801246344395918,0.0159561988639188,0.016554015196869 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCDecidR,5,0.0364174798693786,0.0184495155268272,0.0472771326687817,0.0364174798693786 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCDecid1,5,0.0364076924409662,0.0219046034584099,0.0365824504146867,0.0364076924409662 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCDecid2,5,0.0270943611884668,0.0163911517573477,0.0343820999694772,0.0313199309247969 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCDecid3,5,0.0349868266515764,0.0221950692485396,0.0365824504146867,0.0349868266515764 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCDecid4,5,0.0349868266515764,0.0221950692485396,0.0365824504146867,0.0349868266515764 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCMixedwoodR,5,0.0349868266515764,0.0221950692485396,0.048660767843984,0.0349868266515764 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCMixedwood1,5,0.0349868266515764,0.0237522967889377,0.0465595992164621,0.0349868266515764 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCMixedwood2,5,0.0349868266515764,0.0226852672834032,0.0427603388477375,0.0349868266515764 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCMixedwood3,5,0.0349868266515764,0.0221950692485396,0.0365824504146867,0.0349868266515764 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCMixedwood4,5,0.0349868266515764,0.0221950692485396,0.0365824504146867,0.0349868266515764 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCPineR,5,0.0190923447688606,0.0149216127997302,0.0266386140471931,0.0289061692019033 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCPine1,5,0.020800318211655,0.0149029330290882,0.0266702320453148,0.0277073960028091 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCPine2,5,0.0185862852995256,0.0155745055282898,0.0269179289466542,0.0289061692019033 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCPine3,5,0.0185862852995256,0.0155745055282898,0.0269179289466542,0.0289061692019033 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCPine4,5,0.0185862852995256,0.0155745055282898,0.0269179289466542,0.0289061692019033 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCSpruceR,5,0.0210466190352934,0.0148828808858681,0.0278501867777361,0.0301318841549511 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCSpruce1,5,0.0210466190352934,0.0148828808858681,0.0278501867777361,0.0301318841549511 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCSpruce2,5,0.020482402376974,0.0144704132356553,0.0278501867777361,0.0301318841549511 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCSpruce3,5,0.0210466190352934,0.0148828808858681,0.0278501867777361,0.0301318841549511 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCSpruce4,5,0.0210466190352934,0.0148828808858681,0.0278501867777361,0.0301318841549511 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,HardLin,5,0.0484183578512355,0.0309483197804586,0.0560972846186679,0.0543198268489983 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,EnSoftLin,5,0.0989836204912431,0.069743007955016,0.167151447571454,0.0989836204912431 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,EnSeismic,5,0.0468621423159454,0.0379449591404454,0.0568575204028804,0.046832439935615 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,TrSoftLin,5,0.0541347607671683,0.0435919929035909,0.0627330127383789,0.0541347607671683 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Urban,5,0.0484183578512355,0.0309483197804586,0.0560972846186679,0.0543198268489983 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Rural,5,0.0484183578512355,0.0309483197804586,0.0560972846186679,0.0543198268489983 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Industrial,5,0.0484183578512355,0.0309483197804586,0.0560972846186679,0.0543198268489983 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Well,5,0.0470719619997601,0.0230911003357151,0.0495742804059222,0.0496728368406262 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Crop,5,0.0239099428233414,0.0185974121803875,0.0349298777275594,0.0323798781464309 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,TameP,5,0.0326187644912133,0.023197038618504,0.0343775856257446,0.0348007221563603 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,RoughP,5,0.0273447394135055,0.0150333257488427,0.0324002905486677,0.0323798781464309 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Decid,5,0.743305665259858,0.593091633660256,0.789087502927589,0.568428264613533 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Mixedwood,5,0.319110479728785,0.27208237027459,0.54200822020993,0.265716789996539 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Pine,5,0.144236218994791,0.10022673495497,0.237695748126675,0.144236218994791 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Spruce,5,0.316951298288236,0.19249836715505,0.384525718829423,0.245863824752863 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,TreedBog,5,0.362998258346435,0.231875374602059,0.444787284906343,0.153582332650107 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,TreedFen,5,0.312597798213775,0.234778900454404,0.417197845089155,0.196220956664201 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,TreedSwamp,5,0.51633259709258,0.429091938633066,0.65151488284143,0.419777704102624 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,GrassHerb,5,0.0499969445000865,0.0295280422648458,0.0722449212787727,0.0761531728978141 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Shrub,5,0.0646813206434672,0.0447443154772795,0.0740176968758066,0.0793837644792474 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,GraminoidFen,5,0.128113958894917,0.086731932618269,0.203277969572144,0.128113958894917 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Marsh,5,0.128113958894917,0.086731932618269,0.203277969572144,0.128113958894917 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,ShrubbyBog,5,0.170349048589789,0.128011231931264,0.347031048999254,0.170349048589789 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,ShrubbyFen,5,0.170349048589789,0.128011231931264,0.347031048999254,0.170349048589789 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,ShrubbySwamp,5,0.243778576933666,0.170950956167097,0.276981457535628,0.174097734120848 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCDecidR,5,0.390322758156878,0.24213282381012,0.578494135565328,0.26876058901456 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCDecid1,5,0.438273538252,0.223594620133148,0.621247929036178,0.301031134344717 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCDecid2,5,0.424580614573172,0.214856401655936,0.631579949169482,0.300257214458358 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCDecid3,5,0.382169835968011,0.202257751478417,0.577940851593645,0.26876058901456 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCDecid4,5,0.382169835968011,0.202257751478417,0.577940851593645,0.26876058901456 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCMixedwoodR,5,0.382169835968011,0.202257751478417,0.577940851593645,0.26876058901456 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCMixedwood1,5,0.382169835968011,0.20680764692218,0.651717086632006,0.26876058901456 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCMixedwood2,5,0.382169835968011,0.202257751478417,0.577940851593645,0.26876058901456 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCMixedwood3,5,0.382169835968011,0.202257751478417,0.577940851593645,0.26876058901456 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCMixedwood4,5,0.382169835968011,0.202257751478417,0.577940851593645,0.26876058901456 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCPineR,5,0.257516440284706,0.150667864555583,0.320937431877625,0.222834547421847 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCPine1,5,0.367032738512122,0.153797796335071,0.408352690453667,0.230659376870567 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCPine2,5,0.299264533385581,0.150667864555583,0.326927019206703,0.222834547421847 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCPine3,5,0.299264533385581,0.150667864555583,0.326927019206703,0.222834547421847 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCPine4,5,0.299264533385581,0.150667864555583,0.326927019206703,0.222834547421847 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCSpruceR,5,0.33031115076104,0.165344717010304,0.354066806053394,0.232399492763879 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCSpruce1,5,0.321278673465362,0.165344717010304,0.354066806053394,0.232399492763879 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCSpruce2,5,0.309235698414168,0.152978282893057,0.342198618765037,0.224646667829625 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCSpruce3,5,0.321278673465362,0.165344717010304,0.354066806053394,0.232399492763879 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCSpruce4,5,0.321278673465362,0.165344717010304,0.354066806053394,0.232399492763879 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,HardLin,5,0.124834250138939,0.0976031879619042,0.161015010276017,0.119657771072368 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,EnSoftLin,5,0.149578897160079,0.110196599487253,0.200795296959508,0.149578897160079 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,EnSeismic,5,0.17621171145072,0.151563449331815,0.321389063867061,0.148917015269093 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,TrSoftLin,5,0.161576038763776,0.133472855485968,0.334988361196439,0.170010118563354 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Urban,5,0.124834250138939,0.0976031879619042,0.161015010276017,0.119657771072368 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Rural,5,0.124834250138939,0.0976031879619042,0.161015010276017,0.119657771072368 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Industrial,5,0.124834250138939,0.0976031879619042,0.161015010276017,0.119657771072368 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Well,5,0.167342446883202,0.0996737795885326,0.235260454822506,0.167342446883202 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Crop,5,0.13230580933567,0.0989533856832414,0.175081497618559,0.123033265375711 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,TameP,5,0.0761978867660244,0.0626235509195081,0.122200153021745,0.102432278679424 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,RoughP,5,0.179999624870336,0.123544136127207,0.318886739486466,0.131080066156672 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,ClaySub,5,0.822350941282527,0.564721576685588,0.902847896976817,0.547378986013343 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Other,5,0.822350941282527,0.564721576685588,0.902847896976817,0.547378986013343 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,RapidDrain,5,0.703309155717464,0.555321222902083,0.827461651558563,0.535469054342694 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Loamy,5,0.817588806148305,0.548443636006928,0.872763956600932,0.537850119223136 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,SandyLoam,5,0.807001792632946,0.557211905149701,0.88451664389314,0.537850119223136 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,ThinBreak,5,0.818123827692734,0.555565174379291,0.845931184940945,0.547378986013343 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Blowout,5,0.818123827692734,0.555565174379291,0.845931184940945,0.547378986013343 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Urban,5,0.890800888100359,0.618470952341391,0.90323565954368,0.541340120053176 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Rural,5,0.890800888100359,0.618470952341391,0.90323565954368,0.541340120053176 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Industrial,5,0.890800888100359,0.618470952341391,0.90323565954368,0.541340120053176 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Well,5,0.836243487485749,0.571006998954711,0.858962702047066,0.541340120053176 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Mine,5,0.890800888100359,0.618470952341391,0.90323565954368,0.541340120053176 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,EnSoftLin,5,0.814175226069433,0.547613503979019,0.874411868748132,0.534554131355377 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,EnSeismic,5,0.814175226069433,0.547613503979019,0.874411868748132,0.534554131355377 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,HardLin,5,0.890800888100359,0.618470952341391,0.90323565954368,0.541340120053176 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,TrSoftLin,5,0.826862949231866,0.464464171910114,0.856952486011971,0.520766669143306 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Crop,5,0.826142483695513,0.592096665574573,0.867149842462746,0.546104007294353 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,RoughP,5,0.810682771251767,0.57867711034817,0.896046995556526,0.541340120053176 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,TameP,5,0.835967807856813,0.590087861484664,0.870602954482249,0.547491721318661 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,WetlandMargin,5,0.841776259030486,0.633256861915724,0.937087335898482,0.537850119223136 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,ClaySub,5,0.00578279539408642,0.00294709629848283,0.012716045120441,0.00578279539408642 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Other,5,0.00578279539408642,0.00294709629848283,0.012716045120441,0.00578279539408642 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,RapidDrain,5,0.0105026506316965,0.00282353804046292,0.04993812156097,0.0105026506316965 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Loamy,5,0.00513692494203576,0.00222403648608284,0.0104028241345287,0.00513692494203576 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,SandyLoam,5,0.00712222785450809,0.00297230760676107,0.0323909870151699,0.00712222785450809 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,ThinBreak,5,0.0113857775964533,0.00620595274137331,0.022596015655191,0.0113857775964533 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Blowout,5,0.0113857775964533,0.00620595274137331,0.022596015655191,0.0113857775964533 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Urban,5,0.00452107771336638,0.00152466904882226,0.00780585643767519,0.00452107771336638 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Rural,5,0.00452107771336638,0.00152466904882226,0.00780585643767519,0.00452107771336638 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Industrial,5,0.00452107771336638,0.00152466904882226,0.00780585643767519,0.00452107771336638 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Well,5,0.00452107771336638,0.00152466904882226,0.00780585643767519,0.00452107771336638 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Mine,5,0.00452107771336638,0.00152466904882226,0.00780585643767519,0.00452107771336638 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,EnSoftLin,5,0.00513692494203576,0.00211613204099217,0.0099228372629855,0.00513692494203576 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,EnSeismic,5,0.00513692494203576,0.00211613204099217,0.0099228372629855,0.00513692494203576 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,HardLin,5,0.00452107771336638,0.00152466904882226,0.00780585643767519,0.00452107771336638 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,TrSoftLin,5,0.00498071216604,0.00141664690414779,0.00917631209935718,0.00498071216604 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Crop,5,0.00449311926621077,0.00168638787291805,0.00918727174507008,0.00449311926621077 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,RoughP,5,0.0067604464527444,0.00219886873382249,0.0276703814247239,0.0067604464527444 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,TameP,5,0.00445800890262925,0.0011233692177066,0.00744232176659842,0.00445800890262925 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,WetlandMargin,5,0.00513692494203576,0.00222403648608284,0.0104028241345287,0.00513692494203576 +mite,mite,north,,,Ceratozetes.gracilis,WhiteSpruce,5,0.0102721598563217,0.00715471386706027,0.0145326114268986,0.0140245523241566 +mite,mite,north,,,Ceratozetes.gracilis,Pine,5,0.0137131456937762,0.0113208681440029,0.0198583797303688,0.0190318391556017 +mite,mite,north,,,Ceratozetes.gracilis,Deciduous,5,0.0419895435582249,0.0318785038001686,0.0738570815054399,0.0659102684828086 +mite,mite,north,,,Ceratozetes.gracilis,Mixedwood,5,0.0360745482187593,0.0187983923764792,0.0584515677254383,0.0360745482187593 +mite,mite,north,,,Ceratozetes.gracilis,BlackSpruce,5,0.00506933557927685,0.00376749685856964,0.0104679406943217,0.0122333270217994 +mite,mite,north,,,Ceratozetes.gracilis,TreedFen,5,0.00949436841370341,0.00500717830110075,0.0119860292426439,0.0128817556588155 +mite,mite,north,,,Ceratozetes.gracilis,TreedSwamp,5,0.061421923343376,0.0382456463400108,0.121929812673505,0.061421923343376 +mite,mite,north,,,Ceratozetes.gracilis,GraminoidFen,5,0.0164546108915562,0.00881727358484067,0.0273923201976842,0.0246160759474848 +mite,mite,north,,,Ceratozetes.gracilis,ShrubbyFen,5,0.00874406982447618,0.00599221158044052,0.0237824318370538,0.0231774355740017 +mite,mite,north,,,Ceratozetes.gracilis,ShrubbyBog,5,0.0030463995013817,0.00120397300447129,0.00391921428919227,0.00434888507766517 +mite,mite,north,,,Ceratozetes.gracilis,ShrubbySwamp,5,0.0633579949842819,0.0494171642998844,0.0835346829927806,0.0620598776562816 +mite,mite,north,,,Ceratozetes.gracilis,Marsh,5,0.0139708169973481,0.00817678617009308,0.0369379677309799,0.0139708169973481 +mite,mite,north,,,Ceratozetes.gracilis,Shrub,5,0.021009994706587,0.0144404304492431,0.0621154731146993,0.0326917133555118 +mite,mite,north,,,Ceratozetes.gracilis,Grass,5,0.0155614031928919,0.0117070997259304,0.0190061057161866,0.0198424321202836 +mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruceR,5,0.00145906946331353,0.00110246554548516,0.00251407856907734,0.00296318377307484 +mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce1,5,0.00733330942443348,0.00372481242741027,0.01232435005305,0.0154489388605393 +mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce2,5,0.00869219213722612,0.00430603955099368,0.0164036356140145,0.0202021550024924 +mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce3,5,0.00869219213722612,0.00430603955099368,0.0164036356140145,0.0202021550024924 +mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce4,5,0.00869219213722612,0.00430603955099368,0.0164036356140145,0.0202021550024924 +mite,mite,north,,,Ceratozetes.gracilis,CCPineR,5,0.00113231817173019,0.000943611856652661,0.00208629558436305,0.00270898722191647 +mite,mite,north,,,Ceratozetes.gracilis,CCPine1,5,0.00220467448193786,0.00159982858176423,0.00488408633392917,0.00560263822791497 +mite,mite,north,,,Ceratozetes.gracilis,CCPine2,5,0.00753999417911515,0.00263432313689099,0.00983810253139207,0.00839874476683232 +mite,mite,north,,,Ceratozetes.gracilis,CCPine3,5,0.00753999417911515,0.00263432313689099,0.00983810253139207,0.00839874476683232 +mite,mite,north,,,Ceratozetes.gracilis,CCPine4,5,0.00753999417911515,0.00263432313689099,0.00983810253139207,0.00839874476683232 +mite,mite,north,,,Ceratozetes.gracilis,CCDeciduousR,5,0.00622614692199154,0.00349911838500725,0.0116842851671796,0.0124894467727164 +mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous1,5,0.0201857384998523,0.0124305058492061,0.0316762391943219,0.0315697398121216 +mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous2,5,0.00568730085218266,0.00303223049800619,0.0117691164845202,0.0142578278538103 +mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous3,5,0.00568730085218266,0.00303223049800619,0.0117691164845202,0.0142578278538103 +mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous4,5,0.00568730085218266,0.00303223049800619,0.0117691164845202,0.0142578278538103 +mite,mite,north,,,Ceratozetes.gracilis,CCMixedwoodR,5,0.00622614692199154,0.00349911838500725,0.0116842851671796,0.0124894467727164 +mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood1,5,0.0201857384998523,0.0124305058492061,0.0316762391943219,0.0315697398121216 +mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood2,5,0.00568730085218266,0.00303223049800619,0.0117691164845202,0.0142578278538103 +mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood3,5,0.00568730085218266,0.00303223049800619,0.0117691164845202,0.0142578278538103 +mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood4,5,0.00568730085218266,0.00303223049800619,0.0117691164845202,0.0142578278538103 +mite,mite,north,,,Ceratozetes.gracilis,EnSeismic,5,0.00928889522762542,0.00622414921635469,0.0297264608094797,0.0431427656629786 +mite,mite,north,,,Ceratozetes.gracilis,EnSoftLin,5,0.0100440395771807,0.004709630725824,0.0184046907818485,0.0191349522872354 +mite,mite,north,,,Ceratozetes.gracilis,TrSoftLin,5,0.00854985842280526,0.00246837907751785,0.0099686716021626,0.0104216422917097 +mite,mite,north,,,Ceratozetes.gracilis,HardLin,5,0.0100148328187436,0.0058598954135579,0.0133735097958914,0.0147237570029223 +mite,mite,north,,,Ceratozetes.gracilis,UrbInd,5,0.0792581753031336,0.0445586547475523,0.110793194734777,0.0792581753031336 +mite,mite,north,,,Ceratozetes.gracilis,Wellsites,5,0.0157808575713124,0.0109575298578701,0.0328323497840251,0.0243796022869871 +mite,mite,north,,,Ceratozetes.gracilis,Crop,5,0.0254125124461608,0.0128510549404539,0.0458640062799612,0.0325207137703129 +mite,mite,north,,,Ceratozetes.gracilis,TameP,5,0.0190000037034049,0.00867750921274693,0.0471399438340532,0.0432297466703646 +mite,mite,north,,,Ceratozetes.gracilis,RoughP,5,0.106075388059961,0.0641356861012643,0.188477562833508,0.16378251919553 +mite,mite,north,,,Trhypochthonius.tectorum,WhiteSpruce,5,0.0394857475434615,0.0194344004414981,0.0670017923672268,0.0454100702942058 +mite,mite,north,,,Trhypochthonius.tectorum,Pine,5,0.0429413314976495,0.0214812518055131,0.0568894331044955,0.0540245549102675 +mite,mite,north,,,Trhypochthonius.tectorum,Deciduous,5,0.0154170661057649,0.00745930803534025,0.0426364368931325,0.0467769583351974 +mite,mite,north,,,Trhypochthonius.tectorum,Mixedwood,5,0.0282994701988188,0.0117846368090254,0.0431721884278335,0.0465669285383791 +mite,mite,north,,,Trhypochthonius.tectorum,BlackSpruce,5,0.0156446110279516,0.0127794912003539,0.086215463904672,0.0781669036443615 +mite,mite,north,,,Trhypochthonius.tectorum,TreedFen,5,0.0246352429845294,0.00569517745674629,0.0724751689250193,0.0660128866775939 +mite,mite,north,,,Trhypochthonius.tectorum,TreedSwamp,5,0.0459480505762087,0.00899572780254302,0.0807258425516005,0.059434391666355 +mite,mite,north,,,Trhypochthonius.tectorum,GraminoidFen,5,0.0229477899865102,0.00660910116311413,0.06214758200501,0.0533255128164798 +mite,mite,north,,,Trhypochthonius.tectorum,ShrubbyFen,5,0.0250204427570318,0.00943545138708123,0.105756635738421,0.056016511718773 +mite,mite,north,,,Trhypochthonius.tectorum,ShrubbyBog,5,0.00695295513522941,0.00371743134013496,0.0407322548597943,0.0562597597884134 +mite,mite,north,,,Trhypochthonius.tectorum,ShrubbySwamp,5,0.00349830992158235,0.00154031084721905,0.0384781711617471,0.0398679512796629 +mite,mite,north,,,Trhypochthonius.tectorum,Marsh,5,0.0114684995492736,0.00610947363791284,0.031983272768434,0.0433187130955129 +mite,mite,north,,,Trhypochthonius.tectorum,Shrub,5,0.00641771386367267,0.00149403006775723,0.029708057554145,0.0407470625842792 +mite,mite,north,,,Trhypochthonius.tectorum,Grass,5,0.0312166587168325,0.00889633528243011,0.0495513457910109,0.0536916558688223 +mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruceR,5,0.087851578863436,0.0276012076062507,0.100358133377569,0.0911261638218472 +mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce1,5,0.0137654830009269,0.00557222919065331,0.0333472474145989,0.0461306170397789 +mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce2,5,0.0304595601888948,0.00859332116648274,0.0473241647351322,0.0461306170397789 +mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce3,5,0.0304595601888948,0.00859332116648274,0.0473241647351322,0.0461306170397789 +mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce4,5,0.0304595601888948,0.00859332116648274,0.0473241647351322,0.0461306170397789 +mite,mite,north,,,Trhypochthonius.tectorum,CCPineR,5,0.11797977009165,0.0716919997701895,0.164502979867339,0.158981687296497 +mite,mite,north,,,Trhypochthonius.tectorum,CCPine1,5,0.0416259101387942,0.0178333289570483,0.0570045183978202,0.0624999970758866 +mite,mite,north,,,Trhypochthonius.tectorum,CCPine2,5,0.0416058554749524,0.0196299263331726,0.102183027700316,0.0624999970758866 +mite,mite,north,,,Trhypochthonius.tectorum,CCPine3,5,0.0416058554749524,0.0196299263331726,0.102183027700316,0.0624999970758866 +mite,mite,north,,,Trhypochthonius.tectorum,CCPine4,5,0.0416058554749524,0.0196299263331726,0.102183027700316,0.0624999970758866 +mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduousR,5,0.0292037302811804,0.0105765175267385,0.0638609969955317,0.0758256609216894 +mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous1,5,0.00927032106896021,0.0042587298763641,0.0421851537524267,0.0461306170397789 +mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous2,5,0.0071434147237284,0.00404148035199869,0.0365404302748405,0.0461306170397789 +mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous3,5,0.0071434147237284,0.00404148035199869,0.0365404302748405,0.0461306170397789 +mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous4,5,0.0071434147237284,0.00404148035199869,0.0365404302748405,0.0461306170397789 +mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwoodR,5,0.0292037302811804,0.0105765175267385,0.0638609969955317,0.0758256609216894 +mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood1,5,0.00927032106896021,0.0042587298763641,0.0421851537524267,0.0461306170397789 +mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood2,5,0.0071434147237284,0.00404148035199869,0.0365404302748405,0.0461306170397789 +mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood3,5,0.0071434147237284,0.00404148035199869,0.0365404302748405,0.0461306170397789 +mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood4,5,0.0071434147237284,0.00404148035199869,0.0365404302748405,0.0461306170397789 +mite,mite,north,,,Trhypochthonius.tectorum,EnSeismic,5,0.0150298540092801,0.00487970658508403,0.0796437946117068,0.0834089416573685 +mite,mite,north,,,Trhypochthonius.tectorum,EnSoftLin,5,0.0151467600781892,0.0046231304235287,0.0914725089720468,0.0478802872049836 +mite,mite,north,,,Trhypochthonius.tectorum,TrSoftLin,5,0.00231544669389142,0.000830887384992062,0.03064970004828,0.0468035425561821 +mite,mite,north,,,Trhypochthonius.tectorum,HardLin,5,0.0353500369895466,0.0103456301397578,0.055405203452712,0.0353500369895466 +mite,mite,north,,,Trhypochthonius.tectorum,UrbInd,5,0.0213764276928926,0.00252933506160831,0.0387012781622709,0.0335752758675474 +mite,mite,north,,,Trhypochthonius.tectorum,Wellsites,5,0.033939415802588,0.00993451686590656,0.126894128793527,0.0399206342672845 +mite,mite,north,,,Trhypochthonius.tectorum,Crop,5,0.0114608689427535,0.00248651280400981,0.0444082523603005,0.0276062157536913 +mite,mite,north,,,Trhypochthonius.tectorum,TameP,5,0.0308290810251023,0.0110029263001109,0.0771358591892674,0.0396030587559356 +mite,mite,north,,,Trhypochthonius.tectorum,RoughP,5,0.0714106623632365,0.0130348302097785,0.165983452044736,0.0714106623632365 +mite,mite,south,,,Ceratozetes.gracilis,Loamy,5,0.00808101143196459,0.0016207392148522,0.0174633482020339,0.00882687291847061 +mite,mite,south,,,Ceratozetes.gracilis,SandyLoam,5,0.00308029027664852,0.00136735323790803,0.00335668375087707,0.0034847088953633 +mite,mite,south,,,Ceratozetes.gracilis,ClaySub,5,0.00182686446591225,0.000551301167708902,0.00255940845646478,0.00262320814741028 +mite,mite,south,,,Ceratozetes.gracilis,RapidDrain,5,0.00277400834477971,0.0023872020244556,0.00482653073951637,0.00608021031756068 +mite,mite,south,,,Ceratozetes.gracilis,Blowout,5,0.000955956862870655,0.00060083281876712,0.00205343870432948,0.00237550963076549 +mite,mite,south,,,Ceratozetes.gracilis,ThinBreak,5,0.00108919344605565,0.000587088915890356,0.00219875979679317,0.00242897446172947 +mite,mite,south,,,Ceratozetes.gracilis,Other,5,0.00131583947131006,0.000874185124012239,0.00242047053127026,0.00263971632746513 +mite,mite,south,,,Ceratozetes.gracilis,EnSeismic,5,0.00835839453074033,0.00426678711041527,0.0332341427605599,0.00718827301556243 +mite,mite,south,,,Ceratozetes.gracilis,EnSoftLin,5,0.00835839453074033,0.00426678711041527,0.0332341427605599,0.00718827301556243 +mite,mite,south,,,Ceratozetes.gracilis,TrSoftLin,5,0.00782010538323901,0.00296136986295269,0.0190154458378424,0.00782010538323901 +mite,mite,south,,,Ceratozetes.gracilis,HardLin,5,0.000857882269526531,0.000540002525668197,0.00177545141273227,0.00235911183402676 +mite,mite,south,,,Ceratozetes.gracilis,UrbInd,5,0.000912690250621134,0.000615008763429803,0.00160412414613674,0.00204648635172349 +mite,mite,south,,,Ceratozetes.gracilis,Wellsites,5,0.00073043791427095,0.000342681767297562,0.00139736599182283,0.00170188942786697 +mite,mite,south,,,Ceratozetes.gracilis,Crop,5,0.000865573045680914,0.000343855590582349,0.00391591974096471,0.00259320087178522 +mite,mite,south,,,Ceratozetes.gracilis,TameP,5,0.000814344168693421,0.000675922956447004,0.0021578051053667,0.00302380446706365 +mite,mite,south,,,Ceratozetes.gracilis,RoughP,5,0.00116986012195163,0.000573399888505842,0.00201559505541471,0.00240069830914299 +mite,mite,south,,,Trhypochthonius.tectorum,Loamy,5,0.0130796885088541,0.00974376898623315,0.0421691194810228,0.0544473280466744 +mite,mite,south,,,Trhypochthonius.tectorum,SandyLoam,5,0.0101719139805278,0.0078121674325146,0.0265020778999881,0.0309629294988475 +mite,mite,south,,,Trhypochthonius.tectorum,ClaySub,5,0.00810026356871029,0.00554399917475387,0.0262048642490298,0.0372855553100201 +mite,mite,south,,,Trhypochthonius.tectorum,RapidDrain,5,0.00470891550488383,0.0029479116054443,0.0140469239546165,0.0193187162515081 +mite,mite,south,,,Trhypochthonius.tectorum,Blowout,5,0.00679693278998647,0.00400940538175401,0.0212493700388495,0.0258250448201751 +mite,mite,south,,,Trhypochthonius.tectorum,ThinBreak,5,0.00431742975180868,0.0026988855859282,0.0153217341942861,0.0215938033932772 +mite,mite,south,,,Trhypochthonius.tectorum,Other,5,0.00543311605540115,0.0017249123691186,0.0159501956987054,0.0209154741630786 +mite,mite,south,,,Trhypochthonius.tectorum,EnSeismic,5,0.00218848996144008,0.00170111662865227,0.0089044869307167,0.012071708052853 +mite,mite,south,,,Trhypochthonius.tectorum,EnSoftLin,5,0.00218848996144008,0.00170111662865227,0.0089044869307167,0.012071708052853 +mite,mite,south,,,Trhypochthonius.tectorum,TrSoftLin,5,0.0021416742642729,0.0015786428997113,0.00657962986794352,0.00950883665281393 +mite,mite,south,,,Trhypochthonius.tectorum,HardLin,5,0.00961214826175235,0.00429514334368352,0.0184057934930091,0.0233658844622869 +mite,mite,south,,,Trhypochthonius.tectorum,UrbInd,5,0.00458440358742753,0.00191345237161373,0.0162420822395568,0.0233658844622869 +mite,mite,south,,,Trhypochthonius.tectorum,Wellsites,5,0.00605835473530788,0.00316482367582537,0.0173531343798444,0.0247924008862883 +mite,mite,south,,,Trhypochthonius.tectorum,Crop,5,0.0108598136663004,0.00491431184971441,0.026838371730351,0.0344211245391687 +mite,mite,south,,,Trhypochthonius.tectorum,TameP,5,0.00666208954248976,0.00331975745298083,0.0217685548217177,0.0317175484607103 +mite,mite,south,,,Trhypochthonius.tectorum,RoughP,5,0.00435992031802756,0.00192924676806901,0.0153162033122146,0.0201534578604257 +vascular_plant,vascular_plant,north,,,Galium.boreale,WhiteSpruce,5,0.0374392031265178,0.0333692131906405,0.0433345653944808,0.0466370647602642 +vascular_plant,vascular_plant,north,,,Galium.boreale,Pine,5,0.0500593438765839,0.0408049555459282,0.105240107802099,0.0500593438765839 +vascular_plant,vascular_plant,north,,,Galium.boreale,Deciduous,5,0.391495895873286,0.254496804487091,0.402163195293294,0.215897634677168 +vascular_plant,vascular_plant,north,,,Galium.boreale,Mixedwood,5,0.0810095418020126,0.0379869231315069,0.0961950903853699,0.032872236484059 +vascular_plant,vascular_plant,north,,,Galium.boreale,BlackSpruce,5,0.0254674616646145,0.0158425843666888,0.0435953519065557,0.022750121589903 +vascular_plant,vascular_plant,north,,,Galium.boreale,TreedFen,5,0.00502270579593102,0.00437032022683379,0.00714592120041284,0.00488295833356585 +vascular_plant,vascular_plant,north,,,Galium.boreale,TreedSwamp,5,0.118774832996189,0.0803475724001394,0.264441595558989,0.118774832996189 +vascular_plant,vascular_plant,north,,,Galium.boreale,GraminoidFen,5,0.0130058711269843,0.00939224816431556,0.0185730233320287,0.0130058711269843 +vascular_plant,vascular_plant,north,,,Galium.boreale,ShrubbyFen,5,0.0164297495624466,0.0143281428330915,0.0199331852928648,0.0134413437619274 +vascular_plant,vascular_plant,north,,,Galium.boreale,ShrubbyBog,5,0.00381694456221479,0.00284947146206666,0.00416465601549787,0.00381694456221479 +vascular_plant,vascular_plant,north,,,Galium.boreale,ShrubbySwamp,5,0.108530709301707,0.0605738646315521,0.114251847865091,0.0601778189466999 +vascular_plant,vascular_plant,north,,,Galium.boreale,Marsh,5,0.0303195892798742,0.0240370199820619,0.0400184400943712,0.0248817213967334 +vascular_plant,vascular_plant,north,,,Galium.boreale,Shrub,5,0.0636708746674912,0.0476716418053174,0.120518777360074,0.0509427447460396 +vascular_plant,vascular_plant,north,,,Galium.boreale,Grass,5,0.0217088138057536,0.0176938879165566,0.0548384650438043,0.0157402788563787 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruceR,5,0.477222128053848,0.268619294592782,0.718584112281858,0.383065851974248 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce1,5,0.512664474399587,0.273048354454709,0.734787181463203,0.381159706709511 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce2,5,0.336004758372563,0.0866177087481736,0.503038421010211,0.134073305928807 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce3,5,0.336004758372563,0.0866177087481736,0.503038421010211,0.134073305928807 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce4,5,0.336004758372563,0.0866177087481736,0.503038421010211,0.134073305928807 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCPineR,5,0.184368836538832,0.112339902951841,0.592544885907604,0.1582478760585 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine1,5,0.178323228748494,0.0944312519481362,0.421291284259476,0.105728116532866 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine2,5,0.103429645869795,0.0327474504737415,0.207096053070954,0.034845885680375 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine3,5,0.103429645869795,0.0327474504737415,0.207096053070954,0.034845885680375 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine4,5,0.103429645869795,0.0327474504737415,0.207096053070954,0.034845885680375 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduousR,5,0.32057396424405,0.183225375506266,0.453779124126605,0.215698096756669 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous1,5,0.575267910405923,0.415636893665722,0.739486529308092,0.517792427897605 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous2,5,0.488835240754203,0.429359375220111,0.628974155208788,0.411079620974547 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous3,5,0.488835240754203,0.429359375220111,0.628974155208788,0.411079620974547 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous4,5,0.488835240754203,0.429359375220111,0.628974155208788,0.411079620974547 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwoodR,5,0.32057396424405,0.183225375506266,0.453779124126605,0.215698096756669 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood1,5,0.575267910405923,0.415636893665722,0.739486529308092,0.517792427897605 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood2,5,0.488835240754203,0.429359375220111,0.628974155208788,0.411079620974547 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood3,5,0.488835240754203,0.429359375220111,0.628974155208788,0.411079620974547 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood4,5,0.488835240754203,0.429359375220111,0.628974155208788,0.411079620974547 +vascular_plant,vascular_plant,north,,,Galium.boreale,EnSeismic,5,0.0322705170722364,0.0230594539873516,0.0482626435755474,0.0550597930196374 +vascular_plant,vascular_plant,north,,,Galium.boreale,EnSoftLin,5,0.0330658481820695,0.0223970025521592,0.0355945662748708,0.0330658481820695 +vascular_plant,vascular_plant,north,,,Galium.boreale,TrSoftLin,5,0.0271163602936753,0.0173228057640187,0.037172405180186,0.0426724289112729 +vascular_plant,vascular_plant,north,,,Galium.boreale,HardLin,5,0.0179685654599828,0.0126487434552365,0.0260498499768669,0.0152195497846251 +vascular_plant,vascular_plant,north,,,Galium.boreale,UrbInd,5,0.0268124105494291,0.0248743534215449,0.0334324484826879,0.0260231381636217 +vascular_plant,vascular_plant,north,,,Galium.boreale,Wellsites,5,0.0256423967549138,0.0209953251743227,0.0461214967239676,0.0190579138992947 +vascular_plant,vascular_plant,north,,,Galium.boreale,Crop,5,0.013672124479362,0.0115163163976427,0.0232606798636209,0.012042036542853 +vascular_plant,vascular_plant,north,,,Galium.boreale,TameP,5,0.0144861626647328,0.0106777255014515,0.0203487482988822,0.0172878421770899 +vascular_plant,vascular_plant,north,,,Galium.boreale,RoughP,5,0.131547628495493,0.076550261941709,0.157040313589425,0.0947839598426263 +vascular_plant,vascular_plant,north,,,Vicia.americana,WhiteSpruce,5,0.00328686102375592,0.00212675122944704,0.00391474523204404,0.00381959988064463 +vascular_plant,vascular_plant,north,,,Vicia.americana,Pine,5,0.01046399923648,0.0074924685118511,0.0138803201478345,0.0155059259418671 +vascular_plant,vascular_plant,north,,,Vicia.americana,Deciduous,5,0.436765018936612,0.245683907178536,0.517177208179867,0.436765018936612 +vascular_plant,vascular_plant,north,,,Vicia.americana,Mixedwood,5,0.0520407768186977,0.0339944817579022,0.0745743937468873,0.0505004500386359 +vascular_plant,vascular_plant,north,,,Vicia.americana,BlackSpruce,5,0.0187255304615284,0.0125287122210643,0.0333788943810062,0.0187255304615284 +vascular_plant,vascular_plant,north,,,Vicia.americana,TreedFen,5,0.00626918066404668,0.00321493408740833,0.00737118278045699,0.00626918066404668 +vascular_plant,vascular_plant,north,,,Vicia.americana,TreedSwamp,5,0.0228909546198871,0.0135832508442986,0.0430941171968737,0.0202149765066307 +vascular_plant,vascular_plant,north,,,Vicia.americana,GraminoidFen,5,0.0135563454263875,0.00903949116065579,0.0207009644089668,0.0149408384704638 +vascular_plant,vascular_plant,north,,,Vicia.americana,ShrubbyFen,5,0.0155413131969093,0.00956914702042303,0.0187105923881176,0.0155413131969093 +vascular_plant,vascular_plant,north,,,Vicia.americana,ShrubbyBog,5,0.00164559675785315,0.00148060148333466,0.00286167395797714,0.00288035092196388 +vascular_plant,vascular_plant,north,,,Vicia.americana,ShrubbySwamp,5,0.0171724189914347,0.0131662587331599,0.0241301292385613,0.0195540890683284 +vascular_plant,vascular_plant,north,,,Vicia.americana,Marsh,5,0.0104711263227363,0.00867414464248756,0.0347361666823628,0.0162897049172689 +vascular_plant,vascular_plant,north,,,Vicia.americana,Shrub,5,0.0238622589247824,0.0168440278701544,0.0310683402874825,0.0238622589247824 +vascular_plant,vascular_plant,north,,,Vicia.americana,Grass,5,0.030670229988894,0.0215275510873062,0.0436481913075912,0.0294286596923736 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruceR,5,0.0418211090236362,0.0152789098681117,0.0730998392976096,0.0418211090236362 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce1,5,0.0629715243585932,0.0321343077668045,0.0959159858854704,0.0594047036921747 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce2,5,0.0565865098903527,0.0408509535382218,0.0964486926516381,0.055631413305491 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce3,5,0.0565865098903527,0.0408509535382218,0.0964486926516381,0.055631413305491 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce4,5,0.0565865098903527,0.0408509535382218,0.0964486926516381,0.055631413305491 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCPineR,5,0.0201647463247618,0.0100739950966346,0.0353623986021148,0.0235999426201235 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine1,5,0.0169483992172514,0.00763177748647143,0.0394713094204116,0.0169483992172514 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine2,5,0.00795847797282249,0.00586737831955678,0.0114510177640358,0.01169621704846 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine3,5,0.00795847797282249,0.00586737831955678,0.0114510177640358,0.01169621704846 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine4,5,0.00795847797282249,0.00586737831955678,0.0114510177640358,0.01169621704846 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduousR,5,0.0399505806676464,0.0143942373084423,0.0449125142906171,0.0399505806676464 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous1,5,0.263960498353553,0.14104175796268,0.28366431295036,0.273903518006007 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous2,5,0.167607252553558,0.0580233169731123,0.21415305111116,0.167607252553558 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous3,5,0.167607252553558,0.0580233169731123,0.21415305111116,0.167607252553558 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous4,5,0.167607252553558,0.0580233169731123,0.21415305111116,0.167607252553558 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwoodR,5,0.0399505806676464,0.0143942373084423,0.0449125142906171,0.0399505806676464 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood1,5,0.263960498353553,0.14104175796268,0.28366431295036,0.273903518006007 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood2,5,0.167607252553558,0.0580233169731123,0.21415305111116,0.167607252553558 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood3,5,0.167607252553558,0.0580233169731123,0.21415305111116,0.167607252553558 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood4,5,0.167607252553558,0.0580233169731123,0.21415305111116,0.167607252553558 +vascular_plant,vascular_plant,north,,,Vicia.americana,EnSeismic,5,0.0198087913155123,0.0137143044386733,0.0267285704598637,0.02763145629096 +vascular_plant,vascular_plant,north,,,Vicia.americana,EnSoftLin,5,0.0397873802617532,0.0255526660413561,0.065088548692643,0.0815293962612943 +vascular_plant,vascular_plant,north,,,Vicia.americana,TrSoftLin,5,0.00853001872645728,0.00656358681976996,0.011404689546475,0.00853001872645728 +vascular_plant,vascular_plant,north,,,Vicia.americana,HardLin,5,0.0473141635621907,0.0296525411207059,0.0506332189977675,0.0526208550143497 +vascular_plant,vascular_plant,north,,,Vicia.americana,UrbInd,5,0.0392208289832895,0.0199646342228563,0.046958483304894,0.0392208289832895 +vascular_plant,vascular_plant,north,,,Vicia.americana,Wellsites,5,0.0110373214773055,0.00600630982870938,0.0134808365269019,0.010004427955462 +vascular_plant,vascular_plant,north,,,Vicia.americana,Crop,5,0.0171174183070504,0.0122282619634417,0.0285591627305329,0.0297712277168652 +vascular_plant,vascular_plant,north,,,Vicia.americana,TameP,5,0.0196881354547364,0.0158885693958968,0.0240025384044252,0.0196881354547364 +vascular_plant,vascular_plant,north,,,Vicia.americana,RoughP,5,0.0158934541199885,0.0108164693184258,0.0212560074572336,0.0170997216332836 +vascular_plant,vascular_plant,south,,,Galium.boreale,Loamy,5,0.443747979001273,0.22324014345375,0.663184537388927,0.443747979001273 +vascular_plant,vascular_plant,south,,,Galium.boreale,SandyLoam,5,0.0820142267647028,0.0109074954934366,0.0996570846589912,0.100045817887078 +vascular_plant,vascular_plant,south,,,Galium.boreale,ClaySub,5,0.0229195713358895,0.00591495745643993,0.0501050159870325,0.0307985638018622 +vascular_plant,vascular_plant,south,,,Galium.boreale,RapidDrain,5,0.370258218694941,0.166801923515199,0.733450823538383,0.622987009404475 +vascular_plant,vascular_plant,south,,,Galium.boreale,Blowout,5,0.352366294752384,0.0723016284843112,0.516486411216731,0.352366294752384 +vascular_plant,vascular_plant,south,,,Galium.boreale,ThinBreak,5,0.129261622662098,0.0776300469649367,0.196859424086492,0.226154821372081 +vascular_plant,vascular_plant,south,,,Galium.boreale,Other,5,0.113661854698142,0.0455033200168779,0.177374152876428,0.144583233388928 +vascular_plant,vascular_plant,south,,,Galium.boreale,EnSeismic,5,0.175883563378513,0.108802056347556,0.468529834203972,0.175883563378513 +vascular_plant,vascular_plant,south,,,Galium.boreale,EnSoftLin,5,0.156233353525968,0.047708351232081,0.23663076662717,0.156233353525968 +vascular_plant,vascular_plant,south,,,Galium.boreale,TrSoftLin,5,0.14837124090763,0.0821346557706723,0.19837425048036,0.194616817162544 +vascular_plant,vascular_plant,south,,,Galium.boreale,HardLin,5,0.242133694821736,0.0867761461404134,0.349274168503963,0.242133694821736 +vascular_plant,vascular_plant,south,,,Galium.boreale,UrbInd,5,0.328736531619323,0.0949492115815193,0.393059499739328,0.205104426419453 +vascular_plant,vascular_plant,south,,,Galium.boreale,Wellsites,5,0.810910668167771,0.41548179665116,0.880124470060476,0.647891869536858 +vascular_plant,vascular_plant,south,,,Galium.boreale,Crop,5,0.0366764990739023,0.00640310017939445,0.0638612606634286,0.0731673082567089 +vascular_plant,vascular_plant,south,,,Galium.boreale,TameP,5,0.0818692355535502,0.0331745410028261,0.102600019362093,0.0961447421899536 +vascular_plant,vascular_plant,south,,,Galium.boreale,RoughP,5,0.227738111578725,0.0431090309174861,0.253048576068725,0.227738111578725 +vascular_plant,vascular_plant,south,,,Vicia.americana,Loamy,5,0.738481461548948,0.465938105000844,0.787684315008132,0.797006368028765 +vascular_plant,vascular_plant,south,,,Vicia.americana,SandyLoam,5,0.429591660006352,0.18559523887094,0.635761340775386,0.600153638546782 +vascular_plant,vascular_plant,south,,,Vicia.americana,ClaySub,5,0.918818814249119,0.750951128555063,0.931854331664212,0.939800764723441 +vascular_plant,vascular_plant,south,,,Vicia.americana,RapidDrain,5,0.222936238536632,0.0770902648886913,0.366497963732066,0.441178433676612 +vascular_plant,vascular_plant,south,,,Vicia.americana,Blowout,5,0.0815559302647169,0.0593766906632077,0.333040559882829,0.413948315650876 +vascular_plant,vascular_plant,south,,,Vicia.americana,ThinBreak,5,0.794217592690998,0.625082173044825,0.920046117675071,0.939805391146715 +vascular_plant,vascular_plant,south,,,Vicia.americana,Other,5,0.155124149658055,0.0754988315158589,0.199790015740101,0.227541198415253 +vascular_plant,vascular_plant,south,,,Vicia.americana,EnSeismic,5,0.164253089427457,0.117698993828618,0.382807659861464,0.449818210083466 +vascular_plant,vascular_plant,south,,,Vicia.americana,EnSoftLin,5,0.114939317241677,0.041519411445619,0.21671085302802,0.282198362913929 +vascular_plant,vascular_plant,south,,,Vicia.americana,TrSoftLin,5,0.0298012477178091,0.0131757224979755,0.0429766136343858,0.0512401981810537 +vascular_plant,vascular_plant,south,,,Vicia.americana,HardLin,5,0.0377380912768181,0.0198388165158529,0.0719421996838765,0.0924126958339971 +vascular_plant,vascular_plant,south,,,Vicia.americana,UrbInd,5,0.0351612539447746,0.0164481806973647,0.0568001950386329,0.044785012783358 +vascular_plant,vascular_plant,south,,,Vicia.americana,Wellsites,5,0.109234670448604,0.0544725102291996,0.291850133407204,0.119765505914902 +vascular_plant,vascular_plant,south,,,Vicia.americana,Crop,5,0.015112697453394,0.00730492926166426,0.0188084951029659,0.0192844172387284 +vascular_plant,vascular_plant,south,,,Vicia.americana,TameP,5,0.0211217114282728,0.0112458799686589,0.0276865189202504,0.0293888277575648 +vascular_plant,vascular_plant,south,,,Vicia.americana,RoughP,5,0.0146158898601415,0.00859205349308942,0.0193513848626824,0.0211335108101242 diff --git a/3_output/exp_001_xgboost/tables/metric_summary.csv b/3_output/exp_001_xgboost/tables/metric_summary.csv new file mode 100644 index 0000000..adead70 --- /dev/null +++ b/3_output/exp_001_xgboost/tables/metric_summary.csv @@ -0,0 +1,393 @@ +taxon,run,region,season,part,species,metric,n,median,p10,p90,boot1,mean,sd +bird,bird,north,,,AMRO,insample_auc,5,0.766348577070303,0.763700356126714,0.768315898990854,0.762075690451976,0.766175199526612,0.00254722811633338 +bird,bird,north,,,AMRO,insample_deviance_explained,5,0.223649525313419,0.219921210061377,0.22564724323019,0.218095813759875,0.223086556643362,0.00308542505004281 +bird,bird,north,,,AMRO,insample_rmse,5,0.63337366081926,0.631145480051182,0.635084665392635,0.635690863352491,0.633190592460684,0.0020130445355889 +bird,bird,north,,,AMRO,insample_spearman,5,0.408954906297264,0.404743989209146,0.411429566475061,0.402069874406224,0.408455072973783,0.00381974703070294 +bird,bird,north,,,AMRO,insample_calibration_slope,5,1.1153205195924,1.1130748221597,1.12795873657376,1.1153205195924,1.11948223039207,0.00775700680593854 +bird,bird,north,,,AMRO,insample_prevalence,5,0.251486631016043,0.251004373826971,0.252433263182893,0.250861017819325,0.251649276245993,0.000745639638422784 +bird,bird,north,,,AMRO,insample_n,5,46747,46745.2,46750,46747,46747.6,2.50998007960223 +bird,bird,north,,,AMRO,oob_auc,5,0.757169735025858,0.7567208960586,0.758360477695037,0.758545558629657,0.757451103732046,0.000825064173131252 +bird,bird,north,,,AMRO,oob_deviance_explained,5,0.20956522267587,0.208916365110153,0.210443533595982,0.210794220720189,0.209622146425454,0.000784062001221159 +bird,bird,north,,,AMRO,oob_rmse,5,0.638640769153233,0.638509194496622,0.639423218313425,0.638640769153233,0.63888750244258,0.000480707820884263 +bird,bird,north,,,AMRO,oob_spearman,5,0.388450222044055,0.388112299338068,0.390402406635382,0.390637560338498,0.389076496475794,0.0011833856505583 +bird,bird,north,,,AMRO,oob_calibration_slope,5,1.05529415989891,1.03309824845438,1.06090649249454,1.06260320652297,1.0485052816654,0.0142706985184561 +bird,bird,north,,,AMRO,oob_prevalence,5,0.241010939026539,0.240656718532255,0.241191818078906,0.241245385459292,0.240950250724789,0.000279167052473422 +bird,bird,north,,,AMRO,oob_n,5,124877,124874,124878.8,124877,124876.4,2.50998007960223 +bird,bird,north,,,YEWA,insample_auc,5,0.831269033983197,0.830197469982878,0.832670684752953,0.829880554122733,0.831417003547777,0.00122095544465026 +bird,bird,north,,,YEWA,insample_deviance_explained,5,0.362785798849313,0.358628754597728,0.365507620885259,0.356844491370585,0.362278132955092,0.00360721414204665 +bird,bird,north,,,YEWA,insample_rmse,5,0.489935020236126,0.486187534116785,0.492535220734052,0.493541145061961,0.489544473086814,0.00333413844516582 +bird,bird,north,,,YEWA,insample_spearman,5,0.374740584480801,0.37219091990059,0.375964291451757,0.372133456018564,0.374136493145862,0.00194393482783569 +bird,bird,north,,,YEWA,insample_calibration_slope,5,0.94807211278347,0.946347346595061,0.954801256829046,0.947027541911327,0.949912320030563,0.00445690413325451 +bird,bird,north,,,YEWA,insample_prevalence,5,0.118296361263824,0.117706951871658,0.119214980837802,0.118296361263824,0.118418937588893,0.00074585019883292 +bird,bird,north,,,YEWA,insample_n,5,46747,46745.2,46750,46747,46747.6,2.50998007960223 +bird,bird,north,,,YEWA,oob_auc,5,0.781528156999816,0.781272864959273,0.783424264698686,0.783077482966789,0.782174096589881,0.00111693062082886 +bird,bird,north,,,YEWA,oob_deviance_explained,5,0.262490453869982,0.261130919027361,0.263922866493182,0.262490453869982,0.262527422178337,0.0013700956191398 +bird,bird,north,,,YEWA,oob_rmse,5,0.54231732578611,0.542056019435769,0.543525748102,0.541941968046052,0.542650465320291,0.000849208203709833 +bird,bird,north,,,YEWA,oob_spearman,5,0.33713114349731,0.336545952815328,0.338597120301502,0.338525553308721,0.337480553525589,0.00103685806503907 +bird,bird,north,,,YEWA,oob_calibration_slope,5,0.906590673344268,0.894480764741939,0.929954892797354,0.906590673344268,0.910244692404546,0.021143884010558 +bird,bird,north,,,YEWA,oob_prevalence,5,0.13458843502006,0.134244406707603,0.134809487963868,0.13458843502006,0.134542639141448,0.000279456693593184 +bird,bird,north,,,YEWA,oob_n,5,124877,124874,124878.8,124877,124876.4,2.50998007960223 +bird,bird,south,,,AMRO,insample_auc,5,0.762775612735809,0.754318113390042,0.764632493895319,0.751014106613257,0.760368337276432,0.00569628121482347 +bird,bird,south,,,AMRO,insample_deviance_explained,5,0.204459328717014,0.192512123015121,0.206330477398256,0.188178656802463,0.200767259193672,0.00766046525099654 +bird,bird,south,,,AMRO,insample_rmse,5,0.702660371405344,0.70089916207229,0.710701436680476,0.712606323131588,0.705076454440276,0.00510032253834029 +bird,bird,south,,,AMRO,insample_spearman,5,0.403528962075037,0.390565937539463,0.406417343825927,0.384637823518389,0.399961772514838,0.00905888881779309 +bird,bird,south,,,AMRO,insample_calibration_slope,5,1.23044997339321,1.22282721103293,1.24729584962799,1.23044997339321,1.23308304786014,0.0145045858843931 +bird,bird,south,,,AMRO,insample_prevalence,5,0.258280375405076,0.256689533268802,0.259336584790035,0.256218172635832,0.2580593533773,0.00136065688529854 +bird,bird,south,,,AMRO,insample_n,5,23761,23761,23761.6,23761,23761.2,0.447213595499958 +bird,bird,south,,,AMRO,oob_auc,5,0.732269987568019,0.730721550555738,0.732754123767481,0.729836682499663,0.731931251175247,0.00121020621312217 +bird,bird,south,,,AMRO,oob_deviance_explained,5,0.161915134215393,0.158235572973872,0.163530682453132,0.156757861298744,0.161201781565542,0.00279506875317982 +bird,bird,south,,,AMRO,oob_rmse,5,0.714494699421899,0.714054695958152,0.716311740373661,0.715479709938808,0.71501184512683,0.00119413913770245 +bird,bird,south,,,AMRO,oob_spearman,5,0.358375103938654,0.355534940038285,0.35876466560778,0.354241476771466,0.357512256536856,0.00190247702541528 +bird,bird,south,,,AMRO,oob_calibration_slope,5,1.07296909181061,1.06254836796723,1.10520591805053,1.10584756707492,1.0823249491235,0.0219241224896263 +bird,bird,south,,,AMRO,oob_prevalence,5,0.259904818560381,0.259531587266211,0.260466983938132,0.260633551457466,0.259982926292237,0.000480821801997171 +bird,bird,south,,,AMRO,oob_n,5,67240,67239.4,67240,67240,67239.8,0.447213595499958 +bird,bird,south,,,YEWA,insample_auc,5,0.784324137303064,0.781916750599072,0.787145532171862,0.787947644764914,0.784431184727772,0.00259389999747705 +bird,bird,south,,,YEWA,insample_deviance_explained,5,0.329876797075016,0.328438339774838,0.335290101057425,0.331865793831291,0.331241143182001,0.00380729370916509 +bird,bird,south,,,YEWA,insample_rmse,5,0.581103189566076,0.576337395633245,0.586537540365677,0.587695573722515,0.581537232993935,0.00534033030346879 +bird,bird,south,,,YEWA,insample_spearman,5,0.379148853435148,0.376533263859059,0.383361227292727,0.384453738255781,0.379743399962202,0.00340421769301697 +bird,bird,south,,,YEWA,insample_calibration_slope,5,0.959582334626047,0.953370514759589,0.975791134379575,0.953168949085808,0.963353138951076,0.0112938011064301 +bird,bird,south,,,YEWA,insample_prevalence,5,0.17124700138883,0.17077564075586,0.171722441305838,0.171625773326038,0.171262389740443,0.000478416642385765 +bird,bird,south,,,YEWA,insample_n,5,23761,23761,23761.6,23761,23761.2,0.447213595499958 +bird,bird,south,,,YEWA,oob_auc,5,0.75715316573909,0.755274737090388,0.759474560615997,0.759756451617164,0.757356443494712,0.00207183184862858 +bird,bird,south,,,YEWA,oob_deviance_explained,5,0.26388183056408,0.261989644309366,0.266251014725856,0.267606218266052,0.264013568149709,0.0023190174475586 +bird,bird,south,,,YEWA,oob_rmse,5,0.614960587017423,0.614658825241612,0.615685272238021,0.614673190827697,0.615094435474036,0.000571210991059149 +bird,bird,south,,,YEWA,oob_spearman,5,0.346691769470514,0.344801802209752,0.350018007523901,0.350464716028413,0.347288993800835,0.00259100332006461 +bird,bird,south,,,YEWA,oob_calibration_slope,5,0.903851052419204,0.890105584794789,0.941790172875962,0.903851052419204,0.912325516257266,0.0271653508385359 +bird,bird,south,,,YEWA,oob_prevalence,5,0.175758477096966,0.175590501794327,0.1759250446163,0.175624628197501,0.175753050469217,0.000169045533323201 +bird,bird,south,,,YEWA,oob_n,5,67240,67239.4,67240,67240,67239.8,0.447213595499958 +bryophyte,bryophyte,north,,,Bryum.All,insample_auc,5,0.857978394980521,0.789441595321284,0.862002340315989,0.770386041257282,0.833849106613322,0.039993363409929 +bryophyte,bryophyte,north,,,Bryum.All,insample_deviance_explained,5,0.277753589587066,0.174276061218763,0.285917233288483,0.150171305539755,0.241832073345983,0.0601826092444179 +bryophyte,bryophyte,north,,,Bryum.All,insample_rmse,5,0.396962983128559,0.394566617888505,0.431753686208583,0.440271657458748,0.409165419684623,0.0201739192387733 +bryophyte,bryophyte,north,,,Bryum.All,insample_spearman,5,0.607012509877032,0.490640534639994,0.614373721824581,0.458868674189629,0.56624426443727,0.0679688700598316 +bryophyte,bryophyte,north,,,Bryum.All,insample_calibration_slope,5,1.4245913766613,1.40869494981491,1.51992010531084,1.53493777553577,1.45536412326168,0.0575523842665342 +bryophyte,bryophyte,north,,,Bryum.All,insample_prevalence,5,0.398261429491307,0.395579807718977,0.401857219116663,0.400041220115416,0.3986710498744,0.00332558122320578 +bryophyte,bryophyte,north,,,Bryum.All,insample_n,5,3097,3072.4,4153.6,4852,3440.8,789.041633882522 +bryophyte,bryophyte,north,,,Bryum.All,oob_auc,4,0.661130987659494,0.638923688463342,0.676857929526958,,0.658816574327819,0.0206288468695857 +bryophyte,bryophyte,north,,,Bryum.All,oob_deviance_explained,4,0.0379243523192806,0.0159108778019197,0.0619573550481462,,0.038645612394818,0.0247027601699559 +bryophyte,bryophyte,north,,,Bryum.All,oob_rmse,4,0.47494463550282,0.470386508579213,0.482803513595329,,0.476123475205999,0.00689679724576912 +bryophyte,bryophyte,north,,,Bryum.All,oob_spearman,4,0.27425649389822,0.236080539149219,0.300047755903551,,0.269833389346909,0.0349273694526796 +bryophyte,bryophyte,north,,,Bryum.All,oob_calibration_slope,4,0.680499623830858,0.595976329504985,0.836312717046587,,0.705960266291521,0.133637734117107 +bryophyte,bryophyte,north,,,Bryum.All,oob_prevalence,4,0.403358051486104,0.397360409603543,0.408630979157295,,0.403099224982043,0.006528394280969 +bryophyte,bryophyte,north,,,Bryum.All,oob_n,5,1755,698.4,1779.6,0,1411.2,789.041633882522 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_auc,5,0.877353476350821,0.808350804885673,0.881144845827382,0.765269449728448,0.855565019162749,0.0505882232424503 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_deviance_explained,5,0.335202314978185,0.22005463412144,0.337278935477427,0.154994400826678,0.296356528350255,0.0794499634478956 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_rmse,5,0.382972355673557,0.381115957852404,0.421773533165065,0.444072388004376,0.395529307090753,0.0272957639736505 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_spearman,5,0.650062831983975,0.530125438076014,0.654898954519372,0.456256931473654,0.611364733022137,0.0868932147958527 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_calibration_slope,5,1.30855599837992,1.28741341599077,1.34136570958624,1.33142004866925,1.3134962112755,0.0270983258770983 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_prevalence,5,0.441055234954658,0.434155026365629,0.445516968426104,0.441055234954658,0.440040906513639,0.00592042164227121 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_n,5,3068,3031.6,4152,4852,3417.8,802.273768734838 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_auc,4,0.701509398537735,0.696419735900355,0.721689089089356,,0.706898694221393,0.0151500138203321 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_deviance_explained,4,0.0693096895023192,0.0631859433764816,0.100638076296884,,0.0783113468840075,0.023218031297801 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_rmse,4,0.470218880629275,0.461220182764623,0.470437998987226,,0.467083316519739,0.00645857476263672 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_spearman,4,0.347133189487122,0.337090894864666,0.38204017877062,,0.356013437580351,0.0265592480794306 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_calibration_slope,4,0.73421775592656,0.714474560046534,0.823486386111286,,0.759048268178239,0.0667805767017605 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_prevalence,4,0.443665764352131,0.432608384046217,0.454192825112108,,0.443476364514296,0.0116999631210214 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_n,5,1784,700,1820.4,0,1434.2,802.273768734838 +bryophyte,bryophyte,south,,,Bryum.All,insample_auc,5,0.89700099758916,0.830711573289628,0.910583315412943,0.792790433094654,0.879641404689057,0.0495043333856412 +bryophyte,bryophyte,south,,,Bryum.All,insample_deviance_explained,5,0.377655981115873,0.247406526226596,0.404743264740333,0.178811163710994,0.343250476284121,0.0946524378393646 +bryophyte,bryophyte,south,,,Bryum.All,insample_rmse,5,0.358870671443606,0.350035097829807,0.403119952542412,0.425550790707136,0.370868903169041,0.0315839279368021 +bryophyte,bryophyte,south,,,Bryum.All,insample_spearman,5,0.661091540895497,0.553374315450635,0.687008599929479,0.489841722503616,0.634634700662896,0.0826189775775944 +bryophyte,bryophyte,south,,,Bryum.All,insample_calibration_slope,5,1.28899602895042,1.25394354981498,1.40051287186428,1.46714141245107,1.31382916688235,0.0883089450798419 +bryophyte,bryophyte,south,,,Bryum.All,insample_prevalence,5,0.370562770562771,0.365528360602252,0.371569237798783,0.370562770562771,0.369235286484943,0.00385091464779508 +bryophyte,bryophyte,south,,,Bryum.All,insample_n,5,1444,1429.8,1968,2310,1614.6,388.936113005722 +bryophyte,bryophyte,south,,,Bryum.All,oob_auc,4,0.729153630388279,0.717038216749336,0.738405404780561,,0.7281309020859,0.0118120824533377 +bryophyte,bryophyte,south,,,Bryum.All,oob_deviance_explained,4,0.0893992482388517,0.0741532065122787,0.10478416162106,,0.0894488452587214,0.0164881787289122 +bryophyte,bryophyte,south,,,Bryum.All,oob_rmse,4,0.45270894853103,0.447594389935665,0.456197936921665,,0.452128387743626,0.00466211333102415 +bryophyte,bryophyte,south,,,Bryum.All,oob_spearman,4,0.384817563231245,0.363002467013743,0.399340489385828,,0.382213216780202,0.0199979335893137 +bryophyte,bryophyte,south,,,Bryum.All,oob_calibration_slope,4,0.732586352255061,0.703030392929968,0.768205721614973,,0.734751855838925,0.035029147876037 +bryophyte,bryophyte,south,,,Bryum.All,oob_prevalence,4,0.3703593055487,0.368749240306309,0.380219211352906,,0.37330567717792,0.0072755089177001 +bryophyte,bryophyte,south,,,Bryum.All,oob_n,5,866,342,880.2,0,695.4,388.936113005722 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_auc,5,0.915930107869368,0.891450561408518,0.926616194880262,0.888769191549551,0.910563618073768,0.0175538594313058 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_deviance_explained,5,0.412167233201754,0.351595800157622,0.457676433567111,0.342125264548208,0.406574161265852,0.0521852688538256 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_rmse,5,0.31185704715981,0.302050212888687,0.335098143875397,0.337158290865724,0.317322814726973,0.0164987120276871 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_spearman,5,0.604912315123774,0.580646267790716,0.63300293475881,0.575027343164341,0.606752043957667,0.0257635263446129 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_calibration_slope,5,1.2449893208821,1.20370652866252,1.27907027094689,1.28779177380718,1.24256491782013,0.0376739028731244 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_prevalence,5,0.23982683982684,0.231460603487586,0.246697056850865,0.23982683982684,0.239405392468179,0.00765174673579537 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_n,5,1462,1452.8,1977.6,2310,1631.4,379.498089586759 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_auc,4,0.778934840029295,0.767110225050101,0.781925832419594,,0.775779974818975,0.00937400446814031 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_deviance_explained,4,0.139570100700392,0.122996632435766,0.14013282475148,,0.133851977766986,0.0119232441695895 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_rmse,4,0.394235086578714,0.387216209322419,0.403091112711108,,0.394891211177321,0.00854423131376846 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_spearman,4,0.413549176035088,0.389196791933615,0.423360661173376,,0.40835599783395,0.0192762865394097 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_calibration_slope,4,0.76135590726747,0.709567218680568,0.807541434617375,,0.759354778254257,0.053504059631391 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_prevalence,4,0.238999572635154,0.227667581639544,0.255610993801512,,0.240885083410421,0.0151422609821477 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_n,5,848,332.4,857.2,0,678.6,379.498089586759 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_auc,5,0.90306703394132,0.861997623718975,0.909557282195037,0.835898082239764,0.891712298377204,0.0314327410006322 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_deviance_explained,5,0.399124479978233,0.320410663610957,0.418533795825594,0.268343143859901,0.380123815408677,0.0633143696783399 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_rmse,5,0.358571779595024,0.351826731925259,0.386653697118476,0.404727052714958,0.365433686719157,0.0222689437439916 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_spearman,5,0.679546301965036,0.610737579343904,0.689581990790728,0.566138044181707,0.660294538542617,0.0529300524562874 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_calibration_slope,5,1.18819148495281,1.1782769636349,1.19894709412132,1.17381324555617,1.18865014779103,0.0105675641916 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_prevalence,5,0.384787472035794,0.382719077877937,0.387875670039505,0.384787472035794,0.385092893007771,0.00278105998275642 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_n,5,3685,3644,4976.6,5811,4102.6,955.610956404331 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_auc,4,0.786530164742749,0.775104142499333,0.793970495225298,,0.785106703399582,0.0103525019457257 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_deviance_explained,4,0.192181255170203,0.164125577530809,0.204218212230172,,0.186460283534694,0.0234630390585414 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_rmse,4,0.428721348032908,0.423627322126028,0.43519546452647,,0.429214237528152,0.00632451459924355 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_spearman,4,0.483023934210276,0.464515993000355,0.49390236749782,,0.480299109952284,0.0162196315614818 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_calibration_slope,4,0.850136104236858,0.81870198401027,0.874227719255483,,0.8475137809483,0.0320059584079878 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_prevalence,4,0.385212683681362,0.378550429000763,0.388624647224836,,0.384051865418103,0.00565743785692542 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_n,5,2126,834.4,2167,0,1708.4,955.610956404331 +lichen,lichen,north,,,Physcia.adscendens,insample_auc,5,0.939777654098532,0.911080186533162,0.942242224187428,0.896074560283454,0.93073247520305,0.0196909817596669 +lichen,lichen,north,,,Physcia.adscendens,insample_deviance_explained,5,0.524609389797858,0.443975455970509,0.5346412625903,0.402358655211678,0.500330134941044,0.055954457939386 +lichen,lichen,north,,,Physcia.adscendens,insample_rmse,5,0.308771692546898,0.30423782561,0.338062134707957,0.353013016928338,0.317256850747619,0.0205181147730102 +lichen,lichen,north,,,Physcia.adscendens,insample_spearman,5,0.742718666256435,0.692391957474749,0.743240431256618,0.667337063054066,0.72528846187005,0.0328872274819537 +lichen,lichen,north,,,Physcia.adscendens,insample_calibration_slope,5,1.1257380343136,1.10422828486673,1.13249656335067,1.09325260996237,1.1209310878181,0.0162505556942861 +lichen,lichen,north,,,Physcia.adscendens,insample_prevalence,5,0.382961350027218,0.378754207234193,0.387054085275807,0.384099122354156,0.382969715660275,0.00456567123234541 +lichen,lichen,north,,,Physcia.adscendens,insample_n,5,3699,3673.4,4975,5811,4115.6,947.965083745177 +lichen,lichen,north,,,Physcia.adscendens,oob_auc,4,0.866926360790323,0.862087917989515,0.874242804714464,,0.867811361191514,0.00712797521374287 +lichen,lichen,north,,,Physcia.adscendens,oob_deviance_explained,4,0.333680010118101,0.316008230418285,0.352686602796521,,0.334156729039031,0.0212707418234594 +lichen,lichen,north,,,Physcia.adscendens,oob_rmse,4,0.376432045366574,0.370761125805094,0.383732665571178,,0.377014081310547,0.00744870745917702 +lichen,lichen,north,,,Physcia.adscendens,oob_spearman,4,0.617272651778561,0.612085256678639,0.631117628869793,,0.620364645346886,0.0112058746439612 +lichen,lichen,north,,,Physcia.adscendens,oob_calibration_slope,4,0.947435614255118,0.9231511407045,0.962650618873475,,0.944196518207882,0.0215162468730037 +lichen,lichen,north,,,Physcia.adscendens,oob_prevalence,4,0.386432660247333,0.378648004672367,0.394703317951312,,0.386606232436266,0.00923888826136022 +lichen,lichen,north,,,Physcia.adscendens,oob_n,5,2112,836,2137.6,0,1695.4,947.965083745177 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_auc,5,0.969467791929505,0.94554259858816,0.977697753981227,0.934063944264331,0.964247428354548,0.0179780768132266 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_deviance_explained,5,0.569918413361741,0.460986605212442,0.624443753156406,0.406902937508697,0.552676585965894,0.0888523179578358 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_rmse,5,0.194858569015368,0.186240789476017,0.219969408227671,0.235975729845345,0.200013744460052,0.0206276146478214 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_spearman,5,0.458459566623043,0.440231015330974,0.481507104444283,0.436551106027585,0.460260609424667,0.0203295151651974 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_calibration_slope,5,1.23659645456016,1.19091239599295,1.31739443903872,1.33649314585924,1.24884684874142,0.0633927191699459 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_prevalence,5,0.0907849829351536,0.0854880550520455,0.0942546707117982,0.092924126172208,0.0900691492139895,0.00433337917377339 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_n,5,1482,1471.8,2004.4,2346,1653.4,387.296785424305 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_auc,4,0.841927401594458,0.814122619755631,0.854197072499783,,0.836379147689636,0.024105517017398 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_deviance_explained,4,0.137342313520227,0.0661302770659705,0.187683972414293,,0.12988860724873,0.0684761944605061 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_rmse,4,0.275915264527875,0.266252355330623,0.296587208395246,,0.279847062624346,0.0174783529300131 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_spearman,4,0.34360769801821,0.328454264305382,0.369875964894448,,0.347577281290856,0.0229776654519093 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_calibration_slope,4,0.732042066814184,0.625950490739272,0.800036589986221,,0.718435976491729,0.0955023022395362 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_prevalence,4,0.0997452652709462,0.0913286406440493,0.106312613843352,,0.0990848095371992,0.00808662138066247 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_n,5,864,341.6,874.2,0,692.6,387.296785424305 +lichen,lichen,south,,,Physcia.adscendens,insample_auc,5,0.967738582022316,0.955991989343995,0.979668441592445,0.949810964083176,0.968389525053055,0.0123060398982728 +lichen,lichen,south,,,Physcia.adscendens,insample_deviance_explained,5,0.614974064767116,0.562969523073021,0.683603603317859,0.534078102964625,0.623658261830829,0.0618729329174631 +lichen,lichen,south,,,Physcia.adscendens,insample_rmse,5,0.239104213258494,0.216295272601257,0.260766980353619,0.269598106245282,0.238210757209883,0.0223621600742667 +lichen,lichen,south,,,Physcia.adscendens,insample_spearman,5,0.66794563892556,0.647190372818858,0.68339353507428,0.640882056423092,0.666449148918677,0.0182028349104463 +lichen,lichen,south,,,Physcia.adscendens,insample_calibration_slope,5,1.14599263984303,1.12914707852375,1.17184091306446,1.17634966452876,1.14927333505347,0.0211132386903304 +lichen,lichen,south,,,Physcia.adscendens,insample_prevalence,5,0.215686274509804,0.210370852380551,0.218705697782215,0.215686274509804,0.214933253293698,0.00478783760132252 +lichen,lichen,south,,,Physcia.adscendens,insample_n,5,1487,1480.8,2014,2346,1662.2,382.531305908418 +lichen,lichen,south,,,Physcia.adscendens,oob_auc,4,0.877853932002758,0.871763267932113,0.889309444773546,,0.879769949395666,0.00974015043776396 +lichen,lichen,south,,,Physcia.adscendens,oob_deviance_explained,4,0.316316590491307,0.311756042720643,0.355547751180148,,0.328698952247799,0.0283418155389015 +lichen,lichen,south,,,Physcia.adscendens,oob_rmse,4,0.330376682745035,0.325822954573174,0.333444027464085,,0.329845831511888,0.00421874459836274 +lichen,lichen,south,,,Physcia.adscendens,oob_spearman,4,0.538191345296531,0.524384704662879,0.564193784036703,,0.542546987477431,0.0223459671186621 +lichen,lichen,south,,,Physcia.adscendens,oob_calibration_slope,4,0.846032356353984,0.837628073355304,0.960556271283099,,0.883932224900568,0.0838634539702572 +lichen,lichen,south,,,Physcia.adscendens,oob_prevalence,4,0.21549434057534,0.209833885194357,0.226186106799465,,0.217291237305033,0.00944381193189753 +lichen,lichen,south,,,Physcia.adscendens,oob_n,5,859,332,865.2,0,683.8,382.531305908418 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_auc,5,0.910259509993553,0.88184625831704,0.927323656339855,0.868976601251561,0.906614907844463,0.0239073515247792 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_deviance_explained,5,0.474054081510562,0.397465015912776,0.518806225879973,0.367300741000527,0.463059906888393,0.0627252807992666 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_rmse,5,0.279240404239482,0.266278890821292,0.299152882460238,0.306532346072908,0.281638937849815,0.0167730913263048 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_spearman,5,0.592488935231076,0.549408359447422,0.612464608794839,0.528970499717187,0.584899714288157,0.0341708931515595 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_calibration_slope,5,1.1096324235522,1.09278078311067,1.1651956006726,1.09094115862962,1.12432406177859,0.0367784942507134 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_prevalence,5,0.22526523562793,0.222685585610422,0.228865718677616,0.22526523562793,0.225662811559798,0.00324773944134521 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_n,5,2588,2554.4,3469,4053,2869.4,661.914873680899 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_auc,4,0.810775166178672,0.803982488513029,0.826090126241556,,0.813818838463401,0.0124788110797789 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_deviance_explained,4,0.23228521248351,0.180873753043444,0.273935574205886,,0.228799106155764,0.0512988461352543 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_rmse,4,0.338978661380412,0.327126349680501,0.34707661072446,,0.33763781768189,0.0108248882200281 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_spearman,4,0.444636622931266,0.436958872940447,0.461267326785242,,0.447834106453822,0.013934094500744 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_calibration_slope,4,0.83010997880233,0.791089834099164,0.88916212979261,,0.837264266762014,0.054432980284402 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_prevalence,4,0.224511499051979,0.218291264544164,0.230417458254175,,0.224399257871401,0.00661456979352361 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_n,5,1465,584,1498.6,0,1183.6,661.914873680899 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_auc,5,0.815633497591343,0.721189628035643,0.828332208671413,0.668807488521141,0.787711275688621,0.067536624871792 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_deviance_explained,5,0.238275334859115,0.126908709674348,0.260521041508318,0.0667954919785909,0.208039416419961,0.0810195458115548 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_rmse,5,0.384000496355334,0.378423641101907,0.41600865879306,0.431921753845721,0.393204089908283,0.0223887514677771 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_spearman,5,0.498852144154782,0.345568644186856,0.520529344561138,0.25845081116616,0.454381229088058,0.111055272007196 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_calibration_slope,5,1.36137376941337,1.27983032191041,1.42098778577656,1.44751799028067,1.35332778347014,0.0737287256264133 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_prevalence,5,0.320047355958958,0.317847829087179,0.320941159211816,0.321243523316062,0.319582666739872,0.00164288413830535 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_n,5,2587,2537.6,3467,4053,2861,666.806193732482 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_auc,4,0.6430697816434,0.630906200950248,0.649625626909458,,0.641067018990866,0.010310861320791 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_deviance_explained,4,0.0262867696883457,0.0154825574462112,0.0342505563817664,,0.0252723319923765,0.010233949415076 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_rmse,4,0.442911169744624,0.442021211050866,0.443933207262469,,0.442958340753226,0.00104701909021943 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_spearman,4,0.221458654928667,0.2040692598032,0.235694665770445,,0.220332446255921,0.0170081685633331 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_calibration_slope,4,0.602069322844031,0.564735288528114,0.622112810319293,,0.595894127543797,0.0315831069336963 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_prevalence,4,0.324076824388238,0.322733281306541,0.3276244709432,,0.324864004200118,0.00280085582083958 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_n,5,1466,586,1515.4,0,1192,666.806193732482 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_auc,5,0.893732347566041,0.784712258283139,0.915208827028804,0.736208619664332,0.863009641751231,0.0746875300132786 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_deviance_explained,5,0.288640059052714,0.140093240656905,0.320548100445375,0.0743048901222631,0.247959089596049,0.102607765786842 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_rmse,5,0.333900220383005,0.317749180293818,0.383417922752713,0.405302941526172,0.345370244647289,0.0361318946431007 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_spearman,5,0.571583737398404,0.411885511925985,0.586700623973269,0.331591042359753,0.521138376032511,0.108291171995442 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_calibration_slope,5,1.38126210571742,1.34808749223702,1.81250896737235,2.05704525126745,1.51660995162389,0.304695831730118 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_prevalence,5,0.691079812206573,0.689952548788955,0.71053806886065,0.691079812206573,0.698355803841802,0.0110051698108056 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_n,5,675,672.2,911.8,1065,753.4,174.236333753899 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_auc,4,0.599155058694649,0.596640158751869,0.614306341370811,,0.603668052528,0.0115168786725371 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_deviance_explained,4,-0.0370587964047042,-0.0605832246261204,-0.0245150887544077,,-0.0409804823229612,0.0208683797262976 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_rmse,4,0.448706414900468,0.442629385507453,0.454186465337138,,0.448493208130345,0.00620365405907811 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_spearman,4,0.138143954163894,0.110598773460574,0.160775449559523,,0.136389066554005,0.0270427321288871 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_calibration_slope,4,0.40460328401589,0.36347981172972,0.448588280626499,,0.405625256988904,0.0456382008603107 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_prevalence,4,0.675933879994794,0.656439043984736,0.693034260713775,,0.675078717390838,0.0207397429628256 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_n,5,390,153.2,392.8,0,311.6,174.236333753899 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_auc,5,0.955721341227574,0.941876493093078,0.980032921905824,0.936824600234356,0.960333658578674,0.019071016719919 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_deviance_explained,5,0.590027313558758,0.533806219497194,0.710729335676534,0.514510257414488,0.617189401003254,0.0884901405549281 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_rmse,5,0.246971011361295,0.214055070645962,0.264989100024242,0.269467710928516,0.24131828889772,0.0253849061577766 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_spearman,5,0.603646123486099,0.588336675539944,0.652760004611676,0.581351058648935,0.617127581876953,0.0325981050536584 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_calibration_slope,5,1.2295157959797,1.19324993534435,1.3802153698801,1.30017294621111,1.27215507749944,0.101181183538218 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_prevalence,5,0.182159624413146,0.181333087877553,0.193172072927236,0.182159624413146,0.185526823886116,0.00827314119136472 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_n,5,678,670.6,913,1065,754,173.956891211587 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_auc,4,0.767962549603175,0.755975920442971,0.821622889366791,,0.782846017675822,0.0418546319891171 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_deviance_explained,4,0.0714822186053786,-0.0408681350873901,0.239998128339478,,0.0915413457629968,0.153310238574512 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_rmse,4,0.333524894690421,0.326889079075606,0.355111722424891,,0.338864541876012,0.0163868090297704 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_spearman,4,0.347277591152696,0.331346872505113,0.429118025438348,,0.370816775309149,0.0600617037029071 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_calibration_slope,4,0.729368252930069,0.625528438246681,0.958413753873108,,0.774084569451373,0.185881843676153 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_prevalence,4,0.182520739834082,0.160534290271133,0.183610188261351,,0.175057525142768,0.01572313523028 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_n,5,387,152,394.4,0,311,173.956891211587 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_auc,5,0.912606117200804,0.887624451084413,0.922392100045844,0.877681659131004,0.907024878896229,0.0186316149532348 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_deviance_explained,5,0.468210108853301,0.398702138746091,0.489870224764755,0.373322015940387,0.450305865358353,0.0489827129347062 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_rmse,5,0.265946665799294,0.260868953533259,0.281028935482682,0.28590578738551,0.269716805570368,0.0105769766239431 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_spearman,5,0.568117860487893,0.532806515898693,0.582476079874812,0.517677298316643,0.560719708806051,0.0267266918153412 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_calibration_slope,5,1.06149717888556,1.04183233055343,1.10090907426819,1.06149717888556,1.06947496461794,0.02964021273979 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_prevalence,5,0.201509433962264,0.199761756423448,0.205640478898507,0.201356917858008,0.202439531288226,0.00307554695366447 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_n,5,2612,2595.8,3536.2,4127,2916.2,677.217616427689 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_auc,4,0.843380569862941,0.837264834970835,0.851139799429576,,0.843967532246701,0.00747995581420451 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_deviance_explained,4,0.287525394106671,0.27683097448843,0.306244010733274,,0.290391178752514,0.0163487773504522 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_rmse,4,0.30275636744994,0.297539076408971,0.303950765212066,,0.301319619850353,0.00388325710673683 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_spearman,4,0.467479525844878,0.461993330581785,0.476762620645052,,0.468835561393836,0.00807813369857433 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_calibration_slope,4,0.844669813159302,0.797732278853807,0.883708251200886,,0.841848707350762,0.0463644691760651 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_prevalence,4,0.199234448913847,0.193549889929862,0.204483398915383,,0.199078874277258,0.00592784350128194 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_n,5,1515,590.8,1531.2,0,1210.8,677.217616427689 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_auc,5,0.871507556296411,0.824099979512551,0.892912374558421,0.809771013388151,0.862111817148584,0.0350919075671117 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_deviance_explained,5,0.329392011801442,0.259456693666561,0.398849123149537,0.232011775387871,0.331226729925025,0.0700196150629553 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_rmse,5,0.286973837051059,0.276763436155569,0.303020671751729,0.307576413390527,0.288876391221958,0.0132054051965759 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_spearman,5,0.450192417187314,0.401965996873113,0.484318543168764,0.3833151284687,0.44568293350492,0.0419369117110238 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_calibration_slope,5,1.25257252325658,1.21729420945707,1.32537198354447,1.34372982749975,1.26638905505519,0.0543152584566197 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_prevalence,5,0.148776350860189,0.144579171619019,0.151265484707482,0.148776350860189,0.148217744909364,0.00345089736498891 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_n,5,2637,2606,3537,4127,2925.8,671.783223964398 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_auc,4,0.692551346402684,0.682460202751897,0.70679870523503,,0.694035708967527,0.013165178222692 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_deviance_explained,4,0.0540816869521263,0.0141283023913486,0.0862093355546272,,0.0512867812527417,0.0395159683953798 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_rmse,4,0.338973692483144,0.328685644324978,0.344856063522025,,0.337400236369114,0.00898400813404663 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_spearman,4,0.240157197519794,0.229372891763469,0.252918126365829,,0.240863134337548,0.0131808021294983 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_calibration_slope,4,0.588731598826463,0.505773442491683,0.696035594381569,,0.597426541405151,0.103778370825785 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_prevalence,4,0.148630312373211,0.144212802079742,0.157027721824677,,0.150051704929638,0.00706694376971498 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_n,5,1490,590,1521,0,1201.2,671.783223964398 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_auc,5,0.857751951770376,0.79440366780059,0.922540576923459,0.755383862639498,0.862182037633474,0.0685001441767033 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_deviance_explained,5,0.294543909453236,0.180813174325599,0.428882189616842,0.114500866431879,0.308777478599837,0.129394946979975 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_rmse,5,0.34034862633445,0.295426048205682,0.370868634601436,0.39109950084017,0.332582999586279,0.0396926900532704 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_spearman,5,0.601106559333232,0.478800237729815,0.714179629314927,0.400978098349965,0.604556152773267,0.127479350231306 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_calibration_slope,5,1.26968179363173,1.25829518058595,1.44654740891661,1.55965933436895,1.32510792293209,0.131408201639278 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_prevalence,5,0.602816901408451,0.593809006916747,0.607790307126989,0.604735883424408,0.60104129788425,0.00700249933764362 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_n,5,696,686.6,942.8,1098,775.8,180.377936566532 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_auc,4,0.647138310793413,0.640877291000949,0.674890255051361,,0.654813640959657,0.0204426073543706 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_deviance_explained,4,-0.0418102612402197,-0.109760787359131,0.0137369118949877,,-0.0462400301629711,0.0665039386069977 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_rmse,4,0.427001266543158,0.419148634976836,0.435146182953353,,0.427105653987398,0.0085890878047572 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_spearman,4,0.241594483726187,0.240203449840303,0.270721156283332,,0.251500068965923,0.0209128573207021 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_calibration_slope,4,0.497653877609332,0.436996226524828,0.64709734332734,,0.529363097121298,0.118504267937661 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_prevalence,4,0.614967084834182,0.599715606114469,0.623570700713301,,0.612592848105398,0.0130873792975551 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_n,5,402,155.2,411.4,0,322.2,180.377936566532 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_auc,5,0.967045685795686,0.915285321838798,0.981619214884151,0.925009356287425,0.952625142299974,0.0336462439602616 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_deviance_explained,5,0.623237127541129,0.427429087500714,0.69709118842689,0.450534136207375,0.575671076641989,0.135855796625128 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_rmse,5,0.169718997202972,0.147040553100203,0.199746749592118,0.196086545215843,0.172425884626037,0.0261672720549197 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_spearman,5,0.443954406227822,0.417520571508669,0.471152398628163,0.416178543501863,0.444136637946073,0.0264512281346795 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_calibration_slope,5,1.34192647414073,1.27702241951042,1.56351524018203,1.4868566766033,1.40171806260506,0.14670071130752 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_prevalence,5,0.0875912408759124,0.0815913826315997,0.0946898807160816,0.0874316939890711,0.0882209860082516,0.00699025063520411 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_n,5,693,685.8,936.8,1098,771.6,182.509725768245 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_auc,4,0.803553194357792,0.738229963432943,0.807624208316615,,0.781677402584211,0.0472293563086202 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_deviance_explained,4,0.151515388114001,-0.217086869193566,0.192212979850534,,0.0344065789814888,0.270655062738678 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_rmse,4,0.230371071022379,0.216954229930974,0.254854420150939,,0.234323395321363,0.0208480768804293 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_spearman,4,0.281494635851876,0.237762867643462,0.29307478032794,,0.270011913090322,0.0333049338103374 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_calibration_slope,4,0.569041405546619,0.459332837179746,0.786303410438132,,0.607453347162562,0.182567815239868 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_prevalence,4,0.0837295205104187,0.0742110480309994,0.0991029746633899,,0.0858205853938301,0.0138195684717859 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_n,5,405,161.2,412.2,0,326.4,182.509725768245 +mite,mite,north,,,Ceratozetes.gracilis,insample_auc,5,0.911801541814478,0.891069347872812,0.91367928821936,0.879196801481044,0.905393717510947,0.0147757272299495 +mite,mite,north,,,Ceratozetes.gracilis,insample_deviance_explained,5,0.408444612287306,0.359392586915677,0.415906095622731,0.329917728855628,0.394628518020776,0.0365465060502053 +mite,mite,north,,,Ceratozetes.gracilis,insample_rmse,5,0.307340698618005,0.303392445126844,0.319566572589505,0.327478225349051,0.309868860221708,0.0100568788191934 +mite,mite,north,,,Ceratozetes.gracilis,insample_spearman,5,0.581238073851271,0.551443754073628,0.584300774254957,0.533499852838133,0.572207114024572,0.0217936421456679 +mite,mite,north,,,Ceratozetes.gracilis,insample_calibration_slope,5,1.18613386986737,1.17472655369614,1.20381025007388,1.18613386986737,1.18831397815241,0.0144879431857209 +mite,mite,north,,,Ceratozetes.gracilis,insample_prevalence,5,0.211169769380383,0.208505864577966,0.211369634473166,0.208369812642269,0.210190443530451,0.00151474200965215 +mite,mite,north,,,Ceratozetes.gracilis,insample_n,5,3651,3606.6,4890.2,5711,4047.6,930.188045504779 +mite,mite,north,,,Ceratozetes.gracilis,oob_auc,4,0.801676687894602,0.799827274950427,0.808050954206398,,0.803292706954467,0.0050242238140849 +mite,mite,north,,,Ceratozetes.gracilis,oob_deviance_explained,4,0.179510752821417,0.175938696645046,0.195094383572495,,0.183800600883812,0.0116210667575745 +mite,mite,north,,,Ceratozetes.gracilis,oob_rmse,4,0.361599600925215,0.356908086741117,0.363262243597224,,0.360517861099469,0.00363707073994602 +mite,mite,north,,,Ceratozetes.gracilis,oob_spearman,4,0.42239840004233,0.418026140625421,0.430354399608879,,0.42367830723863,0.00683328419542643 +mite,mite,north,,,Ceratozetes.gracilis,oob_calibration_slope,4,0.828742319133361,0.795246397104333,0.85198634677853,,0.825080928281983,0.0310435368477248 +mite,mite,north,,,Ceratozetes.gracilis,oob_prevalence,4,0.203407429558746,0.203105380508127,0.206516438658429,,0.204409915290554,0.0022495255846381 +mite,mite,north,,,Ceratozetes.gracilis,oob_n,5,2060,820.8,2104.4,0,1663.4,930.188045504779 +mite,mite,north,,,Trhypochthonius.tectorum,insample_auc,5,0.867354183013863,0.789723998849579,0.886148463014596,0.742294572159045,0.848525978384423,0.0604347679295147 +mite,mite,north,,,Trhypochthonius.tectorum,insample_deviance_explained,5,0.273109403472257,0.167793497656307,0.304208518862147,0.101139121714597,0.249997190899475,0.0849118349689442 +mite,mite,north,,,Trhypochthonius.tectorum,insample_rmse,5,0.257701740588258,0.250995447423845,0.274832534792276,0.282703023024446,0.261161024213642,0.0130413480817983 +mite,mite,north,,,Trhypochthonius.tectorum,insample_spearman,5,0.382845553255778,0.295407942380747,0.390568326005991,0.246806765495324,0.355742401769967,0.0615633662732968 +mite,mite,north,,,Trhypochthonius.tectorum,insample_calibration_slope,5,1.3856194303939,1.30636241999063,1.40800419535306,1.41475626215778,1.3658062768331,0.0569549293081291 +mite,mite,north,,,Trhypochthonius.tectorum,insample_prevalence,5,0.0956049728593941,0.0940001763114542,0.0987931854359719,0.0956049728593941,0.0960754727002272,0.00270898671716411 +mite,mite,north,,,Trhypochthonius.tectorum,insample_n,5,3624,3599.2,4881,5711,4034.4,937.384819591186 +mite,mite,north,,,Trhypochthonius.tectorum,oob_auc,4,0.676603114720859,0.634866745696079,0.695356990903416,,0.668395081562922,0.0338214732181241 +mite,mite,north,,,Trhypochthonius.tectorum,oob_deviance_explained,4,0.0231309861017384,-0.0529304280484813,0.0499103567406328,,0.00553025627626506,0.0587729262467672 +mite,mite,north,,,Trhypochthonius.tectorum,oob_rmse,4,0.291341503027868,0.278164596549819,0.299104069124698,,0.289407810034575,0.0115193246690511 +mite,mite,north,,,Trhypochthonius.tectorum,oob_spearman,4,0.176969900115548,0.138990653953572,0.196044434112184,,0.170218217199355,0.0316270471283766 +mite,mite,north,,,Trhypochthonius.tectorum,oob_calibration_slope,4,0.629476610857704,0.457887807201834,0.706349133129125,,0.595649367506115,0.139625823980301 +mite,mite,north,,,Trhypochthonius.tectorum,oob_prevalence,4,0.0963264503316864,0.0893459374618542,0.0984905896614327,,0.0946063169245129,0.00535078906761863 +mite,mite,north,,,Trhypochthonius.tectorum,oob_n,5,2087,830,2111.8,0,1676.6,937.384819591186 +mite,mite,south,,,Ceratozetes.gracilis,insample_auc,5,0.987018688072244,0.962460358283415,0.994093598890034,0.959411982871978,0.980311871127105,0.0160901965625874 +mite,mite,south,,,Ceratozetes.gracilis,insample_deviance_explained,5,0.682759929777448,0.54954006230918,0.76565436974853,0.529264846155788,0.66420947608548,0.1070588336899 +mite,mite,south,,,Ceratozetes.gracilis,insample_rmse,5,0.141642017143814,0.11793130588194,0.164446734547083,0.166987484618412,0.141587759263564,0.0228962488424261 +mite,mite,south,,,Ceratozetes.gracilis,insample_spearman,5,0.381853981218702,0.368571860693125,0.408314331171535,0.366804257536114,0.386163450334912,0.0210178288320258 +mite,mite,south,,,Ceratozetes.gracilis,insample_calibration_slope,5,1.17635731654895,1.14143346840456,1.21905493082183,1.24357646470276,1.17743873970887,0.0415248500707109 +mite,mite,south,,,Ceratozetes.gracilis,insample_prevalence,5,0.056970509383378,0.0521775638545351,0.0622115928022082,0.0562843842573,0.0572190090351997,0.00535467847864499 +mite,mite,south,,,Ceratozetes.gracilis,insample_n,5,1494,1479.4,2024.6,2363,1667.4,389.193139713433 +mite,mite,south,,,Ceratozetes.gracilis,oob_auc,4,0.89443912075715,0.889732200205026,0.913173986479525,,0.899449101175097,0.0140376429698185 +mite,mite,south,,,Ceratozetes.gracilis,oob_deviance_explained,4,0.305485061000288,0.239288606014537,0.37199419828533,,0.305596733250035,0.0714426754944412 +mite,mite,south,,,Ceratozetes.gracilis,oob_rmse,4,0.186223778296823,0.18391106203546,0.205220035166794,,0.19218218565704,0.0137446180319799 +mite,mite,south,,,Ceratozetes.gracilis,oob_spearman,4,0.318520603871097,0.282140717397224,0.339234624931856,,0.312925651937842,0.0313023392190085 +mite,mite,south,,,Ceratozetes.gracilis,oob_calibration_slope,4,0.841179430584809,0.68438665807093,0.95811332629616,,0.826944117441049,0.148734867915711 +mite,mite,south,,,Ceratozetes.gracilis,oob_prevalence,4,0.0533392883804503,0.0452752248602848,0.0645232647455575,,0.0544535429679295,0.0107814199736608 +mite,mite,south,,,Ceratozetes.gracilis,oob_n,5,869,338.4,883.6,0,695.6,389.193139713433 +mite,mite,south,,,Trhypochthonius.tectorum,insample_auc,5,0.948149437150469,0.925004332091086,0.957126558736211,0.914916030391233,0.9433075470881,0.0173716083557048 +mite,mite,south,,,Trhypochthonius.tectorum,insample_deviance_explained,5,0.482464997001233,0.387877300984383,0.505172041987934,0.352939682757835,0.457010809562295,0.0638664982326912 +mite,mite,south,,,Trhypochthonius.tectorum,insample_rmse,5,0.206424449368147,0.204390313169795,0.224886336413872,0.231947697035794,0.212403195191201,0.0116706053600199 +mite,mite,south,,,Trhypochthonius.tectorum,insample_spearman,5,0.425909318805451,0.403776780946249,0.44371694445911,0.397329229215489,0.42459174405178,0.0198356719297497 +mite,mite,south,,,Trhypochthonius.tectorum,insample_calibration_slope,5,1.28272278366347,1.18550895844535,1.36127647271079,1.40288536179909,1.27640816970933,0.096700226618447 +mite,mite,south,,,Trhypochthonius.tectorum,insample_prevalence,5,0.0833685992382565,0.0807473443243282,0.0863035095821866,0.0833685992382565,0.083401335320589,0.00299510185415199 +mite,mite,south,,,Trhypochthonius.tectorum,insample_n,5,1489,1484.4,2017.4,2363,1664.2,390.68875079787 +mite,mite,south,,,Trhypochthonius.tectorum,oob_auc,4,0.727858780739764,0.715518870428138,0.74896682434992,,0.730990256917811,0.018291205762773 +mite,mite,south,,,Trhypochthonius.tectorum,oob_deviance_explained,4,-8.87960648587901e-05,-0.0172215524979527,0.0280832607165525,,0.0038538112023974,0.0253279422860863 +mite,mite,south,,,Trhypochthonius.tectorum,oob_rmse,4,0.273916371509924,0.272819823056722,0.277446685109854,,0.274785573348041,0.00273992261800781 +mite,mite,south,,,Trhypochthonius.tectorum,oob_spearman,4,0.220776547348642,0.20802723035924,0.233275895654832,,0.220687272818923,0.0142491076409832 +mite,mite,south,,,Trhypochthonius.tectorum,oob_calibration_slope,4,0.52882836854751,0.440258048168201,0.630817052027781,,0.533620641083568,0.108492930726246 +mite,mite,south,,,Trhypochthonius.tectorum,oob_prevalence,4,0.0842873358196854,0.0775201528145626,0.0881856815952926,,0.0832627510948584,0.00595703320150957 +mite,mite,south,,,Trhypochthonius.tectorum,oob_n,5,874,345.6,878.6,0,698.8,390.68875079787 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_auc,5,0.937599297649847,0.933732651029908,0.941737322252894,0.931214977657458,0.937733083636675,0.00453400260775217 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_deviance_explained,5,0.519287294045003,0.504499969540117,0.531079579906343,0.496002555058527,0.518187319450253,0.0151113505605461 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_rmse,5,0.314125023564981,0.308111085451721,0.319390735361298,0.322504202857685,0.31382091059043,0.00621569886165501 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_spearman,5,0.748332562768468,0.740796151260149,0.753672448408468,0.736834310219465,0.747586091965464,0.00702764835136154 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_calibration_slope,5,1.13199476635183,1.12739971260376,1.13922683008689,1.13943602876807,1.13308935819248,0.00587114511343704 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_prevalence,5,0.418242653476869,0.411391418988775,0.421189975169674,0.418242653476869,0.416870814782784,0.00501851999449775 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_n,5,4366,4320.2,5874.4,6874,4851.6,1130.83522230252 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_auc,4,0.87190261441896,0.866590445153601,0.879024014030655,,0.87254876811408,0.00689379878784026 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_deviance_explained,4,0.350138005540015,0.333712936669149,0.364314392402626,,0.349334904822781,0.0168036551132006 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_rmse,4,0.37478581306944,0.37052889187651,0.380329116493191,,0.375245235294733,0.00562107604610611 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_spearman,4,0.635602806329395,0.628052007689893,0.647314299648738,,0.637088768715053,0.0105286431542761 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_calibration_slope,4,0.958936928697371,0.945055098835756,0.984721414386241,,0.963187877207105,0.0226813215447264 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_prevalence,4,0.419241311741466,0.413108455574493,0.430771977433407,,0.421169100857526,0.00978800188867454 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_n,5,2508,999.6,2553.8,0,2022.4,1130.83522230252 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_auc,5,0.935589757842857,0.931198139311186,0.939955072765222,0.928669885197567,0.935755480214007,0.00460383983766371 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_deviance_explained,5,0.510856684393222,0.494054849222068,0.52191145465813,0.484030970750928,0.509548753049097,0.0154707189549688 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_rmse,5,0.314811213916215,0.309732334339345,0.321045419648829,0.324741983588447,0.31490944460215,0.00613097852727421 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_spearman,5,0.732669510639059,0.724619156043327,0.7381230520886,0.719908133920423,0.731907124766318,0.0074515655735294 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_calibration_slope,5,1.13878608073771,1.11845423580279,1.14507767613165,1.13878608073771,1.13297735497545,0.0135058523659789 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_prevalence,5,0.377654931626418,0.37492184315556,0.38072781584232,0.377654931626418,0.377957278345016,0.00308047552556824 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_n,5,4329,4315.8,5874,6874,4842.2,1136.06104589498 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_auc,4,0.865145971850341,0.85903618914522,0.872818410162894,,0.865704063138709,0.00741727831574323 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_deviance_explained,4,0.328961294840861,0.30879784242093,0.349077626197696,,0.328944465889755,0.0217317024450887 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_rmse,4,0.377122004729027,0.372420995562408,0.38338038457161,,0.377678208541871,0.00599437843997528 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_spearman,4,0.612433113852142,0.604033840591852,0.624935658303329,,0.613898567848891,0.0114359212635816 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_calibration_slope,4,0.957384372362836,0.921740017679305,0.970773968972915,,0.94943624447946,0.0282696036792119 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_prevalence,4,0.375247544204322,0.372430611979277,0.382966913772923,,0.376998414684163,0.00599903919350225 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_n,5,2545,1000,2558.2,0,2031.8,1136.06104589498 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_auc,5,0.987928507652934,0.980455908404938,0.989250732599663,0.980256010171059,0.985460978543082,0.00456207770363119 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_deviance_explained,5,0.758896959794746,0.70324582200889,0.770317223440547,0.697836785401464,0.741649486985086,0.0344734147295644 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_rmse,5,0.190866444623621,0.185393215094002,0.213378451096027,0.215973925593421,0.197489483231116,0.0142778273902924 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_spearman,5,0.694446022892243,0.691765983299998,0.711193415815408,0.691462681901474,0.699805784979382,0.0101255581270015 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_calibration_slope,5,1.08542977846872,1.08129593595208,1.09390636484336,1.09735250260365,1.08689669407402,0.006618758370988 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_prevalence,5,0.222088835534214,0.217190546592102,0.228625506806496,0.222054380664653,0.222881775063893,0.00607679419012681 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_n,5,1692,1666,2267.2,2648,1873.6,433.131388841769 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_auc,4,0.935203452493946,0.932112042029965,0.940043648344565,,0.935828018703459,0.00432595880799098 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_deviance_explained,4,0.497223760362555,0.478282533470732,0.510124884085561,,0.495066580659406,0.0174858649946529 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_rmse,4,0.280832951483315,0.277753868107202,0.28552164859325,,0.281407813531109,0.00426290374870152 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_spearman,4,0.620768914212728,0.61823009620924,0.636455371546245,,0.625464499687738,0.011800342651411 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_calibration_slope,4,0.924745207738268,0.892233433655132,0.947566793867581,,0.921284426326188,0.0302293473629047 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_prevalence,4,0.218666030567013,0.210018355611084,0.23207994955219,,0.220368260577459,0.0121728164316861 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_n,5,956,380.8,982,0,774.4,433.131388841769 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_auc,5,0.964989766030961,0.953973732238264,0.968674479023032,0.9569840862423,0.96215213925013,0.00742159889697569 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_deviance_explained,5,0.612250733867401,0.566505101795749,0.630497890361907,0.572523255866958,0.60095188649559,0.032067913473032 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_rmse,5,0.252533243369255,0.248705947803803,0.271141324772209,0.268895273372996,0.258411075321605,0.0114935088298203 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_spearman,5,0.704003647832294,0.693558372904758,0.720162548842767,0.698100498601086,0.706018243458387,0.0135329427473597 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_calibration_slope,5,1.1439212268239,1.14115686304828,1.15393474877826,1.1566388543954,1.14661388688165,0.00662973235816637 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_prevalence,5,0.264350453172205,0.25911663216011,0.270295509723619,0.264350453172205,0.264443478235907,0.00620048832939598 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_n,5,1685,1649.4,2266.4,2648,1865.6,437.838212128635 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_auc,4,0.874778812202748,0.872358459095117,0.877114684170805,,0.874748640367186,0.00272342158704789 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_deviance_explained,4,0.343866043427387,0.338387952722904,0.347594977366804,,0.343241344582721,0.00510089376524918 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_rmse,4,0.340381988663126,0.335961301780409,0.344292295422683,,0.340199710047712,0.00456762689154793 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_spearman,4,0.573623485003221,0.560997991791278,0.581641821132803,,0.571978071759521,0.0115514533986335 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_calibration_slope,4,0.930605398692623,0.905860741996704,0.953261009929316,,0.929859311028613,0.0269491452076172 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_prevalence,4,0.266148052343275,0.252246321440467,0.273763588267456,,0.263902982708051,0.0122396324927964 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_n,5,963,381.6,998.6,0,782.4,437.838212128635 diff --git a/README.md b/README.md index 939e6a8..99f6a25 100644 --- a/README.md +++ b/README.md @@ -230,16 +230,19 @@ name. Adding a method is adding a file; no harness code changes. | Kind | Folder | Registered | | --- | --- | --- | -| Engines: how a model is fitted | `methods/engines/` | `glm`, `bayesglm`, `gbm` (boosted regression trees) | -| Selection rules: how candidates become one result | `methods/selection/` | `single`, `aic_best`, `aic_average`, `staged_bic`, `ivw_grid`, `aic_best_grid`, `aic_best_onehot` | +| Engines: how a model is fitted | `methods/engines/` | `glm`, `bayesglm`, `xgboost` (boosted regression trees) | +| Selection rules: how candidates become one result | `methods/selection/` | `single`, `aic_best`, `aic_average`, `staged_bic`, `ivw_grid`, `hurdle` (presence, then abundance given presence; v2 mammals) | | Resampling: which units each draw fits | `methods/resampling/` | `precomputed`, `spatial_block`, `spatial_cv` | | Metrics: how a prediction is scored | `methods/metrics/` | `auc`, `deviance_explained`, `rmse`, `spearman`, `calibration_slope`, `prevalence`, `n` | A selection rule states the engine capabilities it needs (coefficients, an information criterion, standard errors), and `validate_spec()` checks them. `replace_stage_method()` swaps one stage of a v2 spec to another engine and -rule, leaving the rest v2's; `exp_001_gbm` uses it to fit the habitat -stage with boosted regression trees. `extend_models()` adds terms to every +rule, leaving the rest v2's. Each spec names its `habitat_stage`, so one +call serves every taxon, mammals included: the mammal hurdle keeps its +presence-then-abundance structure and the new engine fits both halves. +`exp_001_xgboost` uses it to fit the habitat stage with boosted regression +trees. `extend_models()` adds terms to every candidate in a model set, and `covariate_files` supplies terms the dataset does not hold; `exp_002_soilgrids` uses both to add SoilGrids soil properties to the climate stage. @@ -561,14 +564,14 @@ sdmMethodsDev/ │ ├── modules/ # one v2 spec per taxon │ │ ├── _shared/ # plant_group.R (four plant taxa); standard_specs.R │ │ ├── bryophytes/ lichens/ soil_mites/ vascular_plants/ -│ │ ├── mammals/ # spec.R, hurdle.R (v2's hurdle model) +│ │ ├── mammals/ # spec.R, hurdle.R (v2's hurdle tables) │ │ └── birds/ # spec.R, standardize.R (v2's term translation) │ ├── experiments/ │ │ ├── _shared/ # named focal-species sets │ │ ├── _template/ # copy to start an experiment │ │ ├── exp_000_parity_v2/ # run.R, 01_compare_to_v2.R, 02_plot_parity.R, │ │ │ # 03_build_report.R, utils/parity_targets.R -│ │ ├── exp_001_gbm/ # test: habitat stage fitted with gbm +│ │ ├── exp_001_xgboost/ # test: habitat stage fitted with xgboost │ │ └── exp_002_soilgrids/ # test: SoilGrids terms in the climate stage; │ │ # 01_extract_soilgrids_covariates.R, run.R │ ├── _setup/ # 01–09: build the v2 data in 0_data/; fixed diff --git a/docs/framework_design.md b/docs/framework_design.md index 312a9d4..632b208 100644 --- a/docs/framework_design.md +++ b/docs/framework_design.md @@ -89,9 +89,9 @@ requires a separate pipeline. │ ├── compare.R # compare_experiments() │ └── experiment.R # experiment_config(), run_experiment() ├── methods/ # one file per method, each self-registering -│ ├── engines/ # glm, bayesglm +│ ├── engines/ # glm, bayesglm, xgboost │ ├── selection/ # single, aic_best, aic_average, staged_bic, -│ │ # ivw_grid, aic_best_grid, aic_best_onehot +│ │ # ivw_grid, hurdle │ ├── resampling/ # precomputed, spatial_block, spatial_cv │ └── metrics/ # auc, deviance_explained, rmse, … ├── modules/ @@ -201,7 +201,7 @@ run_experiment( species = c("Aulacomnium.palustre", "Sphagnum.fuscum"), overrides = list( stages = list(climate = list(models = "climate_plus_topography")), - engine = "gbm")) + engine = "xgboost")) ``` ## Contract 2: the result object @@ -463,7 +463,10 @@ It sits on a regularization axis. A Bayesian framework comparison needs against the published v2 output, on every stage, for all three taxa. Five selection rules cover the three pipelines' different ideas of what a coefficient is: `aic_average`, `ivw_grid`, - `staged_bic`, `aic_best_grid` and `aic_best_onehot`. + `staged_bic`, and the mammal `hurdle` (2026-10-05: an + engine-agnostic rule, replacing `aic_best_grid`, + `aic_best_onehot` and the custom hurdle function; v2's + table-building is now a mammal `post_process` step). 5a. **Built (2026-10-03).** The plug-in method layer (`1_code/methods/`, the registry, `validate_spec()`, `check_engine()`); the dataset manifest and harmonized lookups @@ -473,10 +476,13 @@ It sits on a regularization axis. A Bayesian framework comparison needs experiment template and `compare_experiments()`; contract tests. Checked against the previous code at 5 draws for the 14 parity species: every stage's coefficients identical. -6. **Started (2026-10-03).** The `gbm` engine and - `replace_stage_method()`; `exp_001_gbm`, a test +6. **Started (2026-10-03).** A boosted-tree engine and + `replace_stage_method()`; `exp_001_xgboost`, a test experiment fitting the habitat stage with boosted regression - trees. `covariate_files` lets an experiment add covariates the + trees, every taxon including mammals. (The first engine, `gbm`, + was replaced by `xgboost` on 2026-10-05: gbm cannot fit the + mammal hurdle's 0-1 presence response or its Gamma + abundance.) `covariate_files` lets an experiment add covariates the frozen dataset does not hold, from its own files; `exp_002_soilgrids` adds SoilGrids at 0–5 cm from the sciSpatialR catalogue to the climate stage. Still to come: diff --git a/docs/taxon_quirks.md b/docs/taxon_quirks.md index 84da41f..4a2167f 100644 --- a/docs/taxon_quirks.md +++ b/docs/taxon_quirks.md @@ -154,7 +154,7 @@ AUC would have been silently invalid. Fixed with `as.numeric()`. | Quirk | What v2 does | Status | | --- | --- | --- | -| Hurdle structure | Binomial presence times Gamma abundance given presence, on a log link. Their product is total abundance | OK `mammal_spec(part = "hurdle")`, both halves together (hurdle.R) | +| Hurdle structure | Binomial presence times Gamma abundance given presence, on a log link. Their product is total abundance | OK, the generic `hurdle` rule fits both halves through the stage's engine; v2's table-building is the `mammal_v2_habitat_tables()` post-process step (hurdle.R) | | Lure correction | Estimated **only** from numbered ABMI grid sites, which are the ones with matched lured and unlured deployments. Applied as `sign(Count) / lure_ratio`, then rescaled to a maximum of 1 | OK | | Abundance winsorizing | Capped at the 99th percentile of abundance given presence, before fitting | OK | | Season | Separate summer and winter models, with `wt_summer` and `wt_winter` passed as `glm` weights | OK | From 60d95ae7ae26f451631d3fa127e6527107b65250 Mon Sep 17 00:00:00 2001 From: bgcasey Date: Mon, 5 Oct 2026 13:32:01 -0600 Subject: [PATCH 07/16] Refactor dataset references to use published copies - Updated comments and documentation across multiple scripts to clarify that the test dataset and v2 results are read from the published copies on ABMI-DATA2. - Introduced a new `data_source.R` file to centralize the logic for resolving dataset paths and checking their integrity. - Modified functions to utilize `test_dataset_dir()` for retrieving the dataset folder, ensuring consistency and clarity in data access. - Enhanced README and documentation to reflect changes in dataset handling and clarify the workflow for accessing datasets. --- 1_code/_setup/00_mirror_setup_inputs.R | 280 ++++++++++++++++++ 1_code/_setup/01_harmonize_model_ready_v2.R | 37 ++- 1_code/_setup/02_validate_test_dataset.R | 23 +- .../_setup/03_rerun_bryophyte_v2_reference.R | 9 +- 1_code/_setup/04_package_bird_coefficients.R | 4 + 1_code/_setup/05_harmonize_v2_results.R | 4 + .../06_harmonize_bird_translation_lookup.R | 12 +- .../07_harmonize_v2_plant_bootstrap_ids.R | 9 +- .../08_harmonize_abmiexplorer_results.R | 13 +- 1_code/_setup/10_publish_datasets.R | 212 +++++++++++++ 1_code/_setup/utils/input_paths.R | 39 +++ 1_code/experiments/_template/run.R | 2 +- 1_code/experiments/exp_000_parity_v2/run.R | 9 +- .../exp_000_parity_v2/v2_self_agreement.R | 10 +- 1_code/experiments/exp_001_xgboost/run.R | 2 +- .../01_extract_soilgrids_covariates.R | 20 +- 1_code/experiments/exp_002_soilgrids/run.R | 2 +- 1_code/harness/covariate_sets.R | 12 +- 1_code/harness/data_load.R | 24 +- 1_code/harness/data_source.R | 246 +++++++++++++++ 1_code/harness/experiment.R | 10 +- 1_code/harness/harness.R | 1 + 1_code/harness/predict_grid.R | 4 +- 1_code/harness/run_model.R | 4 +- 1_code/harness/species.R | 10 +- 1_code/methods/resampling/precomputed.R | 7 +- 1_code/modules/birds/standardize.R | 10 +- 1_code/modules/mammals/hurdle.R | 2 +- 1_code/tests/run_tests.R | 8 +- README.md | 89 +++++- docs/framework_design.md | 7 + docs/getting_started.md | 8 +- 32 files changed, 1005 insertions(+), 124 deletions(-) create mode 100644 1_code/_setup/00_mirror_setup_inputs.R create mode 100644 1_code/_setup/10_publish_datasets.R create mode 100644 1_code/_setup/utils/input_paths.R create mode 100644 1_code/harness/data_source.R diff --git a/1_code/_setup/00_mirror_setup_inputs.R b/1_code/_setup/00_mirror_setup_inputs.R new file mode 100644 index 0000000..e820b2f --- /dev/null +++ b/1_code/_setup/00_mirror_setup_inputs.R @@ -0,0 +1,280 @@ +# --- +# title: Mirror the _setup Inputs onto ABMI-DATA2 +# author: Brendan Casey +# created: 2026-10-05 +# inputs: +# the original locations of every external file _setup/ reads, +# listed in section 1.3: +# - //ABMI-DATA2/science/sc/sdmMethodsDev/0_data/ +# data_snapshots/model_ready_v2/ +# - //ABMI-DATA2/science/sc/AB_data_v2023/sites/processed/ +# climate/ +# - //ABMI-DATA2/science/sc/ToEmily/VegetationModels/ +# - the work_abmi, BirdModels and ABMI Mammals Google drives +# outputs: +# in //ABMI-DATA2/science/sdmMethodsDev/0_data/setup_inputs/ +# (SDM_SETUP_INPUT_ROOT overrides it): +# - /..., byte-for-byte copies, under each source's +# own relative paths +# - inputs_manifest.csv: per file, the original path, the +# mirror path, bytes, md5, source modification time and +# the date it was copied +# - README.md: what the folder is and the rules for it +# notes: +# - Makes _setup/ runnable by anyone with access to ABMI-DATA2. +# The _setup/ scripts read the mirror by default (through +# utils/input_paths.R); their SDM_* variables still point +# them back at the originals. +# - Read-only with respect to the originals: nothing is moved, +# renamed or deleted at the source. +# - Never overwrites the mirror. A file already mirrored is +# checked by md5 and skipped; if its source has changed since, +# the script stops and says so. Re-mirroring a changed source +# is a deliberate step: move the old copy aside first. +# - Each file is copied to a .partial name, checked by md5, and +# only then renamed, so a reader never sees a half copy. +# - Not mirrored, deliberately: +# - _setup/04 and 05's inputs (the bird coefficient CSVs and +# model objects, COEFS.RData, the mammal coefficient +# tables). With the ABMIexploreR reference used for parity, +# 04 and 05 are not re-run; their output, 0_data/ +# v2_results/, is published frozen by 10_publish_datasets.R. +# - _setup/08's species-coefs.RData, which 08 downloads from +# the public ABMIexploreR repository at a pinned commit. +# - 0_data/v2_scripts/, which is tracked in git. +# - Run from the repository root, once, by someone who can +# reach every source. Google Drive reads are serial: its +# mount refuses concurrent reads. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +library(data.table) # manifest reading and writing (version: 1.16.4) + +## 1.2 Resolve the mirror ---- +project_root <- normalizePath(getwd(), winslash = "/") +helper <- file.path(project_root, "1_code/_setup/utils/input_paths.R") + +if (!file.exists(helper)) { + stop("Run this from the repository root.", call. = FALSE) +} + +source(helper) + +manifest_path <- setup_input("inputs_manifest.csv") + +## 1.3 The inventory ---- +# One entry per source: where it lives, and the paths below it +# that _setup/ reads. A path that is a folder is copied whole. +# The mirror keeps each path below a folder named for the source, +# so the scripts' roots (SDM_V2_PROJECT and the like) carry over. +sources <- list( + model_ready_v2 = list( + from = paste0( + "//ABMI-DATA2/science/sc/sdmMethodsDev/0_data/", + "data_snapshots/model_ready_v2" + ), + paths = "." + ), + ab_data_v2023 = list( + from = paste0( + "//ABMI-DATA2/science/sc/AB_data_v2023/sites/processed/", + "climate" + ), + paths = "abmi-camera-climate_2023.Rdata" + ), + vegetation_models = list( + from = "//ABMI-DATA2/science/sc/ToEmily/VegetationModels", + paths = c( + "0_data/lookup/prediction-matrix", + "0_data/species/processed/bryophyte-model-data.Rdata", + "0_data/bootstrap/bryophyte-bootstrap-ids.Rdata", + "0_data/bootstrap/lichen-bootstrap-ids.Rdata", + "0_data/bootstrap/mite-bootstrap-ids.Rdata", + "0_data/bootstrap/vascular-plant-bootstrap-ids.Rdata" + ) + ), + birds_data_v2 = list( + from = paste0( + "G:/Shared drives/work_abmi/1_projects/active/", + "sdmMethodsDev/remote/birds_data_v2" + ), + paths = "Stratified.Rdata" + ), + bird_models = list( + from = paste0( + "G:/.shortcut-targets-by-id/", + "17Ymt13eHfKvIiuoMl6x-Kn74Z2uVbbzS/BirdModels" + ), + paths = c( + "Data/lookups/Xn-veg-v2024.Rdata", + "Data/lookups/birdlist.csv" + ) + ), + abmi_mammals = list( + from = "G:/Shared drives/ABMI Mammals", + paths = c( + paste0( + "Results/Habitat Modeling/2024/Climate/Predictions/", + "All Species Climate Predictions.csv" + ), + "Data/Lookup Tables/WildTrax Species Strings.RData" + ) + ) +) + +# 2. List the files ---- +# Expands folders into their files, and stops before copying +# anything if a source cannot be reached, so a partial mirror is +# never mistaken for a complete one. + +## 2.1 Expand each source ---- +files <- rbindlist(lapply(names(sources), function(name) { + src <- sources[[name]] + + rel <- unlist(lapply(src$paths, function(path) { + full <- file.path(src$from, path) + + if (dir.exists(full)) { + inside <- list.files(full, recursive = TRUE) + if (path == ".") inside else file.path(path, inside) + } else { + path + } + })) + + data.table( + source = name, + from = file.path(src$from, rel), + to = file.path(name, rel) + ) +})) + +## 2.2 Check every source is reachable ---- +missing <- files$from[!file.exists(files$from)] + +if (length(missing) > 0) { + stop( + "Source file(s) not found:\n ", + paste(missing, collapse = "\n "), + call. = FALSE + ) +} + +cat( + nrow(files), " files, ", + round(sum(file.size(files$from)) / 1e9, 2), " GB, from ", + length(sources), " sources\n", + sep = "" +) + +# 3. Copy ---- +# Serial, one file at a time. Each is hashed at the source, +# copied to a .partial name, re-hashed, and renamed into place. + +## 3.1 The previous manifest, to keep first-copy dates ---- +previous <- if (file.exists(manifest_path)) { + fread(manifest_path, colClasses = "character") +} else { + NULL +} + +## 3.2 Copy each file ---- +rows <- vector("list", nrow(files)) + +for (i in seq_len(nrow(files))) { + from <- files$from[i] + to <- setup_input(files$to[i]) + source_md5 <- unname(tools::md5sum(from)) + + if (file.exists(to)) { + # Already mirrored: the copy must still match its source + if (!identical(unname(tools::md5sum(to)), source_md5)) { + stop( + "The source has changed since it was mirrored:\n ", + from, "\nThe mirror is never overwritten. Move\n ", to, + "\naside first if the new version should replace it.", + call. = FALSE + ) + } + + copied <- if (is.null(previous)) { + NA_character_ + } else { + previous$copied[match(files$to[i], previous$path)] + } + status <- "present" + } else { + dir.create(dirname(to), recursive = TRUE, showWarnings = FALSE) + partial <- paste0(to, ".partial") + + if (!file.copy(from, partial, overwrite = TRUE, + copy.date = TRUE)) { + stop("Copy failed:\n ", from, call. = FALSE) + } + + if (!identical(unname(tools::md5sum(partial)), source_md5)) { + unlink(partial) + stop("md5 mismatch after copying:\n ", from, call. = FALSE) + } + + if (!file.rename(partial, to)) { + stop("Could not rename into place:\n ", to, call. = FALSE) + } + + copied <- NA_character_ + status <- "copied" + } + + rows[[i]] <- data.table( + source = files$source[i], + path = files$to[i], + original = from, + bytes = file.size(from), + md5 = source_md5, + source_modified = format( + file.mtime(from), "%Y-%m-%d %H:%M:%S" + ), + copied = if (is.na(copied)) format(Sys.Date()) else copied + ) + + cat(sprintf("[%d/%d] %s %s\n", i, nrow(files), status, files$to[i])) +} + +# 4. Record ---- + +## 4.1 The manifest ---- +# Rows for files no longer in the inventory are kept: the copies +# are still in the mirror, and the manifest is their provenance. +manifest <- rbindlist(rows) + +if (!is.null(previous)) { + kept <- previous[!path %in% manifest$path] + manifest <- rbind(manifest, kept, fill = TRUE) +} + +setorder(manifest, source, path) +fwrite(manifest, manifest_path) + +## 4.2 The README ---- +writeLines(c( + "# _setup inputs for sdmMethodsDev", + "", + "Byte-for-byte copies of every external file that", + "`1_code/_setup/` in the sdmMethodsDev repository reads, so", + "anyone with access to this share can rebuild the test", + "dataset. Written by `1_code/_setup/00_mirror_setup_inputs.R`.", + "", + "- Do not edit, rename or delete anything here. The _setup", + " scripts read these paths by default.", + "- `inputs_manifest.csv` gives each file's original location,", + " size, md5 and the date it was copied.", + "- The originals were left in place; the manifest names them.", + "- 04 and 05's inputs are not here: their output,", + " `v2_results/`, is published frozen under `../v2_results/`." +), setup_input("README.md")) + +cat("\nWrote", manifest_path, "\n") + +# End of script ---- diff --git a/1_code/_setup/01_harmonize_model_ready_v2.R b/1_code/_setup/01_harmonize_model_ready_v2.R index 018db80..3e229f7 100644 --- a/1_code/_setup/01_harmonize_model_ready_v2.R +++ b/1_code/_setup/01_harmonize_model_ready_v2.R @@ -3,6 +3,10 @@ # author: Brendan Casey # created: 2026-09-05 # inputs: +# Read from the input mirror on ABMI-DATA2 (utils/ +# input_paths.R; 00_mirror_setup_inputs.R made it). The +# locations below are the originals, which the SDM_* variables +# can point back to. # from 0_data/data_snapshots/model_ready_v2/ on ABMI-DATA2: # - vascular-plant-model-data.Rdata # - bryophyte-model-data.Rdata @@ -154,13 +158,13 @@ library(data.table) ## 1.2 Configure paths ---- project_root <- normalizePath(getwd(), winslash = "/") +# The _setup inputs mirrored on ABMI-DATA2 (setup_input()) +source(file.path(project_root, "1_code/_setup/utils/input_paths.R")) + # Directory containing the v2 model ready snapshot files on ABMI-DATA2 snapshot_dir <- Sys.getenv( "SDM_SNAPSHOT_V2", - unset = paste0( - "//ABMI-DATA2/science/sc/sdmMethodsDev/0_data/", - "data_snapshots/model_ready_v2" - ) + unset = setup_input("model_ready_v2") ) # Output is the frozen test dataset itself, so it lands in @@ -370,9 +374,8 @@ mammal_climate_cols <- c( # four of the nine v2 climate models need. mammal_camera_climate_file <- Sys.getenv( "SDM_MAMMAL_CAMERA_CLIMATE", - unset = paste0( - "//ABMI-DATA2/science/sc/AB_data_v2023/sites/processed/", - "climate/abmi-camera-climate_2023.Rdata" + unset = setup_input( + "ab_data_v2023", "abmi-camera-climate_2023.Rdata" ) ) @@ -398,9 +401,9 @@ mammal_camera_climate_cols <- c( # pipeline, so it is copied in rather than derived here. mammal_climate_pred_file <- Sys.getenv( "SDM_MAMMAL_CLIMATE_PRED", - unset = paste0( - "G:/Shared drives/ABMI Mammals/Results/Habitat Modeling/", - "2024/Climate/Predictions/", + unset = setup_input( + "abmi_mammals", + "Results/Habitat Modeling/2024/Climate/Predictions", "All Species Climate Predictions.csv" ) ) @@ -422,9 +425,8 @@ mammal_climate_pred_file <- Sys.getenv( # models. v2_lookup_dir <- Sys.getenv( "SDM_V2_LOOKUP", - unset = paste0( - "//ABMI-DATA2/science/sc/ToEmily/VegetationModels/", - "0_data/lookup/prediction-matrix" + unset = setup_input( + "vegetation_models", "0_data/lookup/prediction-matrix" ) ) @@ -437,8 +439,8 @@ v2_lookup_files <- c( # The naming authority for mammal species. wt_species_file <- Sys.getenv( "SDM_WT_SPECIES", - unset = paste0( - "G:/Shared drives/ABMI Mammals/Data/Lookup Tables/", + unset = setup_input( + "abmi_mammals", "Data/Lookup Tables", "WildTrax Species Strings.RData" ) ) @@ -461,10 +463,7 @@ wt_species_file <- Sys.getenv( # below writes to it. bird_data_file <- Sys.getenv( "SDM_BIRD_DATA", - unset = paste0( - "G:/Shared drives/work_abmi/1_projects/active/", - "sdmMethodsDev/remote/birds_data_v2/Stratified.Rdata" - ) + unset = setup_input("birds_data_v2", "Stratified.Rdata") ) ## 1.11 Name the bird covariate blocks ---- diff --git a/1_code/_setup/02_validate_test_dataset.R b/1_code/_setup/02_validate_test_dataset.R index 1e45973..79f633b 100644 --- a/1_code/_setup/02_validate_test_dataset.R +++ b/1_code/_setup/02_validate_test_dataset.R @@ -3,6 +3,10 @@ # author: Brendan Casey # created: 2026-09-08 # inputs: +# Read from the input mirror on ABMI-DATA2 (utils/ +# input_paths.R; 00_mirror_setup_inputs.R made it). The +# locations below are the originals, which the SDM_* variables +# can point back to. # in 0_data/test_dataset/, written by # _setup/01_harmonize_model_ready_v2.R: # - sites.csv @@ -62,6 +66,9 @@ library(data.table) ## 1.2 Configure paths ---- +# The _setup inputs mirrored on ABMI-DATA2 (setup_input()) +source(file.path(getwd(), "1_code/_setup/utils/input_paths.R")) + # data_dir holds the harmonized CSVs; snapshot_dir holds the # read-only sources they were built from. data_dir <- file.path( @@ -71,10 +78,7 @@ data_dir <- file.path( snapshot_dir <- Sys.getenv( "SDM_SNAPSHOT_V2", - unset = paste0( - "//ABMI-DATA2/science/sc/sdmMethodsDev/0_data/", - "data_snapshots/model_ready_v2" - ) + unset = setup_input("model_ready_v2") ) taxa <- c( @@ -90,10 +94,7 @@ taxa <- c( # were fitted on, not the BirdModels drive's rebuilt one. bird_data_file <- Sys.getenv( "SDM_BIRD_DATA", - unset = paste0( - "G:/Shared drives/work_abmi/1_projects/active/", - "sdmMethodsDev/remote/birds_data_v2/Stratified.Rdata" - ) + unset = setup_input("birds_data_v2", "Stratified.Rdata") ) ## 1.3 Read the harmonized CSVs ---- @@ -338,9 +339,9 @@ plant_files <- c( # The mammal climate offset, produced outside this repository. mammal_climate_pred_file <- Sys.getenv( "SDM_MAMMAL_CLIMATE_PRED", - unset = paste0( - "G:/Shared drives/ABMI Mammals/Results/Habitat Modeling/", - "2024/Climate/Predictions/", + unset = setup_input( + "abmi_mammals", + "Results/Habitat Modeling/2024/Climate/Predictions", "All Species Climate Predictions.csv" ) ) diff --git a/1_code/_setup/03_rerun_bryophyte_v2_reference.R b/1_code/_setup/03_rerun_bryophyte_v2_reference.R index cdbd374..9d61a53 100644 --- a/1_code/_setup/03_rerun_bryophyte_v2_reference.R +++ b/1_code/_setup/03_rerun_bryophyte_v2_reference.R @@ -3,6 +3,10 @@ # author: Brendan Casey # created: 2026-09-10 # inputs: +# Read from the input mirror on ABMI-DATA2 (utils/ +# input_paths.R; 00_mirror_setup_inputs.R made it). The +# locations below are the originals, which the SDM_* variables +# can point back to. # in the v2 project (SDM_V2_PROJECT): # - 0_data/species/processed/bryophyte-model-data.Rdata # - 0_data/bootstrap/bryophyte-bootstrap-ids.Rdata @@ -49,9 +53,12 @@ library(parallel) # bootstrap-level parallelism (version: 4.5.0) ## 1.2 Configure ---- project_root <- normalizePath(getwd(), winslash = "/") +# The _setup inputs mirrored on ABMI-DATA2 (setup_input()) +source(file.path(project_root, "1_code/_setup/utils/input_paths.R")) + v2_project <- Sys.getenv( "SDM_V2_PROJECT", - unset = "//ABMI-DATA2/science/sc/ToEmily/VegetationModels" + unset = setup_input("vegetation_models") ) out_dir <- file.path(project_root, "2_pipeline/v2_reference") diff --git a/1_code/_setup/04_package_bird_coefficients.R b/1_code/_setup/04_package_bird_coefficients.R index a8382cf..60cf2c5 100644 --- a/1_code/_setup/04_package_bird_coefficients.R +++ b/1_code/_setup/04_package_bird_coefficients.R @@ -18,6 +18,10 @@ # in 2_pipeline/v2_reference/: # - Birds2024.RData # notes: +# - Legacy: not re-run. Parity is scored against the +# ABMIexploreR reference (08). Its output is published frozen +# with 0_data/v2_results/ by 10_publish_datasets.R, and its +# inputs are not mirrored to ABMI-DATA2. # - A clone of 0_data/v2_scripts/birds/08.PackageCoefficients.R, # the v2 step that turns per-draw coefficient csvs into the # packaged `birds` object. Only the plumbing is changed: diff --git a/1_code/_setup/05_harmonize_v2_results.R b/1_code/_setup/05_harmonize_v2_results.R index 4745460..648f9cf 100644 --- a/1_code/_setup/05_harmonize_v2_results.R +++ b/1_code/_setup/05_harmonize_v2_results.R @@ -21,6 +21,10 @@ # - 0_data/v2_results/v2_results.csv # - 0_data/v2_results/v2_results_coverage.csv # notes: +# - Legacy: not re-run. Parity is scored against the +# ABMIexploreR reference (08). Its output is published frozen +# with 0_data/v2_results/ by 10_publish_datasets.R, and its +# inputs are not mirrored to ABMI-DATA2. # - One long table of the published v2 results, so that a run # in 3_output/exp_000_parity_v2/ can be scored against a # single file rather than against three storage formats on diff --git a/1_code/_setup/06_harmonize_bird_translation_lookup.R b/1_code/_setup/06_harmonize_bird_translation_lookup.R index 30a9813..8c3a0af 100644 --- a/1_code/_setup/06_harmonize_bird_translation_lookup.R +++ b/1_code/_setup/06_harmonize_bird_translation_lookup.R @@ -3,6 +3,10 @@ # author: Brendan Casey # created: 2026-09-29 # inputs: +# Read from the input mirror on ABMI-DATA2 (utils/ +# input_paths.R; 00_mirror_setup_inputs.R made it). The +# locations below are the originals, which the SDM_* variables +# can point back to. # in the BirdModels project (SDM_V2_BIRD_ROOT): # - Data/lookups/Xn-veg-v2024.Rdata # outputs: @@ -40,12 +44,12 @@ library(data.table) # CSV writing (version: 1.16.4) ## 1.2 Resolve paths ---- project_root <- normalizePath(getwd(), winslash = "/") +# The _setup inputs mirrored on ABMI-DATA2 (setup_input()) +source(file.path(project_root, "1_code/_setup/utils/input_paths.R")) + v2_bird_root <- Sys.getenv( "SDM_V2_BIRD_ROOT", - unset = paste0( - "G:/.shortcut-targets-by-id/", - "17Ymt13eHfKvIiuoMl6x-Kn74Z2uVbbzS/BirdModels" - ) + unset = setup_input("bird_models") ) source_path <- file.path( diff --git a/1_code/_setup/07_harmonize_v2_plant_bootstrap_ids.R b/1_code/_setup/07_harmonize_v2_plant_bootstrap_ids.R index 3866d54..46dae7a 100644 --- a/1_code/_setup/07_harmonize_v2_plant_bootstrap_ids.R +++ b/1_code/_setup/07_harmonize_v2_plant_bootstrap_ids.R @@ -3,6 +3,10 @@ # author: Brendan Casey # created: 2026-09-29 # inputs: +# Read from the input mirror on ABMI-DATA2 (utils/ +# input_paths.R; 00_mirror_setup_inputs.R made it). The +# locations below are the originals, which the SDM_* variables +# can point back to. # in the v2 plant project (SDM_V2_PROJECT): # - 0_data/bootstrap/lichen-bootstrap-ids.Rdata # - 0_data/bootstrap/mite-bootstrap-ids.Rdata @@ -44,9 +48,12 @@ library(data.table) # reading sites.csv (version: 1.16.4) ## 1.2 Resolve paths ---- project_root <- normalizePath(getwd(), winslash = "/") +# The _setup inputs mirrored on ABMI-DATA2 (setup_input()) +source(file.path(project_root, "1_code/_setup/utils/input_paths.R")) + v2_project <- Sys.getenv( "SDM_V2_PROJECT", - unset = "//ABMI-DATA2/science/sc/ToEmily/VegetationModels" + unset = setup_input("vegetation_models") ) sources <- c( diff --git a/1_code/_setup/08_harmonize_abmiexplorer_results.R b/1_code/_setup/08_harmonize_abmiexplorer_results.R index 296081f..d515d2d 100644 --- a/1_code/_setup/08_harmonize_abmiexplorer_results.R +++ b/1_code/_setup/08_harmonize_abmiexplorer_results.R @@ -4,6 +4,10 @@ # author: Brendan Casey # created: 2026-10-02 # inputs: +# Read from the input mirror on ABMI-DATA2 (utils/ +# input_paths.R; 00_mirror_setup_inputs.R made it). The +# locations below are the originals, which the SDM_* variables +# can point back to. # - data/species-coefs.RData from the ABbiodiversity/ABMIexploreR # GitHub repository, at the commit pinned in section 1.2 # - Data/lookups/birdlist.csv on the BirdModels drive, for the @@ -95,14 +99,15 @@ explorer_file <- "data/species-coefs.RData" ## 1.3 Resolve the other locations ---- project_root <- normalizePath(getwd(), winslash = "/") +# The _setup inputs mirrored on ABMI-DATA2 (setup_input()) +source(file.path(project_root, "1_code/_setup/utils/input_paths.R")) + # The same lookup v2's 08.PackageCoefficients.R uses to turn # bird codes into the names the package carries. bird_lookup_path <- Sys.getenv( "SDM_V2_BIRD_LOOKUP", - unset = paste0( - "G:/.shortcut-targets-by-id/", - "17Ymt13eHfKvIiuoMl6x-Kn74Z2uVbbzS/BirdModels/", - "Data/lookups/birdlist.csv" + unset = setup_input( + "bird_models", "Data/lookups/birdlist.csv" ) ) diff --git a/1_code/_setup/10_publish_datasets.R b/1_code/_setup/10_publish_datasets.R new file mode 100644 index 0000000..c8aeea0 --- /dev/null +++ b/1_code/_setup/10_publish_datasets.R @@ -0,0 +1,212 @@ +# --- +# title: Publish the Test Dataset and v2 Results to ABMI-DATA2 +# author: Brendan Casey +# created: 2026-10-05 +# inputs: +# - 0_data/test_dataset/, from _setup/01-09, checked by 02 +# - 0_data/v2_results/, from _setup/05 (top level, the "drives" +# reference) and 08 (abmiexplorer/) +# outputs: +# in //ABMI-DATA2/science/sdmMethodsDev/0_data/ (SDM_SHARE_ROOT +# overrides it), for each dataset: +# - //, a copy of the local folder +# - //checksums.csv: path, bytes, md5 +# - //publish_record.md: when, by whom, from +# which commit +# notes: +# - Experiments, tests and downstream scripts read these +# published copies (1_code/harness/data_source.R), so only +# whoever rebuilds the data runs _setup/. +# - A published version is never overwritten. The script stops +# if / exists; a rebuilt dataset is published as a +# new version and data_source.R's pin is moved to it. +# - Files go to .partial/ first, are re-hashed there +# against the local md5s, and only then is the folder renamed +# to /, so a reader never sees a half copy. +# - SDM_DATASET_VERSION sets the version (default: today's +# date, YYYY-MM-DD). SDM_PUBLISH picks the datasets, +# comma-separated (default: test_dataset,v2_results). +# - Run 02_validate_test_dataset.R first. It is not run from +# here because it re-reads every source. +# - Run from the repository root. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +library(data.table) # checksums writing (version: 1.16.4) + +## 1.2 Resolve paths and settings ---- +project_root <- normalizePath(getwd(), winslash = "/") +resolver <- file.path(project_root, "1_code/harness/data_source.R") + +if (!file.exists(resolver)) { + stop("Run this from the repository root.", call. = FALSE) +} + +# For the share root and each dataset's marker file +source(resolver) + +share_root <- Sys.getenv( + "SDM_SHARE_ROOT", + unset = sdm_published$root +) + +version <- Sys.getenv( + "SDM_DATASET_VERSION", + unset = format(Sys.Date()) +) + +datasets <- trimws(strsplit( + Sys.getenv("SDM_PUBLISH", unset = "test_dataset,v2_results"), + "," +)[[1]]) + +if (!grepl("^[0-9]{4}-[0-9]{2}-[0-9]{2}$", version)) { + stop( + "SDM_DATASET_VERSION must be a date, YYYY-MM-DD.", + call. = FALSE + ) +} + +unknown <- setdiff(datasets, names(sdm_published$versions)) + +if (length(unknown) > 0) { + stop("Unknown dataset(s): ", paste(unknown, collapse = ", "), + call. = FALSE) +} + +## 1.3 The commit the data was built with ---- +git_commit <- tryCatch( + system2("git", c("rev-parse", "HEAD"), stdout = TRUE), + error = function(e) "unknown" +) + +git_dirty <- tryCatch( + length(system2("git", c("status", "--porcelain"), + stdout = TRUE)) > 0, + error = function(e) NA +) + +# 2. publish_dataset() ---- + +#' Copy One Local Dataset to the Share as a New Version +#' +#' @param name Character. A dataset under 0_data/, such as +#' "test_dataset". +#' @param version Character. The version folder to create. +#' @return Character. The published folder, invisibly. +#' +#' @example # Example usage of the function +#' # publish_dataset("v2_results", "2026-10-05") +publish_dataset <- function(name, version) { + # Step 1: The local copy, complete enough to be the dataset + local_dir <- file.path(project_root, "0_data", name) + marker <- sdm_published$marker[[name]] + + if (!file.exists(file.path(local_dir, marker))) { + stop("No ", marker, " in ", local_dir, call. = FALSE) + } + + # Step 2: A new version, never an existing or half-made one + target <- file.path(share_root, name, version) + partial <- paste0(target, ".partial") + + if (dir.exists(target)) { + stop( + "Already published, and never overwritten:\n ", target, + "\nSet SDM_DATASET_VERSION to publish a new version.", + call. = FALSE + ) + } + + if (dir.exists(partial)) { + stop( + "A previous publish did not finish:\n ", partial, + "\nDelete it, then run this again.", + call. = FALSE + ) + } + + # Step 3: The files and their md5s + rel <- list.files(local_dir, recursive = TRUE, all.files = TRUE) + rel <- rel[basename(rel) != ".gitkeep"] + sums <- data.table( + path = rel, + bytes = file.size(file.path(local_dir, rel)), + md5 = unname(tools::md5sum(file.path(local_dir, rel))) + ) + + cat( + name, ": ", nrow(sums), " files, ", + round(sum(sums$bytes) / 1e9, 2), " GB -> ", target, "\n", + sep = "" + ) + + # Step 4: Copy into the partial folder + for (i in seq_len(nrow(sums))) { + to <- file.path(partial, sums$path[i]) + dir.create(dirname(to), recursive = TRUE, showWarnings = FALSE) + + if (!file.copy(file.path(local_dir, sums$path[i]), to, + copy.date = TRUE)) { + stop("Copy failed: ", sums$path[i], call. = FALSE) + } + + cat(sprintf(" [%d/%d] %s\n", i, nrow(sums), sums$path[i])) + } + + # Step 5: Re-hash the share copy before it is made visible + copied <- unname(tools::md5sum(file.path(partial, sums$path))) + bad <- is.na(copied) | copied != sums$md5 + + if (any(bad)) { + stop( + "md5 mismatch on the share; ", partial, " left for ", + "inspection:\n ", paste(sums$path[bad], collapse = "\n "), + call. = FALSE + ) + } + + # Step 6: Checksums and the record, then make it visible + fwrite(sums, file.path(partial, "checksums.csv")) + + writeLines(c( + paste0("# ", name, " ", version), + "", + paste0("- Published: ", format(Sys.time(), "%Y-%m-%d %H:%M")), + paste0("- By: ", Sys.info()[["user"]]), + paste0("- From: ", local_dir), + paste0( + "- Commit: ", git_commit, + if (isTRUE(git_dirty)) " (with uncommitted changes)" else "" + ), + paste0("- Files: ", nrow(sums), ", ", + round(sum(sums$bytes) / 1e6, 1), " MB"), + paste0("- R: ", R.version.string), + "", + "Built by 1_code/_setup/ in the sdmMethodsDev repository and", + "published by 1_code/_setup/10_publish_datasets.R. Never", + "edited after publishing; checksums.csv lists every file." + ), file.path(partial, "publish_record.md")) + + if (!file.rename(partial, target)) { + stop("Could not rename ", partial, " to ", target, call. = FALSE) + } + + invisible(target) +} + +# 3. Publish ---- +published <- vapply( + datasets, publish_dataset, character(1), version = version +) + +cat( + "\nPublished:\n ", paste(published, collapse = "\n "), + "\n\nTo use them, set sdm_published$versions in ", + "1_code/harness/data_source.R to \"", version, "\".\n", + sep = "" +) + +# End of script ---- diff --git a/1_code/_setup/utils/input_paths.R b/1_code/_setup/utils/input_paths.R new file mode 100644 index 0000000..8d42d0e --- /dev/null +++ b/1_code/_setup/utils/input_paths.R @@ -0,0 +1,39 @@ +# --- +# title: Locate the _setup Inputs on ABMI-DATA2 +# author: Brendan Casey +# created: 2026-10-05 +# inputs: none +# outputs: none; defines setup_input_root and setup_input() +# notes: +# - Every external file _setup/ reads is mirrored, unchanged, +# under //ABMI-DATA2/science/sdmMethodsDev/0_data/ +# setup_inputs/ by 00_mirror_setup_inputs.R, so _setup/ can be +# run by anyone with access to that share. The originals stay +# where they were; 00_mirror_setup_inputs.R lists them and +# setup_inputs/inputs_manifest.csv records each copy. +# - The scripts' own SDM_* environment variables still override +# each path, so a source can be read from its original +# location. SDM_SETUP_INPUT_ROOT moves the whole mirror. +# --- + +# 1. The mirror root ---- +setup_input_root <- Sys.getenv( + "SDM_SETUP_INPUT_ROOT", + unset = "//ABMI-DATA2/science/sdmMethodsDev/0_data/setup_inputs" +) + +# 2. setup_input() ---- + +#' Build a Path Inside the _setup Input Mirror +#' +#' @param ... Character. Path components below the mirror root, +#' starting with the source folder (for example "bird_models"). +#' @return Character. The full path. +#' +#' @example # Example usage of the function +#' # setup_input("bird_models", "Data", "lookups", "birdlist.csv") +setup_input <- function(...) { + file.path(setup_input_root, ...) +} + +# End of script ---- diff --git a/1_code/experiments/_template/run.R b/1_code/experiments/_template/run.R index ecb698f..112b1ef 100644 --- a/1_code/experiments/_template/run.R +++ b/1_code/experiments/_template/run.R @@ -3,7 +3,7 @@ # author: [Your Name] # created: [YYYY-MM-DD] # inputs: -# - 0_data/test_dataset/ +# - the published test dataset (harness/data_source.R) # - 3_output/exp_000_parity_v2/tables/, the v2 baseline # outputs: # in 2_pipeline/exp_NNN_short_description/: diff --git a/1_code/experiments/exp_000_parity_v2/run.R b/1_code/experiments/exp_000_parity_v2/run.R index e06f7f8..eff148c 100644 --- a/1_code/experiments/exp_000_parity_v2/run.R +++ b/1_code/experiments/exp_000_parity_v2/run.R @@ -3,8 +3,9 @@ # author: Brendan Casey # created: 2026-09-09 # inputs: -# - 0_data/test_dataset/ -# - 0_data/v2_results/, the v2 reference (section 1.3) +# - the published test dataset (harness/data_source.R) +# - the published v2 results, the v2 reference (section 1.3; +# see harness/data_source.R) # - the framework: 1_code/harness/, methods/, modules/ # outputs: # in 2_pipeline/exp_000_parity_v2/: @@ -102,9 +103,7 @@ config <- experiment_config( config$v2_reference <- "abmiexplorer" config$v2_reference_dir <- file.path( - config$project_root, - "0_data", - "v2_results", + v2_results_dir(), switch( config$v2_reference, abmiexplorer = "abmiexplorer", diff --git a/1_code/experiments/exp_000_parity_v2/v2_self_agreement.R b/1_code/experiments/exp_000_parity_v2/v2_self_agreement.R index 51359a1..3a17a21 100644 --- a/1_code/experiments/exp_000_parity_v2/v2_self_agreement.R +++ b/1_code/experiments/exp_000_parity_v2/v2_self_agreement.R @@ -5,8 +5,9 @@ # inputs: # - 2_pipeline/v2_reference/bryophyte-species-models.Rdata, # from 1_code/_setup/03_rerun_bryophyte_v2_reference.R -# - 0_data/v2_results/v2_results.csv, the bryophyte climate -# rows, which come from v2's COEFS.RData +# - v2_results.csv from the published v2 results (see +# 1_code/harness/data_source.R), the bryophyte climate rows, +# which come from v2's COEFS.RData # outputs: # in 3_output/exp_000_parity_v2/tables/: # - v2_self_agreement.csv, per species and term @@ -59,9 +60,8 @@ rerun_path <- file.path( project_root, "2_pipeline", "v2_reference", "bryophyte-species-models.Rdata" ) -results_path <- file.path( - project_root, "0_data", "v2_results", "v2_results.csv" -) +source(file.path(project_root, "1_code/harness/data_source.R")) +results_path <- file.path(v2_results_dir(), "v2_results.csv") tables_dir <- file.path( project_root, "3_output", "exp_000_parity_v2", "tables" ) diff --git a/1_code/experiments/exp_001_xgboost/run.R b/1_code/experiments/exp_001_xgboost/run.R index 2980338..6abb482 100644 --- a/1_code/experiments/exp_001_xgboost/run.R +++ b/1_code/experiments/exp_001_xgboost/run.R @@ -3,7 +3,7 @@ # author: Brendan Casey # created: 2026-10-03 # inputs: -# - 0_data/test_dataset/ +# - the published test dataset (harness/data_source.R) # - 3_output/exp_000_parity_v2/tables/, the v2 baseline # outputs: # in 2_pipeline/exp_001_xgboost/: diff --git a/1_code/experiments/exp_002_soilgrids/01_extract_soilgrids_covariates.R b/1_code/experiments/exp_002_soilgrids/01_extract_soilgrids_covariates.R index d471b25..0f84066 100644 --- a/1_code/experiments/exp_002_soilgrids/01_extract_soilgrids_covariates.R +++ b/1_code/experiments/exp_002_soilgrids/01_extract_soilgrids_covariates.R @@ -6,7 +6,8 @@ # - SoilGrids 2.0, ABMI 1 km variant, from the sciSpatialR # catalogue (geoscientificInformation/soilgrids_250_v2_ab/ # abmi1km), on //ABMI-DATA2; SDM_SOILGRIDS overrides the path -# - 0_data/test_dataset/sites.csv, read only +# - sites.csv from the published test dataset (see +# 1_code/harness/data_source.R), read only # outputs: # in 2_pipeline/exp_002_soilgrids/inputs/: # - soilgrids_0_5cm.csv: survey_unit_id plus ten @@ -14,7 +15,7 @@ # - soilgrids_0_5cm_source.csv: where the columns came from # notes: # - The experiment's own covariates. They are written here, not -# into 0_data/test_dataset/, which stays the frozen v2 data; +# into the test dataset, which stays the frozen v2 data; # run.R names the file in experiment_config(covariate_files =) # and the harness joins it on survey_unit_id when loading. # - The shallowest depth, 0-5 cm, of the ten SoilGrids @@ -48,9 +49,14 @@ library(sf) # survey unit points (version: 1.1.2) ## 1.2 Resolve paths ---- project_root <- normalizePath(getwd(), winslash = "/") -sites_path <- file.path( - project_root, "0_data", "test_dataset", "sites.csv" -) +resolver <- file.path(project_root, "1_code/harness/data_source.R") + +if (!file.exists(resolver)) { + stop("Run this from the repository root.", call. = FALSE) +} + +source(resolver) +sites_path <- file.path(test_dataset_dir(), "sites.csv") out_dir <- file.path( project_root, "2_pipeline", "exp_002_soilgrids", "inputs" ) @@ -58,10 +64,6 @@ out_dir <- file.path( layer_id <- "geoscientificInformation/soilgrids_250_v2_ab/abmi1km" layer_path <- Sys.getenv("SDM_SOILGRIDS", unset = "") -if (!file.exists(sites_path)) { - stop("Run this from the repository root.", call. = FALSE) -} - dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) # 2. Read the layer's shallowest depth ---- diff --git a/1_code/experiments/exp_002_soilgrids/run.R b/1_code/experiments/exp_002_soilgrids/run.R index 8597221..2fcfc90 100644 --- a/1_code/experiments/exp_002_soilgrids/run.R +++ b/1_code/experiments/exp_002_soilgrids/run.R @@ -3,7 +3,7 @@ # author: Brendan Casey # created: 2026-10-04 # inputs: -# - 0_data/test_dataset/, the frozen v2 data, unchanged +# - the published test dataset, the frozen v2 data, unchanged # - 2_pipeline/exp_002_soilgrids/inputs/soilgrids_0_5cm.csv, the # soil covariates, written by 01_extract_soilgrids_covariates.R # in this folder (run here when the file is missing) diff --git a/1_code/harness/covariate_sets.R b/1_code/harness/covariate_sets.R index bc6f007..817e75e 100644 --- a/1_code/harness/covariate_sets.R +++ b/1_code/harness/covariate_sets.R @@ -3,7 +3,7 @@ # author: Brendan Casey # created: 2026-09-09 # inputs: -# in 0_data/test_dataset/lookup/: +# in the test dataset's lookup/ (see data_source.R): # - covariate_columns.csv # outputs: none; returns objects in memory # notes: @@ -276,7 +276,7 @@ apply_derivations <- function( #' Read the Covariate Column Catalogue #' -#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param data_dir Character. The test dataset folder. #' @param taxon Character. Keep only this taxon's rows, or NULL #' for all of them. #' @return A data frame of taxon, block, source_column and @@ -328,7 +328,7 @@ covariate_catalogue <- function(data_dir, taxon = NULL) { #' List the Covariates One Taxon and Region Have #' -#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param data_dir Character. The test dataset folder. #' @param taxon Character. Taxon slug. #' @param region Character. Region name, or NULL. #' @param block Character. Restrict to one block, or NULL. @@ -389,7 +389,7 @@ available_covariates <- function( #' different model, which is the one thing a comparison must not #' do. #' -#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param data_dir Character. The test dataset folder. #' @param taxa Character vector of taxon slugs. #' @param block Character. Restrict to one block, or NULL. #' @return A character vector of master column names present for @@ -447,7 +447,7 @@ common_covariates <- function(data_dir, taxa, block = NULL) { #' as NA, so the map is what keeps a habitat model from silently #' losing its footprint terms. #' -#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param data_dir Character. The test dataset folder. #' @param taxon Character. Taxon slug. #' @param region Character. Region name, or NULL. #' @param block Character. Restrict to one block, or NULL for @@ -532,7 +532,7 @@ apply_term_map <- function(x, map) { #' #' @param requested Character vector of set names, `block:` #' references, or master column names. -#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param data_dir Character. The test dataset folder. #' @param taxon Character. Taxon slug. #' @param region Character. Region name, or NULL. #' @param sets Named list of covariate sets. diff --git a/1_code/harness/data_load.R b/1_code/harness/data_load.R index a8b079a..36eeaa7 100644 --- a/1_code/harness/data_load.R +++ b/1_code/harness/data_load.R @@ -3,7 +3,7 @@ # author: Brendan Casey # created: 2026-09-09 # inputs: -# in 0_data/test_dataset/: +# in the test dataset (see harness/data_source.R): # - sites.csv # - covariates.csv # - each taxon's response and offset files, as named in @@ -59,7 +59,7 @@ library(data.table) # column-selective CSV reading (version: 1.16.4) #' file, the covariate key, the habitat prediction grid, and any #' stored bootstrap draws. #' -#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param data_dir Character. The test dataset folder. #' @return A data frame. #' #' @example # Example usage of the function @@ -86,7 +86,7 @@ Run 1_code/_setup/09_harmonize_lookups.R first.", #' One Taxon's Manifest Row #' -#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param data_dir Character. The test dataset folder. #' @param taxon Character. Taxon slug. #' @param region Character, or NULL for the taxon's first region, #' which is enough for anything that does not vary by region. @@ -127,7 +127,7 @@ manifest_entry <- function(data_dir, taxon, region = NULL) { #' @param taxon Character. Taxon slug. #' @param region Character, or NULL when the taxon's covariates #' are not stored per region. -#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param data_dir Character. The test dataset folder. #' @return Character. The value to match in the `taxon` column of #' covariates.csv. #' @@ -150,7 +150,7 @@ covariate_key <- function(taxon, region = NULL, data_dir) { #' identity, design and location fields the covariate tables #' factor out, and an `in_` flag per taxon. #' -#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param data_dir Character. The test dataset folder. #' @param taxon Character. Keep only units that taxon covers, or #' NULL for every unit. #' @param columns Character vector of columns to read, or NULL @@ -158,7 +158,7 @@ covariate_key <- function(taxon, region = NULL, data_dir) { #' @return A data frame, one row per survey unit. #' #' @example # Example usage of the function -#' # sites <- load_sites("0_data/test_dataset", taxon = "bird") +#' # sites <- load_sites(test_dataset_dir(), taxon = "bird") #' # nrow(sites) load_sites <- function(data_dir, taxon = NULL, columns = NULL) { path <- file.path(data_dir, "sites.csv") @@ -208,7 +208,7 @@ load_sites <- function(data_dir, taxon = NULL, columns = NULL) { #' model_frame(). #' #' @param taxon Character. Taxon slug. -#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param data_dir Character. The test dataset folder. #' @param species Character vector of species columns to read, or #' NULL for all of them. #' @return A data frame of survey_unit_id and species columns. @@ -255,7 +255,7 @@ load_response <- function(taxon, data_dir, species = NULL) { #' is a modelling choice, and this is a data reader. #' #' @param taxon Character. Taxon slug. -#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param data_dir Character. The test dataset folder. #' @param species Character vector of species columns to read, or #' NULL for all of them. #' @return A data frame of survey_unit_id and species columns, or @@ -297,7 +297,7 @@ load_offsets <- function(taxon, data_dir, species = NULL) { #' rows belonging to one covariate key. #' #' @param taxon Character. Taxon slug. -#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param data_dir Character. The test dataset folder. #' @param columns Character vector of master column names. #' @param region Character. Region name, or NULL when the taxon's #' covariates are not stored per region. @@ -424,7 +424,7 @@ load_covariates <- function( #' already has, so no column has two possible sources. #' #' @param files Character vector of CSV paths. -#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param data_dir Character. The test dataset folder. #' @return `files`, invisibly; stops on the first problem. #' #' @example # Example usage of the function @@ -551,7 +551,7 @@ add_covariate_files <- function(x, files, columns) { #' quietly admitting it would change the contrasts. #' #' @param frame A data frame. -#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param data_dir Character. The test dataset folder. #' @param taxon Character. Taxon slug. #' @return The frame, with the recorded columns as factors. #' @@ -667,7 +667,7 @@ reference level and every contrast.", #' the fitting. #' #' @param taxon Character. Taxon slug. -#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param data_dir Character. The test dataset folder. #' @param species Character vector of species to model. #' @param covariates Character vector of master column names. #' @param region Character. Region name, or NULL. diff --git a/1_code/harness/data_source.R b/1_code/harness/data_source.R new file mode 100644 index 0000000..bb8ac3e --- /dev/null +++ b/1_code/harness/data_source.R @@ -0,0 +1,246 @@ +# --- +# title: Locate the Published Datasets +# author: Brendan Casey +# created: 2026-10-05 +# inputs: +# - the published datasets on ABMI-DATA2, each a versioned +# folder with its checksums.csv: +# //ABMI-DATA2/science/sdmMethodsDev/0_data/ +# test_dataset// the frozen test dataset +# v2_results// the v2 parity references +# - SDM_TEST_DATASET and SDM_V2_RESULTS, optional, folders to +# read instead +# outputs: none; returns the folder to read +# notes: +# - Both datasets are built once by 1_code/_setup/ and +# published to ABMI-DATA2 by _setup/10_publish_datasets.R. +# Experiments, tests and downstream scripts read the +# published copies, so nobody else has to run _setup/. +# - sdm_published$versions pins the version every run reads. +# A published version is a folder that is never overwritten; +# moving to a rebuilt dataset is a one-line change here. +# - The environment variables point runs at another folder - a +# local copy for working off the network, or the _setup/ +# output in 0_data/ straight after a rebuild. +# - Every call checks that each file in checksums.csv is +# present at its published size. That catches a missing or +# half-copied file in a second; a full md5 check is left to +# verify_published(). +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +library(data.table) # reads checksums.csv (version: 1.16.4) + +## 1.2 The pinned versions ---- +# `marker` is a file every copy holds, published or local, so a +# local folder without checksums.csv can still be recognized. +sdm_published <- list( + root = "//ABMI-DATA2/science/sdmMethodsDev/0_data", + versions = c( + test_dataset = "2026-10-05", + v2_results = "2026-10-05" + ), + env = c( + test_dataset = "SDM_TEST_DATASET", + v2_results = "SDM_V2_RESULTS" + ), + marker = c( + test_dataset = "lookup/dataset_manifest.csv", + v2_results = "abmiexplorer/v2_results.csv" + ) +) + +# 2. published_dir() ---- + +#' Resolve a Published Dataset Folder +#' +#' Returns, in order of preference, `dir`, the folder named by +#' the dataset's environment variable, or its pinned published +#' version. +#' +#' @param name Character. "test_dataset" or "v2_results". +#' @param dir Character or NULL. A folder to use as is. +#' @param check Logical. Check the folder before returning it. +#' @return Character. The folder, with forward slashes. +#' +#' @example # Example usage of the function +#' # published_dir("v2_results") +published_dir <- function(name, dir = NULL, check = TRUE) { + # Step 1: A dataset this file knows + if (!name %in% names(sdm_published$versions)) { + stop( + "Unknown dataset: ", name, ". Known: ", + paste(names(sdm_published$versions), collapse = ", "), + call. = FALSE + ) + } + + # Step 2: The first of argument, environment, pinned version + from_env <- Sys.getenv(sdm_published$env[[name]], unset = "") + + dir <- dir %||% + (if (nzchar(from_env)) from_env else NULL) %||% + file.path( + sdm_published$root, name, sdm_published$versions[[name]] + ) + + # normalizePath() keeps a share's leading backslashes; the run + # record reads better with the forward-slash form + dir <- normalizePath(dir, winslash = "/", mustWork = FALSE) + dir <- sub("^[\\\\/]{2}", "//", dir) + + # Step 3: Fail now, not partway into a run + if (isTRUE(check)) { + check_published(dir, name) + } + + dir +} + +# 3. test_dataset_dir() and v2_results_dir() ---- + +#' Resolve the Test Dataset Folder +#' +#' @param data_dir Character or NULL. A folder to use as is. +#' @param check Logical. Check the folder before returning it. +#' @return Character. The folder. +#' +#' @example # Example usage of the function +#' # data_dir <- test_dataset_dir() +#' # Sys.setenv(SDM_TEST_DATASET = "0_data/test_dataset") +#' # test_dataset_dir() # the local _setup/ output +test_dataset_dir <- function(data_dir = NULL, check = TRUE) { + published_dir("test_dataset", data_dir, check) +} + +#' Resolve the v2 Results Folder +#' +#' The folder holds the "drives" reference at its top level and +#' the "abmiexplorer" reference in abmiexplorer/. +#' +#' @param dir Character or NULL. A folder to use as is. +#' @param check Logical. Check the folder before returning it. +#' @return Character. The folder. +#' +#' @example # Example usage of the function +#' # file.path(v2_results_dir(), "abmiexplorer", "v2_results.csv") +v2_results_dir <- function(dir = NULL, check = TRUE) { + published_dir("v2_results", dir, check) +} + +# 4. check_published() ---- + +#' Check a Dataset Folder Is Complete +#' +#' Checks the folder exists and, when it carries a +#' checksums.csv (every published version does), that each file +#' listed is present at its listed size. A local copy without +#' checksums.csv is only checked for the dataset's marker file. +#' +#' @param dir Character. The folder. +#' @param name Character. The dataset, for its marker file. +#' @return `dir`, invisibly; stops on a problem. +#' +#' @example # Example usage of the function +#' # check_published(test_dataset_dir(check = FALSE), +#' # "test_dataset") +check_published <- function(dir, name) { + # Step 1: The folder + if (!dir.exists(dir)) { + stop( + "Dataset ", name, " not found:\n ", dir, + "\nConnect to the ABMI network (or VPN), or set ", + sdm_published$env[[name]], " to a local copy.", + call. = FALSE + ) + } + + # Step 2: A local copy has no checksums; the marker will do + sums_path <- file.path(dir, "checksums.csv") + + if (!file.exists(sums_path)) { + marker <- sdm_published$marker[[name]] + + if (!file.exists(file.path(dir, marker))) { + stop( + "Not a copy of ", name, " (no ", marker, "):\n ", dir, + call. = FALSE + ) + } + + return(invisible(dir)) + } + + # Step 3: Every published file, at its published size + sums <- fread(sums_path, colClasses = "character") + sizes <- file.size(file.path(dir, sums$path)) + bad <- is.na(sizes) | sizes != as.numeric(sums$bytes) + + if (any(bad)) { + stop( + "Dataset ", name, " incomplete at ", dir, + "; missing or wrong size:\n ", + paste(head(sums$path[bad], 10), collapse = "\n "), + call. = FALSE + ) + } + + invisible(dir) +} + +# 5. verify_published() ---- + +#' Verify Every File in a Published Dataset by md5 +#' +#' Slow over the network (the test dataset is ~0.9 GB); use it +#' after publishing, or when a copy is in doubt. +#' +#' @param dir Character. A published folder. +#' @return Logical. TRUE when every md5 matches, invisibly; +#' stops otherwise. +#' +#' @example # Example usage of the function +#' # verify_published(test_dataset_dir()) +verify_published <- function(dir) { + sums_path <- file.path(dir, "checksums.csv") + + if (!file.exists(sums_path)) { + stop("No checksums.csv in ", dir, call. = FALSE) + } + + sums <- fread(sums_path, colClasses = "character") + found <- unname(tools::md5sum(file.path(dir, sums$path))) + bad <- is.na(found) | found != sums$md5 + + if (any(bad)) { + stop( + "md5 mismatch in ", dir, ":\n ", + paste(sums$path[bad], collapse = "\n "), + call. = FALSE + ) + } + + invisible(TRUE) +} + +# 6. published_label() ---- + +#' Name the Copy a Run Read, for the Run Record +#' +#' @param dir Character. The folder. +#' @return Character. "published ()" for a +#' published copy, "local ()" otherwise. +#' +#' @example # Example usage of the function +#' # published_label(test_dataset_dir()) +published_label <- function(dir) { + if (file.exists(file.path(dir, "checksums.csv"))) { + paste0("published ", basename(dir), " (", dir, ")") + } else { + paste0("local (", dir, ")") + } +} + +# End of script ---- diff --git a/1_code/harness/experiment.R b/1_code/harness/experiment.R index 24bfc88..3c60a37 100644 --- a/1_code/harness/experiment.R +++ b/1_code/harness/experiment.R @@ -3,7 +3,7 @@ # author: Brendan Casey # created: 2026-10-03 # inputs: -# 0_data/test_dataset/ +# the published test dataset (see data_source.R) # outputs: # in 2_pipeline//: the result stores and run_log.csv # in 3_output//: tables/, run_record.md, and whatever the @@ -69,7 +69,7 @@ library(data.table) # run log writing (version: 1.16.4) #' reach to be gated. #' @param project_root Character. The repository root. #' @param data_dir,pipeline_dir,out_dir Character, or NULL for -#' 0_data/test_dataset, 2_pipeline/ and 3_output/. +#' test_dataset_dir(), 2_pipeline/ and 3_output/. #' @return A list of class `experiment_config`. #' #' @example # Example usage of the function @@ -121,9 +121,7 @@ experiment_config <- function( } n_bootstraps <- as.integer(n_bootstraps) - data_dir <- data_dir %||% file.path( - project_root, "0_data", "test_dataset" - ) + data_dir <- test_dataset_dir(data_dir) # Stored draws have a hard ceiling; drawn ones do not for (key in names(specs)) { @@ -412,7 +410,7 @@ record_config <- function(config, run_log = NULL) { engines = stage_values("engine"), selection = stage_values("selection"), compared_with = config$baseline %||% "none (baseline)", - data_dir = basename(config$data_dir) + data_dir = published_label(config$data_dir) ) # Failures belong in the record. Without them, a run that lost diff --git a/1_code/harness/harness.R b/1_code/harness/harness.R index 2b4ca72..af9facb 100644 --- a/1_code/harness/harness.R +++ b/1_code/harness/harness.R @@ -51,6 +51,7 @@ load_harness <- function( files <- c( "registry.R", "cache.R", + "data_source.R", "spec.R", "data_load.R", "covariate_sets.R", diff --git a/1_code/harness/predict_grid.R b/1_code/harness/predict_grid.R index a52f8c3..fa7f3d6 100644 --- a/1_code/harness/predict_grid.R +++ b/1_code/harness/predict_grid.R @@ -3,7 +3,7 @@ # author: Brendan Casey # created: 2026-09-09 # inputs: -# in 0_data/test_dataset/lookup/: +# in the test dataset's lookup/ (see data_source.R): # - _prediction_matrix.csv # outputs: none; returns objects in memory # notes: @@ -40,7 +40,7 @@ library(data.table) # lookup table reading (version: 1.16.4) #' Read a Prediction Grid #' -#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param data_dir Character. The test dataset folder. #' @param name Character. Grid name, without the #' `_prediction_matrix.csv` suffix, or NULL for no grid. #' @return A data frame with habitat types as rownames, or NULL. diff --git a/1_code/harness/run_model.R b/1_code/harness/run_model.R index a2b2ad8..ac7c9b7 100644 --- a/1_code/harness/run_model.R +++ b/1_code/harness/run_model.R @@ -54,7 +54,7 @@ #' #' @param specs A named list of taxon specs. The names name the #' runs, and so the folders under `pipeline_dir`. -#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param data_dir Character. The test dataset folder. #' @param pipeline_dir Character. Each spec writes to #' `pipeline_dir///`. #' @param species Character vector of focal species, named by @@ -150,7 +150,7 @@ run_specs <- function( #' run_specs() for a single spec, writing to `run_dir//`. #' #' @param spec A taxon spec. -#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param data_dir Character. The test dataset folder. #' @param run_dir Character. Where the region stores go. #' @param ... Passed to run_specs(): species, regions, #' iterations, stage_models, metrics, boot_seed, workers, diff --git a/1_code/harness/species.R b/1_code/harness/species.R index 0565f70..2862f00 100644 --- a/1_code/harness/species.R +++ b/1_code/harness/species.R @@ -3,7 +3,7 @@ # author: Brendan Casey # created: 2026-09-09 # inputs: -# in 0_data/test_dataset/lookup/: +# in the test dataset's lookup/ (see data_source.R): # - species_queue.csv, from _setup/09_harmonize_lookups.R # outputs: none; returns objects in memory # notes: @@ -34,7 +34,7 @@ library(data.table) # lookup table reading (version: 1.16.4) #' Read the Species Queue #' -#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param data_dir Character. The test dataset folder. #' @param taxon Character. Keep one taxon, or NULL for all. #' @return A data frame of taxon, region, season, tier, species, #' order and source_name. @@ -82,7 +82,7 @@ species_catalogue <- function(data_dir, taxon = NULL) { #' #' What an experiment reads to decide which focal species to run. #' -#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param data_dir Character. The test dataset folder. #' @param taxon Character. Taxon slug. #' @param region Character. Restrict to one region, or NULL. #' @param tier Character. Restrict to one model tier, or NULL. @@ -131,7 +131,7 @@ list_species <- function( #' dataset's column: mammals are "Black BearSummer" there and #' "BlackBear_Summer" here. #' -#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param data_dir Character. The test dataset folder. #' @param taxon,species Character. #' @return Character, the source name. #' @@ -161,7 +161,7 @@ species_source_name <- function(data_dir, taxon, species) { #' hours later. #' #' @param species Character vector of species, or NULL for all. -#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param data_dir Character. The test dataset folder. #' @param taxon Character. Taxon slug. #' @param region Character. Restrict to one region, or NULL. #' @param tier Character. Restrict to one model tier, or NULL. diff --git a/1_code/methods/resampling/precomputed.R b/1_code/methods/resampling/precomputed.R index 21f7bd5..14166c2 100644 --- a/1_code/methods/resampling/precomputed.R +++ b/1_code/methods/resampling/precomputed.R @@ -3,8 +3,9 @@ # author: Brendan Casey # created: 2026-09-09 # inputs: -# in 0_data/test_dataset/, where lookup/dataset_manifest.csv -# says (`bootstrap_ids`, `bootstrap_layout`): +# in the test dataset (see harness/data_source.R), where +# lookup/dataset_manifest.csv says (`bootstrap_ids`, +# `bootstrap_layout`): # - per_taxon_csv: one table, one column per draw (birds) # - per_species_rds: one file per species (plant groups) # outputs: registers the `precomputed` scheme @@ -29,7 +30,7 @@ library(data.table) # lookup table reading (version: 1.16.4) #' Read Bootstrap Ids the Source Pipeline Generated #' -#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param data_dir Character. The test dataset folder. #' @param taxon Character. Taxon slug. #' @param iterations Integer vector of bootstrap iterations. #' @param id_column Character. The column in the covariate frame diff --git a/1_code/modules/birds/standardize.R b/1_code/modules/birds/standardize.R index 3cec7d1..9413f85 100644 --- a/1_code/modules/birds/standardize.R +++ b/1_code/modules/birds/standardize.R @@ -3,7 +3,7 @@ # author: Brendan Casey; translation logic by Elly Knight (v2) # created: 2026-09-29 # inputs: -# in 0_data/test_dataset/: +# in the test dataset (see harness/data_source.R): # - covariates.csv, the bird rows # - lookup/bird_veg_age_matrix.csv, from # 1_code/_setup/06_harmonize_bird_translation_lookup.R @@ -79,7 +79,7 @@ bird_sort_interaction <- function(x) { #' block - `road` became `road_veg` and `road_soil` - so model #' terms carry the suffix and v2's lookups do not. #' -#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param data_dir Character. The test dataset folder. #' @param block Character. "veg" for north, "soil" for south. #' @return A data frame of source and master names, one row per #' source column, preferring the given block. @@ -184,7 +184,7 @@ bird_model_terms <- function(set) { #' the covariates under v2's names, the design matrix, and the #' row sets the linear-feature adjustment averages over. #' -#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param data_dir Character. The test dataset folder. #' @param region Character. "north" or "south". #' @return A list. #' @@ -436,7 +436,7 @@ standardize_bird_draw <- function(raw, context, species) { #' #' @param coefficients A data frame of species, region, boot, #' term and estimate: the landcover stage, one region. -#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param data_dir Character. The test dataset folder. #' @param region Character. "north" or "south". #' @return A data frame of the same columns, on the standardized #' template, with stage "habitat" and se NA. @@ -496,7 +496,7 @@ standardize_bird_coefficients <- function( #' "habitat". The raw "landcover" rows stay as they are. #' #' @param coefficients A store's coefficients. -#' @param data_dir Character. Path to 0_data/test_dataset. +#' @param data_dir Character. The test dataset folder. #' @param region Character. "north" or "south". #' @return A data frame of coefficient rows, or NULL. #' diff --git a/1_code/modules/mammals/hurdle.R b/1_code/modules/mammals/hurdle.R index 7de1417..5cce267 100644 --- a/1_code/modules/mammals/hurdle.R +++ b/1_code/modules/mammals/hurdle.R @@ -4,7 +4,7 @@ # Huggard (v2) # created: 2026-09-29 # inputs: -# in 0_data/test_dataset/lookup/: +# in the test dataset's lookup/ (see data_source.R): # - mammal_climate_predictions.csv # - species_queue.csv (each species' v2 name) # outputs: none; returns objects in memory diff --git a/1_code/tests/run_tests.R b/1_code/tests/run_tests.R index 059b9ad..290cd11 100644 --- a/1_code/tests/run_tests.R +++ b/1_code/tests/run_tests.R @@ -4,7 +4,8 @@ # created: 2026-10-03 # inputs: # - 1_code/tests/testthat/test-*.R -# - 0_data/test_dataset/, for the dataset checks +# - the published test dataset (see harness/data_source.R), +# for the dataset checks; skipped when it cannot be reached # outputs: none; prints a pass / fail summary # notes: # - Fast checks of the contracts the framework relies on: every @@ -29,8 +30,9 @@ library(testthat) # test runner (version: 3.3.2) source("1_code/harness/harness.R") load_framework() -data_dir <- file.path(getOption("sdm.project_root"), "0_data", - "test_dataset") +# Unchecked, so an unreachable share skips the dataset checks +# rather than stopping the rest +data_dir <- test_dataset_dir(check = FALSE) # 2. Run ---- results <- testthat::test_dir( diff --git a/README.md b/README.md index 99f6a25..c6c4eb8 100644 --- a/README.md +++ b/README.md @@ -423,6 +423,10 @@ handful of draws does not mean much. On a 24-core machine, the 14 The dataset is built once per source snapshot by the scripts in `1_code/_setup/`, run by hand and in order. No experiment runs them. +The built dataset and v2 results are then published to ABMI-DATA2 +(`10`), and experiments read those copies, so only whoever rebuilds the +data runs `_setup/`. The scripts read their inputs from a mirror on the +same share (`00`), so anyone with access to it can rebuild. ```mermaid %% ---------------------------- @@ -495,15 +499,25 @@ flowchart TD | Script | Reads | Writes | | --- | --- | --- | +| `00_mirror_setup_inputs.R` | Every external input below, at its original location | `setup_inputs/` on ABMI-DATA2, with `inputs_manifest.csv`; run once | | `01_harmonize_model_ready_v2.R` | The `model_ready_v2` snapshot, the mammal camera climate, the WildTrax species lookup, the v2 prediction matrices, the bird `Stratified.Rdata` | `0_data/test_dataset/` | | `02_validate_test_dataset.R` | The test dataset and the same sources | Nothing; prints a pass / fail tally | | `03_rerun_bryophyte_v2_reference.R` | The v2 plant project's bryophyte data, and the frozen v2 functions | `2_pipeline/v2_reference/bryophyte-species-models.Rdata` | -| `04_package_bird_coefficients.R` | The per-draw v2 bird coefficient CSVs | `2_pipeline/v2_reference/Birds2024.RData` | -| `05_harmonize_v2_results.R` | v2 plant `COEFS.RData`, the mammal coefficient tables, `Birds2024.RData` | `0_data/v2_results/` | +| `04_package_bird_coefficients.R` (legacy) | The per-draw v2 bird coefficient CSVs | `2_pipeline/v2_reference/Birds2024.RData` | +| `05_harmonize_v2_results.R` (legacy) | v2 plant `COEFS.RData`, the mammal coefficient tables, `Birds2024.RData` | `0_data/v2_results/` | | `06_harmonize_bird_translation_lookup.R` | v2's bird `Xn-veg-v2024.Rdata` | `lookup/bird_veg_age_matrix.csv` | | `07_harmonize_v2_plant_bootstrap_ids.R` | v2's stored plant bootstrap draws | `lookup/v2_bootstrap_ids/` | | `08_harmonize_abmiexplorer_results.R` | ABMIexploreR's packaged coefficients | `0_data/v2_results/abmiexplorer/` | | `09_harmonize_lookups.R` | `0_data/test_dataset/lookup/` only (offline) | `species_queue.csv`, `factor_levels.csv`, `dataset_manifest.csv`, the bird prediction grids | +| `10_publish_datasets.R` | `0_data/test_dataset/`, `0_data/v2_results/` | A new `/` of each on ABMI-DATA2, with `checksums.csv` | + +- **`00`** copies every external file `_setup/` reads to + `//ABMI-DATA2/science/sdmMethodsDev/0_data/setup_inputs/`, unchanged and + under each source's own relative paths, and records each copy's origin + and md5 in `inputs_manifest.csv`. The originals are left in place. The + scripts read the mirror by default (`_setup/utils/input_paths.R`); their + `SDM_*` variables still point them back at the originals. It never + overwrites the mirror: a source that has changed since is reported. - **`01`** writes every response, covariate and lookup table, so experiments run from `0_data/test_dataset/` alone. Mammal species names are resolved @@ -517,7 +531,12 @@ flowchart TD every draw is an error object. It re-runs the frozen v2 functions unmodified, climate stage only. - **`04`** rebuilds the packaged bird output, absent from the bird drive. It - is v2's `08.PackageCoefficients.R` with only the paths changed. + is v2's `08.PackageCoefficients.R` with only the paths changed. **`04` + and `05` are legacy:** parity is scored against `08`'s ABMIexploreR + build, which agrees with theirs to about 1e-15 on shared species. Their + output is kept and published frozen in `v2_results/`, and their inputs + (hours of Google Drive reads, and ~38 GB of bird model objects) are not + mirrored. - **`05`** flattens the three v2 storage formats into one table. Mammal results average the two seasons, as v2's `.all` tables do. `Birds2024.RData` labels draws 2 to 100 in file-listing order (`b2` is draw @@ -535,13 +554,18 @@ flowchart TD the bird habitat grids, and `dataset_manifest.csv`, which names each taxon's files. The harness reads file locations from the manifest and nowhere else. It runs offline in seconds; re-run it after `01` or `06`. +- **`10`** publishes `0_data/test_dataset/` and `0_data/v2_results/` as a + new version folder each (default: today's date), copied to a `.partial` + folder, checked by md5 and only then renamed into place. A published + version is never overwritten. Point experiments at it by changing the + pin in `1_code/harness/data_source.R`. ## Directory structure ``` sdmMethodsDev/ ├── README.md -├── 0_data/ # read-only inputs; written only by 1_code/_setup/ +├── 0_data/ # _setup/ output; experiments read the published copy │ ├── test_dataset/ # the frozen dataset; see "Data" below │ ├── v2_results/ # the published v2 results, one table │ ├── v2_scripts/ # the v2 scripts as received; reference only @@ -574,7 +598,8 @@ sdmMethodsDev/ │ │ ├── exp_001_xgboost/ # test: habitat stage fitted with xgboost │ │ └── exp_002_soilgrids/ # test: SoilGrids terms in the climate stage; │ │ # 01_extract_soilgrids_covariates.R, run.R -│ ├── _setup/ # 01–09: build the v2 data in 0_data/; fixed +│ ├── _setup/ # 00–10: mirror inputs, build the v2 data in +│ │ # 0_data/, publish it to ABMI-DATA2; fixed │ ├── tests/ # run_tests.R; compare_stores.R │ └── _scratch.R # dated workspace for exploration │ @@ -603,7 +628,25 @@ sdmMethodsDev/ ## Data: `0_data/` -Read-only during experiments, and gitignored except `v2_scripts/`. +Gitignored except `v2_scripts/`. `test_dataset/` and `v2_results/` are +built here by `_setup/`, then published to ABMI-DATA2 as versioned, +checksummed copies: + +``` +//ABMI-DATA2/science/sdmMethodsDev/0_data/ +├── test_dataset// # + checksums.csv, publish_record.md +├── v2_results// +└── setup_inputs/ # _setup/'s inputs; see "Building the dataset" +``` + +**Experiments, tests and downstream scripts read the published copies,** +through `test_dataset_dir()` and `v2_results_dir()` in +[`1_code/harness/data_source.R`](1_code/harness/data_source.R). That file +pins the version every run reads, and each run record names it. Every call +checks the published files are present at their published sizes; +`verify_published()` checks them by md5. To read another copy (a local one +for working off the network, or `0_data/` straight after a rebuild), set +`SDM_TEST_DATASET` or `SDM_V2_RESULTS` to its folder. ### `test_dataset/` @@ -971,8 +1014,13 @@ install.packages(c( )) ``` -Fitting an experiment needs only `0_data/`. Building the dataset needs the -network sources, once per snapshot, from the repository root: +Fitting an experiment needs only read access to +`//ABMI-DATA2/science/sdmMethodsDev/` (on the ABMI network or VPN); nothing +in `_setup/` has to be run. Off the network, copy the published folders +locally and set `SDM_TEST_DATASET` and `SDM_V2_RESULTS` to them. + +Rebuilding the dataset needs the same share, once per snapshot, from the +repository root: ```r source("1_code/_setup/01_harmonize_model_ready_v2.R") @@ -980,25 +1028,36 @@ source("1_code/_setup/06_harmonize_bird_translation_lookup.R") source("1_code/_setup/09_harmonize_lookups.R") # offline; seconds source("1_code/_setup/02_validate_test_dataset.R") -# The v2 reference. 03 and 04 take hours; re-run only if their sources change +# The v2 reference. 03 takes hours; re-run only if its sources change source("1_code/_setup/03_rerun_bryophyte_v2_reference.R") -source("1_code/_setup/04_package_bird_coefficients.R") -source("1_code/_setup/05_harmonize_v2_results.R") +source("1_code/_setup/07_harmonize_v2_plant_bootstrap_ids.R") source("1_code/_setup/08_harmonize_abmiexplorer_results.R") + +# Publish, then move the pin in 1_code/harness/data_source.R +source("1_code/_setup/10_publish_datasets.R") ``` -Set these when a source is not in its default location: +`00_mirror_setup_inputs.R` is run once, by someone who can reach the +original drives, and again only if a source changes. `04` and `05` are +legacy and need the original drives. + +Set these to read or write somewhere other than the default: | Variable | Read by | Points at | | --- | --- | --- | +| `SDM_TEST_DATASET` | the harness, tests | A test dataset folder to read instead of the pinned published version | +| `SDM_V2_RESULTS` | exp_000 | A v2 results folder to read instead of the pinned published version | +| `SDM_SETUP_INPUT_ROOT` | `00`–`08` | The input mirror; defaults to `//ABMI-DATA2/science/sdmMethodsDev/0_data/setup_inputs` | +| `SDM_SHARE_ROOT`, `SDM_DATASET_VERSION`, `SDM_PUBLISH` | `10` | Where to publish, the version folder (`YYYY-MM-DD`), and which datasets | | `SDM_SNAPSHOT_V2` | `01`, `02` | The `model_ready_v2` snapshot folder | | `SDM_MAMMAL_CAMERA_CLIMATE` | `01` | `abmi-camera-climate_2023.Rdata` | | `SDM_MAMMAL_CLIMATE_PRED` | `01`, `02` | `All Species Climate Predictions.csv` | | `SDM_V2_LOOKUP` | `01` | The v2 folder holding the two plant prediction-matrix CSVs | | `SDM_WT_SPECIES` | `01` | `WildTrax Species Strings.RData` | -| `SDM_BIRD_DATA` | `01`, `02`, `04` | The bird `Stratified.Rdata` v2 was fitted on; defaults to `work_abmi/1_projects/active/sdmMethodsDev/remote/birds_data_v2/` | -| `SDM_V2_PROJECT` | `03`, `05` | The v2 plant project (`VegetationModels`) | -| `SDM_V2_BIRD_ROOT` | `04`, `05` | The v2 bird project (`BirdModels`) | +| `SDM_BIRD_DATA` | `01`, `02`, `04` | The bird `Stratified.Rdata` v2 was fitted on; mirrored from `work_abmi/1_projects/active/sdmMethodsDev/remote/birds_data_v2/` | +| `SDM_V2_PROJECT` | `03`, `05`, `07` | The v2 plant project (`VegetationModels`) | +| `SDM_V2_BIRD_ROOT` | `04`, `05`, `06` | The v2 bird project (`BirdModels`) | +| `SDM_V2_BIRD_LOOKUP` | `08` | The v2 bird `birdlist.csv` | | `SDM_V2_MAMMAL_ROOT` | `05` | The v2 mammal habitat-modelling results for 2024 | ## Related resources diff --git a/docs/framework_design.md b/docs/framework_design.md index 632b208..4cb6726 100644 --- a/docs/framework_design.md +++ b/docs/framework_design.md @@ -143,6 +143,13 @@ factor levels are one table each for every taxon. The harness reads file locations from the manifest and nowhere else, so a new taxon is manifest rows plus its files. +The dataset folder itself is resolved once, by `test_dataset_dir()` in +`harness/data_source.R`: the version published to +`//ABMI-DATA2/science/sdmMethodsDev/0_data/test_dataset/` that the file +pins, unless `SDM_TEST_DATASET` names another copy. A published version +is never overwritten and carries a `checksums.csv`, so every run reads +the same bytes, and the run record says which version it read. + ### Runs are parallel and reproducible Each species of each spec is one job. Jobs run on a cluster of R diff --git a/docs/getting_started.md b/docs/getting_started.md index 0259d12..7061295 100644 --- a/docs/getting_started.md +++ b/docs/getting_started.md @@ -52,7 +52,11 @@ and is compared against it. ## Run the baseline Open the project in RStudio or Positron. The working directory is -then the repository root. Then: +then the repository root. You need read access to +`//ABMI-DATA2/science/sdmMethodsDev/` (on the ABMI network or VPN): +the test dataset and the v2 results are read from there, so you do +not run `_setup/`. Off the network, copy the published folders and +set `SDM_TEST_DATASET` and `SDM_V2_RESULTS` to them. Then: ```r source("1_code/experiments/exp_000_parity_v2/run.R") @@ -267,5 +271,5 @@ meant to alter results should alter only what it says it does. | `1_code/experiments/exp_NNN_*/` | One folder per question | Ask a question | | `1_code/experiments/_shared/` | Named focal-species sets | Add a reusable species set | | `1_code/_setup/` | One-off scripts that build `0_data/` | Rebuild or extend the dataset | -| `0_data/test_dataset/` | The frozen dataset. `lookup/dataset_manifest.csv` says which file is whose | Nothing; it is rebuilt by `_setup/` | +| `0_data/test_dataset/` | The frozen dataset as `_setup/` builds it. Runs read the copy published on ABMI-DATA2, pinned in `1_code/harness/data_source.R`. `lookup/dataset_manifest.csv` says which file is whose | Nothing; it is rebuilt by `_setup/` and republished by `_setup/10` | | `docs/` | Design, taxon quirks, this guide | | From 147c7fe6bd019600d92ec1c98433ecac5a359bb9 Mon Sep 17 00:00:00 2001 From: bgcasey Date: Tue, 6 Oct 2026 04:49:57 -0600 Subject: [PATCH 08/16] Remove harmonization script for v2 results - Deleted the script `05_harmonize_v2_results.R` which was responsible for harmonizing the v2 results into a single parity reference. - This script included functions for reading and processing plant, mammal, and bird coefficient data, as well as assembling the final results into a CSV format. - The removal is part of a refactor to streamline the data processing pipeline and eliminate legacy code that is no longer needed. --- 1_code/_setup/04_package_bird_coefficients.R | 930 -------------- 1_code/_setup/05_harmonize_v2_results.R | 1155 ------------------ 2 files changed, 2085 deletions(-) delete mode 100644 1_code/_setup/04_package_bird_coefficients.R delete mode 100644 1_code/_setup/05_harmonize_v2_results.R diff --git a/1_code/_setup/04_package_bird_coefficients.R b/1_code/_setup/04_package_bird_coefficients.R deleted file mode 100644 index 60cf2c5..0000000 --- a/1_code/_setup/04_package_bird_coefficients.R +++ /dev/null @@ -1,930 +0,0 @@ -# --- -# title: Package the v2 Bird Coefficients -# author: Elly Knight; adapted by Brendan Casey -# created: 2026-09-13 -# inputs: -# in the BirdModels project (SDM_V2_BIRD_ROOT): -# - Results/ClimateModels/Coefficients//*.csv -# - Results/LandcoverModels/Coefficients///*.csv -# - Data/lookups/Xn-veg-v2024.Rdata -# - Data/lookups/birdlist.csv, birds-v2024.csv -# on the work_abmi shared drive (SDM_BIRD_DATA): -# - 1_projects/active/sdmMethodsDev/remote/birds_data_v2/ -# Stratified.Rdata -# in this repository: -# - 0_data/v2_scripts/birds/00.NorthModels.R -# - 0_data/v2_scripts/birds/00.SouthModels.R -# outputs: -# in 2_pipeline/v2_reference/: -# - Birds2024.RData -# notes: -# - Legacy: not re-run. Parity is scored against the -# ABMIexploreR reference (08). Its output is published frozen -# with 0_data/v2_results/ by 10_publish_datasets.R, and its -# inputs are not mirrored to ABMI-DATA2. -# - A clone of 0_data/v2_scripts/birds/08.PackageCoefficients.R, -# the v2 step that turns per-draw coefficient csvs into the -# packaged `birds` object. Only the plumbing is changed: -# where it reads from, where it writes to, and how it reads. -# Every line of the coefficient translation is the original's, -# because reproducing it is the entire point. -# -# - It exists because the packaged bird output does not. v2 -# declares Results/Birds2024.RData at line 771 of the -# original, and that file is absent from the drive; so are -# Predictions2024.RData and ModelComparison.csv. Only the -# per-draw csvs from steps 6 and 7 survive. Birds are the one -# taxon with no final result to gate against, and this -# rebuilds it. -# -# - Why it is worth running rather than summarizing the csvs -# directly: this produces coefficients on the cross-taxa -# standardized template, the same WhiteSpruceR and Loamy term -# space the plant tables use, rather than the raw glm factor -# names vegcCrop and soilcLoamy. That is what makes birds -# comparable to the other taxa at all. -# -# - Stratified.Rdata is read from the copy v2's birds were -# fitted on, the same one 01 harmonizes from, not from the -# BirdModels drive. Its Data/Archive/2025/ copy was rebuilt -# in place on 2026-08-19 and no longer matches v2's results. -# -# - Reads are serial and that is deliberate. Measured on this -# mount: 400 consecutive serial reads succeeded with no -# failures, while four parallel readers put Google Drive into -# a refusal state that outlasted repeated retries and lost -# every landcover species. Concurrency trips it, not volume. -# Expect a few hours on a cold cache. -# -# - Read only with respect to the v2 project. The packaged -# object is written to 2_pipeline/, never to the bird drive. -# --- - -# 0. Paths for this repository ---- -# The only block that is not the original script. - -## 0.1 Resolve the bird project ---- -# The path hard-coded in v2 is not mounted here. This is the same -# directory reached through remote/BirdModels.lnk on work_abmi. -project_root <- normalizePath(getwd(), winslash = "/") - -v2_bird_root <- Sys.getenv( - "SDM_V2_BIRD_ROOT", - unset = paste0( - "G:/.shortcut-targets-by-id/", - "17Ymt13eHfKvIiuoMl6x-Kn74Z2uVbbzS/BirdModels" - ) -) - -if (!dir.exists(v2_bird_root)) { - stop( - "Bird project not found:\n ", v2_bird_root, - "\nSet SDM_V2_BIRD_ROOT to the BirdModels directory.", - call. = FALSE - ) -} - -## 0.2 Where the frozen model scripts live ---- -v2_bird_scripts <- file.path( - project_root, "0_data/v2_scripts/birds" -) - -## 0.3 Choose the complete results subtree ---- -# Results/ holds a partial re-run of a single species; the -# complete set is under Results/Archive/. Two runs of an unseeded -# pipeline disagree numerically, so they are never mixed: -# whichever covers more species is used for everything. -bird_results_root <- local({ - options <- c( - file.path(v2_bird_root, "Results"), - file.path(v2_bird_root, "Results", "Archive") - ) - - counts <- vapply(options, function(one) { - leaf <- file.path(one, "LandcoverModels", "Coefficients") - - if (!dir.exists(leaf)) { - return(-1L) - } - - length(list.files(leaf, pattern = "[.]csv$", recursive = TRUE)) - }, integer(1)) - - if (all(counts < 0)) { - stop( - "No bird landcover coefficients under - ", - paste(options, collapse = " - "), - call. = FALSE - ) - } - - options[which.max(counts)] -}) - -## 0.4 Where the packaged object is written ---- -out_dir <- file.path(project_root, "2_pipeline/v2_reference") - -dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) - -out_file <- file.path(out_dir, "Birds2024.RData") - -## 0.5 Locate the stratified modelling data ---- -# The copy v2's birds were fitted on, shared with 01 through the -# same SDM_BIRD_DATA override. -stratified_path <- Sys.getenv( - "SDM_BIRD_DATA", - unset = paste0( - "G:/Shared drives/work_abmi/1_projects/active/", - "sdmMethodsDev/remote/birds_data_v2/Stratified.Rdata" - ) -) - -if (!file.exists(stratified_path)) { - stop( - "Stratified.Rdata not found at\n ", stratified_path, - "\nIt holds the modelling frame the coefficient ", - "translation needs. Set SDM_BIRD_DATA.", - call. = FALSE - ) -} - -cat("Bird project: ", v2_bird_root, "\n", sep = "") -cat("Results: ", bird_results_root, "\n", sep = "") -cat("Stratified: ", stratified_path, "\n", sep = "") -cat("Writing to: ", out_file, "\n\n", sep = "") - -# Everything below this line is 08.PackageCoefficients.R, with -# only its paths repointed. - - -#NOTES################################ - -#The translation of the model coefficients to the coefficients that are standardized across taxa relies on a lookup table. The proportions of the age coefficients in the raw models that contribute to the age stages in the standardized coefficients are area under the curve. - -#PREAMBLE############################ - -#1. Load packages---- -library(tidyverse) #basic data wrangling -library(purrr) #functional programming -library(vegan) #for picking median bootstrap -library(pROC) #AUC - -#2. Set root path for data on google drive---- -root <- v2_bird_root - -#3. Restrict scientific notation---- -options(scipen = 99999) - -#4. Get the list of models run---- -mods <- data.frame(path = list.files(file.path(bird_results_root, "LandcoverModels", "Coefficients"), full.names = TRUE, recursive = TRUE, pattern="*.csv"), - file = list.files(file.path(bird_results_root, "LandcoverModels", "Coefficients"), recursive = TRUE, pattern="*.csv")) |> - separate(file, into=c("region", "f1", "f2", "species", "bootstrap")) |> - mutate(bootstrap = as.numeric(bootstrap)) |> - dplyr::select(-f1, -f2) - -#5. Load model scripts---- -source(file.path(v2_bird_scripts, "00.NorthModels.R")) -source(file.path(v2_bird_scripts, "00.SouthModels.R")) - -#6. Load data---- -load(stratified_path) - -#7. Function to fix interaction term names---- -#make formula term names sorted and predictable, i.e. always A:B instead of B:A -fix_names <- function(x, sep=":") { - unlist(lapply(x, function(z) { - paste(sort(strsplit(z, sep)[[1]]), collapse=sep) - })) -} - -#8. Function to get model terms----- -#Formula from Peter's approach -get_terms <- function(mods, type=c("formula", "list"), intercept=TRUE) { - type <- match.arg(type) - x <- unlist(lapply(unlist(mods), function(z) as.character(z)[3])) - # x <- unname(substr(x, 5, nchar(x))) - x <- gsub(". + ", "", x, fixed=TRUE) - x <- unlist(strsplit(x, "+", fixed=TRUE)) - x <- unlist(strsplit(x, "*", fixed=TRUE)) - if (type == "list") - x <- unlist(strsplit(x, ":", fixed=TRUE)) - x <- sub("^[[:space:]]*(.*?)[[:space:]]*$", "\\1", x, perl=TRUE) - x <- unique(x) - if (type == "formula") { - x <- paste("~", paste(x, collapse=" + ", sep="")) - if (!intercept) - x <- paste(x, "- 1") - x <- as.formula(x) - } - x -} - -#9. Load veg age lookup---- -load(file.path(root, "Data", "lookups", "Xn-veg-v2024.Rdata")) -colnames(age) <- fix_names(colnames(age)) - -#CLIMATE MODEL COEFFICIENTS########## - -#1. Get list of climate models---- -climate <- data.frame(path = list.files(file.path(bird_results_root, "ClimateModels", "Coefficients"), full.names = TRUE, pattern="*.csv", recursive = TRUE), - file = list.files(file.path(bird_results_root, "ClimateModels", "Coefficients"), pattern="*.csv", recursive = TRUE)) |> - separate(file, into=c("f1", "model", "species", "bootstrap", "filetype")) |> - dplyr::select(-model, -filetype, -f1) |> - mutate(bootstrap = as.numeric(bootstrap)) |> - inner_join(mods |> - dplyr::select(species, bootstrap) |> - unique()) - -#2. Get list of species---- -spp <- unique(climate$species) - -#3. Get max # of bootstraps---- -bmax <- max(climate$bootstrap) - -#4. Set the column names---- -coefnames <- c("(Intercept)", "MAP", "FFP", "TD", "CMD", "Easting", "Northing", "I(Easting^2)", "I(Northing^2)", "Easting:Northing") -coefrename <- c("Intercept", "MAP", "FFP", "TD", "CMD", "Easting", "Northing", "Easting2", "Northing2", "EastingNorthing") - -#5. Set up loop----- -for(i in 1:length(spp)){ - - #6. List of models for that species---- - climate.i <- dplyr::filter(climate, species==spp[i], - bootstrap %in% c(1:bmax)) - - #7. Read them in---- - #sort and fix names - coef.list <- list() - se.list <- list() - for(j in 1:nrow(climate.i)){ - coef.list[[j]] <- read.csv(climate.i$path[j]) |> - dplyr::select(-se) |> - pivot_wider(names_from="X", values_from = "coef") |> - dplyr::select(all_of(coefnames)) - colnames(coef.list[[j]]) <- coefrename - - se.list[[j]] <- read.csv(climate.i$path[j]) |> - dplyr::select(-coef) |> - pivot_wider(names_from="X", values_from = "se") |> - dplyr::select(all_of(coefnames)) - colnames(se.list[[j]]) <- coefrename - } - - #8. Make the array if first species---- - if(i==1){ - marginal <- array(0, c(length(spp), length(coefrename), bmax)) - dimnames(marginal) <- list(spp, coefrename, paste0("b", c(1:bmax))) - - marginal_se <- array(0, c(length(spp), length(coefrename), bmax)) - dimnames(marginal_se) <- list(spp, coefrename, paste0("b", c(1:bmax))) - } - - #9. Add species to array---- - marginal[spp[i],,] <- as.matrix(t(do.call(rbind, coef.list))) - marginal_se[spp[i],,] <- as.matrix(t(do.call(rbind, se.list))) - - cat("Finished species", i, "of", length(spp), "\n") - -} - -#LANDCOVER MODEL COEFFICIENTS - NORTH############# - -#1. Get the list of north models---- -north <- mods |> - dplyr::filter(region=="north") - -#2. Get list of species---- -spp <- unique(north$species) - -#3. Get the full list of potential continuous covariates---- -#don't need the categorical ones because they're in every model -names.north <- do.call(rbind, unlist(modelsnorth)) |> - data.frame() |> - separate(X3, into=c("X3", "X4", "X5", "X6", "X7", "X8", "X9", "X10", "X11", "X12", "X13", "X14", "X15", "X16", "X17", "X18", "X19", "X20", "X21", "X22", "X23"), sep = " +") |> - dplyr::select(-X1, -X2, -X3) |> - pivot_longer(cols=X4:X23, names_to="position", values_to="name") |> - dplyr::filter(!is.na(name), name!="+") |> - dplyr::select(-position) |> - unique() |> - mutate(name = fix_names(name)) |> - dplyr::filter(!name %in% c("method", "vegc")) - -#4. Get the full north data---- -covs.n <- dplyr::filter(covs, useNorth==TRUE) - -#5. Get the model matrix---- -Xn <- model.matrix(get_terms(modelsnorth), covs.n) -colnames(Xn) <- fix_names(c("Intercept", colnames(Xn)[-1])) - -#6. Set up loop---- -for(i in 1:length(spp)){ - - #7. List of models for that species---- - north.i <- dplyr::filter(north, species==spp[i]) - - coef.list <- list() - se.list <- list() - for(j in 1:nrow(north.i)){ - - #8. Get the raw coefficients----- - #Add zeros for any covariates that weren't in the best model - coef.j <- read.csv(north.i$path[j]) |> - mutate(name = fix_names(name), - name = ifelse(name=="(Intercept)", "Intercept", name)) |> - full_join(data.frame(name = names.north$name)) |> - mutate(coef = ifelse(is.na(coef), 0, coef), - se = ifelse(is.na(se), 0, se)) |> - suppressMessages() - - raw.j <- coef.j$coef - names(raw.j) <- coef.j$name - - raw_se.j <- coef.j$se - names(raw_se.j) <- coef.j$name - - #9. Translate to standardized & transformed coefficients for the veg coefficients---- - mu <- drop(age %*% raw.j[colnames(age)]) - lam.j <- exp(drop(age %*% raw.j[colnames(age)])) - - mu_se <- drop(age %*% raw_se.j[colnames(age)]) - lam_se.j <- exp(drop(age %*% raw_se.j[colnames(age)])) - - #10. Adjust the linear feature coefficients for competing models---- - #replace others with msoft if it is non-zero - #because mSoft is competed with the others in the model set - hf.j <- coef.j |> - dplyr::select(-se) |> - dplyr::filter(name %in% c("mWell", "mSoft", "mEnSft", "mTrSft", "mSeism")) |> - mutate(coef = exp(coef)) |> - pivot_wider(names_from=name, values_from=coef) |> - mutate(mEnSft = ifelse(mSoft!=0 & mEnSft==0, mSoft, mEnSft), - mTrSft = ifelse(mSoft!=0 & mTrSft==0, mSoft, mTrSft), - mSeism = ifelse(mSoft!=0 & mSeism==0, mSoft, mSeism)) |> - pivot_longer(mWell:mSeism, names_to="name", values_to="coef") |> - data.frame() - - hf_se.j <- coef.j |> - dplyr::select(-coef) |> - dplyr::filter(name %in% c("mWell", "mSoft", "mEnSft", "mTrSft", "mSeism")) |> - mutate(se = exp(se)) |> - pivot_wider(names_from=name, values_from=se) |> - mutate(mEnSft = ifelse(mSoft!=0 & mEnSft==0, mSoft, mEnSft), - mTrSft = ifelse(mSoft!=0 & mTrSft==0, mSoft, mTrSft), - mSeism = ifelse(mSoft!=0 & mSeism==0, mSoft, mSeism)) |> - pivot_longer(mWell:mSeism, names_to="name", values_to="se") |> - data.frame() - - #11. Adjust the linear feature and well coefficients---- - - #Human-modified landcover types that we don't want interfering with adjustment - hfc <- c("Crop", "Industrial", "Mine", "RoughP", "Rural", "TameP", "Urban") - - #Dataframe of variables to adjust - vars <- data.frame(var = c("mWell", "mEnSft", "mTrSft", "mSeism")) - - for(k in 1:nrow(vars)){ - - #Make a mock dataframe for the variable - zero.k <- data.frame(var = 0) - colnames(zero.k) <- vars$var[k] - - #Get the rows of interest from the model matrix - #> 0 proportion of variable, no human-modified landover type, no harvest - rows.k <- covs.n |> - mutate(rowid = row_number()) |> - anti_join(zero.k) |> - dplyr::filter(!vegc %in% hfc & - fcc2==0) |> - suppressMessages() - - Xn.k <- Xn[rows.k$rowid, colnames(age)] - - #Make predictions from those rows using the raw coefficient - lam.k <- exp(Xn.k %*% raw.j[colnames(Xn.k)]) - - #Multiply transformed coefficients by those predictions and take the mean - vars$est[k] <- mean(lam.k * hf.j[hf.j$name==vars$var[k],]$coef) - - #Add some extra tracking information - vars$n[k] <- nrow(rows.k) - vars$original[k] <- exp(raw.j[vars$var[k]]) - - } - - #12. Cap open habitat values---- - #for coef only, not se - - #Get maximum lambda for open habitat types - lam.open <- max(lam.j[c(names(lam.j)[endsWith(names(lam.j), "R")], - "GrassHerb", "Shrub", "GraminoidFen", "Marsh")]) - - #Get maximum lambda for open human footprint types - lam.hf <- max(lam.j[c("Industrial", "Rural", "Urban")]) - - #Overall cap value - lam.max <- max(lam.open, lam.hf) - - #Cap the linear features---- - linear <- vars |> - rowwise() |> - mutate(capped = min(est, lam.max)) |> - ungroup() |> - mutate(cap_open = lam.open, - cap_hf = lam.hf, - cap_total = lam.max, - species = spp[i], - boot = j, - name = c("Wellsites", "EnSoftLin", "TrSoftLin", "EnSeismic")) - - linear.j <- linear$capped - names(linear.j) <- linear$name - - linear_se.j <- hf_se.j[hf_se.j$name %in% linear$var, "se"] - names(linear_se.j) <- linear$name - - #13. Put together---- - lam.out <- c(Climate = exp(raw.j["climate"]), - lam.j[names(lam.j)!="Mine"], - linear.j, - HardLin = 0, - Water = 0, - Bare = 0, - SnowIce = 0, - Mine = 0, - MineV = unname(lam.j["Mine"])) - names(lam.out) <- gsub("Spruce", "WhiteSpruce", names(lam.out)) - names(lam.out) <- gsub("Decid", "Deciduous", names(lam.out)) - names(lam.out) <- gsub("Climate.climate", "Climate", names(lam.out)) - names(lam.out) <- gsub("TreedBog", "BlackSpruce", names(lam.out)) - - se.out <- c(Climate = exp(raw_se.j["climate"]), - lam_se.j[names(lam_se.j)!="Mine"], - linear_se.j, - HardLin = 0, - Water = 0, - Bare = 0, - SnowIce = 0, - Mine = 0, - MineV = unname(lam_se.j["Mine"])) - names(se.out) <- gsub("Spruce", "WhiteSpruce", names(se.out)) - names(se.out) <- gsub("Decid", "Deciduous", names(se.out)) - names(se.out) <- gsub("Climate.climate", "Climate", names(se.out)) - names(se.out) <- gsub("TreedBog", "BlackSpruce", names(se.out)) - - #14. Transform back and cap values---- - lam.final <- log(lam.out) - lam.final[lam.final > 10^4] <- 10^4 - lam.final[lam.final < -10^4] <- -10^4 - - coef.list[[j]] <- lam.final - - se.final <- log(se.out) - se.final[is.infinite(se.final)] <- 0 - - se.list[[j]] <- se.final - - } - - #15. Make the array if first species---- - if(i==1){ - joint.n <- array(0, c(length(spp), length(coef.list[[j]]), nrow(north.i))) - dimnames(joint.n) <- list(spp, names(coef.list[[j]]), paste0("b", c(1:nrow(north.i)))) - - joint_se.n <- array(0, c(length(spp), length(se.list[[j]]), nrow(north.i))) - dimnames(joint_se.n) <- list(spp, names(se.list[[j]]), paste0("b", c(1:nrow(north.i)))) - } - - #16. Add species to array---- - joint.n[spp[i],,] <- as.matrix(do.call(cbind, coef.list)) - joint_se.n[spp[i],,] <- as.matrix(do.call(cbind, se.list)) - - cat("Finished species", i, "of", length(spp), "\n") - -} - -#17. Truncate NESP climate coef because it blows up the relative abundance prediction---- -joint.n["NESP","Climate",] <- joint.n["NESP","Climate",]*0.1 - -#LANDCOVER MODEL COEFFICIENTS - SOUTH############# - -#1. Get the list of north models---- -south <- mods |> - dplyr::filter(region=="south") - -#2. Get list of species---- -spp <- unique(south$species) - -#3. Get the full list of potential continuous covariates---- -#don't need the categorical ones because they're in every model -names.south <- do.call(rbind, unlist(modelssouth)) |> - data.frame() |> - separate(X3, into=c("X3", "X4", "X5", "X6", "X7", "X8", "X9"), sep = " +") |> - dplyr::select(-X1, -X2, -X3) |> - pivot_longer(cols=X4:X9, names_to="position", values_to="name") |> - dplyr::filter(!is.na(name), name!="+") |> - dplyr::select(-position) |> - unique() |> - mutate(name = fix_names(name)) |> - dplyr::filter(!name %in% c("method", "soilc")) - -#4. Get the full south data---- -covs.s <- dplyr::filter(covs, useSouth==TRUE, !is.na(soilc)) - -#5. Get the model matrix---- -#use formula from north section above -Xs <- model.matrix(get_terms(modelssouth), covs.s) -colnames(Xs) <- fix_names(c("Intercept", colnames(Xs)[-1])) - -#6. Set up loop---- -for(i in 1:length(spp)){ - - #7. List of models for that species---- - south.i <- dplyr::filter(south, species==spp[i]) - - coef.list <- list() - se.list <- list() - for(j in 1:nrow(south.i)){ - - #9. Get the raw coefficients----- - #Add zeros for any covariates that weren't in the best model - coef.j <- read.csv(south.i$path[j]) |> - mutate(name = fix_names(name), - name = ifelse(name=="(Intercept)", "Intercept", name)) |> - full_join(data.frame(name = names.south$name)) |> - mutate(coef = ifelse(is.na(coef), 0, coef), - se = ifelse(is.na(se), 0, se)) |> - suppressMessages() - - raw.j <- coef.j$coef - names(raw.j) <- coef.j$name - - raw_se.j <- coef.j$se - names(raw_se.j) <- coef.j$name - - #10. Transform the soil estimates and handle intercept---- - names.soil <- c("soilcBlowout", "soilcClaySub", "soilcCrop", - "soilcIndustrial", "soilcMine", "soilcOther", "soilcRapidDrain", - "soilcRoughP", "soilcRural", "soilcSandyLoam", "soilcSoilUnknown", - "soilcTameP", "soilcThinBreak", "soilcUrban", "soilcWater", "soilcWellsites") - - lam.soil <- exp(c(raw.j[1], raw.j[1] + raw.j[names.soil])) - names(lam.soil) <- levels(covs.s$soilc) - - lam_se.soil <- exp(c(raw_se.j[1], raw_se.j[1] + raw_se.j[names.soil])) - names(lam_se.soil) <- levels(covs.s$soilc) - - #11. Adjust the linear feature and well coefficients---- - - #Human-modified landcover types that we don't want interfering with adjustment - hfc <- c("Crop", "Industrial", "Mine", "RoughP", "Rural", "TameP", "Urban") - - #Dataframe of variables to adjust - vars <- data.frame(var = c("mWell", "mSoft")) - - for(k in 1:nrow(vars)){ - - #Make a mock dataframe for the variable - zero.k <- data.frame(var = 0) - colnames(zero.k) <- vars$var[k] - - #Get the rows of interest from the model matrix - #> 0 proportion of variable, no human-modified landover type, no harvest - rows.k <- covs.s |> - mutate(rowid = row_number()) |> - anti_join(zero.k) |> - dplyr::filter(!vegc %in% hfc) |> - suppressMessages() - - Xs.k <- Xs[rows.k$rowid,] - - #Make predictions from those rows using the raw coefficient - lam.k <- exp(Xs.k %*% raw.j[colnames(Xs)]) - - #Multiply transformed coefficient by those predictions and take the mean - vars$est[k] <- mean(lam.k * exp(raw.j[vars$var[k]])) - - #Add some extra tracking information - vars$n[k] <- nrow(rows.k) - vars$original[k] <- exp(raw.j[vars$var[k]]) - - } - - #12. Cap open habitat values---- - #Get maximum lambda for open habitat types - lam.open <- max(lam.soil[c("Loamy", "Blowout", "ClaySub", "RapidDrain", "SandyLoam", "ThinBreak", "Other")]) - - #Get maximum lambda for open human footprint types - lam.hf <- max(lam.soil[c("Industrial", "Rural", "Urban")]) - - #Overall cap value - lam.max <- max(lam.open, lam.hf) - - #Cap the linear features---- - linear <- vars |> - rowwise() |> - mutate(capped = min(est, lam.max)) |> - ungroup() |> - mutate(cap_open = lam.open, - cap_hf = lam.hf, - cap_total = lam.max, - species = spp[i], - boot = j, - name = c("Wellsites", "EnSoft")) - - linear.j <- linear$capped - names(linear.j) <- linear$name - - #13. Put together---- - lam.out <- c(Climate = exp(raw.j["climate"]), - lam.soil[!names(lam.soil) %in% c("Mine", "Water", "Wellsites")], - pAspen = exp(unname(raw.j["paspen"])), - Wellsites = linear$capped[1], - EnSeismic = linear$capped[2], - EnSoftLin = linear$capped[2], - TrSoftLin = linear$capped[2], - HardLin = 0, - Water = 0, - Mine = 0, - MineV = unname(lam.soil["Mine"])) - names(lam.out) <- gsub("Climate.climate", "Climate", names(lam.out)) - - se.out <- c(Climate = exp(raw_se.j["climate"]), - lam_se.soil[!names(lam_se.soil) %in% c("Mine", "Water", "Wellsites")], - Wellsites = exp(raw_se.j["mWell"]), - EnSeismic = exp(raw_se.j["mSoft"]), - EnSoftLin = exp(raw_se.j["mSoft"]), - TrSoftLin = exp(raw_se.j["mSoft"]), - HardLin = 0, - Water = 0, - Mine = 0, - MineV = unname(lam_se.soil["Mine"])) - names(se.out) <- gsub("Climate.climate", "Climate", names(se.out)) - - #14. Transform back and cap values---- - lam.final <- log(lam.out) - lam.final[lam.final > 10^4] <- 10^4 - lam.final[lam.final < -10^4] <- -10^4 - - coef.list[[j]] <- t(lam.final) - - se.final <- log(se.out) - se.final[is.infinite(se.final)] <- 0 - - se.list[[j]] <- t(se.final) - - } - - #15. Make the array if first species---- - if(i==1){ - joint.s <- array(0, c(length(spp), length(coef.list[[j]]), nrow(south.i))) - dimnames(joint.s) <- list(spp, names(lam.final), paste0("b", c(1:nrow(south.i)))) - - joint_se.s <- array(0, c(length(spp), length(se.list[[j]]), nrow(south.i))) - dimnames(joint_se.s) <- list(spp, names(se.final), paste0("b", c(1:nrow(south.i)))) - } - - #16. Add species to array---- - joint.s[spp[i],,] <- as.matrix(do.call(cbind, coef.list)) - joint_se.s[spp[i],,] <- as.matrix(do.call(cbind, se.list)) - - cat("Finished species", i, "of", length(spp), "\n") - -} - -#17. Truncate NESP climate coef because it blows up the relative abundance prediction---- -joint.n["NESP","Climate",] <- joint.n["NESP","Climate",]*0.1 - -#MEDIAN BOOTSTRAP SELECTION######## - -#1. List of species*region---- -regions <- mods |> - dplyr::select(species, region) |> - unique() - -todo <- regions |> - dplyr::select(species) |> - unique() - -#2. Set up loop---- -boots <- data.frame() -for(i in 1:nrow(todo)){ - - #3. Settings---- - spp.i <- todo$species[i] - regions.i <- regions |> - dplyr::filter(species==spp.i) - region.i <- ifelse(nrow(regions.i)==2, "both", unique(regions.i$region)) - - #4. Get the right matrix---- - if("north" %in% regions.i$region){ - north.i <- t(as.matrix(joint.n[spp.i,,])) - } - if("south" %in% regions.i$region){ - south.i <- t(as.matrix(joint.s[spp.i,,])) - } - - if(region.i=="both"){coefs.i <- cbind(north.i, south.i)} - if(region.i=="north"){coefs.i <- north.i} - if(region.i=="south"){coefs.i <- south.i} - - #5. Run an NMDS---- - set.seed(i) - nmds.i <- metaMDS(coefs.i, k=2, distance="euclidean", trace=0) - - #6. Get the site scores---- - scores.i <- scores(nmds.i, display="sites") - - #7. Calculate centroid---- - centroid.i <- colMeans(scores.i) - - #8. Get distances to centroid---- - dist.i <- data.frame(scores.i) |> - mutate(distance = sqrt((NMDS1-centroid.i[1])^2 + (NMDS2-centroid.i[2])^2)) |> - rownames_to_column() |> - rename(bootstrap = rowname) |> - mutate(bootstrap = as.numeric(str_sub(bootstrap, 2, 3))) - - #9. Get closest bootstrap---- - min.i <- dist.i |> - dplyr::filter(distance==min(distance)) - - boots <- rbind(boots, - min.i |> - mutate(species = spp.i, - region = region.i)) - - cat("Finished nmds", i, "of", nrow(todo), "\n") - - -} - -#MODEL EVALUATION######### - -#1. Peter's AUC functions---- -simple_roc <- function(labels, scores){ - Labels <- labels[order(scores, decreasing=TRUE)] - data.frame( - TPR=cumsum(Labels)/sum(Labels), - FPR=cumsum(!Labels)/sum(!Labels), - Labels=Labels) -} - -simple_auc <- function(ROC) { - ROC$inv_spec <- 1-ROC$FPR - dx <- diff(ROC$inv_spec) - sum(dx * ROC$TPR[-1]) / sum(dx) -} - -#2. Get list of median models---- -loop <- data.frame(path = list.files(file.path(bird_results_root, "LandcoverModels", "Models"), full.names = TRUE, pattern="*.Rdata", recursive = TRUE), - file = list.files(file.path(bird_results_root, "LandcoverModels", "Models"), pattern="*.Rdata", recursive = TRUE)) |> - separate(file, into=c("region", "sp1", "region2", "species", "bootstrap", "filetype")) |> - mutate(bootstrap = as.numeric(bootstrap)) |> - dplyr::select(-filetype, -region2, -sp1) |> - inner_join(rbind(boots |> - dplyr::filter(region %in% c("north", "south")), - boots |> - dplyr::filter(region=="both") |> - mutate(region="north"), - boots |> - dplyr::filter(region=="both") |> - mutate(region="south")), - by=c("species", "region", "bootstrap")) - -#3. Set up loop---- -loop$AUC_binary <- NA -loop$AUC_poisson <- NA -for(i in 1:nrow(loop)){ - - #4. Load the model---- - load.i <-try(load(loop$path[i])) - if(inherits(load.i, "try-error")){ next } - - #5. Make predictions on training data---- - pred.i <- predict(bestmodel, type="response") - - #6. AUC for binary response---- - bestmodel$binary <- ifelse(bestmodel$y > 1, 1, bestmodel$y) - roc.i <- try(roc(response=bestmodel$binary, predictor=pred.i, quiet=TRUE)) - if(inherits(roc.i, "try-error")){loop$AUC_binary[i] <- NA} else {loop$AUC_binary[i] <- auc(roc.i)} - - #7. AUC for count response---- - roc.p <- simple_roc(labels=bestmodel$y, scores=pred.i) - loop$AUC_poisson[i] <- simple_auc(roc.p) - - cat("Finished model ", i, "of", nrow(loop), "\n") - - -} - -#8. Tidy---- -auc.out <- loop -rm(loop) - -#PACKAGING########## - -#1. Change array names from code to common name---- - -#Get lookup table -birdnames <- read.csv(file.path(root, "Data", "lookups", "birdlist.csv")) - -#Match -birdnames.m <- birdnames |> - arrange(code) |> - dplyr::filter(code %in% dimnames(marginal)[[1]]) - -birdnames.n <- birdnames |> - arrange(code) |> - dplyr::filter(code %in% dimnames(joint.n)[[1]]) - -birdnames.s <- birdnames |> - arrange(code) |> - dplyr::filter(code %in% dimnames(joint.s)[[1]]) - -#Replace -dimnames(marginal) <- list(birdnames.m$sppid, dimnames(marginal)[[2]], dimnames(marginal)[[3]]) - -dimnames(marginal_se) <- list(birdnames.m$sppid, dimnames(marginal_se)[[2]], dimnames(marginal)[[3]]) - -dimnames(joint.n) <- list(birdnames.n$sppid, dimnames(joint.n)[[2]], dimnames(marginal)[[3]]) - -dimnames(joint_se.n) <- list(birdnames.n$sppid, dimnames(joint_se.n)[[2]], dimnames(marginal)[[3]]) - -dimnames(joint.s) <- list(birdnames.s$sppid, dimnames(joint.s)[[2]], dimnames(marginal)[[3]]) - -dimnames(joint_se.s) <- list(birdnames.s$sppid, dimnames(joint_se.s)[[2]], dimnames(marginal)[[3]]) - -#2. Bird look up table----- - -#Get the show details -birds2024 <- read.csv(file.path(root, "Data", "lookups", "birds-v2024.csv")) |> - rename(species = common) |> - dplyr::select(species, show) - -#Get the occurrence totals -occurrence <- bird |> - pivot_longer(ALFL:YRWA, names_to="code", values_to="count") |> - dplyr::filter(count > 0) |> - group_by(code) |> - summarize(Occurrences = n()) |> - ungroup() - -#Get the AUC values -auc <- auc.out |> - rename(code = species) |> - group_by(code, region) |> - summarize(AUC = mean(AUC_poisson)) |> - ungroup() |> - pivot_wider(names_from="region", values_from=c("AUC")) - -#Wrangle the median bootstrap -bootuse <- boots |> - dplyr::select(species, bootstrap) |> - rename(code = species) - -#set species to remove -spp.remove <- c("VEER", "LEYE") - -#set different plot truncation quantile species -q990 <- c("NOFL", "BTNW", "BLPW", "CEDW", "CMWA", "COGR", "EAPH", "HOSP", "PUFI", "SOSP", "WBNU", "YHBL", "YRWA") -q999 <- c("BLBW", "MOCH", "WCSP") - -#Make the table -birdtable <- birdnames |> - dplyr::filter(sppid %in% dimnames(joint.n)[[1]] | sppid %in% dimnames(joint.s)[[1]]) |> - left_join(birds2024) |> - left_join(occurrence) |> - left_join(auc) |> - left_join(bootuse) |> - mutate(ModelNorth = ifelse(show %in% c("c", "n"), TRUE, FALSE), - ModelSouth = ifelse(show %in% c("c", "s"), TRUE, FALSE), - LinkHabitat = "log", - LinkSpclim = "log", - Group = "birds", - Nonnative = FALSE, - Use = ifelse(code %in% spp.remove, FALSE, TRUE), - PlotQuantile = case_when(code %in% q990 ~ 0.990, - code %in% q999 ~ 0.999, - !is.na(code) & Use==TRUE ~ 0.995)) |> - rename(SpeciesID = sppid, - ScientificName = scinam, - CommonName = species, - Comments = code) |> - rename(AUCNorth = north, AUCSouth = south, Bootstrap = bootstrap) |> - dplyr::select(SpeciesID, ScientificName, CommonName, ModelNorth, ModelSouth, Occurrences, Nonnative, LinkHabitat, LinkSpclim, AUCNorth, AUCSouth, Bootstrap, Comments, Group, Use, PlotQuantile) - -#3. Put together---- -birds <- list( - north = list(marginal = marginal, marginal_se = marginal_se, joint = joint.n, joint_se = joint_se.n), - south = list(marginal = marginal, marginal_se = marginal_se, joint = joint.s, joint_se = joint_se.s), - species = birdtable -) - -#4. Save---- -save(birds, file = out_file) - -cat("\nWrote ", out_file, "\n", sep = "") - -# End of script ---- diff --git a/1_code/_setup/05_harmonize_v2_results.R b/1_code/_setup/05_harmonize_v2_results.R deleted file mode 100644 index 648f9cf..0000000 --- a/1_code/_setup/05_harmonize_v2_results.R +++ /dev/null @@ -1,1155 +0,0 @@ -# --- -# title: Harmonize the v2 Results into One Parity Reference -# author: Brendan Casey -# created: 2026-09-13 -# inputs: -# plants, in the VegetationModels project: -# - 3_output/coefficients/COEFS.RData -# mammals, on the ABMI Mammals drive: -# - .../Landcover/North/Coefficient Tables/*.Rdata -# - .../Landcover/South/Coefficient Tables/*.Rdata -# - .../Climate/Coefficients/* Climate Coefficients.RData -# birds, preferred: -# - 2_pipeline/v2_reference/Birds2024.RData, from -# 1_code/_setup/04_package_bird_coefficients.R -# birds, fallback, on the work_abmi shared drive reached -# through remote/BirdModels.lnk: -# - Results/Archive/ClimateModels/Coefficients//*.csv -# - Results/Archive/LandcoverModels/Coefficients// -# /*.csv -# outputs: -# - 0_data/v2_results/v2_results.csv -# - 0_data/v2_results/v2_results_coverage.csv -# notes: -# - Legacy: not re-run. Parity is scored against the -# ABMIexploreR reference (08). Its output is published frozen -# with 0_data/v2_results/ by 10_publish_datasets.R, and its -# inputs are not mirrored to ABMI-DATA2. -# - One long table of the published v2 results, so that a run -# in 3_output/exp_000_parity_v2/ can be scored against a -# single file rather than against three storage formats on -# two drives. -# -# - The v2 outputs are stored three different ways. Plants are -# 3-D arrays of species by term by bootstrap draw. Mammal -# landcover is a species-by-term matrix with no draws, since -# that stage fits once. Mammal climate is one small data -# frame per species. This flattens all three to the same -# columns, and records `v2_n` so a consumer can tell a -# 100-draw distribution from a single fitted value. -# -# - Plants come from COEFS.RData rather than from the -# per-taxon model files. That is v2's own standardization -# output, and its header says it exists "to allow for the -# checking of model coefficients between versions", which is -# this exact use. It also sidesteps a trap: the published -# bryophyte-species-models.Rdata is entirely error objects, -# while the bryophyte arrays inside COEFS.RData are complete -# and finite. COEFS was built before that file was -# overwritten by a failed re-run. -# -# - Mammal seasons are averaged, not selected. v2 writes one -# row per species in its `.all` tables, holding the mean of -# the summer and winter fits where both exist and the single -# fit where only one does. The harness models seasons -# separately, so a `Moose_Summer` result is NOT comparable -# to the moose row here unless moose is summer-only. The -# season column says "all" to make that visible rather than -# leaving it to be discovered. Comparing properly means -# averaging the harness's two seasons first. -# -# - Plant climate is fitted once on all data, not per region, -# so those rows carry region "all". A run's north and south -# climate results are both scored against them. -# -# - Birds are the slow one, and are cached. Their coefficients -# are stored as one small csv per species per draw, roughly -# 31,000 files, on a Google Drive mount that costs about -# 470 ms per file opened serially. Reading them twelve at a -# time brings a full pass to about half an hour, and the -# result is cached so a re-run is seconds. Delete the cache -# or set refresh_birds to rebuild it. -# -# - The bird path in the v2 scripts, G:/Shared drives/ -# ABMI_RHedley/Projects/BirdModels, is not mounted here. The -# same directory is reached through a shortcut on the -# work_abmi drive, which resolves to a shortcut-targets-by-id -# path. That resolved path is the default below. -# -# - Bird results are taken from Results/Archive/, not from -# Results/. The live directory holds a partial re-run of a -# single species from August 2026; the archive holds the last -# complete set, 133 species for climate and 112 north and 68 -# south for landcover. The two disagree numerically, as two -# runs of an unseeded pipeline must, so they are not mixed. -# The script picks whichever has more species and says which -# it used. -# -# - Read only. Nothing is written to either source drive. -# --- - -# 1. Setup ---- - -## 1.1 Load packages ---- -library(data.table) # fast csv reading and writing (v: 1.16.4) -library(parallel) # bird reads are latency-bound (version: 4.5.0) - -## 1.2 Resolve the source locations ---- -# Overridable, because the drives are mounted differently on -# different machines. -project_root <- normalizePath(getwd(), winslash = "/") - -v2_plant_project <- Sys.getenv( - "SDM_V2_PROJECT", - unset = "//ABMI-DATA2/science/sc/ToEmily/VegetationModels" -) - -v2_mammal_root <- Sys.getenv( - "SDM_V2_MAMMAL_ROOT", - unset = paste0( - "G:/Shared drives/ABMI Mammals/Results/Habitat Modeling/2024" - ) -) - -# The path in the v2 scripts is not mounted. This is the same -# directory reached through remote/BirdModels.lnk on work_abmi. -v2_bird_root <- Sys.getenv( - "SDM_V2_BIRD_ROOT", - unset = paste0( - "G:/.shortcut-targets-by-id/", - "17Ymt13eHfKvIiuoMl6x-Kn74Z2uVbbzS/BirdModels" - ) -) - -# Birds cost about half an hour on a cold cache. FALSE skips -# them and records the taxon as deliberately excluded. -include_birds <- TRUE - -# TRUE ignores the cache and re-reads every file. -refresh_birds <- FALSE - -# 1 reads serially, which is the only setting measured to be -# reliable here: concurrency trips a refusal state in Google -# Drive that outlasts retries. Serial costs about three hours -# for the full set, once, and then it is cached. -bird_workers <- 1L - -# The harmonized reference is analysis-ready data, so it sits in -# 0_data alongside v2_scripts rather than in 2_pipeline. What -# stays in 2_pipeline is genuinely intermediate: the bird read -# cache, and the packaged bird object that 04 writes. -results_dir <- file.path(project_root, "0_data/v2_results") - -out_dir <- file.path(project_root, "2_pipeline/v2_reference") - -for (one in c(results_dir, out_dir)) { - dir.create(one, recursive = TRUE, showWarnings = FALSE) -} - -## 1.3 Name the output columns ---- -# Declared once so every reader returns the same frame and a -# missing source cannot quietly change the schema. -result_columns <- c( - "taxon", "region", "stage", "part", "season", - "species", "species_v2", "term", - "v2_median", "v2_p10", "v2_p90", "v2_se", "v2_n", "source" -) - -# 2. Plants ---- -# COEFS[[group]][[part]] is species x term x draw. - -## 2.1 Name the mapping from v2 groups to data slugs ---- -plant_groups <- c( - Bryophytes = "bryophyte", - Lichens = "lichen", - Mites = "mite", - VascularPlants = "vascular_plant" -) - -# v2 fits vegetation in the north and soil in the south. Climate -# is fitted once on everything. -plant_parts <- list( - vegetation = list(region = "north", stage = "habitat"), - soil = list(region = "south", stage = "habitat"), - climate = list(region = "all", stage = "climate") -) - -## 2.2 read_plant_results() ---- - -#' Flatten the Plant Coefficient Arrays -#' -#' @param path Character. Path to COEFS.RData. -#' @return A data frame in the output schema, or NULL. -#' -#' @example # Example usage of the function -#' # read_plant_results("3_output/coefficients/COEFS.RData") -read_plant_results <- function(path) { - if (!file.exists(path)) { - return(NULL) - } - - env <- new.env() - load(path, envir = env) - - if (is.null(env$COEFS)) { - return(NULL) - } - - rows <- list() - - for (group in names(env$COEFS)) { - slug <- plant_groups[[group]] - - if (is.null(slug)) { - next - } - - for (part in names(plant_parts)) { - values <- env$COEFS[[group]][[part]] - - if (is.null(values) || length(dim(values)) != 3) { - next - } - - # Summarized across draws, which is dimension three. The - # band is what the gate scores against, so it is computed - # here once rather than in every consumer. - summarize <- function(f) { - apply(values, c(1, 2), function(x) { - x <- x[is.finite(x)] - - if (length(x) == 0) { - return(NA_real_) - } - - f(x) - }) - } - - medians <- summarize(stats::median) - p10 <- summarize(function(x) { - stats::quantile(x, 0.1, names = FALSE) - }) - p90 <- summarize(function(x) { - stats::quantile(x, 0.9, names = FALSE) - }) - counts <- apply(values, c(1, 2), function(x) { - sum(is.finite(x)) - }) - - species <- rownames(medians) - terms <- colnames(medians) - - block <- data.frame( - taxon = slug, - region = plant_parts[[part]]$region, - stage = plant_parts[[part]]$stage, - part = "detection", - season = NA_character_, - species = rep(species, times = length(terms)), - species_v2 = rep(species, times = length(terms)), - term = rep(terms, each = length(species)), - v2_median = as.vector(medians), - v2_p10 = as.vector(p10), - v2_p90 = as.vector(p90), - v2_se = NA_real_, - v2_n = as.vector(counts), - source = basename(path), - stringsAsFactors = FALSE - ) - - rows[[paste(group, part)]] <- block[block$v2_n > 0, ] - } - } - - if (length(rows) == 0) { - return(NULL) - } - - do.call(rbind, rows) -} - -# 3. Mammals ---- - -## 3.1 mammal_key() ---- - -#' Reduce a v2 Mammal Name to the Harness Key -#' -#' v2 names species with spaces and punctuation, and the -#' harmonized response squashes them. Reducing both to letters -#' is what the existing comparison already does. -#' -#' @param x Character vector of v2 species names. -#' @return Character vector of keys. -#' -#' @example # Example usage of the function -#' # mammal_key("Elk (wapiti)") # "Elkwapiti" -mammal_key <- function(x) { - gsub("[^A-Za-z]", "", x) -} - -## 3.2 read_mammal_landcover() ---- - -#' Flatten One Mammal Landcover Coefficient Table -#' -#' The three reported quantities are different things, so each -#' is kept as its own `part` rather than merged: presence is a -#' probability, abundance-given-presence is on the response -#' scale, and total is their calibrated product. -#' -#' @param dir_path Character. A Coefficient Tables directory. -#' @param region Character. "north" or "south". -#' @return A data frame in the output schema, or NULL. -#' -#' @example # Example usage of the function -#' # read_mammal_landcover(dir_path, "north") -read_mammal_landcover <- function(dir_path, region) { - if (!dir.exists(dir_path)) { - return(NULL) - } - - files <- sort(list.files( - dir_path, pattern = "[.]Rdata$", full.names = TRUE - )) - - if (length(files) == 0) { - return(NULL) - } - - # The newest table wins. v2 keeps dated copies side by side. - path <- files[length(files)] - - env <- new.env() - load(path, envir = env) - - parts <- list( - presence = c("Coef.pa.all", "Coef.pa.se.all"), - abundance = c("Coef.agp.all", "Coef.agp.se.all"), - total = c("Coef.mean.all", "Coef.mean.se.all") - ) - - rows <- list() - - for (part in names(parts)) { - estimates <- env[[parts[[part]][1]]] - errors <- env[[parts[[part]][2]]] - - if (is.null(estimates)) { - next - } - - species <- rownames(estimates) - terms <- colnames(estimates) - - # The standard errors are a separate matrix and can carry a - # different term set, so they are matched by name. - se_values <- if (is.null(errors)) { - rep(NA_real_, length(estimates)) - } else { - as.vector(errors[ - match(species, rownames(errors)), - match(terms, colnames(errors)), - drop = FALSE - ]) - } - - rows[[part]] <- data.frame( - taxon = "mammal", - region = region, - stage = "habitat", - part = part, - # See the header: this is the mean of the seasons where - # both were fitted, not one of them. - season = "all", - species = rep(mammal_key(species), times = length(terms)), - species_v2 = rep(species, times = length(terms)), - term = rep(terms, each = length(species)), - v2_median = as.vector(estimates), - v2_p10 = NA_real_, - v2_p90 = NA_real_, - v2_se = se_values, - v2_n = 1L, - source = basename(path), - stringsAsFactors = FALSE - ) - } - - if (length(rows) == 0) { - return(NULL) - } - - out <- do.call(rbind, rows) - - out[is.finite(out$v2_median), ] -} - -## 3.3 read_mammal_climate() ---- - -#' Flatten the Mammal Climate Coefficients -#' -#' One file per species, each holding an AICc-averaged -#' coefficient per term. The mammal climate pipeline does not -#' bootstrap, so there is no band. -#' -#' @param dir_path Character. The Climate/Coefficients folder. -#' @return A data frame in the output schema, or NULL. -#' -#' @example # Example usage of the function -#' # read_mammal_climate(dir_path) -read_mammal_climate <- function(dir_path) { - if (!dir.exists(dir_path)) { - return(NULL) - } - - files <- list.files( - dir_path, pattern = "Climate Coefficients[.]RData$", - full.names = TRUE - ) - - if (length(files) == 0) { - return(NULL) - } - - rows <- lapply(files, function(path) { - env <- new.env() - load(path, envir = env) - - if (is.null(env$avg_coef)) { - return(NULL) - } - - name <- sub( - " Climate Coefficients[.]RData$", "", basename(path) - ) - - data.frame( - taxon = "mammal", - region = "all", - stage = "climate", - part = "presence", - season = "all", - species = mammal_key(name), - species_v2 = name, - # v2 names the intercept with parentheses here and without - # them in the plant tables. Normalized to the plant form, - # which is what the comparison already expects. - term = sub( - "^\\(Intercept\\)$", "Intercept", - as.character(env$avg_coef$term) - ), - v2_median = as.numeric(env$avg_coef$coef), - v2_p10 = NA_real_, - v2_p90 = NA_real_, - v2_se = NA_real_, - v2_n = 1L, - source = basename(path), - stringsAsFactors = FALSE - ) - }) - - out <- do.call(rbind, rows) - - if (is.null(out)) { - return(NULL) - } - - out[is.finite(out$v2_median), ] -} - -# 4. Birds ---- -# One csv per species per draw, on a high-latency mount. - -## 4.1 bird_source_dir() ---- - -#' Choose Between the Live and Archived Bird Results -#' -#' The live directory holds a partial re-run; the archive holds -#' the last complete set. Two runs of an unseeded pipeline give -#' different numbers, so they are never mixed: whichever covers -#' more species wins outright. -#' -#' @param root Character. The BirdModels directory. -#' @param leaf Character. Path below Results, for example -#' "ClimateModels/Coefficients". -#' @return A list of dir, label and species count, or NULL. -#' -#' @example # Example usage of the function -#' # bird_source_dir(root, "ClimateModels/Coefficients") -bird_source_dir <- function(root, leaf) { - options <- list( - live = file.path(root, "Results", leaf), - archive = file.path(root, "Results", "Archive", leaf) - ) - - counts <- vapply(options, function(one) { - if (!dir.exists(one)) { - return(-1L) - } - - length(list.dirs(one, recursive = FALSE)) - }, integer(1)) - - if (all(counts < 0)) { - return(NULL) - } - - best <- names(counts)[which.max(counts)] - - list( - dir = options[[best]], - label = best, - species = counts[[best]] - ) -} - -## 4.2 read_bird_csv_set() ---- - -#' Read Every Draw for Every Species Under One Directory -#' -#' Worked one species at a time, with retries, because this -#' mount fails under sustained parallel load. Two things were -#' learned the hard way and are encoded here. -#' -#' A single parallel call over all 13,300 files kills the socket -#' cluster part-way through and loses everything, so the unit of -#' work is one species, about a hundred files. -#' -#' Under load, Google Drive starts refusing to materialize files -#' with "Invalid request code". The failure is transient: every -#' file that failed in one pass read correctly moments later. -#' So a failed read is retried inside the worker after a pause, -#' failed species are retried again at the end, and the caller -#' is told what is still missing rather than being handed a -#' quietly short result. -#' -#' @param dir_path Character. Holds one directory per species. -#' @param term_column Character. Which column names the term. -#' The climate files write rownames into an unnamed first -#' column, which fread calls V1; the landcover files carry a -#' "name" column instead. -#' @param workers Integer. Parallel readers. Kept low on -#' purpose: throughput is not the constraint, the mount is. -#' @param attempts Integer. Passes over the species that failed. -#' @return A data frame of species, term, boot, coef and se, -#' carrying a "failed" attribute naming any species missing. -#' -#' @example # Example usage of the function -#' # read_bird_csv_set(dir_path, "V1", workers = 4) -read_bird_csv_set <- function(dir_path, term_column, workers, - attempts = 3L) { - species_dirs <- list.dirs(dir_path, recursive = FALSE) - - if (length(species_dirs) == 0) { - return(NULL) - } - - cat(" ", length(species_dirs), " species directories\n", - sep = "") - - # workers = 1 means no cluster at all. Measured on this mount: - # 400 consecutive serial reads succeeded with zero failures at - # about 360 ms each, where four parallel readers threw the - # mount into a refusal state that outlasted several retries. - # Concurrency, not volume, is what trips it. - serial <- workers <= 1L - - cluster <- if (serial) NULL else makeCluster(workers) - - on.exit( - if (!is.null(cluster)) try(stopCluster(cluster), silent = TRUE), - add = TRUE - ) - - # Retried inside the worker, because a refusal is transient - # and a short pause is cheaper than losing the species. - read_file <- function(path) { - for (try_n in 1:4) { - x <- tryCatch( - data.table::fread(path), error = function(e) NULL - ) - - if (!is.null(x) && nrow(x) > 0) { - return(as.data.frame(x)) - } - - Sys.sleep(0.25 * try_n) - } - - NULL - } - - if (!serial) { - clusterExport(cluster, "read_file", envir = environment()) - } - - read_species <- function(files) { - if (serial) { - return(lapply(files, read_file)) - } - - parLapply(cluster, files, read_file) - } - - started <- Sys.time() - collected <- list() - pending <- species_dirs - - for (pass in seq_len(attempts)) { - if (length(pending) == 0) { - break - } - - if (pass > 1) { - cat(" retry pass ", pass, " for ", length(pending), - " species\n", sep = "") - - # A refusal state persists well past twenty seconds, which - # is why the first retrying version still failed every - # pass. Two minutes is what it takes to clear. - Sys.sleep(120) - } - - still_pending <- character(0) - - for (index in seq_along(pending)) { - one_dir <- pending[index] - species <- basename(one_dir) - - files <- list.files( - one_dir, pattern = "[.]csv$", full.names = TRUE - ) - - if (length(files) == 0) { - next - } - - parts <- tryCatch( - read_species(files), - error = function(e) NULL - ) - - # A dead cluster is the other failure mode; rebuild it. - if (is.null(parts) && !serial) { - try(stopCluster(cluster), silent = TRUE) - cluster <- makeCluster(workers) - clusterExport( - cluster, "read_file", envir = environment() - ) - - parts <- tryCatch( - read_species(files), - error = function(e) NULL - ) - } - - usable <- !vapply(parts, is.null, logical(1)) - - if (is.null(parts) || !any(usable)) { - still_pending <- c(still_pending, one_dir) - next - } - - draws <- suppressWarnings(as.integer(sub( - "[.]csv$", "", sub(".*_", "", basename(files)) - ))) - - rows <- lapply(which(usable), function(i) { - x <- parts[[i]] - - if (!term_column %in% names(x)) { - return(NULL) - } - - data.frame( - species = species, - term = as.character(x[[term_column]]), - boot = draws[i], - coef = as.numeric(x$coef), - se = as.numeric(x$se), - stringsAsFactors = FALSE - ) - }) - - collected[[species]] <- do.call(rbind, rows) - - # A species read only in part is worth keeping but is not - # complete, so it goes round again. - if (sum(usable) < length(files)) { - still_pending <- c(still_pending, one_dir) - } - - if (index %% 20 == 0 || index == length(pending)) { - cat(" ", index, " of ", length(pending), " (", - format(round(Sys.time() - started, 1)), ")\n", - sep = "") - } - } - - pending <- still_pending - } - - failed <- basename(pending) - - if (length(failed) > 0) { - cat(" incomplete after ", attempts, " passes: ", - length(failed), " species (", - paste(utils::head(failed, 5), collapse = ", "), ")\n", - sep = "") - } - - out <- do.call(rbind, collected) - - if (is.null(out)) { - return(NULL) - } - - out <- out[is.finite(out$coef), ] - attr(out, "failed") <- failed - - out -} - -## 4.3 summarize_bird_draws() ---- - -#' Reduce Bird Draws to the Output Schema -#' -#' @param draws A data frame from read_bird_csv_set(). -#' @param region Character. "north", "south" or "all". -#' @param stage Character. "climate" or "habitat". -#' @param source Character. Which directory it came from. -#' @return A data frame in the output schema, or NULL. -#' -#' @example # Example usage of the function -#' # summarize_bird_draws(draws, "north", "habitat", "archive") -summarize_bird_draws <- function(draws, region, stage, source) { - if (is.null(draws) || nrow(draws) == 0) { - return(NULL) - } - - # Grouped with data.table rather than by pasting species and - # term into one string key. A pasted key needs a separator - # that can appear in neither, and bird terms legitimately - # carry punctuation such as I(Easting^2) and Easting:Northing. - values <- data.table::as.data.table(draws) - - summary_rows <- as.data.frame( - values[ - is.finite(coef), - list( - v2_median = stats::median(coef), - v2_p10 = stats::quantile(coef, 0.1, names = FALSE), - v2_p90 = stats::quantile(coef, 0.9, names = FALSE), - v2_n = .N - ), - by = list(species, term) - ] - ) - - if (nrow(summary_rows) == 0) { - return(NULL) - } - - data.frame( - taxon = "bird", - region = region, - stage = stage, - # Birds model counts, not detection or density. - part = "count", - season = NA_character_, - species = summary_rows$species, - species_v2 = summary_rows$species, - # v2 writes the intercept with parentheses here; normalized - # to the plant form that the comparison expects. - term = sub( - "^[(]Intercept[)]$", "Intercept", summary_rows$term - ), - v2_median = summary_rows$v2_median, - v2_p10 = summary_rows$v2_p10, - v2_p90 = summary_rows$v2_p90, - v2_se = NA_real_, - v2_n = summary_rows$v2_n, - source = source, - stringsAsFactors = FALSE - ) -} - -## 4.4 read_bird_results() ---- - -#' Read and Cache Every Bird Result -#' -#' @param root Character. The BirdModels directory. -#' @param cache_path Character. Where the cached frame lives. -#' @param workers Integer. Parallel readers. -#' @param refresh Logical. TRUE ignores any cache. -#' @return A list of rows and a note. -#' -#' @example # Example usage of the function -#' # read_bird_results(root, cache_path, 12L, FALSE) -read_bird_results <- function(root, cache_path, workers, - refresh = FALSE) { - if (!refresh && file.exists(cache_path)) { - cat("Reading birds from cache:", cache_path, "\n") - - return(list(rows = readRDS(cache_path), note = "from cache")) - } - - if (!dir.exists(root)) { - return(list(rows = NULL, note = "bird root not reachable")) - } - - blocks <- list() - labels <- character(0) - missing <- character(0) - - climate <- bird_source_dir(root, "ClimateModels/Coefficients") - - if (!is.null(climate)) { - cat("Reading bird climate (", climate$label, "):\n", sep = "") - - draws <- read_bird_csv_set(climate$dir, "V1", workers) - - blocks$climate <- summarize_bird_draws( - draws, "all", "climate", paste("bird", climate$label) - ) - - missing <- c(missing, attr(draws, "failed")) - labels <- c(labels, paste0("climate: ", climate$label)) - } - - for (region in c("north", "south")) { - leaf <- file.path("LandcoverModels/Coefficients", region) - landcover <- bird_source_dir(root, leaf) - - if (is.null(landcover)) { - next - } - - cat("Reading bird landcover ", region, " (", - landcover$label, "):\n", sep = "") - - draws <- read_bird_csv_set(landcover$dir, "name", workers) - - blocks[[region]] <- summarize_bird_draws( - draws, region, "habitat", paste("bird", landcover$label) - ) - - missing <- c(missing, attr(draws, "failed")) - labels <- c(labels, paste0(region, ": ", landcover$label)) - } - - kept <- blocks[!vapply(blocks, is.null, logical(1))] - - if (length(kept) == 0) { - return(list(rows = NULL, note = "no bird coefficients found")) - } - - rows <- do.call(rbind, kept) - - note <- paste(labels, collapse = "; ") - - # An incomplete read is never cached. Caching one would make - # the next run silently reuse a short reference, which is the - # worst of both: fast and wrong. - if (length(missing) > 0) { - note <- paste0( - note, "; INCOMPLETE, ", length(missing), - " species unread, not cached" - ) - - cat(" not caching: ", length(missing), - " species could not be read -", sep = "") - - return(list(rows = rows, note = note)) - } - - dir.create( - dirname(cache_path), recursive = TRUE, showWarnings = FALSE - ) - saveRDS(rows, cache_path) - - list(rows = rows, note = note) -} - -## 4.5 read_packaged_birds() ---- - -#' Flatten the Packaged Bird Object -#' -#' Reads the `birds` object that 04_package_bird_coefficients.R -#' writes, which is the v2 packaging step run against the -#' per-draw csvs. -#' -#' Preferred over reading those csvs directly for two reasons. -#' It is one file rather than 31,000 on a mount that throttles. -#' And its coefficients are already on the cross-taxa -#' standardized template, the same WhiteSpruceR and Loamy term -#' space the plant tables use, rather than the raw glm factor -#' names vegcCrop and soilcLoamy, which nothing else shares. -#' -#' The object holds `marginal` for the climate stage and `joint` -#' for the landcover stage, each species by term by draw. The -#' north and south entries carry the same `marginal`, because v2 -#' fits climate once on all data, so it is read from the north -#' entry only and filed as region "all". -#' -#' @param path Character. Path to the packaged Birds RData. -#' @return A data frame in the output schema, or NULL. -#' -#' @example # Example usage of the function -#' # read_packaged_birds("2_pipeline/v2_reference/Birds2024.RData") -read_packaged_birds <- function(path) { - if (!file.exists(path)) { - return(NULL) - } - - env <- new.env() - load(path, envir = env) - - birds <- env$birds - - if (is.null(birds) || is.null(birds$north)) { - return(NULL) - } - - # Summarized across draws, which is the third dimension. - summarize_array <- function(values, region, stage) { - if (is.null(values) || length(dim(values)) != 3) { - return(NULL) - } - - across <- function(f) { - apply(values, c(1, 2), function(x) { - x <- x[is.finite(x)] - - if (length(x) == 0) { - return(NA_real_) - } - - f(x) - }) - } - - medians <- across(stats::median) - p10 <- across(function(x) { - stats::quantile(x, 0.1, names = FALSE) - }) - p90 <- across(function(x) { - stats::quantile(x, 0.9, names = FALSE) - }) - counts <- apply(values, c(1, 2), function(x) { - sum(is.finite(x)) - }) - - species <- rownames(medians) - terms <- colnames(medians) - - out <- data.frame( - taxon = "bird", - region = region, - stage = stage, - # Birds model counts, not detection or density. - part = "count", - season = NA_character_, - species = rep(species, times = length(terms)), - species_v2 = rep(species, times = length(terms)), - term = rep(terms, each = length(species)), - v2_median = as.vector(medians), - v2_p10 = as.vector(p10), - v2_p90 = as.vector(p90), - v2_se = NA_real_, - v2_n = as.vector(counts), - source = basename(path), - stringsAsFactors = FALSE - ) - - out[out$v2_n > 0, ] - } - - rows <- list( - climate = summarize_array( - birds$north$marginal, "all", "climate" - ), - north = summarize_array( - birds$north$joint, "north", "habitat" - ), - south = summarize_array( - birds$south$joint, "south", "habitat" - ) - ) - - kept <- rows[!vapply(rows, is.null, logical(1))] - - if (length(kept) == 0) { - return(NULL) - } - - do.call(rbind, kept) -} - -# 5. Assemble ---- - -blocks <- list() -coverage <- list() - -#' Record What a Source Contributed -#' -#' @param label Character. Taxon or taxon and stage. -#' @param rows A data frame or NULL. -#' @param where Character. The path looked at. -#' @param reason Character. Why it is empty, when it is. -#' @return A one-row data frame. -#' -#' @example # Example usage of the function -#' # note_source("plants", rows, path, NA) -note_source <- function(label, rows, where, reason = NA) { - data.frame( - source_label = label, - reachable = !is.null(rows) && nrow(rows) > 0, - rows = if (is.null(rows)) 0L else nrow(rows), - species = if (is.null(rows)) { - 0L - } else { - length(unique(rows$species)) - }, - looked_in = where, - note = reason, - stringsAsFactors = FALSE - ) -} - -## 5.1 Plants ---- -plant_path <- file.path( - v2_plant_project, "3_output/coefficients/COEFS.RData" -) - -cat("Reading plants from", plant_path, "\n") - -plant_rows <- read_plant_results(plant_path) -blocks$plants <- plant_rows - -coverage$plants <- note_source( - "plants (4 taxa)", plant_rows, plant_path, - if (is.null(plant_rows)) "COEFS.RData not found" else NA -) - -## 5.2 Mammal landcover ---- -for (region in c("north", "south")) { - dir_path <- file.path( - v2_mammal_root, "Landcover", - tools::toTitleCase(region), "Coefficient Tables" - ) - - cat("Reading mammal", region, "from", dir_path, "\n") - - rows <- read_mammal_landcover(dir_path, region) - blocks[[paste0("mammal_", region)]] <- rows - - coverage[[paste0("mammal_", region)]] <- note_source( - paste("mammal landcover", region), rows, dir_path, - if (is.null(rows)) "no coefficient table found" else NA - ) -} - -## 5.3 Mammal climate ---- -climate_dir <- file.path(v2_mammal_root, "Climate/Coefficients") - -cat("Reading mammal climate from", climate_dir, "\n") - -climate_rows <- read_mammal_climate(climate_dir) -blocks$mammal_climate <- climate_rows - -coverage$mammal_climate <- note_source( - "mammal climate", climate_rows, climate_dir, - if (is.null(climate_rows)) "no coefficient files found" else NA -) - -## 5.4 Birds ---- -# The packaged object first. 04_package_bird_coefficients.R -# builds it by running the v2 packaging step against the -# per-draw csvs, which is the only way birds reach the -# cross-taxa standardized term space. Reading the csvs here is -# the fallback for when that has not been run: it works, but it -# yields raw glm factor names that join to nothing else. -bird_packaged <- file.path(out_dir, "Birds2024.RData") -bird_cache <- file.path(out_dir, "cache/bird_v2_results.rds") - -if (!include_birds) { - coverage$bird <- note_source( - "bird", NULL, v2_bird_root, - "skipped; set include_birds to TRUE" - ) -} else if (file.exists(bird_packaged)) { - bird_rows <- read_packaged_birds(bird_packaged) - - blocks$bird <- bird_rows - - coverage$bird <- note_source( - "bird", bird_rows, bird_packaged, - "packaged, standardized term space" - ) -} else { - cat( - "No packaged birds at ", bird_packaged, - "\n falling back to the per-draw csvs; run", - " 04_package_bird_coefficients.R\n for the standardized", - " term space.\n", - sep = "" - ) - - bird_result <- read_bird_results( - v2_bird_root, bird_cache, bird_workers, refresh_birds - ) - - blocks$bird <- bird_result$rows - - coverage$bird <- note_source( - "bird", bird_result$rows, v2_bird_root, - paste("raw csvs;", bird_result$note) - ) -} - -# 6. Write ---- - -kept <- blocks[!vapply(blocks, is.null, logical(1))] -results <- do.call(rbind, kept) - -if (is.null(results) || nrow(results) == 0) { - stop( - "No v2 results were reachable. Check the drive mounts and ", - "the SDM_V2_* environment variables.", - call. = FALSE - ) -} - -rownames(results) <- NULL -results <- results[, result_columns] - -# Ordered so the file is stable between builds and diffable. -results <- results[ - order( - results$taxon, results$region, results$stage, results$part, - results$species, results$term - ), , - drop = FALSE -] - -results_path <- file.path(results_dir, "v2_results.csv") -coverage_path <- file.path( - results_dir, "v2_results_coverage.csv" -) - -fwrite(results, results_path, na = "") -fwrite(do.call(rbind, coverage), coverage_path, na = "") - -cat("\nWrote", results_path, "\n") -cat(nrow(results), "rows,", length(unique(results$species)), - "species,", length(unique(results$taxon)), "taxa\n\n") - -print(as.data.frame(table(results$taxon, results$stage))) - -cat("\nCoverage:\n") -print(do.call(rbind, coverage)[, c( - "source_label", "reachable", "rows", "species" -)]) - -# End of script ---- From 67b30af39a50a49c5df1c835c2625fa925ac7416 Mon Sep 17 00:00:00 2001 From: bgcasey Date: Tue, 6 Oct 2026 04:50:09 -0600 Subject: [PATCH 09/16] Refactor README and taxon quirks documentation; remove legacy scripts and update references to ABMIexploreR results. Add run script for rebuilding test dataset and v2 reference with logging. --- 1_code/_setup/00_mirror_setup_inputs.R | 9 +- .../08_harmonize_abmiexplorer_results.R | 14 +- 1_code/_setup/10_publish_datasets.R | 3 +- 1_code/_setup/run.R | 171 +++ .../exp_000_parity_v2/01_compare_to_v2.R | 4 +- .../experiments/exp_000_parity_v2/README.md | 44 +- 1_code/experiments/exp_000_parity_v2/run.R | 33 +- .../exp_000_parity_v2/v2_self_agreement.R | 22 +- 1_code/harness/data_source.R | 5 +- 1_code/modules/birds/standardize.R | 2 +- 1_code/modules/bryophytes/spec.R | 15 +- 3_output/exp_000_parity_v2/report.md | 2 +- 3_output/exp_000_parity_v2/run_record.md | 631 ++++----- .../tables/metric_summary.csv | 1234 ++++++++--------- README.md | 64 +- docs/taxon_quirks.md | 13 +- 16 files changed, 1214 insertions(+), 1052 deletions(-) create mode 100644 1_code/_setup/run.R diff --git a/1_code/_setup/00_mirror_setup_inputs.R b/1_code/_setup/00_mirror_setup_inputs.R index e820b2f..bc04d87 100644 --- a/1_code/_setup/00_mirror_setup_inputs.R +++ b/1_code/_setup/00_mirror_setup_inputs.R @@ -34,11 +34,10 @@ # - Each file is copied to a .partial name, checked by md5, and # only then renamed, so a reader never sees a half copy. # - Not mirrored, deliberately: -# - _setup/04 and 05's inputs (the bird coefficient CSVs and -# model objects, COEFS.RData, the mammal coefficient -# tables). With the ABMIexploreR reference used for parity, -# 04 and 05 are not re-run; their output, 0_data/ -# v2_results/, is published frozen by 10_publish_datasets.R. +# - the v2 coefficient outputs on the drives (the bird +# coefficient CSVs, COEFS.RData, the mammal coefficient +# tables). Parity is scored against ABMIexploreR (08), so +# nothing in _setup/ reads them. # - _setup/08's species-coefs.RData, which 08 downloads from # the public ABMIexploreR repository at a pinned commit. # - 0_data/v2_scripts/, which is tracked in git. diff --git a/1_code/_setup/08_harmonize_abmiexplorer_results.R b/1_code/_setup/08_harmonize_abmiexplorer_results.R index d515d2d..4bba60b 100644 --- a/1_code/_setup/08_harmonize_abmiexplorer_results.R +++ b/1_code/_setup/08_harmonize_abmiexplorer_results.R @@ -20,10 +20,16 @@ # - 0_data/v2_results/abmiexplorer/v2_results.csv # - 0_data/v2_results/abmiexplorer/v2_results_coverage.csv # notes: -# - An alternative to 05_harmonize_v2_results.R. Same output -# schema, so 02_compare_to_v2.R reads either; run.R's -# `v2_reference` chooses which. This one needs no network -# drive for any taxon but birds, and those only for names. +# - The v2 parity reference: exp_000_parity_v2's +# 01_compare_to_v2.R scores every run against its +# v2_results.csv. It needs no network drive for any taxon +# but birds, and those only for names. +# - It replaced 05_harmonize_v2_results.R, which compiled the +# same schema by hand from the v2 outputs on the network +# drives (COEFS.RData, the mammal coefficient tables, and a +# Birds2024.RData that 04_package_bird_coefficients.R +# rebuilt). Both were removed once this was checked against +# them; "05" below refers to that build. # # - ABMIexploreR is ABMI's published distribution of the v2 # coefficients: one `species.coefs` list holding, per taxon, diff --git a/1_code/_setup/10_publish_datasets.R b/1_code/_setup/10_publish_datasets.R index c8aeea0..e0cbca7 100644 --- a/1_code/_setup/10_publish_datasets.R +++ b/1_code/_setup/10_publish_datasets.R @@ -4,8 +4,7 @@ # created: 2026-10-05 # inputs: # - 0_data/test_dataset/, from _setup/01-09, checked by 02 -# - 0_data/v2_results/, from _setup/05 (top level, the "drives" -# reference) and 08 (abmiexplorer/) +# - 0_data/v2_results/abmiexplorer/, from _setup/08 # outputs: # in //ABMI-DATA2/science/sdmMethodsDev/0_data/ (SDM_SHARE_ROOT # overrides it), for each dataset: diff --git a/1_code/_setup/run.R b/1_code/_setup/run.R new file mode 100644 index 0000000..5224afb --- /dev/null +++ b/1_code/_setup/run.R @@ -0,0 +1,171 @@ +# --- +# title: Rebuild the Test Dataset and v2 Reference +# author: Brendan Casey +# created: 2026-10-05 +# inputs: +# - the _setup/ scripts in this folder, and whatever each reads +# (see their headers); most read the input mirror on +# ABMI-DATA2 through utils/input_paths.R +# outputs: +# - 0_data/test_dataset/, from 01, 06 and 09 +# - 0_data/test_dataset/lookup/v2_bootstrap_ids/, from 07 +# - 0_data/v2_results/abmiexplorer/, from 08 +# - 2_pipeline/v2_reference/, from 03 +# - a new published version on ABMI-DATA2, from 10, only if +# switched on +# - 2_pipeline/_setup/run_log.csv: per step, start, end, +# minutes and whether it finished +# notes: +# - Runs the _setup/ scripts in their dependency order, for a +# manual rebuild. Switch steps on or off in section 1.2; the +# defaults rebuild everything local and publish nothing. +# - Off by default: +# - 00 mirrors the inputs onto ABMI-DATA2. Run once, by +# someone who can reach the original drives. +# - 03 re-runs the v2 bryophyte models: hours, and its +# output only changes if its sources do. +# - 10 publishes a new version. Run it deliberately, after +# checking 02's tally, then move the pin in +# 1_code/harness/data_source.R. +# - Each script runs in an environment of its own, so one +# cannot pick up another's objects. A step that errors stops +# the rebuild; the log says which. +# - 02 prints a pass / fail tally rather than stopping. Read it +# before using or publishing the rebuilt data. +# - Experiments read the published copies. To run one against +# this rebuild, set SDM_TEST_DATASET and SDM_V2_RESULTS to the +# local folders (section 3 prints the lines). +# - Run from the repository root. +# --- + +# 1. Setup ---- + +## 1.1 Load packages ---- +# Base R only; each script loads its own. + +## 1.2 Choose the steps ---- +# In run order: 09 reads 01's and 06's lookups, 02 checks the +# finished dataset, 07 reads 03's bryophyte draws. +steps <- c( + "00_mirror_setup_inputs.R" = FALSE, + "01_harmonize_model_ready_v2.R" = FALSE, + "06_harmonize_bird_translation_lookup.R" = FALSE, + "09_harmonize_lookups.R" = FALSE, + "02_validate_test_dataset.R" = FALSE, + "03_rerun_bryophyte_v2_reference.R" = FALSE, + "07_harmonize_v2_plant_bootstrap_ids.R" = FALSE, + "08_harmonize_abmiexplorer_results.R" = FALSE, + "10_publish_datasets.R" = TRUE +) + +## 1.3 Check the paths ---- +setup_dir <- "1_code/_setup" + +if (!dir.exists(setup_dir)) { + stop( + "Run from the repository root; ", + setup_dir, + " not found.", + call. = FALSE + ) +} + +found <- file.exists(file.path(setup_dir, names(steps))) +missing <- names(steps)[!found] + +if (length(missing) > 0) { + stop( + "Not found in ", + setup_dir, + ":\n ", + paste(missing, collapse = "\n "), + call. = FALSE + ) +} + +log_dir <- "2_pipeline/_setup" +dir.create(log_dir, recursive = TRUE, showWarnings = FALSE) +log_path <- file.path(log_dir, "run_log.csv") + +# 2. Run the steps ---- +# Each step is sourced into a fresh environment and timed. The +# log row is written before an error is re-raised, so a failed +# rebuild still records where it stopped. + +## 2.1 run_step() ---- + +#' Source One _setup Script in an Environment of Its Own +#' +#' @param script Character. File name inside `setup_dir`. +#' @param setup_dir Character. The _setup folder. +#' @param log_path Character. The run log to append to. +#' @return TRUE, invisibly; stops if the script errors. +#' +#' @example # Example usage of the function +#' # run_step("09_harmonize_lookups.R", setup_dir, log_path) +run_step <- function(script, setup_dir, log_path) { + # Step 1: Announce and time the step + message("\n== ", script, " (", format(Sys.time(), "%H:%M"), ")") + started <- Sys.time() + + # Step 2: Source it in isolation, keeping any error + error <- tryCatch( + { + source( + file.path(setup_dir, script), + local = new.env(parent = globalenv()) + ) + NULL + }, + error = function(e) e + ) + + # Step 3: Log the outcome before stopping on an error + ended <- Sys.time() + row <- data.frame( + script = script, + started = format(started, "%Y-%m-%d %H:%M:%S"), + ended = format(ended, "%Y-%m-%d %H:%M:%S"), + minutes = round( + as.numeric(difftime(ended, started, units = "mins")), + 1 + ), + status = if (is.null(error)) "done" else "failed" + ) + + write.table( + row, + log_path, + sep = ",", + row.names = FALSE, + col.names = !file.exists(log_path), + append = file.exists(log_path) + ) + + if (!is.null(error)) { + stop(script, " failed: ", conditionMessage(error), call. = FALSE) + } + + message(" done in ", row$minutes, " min") + invisible(TRUE) +} + +## 2.2 Run the chosen steps in order ---- +to_run <- names(steps)[steps] +message("Rebuilding: ", paste(to_run, collapse = ", ")) + +for (script in to_run) { + run_step(script, setup_dir, log_path) +} + +# 3. Point experiments at the rebuild ---- +# The published copies are what experiments read by default. +message( + "\nRebuild finished. To run an experiment against it:\n", + " Sys.setenv(SDM_TEST_DATASET = \"0_data/test_dataset\")\n", + " Sys.setenv(SDM_V2_RESULTS = \"0_data/v2_results\")\n", + "Run log: ", + log_path +) + +# End of script ---- diff --git a/1_code/experiments/exp_000_parity_v2/01_compare_to_v2.R b/1_code/experiments/exp_000_parity_v2/01_compare_to_v2.R index 109c5db..d9fc132 100644 --- a/1_code/experiments/exp_000_parity_v2/01_compare_to_v2.R +++ b/1_code/experiments/exp_000_parity_v2/01_compare_to_v2.R @@ -7,8 +7,8 @@ # n_bootstraps, v2_bootstraps, focal_species # - `results$coefficient_summary`, from collect_results() # - in config$v2_reference_dir: -# - v2_results.csv, built by _setup/08 (ABMIexploreR) or -# _setup/05 (the network drives) +# - v2_results.csv, built by _setup/08 from the pinned +# ABMIexploreR coefficients # outputs: # - in out_dir/tables/: parity_terms.csv, parity_summary.csv # - `results$parity`, `results$parity_summary` and diff --git a/1_code/experiments/exp_000_parity_v2/README.md b/1_code/experiments/exp_000_parity_v2/README.md index f9d2b2f..42ba481 100644 --- a/1_code/experiments/exp_000_parity_v2/README.md +++ b/1_code/experiments/exp_000_parity_v2/README.md @@ -61,21 +61,22 @@ table. ## What the gate compares today `01_compare_to_v2.R` compares **every stage** against one -`v2_results.csv`, so it runs with the network drives unmounted. -`config$v2_reference` in `run.R` section 1.3 picks which build of it: - -| `v2_reference` | Built by | Source | Holds | -| -------------- | -------- | ------ | ----- | -| `"abmiexplorer"` (default) | `_setup/08_harmonize_abmiexplorer_results.R` | `data/species-coefs.RData` from [ABMIexploreR](https://github.com/ABbiodiversity/ABMIexploreR), pinned to commit `848eeed` | Only the published species. Every taxon, plus amphibians. | -| `"drives"` | `_setup/05_harmonize_v2_results.R` | `COEFS.RData`, the Mammals drive, `Birds2024.RData` | Every species v2 fitted. | - -The two builds use the same models for every taxon. On 2026-10-02 -every shared species and term matched to about 1e-15, except where -some v2 draws failed. `05` drops failed draws; the package stores 100 finite -draws for every cell. Re-scoring the `parity_check` run against both -builds gave the same in-band rates, standardized differences and -verdicts wherever both had the species. The differences are in -coverage: +`v2_results.csv`, so it runs with the network drives unmounted. That +file is built by `_setup/08_harmonize_abmiexplorer_results.R` from +`data/species-coefs.RData` in +[ABMIexploreR](https://github.com/ABbiodiversity/ABMIexploreR), +ABMI's published distribution of the v2 coefficients, pinned to +commit `848eeed`. It holds the published species of every taxon, +plus amphibians. `run.R` section 1.3 points the run at it. + +The reference used to be compiled by hand from the v2 outputs on the +network drives (`_setup/04` and `05`, now removed). On 2026-10-02 the +two builds matched to about 1e-15 on every shared species and term, +except where some v2 draws failed: the drives build dropped them, and +the package stores 100 finite draws for every cell. Re-scoring the +`parity_check` run against both gave the same in-band rates, +standardized differences and verdicts wherever both had the species. +What the package does not cover: - **Species.** `Bryum.All`, plus `Trhypochthonius.tectorum` in the north, are not published, so they have no package reference. @@ -88,7 +89,7 @@ coverage: in the north only). The package stores them on the link scale, and `08` back-transforms them (logit for presence, log for abundance and total). Its 100 draws are one fit repeated, so they are scored - on iteration 1, as against `05`. South `WetlandMargin` and the + on iteration 1. South `WetlandMargin` and the placeholder `Bare` are not in the package. Woodland caribou and deer are not published. @@ -110,7 +111,7 @@ all-zero padding cells. standardized template by `modules/birds/standardize.R`, a port of v2's `08.PackageCoefficients.R`. Checked against v2's own packaged output: translating v2's raw per-draw coefficients reproduces - `Birds2024.RData` exactly. The raw `landcover` stage is kept in the + v2's packaged bird coefficients exactly. The raw `landcover` stage is kept in the summary but not scored. - **Mammals:** the summer and winter runs are averaged, as v2's `.all` tables are, and compared at iteration 1, because v2 fits once. The @@ -134,8 +135,11 @@ proposals until agreed**; the report says so. **How closely v2 agrees with itself.** `v2_self_agreement.R` compares two v2 runs of the same code on the same data: the bryophyte climate stage as -published in `COEFS.RData`, and the rerun `_setup/03` made, 134 species by -19 terms by 100 draws each, scored exactly as the gate scores the harness. +ABMIexploreR publishes it, and the rerun `_setup/03` made, 19 terms by 100 +draws for each species both hold, scored exactly as the gate scores the +harness. The table below was measured against v2's `COEFS.RData` (134 +species); the script now reads the ABMIexploreR reference, which matches +it to ~1e-15 but does not publish `Bryum.All`. | Measure | v2 against itself | | --- | --- | @@ -246,7 +250,7 @@ evidence for each and an ordered plan. "model.avg"`), and the bootstrap-id file holds 3 draws where the other taxa hold 100. `_setup/03_rerun_bryophyte_v2_reference.R` re-ran the frozen v2 functions: 134 of 134 species, 100 draws of 19 - climate terms each, no failures. Separately, v2's `COEFS.RData` holds + climate terms each, no failures. Separately, ABMIexploreR publishes complete bryophyte arrays, and `v2_results.csv` uses those. - **The seed.** `seed` in `run.R` seeds every resampled taxon from one number, with a derived seed per species. v2 is unseeded, so diff --git a/1_code/experiments/exp_000_parity_v2/run.R b/1_code/experiments/exp_000_parity_v2/run.R index eff148c..97eb45b 100644 --- a/1_code/experiments/exp_000_parity_v2/run.R +++ b/1_code/experiments/exp_000_parity_v2/run.R @@ -4,8 +4,8 @@ # created: 2026-09-09 # inputs: # - the published test dataset (harness/data_source.R) -# - the published v2 results, the v2 reference (section 1.3; -# see harness/data_source.R) +# - the published v2 results, the ABMIexploreR reference +# (section 1.3; see harness/data_source.R) # - the framework: 1_code/harness/, methods/, modules/ # outputs: # in 2_pipeline/exp_000_parity_v2/: @@ -93,30 +93,17 @@ config <- experiment_config( unit_predictions = "none" ) -## 1.3 Choose the v2 reference ---- -# Which build of the published v2 coefficients the run is scored -# against. Both write the same schema. -# abmiexplorer ABMI's ABMIexploreR package, pinned to a commit -# (_setup/08); the published species, every taxon -# drives the v2 project outputs on the network drives -# (_setup/05); every species v2 fitted +## 1.3 The v2 reference ---- +# The published v2 coefficients the run is scored against: ABMI's +# ABMIexploreR package, pinned to a commit and harmonized by +# _setup/08. It holds the published species of every taxon. The +# report prints the label and builder. config$v2_reference <- "abmiexplorer" - config$v2_reference_dir <- file.path( - v2_results_dir(), - switch( - config$v2_reference, - abmiexplorer = "abmiexplorer", - drives = "", - stop("v2_reference must be \"abmiexplorer\" or \"drives\".", call. = FALSE) - ) -) - -config$v2_reference_builder <- switch( - config$v2_reference, - abmiexplorer = "1_code/_setup/08_harmonize_abmiexplorer_results.R", - drives = "1_code/_setup/05_harmonize_v2_results.R" + v2_results_dir(), "abmiexplorer" ) +config$v2_reference_builder <- + "1_code/_setup/08_harmonize_abmiexplorer_results.R" # 2. Run ---- # Fits every species, collects the stores into summary tables, diff --git a/1_code/experiments/exp_000_parity_v2/v2_self_agreement.R b/1_code/experiments/exp_000_parity_v2/v2_self_agreement.R index 3a17a21..d7d0a10 100644 --- a/1_code/experiments/exp_000_parity_v2/v2_self_agreement.R +++ b/1_code/experiments/exp_000_parity_v2/v2_self_agreement.R @@ -5,9 +5,10 @@ # inputs: # - 2_pipeline/v2_reference/bryophyte-species-models.Rdata, # from 1_code/_setup/03_rerun_bryophyte_v2_reference.R -# - v2_results.csv from the published v2 results (see -# 1_code/harness/data_source.R), the bryophyte climate rows, -# which come from v2's COEFS.RData +# - abmiexplorer/v2_results.csv from the published v2 results +# (see 1_code/harness/data_source.R), the bryophyte climate +# rows, from _setup/08. These are v2's original run: they +# match v2's COEFS.RData to ~1e-15 # outputs: # in 3_output/exp_000_parity_v2/tables/: # - v2_self_agreement.csv, per species and term @@ -20,10 +21,11 @@ # closely than v2 agrees with itself would fail a perfect # reimplementation. # - The two runs are the bryophyte climate stage: v2's original -# run, as published in COEFS.RData, and the rerun -# _setup/03 made with the frozen v2 functions. Same code, same -# data, different unseeded draws; 134 species by 19 terms by -# 100 draws each. +# run, as ABMIexploreR publishes it, and the rerun _setup/03 +# made with the frozen v2 functions. Same code, same data, +# different unseeded draws; 19 terms by 100 draws for each +# species both hold. Bryum.All is not published, so it +# drops out (133 of the rerun's 134 species). # - Scored exactly as 02_compare_to_v2.R scores the harness, in # both directions: is one run's median inside the other's # 10th-to-90th percentile band, and how far apart are the @@ -39,7 +41,7 @@ # - Climate only: the regenerated reference has no habitat # stage. The rate is assumed to carry to the plant habitat # stage; that is an assumption, stated in the README. -# - Run once, from the repository root, after _setup/03 and 05. +# - Run once, from the repository root, after _setup/03 and 08. # Not part of run.R's sequence. # --- @@ -61,7 +63,9 @@ rerun_path <- file.path( "bryophyte-species-models.Rdata" ) source(file.path(project_root, "1_code/harness/data_source.R")) -results_path <- file.path(v2_results_dir(), "v2_results.csv") +results_path <- file.path( + v2_results_dir(), "abmiexplorer", "v2_results.csv" +) tables_dir <- file.path( project_root, "3_output", "exp_000_parity_v2", "tables" ) diff --git a/1_code/harness/data_source.R b/1_code/harness/data_source.R index bb8ac3e..4896dc7 100644 --- a/1_code/harness/data_source.R +++ b/1_code/harness/data_source.R @@ -117,8 +117,9 @@ test_dataset_dir <- function(data_dir = NULL, check = TRUE) { #' Resolve the v2 Results Folder #' -#' The folder holds the "drives" reference at its top level and -#' the "abmiexplorer" reference in abmiexplorer/. +#' The parity reference, from _setup/08, is in abmiexplorer/. +#' Files at the top level of the 2026-10-05 version are the +#' retired network-drive build; nothing reads them. #' #' @param dir Character or NULL. A folder to use as is. #' @param check Logical. Check the folder before returning it. diff --git a/1_code/modules/birds/standardize.R b/1_code/modules/birds/standardize.R index 9413f85..8db8215 100644 --- a/1_code/modules/birds/standardize.R +++ b/1_code/modules/birds/standardize.R @@ -11,7 +11,7 @@ # outputs: none; returns objects in memory # notes: # - A port of the translation in v2's 08.PackageCoefficients.R -# (cloned in 1_code/_setup/04_package_bird_coefficients.R). +# (kept in 0_data/v2_scripts/birds/). # v2 publishes bird landcover effects on the standardized # cross-taxa habitat types - WhiteSpruceR to WhiteSpruce8, # Loamy, EnSoftLin and so on - not as raw glm coefficients, diff --git a/1_code/modules/bryophytes/spec.R b/1_code/modules/bryophytes/spec.R index c3e4f6c..7b855d9 100644 --- a/1_code/modules/bryophytes/spec.R +++ b/1_code/modules/bryophytes/spec.R @@ -15,13 +15,12 @@ # every species and draw in it is an error object reading # `could not find function "model.avg"`, and the bootstrap-id # file held 3 draws where the other three taxa hold 100. -# - Two usable references exist instead. v2's own COEFS.RData -# holds complete bryophyte arrays, and _setup/05 takes the -# bryophyte rows of v2_results.csv from it. -# _setup/03_rerun_bryophyte_v2_reference.R also regenerated -# the climate stage into 2_pipeline/v2_reference/. -# - 02_compare_to_v2.R reads neither yet, so bryophytes are not -# compared. Moving the gate onto v2_results.csv fixes that. +# - The parity reference is ABMIexploreR's bryophyte arrays +# (_setup/08), which are complete and match v2's own +# COEFS.RData to ~1e-15. _setup/03_rerun_bryophyte_v2_ +# reference.R also regenerated the climate stage into +# 2_pipeline/v2_reference/, for v2_self_agreement.R and the +# stored bootstrap draws. # - Anything true of every plant-group taxon belongs in # _shared/plant_group.R, not here. # --- @@ -53,7 +52,7 @@ bryophyte_spec <- function(use_protocol = NULL, bootstrap = bootstrap, reference_note = paste0( "The published v2 model file is unusable; the v2 ", - "reference is COEFS.RData, via v2_results.csv." + "reference is ABMIexploreR's, via v2_results.csv." ) ) } diff --git a/3_output/exp_000_parity_v2/report.md b/3_output/exp_000_parity_v2/report.md index 8b45006..b1bf56a 100644 --- a/3_output/exp_000_parity_v2/report.md +++ b/3_output/exp_000_parity_v2/report.md @@ -1,6 +1,6 @@ # exp_000_parity_v2 -Generated 2026-10-03 14:32:58 +Generated 2026-10-06 04:47:32 **Trial run.** 14 focal species, 5 of 100 draws. Its parity numbers show the pipeline ran; they are not a parity read. diff --git a/3_output/exp_000_parity_v2/run_record.md b/3_output/exp_000_parity_v2/run_record.md index 6261b7a..70c54ab 100644 --- a/3_output/exp_000_parity_v2/run_record.md +++ b/3_output/exp_000_parity_v2/run_record.md @@ -6,15 +6,18 @@ Written by `run_record()`. The result stores this describes are gitignored; this _Volatile. Excluded from cross-run comparison._ -- **git_commit**: 11cb646 +- **git_commit**: 60d95ae - **pipeline_dir**: D:/local_projects/active/sdmMethodsDev/2_pipeline/exp_000_parity_v2 - **r_version**: 4.5.0 -- **written_at**: 2026-10-03 20:32:58 +- **written_at**: 2026-10-06 10:47:32 ## Configuration - **boot_seed**: 20260909.0000 -- **data_dir**: test_dataset +- **changes_from_v2**: none +- **compared_with**: none (baseline) +- **covariate_files**: none +- **data_dir**: published 2026-10-05 (//ABMI-DATA2/science/sdmMethodsDev/0_data/test_dataset/2026-10-05) - **engines**: bayesglm, glm - **focal_species**: bird=AMRO, bird=YEWA, bryophyte=Bryum.All, bryophyte=Ceratodon.purpureus, lichen=Cladonia.chlorophaea, lichen=Physcia.adscendens, mammal=Coyote_Summer, mammal=Coyote_Winter, mammal=Moose_Summer, mammal=Moose_Winter, mite=Ceratozetes.gracilis, mite=Trhypochthonius.tectorum, vascular_plant=Galium.boreale, vascular_plant=Vicia.americana - **jobs_not_ok**: 0 @@ -22,7 +25,7 @@ _Volatile. Excluded from cross-run comparison._ - **jobs_total**: 140 - **n_bootstraps**: 5 - **plant_bootstrap**: spatial_block -- **selection**: aic_average, custom, ivw_grid, staged_bic +- **selection**: aic_average, hurdle, ivw_grid, staged_bic - **species_n**: 14 - **stage_models**: spec defaults (v2 candidate sets) - **taxa**: bird, bryophyte, lichen, mammal_summer, mammal_winter, mite, vascular_plant @@ -49,314 +52,314 @@ _Volatile. Excluded from cross-run comparison._ ## Metrics -| taxon | region | metric | n | median | p10 | p90 | -| --- | --- | --- | --- | --- | --- | --- | -| bird | north | insample_auc | 10 | 0.7522 | 0.7235 | 0.7796 | -| bird | north | insample_calibration_slope | 10 | 0.7559 | 0.6982 | 0.8102 | -| bird | north | insample_deviance_explained | 10 | 0.1996 | 0.1409 | 0.2605 | -| bird | north | insample_n | 10 | 46747.0000 | 46744.0000 | 46750.0000 | -| bird | north | insample_prevalence | 10 | 0.1851 | 0.1178 | 0.2520 | -| bird | north | insample_rmse | 10 | 0.6070 | 0.5467 | 0.6643 | -| bird | north | insample_spearman | 10 | 0.3277 | 0.3148 | 0.3446 | -| bird | north | oob_auc | 10 | 0.7299 | 0.7284 | 0.7308 | -| bird | north | oob_calibration_slope | 10 | 0.7875 | 0.6454 | 0.8810 | -| bird | north | oob_deviance_explained | 10 | 0.1647 | 0.1509 | 0.1821 | -| bird | north | oob_n | 10 | 124877.0000 | 124874.0000 | 124880.0000 | -| bird | north | oob_prevalence | 10 | 0.1877 | 0.1343 | 0.2411 | -| bird | north | oob_rmse | 10 | 0.6250 | 0.5831 | 0.6583 | -| bird | north | oob_spearman | 10 | 0.3117 | 0.2736 | 0.3483 | -| bird | south | insample_auc | 10 | 0.7052 | 0.6892 | 0.7215 | -| bird | south | insample_calibration_slope | 10 | 0.8775 | 0.8649 | 0.8901 | -| bird | south | insample_deviance_explained | 10 | 0.1561 | 0.0911 | 0.2337 | -| bird | south | insample_n | 10 | 23639.0000 | 23636.0000 | 23640.0000 | -| bird | south | insample_prevalence | 10 | 0.2142 | 0.1711 | 0.2590 | -| bird | south | insample_rmse | 10 | 0.6840 | 0.6232 | 0.7452 | -| bird | south | insample_spearman | 10 | 0.2943 | 0.2880 | 0.2978 | -| bird | south | oob_auc | 10 | 0.7013 | 0.6892 | 0.7156 | -| bird | south | oob_calibration_slope | 10 | 0.9220 | 0.8622 | 0.9549 | -| bird | south | oob_deviance_explained | 10 | 0.1483 | 0.0969 | 0.2066 | -| bird | south | oob_n | 10 | 67168.0000 | 67167.0000 | 67171.0000 | -| bird | south | oob_prevalence | 10 | 0.2178 | 0.1757 | 0.2603 | -| bird | south | oob_rmse | 10 | 0.6869 | 0.6369 | 0.7359 | -| bird | south | oob_spearman | 10 | 0.2916 | 0.2888 | 0.2927 | -| bryophyte | north | insample_auc | 10 | 0.6642 | 0.6314 | 0.7085 | -| bryophyte | north | insample_calibration_slope | 10 | 0.8499 | 0.7585 | 0.8973 | -| bryophyte | north | insample_deviance_explained | 10 | -0.1896 | -0.2902 | -0.0937 | -| bryophyte | north | insample_n | 10 | 3091.0000 | 3041.1000 | 4852.0000 | -| bryophyte | north | insample_prevalence | 10 | 0.4175 | 0.3976 | 0.4423 | -| bryophyte | north | insample_rmse | 10 | 0.4736 | 0.4634 | 0.4802 | -| bryophyte | north | insample_spearman | 10 | 0.2805 | 0.2228 | 0.3578 | -| bryophyte | north | oob_auc | 8 | 0.6562 | 0.6254 | 0.6808 | -| bryophyte | north | oob_calibration_slope | 8 | 0.7707 | 0.6959 | 0.8841 | -| bryophyte | north | oob_deviance_explained | 8 | -0.1858 | -0.2157 | -0.1326 | -| bryophyte | north | oob_n | 10 | 1761.0000 | 0.0000 | 1810.9000 | -| bryophyte | north | oob_prevalence | 8 | 0.4201 | 0.4007 | 0.4503 | -| bryophyte | north | oob_rmse | 8 | 0.4801 | 0.4711 | 0.4829 | -| bryophyte | north | oob_spearman | 8 | 0.2675 | 0.2128 | 0.3105 | -| bryophyte | north | oob_v2val_Climate | 8 | 0.6045 | 0.5487 | 0.6482 | -| bryophyte | north | oob_v2val_Climate_Truncated | 8 | 0.6045 | 0.5486 | 0.6482 | -| bryophyte | north | oob_v2val_Full | 8 | 0.6562 | 0.6254 | 0.6808 | -| bryophyte | north | oob_v2val_Full_Joint | 8 | 0.6538 | 0.6242 | 0.6786 | -| bryophyte | north | oob_v2val_Full_Joint_Truncated | 8 | 0.6546 | 0.6248 | 0.6788 | -| bryophyte | north | oob_v2val_Full_Truncated | 8 | 0.6571 | 0.6259 | 0.6811 | -| bryophyte | north | oob_v2val_Landcover | 8 | 0.5971 | 0.5798 | 0.6148 | -| bryophyte | north | v2val_Climate | 10 | 0.6069 | 0.5555 | 0.6643 | -| bryophyte | north | v2val_Climate_Truncated | 10 | 0.6069 | 0.5555 | 0.6643 | -| bryophyte | north | v2val_Full | 10 | 0.6642 | 0.6314 | 0.7085 | -| bryophyte | north | v2val_Full_Joint | 10 | 0.6615 | 0.6293 | 0.7047 | -| bryophyte | north | v2val_Full_Joint_Truncated | 10 | 0.6621 | 0.6299 | 0.7052 | -| bryophyte | north | v2val_Full_Truncated | 10 | 0.6647 | 0.6320 | 0.7089 | -| bryophyte | north | v2val_Landcover | 10 | 0.6082 | 0.5829 | 0.6350 | -| bryophyte | south | insample_auc | 10 | 0.6741 | 0.6221 | 0.7221 | -| bryophyte | south | insample_calibration_slope | 10 | 0.8833 | 0.8604 | 0.9293 | -| bryophyte | south | insample_deviance_explained | 10 | -0.0076 | -0.1062 | 0.0587 | -| bryophyte | south | insample_n | 10 | 1454.5000 | 1440.8000 | 2310.0000 | -| bryophyte | south | insample_prevalence | 10 | 0.3052 | 0.2352 | 0.3713 | -| bryophyte | south | insample_rmse | 10 | 0.4407 | 0.3994 | 0.4751 | -| bryophyte | south | insample_spearman | 10 | 0.2678 | 0.2042 | 0.3271 | -| bryophyte | south | oob_auc | 8 | 0.6737 | 0.6156 | 0.7162 | -| bryophyte | south | oob_calibration_slope | 8 | 0.8626 | 0.7944 | 0.9233 | -| bryophyte | south | oob_deviance_explained | 8 | 0.0177 | -0.0430 | 0.0521 | -| bryophyte | south | oob_n | 10 | 855.5000 | 0.0000 | 869.2000 | -| bryophyte | south | oob_prevalence | 8 | 0.3139 | 0.2297 | 0.3751 | -| bryophyte | south | oob_rmse | 8 | 0.4447 | 0.3999 | 0.4766 | -| bryophyte | south | oob_spearman | 8 | 0.2693 | 0.1933 | 0.3245 | -| bryophyte | south | oob_v2val_Climate | 8 | 0.6045 | 0.5487 | 0.6482 | -| bryophyte | south | oob_v2val_Climate_Truncated | 8 | 0.6045 | 0.5486 | 0.6482 | -| bryophyte | south | oob_v2val_Full | 8 | 0.6737 | 0.6156 | 0.7162 | -| bryophyte | south | oob_v2val_Full_Joint | 8 | 0.6754 | 0.6148 | 0.7178 | -| bryophyte | south | oob_v2val_Full_Joint_Truncated | 8 | 0.6754 | 0.6148 | 0.7178 | -| bryophyte | south | oob_v2val_Full_Truncated | 8 | 0.6737 | 0.6156 | 0.7162 | -| bryophyte | south | oob_v2val_Landcover | 8 | 0.6029 | 0.5970 | 0.6332 | -| bryophyte | south | v2val_Climate | 10 | 0.6069 | 0.5555 | 0.6643 | -| bryophyte | south | v2val_Climate_Truncated | 10 | 0.6069 | 0.5555 | 0.6643 | -| bryophyte | south | v2val_Full | 10 | 0.6741 | 0.6221 | 0.7221 | -| bryophyte | south | v2val_Full_Joint | 10 | 0.6743 | 0.6214 | 0.7227 | -| bryophyte | south | v2val_Full_Joint_Truncated | 10 | 0.6743 | 0.6215 | 0.7227 | -| bryophyte | south | v2val_Full_Truncated | 10 | 0.6741 | 0.6221 | 0.7221 | -| bryophyte | south | v2val_Landcover | 10 | 0.6137 | 0.5905 | 0.6386 | -| lichen | north | insample_auc | 10 | 0.8074 | 0.7781 | 0.8388 | -| lichen | north | insample_calibration_slope | 10 | 1.0001 | 0.9745 | 1.0269 | -| lichen | north | insample_deviance_explained | 10 | 0.1360 | 0.1091 | 0.1649 | -| lichen | north | insample_n | 10 | 3692.0000 | 3654.0000 | 5811.0000 | -| lichen | north | insample_prevalence | 10 | 0.3839 | 0.3815 | 0.3891 | -| lichen | north | insample_rmse | 10 | 0.4112 | 0.3929 | 0.4298 | -| lichen | north | insample_spearman | 10 | 0.5176 | 0.4685 | 0.5707 | -| lichen | north | oob_auc | 8 | 0.7997 | 0.7622 | 0.8453 | -| lichen | north | oob_calibration_slope | 8 | 0.9794 | 0.9485 | 1.0076 | -| lichen | north | oob_deviance_explained | 8 | 0.1271 | 0.0891 | 0.1748 | -| lichen | north | oob_n | 10 | 2119.0000 | 0.0000 | 2157.0000 | -| lichen | north | oob_prevalence | 8 | 0.3864 | 0.3761 | 0.3921 | -| lichen | north | oob_rmse | 8 | 0.4171 | 0.3889 | 0.4363 | -| lichen | north | oob_spearman | 8 | 0.5059 | 0.4420 | 0.5824 | -| lichen | north | oob_v2val_Climate | 8 | 0.7041 | 0.6878 | 0.7158 | -| lichen | north | oob_v2val_Climate_Truncated | 8 | 0.7041 | 0.6878 | 0.7158 | -| lichen | north | oob_v2val_Full | 8 | 0.7997 | 0.7622 | 0.8453 | -| lichen | north | oob_v2val_Full_Joint | 8 | 0.7969 | 0.7616 | 0.8417 | -| lichen | north | oob_v2val_Full_Joint_Truncated | 8 | 0.7969 | 0.7615 | 0.8418 | -| lichen | north | oob_v2val_Full_Truncated | 8 | 0.7997 | 0.7624 | 0.8453 | -| lichen | north | oob_v2val_Landcover | 8 | 0.7481 | 0.6957 | 0.8186 | -| lichen | north | v2val_Climate | 10 | 0.7093 | 0.6916 | 0.7289 | -| lichen | north | v2val_Climate_Truncated | 10 | 0.7093 | 0.6916 | 0.7290 | -| lichen | north | v2val_Full | 10 | 0.8074 | 0.7781 | 0.8388 | -| lichen | north | v2val_Full_Joint | 10 | 0.8057 | 0.7771 | 0.8370 | -| lichen | north | v2val_Full_Joint_Truncated | 10 | 0.8057 | 0.7770 | 0.8372 | -| lichen | north | v2val_Full_Truncated | 10 | 0.8074 | 0.7780 | 0.8390 | -| lichen | north | v2val_Landcover | 10 | 0.7424 | 0.7115 | 0.8121 | -| lichen | south | insample_auc | 10 | 0.8021 | 0.7789 | 0.8223 | -| lichen | south | insample_calibration_slope | 10 | 0.9035 | 0.8740 | 1.0439 | -| lichen | south | insample_deviance_explained | 10 | 0.1705 | 0.0924 | 0.2412 | -| lichen | south | insample_n | 10 | 1484.5000 | 1478.5000 | 2346.0000 | -| lichen | south | insample_prevalence | 10 | 0.1511 | 0.0868 | 0.2167 | -| lichen | south | insample_rmse | 10 | 0.3163 | 0.2688 | 0.3582 | -| lichen | south | insample_spearman | 10 | 0.3667 | 0.2735 | 0.4597 | -| lichen | south | oob_auc | 8 | 0.7976 | 0.7632 | 0.8185 | -| lichen | south | oob_calibration_slope | 8 | 0.9438 | 0.7927 | 1.1880 | -| lichen | south | oob_deviance_explained | 8 | 0.1218 | -0.0135 | 0.2395 | -| lichen | south | oob_n | 10 | 861.5000 | 0.0000 | 867.5000 | -| lichen | south | oob_prevalence | 8 | 0.1578 | 0.0943 | 0.2207 | -| lichen | south | oob_rmse | 8 | 0.3261 | 0.2806 | 0.3630 | -| lichen | south | oob_spearman | 8 | 0.3688 | 0.2665 | 0.4581 | -| lichen | south | oob_v2val_Climate | 8 | 0.7041 | 0.6878 | 0.7158 | -| lichen | south | oob_v2val_Climate_Truncated | 8 | 0.7041 | 0.6878 | 0.7158 | -| lichen | south | oob_v2val_Full | 8 | 0.7976 | 0.7632 | 0.8185 | -| lichen | south | oob_v2val_Full_Joint | 8 | 0.7958 | 0.7656 | 0.8153 | -| lichen | south | oob_v2val_Full_Joint_Truncated | 8 | 0.7958 | 0.7656 | 0.8153 | -| lichen | south | oob_v2val_Full_Truncated | 8 | 0.7976 | 0.7632 | 0.8185 | -| lichen | south | oob_v2val_Landcover | 8 | 0.7535 | 0.7464 | 0.7630 | -| lichen | south | v2val_Climate | 10 | 0.7093 | 0.6916 | 0.7289 | -| lichen | south | v2val_Climate_Truncated | 10 | 0.7093 | 0.6916 | 0.7290 | -| lichen | south | v2val_Full | 10 | 0.8021 | 0.7789 | 0.8223 | -| lichen | south | v2val_Full_Joint | 10 | 0.8018 | 0.7799 | 0.8189 | -| lichen | south | v2val_Full_Joint_Truncated | 10 | 0.8018 | 0.7799 | 0.8189 | -| lichen | south | v2val_Full_Truncated | 10 | 0.8021 | 0.7789 | 0.8223 | -| lichen | south | v2val_Landcover | 10 | 0.7535 | 0.7435 | 0.7653 | -| mammal_summer | north | insample_auc | 10 | 0.7207 | 0.6085 | 0.8216 | -| mammal_summer | north | insample_calibration_slope | 10 | 0.9417 | 0.8161 | 1.0198 | -| mammal_summer | north | insample_deviance_explained | 10 | 0.1542 | 0.0268 | 0.2763 | -| mammal_summer | north | insample_n | 10 | 2587.5000 | 2542.1000 | 4053.0000 | -| mammal_summer | north | insample_prevalence | 10 | 0.2736 | 0.2243 | 0.3206 | -| mammal_summer | north | insample_rmse | 10 | 0.3836 | 0.3234 | 0.4410 | -| mammal_summer | north | insample_spearman | 10 | 0.3160 | 0.1627 | 0.4610 | -| mammal_summer | north | oob_auc | 8 | 0.7007 | 0.5879 | 0.8116 | -| mammal_summer | north | oob_calibration_slope | 8 | 0.8971 | 0.7046 | 0.9590 | -| mammal_summer | north | oob_deviance_explained | 8 | 0.1194 | 0.0155 | 0.2466 | -| mammal_summer | north | oob_n | 10 | 1465.5000 | 0.0000 | 1510.9000 | -| mammal_summer | north | oob_prevalence | 8 | 0.2774 | 0.2208 | 0.3261 | -| mammal_summer | north | oob_rmse | 8 | 0.3919 | 0.3312 | 0.4445 | -| mammal_summer | north | oob_spearman | 8 | 0.2911 | 0.1268 | 0.4415 | -| mammal_summer | south | insample_auc | 10 | 0.7054 | 0.6336 | 0.8030 | -| mammal_summer | south | insample_calibration_slope | 10 | 0.9832 | 0.8710 | 1.0087 | -| mammal_summer | south | insample_deviance_explained | 10 | 0.1016 | 0.0257 | 0.2383 | -| mammal_summer | south | insample_n | 10 | 676.5000 | 670.8000 | 1065.0000 | -| mammal_summer | south | insample_prevalence | 10 | 0.4451 | 0.1814 | 0.7098 | -| mammal_summer | south | insample_rmse | 10 | 0.3814 | 0.3405 | 0.4191 | -| mammal_summer | south | insample_spearman | 10 | 0.2798 | 0.1705 | 0.4148 | -| mammal_summer | south | oob_auc | 8 | 0.6568 | 0.5888 | 0.7557 | -| mammal_summer | south | oob_calibration_slope | 8 | 0.6589 | 0.4354 | 1.0000 | -| mammal_summer | south | oob_deviance_explained | 8 | 0.0059 | -0.0790 | 0.1356 | -| mammal_summer | south | oob_n | 10 | 388.5000 | 0.0000 | 394.2000 | -| mammal_summer | south | oob_prevalence | 8 | 0.4195 | 0.1726 | 0.6930 | -| mammal_summer | south | oob_rmse | 8 | 0.3986 | 0.3422 | 0.4425 | -| mammal_summer | south | oob_spearman | 8 | 0.2181 | 0.1135 | 0.3243 | -| mammal_winter | north | insample_auc | 10 | 0.7608 | 0.6687 | 0.8445 | -| mammal_winter | north | insample_calibration_slope | 10 | 0.9604 | 0.9077 | 1.0052 | -| mammal_winter | north | insample_deviance_explained | 10 | 0.1877 | 0.0712 | 0.3014 | -| mammal_winter | north | insample_n | 10 | 2624.5000 | 2596.8000 | 4127.0000 | -| mammal_winter | north | insample_prevalence | 10 | 0.1752 | 0.1467 | 0.2040 | -| mammal_winter | north | insample_rmse | 10 | 0.3149 | 0.2994 | 0.3346 | -| mammal_winter | north | insample_spearman | 10 | 0.3463 | 0.2134 | 0.4714 | -| mammal_winter | north | oob_auc | 8 | 0.7383 | 0.6458 | 0.8353 | -| mammal_winter | north | oob_calibration_slope | 8 | 0.8540 | 0.6612 | 0.9533 | -| mammal_winter | north | oob_deviance_explained | 8 | 0.1614 | 0.0413 | 0.2853 | -| mammal_winter | north | oob_n | 10 | 1502.5000 | 0.0000 | 1530.2000 | -| mammal_winter | north | oob_prevalence | 8 | 0.1756 | 0.1450 | 0.2025 | -| mammal_winter | north | oob_rmse | 8 | 0.3180 | 0.3015 | 0.3423 | -| mammal_winter | north | oob_spearman | 8 | 0.3198 | 0.1800 | 0.4528 | -| mammal_winter | south | insample_auc | 10 | 0.7642 | 0.6906 | 0.8292 | -| mammal_winter | south | insample_calibration_slope | 10 | 0.9542 | 0.8588 | 1.0389 | -| mammal_winter | south | insample_deviance_explained | 10 | 0.1574 | 0.0675 | 0.2501 | -| mammal_winter | south | insample_n | 10 | 694.0000 | 684.8000 | 1098.0000 | -| mammal_winter | south | insample_prevalence | 10 | 0.3450 | 0.0865 | 0.6052 | -| mammal_winter | south | insample_rmse | 10 | 0.3145 | 0.2215 | 0.4071 | -| mammal_winter | south | insample_spearman | 10 | 0.3224 | 0.2964 | 0.3373 | -| mammal_winter | south | oob_auc | 8 | 0.7095 | 0.6257 | 0.7915 | -| mammal_winter | south | oob_calibration_slope | 8 | 0.7307 | 0.4495 | 0.8353 | -| mammal_winter | south | oob_deviance_explained | 8 | 0.0389 | 0.0035 | 0.1901 | -| mammal_winter | south | oob_n | 10 | 404.0000 | 0.0000 | 413.2000 | -| mammal_winter | south | oob_prevalence | 8 | 0.3501 | 0.0777 | 0.6225 | -| mammal_winter | south | oob_rmse | 8 | 0.3337 | 0.2202 | 0.4271 | -| mammal_winter | south | oob_spearman | 8 | 0.2450 | 0.1833 | 0.2817 | -| mite | north | insample_auc | 10 | 0.7336 | 0.6697 | 0.7962 | -| mite | north | insample_calibration_slope | 10 | 1.0028 | 0.9276 | 1.0341 | -| mite | north | insample_deviance_explained | 10 | 0.0502 | -0.0427 | 0.1395 | -| mite | north | insample_n | 10 | 3630.0000 | 3598.5000 | 5711.0000 | -| mite | north | insample_prevalence | 10 | 0.1545 | 0.0943 | 0.2113 | -| mite | north | insample_rmse | 10 | 0.3279 | 0.2873 | 0.3658 | -| mite | north | insample_spearman | 10 | 0.2958 | 0.1729 | 0.4186 | -| mite | north | oob_auc | 8 | 0.7189 | 0.6461 | 0.7894 | -| mite | north | oob_calibration_slope | 8 | 0.9472 | 0.7462 | 1.0295 | -| mite | north | oob_deviance_explained | 8 | 0.0324 | -0.0828 | 0.1165 | -| mite | north | oob_n | 10 | 2081.0000 | 0.0000 | 2112.5000 | -| mite | north | oob_prevalence | 8 | 0.1509 | 0.0925 | 0.2048 | -| mite | north | oob_rmse | 8 | 0.3263 | 0.2853 | 0.3680 | -| mite | north | oob_spearman | 8 | 0.2764 | 0.1475 | 0.4035 | -| mite | north | oob_v2val_Climate | 8 | 0.6835 | 0.6308 | 0.7383 | -| mite | north | oob_v2val_Climate_Truncated | 8 | 0.6834 | 0.6308 | 0.7383 | -| mite | north | oob_v2val_Full | 8 | 0.7189 | 0.6461 | 0.7894 | -| mite | north | oob_v2val_Full_Joint | 8 | 0.7191 | 0.6447 | 0.7888 | -| mite | north | oob_v2val_Full_Joint_Truncated | 8 | 0.7192 | 0.6448 | 0.7887 | -| mite | north | oob_v2val_Full_Truncated | 8 | 0.7190 | 0.6462 | 0.7893 | -| mite | north | oob_v2val_Landcover | 8 | 0.6850 | 0.6172 | 0.7620 | -| mite | north | v2val_Climate | 10 | 0.6950 | 0.6449 | 0.7401 | -| mite | north | v2val_Climate_Truncated | 10 | 0.6950 | 0.6449 | 0.7401 | -| mite | north | v2val_Full | 10 | 0.7336 | 0.6697 | 0.7962 | -| mite | north | v2val_Full_Joint | 10 | 0.7336 | 0.6692 | 0.7962 | -| mite | north | v2val_Full_Joint_Truncated | 10 | 0.7336 | 0.6692 | 0.7962 | -| mite | north | v2val_Full_Truncated | 10 | 0.7336 | 0.6697 | 0.7961 | -| mite | north | v2val_Landcover | 10 | 0.7057 | 0.6335 | 0.7708 | -| mite | south | insample_auc | 10 | 0.7997 | 0.7044 | 0.8840 | -| mite | south | insample_calibration_slope | 10 | 0.7882 | 0.6097 | 0.9768 | -| mite | south | insample_deviance_explained | 10 | 0.0405 | -0.0053 | 0.1740 | -| mite | south | insample_n | 10 | 1493.0000 | 1480.9000 | 2363.0000 | -| mite | south | insample_prevalence | 10 | 0.0721 | 0.0556 | 0.0841 | -| mite | south | insample_rmse | 10 | 0.2482 | 0.2139 | 0.2709 | -| mite | south | insample_spearman | 10 | 0.2519 | 0.1954 | 0.3151 | -| mite | south | oob_auc | 8 | 0.7769 | 0.6582 | 0.8839 | -| mite | south | oob_calibration_slope | 8 | 0.6139 | 0.5353 | 0.8012 | -| mite | south | oob_deviance_explained | 8 | 0.0535 | 0.0095 | 0.2026 | -| mite | south | oob_n | 10 | 870.0000 | 0.0000 | 882.1000 | -| mite | south | oob_prevalence | 8 | 0.0719 | 0.0489 | 0.0868 | -| mite | south | oob_rmse | 8 | 0.2447 | 0.2147 | 0.2788 | -| mite | south | oob_spearman | 8 | 0.2233 | 0.1492 | 0.3189 | -| mite | south | oob_v2val_Climate | 8 | 0.6835 | 0.6308 | 0.7383 | -| mite | south | oob_v2val_Climate_Truncated | 8 | 0.6834 | 0.6308 | 0.7383 | -| mite | south | oob_v2val_Full | 8 | 0.7769 | 0.6582 | 0.8839 | -| mite | south | oob_v2val_Full_Joint | 8 | 0.7766 | 0.6587 | 0.8846 | -| mite | south | oob_v2val_Full_Joint_Truncated | 8 | 0.7766 | 0.6587 | 0.8846 | -| mite | south | oob_v2val_Full_Truncated | 8 | 0.7769 | 0.6582 | 0.8839 | -| mite | south | oob_v2val_Landcover | 8 | 0.6792 | 0.6125 | 0.7124 | -| mite | south | v2val_Climate | 10 | 0.6950 | 0.6449 | 0.7401 | -| mite | south | v2val_Climate_Truncated | 10 | 0.6950 | 0.6449 | 0.7401 | -| mite | south | v2val_Full | 10 | 0.7997 | 0.7044 | 0.8840 | -| mite | south | v2val_Full_Joint | 10 | 0.8014 | 0.7048 | 0.8843 | -| mite | south | v2val_Full_Joint_Truncated | 10 | 0.8014 | 0.7048 | 0.8843 | -| mite | south | v2val_Full_Truncated | 10 | 0.7997 | 0.7044 | 0.8840 | -| mite | south | v2val_Landcover | 10 | 0.7027 | 0.6602 | 0.7282 | -| vascular_plant | north | insample_auc | 10 | 0.8331 | 0.8298 | 0.8373 | -| vascular_plant | north | insample_calibration_slope | 10 | 0.9949 | 0.9743 | 1.0061 | -| vascular_plant | north | insample_deviance_explained | 10 | 0.1616 | 0.1396 | 0.1816 | -| vascular_plant | north | insample_n | 10 | 4347.5000 | 4314.6000 | 6874.0000 | -| vascular_plant | north | insample_prevalence | 10 | 0.3951 | 0.3770 | 0.4211 | -| vascular_plant | north | insample_rmse | 10 | 0.4022 | 0.3958 | 0.4067 | -| vascular_plant | north | insample_spearman | 10 | 0.5651 | 0.5611 | 0.5668 | -| vascular_plant | north | oob_auc | 8 | 0.8283 | 0.8227 | 0.8329 | -| vascular_plant | north | oob_calibration_slope | 8 | 0.9755 | 0.9539 | 1.0021 | -| vascular_plant | north | oob_deviance_explained | 8 | 0.1803 | 0.1354 | 0.2064 | -| vascular_plant | north | oob_n | 10 | 2526.5000 | 0.0000 | 2559.4000 | -| vascular_plant | north | oob_prevalence | 8 | 0.3990 | 0.3725 | 0.4275 | -| vascular_plant | north | oob_rmse | 8 | 0.4052 | 0.3988 | 0.4110 | -| vascular_plant | north | oob_spearman | 8 | 0.5545 | 0.5499 | 0.5651 | -| vascular_plant | north | oob_v2val_Climate | 8 | 0.6916 | 0.6808 | 0.6996 | -| vascular_plant | north | oob_v2val_Climate_Truncated | 8 | 0.6916 | 0.6808 | 0.6996 | -| vascular_plant | north | oob_v2val_Full | 8 | 0.8283 | 0.8227 | 0.8329 | -| vascular_plant | north | oob_v2val_Full_Joint | 8 | 0.8258 | 0.8182 | 0.8325 | -| vascular_plant | north | oob_v2val_Full_Joint_Truncated | 8 | 0.8258 | 0.8183 | 0.8323 | -| vascular_plant | north | oob_v2val_Full_Truncated | 8 | 0.8285 | 0.8228 | 0.8328 | -| vascular_plant | north | oob_v2val_Landcover | 8 | 0.8009 | 0.7954 | 0.8101 | -| vascular_plant | north | v2val_Climate | 10 | 0.6886 | 0.6855 | 0.6950 | -| vascular_plant | north | v2val_Climate_Truncated | 10 | 0.6886 | 0.6855 | 0.6949 | -| vascular_plant | north | v2val_Full | 10 | 0.8331 | 0.8298 | 0.8373 | -| vascular_plant | north | v2val_Full_Joint | 10 | 0.8318 | 0.8275 | 0.8367 | -| vascular_plant | north | v2val_Full_Joint_Truncated | 10 | 0.8319 | 0.8277 | 0.8366 | -| vascular_plant | north | v2val_Full_Truncated | 10 | 0.8330 | 0.8299 | 0.8373 | -| vascular_plant | north | v2val_Landcover | 10 | 0.8087 | 0.8049 | 0.8130 | -| vascular_plant | south | insample_auc | 10 | 0.8460 | 0.8042 | 0.8967 | -| vascular_plant | south | insample_calibration_slope | 10 | 0.9608 | 0.9208 | 0.9855 | -| vascular_plant | south | insample_deviance_explained | 10 | 0.2841 | 0.1600 | 0.3822 | -| vascular_plant | south | insample_n | 10 | 1688.5000 | 1654.9000 | 2648.0000 | -| vascular_plant | south | insample_prevalence | 10 | 0.2438 | 0.2212 | 0.2654 | -| vascular_plant | south | insample_rmse | 10 | 0.3477 | 0.3070 | 0.3827 | -| vascular_plant | south | insample_spearman | 10 | 0.5180 | 0.4628 | 0.5647 | -| vascular_plant | south | oob_auc | 8 | 0.8412 | 0.8038 | 0.8909 | -| vascular_plant | south | oob_calibration_slope | 8 | 0.9408 | 0.9073 | 0.9701 | -| vascular_plant | south | oob_deviance_explained | 8 | 0.2459 | 0.1728 | 0.3387 | -| vascular_plant | south | oob_n | 10 | 959.5000 | 0.0000 | 993.1000 | -| vascular_plant | south | oob_prevalence | 8 | 0.2418 | 0.2131 | 0.2706 | -| vascular_plant | south | oob_rmse | 8 | 0.3513 | 0.3168 | 0.3827 | -| vascular_plant | south | oob_spearman | 8 | 0.5033 | 0.4643 | 0.5589 | -| vascular_plant | south | oob_v2val_Climate | 8 | 0.6916 | 0.6808 | 0.6996 | -| vascular_plant | south | oob_v2val_Climate_Truncated | 8 | 0.6916 | 0.6808 | 0.6996 | -| vascular_plant | south | oob_v2val_Full | 8 | 0.8412 | 0.8038 | 0.8909 | -| vascular_plant | south | oob_v2val_Full_Joint | 8 | 0.8369 | 0.8023 | 0.8809 | -| vascular_plant | south | oob_v2val_Full_Joint_Truncated | 8 | 0.8369 | 0.8023 | 0.8809 | -| vascular_plant | south | oob_v2val_Full_Truncated | 8 | 0.8412 | 0.8038 | 0.8908 | -| vascular_plant | south | oob_v2val_Landcover | 8 | 0.7762 | 0.7677 | 0.7961 | -| vascular_plant | south | v2val_Climate | 10 | 0.6886 | 0.6855 | 0.6950 | -| vascular_plant | south | v2val_Climate_Truncated | 10 | 0.6886 | 0.6855 | 0.6949 | -| vascular_plant | south | v2val_Full | 10 | 0.8460 | 0.8042 | 0.8967 | -| vascular_plant | south | v2val_Full_Joint | 10 | 0.8411 | 0.8013 | 0.8920 | -| vascular_plant | south | v2val_Full_Joint_Truncated | 10 | 0.8411 | 0.8013 | 0.8920 | -| vascular_plant | south | v2val_Full_Truncated | 10 | 0.8460 | 0.8042 | 0.8967 | -| vascular_plant | south | v2val_Landcover | 10 | 0.7783 | 0.7609 | 0.8028 | +| taxon | region | metric | n | median | p10 | p90 | mean | sd | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| bird | north | insample_auc | 10 | 0.7522 | 0.7235 | 0.7796 | 0.7516 | 0.0288 | +| bird | north | insample_calibration_slope | 10 | 0.7559 | 0.6982 | 0.8102 | 0.7542 | 0.0543 | +| bird | north | insample_deviance_explained | 10 | 0.1996 | 0.1409 | 0.2605 | 0.2005 | 0.0613 | +| bird | north | insample_n | 10 | 46747.0000 | 46744.0000 | 46750.0000 | 46747.6000 | 2.3664 | +| bird | north | insample_prevalence | 10 | 0.1851 | 0.1178 | 0.2520 | 0.1850 | 0.0702 | +| bird | north | insample_rmse | 10 | 0.6070 | 0.5467 | 0.6643 | 0.6056 | 0.0609 | +| bird | north | insample_spearman | 10 | 0.3277 | 0.3148 | 0.3446 | 0.3293 | 0.0149 | +| bird | north | oob_auc | 10 | 0.7299 | 0.7284 | 0.7308 | 0.7296 | 0.0010 | +| bird | north | oob_calibration_slope | 10 | 0.7875 | 0.6454 | 0.8810 | 0.7730 | 0.1073 | +| bird | north | oob_deviance_explained | 10 | 0.1647 | 0.1509 | 0.1821 | 0.1658 | 0.0150 | +| bird | north | oob_n | 10 | 124877.0000 | 124874.0000 | 124880.0000 | 124876.4000 | 2.3664 | +| bird | north | oob_prevalence | 10 | 0.1877 | 0.1343 | 0.2411 | 0.1877 | 0.0561 | +| bird | north | oob_rmse | 10 | 0.6250 | 0.5831 | 0.6583 | 0.6230 | 0.0372 | +| bird | north | oob_spearman | 10 | 0.3117 | 0.2736 | 0.3483 | 0.3110 | 0.0389 | +| bird | south | insample_auc | 10 | 0.7052 | 0.6892 | 0.7215 | 0.7054 | 0.0153 | +| bird | south | insample_calibration_slope | 10 | 0.8775 | 0.8649 | 0.8901 | 0.8777 | 0.0119 | +| bird | south | insample_deviance_explained | 10 | 0.1561 | 0.0911 | 0.2337 | 0.1609 | 0.0728 | +| bird | south | insample_n | 10 | 23639.0000 | 23636.0000 | 23640.0000 | 23638.4000 | 1.4298 | +| bird | south | insample_prevalence | 10 | 0.2142 | 0.1711 | 0.2590 | 0.2149 | 0.0459 | +| bird | south | insample_rmse | 10 | 0.6840 | 0.6232 | 0.7452 | 0.6839 | 0.0623 | +| bird | south | insample_spearman | 10 | 0.2943 | 0.2880 | 0.2978 | 0.2933 | 0.0046 | +| bird | south | oob_auc | 10 | 0.7013 | 0.6892 | 0.7156 | 0.7019 | 0.0134 | +| bird | south | oob_calibration_slope | 10 | 0.9220 | 0.8622 | 0.9549 | 0.9086 | 0.0414 | +| bird | south | oob_deviance_explained | 10 | 0.1483 | 0.0969 | 0.2066 | 0.1498 | 0.0555 | +| bird | south | oob_n | 10 | 67168.0000 | 67167.0000 | 67171.0000 | 67168.6000 | 1.4298 | +| bird | south | oob_prevalence | 10 | 0.2178 | 0.1757 | 0.2603 | 0.2180 | 0.0444 | +| bird | south | oob_rmse | 10 | 0.6869 | 0.6369 | 0.7359 | 0.6867 | 0.0513 | +| bird | south | oob_spearman | 10 | 0.2916 | 0.2888 | 0.2927 | 0.2913 | 0.0017 | +| bryophyte | north | insample_auc | 10 | 0.6642 | 0.6314 | 0.7085 | 0.6676 | 0.0347 | +| bryophyte | north | insample_calibration_slope | 10 | 0.8499 | 0.7585 | 0.8973 | 0.8326 | 0.0644 | +| bryophyte | north | insample_deviance_explained | 10 | -0.1896 | -0.2902 | -0.0937 | -0.1928 | 0.0883 | +| bryophyte | north | insample_n | 10 | 3091.0000 | 3041.1000 | 4852.0000 | 3429.3000 | 750.2771 | +| bryophyte | north | insample_prevalence | 10 | 0.4175 | 0.3976 | 0.4423 | 0.4194 | 0.0223 | +| bryophyte | north | insample_rmse | 10 | 0.4736 | 0.4634 | 0.4802 | 0.4727 | 0.0076 | +| bryophyte | north | insample_spearman | 10 | 0.2805 | 0.2228 | 0.3578 | 0.2866 | 0.0614 | +| bryophyte | north | oob_auc | 8 | 0.6562 | 0.6254 | 0.6808 | 0.6537 | 0.0253 | +| bryophyte | north | oob_calibration_slope | 8 | 0.7707 | 0.6959 | 0.8841 | 0.7784 | 0.0797 | +| bryophyte | north | oob_deviance_explained | 8 | -0.1858 | -0.2157 | -0.1326 | -0.1818 | 0.0371 | +| bryophyte | north | oob_n | 10 | 1761.0000 | 0.0000 | 1810.9000 | 1422.7000 | 750.2771 | +| bryophyte | north | oob_prevalence | 8 | 0.4201 | 0.4007 | 0.4503 | 0.4233 | 0.0233 | +| bryophyte | north | oob_rmse | 8 | 0.4801 | 0.4711 | 0.4829 | 0.4781 | 0.0053 | +| bryophyte | north | oob_spearman | 8 | 0.2675 | 0.2128 | 0.3105 | 0.2630 | 0.0449 | +| bryophyte | north | oob_v2val_Climate | 8 | 0.6045 | 0.5487 | 0.6482 | 0.5986 | 0.0463 | +| bryophyte | north | oob_v2val_Climate_Truncated | 8 | 0.6045 | 0.5486 | 0.6482 | 0.5986 | 0.0463 | +| bryophyte | north | oob_v2val_Full | 8 | 0.6562 | 0.6254 | 0.6808 | 0.6537 | 0.0253 | +| bryophyte | north | oob_v2val_Full_Joint | 8 | 0.6538 | 0.6242 | 0.6786 | 0.6519 | 0.0247 | +| bryophyte | north | oob_v2val_Full_Joint_Truncated | 8 | 0.6546 | 0.6248 | 0.6788 | 0.6524 | 0.0246 | +| bryophyte | north | oob_v2val_Full_Truncated | 8 | 0.6571 | 0.6259 | 0.6811 | 0.6542 | 0.0252 | +| bryophyte | north | oob_v2val_Landcover | 8 | 0.5971 | 0.5798 | 0.6148 | 0.5974 | 0.0150 | +| bryophyte | north | v2val_Climate | 10 | 0.6069 | 0.5555 | 0.6643 | 0.6086 | 0.0518 | +| bryophyte | north | v2val_Climate_Truncated | 10 | 0.6069 | 0.5555 | 0.6643 | 0.6086 | 0.0518 | +| bryophyte | north | v2val_Full | 10 | 0.6642 | 0.6314 | 0.7085 | 0.6676 | 0.0347 | +| bryophyte | north | v2val_Full_Joint | 10 | 0.6615 | 0.6293 | 0.7047 | 0.6648 | 0.0336 | +| bryophyte | north | v2val_Full_Joint_Truncated | 10 | 0.6621 | 0.6299 | 0.7052 | 0.6652 | 0.0334 | +| bryophyte | north | v2val_Full_Truncated | 10 | 0.6647 | 0.6320 | 0.7089 | 0.6679 | 0.0346 | +| bryophyte | north | v2val_Landcover | 10 | 0.6082 | 0.5829 | 0.6350 | 0.6089 | 0.0226 | +| bryophyte | south | insample_auc | 10 | 0.6741 | 0.6221 | 0.7221 | 0.6723 | 0.0498 | +| bryophyte | south | insample_calibration_slope | 10 | 0.8833 | 0.8604 | 0.9293 | 0.8836 | 0.0487 | +| bryophyte | south | insample_deviance_explained | 10 | -0.0076 | -0.1062 | 0.0587 | -0.0180 | 0.0817 | +| bryophyte | south | insample_n | 10 | 1454.5000 | 1440.8000 | 2310.0000 | 1623.0000 | 362.3789 | +| bryophyte | south | insample_prevalence | 10 | 0.3052 | 0.2352 | 0.3713 | 0.3043 | 0.0687 | +| bryophyte | south | insample_rmse | 10 | 0.4407 | 0.3994 | 0.4751 | 0.4384 | 0.0377 | +| bryophyte | south | insample_spearman | 10 | 0.2678 | 0.2042 | 0.3271 | 0.2668 | 0.0610 | +| bryophyte | south | oob_auc | 8 | 0.6737 | 0.6156 | 0.7162 | 0.6682 | 0.0497 | +| bryophyte | south | oob_calibration_slope | 8 | 0.8626 | 0.7944 | 0.9233 | 0.8595 | 0.0569 | +| bryophyte | south | oob_deviance_explained | 8 | 0.0177 | -0.0430 | 0.0521 | 0.0106 | 0.0409 | +| bryophyte | south | oob_n | 10 | 855.5000 | 0.0000 | 869.2000 | 687.0000 | 362.3789 | +| bryophyte | south | oob_prevalence | 8 | 0.3139 | 0.2297 | 0.3751 | 0.3071 | 0.0716 | +| bryophyte | south | oob_rmse | 8 | 0.4447 | 0.3999 | 0.4766 | 0.4408 | 0.0371 | +| bryophyte | south | oob_spearman | 8 | 0.2693 | 0.1933 | 0.3245 | 0.2610 | 0.0620 | +| bryophyte | south | oob_v2val_Climate | 8 | 0.6045 | 0.5487 | 0.6482 | 0.5986 | 0.0463 | +| bryophyte | south | oob_v2val_Climate_Truncated | 8 | 0.6045 | 0.5486 | 0.6482 | 0.5986 | 0.0463 | +| bryophyte | south | oob_v2val_Full | 8 | 0.6737 | 0.6156 | 0.7162 | 0.6682 | 0.0497 | +| bryophyte | south | oob_v2val_Full_Joint | 8 | 0.6754 | 0.6148 | 0.7178 | 0.6689 | 0.0510 | +| bryophyte | south | oob_v2val_Full_Joint_Truncated | 8 | 0.6754 | 0.6148 | 0.7178 | 0.6689 | 0.0510 | +| bryophyte | south | oob_v2val_Full_Truncated | 8 | 0.6737 | 0.6156 | 0.7162 | 0.6682 | 0.0497 | +| bryophyte | south | oob_v2val_Landcover | 8 | 0.6029 | 0.5970 | 0.6332 | 0.6102 | 0.0172 | +| bryophyte | south | v2val_Climate | 10 | 0.6069 | 0.5555 | 0.6643 | 0.6086 | 0.0518 | +| bryophyte | south | v2val_Climate_Truncated | 10 | 0.6069 | 0.5555 | 0.6643 | 0.6086 | 0.0518 | +| bryophyte | south | v2val_Full | 10 | 0.6741 | 0.6221 | 0.7221 | 0.6723 | 0.0498 | +| bryophyte | south | v2val_Full_Joint | 10 | 0.6743 | 0.6214 | 0.7227 | 0.6726 | 0.0505 | +| bryophyte | south | v2val_Full_Joint_Truncated | 10 | 0.6743 | 0.6215 | 0.7227 | 0.6726 | 0.0505 | +| bryophyte | south | v2val_Full_Truncated | 10 | 0.6741 | 0.6221 | 0.7221 | 0.6723 | 0.0498 | +| bryophyte | south | v2val_Landcover | 10 | 0.6137 | 0.5905 | 0.6386 | 0.6139 | 0.0223 | +| lichen | north | insample_auc | 10 | 0.8074 | 0.7781 | 0.8388 | 0.8083 | 0.0311 | +| lichen | north | insample_calibration_slope | 10 | 1.0001 | 0.9745 | 1.0269 | 0.9999 | 0.0221 | +| lichen | north | insample_deviance_explained | 10 | 0.1360 | 0.1091 | 0.1649 | 0.1405 | 0.0261 | +| lichen | north | insample_n | 10 | 3692.0000 | 3654.0000 | 5811.0000 | 4109.1000 | 897.3877 | +| lichen | north | insample_prevalence | 10 | 0.3839 | 0.3815 | 0.3891 | 0.3840 | 0.0037 | +| lichen | north | insample_rmse | 10 | 0.4112 | 0.3929 | 0.4298 | 0.4111 | 0.0183 | +| lichen | north | insample_spearman | 10 | 0.5176 | 0.4685 | 0.5707 | 0.5194 | 0.0520 | +| lichen | north | oob_auc | 8 | 0.7997 | 0.7622 | 0.8453 | 0.8016 | 0.0403 | +| lichen | north | oob_calibration_slope | 8 | 0.9794 | 0.9485 | 1.0076 | 0.9784 | 0.0272 | +| lichen | north | oob_deviance_explained | 8 | 0.1271 | 0.0891 | 0.1748 | 0.1334 | 0.0469 | +| lichen | north | oob_n | 10 | 2119.0000 | 0.0000 | 2157.0000 | 1701.9000 | 897.3877 | +| lichen | north | oob_prevalence | 8 | 0.3864 | 0.3761 | 0.3921 | 0.3853 | 0.0072 | +| lichen | north | oob_rmse | 8 | 0.4171 | 0.3889 | 0.4363 | 0.4142 | 0.0224 | +| lichen | north | oob_spearman | 8 | 0.5059 | 0.4420 | 0.5824 | 0.5084 | 0.0681 | +| lichen | north | oob_v2val_Climate | 8 | 0.7041 | 0.6878 | 0.7158 | 0.7028 | 0.0127 | +| lichen | north | oob_v2val_Climate_Truncated | 8 | 0.7041 | 0.6878 | 0.7158 | 0.7028 | 0.0127 | +| lichen | north | oob_v2val_Full | 8 | 0.7997 | 0.7622 | 0.8453 | 0.8016 | 0.0403 | +| lichen | north | oob_v2val_Full_Joint | 8 | 0.7969 | 0.7616 | 0.8417 | 0.7996 | 0.0394 | +| lichen | north | oob_v2val_Full_Joint_Truncated | 8 | 0.7969 | 0.7615 | 0.8418 | 0.7996 | 0.0396 | +| lichen | north | oob_v2val_Full_Truncated | 8 | 0.7997 | 0.7624 | 0.8453 | 0.8016 | 0.0404 | +| lichen | north | oob_v2val_Landcover | 8 | 0.7481 | 0.6957 | 0.8186 | 0.7528 | 0.0579 | +| lichen | north | v2val_Climate | 10 | 0.7093 | 0.6916 | 0.7289 | 0.7101 | 0.0183 | +| lichen | north | v2val_Climate_Truncated | 10 | 0.7093 | 0.6916 | 0.7290 | 0.7101 | 0.0183 | +| lichen | north | v2val_Full | 10 | 0.8074 | 0.7781 | 0.8388 | 0.8083 | 0.0311 | +| lichen | north | v2val_Full_Joint | 10 | 0.8057 | 0.7771 | 0.8370 | 0.8071 | 0.0308 | +| lichen | north | v2val_Full_Joint_Truncated | 10 | 0.8057 | 0.7770 | 0.8372 | 0.8071 | 0.0309 | +| lichen | north | v2val_Full_Truncated | 10 | 0.8074 | 0.7780 | 0.8390 | 0.8083 | 0.0312 | +| lichen | north | v2val_Landcover | 10 | 0.7424 | 0.7115 | 0.8121 | 0.7566 | 0.0468 | +| lichen | south | insample_auc | 10 | 0.8021 | 0.7789 | 0.8223 | 0.8009 | 0.0226 | +| lichen | south | insample_calibration_slope | 10 | 0.9035 | 0.8740 | 1.0439 | 0.9436 | 0.0783 | +| lichen | south | insample_deviance_explained | 10 | 0.1705 | 0.0924 | 0.2412 | 0.1684 | 0.0753 | +| lichen | south | insample_n | 10 | 1484.5000 | 1478.5000 | 2346.0000 | 1657.8000 | 362.9370 | +| lichen | south | insample_prevalence | 10 | 0.1511 | 0.0868 | 0.2167 | 0.1525 | 0.0659 | +| lichen | south | insample_rmse | 10 | 0.3163 | 0.2688 | 0.3582 | 0.3146 | 0.0440 | +| lichen | south | insample_spearman | 10 | 0.3667 | 0.2735 | 0.4597 | 0.3676 | 0.0948 | +| lichen | south | oob_auc | 8 | 0.7976 | 0.7632 | 0.8185 | 0.7926 | 0.0270 | +| lichen | south | oob_calibration_slope | 8 | 0.9438 | 0.7927 | 1.1880 | 0.9710 | 0.1829 | +| lichen | south | oob_deviance_explained | 8 | 0.1218 | -0.0135 | 0.2395 | 0.1153 | 0.1246 | +| lichen | south | oob_n | 10 | 861.5000 | 0.0000 | 867.5000 | 688.2000 | 362.9370 | +| lichen | south | oob_prevalence | 8 | 0.1578 | 0.0943 | 0.2207 | 0.1582 | 0.0637 | +| lichen | south | oob_rmse | 8 | 0.3261 | 0.2806 | 0.3630 | 0.3232 | 0.0402 | +| lichen | south | oob_spearman | 8 | 0.3688 | 0.2665 | 0.4581 | 0.3651 | 0.0946 | +| lichen | south | oob_v2val_Climate | 8 | 0.7041 | 0.6878 | 0.7158 | 0.7028 | 0.0127 | +| lichen | south | oob_v2val_Climate_Truncated | 8 | 0.7041 | 0.6878 | 0.7158 | 0.7028 | 0.0127 | +| lichen | south | oob_v2val_Full | 8 | 0.7976 | 0.7632 | 0.8185 | 0.7926 | 0.0270 | +| lichen | south | oob_v2val_Full_Joint | 8 | 0.7958 | 0.7656 | 0.8153 | 0.7914 | 0.0240 | +| lichen | south | oob_v2val_Full_Joint_Truncated | 8 | 0.7958 | 0.7656 | 0.8153 | 0.7914 | 0.0240 | +| lichen | south | oob_v2val_Full_Truncated | 8 | 0.7976 | 0.7632 | 0.8185 | 0.7926 | 0.0270 | +| lichen | south | oob_v2val_Landcover | 8 | 0.7535 | 0.7464 | 0.7630 | 0.7537 | 0.0086 | +| lichen | south | v2val_Climate | 10 | 0.7093 | 0.6916 | 0.7289 | 0.7101 | 0.0183 | +| lichen | south | v2val_Climate_Truncated | 10 | 0.7093 | 0.6916 | 0.7290 | 0.7101 | 0.0183 | +| lichen | south | v2val_Full | 10 | 0.8021 | 0.7789 | 0.8223 | 0.8009 | 0.0226 | +| lichen | south | v2val_Full_Joint | 10 | 0.8018 | 0.7799 | 0.8189 | 0.8001 | 0.0202 | +| lichen | south | v2val_Full_Joint_Truncated | 10 | 0.8018 | 0.7799 | 0.8189 | 0.8001 | 0.0202 | +| lichen | south | v2val_Full_Truncated | 10 | 0.8021 | 0.7789 | 0.8223 | 0.8009 | 0.0226 | +| lichen | south | v2val_Landcover | 10 | 0.7535 | 0.7435 | 0.7653 | 0.7532 | 0.0119 | +| mammal_summer | north | insample_auc | 10 | 0.7207 | 0.6085 | 0.8216 | 0.7173 | 0.1099 | +| mammal_summer | north | insample_calibration_slope | 10 | 0.9417 | 0.8161 | 1.0198 | 0.9320 | 0.0845 | +| mammal_summer | north | insample_deviance_explained | 10 | 0.1542 | 0.0268 | 0.2763 | 0.1529 | 0.1296 | +| mammal_summer | north | insample_n | 10 | 2587.5000 | 2542.1000 | 4053.0000 | 2865.2000 | 626.3850 | +| mammal_summer | north | insample_prevalence | 10 | 0.2736 | 0.2243 | 0.3206 | 0.2726 | 0.0496 | +| mammal_summer | north | insample_rmse | 10 | 0.3836 | 0.3234 | 0.4410 | 0.3831 | 0.0608 | +| mammal_summer | north | insample_spearman | 10 | 0.3160 | 0.1627 | 0.4610 | 0.3131 | 0.1542 | +| mammal_summer | north | oob_auc | 8 | 0.7007 | 0.5879 | 0.8116 | 0.7020 | 0.1114 | +| mammal_summer | north | oob_calibration_slope | 8 | 0.8971 | 0.7046 | 0.9590 | 0.8583 | 0.1139 | +| mammal_summer | north | oob_deviance_explained | 8 | 0.1194 | 0.0155 | 0.2466 | 0.1282 | 0.1142 | +| mammal_summer | north | oob_n | 10 | 1465.5000 | 0.0000 | 1510.9000 | 1187.8000 | 626.3850 | +| mammal_summer | north | oob_prevalence | 8 | 0.2774 | 0.2208 | 0.3261 | 0.2746 | 0.0539 | +| mammal_summer | north | oob_rmse | 8 | 0.3919 | 0.3312 | 0.4445 | 0.3895 | 0.0585 | +| mammal_summer | north | oob_spearman | 8 | 0.2911 | 0.1268 | 0.4415 | 0.2892 | 0.1555 | +| mammal_summer | south | insample_auc | 10 | 0.7054 | 0.6336 | 0.8030 | 0.7149 | 0.0833 | +| mammal_summer | south | insample_calibration_slope | 10 | 0.9832 | 0.8710 | 1.0087 | 0.9605 | 0.0585 | +| mammal_summer | south | insample_deviance_explained | 10 | 0.1016 | 0.0257 | 0.2383 | 0.1233 | 0.1035 | +| mammal_summer | south | insample_n | 10 | 676.5000 | 670.8000 | 1065.0000 | 753.7000 | 164.1402 | +| mammal_summer | south | insample_prevalence | 10 | 0.4451 | 0.1814 | 0.7098 | 0.4419 | 0.2704 | +| mammal_summer | south | insample_rmse | 10 | 0.3814 | 0.3405 | 0.4191 | 0.3811 | 0.0380 | +| mammal_summer | south | insample_spearman | 10 | 0.2798 | 0.1705 | 0.4148 | 0.2864 | 0.1148 | +| mammal_summer | south | oob_auc | 8 | 0.6568 | 0.5888 | 0.7557 | 0.6672 | 0.0845 | +| mammal_summer | south | oob_calibration_slope | 8 | 0.6589 | 0.4354 | 1.0000 | 0.7200 | 0.2938 | +| mammal_summer | south | oob_deviance_explained | 8 | 0.0059 | -0.0790 | 0.1356 | 0.0219 | 0.1214 | +| mammal_summer | south | oob_n | 10 | 388.5000 | 0.0000 | 394.2000 | 311.3000 | 164.1402 | +| mammal_summer | south | oob_prevalence | 8 | 0.4195 | 0.1726 | 0.6930 | 0.4251 | 0.2678 | +| mammal_summer | south | oob_rmse | 8 | 0.3986 | 0.3422 | 0.4425 | 0.3948 | 0.0479 | +| mammal_summer | south | oob_spearman | 8 | 0.2181 | 0.1135 | 0.3243 | 0.2204 | 0.1080 | +| mammal_winter | north | insample_auc | 10 | 0.7608 | 0.6687 | 0.8445 | 0.7578 | 0.0888 | +| mammal_winter | north | insample_calibration_slope | 10 | 0.9604 | 0.9077 | 1.0052 | 0.9518 | 0.0647 | +| mammal_winter | north | insample_deviance_explained | 10 | 0.1877 | 0.0712 | 0.3014 | 0.1868 | 0.1161 | +| mammal_winter | north | insample_n | 10 | 2624.5000 | 2596.8000 | 4127.0000 | 2921.0000 | 635.9504 | +| mammal_winter | north | insample_prevalence | 10 | 0.1752 | 0.1467 | 0.2040 | 0.1753 | 0.0287 | +| mammal_winter | north | insample_rmse | 10 | 0.3149 | 0.2994 | 0.3346 | 0.3161 | 0.0165 | +| mammal_winter | north | insample_spearman | 10 | 0.3463 | 0.2134 | 0.4714 | 0.3427 | 0.1314 | +| mammal_winter | north | oob_auc | 8 | 0.7383 | 0.6458 | 0.8353 | 0.7401 | 0.0953 | +| mammal_winter | north | oob_calibration_slope | 8 | 0.8540 | 0.6612 | 0.9533 | 0.8259 | 0.1149 | +| mammal_winter | north | oob_deviance_explained | 8 | 0.1614 | 0.0413 | 0.2853 | 0.1646 | 0.1234 | +| mammal_winter | north | oob_n | 10 | 1502.5000 | 0.0000 | 1530.2000 | 1206.0000 | 635.9504 | +| mammal_winter | north | oob_prevalence | 8 | 0.1756 | 0.1450 | 0.2025 | 0.1746 | 0.0269 | +| mammal_winter | north | oob_rmse | 8 | 0.3180 | 0.3015 | 0.3423 | 0.3198 | 0.0192 | +| mammal_winter | north | oob_spearman | 8 | 0.3198 | 0.1800 | 0.4528 | 0.3184 | 0.1382 | +| mammal_winter | south | insample_auc | 10 | 0.7642 | 0.6906 | 0.8292 | 0.7651 | 0.0684 | +| mammal_winter | south | insample_calibration_slope | 10 | 0.9542 | 0.8588 | 1.0389 | 0.9614 | 0.0769 | +| mammal_winter | south | insample_deviance_explained | 10 | 0.1574 | 0.0675 | 0.2501 | 0.1637 | 0.0946 | +| mammal_winter | south | insample_n | 10 | 694.0000 | 684.8000 | 1098.0000 | 773.7000 | 171.0842 | +| mammal_winter | south | insample_prevalence | 10 | 0.3450 | 0.0865 | 0.6052 | 0.3446 | 0.2704 | +| mammal_winter | south | insample_rmse | 10 | 0.3145 | 0.2215 | 0.4071 | 0.3127 | 0.0960 | +| mammal_winter | south | insample_spearman | 10 | 0.3224 | 0.2964 | 0.3373 | 0.3206 | 0.0167 | +| mammal_winter | south | oob_auc | 8 | 0.7095 | 0.6257 | 0.7915 | 0.7074 | 0.0854 | +| mammal_winter | south | oob_calibration_slope | 8 | 0.7307 | 0.4495 | 0.8353 | 0.6770 | 0.1665 | +| mammal_winter | south | oob_deviance_explained | 8 | 0.0389 | 0.0035 | 0.1901 | 0.0790 | 0.0856 | +| mammal_winter | south | oob_n | 10 | 404.0000 | 0.0000 | 413.2000 | 324.3000 | 171.0842 | +| mammal_winter | south | oob_prevalence | 8 | 0.3501 | 0.0777 | 0.6225 | 0.3492 | 0.2818 | +| mammal_winter | south | oob_rmse | 8 | 0.3337 | 0.2202 | 0.4271 | 0.3264 | 0.1027 | +| mammal_winter | south | oob_spearman | 8 | 0.2450 | 0.1833 | 0.2817 | 0.2399 | 0.0463 | +| mite | north | insample_auc | 10 | 0.7336 | 0.6697 | 0.7962 | 0.7334 | 0.0621 | +| mite | north | insample_calibration_slope | 10 | 1.0028 | 0.9276 | 1.0341 | 0.9867 | 0.0488 | +| mite | north | insample_deviance_explained | 10 | 0.0502 | -0.0427 | 0.1395 | 0.0479 | 0.0867 | +| mite | north | insample_n | 10 | 3630.0000 | 3598.5000 | 5711.0000 | 4041.0000 | 880.4163 | +| mite | north | insample_prevalence | 10 | 0.1545 | 0.0943 | 0.2113 | 0.1531 | 0.0602 | +| mite | north | insample_rmse | 10 | 0.3279 | 0.2873 | 0.3658 | 0.3272 | 0.0404 | +| mite | north | insample_spearman | 10 | 0.2958 | 0.1729 | 0.4186 | 0.2953 | 0.1234 | +| mite | north | oob_auc | 8 | 0.7189 | 0.6461 | 0.7894 | 0.7187 | 0.0708 | +| mite | north | oob_calibration_slope | 8 | 0.9472 | 0.7462 | 1.0295 | 0.9187 | 0.1294 | +| mite | north | oob_deviance_explained | 8 | 0.0324 | -0.0828 | 0.1165 | 0.0211 | 0.1006 | +| mite | north | oob_n | 10 | 2081.0000 | 0.0000 | 2112.5000 | 1670.0000 | 880.4163 | +| mite | north | oob_prevalence | 8 | 0.1509 | 0.0925 | 0.2048 | 0.1495 | 0.0588 | +| mite | north | oob_rmse | 8 | 0.3263 | 0.2853 | 0.3680 | 0.3268 | 0.0416 | +| mite | north | oob_spearman | 8 | 0.2764 | 0.1475 | 0.4035 | 0.2761 | 0.1298 | +| mite | north | oob_v2val_Climate | 8 | 0.6835 | 0.6308 | 0.7383 | 0.6832 | 0.0539 | +| mite | north | oob_v2val_Climate_Truncated | 8 | 0.6834 | 0.6308 | 0.7383 | 0.6832 | 0.0539 | +| mite | north | oob_v2val_Full | 8 | 0.7189 | 0.6461 | 0.7894 | 0.7187 | 0.0708 | +| mite | north | oob_v2val_Full_Joint | 8 | 0.7191 | 0.6447 | 0.7888 | 0.7183 | 0.0712 | +| mite | north | oob_v2val_Full_Joint_Truncated | 8 | 0.7192 | 0.6448 | 0.7887 | 0.7183 | 0.0712 | +| mite | north | oob_v2val_Full_Truncated | 8 | 0.7190 | 0.6462 | 0.7893 | 0.7188 | 0.0708 | +| mite | north | oob_v2val_Landcover | 8 | 0.6850 | 0.6172 | 0.7620 | 0.6890 | 0.0750 | +| mite | north | v2val_Climate | 10 | 0.6950 | 0.6449 | 0.7401 | 0.6928 | 0.0480 | +| mite | north | v2val_Climate_Truncated | 10 | 0.6950 | 0.6449 | 0.7401 | 0.6928 | 0.0480 | +| mite | north | v2val_Full | 10 | 0.7336 | 0.6697 | 0.7962 | 0.7334 | 0.0621 | +| mite | north | v2val_Full_Joint | 10 | 0.7336 | 0.6692 | 0.7962 | 0.7334 | 0.0622 | +| mite | north | v2val_Full_Joint_Truncated | 10 | 0.7336 | 0.6692 | 0.7962 | 0.7334 | 0.0621 | +| mite | north | v2val_Full_Truncated | 10 | 0.7336 | 0.6697 | 0.7961 | 0.7334 | 0.0620 | +| mite | north | v2val_Landcover | 10 | 0.7057 | 0.6335 | 0.7708 | 0.7020 | 0.0683 | +| mite | south | insample_auc | 10 | 0.7997 | 0.7044 | 0.8840 | 0.7968 | 0.0893 | +| mite | south | insample_calibration_slope | 10 | 0.7882 | 0.6097 | 0.9768 | 0.7906 | 0.1787 | +| mite | south | insample_deviance_explained | 10 | 0.0405 | -0.0053 | 0.1740 | 0.0764 | 0.0831 | +| mite | south | insample_n | 10 | 1493.0000 | 1480.9000 | 2363.0000 | 1665.8000 | 367.6444 | +| mite | south | insample_prevalence | 10 | 0.0721 | 0.0556 | 0.0841 | 0.0703 | 0.0144 | +| mite | south | insample_rmse | 10 | 0.2482 | 0.2139 | 0.2709 | 0.2446 | 0.0273 | +| mite | south | insample_spearman | 10 | 0.2519 | 0.1954 | 0.3151 | 0.2550 | 0.0557 | +| mite | south | oob_auc | 8 | 0.7769 | 0.6582 | 0.8839 | 0.7745 | 0.1136 | +| mite | south | oob_calibration_slope | 8 | 0.6139 | 0.5353 | 0.8012 | 0.6444 | 0.1288 | +| mite | south | oob_deviance_explained | 8 | 0.0535 | 0.0095 | 0.2026 | 0.0819 | 0.0851 | +| mite | south | oob_n | 10 | 870.0000 | 0.0000 | 882.1000 | 697.2000 | 367.6444 | +| mite | south | oob_prevalence | 8 | 0.0719 | 0.0489 | 0.0868 | 0.0689 | 0.0174 | +| mite | south | oob_rmse | 8 | 0.2447 | 0.2147 | 0.2788 | 0.2456 | 0.0307 | +| mite | south | oob_spearman | 8 | 0.2233 | 0.1492 | 0.3189 | 0.2298 | 0.0764 | +| mite | south | oob_v2val_Climate | 8 | 0.6835 | 0.6308 | 0.7383 | 0.6832 | 0.0539 | +| mite | south | oob_v2val_Climate_Truncated | 8 | 0.6834 | 0.6308 | 0.7383 | 0.6832 | 0.0539 | +| mite | south | oob_v2val_Full | 8 | 0.7769 | 0.6582 | 0.8839 | 0.7745 | 0.1136 | +| mite | south | oob_v2val_Full_Joint | 8 | 0.7766 | 0.6587 | 0.8846 | 0.7751 | 0.1137 | +| mite | south | oob_v2val_Full_Joint_Truncated | 8 | 0.7766 | 0.6587 | 0.8846 | 0.7751 | 0.1137 | +| mite | south | oob_v2val_Full_Truncated | 8 | 0.7769 | 0.6582 | 0.8839 | 0.7745 | 0.1136 | +| mite | south | oob_v2val_Landcover | 8 | 0.6792 | 0.6125 | 0.7124 | 0.6651 | 0.0460 | +| mite | south | v2val_Climate | 10 | 0.6950 | 0.6449 | 0.7401 | 0.6928 | 0.0480 | +| mite | south | v2val_Climate_Truncated | 10 | 0.6950 | 0.6449 | 0.7401 | 0.6928 | 0.0480 | +| mite | south | v2val_Full | 10 | 0.7997 | 0.7044 | 0.8840 | 0.7968 | 0.0893 | +| mite | south | v2val_Full_Joint | 10 | 0.8014 | 0.7048 | 0.8843 | 0.7975 | 0.0894 | +| mite | south | v2val_Full_Joint_Truncated | 10 | 0.8014 | 0.7048 | 0.8843 | 0.7975 | 0.0894 | +| mite | south | v2val_Full_Truncated | 10 | 0.7997 | 0.7044 | 0.8840 | 0.7968 | 0.0893 | +| mite | south | v2val_Landcover | 10 | 0.7027 | 0.6602 | 0.7282 | 0.6970 | 0.0287 | +| vascular_plant | north | insample_auc | 10 | 0.8331 | 0.8298 | 0.8373 | 0.8332 | 0.0032 | +| vascular_plant | north | insample_calibration_slope | 10 | 0.9949 | 0.9743 | 1.0061 | 0.9918 | 0.0148 | +| vascular_plant | north | insample_deviance_explained | 10 | 0.1616 | 0.1396 | 0.1816 | 0.1602 | 0.0191 | +| vascular_plant | north | insample_n | 10 | 4347.5000 | 4314.6000 | 6874.0000 | 4846.9000 | 1068.6395 | +| vascular_plant | north | insample_prevalence | 10 | 0.3951 | 0.3770 | 0.4211 | 0.3974 | 0.0209 | +| vascular_plant | north | insample_rmse | 10 | 0.4022 | 0.3958 | 0.4067 | 0.4017 | 0.0048 | +| vascular_plant | north | insample_spearman | 10 | 0.5651 | 0.5611 | 0.5668 | 0.5644 | 0.0038 | +| vascular_plant | north | oob_auc | 8 | 0.8283 | 0.8227 | 0.8329 | 0.8284 | 0.0052 | +| vascular_plant | north | oob_calibration_slope | 8 | 0.9755 | 0.9539 | 1.0021 | 0.9776 | 0.0210 | +| vascular_plant | north | oob_deviance_explained | 8 | 0.1803 | 0.1354 | 0.2064 | 0.1750 | 0.0321 | +| vascular_plant | north | oob_n | 10 | 2526.5000 | 0.0000 | 2559.4000 | 2027.1000 | 1068.6395 | +| vascular_plant | north | oob_prevalence | 8 | 0.3990 | 0.3725 | 0.4275 | 0.3991 | 0.0248 | +| vascular_plant | north | oob_rmse | 8 | 0.4052 | 0.3988 | 0.4110 | 0.4048 | 0.0061 | +| vascular_plant | north | oob_spearman | 8 | 0.5545 | 0.5499 | 0.5651 | 0.5564 | 0.0065 | +| vascular_plant | north | oob_v2val_Climate | 8 | 0.6916 | 0.6808 | 0.6996 | 0.6902 | 0.0106 | +| vascular_plant | north | oob_v2val_Climate_Truncated | 8 | 0.6916 | 0.6808 | 0.6996 | 0.6902 | 0.0106 | +| vascular_plant | north | oob_v2val_Full | 8 | 0.8283 | 0.8227 | 0.8329 | 0.8284 | 0.0052 | +| vascular_plant | north | oob_v2val_Full_Joint | 8 | 0.8258 | 0.8182 | 0.8325 | 0.8258 | 0.0065 | +| vascular_plant | north | oob_v2val_Full_Joint_Truncated | 8 | 0.8258 | 0.8183 | 0.8323 | 0.8258 | 0.0064 | +| vascular_plant | north | oob_v2val_Full_Truncated | 8 | 0.8285 | 0.8228 | 0.8328 | 0.8284 | 0.0051 | +| vascular_plant | north | oob_v2val_Landcover | 8 | 0.8009 | 0.7954 | 0.8101 | 0.8024 | 0.0067 | +| vascular_plant | north | v2val_Climate | 10 | 0.6886 | 0.6855 | 0.6950 | 0.6902 | 0.0048 | +| vascular_plant | north | v2val_Climate_Truncated | 10 | 0.6886 | 0.6855 | 0.6949 | 0.6902 | 0.0048 | +| vascular_plant | north | v2val_Full | 10 | 0.8331 | 0.8298 | 0.8373 | 0.8332 | 0.0032 | +| vascular_plant | north | v2val_Full_Joint | 10 | 0.8318 | 0.8275 | 0.8367 | 0.8320 | 0.0039 | +| vascular_plant | north | v2val_Full_Joint_Truncated | 10 | 0.8319 | 0.8277 | 0.8366 | 0.8321 | 0.0038 | +| vascular_plant | north | v2val_Full_Truncated | 10 | 0.8330 | 0.8299 | 0.8373 | 0.8332 | 0.0031 | +| vascular_plant | north | v2val_Landcover | 10 | 0.8087 | 0.8049 | 0.8130 | 0.8092 | 0.0040 | +| vascular_plant | south | insample_auc | 10 | 0.8460 | 0.8042 | 0.8967 | 0.8490 | 0.0462 | +| vascular_plant | south | insample_calibration_slope | 10 | 0.9608 | 0.9208 | 0.9855 | 0.9580 | 0.0297 | +| vascular_plant | south | insample_deviance_explained | 10 | 0.2841 | 0.1600 | 0.3822 | 0.2752 | 0.1074 | +| vascular_plant | south | insample_n | 10 | 1688.5000 | 1654.9000 | 2648.0000 | 1869.6000 | 410.6067 | +| vascular_plant | south | insample_prevalence | 10 | 0.2438 | 0.2212 | 0.2654 | 0.2437 | 0.0227 | +| vascular_plant | south | insample_rmse | 10 | 0.3477 | 0.3070 | 0.3827 | 0.3458 | 0.0374 | +| vascular_plant | south | insample_spearman | 10 | 0.5180 | 0.4628 | 0.5647 | 0.5163 | 0.0529 | +| vascular_plant | south | oob_auc | 8 | 0.8412 | 0.8038 | 0.8909 | 0.8455 | 0.0409 | +| vascular_plant | south | oob_calibration_slope | 8 | 0.9408 | 0.9073 | 0.9701 | 0.9401 | 0.0277 | +| vascular_plant | south | oob_deviance_explained | 8 | 0.2459 | 0.1728 | 0.3387 | 0.2532 | 0.0850 | +| vascular_plant | south | oob_n | 10 | 959.5000 | 0.0000 | 993.1000 | 778.4000 | 410.6067 | +| vascular_plant | south | oob_prevalence | 8 | 0.2418 | 0.2131 | 0.2706 | 0.2421 | 0.0259 | +| vascular_plant | south | oob_rmse | 8 | 0.3513 | 0.3168 | 0.3827 | 0.3502 | 0.0336 | +| vascular_plant | south | oob_spearman | 8 | 0.5033 | 0.4643 | 0.5589 | 0.5099 | 0.0446 | +| vascular_plant | south | oob_v2val_Climate | 8 | 0.6916 | 0.6808 | 0.6996 | 0.6902 | 0.0106 | +| vascular_plant | south | oob_v2val_Climate_Truncated | 8 | 0.6916 | 0.6808 | 0.6996 | 0.6902 | 0.0106 | +| vascular_plant | south | oob_v2val_Full | 8 | 0.8412 | 0.8038 | 0.8909 | 0.8455 | 0.0409 | +| vascular_plant | south | oob_v2val_Full_Joint | 8 | 0.8369 | 0.8023 | 0.8809 | 0.8406 | 0.0373 | +| vascular_plant | south | oob_v2val_Full_Joint_Truncated | 8 | 0.8369 | 0.8023 | 0.8809 | 0.8406 | 0.0373 | +| vascular_plant | south | oob_v2val_Full_Truncated | 8 | 0.8412 | 0.8038 | 0.8908 | 0.8455 | 0.0409 | +| vascular_plant | south | oob_v2val_Landcover | 8 | 0.7762 | 0.7677 | 0.7961 | 0.7793 | 0.0125 | +| vascular_plant | south | v2val_Climate | 10 | 0.6886 | 0.6855 | 0.6950 | 0.6902 | 0.0048 | +| vascular_plant | south | v2val_Climate_Truncated | 10 | 0.6886 | 0.6855 | 0.6949 | 0.6902 | 0.0048 | +| vascular_plant | south | v2val_Full | 10 | 0.8460 | 0.8042 | 0.8967 | 0.8490 | 0.0462 | +| vascular_plant | south | v2val_Full_Joint | 10 | 0.8411 | 0.8013 | 0.8920 | 0.8446 | 0.0448 | +| vascular_plant | south | v2val_Full_Joint_Truncated | 10 | 0.8411 | 0.8013 | 0.8920 | 0.8446 | 0.0448 | +| vascular_plant | south | v2val_Full_Truncated | 10 | 0.8460 | 0.8042 | 0.8967 | 0.8490 | 0.0462 | +| vascular_plant | south | v2val_Landcover | 10 | 0.7783 | 0.7609 | 0.8028 | 0.7802 | 0.0202 | diff --git a/3_output/exp_000_parity_v2/tables/metric_summary.csv b/3_output/exp_000_parity_v2/tables/metric_summary.csv index c7c959b..546c2e7 100644 --- a/3_output/exp_000_parity_v2/tables/metric_summary.csv +++ b/3_output/exp_000_parity_v2/tables/metric_summary.csv @@ -1,617 +1,617 @@ -taxon,run,region,season,part,species,metric,n,median,p10,p90,boot1 -bird,bird,north,,,AMRO,insample_auc,5,0.72487649207557,0.722489112963132,0.72576145123834,0.721701661835893 -bird,bird,north,,,AMRO,insample_deviance_explained,5,0.142215080261758,0.140707166105981,0.144363142127984,0.140587647159979 -bird,bird,north,,,AMRO,insample_rmse,5,0.663619993960517,0.661624845419777,0.664719637388853,0.664239276180889 -bird,bird,north,,,AMRO,insample_spearman,5,0.344389309730045,0.340479678130316,0.345510088540595,0.339249301212572 -bird,bird,north,,,AMRO,insample_calibration_slope,5,0.80440117768677,0.799100431621395,0.810804150827482,0.80440117768677 -bird,bird,north,,,AMRO,insample_prevalence,5,0.251486631016043,0.251004373826971,0.252433263182893,0.250861017819325 -bird,bird,north,,,AMRO,insample_n,5,46747,46745.2,46750,46747 -bird,bird,north,,,AMRO,oob_auc,5,0.730373137296335,0.729897207197475,0.730684827423547,0.730766733254682 -bird,bird,north,,,AMRO,oob_deviance_explained,5,0.151664799728976,0.150795650809459,0.152520757577584,0.152754178062373 -bird,bird,north,,,AMRO,oob_rmse,5,0.658090400254619,0.657748490410106,0.658646272283023,0.657851304309638 -bird,bird,north,,,AMRO,oob_spearman,5,0.348000943732488,0.347176086570868,0.348405542162744,0.348509330988823 -bird,bird,north,,,AMRO,oob_calibration_slope,5,0.878884682385081,0.857978242744613,0.881378788597934,0.881696624797909 -bird,bird,north,,,AMRO,oob_prevalence,5,0.241010939026539,0.240656718532255,0.241191818078906,0.241245385459292 -bird,bird,north,,,AMRO,oob_n,5,124877,124874,124878.8,124877 -bird,bird,north,,,YEWA,insample_auc,5,0.778635633427003,0.778333348933502,0.779726988023268,0.779841092447633 -bird,bird,north,,,YEWA,insample_deviance_explained,5,0.259141214360432,0.25548753680516,0.260976441286628,0.259141214360432 -bird,bird,north,,,YEWA,insample_rmse,5,0.547361440801496,0.544308917361954,0.551849139043791,0.547158394049375 -bird,bird,north,,,YEWA,insample_spearman,5,0.315565876581618,0.314186701701599,0.31608982965666,0.316093683296469 -bird,bird,north,,,YEWA,insample_calibration_slope,5,0.705708332778131,0.69321277112837,0.712055437422832,0.716264166431109 -bird,bird,north,,,YEWA,insample_prevalence,5,0.118296361263824,0.117706951871658,0.119214980837802,0.118296361263824 -bird,bird,north,,,YEWA,insample_n,5,46747,46745.2,46750,46747 -bird,bird,north,,,YEWA,oob_auc,5,0.728595786591222,0.728230136724689,0.73005150345856,0.730809600284142 -bird,bird,north,,,YEWA,oob_deviance_explained,5,0.179475572495229,0.177360125449593,0.182723444677448,0.183210182399369 -bird,bird,north,,,YEWA,oob_rmse,5,0.591197627682823,0.582204245542092,0.591914132572009,0.581496589737255 -bird,bird,north,,,YEWA,oob_spearman,5,0.273873998143111,0.273042129222169,0.27544277961002,0.276382265893519 -bird,bird,north,,,YEWA,oob_calibration_slope,5,0.66953950556298,0.63693641889123,0.713887951481982,0.718728425403305 -bird,bird,north,,,YEWA,oob_prevalence,5,0.13458843502006,0.134244406707603,0.134809487963868,0.13458843502006 -bird,bird,north,,,YEWA,oob_n,5,124877,124874,124878.8,124877 -bird,bird,south,,,AMRO,insample_auc,5,0.689537506786954,0.689085767534014,0.694179854134546,0.689537506786954 -bird,bird,south,,,AMRO,insample_deviance_explained,5,0.0914919911243302,0.0907862366206112,0.0936622473347538,0.0905093060629211 -bird,bird,south,,,AMRO,insample_rmse,5,0.742475038662062,0.740051841768597,0.745694348908307,0.746104469516561 -bird,bird,south,,,AMRO,insample_spearman,5,0.289206389172517,0.287837179517966,0.295789973779885,0.287696121760142 -bird,bird,south,,,AMRO,insample_calibration_slope,5,0.885482053955006,0.883345065042026,0.893982715783319,0.885403476414633 -bird,bird,south,,,AMRO,insample_prevalence,5,0.258598079444985,0.257039179794386,0.259660332963851,0.25655668358714 -bird,bird,south,,,AMRO,insample_n,5,23639,23636.8,23639.6,23640 -bird,bird,south,,,AMRO,oob_auc,5,0.689591934626615,0.688348632550972,0.689843166919568,0.689591934626615 -bird,bird,south,,,AMRO,oob_deviance_explained,5,0.0984328670162571,0.094117282107193,0.0994994384196623,0.0984328670162571 -bird,bird,south,,,AMRO,oob_rmse,5,0.735225643291462,0.734322072987703,0.736655125441161,0.734395013830007 -bird,bird,south,,,AMRO,oob_spearman,5,0.291547044066434,0.289653619948351,0.29213277997847,0.291376773818019 -bird,bird,south,,,AMRO,oob_calibration_slope,5,0.934404203818623,0.926891186190493,0.961180760134325,0.953623540744284 -bird,bird,south,,,AMRO,oob_prevalence,5,0.259989876131491,0.259616009340861,0.260538534890505,0.260708383581223 -bird,bird,south,,,AMRO,oob_n,5,67168,67167.4,67170.2,67167 -bird,bird,south,,,YEWA,insample_auc,5,0.719332020865892,0.7167959223474,0.722607418769604,0.721262730392428 -bird,bird,south,,,YEWA,insample_deviance_explained,5,0.231210217495144,0.222251823593889,0.235961745747393,0.229114411717017 -bird,bird,south,,,YEWA,insample_rmse,5,0.625043487437273,0.62080865697937,0.628590391800858,0.629305991109963 -bird,bird,south,,,YEWA,insample_spearman,5,0.295095530582618,0.291167713950288,0.299659209105424,0.297439751075024 -bird,bird,south,,,YEWA,insample_calibration_slope,5,0.866874540634912,0.862503477222317,0.872567336726769,0.860619291916303 -bird,bird,south,,,YEWA,insample_prevalence,5,0.171376597004823,0.170895553957443,0.17183640258529,0.171742808798646 -bird,bird,south,,,YEWA,insample_n,5,23639,23636.8,23639.6,23640 -bird,bird,south,,,YEWA,oob_auc,5,0.714680925082376,0.712798268254752,0.716148435308362,0.716561203894474 -bird,bird,south,,,YEWA,oob_deviance_explained,5,0.20248138732713,0.197183679478114,0.207430346720716,0.208119807948008 -bird,bird,south,,,YEWA,oob_rmse,5,0.638667289278492,0.636815197956095,0.639153235243619,0.636772974666958 -bird,bird,south,,,YEWA,oob_spearman,5,0.291734550104421,0.289334731699639,0.29340482100249,0.294073915420202 -bird,bird,south,,,YEWA,oob_calibration_slope,5,0.871741212363925,0.853830810138639,0.901368353942083,0.871741212363925 -bird,bird,south,,,YEWA,oob_prevalence,5,0.175869820899522,0.175707986864887,0.176039185326346,0.175741063319785 -bird,bird,south,,,YEWA,oob_n,5,67168,67167.4,67170.2,67167 -bryophyte,bryophyte,north,,,Bryum.All,insample_auc,5,0.638127846001886,0.629068513424739,0.639705775242135,0.638127846001886 -bryophyte,bryophyte,north,,,Bryum.All,insample_deviance_explained,5,-0.275950193493276,-0.30093504049497,-0.246978357823554,-0.24424818155784 -bryophyte,bryophyte,north,,,Bryum.All,insample_rmse,5,0.479527636307096,0.479331369604887,0.480302514101111,0.479248548520264 -bryophyte,bryophyte,north,,,Bryum.All,insample_spearman,5,0.234421074075063,0.218639785436767,0.237098983905807,0.234421074075063 -bryophyte,bryophyte,north,,,Bryum.All,insample_calibration_slope,5,0.76525545060837,0.744233658530692,0.8107675025251,0.800400269549026 -bryophyte,bryophyte,north,,,Bryum.All,insample_prevalence,5,0.398261429491307,0.395579807718977,0.401857219116663,0.400041220115416 -bryophyte,bryophyte,north,,,Bryum.All,insample_n,5,3097,3072.4,4153.6,4852 -bryophyte,bryophyte,north,,,Bryum.All,oob_auc,4,0.630809068622639,0.623078012227396,0.646295585466171, -bryophyte,bryophyte,north,,,Bryum.All,oob_deviance_explained,4,-0.19138651532205,-0.229639096179351,-0.14780622710667, -bryophyte,bryophyte,north,,,Bryum.All,oob_rmse,4,0.480264599990569,0.480001687050415,0.482221755757651, -bryophyte,bryophyte,north,,,Bryum.All,oob_spearman,4,0.222299987465914,0.20864983396156,0.249132606040734, -bryophyte,bryophyte,north,,,Bryum.All,oob_calibration_slope,4,0.767411113061744,0.685944635693733,0.863863918531363, -bryophyte,bryophyte,north,,,Bryum.All,oob_prevalence,4,0.403358051486104,0.397360409603543,0.408630979157295, -bryophyte,bryophyte,north,,,Bryum.All,oob_n,5,1755,698.4,1779.6,0 -bryophyte,bryophyte,north,,,Bryum.All,v2val_Climate,5,0.562296054365257,0.554173006352827,0.563975593348497,0.563268568361301 -bryophyte,bryophyte,north,,,Bryum.All,v2val_Climate_Truncated,5,0.562295197193571,0.554169893407269,0.56396889522421,0.563263005953167 -bryophyte,bryophyte,north,,,Bryum.All,v2val_Landcover,5,0.59031873097319,0.582725624858305,0.592734774936281,0.59031873097319 -bryophyte,bryophyte,north,,,Bryum.All,v2val_Full,5,0.638127846001886,0.629068513424739,0.639705775242135,0.638127846001886 -bryophyte,bryophyte,north,,,Bryum.All,v2val_Full_Truncated,5,0.639020549706553,0.629556667762114,0.64021053224959,0.639020549706553 -bryophyte,bryophyte,north,,,Bryum.All,v2val_Full_Joint,5,0.63656986211763,0.627565538171321,0.638033581053569,0.63656986211763 -bryophyte,bryophyte,north,,,Bryum.All,v2val_Full_Joint_Truncated,5,0.637367602039122,0.62809310218947,0.638655312558534,0.637500263262641 -bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Climate,4,0.557120566175802,0.540969693146743,0.575367468760527, -bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Climate_Truncated,4,0.557104758803387,0.540966602037286,0.575374474456983, -bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Landcover,4,0.586912742882926,0.576860469268986,0.598756809203001, -bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Full,4,0.630809068622639,0.623078012227396,0.646295585466171, -bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Full_Truncated,4,0.63137585065822,0.623530655084542,0.647529866197263, -bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Full_Joint,4,0.62971870560941,0.622041714357572,0.644532558641158, -bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Full_Joint_Truncated,4,0.630321350629701,0.622479940089637,0.645772715128109, -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_auc,5,0.698174658798715,0.69094551695802,0.709058701464829,0.694675016541229 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_deviance_explained,5,-0.114510476579041,-0.131813022554523,-0.0904615002285642,-0.127187969172517 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_rmse,5,0.466695436776973,0.462912051047972,0.467727184931025,0.467432435043113 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_spearman,5,0.341399187547095,0.328255177404971,0.359282419780438,0.334844748701068 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_calibration_slope,5,0.886684142091591,0.88294240979435,0.897629158250886,0.897907532572089 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_prevalence,5,0.441055234954658,0.434155026365629,0.445516968426104,0.441055234954658 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_n,5,3068,3031.6,4152,4852 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_auc,4,0.669185680513321,0.66194940480315,0.689277603994979, -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_deviance_explained,4,-0.185591758024389,-0.197381970216131,-0.141841988806489, -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_rmse,4,0.475105452566444,0.469359003725674,0.481375013261819, -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_spearman,4,0.29101450640103,0.278786640187495,0.325621827918843, -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_calibration_slope,4,0.772810531065414,0.725727448039512,0.851082802104523, -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_prevalence,4,0.443665764352131,0.432608384046217,0.454192825112108, -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_n,5,1784,700,1820.4,0 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Climate,5,0.656006784390431,0.650667856695395,0.664851582602822,0.652571065182321 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Climate_Truncated,5,0.656014130093929,0.650669976200325,0.664873979724118,0.652577122144193 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Landcover,5,0.626159436771152,0.623847896625279,0.63744965808967,0.626159436771152 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Full,5,0.698174658798715,0.69094551695802,0.709058701464829,0.694675016541229 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Full_Truncated,5,0.698175100984084,0.691211313926766,0.709267355194508,0.694914692057453 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Full_Joint,5,0.693839915631032,0.687220562229904,0.705393695319871,0.69133661745651 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Full_Joint_Truncated,5,0.693823112587028,0.687469531659753,0.705583368208495,0.69158473589171 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Climate,4,0.636250911438379,0.627380368267631,0.653685141830713, -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Climate_Truncated,4,0.636263529886685,0.627402598788168,0.653701328647776, -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Landcover,4,0.608585612621007,0.595998860291286,0.617214693566341, -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Full,4,0.669185680513321,0.66194940480315,0.689277603994979, -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Full_Truncated,4,0.669430040893281,0.6621007168852,0.689600433702903, -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Full_Joint,4,0.667551944528101,0.659697874596654,0.686791205149657, -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Full_Joint_Truncated,4,0.667760268462804,0.659841527855415,0.687057304097503, -bryophyte,bryophyte,south,,,Bryum.All,insample_auc,5,0.624781080501705,0.619098305791523,0.631250290557445,0.631477859980203 -bryophyte,bryophyte,south,,,Bryum.All,insample_deviance_explained,5,-0.0882074375042718,-0.116317967526412,-0.0745997780131311,-0.0659569204939741 -bryophyte,bryophyte,south,,,Bryum.All,insample_rmse,5,0.473712635656491,0.473250036655967,0.475178356015742,0.473182584522988 -bryophyte,bryophyte,south,,,Bryum.All,insample_spearman,5,0.208905797682641,0.198735688372861,0.219564280666345,0.21996433153061 -bryophyte,bryophyte,south,,,Bryum.All,insample_calibration_slope,5,0.874557636620987,0.806197667935386,0.910286420946533,0.929039182089329 -bryophyte,bryophyte,south,,,Bryum.All,insample_prevalence,5,0.370562770562771,0.365528360602252,0.371569237798783,0.370562770562771 -bryophyte,bryophyte,south,,,Bryum.All,insample_n,5,1444,1429.8,1968,2310 -bryophyte,bryophyte,south,,,Bryum.All,oob_auc,4,0.622587939645232,0.609906666129414,0.635174456157602, -bryophyte,bryophyte,south,,,Bryum.All,oob_deviance_explained,4,-0.0294046792827352,-0.0439442359246929,0.0123272085791315, -bryophyte,bryophyte,south,,,Bryum.All,oob_rmse,4,0.475290386543187,0.473040753420391,0.476838977026333, -bryophyte,bryophyte,south,,,Bryum.All,oob_spearman,4,0.204907419101645,0.18388423679321,0.22723046467613, -bryophyte,bryophyte,south,,,Bryum.All,oob_calibration_slope,4,0.862631630882613,0.796586982841539,0.926986747501851, -bryophyte,bryophyte,south,,,Bryum.All,oob_prevalence,4,0.3703593055487,0.368749240306309,0.380219211352906, -bryophyte,bryophyte,south,,,Bryum.All,oob_n,5,866,342,880.2,0 -bryophyte,bryophyte,south,,,Bryum.All,v2val_Climate,5,0.562296054365257,0.554173006352827,0.563975593348497,0.563268568361301 -bryophyte,bryophyte,south,,,Bryum.All,v2val_Climate_Truncated,5,0.562295197193571,0.554169893407269,0.56396889522421,0.563263005953167 -bryophyte,bryophyte,south,,,Bryum.All,v2val_Landcover,5,0.590977483143704,0.588222769171523,0.60141327621516,0.604777025029246 -bryophyte,bryophyte,south,,,Bryum.All,v2val_Full,5,0.624781080501705,0.619098305791523,0.631250290557445,0.631477859980203 -bryophyte,bryophyte,south,,,Bryum.All,v2val_Full_Truncated,5,0.624781080501705,0.619154420181747,0.631292646881434,0.631535708776305 -bryophyte,bryophyte,south,,,Bryum.All,v2val_Full_Joint,5,0.624358409137791,0.618605858115063,0.631039389378428,0.630846343956086 -bryophyte,bryophyte,south,,,Bryum.All,v2val_Full_Joint_Truncated,5,0.624356386786767,0.618642020722096,0.631057597953052,0.630860002699611 -bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Climate,4,0.557120566175802,0.540969693146743,0.575367468760527, -bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Climate_Truncated,4,0.557104758803387,0.540966602037286,0.575374474456983, -bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Landcover,4,0.597272483474034,0.596765466015466,0.601974542549405, -bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Full,4,0.622587939645232,0.609906666129414,0.635174456157602, -bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Full_Truncated,4,0.622567363513545,0.609906666129414,0.63516211047859, -bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Full_Joint,4,0.622331585916656,0.607992717674767,0.636786215054005, -bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Full_Joint_Truncated,4,0.622313949232352,0.607992717674767,0.636775633043423, -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_auc,5,0.717485896729522,0.71685899652647,0.72287874285206,0.717485896729522 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_deviance_explained,5,0.0555144394517471,0.0525022042487002,0.0659817133460382,0.0552076565672067 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_rmse,5,0.403372277591519,0.398339551678763,0.406855811762638,0.403372277591519 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_spearman,5,0.324238098784219,0.318040132102534,0.330331200221374,0.321683515420121 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_calibration_slope,5,0.900294144555213,0.878293846695361,0.929217371465325,0.926240194199798 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_prevalence,5,0.23982683982684,0.231460603487586,0.246697056850865,0.23982683982684 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_n,5,1462,1452.8,1977.6,2310 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_auc,4,0.715093054248096,0.709938966718536,0.716833687112666, -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_deviance_explained,4,0.0485196427393902,0.0213884985438529,0.0541796492701325, -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_rmse,4,0.406296961312814,0.398165216308586,0.415127438523745, -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_spearman,4,0.316460819822169,0.305912040269855,0.327620546786264, -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_calibration_slope,4,0.856225115735854,0.811357325680967,0.90322965680456, -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_prevalence,4,0.238999572635154,0.227667581639544,0.255610993801512, -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_n,5,848,332.4,857.2,0 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Climate,5,0.656006784390431,0.650667856695395,0.664851582602822,0.652571065182321 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Climate_Truncated,5,0.656014130093929,0.650669976200325,0.664873979724118,0.652577122144193 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Landcover,5,0.633036828963795,0.625748811394207,0.642238687874322,0.630393575816386 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Full,5,0.717485896729522,0.71685899652647,0.72287874285206,0.717485896729522 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Full_Truncated,5,0.717485896729522,0.71685899652647,0.72287874285206,0.717485896729522 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Full_Joint,5,0.718564200718732,0.717751679375772,0.723867311169212,0.718564200718732 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Full_Joint_Truncated,5,0.718564200718732,0.717751679375772,0.723867311169212,0.718564200718732 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Climate,4,0.636250911438379,0.627380368267631,0.653685141830713, -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Climate_Truncated,4,0.636263529886685,0.627402598788168,0.653701328647776, -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Landcover,4,0.621073947742974,0.605174465777582,0.638800057775284, -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Full,4,0.715093054248096,0.709938966718536,0.716833687112666, -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Full_Truncated,4,0.715093054248096,0.709938966718536,0.716833687112666, -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Full_Joint,4,0.716849054867145,0.711184101825957,0.718706027458805, -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Full_Joint_Truncated,4,0.716849054867145,0.711184101825957,0.718706027458805, -lichen,lichen,north,,,Cladonia.chlorophaea,insample_auc,5,0.778362159718991,0.777313519482956,0.781078019062442,0.776659932196605 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_deviance_explained,5,0.129922817133758,0.116058360191463,0.137037124714767,0.126180029301491 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_rmse,5,0.428984342825858,0.426484514201266,0.429776953204885,0.429796613403064 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_spearman,5,0.46931020347218,0.467301179157511,0.473793771369763,0.466302441462258 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_calibration_slope,5,1.02280943622485,1.00638380806286,1.02708521369247,1.02280943622485 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_prevalence,5,0.384787472035794,0.382719077877937,0.387875670039505,0.384787472035794 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_n,5,3685,3644,4976.6,5811 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_auc,4,0.766320433722221,0.757378470612268,0.770532908104046, -lichen,lichen,north,,,Cladonia.chlorophaea,oob_deviance_explained,4,0.113996779288933,0.0998702886563739,0.140537458619322, -lichen,lichen,north,,,Cladonia.chlorophaea,oob_rmse,4,0.434233197376139,0.431409497762948,0.437875343465515, -lichen,lichen,north,,,Cladonia.chlorophaea,oob_spearman,4,0.448965855284841,0.434402780928462,0.454722953452224, -lichen,lichen,north,,,Cladonia.chlorophaea,oob_calibration_slope,4,0.967661500539704,0.947481883037204,0.982662848959669, -lichen,lichen,north,,,Cladonia.chlorophaea,oob_prevalence,4,0.385212683681362,0.378550429000763,0.388624647224836, -lichen,lichen,north,,,Cladonia.chlorophaea,oob_n,5,2126,834.4,2167,0 -lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Climate,5,0.726648362079003,0.7237588448296,0.731162951758353,0.723004804073768 -lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Climate_Truncated,5,0.726660385143037,0.723768652905815,0.731181039693866,0.72301652132686 -lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Landcover,5,0.714897867010021,0.711070873547497,0.715616075360572,0.710689730662897 -lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Full,5,0.778362159718991,0.777313519482956,0.781078019062442,0.776659932196605 -lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Full_Truncated,5,0.778213392638019,0.777186308510683,0.780963739171022,0.77651231594881 -lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Full_Joint,5,0.777290152345703,0.776349528728965,0.780295682938712,0.77578324180292 -lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Full_Joint_Truncated,5,0.777190658438047,0.776223771512686,0.780168440645134,0.775630371417491 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Climate,4,0.714982827935826,0.71142147790233,0.716134560839275, -lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Climate_Truncated,4,0.714986555031238,0.711429083580888,0.716141935437511, -lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Landcover,4,0.6993486440522,0.695238223478961,0.703833711587922, -lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Full,4,0.766320433722221,0.757378470612268,0.770532908104046, -lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Full_Truncated,4,0.766446335783094,0.757266971247998,0.770241672495975, -lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Full_Joint,4,0.76558237025298,0.756446722492137,0.76890475840522, -lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Full_Joint_Truncated,4,0.765720545345162,0.756181429801128,0.768751167860589, -lichen,lichen,north,,,Physcia.adscendens,insample_auc,5,0.837335108574662,0.833892427673138,0.841684373333987,0.838268220834197 -lichen,lichen,north,,,Physcia.adscendens,insample_deviance_explained,5,0.153309875432323,0.124539848626552,0.181355576712871,0.153309875432323 -lichen,lichen,north,,,Physcia.adscendens,insample_rmse,5,0.394413849121186,0.390679733700768,0.396338542998067,0.393389135816662 -lichen,lichen,north,,,Physcia.adscendens,insample_spearman,5,0.569716833320736,0.562212442609498,0.574320845837935,0.569949863531718 -lichen,lichen,north,,,Physcia.adscendens,insample_calibration_slope,5,0.977543215514836,0.973882604264117,0.992189734009598,0.974581235728712 -lichen,lichen,north,,,Physcia.adscendens,insample_prevalence,5,0.382961350027218,0.378754207234193,0.387054085275807,0.384099122354156 -lichen,lichen,north,,,Physcia.adscendens,insample_n,5,3699,3673.4,4975,5811 -lichen,lichen,north,,,Physcia.adscendens,oob_auc,4,0.839292658298271,0.829533400959301,0.846965637654569, -lichen,lichen,north,,,Physcia.adscendens,oob_deviance_explained,4,0.143454749419506,0.0949908751245048,0.205499371215224, -lichen,lichen,north,,,Physcia.adscendens,oob_rmse,4,0.391817546344859,0.388424442525194,0.400850115043751, -lichen,lichen,north,,,Physcia.adscendens,oob_spearman,4,0.570820101540557,0.556966290991812,0.585222167374373, -lichen,lichen,north,,,Physcia.adscendens,oob_calibration_slope,4,0.993551581711484,0.96245857697318,1.01756614536709, -lichen,lichen,north,,,Physcia.adscendens,oob_prevalence,4,0.386432660247333,0.378648004672367,0.394703317951312, -lichen,lichen,north,,,Physcia.adscendens,oob_n,5,2112,836,2137.6,0 -lichen,lichen,north,,,Physcia.adscendens,v2val_Climate,5,0.693422907498,0.690915989050979,0.694883881152127,0.693422907498 -lichen,lichen,north,,,Physcia.adscendens,v2val_Climate_Truncated,5,0.693419511127206,0.690911780963104,0.694883929491704,0.693419511127206 -lichen,lichen,north,,,Physcia.adscendens,v2val_Landcover,5,0.801861109542011,0.782213209132931,0.812598365772438,0.812994033294577 -lichen,lichen,north,,,Physcia.adscendens,v2val_Full,5,0.837335108574662,0.833892427673138,0.841684373333987,0.838268220834197 -lichen,lichen,north,,,Physcia.adscendens,v2val_Full_Truncated,5,0.837482703696643,0.83402227575171,0.841815848139725,0.838439032548488 -lichen,lichen,north,,,Physcia.adscendens,v2val_Full_Joint,5,0.836047248740013,0.832067905608026,0.840315800616736,0.836357683360022 -lichen,lichen,north,,,Physcia.adscendens,v2val_Full_Joint_Truncated,5,0.836286222674123,0.832185134167773,0.840452132671447,0.836525866238843 -lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Climate,4,0.690146520368093,0.687623451889863,0.696399093335788, -lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Climate_Truncated,4,0.690133662354544,0.687619313393814,0.696403232441228, -lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Landcover,4,0.80689396202876,0.792826777899119,0.818710192371022, -lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Full,4,0.839292658298271,0.829533400959301,0.846965637654569, -lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Full_Truncated,4,0.839479011781648,0.829796481228334,0.8470008753914, -lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Full_Joint,4,0.835740019351969,0.826152734502598,0.845016117951229, -lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Full_Joint_Truncated,4,0.835910659316576,0.826439317818255,0.845028920277397, -lichen,lichen,south,,,Cladonia.chlorophaea,insample_auc,5,0.782940004828585,0.771430317517624,0.78704102003786,0.782940004828585 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_deviance_explained,5,0.101560194956707,0.0833055588905147,0.10855690687591,0.0760150539678254 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_rmse,5,0.273630488580498,0.266940670870867,0.27923536011912,0.27615265636656 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_spearman,5,0.278345072756788,0.271410866729923,0.283855802016148,0.284558850730728 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_calibration_slope,5,1.00445803190767,0.923032164793458,1.06063235332037,1.00400781901235 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_prevalence,5,0.0907849829351536,0.0854880550520455,0.0942546707117982,0.092924126172208 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_n,5,1482,1471.8,2004.4,2346 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_auc,4,0.767777065619901,0.759098616020395,0.777508870753697, -lichen,lichen,south,,,Cladonia.chlorophaea,oob_deviance_explained,4,0.00020738830490835,-0.0197727594970929,0.0186135944535137, -lichen,lichen,south,,,Cladonia.chlorophaea,oob_rmse,4,0.285215861553978,0.278859149933553,0.293735548818788, -lichen,lichen,south,,,Cladonia.chlorophaea,oob_spearman,4,0.280771471067578,0.258586974156161,0.293911115946987, -lichen,lichen,south,,,Cladonia.chlorophaea,oob_calibration_slope,4,1.11452074384603,0.83884295294175,1.23312243580024, -lichen,lichen,south,,,Cladonia.chlorophaea,oob_prevalence,4,0.0997452652709462,0.0913286406440493,0.106312613843352, -lichen,lichen,south,,,Cladonia.chlorophaea,oob_n,5,864,341.6,874.2,0 -lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Climate,5,0.726648362079003,0.7237588448296,0.731162951758353,0.723004804073768 -lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Climate_Truncated,5,0.726660385143037,0.723768652905815,0.731181039693866,0.72301652132686 -lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Landcover,5,0.746232134390029,0.738477213352093,0.757183243479499,0.74708991515486 -lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Full,5,0.782940004828585,0.771430317517624,0.787041020037861,0.782940004828585 -lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Full_Truncated,5,0.782940004828585,0.771430317517624,0.787041020037861,0.782940004828585 -lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Full_Joint,5,0.783724649927571,0.773780455672375,0.788033764122229,0.783724649927571 -lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Full_Joint_Truncated,5,0.783724649927571,0.773780455672375,0.788033764122229,0.783724649927571 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Climate,4,0.714982827935826,0.71142147790233,0.716134560839275, -lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Climate_Truncated,4,0.714986555031238,0.711429083580888,0.716141935437511, -lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Landcover,4,0.75082184394749,0.74168570185442,0.752461597648907, -lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Full,4,0.767777065619901,0.759098616020395,0.777508870753697, -lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Full_Truncated,4,0.767777065619901,0.759098616020395,0.777508870753697, -lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Full_Joint,4,0.76868800182822,0.762466250385714,0.777619034446911, -lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Full_Joint_Truncated,4,0.76868800182822,0.762466250385714,0.777619034446911, -lichen,lichen,south,,,Physcia.adscendens,insample_auc,5,0.821353781719635,0.817185593102722,0.825672849056938,0.821573724007562 -lichen,lichen,south,,,Physcia.adscendens,insample_deviance_explained,5,0.239704709286469,0.231908892003898,0.24739316046634,0.239704709286469 -lichen,lichen,south,,,Physcia.adscendens,insample_rmse,5,0.356794925429378,0.352929674110169,0.358725757363671,0.356794925429378 -lichen,lichen,south,,,Physcia.adscendens,insample_spearman,5,0.458171869563314,0.449023619570466,0.466231041170605,0.458171869563314 -lichen,lichen,south,,,Physcia.adscendens,insample_calibration_slope,5,0.881651302841094,0.877029058458768,0.905002744726106,0.895884570463108 -lichen,lichen,south,,,Physcia.adscendens,insample_prevalence,5,0.215686274509804,0.210370852380551,0.218705697782215,0.215686274509804 -lichen,lichen,south,,,Physcia.adscendens,insample_n,5,1487,1480.8,2014,2346 -lichen,lichen,south,,,Physcia.adscendens,oob_auc,4,0.816688066173278,0.814577556447952,0.819582119521717, -lichen,lichen,south,,,Physcia.adscendens,oob_deviance_explained,4,0.229581557918766,0.221042427704859,0.242028578202743, -lichen,lichen,south,,,Physcia.adscendens,oob_rmse,4,0.361221111344793,0.357219734510275,0.363119037857434, -lichen,lichen,south,,,Physcia.adscendens,oob_spearman,4,0.454435749483605,0.444604153459308,0.459399541619317, -lichen,lichen,south,,,Physcia.adscendens,oob_calibration_slope,4,0.869323881706107,0.820424126275093,0.95799881977588, -lichen,lichen,south,,,Physcia.adscendens,oob_prevalence,4,0.21549434057534,0.209833885194357,0.226186106799465, -lichen,lichen,south,,,Physcia.adscendens,oob_n,5,859,332,865.2,0 -lichen,lichen,south,,,Physcia.adscendens,v2val_Climate,5,0.693422907498,0.690915989050979,0.694883881152127,0.693422907498 -lichen,lichen,south,,,Physcia.adscendens,v2val_Climate_Truncated,5,0.693419511127206,0.690911780963104,0.694883929491704,0.693419511127206 -lichen,lichen,south,,,Physcia.adscendens,v2val_Landcover,5,0.755367662346663,0.753354388319629,0.769154488554709,0.755514263619179 -lichen,lichen,south,,,Physcia.adscendens,v2val_Full,5,0.821353781719635,0.817185593102722,0.825672849056938,0.821573724007562 -lichen,lichen,south,,,Physcia.adscendens,v2val_Full_Truncated,5,0.821369179600887,0.817185593102722,0.825672849056938,0.821573724007562 -lichen,lichen,south,,,Physcia.adscendens,v2val_Full_Joint,5,0.818351194875585,0.815473629919288,0.821595518961059,0.818413816807012 -lichen,lichen,south,,,Physcia.adscendens,v2val_Full_Joint_Truncated,5,0.818366592756837,0.815473629919288,0.821595518961059,0.818413816807012 -lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Climate,4,0.690146520368093,0.687623451889863,0.696399093335788, -lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Climate_Truncated,4,0.690133662354544,0.687619313393814,0.696403232441228, -lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Landcover,4,0.757543713583416,0.754237750244239,0.765899299116814, -lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Full,4,0.816688066173278,0.814577556447952,0.819582119521717, -lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Full_Truncated,4,0.816692374438254,0.814577556447952,0.819584704480702, -lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Full_Joint,4,0.812861687935889,0.810647101871693,0.815758867203804, -lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Full_Joint_Truncated,4,0.81287030446584,0.810647101871693,0.815764037121775, -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_auc,5,0.820367038624296,0.819088803830954,0.825096132690793,0.820911148938545 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_deviance_explained,5,0.274643755760762,0.273047064346357,0.2795535093301,0.272167552780268 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_rmse,5,0.325649814939506,0.323044576138151,0.32774821127909,0.327783381237672 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_spearman,5,0.457622037926128,0.455146980332479,0.464800704476141,0.457622037926128 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_calibration_slope,5,0.987210797047211,0.964756720342875,1.04226829149403,0.987210797047211 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_prevalence,5,0.22526523562793,0.222685585610422,0.228865718677616,0.22526523562793 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_n,5,2588,2554.4,3469,4053 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_auc,4,0.807437018082126,0.795187683185118,0.814600712078279, -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_deviance_explained,4,0.234952851608951,0.215144910318834,0.252509532861174, -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_rmse,4,0.33540874228767,0.32943601838744,0.340042074806677, -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_spearman,4,0.436123893428745,0.419582521233002,0.446016838076314, -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_calibration_slope,4,0.947080559125973,0.940176391586403,0.972191240627968, -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_prevalence,4,0.224511499051979,0.218291264544164,0.230417458254175, -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_n,5,1465,584,1498.6,0 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_auc,5,0.61119205862304,0.608247846213005,0.619766590249117,0.614800455189874 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_deviance_explained,5,0.0293312456190202,0.0254868824061227,0.034855941334284,0.0327130199155846 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_rmse,5,0.440494520447441,0.439655702708701,0.441992443932362,0.440494520447441 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_spearman,5,0.166867112583273,0.161253581705846,0.173443277843013,0.166867112583273 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_calibration_slope,5,0.871613828265815,0.807561232834562,0.918699876937025,0.901041907949805 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_prevalence,5,0.320047355958958,0.317847829087179,0.320941159211816,0.321243523316062 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_n,5,2587,2537.6,3467,4053 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_auc,4,0.599789507623449,0.585096398809124,0.610287133771428, -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_deviance_explained,4,0.0222358139724005,0.0154302383695453,0.0289963709245666, -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_rmse,4,0.444244510956,0.443337295940116,0.444727707984992, -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_spearman,4,0.1428985967646,0.125110680243685,0.165466638254086, -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_calibration_slope,4,0.750011624893702,0.699600524966396,0.836834785057386, -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_prevalence,4,0.324076824388238,0.322733281306541,0.3276244709432, -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_n,5,1466,586,1515.4,0 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_auc,5,0.634240369366988,0.632910641847936,0.642195650517714,0.634240369366988 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_deviance_explained,5,0.0264112493368064,0.0244020509882967,0.0303865560800429,0.0264112493368064 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_rmse,5,0.418769573067301,0.41254704078318,0.420323940326511,0.421286846656193 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_spearman,5,0.175369074792115,0.169472066216479,0.19311238624043,0.175369074792115 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_calibration_slope,5,0.975536082659011,0.869669271029773,0.999133512851468,1.00531761653027 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_prevalence,5,0.691079812206573,0.689952548788955,0.71053806886065,0.691079812206573 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_n,5,675,672.2,911.8,1065 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_auc,4,0.590185162579443,0.588561095758765,0.594993617451278, -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_deviance_explained,4,-0.00660912212895907,-0.0246222554112858,0.00596211189481146, -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_rmse,4,0.438945021715404,0.435169754735052,0.442994297582763, -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_spearman,4,0.119269331592725,0.112670153678564,0.141855035472014, -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_calibration_slope,4,0.529521999315492,0.405879483641657,0.748020467389396, -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_prevalence,4,0.675933879994794,0.656439043984736,0.693034260713775, -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_n,5,390,153.2,392.8,0 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_auc,5,0.800563803516706,0.774332077165384,0.807116397983381,0.786049924840508 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_deviance_explained,5,0.235315369629889,0.184794016646685,0.243734500249067,0.205216892616348 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_rmse,5,0.345153854253612,0.340273324511787,0.350387335024819,0.345153854253612 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_spearman,5,0.399822439479778,0.365817333025682,0.416474286805188,0.381089371361329 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_calibration_slope,5,0.983951125311349,0.934535204259224,1.0182141754068,0.986324497785332 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_prevalence,5,0.182159624413146,0.181333087877553,0.193172072927236,0.182159624413146 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_n,5,678,670.6,913,1065 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_auc,4,0.729574202549047,0.71815250764054,0.778542353806383, -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_deviance_explained,4,0.0957319747373082,-0.112729476086203,0.182551981226243, -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_rmse,4,0.349900330806755,0.341019339169151,0.360550613582775, -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_spearman,4,0.291859756320935,0.287348724179463,0.363426726063271, -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_calibration_slope,4,0.774041963702232,0.646822148840561,1.18815164727979, -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_prevalence,4,0.182520739834082,0.160534290271133,0.183610188261351, -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_n,5,387,152,394.4,0 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_auc,5,0.843771320712376,0.837298705573725,0.845386776229526,0.839440907842931 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_deviance_explained,5,0.296908480586636,0.290887810793796,0.302200604755114,0.294409607036222 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_rmse,5,0.300280860452662,0.299352741208206,0.302368697081708,0.30069616131153 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_spearman,5,0.466818565812599,0.461436555661139,0.473138781426199,0.463240577826878 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_calibration_slope,5,0.972690836668142,0.921935358308296,0.979611212169833,0.982050704865843 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_prevalence,5,0.201509433962264,0.199761756423448,0.205640478898507,0.201356917858008 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_n,5,2612,2595.8,3536.2,4127 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_auc,4,0.827458353428436,0.817805717079038,0.840574988117616, -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_deviance_explained,4,0.276689902789578,0.265842733106712,0.294949072324388, -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_rmse,4,0.303789329751735,0.298771516378234,0.304833455528629, -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_spearman,4,0.444765026946551,0.435147313816253,0.460529325956992, -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_calibration_slope,4,0.912370954577014,0.861212539179959,0.954228059409819, -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_prevalence,4,0.199234448913847,0.193549889929862,0.204483398915383, -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_n,5,1515,590.8,1531.2,0 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_auc,5,0.672085273881372,0.668633720672182,0.680693747031501,0.668767750495832 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_deviance_explained,5,0.0758678220182751,0.0704991263862156,0.0841775407251298,0.0713753243188524 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_rmse,5,0.332910274284271,0.327210641524145,0.335100999244875,0.332910274284271 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_spearman,5,0.215829774013176,0.212589282113879,0.226422981371282,0.211955551417089 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_calibration_slope,5,0.94812085347111,0.856889525073144,1.03389671800408,0.94812085347111 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_prevalence,5,0.148776350860189,0.144579171619019,0.151265484707482,0.148776350860189 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_n,5,2637,2606,3537,4127 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_auc,4,0.654372882277188,0.640403021566792,0.6605591763494, -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_deviance_explained,4,0.0514858356828411,0.0379579660013158,0.0604573235872615, -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_rmse,4,0.337444976131703,0.331449906564068,0.342571110976009, -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_spearman,4,0.19099043338874,0.174162150130626,0.204597549588522, -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_calibration_slope,4,0.732075381978751,0.657958194547818,0.836247242841193, -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_prevalence,4,0.148630312373211,0.144212802079742,0.157027721824677, -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_n,5,1490,590,1521,0 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_auc,5,0.706112866420923,0.689756836780519,0.712422673247893,0.689082366331686 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_deviance_explained,5,0.077948761211899,0.0672394512735814,0.0862779229583741,0.0670547674954939 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_rmse,5,0.401891914348534,0.400056693343447,0.408313222434912,0.406888363248781 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_spearman,5,0.328404695790939,0.293718951070702,0.340256897739946,0.296933239332004 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_calibration_slope,5,1.02265042079081,0.949079646474498,1.06820491938664,1.03306130883064 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_prevalence,5,0.602816901408451,0.593809006916747,0.607790307126989,0.604735883424408 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_n,5,696,686.6,942.8,1098 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_auc,4,0.642530046696975,0.604052771943084,0.646988682070108, -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_deviance_explained,4,0.0177640077575169,-0.00914291472953676,0.0380006855045052, -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_rmse,4,0.423675312133193,0.412365569779127,0.4289659133495, -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_spearman,4,0.215041364313525,0.166273559830134,0.234657571247567, -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_calibration_slope,4,0.666986903656138,0.480343171377765,0.83150584600084, -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_prevalence,4,0.614967084834182,0.599715606114469,0.623570700713301, -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_n,5,402,155.2,411.4,0 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_auc,5,0.823493333333333,0.815129597967925,0.847125543751909,0.819927852628077 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_deviance_explained,5,0.240858392609539,0.229287932861753,0.282840102014879,0.234870911391229 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_rmse,5,0.223331046901821,0.21469247206876,0.227275887816135,0.223331046901821 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_spearman,5,0.319693927847967,0.314626273281237,0.331123877059782,0.313170610278462 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_calibration_slope,5,0.926166715024209,0.8521293240645,0.969181499315011,0.926166715024209 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_prevalence,5,0.0875912408759124,0.0815913826315997,0.0946898807160816,0.0874316939890711 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_n,5,693,685.8,936.8,1098 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_auc,4,0.77744050520223,0.771065167348639,0.803486958443855, -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_deviance_explained,4,0.17108179189974,0.0694866534919466,0.192858665045726, -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_rmse,4,0.226318832277226,0.216290927259541,0.250116289221731, -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_spearman,4,0.278455188286047,0.262015370235656,0.285433310292326, -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_calibration_slope,4,0.751176575138291,0.529405518004174,0.815471311990914, -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_prevalence,4,0.0837295205104187,0.0742110480309994,0.0991029746633899, -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_n,5,405,161.2,412.2,0 -mite,mite,north,,,Ceratozetes.gracilis,insample_auc,5,0.793023395932593,0.785116760768433,0.797585561245424,0.791183069113511 -mite,mite,north,,,Ceratozetes.gracilis,insample_deviance_explained,5,0.134692532005047,0.108608328871156,0.141811919550427,0.125527507164404 -mite,mite,north,,,Ceratozetes.gracilis,insample_rmse,5,0.364641744759417,0.36299256091057,0.368618183340602,0.364308079016483 -mite,mite,north,,,Ceratozetes.gracilis,insample_spearman,5,0.41429348998048,0.402422002613553,0.419681351800533,0.409677886636093 -mite,mite,north,,,Ceratozetes.gracilis,insample_calibration_slope,5,1.0224894029886,1.00755092646514,1.03915812721702,1.0224894029886 -mite,mite,north,,,Ceratozetes.gracilis,insample_prevalence,5,0.211169769380383,0.208505864577966,0.211369634473166,0.208369812642269 -mite,mite,north,,,Ceratozetes.gracilis,insample_n,5,3651,3606.6,4890.2,5711 -mite,mite,north,,,Ceratozetes.gracilis,oob_auc,4,0.779665972511523,0.773198985489411,0.798395168992114, -mite,mite,north,,,Ceratozetes.gracilis,oob_deviance_explained,4,0.0923986988857812,0.0862667569754759,0.144304465844404, -mite,mite,north,,,Ceratozetes.gracilis,oob_rmse,4,0.36680003014665,0.360411853868392,0.368997514633471, -mite,mite,north,,,Ceratozetes.gracilis,oob_spearman,4,0.389977816116695,0.383012434237582,0.415943717902066, -mite,mite,north,,,Ceratozetes.gracilis,oob_calibration_slope,4,0.956222238793897,0.921365026616042,1.05973298874715, -mite,mite,north,,,Ceratozetes.gracilis,oob_prevalence,4,0.203407429558746,0.203105380508127,0.206516438658429, -mite,mite,north,,,Ceratozetes.gracilis,oob_n,5,2060,820.8,2104.4,0 -mite,mite,north,,,Ceratozetes.gracilis,v2val_Climate,5,0.738382414749567,0.734358129806975,0.742005285315151,0.738382414749567 -mite,mite,north,,,Ceratozetes.gracilis,v2val_Climate_Truncated,5,0.738392463572007,0.734342356311168,0.742026178178654,0.738392463572007 -mite,mite,north,,,Ceratozetes.gracilis,v2val_Landcover,5,0.766722893536977,0.759062628411847,0.772422596192916,0.766722893536977 -mite,mite,north,,,Ceratozetes.gracilis,v2val_Full,5,0.793023395932593,0.785116760768433,0.797585561245424,0.791183069113511 -mite,mite,north,,,Ceratozetes.gracilis,v2val_Full_Truncated,5,0.793016443892401,0.785027851595894,0.797500866905145,0.791105466738786 -mite,mite,north,,,Ceratozetes.gracilis,v2val_Full_Joint,5,0.793386060695946,0.785055839040043,0.797509252679056,0.791225262500488 -mite,mite,north,,,Ceratozetes.gracilis,v2val_Full_Joint_Truncated,5,0.793386524165292,0.784963217939285,0.797444970586129,0.7911589984368 -mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Climate,4,0.731027419469463,0.725410991997312,0.741834431700471, -mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Climate_Truncated,4,0.731045119285728,0.72540173801145,0.741842884282973, -mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Landcover,4,0.752661723212296,0.748458309671417,0.773156655512682, -mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Full,4,0.779665972511523,0.773198985489411,0.798395168992114, -mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Full_Truncated,4,0.77962848748914,0.773216243029163,0.798382692848602, -mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Full_Joint,4,0.779066438961531,0.77354347637541,0.798343558984922, -mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Full_Joint_Truncated,4,0.779044896212606,0.773564180389716,0.798356007315929, -mite,mite,north,,,Trhypochthonius.tectorum,insample_auc,5,0.672907942808574,0.669208813819547,0.682343647003947,0.669778092188547 -mite,mite,north,,,Trhypochthonius.tectorum,insample_deviance_explained,5,-0.0324180258517079,-0.0527646417815135,-0.0101623689114898,-0.0407269697080057 -mite,mite,north,,,Trhypochthonius.tectorum,insample_rmse,5,0.288562681524747,0.286522184662904,0.291945228269945,0.288562681524747 -mite,mite,north,,,Trhypochthonius.tectorum,insample_spearman,5,0.174619892294846,0.172564649955749,0.187939106716607,0.1729413278484 -mite,mite,north,,,Trhypochthonius.tectorum,insample_calibration_slope,5,0.938290627841302,0.909627160028179,0.994839719200875,0.931192865479756 -mite,mite,north,,,Trhypochthonius.tectorum,insample_prevalence,5,0.0956049728593941,0.0940001763114542,0.0987931854359719,0.0956049728593941 -mite,mite,north,,,Trhypochthonius.tectorum,insample_n,5,3624,3599.2,4881,5711 -mite,mite,north,,,Trhypochthonius.tectorum,oob_auc,4,0.651421835190664,0.64513479278205,0.663121005511504, -mite,mite,north,,,Trhypochthonius.tectorum,oob_deviance_explained,4,-0.0625612551961812,-0.104386756333539,-0.0317884651562399, -mite,mite,north,,,Trhypochthonius.tectorum,oob_rmse,4,0.289482213990474,0.281791769789717,0.293681830417276, -mite,mite,north,,,Trhypochthonius.tectorum,oob_spearman,4,0.153802350804888,0.145130738202924,0.167192976536939, -mite,mite,north,,,Trhypochthonius.tectorum,oob_calibration_slope,4,0.866440051991562,0.715195080326882,0.99057532202289, -mite,mite,north,,,Trhypochthonius.tectorum,oob_prevalence,4,0.0963264503316864,0.0893459374618542,0.0984905896614327, -mite,mite,north,,,Trhypochthonius.tectorum,oob_n,5,2087,830,2111.8,0 -mite,mite,north,,,Trhypochthonius.tectorum,v2val_Climate,5,0.646091585413555,0.643946189711462,0.652343816700896,0.646091585413555 -mite,mite,north,,,Trhypochthonius.tectorum,v2val_Climate_Truncated,5,0.646095557008706,0.643948358640746,0.65233771826661,0.646095557008706 -mite,mite,north,,,Trhypochthonius.tectorum,v2val_Landcover,5,0.637987440117159,0.627044747234771,0.648796943002273,0.637987440117159 -mite,mite,north,,,Trhypochthonius.tectorum,v2val_Full,5,0.672907942808574,0.669208813819547,0.682343647003947,0.669778092188547 -mite,mite,north,,,Trhypochthonius.tectorum,v2val_Full_Truncated,5,0.672968462835808,0.669234243838635,0.682370652186889,0.669767986128102 -mite,mite,north,,,Trhypochthonius.tectorum,v2val_Full_Joint,5,0.673039662867848,0.668775078579256,0.682456515305188,0.66926215120794 -mite,mite,north,,,Trhypochthonius.tectorum,v2val_Full_Joint_Truncated,5,0.673102852896284,0.66877285388055,0.682481051437855,0.669242116386356 -mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Climate,4,0.637448091750764,0.62319195321542,0.64083947116042, -mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Climate_Truncated,4,0.637447116712891,0.623191511787853,0.640852747518307, -mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Landcover,4,0.619482659509824,0.616517647587969,0.622452812919573, -mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Full,4,0.651421835190664,0.64513479278205,0.663121005511504, -mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Full_Truncated,4,0.651598760851872,0.645145346470754,0.66328863933151, -mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Full_Joint,4,0.650909465977038,0.643507260329979,0.663048883832917, -mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Full_Joint_Truncated,4,0.65107837071969,0.643490423905209,0.66321170510179, -mite,mite,south,,,Ceratozetes.gracilis,insample_auc,5,0.883740175681923,0.875951595662976,0.884218489485534,0.880842240129472 -mite,mite,south,,,Ceratozetes.gracilis,insample_deviance_explained,5,0.169227984866749,0.102917912757133,0.174897444771582,0.169227984866749 -mite,mite,south,,,Ceratozetes.gracilis,insample_rmse,5,0.223410917578014,0.207894263041054,0.228617168412238,0.215105469199925 -mite,mite,south,,,Ceratozetes.gracilis,insample_spearman,5,0.304054710362117,0.292604158893579,0.321411532274628,0.304054710362117 -mite,mite,south,,,Ceratozetes.gracilis,insample_calibration_slope,5,0.646501812554423,0.571714943118018,0.663896293625869,0.652084939529121 -mite,mite,south,,,Ceratozetes.gracilis,insample_prevalence,5,0.056970509383378,0.0521775638545351,0.0622115928022082,0.0562843842573 -mite,mite,south,,,Ceratozetes.gracilis,insample_n,5,1494,1479.4,2024.6,2363 -mite,mite,south,,,Ceratozetes.gracilis,oob_auc,4,0.877556363090999,0.870858501486971,0.891246533596325, -mite,mite,south,,,Ceratozetes.gracilis,oob_deviance_explained,4,0.149139947228324,0.081863654137057,0.211545016984438, -mite,mite,south,,,Ceratozetes.gracilis,oob_rmse,4,0.217549055983636,0.21158190570823,0.223701160718158, -mite,mite,south,,,Ceratozetes.gracilis,oob_spearman,4,0.297912570168464,0.269110530526911,0.325939210959734, -mite,mite,south,,,Ceratozetes.gracilis,oob_calibration_slope,4,0.588033894967732,0.50519914194533,0.720419749435623, -mite,mite,south,,,Ceratozetes.gracilis,oob_prevalence,4,0.0533392883804503,0.0452752248602848,0.0645232647455575, -mite,mite,south,,,Ceratozetes.gracilis,oob_n,5,869,338.4,883.6,0 -mite,mite,south,,,Ceratozetes.gracilis,v2val_Climate,5,0.738382414749567,0.734358129806975,0.742005285315151,0.738382414749567 -mite,mite,south,,,Ceratozetes.gracilis,v2val_Climate_Truncated,5,0.738392463572007,0.734342356311168,0.742026178178654,0.738392463572007 -mite,mite,south,,,Ceratozetes.gracilis,v2val_Landcover,5,0.722020131552721,0.71607655717679,0.728899344516339,0.719697225125594 -mite,mite,south,,,Ceratozetes.gracilis,v2val_Full,5,0.883740175681923,0.875951595662976,0.884218489485534,0.880842240129472 -mite,mite,south,,,Ceratozetes.gracilis,v2val_Full_Truncated,5,0.883740175681923,0.875951595662976,0.884218489485534,0.880842240129472 -mite,mite,south,,,Ceratozetes.gracilis,v2val_Full_Joint,5,0.883869625520111,0.877386169471364,0.884867266298163,0.880966991469706 -mite,mite,south,,,Ceratozetes.gracilis,v2val_Full_Joint_Truncated,5,0.883869625520111,0.877386169471364,0.884867266298163,0.880966991469706 -mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Climate,4,0.731027419469463,0.725410991997312,0.741834431700471, -mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Climate_Truncated,4,0.731045119285728,0.72540173801145,0.741842884282973, -mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Landcover,4,0.704830138651714,0.697578522816295,0.713165675388293, -mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Full,4,0.877556363090999,0.870858501486971,0.891246533596325, -mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Full_Truncated,4,0.877556363090999,0.870858501486971,0.891281973045494, -mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Full_Joint,4,0.87838605738981,0.870791888918913,0.892459363692493, -mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Full_Joint_Truncated,4,0.87838605738981,0.870791888918913,0.892494803141663, -mite,mite,south,,,Trhypochthonius.tectorum,insample_auc,5,0.714545787058589,0.69969622945697,0.724109648011322,0.705313075635924 -mite,mite,south,,,Trhypochthonius.tectorum,insample_deviance_explained,5,-2.20551740843788e-05,-0.00644243886806564,0.0163984110082346,0.01492775208855 -mite,mite,south,,,Trhypochthonius.tectorum,insample_rmse,5,0.269858367078513,0.266406986696229,0.272808873150662,0.270464873051431 -mite,mite,south,,,Trhypochthonius.tectorum,insample_spearman,5,0.210611679646456,0.189085620295154,0.213764285932634,0.196610759018781 -mite,mite,south,,,Trhypochthonius.tectorum,insample_calibration_slope,5,0.964366086336983,0.916309849664698,0.989356334697425,0.964366086336983 -mite,mite,south,,,Trhypochthonius.tectorum,insample_prevalence,5,0.0833685992382565,0.0807473443243282,0.0863035095821866,0.0833685992382565 -mite,mite,south,,,Trhypochthonius.tectorum,insample_n,5,1489,1484.4,2017.4,2363 -mite,mite,south,,,Trhypochthonius.tectorum,oob_auc,4,0.669707753515078,0.654014549095664,0.683226886999099, -mite,mite,south,,,Trhypochthonius.tectorum,oob_deviance_explained,4,0.0238861350837344,-0.00501344344448882,0.0319775842734965, -mite,mite,south,,,Trhypochthonius.tectorum,oob_rmse,4,0.275344693909917,0.2660800590245,0.279902566485838, -mite,mite,south,,,Trhypochthonius.tectorum,oob_spearman,4,0.16338068295489,0.142721241028181,0.180002438567577, -mite,mite,south,,,Trhypochthonius.tectorum,oob_calibration_slope,4,0.640530845430618,0.577798461860074,0.822553046730012, -mite,mite,south,,,Trhypochthonius.tectorum,oob_prevalence,4,0.0842873358196854,0.0775201528145626,0.0881856815952926, -mite,mite,south,,,Trhypochthonius.tectorum,oob_n,5,874,345.6,878.6,0 -mite,mite,south,,,Trhypochthonius.tectorum,v2val_Climate,5,0.646091585413555,0.643946189711462,0.652343816700896,0.646091585413555 -mite,mite,south,,,Trhypochthonius.tectorum,v2val_Climate_Truncated,5,0.646095557008706,0.643948358640746,0.65233771826661,0.646095557008706 -mite,mite,south,,,Trhypochthonius.tectorum,v2val_Landcover,5,0.671864124042916,0.659898184775652,0.684374697179488,0.660231262098608 -mite,mite,south,,,Trhypochthonius.tectorum,v2val_Full,5,0.714545787058589,0.69969622945697,0.724109648011322,0.705313075635924 -mite,mite,south,,,Trhypochthonius.tectorum,v2val_Full_Truncated,5,0.714545787058589,0.69969622945697,0.724109648011322,0.705313075635924 -mite,mite,south,,,Trhypochthonius.tectorum,v2val_Full_Joint,5,0.714906009620713,0.700143210072346,0.72490193539616,0.705786473932628 -mite,mite,south,,,Trhypochthonius.tectorum,v2val_Full_Joint_Truncated,5,0.714906009620713,0.700143210072346,0.72490193539616,0.705786473932628 -mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Climate,4,0.637448091750764,0.62319195321542,0.64083947116042, -mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Climate_Truncated,4,0.637447116712891,0.623191511787853,0.640852747518307, -mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Landcover,4,0.613895073569526,0.611766319340838,0.647057552774624, -mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Full,4,0.669707753515078,0.654014549095664,0.683226886999099, -mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Full_Truncated,4,0.669707753515078,0.654014549095664,0.683226886999099, -mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Full_Joint,4,0.670252865183779,0.654581402849557,0.683544630202293, -mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Full_Joint_Truncated,4,0.670252865183779,0.654581402849557,0.683544630202293, -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_auc,5,0.830322798090827,0.829752014715758,0.833521610487142,0.830322798090827 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_deviance_explained,5,0.169049735433044,0.156535489819263,0.180380243811949,0.172184312829234 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_rmse,5,0.406331801158912,0.404646760463192,0.406711203597052,0.406706951792596 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_spearman,5,0.564448272444098,0.564022722895439,0.568538539772008,0.564448272444098 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_calibration_slope,5,0.979847210350883,0.969126982244339,0.991954887525608,0.979847210350883 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_prevalence,5,0.418242653476869,0.411391418988775,0.421189975169674,0.418242653476869 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_n,5,4366,4320.2,5874.4,6874 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_auc,4,0.825970385744679,0.820899166013025,0.829858683383589, -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_deviance_explained,4,0.180338934815369,0.153363367618616,0.193673751289778, -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_rmse,4,0.409024585589369,0.407545829323972,0.412796643199926, -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_spearman,4,0.556036446141893,0.549781718602555,0.564239538039467, -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_calibration_slope,4,0.961989811631539,0.953282864779601,0.97698898933143, -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_prevalence,4,0.419241311741466,0.413108455574493,0.430771977433407, -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_n,5,2508,999.6,2553.8,0 -vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Climate,5,0.688882537608652,0.686220497467121,0.693315342224415,0.691923775211569 -vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Climate_Truncated,5,0.688853782361867,0.686211230349888,0.693311107621612,0.691928871889894 -vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Landcover,5,0.806658535413912,0.804749026795703,0.81034804923884,0.804887352272851 -vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Full,5,0.830322798090827,0.829752014715758,0.833521610487142,0.830322798090827 -vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Full_Truncated,5,0.830433260489035,0.829860825639713,0.833584571804586,0.830433260489035 -vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Full_Joint,5,0.82780564706394,0.827522559630011,0.831849313017971,0.82780564706394 -vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Full_Joint_Truncated,5,0.827924459375713,0.827636541171172,0.831943133083281,0.827924459375713 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Climate,4,0.69847723797285,0.691752649872066,0.699715919161363, -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Climate_Truncated,4,0.698467309951771,0.691745994349179,0.699715497383917, -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Landcover,4,0.798538423391199,0.793813753185317,0.801044488836154, -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Full,4,0.825970385744679,0.820899166013025,0.829858683383589, -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Full_Truncated,4,0.826084368160094,0.821025133464921,0.829955751376353, -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Full_Joint,4,0.822407455245542,0.816503165651276,0.825556259025818, -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Full_Joint_Truncated,4,0.822548387109745,0.816621603632805,0.825661726608092, -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_auc,5,0.836315133959189,0.831991084674704,0.837528607951877,0.834425701496386 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_deviance_explained,5,0.154953219466334,0.129409063699085,0.172774430677382,0.160280734393984 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_rmse,5,0.397835953480652,0.39520050591856,0.39953977885822,0.397892542228527 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_spearman,5,0.565718307196976,0.558075214292711,0.566158340164243,0.561646901356684 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_calibration_slope,5,1.00378490707536,0.996670213069317,1.00931321625889,1.00546871573532 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_prevalence,5,0.377654931626418,0.37492184315556,0.38072781584232,0.377654931626418 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_n,5,4329,4315.8,5874,6874 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_auc,4,0.829938952959948,0.828125419425383,0.835304874971869, -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_deviance_explained,4,0.177626825486026,0.135153586377154,0.21154877519812, -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_rmse,4,0.400006137187779,0.39713029702198,0.40231573999719, -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_spearman,4,0.554463344935879,0.551184680243305,0.562068414950895, -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_calibration_slope,4,0.988524116774644,0.97389136931948,1.00993315311349, -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_prevalence,4,0.375247544204322,0.372430611979277,0.382966913772923, -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_n,5,2545,1000,2558.2,0 -vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Climate,5,0.688388374288585,0.686629323150551,0.697141250977293,0.688388374288585 -vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Climate_Truncated,5,0.688377053340582,0.686621028690138,0.697132635984666,0.688377053340582 -vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Landcover,5,0.812599770966484,0.806923106797722,0.814411627611935,0.809938249660894 -vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Full,5,0.836315133959189,0.831991084674704,0.837528607951877,0.834425701496386 -vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Full_Truncated,5,0.836225603913632,0.831944005617998,0.837453646171789,0.834353666337466 -vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Full_Joint,5,0.836242738307649,0.831840647476923,0.837075962254889,0.833795663987679 -vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Full_Joint_Truncated,5,0.836167732781523,0.831822036390158,0.836995692851111,0.833746590035665 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Climate,4,0.687058088763642,0.673058403439112,0.691946304395709, -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Climate_Truncated,4,0.687038471404578,0.673051662415016,0.691940326726772, -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Landcover,4,0.807847376592108,0.801759141298583,0.811699920923116, -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Full,4,0.829938952959948,0.828125419425383,0.835304874971869, -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Full_Truncated,4,0.829888329553378,0.828175765215782,0.835181080251946, -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Full_Joint,4,0.828971535109331,0.826291764196716,0.83479597749998, -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Full_Joint_Truncated,4,0.828915617285276,0.826336395712055,0.834689140179746, -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_auc,5,0.890081979393699,0.886120541286867,0.900531693288428,0.890081979393699 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_deviance_explained,5,0.376511843709018,0.359648245967408,0.39273006526476,0.36183949121173 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_rmse,5,0.308360864442848,0.306833389069796,0.315704381717812,0.312233283277407 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_spearman,5,0.561632279820523,0.56034731464871,0.575734647134824,0.561632279820523 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_calibration_slope,5,0.980281716931255,0.970651842047086,0.998280590750127,0.982887664309838 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_prevalence,5,0.222088835534214,0.217190546592102,0.228625506806496,0.222054380664653 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_n,5,1692,1666,2267.2,2648 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_auc,4,0.884065848019888,0.870449780280702,0.894068384737495, -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_deviance_explained,4,0.334099694985671,0.299899048318077,0.344909076796622, -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_rmse,4,0.322280229393816,0.311448708149722,0.324570568538386, -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_spearman,4,0.558011118128369,0.532461517776284,0.559103143514103, -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_calibration_slope,4,0.947730194323529,0.912734464703454,0.971381900858514, -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_prevalence,4,0.218666030567013,0.210018355611084,0.23207994955219, -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_n,5,956,380.8,982,0 -vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Climate,5,0.688882537608652,0.686220497467121,0.693315342224415,0.691923775211569 -vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Climate_Truncated,5,0.688853782361867,0.686211230349888,0.693311107621612,0.691928871889894 -vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Landcover,5,0.795978634172116,0.790420342908561,0.808241109353126,0.795978634172116 -vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Full,5,0.890081979393699,0.886120541286867,0.900531693288428,0.890081979393699 -vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Full_Truncated,5,0.890081979393699,0.886107519131847,0.900531693288428,0.890081979393699 -vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Full_Joint,5,0.885428136469803,0.879749497228007,0.894203850953663,0.88338493164256 -vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Full_Joint_Truncated,5,0.885423965632299,0.87972024605796,0.894203850953663,0.88338493164256 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Climate,4,0.69847723797285,0.691752649872066,0.699715919161363, -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Climate_Truncated,4,0.698467309951771,0.691745994349179,0.699715497383917, -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Landcover,4,0.785174421252252,0.769559195023864,0.799812878397794, -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Full,4,0.884065848019888,0.870449780280702,0.894068384737495, -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Full_Truncated,4,0.884061344921756,0.870449780280702,0.894063477626334, -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Full_Joint,4,0.873729773605152,0.862934967954651,0.88650495339372, -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Full_Joint_Truncated,4,0.873725270507021,0.862934967954651,0.886486814768876, -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_auc,5,0.805930865573238,0.802524114144756,0.807930971919586,0.808012980346143 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_deviance_explained,5,0.166618669672263,0.15835736048416,0.197983766968233,0.179903957587885 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_rmse,5,0.381878187765555,0.378497935845721,0.383275373980955,0.380313032587985 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_spearman,5,0.465238638302507,0.460583361067045,0.473614426763325,0.470529100145484 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_calibration_slope,5,0.933688472158773,0.920475046205582,0.947214542702693,0.933688472158773 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_prevalence,5,0.264350453172205,0.25911663216011,0.270295509723619,0.264350453172205 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_n,5,1685,1649.4,2266.4,2648 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_auc,4,0.807298000134658,0.803023991535991,0.814183808910683, -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_deviance_explained,4,0.201855986026952,0.138430007183509,0.206184030963771, -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_rmse,4,0.37987633843542,0.378039277925496,0.38526074563498, -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_spearman,4,0.471049244528984,0.458945127185501,0.481459447588745, -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_calibration_slope,4,0.934673431866213,0.911850976434992,0.962640657947191, -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_prevalence,4,0.266148052343275,0.252246321440467,0.273763588267456, -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_n,5,963,381.6,998.6,0 -vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Climate,5,0.688388374288585,0.686629323150551,0.697141250977293,0.688388374288585 -vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Climate_Truncated,5,0.688377053340582,0.686621028690138,0.697132635984666,0.688377053340582 -vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Landcover,5,0.761379244969105,0.759537679717784,0.765001614229777,0.76658587562335 -vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Full,5,0.805930865573238,0.802524114144756,0.807930971919586,0.808012980346143 -vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Full_Truncated,5,0.805930865573238,0.802524057680271,0.807932999886811,0.808015180404811 -vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Full_Joint,5,0.802576290466739,0.799474271873651,0.804841725613092,0.804804561454972 -vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Full_Joint_Truncated,5,0.802576290466739,0.799476478074435,0.804843080852285,0.804805294807862 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Climate,4,0.687058088763642,0.673058403439112,0.691946304395709, -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Climate_Truncated,4,0.687038471404578,0.673051662415016,0.691940326726772, -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Landcover,4,0.774223898160634,0.769748999911181,0.777668369854279, -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Full,4,0.807298000134658,0.803023991535991,0.814183808910683, -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Full_Truncated,4,0.807292347351227,0.803023991535991,0.814176792476235, -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Full_Joint,4,0.805961431482898,0.801581678357063,0.812743710082227, -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Full_Joint_Truncated,4,0.805961431482898,0.801581678357063,0.812736460553446, +taxon,run,region,season,part,species,metric,n,median,p10,p90,boot1,mean,sd +bird,bird,north,,,AMRO,insample_auc,5,0.72487649207557,0.722489112963132,0.72576145123834,0.721701661835893,0.724313916200942,0.00170956352292163 +bird,bird,north,,,AMRO,insample_deviance_explained,5,0.142215080261758,0.140707166105981,0.144363142127984,0.140587647159979,0.142358220452553,0.00199530922315655 +bird,bird,north,,,AMRO,insample_rmse,5,0.663619993960517,0.661624845419777,0.664719637388853,0.664239276180889,0.663325410909454,0.00165768430943888 +bird,bird,north,,,AMRO,insample_spearman,5,0.344389309730045,0.340479678130316,0.345510088540595,0.339249301212572,0.343324801699925,0.00266479191004938 +bird,bird,north,,,AMRO,insample_calibration_slope,5,0.80440117768677,0.799100431621395,0.810804150827482,0.80440117768677,0.805142929671317,0.00621763816210709 +bird,bird,north,,,AMRO,insample_prevalence,5,0.251486631016043,0.251004373826971,0.252433263182893,0.250861017819325,0.251649276245993,0.000745639638422784 +bird,bird,north,,,AMRO,insample_n,5,46747,46745.2,46750,46747,46747.6,2.50998007960223 +bird,bird,north,,,AMRO,oob_auc,5,0.730373137296335,0.729897207197475,0.730684827423547,0.730766733254682,0.730315896538717,0.000399387356506946 +bird,bird,north,,,AMRO,oob_deviance_explained,5,0.151664799728976,0.150795650809459,0.152520757577584,0.152754178062373,0.151645303910227,0.000851367053496551 +bird,bird,north,,,AMRO,oob_rmse,5,0.658090400254619,0.657748490410106,0.658646272283023,0.657851304309638,0.658152604633444,0.000488187377741323 +bird,bird,north,,,AMRO,oob_spearman,5,0.348000943732488,0.347176086570868,0.348405542162744,0.348509330988823,0.34783832412029,0.000612352651071532 +bird,bird,north,,,AMRO,oob_calibration_slope,5,0.878884682385081,0.857978242744613,0.881378788597934,0.881696624797909,0.871660692760926,0.0122350948521806 +bird,bird,north,,,AMRO,oob_prevalence,5,0.241010939026539,0.240656718532255,0.241191818078906,0.241245385459292,0.240950250724789,0.000279167052473422 +bird,bird,north,,,AMRO,oob_n,5,124877,124874,124878.8,124877,124876.4,2.50998007960223 +bird,bird,north,,,YEWA,insample_auc,5,0.778635633427003,0.778333348933502,0.779726988023268,0.779841092447633,0.778948847840918,0.000705556804087617 +bird,bird,north,,,YEWA,insample_deviance_explained,5,0.259141214360432,0.25548753680516,0.260976441286628,0.259141214360432,0.258564177416315,0.00302380870747948 +bird,bird,north,,,YEWA,insample_rmse,5,0.547361440801496,0.544308917361954,0.551849139043791,0.547158394049375,0.547972539003203,0.00399109094044317 +bird,bird,north,,,YEWA,insample_spearman,5,0.315565876581618,0.314186701701599,0.31608982965666,0.316093683296469,0.315273234600625,0.00100534988197753 +bird,bird,north,,,YEWA,insample_calibration_slope,5,0.705708332778131,0.69321277112837,0.712055437422832,0.716264166431109,0.703225661526711,0.009932019727973 +bird,bird,north,,,YEWA,insample_prevalence,5,0.118296361263824,0.117706951871658,0.119214980837802,0.118296361263824,0.118418937588893,0.00074585019883292 +bird,bird,north,,,YEWA,insample_n,5,46747,46745.2,46750,46747,46747.6,2.50998007960223 +bird,bird,north,,,YEWA,oob_auc,5,0.728595786591222,0.728230136724689,0.73005150345856,0.730809600284142,0.728967653050156,0.00107004022194788 +bird,bird,north,,,YEWA,oob_deviance_explained,5,0.179475572495229,0.177360125449593,0.182723444677448,0.183210182399369,0.179952283630345,0.00265860832017606 +bird,bird,north,,,YEWA,oob_rmse,5,0.591197627682823,0.582204245542092,0.591914132572009,0.581496589737255,0.587923953982158,0.00511357694956418 +bird,bird,north,,,YEWA,oob_spearman,5,0.273873998143111,0.273042129222169,0.27544277961002,0.276382265893519,0.274116908523614,0.00138126305304161 +bird,bird,north,,,YEWA,oob_calibration_slope,5,0.66953950556298,0.63693641889123,0.713887951481982,0.718728425403305,0.674429581507813,0.0378468170998992 +bird,bird,north,,,YEWA,oob_prevalence,5,0.13458843502006,0.134244406707603,0.134809487963868,0.13458843502006,0.134542639141448,0.000279456693593184 +bird,bird,north,,,YEWA,oob_n,5,124877,124874,124878.8,124877,124876.4,2.50998007960223 +bird,bird,south,,,AMRO,insample_auc,5,0.689537506786954,0.689085767534014,0.694179854134546,0.689537506786954,0.69116429025569,0.00267686382030874 +bird,bird,south,,,AMRO,insample_deviance_explained,5,0.0914919911243302,0.0907862366206112,0.0936622473347538,0.0905093060629211,0.0920142540132908,0.0015677422769352 +bird,bird,south,,,AMRO,insample_rmse,5,0.742475038662062,0.740051841768597,0.745694348908307,0.746104469516561,0.742888160715582,0.00289570319718642 +bird,bird,south,,,AMRO,insample_spearman,5,0.289206389172517,0.287837179517966,0.295789973779885,0.287696121760142,0.291229007576228,0.00408372016605238 +bird,bird,south,,,AMRO,insample_calibration_slope,5,0.885482053955006,0.883345065042026,0.893982715783319,0.885403476414633,0.887857917212169,0.00576920241512031 +bird,bird,south,,,AMRO,insample_prevalence,5,0.258598079444985,0.257039179794386,0.259660332963851,0.25655668358714,0.258393144664086,0.00135079625989253 +bird,bird,south,,,AMRO,insample_n,5,23639,23636.8,23639.6,23640,23638.4,1.51657508881031 +bird,bird,south,,,AMRO,oob_auc,5,0.689591934626615,0.688348632550972,0.689843166919568,0.689591934626615,0.68924802394965,0.000920081348058652 +bird,bird,south,,,AMRO,oob_deviance_explained,5,0.0984328670162571,0.094117282107193,0.0994994384196623,0.0984328670162571,0.0973395768527953,0.00316116064937106 +bird,bird,south,,,AMRO,oob_rmse,5,0.735225643291462,0.734322072987703,0.736655125441161,0.734395013830007,0.735378999246935,0.00121712350913242 +bird,bird,south,,,AMRO,oob_spearman,5,0.291547044066434,0.289653619948351,0.29213277997847,0.291376773818019,0.291100972713629,0.00151818475240607 +bird,bird,south,,,AMRO,oob_calibration_slope,5,0.934404203818623,0.926891186190493,0.961180760134325,0.953623540744284,0.941985087798582,0.0175025538271432 +bird,bird,south,,,AMRO,oob_prevalence,5,0.259989876131491,0.259616009340861,0.260538534890505,0.260708383581223,0.260061995930024,0.000475417680104008 +bird,bird,south,,,AMRO,oob_n,5,67168,67167.4,67170.2,67167,67168.6,1.51657508881031 +bird,bird,south,,,YEWA,insample_auc,5,0.719332020865892,0.7167959223474,0.722607418769604,0.721262730392428,0.719662412560823,0.00297152545331512 +bird,bird,south,,,YEWA,insample_deviance_explained,5,0.231210217495144,0.222251823593889,0.235961745747393,0.229114411717017,0.229807382164686,0.00749454908006547 +bird,bird,south,,,YEWA,insample_rmse,5,0.625043487437273,0.62080865697937,0.628590391800858,0.629305991109963,0.624889605300925,0.00399863862852713 +bird,bird,south,,,YEWA,insample_spearman,5,0.295095530582618,0.291167713950288,0.299659209105424,0.297439751075024,0.295393951865559,0.00438378006368663 +bird,bird,south,,,YEWA,insample_calibration_slope,5,0.866874540634912,0.862503477222317,0.872567336726769,0.860619291916303,0.867538534232098,0.00505022303747937 +bird,bird,south,,,YEWA,insample_prevalence,5,0.171376597004823,0.170895553957443,0.17183640258529,0.171742808798646,0.171382167859753,0.000475861876686407 +bird,bird,south,,,YEWA,insample_n,5,23639,23636.8,23639.6,23640,23638.4,1.51657508881031 +bird,bird,south,,,YEWA,oob_auc,5,0.714680925082376,0.712798268254752,0.716148435308362,0.716561203894474,0.714502329965285,0.00165165381687826 +bird,bird,south,,,YEWA,oob_deviance_explained,5,0.20248138732713,0.197183679478114,0.207430346720716,0.208119807948008,0.202298579885998,0.00504819057507152 +bird,bird,south,,,YEWA,oob_rmse,5,0.638667289278492,0.636815197956095,0.639153235243619,0.636772974666958,0.63809587657418,0.00120027991161497 +bird,bird,south,,,YEWA,oob_spearman,5,0.291734550104421,0.289334731699639,0.29340482100249,0.294073915420202,0.291424590009334,0.00203454648872441 +bird,bird,south,,,YEWA,oob_calibration_slope,5,0.871741212363925,0.853830810138639,0.901368353942083,0.871741212363925,0.875139424030135,0.0275139438874958 +bird,bird,south,,,YEWA,oob_prevalence,5,0.175869820899522,0.175707986864887,0.176039185326346,0.175741063319785,0.175867891893267,0.000167508533766851 +bird,bird,south,,,YEWA,oob_n,5,67168,67167.4,67170.2,67167,67168.6,1.51657508881031 +bryophyte,bryophyte,north,,,Bryum.All,insample_auc,5,0.638127846001886,0.629068513424739,0.639705775242135,0.638127846001886,0.635308902250384,0.00556090012471537 +bryophyte,bryophyte,north,,,Bryum.All,insample_deviance_explained,5,-0.275950193493276,-0.30093504049497,-0.246978357823554,-0.24424818155784,-0.273766521408161,0.0268076084815421 +bryophyte,bryophyte,north,,,Bryum.All,insample_rmse,5,0.479527636307096,0.479331369604887,0.480302514101111,0.479248548520264,0.479762898472393,0.000494745588454859 +bryophyte,bryophyte,north,,,Bryum.All,insample_spearman,5,0.234421074075063,0.218639785436767,0.237098983905807,0.234421074075063,0.229509973229964,0.00968700796838076 +bryophyte,bryophyte,north,,,Bryum.All,insample_calibration_slope,5,0.76525545060837,0.744233658530692,0.8107675025251,0.800400269549026,0.775500149433843,0.0336341853608396 +bryophyte,bryophyte,north,,,Bryum.All,insample_prevalence,5,0.398261429491307,0.395579807718977,0.401857219116663,0.400041220115416,0.3986710498744,0.00332558122320578 +bryophyte,bryophyte,north,,,Bryum.All,insample_n,5,3097,3072.4,4153.6,4852,3440.8,789.041633882522 +bryophyte,bryophyte,north,,,Bryum.All,oob_auc,4,0.630809068622639,0.623078012227396,0.646295585466171,,0.6335788759256,0.0130102647026339 +bryophyte,bryophyte,north,,,Bryum.All,oob_deviance_explained,4,-0.19138651532205,-0.229639096179351,-0.14780622710667,,-0.189483762694165,0.0443897167597502 +bryophyte,bryophyte,north,,,Bryum.All,oob_rmse,4,0.480264599990569,0.480001687050415,0.482221755757651,,0.480869686714472,0.00145214204934777 +bryophyte,bryophyte,north,,,Bryum.All,oob_spearman,4,0.222299987465914,0.20864983396156,0.249132606040734,,0.227008010705366,0.022676062398745 +bryophyte,bryophyte,north,,,Bryum.All,oob_calibration_slope,4,0.767411113061744,0.685944635693733,0.863863918531363,,0.772763373098032,0.0990836541433614 +bryophyte,bryophyte,north,,,Bryum.All,oob_prevalence,4,0.403358051486104,0.397360409603543,0.408630979157295,,0.403099224982043,0.006528394280969 +bryophyte,bryophyte,north,,,Bryum.All,oob_n,5,1755,698.4,1779.6,0,1411.2,789.041633882522 +bryophyte,bryophyte,north,,,Bryum.All,v2val_Climate,5,0.562296054365257,0.554173006352827,0.563975593348497,0.563268568361301,0.559777731714894,0.00502167306258926 +bryophyte,bryophyte,north,,,Bryum.All,v2val_Climate_Truncated,5,0.562295197193571,0.554169893407269,0.56396889522421,0.563263005953167,0.559774417476873,0.00502075379775713 +bryophyte,bryophyte,north,,,Bryum.All,v2val_Landcover,5,0.59031873097319,0.582725624858305,0.592734774936281,0.59031873097319,0.58822375369532,0.00508433205604652 +bryophyte,bryophyte,north,,,Bryum.All,v2val_Full,5,0.638127846001886,0.629068513424739,0.639705775242135,0.638127846001886,0.635308902250384,0.00556090012471537 +bryophyte,bryophyte,north,,,Bryum.All,v2val_Full_Truncated,5,0.639020549706553,0.629556667762114,0.64021053224959,0.639020549706553,0.635852413234428,0.00561081241692955 +bryophyte,bryophyte,north,,,Bryum.All,v2val_Full_Joint,5,0.63656986211763,0.627565538171321,0.638033581053569,0.63656986211763,0.633648909724541,0.00542015487462954 +bryophyte,bryophyte,north,,,Bryum.All,v2val_Full_Joint_Truncated,5,0.637367602039122,0.62809310218947,0.638655312558534,0.637500263262641,0.634239708554392,0.00549431056719841 +bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Climate,4,0.557120566175802,0.540969693146743,0.575367468760527,,0.557869148159969,0.0192626917262308 +bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Climate_Truncated,4,0.557104758803387,0.540966602037286,0.575374474456983,,0.557866029834635,0.0192692966023613 +bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Landcover,4,0.586912742882926,0.576860469268986,0.598756809203001,,0.587552668849403,0.0117834395761671 +bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Full,4,0.630809068622639,0.623078012227396,0.646295585466171,,0.6335788759256,0.0130102647026339 +bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Full_Truncated,4,0.63137585065822,0.623530655084542,0.647529866197263,,0.634343286360136,0.0135026415297771 +bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Full_Joint,4,0.62971870560941,0.622041714357572,0.644532558641158,,0.63226758481652,0.012530612942673 +bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Full_Joint_Truncated,4,0.630321350629701,0.622479940089637,0.645772715128109,,0.63303919132911,0.0130277082370542 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_auc,5,0.698174658798715,0.69094551695802,0.709058701464829,0.694675016541229,0.699837511037708,0.00901778644380229 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_deviance_explained,5,-0.114510476579041,-0.131813022554523,-0.0904615002285642,-0.127187969172517,-0.111764640500469,0.0203388736323564 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_rmse,5,0.466695436776973,0.462912051047972,0.467727184931025,0.467432435043113,0.465613065181239,0.00244205972530663 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_spearman,5,0.341399187547095,0.328255177404971,0.359282419780438,0.334844748701068,0.343616320027039,0.0154028239772293 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_calibration_slope,5,0.886684142091591,0.88294240979435,0.897629158250886,0.897907532572089,0.889629148428203,0.00742841787636394 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_prevalence,5,0.441055234954658,0.434155026365629,0.445516968426104,0.441055234954658,0.440040906513639,0.00592042164227121 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_n,5,3068,3031.6,4152,4852,3417.8,802.273768734838 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_auc,4,0.669185680513321,0.66194940480315,0.689277603994979,,0.673776983288852,0.0156568896063866 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_deviance_explained,4,-0.185591758024389,-0.197381970216131,-0.141841988806489,,-0.174177630515047,0.0329785238818983 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_rmse,4,0.475105452566444,0.469359003725674,0.481375013261819,,0.475292278228802,0.00645345889371808 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_spearman,4,0.29101450640103,0.278786640187495,0.325621827918843,,0.299007169009701,0.0269716818569824 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_calibration_slope,4,0.772810531065414,0.725727448039512,0.851082802104523,,0.783949526784417,0.0700828360330596 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_prevalence,4,0.443665764352131,0.432608384046217,0.454192825112108,,0.443476364514296,0.0116999631210214 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_n,5,1784,700,1820.4,0,1434.2,802.273768734838 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Climate,5,0.656006784390431,0.650667856695395,0.664851582602822,0.652571065182321,0.657491388780721,0.00702864165145057 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Climate_Truncated,5,0.656014130093929,0.650669976200325,0.664873979724118,0.652577122144193,0.657501706850359,0.00703792811898215 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Landcover,5,0.626159436771152,0.623847896625279,0.63744965808967,0.626159436771152,0.629605667370405,0.00700538360157201 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Full,5,0.698174658798715,0.69094551695802,0.709058701464829,0.694675016541229,0.699837511037708,0.00901778644380229 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Full_Truncated,5,0.698175100984084,0.691211313926766,0.709267355194508,0.694914692057453,0.700043394374941,0.00901659546042277 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Full_Joint,5,0.693839915631032,0.687220562229904,0.705393695319871,0.69133661745651,0.696035361241937,0.00910536620980844 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Full_Joint_Truncated,5,0.693823112587028,0.687469531659753,0.705583368208495,0.69158473589171,0.69622715639523,0.00910978022700139 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Climate,4,0.636250911438379,0.627380368267631,0.653685141830713,,0.639309371160374,0.0145611916830304 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Climate_Truncated,4,0.636263529886685,0.627402598788168,0.653701328647776,,0.639326696909033,0.0145585625333492 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Landcover,4,0.608585612621007,0.595998860291286,0.617214693566341,,0.607172158555155,0.0115275207748297 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Full,4,0.669185680513321,0.66194940480315,0.689277603994979,,0.673776983288852,0.0156568896063866 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Full_Truncated,4,0.669430040893281,0.6621007168852,0.689600433702903,,0.674016136893831,0.0157430215314559 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Full_Joint,4,0.667551944528101,0.659697874596654,0.686791205149657,,0.671618084060283,0.0153861204532186 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Full_Joint_Truncated,4,0.667760268462804,0.659841527855415,0.687057304097503,,0.671823945258272,0.015448661895241 +bryophyte,bryophyte,south,,,Bryum.All,insample_auc,5,0.624781080501705,0.619098305791523,0.631250290557445,0.631477859980203,0.62531135077244,0.00613408721709493 +bryophyte,bryophyte,south,,,Bryum.All,insample_deviance_explained,5,-0.0882074375042718,-0.116317967526412,-0.0745997780131311,-0.0659569204939741,-0.0940636853986955,0.0217357006072699 +bryophyte,bryophyte,south,,,Bryum.All,insample_rmse,5,0.473712635656491,0.473250036655967,0.475178356015742,0.473182584522988,0.474116438717835,0.000979445089225269 +bryophyte,bryophyte,south,,,Bryum.All,insample_spearman,5,0.208905797682641,0.198735688372861,0.219564280666345,0.21996433153061,0.209499332030303,0.0105641202170489 +bryophyte,bryophyte,south,,,Bryum.All,insample_calibration_slope,5,0.874557636620987,0.806197667935386,0.910286420946533,0.929039182089329,0.863965312292241,0.0611476778254253 +bryophyte,bryophyte,south,,,Bryum.All,insample_prevalence,5,0.370562770562771,0.365528360602252,0.371569237798783,0.370562770562771,0.369235286484943,0.00385091464779508 +bryophyte,bryophyte,south,,,Bryum.All,insample_n,5,1444,1429.8,1968,2310,1614.6,388.936113005722 +bryophyte,bryophyte,south,,,Bryum.All,oob_auc,4,0.622587939645232,0.609906666129414,0.635174456157602,,0.622554097858286,0.0139528811025767 +bryophyte,bryophyte,south,,,Bryum.All,oob_deviance_explained,4,-0.0294046792827352,-0.0439442359246929,0.0123272085791315,,-0.019693132418482,0.0322171478788032 +bryophyte,bryophyte,south,,,Bryum.All,oob_rmse,4,0.475290386543187,0.473040753420391,0.476838977026333,,0.475040014171884,0.00206603954639396 +bryophyte,bryophyte,south,,,Bryum.All,oob_spearman,4,0.204907419101645,0.18388423679321,0.22723046467613,,0.205371655982377,0.0239816446700714 +bryophyte,bryophyte,south,,,Bryum.All,oob_calibration_slope,4,0.862631630882613,0.796586982841539,0.926986747501851,,0.862028226803386,0.0714420365714851 +bryophyte,bryophyte,south,,,Bryum.All,oob_prevalence,4,0.3703593055487,0.368749240306309,0.380219211352906,,0.37330567717792,0.0072755089177001 +bryophyte,bryophyte,south,,,Bryum.All,oob_n,5,866,342,880.2,0,695.4,388.936113005722 +bryophyte,bryophyte,south,,,Bryum.All,v2val_Climate,5,0.562296054365257,0.554173006352827,0.563975593348497,0.563268568361301,0.559777731714894,0.00502167306258926 +bryophyte,bryophyte,south,,,Bryum.All,v2val_Climate_Truncated,5,0.562295197193571,0.554169893407269,0.56396889522421,0.563263005953167,0.559774417476873,0.00502075379775713 +bryophyte,bryophyte,south,,,Bryum.All,v2val_Landcover,5,0.590977483143704,0.588222769171523,0.60141327621516,0.604777025029246,0.593896071204394,0.0070332679741888 +bryophyte,bryophyte,south,,,Bryum.All,v2val_Full,5,0.624781080501705,0.619098305791523,0.631250290557445,0.631477859980203,0.62531135077244,0.00613408721709493 +bryophyte,bryophyte,south,,,Bryum.All,v2val_Full_Truncated,5,0.624781080501705,0.619154420181747,0.631292646881434,0.631535708776305,0.625345448851566,0.00612033629471389 +bryophyte,bryophyte,south,,,Bryum.All,v2val_Full_Joint,5,0.624358409137791,0.618605858115063,0.631039389378428,0.630846343956086,0.624944360355056,0.00625821729858158 +bryophyte,bryophyte,south,,,Bryum.All,v2val_Full_Joint_Truncated,5,0.624356386786767,0.618642020722096,0.631057597953052,0.630860002699611,0.624962990194972,0.0062460677616445 +bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Climate,4,0.557120566175802,0.540969693146743,0.575367468760527,,0.557869148159969,0.0192626917262308 +bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Climate_Truncated,4,0.557104758803387,0.540966602037286,0.575374474456983,,0.557866029834635,0.0192692966023613 +bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Landcover,4,0.597272483474034,0.596765466015466,0.601974542549405,,0.598770712622892,0.00348361543505928 +bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Full,4,0.622587939645232,0.609906666129414,0.635174456157602,,0.622554097858286,0.0139528811025767 +bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Full_Truncated,4,0.622567363513545,0.609906666129414,0.63516211047859,,0.622543809792443,0.0139501445980818 +bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Full_Joint,4,0.622331585916656,0.607992717674767,0.636786215054005,,0.622372929093606,0.0160574239141607 +bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Full_Joint_Truncated,4,0.622313949232352,0.607992717674767,0.636775633043423,,0.622364110751454,0.0160556605380964 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_auc,5,0.717485896729522,0.71685899652647,0.72287874285206,0.717485896729522,0.719337658395294,0.00314832137641283 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_deviance_explained,5,0.0555144394517471,0.0525022042487002,0.0659817133460382,0.0552076565672067,0.0580917971366114,0.00804978167070715 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_rmse,5,0.403372277591519,0.398339551678763,0.406855811762638,0.403372277591519,0.402708178674735,0.00422999542451598 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_spearman,5,0.324238098784219,0.318040132102534,0.330331200221374,0.321683515420121,0.324176941097839,0.00635489788234709 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_calibration_slope,5,0.900294144555213,0.878293846695361,0.929217371465325,0.926240194199798,0.903277573722839,0.025082790791702 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_prevalence,5,0.23982683982684,0.231460603487586,0.246697056850865,0.23982683982684,0.239405392468179,0.00765174673579537 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_n,5,1462,1452.8,1977.6,2310,1631.4,379.498089586759 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_auc,4,0.715093054248096,0.709938966718536,0.716833687112666,,0.713873963296314,0.00407985613655125 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_deviance_explained,4,0.0485196427393902,0.0213884985438529,0.0541796492701325,,0.0408513792876777,0.0205022125506785 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_rmse,4,0.406296961312814,0.398165216308586,0.415127438523745,,0.406546508529494,0.00911762395306138 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_spearman,4,0.316460819822169,0.305912040269855,0.327620546786264,,0.316679015326377,0.0116401179241884 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_calibration_slope,4,0.856225115735854,0.811357325680967,0.90322965680456,,0.856988241097932,0.0492572682113721 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_prevalence,4,0.238999572635154,0.227667581639544,0.255610993801512,,0.240885083410421,0.0151422609821477 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_n,5,848,332.4,857.2,0,678.6,379.498089586759 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Climate,5,0.656006784390431,0.650667856695395,0.664851582602822,0.652571065182321,0.657491388780721,0.00702864165145057 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Climate_Truncated,5,0.656014130093929,0.650669976200325,0.664873979724118,0.652577122144193,0.657501706850359,0.00703792811898215 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Landcover,5,0.633036828963795,0.625748811394207,0.642238687874322,0.630393575816386,0.633819706982903,0.00839614169240918 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Full,5,0.717485896729522,0.71685899652647,0.72287874285206,0.717485896729522,0.719337658395294,0.00314832137641283 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Full_Truncated,5,0.717485896729522,0.71685899652647,0.72287874285206,0.717485896729522,0.719337658395294,0.00314832137641283 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Full_Joint,5,0.718564200718732,0.717751679375772,0.723867311169212,0.718564200718732,0.720297293047133,0.00318115267699769 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Full_Joint_Truncated,5,0.718564200718732,0.717751679375772,0.723867311169212,0.718564200718732,0.720297293047133,0.00318115267699769 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Climate,4,0.636250911438379,0.627380368267631,0.653685141830713,,0.639309371160374,0.0145611916830304 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Climate_Truncated,4,0.636263529886685,0.627402598788168,0.653701328647776,,0.639326696909033,0.0145585625333492 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Landcover,4,0.621073947742974,0.605174465777582,0.638800057775284,,0.621726314909731,0.0180551389037002 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Full,4,0.715093054248096,0.709938966718536,0.716833687112666,,0.713873963296314,0.00407985613655125 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Full_Truncated,4,0.715093054248096,0.709938966718536,0.716833687112666,,0.713873963296314,0.00407985613655125 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Full_Joint,4,0.716849054867145,0.711184101825957,0.718706027458805,,0.715489061849456,0.00457687182026539 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Full_Joint_Truncated,4,0.716849054867145,0.711184101825957,0.718706027458805,,0.715489061849456,0.00457687182026539 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_auc,5,0.778362159718991,0.777313519482956,0.781078019062442,0.776659932196605,0.778941977854504,0.00220139213343037 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_deviance_explained,5,0.129922817133758,0.116058360191463,0.137037124714767,0.126180029301491,0.127497727648612,0.0115563906422122 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_rmse,5,0.428984342825858,0.426484514201266,0.429776953204885,0.429796613403064,0.428367541663588,0.00170602773901413 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_spearman,5,0.46931020347218,0.467301179157511,0.473793771369763,0.466302441462258,0.470210732962937,0.00348588836105702 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_calibration_slope,5,1.02280943622485,1.00638380806286,1.02708521369247,1.02280943622485,1.0184707448443,0.011026980822553 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_prevalence,5,0.384787472035794,0.382719077877937,0.387875670039505,0.384787472035794,0.385092893007771,0.00278105998275642 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_n,5,3685,3644,4976.6,5811,4102.6,955.610956404331 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_auc,4,0.766320433722221,0.757378470612268,0.770532908104046,,0.764631330605033,0.00773409788726129 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_deviance_explained,4,0.113996779288933,0.0998702886563739,0.140537458619322,,0.118430418109587,0.0237257998755231 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_rmse,4,0.434233197376139,0.431409497762948,0.437875343465515,,0.434525499689062,0.00353785187767737 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_spearman,4,0.448965855284841,0.434402780928462,0.454722953452224,,0.445820863788771,0.0120096288277829 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_calibration_slope,4,0.967661500539704,0.947481883037204,0.982662848959669,,0.965812118724513,0.0194935179999311 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_prevalence,4,0.385212683681362,0.378550429000763,0.388624647224836,,0.384051865418103,0.00565743785692542 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_n,5,2126,834.4,2167,0,1708.4,955.610956404331 +lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Climate,5,0.726648362079003,0.7237588448296,0.731162951758353,0.723004804073768,0.72719557447664,0.00380494512788104 +lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Climate_Truncated,5,0.726660385143037,0.723768652905815,0.731181039693866,0.72301652132686,0.727208895973783,0.00380873317415131 +lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Landcover,5,0.714897867010021,0.711070873547497,0.715616075360572,0.710689730662897,0.713682108226793,0.00234024727927697 +lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Full,5,0.778362159718991,0.777313519482956,0.781078019062442,0.776659932196605,0.778941977854504,0.00220139213343037 +lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Full_Truncated,5,0.778213392638019,0.777186308510683,0.780963739171022,0.77651231594881,0.778814568724427,0.00222483325194008 +lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Full_Joint,5,0.777290152345703,0.776349528728965,0.780295682938712,0.77578324180292,0.778055337809396,0.00214296304404187 +lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Full_Joint_Truncated,5,0.777190658438047,0.776223771512686,0.780168440645134,0.775630371417491,0.777933926824515,0.00215290328592244 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Climate,4,0.714982827935826,0.71142147790233,0.716134560839275,,0.714122250389381,0.00278710207176498 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Climate_Truncated,4,0.714986555031238,0.711429083580888,0.716141935437511,,0.714128665372639,0.00278474056829603 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Landcover,4,0.6993486440522,0.695238223478961,0.703833711587922,,0.699482446538801,0.00471231540415982 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Full,4,0.766320433722221,0.757378470612268,0.770532908104046,,0.764631330605033,0.00773409788726129 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Full_Truncated,4,0.766446335783094,0.757266971247998,0.770241672495975,,0.764523468703731,0.00779476503948412 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Full_Joint,4,0.76558237025298,0.756446722492137,0.76890475840522,,0.76350620610705,0.00763281653645435 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Full_Joint_Truncated,4,0.765720545345162,0.756181429801128,0.768751167860589,,0.763396083549231,0.00772657199336835 +lichen,lichen,north,,,Physcia.adscendens,insample_auc,5,0.837335108574662,0.833892427673138,0.841684373333987,0.838268220834197,0.837631185433223,0.00421142443545695 +lichen,lichen,north,,,Physcia.adscendens,insample_deviance_explained,5,0.153309875432323,0.124539848626552,0.181355576712871,0.153309875432323,0.153462981135222,0.0313003485289416 +lichen,lichen,north,,,Physcia.adscendens,insample_rmse,5,0.394413849121186,0.390679733700768,0.396338542998067,0.393389135816662,0.393852028605293,0.00305493252353979 +lichen,lichen,north,,,Physcia.adscendens,insample_spearman,5,0.569716833320736,0.562212442609498,0.574320845837935,0.569949863531718,0.568531717754906,0.00642768440020838 +lichen,lichen,north,,,Physcia.adscendens,insample_calibration_slope,5,0.977543215514836,0.973882604264117,0.992189734009598,0.974581235728712,0.981283244985178,0.01051079416882 +lichen,lichen,north,,,Physcia.adscendens,insample_prevalence,5,0.382961350027218,0.378754207234193,0.387054085275807,0.384099122354156,0.382969715660275,0.00456567123234541 +lichen,lichen,north,,,Physcia.adscendens,insample_n,5,3699,3673.4,4975,5811,4115.6,947.965083745177 +lichen,lichen,north,,,Physcia.adscendens,oob_auc,4,0.839292658298271,0.829533400959301,0.846965637654569,,0.838547559018745,0.00938564979201381 +lichen,lichen,north,,,Physcia.adscendens,oob_deviance_explained,4,0.143454749419506,0.0949908751245048,0.205499371215224,,0.148305016384047,0.0631136911709378 +lichen,lichen,north,,,Physcia.adscendens,oob_rmse,4,0.391817546344859,0.388424442525194,0.400850115043751,,0.393831640944583,0.00707925330540285 +lichen,lichen,north,,,Physcia.adscendens,oob_spearman,4,0.570820101540557,0.556966290991812,0.585222167374373,,0.571015906999511,0.0152763365469035 +lichen,lichen,north,,,Physcia.adscendens,oob_calibration_slope,4,0.993551581711484,0.96245857697318,1.01756614536709,,0.991023567039093,0.0304614734345619 +lichen,lichen,north,,,Physcia.adscendens,oob_prevalence,4,0.386432660247333,0.378648004672367,0.394703317951312,,0.386606232436266,0.00923888826136022 +lichen,lichen,north,,,Physcia.adscendens,oob_n,5,2112,836,2137.6,0,1695.4,947.965083745177 +lichen,lichen,north,,,Physcia.adscendens,v2val_Climate,5,0.693422907498,0.690915989050979,0.694883881152127,0.693422907498,0.692986505923955,0.00201451745990401 +lichen,lichen,north,,,Physcia.adscendens,v2val_Climate_Truncated,5,0.693419511127206,0.690911780963104,0.694883929491704,0.693419511127206,0.692985163486467,0.00201463625805256 +lichen,lichen,north,,,Physcia.adscendens,v2val_Landcover,5,0.801861109542011,0.782213209132931,0.812598365772438,0.812994033294577,0.799562929201212,0.0178185824794553 +lichen,lichen,north,,,Physcia.adscendens,v2val_Full,5,0.837335108574662,0.833892427673138,0.841684373333987,0.838268220834197,0.837631185433223,0.00421142443545695 +lichen,lichen,north,,,Physcia.adscendens,v2val_Full_Truncated,5,0.837482703696643,0.83402227575171,0.841815848139725,0.838439032548488,0.837773708478258,0.00421550438320122 +lichen,lichen,north,,,Physcia.adscendens,v2val_Full_Joint,5,0.836047248740013,0.832067905608026,0.840315800616736,0.836357683360022,0.836103552465423,0.0046074652071796 +lichen,lichen,north,,,Physcia.adscendens,v2val_Full_Joint_Truncated,5,0.836286222674123,0.832185134167773,0.840452132671447,0.836525866238843,0.836258764262809,0.00461711990867249 +lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Climate,4,0.690146520368093,0.687623451889863,0.696399093335788,,0.691478486257188,0.00495021261044504 +lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Climate_Truncated,4,0.690133662354544,0.687619313393814,0.696403232441228,,0.69147481275667,0.00495756138170841 +lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Landcover,4,0.80689396202876,0.792826777899119,0.818710192371022,,0.806090049961839,0.0145903596426596 +lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Full,4,0.839292658298271,0.829533400959301,0.846965637654569,,0.838547559018745,0.00938564979201381 +lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Full_Truncated,4,0.839479011781648,0.829796481228334,0.8470008753914,,0.83870734501609,0.00926667222581543 +lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Full_Joint,4,0.835740019351969,0.826152734502598,0.845016117951229,,0.835628881405501,0.0101826777472231 +lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Full_Joint_Truncated,4,0.835910659316576,0.826439317818255,0.845028920277397,,0.835784559124612,0.0100393680766585 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_auc,5,0.782940004828585,0.771430317517624,0.78704102003786,0.782940004828585,0.780384815223684,0.00892062786427006 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_deviance_explained,5,0.101560194956707,0.0833055588905147,0.10855690687591,0.0760150539678254,0.0977267101316104,0.0134864921912352 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_rmse,5,0.273630488580498,0.266940670870867,0.27923536011912,0.27615265636656,0.273137946045151,0.00613430562265861 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_spearman,5,0.278345072756788,0.271410866729923,0.283855802016148,0.284558850730728,0.277868922002142,0.00614111968498575 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_calibration_slope,5,1.00445803190767,0.923032164793458,1.06063235332037,1.00400781901235,0.998413735524807,0.0779356859153725 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_prevalence,5,0.0907849829351536,0.0854880550520455,0.0942546707117982,0.092924126172208,0.0900691492139895,0.00433337917377339 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_n,5,1482,1471.8,2004.4,2346,1653.4,387.296785424305 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_auc,4,0.767777065619901,0.759098616020395,0.777508870753697,,0.768153264025005,0.0103158231014254 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_deviance_explained,4,0.00020738830490835,-0.0197727594970929,0.0186135944535137,,-0.0003547337141616,0.0206046152183967 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_rmse,4,0.285215861553978,0.278859149933553,0.293735548818788,,0.285988352855544,0.00803695663998821 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_spearman,4,0.280771471067578,0.258586974156161,0.293911115946987,,0.277541166770433,0.0193124585097445 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_calibration_slope,4,1.11452074384603,0.83884295294175,1.23312243580024,,1.05842213707815,0.227871215589685 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_prevalence,4,0.0997452652709462,0.0913286406440493,0.106312613843352,,0.0990848095371992,0.00808662138066247 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_n,5,864,341.6,874.2,0,692.6,387.296785424305 +lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Climate,5,0.726648362079003,0.7237588448296,0.731162951758353,0.723004804073768,0.72719557447664,0.00380494512788104 +lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Climate_Truncated,5,0.726660385143037,0.723768652905815,0.731181039693866,0.72301652132686,0.727208895973783,0.00380873317415131 +lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Landcover,5,0.746232134390029,0.738477213352093,0.757183243479499,0.74708991515486,0.747240463783824,0.0106065443436887 +lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Full,5,0.782940004828585,0.771430317517624,0.787041020037861,0.782940004828585,0.780384815223684,0.0089206278642703 +lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Full_Truncated,5,0.782940004828585,0.771430317517624,0.787041020037861,0.782940004828585,0.780384815223684,0.0089206278642703 +lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Full_Joint,5,0.783724649927571,0.773780455672375,0.788033764122229,0.783724649927571,0.781776344950047,0.00786739974674226 +lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Full_Joint_Truncated,5,0.783724649927571,0.773780455672375,0.788033764122229,0.783724649927571,0.781776344950047,0.00786739974674226 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Climate,4,0.714982827935826,0.71142147790233,0.716134560839275,,0.714122250389381,0.00278710207176498 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Climate_Truncated,4,0.714986555031238,0.711429083580888,0.716141935437511,,0.714128665372639,0.00278474056829603 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Landcover,4,0.75082184394749,0.74168570185442,0.752461597648907,,0.748144562379042,0.00674874952586361 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Full,4,0.767777065619901,0.759098616020395,0.777508870753697,,0.768153264025005,0.0103158231014254 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Full_Truncated,4,0.767777065619901,0.759098616020395,0.777508870753697,,0.768153264025005,0.0103158231014254 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Full_Joint,4,0.76868800182822,0.762466250385714,0.777619034446911,,0.769655602248286,0.00865338800241536 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Full_Joint_Truncated,4,0.76868800182822,0.762466250385714,0.777619034446911,,0.769655602248286,0.00865338800241536 +lichen,lichen,south,,,Physcia.adscendens,insample_auc,5,0.821353781719635,0.817185593102722,0.825672849056938,0.821573724007562,0.82133199677784,0.00470181458246041 +lichen,lichen,south,,,Physcia.adscendens,insample_deviance_explained,5,0.239704709286469,0.231908892003898,0.24739316046634,0.239704709286469,0.239170938481984,0.00836987471623949 +lichen,lichen,south,,,Physcia.adscendens,insample_rmse,5,0.356794925429378,0.352929674110169,0.358725757363671,0.356794925429378,0.356142732606163,0.00305057472651177 +lichen,lichen,south,,,Physcia.adscendens,insample_spearman,5,0.458171869563314,0.449023619570466,0.466231041170605,0.458171869563314,0.457232139057486,0.00919412871966326 +lichen,lichen,south,,,Physcia.adscendens,insample_calibration_slope,5,0.881651302841094,0.877029058458768,0.905002744726106,0.895884570463108,0.888780956639862,0.014710326211831 +lichen,lichen,south,,,Physcia.adscendens,insample_prevalence,5,0.215686274509804,0.210370852380551,0.218705697782215,0.215686274509804,0.214933253293698,0.00478783760132252 +lichen,lichen,south,,,Physcia.adscendens,insample_n,5,1487,1480.8,2014,2346,1662.2,382.531305908418 +lichen,lichen,south,,,Physcia.adscendens,oob_auc,4,0.816688066173278,0.814577556447952,0.819582119521717,,0.816967903181533,0.00271138269936014 +lichen,lichen,south,,,Physcia.adscendens,oob_deviance_explained,4,0.229581557918766,0.221042427704859,0.242028578202743,,0.230977232943791,0.0116106526749679 +lichen,lichen,south,,,Physcia.adscendens,oob_rmse,4,0.361221111344793,0.357219734510275,0.363119037857434,,0.360469879086979,0.00328089666967988 +lichen,lichen,south,,,Physcia.adscendens,oob_spearman,4,0.454435749483605,0.444604153459308,0.459399541619317,,0.452697248094824,0.00824469525388058 +lichen,lichen,south,,,Physcia.adscendens,oob_calibration_slope,4,0.869323881706107,0.820424126275093,0.95799881977588,,0.883529304077092,0.0756154292842296 +lichen,lichen,south,,,Physcia.adscendens,oob_prevalence,4,0.21549434057534,0.209833885194357,0.226186106799465,,0.217291237305033,0.00944381193189753 +lichen,lichen,south,,,Physcia.adscendens,oob_n,5,859,332,865.2,0,683.8,382.531305908418 +lichen,lichen,south,,,Physcia.adscendens,v2val_Climate,5,0.693422907498,0.690915989050979,0.694883881152127,0.693422907498,0.692986505923955,0.00201451745990401 +lichen,lichen,south,,,Physcia.adscendens,v2val_Climate_Truncated,5,0.693419511127206,0.690911780963104,0.694883929491704,0.693419511127206,0.692985163486467,0.00201463625805256 +lichen,lichen,south,,,Physcia.adscendens,v2val_Landcover,5,0.755367662346663,0.753354388319629,0.769154488554709,0.755514263619179,0.75923726755233,0.0106880634487565 +lichen,lichen,south,,,Physcia.adscendens,v2val_Full,5,0.821353781719635,0.817185593102722,0.825672849056938,0.821573724007562,0.82133199677784,0.00470181458246041 +lichen,lichen,south,,,Physcia.adscendens,v2val_Full_Truncated,5,0.821369179600887,0.817185593102722,0.825672849056938,0.821573724007562,0.82133507635409,0.00470183746079766 +lichen,lichen,south,,,Physcia.adscendens,v2val_Full_Joint,5,0.818351194875585,0.815473629919288,0.821595518961059,0.818413816807012,0.818450596628366,0.0035138580973253 +lichen,lichen,south,,,Physcia.adscendens,v2val_Full_Joint_Truncated,5,0.818366592756837,0.815473629919288,0.821595518961059,0.818413816807012,0.818453676204616,0.0035137559475432 +lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Climate,4,0.690146520368093,0.687623451889863,0.696399093335788,,0.691478486257188,0.00495021261044504 +lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Climate_Truncated,4,0.690133662354544,0.687619313393814,0.696403232441228,,0.69147481275667,0.00495756138170841 +lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Landcover,4,0.757543713583416,0.754237750244239,0.765899299116814,,0.759347150081352,0.00659093377352209 +lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Full,4,0.816688066173278,0.814577556447952,0.819582119521717,,0.816967903181533,0.00271138269936014 +lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Full_Truncated,4,0.816692374438254,0.814577556447952,0.819584704480702,,0.81697005731402,0.00271219354015405 +lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Full_Joint,4,0.812861687935889,0.810647101871693,0.815758867203804,,0.813105471222931,0.00283145974958857 +lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Full_Joint_Truncated,4,0.81287030446584,0.810647101871693,0.815764037121775,,0.813109779487907,0.00283515421967582 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_auc,5,0.820367038624296,0.819088803830954,0.825096132690793,0.820911148938545,0.821548232901657,0.00368021243181869 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_deviance_explained,5,0.274643755760762,0.273047064346357,0.2795535093301,0.272167552780268,0.275794916286106,0.0037829114549962 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_rmse,5,0.325649814939506,0.323044576138151,0.32774821127909,0.327783381237672,0.325475899728406,0.0023268778087488 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_spearman,5,0.457622037926128,0.455146980332479,0.464800704476141,0.457622037926128,0.459282943376137,0.0052329898486681 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_calibration_slope,5,0.987210797047211,0.964756720342875,1.04226829149403,0.987210797047211,0.999628097376395,0.040457896858658 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_prevalence,5,0.22526523562793,0.222685585610422,0.228865718677616,0.22526523562793,0.225662811559798,0.00324773944134521 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_n,5,2588,2554.4,3469,4053,2869.4,661.914873680899 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_auc,4,0.807437018082126,0.795187683185118,0.814600712078279,,0.805620717760392,0.0109848697690175 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_deviance_explained,4,0.234952851608951,0.215144910318834,0.252509532861174,,0.234148830166846,0.0201759809192477 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_rmse,4,0.33540874228767,0.32943601838744,0.340042074806677,,0.334930388222947,0.00571392258320504 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_spearman,4,0.436123893428745,0.419582521233002,0.446016838076314,,0.433749455018683,0.0150488838521891 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_calibration_slope,4,0.947080559125973,0.940176391586403,0.972191240627968,,0.953582885541124,0.0195519425313773 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_prevalence,4,0.224511499051979,0.218291264544164,0.230417458254175,,0.224399257871401,0.00661456979352361 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_n,5,1465,584,1498.6,0,1183.6,661.914873680899 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_auc,5,0.61119205862304,0.608247846213005,0.619766590249117,0.614800455189874,0.613133257123311,0.00617079565055122 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_deviance_explained,5,0.0293312456190202,0.0254868824061227,0.034855941334284,0.0327130199155846,0.0299655255688071,0.00466042949610858 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_rmse,5,0.440494520447441,0.439655702708701,0.441992443932362,0.440494520447441,0.440710638869574,0.00129009568326754 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_spearman,5,0.166867112583273,0.161253581705846,0.173443277843013,0.166867112583273,0.166942767059625,0.00668917082484309 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_calibration_slope,5,0.871613828265815,0.807561232834562,0.918699876937025,0.901041907949805,0.864331745671229,0.05473797753352 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_prevalence,5,0.320047355958958,0.317847829087179,0.320941159211816,0.321243523316062,0.319582666739872,0.00164288413830535 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_n,5,2587,2537.6,3467,4053,2861,666.806193732482 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_auc,4,0.599789507623449,0.585096398809124,0.610287133771428,,0.598291120956897,0.0139243777141284 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_deviance_explained,4,0.0222358139724005,0.0154302383695453,0.0289963709245666,,0.0222197358828687,0.00780005134828563 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_rmse,4,0.444244510956,0.443337295940116,0.444727707984992,,0.444093075960681,0.000801980504115758 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_spearman,4,0.1428985967646,0.125110680243685,0.165466638254086,,0.144605784253376,0.0220824267179884 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_calibration_slope,4,0.750011624893702,0.699600524966396,0.836834785057386,,0.76301593212098,0.0752804461935625 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_prevalence,4,0.324076824388238,0.322733281306541,0.3276244709432,,0.324864004200118,0.00280085582083958 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_n,5,1466,586,1515.4,0,1192,666.806193732482 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_auc,5,0.634240369366988,0.632910641847936,0.642195650517714,0.634240369366988,0.636730093444244,0.00492494577892738 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_deviance_explained,5,0.0264112493368064,0.0244020509882967,0.0303865560800429,0.0264112493368064,0.0271321926805094,0.00319183688778419 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_rmse,5,0.418769573067301,0.41254704078318,0.420323940326511,0.421286846656193,0.41688100357794,0.00397229497435235 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_spearman,5,0.175369074792115,0.169472066216479,0.19311238624043,0.175369074792115,0.17910418059275,0.0143000493783131 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_calibration_slope,5,0.975536082659011,0.869669271029773,0.999133512851468,1.00531761653027,0.942116568564117,0.0667346863953477 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_prevalence,5,0.691079812206573,0.689952548788955,0.71053806886065,0.691079812206573,0.698355803841802,0.0110051698108056 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_n,5,675,672.2,911.8,1065,753.4,174.236333753899 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_auc,4,0.590185162579443,0.588561095758765,0.594993617451278,,0.591322444026285,0.00370894024345057 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_deviance_explained,4,-0.00660912212895907,-0.0246222554112858,0.00596211189481146,,-0.00855265757844343,0.0170007059445371 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_rmse,4,0.438945021715404,0.435169754735052,0.442994297582763,,0.439042882032192,0.00430413105762848 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_spearman,4,0.119269331592725,0.112670153678564,0.141855035472014,,0.1249788051517,0.0171203610940835 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_calibration_slope,4,0.529521999315492,0.405879483641657,0.748020467389396,,0.56339912517266,0.188100087615398 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_prevalence,4,0.675933879994794,0.656439043984736,0.693034260713775,,0.675078717390838,0.0207397429628256 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_n,5,390,153.2,392.8,0,311.6,174.236333753899 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_auc,5,0.800563803516706,0.774332077165384,0.807116397983381,0.786049924840508,0.793142123263336,0.0172774284548912 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_deviance_explained,5,0.235315369629889,0.184794016646685,0.243734500249067,0.205216892616348,0.219402980661022,0.0313035508744373 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_rmse,5,0.345153854253612,0.340273324511787,0.350387335024819,0.345153854253612,0.345250928073386,0.00498539064156107 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_spearman,5,0.399822439479778,0.365817333025682,0.416474286805188,0.381089371361329,0.393764975108055,0.025777771060145 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_calibration_slope,5,0.983951125311349,0.934535204259224,1.0182141754068,0.986324497785332,0.978961877909731,0.0489672106534818 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_prevalence,5,0.182159624413146,0.181333087877553,0.193172072927236,0.182159624413146,0.185526823886116,0.00827314119136472 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_n,5,678,670.6,913,1065,754,173.956891211587 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_auc,4,0.729574202549047,0.71815250764054,0.778542353806383,,0.742983651245057,0.0363678903345032 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_deviance_explained,4,0.0957319747373082,-0.112729476086203,0.182551981226243,,0.0522886017606739,0.177839885253858 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_rmse,4,0.349900330806755,0.341019339169151,0.360550613582775,,0.350532220499047,0.0106010756691699 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_spearman,4,0.291859756320935,0.287348724179463,0.363426726063271,,0.315808305464101,0.0514234239419856 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_calibration_slope,4,0.774041963702232,0.646822148840561,1.18815164727979,,0.876502631100762,0.317190446694699 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_prevalence,4,0.182520739834082,0.160534290271133,0.183610188261351,,0.175057525142768,0.01572313523028 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_n,5,387,152,394.4,0,311,173.956891211587 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_auc,5,0.843771320712376,0.837298705573725,0.845386776229526,0.839440907842931,0.841900799199367,0.00416458415403682 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_deviance_explained,5,0.296908480586636,0.290887810793796,0.302200604755114,0.294409607036222,0.296791618459388,0.00570554859270136 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_rmse,5,0.300280860452662,0.299352741208206,0.302368697081708,0.30069616131153,0.300636486451009,0.00169518301694859 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_spearman,5,0.466818565812599,0.461436555661139,0.473138781426199,0.463240577826878,0.467175270468735,0.00576420559514205 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_calibration_slope,5,0.972690836668142,0.921935358308296,0.979611212169833,0.982050704865843,0.955256551495782,0.0299777079445712 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_prevalence,5,0.201509433962264,0.199761756423448,0.205640478898507,0.201356917858008,0.202439531288226,0.00307554695366447 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_n,5,2612,2595.8,3536.2,4127,2916.2,677.217616427689 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_auc,4,0.827458353428436,0.817805717079038,0.840574988117616,,0.828695495692644,0.0124179160962348 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_deviance_explained,4,0.276689902789578,0.265842733106712,0.294949072324388,,0.279337045593844,0.0167940142463136 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_rmse,4,0.303789329751735,0.298771516378234,0.304833455528629,,0.302370155610089,0.00382820840385957 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_spearman,4,0.444765026946551,0.435147313816253,0.460529325956992,,0.446960236189459,0.0143757349540166 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_calibration_slope,4,0.912370954577014,0.861212539179959,0.954228059409819,,0.909049057946925,0.0520155611998991 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_prevalence,4,0.199234448913847,0.193549889929862,0.204483398915383,,0.199078874277258,0.00592784350128194 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_n,5,1515,590.8,1531.2,0,1210.8,677.217616427689 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_auc,5,0.672085273881372,0.668633720672182,0.680693747031501,0.668767750495832,0.673650345261601,0.00705894383852787 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_deviance_explained,5,0.0758678220182751,0.0704991263862156,0.0841775407251298,0.0713753243188524,0.0768329848204126,0.00689725835100292 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_rmse,5,0.332910274284271,0.327210641524145,0.335100999244875,0.332910274284271,0.331554332789458,0.00395381643788123 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_spearman,5,0.215829774013176,0.212589282113879,0.226422981371282,0.211955551417089,0.218242903591179,0.00816350970165605 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_calibration_slope,5,0.94812085347111,0.856889525073144,1.03389671800408,0.94812085347111,0.948321951639006,0.092126092648448 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_prevalence,5,0.148776350860189,0.144579171619019,0.151265484707482,0.148776350860189,0.148217744909364,0.00345089736498891 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_n,5,2637,2606,3537,4127,2925.8,671.783223964398 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_auc,4,0.654372882277188,0.640403021566792,0.6605591763494,,0.651593037049265,0.0112866225169797 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_deviance_explained,4,0.0514858356828411,0.0379579660013158,0.0604573235872615,,0.0498585564767322,0.0123265017677637 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_rmse,4,0.337444976131703,0.331449906564068,0.342571110976009,,0.337134642301943,0.00618013722586392 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_spearman,4,0.19099043338874,0.174162150130626,0.204597549588522,,0.189840016582193,0.0164077747297465 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_calibration_slope,4,0.732075381978751,0.657958194547818,0.836247242841193,,0.742809193918576,0.0983856367690785 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_prevalence,4,0.148630312373211,0.144212802079742,0.157027721824677,,0.150051704929638,0.00706694376971498 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_n,5,1490,590,1521,0,1201.2,671.783223964398 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_auc,5,0.706112866420923,0.689756836780519,0.712422673247893,0.689082366331686,0.701766116171277,0.0115819259664459 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_deviance_explained,5,0.077948761211899,0.0672394512735814,0.0862779229583741,0.0670547674954939,0.0767109599030692,0.00953073159442438 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_rmse,5,0.401891914348534,0.400056693343447,0.408313222434912,0.406888363248781,0.403660884327179,0.00418719958207863 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_spearman,5,0.328404695790939,0.293718951070702,0.340256897739946,0.296933239332004,0.319246035124502,0.0234446146251979 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_calibration_slope,5,1.02265042079081,0.949079646474498,1.06820491938664,1.03306130883064,1.01079025774546,0.0605675993019255 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_prevalence,5,0.602816901408451,0.593809006916747,0.607790307126989,0.604735883424408,0.60104129788425,0.00700249933764362 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_n,5,696,686.6,942.8,1098,775.8,180.377936566532 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_auc,4,0.642530046696975,0.604052771943084,0.646988682070108,,0.630380532632419,0.0285027427030458 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_deviance_explained,4,0.0177640077575169,-0.00914291472953676,0.0380006855045052,,0.0153817774932079,0.0262728517098914 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_rmse,4,0.423675312133193,0.412365569779127,0.4289659133495,,0.421525618869708,0.00945427379070984 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_spearman,4,0.215041364313525,0.166273559830134,0.234657571247567,,0.204630079474472,0.0385961235199444 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_calibration_slope,4,0.666986903656138,0.480343171377765,0.83150584600084,,0.659085192965541,0.188467730825247 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_prevalence,4,0.614967084834182,0.599715606114469,0.623570700713301,,0.612592848105398,0.0130873792975551 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_n,5,402,155.2,411.4,0,322.2,180.377936566532 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_auc,5,0.823493333333333,0.815129597967925,0.847125543751909,0.819927852628077,0.828483048702628,0.0191754521582077 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_deviance_explained,5,0.240858392609539,0.229287932861753,0.282840102014879,0.234870911391229,0.250773020824705,0.0333046711345811 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_rmse,5,0.223331046901821,0.21469247206876,0.227275887816135,0.223331046901821,0.221804231165123,0.00746931749125918 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_spearman,5,0.319693927847967,0.314626273281237,0.331123877059782,0.313170610278462,0.321987168463127,0.00854028427675327 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_calibration_slope,5,0.926166715024209,0.8521293240645,0.969181499315011,0.926166715024209,0.911949295173001,0.0594253375701516 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_prevalence,5,0.0875912408759124,0.0815913826315997,0.0946898807160816,0.0874316939890711,0.0882209860082516,0.00699025063520411 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_n,5,693,685.8,936.8,1098,771.6,182.509725768245 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_auc,4,0.77744050520223,0.771065167348639,0.803486958443855,,0.784465903555099,0.0194119950156149 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_deviance_explained,4,0.17108179189974,0.0694866534919466,0.192858665045726,,0.142575268591952,0.0750549614358755 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_rmse,4,0.226318832277226,0.216290927259541,0.250116289221731,,0.231236529393947,0.0196223161851492 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_spearman,4,0.278455188286047,0.262015370235656,0.285433310292326,,0.275076011127436,0.0140713668010713 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_calibration_slope,4,0.751176575138291,0.529405518004174,0.815471311990914,,0.694935032180614,0.168343487942426 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_prevalence,4,0.0837295205104187,0.0742110480309994,0.0991029746633899,,0.0858205853938301,0.0138195684717859 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_n,5,405,161.2,412.2,0,326.4,182.509725768245 +mite,mite,north,,,Ceratozetes.gracilis,insample_auc,5,0.793023395932593,0.785116760768433,0.797585561245424,0.791183069113511,0.791977110922841,0.00673340419157571 +mite,mite,north,,,Ceratozetes.gracilis,insample_deviance_explained,5,0.134692532005047,0.108608328871156,0.141811919550427,0.125527507164404,0.128052047876132,0.0184307041865782 +mite,mite,north,,,Ceratozetes.gracilis,insample_rmse,5,0.364641744759417,0.36299256091057,0.368618183340602,0.364308079016483,0.365438034871869,0.00324688670297244 +mite,mite,north,,,Ceratozetes.gracilis,insample_spearman,5,0.41429348998048,0.402422002613553,0.419681351800533,0.409677886636093,0.412099312835312,0.00911372223585555 +mite,mite,north,,,Ceratozetes.gracilis,insample_calibration_slope,5,1.0224894029886,1.00755092646514,1.03915812721702,1.0224894029886,1.02287359767688,0.0156175294996684 +mite,mite,north,,,Ceratozetes.gracilis,insample_prevalence,5,0.211169769380383,0.208505864577966,0.211369634473166,0.208369812642269,0.210190443530451,0.00151474200965215 +mite,mite,north,,,Ceratozetes.gracilis,insample_n,5,3651,3606.6,4890.2,5711,4047.6,930.188045504779 +mite,mite,north,,,Ceratozetes.gracilis,oob_auc,4,0.779665972511523,0.773198985489411,0.798395168992114,,0.784045333032408,0.0147724589078592 +mite,mite,north,,,Ceratozetes.gracilis,oob_deviance_explained,4,0.0923986988857812,0.0862667569754759,0.144304465844404,,0.108746493545894,0.037849846139005 +mite,mite,north,,,Ceratozetes.gracilis,oob_rmse,4,0.36680003014665,0.360411853868392,0.368997514633471,,0.365303354506851,0.00518143947194182 +mite,mite,north,,,Ceratozetes.gracilis,oob_spearman,4,0.389977816116695,0.383012434237582,0.415943717902066,,0.396763716083216,0.0196903404412637 +mite,mite,north,,,Ceratozetes.gracilis,oob_calibration_slope,4,0.956222238793897,0.921365026616042,1.05973298874715,,0.980741359427966,0.0799378045179831 +mite,mite,north,,,Ceratozetes.gracilis,oob_prevalence,4,0.203407429558746,0.203105380508127,0.206516438658429,,0.204409915290554,0.0022495255846381 +mite,mite,north,,,Ceratozetes.gracilis,oob_n,5,2060,820.8,2104.4,0,1663.4,930.188045504779 +mite,mite,north,,,Ceratozetes.gracilis,v2val_Climate,5,0.738382414749567,0.734358129806975,0.742005285315151,0.738382414749567,0.738111987253943,0.00384260421914782 +mite,mite,north,,,Ceratozetes.gracilis,v2val_Climate_Truncated,5,0.738392463572007,0.734342356311168,0.742026178178654,0.738392463572007,0.738117914905037,0.00385983439540224 +mite,mite,north,,,Ceratozetes.gracilis,v2val_Landcover,5,0.766722893536977,0.759062628411847,0.772422596192916,0.766722893536977,0.766125561315905,0.00683173671440066 +mite,mite,north,,,Ceratozetes.gracilis,v2val_Full,5,0.793023395932593,0.785116760768433,0.797585561245424,0.791183069113511,0.791977110922841,0.00673340419157571 +mite,mite,north,,,Ceratozetes.gracilis,v2val_Full_Truncated,5,0.793016443892401,0.785027851595894,0.797500866905145,0.791105466738786,0.791908988560901,0.00674045451455018 +mite,mite,north,,,Ceratozetes.gracilis,v2val_Full_Joint,5,0.793386060695946,0.785055839040043,0.797509252679056,0.791225262500488,0.792011165992849,0.00676871644676792 +mite,mite,north,,,Ceratozetes.gracilis,v2val_Full_Joint_Truncated,5,0.793386524165292,0.784963217939285,0.797444970586129,0.7911589984368,0.791952343573282,0.00679046380342073 +mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Climate,4,0.731027419469463,0.725410991997312,0.741834431700471,,0.732881199740483,0.00906851156052711 +mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Climate_Truncated,4,0.731045119285728,0.72540173801145,0.741842884282973,,0.732885970615359,0.00907305785634944 +mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Landcover,4,0.752661723212296,0.748458309671417,0.773156655512682,,0.758480122769263,0.0155945518677711 +mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Full,4,0.779665972511523,0.773198985489411,0.798395168992114,,0.784045333032408,0.0147724589078592 +mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Full_Truncated,4,0.77962848748914,0.773216243029163,0.798382692848602,,0.784036330667528,0.014780937706049 +mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Full_Joint,4,0.779066438961531,0.77354347637541,0.798343558984922,,0.78397863804627,0.0148677753889034 +mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Full_Joint_Truncated,4,0.779044896212606,0.773564180389716,0.798356007315929,,0.783984323098475,0.01488666359881 +mite,mite,north,,,Trhypochthonius.tectorum,insample_auc,5,0.672907942808574,0.669208813819547,0.682343647003947,0.669778092188547,0.674857259308144,0.0070191421865739 +mite,mite,north,,,Trhypochthonius.tectorum,insample_deviance_explained,5,-0.0324180258517079,-0.0527646417815135,-0.0101623689114898,-0.0407269697080057,-0.0321707940218346,0.0231090933708154 +mite,mite,north,,,Trhypochthonius.tectorum,insample_rmse,5,0.288562681524747,0.286522184662904,0.291945228269945,0.288562681524747,0.288981155568958,0.00296084278549151 +mite,mite,north,,,Trhypochthonius.tectorum,insample_spearman,5,0.174619892294846,0.172564649955749,0.187939106716607,0.1729413278484,0.178541440689235,0.00902094001424548 +mite,mite,north,,,Trhypochthonius.tectorum,insample_calibration_slope,5,0.938290627841302,0.909627160028179,0.994839719200875,0.931192865479756,0.95045611024787,0.0429430392043578 +mite,mite,north,,,Trhypochthonius.tectorum,insample_prevalence,5,0.0956049728593941,0.0940001763114542,0.0987931854359719,0.0956049728593941,0.0960754727002272,0.00270898671716411 +mite,mite,north,,,Trhypochthonius.tectorum,insample_n,5,3624,3599.2,4881,5711,4034.4,937.384819591186 +mite,mite,north,,,Trhypochthonius.tectorum,oob_auc,4,0.651421835190664,0.64513479278205,0.663121005511504,,0.653354738016459,0.00989688245354325 +mite,mite,north,,,Trhypochthonius.tectorum,oob_deviance_explained,4,-0.0625612551961812,-0.104386756333539,-0.0317884651562399,,-0.066508652016687,0.0413281120013629 +mite,mite,north,,,Trhypochthonius.tectorum,oob_rmse,4,0.289482213990474,0.281791769789717,0.293681830417276,,0.28823548978549,0.00666038076943173 +mite,mite,north,,,Trhypochthonius.tectorum,oob_spearman,4,0.153802350804888,0.145130738202924,0.167192976536939,,0.155487712637062,0.0120299047392454 +mite,mite,north,,,Trhypochthonius.tectorum,oob_calibration_slope,4,0.866440051991562,0.715195080326882,0.99057532202289,,0.856758015693936,0.149800198792233 +mite,mite,north,,,Trhypochthonius.tectorum,oob_prevalence,4,0.0963264503316864,0.0893459374618542,0.0984905896614327,,0.0946063169245129,0.00535078906761863 +mite,mite,north,,,Trhypochthonius.tectorum,oob_n,5,2087,830,2111.8,0,1676.6,937.384819591186 +mite,mite,north,,,Trhypochthonius.tectorum,v2val_Climate,5,0.646091585413555,0.643946189711462,0.652343816700896,0.646091585413555,0.647435005669506,0.00501081050104212 +mite,mite,north,,,Trhypochthonius.tectorum,v2val_Climate_Truncated,5,0.646095557008706,0.643948358640746,0.65233771826661,0.646095557008706,0.647436539502018,0.00500120525659027 +mite,mite,north,,,Trhypochthonius.tectorum,v2val_Landcover,5,0.637987440117159,0.627044747234771,0.648796943002273,0.637987440117159,0.637774648879966,0.0120277548025983 +mite,mite,north,,,Trhypochthonius.tectorum,v2val_Full,5,0.672907942808574,0.669208813819547,0.682343647003947,0.669778092188547,0.674857259308144,0.0070191421865739 +mite,mite,north,,,Trhypochthonius.tectorum,v2val_Full_Truncated,5,0.672968462835808,0.669234243838635,0.682370652186889,0.669767986128102,0.67489223986993,0.00700566517575936 +mite,mite,north,,,Trhypochthonius.tectorum,v2val_Full_Joint,5,0.673039662867848,0.668775078579256,0.682456515305188,0.66926215120794,0.674743399528349,0.00725984991743693 +mite,mite,north,,,Trhypochthonius.tectorum,v2val_Full_Joint_Truncated,5,0.673102852896284,0.66877285388055,0.682481051437855,0.669242116386356,0.674767969249559,0.0072566620089462 +mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Climate,4,0.637448091750764,0.62319195321542,0.64083947116042,,0.633567820634447,0.0109633746747622 +mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Climate_Truncated,4,0.637447116712891,0.623191511787853,0.640852747518307,,0.633572125955883,0.0109617111390789 +mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Landcover,4,0.619482659509824,0.616517647587969,0.622452812919573,,0.6194844957555,0.00319182447037644 +mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Full,4,0.651421835190664,0.64513479278205,0.663121005511504,,0.653354738016459,0.00989688245354325 +mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Full_Truncated,4,0.651598760851872,0.645145346470754,0.66328863933151,,0.653468926601344,0.00996350123797742 +mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Full_Joint,4,0.650909465977038,0.643507260329979,0.663048883832917,,0.652601327480188,0.0106588967286394 +mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Full_Joint_Truncated,4,0.65107837071969,0.643490423905209,0.66321170510179,,0.652701723422411,0.0107382013149323 +mite,mite,south,,,Ceratozetes.gracilis,insample_auc,5,0.883740175681923,0.875951595662976,0.884218489485534,0.880842240129472,0.881127727799286,0.00491960965959818 +mite,mite,south,,,Ceratozetes.gracilis,insample_deviance_explained,5,0.169227984866749,0.102917912757133,0.174897444771582,0.169227984866749,0.148837676671015,0.0479777276568308 +mite,mite,south,,,Ceratozetes.gracilis,insample_rmse,5,0.223410917578014,0.207894263041054,0.228617168412238,0.215105469199925,0.219622699857429,0.0107678160117743 +mite,mite,south,,,Ceratozetes.gracilis,insample_spearman,5,0.304054710362117,0.292604158893579,0.321411532274628,0.304054710362117,0.306352068526036,0.0145523795554875 +mite,mite,south,,,Ceratozetes.gracilis,insample_calibration_slope,5,0.646501812554423,0.571714943118018,0.663896293625869,0.652084939529121,0.625798242702713,0.0510970524920574 +mite,mite,south,,,Ceratozetes.gracilis,insample_prevalence,5,0.056970509383378,0.0521775638545351,0.0622115928022082,0.0562843842573,0.0572190090351997,0.00535467847864499 +mite,mite,south,,,Ceratozetes.gracilis,insample_n,5,1494,1479.4,2024.6,2363,1667.4,389.193139713433 +mite,mite,south,,,Ceratozetes.gracilis,oob_auc,4,0.877556363090999,0.870858501486971,0.891246533596325,,0.880053616270034,0.0119804912573777 +mite,mite,south,,,Ceratozetes.gracilis,oob_deviance_explained,4,0.149139947228324,0.081863654137057,0.211545016984438,,0.147400224608626,0.0705190613624988 +mite,mite,south,,,Ceratozetes.gracilis,oob_rmse,4,0.217549055983636,0.21158190570823,0.223701160718158,,0.217615111147606,0.00687714178519329 +mite,mite,south,,,Ceratozetes.gracilis,oob_spearman,4,0.297912570168464,0.269110530526911,0.325939210959734,,0.297635642007648,0.0304788257744718 +mite,mite,south,,,Ceratozetes.gracilis,oob_calibration_slope,4,0.588033894967732,0.50519914194533,0.720419749435623,,0.60573071691255,0.11934507589046 +mite,mite,south,,,Ceratozetes.gracilis,oob_prevalence,4,0.0533392883804503,0.0452752248602848,0.0645232647455575,,0.0544535429679295,0.0107814199736608 +mite,mite,south,,,Ceratozetes.gracilis,oob_n,5,869,338.4,883.6,0,695.6,389.193139713433 +mite,mite,south,,,Ceratozetes.gracilis,v2val_Climate,5,0.738382414749567,0.734358129806975,0.742005285315151,0.738382414749567,0.738111987253943,0.00384260421914782 +mite,mite,south,,,Ceratozetes.gracilis,v2val_Climate_Truncated,5,0.738392463572007,0.734342356311168,0.742026178178654,0.738392463572007,0.738117914905037,0.00385983439540224 +mite,mite,south,,,Ceratozetes.gracilis,v2val_Landcover,5,0.722020131552721,0.71607655717679,0.728899344516339,0.719697225125594,0.722583698825812,0.00643427629050986 +mite,mite,south,,,Ceratozetes.gracilis,v2val_Full,5,0.883740175681923,0.875951595662976,0.884218489485534,0.880842240129472,0.881127727799286,0.00491960965959818 +mite,mite,south,,,Ceratozetes.gracilis,v2val_Full_Truncated,5,0.883740175681923,0.875951595662976,0.884218489485534,0.880842240129472,0.881127727799286,0.00491960965959818 +mite,mite,south,,,Ceratozetes.gracilis,v2val_Full_Joint,5,0.883869625520111,0.877386169471364,0.884867266298163,0.880966991469706,0.88186690451822,0.00416238011000395 +mite,mite,south,,,Ceratozetes.gracilis,v2val_Full_Joint_Truncated,5,0.883869625520111,0.877386169471364,0.884867266298163,0.880966991469706,0.88186690451822,0.00416238011000395 +mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Climate,4,0.731027419469463,0.725410991997312,0.741834431700471,,0.732881199740483,0.00906851156052711 +mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Climate_Truncated,4,0.731045119285728,0.72540173801145,0.741842884282973,,0.732885970615359,0.00907305785634944 +mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Landcover,4,0.704830138651714,0.697578522816295,0.713165675388293,,0.705217253259271,0.00876901015163448 +mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Full,4,0.877556363090999,0.870858501486971,0.891246533596325,,0.880053616270034,0.0119804912573777 +mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Full_Truncated,4,0.877556363090999,0.870858501486971,0.891281973045494,,0.880066273216166,0.0120040417679418 +mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Full_Joint,4,0.87838605738981,0.870791888918913,0.892459363692493,,0.880700035186876,0.0128370905847578 +mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Full_Joint_Truncated,4,0.87838605738981,0.870791888918913,0.892494803141663,,0.880712692133008,0.012860350145155 +mite,mite,south,,,Trhypochthonius.tectorum,insample_auc,5,0.714545787058589,0.69969622945697,0.724109648011322,0.705313075635924,0.712537633834069,0.0121603195766141 +mite,mite,south,,,Trhypochthonius.tectorum,insample_deviance_explained,5,-2.20551740843788e-05,-0.00644243886806564,0.0163984110082346,0.01492775208855,0.00397390748081414,0.0114643898167834 +mite,mite,south,,,Trhypochthonius.tectorum,insample_rmse,5,0.269858367078513,0.266406986696229,0.272808873150662,0.270464873051431,0.269513931566532,0.00330133552867803 +mite,mite,south,,,Trhypochthonius.tectorum,insample_spearman,5,0.210611679646456,0.189085620295154,0.213764285932634,0.196610759018781,0.203586560421865,0.0130220945300142 +mite,mite,south,,,Trhypochthonius.tectorum,insample_calibration_slope,5,0.964366086336983,0.916309849664698,0.989356334697425,0.964366086336983,0.955309012900657,0.0368054765299321 +mite,mite,south,,,Trhypochthonius.tectorum,insample_prevalence,5,0.0833685992382565,0.0807473443243282,0.0863035095821866,0.0833685992382565,0.083401335320589,0.00299510185415199 +mite,mite,south,,,Trhypochthonius.tectorum,insample_n,5,1489,1484.4,2017.4,2363,1664.2,390.68875079787 +mite,mite,south,,,Trhypochthonius.tectorum,oob_auc,4,0.669707753515078,0.654014549095664,0.683226886999099,,0.66893129960958,0.0157013541907933 +mite,mite,south,,,Trhypochthonius.tectorum,oob_deviance_explained,4,0.0238861350837344,-0.00501344344448882,0.0319775842734965,,0.0164546603199983,0.0222551548342608 +mite,mite,south,,,Trhypochthonius.tectorum,oob_rmse,4,0.275344693909917,0.2660800590245,0.279902566485838,,0.273663707370811,0.00770431969533571 +mite,mite,south,,,Trhypochthonius.tectorum,oob_spearman,4,0.16338068295489,0.142721241028181,0.180002438567577,,0.161938652128453,0.0200563721519488 +mite,mite,south,,,Trhypochthonius.tectorum,oob_calibration_slope,4,0.640530845430618,0.577798461860074,0.822553046730012,,0.68313435176235,0.143050298074835 +mite,mite,south,,,Trhypochthonius.tectorum,oob_prevalence,4,0.0842873358196854,0.0775201528145626,0.0881856815952926,,0.0832627510948584,0.00595703320150957 +mite,mite,south,,,Trhypochthonius.tectorum,oob_n,5,874,345.6,878.6,0,698.8,390.68875079787 +mite,mite,south,,,Trhypochthonius.tectorum,v2val_Climate,5,0.646091585413555,0.643946189711462,0.652343816700896,0.646091585413555,0.647435005669506,0.00501081050104212 +mite,mite,south,,,Trhypochthonius.tectorum,v2val_Climate_Truncated,5,0.646095557008706,0.643948358640746,0.65233771826661,0.646095557008706,0.647436539502018,0.00500120525659027 +mite,mite,south,,,Trhypochthonius.tectorum,v2val_Landcover,5,0.671864124042916,0.659898184775652,0.684374697179488,0.660231262098608,0.671375041215641,0.0130121969567772 +mite,mite,south,,,Trhypochthonius.tectorum,v2val_Full,5,0.714545787058589,0.69969622945697,0.724109648011322,0.705313075635924,0.712537633834069,0.0121603195766141 +mite,mite,south,,,Trhypochthonius.tectorum,v2val_Full_Truncated,5,0.714545787058589,0.69969622945697,0.724109648011322,0.705313075635924,0.712537633834069,0.0121603195766141 +mite,mite,south,,,Trhypochthonius.tectorum,v2val_Full_Joint,5,0.714906009620713,0.700143210072346,0.72490193539616,0.705786473932628,0.713089166909465,0.012325737475379 +mite,mite,south,,,Trhypochthonius.tectorum,v2val_Full_Joint_Truncated,5,0.714906009620713,0.700143210072346,0.72490193539616,0.705786473932628,0.713089166909465,0.012325737475379 +mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Climate,4,0.637448091750764,0.62319195321542,0.64083947116042,,0.633567820634447,0.0109633746747622 +mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Climate_Truncated,4,0.637447116712891,0.623191511787853,0.640852747518307,,0.633572125955883,0.0109617111390789 +mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Landcover,4,0.613895073569526,0.611766319340838,0.647057552774624,,0.624978546775387,0.0240120090979382 +mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Full,4,0.669707753515078,0.654014549095664,0.683226886999099,,0.66893129960958,0.0157013541907933 +mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Full_Truncated,4,0.669707753515078,0.654014549095664,0.683226886999099,,0.66893129960958,0.0157013541907933 +mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Full_Joint,4,0.670252865183779,0.654581402849557,0.683544630202293,,0.669402973285312,0.0155825833517288 +mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Full_Joint_Truncated,4,0.670252865183779,0.654581402849557,0.683544630202293,,0.669402973285312,0.0155825833517288 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_auc,5,0.830322798090827,0.829752014715758,0.833521610487142,0.830322798090827,0.831256480687861,0.00210224952478856 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_deviance_explained,5,0.169049735433044,0.156535489819263,0.180380243811949,0.172184312829234,0.16845440325201,0.01233664255535 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_rmse,5,0.406331801158912,0.404646760463192,0.406711203597052,0.406706951792596,0.405904427434075,0.00126412825140784 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_spearman,5,0.564448272444098,0.564022722895439,0.568538539772008,0.564448272444098,0.565752949420103,0.002625462296498 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_calibration_slope,5,0.979847210350883,0.969126982244339,0.991954887525608,0.979847210350883,0.980520168665477,0.0114519899974685 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_prevalence,5,0.418242653476869,0.411391418988775,0.421189975169674,0.418242653476869,0.416870814782784,0.00501851999449775 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_n,5,4366,4320.2,5874.4,6874,4851.6,1130.83522230252 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_auc,4,0.825970385744679,0.820899166013025,0.829858683383589,,0.825547913568699,0.00483682169731863 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_deviance_explained,4,0.180338934815369,0.153363367618616,0.193673751289778,,0.175467238128817,0.0239800671027935 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_rmse,4,0.409024585589369,0.407545829323972,0.412796643199926,,0.409843621784069,0.00304952623195646 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_spearman,4,0.556036446141893,0.549781718602555,0.564239538039467,,0.556732290555549,0.00779665231289283 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_calibration_slope,4,0.961989811631539,0.953282864779601,0.97698898933143,,0.964237036934379,0.0130331463165358 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_prevalence,4,0.419241311741466,0.413108455574493,0.430771977433407,,0.421169100857526,0.00978800188867454 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_n,5,2508,999.6,2553.8,0,2022.4,1130.83522230252 +vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Climate,5,0.688882537608652,0.686220497467121,0.693315342224415,0.691923775211569,0.689606019273988,0.00355153250685828 +vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Climate_Truncated,5,0.688853782361867,0.686211230349888,0.693311107621612,0.691928871889894,0.689595671925047,0.00355473297057612 +vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Landcover,5,0.806658535413912,0.804749026795703,0.81034804923884,0.804887352272851,0.807185726647177,0.00308448997445622 +vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Full,5,0.830322798090827,0.829752014715758,0.833521610487142,0.830322798090827,0.831256480687861,0.00210224952478856 +vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Full_Truncated,5,0.830433260489035,0.829860825639713,0.833584571804586,0.830433260489035,0.83134635595991,0.00208467504714064 +vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Full_Joint,5,0.82780564706394,0.827522559630011,0.831849313017971,0.82780564706394,0.829181386915621,0.00243189954325233 +vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Full_Joint_Truncated,5,0.827924459375713,0.827636541171172,0.831943133083281,0.827924459375713,0.829288457143518,0.0024223441955198 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Climate,4,0.69847723797285,0.691752649872066,0.699715919161363,,0.696517985504182,0.00490694367651728 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Climate_Truncated,4,0.698467309951771,0.691745994349179,0.699715497383917,,0.696512621319469,0.0049068149193327 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Landcover,4,0.798538423391199,0.793813753185317,0.801044488836154,,0.797746064548011,0.0039851186104012 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Full,4,0.825970385744679,0.820899166013025,0.829858683383589,,0.825547913568699,0.00483682169731863 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Full_Truncated,4,0.826084368160094,0.821025133464921,0.829955751376353,,0.825660135489053,0.00481955559769384 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Full_Joint,4,0.822407455245542,0.816503165651276,0.825556259025818,,0.821423353169117,0.00501007923907512 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Full_Joint_Truncated,4,0.822548387109745,0.816621603632805,0.825661726608092,,0.821543585688819,0.00501141542481554 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_auc,5,0.836315133959189,0.831991084674704,0.837528607951877,0.834425701496386,0.835217103556636,0.00298930683727749 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_deviance_explained,5,0.154953219466334,0.129409063699085,0.172774430677382,0.160280734393984,0.151845840183807,0.0222292641700649 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_rmse,5,0.397835953480652,0.39520050591856,0.39953977885822,0.397892542228527,0.397399168674453,0.00225088132355584 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_spearman,5,0.565718307196976,0.558075214292711,0.566158340164243,0.561646901356684,0.563051440283389,0.00452676813056749 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_calibration_slope,5,1.00378490707536,0.996670213069317,1.00931321625889,1.00546871573532,1.00306243102853,0.00640638209817766 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_prevalence,5,0.377654931626418,0.37492184315556,0.38072781584232,0.377654931626418,0.377957278345016,0.00308047552556824 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_n,5,4329,4315.8,5874,6874,4842.2,1136.06104589498 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_auc,4,0.829938952959948,0.828125419425383,0.835304874971869,,0.831207663130432,0.00415809140956838 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_deviance_explained,4,0.177626825486026,0.135153586377154,0.21154877519812,,0.174572793558605,0.0427317407176602 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_rmse,4,0.400006137187779,0.39713029702198,0.40231573999719,,0.399803909560497,0.0030220247869821 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_spearman,4,0.554463344935879,0.551184680243305,0.562068414950895,,0.556008489693894,0.00617058608931537 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_calibration_slope,4,0.988524116774644,0.97389136931948,1.00993315311349,,0.990944219947388,0.0195740205696745 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_prevalence,4,0.375247544204322,0.372430611979277,0.382966913772923,,0.376998414684163,0.00599903919350225 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_n,5,2545,1000,2558.2,0,2031.8,1136.06104589498 +vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Climate,5,0.688388374288585,0.686629323150551,0.697141250977293,0.688388374288585,0.69087203080297,0.00615433602729216 +vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Climate_Truncated,5,0.688377053340582,0.686621028690138,0.697132635984666,0.688377053340582,0.690862704228311,0.00615461616566359 +vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Landcover,5,0.812599770966484,0.806923106797722,0.814411627611935,0.809938249660894,0.811141578894183,0.00400693028240299 +vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Full,5,0.836315133959189,0.831991084674704,0.837528607951877,0.834425701496386,0.835217103556636,0.00298930683727749 +vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Full_Truncated,5,0.836225603913632,0.831944005617998,0.837453646171789,0.834353666337466,0.835150674964538,0.0029708276538074 +vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Full_Joint,5,0.836242738307649,0.831840647476923,0.837075962254889,0.833795663987679,0.834913342412997,0.00279108797567405 +vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Full_Joint_Truncated,5,0.836167732781523,0.831822036390158,0.836995692851111,0.833746590035665,0.834858253988271,0.00275653331501612 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Climate,4,0.687058088763642,0.673058403439112,0.691946304395709,,0.683803992444905,0.0115178096712181 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Climate_Truncated,4,0.687038471404578,0.673051662415016,0.691940326726772,,0.683793845094804,0.0115133321710675 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Landcover,4,0.807847376592108,0.801759141298583,0.811699920923116,,0.807048915534066,0.00558077270332568 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Full,4,0.829938952959948,0.828125419425383,0.835304874971869,,0.831207663130432,0.00415809140956838 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Full_Truncated,4,0.829888329553378,0.828175765215782,0.835181080251946,,0.831166967539439,0.00409066773151742 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Full_Joint,4,0.828971535109331,0.826291764196716,0.83479597749998,,0.830094632065772,0.00475621189002634 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Full_Joint_Truncated,4,0.828915617285276,0.826336395712055,0.834689140179746,,0.830056439185722,0.00469352433889885 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_auc,5,0.890081979393699,0.886120541286867,0.900531693288428,0.890081979393699,0.8925816929913,0.0074671519015807 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_deviance_explained,5,0.376511843709018,0.359648245967408,0.39273006526476,0.36183949121173,0.375558492410363,0.0170745413457127 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_rmse,5,0.308360864442848,0.306833389069796,0.315704381717812,0.312233283277407,0.31046772667452,0.00475923236811526 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_spearman,5,0.561632279820523,0.56034731464871,0.575734647134824,0.561632279820523,0.565885670838601,0.0104854350954813 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_calibration_slope,5,0.980281716931255,0.970651842047086,0.998280590750127,0.982887664309838,0.982912614118871,0.0154729818019227 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_prevalence,5,0.222088835534214,0.217190546592102,0.228625506806496,0.222054380664653,0.222881775063893,0.00607679419012681 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_n,5,1692,1666,2267.2,2648,1873.6,433.131388841769 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_auc,4,0.884065848019888,0.870449780280702,0.894068384737495,,0.882775301226467,0.0128406847119162 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_deviance_explained,4,0.334099694985671,0.299899048318077,0.344909076796622,,0.325745671822584,0.0279649666452476 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_rmse,4,0.322280229393816,0.311448708149722,0.324570568538386,,0.319229807215414,0.0080667999016699 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_spearman,4,0.558011118128369,0.532461517776284,0.559103143514103,,0.549276269926101,0.0182973871982467 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_calibration_slope,4,0.947730194323529,0.912734464703454,0.971381900858514,,0.943678757507426,0.0317919329981155 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_prevalence,4,0.218666030567013,0.210018355611084,0.23207994955219,,0.220368260577459,0.0121728164316861 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_n,5,956,380.8,982,0,774.4,433.131388841769 +vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Climate,5,0.688882537608652,0.686220497467121,0.693315342224415,0.691923775211569,0.689606019273988,0.00355153250685828 +vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Climate_Truncated,5,0.688853782361867,0.686211230349888,0.693311107621612,0.691928871889894,0.689595671925047,0.00355473297057612 +vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Landcover,5,0.795978634172116,0.790420342908561,0.808241109353126,0.795978634172116,0.79826909072766,0.00925670982213445 +vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Full,5,0.890081979393699,0.886120541286867,0.900531693288428,0.890081979393699,0.8925816929913,0.0074671519015807 +vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Full_Truncated,5,0.890081979393699,0.886107519131847,0.900531693288428,0.890081979393699,0.892577213245043,0.00747321026543204 +vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Full_Joint,5,0.885428136469803,0.879749497228007,0.894203850953663,0.88338493164256,0.886730028942607,0.00724717960067507 +vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Full_Joint_Truncated,5,0.885423965632299,0.87972024605796,0.894203850953663,0.88338493164256,0.886719444385091,0.00726319634118945 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Climate,4,0.69847723797285,0.691752649872066,0.699715919161363,,0.696517985504182,0.00490694367651728 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Climate_Truncated,4,0.698467309951771,0.691745994349179,0.699715497383917,,0.696512621319469,0.0049068149193327 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Landcover,4,0.785174421252252,0.769559195023864,0.799812878397794,,0.784825575151236,0.016225503840661 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Full,4,0.884065848019888,0.870449780280702,0.894068384737495,,0.882775301226467,0.0128406847119162 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Full_Truncated,4,0.884061344921756,0.870449780280702,0.894063477626334,,0.882772262087301,0.0128382393423392 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Full_Joint,4,0.873729773605152,0.862934967954651,0.88650495339372,,0.874437050083033,0.0129679425986572 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Full_Joint_Truncated,4,0.873725270507021,0.862934967954651,0.886486814768876,,0.874429285403265,0.0129581962884508 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_auc,5,0.805930865573238,0.802524114144756,0.807930971919586,0.808012980346143,0.805492289441972,0.00279684596223116 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_deviance_explained,5,0.166618669672263,0.15835736048416,0.197983766968233,0.179903957587885,0.174785331031235,0.0215605448558036 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_rmse,5,0.381878187765555,0.378497935845721,0.383275373980955,0.380313032587985,0.381159180017538,0.00249488775218777 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_spearman,5,0.465238638302507,0.460583361067045,0.473614426763325,0.470529100145484,0.466694650560087,0.00654368164273618 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_calibration_slope,5,0.933688472158773,0.920475046205582,0.947214542702693,0.933688472158773,0.933156328591101,0.0138732265313946 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_prevalence,5,0.264350453172205,0.25911663216011,0.270295509723619,0.264350453172205,0.264443478235907,0.00620048832939598 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_n,5,1685,1649.4,2266.4,2648,1865.6,437.838212128635 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_auc,4,0.807298000134658,0.803023991535991,0.814183808910683,,0.808230785912286,0.0060785023634324 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_deviance_explained,4,0.201855986026952,0.138430007183509,0.206184030963771,,0.180749581060301,0.0455406997595895 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_rmse,4,0.37987633843542,0.378039277925496,0.38526074563498,,0.381143247967433,0.00422553209428043 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_spearman,4,0.471049244528984,0.458945127185501,0.481459447588745,,0.47044427514194,0.0124124270312768 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_calibration_slope,4,0.934673431866213,0.911850976434992,0.962640657947191,,0.936510849955412,0.0273611637238912 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_prevalence,4,0.266148052343275,0.252246321440467,0.273763588267456,,0.263902982708051,0.0122396324927964 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_n,5,963,381.6,998.6,0,782.4,437.838212128635 +vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Climate,5,0.688388374288585,0.686629323150551,0.697141250977293,0.688388374288585,0.69087203080297,0.00615433602729216 +vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Climate_Truncated,5,0.688377053340582,0.686621028690138,0.697132635984666,0.688377053340582,0.690862704228311,0.00615461616566359 +vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Landcover,5,0.761379244969105,0.759537679717784,0.765001614229777,0.76658587562335,0.762041460585166,0.00296099903341381 +vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Full,5,0.805930865573238,0.802524114144756,0.807930971919586,0.808012980346143,0.805492289441972,0.00279684596223116 +vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Full_Truncated,5,0.805930865573238,0.802524057680271,0.807932999886811,0.808015180404811,0.805493243742915,0.0027981951952029 +vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Full_Joint,5,0.802576290466739,0.799474271873651,0.804841725613092,0.804804561454972,0.802383816798592,0.00280990996220882 +vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Full_Joint_Truncated,5,0.802576290466739,0.799476478074435,0.804843080852285,0.804805294807862,0.802385231980135,0.00280955135311763 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Climate,4,0.687058088763642,0.673058403439112,0.691946304395709,,0.683803992444905,0.0115178096712181 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Climate_Truncated,4,0.687038471404578,0.673051662415016,0.691940326726772,,0.683793845094804,0.0115133321710675 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Landcover,4,0.774223898160634,0.769748999911181,0.777668369854279,,0.773855888676417,0.00434521003225348 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Full,4,0.807298000134658,0.803023991535991,0.814183808910683,,0.808230785912286,0.0060785023634324 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Full_Truncated,4,0.807292347351227,0.803023991535991,0.814176792476235,,0.808226664961859,0.00607512490581962 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Full_Joint,4,0.805961431482898,0.801581678357063,0.812743710082227,,0.80681947629486,0.00606828197945081 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Full_Joint_Truncated,4,0.805961431482898,0.801581678357063,0.812736460553446,,0.806816887177438,0.00606401787708264 diff --git a/README.md b/README.md index c6c4eb8..732a335 100644 --- a/README.md +++ b/README.md @@ -450,8 +450,6 @@ flowchart TD S07["07 v2 plant draws"] S09["09 harmonize lookups
manifest · species queue · bird grids"] S03["03 rerun bryophyte reference"] - S04["04 package bird coefficients"] - S05["05 harmonize v2 results"] S08["08 harmonize ABMIexploreR"] end @@ -463,9 +461,7 @@ flowchart TD VP --> S06 --> DS VP --> S07 --> DS DS --> S09 --> DS - VP --> S03 --> S05 - VP --> S04 --> S05 - S05 --> VR + VP --> S03 AX --> S08 --> VR %% ---------------------------- @@ -488,8 +484,6 @@ flowchart TD style S07 fill:#A3B4C7,stroke:#2D415B,stroke-width:1px style S09 fill:#A3B4C7,stroke:#2D415B,stroke-width:1px style S03 fill:#A3B4C7,stroke:#2D415B,stroke-width:1px - style S04 fill:#A3B4C7,stroke:#2D415B,stroke-width:1px - style S05 fill:#A3B4C7,stroke:#2D415B,stroke-width:1px style S08 fill:#A3B4C7,stroke:#2D415B,stroke-width:1px %% Products @@ -503,13 +497,11 @@ flowchart TD | `01_harmonize_model_ready_v2.R` | The `model_ready_v2` snapshot, the mammal camera climate, the WildTrax species lookup, the v2 prediction matrices, the bird `Stratified.Rdata` | `0_data/test_dataset/` | | `02_validate_test_dataset.R` | The test dataset and the same sources | Nothing; prints a pass / fail tally | | `03_rerun_bryophyte_v2_reference.R` | The v2 plant project's bryophyte data, and the frozen v2 functions | `2_pipeline/v2_reference/bryophyte-species-models.Rdata` | -| `04_package_bird_coefficients.R` (legacy) | The per-draw v2 bird coefficient CSVs | `2_pipeline/v2_reference/Birds2024.RData` | -| `05_harmonize_v2_results.R` (legacy) | v2 plant `COEFS.RData`, the mammal coefficient tables, `Birds2024.RData` | `0_data/v2_results/` | | `06_harmonize_bird_translation_lookup.R` | v2's bird `Xn-veg-v2024.Rdata` | `lookup/bird_veg_age_matrix.csv` | | `07_harmonize_v2_plant_bootstrap_ids.R` | v2's stored plant bootstrap draws | `lookup/v2_bootstrap_ids/` | | `08_harmonize_abmiexplorer_results.R` | ABMIexploreR's packaged coefficients | `0_data/v2_results/abmiexplorer/` | | `09_harmonize_lookups.R` | `0_data/test_dataset/lookup/` only (offline) | `species_queue.csv`, `factor_levels.csv`, `dataset_manifest.csv`, the bird prediction grids | -| `10_publish_datasets.R` | `0_data/test_dataset/`, `0_data/v2_results/` | A new `/` of each on ABMI-DATA2, with `checksums.csv` | +| `10_publish_datasets.R` | `0_data/test_dataset/`, `0_data/v2_results/abmiexplorer/` | A new `/` of each on ABMI-DATA2, with `checksums.csv` | - **`00`** copies every external file `_setup/` reads to `//ABMI-DATA2/science/sdmMethodsDev/0_data/setup_inputs/`, unchanged and @@ -529,18 +521,13 @@ flowchart TD shows up rather than cancelling out. It writes nothing. - **`03`** exists because the published bryophyte reference is unusable: every draw is an error object. It re-runs the frozen v2 functions - unmodified, climate stage only. -- **`04`** rebuilds the packaged bird output, absent from the bird drive. It - is v2's `08.PackageCoefficients.R` with only the paths changed. **`04` - and `05` are legacy:** parity is scored against `08`'s ABMIexploreR - build, which agrees with theirs to about 1e-15 on shared species. Their - output is kept and published frozen in `v2_results/`, and their inputs - (hours of Google Drive reads, and ~38 GB of bird model objects) are not - mirrored. -- **`05`** flattens the three v2 storage formats into one table. Mammal - results average the two seasons, as v2's `.all` tables do. - `Birds2024.RData` labels draws 2 to 100 in file-listing order (`b2` is draw - 10), a v2 packaging quirk: medians and bands are unaffected. + unmodified, climate stage only. Its rerun feeds `07`'s bryophyte draws + and exp_000's `v2_self_agreement.R`. +- There is no `04` or `05`. They compiled the v2 reference by hand from + the network drives and were removed once `08`'s ABMIexploreR build was + shown to agree with theirs to about 1e-15 on shared species. The + 2026-10-05 published `v2_results/` still holds their output at its top + level; nothing reads it. - **`06`** copies the matrix v2 uses to translate bird landcover coefficients onto the standardized habitat types. Re-run it whenever `01` rebuilds `lookup/`. @@ -548,7 +535,8 @@ flowchart TD fits exactly the rows v2 fitted. The sets are large (1.3 GB for vascular plants); `SDM_V2_BOOT_TAXA` and `SDM_V2_BOOT_SPECIES` restrict it. - **`08`** harmonizes ABMIexploreR's published coefficients, pinned to a - commit; exp_000 scores against this build by default. + commit, into the v2 reference exp_000 scores every run against. Mammal + results average the two seasons, as v2's `.all` tables do. - **`09`** writes one form of the lookups for every taxon: one species queue (the three taxon leads' lookups had three schemas), one factor-level table, the bird habitat grids, and `dataset_manifest.csv`, which names each @@ -605,7 +593,7 @@ sdmMethodsDev/ │ ├── 2_pipeline/ # result stores and intermediates; gitignored │ ├── /// # one result store per run and region -│ └── v2_reference/ # rebuilt v2 references, from _setup/03 and 04 +│ └── v2_reference/ # rerun bryophyte reference, from _setup/03 │ ├── 3_output/ # deliverables, per experiment; summaries committed │ └── / # tables/, figures/, report.md, run_record.md @@ -701,11 +689,10 @@ The published v2 results as one long table, so a run is scored against one file rather than three storage formats on two drives: `taxon`, `region`, `stage`, `part`, `season`, `species`, `species_v2`, `term`, `v2_median`, `v2_p10`, `v2_p90`, `v2_se`, `v2_n` and `source`. Plant climate is fitted once -province-wide in v2, so those rows carry `region = "all"`. Two builds share the -schema: `abmiexplorer/` (the published species, from `_setup/08`; exp_000's -default) and the network-drive build (every species v2 fitted, from -`_setup/05`). `v2_results_coverage.csv` records which source each part came -from. +province-wide in v2, so those rows carry `region = "all"`. The reference is +in `abmiexplorer/`, built by `_setup/08` from ABMI's published ABMIexploreR +coefficients, so it holds the published species only. +`v2_results_coverage.csv` records which source each part came from. ### `v2_scripts/` @@ -984,7 +971,8 @@ through each lever. plant-group taxon or on `birds/spec.R` or `mammals/spec.R` otherwise, and add its run to `modules/_shared/standard_specs.R`. If v2 does something no registered method covers, add one to `1_code/methods/`. -6. Add the taxon's published v2 results to `_setup/05`. +6. Add the taxon's published v2 results to `_setup/08`, if ABMIexploreR + publishes them. 7. Check that `validate_spec()` passes and `run_tests.R` runs clean, then check the result against the originals. Record every taxon-specific behaviour in `docs/taxon_quirks.md`. @@ -996,7 +984,7 @@ through each lever. | Experiments | `exp_NNN_short_description` | `exp_001_covariate_scale` | | Taxon slugs | As the data files name them | `vascular_plant`, `mite`, `bird` | | Module folders | Plural taxon name | `vascular_plants/`, `soil_mites/` | -| Setup scripts | `NN_` run order, in `1_code/_setup/` | `05_harmonize_v2_results.R` | +| Setup scripts | `NN_` run order, in `1_code/_setup/` | `08_harmonize_abmiexplorer_results.R` | An experiment's identifier is used verbatim in `1_code/experiments/`, `2_pipeline/` and `3_output/`. Soil mites use the data slug `mite`. @@ -1020,7 +1008,9 @@ in `_setup/` has to be run. Off the network, copy the published folders locally and set `SDM_TEST_DATASET` and `SDM_V2_RESULTS` to them. Rebuilding the dataset needs the same share, once per snapshot, from the -repository root: +repository root. `source("1_code/_setup/run.R")` runs the steps below in +order, with switches for each in its section 1.2 (`00`, `03` and `10` are off +by default), and logs timings to `2_pipeline/_setup/run_log.csv`. By hand: ```r source("1_code/_setup/01_harmonize_model_ready_v2.R") @@ -1038,8 +1028,7 @@ source("1_code/_setup/10_publish_datasets.R") ``` `00_mirror_setup_inputs.R` is run once, by someone who can reach the -original drives, and again only if a source changes. `04` and `05` are -legacy and need the original drives. +original drives, and again only if a source changes. Set these to read or write somewhere other than the default: @@ -1054,11 +1043,10 @@ Set these to read or write somewhere other than the default: | `SDM_MAMMAL_CLIMATE_PRED` | `01`, `02` | `All Species Climate Predictions.csv` | | `SDM_V2_LOOKUP` | `01` | The v2 folder holding the two plant prediction-matrix CSVs | | `SDM_WT_SPECIES` | `01` | `WildTrax Species Strings.RData` | -| `SDM_BIRD_DATA` | `01`, `02`, `04` | The bird `Stratified.Rdata` v2 was fitted on; mirrored from `work_abmi/1_projects/active/sdmMethodsDev/remote/birds_data_v2/` | -| `SDM_V2_PROJECT` | `03`, `05`, `07` | The v2 plant project (`VegetationModels`) | -| `SDM_V2_BIRD_ROOT` | `04`, `05`, `06` | The v2 bird project (`BirdModels`) | +| `SDM_BIRD_DATA` | `01`, `02` | The bird `Stratified.Rdata` v2 was fitted on; mirrored from `work_abmi/1_projects/active/sdmMethodsDev/remote/birds_data_v2/` | +| `SDM_V2_PROJECT` | `03`, `07` | The v2 plant project (`VegetationModels`) | +| `SDM_V2_BIRD_ROOT` | `06` | The v2 bird project (`BirdModels`) | | `SDM_V2_BIRD_LOOKUP` | `08` | The v2 bird `birdlist.csv` | -| `SDM_V2_MAMMAL_ROOT` | `05` | The v2 mammal habitat-modelling results for 2024 | ## Related resources diff --git a/docs/taxon_quirks.md b/docs/taxon_quirks.md index 4a2167f..fec697f 100644 --- a/docs/taxon_quirks.md +++ b/docs/taxon_quirks.md @@ -91,7 +91,7 @@ prediction for plants, and a calibrated probability for mammals. | Factor levels | `vegc` 22, `soilc` 17, `method` 4, `block` 60. Stored order matters, since a level absent from one bootstrap sample must not renumber the rest | OK. Until 2026-09-29 `method` was loaded as `method_veg` and `method_soil` and missed the lookup, so it fell back to alphabetical order with `1SPM` as reference instead of `PC`; `apply_factor_levels()` now follows the suffixes | | Column suffixes | Six columns arrive suffixed `_veg` or `_soil` and are rewritten by `term_map()` | OK | | No coordinates | 0 of 215,758 rows in `sites.csv` carry latitude or longitude | GAP blocks spatial resampling and every spatial term | -| Reference output | The packaged `Birds2024.RData` is absent from the drive. `_setup/04` rebuilds it from the per-draw CSVs, on the standardized term template, and `_setup/05` carries it into `v2_results.csv` | OK rebuilt and compared. `modules/birds/standardize.R` ports the translation onto the standardized template and reproduces the packaged values exactly. Note the package labels draws 2 to 100 in file-listing order (`b2` is draw 10) | +| Reference output | The packaged `Birds2024.RData` is absent from the drive's `Results/`; only the per-draw CSVs and an archived copy survive. The parity reference is ABMIexploreR's packaged bird coefficients (`_setup/08`), which match it to ~1e-15 | OK compared. `modules/birds/standardize.R` ports the translation onto the standardized template and reproduces the packaged values exactly. Note the package labels draws 2 to 100 in file-listing order (`b2` is draw 10) | **The published bird results come from a different data vintage.** Run on the current `Stratified.Rdata`, v2's own climate code gives @@ -108,7 +108,7 @@ check: | Date | On the bird drive | | --- | --- | -| 2025-12-12 / 15 | Per-draw climate and landcover csvs in `Results/Archive/`, the reference `_setup/04` packages | +| 2025-12-12 / 15 | Per-draw climate and landcover csvs in `Results/Archive/`, packaged by v2's `08.PackageCoefficients.R` | | 2026-01-16 | `Results/Archive/Birds2024.RData`, packaged from them | | 2026-02 to 03 | New WildTrax pulls; `Data/Archive/2025/Wrangled.Rdata` rebuilt | | 2026-08-19 | `Data/Archive/2025/Stratified.Rdata` rebuilt, in place | @@ -122,7 +122,7 @@ only to 40%. The published results were fitted on a **Resolved 2026-10-02.** A copy of the pre-rebuild file was recovered and is kept at `work_abmi/1_projects/active/sdmMethodsDev/remote/birds_data_v2/Stratified.Rdata`, -which `SDM_BIRD_DATA` now defaults to in `_setup/01`, `02` and `04`. +which `SDM_BIRD_DATA` now defaults to in `_setup/01` and `02`. Its draws hold 58,210 surveys (the rebuilt file's hold 58,035), and v2's own climate code run on it reproduces the published AMRO draw-1 coefficients to 2e-15. With the test dataset re-harmonized from it, @@ -237,9 +237,10 @@ plant taxa hold 100. Both sit upstream of the modelling, so the file cannot be salvaged, only regenerated. `1_code/_setup/03_rerun_bryophyte_v2_reference.R` does that for the climate stage, and has been run: 134 of 134 species, 100 draws each, -no failures. Separately, v2's `COEFS.RData` holds complete bryophyte -arrays, and `_setup/05` builds the bryophyte rows of `v2_results.csv` -from it. The gate reads neither yet, so bryophytes are not compared. +no failures. Separately, ABMIexploreR publishes complete bryophyte +arrays (matching v2's `COEFS.RData` to ~1e-15), and `_setup/08` builds +the bryophyte rows of `v2_results.csv` from them, so the gate compares +bryophytes. ## Shared across all three From a45a17d4779ebe1138d69a360de8ffe9bc8ef7f6 Mon Sep 17 00:00:00 2001 From: bgcasey Date: Tue, 6 Oct 2026 05:23:22 -0600 Subject: [PATCH 10/16] Update README and getting_started documentation for comparison metrics - Changed references from `comparison_*.csv` to `comparison_metrics.csv` in README.md to clarify the output files generated during experiments. - Enhanced descriptions of the comparison metrics in README.md, including details about the data contained in `comparison_metrics.csv`. - Updated the getting_started.md to reflect the changes in output files and provide clearer instructions on how to interpret the comparison results. --- .gitignore | 2 - 1_code/experiments/_template/README.md | 7 +- 1_code/experiments/_template/run.R | 4 +- .../exp_000_parity_v2/01_compare_to_v2.R | 2 +- .../exp_000_parity_v2/v2_self_agreement.R | 8 +- 1_code/experiments/exp_001_xgboost/README.md | 2 - 1_code/experiments/exp_001_xgboost/run.R | 4 +- .../experiments/exp_002_soilgrids/README.md | 4 +- 1_code/experiments/exp_002_soilgrids/run.R | 4 +- 1_code/harness/compare.R | 72 +- 1_code/harness/experiment.R | 8 +- 1_code/harness/summarise.R | 49 +- 1_code/tests/testthat/test-results.R | 12 +- 3_output/exp_000_parity_v2/.gitkeep | 1 - 3_output/exp_000_parity_v2/figures/.gitkeep | 1 - 3_output/exp_000_parity_v2/report.md | 159 --- 3_output/exp_000_parity_v2/run_record.md | 365 ------- 3_output/exp_000_parity_v2/tables/.gitkeep | 1 - .../exp_000_parity_v2/tables/coverage.csv | 15 - .../exp_000_parity_v2/tables/grid_summary.csv | 945 ------------------ .../tables/metric_summary.csv | 617 ------------ .../tables/parity_summary.csv | 23 - .../tables/v2_self_agreement_summary.csv | 2 - 3_output/exp_001_xgboost/run_record.md | 253 ----- .../tables/comparison_grid.csv | 29 - .../tables/comparison_summary.csv | 71 -- 3_output/exp_001_xgboost/tables/coverage.csv | 15 - .../exp_001_xgboost/tables/grid_summary.csv | 945 ------------------ .../exp_001_xgboost/tables/metric_summary.csv | 393 -------- 3_output/exp_002_soilgrids/run_record.md | 193 ---- .../tables/comparison_grid.csv | 21 - .../tables/comparison_summary.csv | 51 - .../exp_002_soilgrids/tables/coverage.csv | 11 - .../exp_002_soilgrids/tables/grid_summary.csv | 685 ------------- .../tables/metric_summary.csv | 281 ------ README.md | 42 +- docs/getting_started.md | 14 +- 37 files changed, 93 insertions(+), 5218 deletions(-) delete mode 100644 3_output/exp_000_parity_v2/.gitkeep delete mode 100644 3_output/exp_000_parity_v2/figures/.gitkeep delete mode 100644 3_output/exp_000_parity_v2/report.md delete mode 100644 3_output/exp_000_parity_v2/run_record.md delete mode 100644 3_output/exp_000_parity_v2/tables/.gitkeep delete mode 100644 3_output/exp_000_parity_v2/tables/coverage.csv delete mode 100644 3_output/exp_000_parity_v2/tables/grid_summary.csv delete mode 100644 3_output/exp_000_parity_v2/tables/metric_summary.csv delete mode 100644 3_output/exp_000_parity_v2/tables/parity_summary.csv delete mode 100644 3_output/exp_000_parity_v2/tables/v2_self_agreement_summary.csv delete mode 100644 3_output/exp_001_xgboost/run_record.md delete mode 100644 3_output/exp_001_xgboost/tables/comparison_grid.csv delete mode 100644 3_output/exp_001_xgboost/tables/comparison_summary.csv delete mode 100644 3_output/exp_001_xgboost/tables/coverage.csv delete mode 100644 3_output/exp_001_xgboost/tables/grid_summary.csv delete mode 100644 3_output/exp_001_xgboost/tables/metric_summary.csv delete mode 100644 3_output/exp_002_soilgrids/run_record.md delete mode 100644 3_output/exp_002_soilgrids/tables/comparison_grid.csv delete mode 100644 3_output/exp_002_soilgrids/tables/comparison_summary.csv delete mode 100644 3_output/exp_002_soilgrids/tables/coverage.csv delete mode 100644 3_output/exp_002_soilgrids/tables/grid_summary.csv delete mode 100644 3_output/exp_002_soilgrids/tables/metric_summary.csv diff --git a/.gitignore b/.gitignore index 17d71bf..3b432fd 100644 --- a/.gitignore +++ b/.gitignore @@ -67,8 +67,6 @@ vignettes/*.pdf !3_output/**/tables/coverage.csv !3_output/**/tables/metric_summary.csv !3_output/**/tables/grid_summary.csv -!3_output/**/tables/comparison_summary.csv -!3_output/**/tables/comparison_grid.csv !3_output/**/tables/v2_self_agreement_summary.csv AGENTS.md diff --git a/1_code/experiments/_template/README.md b/1_code/experiments/_template/README.md index 6c09659..5ab9715 100644 --- a/1_code/experiments/_template/README.md +++ b/1_code/experiments/_template/README.md @@ -19,14 +19,13 @@ One sentence: what does this experiment ask? ## How to read the result Every experiment is compared with the v2 baseline (exp_000): -`run_experiment()` writes three comparison tables to -`3_output//tables/`: +`run_experiment()` prints the headline per taxon, region and +metric (median difference, and the share of species that did +better), and writes one comparison table to `3_output//tables/`: | File | One row per | Read it for | | --- | --- | --- | -| `comparison_summary.csv` | taxon, region and metric | The headline: median difference, and the share of species that did better | | `comparison_metrics.csv` | species and metric | Which species moved, with both runs' 10-90% bands | -| `comparison_grid.csv` | species | Whether habitat effects moved: rank correlation and absolute difference on the prediction grid | The metrics are out-of-bag: each draw scored on the survey units it left out. "Better" is higher AUC, deviance explained and Spearman, diff --git a/1_code/experiments/_template/run.R b/1_code/experiments/_template/run.R index 112b1ef..502440b 100644 --- a/1_code/experiments/_template/run.R +++ b/1_code/experiments/_template/run.R @@ -9,7 +9,7 @@ # in 2_pipeline/exp_NNN_short_description/: # - // result stores, and run_log.csv # in 3_output/exp_NNN_short_description/: -# - tables/ (summaries, and comparison_*.csv against the +# - tables/ (summaries, and comparison_metrics.csv against the # baseline), run_record.md # notes: # - Copy this folder to 1_code/experiments/exp_NNN_*/, set `id` @@ -71,7 +71,7 @@ config <- experiment_config( # 2. Run ---- # Fit, summarize, and compare with the v2 baseline (exp_000); # every experiment is compared with it. The comparison is -# written to tables/comparison_*.csv. Add `steps` for anything +# written to tables/comparison_metrics.csv. Add `steps` for anything # this experiment needs beyond that. results <- run_experiment( config, diff --git a/1_code/experiments/exp_000_parity_v2/01_compare_to_v2.R b/1_code/experiments/exp_000_parity_v2/01_compare_to_v2.R index d9fc132..6673367 100644 --- a/1_code/experiments/exp_000_parity_v2/01_compare_to_v2.R +++ b/1_code/experiments/exp_000_parity_v2/01_compare_to_v2.R @@ -236,7 +236,7 @@ if (!is.null(run_coefficients)) { keys <- c("taxon", "group", "region", "ref_region", "stage", "ref_part", "species", "term") - values <- c("n", "median", "p10", "p90", "boot1") + values <- c("n", "median", "p10", "p90", "boot1", "mean", "sd") averaged <- stats::aggregate( mammals[, values], diff --git a/1_code/experiments/exp_000_parity_v2/v2_self_agreement.R b/1_code/experiments/exp_000_parity_v2/v2_self_agreement.R index d7d0a10..ef5bdfb 100644 --- a/1_code/experiments/exp_000_parity_v2/v2_self_agreement.R +++ b/1_code/experiments/exp_000_parity_v2/v2_self_agreement.R @@ -102,7 +102,13 @@ rerun_summary <- rbindlist(lapply(names(rerun), function(species) { species = species, term = term, rerun_median = stats::median(values), rerun_p10 = stats::quantile(values, 0.1, names = FALSE), - rerun_p90 = stats::quantile(values, 0.9, names = FALSE) + rerun_p90 = stats::quantile(values, 0.9, names = FALSE), + rerun_mean = mean(values), + rerun_sd = if (length(values) < 2) { + NA_real_ + } else { + stats::sd(values) + } ) })) })) diff --git a/1_code/experiments/exp_001_xgboost/README.md b/1_code/experiments/exp_001_xgboost/README.md index e52ae9b..13ed3cc 100644 --- a/1_code/experiments/exp_001_xgboost/README.md +++ b/1_code/experiments/exp_001_xgboost/README.md @@ -64,9 +64,7 @@ against are from a 100-draw run of the same species. | File | Read it for | | --- | --- | -| `comparison_summary.csv` | Per taxon, region (and mammal season) and metric: the median difference from exp_000, and the share of species that did better | | `comparison_metrics.csv` | Per species, both runs' out-of-bag metrics and 10–90% bands | -| `comparison_grid.csv` | Whether the habitat effects moved: rank correlation and absolute difference on the habitat grid | Out-of-bag metrics score each draw on the survey units it left out, which matters here: a tree fits the units it trained on far more closely than a diff --git a/1_code/experiments/exp_001_xgboost/run.R b/1_code/experiments/exp_001_xgboost/run.R index 6abb482..3de2869 100644 --- a/1_code/experiments/exp_001_xgboost/run.R +++ b/1_code/experiments/exp_001_xgboost/run.R @@ -9,7 +9,7 @@ # in 2_pipeline/exp_001_xgboost/: # - // result stores, and run_log.csv # in 3_output/exp_001_xgboost/: -# - tables/ (summaries, and comparison_*.csv against +# - tables/ (summaries, and comparison_metrics.csv against # exp_000), run_record.md # notes: # - A test experiment: does a boosted regression tree fit the @@ -71,7 +71,7 @@ config <- experiment_config( # 2. Run ---- # Fit, summarize, and compare with exp_000; every experiment is # compared with it. The comparison is written to -# tables/comparison_*.csv. +# tables/comparison_metrics.csv. results <- run_experiment(config) # End of script ---- diff --git a/1_code/experiments/exp_002_soilgrids/README.md b/1_code/experiments/exp_002_soilgrids/README.md index dc6cee1..c4a9e1d 100644 --- a/1_code/experiments/exp_002_soilgrids/README.md +++ b/1_code/experiments/exp_002_soilgrids/README.md @@ -81,9 +81,7 @@ again. ## How to read the result Every experiment is compared with exp_000; see -`3_output/exp_002_soilgrids/tables/comparison_*.csv`. The habitat effects on -the grid (`comparison_grid.csv`) show whether adding soil to the climate stage -moved the habitat estimates through the carried `Climate` term. +`3_output/exp_002_soilgrids/tables/comparison_metrics.csv`. ## Assumptions and caveats diff --git a/1_code/experiments/exp_002_soilgrids/run.R b/1_code/experiments/exp_002_soilgrids/run.R index 2fcfc90..4a5a328 100644 --- a/1_code/experiments/exp_002_soilgrids/run.R +++ b/1_code/experiments/exp_002_soilgrids/run.R @@ -12,7 +12,7 @@ # in 2_pipeline/exp_002_soilgrids/: # - // result stores, and run_log.csv # in 3_output/exp_002_soilgrids/: -# - tables/ (summaries, and comparison_*.csv against +# - tables/ (summaries, and comparison_metrics.csv against # exp_000), run_record.md # notes: # - A test experiment: does adding near-surface soil properties @@ -95,7 +95,7 @@ config <- experiment_config( # 2. Run ---- # Fit, summarize, and compare with exp_000; every experiment is # compared with it. The comparison is written to -# tables/comparison_*.csv. +# tables/comparison_metrics.csv. results <- run_experiment( config, translate = list(bird = bird_habitat_translation) diff --git a/1_code/harness/compare.R b/1_code/harness/compare.R index 171c6dc..7d4a644 100644 --- a/1_code/harness/compare.R +++ b/1_code/harness/compare.R @@ -4,27 +4,22 @@ # created: 2026-10-03 # inputs: # in each experiment's out_dir/tables/: -# - metric_summary.csv, grid_summary.csv (collect_results()) +# - metric_summary.csv (collect_results()) # outputs: # in the candidate's out_dir/tables/: # - comparison_metrics.csv: one row per species and metric -# - comparison_summary.csv: one row per taxon, region, metric -# - comparison_grid.csv: one row per species, grid agreement +# the per-taxon, region and metric summary is returned (and +# printed by run_experiment()) but not written # notes: # - Every experiment after exp_000 asks the same thing: did the # change do better or worse than the v2 baseline? This answers # it the same way for any method, from the two experiments' # summary tables, so a new experiment needs one call. -# - Two currencies, both engine-agnostic: -# - Model fit: the out-of-bag metrics, which score each draw -# on the units it left out. In-sample metrics flatter a -# flexible method, so they are not the default. -# - Habitat effects: the grid predictions, one per habitat -# type, compared by rank correlation and absolute -# difference. A GLM and a boosted tree both have these; -# only one has coefficients. +# - Model fit is compared on the out-of-bag metrics, which +# score each draw on the units it left out. In-sample metrics +# flatter a flexible method, so they are not the default. # - Rows are matched on taxon, region, season, part, species -# and metric (or grid unit), so two experiments that name +# and metric, so two experiments that name # their runs differently still line up. # - "Better" depends on the metric: higher AUC, deviance # explained and Spearman; lower RMSE; a calibration slope @@ -75,9 +70,10 @@ better_direction <- function(metric) { #' 3_output/exp_000_parity_v2. #' @param metrics Character vector of metrics to compare, or NULL #' for the out-of-bag fit metrics. -#' @param write Logical. Write the three tables to -#' `candidate_dir/tables/`. -#' @return A list of data frames: `metrics`, `summary` and `grid`. +#' @param write Logical. Write `metrics` to +#' `candidate_dir/tables/comparison_metrics.csv`. +#' @return A list of data frames: `metrics` (per species) and +#' `summary` (per taxon, region and metric). #' #' @example # Example usage of the function #' # compare_experiments("3_output/exp_001_brt", @@ -179,53 +175,19 @@ compare_experiments <- function( ) } - # Step 3: Habitat effects on the grid, per species - grid_candidate <- read_summary(candidate_dir, "grid_summary") - grid_baseline <- read_summary(baseline_dir, "grid_summary") - grid <- NULL - - if (!is.null(grid_candidate) && !is.null(grid_baseline)) { - grid_joined <- merge( - grid_baseline[, c(keys, "grid_unit", "median"), with = FALSE], - grid_candidate[, c(keys, "grid_unit", "median"), with = FALSE], - by = c(keys, "grid_unit"), - suffixes = c("_baseline", "_candidate") - ) - - grid <- grid_joined[, list( - grid_units = .N, - spearman = if (.N >= 3) { - suppressWarnings(stats::cor( - median_baseline, median_candidate, method = "spearman" - )) - } else { - NA_real_ - }, - median_absolute_difference = stats::median( - abs(median_candidate - median_baseline), na.rm = TRUE - ) - ), by = keys] - } - out <- list( metrics = as.data.frame(joined), - summary = as.data.frame(summary), - grid = if (is.null(grid)) NULL else as.data.frame(grid) + summary = as.data.frame(summary) ) if (write) { tables_dir <- file.path(candidate_dir, "tables") dir.create(tables_dir, recursive = TRUE, showWarnings = FALSE) - - for (name in names(out)) { - if (!is.null(out[[name]])) { - fwrite( - out[[name]], - file.path(tables_dir, paste0("comparison_", name, ".csv")), - na = "" - ) - } - } + fwrite( + out$metrics, + file.path(tables_dir, "comparison_metrics.csv"), + na = "" + ) } out diff --git a/1_code/harness/experiment.R b/1_code/harness/experiment.R index 3c60a37..79a1122 100644 --- a/1_code/harness/experiment.R +++ b/1_code/harness/experiment.R @@ -465,8 +465,8 @@ experiment_changes <- function(config) { #' Compare an Experiment's Summaries with the Baseline's #' #' Run by run_experiment() for every experiment but the baseline. -#' Writes tables/comparison_summary.csv, comparison_metrics.csv -#' and comparison_grid.csv; see compare_experiments(). A baseline +#' Writes tables/comparison_metrics.csv and prints the per-taxon +#' headline; see compare_experiments(). A baseline #' that has not been run is reported and skipped rather than #' stopping the experiment. #' @@ -502,7 +502,7 @@ compare_to_baseline <- function( baseline_dir = baseline_dir ) - # The headline, for the console; the full tables are written + # The headline, for the console; per-species rows are written shown <- comparison$summary[ comparison$summary$metric %in% c( "oob_auc", "oob_deviance_explained", "oob_calibration_slope" @@ -515,7 +515,7 @@ compare_to_baseline <- function( cat( "Against ", baseline, - " (out-of-bag; full tables in tables/comparison_*.csv):\n", + " (out-of-bag; per species in comparison_metrics.csv):\n", sep = "" ) print(shown, row.names = FALSE) diff --git a/1_code/harness/summarise.R b/1_code/harness/summarise.R index 53eb17a..05818ac 100644 --- a/1_code/harness/summarise.R +++ b/1_code/harness/summarise.R @@ -18,10 +18,12 @@ # experiment, so it lives in the harness: an experiment's own # scripts start from these tables. # - Draws are summarized by median and the 10th and 90th -# percentiles rather than mean and standard deviation. A +# percentiles, which is what comparisons read. A # coefficient's distribution over draws is routinely skewed, # and a rare species can produce an extreme draw that would -# drag a mean somewhere no draw actually is. +# drag a mean somewhere no draw actually is. The mean and +# standard deviation are added to every summary for readers +# and tools that expect them. # - `boot1` is the iteration-1 value, the full-data fit. It is # the like-for-like quantity where a reference fits once # rather than bootstrapping, as the v2 mammal models do. @@ -147,21 +149,18 @@ store_meta <- function(dir) { #' @param rows A data frame with `boot` and the value column. #' @param value Character. The column to summarize. #' @param keys Character vector of grouping columns. -#' @param moments Logical. Add the mean and standard deviation. -#' @return A data.table of the keys plus n, median, p10, p90 and -#' boot1, and mean and sd when `moments` is TRUE. n counts the -#' finite values; boot1 is the iteration-1 value where there is -#' exactly one. +#' @return A data.table of the keys plus n, median, p10, p90, +#' boot1, mean and sd. n counts the finite values; boot1 is the +#' iteration-1 value where there is exactly one. #' #' @example # Example usage of the function -#' # summarise_draws(metrics, "value", c("species", "metric"), -#' # moments = TRUE) -summarise_draws <- function(rows, value, keys, moments = FALSE) { +#' # summarise_draws(metrics, "value", c("species", "metric")) +summarise_draws <- function(rows, value, keys) { rows <- as.data.table(rows) # The column is passed through .SDcols rather than named inside # the call, because a column may itself be called `value` - rows[, draw_summary(.SD[[1L]], boot, moments), + rows[, draw_summary(.SD[[1L]], boot), by = keys, .SDcols = value] } @@ -171,20 +170,18 @@ summarise_draws <- function(rows, value, keys, moments = FALSE) { #' #' The median and 10-90% band are the summary every comparison #' reads, because a distribution over draws is often skewed. The -#' mean and standard deviation are added where asked, for readers -#' and tools that expect them; with a skewed distribution they -#' describe it less well. +#' mean and standard deviation are there for readers and tools +#' that expect them; with a skewed distribution they describe it +#' less well. #' #' @param x Numeric vector, one value per draw. #' @param boot Integer vector of the draw each value came from. -#' @param moments Logical. Add the mean and standard deviation. -#' @return A list of n, median, p10, p90 and boot1, then mean and -#' sd when `moments` is TRUE. sd is NA with fewer than two -#' values. +#' @return A list of n, median, p10, p90, boot1, mean and sd. sd +#' is NA with fewer than two values. #' #' @example # Example usage of the function -#' # draw_summary(c(0.1, 0.3, 0.2), 1:3, moments = TRUE) -draw_summary <- function(x, boot, moments = FALSE) { +#' # draw_summary(c(0.1, 0.3, 0.2), 1:3) +draw_summary <- function(x, boot) { first <- x[boot == 1L] first <- if (length(first) == 1 && is.finite(first)) { first @@ -206,10 +203,8 @@ draw_summary <- function(x, boot, moments = FALSE) { } # Appended, so the columns before them keep their positions - if (moments) { - out$mean <- if (length(finite) == 0) NA_real_ else mean(finite) - out$sd <- if (length(finite) < 2) NA_real_ else stats::sd(finite) - } + out$mean <- if (length(finite) == 0) NA_real_ else mean(finite) + out$sd <- if (length(finite) < 2) NA_real_ else stats::sd(finite) out } @@ -279,12 +274,12 @@ collect_results <- function(pipeline_dir, data_dir = NULL, } } - summarised <- function(rows, value, keys, moments = FALSE) { + summarised <- function(rows, value, keys) { if (is.null(rows) || nrow(rows) == 0) { return(NULL) } - cbind(labels, summarise_draws(rows, value, keys, moments)) + cbind(labels, summarise_draws(rows, value, keys)) } list( @@ -304,7 +299,7 @@ collect_results <- function(pipeline_dir, data_dir = NULL, coefficients, "estimate", c("stage", "species", "term") ), metric_summary = summarised( - metrics, "value", c("species", "metric"), moments = TRUE + metrics, "value", c("species", "metric") ), grid_summary = summarised( grid, "prediction", c("species", "grid_unit") diff --git a/1_code/tests/testthat/test-results.R b/1_code/tests/testthat/test-results.R index 960dab3..66328e1 100644 --- a/1_code/tests/testthat/test-results.R +++ b/1_code/tests/testthat/test-results.R @@ -140,6 +140,9 @@ test_that("an experiment is compared with its baseline by key", { expect_equal(out$summary$share_better, 0.5) expect_equal(out$summary$draws_baseline, 100) expect_true(file.exists( + file.path(root, "same", "tables", "comparison_metrics.csv") + )) + expect_false(file.exists( file.path(root, "same", "tables", "comparison_summary.csv") )) @@ -159,13 +162,12 @@ test_that("the baseline does not compare with itself", { ) }) -test_that("metric summaries carry the mean and standard deviation", { +test_that("draw summaries carry the mean and standard deviation", { rows <- data.frame( species = "sp", metric = "oob_auc", boot = 1:4, value = c(0.6, 0.7, 0.8, NA) ) - out <- summarise_draws(rows, "value", c("species", "metric"), - moments = TRUE) + out <- summarise_draws(rows, "value", c("species", "metric")) expect_equal(out$n, 3) expect_equal(out$mean, 0.7) @@ -176,8 +178,4 @@ test_that("metric summaries carry the mean and standard deviation", { c("species", "metric", "n", "median", "p10", "p90", "boot1", "mean", "sd") ) - # Coefficient and grid summaries are unchanged - expect_false("mean" %in% names( - summarise_draws(rows, "value", c("species", "metric")) - )) }) diff --git a/3_output/exp_000_parity_v2/.gitkeep b/3_output/exp_000_parity_v2/.gitkeep deleted file mode 100644 index 8b13789..0000000 --- a/3_output/exp_000_parity_v2/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/3_output/exp_000_parity_v2/figures/.gitkeep b/3_output/exp_000_parity_v2/figures/.gitkeep deleted file mode 100644 index 8b13789..0000000 --- a/3_output/exp_000_parity_v2/figures/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/3_output/exp_000_parity_v2/report.md b/3_output/exp_000_parity_v2/report.md deleted file mode 100644 index b1bf56a..0000000 --- a/3_output/exp_000_parity_v2/report.md +++ /dev/null @@ -1,159 +0,0 @@ -# exp_000_parity_v2 - -Generated 2026-10-06 04:47:32 - -**Trial run.** 14 focal species, 5 of 100 draws. Its parity numbers show the pipeline ran; they are not a parity read. - -Draws: `seed = 20260909`, one derived seed per species. - -## What each spec reproduces of v2 - -Read from each spec's `v2_coverage`, which is where coverage is -stated. Change it there, not here. - -| taxon | stage | status | note | -| --- | --- | --- | --- | -| bryophyte | climate | reproduced | The v2 58-model set, bayesglm, full AICc averaging, fitted once per draw on every unit and shared by both regions, as v2 fits it. | -| bryophyte | habitat | reproduced | IVW on the prediction grid, the stand-age splines, cutblock convergence, footprint pooling, the south pAspen and the 20-detection skip. Matches v2 to 2e-12 on the full-data draw, north and south. | -| bryophyte | validation | reproduced | v2's seven validation AUCs, in-bag as v2 scores them and out-of-bag as well. South exact; north within 2e-4, a residual v2's own coefficients show too. | -| bryophyte | resampling | reproduced | v2's spatial-block bootstrap, drawn once per species across the province with its 20-detection redraw rule. The same method, not the same draws: v2 is unseeded. | -| lichen | climate | reproduced | The v2 58-model set, bayesglm, full AICc averaging, fitted once per draw on every unit and shared by both regions, as v2 fits it. | -| lichen | habitat | reproduced | IVW on the prediction grid, the stand-age splines, cutblock convergence, footprint pooling, the south pAspen and the 20-detection skip. Matches v2 to 2e-12 on the full-data draw, north and south. | -| lichen | validation | reproduced | v2's seven validation AUCs, in-bag as v2 scores them and out-of-bag as well. South exact; north within 2e-4, a residual v2's own coefficients show too. | -| lichen | resampling | reproduced | v2's spatial-block bootstrap, drawn once per species across the province with its 20-detection redraw rule. The same method, not the same draws: v2 is unseeded. | -| mite | climate | reproduced | The v2 58-model set, bayesglm, full AICc averaging, fitted once per draw on every unit and shared by both regions, as v2 fits it. | -| mite | habitat | reproduced | IVW on the prediction grid, the stand-age splines, cutblock convergence, footprint pooling, the south pAspen and the 20-detection skip. Matches v2 to 2e-12 on the full-data draw, north and south. | -| mite | validation | reproduced | v2's seven validation AUCs, in-bag as v2 scores them and out-of-bag as well. South exact; north within 2e-4, a residual v2's own coefficients show too. | -| mite | resampling | reproduced | v2's spatial-block bootstrap, drawn once per species across the province with its 20-detection redraw rule. The same method, not the same draws: v2 is unseeded. | -| vascular_plant | climate | reproduced | The v2 58-model set, bayesglm, full AICc averaging, fitted once per draw on every unit and shared by both regions, as v2 fits it. | -| vascular_plant | habitat | reproduced | IVW on the prediction grid, the stand-age splines, cutblock convergence, footprint pooling, the south pAspen and the 20-detection skip. Matches v2 to 2e-12 on the full-data draw, north and south. | -| vascular_plant | validation | reproduced | v2's seven validation AUCs, in-bag as v2 scores them and out-of-bag as well. South exact; north within 2e-4, a residual v2's own coefficients show too. | -| vascular_plant | resampling | reproduced | v2's spatial-block bootstrap, drawn once per species across the province with its 20-detection redraw rule. The same method, not the same draws: v2 is unseeded. | -| mammal_summer | climate | reproduced | v2's precomputed climate prediction, read per species; deployments without one are dropped, as in v2. | -| mammal_summer | habitat | reproduced | v2's hurdle: presence, abundance and total abundance on the full habitat set, with the stand-age splines, calibration and cutblock convergence. Matches v2's published tables to 2e-14, north and south. | -| mammal_summer | resampling | partial | Spatial-block bootstrap. v2 fits the habitat stage once, so only iteration 1, the full data, is like for like. | -| mammal_summer | season | reproduced | One season per spec; run.R runs both, and the gate averages them as v2's `.all` references do. | -| mammal_winter | climate | reproduced | v2's precomputed climate prediction, read per species; deployments without one are dropped, as in v2. | -| mammal_winter | habitat | reproduced | v2's hurdle: presence, abundance and total abundance on the full habitat set, with the stand-age splines, calibration and cutblock convergence. Matches v2's published tables to 2e-14, north and south. | -| mammal_winter | resampling | partial | Spatial-block bootstrap. v2 fits the habitat stage once, so only iteration 1, the full data, is like for like. | -| mammal_winter | season | reproduced | One season per spec; run.R runs both, and the gate averages them as v2's `.all` references do. | -| bird | climate | reproduced | v2's 25 candidates, AICc averaged, fitted once on the province-wide draw, unweighted, and carried as exp(link) without the offset, as MuMIn predicts it. | -| bird | landcover | reproduced | Staged BIC over v2's groups, weighted by vegw or soilw, always advancing to each group's winner. Raw coefficients are translated onto v2's standardized template by standardize.R, a port checked exact against v2's packaged output. | -| bird | resampling | reproduced | v2's 100 stored draws, keyed on surveyid, each survey once per draw as v2's %in% selects them. Only when harmonized from the Stratified.Rdata v2 was fitted on (58,210 surveys per draw); the BirdModels Data/Archive/2025 copy was rewritten on 2026-08-19 with different draws. | - -## v2 references - -Scored against `abmiexplorer`, built by `1_code/_setup/08_harmonize_abmiexplorer_results.R`. What it holds, from `v2_results_coverage.csv`: - -| source_label | reachable | rows | species | note | -| --- | --- | --- | --- | --- | -| amphibian north habitat | TRUE | 364 | 4 | - | -| amphibian south habitat | FALSE | 0 | 0 | - | -| amphibian all climate | TRUE | 44 | 4 | - | -| bird north habitat | TRUE | 10609 | 103 | - | -| bird south habitat | TRUE | 1747 | 65 | - | -| bird all climate | TRUE | 1240 | 124 | - | -| bryophyte north habitat | TRUE | 12154 | 118 | - | -| bryophyte south habitat | TRUE | 673 | 25 | - | -| bryophyte all climate | TRUE | 2242 | 118 | - | -| lichen north habitat | TRUE | 13596 | 132 | - | -| lichen south habitat | TRUE | 1206 | 45 | - | -| lichen all climate | TRUE | 2755 | 145 | - | -| mammal north habitat | TRUE | 5760 | 15 | - | -| mammal south habitat | TRUE | 1079 | 13 | - | -| mammal all climate | TRUE | 105 | 21 | - | -| mite north habitat | TRUE | 9785 | 95 | - | -| mite south habitat | TRUE | 755 | 28 | - | -| mite all climate | TRUE | 2052 | 108 | - | -| vascular_plant north habitat | TRUE | 32754 | 318 | - | -| vascular_plant south habitat | TRUE | 6257 | 233 | - | -| vascular_plant all climate | TRUE | 8246 | 434 | - | - -What this run's comparison could not reach: - -_Every taxon and region that ran had a reference to compare against._ - -## What ran - -| taxon | run | region | season | part | species | draws | stages | has_coefficients | has_grid | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| bird | bird | north | - | - | 2 | 5 | climate, landcover, habitat | TRUE | TRUE | -| bird | bird | south | - | - | 2 | 5 | climate, landcover, habitat | TRUE | TRUE | -| bryophyte | bryophyte | north | - | - | 2 | 5 | climate, habitat | TRUE | TRUE | -| bryophyte | bryophyte | south | - | - | 2 | 5 | climate, habitat | TRUE | TRUE | -| lichen | lichen | north | - | - | 2 | 5 | climate, habitat | TRUE | TRUE | -| lichen | lichen | south | - | - | 2 | 5 | climate, habitat | TRUE | TRUE | -| mammal | mammal_summer | north | summer | hurdle | 2 | 5 | habitat_presence, habitat_abundance, habitat_total | TRUE | TRUE | -| mammal | mammal_summer | south | summer | hurdle | 2 | 5 | habitat_presence, habitat_abundance, habitat_total | TRUE | TRUE | -| mammal | mammal_winter | north | winter | hurdle | 2 | 5 | habitat_presence, habitat_abundance, habitat_total | TRUE | TRUE | -| mammal | mammal_winter | south | winter | hurdle | 2 | 5 | habitat_presence, habitat_abundance, habitat_total | TRUE | TRUE | -| mite | mite | north | - | - | 2 | 5 | climate, habitat | TRUE | TRUE | -| mite | mite | south | - | - | 2 | 5 | climate, habitat | TRUE | TRUE | -| vascular_plant | vascular_plant | north | - | - | 2 | 5 | climate, habitat | TRUE | TRUE | -| vascular_plant | vascular_plant | south | - | - | 2 | 5 | climate, habitat | TRUE | TRUE | - -## Parity against v2, by stage - -Every stage is compared against `v2_results.csv`. Climate is -scored against v2's province-wide fit in both regions. Terms v2 -fixes at a placeholder are left out of the reachable scores. - -`verdict` reads each row against the parity targets in `utils/parity_targets.R` (proposed, not yet agreed): numerical rows (iteration 1) pass when every reachable term is within 1e-06; distributional rows when at least 90% of reachable terms are in band, the median standardized difference is at most 0.25, and the median band-width ratio (this run's band over v2's) is between 0.75 and 1.33. `median_spearman` is reported, not gated. A trial run is not gated. - -| taxon | region | stage | comparison | species | terms_compared | min_draws | in_band_pct | reachable_terms | reachable_in_band_pct | median_standardized_difference | median_absolute_difference | max_absolute_difference | negligible_terms | median_spearman | median_band_ratio | verdict | indicative_verdict | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| bird | north | climate | median | 2 | 20 | 5 | 90.000 | 20 | 90.000 | 0.351 | 0.000 | 0.651 | 0 | 1.000 | 0.694 | not gated (store holds 5 draws) | - | -| bryophyte | north | climate | median | 1 | 19 | 5 | 94.700 | 19 | 94.700 | 0.671 | 0.000 | 1.810 | 5 | 0.991 | 0.214 | not gated (store holds 5 draws) | - | -| lichen | north | climate | median | 2 | 38 | 5 | 89.500 | 38 | 89.500 | 0.003 | 0.000 | 1.990 | 17 | 0.991 | 0.301 | not gated (store holds 5 draws) | - | -| mite | north | climate | median | 2 | 38 | 5 | 94.700 | 38 | 94.700 | 0.082 | 0.000 | 3.790 | 20 | 0.973 | 0.656 | not gated (store holds 5 draws) | - | -| vascular_plant | north | climate | median | 2 | 38 | 5 | 97.400 | 38 | 97.400 | 0.000 | 0.000 | 0.120 | 24 | 0.982 | 0.602 | not gated (store holds 5 draws) | - | -| bird | south | climate | median | 2 | 20 | 5 | 90.000 | 20 | 90.000 | 0.351 | 0.000 | 0.651 | 0 | 1.000 | 0.694 | not gated (store holds 5 draws) | - | -| bryophyte | south | climate | median | 1 | 19 | 5 | 94.700 | 19 | 94.700 | 0.671 | 0.000 | 1.810 | 5 | 0.991 | 0.214 | not gated (store holds 5 draws) | - | -| lichen | south | climate | median | 2 | 38 | 5 | 89.500 | 38 | 89.500 | 0.003 | 0.000 | 1.990 | 17 | 0.991 | 0.301 | not gated (store holds 5 draws) | - | -| mite | south | climate | median | 2 | 38 | 5 | 94.700 | 38 | 94.700 | 0.082 | 0.000 | 3.790 | 20 | 0.973 | 0.656 | not gated (store holds 5 draws) | - | -| vascular_plant | south | climate | median | 2 | 38 | 5 | 97.400 | 38 | 97.400 | 0.000 | 0.000 | 0.120 | 24 | 0.982 | 0.602 | not gated (store holds 5 draws) | - | -| bird | north | habitat | median | 2 | 178 | 5 | 92.700 | 168 | 92.300 | 0.569 | 0.023 | 2.820 | 0 | 0.989 | 0.699 | not gated (store holds 5 draws) | - | -| bryophyte | north | habitat | median | 1 | 94 | 5 | 98.900 | 94 | 98.900 | 0.360 | 0.062 | 0.256 | 0 | 0.987 | 0.502 | not gated (store holds 5 draws) | - | -| lichen | north | habitat | median | 2 | 188 | 5 | 94.700 | 188 | 94.700 | 0.251 | 0.038 | 0.289 | 0 | 0.996 | 0.642 | not gated (store holds 5 draws) | - | -| mammal | north | habitat | iteration 1 | 2 | 448 | 4 | 100.000 | 436 | 100.000 | 0.000 | 0.000 | 0.000 | 0 | 1.000 | - | not gated (trial run) | - | -| mite | north | habitat | median | 1 | 94 | 5 | 76.600 | 94 | 76.600 | 0.579 | 0.078 | 0.673 | 0 | 0.993 | 0.642 | not gated (store holds 5 draws) | - | -| vascular_plant | north | habitat | median | 2 | 188 | 5 | 91.500 | 188 | 91.500 | 0.303 | 0.034 | 0.326 | 0 | 0.997 | 0.596 | not gated (store holds 5 draws) | - | -| bird | south | habitat | median | 2 | 46 | 5 | 80.400 | 40 | 77.500 | 0.334 | 0.021 | 0.121 | 0 | 0.995 | 0.508 | not gated (store holds 5 draws) | - | -| bryophyte | south | habitat | median | 1 | 19 | 5 | 100.000 | 19 | 100.000 | 0.399 | 0.066 | 0.267 | 0 | 0.991 | 0.633 | not gated (store holds 5 draws) | - | -| lichen | south | habitat | median | 2 | 40 | 5 | 87.500 | 40 | 87.500 | 0.337 | 0.048 | 0.655 | 1 | 0.985 | 0.554 | not gated (store holds 5 draws) | - | -| mammal | south | habitat | iteration 1 | 2 | 126 | 5 | 100.000 | 120 | 100.000 | 0.000 | 0.000 | 0.000 | 0 | 1.000 | - | not gated (trial run) | - | -| mite | south | habitat | median | 2 | 40 | 5 | 95.000 | 40 | 95.000 | 0.175 | 0.030 | 0.754 | 1 | 0.992 | 0.581 | not gated (store holds 5 draws) | - | -| vascular_plant | south | habitat | median | 2 | 40 | 5 | 75.000 | 40 | 75.000 | 0.585 | 0.070 | 0.552 | 0 | 0.977 | 0.566 | not gated (store holds 5 draws) | - | - -Where v2 bootstraps, parity is **distributional**: v2 seeds no -random draw, so two v2 runs differ, and each term is scored on -whether the v2 median falls inside this run's -10th-to-90th percentile band. Where v2 fits once -(`comparison` = iteration 1: mammals), the run's full-data fit -is compared directly; read `median_absolute_difference`. - -## Model fit - -Median AUC over species, scored on each run's final model: for plants, v2's own prediction from its coefficient tables. `insample` scores the units each draw fitted; `oob` the units it left out, the held-out read. `v2val` is v2's validation, scored from the coefficients as v2 does (plants only), so for plants `v2val_full` equals `insample_auc`. Iteration 1 is the full data and has no out-of-bag units. - -| taxon | region | species | median_insample_auc | median_oob_auc | median_v2val_full | median_oob_v2val_full | -| --- | --- | --- | --- | --- | --- | --- | -| bird | north | 2 | 0.752 | 0.729 | - | - | -| bryophyte | north | 2 | 0.668 | 0.650 | 0.668 | 0.650 | -| lichen | north | 2 | 0.808 | 0.803 | 0.808 | 0.803 | -| mammal | north | 4 | 0.746 | 0.731 | - | - | -| mite | north | 2 | 0.733 | 0.716 | 0.733 | 0.716 | -| vascular_plant | north | 2 | 0.833 | 0.828 | 0.833 | 0.828 | -| bird | south | 2 | 0.704 | 0.702 | - | - | -| bryophyte | south | 2 | 0.671 | 0.669 | 0.671 | 0.669 | -| lichen | south | 2 | 0.802 | 0.792 | 0.802 | 0.792 | -| mammal | south | 4 | 0.753 | 0.686 | - | - | -| mite | south | 2 | 0.799 | 0.774 | 0.799 | 0.774 | -| vascular_plant | south | 2 | 0.848 | 0.846 | 0.848 | 0.846 | - -## What is still needed - -See the experiment's `README.md` for what blocks the gate, and -`docs/reviews/2026-09-28_alignment_review.md` for the full -remediation plan. - diff --git a/3_output/exp_000_parity_v2/run_record.md b/3_output/exp_000_parity_v2/run_record.md deleted file mode 100644 index 70c54ab..0000000 --- a/3_output/exp_000_parity_v2/run_record.md +++ /dev/null @@ -1,365 +0,0 @@ -# Run record: exp_000_parity_v2 - -Written by `run_record()`. The result stores this describes are gitignored; this file is what remains. - -## Provenance - -_Volatile. Excluded from cross-run comparison._ - -- **git_commit**: 60d95ae -- **pipeline_dir**: D:/local_projects/active/sdmMethodsDev/2_pipeline/exp_000_parity_v2 -- **r_version**: 4.5.0 -- **written_at**: 2026-10-06 10:47:32 - -## Configuration - -- **boot_seed**: 20260909.0000 -- **changes_from_v2**: none -- **compared_with**: none (baseline) -- **covariate_files**: none -- **data_dir**: published 2026-10-05 (//ABMI-DATA2/science/sdmMethodsDev/0_data/test_dataset/2026-10-05) -- **engines**: bayesglm, glm -- **focal_species**: bird=AMRO, bird=YEWA, bryophyte=Bryum.All, bryophyte=Ceratodon.purpureus, lichen=Cladonia.chlorophaea, lichen=Physcia.adscendens, mammal=Coyote_Summer, mammal=Coyote_Winter, mammal=Moose_Summer, mammal=Moose_Winter, mite=Ceratozetes.gracilis, mite=Trhypochthonius.tectorum, vascular_plant=Galium.boreale, vascular_plant=Vicia.americana -- **jobs_not_ok**: 0 -- **jobs_ok**: 140 -- **jobs_total**: 140 -- **n_bootstraps**: 5 -- **plant_bootstrap**: spatial_block -- **selection**: aic_average, hurdle, ivw_grid, staged_bic -- **species_n**: 14 -- **stage_models**: spec defaults (v2 candidate sets) -- **taxa**: bird, bryophyte, lichen, mammal_summer, mammal_winter, mite, vascular_plant -- **v2_bootstraps**: 100 - -## Coverage - -| taxon | region | species | draws | coefficient_rows | metric_rows | grid_rows | -| --- | --- | --- | --- | --- | --- | --- | -| bird | north | 2 | 5 | 467 | 140 | 890 | -| bird | south | 2 | 5 | 350 | 140 | 170 | -| bryophyte | north | 2 | 5 | 1100 | 280 | 430 | -| bryophyte | south | 2 | 5 | 390 | 280 | 160 | -| lichen | north | 2 | 5 | 1100 | 280 | 430 | -| lichen | south | 2 | 5 | 390 | 280 | 160 | -| mammal_summer | north | 2 | 5 | 2204 | 140 | 450 | -| mammal_summer | south | 2 | 5 | 690 | 140 | 200 | -| mammal_winter | north | 2 | 5 | 2222 | 140 | 450 | -| mammal_winter | south | 2 | 5 | 690 | 140 | 200 | -| mite | north | 2 | 5 | 1090 | 280 | 430 | -| mite | south | 2 | 5 | 380 | 280 | 160 | -| vascular_plant | north | 2 | 5 | 1090 | 280 | 430 | -| vascular_plant | south | 2 | 5 | 380 | 280 | 160 | - -## Metrics - -| taxon | region | metric | n | median | p10 | p90 | mean | sd | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| bird | north | insample_auc | 10 | 0.7522 | 0.7235 | 0.7796 | 0.7516 | 0.0288 | -| bird | north | insample_calibration_slope | 10 | 0.7559 | 0.6982 | 0.8102 | 0.7542 | 0.0543 | -| bird | north | insample_deviance_explained | 10 | 0.1996 | 0.1409 | 0.2605 | 0.2005 | 0.0613 | -| bird | north | insample_n | 10 | 46747.0000 | 46744.0000 | 46750.0000 | 46747.6000 | 2.3664 | -| bird | north | insample_prevalence | 10 | 0.1851 | 0.1178 | 0.2520 | 0.1850 | 0.0702 | -| bird | north | insample_rmse | 10 | 0.6070 | 0.5467 | 0.6643 | 0.6056 | 0.0609 | -| bird | north | insample_spearman | 10 | 0.3277 | 0.3148 | 0.3446 | 0.3293 | 0.0149 | -| bird | north | oob_auc | 10 | 0.7299 | 0.7284 | 0.7308 | 0.7296 | 0.0010 | -| bird | north | oob_calibration_slope | 10 | 0.7875 | 0.6454 | 0.8810 | 0.7730 | 0.1073 | -| bird | north | oob_deviance_explained | 10 | 0.1647 | 0.1509 | 0.1821 | 0.1658 | 0.0150 | -| bird | north | oob_n | 10 | 124877.0000 | 124874.0000 | 124880.0000 | 124876.4000 | 2.3664 | -| bird | north | oob_prevalence | 10 | 0.1877 | 0.1343 | 0.2411 | 0.1877 | 0.0561 | -| bird | north | oob_rmse | 10 | 0.6250 | 0.5831 | 0.6583 | 0.6230 | 0.0372 | -| bird | north | oob_spearman | 10 | 0.3117 | 0.2736 | 0.3483 | 0.3110 | 0.0389 | -| bird | south | insample_auc | 10 | 0.7052 | 0.6892 | 0.7215 | 0.7054 | 0.0153 | -| bird | south | insample_calibration_slope | 10 | 0.8775 | 0.8649 | 0.8901 | 0.8777 | 0.0119 | -| bird | south | insample_deviance_explained | 10 | 0.1561 | 0.0911 | 0.2337 | 0.1609 | 0.0728 | -| bird | south | insample_n | 10 | 23639.0000 | 23636.0000 | 23640.0000 | 23638.4000 | 1.4298 | -| bird | south | insample_prevalence | 10 | 0.2142 | 0.1711 | 0.2590 | 0.2149 | 0.0459 | -| bird | south | insample_rmse | 10 | 0.6840 | 0.6232 | 0.7452 | 0.6839 | 0.0623 | -| bird | south | insample_spearman | 10 | 0.2943 | 0.2880 | 0.2978 | 0.2933 | 0.0046 | -| bird | south | oob_auc | 10 | 0.7013 | 0.6892 | 0.7156 | 0.7019 | 0.0134 | -| bird | south | oob_calibration_slope | 10 | 0.9220 | 0.8622 | 0.9549 | 0.9086 | 0.0414 | -| bird | south | oob_deviance_explained | 10 | 0.1483 | 0.0969 | 0.2066 | 0.1498 | 0.0555 | -| bird | south | oob_n | 10 | 67168.0000 | 67167.0000 | 67171.0000 | 67168.6000 | 1.4298 | -| bird | south | oob_prevalence | 10 | 0.2178 | 0.1757 | 0.2603 | 0.2180 | 0.0444 | -| bird | south | oob_rmse | 10 | 0.6869 | 0.6369 | 0.7359 | 0.6867 | 0.0513 | -| bird | south | oob_spearman | 10 | 0.2916 | 0.2888 | 0.2927 | 0.2913 | 0.0017 | -| bryophyte | north | insample_auc | 10 | 0.6642 | 0.6314 | 0.7085 | 0.6676 | 0.0347 | -| bryophyte | north | insample_calibration_slope | 10 | 0.8499 | 0.7585 | 0.8973 | 0.8326 | 0.0644 | -| bryophyte | north | insample_deviance_explained | 10 | -0.1896 | -0.2902 | -0.0937 | -0.1928 | 0.0883 | -| bryophyte | north | insample_n | 10 | 3091.0000 | 3041.1000 | 4852.0000 | 3429.3000 | 750.2771 | -| bryophyte | north | insample_prevalence | 10 | 0.4175 | 0.3976 | 0.4423 | 0.4194 | 0.0223 | -| bryophyte | north | insample_rmse | 10 | 0.4736 | 0.4634 | 0.4802 | 0.4727 | 0.0076 | -| bryophyte | north | insample_spearman | 10 | 0.2805 | 0.2228 | 0.3578 | 0.2866 | 0.0614 | -| bryophyte | north | oob_auc | 8 | 0.6562 | 0.6254 | 0.6808 | 0.6537 | 0.0253 | -| bryophyte | north | oob_calibration_slope | 8 | 0.7707 | 0.6959 | 0.8841 | 0.7784 | 0.0797 | -| bryophyte | north | oob_deviance_explained | 8 | -0.1858 | -0.2157 | -0.1326 | -0.1818 | 0.0371 | -| bryophyte | north | oob_n | 10 | 1761.0000 | 0.0000 | 1810.9000 | 1422.7000 | 750.2771 | -| bryophyte | north | oob_prevalence | 8 | 0.4201 | 0.4007 | 0.4503 | 0.4233 | 0.0233 | -| bryophyte | north | oob_rmse | 8 | 0.4801 | 0.4711 | 0.4829 | 0.4781 | 0.0053 | -| bryophyte | north | oob_spearman | 8 | 0.2675 | 0.2128 | 0.3105 | 0.2630 | 0.0449 | -| bryophyte | north | oob_v2val_Climate | 8 | 0.6045 | 0.5487 | 0.6482 | 0.5986 | 0.0463 | -| bryophyte | north | oob_v2val_Climate_Truncated | 8 | 0.6045 | 0.5486 | 0.6482 | 0.5986 | 0.0463 | -| bryophyte | north | oob_v2val_Full | 8 | 0.6562 | 0.6254 | 0.6808 | 0.6537 | 0.0253 | -| bryophyte | north | oob_v2val_Full_Joint | 8 | 0.6538 | 0.6242 | 0.6786 | 0.6519 | 0.0247 | -| bryophyte | north | oob_v2val_Full_Joint_Truncated | 8 | 0.6546 | 0.6248 | 0.6788 | 0.6524 | 0.0246 | -| bryophyte | north | oob_v2val_Full_Truncated | 8 | 0.6571 | 0.6259 | 0.6811 | 0.6542 | 0.0252 | -| bryophyte | north | oob_v2val_Landcover | 8 | 0.5971 | 0.5798 | 0.6148 | 0.5974 | 0.0150 | -| bryophyte | north | v2val_Climate | 10 | 0.6069 | 0.5555 | 0.6643 | 0.6086 | 0.0518 | -| bryophyte | north | v2val_Climate_Truncated | 10 | 0.6069 | 0.5555 | 0.6643 | 0.6086 | 0.0518 | -| bryophyte | north | v2val_Full | 10 | 0.6642 | 0.6314 | 0.7085 | 0.6676 | 0.0347 | -| bryophyte | north | v2val_Full_Joint | 10 | 0.6615 | 0.6293 | 0.7047 | 0.6648 | 0.0336 | -| bryophyte | north | v2val_Full_Joint_Truncated | 10 | 0.6621 | 0.6299 | 0.7052 | 0.6652 | 0.0334 | -| bryophyte | north | v2val_Full_Truncated | 10 | 0.6647 | 0.6320 | 0.7089 | 0.6679 | 0.0346 | -| bryophyte | north | v2val_Landcover | 10 | 0.6082 | 0.5829 | 0.6350 | 0.6089 | 0.0226 | -| bryophyte | south | insample_auc | 10 | 0.6741 | 0.6221 | 0.7221 | 0.6723 | 0.0498 | -| bryophyte | south | insample_calibration_slope | 10 | 0.8833 | 0.8604 | 0.9293 | 0.8836 | 0.0487 | -| bryophyte | south | insample_deviance_explained | 10 | -0.0076 | -0.1062 | 0.0587 | -0.0180 | 0.0817 | -| bryophyte | south | insample_n | 10 | 1454.5000 | 1440.8000 | 2310.0000 | 1623.0000 | 362.3789 | -| bryophyte | south | insample_prevalence | 10 | 0.3052 | 0.2352 | 0.3713 | 0.3043 | 0.0687 | -| bryophyte | south | insample_rmse | 10 | 0.4407 | 0.3994 | 0.4751 | 0.4384 | 0.0377 | -| bryophyte | south | insample_spearman | 10 | 0.2678 | 0.2042 | 0.3271 | 0.2668 | 0.0610 | -| bryophyte | south | oob_auc | 8 | 0.6737 | 0.6156 | 0.7162 | 0.6682 | 0.0497 | -| bryophyte | south | oob_calibration_slope | 8 | 0.8626 | 0.7944 | 0.9233 | 0.8595 | 0.0569 | -| bryophyte | south | oob_deviance_explained | 8 | 0.0177 | -0.0430 | 0.0521 | 0.0106 | 0.0409 | -| bryophyte | south | oob_n | 10 | 855.5000 | 0.0000 | 869.2000 | 687.0000 | 362.3789 | -| bryophyte | south | oob_prevalence | 8 | 0.3139 | 0.2297 | 0.3751 | 0.3071 | 0.0716 | -| bryophyte | south | oob_rmse | 8 | 0.4447 | 0.3999 | 0.4766 | 0.4408 | 0.0371 | -| bryophyte | south | oob_spearman | 8 | 0.2693 | 0.1933 | 0.3245 | 0.2610 | 0.0620 | -| bryophyte | south | oob_v2val_Climate | 8 | 0.6045 | 0.5487 | 0.6482 | 0.5986 | 0.0463 | -| bryophyte | south | oob_v2val_Climate_Truncated | 8 | 0.6045 | 0.5486 | 0.6482 | 0.5986 | 0.0463 | -| bryophyte | south | oob_v2val_Full | 8 | 0.6737 | 0.6156 | 0.7162 | 0.6682 | 0.0497 | -| bryophyte | south | oob_v2val_Full_Joint | 8 | 0.6754 | 0.6148 | 0.7178 | 0.6689 | 0.0510 | -| bryophyte | south | oob_v2val_Full_Joint_Truncated | 8 | 0.6754 | 0.6148 | 0.7178 | 0.6689 | 0.0510 | -| bryophyte | south | oob_v2val_Full_Truncated | 8 | 0.6737 | 0.6156 | 0.7162 | 0.6682 | 0.0497 | -| bryophyte | south | oob_v2val_Landcover | 8 | 0.6029 | 0.5970 | 0.6332 | 0.6102 | 0.0172 | -| bryophyte | south | v2val_Climate | 10 | 0.6069 | 0.5555 | 0.6643 | 0.6086 | 0.0518 | -| bryophyte | south | v2val_Climate_Truncated | 10 | 0.6069 | 0.5555 | 0.6643 | 0.6086 | 0.0518 | -| bryophyte | south | v2val_Full | 10 | 0.6741 | 0.6221 | 0.7221 | 0.6723 | 0.0498 | -| bryophyte | south | v2val_Full_Joint | 10 | 0.6743 | 0.6214 | 0.7227 | 0.6726 | 0.0505 | -| bryophyte | south | v2val_Full_Joint_Truncated | 10 | 0.6743 | 0.6215 | 0.7227 | 0.6726 | 0.0505 | -| bryophyte | south | v2val_Full_Truncated | 10 | 0.6741 | 0.6221 | 0.7221 | 0.6723 | 0.0498 | -| bryophyte | south | v2val_Landcover | 10 | 0.6137 | 0.5905 | 0.6386 | 0.6139 | 0.0223 | -| lichen | north | insample_auc | 10 | 0.8074 | 0.7781 | 0.8388 | 0.8083 | 0.0311 | -| lichen | north | insample_calibration_slope | 10 | 1.0001 | 0.9745 | 1.0269 | 0.9999 | 0.0221 | -| lichen | north | insample_deviance_explained | 10 | 0.1360 | 0.1091 | 0.1649 | 0.1405 | 0.0261 | -| lichen | north | insample_n | 10 | 3692.0000 | 3654.0000 | 5811.0000 | 4109.1000 | 897.3877 | -| lichen | north | insample_prevalence | 10 | 0.3839 | 0.3815 | 0.3891 | 0.3840 | 0.0037 | -| lichen | north | insample_rmse | 10 | 0.4112 | 0.3929 | 0.4298 | 0.4111 | 0.0183 | -| lichen | north | insample_spearman | 10 | 0.5176 | 0.4685 | 0.5707 | 0.5194 | 0.0520 | -| lichen | north | oob_auc | 8 | 0.7997 | 0.7622 | 0.8453 | 0.8016 | 0.0403 | -| lichen | north | oob_calibration_slope | 8 | 0.9794 | 0.9485 | 1.0076 | 0.9784 | 0.0272 | -| lichen | north | oob_deviance_explained | 8 | 0.1271 | 0.0891 | 0.1748 | 0.1334 | 0.0469 | -| lichen | north | oob_n | 10 | 2119.0000 | 0.0000 | 2157.0000 | 1701.9000 | 897.3877 | -| lichen | north | oob_prevalence | 8 | 0.3864 | 0.3761 | 0.3921 | 0.3853 | 0.0072 | -| lichen | north | oob_rmse | 8 | 0.4171 | 0.3889 | 0.4363 | 0.4142 | 0.0224 | -| lichen | north | oob_spearman | 8 | 0.5059 | 0.4420 | 0.5824 | 0.5084 | 0.0681 | -| lichen | north | oob_v2val_Climate | 8 | 0.7041 | 0.6878 | 0.7158 | 0.7028 | 0.0127 | -| lichen | north | oob_v2val_Climate_Truncated | 8 | 0.7041 | 0.6878 | 0.7158 | 0.7028 | 0.0127 | -| lichen | north | oob_v2val_Full | 8 | 0.7997 | 0.7622 | 0.8453 | 0.8016 | 0.0403 | -| lichen | north | oob_v2val_Full_Joint | 8 | 0.7969 | 0.7616 | 0.8417 | 0.7996 | 0.0394 | -| lichen | north | oob_v2val_Full_Joint_Truncated | 8 | 0.7969 | 0.7615 | 0.8418 | 0.7996 | 0.0396 | -| lichen | north | oob_v2val_Full_Truncated | 8 | 0.7997 | 0.7624 | 0.8453 | 0.8016 | 0.0404 | -| lichen | north | oob_v2val_Landcover | 8 | 0.7481 | 0.6957 | 0.8186 | 0.7528 | 0.0579 | -| lichen | north | v2val_Climate | 10 | 0.7093 | 0.6916 | 0.7289 | 0.7101 | 0.0183 | -| lichen | north | v2val_Climate_Truncated | 10 | 0.7093 | 0.6916 | 0.7290 | 0.7101 | 0.0183 | -| lichen | north | v2val_Full | 10 | 0.8074 | 0.7781 | 0.8388 | 0.8083 | 0.0311 | -| lichen | north | v2val_Full_Joint | 10 | 0.8057 | 0.7771 | 0.8370 | 0.8071 | 0.0308 | -| lichen | north | v2val_Full_Joint_Truncated | 10 | 0.8057 | 0.7770 | 0.8372 | 0.8071 | 0.0309 | -| lichen | north | v2val_Full_Truncated | 10 | 0.8074 | 0.7780 | 0.8390 | 0.8083 | 0.0312 | -| lichen | north | v2val_Landcover | 10 | 0.7424 | 0.7115 | 0.8121 | 0.7566 | 0.0468 | -| lichen | south | insample_auc | 10 | 0.8021 | 0.7789 | 0.8223 | 0.8009 | 0.0226 | -| lichen | south | insample_calibration_slope | 10 | 0.9035 | 0.8740 | 1.0439 | 0.9436 | 0.0783 | -| lichen | south | insample_deviance_explained | 10 | 0.1705 | 0.0924 | 0.2412 | 0.1684 | 0.0753 | -| lichen | south | insample_n | 10 | 1484.5000 | 1478.5000 | 2346.0000 | 1657.8000 | 362.9370 | -| lichen | south | insample_prevalence | 10 | 0.1511 | 0.0868 | 0.2167 | 0.1525 | 0.0659 | -| lichen | south | insample_rmse | 10 | 0.3163 | 0.2688 | 0.3582 | 0.3146 | 0.0440 | -| lichen | south | insample_spearman | 10 | 0.3667 | 0.2735 | 0.4597 | 0.3676 | 0.0948 | -| lichen | south | oob_auc | 8 | 0.7976 | 0.7632 | 0.8185 | 0.7926 | 0.0270 | -| lichen | south | oob_calibration_slope | 8 | 0.9438 | 0.7927 | 1.1880 | 0.9710 | 0.1829 | -| lichen | south | oob_deviance_explained | 8 | 0.1218 | -0.0135 | 0.2395 | 0.1153 | 0.1246 | -| lichen | south | oob_n | 10 | 861.5000 | 0.0000 | 867.5000 | 688.2000 | 362.9370 | -| lichen | south | oob_prevalence | 8 | 0.1578 | 0.0943 | 0.2207 | 0.1582 | 0.0637 | -| lichen | south | oob_rmse | 8 | 0.3261 | 0.2806 | 0.3630 | 0.3232 | 0.0402 | -| lichen | south | oob_spearman | 8 | 0.3688 | 0.2665 | 0.4581 | 0.3651 | 0.0946 | -| lichen | south | oob_v2val_Climate | 8 | 0.7041 | 0.6878 | 0.7158 | 0.7028 | 0.0127 | -| lichen | south | oob_v2val_Climate_Truncated | 8 | 0.7041 | 0.6878 | 0.7158 | 0.7028 | 0.0127 | -| lichen | south | oob_v2val_Full | 8 | 0.7976 | 0.7632 | 0.8185 | 0.7926 | 0.0270 | -| lichen | south | oob_v2val_Full_Joint | 8 | 0.7958 | 0.7656 | 0.8153 | 0.7914 | 0.0240 | -| lichen | south | oob_v2val_Full_Joint_Truncated | 8 | 0.7958 | 0.7656 | 0.8153 | 0.7914 | 0.0240 | -| lichen | south | oob_v2val_Full_Truncated | 8 | 0.7976 | 0.7632 | 0.8185 | 0.7926 | 0.0270 | -| lichen | south | oob_v2val_Landcover | 8 | 0.7535 | 0.7464 | 0.7630 | 0.7537 | 0.0086 | -| lichen | south | v2val_Climate | 10 | 0.7093 | 0.6916 | 0.7289 | 0.7101 | 0.0183 | -| lichen | south | v2val_Climate_Truncated | 10 | 0.7093 | 0.6916 | 0.7290 | 0.7101 | 0.0183 | -| lichen | south | v2val_Full | 10 | 0.8021 | 0.7789 | 0.8223 | 0.8009 | 0.0226 | -| lichen | south | v2val_Full_Joint | 10 | 0.8018 | 0.7799 | 0.8189 | 0.8001 | 0.0202 | -| lichen | south | v2val_Full_Joint_Truncated | 10 | 0.8018 | 0.7799 | 0.8189 | 0.8001 | 0.0202 | -| lichen | south | v2val_Full_Truncated | 10 | 0.8021 | 0.7789 | 0.8223 | 0.8009 | 0.0226 | -| lichen | south | v2val_Landcover | 10 | 0.7535 | 0.7435 | 0.7653 | 0.7532 | 0.0119 | -| mammal_summer | north | insample_auc | 10 | 0.7207 | 0.6085 | 0.8216 | 0.7173 | 0.1099 | -| mammal_summer | north | insample_calibration_slope | 10 | 0.9417 | 0.8161 | 1.0198 | 0.9320 | 0.0845 | -| mammal_summer | north | insample_deviance_explained | 10 | 0.1542 | 0.0268 | 0.2763 | 0.1529 | 0.1296 | -| mammal_summer | north | insample_n | 10 | 2587.5000 | 2542.1000 | 4053.0000 | 2865.2000 | 626.3850 | -| mammal_summer | north | insample_prevalence | 10 | 0.2736 | 0.2243 | 0.3206 | 0.2726 | 0.0496 | -| mammal_summer | north | insample_rmse | 10 | 0.3836 | 0.3234 | 0.4410 | 0.3831 | 0.0608 | -| mammal_summer | north | insample_spearman | 10 | 0.3160 | 0.1627 | 0.4610 | 0.3131 | 0.1542 | -| mammal_summer | north | oob_auc | 8 | 0.7007 | 0.5879 | 0.8116 | 0.7020 | 0.1114 | -| mammal_summer | north | oob_calibration_slope | 8 | 0.8971 | 0.7046 | 0.9590 | 0.8583 | 0.1139 | -| mammal_summer | north | oob_deviance_explained | 8 | 0.1194 | 0.0155 | 0.2466 | 0.1282 | 0.1142 | -| mammal_summer | north | oob_n | 10 | 1465.5000 | 0.0000 | 1510.9000 | 1187.8000 | 626.3850 | -| mammal_summer | north | oob_prevalence | 8 | 0.2774 | 0.2208 | 0.3261 | 0.2746 | 0.0539 | -| mammal_summer | north | oob_rmse | 8 | 0.3919 | 0.3312 | 0.4445 | 0.3895 | 0.0585 | -| mammal_summer | north | oob_spearman | 8 | 0.2911 | 0.1268 | 0.4415 | 0.2892 | 0.1555 | -| mammal_summer | south | insample_auc | 10 | 0.7054 | 0.6336 | 0.8030 | 0.7149 | 0.0833 | -| mammal_summer | south | insample_calibration_slope | 10 | 0.9832 | 0.8710 | 1.0087 | 0.9605 | 0.0585 | -| mammal_summer | south | insample_deviance_explained | 10 | 0.1016 | 0.0257 | 0.2383 | 0.1233 | 0.1035 | -| mammal_summer | south | insample_n | 10 | 676.5000 | 670.8000 | 1065.0000 | 753.7000 | 164.1402 | -| mammal_summer | south | insample_prevalence | 10 | 0.4451 | 0.1814 | 0.7098 | 0.4419 | 0.2704 | -| mammal_summer | south | insample_rmse | 10 | 0.3814 | 0.3405 | 0.4191 | 0.3811 | 0.0380 | -| mammal_summer | south | insample_spearman | 10 | 0.2798 | 0.1705 | 0.4148 | 0.2864 | 0.1148 | -| mammal_summer | south | oob_auc | 8 | 0.6568 | 0.5888 | 0.7557 | 0.6672 | 0.0845 | -| mammal_summer | south | oob_calibration_slope | 8 | 0.6589 | 0.4354 | 1.0000 | 0.7200 | 0.2938 | -| mammal_summer | south | oob_deviance_explained | 8 | 0.0059 | -0.0790 | 0.1356 | 0.0219 | 0.1214 | -| mammal_summer | south | oob_n | 10 | 388.5000 | 0.0000 | 394.2000 | 311.3000 | 164.1402 | -| mammal_summer | south | oob_prevalence | 8 | 0.4195 | 0.1726 | 0.6930 | 0.4251 | 0.2678 | -| mammal_summer | south | oob_rmse | 8 | 0.3986 | 0.3422 | 0.4425 | 0.3948 | 0.0479 | -| mammal_summer | south | oob_spearman | 8 | 0.2181 | 0.1135 | 0.3243 | 0.2204 | 0.1080 | -| mammal_winter | north | insample_auc | 10 | 0.7608 | 0.6687 | 0.8445 | 0.7578 | 0.0888 | -| mammal_winter | north | insample_calibration_slope | 10 | 0.9604 | 0.9077 | 1.0052 | 0.9518 | 0.0647 | -| mammal_winter | north | insample_deviance_explained | 10 | 0.1877 | 0.0712 | 0.3014 | 0.1868 | 0.1161 | -| mammal_winter | north | insample_n | 10 | 2624.5000 | 2596.8000 | 4127.0000 | 2921.0000 | 635.9504 | -| mammal_winter | north | insample_prevalence | 10 | 0.1752 | 0.1467 | 0.2040 | 0.1753 | 0.0287 | -| mammal_winter | north | insample_rmse | 10 | 0.3149 | 0.2994 | 0.3346 | 0.3161 | 0.0165 | -| mammal_winter | north | insample_spearman | 10 | 0.3463 | 0.2134 | 0.4714 | 0.3427 | 0.1314 | -| mammal_winter | north | oob_auc | 8 | 0.7383 | 0.6458 | 0.8353 | 0.7401 | 0.0953 | -| mammal_winter | north | oob_calibration_slope | 8 | 0.8540 | 0.6612 | 0.9533 | 0.8259 | 0.1149 | -| mammal_winter | north | oob_deviance_explained | 8 | 0.1614 | 0.0413 | 0.2853 | 0.1646 | 0.1234 | -| mammal_winter | north | oob_n | 10 | 1502.5000 | 0.0000 | 1530.2000 | 1206.0000 | 635.9504 | -| mammal_winter | north | oob_prevalence | 8 | 0.1756 | 0.1450 | 0.2025 | 0.1746 | 0.0269 | -| mammal_winter | north | oob_rmse | 8 | 0.3180 | 0.3015 | 0.3423 | 0.3198 | 0.0192 | -| mammal_winter | north | oob_spearman | 8 | 0.3198 | 0.1800 | 0.4528 | 0.3184 | 0.1382 | -| mammal_winter | south | insample_auc | 10 | 0.7642 | 0.6906 | 0.8292 | 0.7651 | 0.0684 | -| mammal_winter | south | insample_calibration_slope | 10 | 0.9542 | 0.8588 | 1.0389 | 0.9614 | 0.0769 | -| mammal_winter | south | insample_deviance_explained | 10 | 0.1574 | 0.0675 | 0.2501 | 0.1637 | 0.0946 | -| mammal_winter | south | insample_n | 10 | 694.0000 | 684.8000 | 1098.0000 | 773.7000 | 171.0842 | -| mammal_winter | south | insample_prevalence | 10 | 0.3450 | 0.0865 | 0.6052 | 0.3446 | 0.2704 | -| mammal_winter | south | insample_rmse | 10 | 0.3145 | 0.2215 | 0.4071 | 0.3127 | 0.0960 | -| mammal_winter | south | insample_spearman | 10 | 0.3224 | 0.2964 | 0.3373 | 0.3206 | 0.0167 | -| mammal_winter | south | oob_auc | 8 | 0.7095 | 0.6257 | 0.7915 | 0.7074 | 0.0854 | -| mammal_winter | south | oob_calibration_slope | 8 | 0.7307 | 0.4495 | 0.8353 | 0.6770 | 0.1665 | -| mammal_winter | south | oob_deviance_explained | 8 | 0.0389 | 0.0035 | 0.1901 | 0.0790 | 0.0856 | -| mammal_winter | south | oob_n | 10 | 404.0000 | 0.0000 | 413.2000 | 324.3000 | 171.0842 | -| mammal_winter | south | oob_prevalence | 8 | 0.3501 | 0.0777 | 0.6225 | 0.3492 | 0.2818 | -| mammal_winter | south | oob_rmse | 8 | 0.3337 | 0.2202 | 0.4271 | 0.3264 | 0.1027 | -| mammal_winter | south | oob_spearman | 8 | 0.2450 | 0.1833 | 0.2817 | 0.2399 | 0.0463 | -| mite | north | insample_auc | 10 | 0.7336 | 0.6697 | 0.7962 | 0.7334 | 0.0621 | -| mite | north | insample_calibration_slope | 10 | 1.0028 | 0.9276 | 1.0341 | 0.9867 | 0.0488 | -| mite | north | insample_deviance_explained | 10 | 0.0502 | -0.0427 | 0.1395 | 0.0479 | 0.0867 | -| mite | north | insample_n | 10 | 3630.0000 | 3598.5000 | 5711.0000 | 4041.0000 | 880.4163 | -| mite | north | insample_prevalence | 10 | 0.1545 | 0.0943 | 0.2113 | 0.1531 | 0.0602 | -| mite | north | insample_rmse | 10 | 0.3279 | 0.2873 | 0.3658 | 0.3272 | 0.0404 | -| mite | north | insample_spearman | 10 | 0.2958 | 0.1729 | 0.4186 | 0.2953 | 0.1234 | -| mite | north | oob_auc | 8 | 0.7189 | 0.6461 | 0.7894 | 0.7187 | 0.0708 | -| mite | north | oob_calibration_slope | 8 | 0.9472 | 0.7462 | 1.0295 | 0.9187 | 0.1294 | -| mite | north | oob_deviance_explained | 8 | 0.0324 | -0.0828 | 0.1165 | 0.0211 | 0.1006 | -| mite | north | oob_n | 10 | 2081.0000 | 0.0000 | 2112.5000 | 1670.0000 | 880.4163 | -| mite | north | oob_prevalence | 8 | 0.1509 | 0.0925 | 0.2048 | 0.1495 | 0.0588 | -| mite | north | oob_rmse | 8 | 0.3263 | 0.2853 | 0.3680 | 0.3268 | 0.0416 | -| mite | north | oob_spearman | 8 | 0.2764 | 0.1475 | 0.4035 | 0.2761 | 0.1298 | -| mite | north | oob_v2val_Climate | 8 | 0.6835 | 0.6308 | 0.7383 | 0.6832 | 0.0539 | -| mite | north | oob_v2val_Climate_Truncated | 8 | 0.6834 | 0.6308 | 0.7383 | 0.6832 | 0.0539 | -| mite | north | oob_v2val_Full | 8 | 0.7189 | 0.6461 | 0.7894 | 0.7187 | 0.0708 | -| mite | north | oob_v2val_Full_Joint | 8 | 0.7191 | 0.6447 | 0.7888 | 0.7183 | 0.0712 | -| mite | north | oob_v2val_Full_Joint_Truncated | 8 | 0.7192 | 0.6448 | 0.7887 | 0.7183 | 0.0712 | -| mite | north | oob_v2val_Full_Truncated | 8 | 0.7190 | 0.6462 | 0.7893 | 0.7188 | 0.0708 | -| mite | north | oob_v2val_Landcover | 8 | 0.6850 | 0.6172 | 0.7620 | 0.6890 | 0.0750 | -| mite | north | v2val_Climate | 10 | 0.6950 | 0.6449 | 0.7401 | 0.6928 | 0.0480 | -| mite | north | v2val_Climate_Truncated | 10 | 0.6950 | 0.6449 | 0.7401 | 0.6928 | 0.0480 | -| mite | north | v2val_Full | 10 | 0.7336 | 0.6697 | 0.7962 | 0.7334 | 0.0621 | -| mite | north | v2val_Full_Joint | 10 | 0.7336 | 0.6692 | 0.7962 | 0.7334 | 0.0622 | -| mite | north | v2val_Full_Joint_Truncated | 10 | 0.7336 | 0.6692 | 0.7962 | 0.7334 | 0.0621 | -| mite | north | v2val_Full_Truncated | 10 | 0.7336 | 0.6697 | 0.7961 | 0.7334 | 0.0620 | -| mite | north | v2val_Landcover | 10 | 0.7057 | 0.6335 | 0.7708 | 0.7020 | 0.0683 | -| mite | south | insample_auc | 10 | 0.7997 | 0.7044 | 0.8840 | 0.7968 | 0.0893 | -| mite | south | insample_calibration_slope | 10 | 0.7882 | 0.6097 | 0.9768 | 0.7906 | 0.1787 | -| mite | south | insample_deviance_explained | 10 | 0.0405 | -0.0053 | 0.1740 | 0.0764 | 0.0831 | -| mite | south | insample_n | 10 | 1493.0000 | 1480.9000 | 2363.0000 | 1665.8000 | 367.6444 | -| mite | south | insample_prevalence | 10 | 0.0721 | 0.0556 | 0.0841 | 0.0703 | 0.0144 | -| mite | south | insample_rmse | 10 | 0.2482 | 0.2139 | 0.2709 | 0.2446 | 0.0273 | -| mite | south | insample_spearman | 10 | 0.2519 | 0.1954 | 0.3151 | 0.2550 | 0.0557 | -| mite | south | oob_auc | 8 | 0.7769 | 0.6582 | 0.8839 | 0.7745 | 0.1136 | -| mite | south | oob_calibration_slope | 8 | 0.6139 | 0.5353 | 0.8012 | 0.6444 | 0.1288 | -| mite | south | oob_deviance_explained | 8 | 0.0535 | 0.0095 | 0.2026 | 0.0819 | 0.0851 | -| mite | south | oob_n | 10 | 870.0000 | 0.0000 | 882.1000 | 697.2000 | 367.6444 | -| mite | south | oob_prevalence | 8 | 0.0719 | 0.0489 | 0.0868 | 0.0689 | 0.0174 | -| mite | south | oob_rmse | 8 | 0.2447 | 0.2147 | 0.2788 | 0.2456 | 0.0307 | -| mite | south | oob_spearman | 8 | 0.2233 | 0.1492 | 0.3189 | 0.2298 | 0.0764 | -| mite | south | oob_v2val_Climate | 8 | 0.6835 | 0.6308 | 0.7383 | 0.6832 | 0.0539 | -| mite | south | oob_v2val_Climate_Truncated | 8 | 0.6834 | 0.6308 | 0.7383 | 0.6832 | 0.0539 | -| mite | south | oob_v2val_Full | 8 | 0.7769 | 0.6582 | 0.8839 | 0.7745 | 0.1136 | -| mite | south | oob_v2val_Full_Joint | 8 | 0.7766 | 0.6587 | 0.8846 | 0.7751 | 0.1137 | -| mite | south | oob_v2val_Full_Joint_Truncated | 8 | 0.7766 | 0.6587 | 0.8846 | 0.7751 | 0.1137 | -| mite | south | oob_v2val_Full_Truncated | 8 | 0.7769 | 0.6582 | 0.8839 | 0.7745 | 0.1136 | -| mite | south | oob_v2val_Landcover | 8 | 0.6792 | 0.6125 | 0.7124 | 0.6651 | 0.0460 | -| mite | south | v2val_Climate | 10 | 0.6950 | 0.6449 | 0.7401 | 0.6928 | 0.0480 | -| mite | south | v2val_Climate_Truncated | 10 | 0.6950 | 0.6449 | 0.7401 | 0.6928 | 0.0480 | -| mite | south | v2val_Full | 10 | 0.7997 | 0.7044 | 0.8840 | 0.7968 | 0.0893 | -| mite | south | v2val_Full_Joint | 10 | 0.8014 | 0.7048 | 0.8843 | 0.7975 | 0.0894 | -| mite | south | v2val_Full_Joint_Truncated | 10 | 0.8014 | 0.7048 | 0.8843 | 0.7975 | 0.0894 | -| mite | south | v2val_Full_Truncated | 10 | 0.7997 | 0.7044 | 0.8840 | 0.7968 | 0.0893 | -| mite | south | v2val_Landcover | 10 | 0.7027 | 0.6602 | 0.7282 | 0.6970 | 0.0287 | -| vascular_plant | north | insample_auc | 10 | 0.8331 | 0.8298 | 0.8373 | 0.8332 | 0.0032 | -| vascular_plant | north | insample_calibration_slope | 10 | 0.9949 | 0.9743 | 1.0061 | 0.9918 | 0.0148 | -| vascular_plant | north | insample_deviance_explained | 10 | 0.1616 | 0.1396 | 0.1816 | 0.1602 | 0.0191 | -| vascular_plant | north | insample_n | 10 | 4347.5000 | 4314.6000 | 6874.0000 | 4846.9000 | 1068.6395 | -| vascular_plant | north | insample_prevalence | 10 | 0.3951 | 0.3770 | 0.4211 | 0.3974 | 0.0209 | -| vascular_plant | north | insample_rmse | 10 | 0.4022 | 0.3958 | 0.4067 | 0.4017 | 0.0048 | -| vascular_plant | north | insample_spearman | 10 | 0.5651 | 0.5611 | 0.5668 | 0.5644 | 0.0038 | -| vascular_plant | north | oob_auc | 8 | 0.8283 | 0.8227 | 0.8329 | 0.8284 | 0.0052 | -| vascular_plant | north | oob_calibration_slope | 8 | 0.9755 | 0.9539 | 1.0021 | 0.9776 | 0.0210 | -| vascular_plant | north | oob_deviance_explained | 8 | 0.1803 | 0.1354 | 0.2064 | 0.1750 | 0.0321 | -| vascular_plant | north | oob_n | 10 | 2526.5000 | 0.0000 | 2559.4000 | 2027.1000 | 1068.6395 | -| vascular_plant | north | oob_prevalence | 8 | 0.3990 | 0.3725 | 0.4275 | 0.3991 | 0.0248 | -| vascular_plant | north | oob_rmse | 8 | 0.4052 | 0.3988 | 0.4110 | 0.4048 | 0.0061 | -| vascular_plant | north | oob_spearman | 8 | 0.5545 | 0.5499 | 0.5651 | 0.5564 | 0.0065 | -| vascular_plant | north | oob_v2val_Climate | 8 | 0.6916 | 0.6808 | 0.6996 | 0.6902 | 0.0106 | -| vascular_plant | north | oob_v2val_Climate_Truncated | 8 | 0.6916 | 0.6808 | 0.6996 | 0.6902 | 0.0106 | -| vascular_plant | north | oob_v2val_Full | 8 | 0.8283 | 0.8227 | 0.8329 | 0.8284 | 0.0052 | -| vascular_plant | north | oob_v2val_Full_Joint | 8 | 0.8258 | 0.8182 | 0.8325 | 0.8258 | 0.0065 | -| vascular_plant | north | oob_v2val_Full_Joint_Truncated | 8 | 0.8258 | 0.8183 | 0.8323 | 0.8258 | 0.0064 | -| vascular_plant | north | oob_v2val_Full_Truncated | 8 | 0.8285 | 0.8228 | 0.8328 | 0.8284 | 0.0051 | -| vascular_plant | north | oob_v2val_Landcover | 8 | 0.8009 | 0.7954 | 0.8101 | 0.8024 | 0.0067 | -| vascular_plant | north | v2val_Climate | 10 | 0.6886 | 0.6855 | 0.6950 | 0.6902 | 0.0048 | -| vascular_plant | north | v2val_Climate_Truncated | 10 | 0.6886 | 0.6855 | 0.6949 | 0.6902 | 0.0048 | -| vascular_plant | north | v2val_Full | 10 | 0.8331 | 0.8298 | 0.8373 | 0.8332 | 0.0032 | -| vascular_plant | north | v2val_Full_Joint | 10 | 0.8318 | 0.8275 | 0.8367 | 0.8320 | 0.0039 | -| vascular_plant | north | v2val_Full_Joint_Truncated | 10 | 0.8319 | 0.8277 | 0.8366 | 0.8321 | 0.0038 | -| vascular_plant | north | v2val_Full_Truncated | 10 | 0.8330 | 0.8299 | 0.8373 | 0.8332 | 0.0031 | -| vascular_plant | north | v2val_Landcover | 10 | 0.8087 | 0.8049 | 0.8130 | 0.8092 | 0.0040 | -| vascular_plant | south | insample_auc | 10 | 0.8460 | 0.8042 | 0.8967 | 0.8490 | 0.0462 | -| vascular_plant | south | insample_calibration_slope | 10 | 0.9608 | 0.9208 | 0.9855 | 0.9580 | 0.0297 | -| vascular_plant | south | insample_deviance_explained | 10 | 0.2841 | 0.1600 | 0.3822 | 0.2752 | 0.1074 | -| vascular_plant | south | insample_n | 10 | 1688.5000 | 1654.9000 | 2648.0000 | 1869.6000 | 410.6067 | -| vascular_plant | south | insample_prevalence | 10 | 0.2438 | 0.2212 | 0.2654 | 0.2437 | 0.0227 | -| vascular_plant | south | insample_rmse | 10 | 0.3477 | 0.3070 | 0.3827 | 0.3458 | 0.0374 | -| vascular_plant | south | insample_spearman | 10 | 0.5180 | 0.4628 | 0.5647 | 0.5163 | 0.0529 | -| vascular_plant | south | oob_auc | 8 | 0.8412 | 0.8038 | 0.8909 | 0.8455 | 0.0409 | -| vascular_plant | south | oob_calibration_slope | 8 | 0.9408 | 0.9073 | 0.9701 | 0.9401 | 0.0277 | -| vascular_plant | south | oob_deviance_explained | 8 | 0.2459 | 0.1728 | 0.3387 | 0.2532 | 0.0850 | -| vascular_plant | south | oob_n | 10 | 959.5000 | 0.0000 | 993.1000 | 778.4000 | 410.6067 | -| vascular_plant | south | oob_prevalence | 8 | 0.2418 | 0.2131 | 0.2706 | 0.2421 | 0.0259 | -| vascular_plant | south | oob_rmse | 8 | 0.3513 | 0.3168 | 0.3827 | 0.3502 | 0.0336 | -| vascular_plant | south | oob_spearman | 8 | 0.5033 | 0.4643 | 0.5589 | 0.5099 | 0.0446 | -| vascular_plant | south | oob_v2val_Climate | 8 | 0.6916 | 0.6808 | 0.6996 | 0.6902 | 0.0106 | -| vascular_plant | south | oob_v2val_Climate_Truncated | 8 | 0.6916 | 0.6808 | 0.6996 | 0.6902 | 0.0106 | -| vascular_plant | south | oob_v2val_Full | 8 | 0.8412 | 0.8038 | 0.8909 | 0.8455 | 0.0409 | -| vascular_plant | south | oob_v2val_Full_Joint | 8 | 0.8369 | 0.8023 | 0.8809 | 0.8406 | 0.0373 | -| vascular_plant | south | oob_v2val_Full_Joint_Truncated | 8 | 0.8369 | 0.8023 | 0.8809 | 0.8406 | 0.0373 | -| vascular_plant | south | oob_v2val_Full_Truncated | 8 | 0.8412 | 0.8038 | 0.8908 | 0.8455 | 0.0409 | -| vascular_plant | south | oob_v2val_Landcover | 8 | 0.7762 | 0.7677 | 0.7961 | 0.7793 | 0.0125 | -| vascular_plant | south | v2val_Climate | 10 | 0.6886 | 0.6855 | 0.6950 | 0.6902 | 0.0048 | -| vascular_plant | south | v2val_Climate_Truncated | 10 | 0.6886 | 0.6855 | 0.6949 | 0.6902 | 0.0048 | -| vascular_plant | south | v2val_Full | 10 | 0.8460 | 0.8042 | 0.8967 | 0.8490 | 0.0462 | -| vascular_plant | south | v2val_Full_Joint | 10 | 0.8411 | 0.8013 | 0.8920 | 0.8446 | 0.0448 | -| vascular_plant | south | v2val_Full_Joint_Truncated | 10 | 0.8411 | 0.8013 | 0.8920 | 0.8446 | 0.0448 | -| vascular_plant | south | v2val_Full_Truncated | 10 | 0.8460 | 0.8042 | 0.8967 | 0.8490 | 0.0462 | -| vascular_plant | south | v2val_Landcover | 10 | 0.7783 | 0.7609 | 0.8028 | 0.7802 | 0.0202 | - diff --git a/3_output/exp_000_parity_v2/tables/.gitkeep b/3_output/exp_000_parity_v2/tables/.gitkeep deleted file mode 100644 index 8b13789..0000000 --- a/3_output/exp_000_parity_v2/tables/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/3_output/exp_000_parity_v2/tables/coverage.csv b/3_output/exp_000_parity_v2/tables/coverage.csv deleted file mode 100644 index cc2de87..0000000 --- a/3_output/exp_000_parity_v2/tables/coverage.csv +++ /dev/null @@ -1,15 +0,0 @@ -taxon,run,region,season,part,species,draws,stages,has_coefficients,has_grid -bird,bird,north,,,2,5,"climate, landcover, habitat",TRUE,TRUE -bird,bird,south,,,2,5,"climate, landcover, habitat",TRUE,TRUE -bryophyte,bryophyte,north,,,2,5,"climate, habitat",TRUE,TRUE -bryophyte,bryophyte,south,,,2,5,"climate, habitat",TRUE,TRUE -lichen,lichen,north,,,2,5,"climate, habitat",TRUE,TRUE -lichen,lichen,south,,,2,5,"climate, habitat",TRUE,TRUE -mammal,mammal_summer,north,summer,hurdle,2,5,"habitat_presence, habitat_abundance, habitat_total",TRUE,TRUE -mammal,mammal_summer,south,summer,hurdle,2,5,"habitat_presence, habitat_abundance, habitat_total",TRUE,TRUE -mammal,mammal_winter,north,winter,hurdle,2,5,"habitat_presence, habitat_abundance, habitat_total",TRUE,TRUE -mammal,mammal_winter,south,winter,hurdle,2,5,"habitat_presence, habitat_abundance, habitat_total",TRUE,TRUE -mite,mite,north,,,2,5,"climate, habitat",TRUE,TRUE -mite,mite,south,,,2,5,"climate, habitat",TRUE,TRUE -vascular_plant,vascular_plant,north,,,2,5,"climate, habitat",TRUE,TRUE -vascular_plant,vascular_plant,south,,,2,5,"climate, habitat",TRUE,TRUE diff --git a/3_output/exp_000_parity_v2/tables/grid_summary.csv b/3_output/exp_000_parity_v2/tables/grid_summary.csv deleted file mode 100644 index bbe78eb..0000000 --- a/3_output/exp_000_parity_v2/tables/grid_summary.csv +++ /dev/null @@ -1,945 +0,0 @@ -taxon,run,region,season,part,species,grid_unit,n,median,p10,p90,boot1 -bird,bird,north,,,AMRO,SpruceR,5,0.0460214970922903,0.0454744611146199,0.0478061585686823,0.0460214970922903 -bird,bird,north,,,AMRO,Spruce1,5,0.0336956807487701,0.0322810241650681,0.0345043254597905,0.0348507381455713 -bird,bird,north,,,AMRO,Spruce2,5,0.029967501134538,0.028689533256257,0.0309030506053303,0.0314691851923315 -bird,bird,north,,,AMRO,Spruce3,5,0.0258465915567713,0.0248847311078244,0.0269161638569105,0.0275986396962082 -bird,bird,north,,,AMRO,Spruce4,5,0.0234032880077339,0.0227504665773472,0.0245509472534085,0.0252157131909561 -bird,bird,north,,,AMRO,Spruce5,5,0.021731186122784,0.0213608104410011,0.0229344203019209,0.0235320177392087 -bird,bird,north,,,AMRO,Spruce6,5,0.0205987834958812,0.0203164427428931,0.0217537403151274,0.0222602046395292 -bird,bird,north,,,AMRO,Spruce7,5,0.0200852925184205,0.0194255140428591,0.0208590897859755,0.0212606901038818 -bird,bird,north,,,AMRO,Spruce8,5,0.0197353820173931,0.0187353929181975,0.020184041325968,0.0204546292796539 -bird,bird,north,,,AMRO,PineR,5,0.055663430449507,0.0543192030149498,0.0562118535015652,0.0535435973650151 -bird,bird,north,,,AMRO,Pine1,5,0.0400367096048969,0.0393476184649974,0.0404105539729648,0.0405470054004968 -bird,bird,north,,,AMRO,Pine2,5,0.0356069417161638,0.0348465927331193,0.0362895221196775,0.0366127459514038 -bird,bird,north,,,AMRO,Pine3,5,0.0307105378920888,0.0301269732104456,0.0316527175268143,0.0321095693334898 -bird,bird,north,,,AMRO,Pine4,5,0.0278758021291746,0.027484805318442,0.0288506206173034,0.0293371593640406 -bird,bird,north,,,AMRO,Pine5,5,0.0261879900411373,0.0256371542993188,0.0269648161579907,0.0273782680404298 -bird,bird,north,,,AMRO,Pine6,5,0.0247842187753593,0.0243295516540588,0.0256818169038513,0.0258985802241854 -bird,bird,north,,,AMRO,Pine7,5,0.0237257385224398,0.0233340026010986,0.0247312486059623,0.0247356975011427 -bird,bird,north,,,AMRO,Pine8,5,0.0229103307685888,0.022572936039687,0.0241270556938794,0.0237978880218547 -bird,bird,north,,,AMRO,DecidR,5,0.0229559115592863,0.0221306044429141,0.0235352610263104,0.0237579890560399 -bird,bird,north,,,AMRO,Decid1,5,0.030553448874834,0.0298317579364032,0.031292026146399,0.0315584625182446 -bird,bird,north,,,AMRO,Decid2,5,0.0321828552741194,0.0315537397610501,0.0329318625383302,0.0331998686079368 -bird,bird,north,,,AMRO,Decid3,5,0.0324092194941181,0.031901614565924,0.0331074352588107,0.0333598077618143 -bird,bird,north,,,AMRO,Decid4,5,0.0309081262409317,0.0304692552537095,0.0315217987870488,0.0317500403920757 -bird,bird,north,,,AMRO,Decid5,5,0.0286739687567556,0.0282544017321468,0.0291788293287055,0.0293809707313715 -bird,bird,north,,,AMRO,Decid6,5,0.026263369067971,0.0256592232040337,0.0265292756315766,0.0267049789894919 -bird,bird,north,,,AMRO,Decid7,5,0.0235829355542547,0.022996829053316,0.0238783254234698,0.0239651842606415 -bird,bird,north,,,AMRO,Decid8,5,0.0209712010709133,0.020405623716483,0.0212840394420598,0.0212996862068994 -bird,bird,north,,,AMRO,MixedwoodR,5,0.0216440418420787,0.0214366764666218,0.0229103918922939,0.0235968351556159 -bird,bird,north,,,AMRO,Mixedwood1,5,0.0291224189433723,0.0286974308645267,0.0305147340021009,0.0313443968700871 -bird,bird,north,,,AMRO,Mixedwood2,5,0.0306755089393133,0.0302969705278782,0.0321556893179631,0.0329746690631811 -bird,bird,north,,,AMRO,Mixedwood3,5,0.0308912709528129,0.030589685080101,0.0323492807237952,0.0331335233264806 -bird,bird,north,,,AMRO,Mixedwood4,5,0.0295710415430225,0.0291898679692672,0.0307877153702325,0.0315346752432942 -bird,bird,north,,,AMRO,Mixedwood5,5,0.0274075295438599,0.0270457330870442,0.0285447239533767,0.0291816753271841 -bird,bird,north,,,AMRO,Mixedwood6,5,0.0248744913880928,0.024598727956784,0.0260231600770452,0.0265238352270822 -bird,bird,north,,,AMRO,Mixedwood7,5,0.0223638470242142,0.0220520253761532,0.0234214558496831,0.0238026249249641 -bird,bird,north,,,AMRO,Mixedwood8,5,0.0199126764372763,0.0195738570800957,0.0208756562752855,0.0211552073327846 -bird,bird,north,,,AMRO,TreedBogR,5,0.0331850952367972,0.0319507285402324,0.0343298174584785,0.0320053956170601 -bird,bird,north,,,AMRO,TreedBog1,5,0.0441859758905737,0.04277191207391,0.0459514038332503,0.0425137445589404 -bird,bird,north,,,AMRO,TreedBog2,5,0.0465280988683981,0.0450759279854423,0.0485442094151598,0.0447249523823355 -bird,bird,north,,,AMRO,TreedBog3,5,0.0468127655397305,0.0453501172953296,0.0491179865619394,0.0449404132061633 -bird,bird,north,,,AMRO,TreedBog4,5,0.0445965703925972,0.0431609344939285,0.0470359967670578,0.0427718272455254 -bird,bird,north,,,AMRO,TreedBog5,5,0.0413013718566653,0.0399132456880923,0.043776679654854,0.0395803529352897 -bird,bird,north,,,AMRO,TreedBog6,5,0.0375650211610718,0.03623802297114,0.0400079459227759,0.0359754108602334 -bird,bird,north,,,AMRO,TreedBog7,5,0.0337311435879773,0.032474706589339,0.0360937692651888,0.0322845170729035 -bird,bird,north,,,AMRO,TreedBog8,5,0.0299955276096956,0.0288159490396316,0.0322449753172705,0.028693711490609 -bird,bird,north,,,AMRO,TreedFenR,5,0.0422645144129336,0.0411206711160944,0.0444612609388868,0.0416408069894085 -bird,bird,north,,,AMRO,TreedFen1,5,0.0567852320289917,0.0546993980136261,0.0595487401346133,0.0553127557852217 -bird,bird,north,,,AMRO,TreedFen2,5,0.0601053333210814,0.057576793915605,0.062801721494816,0.0581896606449257 -bird,bird,north,,,AMRO,TreedFen3,5,0.061004684620066,0.0578987833513519,0.0632661157627814,0.0584699872088007 -bird,bird,north,,,AMRO,TreedFen4,5,0.0585750472403725,0.0551364039392565,0.060286084605513,0.0556485357726957 -bird,bird,north,,,AMRO,TreedFen5,5,0.0546495586388256,0.0510462396551786,0.0558163205477266,0.0514962494721526 -bird,bird,north,,,AMRO,TreedFen6,5,0.0499841351763957,0.0464156762019834,0.0507663812147309,0.0468060185201128 -bird,bird,north,,,AMRO,TreedFen7,5,0.0447008747250632,0.0416684838734553,0.0457440880993633,0.0420039595905649 -bird,bird,north,,,AMRO,TreedFen8,5,0.0395694346049872,0.0370458190070238,0.0408183339762998,0.0373321210050387 -bird,bird,north,,,AMRO,GrassHerb,5,0.0391157074651561,0.0374665801039995,0.0407064521459671,0.0414109112421211 -bird,bird,north,,,AMRO,Shrub,5,0.0242992189479925,0.0228825094225992,0.0246776245457063,0.0249051907368317 -bird,bird,north,,,AMRO,GraminoidFen,5,0.0240253006082896,0.0229416430615678,0.0249398229795977,0.0240253006082896 -bird,bird,north,,,AMRO,Marsh,5,0.0190409138857816,0.0176773805870109,0.0216818753326244,0.0201855790618525 -bird,bird,north,,,AMRO,RoughP,5,0.0284487010336342,0.0273540658384352,0.029100651467195,0.0283163935552878 -bird,bird,north,,,AMRO,TameP,5,0.0337677662581705,0.0332118392222873,0.036508679760649,0.037370361410168 -bird,bird,north,,,AMRO,Crop,5,0.0303304446509559,0.0292521806779319,0.0312352000249702,0.0316675460758044 -bird,bird,north,,,AMRO,Industrial,5,0.0347264320174887,0.033312971177683,0.0355682981118906,0.0357679771660033 -bird,bird,north,,,AMRO,Mine,5,0.0436153300361437,0.0381990210765919,0.0459245387062479,0.0436153300361437 -bird,bird,north,,,AMRO,Rural,5,0.0396443515023387,0.038005707047867,0.0414176232218955,0.041757773007241 -bird,bird,north,,,AMRO,Urban,5,0.0403436023988292,0.0374075928778925,0.0427692941093427,0.0377072326980573 -bird,bird,north,,,AMRO,CCSpruceR,5,0.0464207068040547,0.0457292776866576,0.0488055453828144,0.0464207068040547 -bird,bird,north,,,AMRO,CCSpruce1,5,0.0334382471003622,0.0328903186279197,0.0349792099606696,0.0351307392341287 -bird,bird,north,,,AMRO,CCSpruce2,5,0.0297844962219075,0.0291681742313691,0.0312403869295451,0.0316709611104685 -bird,bird,north,,,AMRO,CCSpruce3,5,0.0257839800291967,0.0250483982402682,0.0270314998715563,0.0276685704867883 -bird,bird,north,,,AMRO,CCSpruce4,5,0.0233883758956751,0.0227898099129418,0.0245785085975324,0.0252324884758929 -bird,bird,north,,,AMRO,CCPineR,5,0.0556588717866301,0.0544149295122647,0.058052743467746,0.0540080569202541 -bird,bird,north,,,AMRO,CCPine1,5,0.0402344808099467,0.0399196288909847,0.0408216202332076,0.0408727719768734 -bird,bird,north,,,AMRO,CCPine2,5,0.0358025164520706,0.0354021820907293,0.0364721654805386,0.0368475016460527 -bird,bird,north,,,AMRO,CCPine3,5,0.0306877354469581,0.0303682798458408,0.0317012367664505,0.0321909301394351 -bird,bird,north,,,AMRO,CCPine4,5,0.0279566387258189,0.0275081026095794,0.0288622599803365,0.0293566765279551 -bird,bird,north,,,AMRO,CCDecidR,5,0.0235157538328627,0.0220205659375402,0.0240398063704617,0.0239640757885976 -bird,bird,north,,,AMRO,CCDecid1,5,0.0311469864460262,0.0297314532115381,0.0318112029859532,0.031776862556441 -bird,bird,north,,,AMRO,CCDecid2,5,0.0325949076990241,0.0314791572519253,0.0332838607667157,0.0333516171167642 -bird,bird,north,,,AMRO,CCDecid3,5,0.0325265668622635,0.0318777585482393,0.033207441139438,0.0334030551273305 -bird,bird,north,,,AMRO,CCDecid4,5,0.0309528425918292,0.0304601698476958,0.0315598462965716,0.0317664981841116 -bird,bird,north,,,AMRO,CCMixedwoodR,5,0.0224136935821678,0.0213872957159068,0.0232466535727542,0.0238015239718475 -bird,bird,north,,,AMRO,CCMixedwood1,5,0.0296185552493973,0.0288303211553137,0.0308120520947235,0.0315613154690116 -bird,bird,north,,,AMRO,CCMixedwood2,5,0.0308728597959445,0.0305223049649659,0.0323025377803166,0.033125388239769 -bird,bird,north,,,AMRO,CCMixedwood3,5,0.0310031221297793,0.0306928887240712,0.0323595803262164,0.033176477338817 -bird,bird,north,,,AMRO,CCMixedwood4,5,0.0295708962308159,0.0292462349147995,0.0307916306804173,0.0315510213997294 -bird,bird,north,,,AMRO,ShrubbySwamp,5,0.0280532806155646,0.0272120492548132,0.0304723043995906,0.0293807705242182 -bird,bird,north,,,AMRO,ShrubbyBog,5,0.0312066411236273,2.39623255235884e-06,0.0912997718305207,0.0987592495876081 -bird,bird,north,,,AMRO,ShrubbyFen,5,0.0199096452985301,0.0173227067986502,0.0204962269519268,0.0179711671460881 -bird,bird,north,,,AMRO,TreedSwamp,5,0.0150538387752528,0.0144236036440235,0.0158664078264896,0.0147780567655432 -bird,bird,north,,,YEWA,SpruceR,5,0.0258559745060982,0.0234403345263018,0.0260111209530433,0.0244391479557886 -bird,bird,north,,,YEWA,Spruce1,5,0.0228379925381185,0.0217902474136419,0.0235046389346874,0.0217244417914461 -bird,bird,north,,,YEWA,Spruce2,5,0.0202131466194631,0.0195276592826221,0.0212015763249332,0.0191951189565087 -bird,bird,north,,,YEWA,Spruce3,5,0.0152260266705766,0.014857155524532,0.0172302414914592,0.0147168214368909 -bird,bird,north,,,YEWA,Spruce4,5,0.0111004447615773,0.011013191632923,0.0132562242110949,0.0110142694942302 -bird,bird,north,,,YEWA,Spruce5,5,0.00804666353131241,0.00782404584193233,0.00956383307230264,0.00804666353131241 -bird,bird,north,,,YEWA,Spruce6,5,0.00573844799961777,0.00536607662283719,0.00647092405422643,0.00573844799961777 -bird,bird,north,,,YEWA,Spruce7,5,0.0039947676530843,0.0035660316198102,0.00416241768282985,0.0039947676530843 -bird,bird,north,,,YEWA,Spruce8,5,0.00235082179047476,0.00227361425460549,0.00270649382245452,0.00271460762119826 -bird,bird,north,,,YEWA,PineR,5,0.0205785305776538,0.016318274681477,0.0214352987031151,0.0205785305776538 -bird,bird,north,,,YEWA,Pine1,5,0.0182926626777856,0.0153708906689175,0.01895474719957,0.0182926626777856 -bird,bird,north,,,YEWA,Pine2,5,0.0161628933669374,0.0141454379072083,0.0166341234332659,0.0161628933669374 -bird,bird,north,,,YEWA,Pine3,5,0.0123056049633671,0.0114779279888745,0.0125556597430834,0.0123920261251661 -bird,bird,north,,,YEWA,Pine4,5,0.00925626382247502,0.00858692715044315,0.00939389903902125,0.00927436103695466 -bird,bird,north,,,YEWA,Pine5,5,0.00657162382380723,0.00614692336606859,0.00680475100874576,0.0067755435593238 -bird,bird,north,,,YEWA,Pine6,5,0.00453218358829318,0.00422748241429677,0.00472061781142898,0.00483195354609082 -bird,bird,north,,,YEWA,Pine7,5,0.00285709675383384,0.00277596123213307,0.00323273918784264,0.00336371989925068 -bird,bird,north,,,YEWA,Pine8,5,0.00182760895381318,0.00166130029618671,0.00216184116705074,0.00228578492344407 -bird,bird,north,,,YEWA,DecidR,5,0.067934626437015,0.0674576672463633,0.0729195663394245,0.067934626437015 -bird,bird,north,,,YEWA,Decid1,5,0.0765302527003605,0.0753508333805385,0.0809224163873259,0.0757433785005077 -bird,bird,north,,,YEWA,Decid2,5,0.0831933705848618,0.0821163970415955,0.0879817188793552,0.0824551590396893 -bird,bird,north,,,YEWA,Decid3,5,0.0909542914829032,0.0906172695168214,0.09667461567637,0.0909542914829032 -bird,bird,north,,,YEWA,Decid4,5,0.0911816141264914,0.0902820435873628,0.0960411655989214,0.0911816141264914 -bird,bird,north,,,YEWA,Decid5,5,0.0830749476256945,0.0815385432720113,0.0862567937273009,0.0830749476256945 -bird,bird,north,,,YEWA,Decid6,5,0.0684511157991116,0.0668156484857424,0.0701683129834214,0.0687878278508456 -bird,bird,north,,,YEWA,Decid7,5,0.0502439884002606,0.0495409659411423,0.052147813318469,0.0517644774974931 -bird,bird,north,,,YEWA,Decid8,5,0.0339005594888284,0.0329378261237809,0.0352547173481443,0.0354022441617264 -bird,bird,north,,,YEWA,MixedwoodR,5,0.0321181710498639,0.0319864486524918,0.0343492759912242,0.0321181710498639 -bird,bird,north,,,YEWA,Mixedwood1,5,0.0361186343792291,0.0357543657081755,0.0381193002267473,0.0358099972600774 -bird,bird,north,,,YEWA,Mixedwood2,5,0.0396578845880583,0.0389647638764836,0.0412876201913861,0.0389831966535626 -bird,bird,north,,,YEWA,Mixedwood3,5,0.044161071804344,0.0430114778126448,0.0450311260127699,0.0430014212895615 -bird,bird,north,,,YEWA,Mixedwood4,5,0.0442351820713005,0.0430824404362304,0.0445653556762868,0.0431088950173672 -bird,bird,north,,,YEWA,Mixedwood5,5,0.0398578791525603,0.0391443456983723,0.0400558611174636,0.0392762206512514 -bird,bird,north,,,YEWA,Mixedwood6,5,0.0324703166414877,0.032179685405207,0.0326999878711223,0.0325215480961012 -bird,bird,north,,,YEWA,Mixedwood7,5,0.0239356684881771,0.0236920166090268,0.0244336977342141,0.0244732389028849 -bird,bird,north,,,YEWA,Mixedwood8,5,0.0161253113583632,0.0156693072501918,0.0166180780337648,0.0167374929865786 -bird,bird,north,,,YEWA,TreedBogR,5,0.011556676565964,0.0106150734211072,0.015167132081919,0.0131547525960213 -bird,bird,north,,,YEWA,TreedBog1,5,0.0130294668017344,0.0118161055388771,0.0168577424412391,0.0146668268778186 -bird,bird,north,,,YEWA,TreedBog2,5,0.0143062189240542,0.0128370960433458,0.0182880974231299,0.0159664853451186 -bird,bird,north,,,YEWA,TreedBog3,5,0.0159307025000537,0.0140854433394799,0.0200138051382188,0.0176122437813552 -bird,bird,north,,,YEWA,TreedBog4,5,0.0159574371006158,0.0140225317629725,0.0198790018140412,0.0176562621751068 -bird,bird,north,,,YEWA,TreedBog5,5,0.0143783651328877,0.0126656720514962,0.0179214155743405,0.0160865002173325 -bird,bird,north,,,YEWA,TreedBog6,5,0.0116539735513248,0.0103793735442064,0.0146647056806911,0.0133199651555387 -bird,bird,north,,,YEWA,TreedBog7,5,0.00849682553839672,0.00771705937769765,0.0108920493747369,0.0100235907733028 -bird,bird,north,,,YEWA,TreedBog8,5,0.00557259559451445,0.00520557300073712,0.00734335343414964,0.00685523403478533 -bird,bird,north,,,YEWA,TreedFenR,5,0.0236371088398181,0.0172768808475891,0.024924502499633,0.0236371088398181 -bird,bird,north,,,YEWA,TreedFen1,5,0.0263540785518553,0.0192542019396591,0.0279298914574923,0.0263540785518553 -bird,bird,north,,,YEWA,TreedFen2,5,0.0286893690426434,0.0209405142100181,0.0305054446689458,0.0286893690426434 -bird,bird,north,,,YEWA,TreedFen3,5,0.031404364802713,0.0230203258078457,0.0337911333203274,0.0316465490426032 -bird,bird,north,,,YEWA,TreedFen4,5,0.0310353005156193,0.0229524913747421,0.0338582352701967,0.0317256434654338 -bird,bird,north,,,YEWA,TreedFen5,5,0.0278154609778999,0.0207556385456937,0.0306353026947788,0.0289050176894887 -bird,bird,north,,,YEWA,TreedFen6,5,0.0226089781361948,0.0170225823525394,0.0250329038492433,0.023933970922363 -bird,bird,north,,,YEWA,TreedFen7,5,0.0166663297897427,0.0126617741481907,0.0184756251524069,0.0180108827091141 -bird,bird,north,,,YEWA,TreedFen8,5,0.0111420056428385,0.00854164778652357,0.0123193300297175,0.0123178229176012 -bird,bird,north,,,YEWA,GrassHerb,5,0.0932809108920782,0.0913238743042866,0.099354153490354,0.0901967196519561 -bird,bird,north,,,YEWA,Shrub,5,0.0137692356170479,0.0119314278078182,0.0157329585961985,0.0157895871550544 -bird,bird,north,,,YEWA,GraminoidFen,5,0.0568382240230587,0.0469653962284414,0.0581610479717628,0.0584309966782358 -bird,bird,north,,,YEWA,Marsh,5,0.0523104434118613,0.0513226604208148,0.0592605534505783,0.0508708598171353 -bird,bird,north,,,YEWA,RoughP,5,0.0682370509878256,0.0670669867920174,0.0695536106096402,0.0675367024470256 -bird,bird,north,,,YEWA,TameP,5,0.0388719938949029,0.0351357025693022,0.0407515647841364,0.0388719938949029 -bird,bird,north,,,YEWA,Crop,5,0.0480473182692122,0.0467260154201003,0.0494996772635692,0.0480608449912437 -bird,bird,north,,,YEWA,Industrial,5,0.0209926161493617,0.0179403892660471,0.0274121855791778,0.0163774906175213 -bird,bird,north,,,YEWA,Mine,5,0.0298281089999606,0.0252803812327327,0.0438712258060967,0.0425264275216284 -bird,bird,north,,,YEWA,Rural,5,0.0520106523964021,0.0509948165571747,0.0580204328798446,0.0511767629721787 -bird,bird,north,,,YEWA,Urban,5,0.0189358775335448,0.0180723788869236,0.0232307511964699,0.0175580460951392 -bird,bird,north,,,YEWA,CCSpruceR,5,0.0152672175746062,0.0139145872911392,0.0165869364759518,0.0140004857871316 -bird,bird,north,,,YEWA,CCSpruce1,5,0.0145361447342197,0.0133048327331401,0.0151662007660585,0.0129654763620514 -bird,bird,north,,,YEWA,CCSpruce2,5,0.0142897376611622,0.0132388070120826,0.0146721348538594,0.0127102186233497 -bird,bird,north,,,YEWA,CCSpruce3,5,0.0134450799502097,0.0127354661170899,0.0148322925225234,0.0125004237260447 -bird,bird,north,,,YEWA,CCSpruce4,5,0.0107434349248054,0.0105759890760241,0.0127445041685453,0.0105517888223615 -bird,bird,north,,,YEWA,CCPineR,5,0.0117888489972604,0.00978058439715013,0.0136122385160046,0.0117888489972604 -bird,bird,north,,,YEWA,CCPine1,5,0.0109173385362286,0.00950427775443443,0.0124464416038799,0.0109173385362286 -bird,bird,north,,,YEWA,CCPine2,5,0.0107024034987813,0.00963763502050784,0.0118767346358323,0.0107024034987813 -bird,bird,north,,,YEWA,CCPine3,5,0.0105322296684723,0.00985879892133643,0.0109469939924601,0.0105257496024575 -bird,bird,north,,,YEWA,CCPine4,5,0.00888493777781158,0.00827021172815224,0.00903877043393079,0.00888493777781158 -bird,bird,north,,,YEWA,CCDecidR,5,0.0408740518525815,0.0395742880103873,0.0463855635812126,0.0389177958906805 -bird,bird,north,,,YEWA,CCDecid1,5,0.0504993452950062,0.0491803622371971,0.0566278245259164,0.048545974417128 -bird,bird,north,,,YEWA,CCDecid2,5,0.062995265035987,0.0619691334562304,0.0695286705182462,0.0614429350398245 -bird,bird,north,,,YEWA,CCDecid3,5,0.0839595481698585,0.0837446499537815,0.090415392433214,0.0836626760316502 -bird,bird,north,,,YEWA,CCDecid4,5,0.0881841836019783,0.0875140301840755,0.0935026282391147,0.0881841836019783 -bird,bird,north,,,YEWA,CCMixedwoodR,5,0.0198089465088669,0.0188166896946456,0.0215401269632987,0.0183995775182405 -bird,bird,north,,,YEWA,CCMixedwood1,5,0.0246050062604319,0.0233792653816228,0.0262550008779679,0.0229515931990476 -bird,bird,north,,,YEWA,CCMixedwood2,5,0.0307677459222674,0.0294152736977039,0.0322590575421635,0.0290490255252145 -bird,bird,north,,,YEWA,CCMixedwood3,5,0.0410887724516163,0.0397071014363877,0.0419786408808556,0.0395540872189119 -bird,bird,north,,,YEWA,CCMixedwood4,5,0.0429775093725811,0.0417350634696179,0.0433309104754257,0.0416917681213261 -bird,bird,north,,,YEWA,ShrubbySwamp,5,0.084170088903374,0.0814218719690635,0.0880371848217152,0.079822188726824 -bird,bird,north,,,YEWA,ShrubbyBog,5,4.8908918803986e-06,4.23856436295343e-06,5.39123857787991e-06,4.42578200846098e-06 -bird,bird,north,,,YEWA,ShrubbyFen,5,0.0414566214404942,0.039261597045695,0.0505385114750219,0.0484352778746871 -bird,bird,north,,,YEWA,TreedSwamp,5,0.0406512816816615,0.0399137539513559,0.0426021810257371,0.0406996342472028 -bird,bird,south,,,AMRO,Loamy,5,0.0241321618221621,0.0236693559161623,0.0244417594641063,0.0239569869686121 -bird,bird,south,,,AMRO,Blowout,5,0.00525978394452474,0.00483082627794943,0.00554114840096604,0.00559111949874543 -bird,bird,south,,,AMRO,ClaySub,5,0.0224545103948504,0.0209236101394104,0.0249199215728223,0.0250347637306298 -bird,bird,south,,,AMRO,Crop,5,0.0230932157889498,0.0226956842202502,0.0238595151902264,0.0236839952497224 -bird,bird,south,,,AMRO,Industrial,5,0.0262354418047225,0.0234169654211887,0.029992373999167,0.0233617397737627 -bird,bird,south,,,AMRO,Mine,5,0.0159069410465305,0.014010684448404,0.025109840836752,0.0159069410465305 -bird,bird,south,,,AMRO,Other,5,0.016098468661524,0.0128083644871958,0.0205965606097986,0.0210202102474962 -bird,bird,south,,,AMRO,RapidDrain,5,0.0236194782771747,0.0230076960669836,0.0255994765544292,0.0251675270889975 -bird,bird,south,,,AMRO,RoughP,5,0.0117188270413036,0.0109276575293055,0.0122383602743591,0.0112036711001846 -bird,bird,south,,,AMRO,Rural,5,0.0437070809393601,0.0424258544652182,0.0441423406644261,0.0437070809393601 -bird,bird,south,,,AMRO,SandyLoam,5,0.0147924310215059,0.0145440646614329,0.0149852796963371,0.0148469628367301 -bird,bird,south,,,AMRO,SoilUnknown,5,0.0243829782616065,0.0238722939341933,0.0257510776949805,0.0235542385568422 -bird,bird,south,,,AMRO,TameP,5,0.0270019486472823,0.0254866831491566,0.0280561852466744,0.0286155273878474 -bird,bird,south,,,AMRO,ThinBreak,5,0.0338003999398653,0.0330400812092674,0.037911798723991,0.0338003999398653 -bird,bird,south,,,AMRO,Urban,5,0.0508184548862111,0.0491287965989474,0.0516212401204611,0.0483719535027645 -bird,bird,south,,,AMRO,Water,5,0.0162706932878444,0.0146410988852416,0.0316387080129026,0.0364343359767869 -bird,bird,south,,,AMRO,Wellsites,5,0.0389513908707596,0.0124040818853545,0.0420540796368127,0.0437526708429192 -bird,bird,south,,,YEWA,Loamy,5,0.0889862342739654,0.0833142720796077,0.0912893187301941,0.0911235422512483 -bird,bird,south,,,YEWA,Blowout,5,0.0401628947157703,0.0373442373283019,0.0409157196574691,0.0401628947157703 -bird,bird,south,,,YEWA,ClaySub,5,0.0776026172652354,0.072738347688647,0.0806537209465533,0.0776026172652354 -bird,bird,south,,,YEWA,Crop,5,0.0477258909723985,0.0445439418592085,0.0483983633635829,0.0485578693440802 -bird,bird,south,,,YEWA,Industrial,5,0.0527276712827915,0.0407707589259449,0.0732258847421466,0.0332758320869208 -bird,bird,south,,,YEWA,Mine,5,0.0971806065268231,0.0846776257647363,0.121933813451961,0.112500894420852 -bird,bird,south,,,YEWA,Other,5,0.0875251951229225,0.0772673767356427,0.0958802062242052,0.100975326566864 -bird,bird,south,,,YEWA,RapidDrain,5,0.0665179523278429,0.0604144987507378,0.0698664068896251,0.0626153705338298 -bird,bird,south,,,YEWA,RoughP,5,0.0573815111243077,0.0533876378460484,0.0600900298992678,0.0564654939180325 -bird,bird,south,,,YEWA,Rural,5,0.0661716927633792,0.0628530852788089,0.0689878709663489,0.0657781939712168 -bird,bird,south,,,YEWA,SandyLoam,5,0.0511277264137194,0.0440509842319305,0.0548605397562365,0.0475053886435979 -bird,bird,south,,,YEWA,SoilUnknown,5,0.0997155153997096,0.0970882713180495,0.100977766167759,0.0979710879919298 -bird,bird,south,,,YEWA,TameP,5,0.0457686292658743,0.0435985886063968,0.0531975721116954,0.050747465664211 -bird,bird,south,,,YEWA,ThinBreak,5,0.183371746527312,0.178987377035422,0.188606353214059,0.179236197079509 -bird,bird,south,,,YEWA,Urban,5,0.0507331439696001,0.0448023038764347,0.0520602501639247,0.0507331439696001 -bird,bird,south,,,YEWA,Water,5,5.79878735375159e-07,4.76822525465649e-07,1.2010658345155e-06,6.60804504718257e-07 -bird,bird,south,,,YEWA,Wellsites,5,6.90003938618652e-06,5.25255285811954e-06,0.365617585043016,0.413267228722246 -bryophyte,bryophyte,north,,,Bryum.All,WhiteSpruce,5,0.104623666278372,0.0874722861544613,0.112679942833954,0.105666560031913 -bryophyte,bryophyte,north,,,Bryum.All,Pine,5,0.0674475602586271,0.0606847013691161,0.0749869714210322,0.0672116807219031 -bryophyte,bryophyte,north,,,Bryum.All,Deciduous,5,0.0919819625968023,0.0817645391225394,0.0978941606981865,0.0919819625968023 -bryophyte,bryophyte,north,,,Bryum.All,Mixedwood,5,0.0937191187701653,0.0766558041922239,0.101378049564084,0.0937191187701653 -bryophyte,bryophyte,north,,,Bryum.All,BlackSpruce,5,0.0821737878210885,0.0796472718492078,0.0914478284992744,0.082297728208448 -bryophyte,bryophyte,north,,,Bryum.All,TreedFen,5,0.103825175281253,0.09066068154714,0.115404378478857,0.103825175281253 -bryophyte,bryophyte,north,,,Bryum.All,TreedSwamp,5,0.14838302487508,0.134285947262339,0.15433966365031,0.14838302487508 -bryophyte,bryophyte,north,,,Bryum.All,GraminoidFen,5,0.102608545171503,0.091652995844401,0.112334612258834,0.102608545171503 -bryophyte,bryophyte,north,,,Bryum.All,ShrubbyFen,5,0.108214861633538,0.0993466210779264,0.120681656680431,0.108214861633538 -bryophyte,bryophyte,north,,,Bryum.All,ShrubbyBog,5,0.0822115868613973,0.0802689106984959,0.0930553295605826,0.0837594118723497 -bryophyte,bryophyte,north,,,Bryum.All,ShrubbySwamp,5,0.142659930075182,0.128769149552852,0.158781358177345,0.147623294355338 -bryophyte,bryophyte,north,,,Bryum.All,Marsh,5,0.103008117733597,0.0928698823634094,0.112264034639262,0.105256814676515 -bryophyte,bryophyte,north,,,Bryum.All,Shrub,5,0.205603841480222,0.174880422823466,0.253531593550174,0.19679926045177 -bryophyte,bryophyte,north,,,Bryum.All,Grass,5,0.205731498249484,0.170688321636038,0.244995847117187,0.195483946860916 -bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruceR,5,0.165475582798583,0.15518207397193,0.199998766587222,0.169554083366261 -bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce1,5,0.177961608354587,0.154126217921708,0.209058286085648,0.177961608354587 -bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce2,5,0.202884480777997,0.171266875481849,0.231723154322466,0.202884480777997 -bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce3,5,0.202884480777997,0.171266875481849,0.231723154322466,0.202884480777997 -bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce4,5,0.202884480777997,0.171266875481849,0.231723154322466,0.202884480777997 -bryophyte,bryophyte,north,,,Bryum.All,CCPineR,5,0.16022882422794,0.145827136293942,0.180254773430031,0.16022882422794 -bryophyte,bryophyte,north,,,Bryum.All,CCPine1,5,0.164291720401128,0.133145499888549,0.203845059962508,0.164291720401128 -bryophyte,bryophyte,north,,,Bryum.All,CCPine2,5,0.166830898209846,0.13451769307428,0.206946727968588,0.166830898209846 -bryophyte,bryophyte,north,,,Bryum.All,CCPine3,5,0.166830898209846,0.13451769307428,0.206946727968588,0.166830898209846 -bryophyte,bryophyte,north,,,Bryum.All,CCPine4,5,0.166830898209846,0.13451769307428,0.206946727968588,0.166830898209846 -bryophyte,bryophyte,north,,,Bryum.All,CCDeciduousR,5,0.161533823124016,0.1404659727257,0.174401252222805,0.161533823124016 -bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous1,5,0.174108402828508,0.161888476473846,0.17922980187219,0.17800935952687 -bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous2,5,0.150834982909368,0.122713525430442,0.157034030570364,0.150834982909368 -bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous3,5,0.150834982909368,0.122713525430442,0.157034030570364,0.150834982909368 -bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous4,5,0.150834982909368,0.122713525430442,0.157034030570364,0.150834982909368 -bryophyte,bryophyte,north,,,Bryum.All,CCMixedwoodR,5,0.161533823124016,0.1404659727257,0.174401252222805,0.161533823124016 -bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood1,5,0.174108402828508,0.161888476473846,0.17922980187219,0.17800935952687 -bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood2,5,0.150834982909368,0.122713525430442,0.157034030570364,0.150834982909368 -bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood3,5,0.150834982909368,0.122713525430442,0.157034030570364,0.150834982909368 -bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood4,5,0.150834982909368,0.122713525430442,0.157034030570364,0.150834982909368 -bryophyte,bryophyte,north,,,Bryum.All,EnSeismic,5,0.143247261154779,0.132144241170755,0.15978556612201,0.143247261154779 -bryophyte,bryophyte,north,,,Bryum.All,EnSoftLin,5,0.181976104710237,0.176334441522147,0.207421144310894,0.181976104710237 -bryophyte,bryophyte,north,,,Bryum.All,TrSoftLin,5,0.172100168424541,0.147841165917588,0.187901203255329,0.169203477599876 -bryophyte,bryophyte,north,,,Bryum.All,HardLin,5,0.119094247542269,0.0902286867109537,0.153196513874268,0.124691301578451 -bryophyte,bryophyte,north,,,Bryum.All,UrbInd,5,0.15870235487759,0.131129493678025,0.174263860237473,0.15870235487759 -bryophyte,bryophyte,north,,,Bryum.All,Wellsites,5,0.133875416816634,0.127095175106388,0.159927124091914,0.133875416816634 -bryophyte,bryophyte,north,,,Bryum.All,Crop,5,0.0820223721088346,0.0684673797777877,0.0983546690511286,0.078395085879973 -bryophyte,bryophyte,north,,,Bryum.All,TameP,5,0.14146232517738,0.121223613545195,0.153442524325088,0.14146232517738 -bryophyte,bryophyte,north,,,Bryum.All,RoughP,5,0.144150717399513,0.133810027719149,0.158938339577548,0.143669438263278 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,WhiteSpruce,5,0.170617726106481,0.150531559521949,0.174419709411094,0.176935668903147 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Pine,5,0.155784234979198,0.149699740009459,0.170954712542573,0.172791155095638 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Deciduous,5,0.157244630521525,0.142941372795819,0.163468234285499,0.162052893569508 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Mixedwood,5,0.158627676901957,0.13860286258159,0.171247492283289,0.15788444654738 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,BlackSpruce,5,0.0677921007733422,0.0521429659792482,0.0729564235762428,0.0685353715648879 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,TreedFen,5,0.0704119831070097,0.059745149134307,0.0811325128636527,0.0794290899103082 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,TreedSwamp,5,0.112752005656074,0.0984937696101871,0.137854437407414,0.122922619803698 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,GraminoidFen,5,0.071246619098096,0.0646705299404144,0.0824857475812227,0.0833874009572022 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,ShrubbyFen,5,0.0704520736989616,0.0644476326851635,0.0829604405865539,0.0826619615495143 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,ShrubbyBog,5,0.0669469626238629,0.0541167658533186,0.0737851895171726,0.0696158682654045 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,ShrubbySwamp,5,0.115517060865014,0.0928903325785583,0.132534115088148,0.121979163778046 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Marsh,5,0.113514973804854,0.096254727615824,0.137347333930943,0.121750013890524 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Shrub,5,0.258030208654547,0.21433734112913,0.288008334755188,0.275203776452487 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Grass,5,0.271067495374639,0.240923289977324,0.31781564474553,0.292406492273734 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruceR,5,0.338256695749658,0.31824880432862,0.364273497154808,0.345415843034206 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce1,5,0.310222319426016,0.28440620861304,0.33208710700024,0.310222319426016 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce2,5,0.344912345599046,0.314582284578097,0.372632043273075,0.35184667493467 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce3,5,0.344912345599046,0.314582284578097,0.372632043273075,0.35184667493467 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce4,5,0.344912345599046,0.314582284578097,0.372632043273075,0.35184667493467 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPineR,5,0.332237563055896,0.30230266389427,0.354086616306992,0.332237563055896 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine1,5,0.345687365666162,0.317841589858981,0.373089123054865,0.354005283762296 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine2,5,0.348225414237899,0.321582172515133,0.377622132855574,0.359033033466831 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine3,5,0.348225414237899,0.321582172515133,0.377622132855574,0.359033033466831 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine4,5,0.348225414237899,0.321582172515133,0.377622132855574,0.359033033466831 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduousR,5,0.318830335897459,0.27955994009676,0.332129458277748,0.329698896772244 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous1,5,0.311890371027914,0.291615240620109,0.319691638401899,0.321691125624866 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous2,5,0.30432063546174,0.283360736827309,0.339489268918774,0.311263402327306 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous3,5,0.30432063546174,0.283360736827309,0.339489268918774,0.311263402327306 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous4,5,0.30432063546174,0.283360736827309,0.339489268918774,0.311263402327306 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwoodR,5,0.318830335897459,0.27955994009676,0.332129458277748,0.329698896772244 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood1,5,0.311890371027914,0.291615240620109,0.319691638401899,0.321691125624866 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood2,5,0.30432063546174,0.283360736827309,0.339489268918774,0.311263402327306 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood3,5,0.30432063546174,0.283360736827309,0.339489268918774,0.311263402327306 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood4,5,0.30432063546174,0.283360736827309,0.339489268918774,0.311263402327306 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,EnSeismic,5,0.159710015581722,0.116043191735016,0.17072117947456,0.165838564517478 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,EnSoftLin,5,0.159418027877254,0.124794622673536,0.167171385865762,0.168995137454078 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,TrSoftLin,5,0.171669259495879,0.127684819372006,0.18790477785131,0.180401709818175 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,HardLin,5,0.10993941717652,0.0990227818218094,0.119734614597133,0.113196196589015 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,UrbInd,5,0.125398730461756,0.108350462054011,0.129809259709619,0.129273397383927 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Wellsites,5,0.120865154448231,0.106933037026666,0.135907579517197,0.135555384778656 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Crop,5,0.074461797530342,0.0663055752886782,0.0784646756931369,0.080469463459423 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,TameP,5,0.139209058513911,0.127041125175049,0.146790768834801,0.148781802724197 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,RoughP,5,0.141247542624157,0.127091822586834,0.155254205987659,0.153373422859104 -bryophyte,bryophyte,south,,,Bryum.All,Loamy,5,0.128371275228788,0.126267345563482,0.192554766969062,0.156609764097912 -bryophyte,bryophyte,south,,,Bryum.All,SandyLoam,5,0.163687813793554,0.157864329641462,0.257888717822438,0.209805018041589 -bryophyte,bryophyte,south,,,Bryum.All,ClaySub,5,0.138847380253595,0.129440293252389,0.192920064856309,0.163480694825708 -bryophyte,bryophyte,south,,,Bryum.All,RapidDrain,5,0.151000064270357,0.12841178366917,0.214806584231797,0.179839142499951 -bryophyte,bryophyte,south,,,Bryum.All,Blowout,5,0.177847228366661,0.13169779331486,0.213345983888902,0.18962303788414 -bryophyte,bryophyte,south,,,Bryum.All,ThinBreak,5,0.108774649500815,0.100351516195694,0.149118127661729,0.13142432263142 -bryophyte,bryophyte,south,,,Bryum.All,Other,5,0.153008911192339,0.143619231829843,0.22761954763385,0.192944265564736 -bryophyte,bryophyte,south,,,Bryum.All,EnSeismic,5,0.334606425412252,0.156177390749094,0.434765493190856,0.334606425412252 -bryophyte,bryophyte,south,,,Bryum.All,EnSoftLin,5,0.329548544110659,0.161421900535046,0.471022939170799,0.329548544110659 -bryophyte,bryophyte,south,,,Bryum.All,TrSoftLin,5,0.375563737003068,0.183612394029062,0.460581289024939,0.383815980210159 -bryophyte,bryophyte,south,,,Bryum.All,HardLin,5,0.1468328366873,0.0883371659600431,0.208225904838994,0.1468328366873 -bryophyte,bryophyte,south,,,Bryum.All,UrbInd,5,0.104701482537215,0.103446912111058,0.180846515565828,0.15376441179003 -bryophyte,bryophyte,south,,,Bryum.All,Wellsites,5,0.103827170399858,0.0947594363214667,0.177418037109713,0.140420183947776 -bryophyte,bryophyte,south,,,Bryum.All,Crop,5,0.0834326498037117,0.0762103903441286,0.118437315338461,0.100381454106891 -bryophyte,bryophyte,south,,,Bryum.All,TameP,5,0.124085918128196,0.113948945983715,0.179967952926487,0.164423435504234 -bryophyte,bryophyte,south,,,Bryum.All,RoughP,5,0.102704627973536,0.0996345261643043,0.149622110445284,0.13419258459678 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,Loamy,5,0.0641849871927666,0.050457745645129,0.07270277108154,0.0641849871927666 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,SandyLoam,5,0.0742797240604397,0.0646788146747532,0.0864582537717612,0.0742797240604397 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,ClaySub,5,0.0592505109132571,0.0488344242492647,0.0699996689330231,0.0592505109132571 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,RapidDrain,5,0.102551453445416,0.0986747245418018,0.114617392978353,0.102551453445416 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,Blowout,5,0.108577749315386,0.0975839841162081,0.119450204289074,0.108577749315386 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,ThinBreak,5,0.0863196169586629,0.0821949327472845,0.0998445672388945,0.0863196169586629 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,Other,5,0.0345770287640794,0.0255035080368273,0.0522013822338746,0.0345770287640794 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,EnSeismic,5,0.21574628197629,0.142477035309188,0.248955821906755,0.16811461642476 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,EnSoftLin,5,0.211754576394213,0.13866240930989,0.222190780941109,0.169876045775971 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,TrSoftLin,5,0.194018984551885,0.147159530414209,0.240287969097993,0.160797502761418 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,HardLin,5,0.0304162076535258,0.029166064034397,0.0432718766595132,0.0318703430228878 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,UrbInd,5,0.0356740467063795,0.0286632065765225,0.0429956144747444,0.0356740467063795 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,Wellsites,5,0.0429922761944743,0.0335372326498226,0.0467533160557549,0.0401699600814057 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,Crop,5,0.0228689540457825,0.0221752232262121,0.0277192165390448,0.0251044943216744 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,TameP,5,0.0603942872656395,0.0505159739370433,0.0666385260267113,0.054988635814872 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,RoughP,5,0.0576120452574267,0.0486453851644709,0.0647244005298698,0.0547537316462016 -lichen,lichen,north,,,Cladonia.chlorophaea,WhiteSpruce,5,0.299712823406177,0.267794399850091,0.31752477391247,0.299712823406177 -lichen,lichen,north,,,Cladonia.chlorophaea,Pine,5,0.211658158470293,0.187362325848506,0.221031041496282,0.213983673760142 -lichen,lichen,north,,,Cladonia.chlorophaea,Deciduous,5,0.242873835985486,0.212311835312585,0.251351915041242,0.242873835985486 -lichen,lichen,north,,,Cladonia.chlorophaea,Mixedwood,5,0.236140666947542,0.203901410662992,0.241600545650375,0.236140666947542 -lichen,lichen,north,,,Cladonia.chlorophaea,BlackSpruce,5,0.225302562827919,0.196261190714303,0.244967963651107,0.227843083435444 -lichen,lichen,north,,,Cladonia.chlorophaea,TreedFen,5,0.224783844707001,0.197704546932338,0.235642483863854,0.224783844707001 -lichen,lichen,north,,,Cladonia.chlorophaea,TreedSwamp,5,0.242591050953153,0.214272220682311,0.263632169592523,0.252640022245541 -lichen,lichen,north,,,Cladonia.chlorophaea,GraminoidFen,5,0.202508662292495,0.17836174844921,0.21210857272356,0.202508662292495 -lichen,lichen,north,,,Cladonia.chlorophaea,ShrubbyFen,5,0.199216086052812,0.177644856358741,0.212793282034292,0.199216086052812 -lichen,lichen,north,,,Cladonia.chlorophaea,ShrubbyBog,5,0.221625062963166,0.192800896978028,0.237791260930442,0.22188456568578 -lichen,lichen,north,,,Cladonia.chlorophaea,ShrubbySwamp,5,0.200597494570593,0.181101882111374,0.22301802236821,0.214356168657179 -lichen,lichen,north,,,Cladonia.chlorophaea,Marsh,5,0.175479744974187,0.145546102447274,0.1832220543811,0.175479744974187 -lichen,lichen,north,,,Cladonia.chlorophaea,Shrub,5,0.106371701235334,0.0787744447962615,0.122122293070246,0.12074279741616 -lichen,lichen,north,,,Cladonia.chlorophaea,Grass,5,0.096028783987272,0.0852156012169443,0.115683635060321,0.119014260443607 -lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruceR,5,0.169230436345503,0.139669943547809,0.195621086516419,0.18615405031743 -lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce1,5,0.181781734947402,0.144657786769576,0.210046678174516,0.20367100535893 -lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce2,5,0.208024972338578,0.167844483274645,0.235168093350801,0.225668903881609 -lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce3,5,0.208024972338578,0.167844483274645,0.235168093350801,0.225668903881609 -lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce4,5,0.208024972338578,0.167844483274645,0.235168093350801,0.225668903881609 -lichen,lichen,north,,,Cladonia.chlorophaea,CCPineR,5,0.167651692032762,0.133400179473255,0.18613840582969,0.177981748325327 -lichen,lichen,north,,,Cladonia.chlorophaea,CCPine1,5,0.205931254374661,0.156797989826113,0.214389722872389,0.215966217533035 -lichen,lichen,north,,,Cladonia.chlorophaea,CCPine2,5,0.20940040025485,0.161084160390568,0.217535050260925,0.219134448870029 -lichen,lichen,north,,,Cladonia.chlorophaea,CCPine3,5,0.20940040025485,0.161084160390568,0.217535050260925,0.219134448870029 -lichen,lichen,north,,,Cladonia.chlorophaea,CCPine4,5,0.20940040025485,0.161084160390568,0.217535050260925,0.219134448870029 -lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduousR,5,0.182662436599129,0.143290947030515,0.19168320742142,0.185594844139235 -lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous1,5,0.169020934098229,0.153496766364474,0.186476102510212,0.18593824743331 -lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous2,5,0.192198726287736,0.158139093430204,0.206351929165891,0.20739871277065 -lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous3,5,0.192198726287736,0.158139093430204,0.206351929165891,0.20739871277065 -lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous4,5,0.192198726287736,0.158139093430204,0.206351929165891,0.20739871277065 -lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwoodR,5,0.182662436599129,0.143290947030515,0.19168320742142,0.185594844139235 -lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood1,5,0.169020934098229,0.153496766364474,0.186476102510212,0.18593824743331 -lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood2,5,0.192198726287736,0.158139093430204,0.206351929165891,0.20739871277065 -lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood3,5,0.192198726287736,0.158139093430204,0.206351929165891,0.20739871277065 -lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood4,5,0.192198726287736,0.158139093430204,0.206351929165891,0.20739871277065 -lichen,lichen,north,,,Cladonia.chlorophaea,EnSeismic,5,0.0677503172110941,0.0471429245544719,0.0732894752325876,0.0738978700051816 -lichen,lichen,north,,,Cladonia.chlorophaea,EnSoftLin,5,0.0560689010826879,0.0412420864698087,0.0607043262160254,0.0624980816232269 -lichen,lichen,north,,,Cladonia.chlorophaea,TrSoftLin,5,0.0605465982137621,0.0416835448522874,0.0681202259279406,0.0691216097124846 -lichen,lichen,north,,,Cladonia.chlorophaea,HardLin,5,0.0163800997555834,0.0142046646641618,0.0207897341200193,0.0172490121407761 -lichen,lichen,north,,,Cladonia.chlorophaea,UrbInd,5,0.026932901747997,0.0217317496788856,0.032534963821666,0.0293523293874362 -lichen,lichen,north,,,Cladonia.chlorophaea,Wellsites,5,0.0269864370031369,0.0206711523672041,0.0318822891198792,0.0309948356921504 -lichen,lichen,north,,,Cladonia.chlorophaea,Crop,5,0.00896331783563511,0.0086673108662899,0.0116267325606197,0.00981647353265912 -lichen,lichen,north,,,Cladonia.chlorophaea,TameP,5,0.0284182757721163,0.0236344354897084,0.0319552752867162,0.0276152084684389 -lichen,lichen,north,,,Cladonia.chlorophaea,RoughP,5,0.025017860881902,0.0188312694768778,0.026815348770033,0.0254030986816399 -lichen,lichen,north,,,Physcia.adscendens,WhiteSpruce,5,0.0674088713205342,0.0614470981390403,0.0709653557850045,0.0640273150290537 -lichen,lichen,north,,,Physcia.adscendens,Pine,5,0.0472827411302775,0.0444708053145572,0.0510027667554357,0.0463066694973039 -lichen,lichen,north,,,Physcia.adscendens,Deciduous,5,0.171848485649294,0.166777961008327,0.183050642925004,0.171848485649294 -lichen,lichen,north,,,Physcia.adscendens,Mixedwood,5,0.103902979074589,0.0988920160049394,0.118672559907655,0.103902979074589 -lichen,lichen,north,,,Physcia.adscendens,BlackSpruce,5,0.0116692571413722,0.0109018461718084,0.0148387626612113,0.0111517688016057 -lichen,lichen,north,,,Physcia.adscendens,TreedFen,5,0.0134516061910062,0.0123980063480553,0.0165551828482426,0.0127565152125194 -lichen,lichen,north,,,Physcia.adscendens,TreedSwamp,5,0.0684768936890089,0.0623100924562356,0.0815946560942004,0.0684768936890089 -lichen,lichen,north,,,Physcia.adscendens,GraminoidFen,5,0.0143523346004894,0.0138707572661006,0.0201350817078948,0.0143523346004894 -lichen,lichen,north,,,Physcia.adscendens,ShrubbyFen,5,0.0135292337016339,0.0132145942878114,0.0184646324742449,0.0134564657796432 -lichen,lichen,north,,,Physcia.adscendens,ShrubbyBog,5,0.0122579132788025,0.0117121025240539,0.0159189671771411,0.0119692218653384 -lichen,lichen,north,,,Physcia.adscendens,ShrubbySwamp,5,0.0642372109431116,0.0574653507523936,0.0782239746399321,0.0642372109431116 -lichen,lichen,north,,,Physcia.adscendens,Marsh,5,0.0421183317862372,0.0354669594231994,0.0538859562288842,0.0421183317862372 -lichen,lichen,north,,,Physcia.adscendens,Shrub,5,0.148981950749374,0.139298464646428,0.195805779656963,0.159263060245612 -lichen,lichen,north,,,Physcia.adscendens,Grass,5,0.155922328843144,0.144176169953379,0.217726117790744,0.165761675145329 -lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruceR,5,0.0524933497432348,0.0448033430759125,0.0658373565662838,0.0524933497432348 -lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce1,5,0.0676142549226719,0.0595386229110912,0.0842373851191382,0.0676142549226719 -lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce2,5,0.075962081883682,0.0661774643260701,0.0924254985770442,0.075962081883682 -lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce3,5,0.075962081883682,0.0661774643260701,0.0924254985770442,0.075962081883682 -lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce4,5,0.075962081883682,0.0661774643260701,0.0924254985770442,0.075962081883682 -lichen,lichen,north,,,Physcia.adscendens,CCPineR,5,0.0530687182992354,0.0447898946528459,0.0673364978932711,0.0530687182992354 -lichen,lichen,north,,,Physcia.adscendens,CCPine1,5,0.054822170261719,0.0468044875054749,0.0681089706028397,0.054822170261719 -lichen,lichen,north,,,Physcia.adscendens,CCPine2,5,0.0575642554040823,0.0490603503195198,0.0707082507546723,0.0575642554040823 -lichen,lichen,north,,,Physcia.adscendens,CCPine3,5,0.0575642554040823,0.0490603503195198,0.0707082507546723,0.0575642554040823 -lichen,lichen,north,,,Physcia.adscendens,CCPine4,5,0.0575642554040823,0.0490603503195198,0.0707082507546723,0.0575642554040823 -lichen,lichen,north,,,Physcia.adscendens,CCDeciduousR,5,0.0827606661851487,0.0719443499282712,0.0987851185715972,0.0827606661851487 -lichen,lichen,north,,,Physcia.adscendens,CCDeciduous1,5,0.100618826509217,0.0877886957545074,0.125713872307938,0.100618826509217 -lichen,lichen,north,,,Physcia.adscendens,CCDeciduous2,5,0.084212382915902,0.073575752550813,0.103101354854498,0.084212382915902 -lichen,lichen,north,,,Physcia.adscendens,CCDeciduous3,5,0.084212382915902,0.073575752550813,0.103101354854498,0.084212382915902 -lichen,lichen,north,,,Physcia.adscendens,CCDeciduous4,5,0.084212382915902,0.073575752550813,0.103101354854498,0.084212382915902 -lichen,lichen,north,,,Physcia.adscendens,CCMixedwoodR,5,0.0827606661851487,0.0719443499282712,0.0987851185715972,0.0827606661851487 -lichen,lichen,north,,,Physcia.adscendens,CCMixedwood1,5,0.100618826509217,0.0877886957545074,0.125713872307938,0.100618826509217 -lichen,lichen,north,,,Physcia.adscendens,CCMixedwood2,5,0.084212382915902,0.073575752550813,0.103101354854498,0.084212382915902 -lichen,lichen,north,,,Physcia.adscendens,CCMixedwood3,5,0.084212382915902,0.073575752550813,0.103101354854498,0.084212382915902 -lichen,lichen,north,,,Physcia.adscendens,CCMixedwood4,5,0.084212382915902,0.073575752550813,0.103101354854498,0.084212382915902 -lichen,lichen,north,,,Physcia.adscendens,EnSeismic,5,0.0256366775276155,0.0220396461224062,0.0258667757531508,0.0258176949589414 -lichen,lichen,north,,,Physcia.adscendens,EnSoftLin,5,0.0273345543422601,0.0238543237522917,0.0285016462750445,0.0273345543422601 -lichen,lichen,north,,,Physcia.adscendens,TrSoftLin,5,0.0237240874831371,0.0199061804072359,0.0246224989022288,0.0242538337610053 -lichen,lichen,north,,,Physcia.adscendens,HardLin,5,0.019409667521594,0.0160175308478019,0.0222563530629276,0.0164220788059039 -lichen,lichen,north,,,Physcia.adscendens,UrbInd,5,0.0269462495385606,0.0228419440845845,0.0343747203469902,0.0269462495385606 -lichen,lichen,north,,,Physcia.adscendens,Wellsites,5,0.0189042713169681,0.0175846129876694,0.0279662325594366,0.0189042713169681 -lichen,lichen,north,,,Physcia.adscendens,Crop,5,0.0061978772206181,0.00485501825215725,0.00819431107983461,0.0061978772206181 -lichen,lichen,north,,,Physcia.adscendens,TameP,5,0.0217469866099191,0.0205259688525677,0.0269346862339065,0.0217469866099191 -lichen,lichen,north,,,Physcia.adscendens,RoughP,5,0.039996203554655,0.0376640264085737,0.0479047806634932,0.039996203554655 -lichen,lichen,south,,,Cladonia.chlorophaea,Loamy,5,0.118687300046851,0.104702736998946,0.12654114918338,0.118687300046851 -lichen,lichen,south,,,Cladonia.chlorophaea,SandyLoam,5,0.119258055085243,0.104379389676667,0.12444806981178,0.122725360583689 -lichen,lichen,south,,,Cladonia.chlorophaea,ClaySub,5,0.115647388648516,0.100225827670201,0.120420274007026,0.11648008810727 -lichen,lichen,south,,,Cladonia.chlorophaea,RapidDrain,5,0.134401942825707,0.130919679999458,0.142386868085905,0.134401942825707 -lichen,lichen,south,,,Cladonia.chlorophaea,Blowout,5,0.151003729060033,0.142629562152347,0.160102906059062,0.143701037126792 -lichen,lichen,south,,,Cladonia.chlorophaea,ThinBreak,5,0.137503969297793,0.129839880347417,0.148096403740304,0.137503969297793 -lichen,lichen,south,,,Cladonia.chlorophaea,Other,5,0.011592343091593,0.0046173071411171,0.0231715222749202,0.011592343091593 -lichen,lichen,south,,,Cladonia.chlorophaea,EnSeismic,5,0.0962488205728889,0.0753549922631135,0.252780357762154,0.0746380066039094 -lichen,lichen,south,,,Cladonia.chlorophaea,EnSoftLin,5,0.100106376262895,0.0629831331203498,0.25663036318437,0.0593528864488744 -lichen,lichen,south,,,Cladonia.chlorophaea,TrSoftLin,5,0.104765725082673,0.0622678835132489,0.285864107347038,0.104765725082673 -lichen,lichen,south,,,Cladonia.chlorophaea,HardLin,5,0.0224141883326856,0.0219404643210603,0.0240466025090097,0.0224141883326856 -lichen,lichen,south,,,Cladonia.chlorophaea,UrbInd,5,0.0316560982778314,0.0261042267475289,0.0343242569398769,0.0287494220624193 -lichen,lichen,south,,,Cladonia.chlorophaea,Wellsites,5,0.0355928387293783,0.0297480296972117,0.0456614857314296,0.0355928387293783 -lichen,lichen,south,,,Cladonia.chlorophaea,Crop,5,0.0115918691627171,0.0109797156544521,0.0127817951554016,0.0108908943675099 -lichen,lichen,south,,,Cladonia.chlorophaea,TameP,5,0.0528035523685076,0.0519157543218056,0.0592890736068868,0.0527988783208814 -lichen,lichen,south,,,Cladonia.chlorophaea,RoughP,5,0.0704617752927988,0.0683113023707642,0.0754893494676391,0.0704617752927988 -lichen,lichen,south,,,Physcia.adscendens,Loamy,5,0.165058834401252,0.151196844376258,0.179127371014315,0.169700398944145 -lichen,lichen,south,,,Physcia.adscendens,SandyLoam,5,0.178172116249331,0.161926494649089,0.189941302784499,0.181481384725004 -lichen,lichen,south,,,Physcia.adscendens,ClaySub,5,0.155520095046812,0.142809679634744,0.167690632468226,0.162178734164762 -lichen,lichen,south,,,Physcia.adscendens,RapidDrain,5,0.133157166351654,0.123712598889612,0.139250440689584,0.138113163461797 -lichen,lichen,south,,,Physcia.adscendens,Blowout,5,0.0780059275319079,0.0605615716646166,0.0817059444700948,0.0791009289771177 -lichen,lichen,south,,,Physcia.adscendens,ThinBreak,5,0.103023942244417,0.0819954494155731,0.103983652295498,0.103023942244417 -lichen,lichen,south,,,Physcia.adscendens,Other,5,0.108836563387276,0.0821453221454944,0.133452128995239,0.127814796703126 -lichen,lichen,south,,,Physcia.adscendens,EnSeismic,5,0.140820975204423,0.129482190661842,0.19424153380181,0.134144710345317 -lichen,lichen,south,,,Physcia.adscendens,EnSoftLin,5,0.106052188933668,0.0814400391043974,0.130572037732656,0.0868856909303751 -lichen,lichen,south,,,Physcia.adscendens,TrSoftLin,5,0.157835534383738,0.120487024187209,0.209774497540774,0.157835534383738 -lichen,lichen,south,,,Physcia.adscendens,HardLin,5,0.0165350535429243,0.0120621070012098,0.0195286140965431,0.0165350535429243 -lichen,lichen,south,,,Physcia.adscendens,UrbInd,5,0.0389262598086267,0.0294939748318359,0.0530990959477553,0.0431506202004028 -lichen,lichen,south,,,Physcia.adscendens,Wellsites,5,0.0361212212999052,0.0282999511156899,0.0508786677112775,0.0413073764753538 -lichen,lichen,south,,,Physcia.adscendens,Crop,5,0.00923975055880215,0.00688935614723793,0.00990739362805418,0.00923975055880215 -lichen,lichen,south,,,Physcia.adscendens,TameP,5,0.026713869603247,0.0180795051503958,0.0297402158652557,0.026713869603247 -lichen,lichen,south,,,Physcia.adscendens,RoughP,5,0.039320400519205,0.0281759149172245,0.0418780712232037,0.039320400519205 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Decid,5,0.047640807803491,0.0421034563656317,0.0521300438758573,0.0487558878166635 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Mixedwood,5,0.0279054540414128,0.0181658689236166,0.0367559849225421,0.0339606541972421 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Pine,5,0.0268788058190438,0.0209609632124494,0.0305097583077334,0.0258942184497686 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Spruce,5,0.0176721263875699,0.0146608207690292,0.0193257868464236,0.0155269078679997 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,TreedBog,5,0.0312070092273878,0.0296707284210888,0.0333575322543523,0.0299192022319042 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,TreedFen,5,0.031652259109271,0.0295795976387661,0.0337216938968473,0.0299192022319042 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,TreedSwamp,5,0.0344943810177399,0.0306124249828509,0.0489375718055997,0.0299192022319042 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,GrassHerb,5,0.0653279741583057,0.061888271218626,0.089856562855897,0.0701423452426464 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Shrub,5,0.0611030881192147,0.0442445083456052,0.0682165968089101,0.0701423452426464 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,GraminoidFen,5,0.0329008222005278,0.0311059034360441,0.0791720523993423,0.0320501190239091 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Marsh,5,0.0329008222005278,0.0311059034360441,0.0791720523993423,0.0320501190239091 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,ShrubbyBog,5,0.0304764263774674,0.0254605104823409,0.0325605409298803,0.0320501190239091 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,ShrubbyFen,5,0.0304764263774674,0.0254605104823409,0.0325605409298803,0.0320501190239091 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,ShrubbySwamp,5,0.0304764263774674,0.0207171959827077,0.0325605409298803,0.0320501190239091 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCDecidR,5,0.0519264751930211,0.0421909761363827,0.0610656929689814,0.0664247062431653 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCDecid1,5,0.0664247062431653,0.0454313130756783,0.161801935827499,0.0664247062431653 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCDecid2,5,0.0403674064209935,0.0226811921693289,0.0610656929689814,0.0664247062431653 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCDecid3,5,0.0664247062431653,0.0454313130756783,0.13984577572166,0.0664247062431653 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCDecid4,5,0.0664247062431653,0.0454313130756783,0.13984577572166,0.0664247062431653 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCMixedwoodR,5,0.0403674064209935,1.86696880287542e-07,0.0610656929689814,0.0664247062431653 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCMixedwood1,5,0.0664247062431653,0.0454313130756783,0.0985082759740731,0.0664247062431653 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCMixedwood2,5,0.0664247062431653,0.0454313130756783,0.0927460852883475,0.0664247062431653 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCMixedwood3,5,0.0664247062431653,0.0454313130756783,0.13984577572166,0.0664247062431653 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCMixedwood4,5,0.0664247062431653,0.0454313130756783,0.13984577572166,0.0664247062431653 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCPineR,5,0.0329977774300808,0.0275981212995825,0.055494150911045,0.0418434478038768 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCPine1,5,0.0286931152246994,0.00895589257187608,0.0383051796543584,0.0418434478038768 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCPine2,5,0.0418434478038768,0.030414980106852,0.13984577572166,0.0418434478038768 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCPine3,5,0.0418434478038768,0.030414980106852,0.13984577572166,0.0418434478038768 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCPine4,5,0.0418434478038768,0.030414980106852,0.13984577572166,0.0418434478038768 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCSpruceR,5,0.0418434478038768,0.030414980106852,0.305015280094132,0.0418434478038768 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCSpruce1,5,0.0329977774300808,0.0114772753535638,0.0426296284343427,0.0418434478038768 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCSpruce2,5,0.0329977774300808,0.0196456208529556,0.0493468226750582,0.0418434478038768 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCSpruce3,5,0.0418434478038768,0.030414980106852,0.13984577572166,0.0418434478038768 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCSpruce4,5,0.0418434478038768,0.030414980106852,0.13984577572166,0.0418434478038768 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,HardLin,5,0.134939746303501,0.11313165192637,0.138252211851646,0.140140987080189 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,EnSoftLin,5,0.135928985585703,0.114033932348076,0.146463088964367,0.108633567141907 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,EnSeismic,5,0.12213448015733,0.0890416535123073,0.143994279540726,0.108633567141907 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,TrSoftLin,5,0.108633567141907,0.0713041482970402,0.138717152503764,0.108633567141907 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Urban,5,0.134939746303501,0.11313165192637,0.138252211851646,0.140140987080189 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Rural,5,0.134939746303501,0.11313165192637,0.138252211851646,0.140140987080189 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Industrial,5,0.134939746303501,0.11313165192637,0.138252211851646,0.140140987080189 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Well,5,0.129304108911142,0.0508739875681123,0.138060490769514,0.140140987080189 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Crop,5,0.134939746303501,0.130856632631654,0.142628003268766,0.140140987080189 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,TameP,5,0.140140987080189,0.131558363868086,0.166944782085177,0.140140987080189 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,RoughP,5,0.134939746303501,0.107211805137829,0.197177402914023,0.140140987080189 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Decid,5,0.257670301669833,0.25268511782041,0.299216536351889,0.250263196314734 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Mixedwood,5,0.275371757751266,0.246931841338979,0.300679741105016,0.267778296796379 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Pine,5,0.191627552662267,0.185639377125035,0.22504720435644,0.191627552662267 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Spruce,5,0.227199239938309,0.197719069725711,0.261529215102722,0.211937623492895 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,TreedBog,5,0.148793830904151,0.132497404514779,0.155371350064858,0.13349759896445 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,TreedFen,5,0.144475982710738,0.132978225672994,0.154438886014026,0.140460621172556 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,TreedSwamp,5,0.249048354321576,0.223475542712116,0.289138875493625,0.219333664647888 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,GrassHerb,5,0.2480296169969,0.237318154647019,0.315522864674229,0.243208536186666 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Shrub,5,0.23362253489809,0.21634137243735,0.257032219262653,0.23362253489809 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,GraminoidFen,5,0.272335942420037,0.244138225439184,0.296606395166859,0.272335942420037 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Marsh,5,0.272335942420037,0.244138225439184,0.296606395166859,0.272335942420037 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,ShrubbyBog,5,0.129805148819312,0.116205825982704,0.158770458351882,0.123758665516073 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,ShrubbyFen,5,0.129805148819312,0.116205825982704,0.158770458351882,0.123758665516073 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,ShrubbySwamp,5,0.188745324781336,0.167005561530848,0.253626121411953,0.188745324781336 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCDecidR,5,0.231790845755958,0.199250708118932,0.239359596218743,0.204735734181689 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCDecid1,5,0.231790845755958,0.199250708118932,0.239359596218743,0.204735734181689 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCDecid2,5,0.231790845755958,0.199250708118932,0.239359596218743,0.204735734181689 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCDecid3,5,0.231790845755958,0.199250708118932,0.239359596218743,0.204735734181689 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCDecid4,5,0.231790845755958,0.199250708118932,0.239359596218743,0.204735734181689 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCMixedwoodR,5,0.231790845755958,0.199250708118932,0.239359596218743,0.204735734181689 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCMixedwood1,5,0.231790845755958,0.199250708118932,0.239359596218743,0.204735734181689 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCMixedwood2,5,0.231790845755958,0.199250708118932,0.239359596218743,0.204735734181689 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCMixedwood3,5,0.231790845755958,0.199250708118932,0.239359596218743,0.204735734181689 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCMixedwood4,5,0.231790845755958,0.199250708118932,0.239359596218743,0.204735734181689 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCPineR,5,0.334283211887097,0.223646034396249,0.350195977658891,0.252728055432474 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCPine1,5,0.334283211887097,0.223646034396249,0.350195977658891,0.252728055432474 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCPine2,5,0.334283211887097,0.223646034396249,0.350195977658891,0.252728055432474 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCPine3,5,0.334283211887097,0.223646034396249,0.350195977658891,0.252728055432474 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCPine4,5,0.334283211887097,0.223646034396249,0.350195977658891,0.252728055432474 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCSpruceR,5,0.321916199827704,0.226786073940564,0.3362304790634,0.251426565070253 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCSpruce1,5,0.321916199827704,0.226786073940564,0.3362304790634,0.251426565070253 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCSpruce2,5,0.321916199827704,0.226786073940564,0.3362304790634,0.251426565070253 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCSpruce3,5,0.321916199827704,0.226786073940564,0.3362304790634,0.251426565070253 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCSpruce4,5,0.321916199827704,0.226786073940564,0.3362304790634,0.251426565070253 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,HardLin,5,0.19071774622534,0.0974007399519308,0.240733568496156,0.111539574120126 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,EnSoftLin,5,0.248284317219045,0.226169685664436,0.301392052670499,0.245765939186683 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,EnSeismic,5,0.426961347747829,0.389435322188954,0.481650459050364,0.40014515763882 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,TrSoftLin,5,0.17814172514827,0.12158426489911,0.222472294628215,0.191095088735685 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Urban,5,0.19071774622534,0.0974007399519308,0.240733568496156,0.111539574120126 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Rural,5,0.19071774622534,0.0974007399519308,0.240733568496156,0.111539574120126 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Industrial,5,0.19071774622534,0.0974007399519308,0.240733568496156,0.111539574120126 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Well,5,0.204111777253966,0.157588378902068,0.3180994853061,0.135502134019886 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Crop,5,0.177273110573243,0.159339604167137,0.20698726239642,0.177273110573243 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,TameP,5,0.106013821908483,0.0894430978024326,0.17346343225447,0.0952839991630323 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,RoughP,5,0.274174686267773,0.223732051403491,0.374273016748219,0.274174686267773 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,ClaySub,5,0.555220139484688,0.394498331723014,0.702736975528346,0.555220139484688 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Other,5,0.555220139484688,0.394498331723014,0.702736975528346,0.555220139484688 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,RapidDrain,5,0.634195131080269,0.466725133776188,0.702736975528346,0.555220139484688 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Loamy,5,0.585624995059312,0.517090683974723,0.733450970235701,0.585624995059312 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,SandyLoam,5,0.779017339675273,0.680988596683654,0.866425950439531,0.779017339675273 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,ThinBreak,5,0.555220139484688,0.448231043418837,0.702736975528346,0.555220139484688 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Blowout,5,0.555220139484688,0.448231043418837,0.702736975528346,0.555220139484688 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Urban,5,0.583445114492641,0.499588697752921,0.825386051737734,0.487723056831294 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Rural,5,0.583445114492641,0.499588697752921,0.825386051737734,0.487723056831294 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Industrial,5,0.583445114492641,0.499588697752921,0.825386051737734,0.487723056831294 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Well,5,0.517387159135361,0.485351712822258,0.654799112289952,0.487723056831294 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Mine,5,0.583445114492641,0.499588697752921,0.825386051737734,0.487723056831294 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,EnSoftLin,5,0.551988691379397,0.472907672172372,0.746855800537036,0.551988691379397 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,EnSeismic,5,0.551988691379397,0.472907672172372,0.746855800537036,0.551988691379397 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,HardLin,5,0.583445114492641,0.499588697752921,0.825386051737734,0.487723056831294 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,TrSoftLin,5,0.551988691379397,0.472907672172372,0.661295206321867,0.551988691379397 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Crop,5,0.664605920258043,0.543810341278273,0.777406068435428,0.664605920258043 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,RoughP,5,0.661922813941234,0.543810341278273,0.734870844221513,0.664605920258043 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,TameP,5,0.664605920258043,0.543810341278273,0.762991086100113,0.664605920258043 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,WetlandMargin,5,0.585444465824865,0.239308585750385,0.749205253519565,0.585444465824865 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,ClaySub,5,0.0667209228725318,0.0471871616217136,0.0745121978337484,0.0784267337005647 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Other,5,0.0667209228725318,0.0471871616217136,0.0745121978337484,0.0784267337005647 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,RapidDrain,5,0.0784267337005647,0.0580184128835627,0.182475942831045,0.0784267337005647 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Loamy,5,0.0565859324870483,0.0491432799330989,0.0744882681216602,0.0784267337005647 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,SandyLoam,5,0.0522167395575833,0.022088416299373,0.106394166195476,0.0784267337005647 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,ThinBreak,5,0.0667209228725318,0.0526910929547497,0.0819102188921822,0.0784267337005647 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Blowout,5,0.0667209228725318,0.0526910929547497,0.0819102188921822,0.0784267337005647 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Urban,5,0.00922653651061864,0.0027634925310201,0.030904020696116,0.00922653651061864 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Rural,5,0.00922653651061864,0.0027634925310201,0.030904020696116,0.00922653651061864 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Industrial,5,0.00922653651061864,0.0027634925310201,0.030904020696116,0.00922653651061864 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Well,5,0.00242981545308046,4.85369257366382e-09,0.00684152516554301,0.00922653651061864 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Mine,5,0.00922653651061864,0.0027634925310201,0.030904020696116,0.00922653651061864 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,EnSoftLin,5,0.036098691627639,0.0108694320397718,0.0881199281160513,0.036098691627639 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,EnSeismic,5,0.036098691627639,0.0108694320397718,0.0881199281160513,0.036098691627639 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,HardLin,5,0.00922653651061864,0.0027634925310201,0.030904020696116,0.00922653651061864 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,TrSoftLin,5,0.0271735638239476,0.0226676570357414,0.0432617606269774,0.036098691627639 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Crop,5,0.0206055204843312,0.0177111458771107,0.0251768860663094,0.0270020288489522 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,RoughP,5,0.0225176634330294,0.0183397065659335,0.0271753939444167,0.0270020288489522 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,TameP,5,0.0168291639536684,0.00689293851916878,0.0244434255031038,0.0270020288489522 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,WetlandMargin,5,1.94731766462466e-08,9.60713813825307e-09,2.26961479274612e-08,2.33837497296015e-08 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Decid,5,0.0449203614522765,0.0399272055174853,0.0461207026143072,0.0449203614522765 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Mixedwood,5,0.0273241474240622,0.0148672640830864,0.029705093739567,0.0273241474240622 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Pine,5,0.0196006162097023,0.0177223221151389,0.0208573336024009,0.0176556438960936 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Spruce,5,0.0133118475600801,0.00928641896189441,0.0154669185911262,0.0137961282417973 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,TreedBog,5,0.0269986743089763,0.0246332515524093,0.0296528479842816,0.0286355651253948 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,TreedFen,5,0.0346703571209486,0.0300665281749436,0.0351451063464642,0.0316720599445966 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,TreedSwamp,5,0.0562955719457925,0.0435834392821119,0.07751039884971,0.0562955719457925 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,GrassHerb,5,0.0804381287263335,0.077265490603449,0.0897442881448977,0.0783755759784833 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Shrub,5,0.0681831360493072,0.0495067618820586,0.0834804792057293,0.0693588214886089 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,GraminoidFen,5,0.08298929154192,0.0746709031965066,0.0861134405713966,0.0834692933781883 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Marsh,5,0.08298929154192,0.0746709031965066,0.0861134405713966,0.0834692933781883 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,ShrubbyBog,5,0.0137861868727856,0.0133312667653021,0.0163982311535578,0.0174941754511015 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,ShrubbyFen,5,0.0137861868727856,0.0133312667653021,0.0163982311535578,0.0174941754511015 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,ShrubbySwamp,5,0.023346797778904,0.015694365834426,0.0247290058987953,0.0195830589922788 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCDecidR,5,0.0634232741924905,0.0524183155350296,0.0816623550282871,0.0634232741924905 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCDecid1,5,0.0634232741924905,0.0524183155350296,0.0816623550282871,0.0634232741924905 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCDecid2,5,0.0634232741924905,0.0524183155350296,0.0816623550282871,0.0634232741924905 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCDecid3,5,0.0634232741924905,0.0524183155350296,0.0816623550282871,0.0634232741924905 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCDecid4,5,0.0634232741924905,0.0524183155350296,0.0816623550282871,0.0634232741924905 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCMixedwoodR,5,0.0634232741924905,0.0524183155350296,0.0816623550282871,0.0634232741924905 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCMixedwood1,5,0.0634232741924905,0.0524183155350296,0.0816623550282871,0.0634232741924905 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCMixedwood2,5,0.0634232741924905,0.0524183155350296,0.0816623550282871,0.0634232741924905 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCMixedwood3,5,0.0634232741924905,0.0524183155350296,0.0816623550282871,0.0634232741924905 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCMixedwood4,5,0.0634232741924905,0.0524183155350296,0.0816623550282871,0.0634232741924905 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCPineR,5,0.0429017164110987,0.0334830377890367,0.05791632388432,0.0429017164110987 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCPine1,5,0.0429017164110987,0.0334830377890367,0.05791632388432,0.0429017164110987 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCPine2,5,0.0429017164110987,0.0334830377890367,0.05791632388432,0.0429017164110987 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCPine3,5,0.0429017164110987,0.0334830377890367,0.05791632388432,0.0429017164110987 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCPine4,5,0.0429017164110987,0.0334830377890367,0.05791632388432,0.0429017164110987 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCSpruceR,5,0.024139993434008,0.0150053643826653,0.0287361913785556,0.0309648973086927 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCSpruce1,5,0.024139993434008,0.0150053643826653,0.0287361913785556,0.0309648973086927 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCSpruce2,5,0.024139993434008,0.0150053643826653,0.0287361913785556,0.0309648973086927 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCSpruce3,5,0.024139993434008,0.0150053643826653,0.0287361913785556,0.0309648973086927 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCSpruce4,5,0.024139993434008,0.0150053643826653,0.0287361913785556,0.0309648973086927 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,HardLin,5,0.121863990133419,0.119864788586073,0.129947053494084,0.118992631310027 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,EnSoftLin,5,0.108883674200791,0.0983056772774538,0.132874774675726,0.0980871465772408 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,EnSeismic,5,0.0980871465772408,0.0436913018520788,0.104783593851584,0.0980871465772408 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,TrSoftLin,5,0.0980871465772408,0.0718039852980543,0.104783593851584,0.0980871465772408 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Urban,5,0.121863990133419,0.119864788586073,0.129947053494084,0.118992631310027 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Rural,5,0.121863990133419,0.119864788586073,0.129947053494084,0.118992631310027 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Industrial,5,0.121863990133419,0.119864788586073,0.129947053494084,0.118992631310027 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Well,5,0.121863990133419,0.119864788586073,0.129947053494084,0.118992631310027 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Crop,5,0.121863990133419,0.119864788586073,0.129947053494084,0.118992631310027 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,TameP,5,0.121863990133419,0.119864788586073,0.129947053494084,0.118992631310027 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,RoughP,5,0.121863990133419,0.119864788586073,0.129947053494084,0.118992631310027 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Decid,5,0.111664402452981,0.0925676785255877,0.12838442931739,0.111664402452981 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Mixedwood,5,0.0666129636526026,0.0517060528658316,0.0780092522284266,0.0655577834788831 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Pine,5,0.0387812701455966,0.0349164779226351,0.0431552649817136,0.0434917161194809 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Spruce,5,0.0695392350566296,0.0500711157624263,0.0819420036005477,0.0695392350566296 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,TreedBog,5,0.026015783845678,0.0246467881759166,0.0391195468077491,0.0324223167296191 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,TreedFen,5,0.0324223167296191,0.0231448273336468,0.0416424211240961,0.0324223167296191 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,TreedSwamp,5,0.12705806311569,0.0777590339638333,0.135275094643934,0.138924945537604 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,GrassHerb,5,0.0538649801932773,0.0494114363460887,0.0771016483764267,0.0674988002326724 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Shrub,5,0.0845204524428601,0.0813230199104712,0.110177551407743,0.0845204524428601 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,GraminoidFen,5,0.0664848446869057,0.0548562317765635,0.0823057352013198,0.0715579377130805 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Marsh,5,0.0664848446869057,0.0548562317765635,0.0823057352013198,0.0715579377130805 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,ShrubbyBog,5,0.0664848446869057,0.0400219913426505,0.0823057352013198,0.0715579377130805 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,ShrubbyFen,5,0.0664848446869057,0.0400219913426505,0.0823057352013198,0.0715579377130805 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,ShrubbySwamp,5,0.0894709335268126,0.0685140818973756,0.11559222101601,0.0715579377130805 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCDecidR,5,0.0979659072936202,0.056000550317278,0.119035445956366,0.0987996864776002 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCDecid1,5,0.0979659072936202,0.0754740008765856,0.119035445956366,0.0987996864776002 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCDecid2,5,0.0987996864776002,0.0879270736378564,0.143484471733302,0.0987996864776002 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCDecid3,5,0.0979659072936202,0.0621286619393974,0.119035445956366,0.0987996864776002 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCDecid4,5,0.0979659072936202,0.0621286619393974,0.119035445956366,0.0987996864776002 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCMixedwoodR,5,0.0979659072936202,0.0324939517016264,0.119035445956366,0.0987996864776002 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCMixedwood1,5,0.0987996864776002,0.0879270736378564,0.190271057342052,0.0987996864776002 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCMixedwood2,5,0.0979659072936202,0.0408003100761594,0.119035445956366,0.0987996864776002 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCMixedwood3,5,0.0979659072936202,0.0621286619393974,0.119035445956366,0.0987996864776002 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCMixedwood4,5,0.0979659072936202,0.0621286619393974,0.119035445956366,0.0987996864776002 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCPineR,5,0.0979659072936202,0.06146626030886,0.119035445956366,0.0987996864776002 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCPine1,5,0.0979659072936202,0.0742813046037392,0.119035445956366,0.0987996864776002 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCPine2,5,0.0979659072936202,0.0621286619393974,0.119035445956366,0.0987996864776002 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCPine3,5,0.0979659072936202,0.0621286619393974,0.119035445956366,0.0987996864776002 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCPine4,5,0.0979659072936202,0.0621286619393974,0.119035445956366,0.0987996864776002 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCSpruceR,5,0.0987996864776002,0.0879270736378564,0.133811680469912,0.0987996864776002 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCSpruce1,5,0.0979659072936202,0.0842318615581226,0.119035445956366,0.0987996864776002 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCSpruce2,5,0.0979659072936202,0.0553515374833462,0.119035445956366,0.0987996864776002 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCSpruce3,5,0.0979659072936202,0.0621286619393974,0.119035445956366,0.0987996864776002 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCSpruce4,5,0.0979659072936202,0.0621286619393974,0.119035445956366,0.0987996864776002 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,HardLin,5,0.0655704593026337,0.0386964513077742,0.0806664925562941,0.0681539858129174 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,EnSoftLin,5,0.0499491621686334,0.0432606306115374,0.0917851939975131,0.0630037477010183 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,EnSeismic,5,0.0630037477010183,0.0470136277181822,0.0956609574711948,0.0630037477010183 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,TrSoftLin,5,0.0499491621686334,0.0381918030077569,0.0917851939975131,0.0630037477010183 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Urban,5,0.0655704593026337,0.0386964513077742,0.0806664925562941,0.0681539858129174 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Rural,5,0.0655704593026337,0.0386964513077742,0.0806664925562941,0.0681539858129174 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Industrial,5,0.0655704593026337,0.0386964513077742,0.0806664925562941,0.0681539858129174 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Well,5,0.0656654516139695,0.0626306304625554,0.0806664925562941,0.0681539858129174 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Crop,5,0.0655704593026337,0.0539031526201264,0.0806664925562941,0.0681539858129174 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,TameP,5,0.0655704593026337,0.0400397821358317,0.0806664925562941,0.0681539858129174 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,RoughP,5,0.0681539858129174,0.0626306304625554,0.157698264126943,0.0681539858129174 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,ClaySub,5,0.691634949610229,0.550848790356094,0.802465195536948,0.714170375192759 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Other,5,0.691634949610229,0.550848790356094,0.802465195536948,0.714170375192759 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,RapidDrain,5,0.710928475172056,0.569824590326749,0.802465195536948,0.714170375192759 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Loamy,5,0.614208250714799,0.535537936114048,0.793086839692097,0.714170375192759 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,SandyLoam,5,0.710928475172056,0.569824590326749,0.851537864173555,0.714170375192759 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,ThinBreak,5,0.714170375192759,0.493395564734683,0.821258910605355,0.714170375192759 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Blowout,5,0.714170375192759,0.493395564734683,0.821258910605355,0.714170375192759 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Urban,5,0.757773549137013,0.657116840415395,0.839728338581547,0.757773549137013 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Rural,5,0.757773549137013,0.657116840415395,0.839728338581547,0.757773549137013 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Industrial,5,0.757773549137013,0.657116840415395,0.839728338581547,0.757773549137013 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Well,5,0.665294102611545,0.500844990155389,0.838316421030783,0.757773549137013 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Mine,5,0.757773549137013,0.657116840415395,0.839728338581547,0.757773549137013 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,EnSoftLin,5,0.652008305064925,0.550739776228706,0.78332637135667,0.628634628150965 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,EnSeismic,5,0.652008305064925,0.550739776228706,0.78332637135667,0.628634628150965 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,HardLin,5,0.757773549137013,0.657116840415395,0.839728338581547,0.757773549137013 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,TrSoftLin,5,0.628634628150965,0.425072256873216,0.765678825360405,0.628634628150965 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Crop,5,0.753168326869958,0.644219978099744,0.838316421030783,0.757773549137013 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,RoughP,5,0.753168326869958,0.5812621652318,0.838316421030783,0.757773549137013 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,TameP,5,0.753168326869958,0.660198982643474,0.838316421030783,0.757773549137013 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,WetlandMargin,5,0.870880735779777,0.824509912771411,0.934646436936643,0.870880735779777 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,ClaySub,5,0.0108355773911345,0.00400015925223842,0.0145163537839974,0.0141945654676911 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Other,5,0.0108355773911345,0.00400015925223842,0.0145163537839974,0.0141945654676911 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,RapidDrain,5,0.0141945654676911,0.00412645388529901,0.0149565220342368,0.0141945654676911 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Loamy,5,0.0141945654676911,0.00459311158353375,0.0160836483068433,0.0141945654676911 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,SandyLoam,5,0.0141945654676911,0.0101099232735522,0.0149565220342368,0.0141945654676911 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,ThinBreak,5,0.0147308793282016,0.0124614000782512,0.0267202462630917,0.0141945654676911 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Blowout,5,0.0147308793282016,0.0124614000782512,0.0267202462630917,0.0141945654676911 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Urban,5,9.37290365828135e-10,5.80885222938139e-10,1.02858504274146e-09,9.67698723675452e-10 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Rural,5,9.37290365828135e-10,5.80885222938139e-10,1.02858504274146e-09,9.67698723675452e-10 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Industrial,5,9.37290365828135e-10,5.80885222938139e-10,1.02858504274146e-09,9.67698723675452e-10 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Well,5,8.90552084803996e-10,3.87060694623438e-10,1.24813630833937e-09,8.90552084803996e-10 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Mine,5,9.37290365828135e-10,5.80885222938139e-10,1.02858504274146e-09,9.67698723675452e-10 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,EnSoftLin,5,0.0367985674989132,0.018521560297194,0.0629261097189651,0.0367985674989132 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,EnSeismic,5,0.0367985674989132,0.018521560297194,0.0629261097189651,0.0367985674989132 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,HardLin,5,9.37290365828135e-10,5.80885222938139e-10,1.02858504274146e-09,9.67698723675452e-10 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,TrSoftLin,5,0.0022392793878417,0.00098112936391626,0.00374456156057241,0.00374705166332369 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Crop,5,0.0051325112730342,0.00259608383885104,0.00661901820530916,0.00559204853976238 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,RoughP,5,0.00988095151082199,0.00435679506693851,0.0155976420996964,0.00988095151082199 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,TameP,5,0.00292203063138844,0.000742013980820096,0.00419414527275806,0.00325978967361389 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,WetlandMargin,5,2.01430416447776e-09,1.84918028139387e-09,3.24837282140699e-09,2.06303834717273e-09 -mite,mite,north,,,Ceratozetes.gracilis,WhiteSpruce,5,0.083324839926525,0.0773341259190752,0.0945808748551744,0.0783644708180673 -mite,mite,north,,,Ceratozetes.gracilis,Pine,5,0.058491231242114,0.0555475742526604,0.0633659637812255,0.0561087495328157 -mite,mite,north,,,Ceratozetes.gracilis,Deciduous,5,0.126688146057812,0.122367096566167,0.134062754480131,0.120032888034155 -mite,mite,north,,,Ceratozetes.gracilis,Mixedwood,5,0.0990912857393305,0.0936387390038836,0.106178442160669,0.0922465109400969 -mite,mite,north,,,Ceratozetes.gracilis,BlackSpruce,5,0.0210071881552033,0.0194431031984639,0.0243987448926687,0.0201312092719344 -mite,mite,north,,,Ceratozetes.gracilis,TreedFen,5,0.026580724324828,0.024242440270075,0.0332422257164936,0.0260589020761079 -mite,mite,north,,,Ceratozetes.gracilis,TreedSwamp,5,0.0749606880704819,0.0680207443603623,0.0931006713769451,0.0749606880704819 -mite,mite,north,,,Ceratozetes.gracilis,GraminoidFen,5,0.0274581642389803,0.0235853563324741,0.0322028810746652,0.0256468478624544 -mite,mite,north,,,Ceratozetes.gracilis,ShrubbyFen,5,0.0270291842209052,0.0233274790353779,0.0319634992742681,0.0254940252637942 -mite,mite,north,,,Ceratozetes.gracilis,ShrubbyBog,5,0.0221218552654225,0.0203526759367032,0.0258708245808148,0.0212207018552364 -mite,mite,north,,,Ceratozetes.gracilis,ShrubbySwamp,5,0.0787981143345215,0.0700959541686417,0.0912831982274847,0.0787981143345215 -mite,mite,north,,,Ceratozetes.gracilis,Marsh,5,0.0614924047415441,0.0503717579633235,0.0745768553412364,0.0549398690582114 -mite,mite,north,,,Ceratozetes.gracilis,Shrub,5,0.0690326282206128,0.0637085121852232,0.0855845655242005,0.0690326282206128 -mite,mite,north,,,Ceratozetes.gracilis,Grass,5,0.0717095541732357,0.0665149686947679,0.0985453710875707,0.0717095541732357 -mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruceR,5,0.107672074614269,0.0972477109913009,0.118541349512236,0.104199864858387 -mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce1,5,0.123393977309761,0.112425193396225,0.139387320231618,0.123393977309761 -mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce2,5,0.12437831599326,0.111359493905728,0.132705413454322,0.121062001485335 -mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce3,5,0.12437831599326,0.111359493905728,0.132705413454322,0.121062001485335 -mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce4,5,0.12437831599326,0.111359493905728,0.132705413454322,0.121062001485335 -mite,mite,north,,,Ceratozetes.gracilis,CCPineR,5,0.113773520489961,0.101859256408014,0.122211261862114,0.108797637100679 -mite,mite,north,,,Ceratozetes.gracilis,CCPine1,5,0.116106855588166,0.100441204830365,0.123976852017442,0.108122243613567 -mite,mite,north,,,Ceratozetes.gracilis,CCPine2,5,0.11817066960193,0.100316838150487,0.122679046365626,0.107706392899407 -mite,mite,north,,,Ceratozetes.gracilis,CCPine3,5,0.11817066960193,0.100316838150487,0.122679046365626,0.107706392899407 -mite,mite,north,,,Ceratozetes.gracilis,CCPine4,5,0.11817066960193,0.100316838150487,0.122679046365626,0.107706392899407 -mite,mite,north,,,Ceratozetes.gracilis,CCDeciduousR,5,0.144899037202292,0.133976042079909,0.148502963566285,0.134759239890019 -mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous1,5,0.173136461097876,0.161422569448153,0.176484401334677,0.159272382892999 -mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous2,5,0.134339082107598,0.127640012945417,0.1355719650486,0.12851467723662 -mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous3,5,0.134339082107598,0.127640012945417,0.1355719650486,0.12851467723662 -mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous4,5,0.134339082107598,0.127640012945417,0.1355719650486,0.12851467723662 -mite,mite,north,,,Ceratozetes.gracilis,CCMixedwoodR,5,0.144899037202292,0.133976042079909,0.148502963566285,0.134759239890019 -mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood1,5,0.173136461097876,0.161422569448153,0.176484401334677,0.159272382892999 -mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood2,5,0.134339082107598,0.127640012945417,0.1355719650486,0.12851467723662 -mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood3,5,0.134339082107598,0.127640012945417,0.1355719650486,0.12851467723662 -mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood4,5,0.134339082107598,0.127640012945417,0.1355719650486,0.12851467723662 -mite,mite,north,,,Ceratozetes.gracilis,EnSeismic,5,0.0802806120357541,0.0732029866316614,0.108944026446484,0.0802806120357541 -mite,mite,north,,,Ceratozetes.gracilis,EnSoftLin,5,0.0877847291238477,0.0716619099530992,0.114953790660522,0.0797199425033713 -mite,mite,north,,,Ceratozetes.gracilis,TrSoftLin,5,0.0824456293556031,0.0689700330268259,0.109575945632792,0.0742439958268106 -mite,mite,north,,,Ceratozetes.gracilis,HardLin,5,0.0268643924591711,0.0257899412772818,0.0304421627930103,0.0268643924591711 -mite,mite,north,,,Ceratozetes.gracilis,UrbInd,5,0.0514318415097621,0.0380292662597745,0.0597468130162695,0.0442950175704556 -mite,mite,north,,,Ceratozetes.gracilis,Wellsites,5,0.035050889042714,0.0311049144974151,0.0455477284585666,0.0328506872802035 -mite,mite,north,,,Ceratozetes.gracilis,Crop,5,0.0215366173604663,0.0212023183077577,0.027823845073315,0.0215366173604663 -mite,mite,north,,,Ceratozetes.gracilis,TameP,5,0.0350884778505926,0.0296620798510974,0.0366792367119695,0.0304807640689111 -mite,mite,north,,,Ceratozetes.gracilis,RoughP,5,0.0516992449980882,0.0487998406748331,0.0647307503735416,0.0516284245607066 -mite,mite,north,,,Trhypochthonius.tectorum,WhiteSpruce,5,0.0556561525490625,0.0510717677245686,0.0590786392356535,0.0510483651362441 -mite,mite,north,,,Trhypochthonius.tectorum,Pine,5,0.0594751004150133,0.0567146072015788,0.07263415395067,0.0594751004150133 -mite,mite,north,,,Trhypochthonius.tectorum,Deciduous,5,0.0535252270853639,0.0476609061082985,0.0610014811112496,0.0514776313631932 -mite,mite,north,,,Trhypochthonius.tectorum,Mixedwood,5,0.0563420244590419,0.0494241961076028,0.0610897108501066,0.0518923527010723 -mite,mite,north,,,Trhypochthonius.tectorum,BlackSpruce,5,0.0479250894638649,0.0425692505329721,0.053061593643466,0.0479250894638649 -mite,mite,north,,,Trhypochthonius.tectorum,TreedFen,5,0.0408841194527538,0.0377784135790944,0.0459994038000058,0.0408841194527538 -mite,mite,north,,,Trhypochthonius.tectorum,TreedSwamp,5,0.0337675075759103,0.0315015742262157,0.0379398823268421,0.033440734757267 -mite,mite,north,,,Trhypochthonius.tectorum,GraminoidFen,5,0.0407667314478653,0.0375105292015872,0.0453644606141766,0.0407667314478653 -mite,mite,north,,,Trhypochthonius.tectorum,ShrubbyFen,5,0.040625299041178,0.0380204987264493,0.0451305060870398,0.040625299041178 -mite,mite,north,,,Trhypochthonius.tectorum,ShrubbyBog,5,0.0468903066670746,0.0421032711447172,0.0516624938386451,0.0468903066670746 -mite,mite,north,,,Trhypochthonius.tectorum,ShrubbySwamp,5,0.0292316557779894,0.0280267417712238,0.0321894546760997,0.0286964469315836 -mite,mite,north,,,Trhypochthonius.tectorum,Marsh,5,0.0364031182916975,0.03246314137157,0.0387931260174801,0.0341610990357597 -mite,mite,north,,,Trhypochthonius.tectorum,Shrub,5,0.025223191055215,0.020275577906772,0.0300665662767551,0.0282145223452054 -mite,mite,north,,,Trhypochthonius.tectorum,Grass,5,0.0390477719581986,0.0270406150928457,0.0418778229533938,0.0390477719581986 -mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruceR,5,0.0467252252362432,0.0453107339176826,0.0515629452365753,0.0467252252362432 -mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce1,5,0.0439503346126213,0.0425636157475749,0.0475181466638955,0.0423468795516491 -mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce2,5,0.0443841971990541,0.0430576800412776,0.0470857489800855,0.043016752346317 -mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce3,5,0.0443841971990541,0.0430576800412776,0.0470857489800855,0.043016752346317 -mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce4,5,0.0443841971990541,0.0430576800412776,0.0470857489800855,0.043016752346317 -mite,mite,north,,,Trhypochthonius.tectorum,CCPineR,5,0.0526683392262,0.0494908781950819,0.0603392406871664,0.0518112255096306 -mite,mite,north,,,Trhypochthonius.tectorum,CCPine1,5,0.0468991106936687,0.0446094454502591,0.0499294662723947,0.0447974822354535 -mite,mite,north,,,Trhypochthonius.tectorum,CCPine2,5,0.0470893805229334,0.0447496174892123,0.0504045194737155,0.0449930704020798 -mite,mite,north,,,Trhypochthonius.tectorum,CCPine3,5,0.0470893805229334,0.0447496174892123,0.0504045194737155,0.0449930704020798 -mite,mite,north,,,Trhypochthonius.tectorum,CCPine4,5,0.0470893805229334,0.0447496174892123,0.0504045194737155,0.0449930704020798 -mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduousR,5,0.0514484824942495,0.0469845195905157,0.052906753720658,0.0451521693584135 -mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous1,5,0.0404798408803705,0.0375927192417578,0.0440082227599156,0.0368681428962799 -mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous2,5,0.0425578952838125,0.0405173081997961,0.0458365008762514,0.039821927948205 -mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous3,5,0.0425578952838125,0.0405173081997961,0.0458365008762514,0.039821927948205 -mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous4,5,0.0425578952838125,0.0405173081997961,0.0458365008762514,0.039821927948205 -mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwoodR,5,0.0514484824942495,0.0469845195905157,0.052906753720658,0.0451521693584135 -mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood1,5,0.0404798408803705,0.0375927192417578,0.0440082227599156,0.0368681428962799 -mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood2,5,0.0425578952838125,0.0405173081997961,0.0458365008762514,0.039821927948205 -mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood3,5,0.0425578952838125,0.0405173081997961,0.0458365008762514,0.039821927948205 -mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood4,5,0.0425578952838125,0.0405173081997961,0.0458365008762514,0.039821927948205 -mite,mite,north,,,Trhypochthonius.tectorum,EnSeismic,5,0.0522085190169312,0.0252569549779169,0.0665538824210485,0.0544387764396551 -mite,mite,north,,,Trhypochthonius.tectorum,EnSoftLin,5,0.0357984916598279,0.0190297380136641,0.0645302317518731,0.0402530079505476 -mite,mite,north,,,Trhypochthonius.tectorum,TrSoftLin,5,0.0330350845777108,0.0153319420477188,0.0512108000402237,0.0363880404889003 -mite,mite,north,,,Trhypochthonius.tectorum,HardLin,5,0.0243958652679851,0.0239704518035738,0.0279997624131438,0.0243958652679851 -mite,mite,north,,,Trhypochthonius.tectorum,UrbInd,5,0.0191105703106928,0.0167840749551519,0.0272407405128375,0.0191105703106928 -mite,mite,north,,,Trhypochthonius.tectorum,Wellsites,5,0.023351034935016,0.021158057868554,0.03223617749299,0.023351034935016 -mite,mite,north,,,Trhypochthonius.tectorum,Crop,5,0.015382693809727,0.0151069200337959,0.016892523752058,0.0152304430995811 -mite,mite,north,,,Trhypochthonius.tectorum,TameP,5,0.0258915433874115,0.0222945289246262,0.0264680931726066,0.024941743213498 -mite,mite,north,,,Trhypochthonius.tectorum,RoughP,5,0.0328180516103049,0.0322239355913061,0.0387542589134784,0.0375661766298358 -mite,mite,south,,,Ceratozetes.gracilis,Loamy,5,0.0218423245463604,0.0173672203176517,0.0230295231243844,0.0218423245463604 -mite,mite,south,,,Ceratozetes.gracilis,SandyLoam,5,0.0188962100537126,0.0162686755399601,0.0200379292106758,0.0185871549772747 -mite,mite,south,,,Ceratozetes.gracilis,ClaySub,5,0.0190796631779778,0.0156078918819073,0.0210172713505711,0.0190796631779778 -mite,mite,south,,,Ceratozetes.gracilis,RapidDrain,5,0.00969791273666386,0.00942196936388417,0.0112386251640146,0.0110451655878437 -mite,mite,south,,,Ceratozetes.gracilis,Blowout,5,0.0106020081675796,0.00863605999566094,0.0123463313279677,0.0108663421303504 -mite,mite,south,,,Ceratozetes.gracilis,ThinBreak,5,0.00878234749614848,0.00798269496694178,0.0107794669342902,0.00996372938352331 -mite,mite,south,,,Ceratozetes.gracilis,Other,5,0.0042686164608738,0.00063572314444851,0.00731890391266918,0.0042686164608738 -mite,mite,south,,,Ceratozetes.gracilis,EnSeismic,5,0.0128342993205689,0.00852724915739246,0.0633937793424426,0.0128342993205689 -mite,mite,south,,,Ceratozetes.gracilis,EnSoftLin,5,0.0100953485593809,0.00859879515579537,0.0518084711684424,0.0100953485593809 -mite,mite,south,,,Ceratozetes.gracilis,TrSoftLin,5,0.00945493320863686,0.00758629346095882,0.0565822367112004,0.00945493320863686 -mite,mite,south,,,Ceratozetes.gracilis,HardLin,5,0.0012818592428196,0.00122480067982412,0.00171071495716722,0.00176154072489266 -mite,mite,south,,,Ceratozetes.gracilis,UrbInd,5,0.00425941571595646,0.00295877473501209,0.00595057748445942,0.00425941571595646 -mite,mite,south,,,Ceratozetes.gracilis,Wellsites,5,0.00295291600474109,0.0021973086508854,0.00411443751717638,0.00295291600474109 -mite,mite,south,,,Ceratozetes.gracilis,Crop,5,0.00116588959329944,0.00104101704994527,0.00133284725072961,0.00116588959329944 -mite,mite,south,,,Ceratozetes.gracilis,TameP,5,0.0024464095231432,0.00214847243566944,0.00305858273470107,0.0023921447017999 -mite,mite,south,,,Ceratozetes.gracilis,RoughP,5,0.0023839015453601,0.00176469662219973,0.00260842275480983,0.00218127936434137 -mite,mite,south,,,Trhypochthonius.tectorum,Loamy,5,0.0499778174612043,0.0477160469108668,0.0521891286113536,0.0467852744100426 -mite,mite,south,,,Trhypochthonius.tectorum,SandyLoam,5,0.0427437044233035,0.0388352222189595,0.0446878887454315,0.0397630370091323 -mite,mite,south,,,Trhypochthonius.tectorum,ClaySub,5,0.0448532047061975,0.0434266302673582,0.0480060341777117,0.0429142869672478 -mite,mite,south,,,Trhypochthonius.tectorum,RapidDrain,5,0.0431738225185761,0.036600607606764,0.0449491670506471,0.0431738225185761 -mite,mite,south,,,Trhypochthonius.tectorum,Blowout,5,0.0612889561023144,0.0491998328469309,0.0746776432481998,0.0612889561023144 -mite,mite,south,,,Trhypochthonius.tectorum,ThinBreak,5,0.0472879860660164,0.037920270451541,0.0523574915662019,0.0472879860660164 -mite,mite,south,,,Trhypochthonius.tectorum,Other,5,0.0366771544480599,0.0228268207831538,0.0785517999620398,0.0478734329425522 -mite,mite,south,,,Trhypochthonius.tectorum,EnSeismic,5,0.005718045734362,0.000756250016234319,0.00887832731960815,0.00888461717648373 -mite,mite,south,,,Trhypochthonius.tectorum,EnSoftLin,5,0.00350908933263554,0.000310987183741067,0.00741715216602833,0.00723292387135889 -mite,mite,south,,,Trhypochthonius.tectorum,TrSoftLin,5,0.00296547128398102,0.000271010557576361,0.00513825945876903,0.00426948908637977 -mite,mite,south,,,Trhypochthonius.tectorum,HardLin,5,0.0352820429856263,0.0249011898739522,0.0517606271764086,0.0281443034455901 -mite,mite,south,,,Trhypochthonius.tectorum,UrbInd,5,0.0197564607327612,0.0161346626233351,0.0233198049521763,0.0197564607327612 -mite,mite,south,,,Trhypochthonius.tectorum,Wellsites,5,0.0218127811081771,0.0174582402547921,0.0273373033988181,0.0219652759405907 -mite,mite,south,,,Trhypochthonius.tectorum,Crop,5,0.0174842052478879,0.0146182157223179,0.0189255858640754,0.0177171723605232 -mite,mite,south,,,Trhypochthonius.tectorum,TameP,5,0.0334374326549006,0.0271748172003896,0.0414968532162421,0.0334374326549006 -mite,mite,south,,,Trhypochthonius.tectorum,RoughP,5,0.0330917206876311,0.0281248674259134,0.0375615466118284,0.0330917206876311 -vascular_plant,vascular_plant,north,,,Galium.boreale,WhiteSpruce,5,0.136563367302205,0.119462518901444,0.14703521115999,0.128707314176715 -vascular_plant,vascular_plant,north,,,Galium.boreale,Pine,5,0.116853425497967,0.107796441903968,0.124081762452193,0.108967866096832 -vascular_plant,vascular_plant,north,,,Galium.boreale,Deciduous,5,0.25887511408307,0.239156447325757,0.263482889907708,0.243876909457892 -vascular_plant,vascular_plant,north,,,Galium.boreale,Mixedwood,5,0.193041971414329,0.179396957180547,0.201982078860589,0.180205162477876 -vascular_plant,vascular_plant,north,,,Galium.boreale,BlackSpruce,5,0.0197313184843524,0.0186615095379396,0.0216346630739543,0.0190889513235295 -vascular_plant,vascular_plant,north,,,Galium.boreale,TreedFen,5,0.0190279322211574,0.0171394699429018,0.0204803027951359,0.0184868712710714 -vascular_plant,vascular_plant,north,,,Galium.boreale,TreedSwamp,5,0.0537157382799687,0.0494547113304226,0.0594834887289069,0.0502065849301497 -vascular_plant,vascular_plant,north,,,Galium.boreale,GraminoidFen,5,0.0207928426181494,0.0196811431002025,0.0226503378120183,0.0207928426181494 -vascular_plant,vascular_plant,north,,,Galium.boreale,ShrubbyFen,5,0.0201391073392683,0.0190935576196826,0.0221089799761179,0.0201391073392683 -vascular_plant,vascular_plant,north,,,Galium.boreale,ShrubbyBog,5,0.0199495272991526,0.0188220126503618,0.0218233356490728,0.0193388406568705 -vascular_plant,vascular_plant,north,,,Galium.boreale,ShrubbySwamp,5,0.045688982509881,0.042171496476318,0.0571441122739526,0.045688982509881 -vascular_plant,vascular_plant,north,,,Galium.boreale,Marsh,5,0.041347185000327,0.0369944475953885,0.0480790679841081,0.041347185000327 -vascular_plant,vascular_plant,north,,,Galium.boreale,Shrub,5,0.189304761120091,0.175516236345066,0.241103793907795,0.189304761120091 -vascular_plant,vascular_plant,north,,,Galium.boreale,Grass,5,0.214959292683282,0.180869477747652,0.249359372444126,0.191616359545112 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruceR,5,0.154137545244941,0.132581336610888,0.172927485618722,0.143043678232451 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce1,5,0.163315085825216,0.141002273364349,0.18905935770425,0.158059058434557 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce2,5,0.160436563203294,0.14069222929203,0.183967841364971,0.148743886710094 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce3,5,0.160436563203294,0.14069222929203,0.183967841364971,0.148743886710094 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce4,5,0.160436563203294,0.14069222929203,0.183967841364971,0.148743886710094 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCPineR,5,0.143905674843488,0.117440734273828,0.157542491898074,0.126516675922557 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine1,5,0.135255973929374,0.114079157254064,0.142460383178462,0.123115076680262 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine2,5,0.134477552857653,0.11341349299191,0.141401321460665,0.12088426096238 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine3,5,0.134477552857653,0.11341349299191,0.141401321460665,0.12088426096238 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine4,5,0.134477552857653,0.11341349299191,0.141401321460665,0.12088426096238 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduousR,5,0.208696634917917,0.175761239502858,0.219246203164378,0.186398225011703 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous1,5,0.256400751129383,0.223605802344556,0.280481606679469,0.232409451432954 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous2,5,0.196550402723055,0.177363867788528,0.223430883577534,0.189116187021577 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous3,5,0.196550402723055,0.177363867788528,0.223430883577534,0.189116187021577 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous4,5,0.196550402723055,0.177363867788528,0.223430883577534,0.189116187021577 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwoodR,5,0.208696634917917,0.175761239502858,0.219246203164378,0.186398225011703 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood1,5,0.256400751129383,0.223605802344556,0.280481606679469,0.232409451432954 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood2,5,0.196550402723055,0.177363867788528,0.223430883577534,0.189116187021577 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood3,5,0.196550402723055,0.177363867788528,0.223430883577534,0.189116187021577 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood4,5,0.196550402723055,0.177363867788528,0.223430883577534,0.189116187021577 -vascular_plant,vascular_plant,north,,,Galium.boreale,EnSeismic,5,0.0675357940232228,0.0536641840810974,0.0782448772200584,0.0666893133709304 -vascular_plant,vascular_plant,north,,,Galium.boreale,EnSoftLin,5,0.0666450469830431,0.0514688065567067,0.0769360972499699,0.0632085789748528 -vascular_plant,vascular_plant,north,,,Galium.boreale,TrSoftLin,5,0.0681813236346331,0.0554454641142448,0.0796107459686051,0.0681813236346331 -vascular_plant,vascular_plant,north,,,Galium.boreale,HardLin,5,0.032772954964339,0.0254952937216265,0.0427628821147054,0.0304014203144609 -vascular_plant,vascular_plant,north,,,Galium.boreale,UrbInd,5,0.032891069156295,0.0290596861735981,0.0426826279515852,0.0323859521239614 -vascular_plant,vascular_plant,north,,,Galium.boreale,Wellsites,5,0.0313114303488669,0.0258224080114288,0.0445788771357667,0.0313114303488669 -vascular_plant,vascular_plant,north,,,Galium.boreale,Crop,5,0.0114819275038514,0.00962690543049514,0.0155602283722968,0.0114819275038514 -vascular_plant,vascular_plant,north,,,Galium.boreale,TameP,5,0.0336485279117461,0.0256580113642758,0.0375637064974261,0.0283837215953415 -vascular_plant,vascular_plant,north,,,Galium.boreale,RoughP,5,0.0579560450257088,0.045965364331808,0.0773913737984615,0.0532646872909717 -vascular_plant,vascular_plant,north,,,Vicia.americana,WhiteSpruce,5,0.0717211911881468,0.0649940227788211,0.0757806047387571,0.0717211911881468 -vascular_plant,vascular_plant,north,,,Vicia.americana,Pine,5,0.0717443897992296,0.0637388171549185,0.0792558735029598,0.0717443897992296 -vascular_plant,vascular_plant,north,,,Vicia.americana,Deciduous,5,0.174528296976248,0.164090538301261,0.183795585911188,0.174528296976248 -vascular_plant,vascular_plant,north,,,Vicia.americana,Mixedwood,5,0.12738407433249,0.118327966346565,0.12914316163785,0.123903841395087 -vascular_plant,vascular_plant,north,,,Vicia.americana,BlackSpruce,5,0.0108602686526196,0.00947682296052838,0.0111197345835797,0.0110635169948055 -vascular_plant,vascular_plant,north,,,Vicia.americana,TreedFen,5,0.0104889884001634,0.00918775668655501,0.0114259715545775,0.0111781283427943 -vascular_plant,vascular_plant,north,,,Vicia.americana,TreedSwamp,5,0.0474586407623415,0.0434617027113533,0.0573459768855838,0.0505384149026876 -vascular_plant,vascular_plant,north,,,Vicia.americana,GraminoidFen,5,0.012380186783363,0.0106055968142056,0.0129729819618124,0.0128602111397556 -vascular_plant,vascular_plant,north,,,Vicia.americana,ShrubbyFen,5,0.0122885356189932,0.0107844229705085,0.0129771366500186,0.0127117113440904 -vascular_plant,vascular_plant,north,,,Vicia.americana,ShrubbyBog,5,0.0111679104948312,0.00984870753108598,0.01144241264329,0.0114521553910913 -vascular_plant,vascular_plant,north,,,Vicia.americana,ShrubbySwamp,5,0.0442619565088811,0.039395611852956,0.0514550187832082,0.0467803608934761 -vascular_plant,vascular_plant,north,,,Vicia.americana,Marsh,5,0.0395269377197916,0.0379010981822006,0.0480740857526984,0.0426749909362641 -vascular_plant,vascular_plant,north,,,Vicia.americana,Shrub,5,0.124413496826489,0.11630879041929,0.148831794626625,0.129561071424494 -vascular_plant,vascular_plant,north,,,Vicia.americana,Grass,5,0.140899561631048,0.132647046765579,0.149765706126522,0.140899561631048 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruceR,5,0.106333838059199,0.10563563998252,0.1113390336656,0.113324612808195 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce1,5,0.132673132079881,0.131014835763159,0.139245186106205,0.140904763899433 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce2,5,0.122518637692463,0.118113328719225,0.134306251834235,0.129378591587472 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce3,5,0.122518637692463,0.118113328719225,0.134306251834235,0.129378591587472 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce4,5,0.122518637692463,0.118113328719225,0.134306251834235,0.129378591587472 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCPineR,5,0.108086061678854,0.105116454412193,0.111847166658453,0.113106276644051 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine1,5,0.1122188310588,0.109732769391169,0.12258810268514,0.121735348725543 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine2,5,0.109183815724588,0.106720994046657,0.120537973445125,0.118682344001148 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine3,5,0.109183815724588,0.106720994046657,0.120537973445125,0.118682344001148 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine4,5,0.109183815724588,0.106720994046657,0.120537973445125,0.118682344001148 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduousR,5,0.145906249437239,0.140931022371577,0.15495341081461,0.151623580611421 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous1,5,0.180166516850587,0.168695392463167,0.188786472181105,0.183212683986236 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous2,5,0.156982604814944,0.145251669372505,0.15939063660912,0.156982604814944 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous3,5,0.156982604814944,0.145251669372505,0.15939063660912,0.156982604814944 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous4,5,0.156982604814944,0.145251669372505,0.15939063660912,0.156982604814944 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwoodR,5,0.145906249437239,0.140931022371577,0.15495341081461,0.151623580611421 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood1,5,0.180166516850587,0.168695392463167,0.188786472181105,0.183212683986236 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood2,5,0.156982604814944,0.145251669372505,0.15939063660912,0.156982604814944 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood3,5,0.156982604814944,0.145251669372505,0.15939063660912,0.156982604814944 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood4,5,0.156982604814944,0.145251669372505,0.15939063660912,0.156982604814944 -vascular_plant,vascular_plant,north,,,Vicia.americana,EnSeismic,5,0.216656015711896,0.168139707348619,0.254376282862556,0.216656015711896 -vascular_plant,vascular_plant,north,,,Vicia.americana,EnSoftLin,5,0.240353254005159,0.182193409855272,0.287354412958843,0.240353254005159 -vascular_plant,vascular_plant,north,,,Vicia.americana,TrSoftLin,5,0.185413846451138,0.143618351581936,0.21612482061455,0.185413846451138 -vascular_plant,vascular_plant,north,,,Vicia.americana,HardLin,5,0.0510142064754805,0.0476995560327749,0.0534135994986585,0.0494242045429297 -vascular_plant,vascular_plant,north,,,Vicia.americana,UrbInd,5,0.060270971424988,0.0527176972963101,0.0669155114807268,0.0570164101210413 -vascular_plant,vascular_plant,north,,,Vicia.americana,Wellsites,5,0.0495816235777512,0.045261299115898,0.0675981711099802,0.0583800066861835 -vascular_plant,vascular_plant,north,,,Vicia.americana,Crop,5,0.0198021833360757,0.0187130492427477,0.0215978803800823,0.020499648487122 -vascular_plant,vascular_plant,north,,,Vicia.americana,TameP,5,0.0435685547091363,0.0402056228771878,0.0533172713621298,0.0435685547091363 -vascular_plant,vascular_plant,north,,,Vicia.americana,RoughP,5,0.0428632794956036,0.0372440489603054,0.0534178816037923,0.0428632794956036 -vascular_plant,vascular_plant,south,,,Galium.boreale,Loamy,5,0.128653205010673,0.114611972972335,0.130784674892184,0.129566548831882 -vascular_plant,vascular_plant,south,,,Galium.boreale,SandyLoam,5,0.0836110810472021,0.0746816948024742,0.0894208141830331,0.0846341790254643 -vascular_plant,vascular_plant,south,,,Galium.boreale,ClaySub,5,0.101500964583409,0.0940741502041846,0.108970943759895,0.106582920663178 -vascular_plant,vascular_plant,south,,,Galium.boreale,RapidDrain,5,0.0388994289485226,0.0346245997860596,0.0529303847658474,0.0448318785090138 -vascular_plant,vascular_plant,south,,,Galium.boreale,Blowout,5,0.0506231282331206,0.0397681707601058,0.0574808564556098,0.0506231282331206 -vascular_plant,vascular_plant,south,,,Galium.boreale,ThinBreak,5,0.0479802424154928,0.0420075163241584,0.0517461800601525,0.051022562219615 -vascular_plant,vascular_plant,south,,,Galium.boreale,Other,5,0.0106061234511555,0.00720081589340935,0.0217479373094132,0.0177197087652051 -vascular_plant,vascular_plant,south,,,Galium.boreale,EnSeismic,5,0.0472125133205467,0.0295924639744709,0.110125197726374,0.0287456404184259 -vascular_plant,vascular_plant,south,,,Galium.boreale,EnSoftLin,5,0.0457108677001631,0.0342927417032321,0.133999583987908,0.0329811808897455 -vascular_plant,vascular_plant,south,,,Galium.boreale,TrSoftLin,5,0.0254268182100485,0.0116038912895437,0.0640062980763588,0.0143164876649795 -vascular_plant,vascular_plant,south,,,Galium.boreale,HardLin,5,0.0032621931802875,0.00285851385150083,0.00701707647763527,0.00538608376568717 -vascular_plant,vascular_plant,south,,,Galium.boreale,UrbInd,5,0.00523304185300579,0.00516680867336443,0.00698867393616868,0.00519980939835304 -vascular_plant,vascular_plant,south,,,Galium.boreale,Wellsites,5,0.00835585771334364,0.00699275850468526,0.00923375703992824,0.00769427442003421 -vascular_plant,vascular_plant,south,,,Galium.boreale,Crop,5,0.00170386065696764,0.00159546521345581,0.00280933357726183,0.00225132683231577 -vascular_plant,vascular_plant,south,,,Galium.boreale,TameP,5,0.00370735476367147,0.00294261667373477,0.00558659216344689,0.00460921237816997 -vascular_plant,vascular_plant,south,,,Galium.boreale,RoughP,5,0.00542654337673869,0.00450815448744484,0.00938121797095186,0.00706698519527935 -vascular_plant,vascular_plant,south,,,Vicia.americana,Loamy,5,0.280824609747584,0.267644583576923,0.289709776497706,0.273848614363572 -vascular_plant,vascular_plant,south,,,Vicia.americana,SandyLoam,5,0.243407150088342,0.234204092076879,0.250601947319584,0.239431294773893 -vascular_plant,vascular_plant,south,,,Vicia.americana,ClaySub,5,0.29707235668037,0.282488985824439,0.305118529233993,0.291486932950625 -vascular_plant,vascular_plant,south,,,Vicia.americana,RapidDrain,5,0.149586849572318,0.132500335286096,0.175603735182626,0.149586849572318 -vascular_plant,vascular_plant,south,,,Vicia.americana,Blowout,5,0.106950650814662,0.0907039605371348,0.121336311234738,0.103869081093715 -vascular_plant,vascular_plant,south,,,Vicia.americana,ThinBreak,5,0.165570611241508,0.152106899610986,0.186190099937036,0.165570611241508 -vascular_plant,vascular_plant,south,,,Vicia.americana,Other,5,0.102651600983928,0.0624149706900878,0.11235472915199,0.102651600983928 -vascular_plant,vascular_plant,south,,,Vicia.americana,EnSeismic,5,0.0987770601076429,0.0590846473435492,0.125153182170927,0.142317281363727 -vascular_plant,vascular_plant,south,,,Vicia.americana,EnSoftLin,5,0.124641821593195,0.0681868022186765,0.173426846411391,0.184942717247886 -vascular_plant,vascular_plant,south,,,Vicia.americana,TrSoftLin,5,0.0632469144327385,0.0350786082680709,0.083335221572322,0.0865561569046063 -vascular_plant,vascular_plant,south,,,Vicia.americana,HardLin,5,0.034768741467538,0.0317254788925045,0.0411641044703837,0.0319213954295495 -vascular_plant,vascular_plant,south,,,Vicia.americana,UrbInd,5,0.0317815932567955,0.0271544908564896,0.0356957214790492,0.0250464912812154 -vascular_plant,vascular_plant,south,,,Vicia.americana,Wellsites,5,0.0341400292126126,0.0279864934648464,0.0423488240839157,0.0262553863998158 -vascular_plant,vascular_plant,south,,,Vicia.americana,Crop,5,0.0239011853373428,0.0220577047645298,0.0264567603480559,0.0226673334870154 -vascular_plant,vascular_plant,south,,,Vicia.americana,TameP,5,0.0312372001895896,0.0292297510784975,0.0351771559180196,0.0306301444015498 -vascular_plant,vascular_plant,south,,,Vicia.americana,RoughP,5,0.0374123655632768,0.0359902090243626,0.0432584803569596,0.0374123655632768 diff --git a/3_output/exp_000_parity_v2/tables/metric_summary.csv b/3_output/exp_000_parity_v2/tables/metric_summary.csv deleted file mode 100644 index 546c2e7..0000000 --- a/3_output/exp_000_parity_v2/tables/metric_summary.csv +++ /dev/null @@ -1,617 +0,0 @@ -taxon,run,region,season,part,species,metric,n,median,p10,p90,boot1,mean,sd -bird,bird,north,,,AMRO,insample_auc,5,0.72487649207557,0.722489112963132,0.72576145123834,0.721701661835893,0.724313916200942,0.00170956352292163 -bird,bird,north,,,AMRO,insample_deviance_explained,5,0.142215080261758,0.140707166105981,0.144363142127984,0.140587647159979,0.142358220452553,0.00199530922315655 -bird,bird,north,,,AMRO,insample_rmse,5,0.663619993960517,0.661624845419777,0.664719637388853,0.664239276180889,0.663325410909454,0.00165768430943888 -bird,bird,north,,,AMRO,insample_spearman,5,0.344389309730045,0.340479678130316,0.345510088540595,0.339249301212572,0.343324801699925,0.00266479191004938 -bird,bird,north,,,AMRO,insample_calibration_slope,5,0.80440117768677,0.799100431621395,0.810804150827482,0.80440117768677,0.805142929671317,0.00621763816210709 -bird,bird,north,,,AMRO,insample_prevalence,5,0.251486631016043,0.251004373826971,0.252433263182893,0.250861017819325,0.251649276245993,0.000745639638422784 -bird,bird,north,,,AMRO,insample_n,5,46747,46745.2,46750,46747,46747.6,2.50998007960223 -bird,bird,north,,,AMRO,oob_auc,5,0.730373137296335,0.729897207197475,0.730684827423547,0.730766733254682,0.730315896538717,0.000399387356506946 -bird,bird,north,,,AMRO,oob_deviance_explained,5,0.151664799728976,0.150795650809459,0.152520757577584,0.152754178062373,0.151645303910227,0.000851367053496551 -bird,bird,north,,,AMRO,oob_rmse,5,0.658090400254619,0.657748490410106,0.658646272283023,0.657851304309638,0.658152604633444,0.000488187377741323 -bird,bird,north,,,AMRO,oob_spearman,5,0.348000943732488,0.347176086570868,0.348405542162744,0.348509330988823,0.34783832412029,0.000612352651071532 -bird,bird,north,,,AMRO,oob_calibration_slope,5,0.878884682385081,0.857978242744613,0.881378788597934,0.881696624797909,0.871660692760926,0.0122350948521806 -bird,bird,north,,,AMRO,oob_prevalence,5,0.241010939026539,0.240656718532255,0.241191818078906,0.241245385459292,0.240950250724789,0.000279167052473422 -bird,bird,north,,,AMRO,oob_n,5,124877,124874,124878.8,124877,124876.4,2.50998007960223 -bird,bird,north,,,YEWA,insample_auc,5,0.778635633427003,0.778333348933502,0.779726988023268,0.779841092447633,0.778948847840918,0.000705556804087617 -bird,bird,north,,,YEWA,insample_deviance_explained,5,0.259141214360432,0.25548753680516,0.260976441286628,0.259141214360432,0.258564177416315,0.00302380870747948 -bird,bird,north,,,YEWA,insample_rmse,5,0.547361440801496,0.544308917361954,0.551849139043791,0.547158394049375,0.547972539003203,0.00399109094044317 -bird,bird,north,,,YEWA,insample_spearman,5,0.315565876581618,0.314186701701599,0.31608982965666,0.316093683296469,0.315273234600625,0.00100534988197753 -bird,bird,north,,,YEWA,insample_calibration_slope,5,0.705708332778131,0.69321277112837,0.712055437422832,0.716264166431109,0.703225661526711,0.009932019727973 -bird,bird,north,,,YEWA,insample_prevalence,5,0.118296361263824,0.117706951871658,0.119214980837802,0.118296361263824,0.118418937588893,0.00074585019883292 -bird,bird,north,,,YEWA,insample_n,5,46747,46745.2,46750,46747,46747.6,2.50998007960223 -bird,bird,north,,,YEWA,oob_auc,5,0.728595786591222,0.728230136724689,0.73005150345856,0.730809600284142,0.728967653050156,0.00107004022194788 -bird,bird,north,,,YEWA,oob_deviance_explained,5,0.179475572495229,0.177360125449593,0.182723444677448,0.183210182399369,0.179952283630345,0.00265860832017606 -bird,bird,north,,,YEWA,oob_rmse,5,0.591197627682823,0.582204245542092,0.591914132572009,0.581496589737255,0.587923953982158,0.00511357694956418 -bird,bird,north,,,YEWA,oob_spearman,5,0.273873998143111,0.273042129222169,0.27544277961002,0.276382265893519,0.274116908523614,0.00138126305304161 -bird,bird,north,,,YEWA,oob_calibration_slope,5,0.66953950556298,0.63693641889123,0.713887951481982,0.718728425403305,0.674429581507813,0.0378468170998992 -bird,bird,north,,,YEWA,oob_prevalence,5,0.13458843502006,0.134244406707603,0.134809487963868,0.13458843502006,0.134542639141448,0.000279456693593184 -bird,bird,north,,,YEWA,oob_n,5,124877,124874,124878.8,124877,124876.4,2.50998007960223 -bird,bird,south,,,AMRO,insample_auc,5,0.689537506786954,0.689085767534014,0.694179854134546,0.689537506786954,0.69116429025569,0.00267686382030874 -bird,bird,south,,,AMRO,insample_deviance_explained,5,0.0914919911243302,0.0907862366206112,0.0936622473347538,0.0905093060629211,0.0920142540132908,0.0015677422769352 -bird,bird,south,,,AMRO,insample_rmse,5,0.742475038662062,0.740051841768597,0.745694348908307,0.746104469516561,0.742888160715582,0.00289570319718642 -bird,bird,south,,,AMRO,insample_spearman,5,0.289206389172517,0.287837179517966,0.295789973779885,0.287696121760142,0.291229007576228,0.00408372016605238 -bird,bird,south,,,AMRO,insample_calibration_slope,5,0.885482053955006,0.883345065042026,0.893982715783319,0.885403476414633,0.887857917212169,0.00576920241512031 -bird,bird,south,,,AMRO,insample_prevalence,5,0.258598079444985,0.257039179794386,0.259660332963851,0.25655668358714,0.258393144664086,0.00135079625989253 -bird,bird,south,,,AMRO,insample_n,5,23639,23636.8,23639.6,23640,23638.4,1.51657508881031 -bird,bird,south,,,AMRO,oob_auc,5,0.689591934626615,0.688348632550972,0.689843166919568,0.689591934626615,0.68924802394965,0.000920081348058652 -bird,bird,south,,,AMRO,oob_deviance_explained,5,0.0984328670162571,0.094117282107193,0.0994994384196623,0.0984328670162571,0.0973395768527953,0.00316116064937106 -bird,bird,south,,,AMRO,oob_rmse,5,0.735225643291462,0.734322072987703,0.736655125441161,0.734395013830007,0.735378999246935,0.00121712350913242 -bird,bird,south,,,AMRO,oob_spearman,5,0.291547044066434,0.289653619948351,0.29213277997847,0.291376773818019,0.291100972713629,0.00151818475240607 -bird,bird,south,,,AMRO,oob_calibration_slope,5,0.934404203818623,0.926891186190493,0.961180760134325,0.953623540744284,0.941985087798582,0.0175025538271432 -bird,bird,south,,,AMRO,oob_prevalence,5,0.259989876131491,0.259616009340861,0.260538534890505,0.260708383581223,0.260061995930024,0.000475417680104008 -bird,bird,south,,,AMRO,oob_n,5,67168,67167.4,67170.2,67167,67168.6,1.51657508881031 -bird,bird,south,,,YEWA,insample_auc,5,0.719332020865892,0.7167959223474,0.722607418769604,0.721262730392428,0.719662412560823,0.00297152545331512 -bird,bird,south,,,YEWA,insample_deviance_explained,5,0.231210217495144,0.222251823593889,0.235961745747393,0.229114411717017,0.229807382164686,0.00749454908006547 -bird,bird,south,,,YEWA,insample_rmse,5,0.625043487437273,0.62080865697937,0.628590391800858,0.629305991109963,0.624889605300925,0.00399863862852713 -bird,bird,south,,,YEWA,insample_spearman,5,0.295095530582618,0.291167713950288,0.299659209105424,0.297439751075024,0.295393951865559,0.00438378006368663 -bird,bird,south,,,YEWA,insample_calibration_slope,5,0.866874540634912,0.862503477222317,0.872567336726769,0.860619291916303,0.867538534232098,0.00505022303747937 -bird,bird,south,,,YEWA,insample_prevalence,5,0.171376597004823,0.170895553957443,0.17183640258529,0.171742808798646,0.171382167859753,0.000475861876686407 -bird,bird,south,,,YEWA,insample_n,5,23639,23636.8,23639.6,23640,23638.4,1.51657508881031 -bird,bird,south,,,YEWA,oob_auc,5,0.714680925082376,0.712798268254752,0.716148435308362,0.716561203894474,0.714502329965285,0.00165165381687826 -bird,bird,south,,,YEWA,oob_deviance_explained,5,0.20248138732713,0.197183679478114,0.207430346720716,0.208119807948008,0.202298579885998,0.00504819057507152 -bird,bird,south,,,YEWA,oob_rmse,5,0.638667289278492,0.636815197956095,0.639153235243619,0.636772974666958,0.63809587657418,0.00120027991161497 -bird,bird,south,,,YEWA,oob_spearman,5,0.291734550104421,0.289334731699639,0.29340482100249,0.294073915420202,0.291424590009334,0.00203454648872441 -bird,bird,south,,,YEWA,oob_calibration_slope,5,0.871741212363925,0.853830810138639,0.901368353942083,0.871741212363925,0.875139424030135,0.0275139438874958 -bird,bird,south,,,YEWA,oob_prevalence,5,0.175869820899522,0.175707986864887,0.176039185326346,0.175741063319785,0.175867891893267,0.000167508533766851 -bird,bird,south,,,YEWA,oob_n,5,67168,67167.4,67170.2,67167,67168.6,1.51657508881031 -bryophyte,bryophyte,north,,,Bryum.All,insample_auc,5,0.638127846001886,0.629068513424739,0.639705775242135,0.638127846001886,0.635308902250384,0.00556090012471537 -bryophyte,bryophyte,north,,,Bryum.All,insample_deviance_explained,5,-0.275950193493276,-0.30093504049497,-0.246978357823554,-0.24424818155784,-0.273766521408161,0.0268076084815421 -bryophyte,bryophyte,north,,,Bryum.All,insample_rmse,5,0.479527636307096,0.479331369604887,0.480302514101111,0.479248548520264,0.479762898472393,0.000494745588454859 -bryophyte,bryophyte,north,,,Bryum.All,insample_spearman,5,0.234421074075063,0.218639785436767,0.237098983905807,0.234421074075063,0.229509973229964,0.00968700796838076 -bryophyte,bryophyte,north,,,Bryum.All,insample_calibration_slope,5,0.76525545060837,0.744233658530692,0.8107675025251,0.800400269549026,0.775500149433843,0.0336341853608396 -bryophyte,bryophyte,north,,,Bryum.All,insample_prevalence,5,0.398261429491307,0.395579807718977,0.401857219116663,0.400041220115416,0.3986710498744,0.00332558122320578 -bryophyte,bryophyte,north,,,Bryum.All,insample_n,5,3097,3072.4,4153.6,4852,3440.8,789.041633882522 -bryophyte,bryophyte,north,,,Bryum.All,oob_auc,4,0.630809068622639,0.623078012227396,0.646295585466171,,0.6335788759256,0.0130102647026339 -bryophyte,bryophyte,north,,,Bryum.All,oob_deviance_explained,4,-0.19138651532205,-0.229639096179351,-0.14780622710667,,-0.189483762694165,0.0443897167597502 -bryophyte,bryophyte,north,,,Bryum.All,oob_rmse,4,0.480264599990569,0.480001687050415,0.482221755757651,,0.480869686714472,0.00145214204934777 -bryophyte,bryophyte,north,,,Bryum.All,oob_spearman,4,0.222299987465914,0.20864983396156,0.249132606040734,,0.227008010705366,0.022676062398745 -bryophyte,bryophyte,north,,,Bryum.All,oob_calibration_slope,4,0.767411113061744,0.685944635693733,0.863863918531363,,0.772763373098032,0.0990836541433614 -bryophyte,bryophyte,north,,,Bryum.All,oob_prevalence,4,0.403358051486104,0.397360409603543,0.408630979157295,,0.403099224982043,0.006528394280969 -bryophyte,bryophyte,north,,,Bryum.All,oob_n,5,1755,698.4,1779.6,0,1411.2,789.041633882522 -bryophyte,bryophyte,north,,,Bryum.All,v2val_Climate,5,0.562296054365257,0.554173006352827,0.563975593348497,0.563268568361301,0.559777731714894,0.00502167306258926 -bryophyte,bryophyte,north,,,Bryum.All,v2val_Climate_Truncated,5,0.562295197193571,0.554169893407269,0.56396889522421,0.563263005953167,0.559774417476873,0.00502075379775713 -bryophyte,bryophyte,north,,,Bryum.All,v2val_Landcover,5,0.59031873097319,0.582725624858305,0.592734774936281,0.59031873097319,0.58822375369532,0.00508433205604652 -bryophyte,bryophyte,north,,,Bryum.All,v2val_Full,5,0.638127846001886,0.629068513424739,0.639705775242135,0.638127846001886,0.635308902250384,0.00556090012471537 -bryophyte,bryophyte,north,,,Bryum.All,v2val_Full_Truncated,5,0.639020549706553,0.629556667762114,0.64021053224959,0.639020549706553,0.635852413234428,0.00561081241692955 -bryophyte,bryophyte,north,,,Bryum.All,v2val_Full_Joint,5,0.63656986211763,0.627565538171321,0.638033581053569,0.63656986211763,0.633648909724541,0.00542015487462954 -bryophyte,bryophyte,north,,,Bryum.All,v2val_Full_Joint_Truncated,5,0.637367602039122,0.62809310218947,0.638655312558534,0.637500263262641,0.634239708554392,0.00549431056719841 -bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Climate,4,0.557120566175802,0.540969693146743,0.575367468760527,,0.557869148159969,0.0192626917262308 -bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Climate_Truncated,4,0.557104758803387,0.540966602037286,0.575374474456983,,0.557866029834635,0.0192692966023613 -bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Landcover,4,0.586912742882926,0.576860469268986,0.598756809203001,,0.587552668849403,0.0117834395761671 -bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Full,4,0.630809068622639,0.623078012227396,0.646295585466171,,0.6335788759256,0.0130102647026339 -bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Full_Truncated,4,0.63137585065822,0.623530655084542,0.647529866197263,,0.634343286360136,0.0135026415297771 -bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Full_Joint,4,0.62971870560941,0.622041714357572,0.644532558641158,,0.63226758481652,0.012530612942673 -bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Full_Joint_Truncated,4,0.630321350629701,0.622479940089637,0.645772715128109,,0.63303919132911,0.0130277082370542 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_auc,5,0.698174658798715,0.69094551695802,0.709058701464829,0.694675016541229,0.699837511037708,0.00901778644380229 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_deviance_explained,5,-0.114510476579041,-0.131813022554523,-0.0904615002285642,-0.127187969172517,-0.111764640500469,0.0203388736323564 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_rmse,5,0.466695436776973,0.462912051047972,0.467727184931025,0.467432435043113,0.465613065181239,0.00244205972530663 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_spearman,5,0.341399187547095,0.328255177404971,0.359282419780438,0.334844748701068,0.343616320027039,0.0154028239772293 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_calibration_slope,5,0.886684142091591,0.88294240979435,0.897629158250886,0.897907532572089,0.889629148428203,0.00742841787636394 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_prevalence,5,0.441055234954658,0.434155026365629,0.445516968426104,0.441055234954658,0.440040906513639,0.00592042164227121 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_n,5,3068,3031.6,4152,4852,3417.8,802.273768734838 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_auc,4,0.669185680513321,0.66194940480315,0.689277603994979,,0.673776983288852,0.0156568896063866 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_deviance_explained,4,-0.185591758024389,-0.197381970216131,-0.141841988806489,,-0.174177630515047,0.0329785238818983 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_rmse,4,0.475105452566444,0.469359003725674,0.481375013261819,,0.475292278228802,0.00645345889371808 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_spearman,4,0.29101450640103,0.278786640187495,0.325621827918843,,0.299007169009701,0.0269716818569824 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_calibration_slope,4,0.772810531065414,0.725727448039512,0.851082802104523,,0.783949526784417,0.0700828360330596 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_prevalence,4,0.443665764352131,0.432608384046217,0.454192825112108,,0.443476364514296,0.0116999631210214 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_n,5,1784,700,1820.4,0,1434.2,802.273768734838 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Climate,5,0.656006784390431,0.650667856695395,0.664851582602822,0.652571065182321,0.657491388780721,0.00702864165145057 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Climate_Truncated,5,0.656014130093929,0.650669976200325,0.664873979724118,0.652577122144193,0.657501706850359,0.00703792811898215 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Landcover,5,0.626159436771152,0.623847896625279,0.63744965808967,0.626159436771152,0.629605667370405,0.00700538360157201 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Full,5,0.698174658798715,0.69094551695802,0.709058701464829,0.694675016541229,0.699837511037708,0.00901778644380229 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Full_Truncated,5,0.698175100984084,0.691211313926766,0.709267355194508,0.694914692057453,0.700043394374941,0.00901659546042277 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Full_Joint,5,0.693839915631032,0.687220562229904,0.705393695319871,0.69133661745651,0.696035361241937,0.00910536620980844 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Full_Joint_Truncated,5,0.693823112587028,0.687469531659753,0.705583368208495,0.69158473589171,0.69622715639523,0.00910978022700139 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Climate,4,0.636250911438379,0.627380368267631,0.653685141830713,,0.639309371160374,0.0145611916830304 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Climate_Truncated,4,0.636263529886685,0.627402598788168,0.653701328647776,,0.639326696909033,0.0145585625333492 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Landcover,4,0.608585612621007,0.595998860291286,0.617214693566341,,0.607172158555155,0.0115275207748297 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Full,4,0.669185680513321,0.66194940480315,0.689277603994979,,0.673776983288852,0.0156568896063866 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Full_Truncated,4,0.669430040893281,0.6621007168852,0.689600433702903,,0.674016136893831,0.0157430215314559 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Full_Joint,4,0.667551944528101,0.659697874596654,0.686791205149657,,0.671618084060283,0.0153861204532186 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Full_Joint_Truncated,4,0.667760268462804,0.659841527855415,0.687057304097503,,0.671823945258272,0.015448661895241 -bryophyte,bryophyte,south,,,Bryum.All,insample_auc,5,0.624781080501705,0.619098305791523,0.631250290557445,0.631477859980203,0.62531135077244,0.00613408721709493 -bryophyte,bryophyte,south,,,Bryum.All,insample_deviance_explained,5,-0.0882074375042718,-0.116317967526412,-0.0745997780131311,-0.0659569204939741,-0.0940636853986955,0.0217357006072699 -bryophyte,bryophyte,south,,,Bryum.All,insample_rmse,5,0.473712635656491,0.473250036655967,0.475178356015742,0.473182584522988,0.474116438717835,0.000979445089225269 -bryophyte,bryophyte,south,,,Bryum.All,insample_spearman,5,0.208905797682641,0.198735688372861,0.219564280666345,0.21996433153061,0.209499332030303,0.0105641202170489 -bryophyte,bryophyte,south,,,Bryum.All,insample_calibration_slope,5,0.874557636620987,0.806197667935386,0.910286420946533,0.929039182089329,0.863965312292241,0.0611476778254253 -bryophyte,bryophyte,south,,,Bryum.All,insample_prevalence,5,0.370562770562771,0.365528360602252,0.371569237798783,0.370562770562771,0.369235286484943,0.00385091464779508 -bryophyte,bryophyte,south,,,Bryum.All,insample_n,5,1444,1429.8,1968,2310,1614.6,388.936113005722 -bryophyte,bryophyte,south,,,Bryum.All,oob_auc,4,0.622587939645232,0.609906666129414,0.635174456157602,,0.622554097858286,0.0139528811025767 -bryophyte,bryophyte,south,,,Bryum.All,oob_deviance_explained,4,-0.0294046792827352,-0.0439442359246929,0.0123272085791315,,-0.019693132418482,0.0322171478788032 -bryophyte,bryophyte,south,,,Bryum.All,oob_rmse,4,0.475290386543187,0.473040753420391,0.476838977026333,,0.475040014171884,0.00206603954639396 -bryophyte,bryophyte,south,,,Bryum.All,oob_spearman,4,0.204907419101645,0.18388423679321,0.22723046467613,,0.205371655982377,0.0239816446700714 -bryophyte,bryophyte,south,,,Bryum.All,oob_calibration_slope,4,0.862631630882613,0.796586982841539,0.926986747501851,,0.862028226803386,0.0714420365714851 -bryophyte,bryophyte,south,,,Bryum.All,oob_prevalence,4,0.3703593055487,0.368749240306309,0.380219211352906,,0.37330567717792,0.0072755089177001 -bryophyte,bryophyte,south,,,Bryum.All,oob_n,5,866,342,880.2,0,695.4,388.936113005722 -bryophyte,bryophyte,south,,,Bryum.All,v2val_Climate,5,0.562296054365257,0.554173006352827,0.563975593348497,0.563268568361301,0.559777731714894,0.00502167306258926 -bryophyte,bryophyte,south,,,Bryum.All,v2val_Climate_Truncated,5,0.562295197193571,0.554169893407269,0.56396889522421,0.563263005953167,0.559774417476873,0.00502075379775713 -bryophyte,bryophyte,south,,,Bryum.All,v2val_Landcover,5,0.590977483143704,0.588222769171523,0.60141327621516,0.604777025029246,0.593896071204394,0.0070332679741888 -bryophyte,bryophyte,south,,,Bryum.All,v2val_Full,5,0.624781080501705,0.619098305791523,0.631250290557445,0.631477859980203,0.62531135077244,0.00613408721709493 -bryophyte,bryophyte,south,,,Bryum.All,v2val_Full_Truncated,5,0.624781080501705,0.619154420181747,0.631292646881434,0.631535708776305,0.625345448851566,0.00612033629471389 -bryophyte,bryophyte,south,,,Bryum.All,v2val_Full_Joint,5,0.624358409137791,0.618605858115063,0.631039389378428,0.630846343956086,0.624944360355056,0.00625821729858158 -bryophyte,bryophyte,south,,,Bryum.All,v2val_Full_Joint_Truncated,5,0.624356386786767,0.618642020722096,0.631057597953052,0.630860002699611,0.624962990194972,0.0062460677616445 -bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Climate,4,0.557120566175802,0.540969693146743,0.575367468760527,,0.557869148159969,0.0192626917262308 -bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Climate_Truncated,4,0.557104758803387,0.540966602037286,0.575374474456983,,0.557866029834635,0.0192692966023613 -bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Landcover,4,0.597272483474034,0.596765466015466,0.601974542549405,,0.598770712622892,0.00348361543505928 -bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Full,4,0.622587939645232,0.609906666129414,0.635174456157602,,0.622554097858286,0.0139528811025767 -bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Full_Truncated,4,0.622567363513545,0.609906666129414,0.63516211047859,,0.622543809792443,0.0139501445980818 -bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Full_Joint,4,0.622331585916656,0.607992717674767,0.636786215054005,,0.622372929093606,0.0160574239141607 -bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Full_Joint_Truncated,4,0.622313949232352,0.607992717674767,0.636775633043423,,0.622364110751454,0.0160556605380964 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_auc,5,0.717485896729522,0.71685899652647,0.72287874285206,0.717485896729522,0.719337658395294,0.00314832137641283 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_deviance_explained,5,0.0555144394517471,0.0525022042487002,0.0659817133460382,0.0552076565672067,0.0580917971366114,0.00804978167070715 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_rmse,5,0.403372277591519,0.398339551678763,0.406855811762638,0.403372277591519,0.402708178674735,0.00422999542451598 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_spearman,5,0.324238098784219,0.318040132102534,0.330331200221374,0.321683515420121,0.324176941097839,0.00635489788234709 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_calibration_slope,5,0.900294144555213,0.878293846695361,0.929217371465325,0.926240194199798,0.903277573722839,0.025082790791702 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_prevalence,5,0.23982683982684,0.231460603487586,0.246697056850865,0.23982683982684,0.239405392468179,0.00765174673579537 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_n,5,1462,1452.8,1977.6,2310,1631.4,379.498089586759 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_auc,4,0.715093054248096,0.709938966718536,0.716833687112666,,0.713873963296314,0.00407985613655125 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_deviance_explained,4,0.0485196427393902,0.0213884985438529,0.0541796492701325,,0.0408513792876777,0.0205022125506785 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_rmse,4,0.406296961312814,0.398165216308586,0.415127438523745,,0.406546508529494,0.00911762395306138 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_spearman,4,0.316460819822169,0.305912040269855,0.327620546786264,,0.316679015326377,0.0116401179241884 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_calibration_slope,4,0.856225115735854,0.811357325680967,0.90322965680456,,0.856988241097932,0.0492572682113721 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_prevalence,4,0.238999572635154,0.227667581639544,0.255610993801512,,0.240885083410421,0.0151422609821477 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_n,5,848,332.4,857.2,0,678.6,379.498089586759 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Climate,5,0.656006784390431,0.650667856695395,0.664851582602822,0.652571065182321,0.657491388780721,0.00702864165145057 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Climate_Truncated,5,0.656014130093929,0.650669976200325,0.664873979724118,0.652577122144193,0.657501706850359,0.00703792811898215 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Landcover,5,0.633036828963795,0.625748811394207,0.642238687874322,0.630393575816386,0.633819706982903,0.00839614169240918 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Full,5,0.717485896729522,0.71685899652647,0.72287874285206,0.717485896729522,0.719337658395294,0.00314832137641283 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Full_Truncated,5,0.717485896729522,0.71685899652647,0.72287874285206,0.717485896729522,0.719337658395294,0.00314832137641283 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Full_Joint,5,0.718564200718732,0.717751679375772,0.723867311169212,0.718564200718732,0.720297293047133,0.00318115267699769 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Full_Joint_Truncated,5,0.718564200718732,0.717751679375772,0.723867311169212,0.718564200718732,0.720297293047133,0.00318115267699769 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Climate,4,0.636250911438379,0.627380368267631,0.653685141830713,,0.639309371160374,0.0145611916830304 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Climate_Truncated,4,0.636263529886685,0.627402598788168,0.653701328647776,,0.639326696909033,0.0145585625333492 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Landcover,4,0.621073947742974,0.605174465777582,0.638800057775284,,0.621726314909731,0.0180551389037002 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Full,4,0.715093054248096,0.709938966718536,0.716833687112666,,0.713873963296314,0.00407985613655125 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Full_Truncated,4,0.715093054248096,0.709938966718536,0.716833687112666,,0.713873963296314,0.00407985613655125 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Full_Joint,4,0.716849054867145,0.711184101825957,0.718706027458805,,0.715489061849456,0.00457687182026539 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Full_Joint_Truncated,4,0.716849054867145,0.711184101825957,0.718706027458805,,0.715489061849456,0.00457687182026539 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_auc,5,0.778362159718991,0.777313519482956,0.781078019062442,0.776659932196605,0.778941977854504,0.00220139213343037 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_deviance_explained,5,0.129922817133758,0.116058360191463,0.137037124714767,0.126180029301491,0.127497727648612,0.0115563906422122 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_rmse,5,0.428984342825858,0.426484514201266,0.429776953204885,0.429796613403064,0.428367541663588,0.00170602773901413 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_spearman,5,0.46931020347218,0.467301179157511,0.473793771369763,0.466302441462258,0.470210732962937,0.00348588836105702 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_calibration_slope,5,1.02280943622485,1.00638380806286,1.02708521369247,1.02280943622485,1.0184707448443,0.011026980822553 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_prevalence,5,0.384787472035794,0.382719077877937,0.387875670039505,0.384787472035794,0.385092893007771,0.00278105998275642 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_n,5,3685,3644,4976.6,5811,4102.6,955.610956404331 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_auc,4,0.766320433722221,0.757378470612268,0.770532908104046,,0.764631330605033,0.00773409788726129 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_deviance_explained,4,0.113996779288933,0.0998702886563739,0.140537458619322,,0.118430418109587,0.0237257998755231 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_rmse,4,0.434233197376139,0.431409497762948,0.437875343465515,,0.434525499689062,0.00353785187767737 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_spearman,4,0.448965855284841,0.434402780928462,0.454722953452224,,0.445820863788771,0.0120096288277829 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_calibration_slope,4,0.967661500539704,0.947481883037204,0.982662848959669,,0.965812118724513,0.0194935179999311 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_prevalence,4,0.385212683681362,0.378550429000763,0.388624647224836,,0.384051865418103,0.00565743785692542 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_n,5,2126,834.4,2167,0,1708.4,955.610956404331 -lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Climate,5,0.726648362079003,0.7237588448296,0.731162951758353,0.723004804073768,0.72719557447664,0.00380494512788104 -lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Climate_Truncated,5,0.726660385143037,0.723768652905815,0.731181039693866,0.72301652132686,0.727208895973783,0.00380873317415131 -lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Landcover,5,0.714897867010021,0.711070873547497,0.715616075360572,0.710689730662897,0.713682108226793,0.00234024727927697 -lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Full,5,0.778362159718991,0.777313519482956,0.781078019062442,0.776659932196605,0.778941977854504,0.00220139213343037 -lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Full_Truncated,5,0.778213392638019,0.777186308510683,0.780963739171022,0.77651231594881,0.778814568724427,0.00222483325194008 -lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Full_Joint,5,0.777290152345703,0.776349528728965,0.780295682938712,0.77578324180292,0.778055337809396,0.00214296304404187 -lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Full_Joint_Truncated,5,0.777190658438047,0.776223771512686,0.780168440645134,0.775630371417491,0.777933926824515,0.00215290328592244 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Climate,4,0.714982827935826,0.71142147790233,0.716134560839275,,0.714122250389381,0.00278710207176498 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Climate_Truncated,4,0.714986555031238,0.711429083580888,0.716141935437511,,0.714128665372639,0.00278474056829603 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Landcover,4,0.6993486440522,0.695238223478961,0.703833711587922,,0.699482446538801,0.00471231540415982 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Full,4,0.766320433722221,0.757378470612268,0.770532908104046,,0.764631330605033,0.00773409788726129 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Full_Truncated,4,0.766446335783094,0.757266971247998,0.770241672495975,,0.764523468703731,0.00779476503948412 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Full_Joint,4,0.76558237025298,0.756446722492137,0.76890475840522,,0.76350620610705,0.00763281653645435 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Full_Joint_Truncated,4,0.765720545345162,0.756181429801128,0.768751167860589,,0.763396083549231,0.00772657199336835 -lichen,lichen,north,,,Physcia.adscendens,insample_auc,5,0.837335108574662,0.833892427673138,0.841684373333987,0.838268220834197,0.837631185433223,0.00421142443545695 -lichen,lichen,north,,,Physcia.adscendens,insample_deviance_explained,5,0.153309875432323,0.124539848626552,0.181355576712871,0.153309875432323,0.153462981135222,0.0313003485289416 -lichen,lichen,north,,,Physcia.adscendens,insample_rmse,5,0.394413849121186,0.390679733700768,0.396338542998067,0.393389135816662,0.393852028605293,0.00305493252353979 -lichen,lichen,north,,,Physcia.adscendens,insample_spearman,5,0.569716833320736,0.562212442609498,0.574320845837935,0.569949863531718,0.568531717754906,0.00642768440020838 -lichen,lichen,north,,,Physcia.adscendens,insample_calibration_slope,5,0.977543215514836,0.973882604264117,0.992189734009598,0.974581235728712,0.981283244985178,0.01051079416882 -lichen,lichen,north,,,Physcia.adscendens,insample_prevalence,5,0.382961350027218,0.378754207234193,0.387054085275807,0.384099122354156,0.382969715660275,0.00456567123234541 -lichen,lichen,north,,,Physcia.adscendens,insample_n,5,3699,3673.4,4975,5811,4115.6,947.965083745177 -lichen,lichen,north,,,Physcia.adscendens,oob_auc,4,0.839292658298271,0.829533400959301,0.846965637654569,,0.838547559018745,0.00938564979201381 -lichen,lichen,north,,,Physcia.adscendens,oob_deviance_explained,4,0.143454749419506,0.0949908751245048,0.205499371215224,,0.148305016384047,0.0631136911709378 -lichen,lichen,north,,,Physcia.adscendens,oob_rmse,4,0.391817546344859,0.388424442525194,0.400850115043751,,0.393831640944583,0.00707925330540285 -lichen,lichen,north,,,Physcia.adscendens,oob_spearman,4,0.570820101540557,0.556966290991812,0.585222167374373,,0.571015906999511,0.0152763365469035 -lichen,lichen,north,,,Physcia.adscendens,oob_calibration_slope,4,0.993551581711484,0.96245857697318,1.01756614536709,,0.991023567039093,0.0304614734345619 -lichen,lichen,north,,,Physcia.adscendens,oob_prevalence,4,0.386432660247333,0.378648004672367,0.394703317951312,,0.386606232436266,0.00923888826136022 -lichen,lichen,north,,,Physcia.adscendens,oob_n,5,2112,836,2137.6,0,1695.4,947.965083745177 -lichen,lichen,north,,,Physcia.adscendens,v2val_Climate,5,0.693422907498,0.690915989050979,0.694883881152127,0.693422907498,0.692986505923955,0.00201451745990401 -lichen,lichen,north,,,Physcia.adscendens,v2val_Climate_Truncated,5,0.693419511127206,0.690911780963104,0.694883929491704,0.693419511127206,0.692985163486467,0.00201463625805256 -lichen,lichen,north,,,Physcia.adscendens,v2val_Landcover,5,0.801861109542011,0.782213209132931,0.812598365772438,0.812994033294577,0.799562929201212,0.0178185824794553 -lichen,lichen,north,,,Physcia.adscendens,v2val_Full,5,0.837335108574662,0.833892427673138,0.841684373333987,0.838268220834197,0.837631185433223,0.00421142443545695 -lichen,lichen,north,,,Physcia.adscendens,v2val_Full_Truncated,5,0.837482703696643,0.83402227575171,0.841815848139725,0.838439032548488,0.837773708478258,0.00421550438320122 -lichen,lichen,north,,,Physcia.adscendens,v2val_Full_Joint,5,0.836047248740013,0.832067905608026,0.840315800616736,0.836357683360022,0.836103552465423,0.0046074652071796 -lichen,lichen,north,,,Physcia.adscendens,v2val_Full_Joint_Truncated,5,0.836286222674123,0.832185134167773,0.840452132671447,0.836525866238843,0.836258764262809,0.00461711990867249 -lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Climate,4,0.690146520368093,0.687623451889863,0.696399093335788,,0.691478486257188,0.00495021261044504 -lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Climate_Truncated,4,0.690133662354544,0.687619313393814,0.696403232441228,,0.69147481275667,0.00495756138170841 -lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Landcover,4,0.80689396202876,0.792826777899119,0.818710192371022,,0.806090049961839,0.0145903596426596 -lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Full,4,0.839292658298271,0.829533400959301,0.846965637654569,,0.838547559018745,0.00938564979201381 -lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Full_Truncated,4,0.839479011781648,0.829796481228334,0.8470008753914,,0.83870734501609,0.00926667222581543 -lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Full_Joint,4,0.835740019351969,0.826152734502598,0.845016117951229,,0.835628881405501,0.0101826777472231 -lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Full_Joint_Truncated,4,0.835910659316576,0.826439317818255,0.845028920277397,,0.835784559124612,0.0100393680766585 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_auc,5,0.782940004828585,0.771430317517624,0.78704102003786,0.782940004828585,0.780384815223684,0.00892062786427006 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_deviance_explained,5,0.101560194956707,0.0833055588905147,0.10855690687591,0.0760150539678254,0.0977267101316104,0.0134864921912352 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_rmse,5,0.273630488580498,0.266940670870867,0.27923536011912,0.27615265636656,0.273137946045151,0.00613430562265861 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_spearman,5,0.278345072756788,0.271410866729923,0.283855802016148,0.284558850730728,0.277868922002142,0.00614111968498575 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_calibration_slope,5,1.00445803190767,0.923032164793458,1.06063235332037,1.00400781901235,0.998413735524807,0.0779356859153725 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_prevalence,5,0.0907849829351536,0.0854880550520455,0.0942546707117982,0.092924126172208,0.0900691492139895,0.00433337917377339 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_n,5,1482,1471.8,2004.4,2346,1653.4,387.296785424305 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_auc,4,0.767777065619901,0.759098616020395,0.777508870753697,,0.768153264025005,0.0103158231014254 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_deviance_explained,4,0.00020738830490835,-0.0197727594970929,0.0186135944535137,,-0.0003547337141616,0.0206046152183967 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_rmse,4,0.285215861553978,0.278859149933553,0.293735548818788,,0.285988352855544,0.00803695663998821 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_spearman,4,0.280771471067578,0.258586974156161,0.293911115946987,,0.277541166770433,0.0193124585097445 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_calibration_slope,4,1.11452074384603,0.83884295294175,1.23312243580024,,1.05842213707815,0.227871215589685 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_prevalence,4,0.0997452652709462,0.0913286406440493,0.106312613843352,,0.0990848095371992,0.00808662138066247 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_n,5,864,341.6,874.2,0,692.6,387.296785424305 -lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Climate,5,0.726648362079003,0.7237588448296,0.731162951758353,0.723004804073768,0.72719557447664,0.00380494512788104 -lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Climate_Truncated,5,0.726660385143037,0.723768652905815,0.731181039693866,0.72301652132686,0.727208895973783,0.00380873317415131 -lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Landcover,5,0.746232134390029,0.738477213352093,0.757183243479499,0.74708991515486,0.747240463783824,0.0106065443436887 -lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Full,5,0.782940004828585,0.771430317517624,0.787041020037861,0.782940004828585,0.780384815223684,0.0089206278642703 -lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Full_Truncated,5,0.782940004828585,0.771430317517624,0.787041020037861,0.782940004828585,0.780384815223684,0.0089206278642703 -lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Full_Joint,5,0.783724649927571,0.773780455672375,0.788033764122229,0.783724649927571,0.781776344950047,0.00786739974674226 -lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Full_Joint_Truncated,5,0.783724649927571,0.773780455672375,0.788033764122229,0.783724649927571,0.781776344950047,0.00786739974674226 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Climate,4,0.714982827935826,0.71142147790233,0.716134560839275,,0.714122250389381,0.00278710207176498 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Climate_Truncated,4,0.714986555031238,0.711429083580888,0.716141935437511,,0.714128665372639,0.00278474056829603 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Landcover,4,0.75082184394749,0.74168570185442,0.752461597648907,,0.748144562379042,0.00674874952586361 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Full,4,0.767777065619901,0.759098616020395,0.777508870753697,,0.768153264025005,0.0103158231014254 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Full_Truncated,4,0.767777065619901,0.759098616020395,0.777508870753697,,0.768153264025005,0.0103158231014254 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Full_Joint,4,0.76868800182822,0.762466250385714,0.777619034446911,,0.769655602248286,0.00865338800241536 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Full_Joint_Truncated,4,0.76868800182822,0.762466250385714,0.777619034446911,,0.769655602248286,0.00865338800241536 -lichen,lichen,south,,,Physcia.adscendens,insample_auc,5,0.821353781719635,0.817185593102722,0.825672849056938,0.821573724007562,0.82133199677784,0.00470181458246041 -lichen,lichen,south,,,Physcia.adscendens,insample_deviance_explained,5,0.239704709286469,0.231908892003898,0.24739316046634,0.239704709286469,0.239170938481984,0.00836987471623949 -lichen,lichen,south,,,Physcia.adscendens,insample_rmse,5,0.356794925429378,0.352929674110169,0.358725757363671,0.356794925429378,0.356142732606163,0.00305057472651177 -lichen,lichen,south,,,Physcia.adscendens,insample_spearman,5,0.458171869563314,0.449023619570466,0.466231041170605,0.458171869563314,0.457232139057486,0.00919412871966326 -lichen,lichen,south,,,Physcia.adscendens,insample_calibration_slope,5,0.881651302841094,0.877029058458768,0.905002744726106,0.895884570463108,0.888780956639862,0.014710326211831 -lichen,lichen,south,,,Physcia.adscendens,insample_prevalence,5,0.215686274509804,0.210370852380551,0.218705697782215,0.215686274509804,0.214933253293698,0.00478783760132252 -lichen,lichen,south,,,Physcia.adscendens,insample_n,5,1487,1480.8,2014,2346,1662.2,382.531305908418 -lichen,lichen,south,,,Physcia.adscendens,oob_auc,4,0.816688066173278,0.814577556447952,0.819582119521717,,0.816967903181533,0.00271138269936014 -lichen,lichen,south,,,Physcia.adscendens,oob_deviance_explained,4,0.229581557918766,0.221042427704859,0.242028578202743,,0.230977232943791,0.0116106526749679 -lichen,lichen,south,,,Physcia.adscendens,oob_rmse,4,0.361221111344793,0.357219734510275,0.363119037857434,,0.360469879086979,0.00328089666967988 -lichen,lichen,south,,,Physcia.adscendens,oob_spearman,4,0.454435749483605,0.444604153459308,0.459399541619317,,0.452697248094824,0.00824469525388058 -lichen,lichen,south,,,Physcia.adscendens,oob_calibration_slope,4,0.869323881706107,0.820424126275093,0.95799881977588,,0.883529304077092,0.0756154292842296 -lichen,lichen,south,,,Physcia.adscendens,oob_prevalence,4,0.21549434057534,0.209833885194357,0.226186106799465,,0.217291237305033,0.00944381193189753 -lichen,lichen,south,,,Physcia.adscendens,oob_n,5,859,332,865.2,0,683.8,382.531305908418 -lichen,lichen,south,,,Physcia.adscendens,v2val_Climate,5,0.693422907498,0.690915989050979,0.694883881152127,0.693422907498,0.692986505923955,0.00201451745990401 -lichen,lichen,south,,,Physcia.adscendens,v2val_Climate_Truncated,5,0.693419511127206,0.690911780963104,0.694883929491704,0.693419511127206,0.692985163486467,0.00201463625805256 -lichen,lichen,south,,,Physcia.adscendens,v2val_Landcover,5,0.755367662346663,0.753354388319629,0.769154488554709,0.755514263619179,0.75923726755233,0.0106880634487565 -lichen,lichen,south,,,Physcia.adscendens,v2val_Full,5,0.821353781719635,0.817185593102722,0.825672849056938,0.821573724007562,0.82133199677784,0.00470181458246041 -lichen,lichen,south,,,Physcia.adscendens,v2val_Full_Truncated,5,0.821369179600887,0.817185593102722,0.825672849056938,0.821573724007562,0.82133507635409,0.00470183746079766 -lichen,lichen,south,,,Physcia.adscendens,v2val_Full_Joint,5,0.818351194875585,0.815473629919288,0.821595518961059,0.818413816807012,0.818450596628366,0.0035138580973253 -lichen,lichen,south,,,Physcia.adscendens,v2val_Full_Joint_Truncated,5,0.818366592756837,0.815473629919288,0.821595518961059,0.818413816807012,0.818453676204616,0.0035137559475432 -lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Climate,4,0.690146520368093,0.687623451889863,0.696399093335788,,0.691478486257188,0.00495021261044504 -lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Climate_Truncated,4,0.690133662354544,0.687619313393814,0.696403232441228,,0.69147481275667,0.00495756138170841 -lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Landcover,4,0.757543713583416,0.754237750244239,0.765899299116814,,0.759347150081352,0.00659093377352209 -lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Full,4,0.816688066173278,0.814577556447952,0.819582119521717,,0.816967903181533,0.00271138269936014 -lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Full_Truncated,4,0.816692374438254,0.814577556447952,0.819584704480702,,0.81697005731402,0.00271219354015405 -lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Full_Joint,4,0.812861687935889,0.810647101871693,0.815758867203804,,0.813105471222931,0.00283145974958857 -lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Full_Joint_Truncated,4,0.81287030446584,0.810647101871693,0.815764037121775,,0.813109779487907,0.00283515421967582 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_auc,5,0.820367038624296,0.819088803830954,0.825096132690793,0.820911148938545,0.821548232901657,0.00368021243181869 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_deviance_explained,5,0.274643755760762,0.273047064346357,0.2795535093301,0.272167552780268,0.275794916286106,0.0037829114549962 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_rmse,5,0.325649814939506,0.323044576138151,0.32774821127909,0.327783381237672,0.325475899728406,0.0023268778087488 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_spearman,5,0.457622037926128,0.455146980332479,0.464800704476141,0.457622037926128,0.459282943376137,0.0052329898486681 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_calibration_slope,5,0.987210797047211,0.964756720342875,1.04226829149403,0.987210797047211,0.999628097376395,0.040457896858658 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_prevalence,5,0.22526523562793,0.222685585610422,0.228865718677616,0.22526523562793,0.225662811559798,0.00324773944134521 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_n,5,2588,2554.4,3469,4053,2869.4,661.914873680899 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_auc,4,0.807437018082126,0.795187683185118,0.814600712078279,,0.805620717760392,0.0109848697690175 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_deviance_explained,4,0.234952851608951,0.215144910318834,0.252509532861174,,0.234148830166846,0.0201759809192477 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_rmse,4,0.33540874228767,0.32943601838744,0.340042074806677,,0.334930388222947,0.00571392258320504 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_spearman,4,0.436123893428745,0.419582521233002,0.446016838076314,,0.433749455018683,0.0150488838521891 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_calibration_slope,4,0.947080559125973,0.940176391586403,0.972191240627968,,0.953582885541124,0.0195519425313773 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_prevalence,4,0.224511499051979,0.218291264544164,0.230417458254175,,0.224399257871401,0.00661456979352361 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_n,5,1465,584,1498.6,0,1183.6,661.914873680899 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_auc,5,0.61119205862304,0.608247846213005,0.619766590249117,0.614800455189874,0.613133257123311,0.00617079565055122 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_deviance_explained,5,0.0293312456190202,0.0254868824061227,0.034855941334284,0.0327130199155846,0.0299655255688071,0.00466042949610858 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_rmse,5,0.440494520447441,0.439655702708701,0.441992443932362,0.440494520447441,0.440710638869574,0.00129009568326754 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_spearman,5,0.166867112583273,0.161253581705846,0.173443277843013,0.166867112583273,0.166942767059625,0.00668917082484309 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_calibration_slope,5,0.871613828265815,0.807561232834562,0.918699876937025,0.901041907949805,0.864331745671229,0.05473797753352 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_prevalence,5,0.320047355958958,0.317847829087179,0.320941159211816,0.321243523316062,0.319582666739872,0.00164288413830535 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_n,5,2587,2537.6,3467,4053,2861,666.806193732482 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_auc,4,0.599789507623449,0.585096398809124,0.610287133771428,,0.598291120956897,0.0139243777141284 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_deviance_explained,4,0.0222358139724005,0.0154302383695453,0.0289963709245666,,0.0222197358828687,0.00780005134828563 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_rmse,4,0.444244510956,0.443337295940116,0.444727707984992,,0.444093075960681,0.000801980504115758 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_spearman,4,0.1428985967646,0.125110680243685,0.165466638254086,,0.144605784253376,0.0220824267179884 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_calibration_slope,4,0.750011624893702,0.699600524966396,0.836834785057386,,0.76301593212098,0.0752804461935625 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_prevalence,4,0.324076824388238,0.322733281306541,0.3276244709432,,0.324864004200118,0.00280085582083958 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_n,5,1466,586,1515.4,0,1192,666.806193732482 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_auc,5,0.634240369366988,0.632910641847936,0.642195650517714,0.634240369366988,0.636730093444244,0.00492494577892738 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_deviance_explained,5,0.0264112493368064,0.0244020509882967,0.0303865560800429,0.0264112493368064,0.0271321926805094,0.00319183688778419 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_rmse,5,0.418769573067301,0.41254704078318,0.420323940326511,0.421286846656193,0.41688100357794,0.00397229497435235 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_spearman,5,0.175369074792115,0.169472066216479,0.19311238624043,0.175369074792115,0.17910418059275,0.0143000493783131 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_calibration_slope,5,0.975536082659011,0.869669271029773,0.999133512851468,1.00531761653027,0.942116568564117,0.0667346863953477 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_prevalence,5,0.691079812206573,0.689952548788955,0.71053806886065,0.691079812206573,0.698355803841802,0.0110051698108056 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_n,5,675,672.2,911.8,1065,753.4,174.236333753899 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_auc,4,0.590185162579443,0.588561095758765,0.594993617451278,,0.591322444026285,0.00370894024345057 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_deviance_explained,4,-0.00660912212895907,-0.0246222554112858,0.00596211189481146,,-0.00855265757844343,0.0170007059445371 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_rmse,4,0.438945021715404,0.435169754735052,0.442994297582763,,0.439042882032192,0.00430413105762848 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_spearman,4,0.119269331592725,0.112670153678564,0.141855035472014,,0.1249788051517,0.0171203610940835 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_calibration_slope,4,0.529521999315492,0.405879483641657,0.748020467389396,,0.56339912517266,0.188100087615398 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_prevalence,4,0.675933879994794,0.656439043984736,0.693034260713775,,0.675078717390838,0.0207397429628256 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_n,5,390,153.2,392.8,0,311.6,174.236333753899 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_auc,5,0.800563803516706,0.774332077165384,0.807116397983381,0.786049924840508,0.793142123263336,0.0172774284548912 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_deviance_explained,5,0.235315369629889,0.184794016646685,0.243734500249067,0.205216892616348,0.219402980661022,0.0313035508744373 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_rmse,5,0.345153854253612,0.340273324511787,0.350387335024819,0.345153854253612,0.345250928073386,0.00498539064156107 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_spearman,5,0.399822439479778,0.365817333025682,0.416474286805188,0.381089371361329,0.393764975108055,0.025777771060145 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_calibration_slope,5,0.983951125311349,0.934535204259224,1.0182141754068,0.986324497785332,0.978961877909731,0.0489672106534818 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_prevalence,5,0.182159624413146,0.181333087877553,0.193172072927236,0.182159624413146,0.185526823886116,0.00827314119136472 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_n,5,678,670.6,913,1065,754,173.956891211587 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_auc,4,0.729574202549047,0.71815250764054,0.778542353806383,,0.742983651245057,0.0363678903345032 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_deviance_explained,4,0.0957319747373082,-0.112729476086203,0.182551981226243,,0.0522886017606739,0.177839885253858 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_rmse,4,0.349900330806755,0.341019339169151,0.360550613582775,,0.350532220499047,0.0106010756691699 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_spearman,4,0.291859756320935,0.287348724179463,0.363426726063271,,0.315808305464101,0.0514234239419856 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_calibration_slope,4,0.774041963702232,0.646822148840561,1.18815164727979,,0.876502631100762,0.317190446694699 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_prevalence,4,0.182520739834082,0.160534290271133,0.183610188261351,,0.175057525142768,0.01572313523028 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_n,5,387,152,394.4,0,311,173.956891211587 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_auc,5,0.843771320712376,0.837298705573725,0.845386776229526,0.839440907842931,0.841900799199367,0.00416458415403682 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_deviance_explained,5,0.296908480586636,0.290887810793796,0.302200604755114,0.294409607036222,0.296791618459388,0.00570554859270136 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_rmse,5,0.300280860452662,0.299352741208206,0.302368697081708,0.30069616131153,0.300636486451009,0.00169518301694859 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_spearman,5,0.466818565812599,0.461436555661139,0.473138781426199,0.463240577826878,0.467175270468735,0.00576420559514205 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_calibration_slope,5,0.972690836668142,0.921935358308296,0.979611212169833,0.982050704865843,0.955256551495782,0.0299777079445712 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_prevalence,5,0.201509433962264,0.199761756423448,0.205640478898507,0.201356917858008,0.202439531288226,0.00307554695366447 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_n,5,2612,2595.8,3536.2,4127,2916.2,677.217616427689 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_auc,4,0.827458353428436,0.817805717079038,0.840574988117616,,0.828695495692644,0.0124179160962348 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_deviance_explained,4,0.276689902789578,0.265842733106712,0.294949072324388,,0.279337045593844,0.0167940142463136 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_rmse,4,0.303789329751735,0.298771516378234,0.304833455528629,,0.302370155610089,0.00382820840385957 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_spearman,4,0.444765026946551,0.435147313816253,0.460529325956992,,0.446960236189459,0.0143757349540166 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_calibration_slope,4,0.912370954577014,0.861212539179959,0.954228059409819,,0.909049057946925,0.0520155611998991 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_prevalence,4,0.199234448913847,0.193549889929862,0.204483398915383,,0.199078874277258,0.00592784350128194 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_n,5,1515,590.8,1531.2,0,1210.8,677.217616427689 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_auc,5,0.672085273881372,0.668633720672182,0.680693747031501,0.668767750495832,0.673650345261601,0.00705894383852787 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_deviance_explained,5,0.0758678220182751,0.0704991263862156,0.0841775407251298,0.0713753243188524,0.0768329848204126,0.00689725835100292 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_rmse,5,0.332910274284271,0.327210641524145,0.335100999244875,0.332910274284271,0.331554332789458,0.00395381643788123 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_spearman,5,0.215829774013176,0.212589282113879,0.226422981371282,0.211955551417089,0.218242903591179,0.00816350970165605 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_calibration_slope,5,0.94812085347111,0.856889525073144,1.03389671800408,0.94812085347111,0.948321951639006,0.092126092648448 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_prevalence,5,0.148776350860189,0.144579171619019,0.151265484707482,0.148776350860189,0.148217744909364,0.00345089736498891 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_n,5,2637,2606,3537,4127,2925.8,671.783223964398 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_auc,4,0.654372882277188,0.640403021566792,0.6605591763494,,0.651593037049265,0.0112866225169797 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_deviance_explained,4,0.0514858356828411,0.0379579660013158,0.0604573235872615,,0.0498585564767322,0.0123265017677637 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_rmse,4,0.337444976131703,0.331449906564068,0.342571110976009,,0.337134642301943,0.00618013722586392 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_spearman,4,0.19099043338874,0.174162150130626,0.204597549588522,,0.189840016582193,0.0164077747297465 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_calibration_slope,4,0.732075381978751,0.657958194547818,0.836247242841193,,0.742809193918576,0.0983856367690785 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_prevalence,4,0.148630312373211,0.144212802079742,0.157027721824677,,0.150051704929638,0.00706694376971498 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_n,5,1490,590,1521,0,1201.2,671.783223964398 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_auc,5,0.706112866420923,0.689756836780519,0.712422673247893,0.689082366331686,0.701766116171277,0.0115819259664459 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_deviance_explained,5,0.077948761211899,0.0672394512735814,0.0862779229583741,0.0670547674954939,0.0767109599030692,0.00953073159442438 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_rmse,5,0.401891914348534,0.400056693343447,0.408313222434912,0.406888363248781,0.403660884327179,0.00418719958207863 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_spearman,5,0.328404695790939,0.293718951070702,0.340256897739946,0.296933239332004,0.319246035124502,0.0234446146251979 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_calibration_slope,5,1.02265042079081,0.949079646474498,1.06820491938664,1.03306130883064,1.01079025774546,0.0605675993019255 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_prevalence,5,0.602816901408451,0.593809006916747,0.607790307126989,0.604735883424408,0.60104129788425,0.00700249933764362 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_n,5,696,686.6,942.8,1098,775.8,180.377936566532 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_auc,4,0.642530046696975,0.604052771943084,0.646988682070108,,0.630380532632419,0.0285027427030458 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_deviance_explained,4,0.0177640077575169,-0.00914291472953676,0.0380006855045052,,0.0153817774932079,0.0262728517098914 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_rmse,4,0.423675312133193,0.412365569779127,0.4289659133495,,0.421525618869708,0.00945427379070984 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_spearman,4,0.215041364313525,0.166273559830134,0.234657571247567,,0.204630079474472,0.0385961235199444 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_calibration_slope,4,0.666986903656138,0.480343171377765,0.83150584600084,,0.659085192965541,0.188467730825247 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_prevalence,4,0.614967084834182,0.599715606114469,0.623570700713301,,0.612592848105398,0.0130873792975551 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_n,5,402,155.2,411.4,0,322.2,180.377936566532 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_auc,5,0.823493333333333,0.815129597967925,0.847125543751909,0.819927852628077,0.828483048702628,0.0191754521582077 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_deviance_explained,5,0.240858392609539,0.229287932861753,0.282840102014879,0.234870911391229,0.250773020824705,0.0333046711345811 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_rmse,5,0.223331046901821,0.21469247206876,0.227275887816135,0.223331046901821,0.221804231165123,0.00746931749125918 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_spearman,5,0.319693927847967,0.314626273281237,0.331123877059782,0.313170610278462,0.321987168463127,0.00854028427675327 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_calibration_slope,5,0.926166715024209,0.8521293240645,0.969181499315011,0.926166715024209,0.911949295173001,0.0594253375701516 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_prevalence,5,0.0875912408759124,0.0815913826315997,0.0946898807160816,0.0874316939890711,0.0882209860082516,0.00699025063520411 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_n,5,693,685.8,936.8,1098,771.6,182.509725768245 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_auc,4,0.77744050520223,0.771065167348639,0.803486958443855,,0.784465903555099,0.0194119950156149 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_deviance_explained,4,0.17108179189974,0.0694866534919466,0.192858665045726,,0.142575268591952,0.0750549614358755 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_rmse,4,0.226318832277226,0.216290927259541,0.250116289221731,,0.231236529393947,0.0196223161851492 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_spearman,4,0.278455188286047,0.262015370235656,0.285433310292326,,0.275076011127436,0.0140713668010713 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_calibration_slope,4,0.751176575138291,0.529405518004174,0.815471311990914,,0.694935032180614,0.168343487942426 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_prevalence,4,0.0837295205104187,0.0742110480309994,0.0991029746633899,,0.0858205853938301,0.0138195684717859 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_n,5,405,161.2,412.2,0,326.4,182.509725768245 -mite,mite,north,,,Ceratozetes.gracilis,insample_auc,5,0.793023395932593,0.785116760768433,0.797585561245424,0.791183069113511,0.791977110922841,0.00673340419157571 -mite,mite,north,,,Ceratozetes.gracilis,insample_deviance_explained,5,0.134692532005047,0.108608328871156,0.141811919550427,0.125527507164404,0.128052047876132,0.0184307041865782 -mite,mite,north,,,Ceratozetes.gracilis,insample_rmse,5,0.364641744759417,0.36299256091057,0.368618183340602,0.364308079016483,0.365438034871869,0.00324688670297244 -mite,mite,north,,,Ceratozetes.gracilis,insample_spearman,5,0.41429348998048,0.402422002613553,0.419681351800533,0.409677886636093,0.412099312835312,0.00911372223585555 -mite,mite,north,,,Ceratozetes.gracilis,insample_calibration_slope,5,1.0224894029886,1.00755092646514,1.03915812721702,1.0224894029886,1.02287359767688,0.0156175294996684 -mite,mite,north,,,Ceratozetes.gracilis,insample_prevalence,5,0.211169769380383,0.208505864577966,0.211369634473166,0.208369812642269,0.210190443530451,0.00151474200965215 -mite,mite,north,,,Ceratozetes.gracilis,insample_n,5,3651,3606.6,4890.2,5711,4047.6,930.188045504779 -mite,mite,north,,,Ceratozetes.gracilis,oob_auc,4,0.779665972511523,0.773198985489411,0.798395168992114,,0.784045333032408,0.0147724589078592 -mite,mite,north,,,Ceratozetes.gracilis,oob_deviance_explained,4,0.0923986988857812,0.0862667569754759,0.144304465844404,,0.108746493545894,0.037849846139005 -mite,mite,north,,,Ceratozetes.gracilis,oob_rmse,4,0.36680003014665,0.360411853868392,0.368997514633471,,0.365303354506851,0.00518143947194182 -mite,mite,north,,,Ceratozetes.gracilis,oob_spearman,4,0.389977816116695,0.383012434237582,0.415943717902066,,0.396763716083216,0.0196903404412637 -mite,mite,north,,,Ceratozetes.gracilis,oob_calibration_slope,4,0.956222238793897,0.921365026616042,1.05973298874715,,0.980741359427966,0.0799378045179831 -mite,mite,north,,,Ceratozetes.gracilis,oob_prevalence,4,0.203407429558746,0.203105380508127,0.206516438658429,,0.204409915290554,0.0022495255846381 -mite,mite,north,,,Ceratozetes.gracilis,oob_n,5,2060,820.8,2104.4,0,1663.4,930.188045504779 -mite,mite,north,,,Ceratozetes.gracilis,v2val_Climate,5,0.738382414749567,0.734358129806975,0.742005285315151,0.738382414749567,0.738111987253943,0.00384260421914782 -mite,mite,north,,,Ceratozetes.gracilis,v2val_Climate_Truncated,5,0.738392463572007,0.734342356311168,0.742026178178654,0.738392463572007,0.738117914905037,0.00385983439540224 -mite,mite,north,,,Ceratozetes.gracilis,v2val_Landcover,5,0.766722893536977,0.759062628411847,0.772422596192916,0.766722893536977,0.766125561315905,0.00683173671440066 -mite,mite,north,,,Ceratozetes.gracilis,v2val_Full,5,0.793023395932593,0.785116760768433,0.797585561245424,0.791183069113511,0.791977110922841,0.00673340419157571 -mite,mite,north,,,Ceratozetes.gracilis,v2val_Full_Truncated,5,0.793016443892401,0.785027851595894,0.797500866905145,0.791105466738786,0.791908988560901,0.00674045451455018 -mite,mite,north,,,Ceratozetes.gracilis,v2val_Full_Joint,5,0.793386060695946,0.785055839040043,0.797509252679056,0.791225262500488,0.792011165992849,0.00676871644676792 -mite,mite,north,,,Ceratozetes.gracilis,v2val_Full_Joint_Truncated,5,0.793386524165292,0.784963217939285,0.797444970586129,0.7911589984368,0.791952343573282,0.00679046380342073 -mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Climate,4,0.731027419469463,0.725410991997312,0.741834431700471,,0.732881199740483,0.00906851156052711 -mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Climate_Truncated,4,0.731045119285728,0.72540173801145,0.741842884282973,,0.732885970615359,0.00907305785634944 -mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Landcover,4,0.752661723212296,0.748458309671417,0.773156655512682,,0.758480122769263,0.0155945518677711 -mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Full,4,0.779665972511523,0.773198985489411,0.798395168992114,,0.784045333032408,0.0147724589078592 -mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Full_Truncated,4,0.77962848748914,0.773216243029163,0.798382692848602,,0.784036330667528,0.014780937706049 -mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Full_Joint,4,0.779066438961531,0.77354347637541,0.798343558984922,,0.78397863804627,0.0148677753889034 -mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Full_Joint_Truncated,4,0.779044896212606,0.773564180389716,0.798356007315929,,0.783984323098475,0.01488666359881 -mite,mite,north,,,Trhypochthonius.tectorum,insample_auc,5,0.672907942808574,0.669208813819547,0.682343647003947,0.669778092188547,0.674857259308144,0.0070191421865739 -mite,mite,north,,,Trhypochthonius.tectorum,insample_deviance_explained,5,-0.0324180258517079,-0.0527646417815135,-0.0101623689114898,-0.0407269697080057,-0.0321707940218346,0.0231090933708154 -mite,mite,north,,,Trhypochthonius.tectorum,insample_rmse,5,0.288562681524747,0.286522184662904,0.291945228269945,0.288562681524747,0.288981155568958,0.00296084278549151 -mite,mite,north,,,Trhypochthonius.tectorum,insample_spearman,5,0.174619892294846,0.172564649955749,0.187939106716607,0.1729413278484,0.178541440689235,0.00902094001424548 -mite,mite,north,,,Trhypochthonius.tectorum,insample_calibration_slope,5,0.938290627841302,0.909627160028179,0.994839719200875,0.931192865479756,0.95045611024787,0.0429430392043578 -mite,mite,north,,,Trhypochthonius.tectorum,insample_prevalence,5,0.0956049728593941,0.0940001763114542,0.0987931854359719,0.0956049728593941,0.0960754727002272,0.00270898671716411 -mite,mite,north,,,Trhypochthonius.tectorum,insample_n,5,3624,3599.2,4881,5711,4034.4,937.384819591186 -mite,mite,north,,,Trhypochthonius.tectorum,oob_auc,4,0.651421835190664,0.64513479278205,0.663121005511504,,0.653354738016459,0.00989688245354325 -mite,mite,north,,,Trhypochthonius.tectorum,oob_deviance_explained,4,-0.0625612551961812,-0.104386756333539,-0.0317884651562399,,-0.066508652016687,0.0413281120013629 -mite,mite,north,,,Trhypochthonius.tectorum,oob_rmse,4,0.289482213990474,0.281791769789717,0.293681830417276,,0.28823548978549,0.00666038076943173 -mite,mite,north,,,Trhypochthonius.tectorum,oob_spearman,4,0.153802350804888,0.145130738202924,0.167192976536939,,0.155487712637062,0.0120299047392454 -mite,mite,north,,,Trhypochthonius.tectorum,oob_calibration_slope,4,0.866440051991562,0.715195080326882,0.99057532202289,,0.856758015693936,0.149800198792233 -mite,mite,north,,,Trhypochthonius.tectorum,oob_prevalence,4,0.0963264503316864,0.0893459374618542,0.0984905896614327,,0.0946063169245129,0.00535078906761863 -mite,mite,north,,,Trhypochthonius.tectorum,oob_n,5,2087,830,2111.8,0,1676.6,937.384819591186 -mite,mite,north,,,Trhypochthonius.tectorum,v2val_Climate,5,0.646091585413555,0.643946189711462,0.652343816700896,0.646091585413555,0.647435005669506,0.00501081050104212 -mite,mite,north,,,Trhypochthonius.tectorum,v2val_Climate_Truncated,5,0.646095557008706,0.643948358640746,0.65233771826661,0.646095557008706,0.647436539502018,0.00500120525659027 -mite,mite,north,,,Trhypochthonius.tectorum,v2val_Landcover,5,0.637987440117159,0.627044747234771,0.648796943002273,0.637987440117159,0.637774648879966,0.0120277548025983 -mite,mite,north,,,Trhypochthonius.tectorum,v2val_Full,5,0.672907942808574,0.669208813819547,0.682343647003947,0.669778092188547,0.674857259308144,0.0070191421865739 -mite,mite,north,,,Trhypochthonius.tectorum,v2val_Full_Truncated,5,0.672968462835808,0.669234243838635,0.682370652186889,0.669767986128102,0.67489223986993,0.00700566517575936 -mite,mite,north,,,Trhypochthonius.tectorum,v2val_Full_Joint,5,0.673039662867848,0.668775078579256,0.682456515305188,0.66926215120794,0.674743399528349,0.00725984991743693 -mite,mite,north,,,Trhypochthonius.tectorum,v2val_Full_Joint_Truncated,5,0.673102852896284,0.66877285388055,0.682481051437855,0.669242116386356,0.674767969249559,0.0072566620089462 -mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Climate,4,0.637448091750764,0.62319195321542,0.64083947116042,,0.633567820634447,0.0109633746747622 -mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Climate_Truncated,4,0.637447116712891,0.623191511787853,0.640852747518307,,0.633572125955883,0.0109617111390789 -mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Landcover,4,0.619482659509824,0.616517647587969,0.622452812919573,,0.6194844957555,0.00319182447037644 -mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Full,4,0.651421835190664,0.64513479278205,0.663121005511504,,0.653354738016459,0.00989688245354325 -mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Full_Truncated,4,0.651598760851872,0.645145346470754,0.66328863933151,,0.653468926601344,0.00996350123797742 -mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Full_Joint,4,0.650909465977038,0.643507260329979,0.663048883832917,,0.652601327480188,0.0106588967286394 -mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Full_Joint_Truncated,4,0.65107837071969,0.643490423905209,0.66321170510179,,0.652701723422411,0.0107382013149323 -mite,mite,south,,,Ceratozetes.gracilis,insample_auc,5,0.883740175681923,0.875951595662976,0.884218489485534,0.880842240129472,0.881127727799286,0.00491960965959818 -mite,mite,south,,,Ceratozetes.gracilis,insample_deviance_explained,5,0.169227984866749,0.102917912757133,0.174897444771582,0.169227984866749,0.148837676671015,0.0479777276568308 -mite,mite,south,,,Ceratozetes.gracilis,insample_rmse,5,0.223410917578014,0.207894263041054,0.228617168412238,0.215105469199925,0.219622699857429,0.0107678160117743 -mite,mite,south,,,Ceratozetes.gracilis,insample_spearman,5,0.304054710362117,0.292604158893579,0.321411532274628,0.304054710362117,0.306352068526036,0.0145523795554875 -mite,mite,south,,,Ceratozetes.gracilis,insample_calibration_slope,5,0.646501812554423,0.571714943118018,0.663896293625869,0.652084939529121,0.625798242702713,0.0510970524920574 -mite,mite,south,,,Ceratozetes.gracilis,insample_prevalence,5,0.056970509383378,0.0521775638545351,0.0622115928022082,0.0562843842573,0.0572190090351997,0.00535467847864499 -mite,mite,south,,,Ceratozetes.gracilis,insample_n,5,1494,1479.4,2024.6,2363,1667.4,389.193139713433 -mite,mite,south,,,Ceratozetes.gracilis,oob_auc,4,0.877556363090999,0.870858501486971,0.891246533596325,,0.880053616270034,0.0119804912573777 -mite,mite,south,,,Ceratozetes.gracilis,oob_deviance_explained,4,0.149139947228324,0.081863654137057,0.211545016984438,,0.147400224608626,0.0705190613624988 -mite,mite,south,,,Ceratozetes.gracilis,oob_rmse,4,0.217549055983636,0.21158190570823,0.223701160718158,,0.217615111147606,0.00687714178519329 -mite,mite,south,,,Ceratozetes.gracilis,oob_spearman,4,0.297912570168464,0.269110530526911,0.325939210959734,,0.297635642007648,0.0304788257744718 -mite,mite,south,,,Ceratozetes.gracilis,oob_calibration_slope,4,0.588033894967732,0.50519914194533,0.720419749435623,,0.60573071691255,0.11934507589046 -mite,mite,south,,,Ceratozetes.gracilis,oob_prevalence,4,0.0533392883804503,0.0452752248602848,0.0645232647455575,,0.0544535429679295,0.0107814199736608 -mite,mite,south,,,Ceratozetes.gracilis,oob_n,5,869,338.4,883.6,0,695.6,389.193139713433 -mite,mite,south,,,Ceratozetes.gracilis,v2val_Climate,5,0.738382414749567,0.734358129806975,0.742005285315151,0.738382414749567,0.738111987253943,0.00384260421914782 -mite,mite,south,,,Ceratozetes.gracilis,v2val_Climate_Truncated,5,0.738392463572007,0.734342356311168,0.742026178178654,0.738392463572007,0.738117914905037,0.00385983439540224 -mite,mite,south,,,Ceratozetes.gracilis,v2val_Landcover,5,0.722020131552721,0.71607655717679,0.728899344516339,0.719697225125594,0.722583698825812,0.00643427629050986 -mite,mite,south,,,Ceratozetes.gracilis,v2val_Full,5,0.883740175681923,0.875951595662976,0.884218489485534,0.880842240129472,0.881127727799286,0.00491960965959818 -mite,mite,south,,,Ceratozetes.gracilis,v2val_Full_Truncated,5,0.883740175681923,0.875951595662976,0.884218489485534,0.880842240129472,0.881127727799286,0.00491960965959818 -mite,mite,south,,,Ceratozetes.gracilis,v2val_Full_Joint,5,0.883869625520111,0.877386169471364,0.884867266298163,0.880966991469706,0.88186690451822,0.00416238011000395 -mite,mite,south,,,Ceratozetes.gracilis,v2val_Full_Joint_Truncated,5,0.883869625520111,0.877386169471364,0.884867266298163,0.880966991469706,0.88186690451822,0.00416238011000395 -mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Climate,4,0.731027419469463,0.725410991997312,0.741834431700471,,0.732881199740483,0.00906851156052711 -mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Climate_Truncated,4,0.731045119285728,0.72540173801145,0.741842884282973,,0.732885970615359,0.00907305785634944 -mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Landcover,4,0.704830138651714,0.697578522816295,0.713165675388293,,0.705217253259271,0.00876901015163448 -mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Full,4,0.877556363090999,0.870858501486971,0.891246533596325,,0.880053616270034,0.0119804912573777 -mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Full_Truncated,4,0.877556363090999,0.870858501486971,0.891281973045494,,0.880066273216166,0.0120040417679418 -mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Full_Joint,4,0.87838605738981,0.870791888918913,0.892459363692493,,0.880700035186876,0.0128370905847578 -mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Full_Joint_Truncated,4,0.87838605738981,0.870791888918913,0.892494803141663,,0.880712692133008,0.012860350145155 -mite,mite,south,,,Trhypochthonius.tectorum,insample_auc,5,0.714545787058589,0.69969622945697,0.724109648011322,0.705313075635924,0.712537633834069,0.0121603195766141 -mite,mite,south,,,Trhypochthonius.tectorum,insample_deviance_explained,5,-2.20551740843788e-05,-0.00644243886806564,0.0163984110082346,0.01492775208855,0.00397390748081414,0.0114643898167834 -mite,mite,south,,,Trhypochthonius.tectorum,insample_rmse,5,0.269858367078513,0.266406986696229,0.272808873150662,0.270464873051431,0.269513931566532,0.00330133552867803 -mite,mite,south,,,Trhypochthonius.tectorum,insample_spearman,5,0.210611679646456,0.189085620295154,0.213764285932634,0.196610759018781,0.203586560421865,0.0130220945300142 -mite,mite,south,,,Trhypochthonius.tectorum,insample_calibration_slope,5,0.964366086336983,0.916309849664698,0.989356334697425,0.964366086336983,0.955309012900657,0.0368054765299321 -mite,mite,south,,,Trhypochthonius.tectorum,insample_prevalence,5,0.0833685992382565,0.0807473443243282,0.0863035095821866,0.0833685992382565,0.083401335320589,0.00299510185415199 -mite,mite,south,,,Trhypochthonius.tectorum,insample_n,5,1489,1484.4,2017.4,2363,1664.2,390.68875079787 -mite,mite,south,,,Trhypochthonius.tectorum,oob_auc,4,0.669707753515078,0.654014549095664,0.683226886999099,,0.66893129960958,0.0157013541907933 -mite,mite,south,,,Trhypochthonius.tectorum,oob_deviance_explained,4,0.0238861350837344,-0.00501344344448882,0.0319775842734965,,0.0164546603199983,0.0222551548342608 -mite,mite,south,,,Trhypochthonius.tectorum,oob_rmse,4,0.275344693909917,0.2660800590245,0.279902566485838,,0.273663707370811,0.00770431969533571 -mite,mite,south,,,Trhypochthonius.tectorum,oob_spearman,4,0.16338068295489,0.142721241028181,0.180002438567577,,0.161938652128453,0.0200563721519488 -mite,mite,south,,,Trhypochthonius.tectorum,oob_calibration_slope,4,0.640530845430618,0.577798461860074,0.822553046730012,,0.68313435176235,0.143050298074835 -mite,mite,south,,,Trhypochthonius.tectorum,oob_prevalence,4,0.0842873358196854,0.0775201528145626,0.0881856815952926,,0.0832627510948584,0.00595703320150957 -mite,mite,south,,,Trhypochthonius.tectorum,oob_n,5,874,345.6,878.6,0,698.8,390.68875079787 -mite,mite,south,,,Trhypochthonius.tectorum,v2val_Climate,5,0.646091585413555,0.643946189711462,0.652343816700896,0.646091585413555,0.647435005669506,0.00501081050104212 -mite,mite,south,,,Trhypochthonius.tectorum,v2val_Climate_Truncated,5,0.646095557008706,0.643948358640746,0.65233771826661,0.646095557008706,0.647436539502018,0.00500120525659027 -mite,mite,south,,,Trhypochthonius.tectorum,v2val_Landcover,5,0.671864124042916,0.659898184775652,0.684374697179488,0.660231262098608,0.671375041215641,0.0130121969567772 -mite,mite,south,,,Trhypochthonius.tectorum,v2val_Full,5,0.714545787058589,0.69969622945697,0.724109648011322,0.705313075635924,0.712537633834069,0.0121603195766141 -mite,mite,south,,,Trhypochthonius.tectorum,v2val_Full_Truncated,5,0.714545787058589,0.69969622945697,0.724109648011322,0.705313075635924,0.712537633834069,0.0121603195766141 -mite,mite,south,,,Trhypochthonius.tectorum,v2val_Full_Joint,5,0.714906009620713,0.700143210072346,0.72490193539616,0.705786473932628,0.713089166909465,0.012325737475379 -mite,mite,south,,,Trhypochthonius.tectorum,v2val_Full_Joint_Truncated,5,0.714906009620713,0.700143210072346,0.72490193539616,0.705786473932628,0.713089166909465,0.012325737475379 -mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Climate,4,0.637448091750764,0.62319195321542,0.64083947116042,,0.633567820634447,0.0109633746747622 -mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Climate_Truncated,4,0.637447116712891,0.623191511787853,0.640852747518307,,0.633572125955883,0.0109617111390789 -mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Landcover,4,0.613895073569526,0.611766319340838,0.647057552774624,,0.624978546775387,0.0240120090979382 -mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Full,4,0.669707753515078,0.654014549095664,0.683226886999099,,0.66893129960958,0.0157013541907933 -mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Full_Truncated,4,0.669707753515078,0.654014549095664,0.683226886999099,,0.66893129960958,0.0157013541907933 -mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Full_Joint,4,0.670252865183779,0.654581402849557,0.683544630202293,,0.669402973285312,0.0155825833517288 -mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Full_Joint_Truncated,4,0.670252865183779,0.654581402849557,0.683544630202293,,0.669402973285312,0.0155825833517288 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_auc,5,0.830322798090827,0.829752014715758,0.833521610487142,0.830322798090827,0.831256480687861,0.00210224952478856 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_deviance_explained,5,0.169049735433044,0.156535489819263,0.180380243811949,0.172184312829234,0.16845440325201,0.01233664255535 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_rmse,5,0.406331801158912,0.404646760463192,0.406711203597052,0.406706951792596,0.405904427434075,0.00126412825140784 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_spearman,5,0.564448272444098,0.564022722895439,0.568538539772008,0.564448272444098,0.565752949420103,0.002625462296498 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_calibration_slope,5,0.979847210350883,0.969126982244339,0.991954887525608,0.979847210350883,0.980520168665477,0.0114519899974685 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_prevalence,5,0.418242653476869,0.411391418988775,0.421189975169674,0.418242653476869,0.416870814782784,0.00501851999449775 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_n,5,4366,4320.2,5874.4,6874,4851.6,1130.83522230252 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_auc,4,0.825970385744679,0.820899166013025,0.829858683383589,,0.825547913568699,0.00483682169731863 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_deviance_explained,4,0.180338934815369,0.153363367618616,0.193673751289778,,0.175467238128817,0.0239800671027935 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_rmse,4,0.409024585589369,0.407545829323972,0.412796643199926,,0.409843621784069,0.00304952623195646 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_spearman,4,0.556036446141893,0.549781718602555,0.564239538039467,,0.556732290555549,0.00779665231289283 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_calibration_slope,4,0.961989811631539,0.953282864779601,0.97698898933143,,0.964237036934379,0.0130331463165358 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_prevalence,4,0.419241311741466,0.413108455574493,0.430771977433407,,0.421169100857526,0.00978800188867454 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_n,5,2508,999.6,2553.8,0,2022.4,1130.83522230252 -vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Climate,5,0.688882537608652,0.686220497467121,0.693315342224415,0.691923775211569,0.689606019273988,0.00355153250685828 -vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Climate_Truncated,5,0.688853782361867,0.686211230349888,0.693311107621612,0.691928871889894,0.689595671925047,0.00355473297057612 -vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Landcover,5,0.806658535413912,0.804749026795703,0.81034804923884,0.804887352272851,0.807185726647177,0.00308448997445622 -vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Full,5,0.830322798090827,0.829752014715758,0.833521610487142,0.830322798090827,0.831256480687861,0.00210224952478856 -vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Full_Truncated,5,0.830433260489035,0.829860825639713,0.833584571804586,0.830433260489035,0.83134635595991,0.00208467504714064 -vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Full_Joint,5,0.82780564706394,0.827522559630011,0.831849313017971,0.82780564706394,0.829181386915621,0.00243189954325233 -vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Full_Joint_Truncated,5,0.827924459375713,0.827636541171172,0.831943133083281,0.827924459375713,0.829288457143518,0.0024223441955198 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Climate,4,0.69847723797285,0.691752649872066,0.699715919161363,,0.696517985504182,0.00490694367651728 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Climate_Truncated,4,0.698467309951771,0.691745994349179,0.699715497383917,,0.696512621319469,0.0049068149193327 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Landcover,4,0.798538423391199,0.793813753185317,0.801044488836154,,0.797746064548011,0.0039851186104012 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Full,4,0.825970385744679,0.820899166013025,0.829858683383589,,0.825547913568699,0.00483682169731863 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Full_Truncated,4,0.826084368160094,0.821025133464921,0.829955751376353,,0.825660135489053,0.00481955559769384 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Full_Joint,4,0.822407455245542,0.816503165651276,0.825556259025818,,0.821423353169117,0.00501007923907512 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Full_Joint_Truncated,4,0.822548387109745,0.816621603632805,0.825661726608092,,0.821543585688819,0.00501141542481554 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_auc,5,0.836315133959189,0.831991084674704,0.837528607951877,0.834425701496386,0.835217103556636,0.00298930683727749 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_deviance_explained,5,0.154953219466334,0.129409063699085,0.172774430677382,0.160280734393984,0.151845840183807,0.0222292641700649 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_rmse,5,0.397835953480652,0.39520050591856,0.39953977885822,0.397892542228527,0.397399168674453,0.00225088132355584 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_spearman,5,0.565718307196976,0.558075214292711,0.566158340164243,0.561646901356684,0.563051440283389,0.00452676813056749 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_calibration_slope,5,1.00378490707536,0.996670213069317,1.00931321625889,1.00546871573532,1.00306243102853,0.00640638209817766 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_prevalence,5,0.377654931626418,0.37492184315556,0.38072781584232,0.377654931626418,0.377957278345016,0.00308047552556824 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_n,5,4329,4315.8,5874,6874,4842.2,1136.06104589498 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_auc,4,0.829938952959948,0.828125419425383,0.835304874971869,,0.831207663130432,0.00415809140956838 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_deviance_explained,4,0.177626825486026,0.135153586377154,0.21154877519812,,0.174572793558605,0.0427317407176602 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_rmse,4,0.400006137187779,0.39713029702198,0.40231573999719,,0.399803909560497,0.0030220247869821 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_spearman,4,0.554463344935879,0.551184680243305,0.562068414950895,,0.556008489693894,0.00617058608931537 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_calibration_slope,4,0.988524116774644,0.97389136931948,1.00993315311349,,0.990944219947388,0.0195740205696745 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_prevalence,4,0.375247544204322,0.372430611979277,0.382966913772923,,0.376998414684163,0.00599903919350225 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_n,5,2545,1000,2558.2,0,2031.8,1136.06104589498 -vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Climate,5,0.688388374288585,0.686629323150551,0.697141250977293,0.688388374288585,0.69087203080297,0.00615433602729216 -vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Climate_Truncated,5,0.688377053340582,0.686621028690138,0.697132635984666,0.688377053340582,0.690862704228311,0.00615461616566359 -vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Landcover,5,0.812599770966484,0.806923106797722,0.814411627611935,0.809938249660894,0.811141578894183,0.00400693028240299 -vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Full,5,0.836315133959189,0.831991084674704,0.837528607951877,0.834425701496386,0.835217103556636,0.00298930683727749 -vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Full_Truncated,5,0.836225603913632,0.831944005617998,0.837453646171789,0.834353666337466,0.835150674964538,0.0029708276538074 -vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Full_Joint,5,0.836242738307649,0.831840647476923,0.837075962254889,0.833795663987679,0.834913342412997,0.00279108797567405 -vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Full_Joint_Truncated,5,0.836167732781523,0.831822036390158,0.836995692851111,0.833746590035665,0.834858253988271,0.00275653331501612 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Climate,4,0.687058088763642,0.673058403439112,0.691946304395709,,0.683803992444905,0.0115178096712181 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Climate_Truncated,4,0.687038471404578,0.673051662415016,0.691940326726772,,0.683793845094804,0.0115133321710675 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Landcover,4,0.807847376592108,0.801759141298583,0.811699920923116,,0.807048915534066,0.00558077270332568 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Full,4,0.829938952959948,0.828125419425383,0.835304874971869,,0.831207663130432,0.00415809140956838 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Full_Truncated,4,0.829888329553378,0.828175765215782,0.835181080251946,,0.831166967539439,0.00409066773151742 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Full_Joint,4,0.828971535109331,0.826291764196716,0.83479597749998,,0.830094632065772,0.00475621189002634 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Full_Joint_Truncated,4,0.828915617285276,0.826336395712055,0.834689140179746,,0.830056439185722,0.00469352433889885 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_auc,5,0.890081979393699,0.886120541286867,0.900531693288428,0.890081979393699,0.8925816929913,0.0074671519015807 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_deviance_explained,5,0.376511843709018,0.359648245967408,0.39273006526476,0.36183949121173,0.375558492410363,0.0170745413457127 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_rmse,5,0.308360864442848,0.306833389069796,0.315704381717812,0.312233283277407,0.31046772667452,0.00475923236811526 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_spearman,5,0.561632279820523,0.56034731464871,0.575734647134824,0.561632279820523,0.565885670838601,0.0104854350954813 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_calibration_slope,5,0.980281716931255,0.970651842047086,0.998280590750127,0.982887664309838,0.982912614118871,0.0154729818019227 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_prevalence,5,0.222088835534214,0.217190546592102,0.228625506806496,0.222054380664653,0.222881775063893,0.00607679419012681 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_n,5,1692,1666,2267.2,2648,1873.6,433.131388841769 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_auc,4,0.884065848019888,0.870449780280702,0.894068384737495,,0.882775301226467,0.0128406847119162 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_deviance_explained,4,0.334099694985671,0.299899048318077,0.344909076796622,,0.325745671822584,0.0279649666452476 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_rmse,4,0.322280229393816,0.311448708149722,0.324570568538386,,0.319229807215414,0.0080667999016699 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_spearman,4,0.558011118128369,0.532461517776284,0.559103143514103,,0.549276269926101,0.0182973871982467 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_calibration_slope,4,0.947730194323529,0.912734464703454,0.971381900858514,,0.943678757507426,0.0317919329981155 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_prevalence,4,0.218666030567013,0.210018355611084,0.23207994955219,,0.220368260577459,0.0121728164316861 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_n,5,956,380.8,982,0,774.4,433.131388841769 -vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Climate,5,0.688882537608652,0.686220497467121,0.693315342224415,0.691923775211569,0.689606019273988,0.00355153250685828 -vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Climate_Truncated,5,0.688853782361867,0.686211230349888,0.693311107621612,0.691928871889894,0.689595671925047,0.00355473297057612 -vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Landcover,5,0.795978634172116,0.790420342908561,0.808241109353126,0.795978634172116,0.79826909072766,0.00925670982213445 -vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Full,5,0.890081979393699,0.886120541286867,0.900531693288428,0.890081979393699,0.8925816929913,0.0074671519015807 -vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Full_Truncated,5,0.890081979393699,0.886107519131847,0.900531693288428,0.890081979393699,0.892577213245043,0.00747321026543204 -vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Full_Joint,5,0.885428136469803,0.879749497228007,0.894203850953663,0.88338493164256,0.886730028942607,0.00724717960067507 -vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Full_Joint_Truncated,5,0.885423965632299,0.87972024605796,0.894203850953663,0.88338493164256,0.886719444385091,0.00726319634118945 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Climate,4,0.69847723797285,0.691752649872066,0.699715919161363,,0.696517985504182,0.00490694367651728 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Climate_Truncated,4,0.698467309951771,0.691745994349179,0.699715497383917,,0.696512621319469,0.0049068149193327 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Landcover,4,0.785174421252252,0.769559195023864,0.799812878397794,,0.784825575151236,0.016225503840661 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Full,4,0.884065848019888,0.870449780280702,0.894068384737495,,0.882775301226467,0.0128406847119162 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Full_Truncated,4,0.884061344921756,0.870449780280702,0.894063477626334,,0.882772262087301,0.0128382393423392 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Full_Joint,4,0.873729773605152,0.862934967954651,0.88650495339372,,0.874437050083033,0.0129679425986572 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Full_Joint_Truncated,4,0.873725270507021,0.862934967954651,0.886486814768876,,0.874429285403265,0.0129581962884508 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_auc,5,0.805930865573238,0.802524114144756,0.807930971919586,0.808012980346143,0.805492289441972,0.00279684596223116 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_deviance_explained,5,0.166618669672263,0.15835736048416,0.197983766968233,0.179903957587885,0.174785331031235,0.0215605448558036 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_rmse,5,0.381878187765555,0.378497935845721,0.383275373980955,0.380313032587985,0.381159180017538,0.00249488775218777 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_spearman,5,0.465238638302507,0.460583361067045,0.473614426763325,0.470529100145484,0.466694650560087,0.00654368164273618 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_calibration_slope,5,0.933688472158773,0.920475046205582,0.947214542702693,0.933688472158773,0.933156328591101,0.0138732265313946 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_prevalence,5,0.264350453172205,0.25911663216011,0.270295509723619,0.264350453172205,0.264443478235907,0.00620048832939598 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_n,5,1685,1649.4,2266.4,2648,1865.6,437.838212128635 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_auc,4,0.807298000134658,0.803023991535991,0.814183808910683,,0.808230785912286,0.0060785023634324 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_deviance_explained,4,0.201855986026952,0.138430007183509,0.206184030963771,,0.180749581060301,0.0455406997595895 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_rmse,4,0.37987633843542,0.378039277925496,0.38526074563498,,0.381143247967433,0.00422553209428043 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_spearman,4,0.471049244528984,0.458945127185501,0.481459447588745,,0.47044427514194,0.0124124270312768 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_calibration_slope,4,0.934673431866213,0.911850976434992,0.962640657947191,,0.936510849955412,0.0273611637238912 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_prevalence,4,0.266148052343275,0.252246321440467,0.273763588267456,,0.263902982708051,0.0122396324927964 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_n,5,963,381.6,998.6,0,782.4,437.838212128635 -vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Climate,5,0.688388374288585,0.686629323150551,0.697141250977293,0.688388374288585,0.69087203080297,0.00615433602729216 -vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Climate_Truncated,5,0.688377053340582,0.686621028690138,0.697132635984666,0.688377053340582,0.690862704228311,0.00615461616566359 -vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Landcover,5,0.761379244969105,0.759537679717784,0.765001614229777,0.76658587562335,0.762041460585166,0.00296099903341381 -vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Full,5,0.805930865573238,0.802524114144756,0.807930971919586,0.808012980346143,0.805492289441972,0.00279684596223116 -vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Full_Truncated,5,0.805930865573238,0.802524057680271,0.807932999886811,0.808015180404811,0.805493243742915,0.0027981951952029 -vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Full_Joint,5,0.802576290466739,0.799474271873651,0.804841725613092,0.804804561454972,0.802383816798592,0.00280990996220882 -vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Full_Joint_Truncated,5,0.802576290466739,0.799476478074435,0.804843080852285,0.804805294807862,0.802385231980135,0.00280955135311763 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Climate,4,0.687058088763642,0.673058403439112,0.691946304395709,,0.683803992444905,0.0115178096712181 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Climate_Truncated,4,0.687038471404578,0.673051662415016,0.691940326726772,,0.683793845094804,0.0115133321710675 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Landcover,4,0.774223898160634,0.769748999911181,0.777668369854279,,0.773855888676417,0.00434521003225348 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Full,4,0.807298000134658,0.803023991535991,0.814183808910683,,0.808230785912286,0.0060785023634324 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Full_Truncated,4,0.807292347351227,0.803023991535991,0.814176792476235,,0.808226664961859,0.00607512490581962 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Full_Joint,4,0.805961431482898,0.801581678357063,0.812743710082227,,0.80681947629486,0.00606828197945081 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Full_Joint_Truncated,4,0.805961431482898,0.801581678357063,0.812736460553446,,0.806816887177438,0.00606401787708264 diff --git a/3_output/exp_000_parity_v2/tables/parity_summary.csv b/3_output/exp_000_parity_v2/tables/parity_summary.csv deleted file mode 100644 index bc9bbba..0000000 --- a/3_output/exp_000_parity_v2/tables/parity_summary.csv +++ /dev/null @@ -1,23 +0,0 @@ -taxon,region,stage,comparison,species,terms_compared,min_draws,in_band_pct,reachable_terms,reachable_in_band_pct,median_standardized_difference,median_absolute_difference,max_absolute_difference,negligible_terms,median_spearman,median_band_ratio,verdict,indicative_verdict -bird,north,climate,median,2,20,5,90,20,90,0.351,0,0.651,0,1,0.694,not gated (store holds 5 draws), -bryophyte,north,climate,median,1,19,5,94.7,19,94.7,0.671,0,1.81,5,0.991,0.214,not gated (store holds 5 draws), -lichen,north,climate,median,2,38,5,89.5,38,89.5,0.003,0,1.99,17,0.991,0.301,not gated (store holds 5 draws), -mite,north,climate,median,2,38,5,94.7,38,94.7,0.082,0,3.79,20,0.973,0.656,not gated (store holds 5 draws), -vascular_plant,north,climate,median,2,38,5,97.4,38,97.4,0,0,0.12,24,0.982,0.602,not gated (store holds 5 draws), -bird,south,climate,median,2,20,5,90,20,90,0.351,0,0.651,0,1,0.694,not gated (store holds 5 draws), -bryophyte,south,climate,median,1,19,5,94.7,19,94.7,0.671,0,1.81,5,0.991,0.214,not gated (store holds 5 draws), -lichen,south,climate,median,2,38,5,89.5,38,89.5,0.003,0,1.99,17,0.991,0.301,not gated (store holds 5 draws), -mite,south,climate,median,2,38,5,94.7,38,94.7,0.082,0,3.79,20,0.973,0.656,not gated (store holds 5 draws), -vascular_plant,south,climate,median,2,38,5,97.4,38,97.4,0,0,0.12,24,0.982,0.602,not gated (store holds 5 draws), -bird,north,habitat,median,2,178,5,92.7,168,92.3,0.569,0.023,2.82,0,0.989,0.699,not gated (store holds 5 draws), -bryophyte,north,habitat,median,1,94,5,98.9,94,98.9,0.36,0.062,0.256,0,0.987,0.502,not gated (store holds 5 draws), -lichen,north,habitat,median,2,188,5,94.7,188,94.7,0.251,0.038,0.289,0,0.996,0.642,not gated (store holds 5 draws), -mammal,north,habitat,iteration 1,2,448,4,100,436,100,0,0,9.77e-15,0,1,,not gated (trial run), -mite,north,habitat,median,1,94,5,76.6,94,76.6,0.579,0.078,0.673,0,0.993,0.642,not gated (store holds 5 draws), -vascular_plant,north,habitat,median,2,188,5,91.5,188,91.5,0.303,0.034,0.326,0,0.997,0.596,not gated (store holds 5 draws), -bird,south,habitat,median,2,46,5,80.4,40,77.5,0.334,0.021,0.121,0,0.995,0.508,not gated (store holds 5 draws), -bryophyte,south,habitat,median,1,19,5,100,19,100,0.399,0.066,0.267,0,0.991,0.633,not gated (store holds 5 draws), -lichen,south,habitat,median,2,40,5,87.5,40,87.5,0.337,0.048,0.655,1,0.985,0.554,not gated (store holds 5 draws), -mammal,south,habitat,iteration 1,2,126,5,100,120,100,0,0,5.33e-15,0,1,,not gated (trial run), -mite,south,habitat,median,2,40,5,95,40,95,0.175,0.03,0.754,1,0.992,0.581,not gated (store holds 5 draws), -vascular_plant,south,habitat,median,2,40,5,75,40,75,0.585,0.07,0.552,0,0.977,0.566,not gated (store holds 5 draws), diff --git a/3_output/exp_000_parity_v2/tables/v2_self_agreement_summary.csv b/3_output/exp_000_parity_v2/tables/v2_self_agreement_summary.csv deleted file mode 100644 index 6d46fa1..0000000 --- a/3_output/exp_000_parity_v2/tables/v2_self_agreement_summary.csv +++ /dev/null @@ -1,2 +0,0 @@ -stage,taxon,species,terms,in_band_pct_published_in_rerun,in_band_pct_rerun_in_published,in_band_pct,median_standardized_difference,median_spearman,p10_spearman -climate,bryophyte,134,2546,100,100,100,0.019,0.998,0.887 diff --git a/3_output/exp_001_xgboost/run_record.md b/3_output/exp_001_xgboost/run_record.md deleted file mode 100644 index b18aa2f..0000000 --- a/3_output/exp_001_xgboost/run_record.md +++ /dev/null @@ -1,253 +0,0 @@ -# Run record: exp_001_xgboost - -Written by `run_record()`. The result stores this describes are gitignored; this file is what remains. - -## Provenance - -_Volatile. Excluded from cross-run comparison._ - -- **git_commit**: 7de25de -- **pipeline_dir**: D:/local_projects/active/sdmMethodsDev/2_pipeline/exp_001_xgboost -- **r_version**: 4.5.0 -- **written_at**: 2026-10-05 15:19:05 - -## Configuration - -- **boot_seed**: 20260909.0000 -- **changes_from_v2**: bryophyte: habitat <- xgboost with `single`, on every covariate the v2 candidates use, lichen: habitat <- xgboost with `single`, on every covariate the v2 candidates use, mite: habitat <- xgboost with `single`, on every covariate the v2 candidates use, vascular_plant: habitat <- xgboost with `single`, on every covariate the v2 candidates use, mammal_summer: habitat <- xgboost with `single` inside `hurdle`, on every covariate the v2 candidates use, mammal_winter: habitat <- xgboost with `single` inside `hurdle`, on every covariate the v2 candidates use, bird: landcover <- xgboost with `single`, on every covariate the v2 candidates use -- **compared_with**: exp_000_parity_v2 -- **covariate_files**: none -- **data_dir**: test_dataset -- **engines**: bayesglm, glm, xgboost -- **focal_species**: bird=AMRO, bird=YEWA, bryophyte=Bryum.All, bryophyte=Ceratodon.purpureus, lichen=Cladonia.chlorophaea, lichen=Physcia.adscendens, mammal=Coyote_Summer, mammal=Coyote_Winter, mammal=Moose_Summer, mammal=Moose_Winter, mite=Ceratozetes.gracilis, mite=Trhypochthonius.tectorum, vascular_plant=Galium.boreale, vascular_plant=Vicia.americana -- **jobs_not_ok**: 0 -- **jobs_ok**: 140 -- **jobs_total**: 140 -- **n_bootstraps**: 5 -- **plant_bootstrap**: spatial_block -- **selection**: aic_average, hurdle, single -- **species_n**: 14 -- **stage_models**: spec defaults (v2 candidate sets) -- **taxa**: bird, bryophyte, lichen, mammal_summer, mammal_winter, mite, vascular_plant -- **v2_bootstraps**: 100 - -## Coverage - -| taxon | region | species | draws | coefficient_rows | metric_rows | grid_rows | -| --- | --- | --- | --- | --- | --- | --- | -| bird | north | 2 | 5 | 100 | 140 | 890 | -| bird | south | 2 | 5 | 100 | 140 | 170 | -| bryophyte | north | 2 | 5 | 190 | 140 | 430 | -| bryophyte | south | 2 | 5 | 190 | 140 | 160 | -| lichen | north | 2 | 5 | 190 | 140 | 430 | -| lichen | south | 2 | 5 | 190 | 140 | 160 | -| mammal_summer | north | 2 | 5 | 1350 | 140 | 450 | -| mammal_summer | south | 2 | 5 | 600 | 140 | 200 | -| mammal_winter | north | 2 | 5 | 1350 | 140 | 450 | -| mammal_winter | south | 2 | 5 | 600 | 140 | 200 | -| mite | north | 2 | 5 | 190 | 140 | 430 | -| mite | south | 2 | 5 | 190 | 140 | 160 | -| vascular_plant | north | 2 | 5 | 190 | 140 | 430 | -| vascular_plant | south | 2 | 5 | 190 | 140 | 160 | - -## Metrics - -| taxon | region | metric | n | median | p10 | p90 | mean | sd | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| bird | north | insample_auc | 10 | 0.7994 | 0.7657 | 0.8325 | 0.7988 | 0.0344 | -| bird | north | insample_calibration_slope | 10 | 1.0349 | 0.9469 | 1.1278 | 1.0347 | 0.0896 | -| bird | north | insample_deviance_explained | 10 | 0.2915 | 0.2222 | 0.3641 | 0.2927 | 0.0734 | -| bird | north | insample_n | 10 | 46747.0000 | 46744.0000 | 46750.0000 | 46747.6000 | 2.3664 | -| bird | north | insample_prevalence | 10 | 0.1851 | 0.1178 | 0.2520 | 0.1850 | 0.0702 | -| bird | north | insample_rmse | 10 | 0.5619 | 0.4883 | 0.6343 | 0.5614 | 0.0758 | -| bird | north | insample_spearman | 10 | 0.3894 | 0.3723 | 0.4105 | 0.3913 | 0.0183 | -| bird | north | oob_auc | 10 | 0.7698 | 0.7568 | 0.7831 | 0.7698 | 0.0131 | -| bird | north | oob_calibration_slope | 10 | 0.9891 | 0.9030 | 1.0588 | 0.9794 | 0.0748 | -| bird | north | oob_deviance_explained | 10 | 0.2358 | 0.2089 | 0.2637 | 0.2361 | 0.0279 | -| bird | north | oob_n | 10 | 124877.0000 | 124874.0000 | 124880.0000 | 124876.4000 | 2.3664 | -| bird | north | oob_prevalence | 10 | 0.1877 | 0.1343 | 0.2411 | 0.1877 | 0.0561 | -| bird | north | oob_rmse | 10 | 0.5913 | 0.5422 | 0.6392 | 0.5908 | 0.0507 | -| bird | north | oob_spearman | 10 | 0.3634 | 0.3366 | 0.3901 | 0.3633 | 0.0272 | -| bird | south | insample_auc | 10 | 0.7737 | 0.7584 | 0.7861 | 0.7724 | 0.0134 | -| bird | south | insample_calibration_slope | 10 | 1.1005 | 0.9536 | 1.2339 | 1.0982 | 0.1427 | -| bird | south | insample_deviance_explained | 10 | 0.2678 | 0.1979 | 0.3324 | 0.2660 | 0.0690 | -| bird | south | insample_n | 10 | 23761.0000 | 23761.0000 | 23762.0000 | 23761.2000 | 0.4216 | -| bird | south | insample_prevalence | 10 | 0.2140 | 0.1710 | 0.2587 | 0.2147 | 0.0458 | -| bird | south | insample_rmse | 10 | 0.6438 | 0.5799 | 0.7083 | 0.6433 | 0.0653 | -| bird | south | insample_spearman | 10 | 0.3845 | 0.3773 | 0.4048 | 0.3899 | 0.0125 | -| bird | south | oob_auc | 10 | 0.7438 | 0.7318 | 0.7591 | 0.7446 | 0.0135 | -| bird | south | oob_calibration_slope | 10 | 1.0053 | 0.8916 | 1.1044 | 0.9973 | 0.0926 | -| bird | south | oob_deviance_explained | 10 | 0.2126 | 0.1601 | 0.2646 | 0.2126 | 0.0542 | -| bird | south | oob_n | 10 | 67240.0000 | 67239.0000 | 67240.0000 | 67239.8000 | 0.4216 | -| bird | south | oob_prevalence | 10 | 0.2177 | 0.1756 | 0.2603 | 0.2179 | 0.0444 | -| bird | south | oob_rmse | 10 | 0.6649 | 0.6147 | 0.7156 | 0.6651 | 0.0527 | -| bird | south | oob_spearman | 10 | 0.3524 | 0.3456 | 0.3586 | 0.3524 | 0.0058 | -| bryophyte | north | insample_auc | 10 | 0.8614 | 0.7699 | 0.8810 | 0.8447 | 0.0445 | -| bryophyte | north | insample_calibration_slope | 10 | 1.3758 | 1.2991 | 1.5011 | 1.3844 | 0.0860 | -| bryophyte | north | insample_deviance_explained | 10 | 0.2854 | 0.1545 | 0.3357 | 0.2691 | 0.0724 | -| bryophyte | north | insample_n | 10 | 3091.0000 | 3041.1000 | 4852.0000 | 3429.3000 | 750.2771 | -| bryophyte | north | insample_prevalence | 10 | 0.4175 | 0.3976 | 0.4423 | 0.4194 | 0.0223 | -| bryophyte | north | insample_rmse | 10 | 0.3948 | 0.3812 | 0.4407 | 0.4023 | 0.0237 | -| bryophyte | north | insample_spearman | 10 | 0.6135 | 0.4586 | 0.6543 | 0.5888 | 0.0773 | -| bryophyte | north | oob_auc | 8 | 0.6870 | 0.6446 | 0.7122 | 0.6829 | 0.0307 | -| bryophyte | north | oob_calibration_slope | 8 | 0.7215 | 0.6216 | 0.8656 | 0.7325 | 0.1018 | -| bryophyte | north | oob_deviance_explained | 8 | 0.0639 | 0.0214 | 0.0849 | 0.0585 | 0.0307 | -| bryophyte | north | oob_n | 10 | 1761.0000 | 0.0000 | 1810.9000 | 1422.7000 | 750.2771 | -| bryophyte | north | oob_prevalence | 8 | 0.4201 | 0.4007 | 0.4503 | 0.4233 | 0.0233 | -| bryophyte | north | oob_rmse | 8 | 0.4704 | 0.4663 | 0.4809 | 0.4716 | 0.0078 | -| bryophyte | north | oob_spearman | 8 | 0.3188 | 0.2457 | 0.3659 | 0.3129 | 0.0543 | -| bryophyte | south | insample_auc | 10 | 0.9033 | 0.8781 | 0.9252 | 0.8951 | 0.0386 | -| bryophyte | south | insample_calibration_slope | 10 | 1.2668 | 1.2203 | 1.3172 | 1.2782 | 0.0742 | -| bryophyte | south | insample_deviance_explained | 10 | 0.3912 | 0.3258 | 0.4512 | 0.3749 | 0.0794 | -| bryophyte | south | insample_n | 10 | 1454.5000 | 1440.8000 | 2310.0000 | 1623.0000 | 362.3789 | -| bryophyte | south | insample_prevalence | 10 | 0.3052 | 0.2352 | 0.3713 | 0.3043 | 0.0687 | -| bryophyte | south | insample_rmse | 10 | 0.3432 | 0.3058 | 0.3751 | 0.3441 | 0.0369 | -| bryophyte | south | insample_spearman | 10 | 0.6324 | 0.5665 | 0.6859 | 0.6207 | 0.0595 | -| bryophyte | south | oob_auc | 8 | 0.7517 | 0.7225 | 0.7802 | 0.7520 | 0.0273 | -| bryophyte | south | oob_calibration_slope | 8 | 0.7373 | 0.7015 | 0.8020 | 0.7471 | 0.0439 | -| bryophyte | south | oob_deviance_explained | 8 | 0.1116 | 0.0774 | 0.1399 | 0.1117 | 0.0272 | -| bryophyte | south | oob_n | 10 | 855.5000 | 0.0000 | 869.2000 | 687.0000 | 362.3789 | -| bryophyte | south | oob_prevalence | 8 | 0.3139 | 0.2297 | 0.3751 | 0.3071 | 0.0716 | -| bryophyte | south | oob_rmse | 8 | 0.4258 | 0.3890 | 0.4556 | 0.4235 | 0.0313 | -| bryophyte | south | oob_spearman | 8 | 0.3968 | 0.3723 | 0.4231 | 0.3953 | 0.0229 | -| lichen | north | insample_auc | 10 | 0.9092 | 0.8901 | 0.9416 | 0.9112 | 0.0322 | -| lichen | north | insample_calibration_slope | 10 | 1.1532 | 1.1179 | 1.1949 | 1.1548 | 0.0380 | -| lichen | north | insample_deviance_explained | 10 | 0.4173 | 0.3855 | 0.5321 | 0.4402 | 0.0848 | -| lichen | north | insample_n | 10 | 3692.0000 | 3654.0000 | 5811.0000 | 4109.1000 | 897.3877 | -| lichen | north | insample_prevalence | 10 | 0.3839 | 0.3815 | 0.3891 | 0.3840 | 0.0037 | -| lichen | north | insample_rmse | 10 | 0.3517 | 0.3052 | 0.3641 | 0.3413 | 0.0324 | -| lichen | north | insample_spearman | 10 | 0.6891 | 0.6572 | 0.7431 | 0.6928 | 0.0538 | -| lichen | north | oob_auc | 8 | 0.8279 | 0.7798 | 0.8701 | 0.8265 | 0.0450 | -| lichen | north | oob_calibration_slope | 8 | 0.9007 | 0.8358 | 0.9603 | 0.8959 | 0.0575 | -| lichen | north | oob_deviance_explained | 8 | 0.2584 | 0.1785 | 0.3420 | 0.2603 | 0.0816 | -| lichen | north | oob_n | 10 | 2119.0000 | 0.0000 | 2157.0000 | 1701.9000 | 897.3877 | -| lichen | north | oob_prevalence | 8 | 0.3864 | 0.3761 | 0.3921 | 0.3853 | 0.0072 | -| lichen | north | oob_rmse | 8 | 0.4044 | 0.3737 | 0.4325 | 0.4031 | 0.0286 | -| lichen | north | oob_spearman | 8 | 0.5535 | 0.4722 | 0.6241 | 0.5503 | 0.0760 | -| lichen | south | insample_auc | 10 | 0.9686 | 0.9482 | 0.9792 | 0.9663 | 0.0147 | -| lichen | south | insample_calibration_slope | 10 | 1.1831 | 1.1308 | 1.2935 | 1.1991 | 0.0688 | -| lichen | south | insample_deviance_explained | 10 | 0.6087 | 0.5214 | 0.6729 | 0.5882 | 0.0813 | -| lichen | south | insample_n | 10 | 1484.5000 | 1478.5000 | 2346.0000 | 1657.8000 | 362.9370 | -| lichen | south | insample_prevalence | 10 | 0.1511 | 0.0868 | 0.2167 | 0.1525 | 0.0659 | -| lichen | south | insample_rmse | 10 | 0.2174 | 0.1882 | 0.2497 | 0.2191 | 0.0286 | -| lichen | south | insample_spearman | 10 | 0.5637 | 0.4448 | 0.6833 | 0.5634 | 0.1102 | -| lichen | south | oob_auc | 8 | 0.8649 | 0.8298 | 0.8846 | 0.8581 | 0.0288 | -| lichen | south | oob_calibration_slope | 8 | 0.8251 | 0.6691 | 0.8954 | 0.8012 | 0.1214 | -| lichen | south | oob_deviance_explained | 8 | 0.2582 | 0.1012 | 0.3352 | 0.2293 | 0.1168 | -| lichen | south | oob_n | 10 | 861.5000 | 0.0000 | 867.5000 | 688.2000 | 362.9370 | -| lichen | south | oob_prevalence | 8 | 0.1578 | 0.0943 | 0.2207 | 0.1582 | 0.0637 | -| lichen | south | oob_rmse | 8 | 0.3147 | 0.2702 | 0.3334 | 0.3048 | 0.0292 | -| lichen | south | oob_spearman | 8 | 0.4496 | 0.3334 | 0.5524 | 0.4451 | 0.1063 | -| mammal_summer | north | insample_auc | 10 | 0.8510 | 0.7867 | 0.9224 | 0.8472 | 0.0788 | -| mammal_summer | north | insample_calibration_slope | 10 | 1.2105 | 1.0951 | 1.3878 | 1.2388 | 0.1326 | -| mammal_summer | north | insample_deviance_explained | 10 | 0.3169 | 0.2021 | 0.5029 | 0.3355 | 0.1508 | -| mammal_summer | north | insample_n | 10 | 2587.5000 | 2542.1000 | 4053.0000 | 2865.2000 | 626.3850 | -| mammal_summer | north | insample_prevalence | 10 | 0.2736 | 0.2243 | 0.3206 | 0.2726 | 0.0496 | -| mammal_summer | north | insample_rmse | 10 | 0.3414 | 0.2707 | 0.3961 | 0.3374 | 0.0617 | -| mammal_summer | north | insample_spearman | 10 | 0.5275 | 0.4545 | 0.6076 | 0.5196 | 0.1036 | -| mammal_summer | north | oob_auc | 8 | 0.7264 | 0.6348 | 0.8195 | 0.7274 | 0.0929 | -| mammal_summer | north | oob_calibration_slope | 8 | 0.7018 | 0.5771 | 0.8626 | 0.7166 | 0.1354 | -| mammal_summer | north | oob_deviance_explained | 8 | 0.1000 | 0.0198 | 0.2566 | 0.1270 | 0.1141 | -| mammal_summer | north | oob_n | 10 | 1465.5000 | 0.0000 | 1510.9000 | 1187.8000 | 626.3850 | -| mammal_summer | north | oob_prevalence | 8 | 0.2774 | 0.2208 | 0.3261 | 0.2746 | 0.0539 | -| mammal_summer | north | oob_rmse | 8 | 0.3953 | 0.3314 | 0.4438 | 0.3903 | 0.0567 | -| mammal_summer | north | oob_spearman | 8 | 0.3364 | 0.2091 | 0.4532 | 0.3341 | 0.1225 | -| mammal_summer | south | insample_auc | 10 | 0.9288 | 0.8453 | 0.9790 | 0.9117 | 0.0726 | -| mammal_summer | south | insample_calibration_slope | 10 | 1.3495 | 1.2208 | 1.5068 | 1.3944 | 0.2498 | -| mammal_summer | south | insample_deviance_explained | 10 | 0.4206 | 0.2223 | 0.7037 | 0.4326 | 0.2145 | -| mammal_summer | south | insample_n | 10 | 676.5000 | 670.8000 | 1065.0000 | 753.7000 | 164.1402 | -| mammal_summer | south | insample_prevalence | 10 | 0.4451 | 0.1814 | 0.7098 | 0.4419 | 0.2704 | -| mammal_summer | south | insample_rmse | 10 | 0.2920 | 0.2235 | 0.3561 | 0.2933 | 0.0622 | -| mammal_summer | south | insample_spearman | 10 | 0.5872 | 0.5123 | 0.6435 | 0.5691 | 0.0908 | -| mammal_summer | south | oob_auc | 8 | 0.6859 | 0.5980 | 0.7912 | 0.6933 | 0.0999 | -| mammal_summer | south | oob_calibration_slope | 8 | 0.5395 | 0.3744 | 0.8810 | 0.5899 | 0.2334 | -| mammal_summer | south | oob_deviance_explained | 8 | -0.0275 | -0.0673 | 0.1741 | 0.0253 | 0.1236 | -| mammal_summer | south | oob_n | 10 | 388.5000 | 0.0000 | 394.2000 | 311.3000 | 164.1402 | -| mammal_summer | south | oob_prevalence | 8 | 0.4195 | 0.1726 | 0.6930 | 0.4251 | 0.2678 | -| mammal_summer | south | oob_rmse | 8 | 0.4015 | 0.3273 | 0.4526 | 0.3937 | 0.0597 | -| mammal_summer | south | oob_spearman | 8 | 0.2479 | 0.1202 | 0.3897 | 0.2536 | 0.1325 | -| mammal_winter | north | insample_auc | 10 | 0.8918 | 0.8420 | 0.9162 | 0.8846 | 0.0355 | -| mammal_winter | north | insample_calibration_slope | 10 | 1.1597 | 1.0523 | 1.3024 | 1.1679 | 0.1117 | -| mammal_winter | north | insample_deviance_explained | 10 | 0.3971 | 0.2938 | 0.4736 | 0.3908 | 0.0848 | -| mammal_winter | north | insample_n | 10 | 2624.5000 | 2596.8000 | 4127.0000 | 2921.0000 | 635.9504 | -| mammal_winter | north | insample_prevalence | 10 | 0.1752 | 0.1467 | 0.2040 | 0.1753 | 0.0287 | -| mammal_winter | north | insample_rmse | 10 | 0.2768 | 0.2641 | 0.2973 | 0.2793 | 0.0151 | -| mammal_winter | north | insample_spearman | 10 | 0.5047 | 0.4253 | 0.5759 | 0.5032 | 0.0691 | -| mammal_winter | north | oob_auc | 8 | 0.7732 | 0.6849 | 0.8485 | 0.7690 | 0.0808 | -| mammal_winter | north | oob_calibration_slope | 8 | 0.7510 | 0.5146 | 0.8766 | 0.7196 | 0.1504 | -| mammal_winter | north | oob_deviance_explained | 8 | 0.1849 | 0.0312 | 0.2981 | 0.1708 | 0.1308 | -| mammal_winter | north | oob_n | 10 | 1502.5000 | 0.0000 | 1530.2000 | 1206.0000 | 635.9504 | -| mammal_winter | north | oob_prevalence | 8 | 0.1756 | 0.1450 | 0.2025 | 0.1746 | 0.0269 | -| mammal_winter | north | oob_rmse | 8 | 0.3147 | 0.3000 | 0.3429 | 0.3194 | 0.0203 | -| mammal_winter | north | oob_spearman | 8 | 0.3595 | 0.2344 | 0.4739 | 0.3548 | 0.1223 | -| mammal_winter | south | insample_auc | 10 | 0.9224 | 0.8432 | 0.9792 | 0.9074 | 0.0697 | -| mammal_winter | south | insample_calibration_slope | 10 | 1.2937 | 1.2545 | 1.5652 | 1.3634 | 0.1374 | -| mammal_winter | south | insample_deviance_explained | 10 | 0.4273 | 0.2637 | 0.6930 | 0.4422 | 0.1882 | -| mammal_winter | south | insample_n | 10 | 694.0000 | 684.8000 | 1098.0000 | 773.7000 | 171.0842 | -| mammal_winter | south | insample_prevalence | 10 | 0.3450 | 0.0865 | 0.6052 | 0.3446 | 0.2704 | -| mammal_winter | south | insample_rmse | 10 | 0.2487 | 0.1472 | 0.3456 | 0.2525 | 0.0902 | -| mammal_winter | south | insample_spearman | 10 | 0.4705 | 0.4147 | 0.7062 | 0.5243 | 0.1212 | -| mammal_winter | south | oob_auc | 8 | 0.6976 | 0.6411 | 0.8063 | 0.7182 | 0.0757 | -| mammal_winter | south | oob_calibration_slope | 8 | 0.5301 | 0.4351 | 0.7396 | 0.5684 | 0.1485 | -| mammal_winter | south | oob_deviance_explained | 8 | 0.0058 | -0.1998 | 0.1763 | -0.0059 | 0.1875 | -| mammal_winter | south | oob_n | 10 | 404.0000 | 0.0000 | 413.2000 | 324.3000 | 171.0842 | -| mammal_winter | south | oob_prevalence | 8 | 0.3501 | 0.0777 | 0.6225 | 0.3492 | 0.2818 | -| mammal_winter | south | oob_rmse | 8 | 0.3397 | 0.2197 | 0.4332 | 0.3307 | 0.1041 | -| mammal_winter | south | oob_spearman | 8 | 0.2590 | 0.2345 | 0.2899 | 0.2608 | 0.0276 | -| mite | north | insample_auc | 10 | 0.8861 | 0.8490 | 0.9130 | 0.8770 | 0.0512 | -| mite | north | insample_calibration_slope | 10 | 1.2393 | 1.1764 | 1.3996 | 1.2771 | 0.1014 | -| mite | north | insample_deviance_explained | 10 | 0.3175 | 0.2511 | 0.4143 | 0.3223 | 0.0980 | -| mite | north | insample_n | 10 | 3630.0000 | 3598.5000 | 5711.0000 | 4041.0000 | 880.4163 | -| mite | north | insample_prevalence | 10 | 0.1545 | 0.0943 | 0.2113 | 0.1531 | 0.0602 | -| mite | north | insample_rmse | 10 | 0.2930 | 0.2520 | 0.3097 | 0.2855 | 0.0279 | -| mite | north | insample_spearman | 10 | 0.4624 | 0.3562 | 0.5826 | 0.4640 | 0.1221 | -| mite | north | oob_auc | 8 | 0.7476 | 0.6487 | 0.8046 | 0.7358 | 0.0755 | -| mite | north | oob_calibration_slope | 8 | 0.7520 | 0.5290 | 0.8442 | 0.7104 | 0.1543 | -| mite | north | oob_deviance_explained | 8 | 0.1131 | -0.0237 | 0.1876 | 0.0947 | 0.1030 | -| mite | north | oob_n | 10 | 2081.0000 | 0.0000 | 2112.5000 | 1670.0000 | 880.4163 | -| mite | north | oob_prevalence | 8 | 0.1509 | 0.0925 | 0.2048 | 0.1495 | 0.0588 | -| mite | north | oob_rmse | 8 | 0.3281 | 0.2834 | 0.3631 | 0.3250 | 0.0388 | -| mite | north | oob_spearman | 8 | 0.3080 | 0.1536 | 0.4270 | 0.2969 | 0.1371 | -| mite | south | insample_auc | 10 | 0.9592 | 0.9376 | 0.9939 | 0.9618 | 0.0251 | -| mite | south | insample_calibration_slope | 10 | 1.2129 | 1.1367 | 1.3093 | 1.2269 | 0.0874 | -| mite | south | insample_deviance_explained | 10 | 0.5182 | 0.4315 | 0.7601 | 0.5606 | 0.1372 | -| mite | south | insample_n | 10 | 1493.0000 | 1480.9000 | 2363.0000 | 1665.8000 | 367.6444 | -| mite | south | insample_prevalence | 10 | 0.0721 | 0.0556 | 0.0841 | 0.0703 | 0.0144 | -| mite | south | insample_rmse | 10 | 0.1851 | 0.1250 | 0.2161 | 0.1770 | 0.0411 | -| mite | south | insample_spearman | 10 | 0.4054 | 0.3708 | 0.4408 | 0.4054 | 0.0280 | -| mite | south | oob_auc | 8 | 0.8217 | 0.7176 | 0.9044 | 0.8152 | 0.0913 | -| mite | south | oob_calibration_slope | 8 | 0.6549 | 0.4859 | 0.9202 | 0.6803 | 0.1978 | -| mite | south | oob_deviance_explained | 8 | 0.1333 | -0.0105 | 0.3578 | 0.1547 | 0.1687 | -| mite | south | oob_n | 10 | 870.0000 | 0.0000 | 882.1000 | 697.2000 | 367.6444 | -| mite | south | oob_prevalence | 8 | 0.0719 | 0.0489 | 0.0868 | 0.0689 | 0.0174 | -| mite | south | oob_rmse | 8 | 0.2426 | 0.1842 | 0.2757 | 0.2335 | 0.0451 | -| mite | south | oob_spearman | 8 | 0.2530 | 0.2087 | 0.3351 | 0.2668 | 0.0542 | -| vascular_plant | north | insample_auc | 10 | 0.9376 | 0.9310 | 0.9410 | 0.9367 | 0.0044 | -| vascular_plant | north | insample_calibration_slope | 10 | 1.1354 | 1.1200 | 1.1411 | 1.1330 | 0.0098 | -| vascular_plant | north | insample_deviance_explained | 10 | 0.5183 | 0.4948 | 0.5237 | 0.5139 | 0.0151 | -| vascular_plant | north | insample_n | 10 | 4347.5000 | 4314.6000 | 6874.0000 | 4846.9000 | 1068.6395 | -| vascular_plant | north | insample_prevalence | 10 | 0.3951 | 0.3770 | 0.4211 | 0.3974 | 0.0209 | -| vascular_plant | north | insample_rmse | 10 | 0.3144 | 0.3092 | 0.3227 | 0.3144 | 0.0058 | -| vascular_plant | north | insample_spearman | 10 | 0.7385 | 0.7305 | 0.7504 | 0.7397 | 0.0107 | -| vascular_plant | north | oob_auc | 8 | 0.8697 | 0.8604 | 0.8766 | 0.8691 | 0.0076 | -| vascular_plant | north | oob_calibration_slope | 8 | 0.9589 | 0.9312 | 0.9797 | 0.9563 | 0.0248 | -| vascular_plant | north | oob_deviance_explained | 8 | 0.3414 | 0.3159 | 0.3587 | 0.3391 | 0.0210 | -| vascular_plant | north | oob_n | 10 | 2526.5000 | 0.0000 | 2559.4000 | 2027.1000 | 1068.6395 | -| vascular_plant | north | oob_prevalence | 8 | 0.3990 | 0.3725 | 0.4275 | 0.3991 | 0.0248 | -| vascular_plant | north | oob_rmse | 8 | 0.3753 | 0.3705 | 0.3834 | 0.3765 | 0.0055 | -| vascular_plant | north | oob_spearman | 8 | 0.6268 | 0.6048 | 0.6427 | 0.6255 | 0.0160 | -| vascular_plant | south | insample_auc | 10 | 0.9750 | 0.9565 | 0.9889 | 0.9738 | 0.0136 | -| vascular_plant | south | insample_calibration_slope | 10 | 1.1189 | 1.0822 | 1.1506 | 1.1168 | 0.0321 | -| vascular_plant | south | insample_deviance_explained | 10 | 0.6677 | 0.5715 | 0.7691 | 0.6713 | 0.0805 | -| vascular_plant | south | insample_n | 10 | 1688.5000 | 1654.9000 | 2648.0000 | 1869.6000 | 410.6067 | -| vascular_plant | south | insample_prevalence | 10 | 0.2438 | 0.2212 | 0.2654 | 0.2437 | 0.0227 | -| vascular_plant | south | insample_rmse | 10 | 0.2318 | 0.1862 | 0.2693 | 0.2280 | 0.0344 | -| vascular_plant | south | insample_spearman | 10 | 0.7011 | 0.6914 | 0.7153 | 0.7029 | 0.0117 | -| vascular_plant | south | oob_auc | 8 | 0.9043 | 0.8724 | 0.9382 | 0.9053 | 0.0328 | -| vascular_plant | south | oob_calibration_slope | 8 | 0.9306 | 0.8921 | 0.9559 | 0.9256 | 0.0269 | -| vascular_plant | south | oob_deviance_explained | 8 | 0.4119 | 0.3408 | 0.5093 | 0.4192 | 0.0820 | -| vascular_plant | south | oob_n | 10 | 959.5000 | 0.0000 | 993.1000 | 778.4000 | 410.6067 | -| vascular_plant | south | oob_prevalence | 8 | 0.2418 | 0.2131 | 0.2706 | 0.2421 | 0.0259 | -| vascular_plant | south | oob_rmse | 8 | 0.3105 | 0.2780 | 0.3427 | 0.3108 | 0.0317 | -| vascular_plant | south | oob_spearman | 8 | 0.6007 | 0.5669 | 0.6277 | 0.5987 | 0.0306 | - diff --git a/3_output/exp_001_xgboost/tables/comparison_grid.csv b/3_output/exp_001_xgboost/tables/comparison_grid.csv deleted file mode 100644 index d3c0575..0000000 --- a/3_output/exp_001_xgboost/tables/comparison_grid.csv +++ /dev/null @@ -1,29 +0,0 @@ -taxon,region,season,part,species,grid_units,spearman,median_absolute_difference -bird,north,"","",AMRO,89,-0.0763363976847123,0.009370065460805 -bird,north,"","",YEWA,89,0.632567245488594,0.010020663139576 -bird,south,"","",AMRO,17,0.692826617040601,0.0078450774802179 -bird,south,"","",YEWA,17,0.547913201751984,0.0391985808328686 -bryophyte,north,"","",Bryum.All,43,0.407227820289416,0.212234270449689 -bryophyte,north,"","",Ceratodon.purpureus,43,0.851503901810743,0.116998420947752 -bryophyte,south,"","",Bryum.All,16,0.476470588235294,0.252848715484176 -bryophyte,south,"","",Ceratodon.purpureus,16,0.2,0.0326931393823578 -lichen,north,"","",Cladonia.chlorophaea,43,0.727706644442761,0.081440431444869 -lichen,north,"","",Physcia.adscendens,43,0.638608985529207,0.021737265267572 -lichen,south,"","",Cladonia.chlorophaea,16,0.585294117647059,0.0810492570735384 -lichen,south,"","",Physcia.adscendens,16,0.794117647058824,0.0700528402174986 -mammal,north,summer,hurdle,Coyote_Summer,45,0.406210351015952,0.027096643314308 -mammal,north,summer,hurdle,Moose_Summer,45,0.626663695274847,0.159743478635358 -mammal,north,winter,hurdle,Coyote_Winter,45,0.756438212782176,0.0270155817515243 -mammal,north,winter,hurdle,Moose_Winter,45,0.75287196590407,0.201298626091961 -mammal,south,summer,hurdle,Coyote_Summer,20,0.650983852581882,0.0512172624465049 -mammal,south,summer,hurdle,Moose_Summer,20,0.776837682632211,0.00967291683006392 -mammal,south,winter,hurdle,Coyote_Winter,20,0.634727114238697,0.131871665317822 -mammal,south,winter,hurdle,Moose_Winter,20,0.709998032377615,0.00452107677607601 -mite,north,"","",Ceratozetes.gracilis,43,-0.336919463595727,0.077740689546667 -mite,north,"","",Trhypochthonius.tectorum,43,0.292219107508145,0.0222447522130691 -mite,south,"","",Ceratozetes.gracilis,16,0.744665396597154,0.00314975122744953 -mite,south,"","",Trhypochthonius.tectorum,16,0.528329797190471,0.0277535717410072 -vascular_plant,north,"","",Galium.boreale,43,0.809227971816047,0.0667940816213831 -vascular_plant,north,"","",Vicia.americana,43,0.65648912796424,0.0645127290355628 -vascular_plant,south,"","",Galium.boreale,16,0.0558823529411765,0.125807736377774 -vascular_plant,south,"","",Vicia.americana,16,0.873529411764706,0.0429591076945282 diff --git a/3_output/exp_001_xgboost/tables/comparison_summary.csv b/3_output/exp_001_xgboost/tables/comparison_summary.csv deleted file mode 100644 index 254530c..0000000 --- a/3_output/exp_001_xgboost/tables/comparison_summary.csv +++ /dev/null @@ -1,71 +0,0 @@ -taxon,region,season,part,metric,species,draws_baseline,draws_candidate,median_baseline,median_candidate,median_difference,share_better -bird,north,"","",oob_auc,2,5,5,0.729484461943779,0.769348946012837,0.0398644840690585,1 -bird,north,"","",oob_calibration_slope,2,5,5,0.774212093974031,0.980942416621589,0.206730322647559,1 -bird,north,"","",oob_deviance_explained,2,5,5,0.165570186112103,0.236027838272926,0.0704576521608235,1 -bird,north,"","",oob_rmse,2,5,5,0.624644013968721,0.590479047469672,-0.0341649664990495,1 -bird,north,"","",oob_spearman,2,5,5,0.3109374709378,0.362790682770683,0.051853211832883,1 -bird,south,"","",oob_auc,2,5,5,0.702136429854496,0.744711576653555,0.0425751467990589,1 -bird,south,"","",oob_calibration_slope,2,5,5,0.903072708091274,0.988410072114907,0.0853373640236331,0.5 -bird,south,"","",oob_deviance_explained,2,5,5,0.150457127171694,0.212898482389737,0.0624413552180429,1 -bird,south,"","",oob_rmse,2,5,5,0.686946466284977,0.664727643219661,-0.022218823065316,1 -bird,south,"","",oob_spearman,2,5,5,0.291640797085428,0.352533436704584,0.0608926396191565,1 -bryophyte,north,"","",oob_auc,2,4,4,0.64999737456798,0.681320193098614,0.0313228185306345,1 -bryophyte,north,"","",oob_calibration_slope,2,4,4,0.770110822063579,0.707358689878709,-0.06275213218487,0 -bryophyte,north,"","",oob_deviance_explained,2,4,4,-0.18848913667322,0.0536170209107999,0.242106157584019,1 -bryophyte,north,"","",oob_rmse,2,4,4,0.477685026278507,0.472581758066048,-0.00510326821245896,1 -bryophyte,north,"","",oob_spearman,2,4,4,0.256657246933472,0.310694841692671,0.054037594759199,1 -bryophyte,south,"","",oob_auc,2,4,4,0.668840496946664,0.754044235208787,0.085203738262123,1 -bryophyte,south,"","",oob_calibration_slope,2,4,4,0.859428373309233,0.746971129761266,-0.112457243547968,0 -bryophyte,south,"","",oob_deviance_explained,2,4,4,0.0095574817283275,0.114484674469622,0.104927192741294,1 -bryophyte,south,"","",oob_rmse,2,4,4,0.440793673928001,0.423472017554872,-0.0173216563731285,1 -bryophyte,south,"","",oob_spearman,2,4,4,0.260684119461907,0.399183369633167,0.13849925017126,1 -lichen,north,"","",oob_auc,2,4,4,0.802806546010246,0.826728262766536,0.02392171675629,1 -lichen,north,"","",oob_calibration_slope,2,4,4,0.980606541125594,0.898785859245988,-0.081820681879606,0 -lichen,north,"","",oob_deviance_explained,2,4,4,0.12872576435422,0.262930632644152,0.134204868289933,1 -lichen,north,"","",oob_rmse,2,4,4,0.413025371860499,0.402576696699741,-0.010448675160758,1 -lichen,north,"","",oob_spearman,2,4,4,0.509892978412699,0.550148292994419,0.0402553145817195,1 -lichen,south,"","",oob_auc,2,4,4,0.79223256589659,0.859890666798608,0.0676581009020185,1 -lichen,south,"","",oob_calibration_slope,2,4,4,0.991922312776069,0.789037211584084,-0.202885101191985,0 -lichen,south,"","",oob_deviance_explained,2,4,4,0.114894473111837,0.226829452005767,0.11193497889393,1 -lichen,south,"","",oob_rmse,2,4,4,0.323218486449386,0.303145973636455,-0.0200725128129305,1 -lichen,south,"","",oob_spearman,2,4,4,0.367603610275592,0.44089952165737,0.073295911381779,1 -mammal,north,summer,hurdle,oob_auc,2,4,4,0.703613262852787,0.726922473911036,0.0233092110582485,1 -mammal,north,summer,hurdle,oob_calibration_slope,2,4,4,0.848546092009838,0.71608965082318,-0.132456441186657,0 -mammal,north,summer,hurdle,oob_deviance_explained,2,4,4,0.128594332790676,0.129285991085928,0.000691658295252105,0.5 -mammal,north,summer,hurdle,oob_rmse,2,4,4,0.389826626621835,0.390944915562518,0.00111828894068303,0.5 -mammal,north,summer,hurdle,oob_spearman,2,4,4,0.289511245096673,0.333047638929966,0.043536393833294,1 -mammal,north,winter,hurdle,oob_auc,2,4,4,0.740915617852812,0.767965958132812,0.0270503402800005,1 -mammal,north,winter,hurdle,oob_calibration_slope,2,4,4,0.822223168277882,0.716700705992882,-0.105522462285,0 -mammal,north,winter,hurdle,oob_deviance_explained,2,4,4,0.16408786923621,0.170803540529399,0.0067156712931891,1 -mammal,north,winter,hurdle,oob_rmse,2,4,4,0.320617152941719,0.320865029966542,0.000247877024823012,0.5 -mammal,north,winter,hurdle,oob_spearman,2,4,4,0.317877730167646,0.353818361682336,0.0359406315146905,1 -mammal,south,summer,hurdle,oob_auc,2,4,4,0.659879682564245,0.683558804148912,0.023679121584667,1 -mammal,south,summer,hurdle,oob_calibration_slope,2,4,4,0.651781981508862,0.56698576847298,-0.0847962130358825,0 -mammal,south,summer,hurdle,oob_deviance_explained,2,4,4,0.0445614263041746,0.0172117111003372,-0.0273497152038374,0 -mammal,south,summer,hurdle,oob_rmse,2,4,4,0.39442267626108,0.391115654795445,-0.003307021465635,0.5 -mammal,south,summer,hurdle,oob_spearman,2,4,4,0.20556454395683,0.242710772658295,0.037146228701465,1 -mammal,south,winter,hurdle,oob_auc,2,4,4,0.709985275949603,0.725345752575603,0.015360476626,1 -mammal,south,winter,hurdle,oob_calibration_slope,2,4,4,0.709081739397214,0.533347641577976,-0.175734097819239,0 -mammal,south,winter,hurdle,oob_deviance_explained,2,4,4,0.0944228998286284,0.0548525634368907,-0.0395703363917378,0 -mammal,south,winter,hurdle,oob_rmse,2,4,4,0.32499707220521,0.328686168782769,0.00368909657755902,0 -mammal,south,winter,hurdle,oob_spearman,2,4,4,0.246748276299786,0.261544559789032,0.0147962834892455,1 -mite,north,"","",oob_auc,2,4,4,0.715543903851094,0.73913990130773,0.023595997456637,1 -mite,north,"","",oob_calibration_slope,2,4,4,0.91133114539273,0.729109464995533,-0.182221680397197,0 -mite,north,"","",oob_deviance_explained,2,4,4,0.0149187218448,0.101320869461578,0.0864021476167777,1 -mite,north,"","",oob_rmse,2,4,4,0.328141122068562,0.326470551976542,-0.00167057009202054,0.5 -mite,north,"","",oob_spearman,2,4,4,0.271890083460792,0.299684150078939,0.0277940666181475,1 -mite,south,"","",oob_auc,2,4,4,0.773632058303039,0.811148950748457,0.0375168924454185,1 -mite,south,"","",oob_calibration_slope,2,4,4,0.614282370199175,0.68500389956616,0.0707215293669846,0.5 -mite,south,"","",oob_deviance_explained,2,4,4,0.0865130411560292,0.152698132467715,0.0661850913116854,0.5 -mite,south,"","",oob_rmse,2,4,4,0.246446874946777,0.230070074903374,-0.016376800043403,1 -mite,south,"","",oob_spearman,2,4,4,0.230646626561677,0.26964857560987,0.0390019490481925,1 -vascular_plant,north,"","",oob_auc,2,4,4,0.827954669352313,0.86852429313465,0.040569623782337,1 -vascular_plant,north,"","",oob_calibration_slope,2,4,4,0.975256964203091,0.958160650530104,-0.017096313672988,0 -vascular_plant,north,"","",oob_deviance_explained,2,4,4,0.178982880150698,0.339549650190438,0.160566770039741,1 -vascular_plant,north,"","",oob_rmse,2,4,4,0.404515361388574,0.375953908899234,-0.0285614524893405,1 -vascular_plant,north,"","",oob_spearman,2,4,4,0.555249895538886,0.624017960090769,0.0687680645518826,1 -vascular_plant,south,"","",oob_auc,2,4,4,0.845681924077273,0.904991132348347,0.059309208271074,1 -vascular_plant,south,"","",oob_calibration_slope,2,4,4,0.941201813094871,0.927675303215445,-0.0135265098794255,0 -vascular_plant,south,"","",oob_deviance_explained,2,4,4,0.267977840506312,0.420544901894971,0.15256706138866,1 -vascular_plant,south,"","",oob_rmse,2,4,4,0.351078283914618,0.310607470073221,-0.0404708138413975,1 -vascular_plant,south,"","",oob_spearman,2,4,4,0.514530181328676,0.597196199607974,0.082666018279298,1 diff --git a/3_output/exp_001_xgboost/tables/coverage.csv b/3_output/exp_001_xgboost/tables/coverage.csv deleted file mode 100644 index 6371257..0000000 --- a/3_output/exp_001_xgboost/tables/coverage.csv +++ /dev/null @@ -1,15 +0,0 @@ -taxon,run,region,season,part,species,draws,stages,has_coefficients,has_grid -bird,bird,north,,,2,5,climate,TRUE,TRUE -bird,bird,south,,,2,5,climate,TRUE,TRUE -bryophyte,bryophyte,north,,,2,5,climate,TRUE,TRUE -bryophyte,bryophyte,south,,,2,5,climate,TRUE,TRUE -lichen,lichen,north,,,2,5,climate,TRUE,TRUE -lichen,lichen,south,,,2,5,climate,TRUE,TRUE -mammal,mammal_summer,north,summer,hurdle,2,5,"habitat_presence, habitat_abundance, habitat_total",TRUE,TRUE -mammal,mammal_summer,south,summer,hurdle,2,5,"habitat_presence, habitat_abundance, habitat_total",TRUE,TRUE -mammal,mammal_winter,north,winter,hurdle,2,5,"habitat_presence, habitat_abundance, habitat_total",TRUE,TRUE -mammal,mammal_winter,south,winter,hurdle,2,5,"habitat_presence, habitat_abundance, habitat_total",TRUE,TRUE -mite,mite,north,,,2,5,climate,TRUE,TRUE -mite,mite,south,,,2,5,climate,TRUE,TRUE -vascular_plant,vascular_plant,north,,,2,5,climate,TRUE,TRUE -vascular_plant,vascular_plant,south,,,2,5,climate,TRUE,TRUE diff --git a/3_output/exp_001_xgboost/tables/grid_summary.csv b/3_output/exp_001_xgboost/tables/grid_summary.csv deleted file mode 100644 index 1867257..0000000 --- a/3_output/exp_001_xgboost/tables/grid_summary.csv +++ /dev/null @@ -1,945 +0,0 @@ -taxon,run,region,season,part,species,grid_unit,n,median,p10,p90,boot1 -bird,bird,north,,,AMRO,SpruceR,5,0.0442902566521419,0.0379413763365883,0.0557540594906282,0.0366555040643697 -bird,bird,north,,,AMRO,Spruce1,5,0.0408098016975667,0.0346595753237898,0.0505490074514786,0.0316824231384449 -bird,bird,north,,,AMRO,Spruce2,5,0.0223568138943468,0.0198452460371654,0.0314956944562484,0.0192954402592803 -bird,bird,north,,,AMRO,Spruce3,5,0.0282197876525702,0.0227226500369451,0.0334435815845432,0.0224877396498874 -bird,bird,north,,,AMRO,Spruce4,5,0.0286966101510099,0.0241515722810743,0.0355452381640002,0.0232956844547479 -bird,bird,north,,,AMRO,Spruce5,5,0.0259967783663826,0.0241061211328703,0.0333311345682544,0.0237136213353724 -bird,bird,north,,,AMRO,Spruce6,5,0.0256084396687642,0.0237326043053756,0.0301154335805333,0.0242932970642781 -bird,bird,north,,,AMRO,Spruce7,5,0.0355022119350248,0.0334883836268896,0.0371290000914802,0.0355022119350248 -bird,bird,north,,,AMRO,Spruce8,5,0.0259511693051065,0.0238440388296905,0.0355042866042287,0.0342038606878076 -bird,bird,north,,,AMRO,PineR,5,0.0530403796885895,0.0431398970535729,0.064260145919267,0.0530403796885895 -bird,bird,north,,,AMRO,Pine1,5,0.0445014547049733,0.0408394132453821,0.0593301117543581,0.0415420204206911 -bird,bird,north,,,AMRO,Pine2,5,0.022846537656256,0.0217571641323105,0.0342575390680767,0.022846537656256 -bird,bird,north,,,AMRO,Pine3,5,0.0277978308336986,0.0248246465856406,0.0362001025176557,0.0263660193170897 -bird,bird,north,,,AMRO,Pine4,5,0.0282675236362283,0.0260556190004267,0.0382395504881352,0.0265862768154634 -bird,bird,north,,,AMRO,Pine5,5,0.0270632486606675,0.0258485884345244,0.0362237879412676,0.0270632486606675 -bird,bird,north,,,AMRO,Pine6,5,0.0271726628907815,0.0256204751176008,0.0332529073959584,0.0280985457002906 -bird,bird,north,,,AMRO,Pine7,5,0.0397535674563186,0.0358143971689233,0.0406052378289512,0.0410632003502132 -bird,bird,north,,,AMRO,Pine8,5,0.0286959465035972,0.0253257652108301,0.037154133458552,0.0379560705308812 -bird,bird,north,,,AMRO,DecidR,5,0.0474674128228862,0.0414508731041969,0.0619980110530394,0.0440088010747368 -bird,bird,north,,,AMRO,Decid1,5,0.0444289945916352,0.034966624584059,0.0540921839374352,0.0342898880426625 -bird,bird,north,,,AMRO,Decid2,5,0.0245627636186317,0.0217303716974538,0.0342762042133,0.0218827520102022 -bird,bird,north,,,AMRO,Decid3,5,0.0279854499894029,0.0263224312622206,0.0365690989217634,0.0255902028483798 -bird,bird,north,,,AMRO,Decid4,5,0.0297592066443378,0.0274659579495495,0.038900114881078,0.0267508604288086 -bird,bird,north,,,AMRO,Decid5,5,0.0295837450015427,0.0263040965898498,0.0369294169551003,0.0261273274602881 -bird,bird,north,,,AMRO,Decid6,5,0.027182012927931,0.0267611173123457,0.0339362409246039,0.027182012927931 -bird,bird,north,,,AMRO,Decid7,5,0.0401616660364199,0.0369122073960956,0.0421184396441549,0.039822133423833 -bird,bird,north,,,AMRO,Decid8,5,0.0318205174224639,0.0261659250034069,0.0365730545427156,0.0367415739731917 -bird,bird,north,,,AMRO,MixedwoodR,5,0.0485429076421296,0.0439211281004497,0.0658125883973857,0.0470223955153463 -bird,bird,north,,,AMRO,Mixedwood1,5,0.048712396292556,0.0389357776121493,0.0579615565748635,0.038630648450565 -bird,bird,north,,,AMRO,Mixedwood2,5,0.026930860948549,0.0239341293229536,0.0367415341657149,0.0245900453148193 -bird,bird,north,,,AMRO,Mixedwood3,5,0.0297747561740773,0.0287644899418298,0.038894905950956,0.0280920013291388 -bird,bird,north,,,AMRO,Mixedwood4,5,0.0323139356150363,0.0297643631357146,0.0413834425114011,0.0293661293415373 -bird,bird,north,,,AMRO,Mixedwood5,5,0.0321234111734425,0.0288389037174122,0.0402602617128278,0.0296974295468082 -bird,bird,north,,,AMRO,Mixedwood6,5,0.0290913911754907,0.0280991244272848,0.0368478234006121,0.0286928542458694 -bird,bird,north,,,AMRO,Mixedwood7,5,0.0412524789933992,0.0392057309599574,0.0432773030422306,0.0412524789933992 -bird,bird,north,,,AMRO,Mixedwood8,5,0.0309977852248766,0.0280007101351719,0.0382628039634285,0.0374699974200187 -bird,bird,north,,,AMRO,TreedBogR,5,0.0337712977492606,0.0299890957799074,0.0371895501941989,0.028628369154061 -bird,bird,north,,,AMRO,TreedBog1,5,0.0272670817801905,0.0230814179127418,0.0331290327634357,0.023775423915051 -bird,bird,north,,,AMRO,TreedBog2,5,0.016869947271179,0.0140732244188988,0.0200044851625185,0.0152551161447426 -bird,bird,north,,,AMRO,TreedBog3,5,0.0181679501483436,0.016766559881425,0.0209588625668935,0.0164980014548875 -bird,bird,north,,,AMRO,TreedBog4,5,0.0186196302307698,0.0172603647904916,0.0220479655930649,0.0172462978508757 -bird,bird,north,,,AMRO,TreedBog5,5,0.0186200564051621,0.0167160341057898,0.0213458167499747,0.0173835763845229 -bird,bird,north,,,AMRO,TreedBog6,5,0.0186004269978386,0.0172687090678657,0.0213006894852984,0.0188125410572287 -bird,bird,north,,,AMRO,TreedBog7,5,0.0271996785649599,0.023202733146016,0.0283371608084944,0.0275607079581844 -bird,bird,north,,,AMRO,TreedBog8,5,0.0217917857354594,0.0162578166132046,0.0260000068895663,0.0262291429253524 -bird,bird,north,,,AMRO,TreedFenR,5,0.0409513136681608,0.0379405730091816,0.0561033525620416,0.037550082764674 -bird,bird,north,,,AMRO,TreedFen1,5,0.0381351455352466,0.0330098527614403,0.0507020390021051,0.0313131549498049 -bird,bird,north,,,AMRO,TreedFen2,5,0.0202719594648607,0.0197373502791868,0.0308336623276856,0.019983092495697 -bird,bird,north,,,AMRO,TreedFen3,5,0.0261986934884151,0.0222356459416357,0.0325304794148843,0.0224145726639231 -bird,bird,north,,,AMRO,TreedFen4,5,0.0265129573757243,0.0236596976737338,0.0350830360901622,0.0234311978086551 -bird,bird,north,,,AMRO,TreedFen5,5,0.0247151446652276,0.0238347809958303,0.0333746240820729,0.0236177130606111 -bird,bird,north,,,AMRO,TreedFen6,5,0.0259137573034399,0.0238497099836002,0.0312579186163124,0.0256593125465256 -bird,bird,north,,,AMRO,TreedFen7,5,0.0375913502248985,0.0350050227423771,0.0400889857932004,0.0375913502248985 -bird,bird,north,,,AMRO,TreedFen8,5,0.028017194534647,0.0247965498235974,0.0369147244287134,0.034513852292505 -bird,bird,north,,,AMRO,GrassHerb,5,0.0696717759059958,0.0563279318325428,0.103638548701311,0.0631701403962441 -bird,bird,north,,,AMRO,Shrub,5,0.0462257501706309,0.0450081545836438,0.0865074953678965,0.0449062836010245 -bird,bird,north,,,AMRO,GraminoidFen,5,0.0435039755068399,0.039609748875998,0.0644964879450108,0.0435039755068399 -bird,bird,north,,,AMRO,Marsh,5,0.0415707134371832,0.0364209630223156,0.0518665421315538,0.035979087249624 -bird,bird,north,,,AMRO,RoughP,5,0.0385563195351291,0.0363344070967659,0.055206517850837,0.0364825682256347 -bird,bird,north,,,AMRO,TameP,5,0.0774042250270197,0.0620028450245654,0.100882423985758,0.0941964189389792 -bird,bird,north,,,AMRO,Crop,5,0.0419157898842836,0.0401516559106409,0.0637727667227155,0.0419157898842836 -bird,bird,north,,,AMRO,Industrial,5,0.0792903661964029,0.0550460485321331,0.0894840137169307,0.0792903661964029 -bird,bird,north,,,AMRO,Mine,5,0.0588420456939569,0.0468716009484357,0.0785205294912552,0.047798489883647 -bird,bird,north,,,AMRO,Rural,5,0.0676446716794018,0.0528863624326318,0.0816216856968155,0.0506689540468929 -bird,bird,north,,,AMRO,Urban,5,0.0949196168449331,0.0631169659353919,0.123798691219467,0.0540813495950626 -bird,bird,north,,,AMRO,CCSpruceR,5,0.0548660825144456,0.0479933108748037,0.0590882159677304,0.0469419021512667 -bird,bird,north,,,AMRO,CCSpruce1,5,0.0447747119242866,0.0374941247843785,0.0482153089139789,0.0349383623549889 -bird,bird,north,,,AMRO,CCSpruce2,5,0.0273079319960431,0.0209617909724678,0.0293550035480702,0.020443862083685 -bird,bird,north,,,AMRO,CCSpruce3,5,0.0305351202782775,0.0280150152634986,0.0364973979957509,0.0266700280880372 -bird,bird,north,,,AMRO,CCSpruce4,5,0.0327584413564801,0.0296678771529882,0.0347720295728306,0.0282036918494542 -bird,bird,north,,,AMRO,CCPineR,5,0.0587289542125506,0.0545037899314608,0.0643275350286707,0.0648096538947272 -bird,bird,north,,,AMRO,CCPine1,5,0.0477764208349119,0.0465879214890008,0.0522375563049639,0.0458237948697835 -bird,bird,north,,,AMRO,CCPine2,5,0.0291278137079737,0.0234388210400162,0.031031150900466,0.024212962300131 -bird,bird,north,,,AMRO,CCPine3,5,0.0318883379552167,0.0314207012241382,0.0376296107300506,0.0312781830485466 -bird,bird,north,,,AMRO,CCPine4,5,0.034708581463643,0.0328511123216488,0.0351875395679085,0.0321963982534371 -bird,bird,north,,,AMRO,CCDecidR,5,0.0553033244032425,0.0530273535377752,0.061586724212623,0.0530085091755344 -bird,bird,north,,,AMRO,CCDecid1,5,0.043120628925648,0.0385491467386767,0.0444255720317088,0.0357037943333669 -bird,bird,north,,,AMRO,CCDecid2,5,0.0288558692670304,0.0260702229575784,0.0338566182926065,0.0246364397196421 -bird,bird,north,,,AMRO,CCDecid3,5,0.0347457154544072,0.0306724621978145,0.0384272847416732,0.0301948348653635 -bird,bird,north,,,AMRO,CCDecid4,5,0.0280404566387451,0.0242070491683396,0.0325757924771638,0.0230467936267909 -bird,bird,north,,,AMRO,CCMixedwoodR,5,0.0574889760040758,0.0557000226011299,0.0646503401706651,0.0572809332241251 -bird,bird,north,,,AMRO,CCMixedwood1,5,0.046785288228572,0.0424283166951076,0.0489337743858751,0.0405907218237436 -bird,bird,north,,,AMRO,CCMixedwood2,5,0.0315617719379096,0.028368125641873,0.0364177292376984,0.0276844141367307 -bird,bird,north,,,AMRO,CCMixedwood3,5,0.0376202384178729,0.0341651244180073,0.0400249432321056,0.0331468002108714 -bird,bird,north,,,AMRO,CCMixedwood4,5,0.0310755710481726,0.0262219679768314,0.0344681516878028,0.025299938458174 -bird,bird,north,,,AMRO,ShrubbySwamp,5,0.0527884304766592,0.0421723986574587,0.0569610179761949,0.0383530768124443 -bird,bird,north,,,AMRO,ShrubbyBog,5,0.0409723595332036,0.0372982692143881,0.058070128546272,0.0372286255705113 -bird,bird,north,,,AMRO,ShrubbyFen,5,0.0414726585254478,0.0357054841577196,0.0536777984447897,0.0354572437572338 -bird,bird,north,,,AMRO,TreedSwamp,5,0.0340052576529067,0.0300657914282681,0.0514556829568097,0.0298081110662516 -bird,bird,north,,,YEWA,SpruceR,5,0.0252172608541989,0.0211892448134565,0.0326420392030509,0.020075883166563 -bird,bird,north,,,YEWA,Spruce1,5,0.00957847171535926,0.00869474865056457,0.0186939282445539,0.00855962588062038 -bird,bird,north,,,YEWA,Spruce2,5,0.00671772006347785,0.00562631582377599,0.0127650836706242,0.00637785443019538 -bird,bird,north,,,YEWA,Spruce3,5,0.0079547936252342,0.00538982032166413,0.0128530874615283,0.00548514188142242 -bird,bird,north,,,YEWA,Spruce4,5,0.0073795800653621,0.00493987007123621,0.0119671443320609,0.00518331479834531 -bird,bird,north,,,YEWA,Spruce5,5,0.0059621166882862,0.00404771477128591,0.00925593320608986,0.004278041907003 -bird,bird,north,,,YEWA,Spruce6,5,0.00630005543757491,0.00420283717995631,0.00958821378462626,0.00506842968826455 -bird,bird,north,,,YEWA,Spruce7,5,0.00788860708930735,0.00546440539967634,0.0114170811282863,0.00631044917741408 -bird,bird,north,,,YEWA,Spruce8,5,0.00261191053216785,0.00221885152371783,0.00370631555130206,0.00261191053216785 -bird,bird,north,,,YEWA,PineR,5,0.0193326426396099,0.0161926065087714,0.0204550127337872,0.0150884357126666 -bird,bird,north,,,YEWA,Pine1,5,0.00692773851708771,0.00658236010905898,0.010096599139533,0.00635776860034215 -bird,bird,north,,,YEWA,Pine2,5,0.00482486303603439,0.00439512687098211,0.0073708482977548,0.00467969669325821 -bird,bird,north,,,YEWA,Pine3,5,0.00486016193692089,0.00419200286450482,0.00715262973465363,0.00402467641829798 -bird,bird,north,,,YEWA,Pine4,5,0.00437710020360468,0.00385034143157606,0.00667687943537023,0.00380321697838601 -bird,bird,north,,,YEWA,Pine5,5,0.0033079054436797,0.00318633798041322,0.00513434051538391,0.00315451903780948 -bird,bird,north,,,YEWA,Pine6,5,0.00372543470220038,0.00315876706844845,0.00518259365228388,0.00372543470220038 -bird,bird,north,,,YEWA,Pine7,5,0.00473941782333137,0.00413092293363815,0.00734108833835859,0.00473941782333137 -bird,bird,north,,,YEWA,Pine8,5,0.00222732045630849,0.0020500840283061,0.00357804579349459,0.00211934811922336 -bird,bird,north,,,YEWA,DecidR,5,0.0252963798429963,0.0221556356887623,0.0376747347333419,0.0212328199437469 -bird,bird,north,,,YEWA,Decid1,5,0.025305524684003,0.0244863874215621,0.0328499985926563,0.0245676481910559 -bird,bird,north,,,YEWA,Decid2,5,0.0219283251638807,0.0179230481106008,0.0242276446424189,0.0219283251638807 -bird,bird,north,,,YEWA,Decid3,5,0.0201057729275079,0.0193144044521349,0.0232604406483664,0.0201057729275079 -bird,bird,north,,,YEWA,Decid4,5,0.0203394901670688,0.0179697834656007,0.023842919270437,0.0203394901670688 -bird,bird,north,,,YEWA,Decid5,5,0.0166492147276428,0.0146717001943035,0.0179943753700752,0.0166492147276428 -bird,bird,north,,,YEWA,Decid6,5,0.0179261135307521,0.0146624584973657,0.0215661526608369,0.0221834770312075 -bird,bird,north,,,YEWA,Decid7,5,0.0287695199465869,0.0235838732493952,0.034634571956731,0.0322518452189387 -bird,bird,north,,,YEWA,Decid8,5,0.0130093210294573,0.0104906982842883,0.014422899738834,0.013814377734289 -bird,bird,north,,,YEWA,MixedwoodR,5,0.0123385275476214,0.0101784676984372,0.0137722286823989,0.0102526430752722 -bird,bird,north,,,YEWA,Mixedwood1,5,0.0129786260131255,0.0123421738860962,0.0144735342506947,0.0129786260131255 -bird,bird,north,,,YEWA,Mixedwood2,5,0.0113206338292679,0.00962976654406877,0.0127259559677431,0.0114689543598314 -bird,bird,north,,,YEWA,Mixedwood3,5,0.0108635699078252,0.0104406693439287,0.0130427864294105,0.0107527091542589 -bird,bird,north,,,YEWA,Mixedwood4,5,0.0108418040148146,0.00995943672919273,0.0128482717114086,0.0108418040148146 -bird,bird,north,,,YEWA,Mixedwood5,5,0.00903203258657993,0.00866222533500599,0.0102498206934353,0.00917189565999901 -bird,bird,north,,,YEWA,Mixedwood6,5,0.00791797939834463,0.00703451930522829,0.00989136822109605,0.00991274909224815 -bird,bird,north,,,YEWA,Mixedwood7,5,0.012105038008011,0.00963939148772853,0.0130343298073576,0.0122753952613342 -bird,bird,north,,,YEWA,Mixedwood8,5,0.00384730320245973,0.00351324693977617,0.00475114066512956,0.00508083101521146 -bird,bird,north,,,YEWA,TreedBogR,5,0.0175562622358644,0.0133762584925577,0.0210596918644798,0.014389064730396 -bird,bird,north,,,YEWA,TreedBog1,5,0.0190540711587852,0.0165229495850103,0.0269318503200431,0.0176170520836283 -bird,bird,north,,,YEWA,TreedBog2,5,0.0154493119415555,0.0134641074631472,0.0241948349934878,0.0154474924476239 -bird,bird,north,,,YEWA,TreedBog3,5,0.0164167330732665,0.0140825087649351,0.0243206882329333,0.0144827982262557 -bird,bird,north,,,YEWA,TreedBog4,5,0.0153123548753616,0.0136387830508213,0.0250559321808117,0.0146511553377372 -bird,bird,north,,,YEWA,TreedBog5,5,0.0123347862290518,0.0116778446420415,0.0191059217961641,0.0119928944561281 -bird,bird,north,,,YEWA,TreedBog6,5,0.0138212433111611,0.0115802309482353,0.0201637017802267,0.0146130323425916 -bird,bird,north,,,YEWA,TreedBog7,5,0.0185174886779727,0.0160949297319119,0.0296433944396947,0.0185174886779727 -bird,bird,north,,,YEWA,TreedBog8,5,0.00697135796057667,0.00559569983927094,0.0112330460075968,0.00791716013839676 -bird,bird,north,,,YEWA,TreedFenR,5,0.0196770970891706,0.0171397873180092,0.0255543074089766,0.0160209397065613 -bird,bird,north,,,YEWA,TreedFen1,5,0.0241467003393235,0.0210335703923148,0.0310635608996568,0.019615034312116 -bird,bird,north,,,YEWA,TreedFen2,5,0.0188566558879144,0.0176782515432501,0.0286933195887844,0.0175077663947453 -bird,bird,north,,,YEWA,TreedFen3,5,0.0214560480184915,0.017471466939646,0.0290915664428136,0.0164144317707266 -bird,bird,north,,,YEWA,TreedFen4,5,0.0201332733681646,0.0170731172366312,0.0298258946812116,0.016605243399554 -bird,bird,north,,,YEWA,TreedFen5,5,0.017809865405493,0.013882881437064,0.0240757814763859,0.0135924970801031 -bird,bird,north,,,YEWA,TreedFen6,5,0.0175700135857791,0.0150555535799166,0.0255388672839747,0.0163259597157937 -bird,bird,north,,,YEWA,TreedFen7,5,0.0264687460074498,0.0195992896981854,0.037700688275869,0.020948293345875 -bird,bird,north,,,YEWA,TreedFen8,5,0.00867052772108145,0.00714450679827112,0.0140520410758506,0.00867052772108145 -bird,bird,north,,,YEWA,GrassHerb,5,0.0247942665650597,0.0221220303088086,0.0309798943763234,0.021553211587486 -bird,bird,north,,,YEWA,Shrub,5,0.0167438292029234,0.0148803431886314,0.0207192004456286,0.0148960553874228 -bird,bird,north,,,YEWA,GraminoidFen,5,0.0672236019845667,0.04819197675831,0.0907936517006859,0.0719755044501624 -bird,bird,north,,,YEWA,Marsh,5,0.0269095330214598,0.0212589109161356,0.0299352297815013,0.018901297765308 -bird,bird,north,,,YEWA,RoughP,5,0.0216690652030281,0.0192720705780085,0.0263561170944069,0.0216163865037365 -bird,bird,north,,,YEWA,TameP,5,0.027205333993224,0.0236902654992096,0.0287640592573649,0.0252454982168646 -bird,bird,north,,,YEWA,Crop,5,0.019888188982052,0.0164180138007495,0.0231348064822868,0.0160202980115463 -bird,bird,north,,,YEWA,Industrial,5,0.0127836393693951,0.0109127278729873,0.0184800704038428,0.00969747700209829 -bird,bird,north,,,YEWA,Mine,5,0.0176618835086965,0.0145062853644596,0.0203471328269016,0.0156407135413358 -bird,bird,north,,,YEWA,Rural,5,0.0389064255981324,0.0308573431896291,0.0524950590036186,0.0257099309601401 -bird,bird,north,,,YEWA,Urban,5,0.0153901741959434,0.0120957238082637,0.0252033051037356,0.0153901741959434 -bird,bird,north,,,YEWA,CCSpruceR,5,0.0431720324932133,0.0337854142373539,0.044683567709013,0.0431720324932133 -bird,bird,north,,,YEWA,CCSpruce1,5,0.0199250044887163,0.0194796484443229,0.0212473229177172,0.0194079845551292 -bird,bird,north,,,YEWA,CCSpruce2,5,0.0130846107284879,0.0117191657740812,0.014020080588075,0.0124520266372939 -bird,bird,north,,,YEWA,CCSpruce3,5,0.0131765741882947,0.00997929370740508,0.0173580925525614,0.0107710137647838 -bird,bird,north,,,YEWA,CCSpruce4,5,0.00716844529547846,0.00638823134941302,0.0116302833192983,0.00628999073653532 -bird,bird,north,,,YEWA,CCPineR,5,0.0289343915901491,0.020644860474546,0.0306700835284104,0.0289343915901491 -bird,bird,north,,,YEWA,CCPine1,5,0.0132463244147424,0.011006209591813,0.0140314998178892,0.0132463244147424 -bird,bird,north,,,YEWA,CCPine2,5,0.0084879333840464,0.00735335029030174,0.00982332816094415,0.0084879333840464 -bird,bird,north,,,YEWA,CCPine3,5,0.00886991957290217,0.00728601602104798,0.00982723286093812,0.00729205786902497 -bird,bird,north,,,YEWA,CCPine4,5,0.00516291247775066,0.00430660768207869,0.0066519536744779,0.00425837541296146 -bird,bird,north,,,YEWA,CCDecidR,5,0.0393626865772772,0.0301395716602404,0.0415227531071398,0.0350621309510165 -bird,bird,north,,,YEWA,CCDecid1,5,0.038908243739496,0.0330547109098666,0.0437031104186482,0.037595948256428 -bird,bird,north,,,YEWA,CCDecid2,5,0.0323770641288264,0.0263794227769796,0.0359957237490745,0.0330340375452814 -bird,bird,north,,,YEWA,CCDecid3,5,0.0220952849763002,0.0209430213031278,0.02560050655137,0.0217166888209874 -bird,bird,north,,,YEWA,CCDecid4,5,0.020911571321784,0.0185039642913223,0.0249785106420815,0.0224941636382026 -bird,bird,north,,,YEWA,CCMixedwoodR,5,0.0172413150233895,0.0132921388591543,0.0201359650077028,0.0181353539877801 -bird,bird,north,,,YEWA,CCMixedwood1,5,0.0188644306889026,0.0146935152204791,0.020594294064939,0.0194923830129976 -bird,bird,north,,,YEWA,CCMixedwood2,5,0.0166088860776952,0.0135134348504827,0.0169800793110858,0.0169565961138062 -bird,bird,north,,,YEWA,CCMixedwood3,5,0.01180523920769,0.0112829421979872,0.0124906528648614,0.0116142383348088 -bird,bird,north,,,YEWA,CCMixedwood4,5,0.011875921631321,0.0103638695297408,0.0121459955969613,0.0119903213362338 -bird,bird,north,,,YEWA,ShrubbySwamp,5,0.0414061863826349,0.0279936578869992,0.0511835165171938,0.0298356911238971 -bird,bird,north,,,YEWA,ShrubbyBog,5,0.0189428249185002,0.0165112329076622,0.0224661894603479,0.0163103741569554 -bird,bird,north,,,YEWA,ShrubbyFen,5,0.025253631189968,0.0223710138106836,0.0394595137982641,0.0263073720097301 -bird,bird,north,,,YEWA,TreedSwamp,5,0.0201850421882363,0.0179719556877051,0.0232226609525522,0.0178409577340367 -bird,bird,south,,,AMRO,Loamy,5,0.0099453463633112,0.00904926905774915,0.0135583274885878,0.0122494221325064 -bird,bird,south,,,AMRO,Blowout,5,0.00486110061740811,0.00421930955070651,0.00629533845480345,0.00522184864445689 -bird,bird,south,,,AMRO,ClaySub,5,0.0102044208633063,0.00865310668774484,0.0145708244344866,0.0127204554639752 -bird,bird,south,,,AMRO,Crop,5,0.018307134359615,0.0140270505937466,0.0228525484793672,0.0203434815427071 -bird,bird,south,,,AMRO,Industrial,5,0.0117412015063187,0.0094957087536181,0.0155458757543567,0.0133075888731474 -bird,bird,south,,,AMRO,Mine,5,0.0130323495297585,0.0079974601153472,0.0246304535779822,0.0130323495297585 -bird,bird,south,,,AMRO,Other,5,0.0106156556959336,0.00874407821817452,0.0181453070565345,0.0144492880152384 -bird,bird,south,,,AMRO,RapidDrain,5,0.0157744007969568,0.0118602045037777,0.0174907076775697,0.0161200527605684 -bird,bird,south,,,AMRO,RoughP,5,0.00897317882459992,0.00688491300754547,0.0107816210770082,0.00944247099844065 -bird,bird,south,,,AMRO,Rural,5,0.0445427891266765,0.0389854478090171,0.0576151684176703,0.0445427891266765 -bird,bird,south,,,AMRO,SandyLoam,5,0.007362403427539,0.00628901832821767,0.0112450812995826,0.0110612341693847 -bird,bird,south,,,AMRO,SoilUnknown,5,0.0107728423429594,0.00851530170473417,0.0144778401126145,0.0128004563053197 -bird,bird,south,,,AMRO,TameP,5,0.0169805704866484,0.01512485640848,0.0225205235586839,0.0235183121766503 -bird,bird,south,,,AMRO,ThinBreak,5,0.0124633844842131,0.00978744684689209,0.0157921792805079,0.0124633844842131 -bird,bird,south,,,AMRO,Urban,5,0.142180457295616,0.0812075848191854,0.217757312251608,0.142180457295616 -bird,bird,south,,,AMRO,Water,5,0.0108631451435177,0.0092965912051215,0.0187902338365357,0.0205100044641106 -bird,bird,south,,,AMRO,Wellsites,5,0.0108631451435177,0.00904927920386456,0.0150493822863629,0.0133075888731474 -bird,bird,south,,,YEWA,Loamy,5,0.128184815106834,0.0943599547866642,0.156513006422996,0.128184815106834 -bird,bird,south,,,YEWA,Blowout,5,0.0635047587932724,0.0442653119260443,0.095362877645849,0.0600969786039604 -bird,bird,south,,,YEWA,ClaySub,5,0.0807532793450908,0.0546354399979166,0.107438431314813,0.0807532793450908 -bird,bird,south,,,YEWA,Crop,5,0.064398538697737,0.0342781226192859,0.0712609630801165,0.0492837942343025 -bird,bird,south,,,YEWA,Industrial,5,0.0861802941104247,0.0635451115499483,0.114863448437255,0.0861802941104247 -bird,bird,south,,,YEWA,Mine,5,0.138490472700304,0.0904304942454559,0.188041443007397,0.138490472700304 -bird,bird,south,,,YEWA,Other,5,0.120159717829991,0.0724723919799819,0.176787258963612,0.178911491281807 -bird,bird,south,,,YEWA,RapidDrain,5,0.165058608804408,0.126311501603039,0.199830460806787,0.136359582532564 -bird,bird,south,,,YEWA,RoughP,5,0.0809890109278188,0.0543779257767213,0.108034787965453,0.0809890109278188 -bird,bird,south,,,YEWA,Rural,5,0.105603244166847,0.0777190400181443,0.116904901322303,0.105603244166847 -bird,bird,south,,,YEWA,SandyLoam,5,0.0863971934450074,0.0688423393972756,0.0996537212799053,0.0808960129186022 -bird,bird,south,,,YEWA,SoilUnknown,5,0.106908351611248,0.074711285828843,0.139223230386544,0.106908351611248 -bird,bird,south,,,YEWA,TameP,5,0.105982875599298,0.0679657932040902,0.146561452065362,0.131510554897273 -bird,bird,south,,,YEWA,ThinBreak,5,0.344263735839286,0.191629158730364,0.449320780877375,0.230458877422009 -bird,bird,south,,,YEWA,Urban,5,0.390289654098494,0.218824596719039,0.413076872519566,0.398893447945759 -bird,bird,south,,,YEWA,Water,5,0.0861802941104247,0.0600925730335339,0.111068355802983,0.0861802941104247 -bird,bird,south,,,YEWA,Wellsites,5,0.0861802941104247,0.0600925730335339,0.111068355802983,0.0861802941104247 -bryophyte,bryophyte,north,,,Bryum.All,WhiteSpruce,5,0.308974089719752,0.162667711674282,0.58049049729367,0.308974089719752 -bryophyte,bryophyte,north,,,Bryum.All,Pine,5,0.143086686438155,0.101959571838194,0.271490309959373,0.143086686438155 -bryophyte,bryophyte,north,,,Bryum.All,Deciduous,5,0.304216233046491,0.207067131595531,0.707649631950251,0.304216233046491 -bryophyte,bryophyte,north,,,Bryum.All,Mixedwood,5,0.206895828865391,0.176280914491628,0.449479307274789,0.204213486775759 -bryophyte,bryophyte,north,,,Bryum.All,BlackSpruce,5,0.154133594755642,0.130529307725989,0.290255876710481,0.139795052022587 -bryophyte,bryophyte,north,,,Bryum.All,TreedFen,5,0.263116559135362,0.218961536741484,0.517232086547538,0.207464791255052 -bryophyte,bryophyte,north,,,Bryum.All,TreedSwamp,5,0.815095784757965,0.613698209188851,0.8887950843584,0.67700829253431 -bryophyte,bryophyte,north,,,Bryum.All,GraminoidFen,5,0.171069119701467,0.134580452270681,0.521185810220519,0.156682738198137 -bryophyte,bryophyte,north,,,Bryum.All,ShrubbyFen,5,0.281801007539748,0.189347181275031,0.478706276603859,0.17636896116634 -bryophyte,bryophyte,north,,,Bryum.All,ShrubbyBog,5,0.0409475283773597,0.0379518703302822,0.0795889388622797,0.093958166878054 -bryophyte,bryophyte,north,,,Bryum.All,ShrubbySwamp,5,0.57601652602753,0.518269332810099,0.850214247135039,0.568041308422661 -bryophyte,bryophyte,north,,,Bryum.All,Marsh,5,0.299551048338968,0.240457336852563,0.536393996082975,0.265932364478495 -bryophyte,bryophyte,north,,,Bryum.All,Shrub,5,0.785140006328676,0.638359637311813,0.874558344484121,0.597088876880074 -bryophyte,bryophyte,north,,,Bryum.All,Grass,5,0.627677988600761,0.603168387955282,0.862231778275789,0.603492417714662 -bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruceR,5,0.547338013644942,0.324685297155872,0.742520577481269,0.30250437064146 -bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce1,5,0.45281469880243,0.219766795975118,0.721581284485378,0.278377962303985 -bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce2,5,0.562227209630086,0.535022851511229,0.841620016486747,0.536296256580977 -bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce3,5,0.562227209630086,0.535022851511229,0.841620016486747,0.536296256580977 -bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce4,5,0.562227209630086,0.535022851511229,0.841620016486747,0.536296256580977 -bryophyte,bryophyte,north,,,Bryum.All,CCPineR,5,0.283100425771656,0.260490047434809,0.623296740885031,0.269948790634583 -bryophyte,bryophyte,north,,,Bryum.All,CCPine1,5,0.250672245063636,0.201013072771311,0.819851875755567,0.243336158729855 -bryophyte,bryophyte,north,,,Bryum.All,CCPine2,5,0.177776992554065,0.15209179815,0.529234295201501,0.177776992554065 -bryophyte,bryophyte,north,,,Bryum.All,CCPine3,5,0.177776992554065,0.15209179815,0.529234295201501,0.177776992554065 -bryophyte,bryophyte,north,,,Bryum.All,CCPine4,5,0.177776992554065,0.15209179815,0.529234295201501,0.177776992554065 -bryophyte,bryophyte,north,,,Bryum.All,CCDeciduousR,5,0.432670830991465,0.31945091421981,0.715789143388405,0.317023552189929 -bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous1,5,0.644228111973737,0.454777788779175,0.867817098652887,0.395089825659678 -bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous2,5,0.226184197371291,0.151317967361289,0.576183877009453,0.226184197371291 -bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous3,5,0.226184197371291,0.151317967361289,0.576183877009453,0.226184197371291 -bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous4,5,0.226184197371291,0.151317967361289,0.576183877009453,0.226184197371291 -bryophyte,bryophyte,north,,,Bryum.All,CCMixedwoodR,5,0.432670830991465,0.31945091421981,0.715789143388405,0.317023552189929 -bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood1,5,0.644228111973737,0.454777788779175,0.867817098652887,0.395089825659678 -bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood2,5,0.226184197371291,0.151317967361289,0.576183877009453,0.226184197371291 -bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood3,5,0.226184197371291,0.151317967361289,0.576183877009453,0.226184197371291 -bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood4,5,0.226184197371291,0.151317967361289,0.576183877009453,0.226184197371291 -bryophyte,bryophyte,north,,,Bryum.All,EnSeismic,5,0.340598817242695,0.164903453730557,0.475216060165671,0.38979785120101 -bryophyte,bryophyte,north,,,Bryum.All,EnSoftLin,5,0.575339131568557,0.386011407252868,0.730665491035266,0.486461633900538 -bryophyte,bryophyte,north,,,Bryum.All,TrSoftLin,5,0.47227081010632,0.235741429686737,0.750847668855231,0.47227081010632 -bryophyte,bryophyte,north,,,Bryum.All,HardLin,5,0.7373977983078,0.532551792762974,0.91043000185822,0.460642471347814 -bryophyte,bryophyte,north,,,Bryum.All,UrbInd,5,0.689315139494054,0.566505458572846,0.857816898557892,0.511165376404773 -bryophyte,bryophyte,north,,,Bryum.All,Wellsites,5,0.411336395969964,0.318776562474012,0.736533989633298,0.273190415567555 -bryophyte,bryophyte,north,,,Bryum.All,Crop,5,0.529838193126662,0.270335967783148,0.667836505703427,0.257936328703817 -bryophyte,bryophyte,north,,,Bryum.All,TameP,5,0.581630503211741,0.463194700792218,0.867999788159835,0.456666447201498 -bryophyte,bryophyte,north,,,Bryum.All,RoughP,5,0.866772814791908,0.638972254622208,0.941838203793737,0.594183706159022 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,WhiteSpruce,5,0.112030441670744,0.0696659201387489,0.190519538231417,0.222596977385881 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Pine,5,0.249304854609913,0.0858683703311142,0.401016629826849,0.249304854609913 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Deciduous,5,0.196301533531834,0.134743846618643,0.251578974362557,0.263472446516492 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Mixedwood,5,0.28984867231307,0.211611765728151,0.527409572727184,0.28984867231307 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,BlackSpruce,5,0.209325042709248,0.157364589900452,0.43032459148606,0.184070478469377 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,TreedFen,5,0.185539583090879,0.107342060621354,0.21609695209782,0.203630483476431 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,TreedSwamp,5,0.19978407964156,0.140968829729245,0.365880244478321,0.19978407964156 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,GraminoidFen,5,0.250130284855286,0.105483860712881,0.297872028079475,0.250130284855286 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,ShrubbyFen,5,0.184174254034198,0.121211900414639,0.351641434048576,0.184174254034198 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,ShrubbyBog,5,0.146502960363555,0.0843461819865189,0.376200094261977,0.146502960363555 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,ShrubbySwamp,5,0.126887900372566,0.0532492716902957,0.231295432501156,0.177195862366848 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Marsh,5,0.119568353016139,0.0669992768775582,0.168127130760379,0.141556993449759 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Shrub,5,0.335467673199442,0.215368376807265,0.376886184928062,0.335467673199442 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Grass,5,0.301992031448182,0.245107482109288,0.349762070532979,0.301992031448182 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruceR,5,0.540541329783748,0.489531021919014,0.677092207749945,0.614344233250936 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce1,5,0.36876636265707,0.282659851296721,0.454095289487264,0.393484602837274 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce2,5,0.617516371883879,0.52082154656563,0.644474767662898,0.657916313589466 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce3,5,0.617516371883879,0.52082154656563,0.644474767662898,0.657916313589466 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce4,5,0.617516371883879,0.52082154656563,0.644474767662898,0.657916313589466 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPineR,5,0.480591139636067,0.300132096455471,0.522346181448412,0.545659517771766 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine1,5,0.642056258107979,0.590222009726219,0.741787486015572,0.642056258107979 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine2,5,0.514021100368588,0.487034213838781,0.605436489905809,0.635584579586204 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine3,5,0.514021100368588,0.487034213838781,0.605436489905809,0.635584579586204 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine4,5,0.514021100368588,0.487034213838781,0.605436489905809,0.635584579586204 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduousR,5,0.519526869750587,0.224287814054948,0.654054999977486,0.519526869750587 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous1,5,0.623725635526479,0.495121615766693,0.753925058863849,0.558717718351746 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous2,5,0.421319056409492,0.362630119106827,0.533667018526809,0.462378918324272 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous3,5,0.421319056409492,0.362630119106827,0.533667018526809,0.462378918324272 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous4,5,0.421319056409492,0.362630119106827,0.533667018526809,0.462378918324272 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwoodR,5,0.519526869750587,0.224287814054948,0.654054999977486,0.519526869750587 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood1,5,0.623725635526479,0.495121615766693,0.753925058863849,0.558717718351746 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood2,5,0.421319056409492,0.362630119106827,0.533667018526809,0.462378918324272 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood3,5,0.421319056409492,0.362630119106827,0.533667018526809,0.462378918324272 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood4,5,0.421319056409492,0.362630119106827,0.533667018526809,0.462378918324272 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,EnSeismic,5,0.388128427369812,0.258835683025722,0.495653290143381,0.396042503380286 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,EnSoftLin,5,0.205319330222485,0.156215075713521,0.266969332444081,0.247714104517573 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,TrSoftLin,5,0.203417107358887,0.0742274262211549,0.219524545648246,0.228401728876471 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,HardLin,5,0.122797399764176,0.0939887495312262,0.20666499934502,0.179441300697741 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,UrbInd,5,0.406123828961622,0.260612579220148,0.530452617259494,0.23766538272575 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Wellsites,5,0.3952307188416,0.212207480419092,0.580201590110138,0.260455149462922 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Crop,5,0.108929703195768,0.0732266003436157,0.18350631077339,0.140345468378213 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,TameP,5,0.131867728043387,0.0594089848841243,0.229712409143828,0.218587144767863 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,RoughP,5,0.143912616354652,0.0964123257999556,0.294636874031917,0.270343789916824 -bryophyte,bryophyte,south,,,Bryum.All,Loamy,5,0.473274717845967,0.388779794566393,0.675182319369236,0.473274717845967 -bryophyte,bryophyte,south,,,Bryum.All,SandyLoam,5,0.623763404348959,0.566322630423459,0.745154176095475,0.623763404348959 -bryophyte,bryophyte,south,,,Bryum.All,ClaySub,5,0.488358302587387,0.296267965084076,0.665236178581072,0.513566279666649 -bryophyte,bryophyte,south,,,Bryum.All,RapidDrain,5,0.456383990460127,0.237610557468415,0.558335335911583,0.456383990460127 -bryophyte,bryophyte,south,,,Bryum.All,Blowout,5,0.748701430422861,0.692158041872183,0.872067048238866,0.748701430422861 -bryophyte,bryophyte,south,,,Bryum.All,ThinBreak,5,0.266696658689805,0.111551539338356,0.473660627342796,0.266696658689805 -bryophyte,bryophyte,south,,,Bryum.All,Other,5,0.422068857255918,0.347690301627597,0.50459481804185,0.407468292608129 -bryophyte,bryophyte,south,,,Bryum.All,EnSeismic,5,0.2642549982569,0.162743991940278,0.648645053131211,0.482117914307296 -bryophyte,bryophyte,south,,,Bryum.All,EnSoftLin,5,0.501251607148897,0.197878106605832,0.742572097882729,0.501672918253629 -bryophyte,bryophyte,south,,,Bryum.All,TrSoftLin,5,0.464054690971584,0.327967448587054,0.823776424800113,0.613016588965431 -bryophyte,bryophyte,south,,,Bryum.All,HardLin,5,0.666580102281647,0.422571263591126,0.752577207337811,0.491617478806848 -bryophyte,bryophyte,south,,,Bryum.All,UrbInd,5,0.293595436061992,0.236110436056845,0.377942466955349,0.393097858690561 -bryophyte,bryophyte,south,,,Bryum.All,Wellsites,5,0.340464655304631,0.192537600202446,0.490710004802023,0.440935456085658 -bryophyte,bryophyte,south,,,Bryum.All,Crop,5,0.243279336617522,0.134286113627049,0.408787918221202,0.277542390498237 -bryophyte,bryophyte,south,,,Bryum.All,TameP,5,0.473780817532282,0.349842132565912,0.717857443626538,0.473780817532282 -bryophyte,bryophyte,south,,,Bryum.All,RoughP,5,0.271246111822176,0.15231721307255,0.428317317922578,0.271246111822176 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,Loamy,5,0.0880328664557739,0.060672446934879,0.171165526702774,0.115177000810257 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,SandyLoam,5,0.105766760433591,0.0747221962388367,0.249076281498836,0.105766760433591 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,ClaySub,5,0.0253512685216928,0.0172411816348254,0.056696825478414,0.0253512685216928 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,RapidDrain,5,0.097554079442326,0.0535954887613747,0.187155247815362,0.097554079442326 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,Blowout,5,0.238386765241013,0.113319360495388,0.598722239747571,0.238386765241013 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,ThinBreak,5,0.0214468610011073,0.0179860306734782,0.0503719358306002,0.0214468610011073 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,Other,5,0.0515948099929371,0.0306226530126652,0.0653417445356725,0.0572581209142173 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,EnSeismic,5,0.0707043009314015,0.0526087589939201,0.279797400764095,0.0707043009314015 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,EnSoftLin,5,0.0747407719041711,0.0482948040936569,0.186301416057806,0.0747407719041711 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,TrSoftLin,5,0.0704598742384681,0.0411048017962768,0.240939894791207,0.0704598742384681 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,HardLin,5,0.206659396634555,0.0660432989408734,0.300572873503316,0.209126134191268 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,UrbInd,5,0.0456100567102081,0.0340727304509427,0.055332266120991,0.0456100567102081 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,Wellsites,5,0.124964688720392,0.0850184040726694,0.211206954512464,0.0830551181446699 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,Crop,5,0.0289140339897818,0.0247911726665589,0.0387368796783477,0.0262246644293447 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,TameP,5,0.0721421869825392,0.0543147066620201,0.199106705166252,0.0615457968167004 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,RoughP,5,0.0664591108088772,0.0543247164471347,0.120248724289744,0.067766730553001 -lichen,lichen,north,,,Cladonia.chlorophaea,WhiteSpruce,5,0.128661098958406,0.124855193556611,0.204427293912201,0.160230563800225 -lichen,lichen,north,,,Cladonia.chlorophaea,Pine,5,0.230079117098186,0.179813900174023,0.360273789571507,0.210249809820585 -lichen,lichen,north,,,Cladonia.chlorophaea,Deciduous,5,0.121324351142597,0.0872621019923896,0.143825952808245,0.136817798838928 -lichen,lichen,north,,,Cladonia.chlorophaea,Mixedwood,5,0.0984557553149279,0.0545777027772408,0.112248614682224,0.115802848220679 -lichen,lichen,north,,,Cladonia.chlorophaea,BlackSpruce,5,0.403292528595932,0.358505305104995,0.638298533379189,0.403292528595932 -lichen,lichen,north,,,Cladonia.chlorophaea,TreedFen,5,0.504617490382435,0.359879727321562,0.625746147914501,0.428659382012715 -lichen,lichen,north,,,Cladonia.chlorophaea,TreedSwamp,5,0.665693157587439,0.502645401327826,0.724461853810744,0.510515102256231 -lichen,lichen,north,,,Cladonia.chlorophaea,GraminoidFen,5,0.489256749567966,0.306540048579416,0.572984989962887,0.282411753463989 -lichen,lichen,north,,,Cladonia.chlorophaea,ShrubbyFen,5,0.370120126470694,0.270019373234564,0.53022889883459,0.242010054127684 -lichen,lichen,north,,,Cladonia.chlorophaea,ShrubbyBog,5,0.141260287480395,0.0567819895590906,0.188070804361037,0.141260287480395 -lichen,lichen,north,,,Cladonia.chlorophaea,ShrubbySwamp,5,0.184741026553176,0.0891963973945931,0.242278765896729,0.184741026553176 -lichen,lichen,north,,,Cladonia.chlorophaea,Marsh,5,0.0708898621598725,0.0404355920571795,0.079151424751504,0.0798473976304544 -lichen,lichen,north,,,Cladonia.chlorophaea,Shrub,5,0.0517359583674559,0.0195646082142656,0.0789531138661174,0.0938129845926235 -lichen,lichen,north,,,Cladonia.chlorophaea,Grass,5,0.173012452686917,0.104877761141144,0.209232964794269,0.141236544546189 -lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruceR,5,0.0525321876142188,0.0350483280392254,0.114018253460163,0.0906677860864298 -lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce1,5,0.0719899251215031,0.047780420145228,0.176916811492338,0.156992993462549 -lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce2,5,0.149413093693624,0.0870203001289966,0.270715725064737,0.179422836074818 -lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce3,5,0.149413093693624,0.0870203001289966,0.270715725064737,0.179422836074818 -lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce4,5,0.149413093693624,0.0870203001289966,0.270715725064737,0.179422836074818 -lichen,lichen,north,,,Cladonia.chlorophaea,CCPineR,5,0.00978986954755468,0.00822467671524218,0.0258486119323907,0.0333390984309549 -lichen,lichen,north,,,Cladonia.chlorophaea,CCPine1,5,0.189052904668437,0.0986219993844684,0.227152392530965,0.189052904668437 -lichen,lichen,north,,,Cladonia.chlorophaea,CCPine2,5,0.0817569760829207,0.0757953632359234,0.141554492521773,0.151392232102977 -lichen,lichen,north,,,Cladonia.chlorophaea,CCPine3,5,0.0817569760829207,0.0757953632359234,0.141554492521773,0.151392232102977 -lichen,lichen,north,,,Cladonia.chlorophaea,CCPine4,5,0.0817569760829207,0.0757953632359234,0.141554492521773,0.151392232102977 -lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduousR,5,0.0776736278278235,0.0505562323522782,0.152962326280761,0.131298522971376 -lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous1,5,0.111726716318103,0.0827932616193127,0.147085303560683,0.140986333328742 -lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous2,5,0.110758294842867,0.0856462436819334,0.176911768706607,0.188488762029281 -lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous3,5,0.110758294842867,0.0856462436819334,0.176911768706607,0.188488762029281 -lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous4,5,0.110758294842867,0.0856462436819334,0.176911768706607,0.188488762029281 -lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwoodR,5,0.0776736278278235,0.0505562323522782,0.152962326280761,0.131298522971376 -lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood1,5,0.111726716318103,0.0827932616193127,0.147085303560683,0.140986333328742 -lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood2,5,0.110758294842867,0.0856462436819334,0.176911768706607,0.188488762029281 -lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood3,5,0.110758294842867,0.0856462436819334,0.176911768706607,0.188488762029281 -lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood4,5,0.110758294842867,0.0856462436819334,0.176911768706607,0.188488762029281 -lichen,lichen,north,,,Cladonia.chlorophaea,EnSeismic,5,0.0562871342426963,0.0320229327626297,0.0877062042488125,0.103955648973456 -lichen,lichen,north,,,Cladonia.chlorophaea,EnSoftLin,5,0.0349744161875645,0.0135950566585377,0.0460307869610447,0.0520718837817988 -lichen,lichen,north,,,Cladonia.chlorophaea,TrSoftLin,5,0.103588894942155,0.0250811144006789,0.153774872898092,0.103588894942155 -lichen,lichen,north,,,Cladonia.chlorophaea,HardLin,5,0.0154890037249669,0.00969735705324304,0.0242295520251997,0.0194687233362852 -lichen,lichen,north,,,Cladonia.chlorophaea,UrbInd,5,0.0291298802009484,0.022170341246061,0.0394398808836477,0.0399831841699761 -lichen,lichen,north,,,Cladonia.chlorophaea,Wellsites,5,0.0312303611913381,0.01825340797697,0.0382450877069983,0.0405301490949005 -lichen,lichen,north,,,Cladonia.chlorophaea,Crop,5,0.00819135312232188,0.0032964347257604,0.0153259493459229,0.0106228365914737 -lichen,lichen,north,,,Cladonia.chlorophaea,TameP,5,0.0384099180416212,0.0291846782167506,0.0458757501630787,0.0384099180416212 -lichen,lichen,north,,,Cladonia.chlorophaea,RoughP,5,0.0501127937327384,0.0412289445446687,0.0800415714933927,0.0659587534674029 -lichen,lichen,north,,,Physcia.adscendens,WhiteSpruce,5,0.0280709179229579,0.0158823614277584,0.0370698471276619,0.0417321760259875 -lichen,lichen,north,,,Physcia.adscendens,Pine,5,0.0335554922949197,0.0328321333973256,0.0381993091153045,0.0388803690684755 -lichen,lichen,north,,,Physcia.adscendens,Deciduous,5,0.150111220381722,0.0982775269867873,0.204568198699545,0.182221182455449 -lichen,lichen,north,,,Physcia.adscendens,Mixedwood,5,0.066143481475221,0.0366744056160219,0.0822856468530477,0.0884733355341471 -lichen,lichen,north,,,Physcia.adscendens,BlackSpruce,5,0.0371166105774204,0.0180529526526415,0.0886332365829845,0.0297257197367906 -lichen,lichen,north,,,Physcia.adscendens,TreedFen,5,0.00283648668986138,0.00211085215363339,0.00798491034075052,0.0096330609515934 -lichen,lichen,north,,,Physcia.adscendens,TreedSwamp,5,0.151560668253984,0.0946381053489427,0.218379490579115,0.13750034253386 -lichen,lichen,north,,,Physcia.adscendens,GraminoidFen,5,0.0740408487785589,0.0218928131556558,0.106953471125693,0.0740408487785589 -lichen,lichen,north,,,Physcia.adscendens,ShrubbyFen,5,0.00624108474033991,0.00351153558550388,0.0123708425148104,0.0151140673106255 -lichen,lichen,north,,,Physcia.adscendens,ShrubbyBog,5,0.0101805161860488,0.00773748829404913,0.0212068238130188,0.018187687131778 -lichen,lichen,north,,,Physcia.adscendens,ShrubbySwamp,5,0.0362768598763018,0.0218314980950171,0.0418196022070653,0.0383343029334143 -lichen,lichen,north,,,Physcia.adscendens,Marsh,5,0.0108784278677345,0.0101742363969005,0.020592791623776,0.0233928964085336 -lichen,lichen,north,,,Physcia.adscendens,Shrub,5,0.0381488861896238,0.0304198903024431,0.0558421183865387,0.0666814246971562 -lichen,lichen,north,,,Physcia.adscendens,Grass,5,0.0768105720214742,0.050153486235137,0.0978256955825497,0.0901247981807328 -lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruceR,5,0.00547586911493163,0.00349714196841403,0.0129769451747226,0.0169696165447101 -lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce1,5,0.0989510919927337,0.0429150110336418,0.141802535687179,0.102505230126881 -lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce2,5,0.155036614912574,0.088233085428621,0.366327338728443,0.14765016798871 -lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce3,5,0.155036614912574,0.088233085428621,0.366327338728443,0.14765016798871 -lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce4,5,0.155036614912574,0.088233085428621,0.366327338728443,0.14765016798871 -lichen,lichen,north,,,Physcia.adscendens,CCPineR,5,0.0064962201386863,0.00421432892887562,0.0142770276673618,0.0171492164111918 -lichen,lichen,north,,,Physcia.adscendens,CCPine1,5,0.00696710027863156,0.00494066956859161,0.0245414990478204,0.0265625131932835 -lichen,lichen,north,,,Physcia.adscendens,CCPine2,5,0.0515635294496696,0.0159974691369398,0.104039850625823,0.0515635294496696 -lichen,lichen,north,,,Physcia.adscendens,CCPine3,5,0.0515635294496696,0.0159974691369398,0.104039850625823,0.0515635294496696 -lichen,lichen,north,,,Physcia.adscendens,CCPine4,5,0.0515635294496696,0.0159974691369398,0.104039850625823,0.0515635294496696 -lichen,lichen,north,,,Physcia.adscendens,CCDeciduousR,5,0.0370772388534196,0.0239941672310476,0.0704175667019601,0.0555525290793276 -lichen,lichen,north,,,Physcia.adscendens,CCDeciduous1,5,0.0638362385247109,0.0443950437751117,0.0960107914764775,0.0846489827961707 -lichen,lichen,north,,,Physcia.adscendens,CCDeciduous2,5,0.0631299062200761,0.0527345204338537,0.192845361167475,0.0932548262463118 -lichen,lichen,north,,,Physcia.adscendens,CCDeciduous3,5,0.0631299062200761,0.0527345204338537,0.192845361167475,0.0932548262463118 -lichen,lichen,north,,,Physcia.adscendens,CCDeciduous4,5,0.0631299062200761,0.0527345204338537,0.192845361167475,0.0932548262463118 -lichen,lichen,north,,,Physcia.adscendens,CCMixedwoodR,5,0.0370772388534196,0.0239941672310476,0.0704175667019601,0.0555525290793276 -lichen,lichen,north,,,Physcia.adscendens,CCMixedwood1,5,0.0638362385247109,0.0443950437751117,0.0960107914764775,0.0846489827961707 -lichen,lichen,north,,,Physcia.adscendens,CCMixedwood2,5,0.0631299062200761,0.0527345204338537,0.192845361167475,0.0932548262463118 -lichen,lichen,north,,,Physcia.adscendens,CCMixedwood3,5,0.0631299062200761,0.0527345204338537,0.192845361167475,0.0932548262463118 -lichen,lichen,north,,,Physcia.adscendens,CCMixedwood4,5,0.0631299062200761,0.0527345204338537,0.192845361167475,0.0932548262463118 -lichen,lichen,north,,,Physcia.adscendens,EnSeismic,5,0.00973533663743669,0.00761498586953942,0.0167468016732872,0.0189402458111425 -lichen,lichen,north,,,Physcia.adscendens,EnSoftLin,5,0.0280436433302379,0.0154713255752847,0.0341444951096086,0.0280436433302379 -lichen,lichen,north,,,Physcia.adscendens,TrSoftLin,5,0.00496005598877083,0.00471160489961,0.0161107262084194,0.0196590192362782 -lichen,lichen,north,,,Physcia.adscendens,HardLin,5,0.0348874368867459,0.0252558243773983,0.0454162343164239,0.0348874368867459 -lichen,lichen,north,,,Physcia.adscendens,UrbInd,5,0.0174279932552207,0.0130439461733558,0.0312426839236964,0.038226183628617 -lichen,lichen,north,,,Physcia.adscendens,Wellsites,5,0.0116376600198287,0.00721312434489467,0.0271997579619256,0.0195364714768302 -lichen,lichen,north,,,Physcia.adscendens,Crop,5,0.0187347369810745,0.00891380317133725,0.0251945259418885,0.0187347369810745 -lichen,lichen,north,,,Physcia.adscendens,TameP,5,0.0320140311491714,0.0181860445822102,0.0525560687925619,0.0320140311491714 -lichen,lichen,north,,,Physcia.adscendens,RoughP,5,0.108558416385157,0.0722935863539439,0.120255191852576,0.120604736486396 -lichen,lichen,south,,,Cladonia.chlorophaea,Loamy,5,0.0177145886237437,0.0052613407057454,0.0550296543748453,0.0597277251451078 -lichen,lichen,south,,,Cladonia.chlorophaea,SandyLoam,5,0.0174816561380657,0.0163692237823521,0.0463540119872417,0.0655647445815341 -lichen,lichen,south,,,Cladonia.chlorophaea,ClaySub,5,0.00555126453122542,0.00193376988801804,0.0246758086287448,0.0361988055512762 -lichen,lichen,south,,,Cladonia.chlorophaea,RapidDrain,5,0.0567337727522392,0.01648604582655,0.0977154360637852,0.0671288270967656 -lichen,lichen,south,,,Cladonia.chlorophaea,Blowout,5,0.0237324539823939,0.0159513708859139,0.0620732820621201,0.065567183985177 -lichen,lichen,south,,,Cladonia.chlorophaea,ThinBreak,5,0.0143707682934732,0.00636508094146172,0.0332345496567772,0.0456180486741436 -lichen,lichen,south,,,Cladonia.chlorophaea,Other,5,0.00501505269454619,0.00117718504049849,0.013492729542509,0.0188250605196629 -lichen,lichen,south,,,Cladonia.chlorophaea,EnSeismic,5,0.0118184764992799,0.00270684743301339,0.0194732488127343,0.0232927646410083 -lichen,lichen,south,,,Cladonia.chlorophaea,EnSoftLin,5,0.00440555784016973,0.00251986579899649,0.0127587507542381,0.0175964661762687 -lichen,lichen,south,,,Cladonia.chlorophaea,TrSoftLin,5,0.00378677049508389,0.002344807848226,0.0145741903219359,0.0210304145687519 -lichen,lichen,south,,,Cladonia.chlorophaea,HardLin,5,0.00459330109979107,0.000615727205925929,0.0123856767727841,0.0168326781004455 -lichen,lichen,south,,,Cladonia.chlorophaea,UrbInd,5,0.00406842553092113,0.000580716062808916,0.0128316513245183,0.0171046511598148 -lichen,lichen,south,,,Cladonia.chlorophaea,Wellsites,5,0.0255015614912696,0.00149219879902554,0.0741205245698955,0.075570998415282 -lichen,lichen,south,,,Cladonia.chlorophaea,Crop,5,0.000902822927314831,0.000313932467373215,0.00171206716954244,0.00219321929279424 -lichen,lichen,south,,,Cladonia.chlorophaea,TameP,5,0.00841687677986071,0.00273882035239516,0.0222008641778524,0.0222832297619207 -lichen,lichen,south,,,Cladonia.chlorophaea,RoughP,5,0.0146295350565741,0.00159564151079338,0.0209906652594332,0.0232570250948312 -lichen,lichen,south,,,Physcia.adscendens,Loamy,5,0.217277829333826,0.15704406708964,0.304047615408886,0.191539524792095 -lichen,lichen,south,,,Physcia.adscendens,SandyLoam,5,0.530458320080061,0.492263518720828,0.775018453077396,0.47212665072262 -lichen,lichen,south,,,Physcia.adscendens,ClaySub,5,0.0930616688338325,0.0600838876549339,0.130385692484933,0.0930616688338325 -lichen,lichen,south,,,Physcia.adscendens,RapidDrain,5,0.415291920210692,0.323952051051762,0.732495085467375,0.299819326285583 -lichen,lichen,south,,,Physcia.adscendens,Blowout,5,0.136557921316276,0.0312523714063513,0.218955487776077,0.0590335560161137 -lichen,lichen,south,,,Physcia.adscendens,ThinBreak,5,0.164143804877533,0.09801970065868,0.318344907386786,0.0887993397036373 -lichen,lichen,south,,,Physcia.adscendens,Other,5,0.302755037549603,0.195446719515116,0.349608006408001,0.253161029743585 -lichen,lichen,south,,,Physcia.adscendens,EnSeismic,5,0.427977544979326,0.305291789630875,0.529586269705453,0.392066598196877 -lichen,lichen,south,,,Physcia.adscendens,EnSoftLin,5,0.199606327527873,0.101306683994238,0.342484070807443,0.199606327527873 -lichen,lichen,south,,,Physcia.adscendens,TrSoftLin,5,0.468184625274239,0.246504828756221,0.554178811146563,0.384440449804642 -lichen,lichen,south,,,Physcia.adscendens,HardLin,5,0.0903428321717492,0.0726729054739433,0.177127641495429,0.0903428321717492 -lichen,lichen,south,,,Physcia.adscendens,UrbInd,5,0.105224161614799,0.0694355463481286,0.360295359522274,0.133640114131234 -lichen,lichen,south,,,Physcia.adscendens,Wellsites,5,0.19463004648108,0.0738642039995704,0.514233439827871,0.19463004648108 -lichen,lichen,south,,,Physcia.adscendens,Crop,5,0.00160433746227649,0.000870393463932428,0.00197844245618304,0.00200214957457342 -lichen,lichen,south,,,Physcia.adscendens,TameP,5,0.0118823041171665,0.00527250522779698,0.0197946310197383,0.0147630929337545 -lichen,lichen,south,,,Physcia.adscendens,RoughP,5,0.0111686428068464,0.00900506913750176,0.0136311119203765,0.0124711875346818 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Decid,5,0.0239265522425756,0.011090430138699,0.0262642294785886,0.0244438161537447 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Mixedwood,5,0.00876853407632136,0.00529693735610337,0.017282630905016,0.018244077073362 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Pine,5,0.0218156856543157,0.0176823052798924,0.026150184586927,0.0218156856543157 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Spruce,5,0.0249676695779629,0.0124713391918506,0.0841250161965133,0.0249676695779629 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,TreedBog,5,0.013440180346083,0.00768552288492119,0.0153841765853905,0.0163246075462524 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,TreedFen,5,0.0113397909731737,0.00790700341974478,0.0148681446174923,0.0162033353768527 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,TreedSwamp,5,0.00920452009478482,0.00678335792601969,0.0169590936891753,0.0169257400685579 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,GrassHerb,5,0.00764205077560037,0.00300303315040609,0.0170907681049233,0.0195189698246484 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Shrub,5,0.00792974468150597,0.00142053798784553,0.0152449495397204,0.0199070300314277 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,GraminoidFen,5,0.00515552261082155,0.00310834341821341,0.0110209792476925,0.0145397395835169 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Marsh,5,0.00515552261082155,0.00310834341821341,0.0110209792476925,0.0145397395835169 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,ShrubbyBog,5,0.00337978306315942,0.00173972936014788,0.00810369673048077,0.0106853868570127 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,ShrubbyFen,5,0.00337978306315942,0.00173972936014788,0.00810369673048077,0.0106853868570127 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,ShrubbySwamp,5,0.00386835087932868,0.00146921093276277,0.0105008781248198,0.0133868586272888 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCDecidR,5,0.032688169974919,0.00430418901138586,0.0426944107414556,0.0474178063842245 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCDecid1,5,0.0660310137716376,0.0123397104884087,0.0712652922206858,0.0714275332775695 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCDecid2,5,0.0227140044627329,0.00404663527542528,0.0396094548436344,0.0474178063842245 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCDecid3,5,0.0309640669359143,0.00430418901138586,0.0421006013923976,0.0474178063842245 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCDecid4,5,0.0309640669359143,0.00430418901138586,0.0421006013923976,0.0474178063842245 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCMixedwoodR,5,0.0309640669359143,0.00430418901138586,0.0421006013923976,0.0474178063842245 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCMixedwood1,5,0.0309640669359143,0.00457437404502943,0.0421006013923976,0.0474178063842245 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCMixedwood2,5,0.0341247939046573,0.00430418901138586,0.0443551497549623,0.0474178063842245 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCMixedwood3,5,0.0309640669359143,0.00430418901138586,0.0421006013923976,0.0474178063842245 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCMixedwood4,5,0.0309640669359143,0.00430418901138586,0.0421006013923976,0.0474178063842245 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCPineR,5,0.0158387074013367,0.00391553778673811,0.0461513941132943,0.0434754323748698 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCPine1,5,0.0158387074013367,0.00360797976148127,0.030600864615104,0.0353491995914119 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCPine2,5,0.0158387074013367,0.00391553778673811,0.041928615898253,0.0434754323748698 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCPine3,5,0.0158387074013367,0.00391553778673811,0.041928615898253,0.0434754323748698 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCPine4,5,0.0158387074013367,0.00391553778673811,0.041928615898253,0.0434754323748698 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCSpruceR,5,0.0192468112801372,0.00647034742518576,0.160357496833249,0.0430448429456243 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCSpruce1,5,0.0192468112801372,0.00647034742518576,0.0715373899275162,0.0430448429456243 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCSpruce2,5,0.0176558232248481,0.00587863502902288,0.0622007428604107,0.0414862808156023 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCSpruce3,5,0.0192468112801372,0.00647034742518576,0.0715373899275162,0.0430448429456243 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCSpruce4,5,0.0192468112801372,0.00647034742518576,0.0715373899275162,0.0430448429456243 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,HardLin,5,0.0235008608313258,0.00367071390415812,0.0304603017209443,0.0302656550259816 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,EnSoftLin,5,0.0217043128777652,0.00777176419384538,0.0816863159559975,0.056857687400326 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,EnSeismic,5,0.014218996636615,0.00427691149847948,0.0424456709769066,0.0433016920307201 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,TrSoftLin,5,0.018741290730221,0.00489485760606281,0.0621949534180226,0.0555281041055134 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Urban,5,0.0235008608313258,0.00367071390415812,0.0304603017209443,0.0302656550259816 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Rural,5,0.0235008608313258,0.00367071390415812,0.0304603017209443,0.0302656550259816 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Industrial,5,0.0235008608313258,0.00367071390415812,0.0304603017209443,0.0302656550259816 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Well,5,0.010823843674072,0.00168670480720688,0.0185050742594436,0.0220947826519 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Crop,5,0.0181351316304772,0.0058327472257548,0.0264818597212109,0.0287620934346421 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,TameP,5,0.0174776843450439,0.00843540987169354,0.0299780882426473,0.0348115991913053 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,RoughP,5,0.0136467739445996,0.00780690491350207,0.0258557029727057,0.0287620934346421 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Decid,5,0.201127843984686,0.0801674200792492,0.333839799881527,0.337362503626968 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Mixedwood,5,0.179039171535964,0.0403753215863673,0.273496031417048,0.324412645428585 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Pine,5,0.111232556011978,0.0290206403594057,0.197698849646192,0.233684453638651 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Spruce,5,0.149495893116987,0.0414920916323207,0.2031811829525,0.235565855911004 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,TreedBog,5,0.0831232149942555,0.0507157674962523,0.185404456677778,0.220086339128002 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,TreedFen,5,0.0661749005924134,0.0412152047072714,0.167991265723248,0.215755214969767 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,TreedSwamp,5,0.109938505131459,0.0696327925801873,0.168237000366661,0.206120898221515 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,GrassHerb,5,0.075628548099574,0.0261456535467499,0.177520264561312,0.217309032186079 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Shrub,5,0.0326122274234979,0.0136598579410703,0.141245574853981,0.21246000489003 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,GraminoidFen,5,0.0611928153891843,0.0382261984529277,0.151587380336666,0.209768209450013 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Marsh,5,0.0611928153891843,0.0382261984529277,0.151587380336666,0.209768209450013 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,ShrubbyBog,5,0.0339030847994837,0.0236988732741335,0.132447228737797,0.18495503014443 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,ShrubbyFen,5,0.0339030847994837,0.0236988732741335,0.132447228737797,0.18495503014443 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,ShrubbySwamp,5,0.0872497782130119,0.0335407714587239,0.167503406748117,0.209165825893222 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCDecidR,5,0.0822796132620831,0.0515235189051686,0.170474280421734,0.21808869173414 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCDecid1,5,0.069679309721374,0.0355218706336958,0.168620576756719,0.21808869173414 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCDecid2,5,0.032357214387318,0.0248595547128921,0.146396623132516,0.21808869173414 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCDecid3,5,0.0720473671206,0.0372344323687945,0.161805519680996,0.21808869173414 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCDecid4,5,0.0720473671206,0.0372344323687945,0.161805519680996,0.21808869173414 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCMixedwoodR,5,0.0773807616012798,0.0372344323687945,0.165444063073026,0.21808869173414 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCMixedwood1,5,0.0608761758239522,0.0364039570795283,0.156847885856327,0.21808869173414 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCMixedwood2,5,0.0773807616012798,0.0580351329278593,0.17631451751749,0.21808869173414 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCMixedwood3,5,0.0720473671206,0.0372344323687945,0.161805519680996,0.21808869173414 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCMixedwood4,5,0.0720473671206,0.0372344323687945,0.161805519680996,0.21808869173414 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCPineR,5,0.108777731131181,0.062471120402669,0.177229603530075,0.21808869173414 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCPine1,5,0.119039032137584,0.0513952512696187,0.188803760280334,0.21808869173414 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCPine2,5,0.115940971223978,0.053258397405848,0.18143790825132,0.21808869173414 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCPine3,5,0.115940971223978,0.053258397405848,0.18143790825132,0.21808869173414 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCPine4,5,0.115940971223978,0.053258397405848,0.18143790825132,0.21808869173414 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCSpruceR,5,0.10367101560494,0.0375393590984709,0.184191164454731,0.21808869173414 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCSpruce1,5,0.10367101560494,0.0463839033519437,0.184191164454731,0.21808869173414 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCSpruce2,5,0.106738230986072,0.0459739764621588,0.17484826458163,0.21808869173414 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCSpruce3,5,0.10367101560494,0.0463839033519437,0.184191164454731,0.21808869173414 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCSpruce4,5,0.10367101560494,0.0463839033519437,0.184191164454731,0.21808869173414 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,HardLin,5,0.0549356072841527,0.0175622239362563,0.146080863883223,0.199206486594685 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,EnSoftLin,5,0.123200481737908,0.0537508601064006,0.217041011876353,0.254675586066876 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,EnSeismic,5,0.246411221826881,0.155607707364388,0.398976010987935,0.335886269080349 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,TrSoftLin,5,0.0910848826238341,0.0453883298760255,0.188615144167118,0.229996454233121 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Urban,5,0.0549356072841527,0.0175622239362563,0.146080863883223,0.199206486594685 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Rural,5,0.0549356072841527,0.0175622239362563,0.146080863883223,0.199206486594685 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Industrial,5,0.0549356072841527,0.0175622239362563,0.146080863883223,0.199206486594685 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Well,5,0.058981013234745,0.0309053192126292,0.15075789028877,0.199206486594685 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Crop,5,0.0479480246139084,0.0268170909069881,0.145748422611594,0.199206486594685 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,TameP,5,0.0392496874966303,0.0274349443035048,0.146562544163904,0.1994381725463 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,RoughP,5,0.0550755736632679,0.0404684601258794,0.172883065458448,0.215418452552767 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,ClaySub,5,0.579435087877377,0.376740935259992,0.812560686850785,0.579435087877377 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Other,5,0.579435087877377,0.376740935259992,0.812560686850785,0.579435087877377 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,RapidDrain,5,0.567189218503969,0.47199498238142,0.863506270114337,0.567189218503969 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Loamy,5,0.619578949738156,0.532640086592042,0.853893944075329,0.619578949738156 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,SandyLoam,5,0.6537384667663,0.628666404398064,0.90339285272658,0.643635469946527 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,ThinBreak,5,0.579435087877377,0.339790490465082,0.785002657910113,0.579435087877377 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Blowout,5,0.579435087877377,0.339790490465082,0.785002657910113,0.579435087877377 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Urban,5,0.634662376939146,0.554815076281409,0.900026375504453,0.621422126393485 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Rural,5,0.634662376939146,0.554815076281409,0.900026375504453,0.621422126393485 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Industrial,5,0.634662376939146,0.554815076281409,0.900026375504453,0.621422126393485 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Well,5,0.589288197329797,0.429483104909735,0.784402715446441,0.589288197329797 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Mine,5,0.634662376939146,0.554815076281409,0.900026375504453,0.621422126393485 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,EnSoftLin,5,0.608027603006347,0.529391882081968,0.830531296526406,0.608027603006347 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,EnSeismic,5,0.608027603006347,0.529391882081968,0.830531296526406,0.608027603006347 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,HardLin,5,0.634662376939146,0.554815076281409,0.900026375504453,0.621422126393485 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,TrSoftLin,5,0.604343269149707,0.477137519935801,0.779049549335585,0.608027603006347 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Crop,5,0.745680570130594,0.669286588806116,0.895353896938071,0.662627063162264 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,RoughP,5,0.657949420464453,0.611717289607787,0.844775926434602,0.64533268938427 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,TameP,5,0.771468831258731,0.611861000519867,0.858254448348948,0.641768541833134 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,WetlandMargin,5,0.619578949738156,0.365152799625488,0.811842717994965,0.619578949738156 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,ClaySub,5,0.0638641563843588,0.00830012163249392,0.133193996743995,0.0638641563843588 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Other,5,0.0638641563843588,0.00830012163249392,0.133193996743995,0.0638641563843588 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,RapidDrain,5,0.0244338800355817,0.00676763034913233,0.0349890815973205,0.0244338800355817 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Loamy,5,0.0190323866592316,0.00443315765678557,0.0324013334670289,0.0190323866592316 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,SandyLoam,5,0.0172800345712338,0.00857253479874986,0.0229620525118943,0.0172800345712338 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,ThinBreak,5,0.0205618898372336,0.00420810578005255,0.0301979259993108,0.0205618898372336 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Blowout,5,0.0205618898372336,0.00420810578005255,0.0301979259993108,0.0205618898372336 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Urban,5,0.0132113537340821,0.00321917119188162,0.0218039143419396,0.0132113537340821 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Rural,5,0.0132113537340821,0.00321917119188162,0.0218039143419396,0.0132113537340821 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Industrial,5,0.0132113537340821,0.00321917119188162,0.0218039143419396,0.0132113537340821 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Well,5,0.0132113537340821,0.00309255815343757,0.0217557138231168,0.0132113537340821 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Mine,5,0.0132113537340821,0.00321917119188162,0.0218039143419396,0.0132113537340821 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,EnSoftLin,5,0.0161072340777825,0.00335300837512712,0.0275454895868135,0.0161072340777825 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,EnSeismic,5,0.0161072340777825,0.00335300837512712,0.0275454895868135,0.0161072340777825 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,HardLin,5,0.0132113537340821,0.00321917119188162,0.0218039143419396,0.0132113537340821 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,TrSoftLin,5,0.0154437684506216,0.00496082637311666,0.0214922669449421,0.0154437684506216 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Crop,5,0.0173445429282449,0.00350689556269019,0.0345286310448205,0.0218726499714427 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,RoughP,5,0.0139533680539032,0.00250898881213455,0.0206140837822618,0.0139533680539032 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,TameP,5,0.0127631165173143,0.00219426816829498,0.0190386598095673,0.0127631165173143 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,WetlandMargin,5,0.0190323866592316,0.00443315765678557,0.0324013334670289,0.0190323866592316 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Decid,5,0.0215247007459494,0.0169379028802803,0.0284874228107134,0.023929637133342 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Mixedwood,5,0.0176485137579288,0.0117453621845229,0.0267434314285739,0.0215965790600485 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Pine,5,0.0198346111234909,0.0193922334339949,0.0275704351286727,0.0198346111234909 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Spruce,5,0.0288083711793445,0.02276360207826,0.0432965026739425,0.0285640118330302 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,TreedBog,5,0.0231351271516251,0.0121621263662202,0.024585859437274,0.0231351271516251 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,TreedFen,5,0.0161703490073758,0.0103305688105141,0.022231837104831,0.0203256012952714 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,TreedSwamp,5,0.0363864950282561,0.0216431253096614,0.0499942531045655,0.0363864950282561 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,GrassHerb,5,0.0217737254053411,0.0139198944889084,0.0705741457755696,0.0349436819488887 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Shrub,5,0.0246271437529468,0.0136653439880979,0.0485886389206459,0.0349436819488887 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,GraminoidFen,5,0.0233764199613657,0.0204477614213053,0.0340810120636668,0.0233764199613657 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Marsh,5,0.0233764199613657,0.0204477614213053,0.0340810120636668,0.0233764199613657 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,ShrubbyBog,5,0.0147213637529,0.0121767957213658,0.0187511560816343,0.0185800194931585 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,ShrubbyFen,5,0.0147213637529,0.0121767957213658,0.0187511560816343,0.0185800194931585 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,ShrubbySwamp,5,0.0121644049723173,0.00801246344395918,0.0159561988639188,0.016554015196869 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCDecidR,5,0.0364174798693786,0.0184495155268272,0.0472771326687817,0.0364174798693786 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCDecid1,5,0.0364076924409662,0.0219046034584099,0.0365824504146867,0.0364076924409662 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCDecid2,5,0.0270943611884668,0.0163911517573477,0.0343820999694772,0.0313199309247969 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCDecid3,5,0.0349868266515764,0.0221950692485396,0.0365824504146867,0.0349868266515764 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCDecid4,5,0.0349868266515764,0.0221950692485396,0.0365824504146867,0.0349868266515764 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCMixedwoodR,5,0.0349868266515764,0.0221950692485396,0.048660767843984,0.0349868266515764 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCMixedwood1,5,0.0349868266515764,0.0237522967889377,0.0465595992164621,0.0349868266515764 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCMixedwood2,5,0.0349868266515764,0.0226852672834032,0.0427603388477375,0.0349868266515764 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCMixedwood3,5,0.0349868266515764,0.0221950692485396,0.0365824504146867,0.0349868266515764 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCMixedwood4,5,0.0349868266515764,0.0221950692485396,0.0365824504146867,0.0349868266515764 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCPineR,5,0.0190923447688606,0.0149216127997302,0.0266386140471931,0.0289061692019033 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCPine1,5,0.020800318211655,0.0149029330290882,0.0266702320453148,0.0277073960028091 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCPine2,5,0.0185862852995256,0.0155745055282898,0.0269179289466542,0.0289061692019033 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCPine3,5,0.0185862852995256,0.0155745055282898,0.0269179289466542,0.0289061692019033 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCPine4,5,0.0185862852995256,0.0155745055282898,0.0269179289466542,0.0289061692019033 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCSpruceR,5,0.0210466190352934,0.0148828808858681,0.0278501867777361,0.0301318841549511 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCSpruce1,5,0.0210466190352934,0.0148828808858681,0.0278501867777361,0.0301318841549511 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCSpruce2,5,0.020482402376974,0.0144704132356553,0.0278501867777361,0.0301318841549511 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCSpruce3,5,0.0210466190352934,0.0148828808858681,0.0278501867777361,0.0301318841549511 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCSpruce4,5,0.0210466190352934,0.0148828808858681,0.0278501867777361,0.0301318841549511 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,HardLin,5,0.0484183578512355,0.0309483197804586,0.0560972846186679,0.0543198268489983 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,EnSoftLin,5,0.0989836204912431,0.069743007955016,0.167151447571454,0.0989836204912431 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,EnSeismic,5,0.0468621423159454,0.0379449591404454,0.0568575204028804,0.046832439935615 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,TrSoftLin,5,0.0541347607671683,0.0435919929035909,0.0627330127383789,0.0541347607671683 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Urban,5,0.0484183578512355,0.0309483197804586,0.0560972846186679,0.0543198268489983 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Rural,5,0.0484183578512355,0.0309483197804586,0.0560972846186679,0.0543198268489983 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Industrial,5,0.0484183578512355,0.0309483197804586,0.0560972846186679,0.0543198268489983 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Well,5,0.0470719619997601,0.0230911003357151,0.0495742804059222,0.0496728368406262 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Crop,5,0.0239099428233414,0.0185974121803875,0.0349298777275594,0.0323798781464309 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,TameP,5,0.0326187644912133,0.023197038618504,0.0343775856257446,0.0348007221563603 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,RoughP,5,0.0273447394135055,0.0150333257488427,0.0324002905486677,0.0323798781464309 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Decid,5,0.743305665259858,0.593091633660256,0.789087502927589,0.568428264613533 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Mixedwood,5,0.319110479728785,0.27208237027459,0.54200822020993,0.265716789996539 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Pine,5,0.144236218994791,0.10022673495497,0.237695748126675,0.144236218994791 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Spruce,5,0.316951298288236,0.19249836715505,0.384525718829423,0.245863824752863 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,TreedBog,5,0.362998258346435,0.231875374602059,0.444787284906343,0.153582332650107 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,TreedFen,5,0.312597798213775,0.234778900454404,0.417197845089155,0.196220956664201 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,TreedSwamp,5,0.51633259709258,0.429091938633066,0.65151488284143,0.419777704102624 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,GrassHerb,5,0.0499969445000865,0.0295280422648458,0.0722449212787727,0.0761531728978141 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Shrub,5,0.0646813206434672,0.0447443154772795,0.0740176968758066,0.0793837644792474 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,GraminoidFen,5,0.128113958894917,0.086731932618269,0.203277969572144,0.128113958894917 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Marsh,5,0.128113958894917,0.086731932618269,0.203277969572144,0.128113958894917 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,ShrubbyBog,5,0.170349048589789,0.128011231931264,0.347031048999254,0.170349048589789 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,ShrubbyFen,5,0.170349048589789,0.128011231931264,0.347031048999254,0.170349048589789 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,ShrubbySwamp,5,0.243778576933666,0.170950956167097,0.276981457535628,0.174097734120848 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCDecidR,5,0.390322758156878,0.24213282381012,0.578494135565328,0.26876058901456 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCDecid1,5,0.438273538252,0.223594620133148,0.621247929036178,0.301031134344717 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCDecid2,5,0.424580614573172,0.214856401655936,0.631579949169482,0.300257214458358 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCDecid3,5,0.382169835968011,0.202257751478417,0.577940851593645,0.26876058901456 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCDecid4,5,0.382169835968011,0.202257751478417,0.577940851593645,0.26876058901456 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCMixedwoodR,5,0.382169835968011,0.202257751478417,0.577940851593645,0.26876058901456 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCMixedwood1,5,0.382169835968011,0.20680764692218,0.651717086632006,0.26876058901456 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCMixedwood2,5,0.382169835968011,0.202257751478417,0.577940851593645,0.26876058901456 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCMixedwood3,5,0.382169835968011,0.202257751478417,0.577940851593645,0.26876058901456 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCMixedwood4,5,0.382169835968011,0.202257751478417,0.577940851593645,0.26876058901456 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCPineR,5,0.257516440284706,0.150667864555583,0.320937431877625,0.222834547421847 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCPine1,5,0.367032738512122,0.153797796335071,0.408352690453667,0.230659376870567 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCPine2,5,0.299264533385581,0.150667864555583,0.326927019206703,0.222834547421847 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCPine3,5,0.299264533385581,0.150667864555583,0.326927019206703,0.222834547421847 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCPine4,5,0.299264533385581,0.150667864555583,0.326927019206703,0.222834547421847 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCSpruceR,5,0.33031115076104,0.165344717010304,0.354066806053394,0.232399492763879 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCSpruce1,5,0.321278673465362,0.165344717010304,0.354066806053394,0.232399492763879 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCSpruce2,5,0.309235698414168,0.152978282893057,0.342198618765037,0.224646667829625 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCSpruce3,5,0.321278673465362,0.165344717010304,0.354066806053394,0.232399492763879 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCSpruce4,5,0.321278673465362,0.165344717010304,0.354066806053394,0.232399492763879 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,HardLin,5,0.124834250138939,0.0976031879619042,0.161015010276017,0.119657771072368 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,EnSoftLin,5,0.149578897160079,0.110196599487253,0.200795296959508,0.149578897160079 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,EnSeismic,5,0.17621171145072,0.151563449331815,0.321389063867061,0.148917015269093 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,TrSoftLin,5,0.161576038763776,0.133472855485968,0.334988361196439,0.170010118563354 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Urban,5,0.124834250138939,0.0976031879619042,0.161015010276017,0.119657771072368 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Rural,5,0.124834250138939,0.0976031879619042,0.161015010276017,0.119657771072368 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Industrial,5,0.124834250138939,0.0976031879619042,0.161015010276017,0.119657771072368 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Well,5,0.167342446883202,0.0996737795885326,0.235260454822506,0.167342446883202 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Crop,5,0.13230580933567,0.0989533856832414,0.175081497618559,0.123033265375711 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,TameP,5,0.0761978867660244,0.0626235509195081,0.122200153021745,0.102432278679424 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,RoughP,5,0.179999624870336,0.123544136127207,0.318886739486466,0.131080066156672 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,ClaySub,5,0.822350941282527,0.564721576685588,0.902847896976817,0.547378986013343 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Other,5,0.822350941282527,0.564721576685588,0.902847896976817,0.547378986013343 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,RapidDrain,5,0.703309155717464,0.555321222902083,0.827461651558563,0.535469054342694 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Loamy,5,0.817588806148305,0.548443636006928,0.872763956600932,0.537850119223136 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,SandyLoam,5,0.807001792632946,0.557211905149701,0.88451664389314,0.537850119223136 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,ThinBreak,5,0.818123827692734,0.555565174379291,0.845931184940945,0.547378986013343 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Blowout,5,0.818123827692734,0.555565174379291,0.845931184940945,0.547378986013343 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Urban,5,0.890800888100359,0.618470952341391,0.90323565954368,0.541340120053176 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Rural,5,0.890800888100359,0.618470952341391,0.90323565954368,0.541340120053176 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Industrial,5,0.890800888100359,0.618470952341391,0.90323565954368,0.541340120053176 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Well,5,0.836243487485749,0.571006998954711,0.858962702047066,0.541340120053176 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Mine,5,0.890800888100359,0.618470952341391,0.90323565954368,0.541340120053176 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,EnSoftLin,5,0.814175226069433,0.547613503979019,0.874411868748132,0.534554131355377 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,EnSeismic,5,0.814175226069433,0.547613503979019,0.874411868748132,0.534554131355377 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,HardLin,5,0.890800888100359,0.618470952341391,0.90323565954368,0.541340120053176 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,TrSoftLin,5,0.826862949231866,0.464464171910114,0.856952486011971,0.520766669143306 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Crop,5,0.826142483695513,0.592096665574573,0.867149842462746,0.546104007294353 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,RoughP,5,0.810682771251767,0.57867711034817,0.896046995556526,0.541340120053176 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,TameP,5,0.835967807856813,0.590087861484664,0.870602954482249,0.547491721318661 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,WetlandMargin,5,0.841776259030486,0.633256861915724,0.937087335898482,0.537850119223136 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,ClaySub,5,0.00578279539408642,0.00294709629848283,0.012716045120441,0.00578279539408642 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Other,5,0.00578279539408642,0.00294709629848283,0.012716045120441,0.00578279539408642 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,RapidDrain,5,0.0105026506316965,0.00282353804046292,0.04993812156097,0.0105026506316965 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Loamy,5,0.00513692494203576,0.00222403648608284,0.0104028241345287,0.00513692494203576 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,SandyLoam,5,0.00712222785450809,0.00297230760676107,0.0323909870151699,0.00712222785450809 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,ThinBreak,5,0.0113857775964533,0.00620595274137331,0.022596015655191,0.0113857775964533 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Blowout,5,0.0113857775964533,0.00620595274137331,0.022596015655191,0.0113857775964533 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Urban,5,0.00452107771336638,0.00152466904882226,0.00780585643767519,0.00452107771336638 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Rural,5,0.00452107771336638,0.00152466904882226,0.00780585643767519,0.00452107771336638 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Industrial,5,0.00452107771336638,0.00152466904882226,0.00780585643767519,0.00452107771336638 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Well,5,0.00452107771336638,0.00152466904882226,0.00780585643767519,0.00452107771336638 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Mine,5,0.00452107771336638,0.00152466904882226,0.00780585643767519,0.00452107771336638 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,EnSoftLin,5,0.00513692494203576,0.00211613204099217,0.0099228372629855,0.00513692494203576 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,EnSeismic,5,0.00513692494203576,0.00211613204099217,0.0099228372629855,0.00513692494203576 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,HardLin,5,0.00452107771336638,0.00152466904882226,0.00780585643767519,0.00452107771336638 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,TrSoftLin,5,0.00498071216604,0.00141664690414779,0.00917631209935718,0.00498071216604 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Crop,5,0.00449311926621077,0.00168638787291805,0.00918727174507008,0.00449311926621077 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,RoughP,5,0.0067604464527444,0.00219886873382249,0.0276703814247239,0.0067604464527444 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,TameP,5,0.00445800890262925,0.0011233692177066,0.00744232176659842,0.00445800890262925 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,WetlandMargin,5,0.00513692494203576,0.00222403648608284,0.0104028241345287,0.00513692494203576 -mite,mite,north,,,Ceratozetes.gracilis,WhiteSpruce,5,0.0102721598563217,0.00715471386706027,0.0145326114268986,0.0140245523241566 -mite,mite,north,,,Ceratozetes.gracilis,Pine,5,0.0137131456937762,0.0113208681440029,0.0198583797303688,0.0190318391556017 -mite,mite,north,,,Ceratozetes.gracilis,Deciduous,5,0.0419895435582249,0.0318785038001686,0.0738570815054399,0.0659102684828086 -mite,mite,north,,,Ceratozetes.gracilis,Mixedwood,5,0.0360745482187593,0.0187983923764792,0.0584515677254383,0.0360745482187593 -mite,mite,north,,,Ceratozetes.gracilis,BlackSpruce,5,0.00506933557927685,0.00376749685856964,0.0104679406943217,0.0122333270217994 -mite,mite,north,,,Ceratozetes.gracilis,TreedFen,5,0.00949436841370341,0.00500717830110075,0.0119860292426439,0.0128817556588155 -mite,mite,north,,,Ceratozetes.gracilis,TreedSwamp,5,0.061421923343376,0.0382456463400108,0.121929812673505,0.061421923343376 -mite,mite,north,,,Ceratozetes.gracilis,GraminoidFen,5,0.0164546108915562,0.00881727358484067,0.0273923201976842,0.0246160759474848 -mite,mite,north,,,Ceratozetes.gracilis,ShrubbyFen,5,0.00874406982447618,0.00599221158044052,0.0237824318370538,0.0231774355740017 -mite,mite,north,,,Ceratozetes.gracilis,ShrubbyBog,5,0.0030463995013817,0.00120397300447129,0.00391921428919227,0.00434888507766517 -mite,mite,north,,,Ceratozetes.gracilis,ShrubbySwamp,5,0.0633579949842819,0.0494171642998844,0.0835346829927806,0.0620598776562816 -mite,mite,north,,,Ceratozetes.gracilis,Marsh,5,0.0139708169973481,0.00817678617009308,0.0369379677309799,0.0139708169973481 -mite,mite,north,,,Ceratozetes.gracilis,Shrub,5,0.021009994706587,0.0144404304492431,0.0621154731146993,0.0326917133555118 -mite,mite,north,,,Ceratozetes.gracilis,Grass,5,0.0155614031928919,0.0117070997259304,0.0190061057161866,0.0198424321202836 -mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruceR,5,0.00145906946331353,0.00110246554548516,0.00251407856907734,0.00296318377307484 -mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce1,5,0.00733330942443348,0.00372481242741027,0.01232435005305,0.0154489388605393 -mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce2,5,0.00869219213722612,0.00430603955099368,0.0164036356140145,0.0202021550024924 -mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce3,5,0.00869219213722612,0.00430603955099368,0.0164036356140145,0.0202021550024924 -mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce4,5,0.00869219213722612,0.00430603955099368,0.0164036356140145,0.0202021550024924 -mite,mite,north,,,Ceratozetes.gracilis,CCPineR,5,0.00113231817173019,0.000943611856652661,0.00208629558436305,0.00270898722191647 -mite,mite,north,,,Ceratozetes.gracilis,CCPine1,5,0.00220467448193786,0.00159982858176423,0.00488408633392917,0.00560263822791497 -mite,mite,north,,,Ceratozetes.gracilis,CCPine2,5,0.00753999417911515,0.00263432313689099,0.00983810253139207,0.00839874476683232 -mite,mite,north,,,Ceratozetes.gracilis,CCPine3,5,0.00753999417911515,0.00263432313689099,0.00983810253139207,0.00839874476683232 -mite,mite,north,,,Ceratozetes.gracilis,CCPine4,5,0.00753999417911515,0.00263432313689099,0.00983810253139207,0.00839874476683232 -mite,mite,north,,,Ceratozetes.gracilis,CCDeciduousR,5,0.00622614692199154,0.00349911838500725,0.0116842851671796,0.0124894467727164 -mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous1,5,0.0201857384998523,0.0124305058492061,0.0316762391943219,0.0315697398121216 -mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous2,5,0.00568730085218266,0.00303223049800619,0.0117691164845202,0.0142578278538103 -mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous3,5,0.00568730085218266,0.00303223049800619,0.0117691164845202,0.0142578278538103 -mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous4,5,0.00568730085218266,0.00303223049800619,0.0117691164845202,0.0142578278538103 -mite,mite,north,,,Ceratozetes.gracilis,CCMixedwoodR,5,0.00622614692199154,0.00349911838500725,0.0116842851671796,0.0124894467727164 -mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood1,5,0.0201857384998523,0.0124305058492061,0.0316762391943219,0.0315697398121216 -mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood2,5,0.00568730085218266,0.00303223049800619,0.0117691164845202,0.0142578278538103 -mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood3,5,0.00568730085218266,0.00303223049800619,0.0117691164845202,0.0142578278538103 -mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood4,5,0.00568730085218266,0.00303223049800619,0.0117691164845202,0.0142578278538103 -mite,mite,north,,,Ceratozetes.gracilis,EnSeismic,5,0.00928889522762542,0.00622414921635469,0.0297264608094797,0.0431427656629786 -mite,mite,north,,,Ceratozetes.gracilis,EnSoftLin,5,0.0100440395771807,0.004709630725824,0.0184046907818485,0.0191349522872354 -mite,mite,north,,,Ceratozetes.gracilis,TrSoftLin,5,0.00854985842280526,0.00246837907751785,0.0099686716021626,0.0104216422917097 -mite,mite,north,,,Ceratozetes.gracilis,HardLin,5,0.0100148328187436,0.0058598954135579,0.0133735097958914,0.0147237570029223 -mite,mite,north,,,Ceratozetes.gracilis,UrbInd,5,0.0792581753031336,0.0445586547475523,0.110793194734777,0.0792581753031336 -mite,mite,north,,,Ceratozetes.gracilis,Wellsites,5,0.0157808575713124,0.0109575298578701,0.0328323497840251,0.0243796022869871 -mite,mite,north,,,Ceratozetes.gracilis,Crop,5,0.0254125124461608,0.0128510549404539,0.0458640062799612,0.0325207137703129 -mite,mite,north,,,Ceratozetes.gracilis,TameP,5,0.0190000037034049,0.00867750921274693,0.0471399438340532,0.0432297466703646 -mite,mite,north,,,Ceratozetes.gracilis,RoughP,5,0.106075388059961,0.0641356861012643,0.188477562833508,0.16378251919553 -mite,mite,north,,,Trhypochthonius.tectorum,WhiteSpruce,5,0.0394857475434615,0.0194344004414981,0.0670017923672268,0.0454100702942058 -mite,mite,north,,,Trhypochthonius.tectorum,Pine,5,0.0429413314976495,0.0214812518055131,0.0568894331044955,0.0540245549102675 -mite,mite,north,,,Trhypochthonius.tectorum,Deciduous,5,0.0154170661057649,0.00745930803534025,0.0426364368931325,0.0467769583351974 -mite,mite,north,,,Trhypochthonius.tectorum,Mixedwood,5,0.0282994701988188,0.0117846368090254,0.0431721884278335,0.0465669285383791 -mite,mite,north,,,Trhypochthonius.tectorum,BlackSpruce,5,0.0156446110279516,0.0127794912003539,0.086215463904672,0.0781669036443615 -mite,mite,north,,,Trhypochthonius.tectorum,TreedFen,5,0.0246352429845294,0.00569517745674629,0.0724751689250193,0.0660128866775939 -mite,mite,north,,,Trhypochthonius.tectorum,TreedSwamp,5,0.0459480505762087,0.00899572780254302,0.0807258425516005,0.059434391666355 -mite,mite,north,,,Trhypochthonius.tectorum,GraminoidFen,5,0.0229477899865102,0.00660910116311413,0.06214758200501,0.0533255128164798 -mite,mite,north,,,Trhypochthonius.tectorum,ShrubbyFen,5,0.0250204427570318,0.00943545138708123,0.105756635738421,0.056016511718773 -mite,mite,north,,,Trhypochthonius.tectorum,ShrubbyBog,5,0.00695295513522941,0.00371743134013496,0.0407322548597943,0.0562597597884134 -mite,mite,north,,,Trhypochthonius.tectorum,ShrubbySwamp,5,0.00349830992158235,0.00154031084721905,0.0384781711617471,0.0398679512796629 -mite,mite,north,,,Trhypochthonius.tectorum,Marsh,5,0.0114684995492736,0.00610947363791284,0.031983272768434,0.0433187130955129 -mite,mite,north,,,Trhypochthonius.tectorum,Shrub,5,0.00641771386367267,0.00149403006775723,0.029708057554145,0.0407470625842792 -mite,mite,north,,,Trhypochthonius.tectorum,Grass,5,0.0312166587168325,0.00889633528243011,0.0495513457910109,0.0536916558688223 -mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruceR,5,0.087851578863436,0.0276012076062507,0.100358133377569,0.0911261638218472 -mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce1,5,0.0137654830009269,0.00557222919065331,0.0333472474145989,0.0461306170397789 -mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce2,5,0.0304595601888948,0.00859332116648274,0.0473241647351322,0.0461306170397789 -mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce3,5,0.0304595601888948,0.00859332116648274,0.0473241647351322,0.0461306170397789 -mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce4,5,0.0304595601888948,0.00859332116648274,0.0473241647351322,0.0461306170397789 -mite,mite,north,,,Trhypochthonius.tectorum,CCPineR,5,0.11797977009165,0.0716919997701895,0.164502979867339,0.158981687296497 -mite,mite,north,,,Trhypochthonius.tectorum,CCPine1,5,0.0416259101387942,0.0178333289570483,0.0570045183978202,0.0624999970758866 -mite,mite,north,,,Trhypochthonius.tectorum,CCPine2,5,0.0416058554749524,0.0196299263331726,0.102183027700316,0.0624999970758866 -mite,mite,north,,,Trhypochthonius.tectorum,CCPine3,5,0.0416058554749524,0.0196299263331726,0.102183027700316,0.0624999970758866 -mite,mite,north,,,Trhypochthonius.tectorum,CCPine4,5,0.0416058554749524,0.0196299263331726,0.102183027700316,0.0624999970758866 -mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduousR,5,0.0292037302811804,0.0105765175267385,0.0638609969955317,0.0758256609216894 -mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous1,5,0.00927032106896021,0.0042587298763641,0.0421851537524267,0.0461306170397789 -mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous2,5,0.0071434147237284,0.00404148035199869,0.0365404302748405,0.0461306170397789 -mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous3,5,0.0071434147237284,0.00404148035199869,0.0365404302748405,0.0461306170397789 -mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous4,5,0.0071434147237284,0.00404148035199869,0.0365404302748405,0.0461306170397789 -mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwoodR,5,0.0292037302811804,0.0105765175267385,0.0638609969955317,0.0758256609216894 -mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood1,5,0.00927032106896021,0.0042587298763641,0.0421851537524267,0.0461306170397789 -mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood2,5,0.0071434147237284,0.00404148035199869,0.0365404302748405,0.0461306170397789 -mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood3,5,0.0071434147237284,0.00404148035199869,0.0365404302748405,0.0461306170397789 -mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood4,5,0.0071434147237284,0.00404148035199869,0.0365404302748405,0.0461306170397789 -mite,mite,north,,,Trhypochthonius.tectorum,EnSeismic,5,0.0150298540092801,0.00487970658508403,0.0796437946117068,0.0834089416573685 -mite,mite,north,,,Trhypochthonius.tectorum,EnSoftLin,5,0.0151467600781892,0.0046231304235287,0.0914725089720468,0.0478802872049836 -mite,mite,north,,,Trhypochthonius.tectorum,TrSoftLin,5,0.00231544669389142,0.000830887384992062,0.03064970004828,0.0468035425561821 -mite,mite,north,,,Trhypochthonius.tectorum,HardLin,5,0.0353500369895466,0.0103456301397578,0.055405203452712,0.0353500369895466 -mite,mite,north,,,Trhypochthonius.tectorum,UrbInd,5,0.0213764276928926,0.00252933506160831,0.0387012781622709,0.0335752758675474 -mite,mite,north,,,Trhypochthonius.tectorum,Wellsites,5,0.033939415802588,0.00993451686590656,0.126894128793527,0.0399206342672845 -mite,mite,north,,,Trhypochthonius.tectorum,Crop,5,0.0114608689427535,0.00248651280400981,0.0444082523603005,0.0276062157536913 -mite,mite,north,,,Trhypochthonius.tectorum,TameP,5,0.0308290810251023,0.0110029263001109,0.0771358591892674,0.0396030587559356 -mite,mite,north,,,Trhypochthonius.tectorum,RoughP,5,0.0714106623632365,0.0130348302097785,0.165983452044736,0.0714106623632365 -mite,mite,south,,,Ceratozetes.gracilis,Loamy,5,0.00808101143196459,0.0016207392148522,0.0174633482020339,0.00882687291847061 -mite,mite,south,,,Ceratozetes.gracilis,SandyLoam,5,0.00308029027664852,0.00136735323790803,0.00335668375087707,0.0034847088953633 -mite,mite,south,,,Ceratozetes.gracilis,ClaySub,5,0.00182686446591225,0.000551301167708902,0.00255940845646478,0.00262320814741028 -mite,mite,south,,,Ceratozetes.gracilis,RapidDrain,5,0.00277400834477971,0.0023872020244556,0.00482653073951637,0.00608021031756068 -mite,mite,south,,,Ceratozetes.gracilis,Blowout,5,0.000955956862870655,0.00060083281876712,0.00205343870432948,0.00237550963076549 -mite,mite,south,,,Ceratozetes.gracilis,ThinBreak,5,0.00108919344605565,0.000587088915890356,0.00219875979679317,0.00242897446172947 -mite,mite,south,,,Ceratozetes.gracilis,Other,5,0.00131583947131006,0.000874185124012239,0.00242047053127026,0.00263971632746513 -mite,mite,south,,,Ceratozetes.gracilis,EnSeismic,5,0.00835839453074033,0.00426678711041527,0.0332341427605599,0.00718827301556243 -mite,mite,south,,,Ceratozetes.gracilis,EnSoftLin,5,0.00835839453074033,0.00426678711041527,0.0332341427605599,0.00718827301556243 -mite,mite,south,,,Ceratozetes.gracilis,TrSoftLin,5,0.00782010538323901,0.00296136986295269,0.0190154458378424,0.00782010538323901 -mite,mite,south,,,Ceratozetes.gracilis,HardLin,5,0.000857882269526531,0.000540002525668197,0.00177545141273227,0.00235911183402676 -mite,mite,south,,,Ceratozetes.gracilis,UrbInd,5,0.000912690250621134,0.000615008763429803,0.00160412414613674,0.00204648635172349 -mite,mite,south,,,Ceratozetes.gracilis,Wellsites,5,0.00073043791427095,0.000342681767297562,0.00139736599182283,0.00170188942786697 -mite,mite,south,,,Ceratozetes.gracilis,Crop,5,0.000865573045680914,0.000343855590582349,0.00391591974096471,0.00259320087178522 -mite,mite,south,,,Ceratozetes.gracilis,TameP,5,0.000814344168693421,0.000675922956447004,0.0021578051053667,0.00302380446706365 -mite,mite,south,,,Ceratozetes.gracilis,RoughP,5,0.00116986012195163,0.000573399888505842,0.00201559505541471,0.00240069830914299 -mite,mite,south,,,Trhypochthonius.tectorum,Loamy,5,0.0130796885088541,0.00974376898623315,0.0421691194810228,0.0544473280466744 -mite,mite,south,,,Trhypochthonius.tectorum,SandyLoam,5,0.0101719139805278,0.0078121674325146,0.0265020778999881,0.0309629294988475 -mite,mite,south,,,Trhypochthonius.tectorum,ClaySub,5,0.00810026356871029,0.00554399917475387,0.0262048642490298,0.0372855553100201 -mite,mite,south,,,Trhypochthonius.tectorum,RapidDrain,5,0.00470891550488383,0.0029479116054443,0.0140469239546165,0.0193187162515081 -mite,mite,south,,,Trhypochthonius.tectorum,Blowout,5,0.00679693278998647,0.00400940538175401,0.0212493700388495,0.0258250448201751 -mite,mite,south,,,Trhypochthonius.tectorum,ThinBreak,5,0.00431742975180868,0.0026988855859282,0.0153217341942861,0.0215938033932772 -mite,mite,south,,,Trhypochthonius.tectorum,Other,5,0.00543311605540115,0.0017249123691186,0.0159501956987054,0.0209154741630786 -mite,mite,south,,,Trhypochthonius.tectorum,EnSeismic,5,0.00218848996144008,0.00170111662865227,0.0089044869307167,0.012071708052853 -mite,mite,south,,,Trhypochthonius.tectorum,EnSoftLin,5,0.00218848996144008,0.00170111662865227,0.0089044869307167,0.012071708052853 -mite,mite,south,,,Trhypochthonius.tectorum,TrSoftLin,5,0.0021416742642729,0.0015786428997113,0.00657962986794352,0.00950883665281393 -mite,mite,south,,,Trhypochthonius.tectorum,HardLin,5,0.00961214826175235,0.00429514334368352,0.0184057934930091,0.0233658844622869 -mite,mite,south,,,Trhypochthonius.tectorum,UrbInd,5,0.00458440358742753,0.00191345237161373,0.0162420822395568,0.0233658844622869 -mite,mite,south,,,Trhypochthonius.tectorum,Wellsites,5,0.00605835473530788,0.00316482367582537,0.0173531343798444,0.0247924008862883 -mite,mite,south,,,Trhypochthonius.tectorum,Crop,5,0.0108598136663004,0.00491431184971441,0.026838371730351,0.0344211245391687 -mite,mite,south,,,Trhypochthonius.tectorum,TameP,5,0.00666208954248976,0.00331975745298083,0.0217685548217177,0.0317175484607103 -mite,mite,south,,,Trhypochthonius.tectorum,RoughP,5,0.00435992031802756,0.00192924676806901,0.0153162033122146,0.0201534578604257 -vascular_plant,vascular_plant,north,,,Galium.boreale,WhiteSpruce,5,0.0374392031265178,0.0333692131906405,0.0433345653944808,0.0466370647602642 -vascular_plant,vascular_plant,north,,,Galium.boreale,Pine,5,0.0500593438765839,0.0408049555459282,0.105240107802099,0.0500593438765839 -vascular_plant,vascular_plant,north,,,Galium.boreale,Deciduous,5,0.391495895873286,0.254496804487091,0.402163195293294,0.215897634677168 -vascular_plant,vascular_plant,north,,,Galium.boreale,Mixedwood,5,0.0810095418020126,0.0379869231315069,0.0961950903853699,0.032872236484059 -vascular_plant,vascular_plant,north,,,Galium.boreale,BlackSpruce,5,0.0254674616646145,0.0158425843666888,0.0435953519065557,0.022750121589903 -vascular_plant,vascular_plant,north,,,Galium.boreale,TreedFen,5,0.00502270579593102,0.00437032022683379,0.00714592120041284,0.00488295833356585 -vascular_plant,vascular_plant,north,,,Galium.boreale,TreedSwamp,5,0.118774832996189,0.0803475724001394,0.264441595558989,0.118774832996189 -vascular_plant,vascular_plant,north,,,Galium.boreale,GraminoidFen,5,0.0130058711269843,0.00939224816431556,0.0185730233320287,0.0130058711269843 -vascular_plant,vascular_plant,north,,,Galium.boreale,ShrubbyFen,5,0.0164297495624466,0.0143281428330915,0.0199331852928648,0.0134413437619274 -vascular_plant,vascular_plant,north,,,Galium.boreale,ShrubbyBog,5,0.00381694456221479,0.00284947146206666,0.00416465601549787,0.00381694456221479 -vascular_plant,vascular_plant,north,,,Galium.boreale,ShrubbySwamp,5,0.108530709301707,0.0605738646315521,0.114251847865091,0.0601778189466999 -vascular_plant,vascular_plant,north,,,Galium.boreale,Marsh,5,0.0303195892798742,0.0240370199820619,0.0400184400943712,0.0248817213967334 -vascular_plant,vascular_plant,north,,,Galium.boreale,Shrub,5,0.0636708746674912,0.0476716418053174,0.120518777360074,0.0509427447460396 -vascular_plant,vascular_plant,north,,,Galium.boreale,Grass,5,0.0217088138057536,0.0176938879165566,0.0548384650438043,0.0157402788563787 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruceR,5,0.477222128053848,0.268619294592782,0.718584112281858,0.383065851974248 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce1,5,0.512664474399587,0.273048354454709,0.734787181463203,0.381159706709511 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce2,5,0.336004758372563,0.0866177087481736,0.503038421010211,0.134073305928807 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce3,5,0.336004758372563,0.0866177087481736,0.503038421010211,0.134073305928807 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce4,5,0.336004758372563,0.0866177087481736,0.503038421010211,0.134073305928807 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCPineR,5,0.184368836538832,0.112339902951841,0.592544885907604,0.1582478760585 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine1,5,0.178323228748494,0.0944312519481362,0.421291284259476,0.105728116532866 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine2,5,0.103429645869795,0.0327474504737415,0.207096053070954,0.034845885680375 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine3,5,0.103429645869795,0.0327474504737415,0.207096053070954,0.034845885680375 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine4,5,0.103429645869795,0.0327474504737415,0.207096053070954,0.034845885680375 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduousR,5,0.32057396424405,0.183225375506266,0.453779124126605,0.215698096756669 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous1,5,0.575267910405923,0.415636893665722,0.739486529308092,0.517792427897605 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous2,5,0.488835240754203,0.429359375220111,0.628974155208788,0.411079620974547 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous3,5,0.488835240754203,0.429359375220111,0.628974155208788,0.411079620974547 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous4,5,0.488835240754203,0.429359375220111,0.628974155208788,0.411079620974547 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwoodR,5,0.32057396424405,0.183225375506266,0.453779124126605,0.215698096756669 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood1,5,0.575267910405923,0.415636893665722,0.739486529308092,0.517792427897605 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood2,5,0.488835240754203,0.429359375220111,0.628974155208788,0.411079620974547 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood3,5,0.488835240754203,0.429359375220111,0.628974155208788,0.411079620974547 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood4,5,0.488835240754203,0.429359375220111,0.628974155208788,0.411079620974547 -vascular_plant,vascular_plant,north,,,Galium.boreale,EnSeismic,5,0.0322705170722364,0.0230594539873516,0.0482626435755474,0.0550597930196374 -vascular_plant,vascular_plant,north,,,Galium.boreale,EnSoftLin,5,0.0330658481820695,0.0223970025521592,0.0355945662748708,0.0330658481820695 -vascular_plant,vascular_plant,north,,,Galium.boreale,TrSoftLin,5,0.0271163602936753,0.0173228057640187,0.037172405180186,0.0426724289112729 -vascular_plant,vascular_plant,north,,,Galium.boreale,HardLin,5,0.0179685654599828,0.0126487434552365,0.0260498499768669,0.0152195497846251 -vascular_plant,vascular_plant,north,,,Galium.boreale,UrbInd,5,0.0268124105494291,0.0248743534215449,0.0334324484826879,0.0260231381636217 -vascular_plant,vascular_plant,north,,,Galium.boreale,Wellsites,5,0.0256423967549138,0.0209953251743227,0.0461214967239676,0.0190579138992947 -vascular_plant,vascular_plant,north,,,Galium.boreale,Crop,5,0.013672124479362,0.0115163163976427,0.0232606798636209,0.012042036542853 -vascular_plant,vascular_plant,north,,,Galium.boreale,TameP,5,0.0144861626647328,0.0106777255014515,0.0203487482988822,0.0172878421770899 -vascular_plant,vascular_plant,north,,,Galium.boreale,RoughP,5,0.131547628495493,0.076550261941709,0.157040313589425,0.0947839598426263 -vascular_plant,vascular_plant,north,,,Vicia.americana,WhiteSpruce,5,0.00328686102375592,0.00212675122944704,0.00391474523204404,0.00381959988064463 -vascular_plant,vascular_plant,north,,,Vicia.americana,Pine,5,0.01046399923648,0.0074924685118511,0.0138803201478345,0.0155059259418671 -vascular_plant,vascular_plant,north,,,Vicia.americana,Deciduous,5,0.436765018936612,0.245683907178536,0.517177208179867,0.436765018936612 -vascular_plant,vascular_plant,north,,,Vicia.americana,Mixedwood,5,0.0520407768186977,0.0339944817579022,0.0745743937468873,0.0505004500386359 -vascular_plant,vascular_plant,north,,,Vicia.americana,BlackSpruce,5,0.0187255304615284,0.0125287122210643,0.0333788943810062,0.0187255304615284 -vascular_plant,vascular_plant,north,,,Vicia.americana,TreedFen,5,0.00626918066404668,0.00321493408740833,0.00737118278045699,0.00626918066404668 -vascular_plant,vascular_plant,north,,,Vicia.americana,TreedSwamp,5,0.0228909546198871,0.0135832508442986,0.0430941171968737,0.0202149765066307 -vascular_plant,vascular_plant,north,,,Vicia.americana,GraminoidFen,5,0.0135563454263875,0.00903949116065579,0.0207009644089668,0.0149408384704638 -vascular_plant,vascular_plant,north,,,Vicia.americana,ShrubbyFen,5,0.0155413131969093,0.00956914702042303,0.0187105923881176,0.0155413131969093 -vascular_plant,vascular_plant,north,,,Vicia.americana,ShrubbyBog,5,0.00164559675785315,0.00148060148333466,0.00286167395797714,0.00288035092196388 -vascular_plant,vascular_plant,north,,,Vicia.americana,ShrubbySwamp,5,0.0171724189914347,0.0131662587331599,0.0241301292385613,0.0195540890683284 -vascular_plant,vascular_plant,north,,,Vicia.americana,Marsh,5,0.0104711263227363,0.00867414464248756,0.0347361666823628,0.0162897049172689 -vascular_plant,vascular_plant,north,,,Vicia.americana,Shrub,5,0.0238622589247824,0.0168440278701544,0.0310683402874825,0.0238622589247824 -vascular_plant,vascular_plant,north,,,Vicia.americana,Grass,5,0.030670229988894,0.0215275510873062,0.0436481913075912,0.0294286596923736 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruceR,5,0.0418211090236362,0.0152789098681117,0.0730998392976096,0.0418211090236362 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce1,5,0.0629715243585932,0.0321343077668045,0.0959159858854704,0.0594047036921747 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce2,5,0.0565865098903527,0.0408509535382218,0.0964486926516381,0.055631413305491 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce3,5,0.0565865098903527,0.0408509535382218,0.0964486926516381,0.055631413305491 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce4,5,0.0565865098903527,0.0408509535382218,0.0964486926516381,0.055631413305491 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCPineR,5,0.0201647463247618,0.0100739950966346,0.0353623986021148,0.0235999426201235 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine1,5,0.0169483992172514,0.00763177748647143,0.0394713094204116,0.0169483992172514 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine2,5,0.00795847797282249,0.00586737831955678,0.0114510177640358,0.01169621704846 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine3,5,0.00795847797282249,0.00586737831955678,0.0114510177640358,0.01169621704846 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine4,5,0.00795847797282249,0.00586737831955678,0.0114510177640358,0.01169621704846 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduousR,5,0.0399505806676464,0.0143942373084423,0.0449125142906171,0.0399505806676464 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous1,5,0.263960498353553,0.14104175796268,0.28366431295036,0.273903518006007 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous2,5,0.167607252553558,0.0580233169731123,0.21415305111116,0.167607252553558 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous3,5,0.167607252553558,0.0580233169731123,0.21415305111116,0.167607252553558 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous4,5,0.167607252553558,0.0580233169731123,0.21415305111116,0.167607252553558 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwoodR,5,0.0399505806676464,0.0143942373084423,0.0449125142906171,0.0399505806676464 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood1,5,0.263960498353553,0.14104175796268,0.28366431295036,0.273903518006007 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood2,5,0.167607252553558,0.0580233169731123,0.21415305111116,0.167607252553558 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood3,5,0.167607252553558,0.0580233169731123,0.21415305111116,0.167607252553558 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood4,5,0.167607252553558,0.0580233169731123,0.21415305111116,0.167607252553558 -vascular_plant,vascular_plant,north,,,Vicia.americana,EnSeismic,5,0.0198087913155123,0.0137143044386733,0.0267285704598637,0.02763145629096 -vascular_plant,vascular_plant,north,,,Vicia.americana,EnSoftLin,5,0.0397873802617532,0.0255526660413561,0.065088548692643,0.0815293962612943 -vascular_plant,vascular_plant,north,,,Vicia.americana,TrSoftLin,5,0.00853001872645728,0.00656358681976996,0.011404689546475,0.00853001872645728 -vascular_plant,vascular_plant,north,,,Vicia.americana,HardLin,5,0.0473141635621907,0.0296525411207059,0.0506332189977675,0.0526208550143497 -vascular_plant,vascular_plant,north,,,Vicia.americana,UrbInd,5,0.0392208289832895,0.0199646342228563,0.046958483304894,0.0392208289832895 -vascular_plant,vascular_plant,north,,,Vicia.americana,Wellsites,5,0.0110373214773055,0.00600630982870938,0.0134808365269019,0.010004427955462 -vascular_plant,vascular_plant,north,,,Vicia.americana,Crop,5,0.0171174183070504,0.0122282619634417,0.0285591627305329,0.0297712277168652 -vascular_plant,vascular_plant,north,,,Vicia.americana,TameP,5,0.0196881354547364,0.0158885693958968,0.0240025384044252,0.0196881354547364 -vascular_plant,vascular_plant,north,,,Vicia.americana,RoughP,5,0.0158934541199885,0.0108164693184258,0.0212560074572336,0.0170997216332836 -vascular_plant,vascular_plant,south,,,Galium.boreale,Loamy,5,0.443747979001273,0.22324014345375,0.663184537388927,0.443747979001273 -vascular_plant,vascular_plant,south,,,Galium.boreale,SandyLoam,5,0.0820142267647028,0.0109074954934366,0.0996570846589912,0.100045817887078 -vascular_plant,vascular_plant,south,,,Galium.boreale,ClaySub,5,0.0229195713358895,0.00591495745643993,0.0501050159870325,0.0307985638018622 -vascular_plant,vascular_plant,south,,,Galium.boreale,RapidDrain,5,0.370258218694941,0.166801923515199,0.733450823538383,0.622987009404475 -vascular_plant,vascular_plant,south,,,Galium.boreale,Blowout,5,0.352366294752384,0.0723016284843112,0.516486411216731,0.352366294752384 -vascular_plant,vascular_plant,south,,,Galium.boreale,ThinBreak,5,0.129261622662098,0.0776300469649367,0.196859424086492,0.226154821372081 -vascular_plant,vascular_plant,south,,,Galium.boreale,Other,5,0.113661854698142,0.0455033200168779,0.177374152876428,0.144583233388928 -vascular_plant,vascular_plant,south,,,Galium.boreale,EnSeismic,5,0.175883563378513,0.108802056347556,0.468529834203972,0.175883563378513 -vascular_plant,vascular_plant,south,,,Galium.boreale,EnSoftLin,5,0.156233353525968,0.047708351232081,0.23663076662717,0.156233353525968 -vascular_plant,vascular_plant,south,,,Galium.boreale,TrSoftLin,5,0.14837124090763,0.0821346557706723,0.19837425048036,0.194616817162544 -vascular_plant,vascular_plant,south,,,Galium.boreale,HardLin,5,0.242133694821736,0.0867761461404134,0.349274168503963,0.242133694821736 -vascular_plant,vascular_plant,south,,,Galium.boreale,UrbInd,5,0.328736531619323,0.0949492115815193,0.393059499739328,0.205104426419453 -vascular_plant,vascular_plant,south,,,Galium.boreale,Wellsites,5,0.810910668167771,0.41548179665116,0.880124470060476,0.647891869536858 -vascular_plant,vascular_plant,south,,,Galium.boreale,Crop,5,0.0366764990739023,0.00640310017939445,0.0638612606634286,0.0731673082567089 -vascular_plant,vascular_plant,south,,,Galium.boreale,TameP,5,0.0818692355535502,0.0331745410028261,0.102600019362093,0.0961447421899536 -vascular_plant,vascular_plant,south,,,Galium.boreale,RoughP,5,0.227738111578725,0.0431090309174861,0.253048576068725,0.227738111578725 -vascular_plant,vascular_plant,south,,,Vicia.americana,Loamy,5,0.738481461548948,0.465938105000844,0.787684315008132,0.797006368028765 -vascular_plant,vascular_plant,south,,,Vicia.americana,SandyLoam,5,0.429591660006352,0.18559523887094,0.635761340775386,0.600153638546782 -vascular_plant,vascular_plant,south,,,Vicia.americana,ClaySub,5,0.918818814249119,0.750951128555063,0.931854331664212,0.939800764723441 -vascular_plant,vascular_plant,south,,,Vicia.americana,RapidDrain,5,0.222936238536632,0.0770902648886913,0.366497963732066,0.441178433676612 -vascular_plant,vascular_plant,south,,,Vicia.americana,Blowout,5,0.0815559302647169,0.0593766906632077,0.333040559882829,0.413948315650876 -vascular_plant,vascular_plant,south,,,Vicia.americana,ThinBreak,5,0.794217592690998,0.625082173044825,0.920046117675071,0.939805391146715 -vascular_plant,vascular_plant,south,,,Vicia.americana,Other,5,0.155124149658055,0.0754988315158589,0.199790015740101,0.227541198415253 -vascular_plant,vascular_plant,south,,,Vicia.americana,EnSeismic,5,0.164253089427457,0.117698993828618,0.382807659861464,0.449818210083466 -vascular_plant,vascular_plant,south,,,Vicia.americana,EnSoftLin,5,0.114939317241677,0.041519411445619,0.21671085302802,0.282198362913929 -vascular_plant,vascular_plant,south,,,Vicia.americana,TrSoftLin,5,0.0298012477178091,0.0131757224979755,0.0429766136343858,0.0512401981810537 -vascular_plant,vascular_plant,south,,,Vicia.americana,HardLin,5,0.0377380912768181,0.0198388165158529,0.0719421996838765,0.0924126958339971 -vascular_plant,vascular_plant,south,,,Vicia.americana,UrbInd,5,0.0351612539447746,0.0164481806973647,0.0568001950386329,0.044785012783358 -vascular_plant,vascular_plant,south,,,Vicia.americana,Wellsites,5,0.109234670448604,0.0544725102291996,0.291850133407204,0.119765505914902 -vascular_plant,vascular_plant,south,,,Vicia.americana,Crop,5,0.015112697453394,0.00730492926166426,0.0188084951029659,0.0192844172387284 -vascular_plant,vascular_plant,south,,,Vicia.americana,TameP,5,0.0211217114282728,0.0112458799686589,0.0276865189202504,0.0293888277575648 -vascular_plant,vascular_plant,south,,,Vicia.americana,RoughP,5,0.0146158898601415,0.00859205349308942,0.0193513848626824,0.0211335108101242 diff --git a/3_output/exp_001_xgboost/tables/metric_summary.csv b/3_output/exp_001_xgboost/tables/metric_summary.csv deleted file mode 100644 index adead70..0000000 --- a/3_output/exp_001_xgboost/tables/metric_summary.csv +++ /dev/null @@ -1,393 +0,0 @@ -taxon,run,region,season,part,species,metric,n,median,p10,p90,boot1,mean,sd -bird,bird,north,,,AMRO,insample_auc,5,0.766348577070303,0.763700356126714,0.768315898990854,0.762075690451976,0.766175199526612,0.00254722811633338 -bird,bird,north,,,AMRO,insample_deviance_explained,5,0.223649525313419,0.219921210061377,0.22564724323019,0.218095813759875,0.223086556643362,0.00308542505004281 -bird,bird,north,,,AMRO,insample_rmse,5,0.63337366081926,0.631145480051182,0.635084665392635,0.635690863352491,0.633190592460684,0.0020130445355889 -bird,bird,north,,,AMRO,insample_spearman,5,0.408954906297264,0.404743989209146,0.411429566475061,0.402069874406224,0.408455072973783,0.00381974703070294 -bird,bird,north,,,AMRO,insample_calibration_slope,5,1.1153205195924,1.1130748221597,1.12795873657376,1.1153205195924,1.11948223039207,0.00775700680593854 -bird,bird,north,,,AMRO,insample_prevalence,5,0.251486631016043,0.251004373826971,0.252433263182893,0.250861017819325,0.251649276245993,0.000745639638422784 -bird,bird,north,,,AMRO,insample_n,5,46747,46745.2,46750,46747,46747.6,2.50998007960223 -bird,bird,north,,,AMRO,oob_auc,5,0.757169735025858,0.7567208960586,0.758360477695037,0.758545558629657,0.757451103732046,0.000825064173131252 -bird,bird,north,,,AMRO,oob_deviance_explained,5,0.20956522267587,0.208916365110153,0.210443533595982,0.210794220720189,0.209622146425454,0.000784062001221159 -bird,bird,north,,,AMRO,oob_rmse,5,0.638640769153233,0.638509194496622,0.639423218313425,0.638640769153233,0.63888750244258,0.000480707820884263 -bird,bird,north,,,AMRO,oob_spearman,5,0.388450222044055,0.388112299338068,0.390402406635382,0.390637560338498,0.389076496475794,0.0011833856505583 -bird,bird,north,,,AMRO,oob_calibration_slope,5,1.05529415989891,1.03309824845438,1.06090649249454,1.06260320652297,1.0485052816654,0.0142706985184561 -bird,bird,north,,,AMRO,oob_prevalence,5,0.241010939026539,0.240656718532255,0.241191818078906,0.241245385459292,0.240950250724789,0.000279167052473422 -bird,bird,north,,,AMRO,oob_n,5,124877,124874,124878.8,124877,124876.4,2.50998007960223 -bird,bird,north,,,YEWA,insample_auc,5,0.831269033983197,0.830197469982878,0.832670684752953,0.829880554122733,0.831417003547777,0.00122095544465026 -bird,bird,north,,,YEWA,insample_deviance_explained,5,0.362785798849313,0.358628754597728,0.365507620885259,0.356844491370585,0.362278132955092,0.00360721414204665 -bird,bird,north,,,YEWA,insample_rmse,5,0.489935020236126,0.486187534116785,0.492535220734052,0.493541145061961,0.489544473086814,0.00333413844516582 -bird,bird,north,,,YEWA,insample_spearman,5,0.374740584480801,0.37219091990059,0.375964291451757,0.372133456018564,0.374136493145862,0.00194393482783569 -bird,bird,north,,,YEWA,insample_calibration_slope,5,0.94807211278347,0.946347346595061,0.954801256829046,0.947027541911327,0.949912320030563,0.00445690413325451 -bird,bird,north,,,YEWA,insample_prevalence,5,0.118296361263824,0.117706951871658,0.119214980837802,0.118296361263824,0.118418937588893,0.00074585019883292 -bird,bird,north,,,YEWA,insample_n,5,46747,46745.2,46750,46747,46747.6,2.50998007960223 -bird,bird,north,,,YEWA,oob_auc,5,0.781528156999816,0.781272864959273,0.783424264698686,0.783077482966789,0.782174096589881,0.00111693062082886 -bird,bird,north,,,YEWA,oob_deviance_explained,5,0.262490453869982,0.261130919027361,0.263922866493182,0.262490453869982,0.262527422178337,0.0013700956191398 -bird,bird,north,,,YEWA,oob_rmse,5,0.54231732578611,0.542056019435769,0.543525748102,0.541941968046052,0.542650465320291,0.000849208203709833 -bird,bird,north,,,YEWA,oob_spearman,5,0.33713114349731,0.336545952815328,0.338597120301502,0.338525553308721,0.337480553525589,0.00103685806503907 -bird,bird,north,,,YEWA,oob_calibration_slope,5,0.906590673344268,0.894480764741939,0.929954892797354,0.906590673344268,0.910244692404546,0.021143884010558 -bird,bird,north,,,YEWA,oob_prevalence,5,0.13458843502006,0.134244406707603,0.134809487963868,0.13458843502006,0.134542639141448,0.000279456693593184 -bird,bird,north,,,YEWA,oob_n,5,124877,124874,124878.8,124877,124876.4,2.50998007960223 -bird,bird,south,,,AMRO,insample_auc,5,0.762775612735809,0.754318113390042,0.764632493895319,0.751014106613257,0.760368337276432,0.00569628121482347 -bird,bird,south,,,AMRO,insample_deviance_explained,5,0.204459328717014,0.192512123015121,0.206330477398256,0.188178656802463,0.200767259193672,0.00766046525099654 -bird,bird,south,,,AMRO,insample_rmse,5,0.702660371405344,0.70089916207229,0.710701436680476,0.712606323131588,0.705076454440276,0.00510032253834029 -bird,bird,south,,,AMRO,insample_spearman,5,0.403528962075037,0.390565937539463,0.406417343825927,0.384637823518389,0.399961772514838,0.00905888881779309 -bird,bird,south,,,AMRO,insample_calibration_slope,5,1.23044997339321,1.22282721103293,1.24729584962799,1.23044997339321,1.23308304786014,0.0145045858843931 -bird,bird,south,,,AMRO,insample_prevalence,5,0.258280375405076,0.256689533268802,0.259336584790035,0.256218172635832,0.2580593533773,0.00136065688529854 -bird,bird,south,,,AMRO,insample_n,5,23761,23761,23761.6,23761,23761.2,0.447213595499958 -bird,bird,south,,,AMRO,oob_auc,5,0.732269987568019,0.730721550555738,0.732754123767481,0.729836682499663,0.731931251175247,0.00121020621312217 -bird,bird,south,,,AMRO,oob_deviance_explained,5,0.161915134215393,0.158235572973872,0.163530682453132,0.156757861298744,0.161201781565542,0.00279506875317982 -bird,bird,south,,,AMRO,oob_rmse,5,0.714494699421899,0.714054695958152,0.716311740373661,0.715479709938808,0.71501184512683,0.00119413913770245 -bird,bird,south,,,AMRO,oob_spearman,5,0.358375103938654,0.355534940038285,0.35876466560778,0.354241476771466,0.357512256536856,0.00190247702541528 -bird,bird,south,,,AMRO,oob_calibration_slope,5,1.07296909181061,1.06254836796723,1.10520591805053,1.10584756707492,1.0823249491235,0.0219241224896263 -bird,bird,south,,,AMRO,oob_prevalence,5,0.259904818560381,0.259531587266211,0.260466983938132,0.260633551457466,0.259982926292237,0.000480821801997171 -bird,bird,south,,,AMRO,oob_n,5,67240,67239.4,67240,67240,67239.8,0.447213595499958 -bird,bird,south,,,YEWA,insample_auc,5,0.784324137303064,0.781916750599072,0.787145532171862,0.787947644764914,0.784431184727772,0.00259389999747705 -bird,bird,south,,,YEWA,insample_deviance_explained,5,0.329876797075016,0.328438339774838,0.335290101057425,0.331865793831291,0.331241143182001,0.00380729370916509 -bird,bird,south,,,YEWA,insample_rmse,5,0.581103189566076,0.576337395633245,0.586537540365677,0.587695573722515,0.581537232993935,0.00534033030346879 -bird,bird,south,,,YEWA,insample_spearman,5,0.379148853435148,0.376533263859059,0.383361227292727,0.384453738255781,0.379743399962202,0.00340421769301697 -bird,bird,south,,,YEWA,insample_calibration_slope,5,0.959582334626047,0.953370514759589,0.975791134379575,0.953168949085808,0.963353138951076,0.0112938011064301 -bird,bird,south,,,YEWA,insample_prevalence,5,0.17124700138883,0.17077564075586,0.171722441305838,0.171625773326038,0.171262389740443,0.000478416642385765 -bird,bird,south,,,YEWA,insample_n,5,23761,23761,23761.6,23761,23761.2,0.447213595499958 -bird,bird,south,,,YEWA,oob_auc,5,0.75715316573909,0.755274737090388,0.759474560615997,0.759756451617164,0.757356443494712,0.00207183184862858 -bird,bird,south,,,YEWA,oob_deviance_explained,5,0.26388183056408,0.261989644309366,0.266251014725856,0.267606218266052,0.264013568149709,0.0023190174475586 -bird,bird,south,,,YEWA,oob_rmse,5,0.614960587017423,0.614658825241612,0.615685272238021,0.614673190827697,0.615094435474036,0.000571210991059149 -bird,bird,south,,,YEWA,oob_spearman,5,0.346691769470514,0.344801802209752,0.350018007523901,0.350464716028413,0.347288993800835,0.00259100332006461 -bird,bird,south,,,YEWA,oob_calibration_slope,5,0.903851052419204,0.890105584794789,0.941790172875962,0.903851052419204,0.912325516257266,0.0271653508385359 -bird,bird,south,,,YEWA,oob_prevalence,5,0.175758477096966,0.175590501794327,0.1759250446163,0.175624628197501,0.175753050469217,0.000169045533323201 -bird,bird,south,,,YEWA,oob_n,5,67240,67239.4,67240,67240,67239.8,0.447213595499958 -bryophyte,bryophyte,north,,,Bryum.All,insample_auc,5,0.857978394980521,0.789441595321284,0.862002340315989,0.770386041257282,0.833849106613322,0.039993363409929 -bryophyte,bryophyte,north,,,Bryum.All,insample_deviance_explained,5,0.277753589587066,0.174276061218763,0.285917233288483,0.150171305539755,0.241832073345983,0.0601826092444179 -bryophyte,bryophyte,north,,,Bryum.All,insample_rmse,5,0.396962983128559,0.394566617888505,0.431753686208583,0.440271657458748,0.409165419684623,0.0201739192387733 -bryophyte,bryophyte,north,,,Bryum.All,insample_spearman,5,0.607012509877032,0.490640534639994,0.614373721824581,0.458868674189629,0.56624426443727,0.0679688700598316 -bryophyte,bryophyte,north,,,Bryum.All,insample_calibration_slope,5,1.4245913766613,1.40869494981491,1.51992010531084,1.53493777553577,1.45536412326168,0.0575523842665342 -bryophyte,bryophyte,north,,,Bryum.All,insample_prevalence,5,0.398261429491307,0.395579807718977,0.401857219116663,0.400041220115416,0.3986710498744,0.00332558122320578 -bryophyte,bryophyte,north,,,Bryum.All,insample_n,5,3097,3072.4,4153.6,4852,3440.8,789.041633882522 -bryophyte,bryophyte,north,,,Bryum.All,oob_auc,4,0.661130987659494,0.638923688463342,0.676857929526958,,0.658816574327819,0.0206288468695857 -bryophyte,bryophyte,north,,,Bryum.All,oob_deviance_explained,4,0.0379243523192806,0.0159108778019197,0.0619573550481462,,0.038645612394818,0.0247027601699559 -bryophyte,bryophyte,north,,,Bryum.All,oob_rmse,4,0.47494463550282,0.470386508579213,0.482803513595329,,0.476123475205999,0.00689679724576912 -bryophyte,bryophyte,north,,,Bryum.All,oob_spearman,4,0.27425649389822,0.236080539149219,0.300047755903551,,0.269833389346909,0.0349273694526796 -bryophyte,bryophyte,north,,,Bryum.All,oob_calibration_slope,4,0.680499623830858,0.595976329504985,0.836312717046587,,0.705960266291521,0.133637734117107 -bryophyte,bryophyte,north,,,Bryum.All,oob_prevalence,4,0.403358051486104,0.397360409603543,0.408630979157295,,0.403099224982043,0.006528394280969 -bryophyte,bryophyte,north,,,Bryum.All,oob_n,5,1755,698.4,1779.6,0,1411.2,789.041633882522 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_auc,5,0.877353476350821,0.808350804885673,0.881144845827382,0.765269449728448,0.855565019162749,0.0505882232424503 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_deviance_explained,5,0.335202314978185,0.22005463412144,0.337278935477427,0.154994400826678,0.296356528350255,0.0794499634478956 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_rmse,5,0.382972355673557,0.381115957852404,0.421773533165065,0.444072388004376,0.395529307090753,0.0272957639736505 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_spearman,5,0.650062831983975,0.530125438076014,0.654898954519372,0.456256931473654,0.611364733022137,0.0868932147958527 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_calibration_slope,5,1.30855599837992,1.28741341599077,1.34136570958624,1.33142004866925,1.3134962112755,0.0270983258770983 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_prevalence,5,0.441055234954658,0.434155026365629,0.445516968426104,0.441055234954658,0.440040906513639,0.00592042164227121 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_n,5,3068,3031.6,4152,4852,3417.8,802.273768734838 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_auc,4,0.701509398537735,0.696419735900355,0.721689089089356,,0.706898694221393,0.0151500138203321 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_deviance_explained,4,0.0693096895023192,0.0631859433764816,0.100638076296884,,0.0783113468840075,0.023218031297801 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_rmse,4,0.470218880629275,0.461220182764623,0.470437998987226,,0.467083316519739,0.00645857476263672 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_spearman,4,0.347133189487122,0.337090894864666,0.38204017877062,,0.356013437580351,0.0265592480794306 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_calibration_slope,4,0.73421775592656,0.714474560046534,0.823486386111286,,0.759048268178239,0.0667805767017605 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_prevalence,4,0.443665764352131,0.432608384046217,0.454192825112108,,0.443476364514296,0.0116999631210214 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_n,5,1784,700,1820.4,0,1434.2,802.273768734838 -bryophyte,bryophyte,south,,,Bryum.All,insample_auc,5,0.89700099758916,0.830711573289628,0.910583315412943,0.792790433094654,0.879641404689057,0.0495043333856412 -bryophyte,bryophyte,south,,,Bryum.All,insample_deviance_explained,5,0.377655981115873,0.247406526226596,0.404743264740333,0.178811163710994,0.343250476284121,0.0946524378393646 -bryophyte,bryophyte,south,,,Bryum.All,insample_rmse,5,0.358870671443606,0.350035097829807,0.403119952542412,0.425550790707136,0.370868903169041,0.0315839279368021 -bryophyte,bryophyte,south,,,Bryum.All,insample_spearman,5,0.661091540895497,0.553374315450635,0.687008599929479,0.489841722503616,0.634634700662896,0.0826189775775944 -bryophyte,bryophyte,south,,,Bryum.All,insample_calibration_slope,5,1.28899602895042,1.25394354981498,1.40051287186428,1.46714141245107,1.31382916688235,0.0883089450798419 -bryophyte,bryophyte,south,,,Bryum.All,insample_prevalence,5,0.370562770562771,0.365528360602252,0.371569237798783,0.370562770562771,0.369235286484943,0.00385091464779508 -bryophyte,bryophyte,south,,,Bryum.All,insample_n,5,1444,1429.8,1968,2310,1614.6,388.936113005722 -bryophyte,bryophyte,south,,,Bryum.All,oob_auc,4,0.729153630388279,0.717038216749336,0.738405404780561,,0.7281309020859,0.0118120824533377 -bryophyte,bryophyte,south,,,Bryum.All,oob_deviance_explained,4,0.0893992482388517,0.0741532065122787,0.10478416162106,,0.0894488452587214,0.0164881787289122 -bryophyte,bryophyte,south,,,Bryum.All,oob_rmse,4,0.45270894853103,0.447594389935665,0.456197936921665,,0.452128387743626,0.00466211333102415 -bryophyte,bryophyte,south,,,Bryum.All,oob_spearman,4,0.384817563231245,0.363002467013743,0.399340489385828,,0.382213216780202,0.0199979335893137 -bryophyte,bryophyte,south,,,Bryum.All,oob_calibration_slope,4,0.732586352255061,0.703030392929968,0.768205721614973,,0.734751855838925,0.035029147876037 -bryophyte,bryophyte,south,,,Bryum.All,oob_prevalence,4,0.3703593055487,0.368749240306309,0.380219211352906,,0.37330567717792,0.0072755089177001 -bryophyte,bryophyte,south,,,Bryum.All,oob_n,5,866,342,880.2,0,695.4,388.936113005722 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_auc,5,0.915930107869368,0.891450561408518,0.926616194880262,0.888769191549551,0.910563618073768,0.0175538594313058 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_deviance_explained,5,0.412167233201754,0.351595800157622,0.457676433567111,0.342125264548208,0.406574161265852,0.0521852688538256 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_rmse,5,0.31185704715981,0.302050212888687,0.335098143875397,0.337158290865724,0.317322814726973,0.0164987120276871 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_spearman,5,0.604912315123774,0.580646267790716,0.63300293475881,0.575027343164341,0.606752043957667,0.0257635263446129 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_calibration_slope,5,1.2449893208821,1.20370652866252,1.27907027094689,1.28779177380718,1.24256491782013,0.0376739028731244 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_prevalence,5,0.23982683982684,0.231460603487586,0.246697056850865,0.23982683982684,0.239405392468179,0.00765174673579537 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_n,5,1462,1452.8,1977.6,2310,1631.4,379.498089586759 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_auc,4,0.778934840029295,0.767110225050101,0.781925832419594,,0.775779974818975,0.00937400446814031 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_deviance_explained,4,0.139570100700392,0.122996632435766,0.14013282475148,,0.133851977766986,0.0119232441695895 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_rmse,4,0.394235086578714,0.387216209322419,0.403091112711108,,0.394891211177321,0.00854423131376846 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_spearman,4,0.413549176035088,0.389196791933615,0.423360661173376,,0.40835599783395,0.0192762865394097 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_calibration_slope,4,0.76135590726747,0.709567218680568,0.807541434617375,,0.759354778254257,0.053504059631391 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_prevalence,4,0.238999572635154,0.227667581639544,0.255610993801512,,0.240885083410421,0.0151422609821477 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_n,5,848,332.4,857.2,0,678.6,379.498089586759 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_auc,5,0.90306703394132,0.861997623718975,0.909557282195037,0.835898082239764,0.891712298377204,0.0314327410006322 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_deviance_explained,5,0.399124479978233,0.320410663610957,0.418533795825594,0.268343143859901,0.380123815408677,0.0633143696783399 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_rmse,5,0.358571779595024,0.351826731925259,0.386653697118476,0.404727052714958,0.365433686719157,0.0222689437439916 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_spearman,5,0.679546301965036,0.610737579343904,0.689581990790728,0.566138044181707,0.660294538542617,0.0529300524562874 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_calibration_slope,5,1.18819148495281,1.1782769636349,1.19894709412132,1.17381324555617,1.18865014779103,0.0105675641916 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_prevalence,5,0.384787472035794,0.382719077877937,0.387875670039505,0.384787472035794,0.385092893007771,0.00278105998275642 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_n,5,3685,3644,4976.6,5811,4102.6,955.610956404331 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_auc,4,0.786530164742749,0.775104142499333,0.793970495225298,,0.785106703399582,0.0103525019457257 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_deviance_explained,4,0.192181255170203,0.164125577530809,0.204218212230172,,0.186460283534694,0.0234630390585414 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_rmse,4,0.428721348032908,0.423627322126028,0.43519546452647,,0.429214237528152,0.00632451459924355 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_spearman,4,0.483023934210276,0.464515993000355,0.49390236749782,,0.480299109952284,0.0162196315614818 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_calibration_slope,4,0.850136104236858,0.81870198401027,0.874227719255483,,0.8475137809483,0.0320059584079878 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_prevalence,4,0.385212683681362,0.378550429000763,0.388624647224836,,0.384051865418103,0.00565743785692542 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_n,5,2126,834.4,2167,0,1708.4,955.610956404331 -lichen,lichen,north,,,Physcia.adscendens,insample_auc,5,0.939777654098532,0.911080186533162,0.942242224187428,0.896074560283454,0.93073247520305,0.0196909817596669 -lichen,lichen,north,,,Physcia.adscendens,insample_deviance_explained,5,0.524609389797858,0.443975455970509,0.5346412625903,0.402358655211678,0.500330134941044,0.055954457939386 -lichen,lichen,north,,,Physcia.adscendens,insample_rmse,5,0.308771692546898,0.30423782561,0.338062134707957,0.353013016928338,0.317256850747619,0.0205181147730102 -lichen,lichen,north,,,Physcia.adscendens,insample_spearman,5,0.742718666256435,0.692391957474749,0.743240431256618,0.667337063054066,0.72528846187005,0.0328872274819537 -lichen,lichen,north,,,Physcia.adscendens,insample_calibration_slope,5,1.1257380343136,1.10422828486673,1.13249656335067,1.09325260996237,1.1209310878181,0.0162505556942861 -lichen,lichen,north,,,Physcia.adscendens,insample_prevalence,5,0.382961350027218,0.378754207234193,0.387054085275807,0.384099122354156,0.382969715660275,0.00456567123234541 -lichen,lichen,north,,,Physcia.adscendens,insample_n,5,3699,3673.4,4975,5811,4115.6,947.965083745177 -lichen,lichen,north,,,Physcia.adscendens,oob_auc,4,0.866926360790323,0.862087917989515,0.874242804714464,,0.867811361191514,0.00712797521374287 -lichen,lichen,north,,,Physcia.adscendens,oob_deviance_explained,4,0.333680010118101,0.316008230418285,0.352686602796521,,0.334156729039031,0.0212707418234594 -lichen,lichen,north,,,Physcia.adscendens,oob_rmse,4,0.376432045366574,0.370761125805094,0.383732665571178,,0.377014081310547,0.00744870745917702 -lichen,lichen,north,,,Physcia.adscendens,oob_spearman,4,0.617272651778561,0.612085256678639,0.631117628869793,,0.620364645346886,0.0112058746439612 -lichen,lichen,north,,,Physcia.adscendens,oob_calibration_slope,4,0.947435614255118,0.9231511407045,0.962650618873475,,0.944196518207882,0.0215162468730037 -lichen,lichen,north,,,Physcia.adscendens,oob_prevalence,4,0.386432660247333,0.378648004672367,0.394703317951312,,0.386606232436266,0.00923888826136022 -lichen,lichen,north,,,Physcia.adscendens,oob_n,5,2112,836,2137.6,0,1695.4,947.965083745177 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_auc,5,0.969467791929505,0.94554259858816,0.977697753981227,0.934063944264331,0.964247428354548,0.0179780768132266 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_deviance_explained,5,0.569918413361741,0.460986605212442,0.624443753156406,0.406902937508697,0.552676585965894,0.0888523179578358 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_rmse,5,0.194858569015368,0.186240789476017,0.219969408227671,0.235975729845345,0.200013744460052,0.0206276146478214 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_spearman,5,0.458459566623043,0.440231015330974,0.481507104444283,0.436551106027585,0.460260609424667,0.0203295151651974 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_calibration_slope,5,1.23659645456016,1.19091239599295,1.31739443903872,1.33649314585924,1.24884684874142,0.0633927191699459 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_prevalence,5,0.0907849829351536,0.0854880550520455,0.0942546707117982,0.092924126172208,0.0900691492139895,0.00433337917377339 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_n,5,1482,1471.8,2004.4,2346,1653.4,387.296785424305 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_auc,4,0.841927401594458,0.814122619755631,0.854197072499783,,0.836379147689636,0.024105517017398 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_deviance_explained,4,0.137342313520227,0.0661302770659705,0.187683972414293,,0.12988860724873,0.0684761944605061 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_rmse,4,0.275915264527875,0.266252355330623,0.296587208395246,,0.279847062624346,0.0174783529300131 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_spearman,4,0.34360769801821,0.328454264305382,0.369875964894448,,0.347577281290856,0.0229776654519093 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_calibration_slope,4,0.732042066814184,0.625950490739272,0.800036589986221,,0.718435976491729,0.0955023022395362 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_prevalence,4,0.0997452652709462,0.0913286406440493,0.106312613843352,,0.0990848095371992,0.00808662138066247 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_n,5,864,341.6,874.2,0,692.6,387.296785424305 -lichen,lichen,south,,,Physcia.adscendens,insample_auc,5,0.967738582022316,0.955991989343995,0.979668441592445,0.949810964083176,0.968389525053055,0.0123060398982728 -lichen,lichen,south,,,Physcia.adscendens,insample_deviance_explained,5,0.614974064767116,0.562969523073021,0.683603603317859,0.534078102964625,0.623658261830829,0.0618729329174631 -lichen,lichen,south,,,Physcia.adscendens,insample_rmse,5,0.239104213258494,0.216295272601257,0.260766980353619,0.269598106245282,0.238210757209883,0.0223621600742667 -lichen,lichen,south,,,Physcia.adscendens,insample_spearman,5,0.66794563892556,0.647190372818858,0.68339353507428,0.640882056423092,0.666449148918677,0.0182028349104463 -lichen,lichen,south,,,Physcia.adscendens,insample_calibration_slope,5,1.14599263984303,1.12914707852375,1.17184091306446,1.17634966452876,1.14927333505347,0.0211132386903304 -lichen,lichen,south,,,Physcia.adscendens,insample_prevalence,5,0.215686274509804,0.210370852380551,0.218705697782215,0.215686274509804,0.214933253293698,0.00478783760132252 -lichen,lichen,south,,,Physcia.adscendens,insample_n,5,1487,1480.8,2014,2346,1662.2,382.531305908418 -lichen,lichen,south,,,Physcia.adscendens,oob_auc,4,0.877853932002758,0.871763267932113,0.889309444773546,,0.879769949395666,0.00974015043776396 -lichen,lichen,south,,,Physcia.adscendens,oob_deviance_explained,4,0.316316590491307,0.311756042720643,0.355547751180148,,0.328698952247799,0.0283418155389015 -lichen,lichen,south,,,Physcia.adscendens,oob_rmse,4,0.330376682745035,0.325822954573174,0.333444027464085,,0.329845831511888,0.00421874459836274 -lichen,lichen,south,,,Physcia.adscendens,oob_spearman,4,0.538191345296531,0.524384704662879,0.564193784036703,,0.542546987477431,0.0223459671186621 -lichen,lichen,south,,,Physcia.adscendens,oob_calibration_slope,4,0.846032356353984,0.837628073355304,0.960556271283099,,0.883932224900568,0.0838634539702572 -lichen,lichen,south,,,Physcia.adscendens,oob_prevalence,4,0.21549434057534,0.209833885194357,0.226186106799465,,0.217291237305033,0.00944381193189753 -lichen,lichen,south,,,Physcia.adscendens,oob_n,5,859,332,865.2,0,683.8,382.531305908418 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_auc,5,0.910259509993553,0.88184625831704,0.927323656339855,0.868976601251561,0.906614907844463,0.0239073515247792 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_deviance_explained,5,0.474054081510562,0.397465015912776,0.518806225879973,0.367300741000527,0.463059906888393,0.0627252807992666 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_rmse,5,0.279240404239482,0.266278890821292,0.299152882460238,0.306532346072908,0.281638937849815,0.0167730913263048 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_spearman,5,0.592488935231076,0.549408359447422,0.612464608794839,0.528970499717187,0.584899714288157,0.0341708931515595 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_calibration_slope,5,1.1096324235522,1.09278078311067,1.1651956006726,1.09094115862962,1.12432406177859,0.0367784942507134 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_prevalence,5,0.22526523562793,0.222685585610422,0.228865718677616,0.22526523562793,0.225662811559798,0.00324773944134521 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_n,5,2588,2554.4,3469,4053,2869.4,661.914873680899 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_auc,4,0.810775166178672,0.803982488513029,0.826090126241556,,0.813818838463401,0.0124788110797789 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_deviance_explained,4,0.23228521248351,0.180873753043444,0.273935574205886,,0.228799106155764,0.0512988461352543 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_rmse,4,0.338978661380412,0.327126349680501,0.34707661072446,,0.33763781768189,0.0108248882200281 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_spearman,4,0.444636622931266,0.436958872940447,0.461267326785242,,0.447834106453822,0.013934094500744 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_calibration_slope,4,0.83010997880233,0.791089834099164,0.88916212979261,,0.837264266762014,0.054432980284402 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_prevalence,4,0.224511499051979,0.218291264544164,0.230417458254175,,0.224399257871401,0.00661456979352361 -mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_n,5,1465,584,1498.6,0,1183.6,661.914873680899 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_auc,5,0.815633497591343,0.721189628035643,0.828332208671413,0.668807488521141,0.787711275688621,0.067536624871792 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_deviance_explained,5,0.238275334859115,0.126908709674348,0.260521041508318,0.0667954919785909,0.208039416419961,0.0810195458115548 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_rmse,5,0.384000496355334,0.378423641101907,0.41600865879306,0.431921753845721,0.393204089908283,0.0223887514677771 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_spearman,5,0.498852144154782,0.345568644186856,0.520529344561138,0.25845081116616,0.454381229088058,0.111055272007196 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_calibration_slope,5,1.36137376941337,1.27983032191041,1.42098778577656,1.44751799028067,1.35332778347014,0.0737287256264133 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_prevalence,5,0.320047355958958,0.317847829087179,0.320941159211816,0.321243523316062,0.319582666739872,0.00164288413830535 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_n,5,2587,2537.6,3467,4053,2861,666.806193732482 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_auc,4,0.6430697816434,0.630906200950248,0.649625626909458,,0.641067018990866,0.010310861320791 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_deviance_explained,4,0.0262867696883457,0.0154825574462112,0.0342505563817664,,0.0252723319923765,0.010233949415076 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_rmse,4,0.442911169744624,0.442021211050866,0.443933207262469,,0.442958340753226,0.00104701909021943 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_spearman,4,0.221458654928667,0.2040692598032,0.235694665770445,,0.220332446255921,0.0170081685633331 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_calibration_slope,4,0.602069322844031,0.564735288528114,0.622112810319293,,0.595894127543797,0.0315831069336963 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_prevalence,4,0.324076824388238,0.322733281306541,0.3276244709432,,0.324864004200118,0.00280085582083958 -mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_n,5,1466,586,1515.4,0,1192,666.806193732482 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_auc,5,0.893732347566041,0.784712258283139,0.915208827028804,0.736208619664332,0.863009641751231,0.0746875300132786 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_deviance_explained,5,0.288640059052714,0.140093240656905,0.320548100445375,0.0743048901222631,0.247959089596049,0.102607765786842 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_rmse,5,0.333900220383005,0.317749180293818,0.383417922752713,0.405302941526172,0.345370244647289,0.0361318946431007 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_spearman,5,0.571583737398404,0.411885511925985,0.586700623973269,0.331591042359753,0.521138376032511,0.108291171995442 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_calibration_slope,5,1.38126210571742,1.34808749223702,1.81250896737235,2.05704525126745,1.51660995162389,0.304695831730118 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_prevalence,5,0.691079812206573,0.689952548788955,0.71053806886065,0.691079812206573,0.698355803841802,0.0110051698108056 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_n,5,675,672.2,911.8,1065,753.4,174.236333753899 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_auc,4,0.599155058694649,0.596640158751869,0.614306341370811,,0.603668052528,0.0115168786725371 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_deviance_explained,4,-0.0370587964047042,-0.0605832246261204,-0.0245150887544077,,-0.0409804823229612,0.0208683797262976 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_rmse,4,0.448706414900468,0.442629385507453,0.454186465337138,,0.448493208130345,0.00620365405907811 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_spearman,4,0.138143954163894,0.110598773460574,0.160775449559523,,0.136389066554005,0.0270427321288871 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_calibration_slope,4,0.40460328401589,0.36347981172972,0.448588280626499,,0.405625256988904,0.0456382008603107 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_prevalence,4,0.675933879994794,0.656439043984736,0.693034260713775,,0.675078717390838,0.0207397429628256 -mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_n,5,390,153.2,392.8,0,311.6,174.236333753899 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_auc,5,0.955721341227574,0.941876493093078,0.980032921905824,0.936824600234356,0.960333658578674,0.019071016719919 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_deviance_explained,5,0.590027313558758,0.533806219497194,0.710729335676534,0.514510257414488,0.617189401003254,0.0884901405549281 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_rmse,5,0.246971011361295,0.214055070645962,0.264989100024242,0.269467710928516,0.24131828889772,0.0253849061577766 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_spearman,5,0.603646123486099,0.588336675539944,0.652760004611676,0.581351058648935,0.617127581876953,0.0325981050536584 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_calibration_slope,5,1.2295157959797,1.19324993534435,1.3802153698801,1.30017294621111,1.27215507749944,0.101181183538218 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_prevalence,5,0.182159624413146,0.181333087877553,0.193172072927236,0.182159624413146,0.185526823886116,0.00827314119136472 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_n,5,678,670.6,913,1065,754,173.956891211587 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_auc,4,0.767962549603175,0.755975920442971,0.821622889366791,,0.782846017675822,0.0418546319891171 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_deviance_explained,4,0.0714822186053786,-0.0408681350873901,0.239998128339478,,0.0915413457629968,0.153310238574512 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_rmse,4,0.333524894690421,0.326889079075606,0.355111722424891,,0.338864541876012,0.0163868090297704 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_spearman,4,0.347277591152696,0.331346872505113,0.429118025438348,,0.370816775309149,0.0600617037029071 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_calibration_slope,4,0.729368252930069,0.625528438246681,0.958413753873108,,0.774084569451373,0.185881843676153 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_prevalence,4,0.182520739834082,0.160534290271133,0.183610188261351,,0.175057525142768,0.01572313523028 -mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_n,5,387,152,394.4,0,311,173.956891211587 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_auc,5,0.912606117200804,0.887624451084413,0.922392100045844,0.877681659131004,0.907024878896229,0.0186316149532348 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_deviance_explained,5,0.468210108853301,0.398702138746091,0.489870224764755,0.373322015940387,0.450305865358353,0.0489827129347062 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_rmse,5,0.265946665799294,0.260868953533259,0.281028935482682,0.28590578738551,0.269716805570368,0.0105769766239431 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_spearman,5,0.568117860487893,0.532806515898693,0.582476079874812,0.517677298316643,0.560719708806051,0.0267266918153412 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_calibration_slope,5,1.06149717888556,1.04183233055343,1.10090907426819,1.06149717888556,1.06947496461794,0.02964021273979 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_prevalence,5,0.201509433962264,0.199761756423448,0.205640478898507,0.201356917858008,0.202439531288226,0.00307554695366447 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_n,5,2612,2595.8,3536.2,4127,2916.2,677.217616427689 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_auc,4,0.843380569862941,0.837264834970835,0.851139799429576,,0.843967532246701,0.00747995581420451 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_deviance_explained,4,0.287525394106671,0.27683097448843,0.306244010733274,,0.290391178752514,0.0163487773504522 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_rmse,4,0.30275636744994,0.297539076408971,0.303950765212066,,0.301319619850353,0.00388325710673683 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_spearman,4,0.467479525844878,0.461993330581785,0.476762620645052,,0.468835561393836,0.00807813369857433 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_calibration_slope,4,0.844669813159302,0.797732278853807,0.883708251200886,,0.841848707350762,0.0463644691760651 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_prevalence,4,0.199234448913847,0.193549889929862,0.204483398915383,,0.199078874277258,0.00592784350128194 -mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_n,5,1515,590.8,1531.2,0,1210.8,677.217616427689 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_auc,5,0.871507556296411,0.824099979512551,0.892912374558421,0.809771013388151,0.862111817148584,0.0350919075671117 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_deviance_explained,5,0.329392011801442,0.259456693666561,0.398849123149537,0.232011775387871,0.331226729925025,0.0700196150629553 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_rmse,5,0.286973837051059,0.276763436155569,0.303020671751729,0.307576413390527,0.288876391221958,0.0132054051965759 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_spearman,5,0.450192417187314,0.401965996873113,0.484318543168764,0.3833151284687,0.44568293350492,0.0419369117110238 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_calibration_slope,5,1.25257252325658,1.21729420945707,1.32537198354447,1.34372982749975,1.26638905505519,0.0543152584566197 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_prevalence,5,0.148776350860189,0.144579171619019,0.151265484707482,0.148776350860189,0.148217744909364,0.00345089736498891 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_n,5,2637,2606,3537,4127,2925.8,671.783223964398 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_auc,4,0.692551346402684,0.682460202751897,0.70679870523503,,0.694035708967527,0.013165178222692 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_deviance_explained,4,0.0540816869521263,0.0141283023913486,0.0862093355546272,,0.0512867812527417,0.0395159683953798 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_rmse,4,0.338973692483144,0.328685644324978,0.344856063522025,,0.337400236369114,0.00898400813404663 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_spearman,4,0.240157197519794,0.229372891763469,0.252918126365829,,0.240863134337548,0.0131808021294983 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_calibration_slope,4,0.588731598826463,0.505773442491683,0.696035594381569,,0.597426541405151,0.103778370825785 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_prevalence,4,0.148630312373211,0.144212802079742,0.157027721824677,,0.150051704929638,0.00706694376971498 -mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_n,5,1490,590,1521,0,1201.2,671.783223964398 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_auc,5,0.857751951770376,0.79440366780059,0.922540576923459,0.755383862639498,0.862182037633474,0.0685001441767033 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_deviance_explained,5,0.294543909453236,0.180813174325599,0.428882189616842,0.114500866431879,0.308777478599837,0.129394946979975 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_rmse,5,0.34034862633445,0.295426048205682,0.370868634601436,0.39109950084017,0.332582999586279,0.0396926900532704 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_spearman,5,0.601106559333232,0.478800237729815,0.714179629314927,0.400978098349965,0.604556152773267,0.127479350231306 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_calibration_slope,5,1.26968179363173,1.25829518058595,1.44654740891661,1.55965933436895,1.32510792293209,0.131408201639278 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_prevalence,5,0.602816901408451,0.593809006916747,0.607790307126989,0.604735883424408,0.60104129788425,0.00700249933764362 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_n,5,696,686.6,942.8,1098,775.8,180.377936566532 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_auc,4,0.647138310793413,0.640877291000949,0.674890255051361,,0.654813640959657,0.0204426073543706 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_deviance_explained,4,-0.0418102612402197,-0.109760787359131,0.0137369118949877,,-0.0462400301629711,0.0665039386069977 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_rmse,4,0.427001266543158,0.419148634976836,0.435146182953353,,0.427105653987398,0.0085890878047572 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_spearman,4,0.241594483726187,0.240203449840303,0.270721156283332,,0.251500068965923,0.0209128573207021 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_calibration_slope,4,0.497653877609332,0.436996226524828,0.64709734332734,,0.529363097121298,0.118504267937661 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_prevalence,4,0.614967084834182,0.599715606114469,0.623570700713301,,0.612592848105398,0.0130873792975551 -mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_n,5,402,155.2,411.4,0,322.2,180.377936566532 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_auc,5,0.967045685795686,0.915285321838798,0.981619214884151,0.925009356287425,0.952625142299974,0.0336462439602616 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_deviance_explained,5,0.623237127541129,0.427429087500714,0.69709118842689,0.450534136207375,0.575671076641989,0.135855796625128 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_rmse,5,0.169718997202972,0.147040553100203,0.199746749592118,0.196086545215843,0.172425884626037,0.0261672720549197 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_spearman,5,0.443954406227822,0.417520571508669,0.471152398628163,0.416178543501863,0.444136637946073,0.0264512281346795 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_calibration_slope,5,1.34192647414073,1.27702241951042,1.56351524018203,1.4868566766033,1.40171806260506,0.14670071130752 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_prevalence,5,0.0875912408759124,0.0815913826315997,0.0946898807160816,0.0874316939890711,0.0882209860082516,0.00699025063520411 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_n,5,693,685.8,936.8,1098,771.6,182.509725768245 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_auc,4,0.803553194357792,0.738229963432943,0.807624208316615,,0.781677402584211,0.0472293563086202 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_deviance_explained,4,0.151515388114001,-0.217086869193566,0.192212979850534,,0.0344065789814888,0.270655062738678 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_rmse,4,0.230371071022379,0.216954229930974,0.254854420150939,,0.234323395321363,0.0208480768804293 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_spearman,4,0.281494635851876,0.237762867643462,0.29307478032794,,0.270011913090322,0.0333049338103374 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_calibration_slope,4,0.569041405546619,0.459332837179746,0.786303410438132,,0.607453347162562,0.182567815239868 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_prevalence,4,0.0837295205104187,0.0742110480309994,0.0991029746633899,,0.0858205853938301,0.0138195684717859 -mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_n,5,405,161.2,412.2,0,326.4,182.509725768245 -mite,mite,north,,,Ceratozetes.gracilis,insample_auc,5,0.911801541814478,0.891069347872812,0.91367928821936,0.879196801481044,0.905393717510947,0.0147757272299495 -mite,mite,north,,,Ceratozetes.gracilis,insample_deviance_explained,5,0.408444612287306,0.359392586915677,0.415906095622731,0.329917728855628,0.394628518020776,0.0365465060502053 -mite,mite,north,,,Ceratozetes.gracilis,insample_rmse,5,0.307340698618005,0.303392445126844,0.319566572589505,0.327478225349051,0.309868860221708,0.0100568788191934 -mite,mite,north,,,Ceratozetes.gracilis,insample_spearman,5,0.581238073851271,0.551443754073628,0.584300774254957,0.533499852838133,0.572207114024572,0.0217936421456679 -mite,mite,north,,,Ceratozetes.gracilis,insample_calibration_slope,5,1.18613386986737,1.17472655369614,1.20381025007388,1.18613386986737,1.18831397815241,0.0144879431857209 -mite,mite,north,,,Ceratozetes.gracilis,insample_prevalence,5,0.211169769380383,0.208505864577966,0.211369634473166,0.208369812642269,0.210190443530451,0.00151474200965215 -mite,mite,north,,,Ceratozetes.gracilis,insample_n,5,3651,3606.6,4890.2,5711,4047.6,930.188045504779 -mite,mite,north,,,Ceratozetes.gracilis,oob_auc,4,0.801676687894602,0.799827274950427,0.808050954206398,,0.803292706954467,0.0050242238140849 -mite,mite,north,,,Ceratozetes.gracilis,oob_deviance_explained,4,0.179510752821417,0.175938696645046,0.195094383572495,,0.183800600883812,0.0116210667575745 -mite,mite,north,,,Ceratozetes.gracilis,oob_rmse,4,0.361599600925215,0.356908086741117,0.363262243597224,,0.360517861099469,0.00363707073994602 -mite,mite,north,,,Ceratozetes.gracilis,oob_spearman,4,0.42239840004233,0.418026140625421,0.430354399608879,,0.42367830723863,0.00683328419542643 -mite,mite,north,,,Ceratozetes.gracilis,oob_calibration_slope,4,0.828742319133361,0.795246397104333,0.85198634677853,,0.825080928281983,0.0310435368477248 -mite,mite,north,,,Ceratozetes.gracilis,oob_prevalence,4,0.203407429558746,0.203105380508127,0.206516438658429,,0.204409915290554,0.0022495255846381 -mite,mite,north,,,Ceratozetes.gracilis,oob_n,5,2060,820.8,2104.4,0,1663.4,930.188045504779 -mite,mite,north,,,Trhypochthonius.tectorum,insample_auc,5,0.867354183013863,0.789723998849579,0.886148463014596,0.742294572159045,0.848525978384423,0.0604347679295147 -mite,mite,north,,,Trhypochthonius.tectorum,insample_deviance_explained,5,0.273109403472257,0.167793497656307,0.304208518862147,0.101139121714597,0.249997190899475,0.0849118349689442 -mite,mite,north,,,Trhypochthonius.tectorum,insample_rmse,5,0.257701740588258,0.250995447423845,0.274832534792276,0.282703023024446,0.261161024213642,0.0130413480817983 -mite,mite,north,,,Trhypochthonius.tectorum,insample_spearman,5,0.382845553255778,0.295407942380747,0.390568326005991,0.246806765495324,0.355742401769967,0.0615633662732968 -mite,mite,north,,,Trhypochthonius.tectorum,insample_calibration_slope,5,1.3856194303939,1.30636241999063,1.40800419535306,1.41475626215778,1.3658062768331,0.0569549293081291 -mite,mite,north,,,Trhypochthonius.tectorum,insample_prevalence,5,0.0956049728593941,0.0940001763114542,0.0987931854359719,0.0956049728593941,0.0960754727002272,0.00270898671716411 -mite,mite,north,,,Trhypochthonius.tectorum,insample_n,5,3624,3599.2,4881,5711,4034.4,937.384819591186 -mite,mite,north,,,Trhypochthonius.tectorum,oob_auc,4,0.676603114720859,0.634866745696079,0.695356990903416,,0.668395081562922,0.0338214732181241 -mite,mite,north,,,Trhypochthonius.tectorum,oob_deviance_explained,4,0.0231309861017384,-0.0529304280484813,0.0499103567406328,,0.00553025627626506,0.0587729262467672 -mite,mite,north,,,Trhypochthonius.tectorum,oob_rmse,4,0.291341503027868,0.278164596549819,0.299104069124698,,0.289407810034575,0.0115193246690511 -mite,mite,north,,,Trhypochthonius.tectorum,oob_spearman,4,0.176969900115548,0.138990653953572,0.196044434112184,,0.170218217199355,0.0316270471283766 -mite,mite,north,,,Trhypochthonius.tectorum,oob_calibration_slope,4,0.629476610857704,0.457887807201834,0.706349133129125,,0.595649367506115,0.139625823980301 -mite,mite,north,,,Trhypochthonius.tectorum,oob_prevalence,4,0.0963264503316864,0.0893459374618542,0.0984905896614327,,0.0946063169245129,0.00535078906761863 -mite,mite,north,,,Trhypochthonius.tectorum,oob_n,5,2087,830,2111.8,0,1676.6,937.384819591186 -mite,mite,south,,,Ceratozetes.gracilis,insample_auc,5,0.987018688072244,0.962460358283415,0.994093598890034,0.959411982871978,0.980311871127105,0.0160901965625874 -mite,mite,south,,,Ceratozetes.gracilis,insample_deviance_explained,5,0.682759929777448,0.54954006230918,0.76565436974853,0.529264846155788,0.66420947608548,0.1070588336899 -mite,mite,south,,,Ceratozetes.gracilis,insample_rmse,5,0.141642017143814,0.11793130588194,0.164446734547083,0.166987484618412,0.141587759263564,0.0228962488424261 -mite,mite,south,,,Ceratozetes.gracilis,insample_spearman,5,0.381853981218702,0.368571860693125,0.408314331171535,0.366804257536114,0.386163450334912,0.0210178288320258 -mite,mite,south,,,Ceratozetes.gracilis,insample_calibration_slope,5,1.17635731654895,1.14143346840456,1.21905493082183,1.24357646470276,1.17743873970887,0.0415248500707109 -mite,mite,south,,,Ceratozetes.gracilis,insample_prevalence,5,0.056970509383378,0.0521775638545351,0.0622115928022082,0.0562843842573,0.0572190090351997,0.00535467847864499 -mite,mite,south,,,Ceratozetes.gracilis,insample_n,5,1494,1479.4,2024.6,2363,1667.4,389.193139713433 -mite,mite,south,,,Ceratozetes.gracilis,oob_auc,4,0.89443912075715,0.889732200205026,0.913173986479525,,0.899449101175097,0.0140376429698185 -mite,mite,south,,,Ceratozetes.gracilis,oob_deviance_explained,4,0.305485061000288,0.239288606014537,0.37199419828533,,0.305596733250035,0.0714426754944412 -mite,mite,south,,,Ceratozetes.gracilis,oob_rmse,4,0.186223778296823,0.18391106203546,0.205220035166794,,0.19218218565704,0.0137446180319799 -mite,mite,south,,,Ceratozetes.gracilis,oob_spearman,4,0.318520603871097,0.282140717397224,0.339234624931856,,0.312925651937842,0.0313023392190085 -mite,mite,south,,,Ceratozetes.gracilis,oob_calibration_slope,4,0.841179430584809,0.68438665807093,0.95811332629616,,0.826944117441049,0.148734867915711 -mite,mite,south,,,Ceratozetes.gracilis,oob_prevalence,4,0.0533392883804503,0.0452752248602848,0.0645232647455575,,0.0544535429679295,0.0107814199736608 -mite,mite,south,,,Ceratozetes.gracilis,oob_n,5,869,338.4,883.6,0,695.6,389.193139713433 -mite,mite,south,,,Trhypochthonius.tectorum,insample_auc,5,0.948149437150469,0.925004332091086,0.957126558736211,0.914916030391233,0.9433075470881,0.0173716083557048 -mite,mite,south,,,Trhypochthonius.tectorum,insample_deviance_explained,5,0.482464997001233,0.387877300984383,0.505172041987934,0.352939682757835,0.457010809562295,0.0638664982326912 -mite,mite,south,,,Trhypochthonius.tectorum,insample_rmse,5,0.206424449368147,0.204390313169795,0.224886336413872,0.231947697035794,0.212403195191201,0.0116706053600199 -mite,mite,south,,,Trhypochthonius.tectorum,insample_spearman,5,0.425909318805451,0.403776780946249,0.44371694445911,0.397329229215489,0.42459174405178,0.0198356719297497 -mite,mite,south,,,Trhypochthonius.tectorum,insample_calibration_slope,5,1.28272278366347,1.18550895844535,1.36127647271079,1.40288536179909,1.27640816970933,0.096700226618447 -mite,mite,south,,,Trhypochthonius.tectorum,insample_prevalence,5,0.0833685992382565,0.0807473443243282,0.0863035095821866,0.0833685992382565,0.083401335320589,0.00299510185415199 -mite,mite,south,,,Trhypochthonius.tectorum,insample_n,5,1489,1484.4,2017.4,2363,1664.2,390.68875079787 -mite,mite,south,,,Trhypochthonius.tectorum,oob_auc,4,0.727858780739764,0.715518870428138,0.74896682434992,,0.730990256917811,0.018291205762773 -mite,mite,south,,,Trhypochthonius.tectorum,oob_deviance_explained,4,-8.87960648587901e-05,-0.0172215524979527,0.0280832607165525,,0.0038538112023974,0.0253279422860863 -mite,mite,south,,,Trhypochthonius.tectorum,oob_rmse,4,0.273916371509924,0.272819823056722,0.277446685109854,,0.274785573348041,0.00273992261800781 -mite,mite,south,,,Trhypochthonius.tectorum,oob_spearman,4,0.220776547348642,0.20802723035924,0.233275895654832,,0.220687272818923,0.0142491076409832 -mite,mite,south,,,Trhypochthonius.tectorum,oob_calibration_slope,4,0.52882836854751,0.440258048168201,0.630817052027781,,0.533620641083568,0.108492930726246 -mite,mite,south,,,Trhypochthonius.tectorum,oob_prevalence,4,0.0842873358196854,0.0775201528145626,0.0881856815952926,,0.0832627510948584,0.00595703320150957 -mite,mite,south,,,Trhypochthonius.tectorum,oob_n,5,874,345.6,878.6,0,698.8,390.68875079787 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_auc,5,0.937599297649847,0.933732651029908,0.941737322252894,0.931214977657458,0.937733083636675,0.00453400260775217 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_deviance_explained,5,0.519287294045003,0.504499969540117,0.531079579906343,0.496002555058527,0.518187319450253,0.0151113505605461 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_rmse,5,0.314125023564981,0.308111085451721,0.319390735361298,0.322504202857685,0.31382091059043,0.00621569886165501 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_spearman,5,0.748332562768468,0.740796151260149,0.753672448408468,0.736834310219465,0.747586091965464,0.00702764835136154 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_calibration_slope,5,1.13199476635183,1.12739971260376,1.13922683008689,1.13943602876807,1.13308935819248,0.00587114511343704 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_prevalence,5,0.418242653476869,0.411391418988775,0.421189975169674,0.418242653476869,0.416870814782784,0.00501851999449775 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_n,5,4366,4320.2,5874.4,6874,4851.6,1130.83522230252 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_auc,4,0.87190261441896,0.866590445153601,0.879024014030655,,0.87254876811408,0.00689379878784026 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_deviance_explained,4,0.350138005540015,0.333712936669149,0.364314392402626,,0.349334904822781,0.0168036551132006 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_rmse,4,0.37478581306944,0.37052889187651,0.380329116493191,,0.375245235294733,0.00562107604610611 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_spearman,4,0.635602806329395,0.628052007689893,0.647314299648738,,0.637088768715053,0.0105286431542761 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_calibration_slope,4,0.958936928697371,0.945055098835756,0.984721414386241,,0.963187877207105,0.0226813215447264 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_prevalence,4,0.419241311741466,0.413108455574493,0.430771977433407,,0.421169100857526,0.00978800188867454 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_n,5,2508,999.6,2553.8,0,2022.4,1130.83522230252 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_auc,5,0.935589757842857,0.931198139311186,0.939955072765222,0.928669885197567,0.935755480214007,0.00460383983766371 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_deviance_explained,5,0.510856684393222,0.494054849222068,0.52191145465813,0.484030970750928,0.509548753049097,0.0154707189549688 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_rmse,5,0.314811213916215,0.309732334339345,0.321045419648829,0.324741983588447,0.31490944460215,0.00613097852727421 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_spearman,5,0.732669510639059,0.724619156043327,0.7381230520886,0.719908133920423,0.731907124766318,0.0074515655735294 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_calibration_slope,5,1.13878608073771,1.11845423580279,1.14507767613165,1.13878608073771,1.13297735497545,0.0135058523659789 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_prevalence,5,0.377654931626418,0.37492184315556,0.38072781584232,0.377654931626418,0.377957278345016,0.00308047552556824 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_n,5,4329,4315.8,5874,6874,4842.2,1136.06104589498 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_auc,4,0.865145971850341,0.85903618914522,0.872818410162894,,0.865704063138709,0.00741727831574323 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_deviance_explained,4,0.328961294840861,0.30879784242093,0.349077626197696,,0.328944465889755,0.0217317024450887 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_rmse,4,0.377122004729027,0.372420995562408,0.38338038457161,,0.377678208541871,0.00599437843997528 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_spearman,4,0.612433113852142,0.604033840591852,0.624935658303329,,0.613898567848891,0.0114359212635816 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_calibration_slope,4,0.957384372362836,0.921740017679305,0.970773968972915,,0.94943624447946,0.0282696036792119 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_prevalence,4,0.375247544204322,0.372430611979277,0.382966913772923,,0.376998414684163,0.00599903919350225 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_n,5,2545,1000,2558.2,0,2031.8,1136.06104589498 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_auc,5,0.987928507652934,0.980455908404938,0.989250732599663,0.980256010171059,0.985460978543082,0.00456207770363119 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_deviance_explained,5,0.758896959794746,0.70324582200889,0.770317223440547,0.697836785401464,0.741649486985086,0.0344734147295644 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_rmse,5,0.190866444623621,0.185393215094002,0.213378451096027,0.215973925593421,0.197489483231116,0.0142778273902924 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_spearman,5,0.694446022892243,0.691765983299998,0.711193415815408,0.691462681901474,0.699805784979382,0.0101255581270015 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_calibration_slope,5,1.08542977846872,1.08129593595208,1.09390636484336,1.09735250260365,1.08689669407402,0.006618758370988 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_prevalence,5,0.222088835534214,0.217190546592102,0.228625506806496,0.222054380664653,0.222881775063893,0.00607679419012681 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_n,5,1692,1666,2267.2,2648,1873.6,433.131388841769 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_auc,4,0.935203452493946,0.932112042029965,0.940043648344565,,0.935828018703459,0.00432595880799098 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_deviance_explained,4,0.497223760362555,0.478282533470732,0.510124884085561,,0.495066580659406,0.0174858649946529 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_rmse,4,0.280832951483315,0.277753868107202,0.28552164859325,,0.281407813531109,0.00426290374870152 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_spearman,4,0.620768914212728,0.61823009620924,0.636455371546245,,0.625464499687738,0.011800342651411 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_calibration_slope,4,0.924745207738268,0.892233433655132,0.947566793867581,,0.921284426326188,0.0302293473629047 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_prevalence,4,0.218666030567013,0.210018355611084,0.23207994955219,,0.220368260577459,0.0121728164316861 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_n,5,956,380.8,982,0,774.4,433.131388841769 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_auc,5,0.964989766030961,0.953973732238264,0.968674479023032,0.9569840862423,0.96215213925013,0.00742159889697569 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_deviance_explained,5,0.612250733867401,0.566505101795749,0.630497890361907,0.572523255866958,0.60095188649559,0.032067913473032 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_rmse,5,0.252533243369255,0.248705947803803,0.271141324772209,0.268895273372996,0.258411075321605,0.0114935088298203 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_spearman,5,0.704003647832294,0.693558372904758,0.720162548842767,0.698100498601086,0.706018243458387,0.0135329427473597 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_calibration_slope,5,1.1439212268239,1.14115686304828,1.15393474877826,1.1566388543954,1.14661388688165,0.00662973235816637 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_prevalence,5,0.264350453172205,0.25911663216011,0.270295509723619,0.264350453172205,0.264443478235907,0.00620048832939598 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_n,5,1685,1649.4,2266.4,2648,1865.6,437.838212128635 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_auc,4,0.874778812202748,0.872358459095117,0.877114684170805,,0.874748640367186,0.00272342158704789 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_deviance_explained,4,0.343866043427387,0.338387952722904,0.347594977366804,,0.343241344582721,0.00510089376524918 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_rmse,4,0.340381988663126,0.335961301780409,0.344292295422683,,0.340199710047712,0.00456762689154793 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_spearman,4,0.573623485003221,0.560997991791278,0.581641821132803,,0.571978071759521,0.0115514533986335 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_calibration_slope,4,0.930605398692623,0.905860741996704,0.953261009929316,,0.929859311028613,0.0269491452076172 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_prevalence,4,0.266148052343275,0.252246321440467,0.273763588267456,,0.263902982708051,0.0122396324927964 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_n,5,963,381.6,998.6,0,782.4,437.838212128635 diff --git a/3_output/exp_002_soilgrids/run_record.md b/3_output/exp_002_soilgrids/run_record.md deleted file mode 100644 index f87cebc..0000000 --- a/3_output/exp_002_soilgrids/run_record.md +++ /dev/null @@ -1,193 +0,0 @@ -# Run record: exp_002_soilgrids - -Written by `run_record()`. The result stores this describes are gitignored; this file is what remains. - -## Provenance - -_Volatile. Excluded from cross-run comparison._ - -- **git_commit**: 2b72a2b -- **pipeline_dir**: D:/local_projects/active/sdmMethodsDev/2_pipeline/exp_002_soilgrids -- **r_version**: 4.5.0 -- **written_at**: 2026-10-05 11:17:49 - -## Configuration - -- **boot_seed**: 20260909.0000 -- **changes_from_v2**: stage_models: bryophyte.climate, stage_models: lichen.climate, stage_models: mite.climate, stage_models: vascular_plant.climate, stage_models: bird.climate, covariate_files: soilgrids_0_5cm.csv -- **compared_with**: exp_000_parity_v2 -- **covariate_files**: soilgrids_0_5cm.csv -- **data_dir**: test_dataset -- **engines**: bayesglm, glm -- **focal_species**: bird=AMRO, bird=YEWA, bryophyte=Bryum.All, bryophyte=Ceratodon.purpureus, lichen=Cladonia.chlorophaea, lichen=Physcia.adscendens, mammal=Coyote_Summer, mammal=Coyote_Winter, mammal=Moose_Summer, mammal=Moose_Winter, mite=Ceratozetes.gracilis, mite=Trhypochthonius.tectorum, vascular_plant=Galium.boreale, vascular_plant=Vicia.americana -- **jobs_not_ok**: 0 -- **jobs_ok**: 100 -- **jobs_total**: 100 -- **n_bootstraps**: 5 -- **plant_bootstrap**: spatial_block -- **selection**: aic_average, ivw_grid, staged_bic -- **species_n**: 14 -- **stage_models**: bird.climate, bryophyte.climate, lichen.climate, mite.climate, vascular_plant.climate -- **taxa**: bird, bryophyte, lichen, mite, vascular_plant -- **v2_bootstraps**: 100 - -## Coverage - -| taxon | region | species | draws | coefficient_rows | metric_rows | grid_rows | -| --- | --- | --- | --- | --- | --- | --- | -| bird | north | 2 | 5 | 557 | 140 | 890 | -| bird | south | 2 | 5 | 440 | 140 | 170 | -| bryophyte | north | 2 | 5 | 1190 | 140 | 430 | -| bryophyte | south | 2 | 5 | 480 | 140 | 160 | -| lichen | north | 2 | 5 | 1190 | 140 | 430 | -| lichen | south | 2 | 5 | 480 | 140 | 160 | -| mite | north | 2 | 5 | 1180 | 140 | 430 | -| mite | south | 2 | 5 | 470 | 140 | 160 | -| vascular_plant | north | 2 | 5 | 1180 | 140 | 430 | -| vascular_plant | south | 2 | 5 | 470 | 140 | 160 | - -## Metrics - -| taxon | region | metric | n | median | p10 | p90 | mean | sd | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | -| bird | north | insample_auc | 10 | 0.7541 | 0.7265 | 0.7797 | 0.7534 | 0.0272 | -| bird | north | insample_calibration_slope | 10 | 0.7426 | 0.6693 | 0.8183 | 0.7415 | 0.0763 | -| bird | north | insample_deviance_explained | 10 | 0.1980 | 0.1450 | 0.2531 | 0.1983 | 0.0554 | -| bird | north | insample_n | 10 | 46747.0000 | 46744.0000 | 46750.0000 | 46747.6000 | 2.3664 | -| bird | north | insample_prevalence | 10 | 0.1851 | 0.1178 | 0.2520 | 0.1850 | 0.0702 | -| bird | north | insample_rmse | 10 | 0.6097 | 0.5551 | 0.6618 | 0.6085 | 0.0554 | -| bird | north | insample_spearman | 10 | 0.3308 | 0.3152 | 0.3508 | 0.3321 | 0.0174 | -| bird | north | oob_auc | 10 | 0.7320 | 0.7284 | 0.7342 | 0.7316 | 0.0027 | -| bird | north | oob_calibration_slope | 10 | 0.7087 | 0.5676 | 0.8262 | 0.7015 | 0.1264 | -| bird | north | oob_deviance_explained | 10 | 0.1607 | 0.1527 | 0.1701 | 0.1611 | 0.0085 | -| bird | north | oob_n | 10 | 124877.0000 | 124874.0000 | 124880.0000 | 124876.4000 | 2.3664 | -| bird | north | oob_prevalence | 10 | 0.1877 | 0.1343 | 0.2411 | 0.1877 | 0.0561 | -| bird | north | oob_rmse | 10 | 0.6351 | 0.5991 | 0.6592 | 0.6308 | 0.0299 | -| bird | north | oob_spearman | 10 | 0.3143 | 0.2731 | 0.3536 | 0.3139 | 0.0416 | -| bird | south | insample_auc | 10 | 0.7199 | 0.7050 | 0.7330 | 0.7193 | 0.0130 | -| bird | south | insample_calibration_slope | 10 | 0.8244 | 0.7483 | 0.8920 | 0.8215 | 0.0726 | -| bird | south | insample_deviance_explained | 10 | 0.1618 | 0.1076 | 0.2277 | 0.1653 | 0.0602 | -| bird | south | insample_n | 10 | 23639.0000 | 23636.0000 | 23640.0000 | 23638.4000 | 1.4298 | -| bird | south | insample_prevalence | 10 | 0.2142 | 0.1711 | 0.2590 | 0.2149 | 0.0459 | -| bird | south | insample_rmse | 10 | 0.6964 | 0.6536 | 0.7409 | 0.6963 | 0.0446 | -| bird | south | insample_spearman | 10 | 0.3123 | 0.3086 | 0.3190 | 0.3130 | 0.0049 | -| bird | south | oob_auc | 10 | 0.7138 | 0.7067 | 0.7233 | 0.7148 | 0.0083 | -| bird | south | oob_calibration_slope | 10 | 0.8552 | 0.7698 | 0.9213 | 0.8423 | 0.0664 | -| bird | south | oob_deviance_explained | 10 | 0.1520 | 0.1115 | 0.1988 | 0.1535 | 0.0434 | -| bird | south | oob_n | 10 | 67168.0000 | 67167.0000 | 67171.0000 | 67168.6000 | 1.4298 | -| bird | south | oob_prevalence | 10 | 0.2178 | 0.1757 | 0.2603 | 0.2180 | 0.0444 | -| bird | south | oob_rmse | 10 | 0.6957 | 0.6590 | 0.7327 | 0.6958 | 0.0384 | -| bird | south | oob_spearman | 10 | 0.3092 | 0.3014 | 0.3182 | 0.3096 | 0.0083 | -| bryophyte | north | insample_auc | 10 | 0.6745 | 0.6438 | 0.7147 | 0.6758 | 0.0333 | -| bryophyte | north | insample_calibration_slope | 10 | 0.8566 | 0.7743 | 0.9035 | 0.8452 | 0.0569 | -| bryophyte | north | insample_deviance_explained | 10 | -0.1839 | -0.2821 | -0.0897 | -0.1872 | 0.0875 | -| bryophyte | north | insample_n | 10 | 3082.5000 | 3033.0000 | 4840.0000 | 3420.2000 | 748.7630 | -| bryophyte | north | insample_prevalence | 10 | 0.4173 | 0.3971 | 0.4428 | 0.4192 | 0.0226 | -| bryophyte | north | insample_rmse | 10 | 0.4717 | 0.4613 | 0.4780 | 0.4708 | 0.0074 | -| bryophyte | north | insample_spearman | 10 | 0.2983 | 0.2437 | 0.3686 | 0.3006 | 0.0590 | -| bryophyte | north | oob_auc | 8 | 0.6598 | 0.6322 | 0.6871 | 0.6600 | 0.0250 | -| bryophyte | north | oob_calibration_slope | 8 | 0.7792 | 0.7056 | 0.8636 | 0.7830 | 0.0679 | -| bryophyte | north | oob_deviance_explained | 8 | -0.1849 | -0.2080 | -0.1268 | -0.1777 | 0.0375 | -| bryophyte | north | oob_n | 10 | 1757.5000 | 0.0000 | 1807.0000 | 1419.8000 | 748.7630 | -| bryophyte | north | oob_prevalence | 8 | 0.4207 | 0.3999 | 0.4507 | 0.4233 | 0.0238 | -| bryophyte | north | oob_rmse | 8 | 0.4788 | 0.4695 | 0.4806 | 0.4767 | 0.0053 | -| bryophyte | north | oob_spearman | 8 | 0.2736 | 0.2243 | 0.3214 | 0.2738 | 0.0446 | -| bryophyte | south | insample_auc | 10 | 0.6764 | 0.6294 | 0.7213 | 0.6751 | 0.0458 | -| bryophyte | south | insample_calibration_slope | 10 | 0.8915 | 0.8418 | 0.9308 | 0.8875 | 0.0505 | -| bryophyte | south | insample_deviance_explained | 10 | -0.0045 | -0.1013 | 0.0597 | -0.0151 | 0.0810 | -| bryophyte | south | insample_n | 10 | 1454.5000 | 1440.8000 | 2310.0000 | 1623.0000 | 362.3789 | -| bryophyte | south | insample_prevalence | 10 | 0.3052 | 0.2352 | 0.3713 | 0.3043 | 0.0687 | -| bryophyte | south | insample_rmse | 10 | 0.4397 | 0.3995 | 0.4742 | 0.4378 | 0.0375 | -| bryophyte | south | insample_spearman | 10 | 0.2745 | 0.2165 | 0.3280 | 0.2716 | 0.0546 | -| bryophyte | south | oob_auc | 8 | 0.6723 | 0.6100 | 0.7113 | 0.6648 | 0.0465 | -| bryophyte | south | oob_calibration_slope | 8 | 0.8245 | 0.7429 | 0.8828 | 0.8190 | 0.0712 | -| bryophyte | south | oob_deviance_explained | 8 | 0.0152 | -0.0449 | 0.0489 | 0.0069 | 0.0399 | -| bryophyte | south | oob_n | 10 | 855.5000 | 0.0000 | 869.2000 | 687.0000 | 362.3789 | -| bryophyte | south | oob_prevalence | 8 | 0.3139 | 0.2297 | 0.3751 | 0.3071 | 0.0716 | -| bryophyte | south | oob_rmse | 8 | 0.4450 | 0.4014 | 0.4768 | 0.4420 | 0.0365 | -| bryophyte | south | oob_spearman | 8 | 0.2677 | 0.1840 | 0.3107 | 0.2559 | 0.0577 | -| lichen | north | insample_auc | 10 | 0.8108 | 0.7822 | 0.8398 | 0.8110 | 0.0287 | -| lichen | north | insample_calibration_slope | 10 | 0.9970 | 0.9817 | 1.0040 | 0.9950 | 0.0122 | -| lichen | north | insample_deviance_explained | 10 | 0.1447 | 0.1127 | 0.1682 | 0.1437 | 0.0233 | -| lichen | north | insample_n | 10 | 3683.5000 | 3648.0000 | 5799.0000 | 4101.0000 | 895.3279 | -| lichen | north | insample_prevalence | 10 | 0.3838 | 0.3809 | 0.3889 | 0.3839 | 0.0037 | -| lichen | north | insample_rmse | 10 | 0.4098 | 0.3943 | 0.4274 | 0.4103 | 0.0166 | -| lichen | north | insample_spearman | 10 | 0.5233 | 0.4764 | 0.5719 | 0.5239 | 0.0482 | -| lichen | north | oob_auc | 8 | 0.7988 | 0.7671 | 0.8385 | 0.8014 | 0.0360 | -| lichen | north | oob_calibration_slope | 8 | 0.9671 | 0.9172 | 1.0156 | 0.9636 | 0.0425 | -| lichen | north | oob_deviance_explained | 8 | 0.1175 | 0.0897 | 0.1810 | 0.1312 | 0.0457 | -| lichen | north | oob_n | 10 | 2115.5000 | 0.0000 | 2151.0000 | 1698.0000 | 895.3279 | -| lichen | north | oob_prevalence | 8 | 0.3867 | 0.3758 | 0.3919 | 0.3854 | 0.0074 | -| lichen | north | oob_rmse | 8 | 0.4177 | 0.3946 | 0.4339 | 0.4154 | 0.0192 | -| lichen | north | oob_spearman | 8 | 0.5050 | 0.4502 | 0.5688 | 0.5081 | 0.0609 | -| lichen | south | insample_auc | 10 | 0.8159 | 0.8090 | 0.8227 | 0.8145 | 0.0081 | -| lichen | south | insample_calibration_slope | 10 | 0.9040 | 0.8837 | 0.9858 | 0.9213 | 0.0510 | -| lichen | south | insample_deviance_explained | 10 | 0.1833 | 0.1122 | 0.2365 | 0.1800 | 0.0594 | -| lichen | south | insample_n | 10 | 1484.5000 | 1478.5000 | 2346.0000 | 1657.8000 | 362.9370 | -| lichen | south | insample_prevalence | 10 | 0.1511 | 0.0868 | 0.2167 | 0.1525 | 0.0659 | -| lichen | south | insample_rmse | 10 | 0.3165 | 0.2665 | 0.3571 | 0.3136 | 0.0448 | -| lichen | south | insample_spearman | 10 | 0.3796 | 0.3059 | 0.4536 | 0.3801 | 0.0749 | -| lichen | south | oob_auc | 8 | 0.8102 | 0.8051 | 0.8167 | 0.8106 | 0.0052 | -| lichen | south | oob_calibration_slope | 8 | 0.9501 | 0.8320 | 1.0148 | 0.9351 | 0.0882 | -| lichen | south | oob_deviance_explained | 8 | 0.1248 | 0.0288 | 0.2400 | 0.1297 | 0.1064 | -| lichen | south | oob_n | 10 | 861.5000 | 0.0000 | 867.5000 | 688.2000 | 362.9370 | -| lichen | south | oob_prevalence | 8 | 0.1578 | 0.0943 | 0.2207 | 0.1582 | 0.0637 | -| lichen | south | oob_rmse | 8 | 0.3253 | 0.2761 | 0.3630 | 0.3220 | 0.0415 | -| lichen | south | oob_spearman | 8 | 0.3824 | 0.3133 | 0.4564 | 0.3831 | 0.0708 | -| mite | north | insample_auc | 10 | 0.7389 | 0.6689 | 0.8071 | 0.7375 | 0.0683 | -| mite | north | insample_calibration_slope | 10 | 0.9673 | 0.9418 | 1.0141 | 0.9757 | 0.0339 | -| mite | north | insample_deviance_explained | 10 | 0.0604 | -0.0403 | 0.1524 | 0.0561 | 0.0924 | -| mite | north | insample_n | 10 | 3625.0000 | 3591.6000 | 5699.0000 | 4033.4000 | 878.0981 | -| mite | north | insample_prevalence | 10 | 0.1545 | 0.0942 | 0.2110 | 0.1529 | 0.0599 | -| mite | north | insample_rmse | 10 | 0.3251 | 0.2868 | 0.3645 | 0.3251 | 0.0388 | -| mite | north | insample_spearman | 10 | 0.3036 | 0.1717 | 0.4335 | 0.3012 | 0.1316 | -| mite | north | oob_auc | 8 | 0.7219 | 0.6345 | 0.7914 | 0.7182 | 0.0766 | -| mite | north | oob_calibration_slope | 8 | 0.8853 | 0.7204 | 1.0177 | 0.8727 | 0.1335 | -| mite | north | oob_deviance_explained | 8 | 0.0326 | -0.0820 | 0.1157 | 0.0210 | 0.1014 | -| mite | north | oob_n | 10 | 2074.0000 | 0.0000 | 2107.4000 | 1665.6000 | 878.0981 | -| mite | north | oob_prevalence | 8 | 0.1509 | 0.0926 | 0.2051 | 0.1496 | 0.0589 | -| mite | north | oob_rmse | 8 | 0.3269 | 0.2857 | 0.3682 | 0.3271 | 0.0417 | -| mite | north | oob_spearman | 8 | 0.2814 | 0.1360 | 0.4065 | 0.2767 | 0.1366 | -| mite | south | insample_auc | 10 | 0.8090 | 0.7263 | 0.8899 | 0.8085 | 0.0824 | -| mite | south | insample_calibration_slope | 10 | 0.8655 | 0.6364 | 1.0239 | 0.8420 | 0.1769 | -| mite | south | insample_deviance_explained | 10 | 0.0741 | 0.0211 | 0.2135 | 0.1104 | 0.0917 | -| mite | south | insample_n | 10 | 1493.0000 | 1480.9000 | 2363.0000 | 1665.8000 | 367.6444 | -| mite | south | insample_prevalence | 10 | 0.0721 | 0.0556 | 0.0841 | 0.0703 | 0.0144 | -| mite | south | insample_rmse | 10 | 0.2418 | 0.2082 | 0.2675 | 0.2389 | 0.0293 | -| mite | south | insample_spearman | 10 | 0.2617 | 0.2163 | 0.3199 | 0.2658 | 0.0493 | -| mite | south | oob_auc | 8 | 0.7973 | 0.6948 | 0.8805 | 0.7897 | 0.0920 | -| mite | south | oob_calibration_slope | 8 | 0.6161 | 0.5692 | 0.8871 | 0.7014 | 0.2137 | -| mite | south | oob_deviance_explained | 8 | 0.0782 | 0.0309 | 0.2029 | 0.1035 | 0.0744 | -| mite | south | oob_n | 10 | 870.0000 | 0.0000 | 882.1000 | 697.2000 | 367.6444 | -| mite | south | oob_prevalence | 8 | 0.0719 | 0.0489 | 0.0868 | 0.0689 | 0.0174 | -| mite | south | oob_rmse | 8 | 0.2425 | 0.2097 | 0.2762 | 0.2428 | 0.0311 | -| mite | south | oob_spearman | 8 | 0.2435 | 0.1802 | 0.3147 | 0.2449 | 0.0581 | -| vascular_plant | north | insample_auc | 10 | 0.8299 | 0.8275 | 0.8344 | 0.8306 | 0.0031 | -| vascular_plant | north | insample_calibration_slope | 10 | 0.9989 | 0.9805 | 1.0079 | 0.9964 | 0.0112 | -| vascular_plant | north | insample_deviance_explained | 10 | 0.1577 | 0.1325 | 0.1769 | 0.1561 | 0.0207 | -| vascular_plant | north | insample_n | 10 | 4338.5000 | 4308.5000 | 6862.0000 | 4838.4000 | 1066.7948 | -| vascular_plant | north | insample_prevalence | 10 | 0.3951 | 0.3773 | 0.4205 | 0.3973 | 0.0204 | -| vascular_plant | north | insample_rmse | 10 | 0.4028 | 0.3977 | 0.4063 | 0.4025 | 0.0036 | -| vascular_plant | north | insample_spearman | 10 | 0.5607 | 0.5560 | 0.5626 | 0.5599 | 0.0044 | -| vascular_plant | north | oob_auc | 8 | 0.8248 | 0.8193 | 0.8282 | 0.8239 | 0.0057 | -| vascular_plant | north | oob_calibration_slope | 8 | 0.9729 | 0.9608 | 0.9918 | 0.9756 | 0.0206 | -| vascular_plant | north | oob_deviance_explained | 8 | 0.1764 | 0.1264 | 0.2002 | 0.1683 | 0.0334 | -| vascular_plant | north | oob_n | 10 | 2523.5000 | 0.0000 | 2553.5000 | 2023.6000 | 1066.7948 | -| vascular_plant | north | oob_prevalence | 8 | 0.3990 | 0.3730 | 0.4273 | 0.3992 | 0.0244 | -| vascular_plant | north | oob_rmse | 8 | 0.4067 | 0.4013 | 0.4115 | 0.4067 | 0.0053 | -| vascular_plant | north | oob_spearman | 8 | 0.5488 | 0.5418 | 0.5583 | 0.5489 | 0.0072 | -| vascular_plant | south | insample_auc | 10 | 0.8434 | 0.8003 | 0.8883 | 0.8446 | 0.0436 | -| vascular_plant | south | insample_calibration_slope | 10 | 0.9422 | 0.9125 | 0.9698 | 0.9389 | 0.0248 | -| vascular_plant | south | insample_deviance_explained | 10 | 0.2676 | 0.1548 | 0.3656 | 0.2616 | 0.0993 | -| vascular_plant | south | insample_n | 10 | 1688.5000 | 1654.9000 | 2648.0000 | 1869.6000 | 410.6067 | -| vascular_plant | south | insample_prevalence | 10 | 0.2438 | 0.2212 | 0.2654 | 0.2437 | 0.0227 | -| vascular_plant | south | insample_rmse | 10 | 0.3499 | 0.3139 | 0.3859 | 0.3501 | 0.0355 | -| vascular_plant | south | insample_spearman | 10 | 0.5101 | 0.4587 | 0.5581 | 0.5098 | 0.0494 | -| vascular_plant | south | oob_auc | 8 | 0.8358 | 0.8038 | 0.8840 | 0.8404 | 0.0376 | -| vascular_plant | south | oob_calibration_slope | 8 | 0.9177 | 0.8994 | 0.9463 | 0.9212 | 0.0221 | -| vascular_plant | south | oob_deviance_explained | 8 | 0.2348 | 0.1654 | 0.3159 | 0.2393 | 0.0767 | -| vascular_plant | south | oob_n | 10 | 959.5000 | 0.0000 | 993.1000 | 778.4000 | 410.6067 | -| vascular_plant | south | oob_prevalence | 8 | 0.2418 | 0.2131 | 0.2706 | 0.2421 | 0.0259 | -| vascular_plant | south | oob_rmse | 8 | 0.3552 | 0.3225 | 0.3848 | 0.3544 | 0.0311 | -| vascular_plant | south | oob_spearman | 8 | 0.4955 | 0.4610 | 0.5476 | 0.5025 | 0.0399 | - diff --git a/3_output/exp_002_soilgrids/tables/comparison_grid.csv b/3_output/exp_002_soilgrids/tables/comparison_grid.csv deleted file mode 100644 index b169005..0000000 --- a/3_output/exp_002_soilgrids/tables/comparison_grid.csv +++ /dev/null @@ -1,21 +0,0 @@ -taxon,region,season,part,species,grid_units,spearman,median_absolute_difference -bird,north,"","",AMRO,89,0.914334354783793,0.0045059319526291 -bird,north,"","",YEWA,89,0.985342185903984,0.0056219561479154 -bird,south,"","",AMRO,17,0.941176470588235,0.0041633429827389 -bird,south,"","",YEWA,17,0.948529411764706,0.0182708517448599 -bryophyte,north,"","",Bryum.All,43,0.941965300401545,0.0079235035767633 -bryophyte,north,"","",Ceratodon.purpureus,43,0.957421016743693,0.007562873229779 -bryophyte,south,"","",Bryum.All,16,0.955882352941176,0.0054615344594325 -bryophyte,south,"","",Ceratodon.purpureus,16,0.997058823529412,0.00364637570802135 -lichen,north,"","",Cladonia.chlorophaea,43,0.945904992802485,0.031749292791541 -lichen,north,"","",Physcia.adscendens,43,0.980756117887719,0.0827843883077536 -lichen,south,"","",Cladonia.chlorophaea,16,0.882352941176471,0.0320775702380878 -lichen,south,"","",Physcia.adscendens,16,0.955882352941176,0.00822499086530675 -mite,north,"","",Ceratozetes.gracilis,43,0.992575195090537,0.006634774688347 -mite,north,"","",Trhypochthonius.tectorum,43,0.91044776119403,0.0050861271852064 -mite,south,"","",Ceratozetes.gracilis,16,0.858823529411765,0.00236272301951765 -mite,south,"","",Trhypochthonius.tectorum,16,0.976470588235294,0.00481353207621055 -vascular_plant,north,"","",Galium.boreale,43,0.986059549965907,0.034587657498138 -vascular_plant,north,"","",Vicia.americana,43,0.997120994014698,0.032531808970894 -vascular_plant,south,"","",Galium.boreale,16,0.991176470588235,0.00534703424256875 -vascular_plant,south,"","",Vicia.americana,16,0.997058823529412,0.00553094497460875 diff --git a/3_output/exp_002_soilgrids/tables/comparison_summary.csv b/3_output/exp_002_soilgrids/tables/comparison_summary.csv deleted file mode 100644 index 5bb5d48..0000000 --- a/3_output/exp_002_soilgrids/tables/comparison_summary.csv +++ /dev/null @@ -1,51 +0,0 @@ -taxon,region,season,part,metric,species,draws_baseline,draws_candidate,median_baseline,median_candidate,median_difference,share_better -bird,north,"","",oob_auc,2,5,5,0.729484461943779,0.731580679812868,0.00209621786908992,1 -bird,north,"","",oob_calibration_slope,2,5,5,0.774212093974031,0.704964688661807,-0.069247405312224,0 -bird,north,"","",oob_deviance_explained,2,5,5,0.165570186112103,0.161466004535857,-0.00410418157624549,0.5 -bird,north,"","",oob_rmse,2,5,5,0.624644013968721,0.629628148414794,0.00498413444607304,0 -bird,north,"","",oob_spearman,2,5,5,0.3109374709378,0.314033928676767,0.00309645773896752,1 -bird,south,"","",oob_auc,2,5,5,0.702136429854496,0.715239415400459,0.013102985545963,1 -bird,south,"","",oob_calibration_slope,2,5,5,0.903072708091274,0.832174369755742,-0.070898338335532,0 -bird,south,"","",oob_deviance_explained,2,5,5,0.150457127171694,0.15497879311708,0.00452166594538594,0.5 -bird,south,"","",oob_rmse,2,5,5,0.686946466284977,0.695748803191955,0.00880233690697796,0.5 -bird,south,"","",oob_spearman,2,5,5,0.291640797085428,0.310306397770022,0.0186656006845945,1 -bryophyte,north,"","",oob_auc,2,4,4,0.64999737456798,0.656797877502313,0.00680050293433304,1 -bryophyte,north,"","",oob_calibration_slope,2,4,4,0.770110822063579,0.771070141106093,0.000959319042513507,0.5 -bryophyte,north,"","",oob_deviance_explained,2,4,4,-0.18848913667322,-0.183879686398786,0.00460945027443349,1 -bryophyte,north,"","",oob_rmse,2,4,4,0.477685026278507,0.476971933535884,-0.000713092742622989,1 -bryophyte,north,"","",oob_spearman,2,4,4,0.256657246933472,0.268292336613232,0.0116350896797595,1 -bryophyte,south,"","",oob_auc,2,4,4,0.668840496946664,0.664104015964309,-0.00473648098235552,0 -bryophyte,south,"","",oob_calibration_slope,2,4,4,0.859428373309233,0.819171579377685,-0.040256793931548,0 -bryophyte,south,"","",oob_deviance_explained,2,4,4,0.0095574817283275,0.00510033180576335,-0.00445714992256415,0 -bryophyte,south,"","",oob_rmse,2,4,4,0.440793673928001,0.442539558009466,0.00174588408146498,0 -bryophyte,south,"","",oob_spearman,2,4,4,0.260684119461907,0.253521461868173,-0.00716265759373452,0 -lichen,north,"","",oob_auc,2,4,4,0.802806546010246,0.802528502016778,-0.000278043993468535,0.5 -lichen,north,"","",oob_calibration_slope,2,4,4,0.980606541125594,0.960270266301661,-0.020336274823933,0.5 -lichen,north,"","",oob_deviance_explained,2,4,4,0.12872576435422,0.124089984355713,-0.0046357799985065,0.5 -lichen,north,"","",oob_rmse,2,4,4,0.413025371860499,0.414272782350542,0.00124741049004301,0.5 -lichen,north,"","",oob_spearman,2,4,4,0.509892978412699,0.509115001285671,-0.000777977127028484,0.5 -lichen,south,"","",oob_auc,2,4,4,0.79223256589659,0.810937582645225,0.0187050167486355,0.5 -lichen,south,"","",oob_calibration_slope,2,4,4,0.991922312776069,0.927486319260971,-0.0644359935150971,1 -lichen,south,"","",oob_deviance_explained,2,4,4,0.114894473111837,0.129223065938884,0.0143285928270465,0.5 -lichen,south,"","",oob_rmse,2,4,4,0.323218486449386,0.322423615458131,-0.000794870991253999,1 -lichen,south,"","",oob_spearman,2,4,4,0.367603610275592,0.383206815873694,0.0156032055981025,0.5 -mite,north,"","",oob_auc,2,4,4,0.715543903851094,0.715854203619342,0.000310299768248479,0.5 -mite,north,"","",oob_calibration_slope,2,4,4,0.91133114539273,0.859654462255643,-0.051676683137087,0 -mite,north,"","",oob_deviance_explained,2,4,4,0.0149187218448,0.0148124579015737,-0.000106263943226347,0.5 -mite,north,"","",oob_rmse,2,4,4,0.328141122068562,0.328360500478674,0.000219378410111964,0 -mite,north,"","",oob_spearman,2,4,4,0.271890083460792,0.273513348651177,0.00162326519038498,0.5 -mite,south,"","",oob_auc,2,4,4,0.773632058303039,0.787193489649906,0.0135614313468669,0.5 -mite,south,"","",oob_calibration_slope,2,4,4,0.614282370199175,0.632818712454851,0.018536342255676,1 -mite,south,"","",oob_deviance_explained,2,4,4,0.0865130411560292,0.110514557582228,0.0240015164261991,1 -mite,south,"","",oob_rmse,2,4,4,0.246446874946777,0.244497145209814,-0.001949729736963,1 -mite,south,"","",oob_spearman,2,4,4,0.230646626561677,0.241579260530077,0.0109326339683995,0.5 -vascular_plant,north,"","",oob_auc,2,4,4,0.827954669352313,0.823650732630277,-0.0043039367220365,0 -vascular_plant,north,"","",oob_calibration_slope,2,4,4,0.975256964203091,0.973573640872107,-0.00168332333098448,0.5 -vascular_plant,north,"","",oob_deviance_explained,2,4,4,0.178982880150698,0.172574033606171,-0.0064088465445265,0 -vascular_plant,north,"","",oob_rmse,2,4,4,0.404515361388574,0.406428952923423,0.00191359153484899,0 -vascular_plant,north,"","",oob_spearman,2,4,4,0.555249895538886,0.548361795052128,-0.00688810048675798,0 -vascular_plant,south,"","",oob_auc,2,4,4,0.845681924077273,0.841962619364344,-0.00371930471292947,0 -vascular_plant,south,"","",oob_calibration_slope,2,4,4,0.941201813094871,0.921129403736588,-0.0200724093582835,0 -vascular_plant,south,"","",oob_deviance_explained,2,4,4,0.267977840506312,0.254772660423712,-0.0132051800826,0 -vascular_plant,south,"","",oob_rmse,2,4,4,0.351078283914618,0.354870002200482,0.00379171828586347,0 -vascular_plant,south,"","",oob_spearman,2,4,4,0.514530181328676,0.504910925504031,-0.00961925582464548,0 diff --git a/3_output/exp_002_soilgrids/tables/coverage.csv b/3_output/exp_002_soilgrids/tables/coverage.csv deleted file mode 100644 index 83b5b55..0000000 --- a/3_output/exp_002_soilgrids/tables/coverage.csv +++ /dev/null @@ -1,11 +0,0 @@ -taxon,run,region,season,part,species,draws,stages,has_coefficients,has_grid -bird,bird,north,,,2,5,"climate, landcover, habitat",TRUE,TRUE -bird,bird,south,,,2,5,"climate, landcover, habitat",TRUE,TRUE -bryophyte,bryophyte,north,,,2,5,"climate, habitat",TRUE,TRUE -bryophyte,bryophyte,south,,,2,5,"climate, habitat",TRUE,TRUE -lichen,lichen,north,,,2,5,"climate, habitat",TRUE,TRUE -lichen,lichen,south,,,2,5,"climate, habitat",TRUE,TRUE -mite,mite,north,,,2,5,"climate, habitat",TRUE,TRUE -mite,mite,south,,,2,5,"climate, habitat",TRUE,TRUE -vascular_plant,vascular_plant,north,,,2,5,"climate, habitat",TRUE,TRUE -vascular_plant,vascular_plant,south,,,2,5,"climate, habitat",TRUE,TRUE diff --git a/3_output/exp_002_soilgrids/tables/grid_summary.csv b/3_output/exp_002_soilgrids/tables/grid_summary.csv deleted file mode 100644 index cc60c20..0000000 --- a/3_output/exp_002_soilgrids/tables/grid_summary.csv +++ /dev/null @@ -1,685 +0,0 @@ -taxon,run,region,season,part,species,grid_unit,n,median,p10,p90,boot1 -bird,bird,north,,,AMRO,SpruceR,5,0.0450306010335692,0.044571725544185,0.0474530097305696,0.0444732303912678 -bird,bird,north,,,AMRO,Spruce1,5,0.0369049864408053,0.0354477266615211,0.0380662303850037,0.0369049864408053 -bird,bird,north,,,AMRO,Spruce2,5,0.0344734330871671,0.032591110474184,0.0353233803281887,0.0344734330871671 -bird,bird,north,,,AMRO,Spruce3,5,0.0311838058329295,0.0295688166054224,0.0321000103612484,0.0315921740962619 -bird,bird,north,,,AMRO,Spruce4,5,0.029155374544378,0.0279225316056106,0.0299175123617578,0.0297602746935337 -bird,bird,north,,,AMRO,Spruce5,5,0.0277796587789024,0.0268756245636124,0.0283007702983259,0.0284371830806022 -bird,bird,north,,,AMRO,Spruce6,5,0.0266226209468198,0.0261467555083038,0.0271693456179282,0.0274216371517897 -bird,bird,north,,,AMRO,Spruce7,5,0.0260602636053119,0.0251895913485928,0.0265437982486813,0.0266140570852783 -bird,bird,north,,,AMRO,Spruce8,5,0.0255150965109921,0.0242881502062906,0.0262587777387366,0.0259572541830633 -bird,bird,north,,,AMRO,PineR,5,0.0575770770538387,0.0538048481530726,0.0599204937226142,0.0536510345662382 -bird,bird,north,,,AMRO,Pine1,5,0.0455851175396193,0.044872781131998,0.0466957376398946,0.044520955320371 -bird,bird,north,,,AMRO,Pine2,5,0.0420729073522447,0.041590013003567,0.0431860530017518,0.041587609757704 -bird,bird,north,,,AMRO,Pine3,5,0.0381900752503732,0.0378791497315541,0.0390046706245211,0.0381117541844669 -bird,bird,north,,,AMRO,Pine4,5,0.0359249289090252,0.0358029354802995,0.0363205477604043,0.0359018113196702 -bird,bird,north,,,AMRO,Pine5,5,0.0344241617073655,0.0339510682208461,0.0347267842965087,0.034305677347949 -bird,bird,north,,,AMRO,Pine6,5,0.0333777733977502,0.0322979031730474,0.0338441623438736,0.0330805563200639 -bird,bird,north,,,AMRO,Pine7,5,0.0326356964846518,0.0309027180634981,0.033336804794813,0.0321063184317383 -bird,bird,north,,,AMRO,Pine8,5,0.0319574676153442,0.0296987458736407,0.0331424980340867,0.0313139731287341 -bird,bird,north,,,AMRO,DecidR,5,0.0252018762511246,0.0244619502584976,0.0255568492291211,0.0252018762511246 -bird,bird,north,,,AMRO,Decid1,5,0.0335884716457358,0.032689171267138,0.033968480466957,0.0333769631758176 -bird,bird,north,,,AMRO,Decid2,5,0.0355512452128433,0.0345710960681771,0.0358539881023548,0.0351807774115782 -bird,bird,north,,,AMRO,Decid3,5,0.0360411283306339,0.0351592945209957,0.0363073085797116,0.0355591338528808 -bird,bird,north,,,AMRO,Decid4,5,0.034543893742064,0.0338983051606382,0.0348464191698872,0.0340820843609406 -bird,bird,north,,,AMRO,Decid5,5,0.0321609611805336,0.0317880457661548,0.0325285867886383,0.0317803598135471 -bird,bird,north,,,AMRO,Decid6,5,0.029412613194709,0.0292274118671895,0.0298309545192382,0.0291178751372939 -bird,bird,north,,,AMRO,Decid7,5,0.0267870744463485,0.0264121259306585,0.0270452897321424,0.0263475022321454 -bird,bird,north,,,AMRO,Decid8,5,0.0240135764059459,0.0236383354339827,0.0243472924044383,0.0236162738600671 -bird,bird,north,,,AMRO,MixedwoodR,5,0.0259362674984067,0.0252294734619135,0.0266079674335463,0.0268492331714843 -bird,bird,north,,,AMRO,Mixedwood1,5,0.0345392369907384,0.0335997436692334,0.0354778712935079,0.0355586964214057 -bird,bird,north,,,AMRO,Mixedwood2,5,0.0364717349519842,0.0355504711742028,0.0374573442854081,0.0374804195713563 -bird,bird,north,,,AMRO,Mixedwood3,5,0.036940858007879,0.0361810697062966,0.0379164448505339,0.0378835078261054 -bird,bird,north,,,AMRO,Mixedwood4,5,0.0354497384144614,0.0349040538265609,0.0363413741235071,0.036309908867847 -bird,bird,north,,,AMRO,Mixedwood5,5,0.0330813576042224,0.0327350942531992,0.0338562277616714,0.0338577287819798 -bird,bird,north,,,AMRO,Mixedwood6,5,0.0303258809799204,0.0301282056676619,0.0309883056387911,0.0310212069621 -bird,bird,north,,,AMRO,Mixedwood7,5,0.0276983344953053,0.0272834932176787,0.0280036666357688,0.0280697446439334 -bird,bird,north,,,AMRO,Mixedwood8,5,0.0249175374276715,0.0244725490786662,0.025119214718372,0.0251599855975912 -bird,bird,north,,,AMRO,TreedBogR,5,0.0327292446027415,0.0310258296669675,0.046339541897051,0.0300077319293345 -bird,bird,north,,,AMRO,TreedBog1,5,0.0434496454510686,0.0293790297197476,0.0446696296500574,0.0397417618281698 -bird,bird,north,,,AMRO,TreedBog2,5,0.0460568397524793,0.0277125593407982,0.0471928903574085,0.0418895532663015 -bird,bird,north,,,AMRO,TreedBog3,5,0.0470383711450926,0.0265284501931942,0.0478066647599357,0.042340060147266 -bird,bird,north,,,AMRO,TreedBog4,5,0.0453444013570792,0.0260712546897049,0.0459361029407942,0.0405813456468515 -bird,bird,north,,,AMRO,TreedBog5,5,0.0422164201490629,0.0260895197651126,0.043031812968299,0.0378406952085624 -bird,bird,north,,,AMRO,TreedBog6,5,0.0385813429271065,0.0267179133745422,0.0396200944364367,0.0346704897193024 -bird,bird,north,,,AMRO,TreedBog7,5,0.0347973952285992,0.0281946869289196,0.0360690723928872,0.0313718223243192 -bird,bird,north,,,AMRO,TreedBog8,5,0.0321686860956519,0.0293008768081094,0.03272145756867,0.0281197641041118 -bird,bird,north,,,AMRO,TreedFenR,5,0.041392481969325,0.0394777931125241,0.0607255147275816,0.039094822157232 -bird,bird,north,,,AMRO,TreedFen1,5,0.0534591991728007,0.0383776325214105,0.057933763966192,0.0517765592729963 -bird,bird,north,,,AMRO,TreedFen2,5,0.0566670163596698,0.0361874249519384,0.0612484039648646,0.0545747555679486 -bird,bird,north,,,AMRO,TreedFen3,5,0.057874664469737,0.0346344265412988,0.0620626881077254,0.0551616871772215 -bird,bird,north,,,AMRO,TreedFen4,5,0.0560220420127772,0.0340406422875781,0.0595170985403775,0.0528703900281746 -bird,bird,north,,,AMRO,TreedFen5,5,0.0526109358389695,0.0340728620559019,0.055524724946571,0.0492998022299241 -bird,bird,north,,,AMRO,TreedFen6,5,0.048261533306927,0.0349058824828052,0.0509767093532865,0.0451695793894787 -bird,bird,north,,,AMRO,TreedFen7,5,0.0437196360965119,0.0368509938915961,0.0462001721318392,0.0408719931718193 -bird,bird,north,,,AMRO,TreedFen8,5,0.0403107684230099,0.0376732287163421,0.0425703710963361,0.0366351305504331 -bird,bird,north,,,AMRO,GrassHerb,5,0.0371256973606207,0.0359580073120721,0.0381375696101985,0.0386266935457576 -bird,bird,north,,,AMRO,Shrub,5,0.0330756260069349,0.0320139887948401,0.0336828747763024,0.0331819431905013 -bird,bird,north,,,AMRO,GraminoidFen,5,0.0247177613416937,0.0242271033503161,0.0268557722625418,0.024168029936823 -bird,bird,north,,,AMRO,Marsh,5,0.0193701289185875,0.0184253134754564,0.0219494052041053,0.020352828135632 -bird,bird,north,,,AMRO,RoughP,5,0.0265372818353795,0.0251477121094877,0.0269637067187881,0.0255711198380556 -bird,bird,north,,,AMRO,TameP,5,0.0330575493104984,0.0320130232760746,0.0347368830052408,0.0350171315133072 -bird,bird,north,,,AMRO,Crop,5,0.02807659058865,0.0277614011130861,0.0291120212936105,0.0290263196746749 -bird,bird,north,,,AMRO,Industrial,5,0.0393659241708082,0.0372587982862676,0.039808432216979,0.0393659241708082 -bird,bird,north,,,AMRO,Mine,5,0.0493178763992183,0.0453376334014803,0.0531615190534469,0.0493178763992183 -bird,bird,north,,,AMRO,Rural,5,0.0455273859657732,0.0435777215325513,0.045828239618108,0.0458842207211444 -bird,bird,north,,,AMRO,Urban,5,0.0419600379202085,0.0391235420791781,0.0441577354096199,0.0385992213816763 -bird,bird,north,,,AMRO,CCSpruceR,5,0.0558357621193879,0.0539620846872051,0.0576525658561066,0.0549309230606425 -bird,bird,north,,,AMRO,CCSpruce1,5,0.0441634723294924,0.0434720589358612,0.0448660206997173,0.0448809438427601 -bird,bird,north,,,AMRO,CCSpruce2,5,0.0393027278563411,0.0383422157219434,0.0404675025787087,0.0403047302330232 -bird,bird,north,,,AMRO,CCSpruce3,5,0.0327994645032277,0.0315339973286662,0.0338940629483135,0.0336087958502303 -bird,bird,north,,,AMRO,CCSpruce4,5,0.0295449871659099,0.0284004511809817,0.0303484708124987,0.0302481792868563 -bird,bird,north,,,AMRO,CCPineR,5,0.0713276012510373,0.0648935793540777,0.0733406581969425,0.0662668492024038 -bird,bird,north,,,AMRO,CCPine1,5,0.0553144189026634,0.0539438837936989,0.0558221592684679,0.0541428865924277 -bird,bird,north,,,AMRO,CCPine2,5,0.0488752064730688,0.0486494492055619,0.0494415430345936,0.0486222938133906 -bird,bird,north,,,AMRO,CCPine3,5,0.0407568253692303,0.0403452222510076,0.0410087371253334,0.0405445399856628 -bird,bird,north,,,AMRO,CCPine4,5,0.0364976196146396,0.0364013470282191,0.0368206550076597,0.0364904032877167 -bird,bird,north,,,AMRO,CCDecidR,5,0.0301501346602357,0.0297627205373979,0.0316423215749299,0.0311279912242709 -bird,bird,north,,,AMRO,CCDecid1,5,0.0385749137936479,0.0385074456932607,0.0401836160614351,0.0395078884399461 -bird,bird,north,,,AMRO,CCDecid2,5,0.0389392412272624,0.0386137727786782,0.0399857214504753,0.0393307884464912 -bird,bird,north,,,AMRO,CCDecid3,5,0.036976928307573,0.0363260019089999,0.0374082096393738,0.0367036206000337 -bird,bird,north,,,AMRO,CCDecid4,5,0.0349030707581111,0.0343438993312635,0.035263963769853,0.0345166978075922 -bird,bird,north,,,AMRO,CCMixedwoodR,5,0.0311843531555516,0.0308596319454893,0.032695518823591,0.0331627171807524 -bird,bird,north,,,AMRO,CCMixedwood1,5,0.0405748180173994,0.0395863786103405,0.0415127015634363,0.0420903784411594 -bird,bird,north,,,AMRO,CCMixedwood2,5,0.0404343655780943,0.0397132366851991,0.0415366524382917,0.0419017020516891 -bird,bird,north,,,AMRO,CCMixedwood3,5,0.0378886983782135,0.0373971627799961,0.0390345981314523,0.0391028055970247 -bird,bird,north,,,AMRO,CCMixedwood4,5,0.0358108078121927,0.035368690258796,0.0367599331679755,0.0367729314480841 -bird,bird,north,,,AMRO,ShrubbySwamp,5,0.0309380929530988,0.0305595770162317,0.0333403421915389,0.0309380929530988 -bird,bird,north,,,AMRO,ShrubbyBog,5,0.0311768130991629,2.53942646229331e-06,0.0950089692027342,0.10025698273071 -bird,bird,north,,,AMRO,ShrubbyFen,5,0.021559870005797,0.0186965927618169,0.0220392395402607,0.0186170779350886 -bird,bird,north,,,AMRO,TreedSwamp,5,0.017575609032917,0.0160761095775931,0.0181535884010063,0.0161624219817385 -bird,bird,north,,,YEWA,SpruceR,5,0.0367572798053502,0.0341055299504178,0.038707942647361,0.0355328583090363 -bird,bird,north,,,YEWA,Spruce1,5,0.0316259186996796,0.0309555128890867,0.0341550777898595,0.031293520025165 -bird,bird,north,,,YEWA,Spruce2,5,0.0282660242075625,0.027382234716967,0.0300960970121501,0.0275300505899205 -bird,bird,north,,,YEWA,Spruce3,5,0.0213817425977471,0.0207764753451668,0.0240556204282854,0.0212371948632942 -bird,bird,north,,,YEWA,Spruce4,5,0.0163117505612501,0.0157631768483898,0.0189013384217116,0.0163117505612501 -bird,bird,north,,,YEWA,Spruce5,5,0.0124743311359287,0.0120336756903989,0.0145522098971786,0.0124743311359287 -bird,bird,north,,,YEWA,Spruce6,5,0.00949832974019732,0.00926948315950662,0.0109651201694659,0.00949832974019732 -bird,bird,north,,,YEWA,Spruce7,5,0.00721627174091202,0.00719324279888033,0.008075689738709,0.00720096157277882 -bird,bird,north,,,YEWA,Spruce8,5,0.00570092052922977,0.00548614717152713,0.00583394820566021,0.00543559413734789 -bird,bird,north,,,YEWA,PineR,5,0.0242184745215459,0.0195080608387248,0.0250541277791329,0.0242184745215459 -bird,bird,north,,,YEWA,Pine1,5,0.0213290276517442,0.017829012402674,0.0215741207028999,0.0213290276517442 -bird,bird,north,,,YEWA,Pine2,5,0.0184937643195764,0.0161869189129315,0.0187395561869485,0.0187639233238746 -bird,bird,north,,,YEWA,Pine3,5,0.0138578383912828,0.0129998011829166,0.0142976050504877,0.0144748406737376 -bird,bird,north,,,YEWA,Pine4,5,0.0106402812586339,0.010100107453278,0.0109735983058322,0.011117757877333 -bird,bird,north,,,YEWA,Pine5,5,0.00815520833173646,0.00769520535698271,0.00844744658563061,0.00850225073821286 -bird,bird,north,,,YEWA,Pine6,5,0.0063085916060275,0.00582698272194181,0.00641139387624851,0.00647386863194483 -bird,bird,north,,,YEWA,Pine7,5,0.00465871691295771,0.00436837164543369,0.00493126985088173,0.00490802915048983 -bird,bird,north,,,YEWA,Pine8,5,0.00360480321976679,0.00315132145955147,0.00383088130391455,0.00370479056258039 -bird,bird,north,,,YEWA,DecidR,5,0.079995814061574,0.0769605434824128,0.0850967983292718,0.079995814061574 -bird,bird,north,,,YEWA,Decid1,5,0.0903380382934353,0.0869067232191482,0.0953287285016954,0.0903380382934353 -bird,bird,north,,,YEWA,Decid2,5,0.0995341164552507,0.0957367843732218,0.104227909678306,0.0995341164552507 -bird,bird,north,,,YEWA,Decid3,5,0.112219501820509,0.107852602210229,0.1158374375809,0.112219501820509 -bird,bird,north,,,YEWA,Decid4,5,0.11402414720434,0.110026705773509,0.117064135238781,0.114645331518343 -bird,bird,north,,,YEWA,Decid5,5,0.104694853815161,0.10150447480515,0.107602596525843,0.106129490653997 -bird,bird,north,,,YEWA,Decid6,5,0.0867646872628975,0.08491739832239,0.0897677835291108,0.0890240714891304 -bird,bird,north,,,YEWA,Decid7,5,0.0648922995849895,0.0644290342563012,0.0679688116717525,0.0676659982036025 -bird,bird,north,,,YEWA,Decid8,5,0.0446363237650192,0.0437953149070192,0.0467073256695869,0.0466042153493005 -bird,bird,north,,,YEWA,MixedwoodR,5,0.0383891155991594,0.0374674429646435,0.0410259152252722,0.0383891155991594 -bird,bird,north,,,YEWA,Mixedwood1,5,0.0433522358104713,0.0423080132861376,0.0460130368758883,0.0433522358104713 -bird,bird,north,,,YEWA,Mixedwood2,5,0.0477653330675491,0.0466052584274416,0.050358850016108,0.0477653330675491 -bird,bird,north,,,YEWA,Mixedwood3,5,0.0538529106604458,0.0525014049255744,0.056050300285319,0.0538529106604458 -bird,bird,north,,,YEWA,Mixedwood4,5,0.0550170397812813,0.053559529261408,0.0565662973088049,0.0550170397812813 -bird,bird,north,,,YEWA,Mixedwood5,5,0.0508399197395948,0.0494800057134559,0.0517982578302953,0.0509303809579364 -bird,bird,north,,,YEWA,Mixedwood6,5,0.0422618945414964,0.0413970999160487,0.0431315708474242,0.0427216775226953 -bird,bird,north,,,YEWA,Mixedwood7,5,0.0319178790535977,0.0313281598572462,0.0325322692125466,0.0324721719210353 -bird,bird,north,,,YEWA,Mixedwood8,5,0.0219008032956106,0.0213626951128278,0.0222727518225707,0.0223648528543671 -bird,bird,north,,,YEWA,TreedBogR,5,0.0134437565548244,0.0127330041369964,0.0177195061739771,0.0153413316623009 -bird,bird,north,,,YEWA,TreedBog1,5,0.0152717509634018,0.0143149518055577,0.0198783356167138,0.0173247290928807 -bird,bird,north,,,YEWA,TreedBog2,5,0.0169022360116829,0.0157047272761886,0.021767221975489,0.0190883224349556 -bird,bird,north,,,YEWA,TreedBog3,5,0.0191476826491807,0.017565387449865,0.0242731151279662,0.0215210835292139 -bird,bird,north,,,YEWA,TreedBog4,5,0.0195450514255811,0.0178163586339242,0.0245700434562337,0.0219863010957492 -bird,bird,north,,,YEWA,TreedBog5,5,0.0179765336139994,0.0163879256867039,0.0225752716850921,0.0203531614044306 -bird,bird,north,,,YEWA,TreedBog6,5,0.0148978508518034,0.0136705730901961,0.0188277086710174,0.0170727409010664 -bird,bird,north,,,YEWA,TreedBog7,5,0.0111247389864847,0.0103424869228293,0.0142525378169471,0.0129767605077822 -bird,bird,north,,,YEWA,TreedBog8,5,0.00751677210399456,0.00708414706202263,0.00979291735238801,0.00893760170981683 -bird,bird,north,,,YEWA,TreedFenR,5,0.0281648223647082,0.0209758129677249,0.029311879638463,0.0281648223647082 -bird,bird,north,,,YEWA,TreedFen1,5,0.0318060992460478,0.0235840201967198,0.0330913987114431,0.0318060992460478 -bird,bird,north,,,YEWA,TreedFen2,5,0.0347584920977932,0.0258798188594928,0.036542763331323,0.0350438425069657 -bird,bird,north,,,YEWA,TreedFen3,5,0.0385285053879006,0.0289722985046187,0.0413217207081671,0.0395100965182738 -bird,bird,north,,,YEWA,TreedFen4,5,0.0388011282068827,0.0294299908263146,0.0421929182463301,0.0403641794890895 -bird,bird,north,,,YEWA,TreedFen5,5,0.0355015653233373,0.0271264425447751,0.0389032916785662,0.0373659332927849 -bird,bird,north,,,YEWA,TreedFen6,5,0.0295115219976326,0.0226884627441325,0.0323914195241825,0.0313434795193721 -bird,bird,north,,,YEWA,TreedFen7,5,0.0222882859376581,0.0172204554750494,0.0243551898876511,0.0238237568039273 -bird,bird,north,,,YEWA,TreedFen8,5,0.0152933522085627,0.0118613233746333,0.0165387236096846,0.0164083516388661 -bird,bird,north,,,YEWA,GrassHerb,5,0.0802836786989502,0.0795287355207288,0.0862465391862733,0.0790412932282508 -bird,bird,north,,,YEWA,Shrub,5,0.041782755940795,0.0410113928303673,0.0451673938443427,0.041782755940795 -bird,bird,north,,,YEWA,GraminoidFen,5,0.0550886568771179,0.0477079306422831,0.0598057124402735,0.0550886568771179 -bird,bird,north,,,YEWA,Marsh,5,0.0608131274278961,0.0593822424469885,0.0662609283596842,0.0584828822046217 -bird,bird,north,,,YEWA,RoughP,5,0.0648606709310505,0.064173747140704,0.066827386320451,0.0639576905047648 -bird,bird,north,,,YEWA,TameP,5,0.0473366546747388,0.0423227012841368,0.0480359807286109,0.0473366546747388 -bird,bird,north,,,YEWA,Crop,5,0.0560125795444514,0.0553293575725306,0.058859823339486,0.0578503523220757 -bird,bird,north,,,YEWA,Industrial,5,0.0229305935028794,0.0195960434990188,0.0310021005423718,0.0179089966805184 -bird,bird,north,,,YEWA,Mine,5,0.0350784986969313,0.0297506776744703,0.0518710430703768,0.0506365143271511 -bird,bird,north,,,YEWA,Rural,5,0.0695811953334875,0.0694104751733446,0.0792452570429543,0.0695636813949621 -bird,bird,north,,,YEWA,Urban,5,0.0228895244544648,0.022123241483597,0.0282576648219082,0.0218425009327041 -bird,bird,north,,,YEWA,CCSpruceR,5,0.0226750882206096,0.0206227152383262,0.0248333552645425,0.0202994437908492 -bird,bird,north,,,YEWA,CCSpruce1,5,0.0211187818124099,0.0192670195755631,0.0220657169124125,0.0186285753488761 -bird,bird,north,,,YEWA,CCSpruce2,5,0.0202373408472251,0.018819961637627,0.0210232204774445,0.0181919379142952 -bird,bird,north,,,YEWA,CCSpruce3,5,0.0189846248953531,0.0180188758569354,0.0207400218558154,0.0180241740407853 -bird,bird,north,,,YEWA,CCSpruce4,5,0.0156289959875875,0.0152551727827782,0.0181795616097978,0.015623499906958 -bird,bird,north,,,YEWA,CCPineR,5,0.0138356885892631,0.0119080420027828,0.0164503687042776,0.0138356885892631 -bird,bird,north,,,YEWA,CCPine1,5,0.0126968585959413,0.01122503761181,0.0146132935265518,0.0126968585959413 -bird,bird,north,,,YEWA,CCPine2,5,0.0123992553890003,0.0111428014372548,0.0136364825455614,0.0123992553890003 -bird,bird,north,,,YEWA,CCPine3,5,0.0122849109402397,0.0112151849061931,0.0123314166366251,0.0122849109402397 -bird,bird,north,,,YEWA,CCPine4,5,0.010289114941869,0.00972981539396672,0.0105451070895499,0.0106486602103105 -bird,bird,north,,,YEWA,CCDecidR,5,0.0484304104372555,0.0465174820752366,0.0550961425602118,0.0457005320799982 -bird,bird,north,,,YEWA,CCDecid1,5,0.0598470602158345,0.058524671205765,0.0673885214152555,0.057772155286431 -bird,bird,north,,,YEWA,CCDecid2,5,0.0759672964532725,0.0740307082304135,0.0827651032328641,0.0740612221753056 -bird,bird,north,,,YEWA,CCDecid3,5,0.104029645311698,0.100376664128204,0.108313203771721,0.103180216671241 -bird,bird,north,,,YEWA,CCDecid4,5,0.110858146764504,0.106922991084111,0.113849767606103,0.110858146764504 -bird,bird,north,,,YEWA,CCMixedwoodR,5,0.0239642905030341,0.0226505418193658,0.0260812500527858,0.0219311851444096 -bird,bird,north,,,YEWA,CCMixedwood1,5,0.0300399038273747,0.0283259577674626,0.0319050649884758,0.0277242249950265 -bird,bird,north,,,YEWA,CCMixedwood2,5,0.0377149611413974,0.0358299241060057,0.0393576975738322,0.0355411699081457 -bird,bird,north,,,YEWA,CCMixedwood3,5,0.0503774477789108,0.0487656494596741,0.0520967082731699,0.0495150566539614 -bird,bird,north,,,YEWA,CCMixedwood4,5,0.0534801450498838,0.0520358909329982,0.0549341742216507,0.0531996112693525 -bird,bird,north,,,YEWA,ShrubbySwamp,5,0.086597539800951,0.084055029237436,0.0909795835768917,0.0826099062325901 -bird,bird,north,,,YEWA,ShrubbyBog,5,5.22864620129351e-06,4.79456387775674e-06,6.01541502822778e-06,5.00374737318726e-06 -bird,bird,north,,,YEWA,ShrubbyFen,5,0.0456263828230286,0.04225503139066,0.0547836897172858,0.0536267940761029 -bird,bird,north,,,YEWA,TreedSwamp,5,0.0449124831485375,0.0445730709929603,0.0475671631330189,0.0454886673359079 -bird,bird,south,,,AMRO,Loamy,5,0.0291922912510665,0.0281644138383775,0.0296124547592108,0.0274902201149451 -bird,bird,south,,,AMRO,Blowout,5,0.00667198173709311,0.0060128085269059,0.00688172308242794,0.00667198173709311 -bird,bird,south,,,AMRO,ClaySub,5,0.0295587836896161,0.0277441790614316,0.031239737654479,0.0307952642599971 -bird,bird,south,,,AMRO,Crop,5,0.0258687210141929,0.0252260478188873,0.0261275938373897,0.0250482675299361 -bird,bird,south,,,AMRO,Industrial,5,0.029940246172213,0.0254957147432293,0.0334457363668366,0.0248524332035774 -bird,bird,south,,,AMRO,Mine,5,0.0185499067877044,0.0172724537686133,0.0318063459558871,0.0185499067877044 -bird,bird,south,,,AMRO,Other,5,0.0188307309327604,0.0152565993015167,0.0237857617757627,0.0235084279470756 -bird,bird,south,,,AMRO,RapidDrain,5,0.0277828212599136,0.0268493146818108,0.0289236033371655,0.0277828212599136 -bird,bird,south,,,AMRO,RoughP,5,0.0142479032315455,0.0126470444300615,0.0146419546169455,0.0126819880435036 -bird,bird,south,,,AMRO,Rural,5,0.0503092131493802,0.0479039708505735,0.0513481701958057,0.0478267043313275 -bird,bird,south,,,AMRO,SandyLoam,5,0.0186085280919187,0.0179686231161396,0.0192748672388384,0.0178285135772958 -bird,bird,south,,,AMRO,SoilUnknown,5,0.0287604463028414,0.027066847135705,0.0296773643792734,0.026739961074574 -bird,bird,south,,,AMRO,TameP,5,0.0293346373236641,0.0284429796142141,0.0298498516962281,0.0299140169785546 -bird,bird,south,,,AMRO,ThinBreak,5,0.0380144217456129,0.0373400347480435,0.043882119155875,0.0371377373002769 -bird,bird,south,,,AMRO,Urban,5,0.0618760821930239,0.0583441539584977,0.063550035982972,0.0561688758598976 -bird,bird,south,,,AMRO,Water,5,0.0282556179599498,0.0255536345813971,0.0509554858358808,0.0568206896317378 -bird,bird,south,,,AMRO,Wellsites,5,0.0467600892027461,0.0153517351358807,0.0489636898395014,0.0499077453687576 -bird,bird,south,,,YEWA,Loamy,5,0.134526409958102,0.126405513689408,0.136680555958092,0.134526409958102 -bird,bird,south,,,YEWA,Blowout,5,0.0535495298463814,0.051248307858084,0.0549239598093458,0.0536483274206612 -bird,bird,south,,,YEWA,ClaySub,5,0.106527151318807,0.101383783908728,0.11159053911593,0.105591694461995 -bird,bird,south,,,YEWA,Crop,5,0.0659967427172584,0.0619595016340135,0.0663954272814431,0.06629563562839 -bird,bird,south,,,YEWA,Industrial,5,0.0662203315149881,0.0501934217109474,0.0922445646152326,0.0410989813526814 -bird,bird,south,,,YEWA,Mine,5,0.152555685598947,0.134075821491524,0.196437019860849,0.179960603667866 -bird,bird,south,,,YEWA,Other,5,0.109185121251093,0.0993364014740049,0.122598872228397,0.127485109835406 -bird,bird,south,,,YEWA,RapidDrain,5,0.0778169714301954,0.0708273100518306,0.0821794142839099,0.0725172020709401 -bird,bird,south,,,YEWA,RoughP,5,0.066045108387413,0.062045264761855,0.0702840662372563,0.0643409160027002 -bird,bird,south,,,YEWA,Rural,5,0.0952302923581463,0.0921419589336165,0.100610490646613,0.0947780071844017 -bird,bird,south,,,YEWA,SandyLoam,5,0.0715893150069139,0.0610031838903591,0.075320230847346,0.0648495147153949 -bird,bird,south,,,YEWA,SoilUnknown,5,0.100532258227308,0.0976688148980104,0.102789806865784,0.0978502498242738 -bird,bird,south,,,YEWA,TameP,5,0.0595828575915241,0.0570391407691305,0.0698608591684353,0.065747915905378 -bird,bird,south,,,YEWA,ThinBreak,5,0.225031423469922,0.221484029295082,0.22870234576568,0.221050448552718 -bird,bird,south,,,YEWA,Urban,5,0.0733188366605843,0.065512492441444,0.0755163882129746,0.0733188366605843 -bird,bird,south,,,YEWA,Water,5,5.83955050155696e-07,4.51125775799348e-07,1.24094045655262e-06,6.69890288890188e-07 -bird,bird,south,,,YEWA,Wellsites,5,1.19484544293603e-05,9.33681348617776e-06,0.54439487438398,0.618361300864748 -bryophyte,bryophyte,north,,,Bryum.All,WhiteSpruce,5,0.110415973677831,0.0993226062654867,0.114939468404023,0.115215376996505 -bryophyte,bryophyte,north,,,Bryum.All,Pine,5,0.0732712185712904,0.0676816737140383,0.0754950530580033,0.0735478149583182 -bryophyte,bryophyte,north,,,Bryum.All,Deciduous,5,0.0982993258115714,0.091555777644929,0.101778999244279,0.101538830121272 -bryophyte,bryophyte,north,,,Bryum.All,Mixedwood,5,0.0970830453814964,0.0950873276235255,0.10519765727931,0.105175687714993 -bryophyte,bryophyte,north,,,Bryum.All,BlackSpruce,5,0.0900972913978518,0.0802198655797255,0.104879861064367,0.0900972913978518 -bryophyte,bryophyte,north,,,Bryum.All,TreedFen,5,0.111826552448623,0.0961384431787617,0.121644036418605,0.111826552448623 -bryophyte,bryophyte,north,,,Bryum.All,TreedSwamp,5,0.153975146225378,0.140864399624763,0.168732755030284,0.162677396367447 -bryophyte,bryophyte,north,,,Bryum.All,GraminoidFen,5,0.111519656127773,0.0958594026332456,0.120688812796236,0.111519656127773 -bryophyte,bryophyte,north,,,Bryum.All,ShrubbyFen,5,0.116787360885845,0.102577321252262,0.127115475225946,0.116787360885845 -bryophyte,bryophyte,north,,,Bryum.All,ShrubbyBog,5,0.0921347089686784,0.0816597558441945,0.106022759898265,0.0921347089686784 -bryophyte,bryophyte,north,,,Bryum.All,ShrubbySwamp,5,0.152523733089979,0.145395948157023,0.160559274769321,0.161397445151754 -bryophyte,bryophyte,north,,,Bryum.All,Marsh,5,0.124337741226101,0.108680728116929,0.125797969145284,0.125098644300504 -bryophyte,bryophyte,north,,,Bryum.All,Shrub,5,0.235718817098737,0.220825952340946,0.269697088833143,0.235718817098737 -bryophyte,bryophyte,north,,,Bryum.All,Grass,5,0.242421923187829,0.221768939953578,0.262943186856921,0.242421923187829 -bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruceR,5,0.174432259925114,0.145425901518285,0.203026922961719,0.174432259925114 -bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce1,5,0.174070170275431,0.167251223908436,0.207046652146925,0.187418065959538 -bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce2,5,0.198030551545983,0.171997119664378,0.218326463919521,0.202539400112526 -bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce3,5,0.198030551545983,0.171997119664378,0.218326463919521,0.202539400112526 -bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce4,5,0.198030551545983,0.171997119664378,0.218326463919521,0.202539400112526 -bryophyte,bryophyte,north,,,Bryum.All,CCPineR,5,0.164989039877247,0.141345997878962,0.186530505888224,0.164989039877247 -bryophyte,bryophyte,north,,,Bryum.All,CCPine1,5,0.155138968619268,0.139861471567462,0.192460587637597,0.165446539953247 -bryophyte,bryophyte,north,,,Bryum.All,CCPine2,5,0.158038032976691,0.139679584462011,0.194504534966988,0.167012010783229 -bryophyte,bryophyte,north,,,Bryum.All,CCPine3,5,0.158038032976691,0.139679584462011,0.194504534966988,0.167012010783229 -bryophyte,bryophyte,north,,,Bryum.All,CCPine4,5,0.158038032976691,0.139679584462011,0.194504534966988,0.167012010783229 -bryophyte,bryophyte,north,,,Bryum.All,CCDeciduousR,5,0.173658411668211,0.148355970574154,0.181886492629286,0.173658411668211 -bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous1,5,0.191208660329663,0.161436824332306,0.195603792147788,0.191208660329663 -bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous2,5,0.158087794218451,0.137781353195513,0.170871546675111,0.166583870583856 -bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous3,5,0.158087794218451,0.137781353195513,0.170871546675111,0.166583870583856 -bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous4,5,0.158087794218451,0.137781353195513,0.170871546675111,0.166583870583856 -bryophyte,bryophyte,north,,,Bryum.All,CCMixedwoodR,5,0.173658411668211,0.148355970574154,0.181886492629286,0.173658411668211 -bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood1,5,0.191208660329663,0.161436824332306,0.195603792147788,0.191208660329663 -bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood2,5,0.158087794218451,0.137781353195513,0.170871546675111,0.166583870583856 -bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood3,5,0.158087794218451,0.137781353195513,0.170871546675111,0.166583870583856 -bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood4,5,0.158087794218451,0.137781353195513,0.170871546675111,0.166583870583856 -bryophyte,bryophyte,north,,,Bryum.All,EnSeismic,5,0.149792539521889,0.133484198071788,0.167040379630539,0.149792539521889 -bryophyte,bryophyte,north,,,Bryum.All,EnSoftLin,5,0.178639111318971,0.163172428234268,0.203859656661424,0.178639111318971 -bryophyte,bryophyte,north,,,Bryum.All,TrSoftLin,5,0.166870020434104,0.140258705398725,0.202243973746201,0.1693722557785 -bryophyte,bryophyte,north,,,Bryum.All,HardLin,5,0.127853148191855,0.109823474579183,0.133157841274153,0.131652017457417 -bryophyte,bryophyte,north,,,Bryum.All,UrbInd,5,0.159637736318865,0.150407444828966,0.177274100478006,0.16916691958541 -bryophyte,bryophyte,north,,,Bryum.All,Wellsites,5,0.140982987312238,0.133365698592971,0.155817256776231,0.140982987312238 -bryophyte,bryophyte,north,,,Bryum.All,Crop,5,0.0940376978687642,0.0899987630504781,0.110660066786441,0.0978326110229252 -bryophyte,bryophyte,north,,,Bryum.All,TameP,5,0.154440810964465,0.133385507280867,0.164325677216723,0.16109223722038 -bryophyte,bryophyte,north,,,Bryum.All,RoughP,5,0.157759327815285,0.143538137132488,0.164451253730716,0.163242142114815 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,WhiteSpruce,5,0.165627768004817,0.151928760617595,0.171534060971517,0.168208385349475 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Pine,5,0.158733418454601,0.147521820946892,0.165417982479068,0.165013057948764 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Deciduous,5,0.155994488829953,0.145816710307605,0.166004951827683,0.155994488829953 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Mixedwood,5,0.163287919460556,0.137336226158525,0.166182750850469,0.149700892482234 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,BlackSpruce,5,0.0683597653431626,0.0569963521398305,0.0734303525767806,0.0683597653431626 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,TreedFen,5,0.0726386632508278,0.0641923952781423,0.0771995540104918,0.0760740114345748 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,TreedSwamp,5,0.107742743867827,0.0967194889622052,0.123491242018384,0.107742743867827 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,GraminoidFen,5,0.0731187962144143,0.067986774636249,0.0778584619995782,0.079113492600299 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,ShrubbyFen,5,0.0720058680858197,0.0682089995489225,0.0784102067511301,0.0786813531326592 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,ShrubbyBog,5,0.0689625913699598,0.0587005136001076,0.0732347273790514,0.0689625913699598 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,ShrubbySwamp,5,0.106847436238587,0.0912084812502728,0.119061352686345,0.106847436238587 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Marsh,5,0.110480514512807,0.0935669349016278,0.125658260647233,0.110480514512807 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Shrub,5,0.246189235492773,0.222738280838388,0.289562694835372,0.276305207206077 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Grass,5,0.273783096089869,0.255370954335418,0.321696938995014,0.294205231954175 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruceR,5,0.318375986707693,0.307767240972559,0.330413377206836,0.30792010683838 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce1,5,0.29408010882671,0.277432527949068,0.306102407843316,0.281679484636516 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce2,5,0.31706590096387,0.308904766691969,0.341436774814665,0.31706590096387 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce3,5,0.31706590096387,0.308904766691969,0.341436774814665,0.31706590096387 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce4,5,0.31706590096387,0.308904766691969,0.341436774814665,0.31706590096387 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPineR,5,0.295551185115894,0.295152181657874,0.322716397566225,0.295367399735926 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine1,5,0.314490820704288,0.309413279544398,0.336821166638915,0.314490820704288 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine2,5,0.318968574487083,0.312664251378097,0.340752326736474,0.318968574487083 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine3,5,0.318968574487083,0.312664251378097,0.340752326736474,0.318968574487083 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine4,5,0.318968574487083,0.312664251378097,0.340752326736474,0.318968574487083 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduousR,5,0.295824973644283,0.274293911569587,0.305668701087848,0.299876764604473 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous1,5,0.290173751105067,0.274506319298186,0.297478437407106,0.290173751105067 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous2,5,0.296757762231961,0.27182871307388,0.310837045047674,0.282319530090122 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous3,5,0.296757762231961,0.27182871307388,0.310837045047674,0.282319530090122 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous4,5,0.296757762231961,0.27182871307388,0.310837045047674,0.282319530090122 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwoodR,5,0.295824973644283,0.274293911569587,0.305668701087848,0.299876764604473 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood1,5,0.290173751105067,0.274506319298186,0.297478437407106,0.290173751105067 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood2,5,0.296757762231961,0.27182871307388,0.310837045047674,0.282319530090122 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood3,5,0.296757762231961,0.27182871307388,0.310837045047674,0.282319530090122 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood4,5,0.296757762231961,0.27182871307388,0.310837045047674,0.282319530090122 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,EnSeismic,5,0.141481841862143,0.101037454530666,0.155166019303452,0.141481841862143 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,EnSoftLin,5,0.145944122806755,0.111102583696747,0.152394694180028,0.145944122806755 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,TrSoftLin,5,0.151254404249002,0.111257162421822,0.169677475206313,0.151254404249002 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,HardLin,5,0.10581791027976,0.103285274866497,0.118805095513593,0.105464252479911 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,UrbInd,5,0.120554188125188,0.111490589837141,0.126429967967973,0.118831278861568 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Wellsites,5,0.118436951846217,0.100854555870935,0.12993852554848,0.118436951846217 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,Crop,5,0.0787295250879479,0.0740709443841557,0.0817668485743107,0.0818907773645947 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,TameP,5,0.140827938812827,0.132759271224765,0.142962300036123,0.143304381786149 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,RoughP,5,0.144446534572736,0.131677156256055,0.149603889375921,0.144446534572736 -bryophyte,bryophyte,south,,,Bryum.All,Loamy,5,0.131351453900602,0.113692881823653,0.149554299791616,0.131351453900602 -bryophyte,bryophyte,south,,,Bryum.All,SandyLoam,5,0.168230588091749,0.13889898295342,0.194572600559702,0.168230588091749 -bryophyte,bryophyte,south,,,Bryum.All,ClaySub,5,0.134286972411218,0.115350655753102,0.147581797271814,0.132491792910693 -bryophyte,bryophyte,south,,,Bryum.All,RapidDrain,5,0.138449032992975,0.107907415094888,0.158100158480083,0.138449032992975 -bryophyte,bryophyte,south,,,Bryum.All,Blowout,5,0.141281233599798,0.10590070908767,0.166599116669043,0.141281233599798 -bryophyte,bryophyte,south,,,Bryum.All,ThinBreak,5,0.102411988424327,0.0844319362305818,0.112194708206142,0.10078405090107 -bryophyte,bryophyte,south,,,Bryum.All,Other,5,0.148997099710925,0.120678108469341,0.172696997297406,0.148997099710925 -bryophyte,bryophyte,south,,,Bryum.All,EnSeismic,5,0.270563729991131,0.145046738199297,0.399688830154759,0.270563729991131 -bryophyte,bryophyte,south,,,Bryum.All,EnSoftLin,5,0.264644772924918,0.149978812317139,0.43220956298513,0.264644772924918 -bryophyte,bryophyte,south,,,Bryum.All,TrSoftLin,5,0.282251573455878,0.170146701846002,0.43872727192627,0.317476910733227 -bryophyte,bryophyte,south,,,Bryum.All,HardLin,5,0.110629365723211,0.0810552521703511,0.151383806625905,0.110629365723211 -bryophyte,bryophyte,south,,,Bryum.All,UrbInd,5,0.108488833988913,0.0887323594322194,0.134141975996618,0.123137137219075 -bryophyte,bryophyte,south,,,Bryum.All,Wellsites,5,0.106656778225908,0.0851862575176286,0.131281759936394,0.114187844972883 -bryophyte,bryophyte,south,,,Bryum.All,Crop,5,0.0867723303608381,0.0719240515933601,0.0958865637087293,0.0867723303608381 -bryophyte,bryophyte,south,,,Bryum.All,TameP,5,0.130799444923102,0.100385963954449,0.133092687645548,0.131419200025382 -bryophyte,bryophyte,south,,,Bryum.All,RoughP,5,0.103079667833238,0.0879325257825222,0.108659699342939,0.105266209818982 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,Loamy,5,0.0658708529500316,0.0584170946124704,0.0732113409978297,0.0771500174013531 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,SandyLoam,5,0.0784771746495728,0.0669172034598962,0.0827367737015256,0.0845972096521121 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,ClaySub,5,0.0593845344002184,0.0549200028177223,0.0682680361913014,0.0703623858645358 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,RapidDrain,5,0.0962093454216259,0.0880220023238594,0.110546571991018,0.105235032366013 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,Blowout,5,0.0999344735223918,0.0879642270626199,0.114921019752446,0.11187246078917 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,ThinBreak,5,0.0832243161317533,0.0736759573237151,0.0872000168488827,0.08712969567306 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,Other,5,0.0350044159117947,0.0235240621773317,0.0465393309558795,0.0350044159117947 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,EnSeismic,5,0.174870896576241,0.131592672388024,0.232107751329401,0.174870896576241 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,EnSoftLin,5,0.170575229823803,0.132556088455842,0.203575202927324,0.174217020115512 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,TrSoftLin,5,0.167902857062929,0.134348895822696,0.227103388452211,0.167902857062929 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,HardLin,5,0.0350083307658359,0.0274183527715826,0.0431293993878657,0.0361036893881717 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,UrbInd,5,0.0366482612921616,0.0291165330654948,0.0390926018812285,0.0376936852658235 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,Wellsites,5,0.0402046073308911,0.0328353055362516,0.0535245003211711,0.0443655892619766 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,Crop,5,0.0280314481170995,0.0209128118965215,0.0308832991228334,0.0299952896731918 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,TameP,5,0.0603000878520825,0.0478738235167801,0.0692822585547884,0.0603000878520825 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,RoughP,5,0.05896330594214,0.0446846678988854,0.0632857593790237,0.05896330594214 -lichen,lichen,north,,,Cladonia.chlorophaea,WhiteSpruce,5,0.252558111603793,0.252233623501813,0.257568055301073,0.260735061777734 -lichen,lichen,north,,,Cladonia.chlorophaea,Pine,5,0.184365102576736,0.172889143030735,0.195249655172753,0.190839774983851 -lichen,lichen,north,,,Cladonia.chlorophaea,Deciduous,5,0.210876039041784,0.209789576719078,0.216360686080576,0.219920153696273 -lichen,lichen,north,,,Cladonia.chlorophaea,Mixedwood,5,0.206334473377505,0.200639373428878,0.211931951451974,0.21453093448714 -lichen,lichen,north,,,Cladonia.chlorophaea,BlackSpruce,5,0.194704875028495,0.180230712019276,0.200878568629445,0.197799504514728 -lichen,lichen,north,,,Cladonia.chlorophaea,TreedFen,5,0.196642101320525,0.181759365439195,0.199290475631995,0.19833896913885 -lichen,lichen,north,,,Cladonia.chlorophaea,TreedSwamp,5,0.218674219617792,0.205993590419692,0.225216309481972,0.228583589737506 -lichen,lichen,north,,,Cladonia.chlorophaea,GraminoidFen,5,0.181309655298167,0.168711402161303,0.182689299406762,0.181882976941668 -lichen,lichen,north,,,Cladonia.chlorophaea,ShrubbyFen,5,0.179886394489853,0.169069502842255,0.182265491214641,0.179886394489853 -lichen,lichen,north,,,Cladonia.chlorophaea,ShrubbyBog,5,0.192422125147435,0.178636161743157,0.19612891664086,0.194055487017162 -lichen,lichen,north,,,Cladonia.chlorophaea,ShrubbySwamp,5,0.189367176334449,0.174310177856253,0.197153533227337,0.199324860586018 -lichen,lichen,north,,,Cladonia.chlorophaea,Marsh,5,0.168597453494083,0.159518176998486,0.172794767606744,0.175486219415395 -lichen,lichen,north,,,Cladonia.chlorophaea,Shrub,5,0.132697975114608,0.110141045089634,0.146120700583706,0.145643541949497 -lichen,lichen,north,,,Cladonia.chlorophaea,Grass,5,0.118998503542502,0.114328830146678,0.13821038157821,0.140985698209627 -lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruceR,5,0.137481143553962,0.106121056053495,0.147800100708259,0.143158797725952 -lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce1,5,0.141648889755391,0.110574180596469,0.158070421629081,0.156240951661254 -lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce2,5,0.163146230734557,0.12755172113055,0.176699103321581,0.171754210954791 -lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce3,5,0.163146230734557,0.12755172113055,0.176699103321581,0.171754210954791 -lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce4,5,0.163146230734557,0.12755172113055,0.176699103321581,0.171754210954791 -lichen,lichen,north,,,Cladonia.chlorophaea,CCPineR,5,0.126778077644044,0.104149585698727,0.140294916114714,0.136417758599666 -lichen,lichen,north,,,Cladonia.chlorophaea,CCPine1,5,0.146182096026708,0.119148216693373,0.157131883875635,0.160265005565932 -lichen,lichen,north,,,Cladonia.chlorophaea,CCPine2,5,0.151061631522583,0.121802316338301,0.159508910028366,0.16261964666158 -lichen,lichen,north,,,Cladonia.chlorophaea,CCPine3,5,0.151061631522583,0.121802316338301,0.159508910028366,0.16261964666158 -lichen,lichen,north,,,Cladonia.chlorophaea,CCPine4,5,0.151061631522583,0.121802316338301,0.159508910028366,0.16261964666158 -lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduousR,5,0.132763606916402,0.111538020217543,0.145143112593902,0.143918628709584 -lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous1,5,0.124913970764929,0.115594531384545,0.142985113106185,0.144096912347687 -lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous2,5,0.140064631463177,0.121957667760874,0.150503112004934,0.156067195712122 -lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous3,5,0.140064631463177,0.121957667760874,0.150503112004934,0.156067195712122 -lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous4,5,0.140064631463177,0.121957667760874,0.150503112004934,0.156067195712122 -lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwoodR,5,0.132763606916402,0.111538020217543,0.145143112593902,0.143918628709584 -lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood1,5,0.124913970764929,0.115594531384545,0.142985113106185,0.144096912347687 -lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood2,5,0.140064631463177,0.121957667760874,0.150503112004934,0.156067195712122 -lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood3,5,0.140064631463177,0.121957667760874,0.150503112004934,0.156067195712122 -lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood4,5,0.140064631463177,0.121957667760874,0.150503112004934,0.156067195712122 -lichen,lichen,north,,,Cladonia.chlorophaea,EnSeismic,5,0.0430073866645988,0.0324898942505744,0.0544453854357603,0.0534506641135193 -lichen,lichen,north,,,Cladonia.chlorophaea,EnSoftLin,5,0.035163771867477,0.0288448203971999,0.0472410789647077,0.0472517824771714 -lichen,lichen,north,,,Cladonia.chlorophaea,TrSoftLin,5,0.0399168640327046,0.0294343698729292,0.0497101440576558,0.0502003843595238 -lichen,lichen,north,,,Cladonia.chlorophaea,HardLin,5,0.0214477931276479,0.01989719764426,0.0251663257355368,0.0221025930369697 -lichen,lichen,north,,,Cladonia.chlorophaea,UrbInd,5,0.0277038033657465,0.0236386443718993,0.0316896276821167,0.0300820556387816 -lichen,lichen,north,,,Cladonia.chlorophaea,Wellsites,5,0.0304612273664742,0.0218701670800133,0.0307646339552465,0.0309397188855785 -lichen,lichen,north,,,Cladonia.chlorophaea,Crop,5,0.0144023872928233,0.0128873369304996,0.0166180473618662,0.0144023872928233 -lichen,lichen,north,,,Cladonia.chlorophaea,TameP,5,0.0364155726464503,0.0323758564806015,0.0390656860204695,0.0347219123602915 -lichen,lichen,north,,,Cladonia.chlorophaea,RoughP,5,0.0312286077240493,0.0267039548887538,0.0331277982006694,0.0322013735700394 -lichen,lichen,north,,,Physcia.adscendens,WhiteSpruce,5,0.148117254390208,0.119524154763346,0.15659993385618,0.148117254390208 -lichen,lichen,north,,,Physcia.adscendens,Pine,5,0.120090507975572,0.0919928899086283,0.128219106511953,0.120090507975572 -lichen,lichen,north,,,Physcia.adscendens,Deciduous,5,0.312973172865495,0.272877568468071,0.328143934979411,0.320438568077181 -lichen,lichen,north,,,Physcia.adscendens,Mixedwood,5,0.223900055414834,0.175898143626776,0.241603354332382,0.223900055414834 -lichen,lichen,north,,,Physcia.adscendens,BlackSpruce,5,0.0303366775647651,0.0230567867693455,0.0372187660846359,0.0303366775647651 -lichen,lichen,north,,,Physcia.adscendens,TreedFen,5,0.033496884636421,0.0258181349816666,0.0405214391906766,0.033496884636421 -lichen,lichen,north,,,Physcia.adscendens,TreedSwamp,5,0.127824312427682,0.10439457327628,0.145753212080394,0.129977987858867 -lichen,lichen,north,,,Physcia.adscendens,GraminoidFen,5,0.0356574590224908,0.027239235299551,0.0458342153511507,0.0356574590224908 -lichen,lichen,north,,,Physcia.adscendens,ShrubbyFen,5,0.0342140335652919,0.0263641316624369,0.0432073837702072,0.0342140335652919 -lichen,lichen,north,,,Physcia.adscendens,ShrubbyBog,5,0.0314996512622481,0.0240617272622188,0.038642920620014,0.0314996512622481 -lichen,lichen,north,,,Physcia.adscendens,ShrubbySwamp,5,0.125349216770516,0.0973424296954802,0.141693661653428,0.125349216770516 -lichen,lichen,north,,,Physcia.adscendens,Marsh,5,0.0879264969679957,0.0638894252481001,0.10413661309277,0.0879264969679957 -lichen,lichen,north,,,Physcia.adscendens,Shrub,5,0.217306768306839,0.177722116469092,0.25094240615165,0.21909619000621 -lichen,lichen,north,,,Physcia.adscendens,Grass,5,0.255752574873662,0.202798368718069,0.309494641621698,0.255752574873662 -lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruceR,5,0.134579505041404,0.106566359078164,0.169762093411919,0.153137318561862 -lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce1,5,0.159356985870333,0.12551730686296,0.195733003247481,0.17472233290389 -lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce2,5,0.169427157082784,0.137926073308418,0.206625607964919,0.18730277633201 -lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce3,5,0.169427157082784,0.137926073308418,0.206625607964919,0.18730277633201 -lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce4,5,0.169427157082784,0.137926073308418,0.206625607964919,0.18730277633201 -lichen,lichen,north,,,Physcia.adscendens,CCPineR,5,0.135853106606989,0.107830700849556,0.173113188535039,0.154865202960644 -lichen,lichen,north,,,Physcia.adscendens,CCPine1,5,0.138925991399608,0.107733167901106,0.172357890555549,0.15476838066826 -lichen,lichen,north,,,Physcia.adscendens,CCPine2,5,0.143206092810703,0.111694247227964,0.175719884276117,0.159242837884132 -lichen,lichen,north,,,Physcia.adscendens,CCPine3,5,0.143206092810703,0.111694247227964,0.175719884276117,0.159242837884132 -lichen,lichen,north,,,Physcia.adscendens,CCPine4,5,0.143206092810703,0.111694247227964,0.175719884276117,0.159242837884132 -lichen,lichen,north,,,Physcia.adscendens,CCDeciduousR,5,0.187270582074541,0.148230815026816,0.221215741742339,0.206132428707949 -lichen,lichen,north,,,Physcia.adscendens,CCDeciduous1,5,0.206290169521746,0.178800568851486,0.255646063347353,0.235377679781569 -lichen,lichen,north,,,Physcia.adscendens,CCDeciduous2,5,0.181421847748252,0.15506968127878,0.222972690878233,0.208199852243512 -lichen,lichen,north,,,Physcia.adscendens,CCDeciduous3,5,0.181421847748252,0.15506968127878,0.222972690878233,0.208199852243512 -lichen,lichen,north,,,Physcia.adscendens,CCDeciduous4,5,0.181421847748252,0.15506968127878,0.222972690878233,0.208199852243512 -lichen,lichen,north,,,Physcia.adscendens,CCMixedwoodR,5,0.187270582074541,0.148230815026816,0.221215741742339,0.206132428707949 -lichen,lichen,north,,,Physcia.adscendens,CCMixedwood1,5,0.206290169521746,0.178800568851486,0.255646063347353,0.235377679781569 -lichen,lichen,north,,,Physcia.adscendens,CCMixedwood2,5,0.181421847748252,0.15506968127878,0.222972690878233,0.208199852243512 -lichen,lichen,north,,,Physcia.adscendens,CCMixedwood3,5,0.181421847748252,0.15506968127878,0.222972690878233,0.208199852243512 -lichen,lichen,north,,,Physcia.adscendens,CCMixedwood4,5,0.181421847748252,0.15506968127878,0.222972690878233,0.208199852243512 -lichen,lichen,north,,,Physcia.adscendens,EnSeismic,5,0.0559902156495264,0.0450389996829794,0.063162022530209,0.0655134588345379 -lichen,lichen,north,,,Physcia.adscendens,EnSoftLin,5,0.064110069904926,0.0486128343835806,0.0678688597629154,0.0697768863416448 -lichen,lichen,north,,,Physcia.adscendens,TrSoftLin,5,0.0467228650364718,0.0399577706600269,0.0576384467148874,0.058881483254521 -lichen,lichen,north,,,Physcia.adscendens,HardLin,5,0.0493451495047422,0.0391666686866418,0.0577595877606325,0.0487714656813048 -lichen,lichen,north,,,Physcia.adscendens,UrbInd,5,0.0764072515832514,0.0555226885679041,0.0933507532983004,0.0802096731192145 -lichen,lichen,north,,,Physcia.adscendens,Wellsites,5,0.0559024707707845,0.042698324468837,0.0713214459680398,0.0566484650167523 -lichen,lichen,north,,,Physcia.adscendens,Crop,5,0.0233600076765896,0.0162994624790713,0.0277077382676924,0.0239064995186528 -lichen,lichen,north,,,Physcia.adscendens,TameP,5,0.0647720336265828,0.0536621746759276,0.0746944108751399,0.0682683436932 -lichen,lichen,north,,,Physcia.adscendens,RoughP,5,0.0903485647539736,0.0764681003778962,0.107526408414187,0.0972957355532777 -lichen,lichen,south,,,Cladonia.chlorophaea,Loamy,5,0.0711095523804057,0.0615396544039222,0.0873640023441287,0.0778696228615501 -lichen,lichen,south,,,Cladonia.chlorophaea,SandyLoam,5,0.0669558263884111,0.0566416289689753,0.0767354645648717,0.0735391670882838 -lichen,lichen,south,,,Cladonia.chlorophaea,ClaySub,5,0.0670997262389032,0.0570566717431534,0.07783198623285,0.0735811496014876 -lichen,lichen,south,,,Cladonia.chlorophaea,RapidDrain,5,0.0666115068409651,0.0589181268496328,0.0705625490223415,0.0666115068409651 -lichen,lichen,south,,,Cladonia.chlorophaea,Blowout,5,0.0672990975495349,0.0617561190617265,0.0790852576828609,0.0672990975495349 -lichen,lichen,south,,,Cladonia.chlorophaea,ThinBreak,5,0.0686854871706772,0.0600881372034139,0.0718571895633798,0.0697591311347333 -lichen,lichen,south,,,Cladonia.chlorophaea,Other,5,0.00492116576724179,0.00179328595521191,0.0119142807694122,0.00492116576724179 -lichen,lichen,south,,,Cladonia.chlorophaea,EnSeismic,5,0.0622453464495927,0.0373574808760262,0.17872539502998,0.0466577038779196 -lichen,lichen,south,,,Cladonia.chlorophaea,EnSoftLin,5,0.0517567487465455,0.0403776037340564,0.184954973971726,0.038040565126713 -lichen,lichen,south,,,Cladonia.chlorophaea,TrSoftLin,5,0.0746140587297936,0.0357419097042295,0.219397411664499,0.0746140587297936 -lichen,lichen,south,,,Cladonia.chlorophaea,HardLin,5,0.013592607475638,0.0124634689890908,0.0155920066979704,0.0144144755450307 -lichen,lichen,south,,,Cladonia.chlorophaea,UrbInd,5,0.019379766458095,0.015692772230751,0.0225304733957075,0.019379766458095 -lichen,lichen,south,,,Cladonia.chlorophaea,Wellsites,5,0.022701154024468,0.0161827490300401,0.0286348700264202,0.022701154024468 -lichen,lichen,south,,,Cladonia.chlorophaea,Crop,5,0.00722850800015048,0.00618502948824642,0.00810592354133653,0.00722850800015048 -lichen,lichen,south,,,Cladonia.chlorophaea,TameP,5,0.0328421283698632,0.0305419870935615,0.0410321694106379,0.034808485051759 -lichen,lichen,south,,,Cladonia.chlorophaea,RoughP,5,0.0416452198287593,0.0380392683844879,0.0445156285504701,0.0418495106240208 -lichen,lichen,south,,,Physcia.adscendens,Loamy,5,0.185307491209447,0.168563448767941,0.198558700549421,0.185307491209447 -lichen,lichen,south,,,Physcia.adscendens,SandyLoam,5,0.187090337348794,0.168874063927985,0.207009934471911,0.187090337348794 -lichen,lichen,south,,,Physcia.adscendens,ClaySub,5,0.176847565312956,0.158930872004024,0.182796159194229,0.176847565312956 -lichen,lichen,south,,,Physcia.adscendens,RapidDrain,5,0.138998813516194,0.125734288859981,0.163845851123751,0.144844119510702 -lichen,lichen,south,,,Physcia.adscendens,Blowout,5,0.090304444350133,0.0670759368888286,0.106271276792021,0.090304444350133 -lichen,lichen,south,,,Physcia.adscendens,ThinBreak,5,0.111528415594478,0.0946979216799158,0.123434137285909,0.116292731708507 -lichen,lichen,south,,,Physcia.adscendens,Other,5,0.120972696681424,0.0901665330121894,0.176380105055838,0.154236617960994 -lichen,lichen,south,,,Physcia.adscendens,EnSeismic,5,0.133188070434216,0.108901350927189,0.151918850008194,0.10132273891866 -lichen,lichen,south,,,Physcia.adscendens,EnSoftLin,5,0.0838217618215749,0.0695606558073624,0.10949184990719,0.0657065549387281 -lichen,lichen,south,,,Physcia.adscendens,TrSoftLin,5,0.11700351234635,0.113381730844819,0.157602625994612,0.11700351234635 -lichen,lichen,south,,,Physcia.adscendens,HardLin,5,0.0234448746292444,0.0196758055138019,0.0253771487509822,0.0234448746292444 -lichen,lichen,south,,,Physcia.adscendens,UrbInd,5,0.0468717681891792,0.045915776072149,0.0680328278732017,0.0584978409080957 -lichen,lichen,south,,,Physcia.adscendens,Wellsites,5,0.0421096796706268,0.0417593426901775,0.0633167830463054,0.0539013816491975 -lichen,lichen,south,,,Physcia.adscendens,Crop,5,0.0115919080663084,0.00990369527975602,0.0121688285896611,0.0115919080663084 -lichen,lichen,south,,,Physcia.adscendens,TameP,5,0.0342785003876693,0.0267084511897149,0.0366998366344221,0.0342785003876693 -lichen,lichen,south,,,Physcia.adscendens,RoughP,5,0.0465936362218578,0.0388958541269103,0.0493968310675019,0.0477217933404628 -mite,mite,north,,,Ceratozetes.gracilis,WhiteSpruce,5,0.086563572861179,0.0767167182783778,0.103850297944825,0.0829175174899254 -mite,mite,north,,,Ceratozetes.gracilis,Pine,5,0.0676057357161677,0.0597889626226881,0.0808299073096749,0.0653737066067143 -mite,mite,north,,,Ceratozetes.gracilis,Deciduous,5,0.125632351831133,0.120257214804358,0.152116666252485,0.124987504484192 -mite,mite,north,,,Ceratozetes.gracilis,Mixedwood,5,0.102740054896251,0.0911162039820542,0.114888055268197,0.0961141497193831 -mite,mite,north,,,Ceratozetes.gracilis,BlackSpruce,5,0.0241266699970548,0.0221486160226852,0.0300508961337641,0.0232136037108846 -mite,mite,north,,,Ceratozetes.gracilis,TreedFen,5,0.0291436983742907,0.0266313578911309,0.0388477421265816,0.0291436983742907 -mite,mite,north,,,Ceratozetes.gracilis,TreedSwamp,5,0.0725645819253046,0.0620412036955493,0.0922586517345771,0.0725645819253046 -mite,mite,north,,,Ceratozetes.gracilis,GraminoidFen,5,0.029582506161117,0.0259755010707075,0.0371786434883822,0.0283799451413344 -mite,mite,north,,,Ceratozetes.gracilis,ShrubbyFen,5,0.0293003051542226,0.0259026482084509,0.0371425650287273,0.0284231983154652 -mite,mite,north,,,Ceratozetes.gracilis,ShrubbyBog,5,0.0250920755648613,0.0229629923604966,0.0314506787507892,0.024249472496002 -mite,mite,north,,,Ceratozetes.gracilis,ShrubbySwamp,5,0.0751382459063968,0.0617421810307777,0.0922584405695148,0.0751382459063968 -mite,mite,north,,,Ceratozetes.gracilis,Marsh,5,0.0597546799051676,0.0481667736774781,0.076011176791874,0.0549517667193043 -mite,mite,north,,,Ceratozetes.gracilis,Shrub,5,0.0762627142444002,0.0640387404617767,0.0890037195393509,0.0742012125044249 -mite,mite,north,,,Ceratozetes.gracilis,Grass,5,0.0822637736900863,0.0730158192233545,0.113159024184108,0.0822637736900863 -mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruceR,5,0.10299620507702,0.0939911339005037,0.127360184892372,0.10299620507702 -mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce1,5,0.119405831109742,0.105395916236163,0.143377668576338,0.119405831109742 -mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce2,5,0.119820585887542,0.106500697859523,0.135874182106685,0.117438284823892 -mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce3,5,0.119820585887542,0.106500697859523,0.135874182106685,0.117438284823892 -mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce4,5,0.119820585887542,0.106500697859523,0.135874182106685,0.117438284823892 -mite,mite,north,,,Ceratozetes.gracilis,CCPineR,5,0.107138745801614,0.0991111184906569,0.1310627193558,0.107138745801614 -mite,mite,north,,,Ceratozetes.gracilis,CCPine1,5,0.106322388686437,0.0984881924309444,0.12972104617042,0.106322388686437 -mite,mite,north,,,Ceratozetes.gracilis,CCPine2,5,0.106836815104621,0.0985247503643216,0.128561640199984,0.105801123187711 -mite,mite,north,,,Ceratozetes.gracilis,CCPine3,5,0.106836815104621,0.0985247503643216,0.128561640199984,0.105801123187711 -mite,mite,north,,,Ceratozetes.gracilis,CCPine4,5,0.106836815104621,0.0985247503643216,0.128561640199984,0.105801123187711 -mite,mite,north,,,Ceratozetes.gracilis,CCDeciduousR,5,0.132936133655999,0.128067434242984,0.155537027640493,0.128619054270295 -mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous1,5,0.164273889818037,0.151347125614095,0.185063646453912,0.152770868236052 -mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous2,5,0.124259292424775,0.120923587625806,0.145196460272158,0.124259292424775 -mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous3,5,0.124259292424775,0.120923587625806,0.145196460272158,0.124259292424775 -mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous4,5,0.124259292424775,0.120923587625806,0.145196460272158,0.124259292424775 -mite,mite,north,,,Ceratozetes.gracilis,CCMixedwoodR,5,0.132936133655999,0.128067434242984,0.155537027640493,0.128619054270295 -mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood1,5,0.164273889818037,0.151347125614095,0.185063646453912,0.152770868236052 -mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood2,5,0.124259292424775,0.120923587625806,0.145196460272158,0.124259292424775 -mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood3,5,0.124259292424775,0.120923587625806,0.145196460272158,0.124259292424775 -mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood4,5,0.124259292424775,0.120923587625806,0.145196460272158,0.124259292424775 -mite,mite,north,,,Ceratozetes.gracilis,EnSeismic,5,0.0892000327566164,0.0852924765426569,0.105651698869338,0.0863863188118811 -mite,mite,north,,,Ceratozetes.gracilis,EnSoftLin,5,0.0971724964558532,0.074607713107594,0.109467130555906,0.0835598316938897 -mite,mite,north,,,Ceratozetes.gracilis,TrSoftLin,5,0.0966485243715561,0.0727021177007835,0.107989309206506,0.0796090919531723 -mite,mite,north,,,Ceratozetes.gracilis,HardLin,5,0.030285389017103,0.0280919388876705,0.0430527922930095,0.030285389017103 -mite,mite,north,,,Ceratozetes.gracilis,UrbInd,5,0.0531877107104781,0.0413567979216014,0.0723145731703991,0.0499213392018499 -mite,mite,north,,,Ceratozetes.gracilis,Wellsites,5,0.0364783044505167,0.0327093739032554,0.0582351324661563,0.0364783044505167 -mite,mite,north,,,Ceratozetes.gracilis,Crop,5,0.0272509324404124,0.0242622005749426,0.0406762833651796,0.0272509324404124 -mite,mite,north,,,Ceratozetes.gracilis,TameP,5,0.0395987782723833,0.0328755530427585,0.052231246098323,0.0357630567524386 -mite,mite,north,,,Ceratozetes.gracilis,RoughP,5,0.0623490757063713,0.0519824292494706,0.0707941485092565,0.0565630088699719 -mite,mite,north,,,Trhypochthonius.tectorum,WhiteSpruce,5,0.0528174416220476,0.0470429073757102,0.0551954091231743,0.0492385519910045 -mite,mite,north,,,Trhypochthonius.tectorum,Pine,5,0.0584140684512024,0.052614647046147,0.0683527213169536,0.0584140684512024 -mite,mite,north,,,Trhypochthonius.tectorum,Deciduous,5,0.0524337030605855,0.0460399144908319,0.0583819302245161,0.0511347536386993 -mite,mite,north,,,Trhypochthonius.tectorum,Mixedwood,5,0.0530888311401915,0.0459989852364304,0.0572300804806354,0.0503188069652154 -mite,mite,north,,,Trhypochthonius.tectorum,BlackSpruce,5,0.0466153767699601,0.0390312782230719,0.0489398248022537,0.0466153767699601 -mite,mite,north,,,Trhypochthonius.tectorum,TreedFen,5,0.0397868461458001,0.0347684587689401,0.0425603168326677,0.0398306061756154 -mite,mite,north,,,Trhypochthonius.tectorum,TreedSwamp,5,0.0336045959652836,0.030272090513297,0.0364699382664357,0.0336045959652836 -mite,mite,north,,,Trhypochthonius.tectorum,GraminoidFen,5,0.0399575797477027,0.0348234370026121,0.0422700413774057,0.0399575797477027 -mite,mite,north,,,Trhypochthonius.tectorum,ShrubbyFen,5,0.0399074377327824,0.0354444041339281,0.0421067187992337,0.0399074377327824 -mite,mite,north,,,Trhypochthonius.tectorum,ShrubbyBog,5,0.0456537678977006,0.0386573508681974,0.0476945372943053,0.0456537678977006 -mite,mite,north,,,Trhypochthonius.tectorum,ShrubbySwamp,5,0.0287853968916506,0.026955528084015,0.0307101136832832,0.0287853968916506 -mite,mite,north,,,Trhypochthonius.tectorum,Marsh,5,0.0349094566129046,0.0315766837905335,0.0375194490158177,0.0342204386832978 -mite,mite,north,,,Trhypochthonius.tectorum,Shrub,5,0.0292239621535654,0.0231420017131017,0.0331576234294524,0.0322425562283813 -mite,mite,north,,,Trhypochthonius.tectorum,Grass,5,0.0444527060764193,0.0315734249567915,0.0481385394142575,0.0452693650218574 -mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruceR,5,0.0427572042195979,0.0385465979484639,0.0468834080024041,0.0427572042195979 -mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce1,5,0.0385213851479223,0.0376602801079395,0.0427534270225092,0.0388538182932539 -mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce2,5,0.0386033003986392,0.0381241227189354,0.0425410934782636,0.0394968698022702 -mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce3,5,0.0386033003986392,0.0381241227189354,0.0425410934782636,0.0394968698022702 -mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce4,5,0.0386033003986392,0.0381241227189354,0.0425410934782636,0.0394968698022702 -mite,mite,north,,,Trhypochthonius.tectorum,CCPineR,5,0.0463951493037776,0.0417507590889956,0.0531914251239524,0.0463951493037776 -mite,mite,north,,,Trhypochthonius.tectorum,CCPine1,5,0.0404378910028256,0.0390901164042141,0.0437866917404038,0.0404378910028256 -mite,mite,north,,,Trhypochthonius.tectorum,CCPine2,5,0.0405732816727818,0.0391296471473719,0.0442128755860879,0.0405732816727818 -mite,mite,north,,,Trhypochthonius.tectorum,CCPine3,5,0.0405732816727818,0.0391296471473719,0.0442128755860879,0.0405732816727818 -mite,mite,north,,,Trhypochthonius.tectorum,CCPine4,5,0.0405732816727818,0.0391296471473719,0.0442128755860879,0.0405732816727818 -mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduousR,5,0.0456285665859081,0.0424389773446854,0.0477117305649164,0.0417930832945295 -mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous1,5,0.0350894879155433,0.0346069477032076,0.0399950253825593,0.0344296436156036 -mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous2,5,0.0372909762227814,0.036816488022243,0.0412039115200715,0.0368933081231406 -mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous3,5,0.0372909762227814,0.036816488022243,0.0412039115200715,0.0368933081231406 -mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous4,5,0.0372909762227814,0.036816488022243,0.0412039115200715,0.0368933081231406 -mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwoodR,5,0.0456285665859081,0.0424389773446854,0.0477117305649164,0.0417930832945295 -mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood1,5,0.0350894879155433,0.0346069477032076,0.0399950253825593,0.0344296436156036 -mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood2,5,0.0372909762227814,0.036816488022243,0.0412039115200715,0.0368933081231406 -mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood3,5,0.0372909762227814,0.036816488022243,0.0412039115200715,0.0368933081231406 -mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood4,5,0.0372909762227814,0.036816488022243,0.0412039115200715,0.0368933081231406 -mite,mite,north,,,Trhypochthonius.tectorum,EnSeismic,5,0.0485139348560335,0.022299209632709,0.0631853341861569,0.0524369464232436 -mite,mite,north,,,Trhypochthonius.tectorum,EnSoftLin,5,0.0307123644746215,0.0170391108634837,0.0603209779022436,0.0382901264037748 -mite,mite,north,,,Trhypochthonius.tectorum,TrSoftLin,5,0.0283023906701695,0.0140472504901697,0.0484536423700281,0.0349855097212285 -mite,mite,north,,,Trhypochthonius.tectorum,HardLin,5,0.0275631110632781,0.0271011198512758,0.0299860657729306,0.0275631110632781 -mite,mite,north,,,Trhypochthonius.tectorum,UrbInd,5,0.02102789586149,0.0185209876556111,0.0277404823197269,0.02102789586149 -mite,mite,north,,,Trhypochthonius.tectorum,Wellsites,5,0.0255632683926702,0.022909238965072,0.0333254456849068,0.0255632683926702 -mite,mite,north,,,Trhypochthonius.tectorum,Crop,5,0.0189924168473029,0.0183738529763355,0.0201135533663764,0.0186828185710372 -mite,mite,north,,,Trhypochthonius.tectorum,TameP,5,0.0297706120995112,0.0261277769234512,0.0304412146651425,0.0297507770299335 -mite,mite,north,,,Trhypochthonius.tectorum,RoughP,5,0.0385430595610164,0.0364209049362696,0.0448310802520045,0.0442413576652145 -mite,mite,south,,,Ceratozetes.gracilis,Loamy,5,0.0238103122136407,0.0162916053812498,0.0254517325212418,0.0238103122136407 -mite,mite,south,,,Ceratozetes.gracilis,SandyLoam,5,0.0210959451329293,0.0157461340650897,0.0226226359663402,0.0210959451329293 -mite,mite,south,,,Ceratozetes.gracilis,ClaySub,5,0.0216053741377964,0.0166034445295144,0.0233693381933055,0.0216053741377964 -mite,mite,south,,,Ceratozetes.gracilis,RapidDrain,5,0.0133718783216547,0.00932138792451844,0.0250935825846901,0.0161752361101314 -mite,mite,south,,,Ceratozetes.gracilis,Blowout,5,0.0147755241581397,0.0105588510912554,0.0299668530715488,0.0159723022796187 -mite,mite,south,,,Ceratozetes.gracilis,ThinBreak,5,0.0119568306299684,0.0091383082572202,0.027039830856063,0.01486607926369 -mite,mite,south,,,Ceratozetes.gracilis,Other,5,0.00701396379096207,0.00252926113611137,0.0131961873214771,0.00579166660810339 -mite,mite,south,,,Ceratozetes.gracilis,EnSeismic,5,0.0295519285237416,0.0158705851196106,0.0793874276023725,0.0194759862111175 -mite,mite,south,,,Ceratozetes.gracilis,EnSoftLin,5,0.0282791090982643,0.0136535818975881,0.0665632634992758,0.015566543920319 -mite,mite,south,,,Ceratozetes.gracilis,TrSoftLin,5,0.030376609296344,0.0131656411945635,0.0724120783763525,0.0152056472563868 -mite,mite,south,,,Ceratozetes.gracilis,HardLin,5,0.00234013650199867,0.00157408130932093,0.00269640828134894,0.0028422579664061 -mite,mite,south,,,Ceratozetes.gracilis,UrbInd,5,0.00442694915749631,0.00259403504949584,0.004966609916281,0.00517914509861752 -mite,mite,south,,,Ceratozetes.gracilis,Wellsites,5,0.00327542265646592,0.00215915551000519,0.00376220379943654,0.00372749149596442 -mite,mite,south,,,Ceratozetes.gracilis,Crop,5,0.00127563611072267,0.000977139985559572,0.00177900764903674,0.00127563611072267 -mite,mite,south,,,Ceratozetes.gracilis,TameP,5,0.00344276486224722,0.0026343955073118,0.0049035086422344,0.00296970904161235 -mite,mite,south,,,Ceratozetes.gracilis,RoughP,5,0.00293393048720782,0.00272051771091779,0.00397145156682642,0.00293393048720782 -mite,mite,south,,,Trhypochthonius.tectorum,Loamy,5,0.0433762765721693,0.041575380974286,0.0456813889614279,0.0404535282457183 -mite,mite,south,,,Trhypochthonius.tectorum,SandyLoam,5,0.0370412611293415,0.0320849760745711,0.0388955310505179,0.033421514854404 -mite,mite,south,,,Trhypochthonius.tectorum,ClaySub,5,0.0397182245219592,0.0370378244744747,0.0425974265916945,0.0373334902833867 -mite,mite,south,,,Trhypochthonius.tectorum,RapidDrain,5,0.0348446652342381,0.0288876202906726,0.0373550679573903,0.0348446652342381 -mite,mite,south,,,Trhypochthonius.tectorum,Blowout,5,0.0493616083130368,0.0378196408421891,0.0615700842593314,0.0493616083130368 -mite,mite,south,,,Trhypochthonius.tectorum,ThinBreak,5,0.0391231265813762,0.0305066086263429,0.0433017470186029,0.0391231265813762 -mite,mite,south,,,Trhypochthonius.tectorum,Other,5,0.0267430656749916,0.0150331179914083,0.0615077965759264,0.0348200299289801 -mite,mite,south,,,Trhypochthonius.tectorum,EnSeismic,5,0.00395303813767026,0.000679143589089828,0.0077282875958993,0.00752231978083473 -mite,mite,south,,,Trhypochthonius.tectorum,EnSoftLin,5,0.0022394327419296,0.000250159707076951,0.00572219450269663,0.00532089527348282 -mite,mite,south,,,Trhypochthonius.tectorum,TrSoftLin,5,0.0018128522182454,0.000227022143876293,0.00421995140238705,0.0033920330144409 -mite,mite,south,,,Trhypochthonius.tectorum,HardLin,5,0.029746207849259,0.0230572595904927,0.0372347856944118,0.0249718244194546 -mite,mite,south,,,Trhypochthonius.tectorum,UrbInd,5,0.0184447426669055,0.0152714841534473,0.0221858027757421,0.0184447426669055 -mite,mite,south,,,Trhypochthonius.tectorum,Wellsites,5,0.0198084112982138,0.0160582694985444,0.0252779575385323,0.0198084112982138 -mite,mite,south,,,Trhypochthonius.tectorum,Crop,5,0.0167510174427364,0.0138665410123,0.0181835138663833,0.0167510174427364 -mite,mite,south,,,Trhypochthonius.tectorum,TameP,5,0.0294892078953274,0.0236923538570104,0.0371048913821795,0.0294892078953274 -mite,mite,south,,,Trhypochthonius.tectorum,RoughP,5,0.0285996367194483,0.0230952943982221,0.0327451288432799,0.0282098095755803 -vascular_plant,vascular_plant,north,,,Galium.boreale,WhiteSpruce,5,0.183121673715808,0.175017147461159,0.187146010646516,0.179937811836484 -vascular_plant,vascular_plant,north,,,Galium.boreale,Pine,5,0.160822240519723,0.153671777206748,0.16880386031362,0.157886997041383 -vascular_plant,vascular_plant,north,,,Galium.boreale,Deciduous,5,0.323838640092258,0.320902205843942,0.326165879340272,0.321302577635538 -vascular_plant,vascular_plant,north,,,Galium.boreale,Mixedwood,5,0.248056652958635,0.241904139529187,0.248992876428385,0.240515818751538 -vascular_plant,vascular_plant,north,,,Galium.boreale,BlackSpruce,5,0.0286184131550186,0.0278268302521937,0.0298297418830873,0.0286184131550186 -vascular_plant,vascular_plant,north,,,Galium.boreale,TreedFen,5,0.0275490996527874,0.0273330267523449,0.0286093502773019,0.0285089456895415 -vascular_plant,vascular_plant,north,,,Galium.boreale,TreedSwamp,5,0.0763457648374208,0.0717744957804654,0.0854722892248052,0.0755880399019759 -vascular_plant,vascular_plant,north,,,Galium.boreale,GraminoidFen,5,0.0316620628444337,0.0296102771197122,0.0317493238797606,0.031783055532387 -vascular_plant,vascular_plant,north,,,Galium.boreale,ShrubbyFen,5,0.0306675631079006,0.028459267435357,0.030899682848497,0.0306675631079006 -vascular_plant,vascular_plant,north,,,Galium.boreale,ShrubbyBog,5,0.029050927009874,0.028126253304527,0.0301460009806379,0.029050927009874 -vascular_plant,vascular_plant,north,,,Galium.boreale,ShrubbySwamp,5,0.0706517671396776,0.0624874269706742,0.0785987941676256,0.0696735869368905 -vascular_plant,vascular_plant,north,,,Galium.boreale,Marsh,5,0.0650100888691628,0.0587961988201134,0.0682898949037326,0.0650100888691628 -vascular_plant,vascular_plant,north,,,Galium.boreale,Shrub,5,0.252023224803696,0.23116858341554,0.291923912797255,0.252023224803696 -vascular_plant,vascular_plant,north,,,Galium.boreale,Grass,5,0.273529817720032,0.235042245742591,0.302326820902852,0.25320192046881 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruceR,5,0.192040060293012,0.183858614935153,0.213460844580877,0.192040060293012 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce1,5,0.200328585816406,0.183875276951943,0.221395216421019,0.200328585816406 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce2,5,0.195024220701432,0.189933465252437,0.222305058749617,0.195024220701432 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce3,5,0.195024220701432,0.189933465252437,0.222305058749617,0.195024220701432 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce4,5,0.195024220701432,0.189933465252437,0.222305058749617,0.195024220701432 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCPineR,5,0.177728990894232,0.170528480101811,0.199319355800762,0.175481244356181 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine1,5,0.171918094970603,0.166298582262056,0.182650224642672,0.170696692484412 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine2,5,0.171068459774545,0.165967261527443,0.182144535119517,0.168683034103466 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine3,5,0.171068459774545,0.165967261527443,0.182144535119517,0.168683034103466 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine4,5,0.171068459774545,0.165967261527443,0.182144535119517,0.168683034103466 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduousR,5,0.243698742131102,0.228005718359401,0.255341310383756,0.233629236744504 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous1,5,0.289272344562207,0.278827384761615,0.314873495331392,0.281412031987215 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous2,5,0.238190521595173,0.229682650443223,0.259739317474075,0.238190521595173 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous3,5,0.238190521595173,0.229682650443223,0.259739317474075,0.238190521595173 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous4,5,0.238190521595173,0.229682650443223,0.259739317474075,0.238190521595173 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwoodR,5,0.243698742131102,0.228005718359401,0.255341310383756,0.233629236744504 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood1,5,0.289272344562207,0.278827384761615,0.314873495331392,0.281412031987215 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood2,5,0.238190521595173,0.229682650443223,0.259739317474075,0.238190521595173 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood3,5,0.238190521595173,0.229682650443223,0.259739317474075,0.238190521595173 -vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood4,5,0.238190521595173,0.229682650443223,0.259739317474075,0.238190521595173 -vascular_plant,vascular_plant,north,,,Galium.boreale,EnSeismic,5,0.0875105193731231,0.0732083686118318,0.0944803257900605,0.0875105193731231 -vascular_plant,vascular_plant,north,,,Galium.boreale,EnSoftLin,5,0.0886000656233342,0.077139983069639,0.0979615614665123,0.0886000656233342 -vascular_plant,vascular_plant,north,,,Galium.boreale,TrSoftLin,5,0.0874053978345603,0.0736681689001696,0.0937757064565243,0.0874053978345603 -vascular_plant,vascular_plant,north,,,Galium.boreale,HardLin,5,0.0559027986831825,0.0502145592934445,0.0652680752808498,0.0559027986831825 -vascular_plant,vascular_plant,north,,,Galium.boreale,UrbInd,5,0.0561313834575388,0.0508538103223802,0.0641692994614501,0.0561313834575388 -vascular_plant,vascular_plant,north,,,Galium.boreale,Wellsites,5,0.0530243957815623,0.0453484536105281,0.0640958472423716,0.0530243957815623 -vascular_plant,vascular_plant,north,,,Galium.boreale,Crop,5,0.0258110195330383,0.0221573451465345,0.0287061904273492,0.0258110195330383 -vascular_plant,vascular_plant,north,,,Galium.boreale,TameP,5,0.0613931977354205,0.0569873262354261,0.0679942754753597,0.0589997552075799 -vascular_plant,vascular_plant,north,,,Galium.boreale,RoughP,5,0.0979808674648413,0.0890803699445946,0.117007581054317,0.0961185940775852 -vascular_plant,vascular_plant,north,,,Vicia.americana,WhiteSpruce,5,0.101553761027206,0.0913929554412134,0.103144305327603,0.101553761027206 -vascular_plant,vascular_plant,north,,,Vicia.americana,Pine,5,0.0998247211617761,0.0888576317158279,0.106866967953181,0.100377545526554 -vascular_plant,vascular_plant,north,,,Vicia.americana,Deciduous,5,0.223504144576426,0.209303224861102,0.229143320183743,0.225270102028411 -vascular_plant,vascular_plant,north,,,Vicia.americana,Mixedwood,5,0.166020096402123,0.157521812078803,0.169401092615307,0.166442718248815 -vascular_plant,vascular_plant,north,,,Vicia.americana,BlackSpruce,5,0.0152382225104409,0.0131815651592785,0.0156933953833105,0.0158904616319235 -vascular_plant,vascular_plant,north,,,Vicia.americana,TreedFen,5,0.0148150262651934,0.0131140873613808,0.0159433848997332,0.0161609410518398 -vascular_plant,vascular_plant,north,,,Vicia.americana,TreedSwamp,5,0.0626854739607867,0.0578234419599208,0.0726342763088379,0.0675081415730946 -vascular_plant,vascular_plant,north,,,Vicia.americana,GraminoidFen,5,0.0172289489029456,0.0148633347804432,0.0179211695883927,0.0182945565459449 -vascular_plant,vascular_plant,north,,,Vicia.americana,ShrubbyFen,5,0.0170030528799768,0.015145514732073,0.0178813511526892,0.0181281737827822 -vascular_plant,vascular_plant,north,,,Vicia.americana,ShrubbyBog,5,0.0156367177151313,0.0136590554777173,0.0161282336201734,0.0163927557010309 -vascular_plant,vascular_plant,north,,,Vicia.americana,ShrubbySwamp,5,0.0583505124998893,0.0530026160375959,0.0660615188685165,0.0634022552382413 -vascular_plant,vascular_plant,north,,,Vicia.americana,Marsh,5,0.0557898212495504,0.0528857121313063,0.0648596355824789,0.0604419474510517 -vascular_plant,vascular_plant,north,,,Vicia.americana,Shrub,5,0.164232328257922,0.152471445214372,0.189356863032936,0.172247590325508 -vascular_plant,vascular_plant,north,,,Vicia.americana,Grass,5,0.189591812325837,0.180789380071826,0.195223068881098,0.193480328766703 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruceR,5,0.138865647030093,0.133170222713371,0.144891610906666,0.147784161910856 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce1,5,0.167515719027838,0.160357501021988,0.176063584763535,0.177990441786736 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce2,5,0.156294302850796,0.144320379020152,0.170257316425211,0.164040271666844 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce3,5,0.156294302850796,0.144320379020152,0.170257316425211,0.164040271666844 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce4,5,0.156294302850796,0.144320379020152,0.170257316425211,0.164040271666844 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCPineR,5,0.140410555161451,0.131933181529334,0.146001243719552,0.146947892442068 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine1,5,0.144746387069471,0.135879363458001,0.156740570136221,0.155709937975558 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine2,5,0.140463102773397,0.132291852364442,0.154362590654316,0.15194678637839 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine3,5,0.140463102773397,0.132291852364442,0.154362590654316,0.15194678637839 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine4,5,0.140463102773397,0.132291852364442,0.154362590654316,0.15194678637839 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduousR,5,0.186268009445281,0.179873753389021,0.193726144287162,0.194965312502246 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous1,5,0.226880224259965,0.213353736860118,0.232208272227364,0.232880630175656 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous2,5,0.190428075875072,0.18281204800814,0.201313954413402,0.199972978968214 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous3,5,0.190428075875072,0.18281204800814,0.201313954413402,0.199972978968214 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous4,5,0.190428075875072,0.18281204800814,0.201313954413402,0.199972978968214 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwoodR,5,0.186268009445281,0.179873753389021,0.193726144287162,0.194965312502246 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood1,5,0.226880224259965,0.213353736860118,0.232208272227364,0.232880630175656 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood2,5,0.190428075875072,0.18281204800814,0.201313954413402,0.199972978968214 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood3,5,0.190428075875072,0.18281204800814,0.201313954413402,0.199972978968214 -vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood4,5,0.190428075875072,0.18281204800814,0.201313954413402,0.199972978968214 -vascular_plant,vascular_plant,north,,,Vicia.americana,EnSeismic,5,0.265392025080583,0.214389458724113,0.29690478942424,0.265392025080583 -vascular_plant,vascular_plant,north,,,Vicia.americana,EnSoftLin,5,0.298814173633524,0.236929158251934,0.340754085784134,0.298814173633524 -vascular_plant,vascular_plant,north,,,Vicia.americana,TrSoftLin,5,0.227845819559914,0.184048162622374,0.253779885488772,0.227845819559914 -vascular_plant,vascular_plant,north,,,Vicia.americana,HardLin,5,0.0748385066486699,0.0709465060040099,0.0759426399863492,0.074608145928891 -vascular_plant,vascular_plant,north,,,Vicia.americana,UrbInd,5,0.0854741045400396,0.0784174133968789,0.093873670322466,0.0853653032495656 -vascular_plant,vascular_plant,north,,,Vicia.americana,Wellsites,5,0.0737419729385725,0.0663486071752425,0.091252322788661,0.0843795108863626 -vascular_plant,vascular_plant,north,,,Vicia.americana,Crop,5,0.036655361677642,0.0337129300431386,0.0375198866500137,0.0380361941275467 -vascular_plant,vascular_plant,north,,,Vicia.americana,TameP,5,0.0748761999347293,0.0671002609890585,0.0846241909092322,0.0748761999347293 -vascular_plant,vascular_plant,north,,,Vicia.americana,RoughP,5,0.0717382740038997,0.062013045721503,0.081268618052669,0.0717382740038997 -vascular_plant,vascular_plant,south,,,Galium.boreale,Loamy,5,0.134365402417369,0.123106543128346,0.150976516544205,0.144796630860666 -vascular_plant,vascular_plant,south,,,Galium.boreale,SandyLoam,5,0.091938282951146,0.0834941504262747,0.0993411400257454,0.0960115962056319 -vascular_plant,vascular_plant,south,,,Galium.boreale,ClaySub,5,0.114046654257758,0.100318358261911,0.128310081890109,0.120945237158297 -vascular_plant,vascular_plant,south,,,Galium.boreale,RapidDrain,5,0.05310323606415,0.0444694077828011,0.0592230385085375,0.0560393911252958 -vascular_plant,vascular_plant,south,,,Galium.boreale,Blowout,5,0.0714452374990417,0.057084703882324,0.0762765469979775,0.0714452374990417 -vascular_plant,vascular_plant,south,,,Galium.boreale,ThinBreak,5,0.0671197829074706,0.052166883497761,0.0686688886106393,0.0671197829074706 -vascular_plant,vascular_plant,south,,,Galium.boreale,Other,5,0.0164649507555984,0.00993121036277023,0.0253623429302738,0.0228159947658059 -vascular_plant,vascular_plant,south,,,Galium.boreale,EnSeismic,5,0.0415016553380274,0.0231540080687652,0.085101406270251,0.0229861380647585 -vascular_plant,vascular_plant,south,,,Galium.boreale,EnSoftLin,5,0.0407276571975449,0.0286326189698712,0.107018561270878,0.0279355914860159 -vascular_plant,vascular_plant,south,,,Galium.boreale,TrSoftLin,5,0.0226385168950732,0.00835865355823153,0.0475095701843972,0.010693670158572 -vascular_plant,vascular_plant,south,,,Galium.boreale,HardLin,5,0.00673426222555851,0.00531954014393854,0.0106092249476061,0.00976625629745091 -vascular_plant,vascular_plant,south,,,Galium.boreale,UrbInd,5,0.00985092254439493,0.00851868437300072,0.0111799736158844,0.00940783365535566 -vascular_plant,vascular_plant,south,,,Galium.boreale,Wellsites,5,0.0119568557789859,0.0100635722829671,0.0139439952155709,0.0119372766800421 -vascular_plant,vascular_plant,south,,,Galium.boreale,Crop,5,0.0035421828121118,0.0029236779346984,0.0044376576473726,0.00423757624145812 -vascular_plant,vascular_plant,south,,,Galium.boreale,TameP,5,0.00753117359803952,0.00544538332822283,0.00848441500382163,0.00815694324953152 -vascular_plant,vascular_plant,south,,,Galium.boreale,RoughP,5,0.0103140314496203,0.00799607214712183,0.0132882007874275,0.0115163243840628 -vascular_plant,vascular_plant,south,,,Vicia.americana,Loamy,5,0.290256170393407,0.27517564488482,0.305591641737234,0.28326053160004 -vascular_plant,vascular_plant,south,,,Vicia.americana,SandyLoam,5,0.247694102021608,0.240243796194645,0.264898126840318,0.246992793299344 -vascular_plant,vascular_plant,south,,,Vicia.americana,ClaySub,5,0.304804176654528,0.288824323211772,0.319488697106166,0.298730042472979 -vascular_plant,vascular_plant,south,,,Vicia.americana,RapidDrain,5,0.161543641211127,0.14461304867818,0.187076574600276,0.161543641211127 -vascular_plant,vascular_plant,south,,,Vicia.americana,Blowout,5,0.118486235053307,0.106602712514188,0.133493364719528,0.118464883887892 -vascular_plant,vascular_plant,south,,,Vicia.americana,ThinBreak,5,0.178106045017269,0.168348667462815,0.19813445742055,0.178391738601418 -vascular_plant,vascular_plant,south,,,Vicia.americana,Other,5,0.105690469757533,0.0622060495880062,0.119017839454214,0.105690469757533 -vascular_plant,vascular_plant,south,,,Vicia.americana,EnSeismic,5,0.0980197206348814,0.0533787007453977,0.12395969266943,0.138807834520618 -vascular_plant,vascular_plant,south,,,Vicia.americana,EnSoftLin,5,0.123299345466385,0.0671820694144946,0.170108003098189,0.184229861785201 -vascular_plant,vascular_plant,south,,,Vicia.americana,TrSoftLin,5,0.061746168627948,0.0310306329082704,0.0818736395608765,0.0834557721649041 -vascular_plant,vascular_plant,south,,,Vicia.americana,HardLin,5,0.0400414879581075,0.0377218470887579,0.0460915895820948,0.0366124257600541 -vascular_plant,vascular_plant,south,,,Vicia.americana,UrbInd,5,0.0397873604916118,0.0333793697344656,0.0421853226025111,0.0305480068381504 -vascular_plant,vascular_plant,south,,,Vicia.americana,Wellsites,5,0.0394794040260986,0.0345420466372147,0.0484006240004426,0.0313886488169569 -vascular_plant,vascular_plant,south,,,Vicia.americana,Crop,5,0.0276163960433134,0.0254603950739441,0.0315801144177112,0.0267332266250596 -vascular_plant,vascular_plant,south,,,Vicia.americana,TameP,5,0.0369597153253211,0.0340452379630624,0.0420353017354891,0.0362057249277776 -vascular_plant,vascular_plant,south,,,Vicia.americana,RoughP,5,0.044197627974472,0.0423406929386505,0.0510202256161932,0.044197627974472 diff --git a/3_output/exp_002_soilgrids/tables/metric_summary.csv b/3_output/exp_002_soilgrids/tables/metric_summary.csv deleted file mode 100644 index 1dc2d7e..0000000 --- a/3_output/exp_002_soilgrids/tables/metric_summary.csv +++ /dev/null @@ -1,281 +0,0 @@ -taxon,run,region,season,part,species,metric,n,median,p10,p90,boot1,mean,sd -bird,bird,north,,,AMRO,insample_auc,5,0.727303456784837,0.725711038181871,0.729613951409614,0.725093042132072,0.727630018238359,0.00194404337247345 -bird,bird,north,,,AMRO,insample_deviance_explained,5,0.14519328133972,0.144668154403979,0.147396983871279,0.144398414502294,0.145796688518119,0.00153117084983031 -bird,bird,north,,,AMRO,insample_rmse,5,0.661354037764462,0.65968432238753,0.662286211491476,0.661681263586436,0.66105335849383,0.00130634684915172 -bird,bird,north,,,AMRO,insample_spearman,5,0.348368446682244,0.345642286335333,0.351427749339817,0.344594857009641,0.348554800791249,0.00288989339610282 -bird,bird,north,,,AMRO,insample_calibration_slope,5,0.815509206232624,0.806415655970331,0.819035107673148,0.815509206232624,0.813374829717896,0.00632802625293927 -bird,bird,north,,,AMRO,insample_prevalence,5,0.251486631016043,0.251004373826971,0.252433263182893,0.250861017819325,0.251649276245993,0.000745639638422784 -bird,bird,north,,,AMRO,insample_n,5,46747,46745.2,46750,46747,46747.6,2.50998007960223 -bird,bird,north,,,AMRO,oob_auc,5,0.734023343536981,0.733817272156733,0.734279956659434,0.734199105714746,0.734045152660858,0.000229847931860535 -bird,bird,north,,,AMRO,oob_deviance_explained,5,0.153724433176458,0.152069194049738,0.153798394539067,0.153798057275933,0.153142433592363,0.000973451190872636 -bird,bird,north,,,AMRO,oob_rmse,5,0.658706291419864,0.658263249373708,0.659821973453664,0.658706291419864,0.658949208075237,0.000853758653717189 -bird,bird,north,,,AMRO,oob_spearman,5,0.353344172753754,0.353135398164249,0.353590234827781,0.353591885806112,0.353366644108331,0.000228364243061001 -bird,bird,north,,,AMRO,oob_calibration_slope,5,0.823855891796677,0.808483620525582,0.826773167710649,0.82610692899831,0.819671413052643,0.0112069606528229 -bird,bird,north,,,AMRO,oob_prevalence,5,0.241010939026539,0.240656718532255,0.241191818078906,0.241245385459292,0.240950250724789,0.000279167052473422 -bird,bird,north,,,AMRO,oob_n,5,124877,124874,124878.8,124877,124876.4,2.50998007960223 -bird,bird,north,,,YEWA,insample_auc,5,0.779655634201043,0.778396232776986,0.779664529278336,0.779655634201043,0.779158503768779,0.000689345639250155 -bird,bird,north,,,YEWA,insample_deviance_explained,5,0.250380022780984,0.248514326933616,0.253214564643268,0.249855757239124,0.250847686168765,0.0023786804698449 -bird,bird,north,,,YEWA,insample_rmse,5,0.557238273909436,0.551558931771127,0.559373118006877,0.557238273909436,0.556039843202715,0.00438515558268098 -bird,bird,north,,,YEWA,insample_spearman,5,0.316033669489273,0.314478245662591,0.316656919612435,0.316033669489273,0.315686345864597,0.00114608991736538 -bird,bird,north,,,YEWA,insample_calibration_slope,5,0.672203823921537,0.657965260572002,0.678074364196331,0.671594605439437,0.669548423592448,0.0120482095631841 -bird,bird,north,,,YEWA,insample_prevalence,5,0.118296361263824,0.117706951871658,0.119214980837802,0.118296361263824,0.118418937588893,0.00074585019883292 -bird,bird,north,,,YEWA,insample_n,5,46747,46745.2,46750,46747,46747.6,2.50998007960223 -bird,bird,north,,,YEWA,oob_auc,5,0.729138016088756,0.727968360006595,0.730087521535925,0.72989285100549,0.729068486279537,0.00104890018238483 -bird,bird,north,,,YEWA,oob_deviance_explained,5,0.169207575895256,0.167584664917222,0.170806750066792,0.169964339278164,0.169146219790066,0.00161452447621064 -bird,bird,north,,,YEWA,oob_rmse,5,0.600550005409724,0.597811431708625,0.609178290908106,0.599341474068351,0.602705702790408,0.00601772200467047 -bird,bird,north,,,YEWA,oob_spearman,5,0.27472368459978,0.273109972454328,0.275489130796922,0.275344718858053,0.274375927216791,0.00119511184350679 -bird,bird,north,,,YEWA,oob_calibration_slope,5,0.586073485526936,0.552280783456896,0.611309961382017,0.602383790654002,0.583277960002652,0.0298155988242715 -bird,bird,north,,,YEWA,oob_prevalence,5,0.13458843502006,0.134244406707603,0.134809487963868,0.13458843502006,0.134542639141448,0.000279456693593184 -bird,bird,north,,,YEWA,oob_n,5,124877,124874,124878.8,124877,124876.4,2.50998007960223 -bird,bird,south,,,AMRO,insample_auc,5,0.705575013613627,0.704878350329605,0.710655998018277,0.704976763112746,0.707213557939715,0.00307322647675945 -bird,bird,south,,,AMRO,insample_deviance_explained,5,0.108018376409751,0.106308908870441,0.110833171681397,0.105268282244838,0.108400467273317,0.00259009012122253 -bird,bird,south,,,AMRO,insample_rmse,5,0.737871848095843,0.735232492006093,0.741723824033828,0.742374907127595,0.738450643072423,0.00334705812434499 -bird,bird,south,,,AMRO,insample_spearman,5,0.314020783349143,0.311284333117702,0.320905207221841,0.310700164999667,0.315586379723976,0.00484940045804023 -bird,bird,south,,,AMRO,insample_calibration_slope,5,0.887686200684523,0.884964799297751,0.897197822968249,0.884727765191459,0.890009442156545,0.00680212573461749 -bird,bird,south,,,AMRO,insample_prevalence,5,0.258598079444985,0.257039179794386,0.259660332963851,0.25655668358714,0.258393144664086,0.00135079625989253 -bird,bird,south,,,AMRO,insample_n,5,23639,23636.8,23639.6,23640,23638.4,1.51657508881031 -bird,bird,south,,,AMRO,oob_auc,5,0.707409744327906,0.705964827996741,0.70752324068811,0.707445220375046,0.706932664928734,0.000920100309312525 -bird,bird,south,,,AMRO,oob_deviance_explained,5,0.114411048006673,0.108972083391834,0.114596483929917,0.11445736631275,0.112506356756515,0.00330499518342422 -bird,bird,south,,,AMRO,oob_rmse,5,0.732117993456783,0.730870577009875,0.733679457796853,0.730608101449593,0.732195156099169,0.00145794407999724 -bird,bird,south,,,AMRO,oob_spearman,5,0.317998227692073,0.315895688582247,0.318168123637075,0.318148117020463,0.317324033331328,0.00139470561444103 -bird,bird,south,,,AMRO,oob_calibration_slope,5,0.891948751621871,0.88417698425351,0.9243603899157,0.92680845181501,0.901598612020095,0.0205781437164769 -bird,bird,south,,,AMRO,oob_prevalence,5,0.259989876131491,0.259616009340861,0.260538534890505,0.260708383581223,0.260061995930024,0.000475417680104008 -bird,bird,south,,,AMRO,oob_n,5,67168,67167.4,67170.2,67167,67168.6,1.51657508881031 -bird,bird,south,,,YEWA,insample_auc,5,0.731273312869415,0.728979187764324,0.733778454513336,0.732857457343122,0.731400772585055,0.0024409495926968 -bird,bird,south,,,YEWA,insample_deviance_explained,5,0.222275180051316,0.215162325650453,0.228589061242964,0.221075298479638,0.222282103086541,0.00708156788774878 -bird,bird,south,,,YEWA,insample_rmse,5,0.655192203198479,0.648944241354543,0.65835094366001,0.659248385050619,0.654236654570076,0.00535259625305425 -bird,bird,south,,,YEWA,insample_spearman,5,0.310524235319594,0.306732626579317,0.313999231774709,0.31237582191587,0.310442303010522,0.00369862060585044 -bird,bird,south,,,YEWA,insample_calibration_slope,5,0.750968052780445,0.744668030119233,0.762228995766277,0.741762815386072,0.753048899664469,0.00881564860206595 -bird,bird,south,,,YEWA,insample_prevalence,5,0.171376597004823,0.170895553957443,0.17183640258529,0.171742808798646,0.171382167859753,0.000475861876686407 -bird,bird,south,,,YEWA,insample_n,5,23639,23636.8,23639.6,23640,23638.4,1.51657508881031 -bird,bird,south,,,YEWA,oob_auc,5,0.723069086473011,0.721099688539643,0.723649863813712,0.723240712067429,0.722599124483331,0.00152663967854732 -bird,bird,south,,,YEWA,oob_deviance_explained,5,0.195546538227486,0.189290746501375,0.199214435413595,0.198719114435923,0.194480092916936,0.00496301250858806 -bird,bird,south,,,YEWA,oob_rmse,5,0.659379612927127,0.658580248033203,0.660226057455577,0.659379612927127,0.659381455069292,0.000883092520734529 -bird,bird,south,,,YEWA,oob_spearman,5,0.302614567847971,0.299809993407358,0.303213205497054,0.302614567847971,0.301825236336348,0.00195694103505098 -bird,bird,south,,,YEWA,oob_calibration_slope,5,0.772399987889613,0.762518560243982,0.811242635717965,0.771312410978423,0.783032507339127,0.0267993169878693 -bird,bird,south,,,YEWA,oob_prevalence,5,0.175869820899522,0.175707986864887,0.176039185326346,0.175741063319785,0.175867891893267,0.000167508533766851 -bird,bird,south,,,YEWA,oob_n,5,67168,67167.4,67170.2,67167,67168.6,1.51657508881031 -bryophyte,bryophyte,north,,,Bryum.All,insample_auc,5,0.645438678319358,0.640143013693698,0.648974650481031,0.646288106268029,0.644846880590306,0.00488802735998912 -bryophyte,bryophyte,north,,,Bryum.All,insample_deviance_explained,5,-0.268716508542459,-0.29525925153349,-0.240839067741261,-0.238530728778354,-0.267362689418132,0.0273270798206204 -bryophyte,bryophyte,north,,,Bryum.All,insample_rmse,5,0.477508024217118,0.477302092283144,0.478058916137398,0.477318125770032,0.477640486663788,0.000380797902274672 -bryophyte,bryophyte,north,,,Bryum.All,insample_spearman,5,0.246623426325212,0.237316943922339,0.252978025431068,0.248223059030884,0.245638041034033,0.00864982717367011 -bryophyte,bryophyte,north,,,Bryum.All,insample_calibration_slope,5,0.790944719763504,0.767041947392787,0.822153724629447,0.819300114289679,0.794258597462813,0.0271987552660851 -bryophyte,bryophyte,north,,,Bryum.All,insample_prevalence,5,0.398064516129032,0.394842178778593,0.401444131744783,0.399586776859504,0.398187077076464,0.00351289819778104 -bryophyte,bryophyte,north,,,Bryum.All,insample_n,5,3089,3064.6,4144,4840,3432.4,787.035132633862 -bryophyte,bryophyte,north,,,Bryum.All,oob_auc,4,0.636724713746148,0.631907442524219,0.648178011550941,,0.639094723240028,0.00914178303436269 -bryophyte,bryophyte,north,,,Bryum.All,oob_deviance_explained,4,-0.18718781209728,-0.226145587790541,-0.143242634351008,,-0.185406597078347,0.0462486042853763 -bryophyte,bryophyte,north,,,Bryum.All,oob_rmse,4,0.48001304026787,0.478369042353368,0.480787747743882,,0.479702579396981,0.00144911502030775 -bryophyte,bryophyte,north,,,Bryum.All,oob_spearman,4,0.232291133424443,0.223539070480554,0.252350619810064,,0.236329498939347,0.0161333315493219 -bryophyte,bryophyte,north,,,Bryum.All,oob_calibration_slope,4,0.762915294786881,0.704496017683124,0.844033190168284,,0.771021944171754,0.0775320732914624 -bryophyte,bryophyte,north,,,Bryum.All,oob_prevalence,4,0.402680037532254,0.396685168352447,0.408753889905477,,0.402708245815617,0.00691232105373736 -bryophyte,bryophyte,north,,,Bryum.All,oob_n,5,1751,696,1775.4,0,1407.6,787.035132633862 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_auc,5,0.703665242626544,0.699417664956064,0.715701201445071,0.70133700524123,0.706831765387237,0.00818899470920308 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_deviance_explained,5,-0.109817229270958,-0.126658087878109,-0.0858853484418814,-0.122879347229834,-0.107036376437477,0.0200585065427151 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_rmse,5,0.465231802567325,0.461064322301624,0.466055809513769,0.465943776290589,0.463907838623387,0.00257667724658725 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_spearman,5,0.350858773598705,0.342841129941644,0.370723935658011,0.346325629014874,0.355659270007706,0.0139378464407726 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_calibration_slope,5,0.893720303659002,0.889259975708755,0.904410242357111,0.903354628974708,0.896155070619309,0.00761986167242145 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_prevalence,5,0.441322314049587,0.434239459960079,0.445725573122853,0.441322314049587,0.440243382720893,0.00595720988661147 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_n,5,3057,3023,4141.2,4840,3408,801.034955541891 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_auc,4,0.676871041258478,0.669683864782122,0.695297817033519,,0.680885183865151,0.0146667878363095 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_deviance_explained,4,-0.180571560700292,-0.192631476235452,-0.13911966790968,,-0.170074425966202,0.031407480332948 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_rmse,4,0.473930826803897,0.467822620482704,0.479418141958958,,0.47370907995885,0.00622242177049125 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_spearman,4,0.30429353980202,0.292108575222129,0.336008386942175,,0.311268497859257,0.0253124609282549 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_calibration_slope,4,0.779224987425304,0.742387693307393,0.860199366409052,,0.794988232020246,0.0660024140343829 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_prevalence,4,0.443724744159599,0.433062649413729,0.454817600944621,,0.443878587745011,0.011771212136753 -bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_n,5,1783,698.8,1817,0,1432,801.034955541891 -bryophyte,bryophyte,south,,,Bryum.All,insample_auc,5,0.633062660266947,0.624852536030857,0.637944803008397,0.635297889161707,0.631916018932487,0.00689440976052932 -bryophyte,bryophyte,south,,,Bryum.All,insample_deviance_explained,5,-0.0858218633162591,-0.111998906299959,-0.0712451207745009,-0.0624738751774538,-0.090483994765603,0.0213468095916658 -bryophyte,bryophyte,south,,,Bryum.All,insample_rmse,5,0.472776421038776,0.472216517752835,0.474378078636802,0.472373364601682,0.47318714273551,0.00108577964303642 -bryophyte,bryophyte,south,,,Bryum.All,insample_spearman,5,0.222693069262357,0.208373548006976,0.23075269704811,0.226355286746908,0.220543810327988,0.0118833816026941 -bryophyte,bryophyte,south,,,Bryum.All,insample_calibration_slope,5,0.870684175888943,0.807376857509114,0.894623019255288,0.906917413794925,0.856457310150308,0.0476012112351322 -bryophyte,bryophyte,south,,,Bryum.All,insample_prevalence,5,0.370562770562771,0.365528360602252,0.371569237798783,0.370562770562771,0.369235286484943,0.00385091464779508 -bryophyte,bryophyte,south,,,Bryum.All,insample_n,5,1444,1429.8,1968,2310,1614.6,388.936113005722 -bryophyte,bryophyte,south,,,Bryum.All,oob_auc,4,0.621173595565957,0.607145109009208,0.639722642653354,,0.62278808146976,0.0175700311126117 -bryophyte,bryophyte,south,,,Bryum.All,oob_deviance_explained,4,-0.0313682868448359,-0.0462566766703623,0.0140859438332701,,-0.0204519151117717,0.0348305979615314 -bryophyte,bryophyte,south,,,Bryum.All,oob_rmse,4,0.476185031434622,0.473162308921676,0.477433831677277,,0.475551487766661,0.00253520611918453 -bryophyte,bryophyte,south,,,Bryum.All,oob_spearman,4,0.202540064848457,0.179266074147793,0.234873537862193,,0.205775594245983,0.0300466681758383 -bryophyte,bryophyte,south,,,Bryum.All,oob_calibration_slope,4,0.799096498905282,0.708396090257747,0.892909581894416,,0.800208168312996,0.100120405827101 -bryophyte,bryophyte,south,,,Bryum.All,oob_prevalence,4,0.3703593055487,0.368749240306309,0.380219211352906,,0.37330567717792,0.0072755089177001 -bryophyte,bryophyte,south,,,Bryum.All,oob_n,5,866,342,880.2,0,695.4,388.936113005722 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_auc,5,0.717378917378917,0.71461619233714,0.722175713645606,0.713148524296276,0.718267029332557,0.00382481350373052 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_deviance_explained,5,0.0577459950691459,0.0542994597632856,0.0695275141467229,0.0554096499355417,0.0603692931433182,0.0096677330437089 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_rmse,5,0.403965442055384,0.397668598081279,0.406131051827123,0.403965442055384,0.402354383454589,0.00432958519192562 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_spearman,5,0.325166516189611,0.315293386747645,0.328738238419939,0.315268092689319,0.322589671329052,0.00681995223260615 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_calibration_slope,5,0.92280053956249,0.886837665277935,0.947888657401389,0.927407939357416,0.918575489228226,0.0324245065296268 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_prevalence,5,0.23982683982684,0.231460603487586,0.246697056850865,0.23982683982684,0.239405392468179,0.00765174673579537 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_n,5,1462,1452.8,1977.6,2310,1631.4,379.498089586759 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_auc,4,0.70703443636266,0.701421466371831,0.711824331273482,,0.706740480976943,0.00569891524322932 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_deviance_explained,4,0.0415689504563626,0.0121874766554518,0.0506555169584511,,0.0343207692782117,0.0225256638228509 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_rmse,4,0.408894084584309,0.399396869015362,0.417128693284692,,0.408443153559822,0.00959431503169061 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_spearman,4,0.304502858887888,0.296206515552306,0.317248514858176,,0.306091899114569,0.012022350172382 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_calibration_slope,4,0.839246659850089,0.809858413754445,0.864400937806387,,0.837734528371751,0.0296993676771054 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_prevalence,4,0.238999572635154,0.227667581639544,0.255610993801512,,0.240885083410421,0.0151422609821477 -bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_n,5,848,332.4,857.2,0,678.6,379.498089586759 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_auc,5,0.783237260697859,0.781487479767949,0.786671599836317,0.780923603112445,0.783861265400286,0.00263775798107652 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_deviance_explained,5,0.137342514714242,0.121421932718737,0.145883580721616,0.133888416735623,0.13489867770702,0.0134301264311669 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_rmse,5,0.426114904794538,0.424264497417503,0.4274526775471,0.427385888102775,0.426003331288231,0.00170417089837305 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_spearman,5,0.476886408875258,0.474719116290542,0.482676996198193,0.473354009165843,0.478324570169764,0.00411547232485785 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_calibration_slope,5,0.989718900696207,0.981326629686782,0.996985784785985,0.997023400638047,0.989486520430772,0.00779896464749282 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_prevalence,5,0.384204173133299,0.381893542208114,0.387115636781761,0.384204173133299,0.384330705113001,0.00279131193903544 -lichen,lichen,north,,,Cladonia.chlorophaea,insample_n,5,3676,3638,4966.2,5799,4094.4,953.455452551403 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_auc,4,0.771310560959278,0.762056268764211,0.772250576534378,,0.768341176452147,0.00672699366572193 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_deviance_explained,4,0.117490005669621,0.103262921986508,0.150457237410583,,0.124182915690282,0.0282483474578221 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_rmse,4,0.431824728761291,0.43048108970798,0.436237870645491,,0.432920979772323,0.0035114338910967 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_spearman,4,0.456663596155076,0.44222006455884,0.458143565227635,,0.45203375239662,0.0105701071068138 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_calibration_slope,4,0.926285735927852,0.91108824483025,0.96072447542169,,0.933157610355079,0.0287297046261996 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_prevalence,4,0.385124177756667,0.378286730776194,0.388394707507644,,0.383850278746133,0.00567425629039097 -lichen,lichen,north,,,Cladonia.chlorophaea,oob_n,5,2123,832.8,2161,0,1704.6,953.455452551403 -lichen,lichen,north,,,Physcia.adscendens,insample_auc,5,0.837981396856589,0.835408777911362,0.840847400231011,0.837981396856589,0.83816016075209,0.00285756162759401 -lichen,lichen,north,,,Physcia.adscendens,insample_deviance_explained,5,0.150858112854467,0.124726199931071,0.179496166065445,0.150858112854467,0.152522680589894,0.0291129797670772 -lichen,lichen,north,,,Physcia.adscendens,insample_rmse,5,0.394820754960351,0.392667616142332,0.396154685017306,0.394820754960351,0.39460107285766,0.00193621279917695 -lichen,lichen,north,,,Physcia.adscendens,insample_spearman,5,0.570408138071689,0.565308122546403,0.5728420990876,0.569591916604078,0.569551967433476,0.00424724258559519 -lichen,lichen,north,,,Physcia.adscendens,insample_calibration_slope,5,1.000290161986,0.988102059692486,1.01367917252104,0.997203566574363,1.00060473760024,0.0140656728794095 -lichen,lichen,north,,,Physcia.adscendens,insample_prevalence,5,0.383356070941337,0.379090148277938,0.387739970862604,0.38454906018279,0.383424630025594,0.0046908207984694 -lichen,lichen,north,,,Physcia.adscendens,insample_n,5,3691,3665.8,4965.8,5799,4107.6,945.748803858615 -lichen,lichen,north,,,Physcia.adscendens,oob_auc,4,0.833746443074277,0.827096210758832,0.842180494053308,,0.834383521168415,0.00828029344536092 -lichen,lichen,north,,,Physcia.adscendens,oob_deviance_explained,4,0.130689963041805,0.0842824132973602,0.19816633365152,,0.138214541922259,0.0628713317863323 -lichen,lichen,north,,,Physcia.adscendens,oob_rmse,4,0.396720835939793,0.393608392544539,0.403181595620625,,0.397916663184642,0.00539358995378622 -lichen,lichen,north,,,Physcia.adscendens,oob_spearman,4,0.561566406416265,0.5539539957114,0.576267521465914,,0.564098086539402,0.0128324047104354 -lichen,lichen,north,,,Physcia.adscendens,oob_calibration_slope,4,0.99425479667547,0.96583071260042,1.02232559105062,,0.994128621782647,0.0303243288377914 -lichen,lichen,north,,,Physcia.adscendens,oob_prevalence,4,0.387248312411753,0.378645415598897,0.395294233944223,,0.387049392668758,0.0094998395350021 -lichen,lichen,north,,,Physcia.adscendens,oob_n,5,2108,833.2,2133.2,0,1691.4,945.748803858615 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_auc,5,0.813944894205813,0.802139699004952,0.820255759947036,0.815184822721943,0.812174579511239,0.0107073329739588 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_deviance_explained,5,0.132809057341494,0.107757203971166,0.136465203835159,0.10417172717523,0.124571663519358,0.0149473601139226 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_rmse,5,0.272060134079996,0.264559358278556,0.278043736043677,0.274052391295891,0.271343833523729,0.00679852555171967 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_spearman,5,0.311739047711193,0.302221042942702,0.315045793085297,0.316988071708866,0.309350773106221,0.00671091487219379 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_calibration_slope,5,0.967998007245475,0.87648571034736,0.987344230685411,0.967998007245475,0.943987368969544,0.0672740117824239 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_prevalence,5,0.0907849829351536,0.0854880550520455,0.0942546707117982,0.092924126172208,0.0900691492139895,0.00433337917377339 -lichen,lichen,south,,,Cladonia.chlorophaea,insample_n,5,1482,1471.8,2004.4,2346,1653.4,387.296785424305 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_auc,4,0.807809199458369,0.803361127207599,0.810079558826688,,0.807031444857494,0.00372095548943939 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_deviance_explained,4,0.0301669928914464,0.0277952649888228,0.033711645379568,,0.0305858945291243,0.00332279854407552 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_rmse,4,0.284550004449721,0.27321345747823,0.294043863503816,,0.28389190162208,0.0112173275826891 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_spearman,4,0.317188326127429,0.30936492556465,0.325750823196505,,0.317452289165392,0.00927805439442853 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_calibration_slope,4,0.972194322758161,0.904703016411184,1.05371273927906,,0.977204004963134,0.0865994388567178 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_prevalence,4,0.0997452652709462,0.0913286406440493,0.106312613843352,,0.0990848095371992,0.00808662138066247 -lichen,lichen,south,,,Cladonia.chlorophaea,oob_n,5,864,341.6,874.2,0,692.6,387.296785424305 -lichen,lichen,south,,,Physcia.adscendens,insample_auc,5,0.817087809272992,0.813037342545539,0.820474612803467,0.816663086440969,0.816851497717378,0.00424728218981904 -lichen,lichen,south,,,Physcia.adscendens,insample_deviance_explained,5,0.235192341412028,0.229872784769115,0.241988389209502,0.235408303000742,0.235347494067659,0.00673438326370476 -lichen,lichen,south,,,Physcia.adscendens,insample_rmse,5,0.356650473622047,0.353611676138424,0.357529624526682,0.356650473622047,0.35588631711907,0.00216669907652055 -lichen,lichen,south,,,Physcia.adscendens,insample_spearman,5,0.451175206185996,0.443383258393679,0.458909594715483,0.451175206185996,0.450847910018878,0.00808059562085627 -lichen,lichen,south,,,Physcia.adscendens,insample_calibration_slope,5,0.90001396346683,0.891888831788973,0.904185893110986,0.905103249304583,0.898524852414401,0.00613831133508995 -lichen,lichen,south,,,Physcia.adscendens,insample_prevalence,5,0.215686274509804,0.210370852380551,0.218705697782215,0.215686274509804,0.214933253293698,0.00478783760132252 -lichen,lichen,south,,,Physcia.adscendens,insample_n,5,1487,1480.8,2014,2346,1662.2,382.531305908418 -lichen,lichen,south,,,Physcia.adscendens,oob_auc,4,0.814065965832081,0.810710682597986,0.81775498220477,,0.814185156238722,0.00377866148959288 -lichen,lichen,south,,,Physcia.adscendens,oob_deviance_explained,4,0.228279138986321,0.215722116911015,0.242259716890987,,0.228787551782521,0.0145199676101097 -lichen,lichen,south,,,Physcia.adscendens,oob_rmse,4,0.360297226466542,0.356022135348727,0.363910361964184,,0.360060813745052,0.00423737026304547 -lichen,lichen,south,,,Physcia.adscendens,oob_spearman,4,0.449225305619959,0.438263017046972,0.458876473384581,,0.4487570481884,0.0110632749457198 -lichen,lichen,south,,,Physcia.adscendens,oob_calibration_slope,4,0.882778315763782,0.82674378263151,0.967284088785534,,0.892946615724311,0.0768071867219681 -lichen,lichen,south,,,Physcia.adscendens,oob_prevalence,4,0.21549434057534,0.209833885194357,0.226186106799465,,0.217291237305033,0.00944381193189753 -lichen,lichen,south,,,Physcia.adscendens,oob_n,5,859,332,865.2,0,683.8,382.531305908418 -mite,mite,north,,,Ceratozetes.gracilis,insample_auc,5,0.801217225560485,0.796009986987395,0.807796400945135,0.801217225560485,0.801935233828928,0.00592563380468369 -mite,mite,north,,,Ceratozetes.gracilis,insample_deviance_explained,5,0.142120659127812,0.126146699266542,0.156639532765444,0.139301595779978,0.142080014233308,0.0160442605374148 -mite,mite,north,,,Ceratozetes.gracilis,insample_rmse,5,0.362719793346354,0.358308603073014,0.364637670875494,0.360543277242677,0.36186174915299,0.00328171424375611 -mite,mite,north,,,Ceratozetes.gracilis,insample_spearman,5,0.423598113829231,0.418409593647659,0.433581405703742,0.423598113829231,0.425831746839698,0.00781925064319009 -mite,mite,north,,,Ceratozetes.gracilis,insample_calibration_slope,5,1.01201219242674,0.986077497804326,1.01674693503142,1.01351601201869,1.00472045079216,0.0187441183939002 -mite,mite,north,,,Ceratozetes.gracilis,insample_prevalence,5,0.210569550930997,0.20808483720579,0.211023450370342,0.208106685383401,0.209758576910219,0.00153584552056836 -mite,mite,north,,,Ceratozetes.gracilis,insample_n,5,3643,3599.6,4880.2,5699,4039.4,928.059426976527 -mite,mite,north,,,Ceratozetes.gracilis,oob_auc,4,0.785129200940495,0.781637849320184,0.799206624551212,,0.788909940937068,0.0109882833051334 -mite,mite,north,,,Ceratozetes.gracilis,oob_deviance_explained,4,0.0956359354311148,0.090833326798326,0.141790231293364,,0.110404395155922,0.0340949363235628 -mite,mite,north,,,Ceratozetes.gracilis,oob_rmse,4,0.367144037280097,0.361382086147396,0.369120989699405,,0.365792252025314,0.00465197173032941 -mite,mite,north,,,Ceratozetes.gracilis,oob_spearman,4,0.397605832828841,0.395025142122763,0.417104681676371,,0.403648032165074,0.0143910534185692 -mite,mite,north,,,Ceratozetes.gracilis,oob_calibration_slope,4,0.910468238601677,0.883497871550647,0.987822408860668,,0.928462454033092,0.0599330094862127 -mite,mite,north,,,Ceratozetes.gracilis,oob_prevalence,4,0.203422583061695,0.203085318596832,0.206833669467894,,0.204520376612172,0.00245118903973748 -mite,mite,north,,,Ceratozetes.gracilis,oob_n,5,2056,818.8,2099.4,0,1659.6,928.059426976527 -mite,mite,north,,,Trhypochthonius.tectorum,insample_auc,5,0.66997177969959,0.667007728367672,0.680894220635728,0.669229920289932,0.672979870369456,0.00728591529226797 -mite,mite,north,,,Trhypochthonius.tectorum,insample_deviance_explained,5,-0.0302662507908158,-0.0499128471498866,-0.00840434838738655,-0.0383705826593046,-0.0297973209993642,0.0221712433015747 -mite,mite,north,,,Trhypochthonius.tectorum,insample_rmse,5,0.288027083127174,0.285957704654159,0.291335506217548,0.288027083127174,0.288376263195021,0.0030554844291286 -mite,mite,north,,,Trhypochthonius.tectorum,insample_spearman,5,0.172403791407594,0.170121549997943,0.186377850676853,0.172403791407594,0.176637165437612,0.00920813423498148 -mite,mite,north,,,Trhypochthonius.tectorum,insample_calibration_slope,5,0.946932629769632,0.935568906799778,0.957718024619598,0.943019827969962,0.946707182897605,0.0116164653959112 -mite,mite,north,,,Trhypochthonius.tectorum,insample_prevalence,5,0.0956308124232321,0.0939982527316028,0.0988743433784902,0.0956308124232321,0.0960929449878075,0.00279551913105558 -mite,mite,north,,,Trhypochthonius.tectorum,insample_n,5,3617,3592.8,4872.6,5699,4027.4,934.608099686708 -mite,mite,north,,,Trhypochthonius.tectorum,oob_auc,4,0.646579206298189,0.633926915266307,0.661924506150991,,0.647540995162803,0.0155642227569514 -mite,mite,north,,,Trhypochthonius.tectorum,oob_deviance_explained,4,-0.0660110196279675,-0.10258156519042,-0.0362613374429411,,-0.0684470422627627,0.038573024004172 -mite,mite,north,,,Trhypochthonius.tectorum,oob_rmse,4,0.289576963677251,0.282248420255841,0.293606811899539,,0.288398858248993,0.00639838264774201 -mite,mite,north,,,Trhypochthonius.tectorum,oob_spearman,4,0.149420864473512,0.133427886347194,0.166153210288316,,0.149684924362257,0.0177429471480539 -mite,mite,north,,,Trhypochthonius.tectorum,oob_calibration_slope,4,0.808840685909608,0.662489937268437,0.977660836333191,,0.816865472260469,0.172279433354971 -mite,mite,north,,,Trhypochthonius.tectorum,oob_prevalence,4,0.0965793285343548,0.0892258286847175,0.098536408422576,,0.0946520356909919,0.00552669238515783 -mite,mite,north,,,Trhypochthonius.tectorum,oob_n,5,2082,826.4,2106.2,0,1671.6,934.608099686708 -mite,mite,south,,,Ceratozetes.gracilis,insample_auc,5,0.887845584835876,0.879908150593573,0.890901982971773,0.884763478202232,0.88613949639659,0.00587526273174796 -mite,mite,south,,,Ceratozetes.gracilis,insample_deviance_explained,5,0.205002890118294,0.145097111873623,0.224802087320282,0.199874340284867,0.191703967200446,0.0482488383963572 -mite,mite,south,,,Ceratozetes.gracilis,insample_rmse,5,0.21181979715958,0.202230453597483,0.220327887960157,0.209399341912154,0.211801337141433,0.00939387951104137 -mite,mite,south,,,Ceratozetes.gracilis,insample_spearman,5,0.307185236514686,0.295732307814018,0.327014528084331,0.307185236514686,0.310414239991134,0.0158334563837542 -mite,mite,south,,,Ceratozetes.gracilis,insample_calibration_slope,5,0.684125285326982,0.618880455073528,0.763065067681521,0.690489399477283,0.686164883796781,0.0782117931240002 -mite,mite,south,,,Ceratozetes.gracilis,insample_prevalence,5,0.056970509383378,0.0521775638545351,0.0622115928022082,0.0562843842573,0.0572190090351997,0.00535467847864499 -mite,mite,south,,,Ceratozetes.gracilis,insample_n,5,1494,1479.4,2024.6,2363,1667.4,389.193139713433 -mite,mite,south,,,Ceratozetes.gracilis,oob_auc,4,0.872768272021483,0.864778620916601,0.886024363582252,,0.874649143612871,0.0117157621181945 -mite,mite,south,,,Ceratozetes.gracilis,oob_deviance_explained,4,0.176452540772138,0.115875607967149,0.20549875324236,,0.165191569224007,0.0497840108483084 -mite,mite,south,,,Ceratozetes.gracilis,oob_rmse,4,0.216227617782984,0.205367186353172,0.222584703085702,,0.21461927988045,0.00947487076592404 -mite,mite,south,,,Ceratozetes.gracilis,oob_spearman,4,0.293219352185584,0.264147692272067,0.323152357497,,0.293526975541977,0.0316318609700901 -mite,mite,south,,,Ceratozetes.gracilis,oob_calibration_slope,4,0.591368783360259,0.540938320497454,0.706039267822132,,0.614311648217069,0.099555842641514 -mite,mite,south,,,Ceratozetes.gracilis,oob_prevalence,4,0.0533392883804503,0.0452752248602848,0.0645232647455575,,0.0544535429679295,0.0107814199736608 -mite,mite,south,,,Ceratozetes.gracilis,oob_n,5,869,338.4,883.6,0,695.6,389.193139713433 -mite,mite,south,,,Trhypochthonius.tectorum,insample_auc,5,0.736544301833256,0.716649452845184,0.740321607515676,0.728172120121303,0.730767023052466,0.0131495827970378 -mite,mite,south,,,Trhypochthonius.tectorum,insample_deviance_explained,5,0.0312613160971673,0.0210930152816536,0.0368485695417519,0.03966339018057,0.0291478433785425,0.00801357431192425 -mite,mite,south,,,Trhypochthonius.tectorum,insample_rmse,5,0.266083559383337,0.263266906276206,0.268584469455657,0.267225136735442,0.265932548289368,0.00265613228584214 -mite,mite,south,,,Trhypochthonius.tectorum,insample_spearman,5,0.226992372261537,0.205177680757182,0.231907375222418,0.218500908635375,0.221090772923679,0.0148945551358966 -mite,mite,south,,,Trhypochthonius.tectorum,insample_calibration_slope,5,1.00266595913445,0.939298726279135,1.05528781962027,1.01766256952521,0.997841009791226,0.0595774812188343 -mite,mite,south,,,Trhypochthonius.tectorum,insample_prevalence,5,0.0833685992382565,0.0807473443243282,0.0863035095821866,0.0833685992382565,0.083401335320589,0.00299510185415199 -mite,mite,south,,,Trhypochthonius.tectorum,insample_n,5,1489,1484.4,2017.4,2363,1664.2,390.68875079787 -mite,mite,south,,,Trhypochthonius.tectorum,oob_auc,4,0.701618707278328,0.688898154720992,0.723347226195078,,0.704835838120976,0.01968948818001 -mite,mite,south,,,Trhypochthonius.tectorum,oob_deviance_explained,4,0.0445765743923185,0.0256582727115539,0.05554754449327,,0.0417382416852424,0.0164474015566564 -mite,mite,south,,,Trhypochthonius.tectorum,oob_rmse,4,0.272766672636643,0.263594614475781,0.276687956242601,,0.270891396009892,0.00735009518242229 -mite,mite,south,,,Trhypochthonius.tectorum,oob_spearman,4,0.189939168874569,0.177925193921519,0.219486233616825,,0.196200986656428,0.0235533891548608 -mite,mite,south,,,Trhypochthonius.tectorum,oob_calibration_slope,4,0.674268641549443,0.613496188127419,1.05483503440303,,0.788480762775003,0.276486512827844 -mite,mite,south,,,Trhypochthonius.tectorum,oob_prevalence,4,0.0842873358196854,0.0775201528145626,0.0881856815952926,,0.0832627510948584,0.00595703320150957 -mite,mite,south,,,Trhypochthonius.tectorum,oob_n,5,874,345.6,878.6,0,698.8,390.68875079787 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_auc,5,0.82831417568632,0.827829342621671,0.831061038850059,0.827557030871778,0.829064221811278,0.00215769050020316 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_deviance_explained,5,0.165979078979945,0.155461728861985,0.178821619274117,0.169551786433802,0.16667542865541,0.0122576132972967 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_rmse,5,0.405873635942447,0.403822607612654,0.406433479523304,0.40652594079989,0.405399660183333,0.0016455855240679 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_spearman,5,0.561437420216406,0.559785436863976,0.564783577961203,0.559640328619534,0.561912104014628,0.00294321362126292 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_calibration_slope,5,0.988453705168321,0.978178810819463,1.00034731073572,0.988453705168321,0.988989271295434,0.0109310895098145 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_prevalence,5,0.417808219178082,0.410889577594123,0.42067860776958,0.417808219178082,0.416364204160936,0.00499744401668531 -vascular_plant,vascular_plant,north,,,Galium.boreale,insample_n,5,4356,4313.4,5864.4,6862,4843,1128.919837721 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_auc,4,0.822198810750936,0.81560581265128,0.824794808143176,,0.820771310498288,0.00555068822310945 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_deviance_explained,4,0.176471876674577,0.144853523479,0.187951524486478,,0.169279481894693,0.0259144695058964 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_rmse,4,0.409435609031745,0.408293617479497,0.414150700111685,,0.410711716005921,0.00371192530179639 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_spearman,4,0.54954561529011,0.540668954507633,0.55551892165865,,0.548508702999418,0.00866587695211289 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_calibration_slope,4,0.969747328840738,0.95185222454497,0.972523534978746,,0.964347722355823,0.0130007904312307 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_prevalence,4,0.419109687083941,0.412784949448594,0.430405107992588,,0.42088493111012,0.00973543990382733 -vascular_plant,vascular_plant,north,,,Galium.boreale,oob_n,5,2506,997.6,2548.6,0,2019,1128.919837721 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_auc,5,0.833417967504123,0.828616127681329,0.834581904450967,0.831410068581594,0.832137239234312,0.00327348223832293 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_deviance_explained,5,0.149398462552943,0.122091670146786,0.167226288447802,0.154102067369655,0.14556619228262,0.0231557534900957 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_rmse,5,0.399805863236473,0.397504109733844,0.401936461822335,0.400200692605579,0.399638526065876,0.00229815259865776 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_spearman,5,0.560411243149642,0.552484615515389,0.561657558553018,0.556689131096968,0.557971496083213,0.0050614513090993 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_calibration_slope,5,1.00527123585172,0.998253837968957,1.00814249377064,1.00781504982717,1.00383560269565,0.00515954079683497 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_prevalence,5,0.378023899737686,0.375262469872135,0.381023040112991,0.378023899737686,0.378278456138998,0.00304497900182098 -vascular_plant,vascular_plant,north,,,Vicia.americana,insample_n,5,4321,4308,5864.4,6862,4833.8,1134.06446024906 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_auc,4,0.825102654509618,0.824752717050236,0.831113799725201,,0.827124514422547,0.0043461980338858 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_deviance_explained,4,0.168676190537765,0.126934776957537,0.206715311508099,,0.167353943177089,0.0439500114488177 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_rmse,4,0.403422296815101,0.3996544111573,0.40516595552268,,0.402699358618593,0.00311914632283807 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_spearman,4,0.547177974814146,0.544498037945177,0.55577804768904,,0.549292309101977,0.00670360547060373 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_calibration_slope,4,0.977399952903476,0.973581045957183,1.00762672707733,,0.986831334056175,0.0219868182926184 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_prevalence,4,0.375794942099527,0.372913450186178,0.383372698071932,,0.377472179263476,0.00593181957439513 -vascular_plant,vascular_plant,north,,,Vicia.americana,oob_n,5,2541,997.6,2554,0,2028.2,1134.06446024906 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_auc,5,0.886704412746079,0.880512445106482,0.891248430868751,0.880433508354798,0.885813927854308,0.00550612768601824 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_deviance_explained,5,0.354237680381199,0.339989741312822,0.368315560956819,0.33418980862939,0.354533269980195,0.01425999095328 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_rmse,5,0.315549333998249,0.312733031715415,0.320617964247754,0.320396236550522,0.316528782847702,0.00393610790228577 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_spearman,5,0.555303565396909,0.548928414774929,0.564816726447308,0.547740603012528,0.556143122817966,0.00862782581315939 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_calibration_slope,5,0.949139956016074,0.942535498741131,0.977717474233021,0.943663513708022,0.957369958548551,0.0182229328410624 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_prevalence,5,0.222088835534214,0.217190546592102,0.228625506806496,0.222054380664653,0.222881775063893,0.00607679419012681 -vascular_plant,vascular_plant,south,,,Galium.boreale,insample_n,5,1692,1666,2267.2,2648,1873.6,433.131388841769 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_auc,4,0.877097862167819,0.862376456261017,0.884817887899072,,0.87459736924798,0.0123812341346909 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_deviance_explained,4,0.312957117701116,0.280568560352726,0.318443805255701,,0.303349307060471,0.0244038726381955 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_rmse,4,0.327279602461398,0.319198756717709,0.330873222003822,,0.325677021675232,0.00655942333596088 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_spearman,4,0.543643931275205,0.52011736981388,0.550124714153978,,0.537556153210008,0.018281121106182 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_calibration_slope,4,0.917557052489063,0.892952703125712,0.938899596567509,,0.916392122030168,0.0250405061655401 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_prevalence,4,0.218666030567013,0.210018355611084,0.23207994955219,,0.220368260577459,0.0121728164316861 -vascular_plant,vascular_plant,south,,,Galium.boreale,oob_n,5,956,380.8,982,0,774.4,433.131388841769 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_auc,5,0.805642612002956,0.799527929288648,0.806080866808033,0.806345335875623,0.80341093560295,0.00345559335186376 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_deviance_explained,5,0.160784539742298,0.15366075168876,0.190053887071333,0.173622047662139,0.168638524084192,0.0198244907623526 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_rmse,5,0.384505101990356,0.380582285473126,0.38596821415799,0.38281501071234,0.383666277594932,0.00286579147356738 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_spearman,5,0.462749382191396,0.45683296378463,0.470626204818291,0.467981560586618,0.463510150245734,0.0068185467774117 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_calibration_slope,5,0.920164872108487,0.908190878252055,0.933886039669075,0.920853654327026,0.920339104306229,0.0140227158505247 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_prevalence,5,0.264350453172205,0.25911663216011,0.270295509723619,0.264350453172205,0.264443478235907,0.00620048832939598 -vascular_plant,vascular_plant,south,,,Vicia.americana,insample_n,5,1685,1649.4,2266.4,2648,1865.6,437.838212128635 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_auc,4,0.806827376560868,0.800860167357028,0.811284849004147,,0.806288184860668,0.00587182189313485 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_deviance_explained,4,0.196588203146307,0.131181364531475,0.202390555132719,,0.1753008864933,0.0468108554441553 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_rmse,4,0.382460401939565,0.379775408089825,0.387088293380048,,0.383154293936259,0.00413862592807385 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_spearman,4,0.466177919732857,0.458868288315183,0.477016318356347,,0.467438193734934,0.00988132752159103 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_calibration_slope,4,0.924701754984112,0.907012114553472,0.946067960340358,,0.926014813886114,0.0212604040085512 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_prevalence,4,0.266148052343275,0.252246321440467,0.273763588267456,,0.263902982708051,0.0122396324927964 -vascular_plant,vascular_plant,south,,,Vicia.americana,oob_n,5,963,381.6,998.6,0,782.4,437.838212128635 diff --git a/README.md b/README.md index 732a335..88bdbcb 100644 --- a/README.md +++ b/README.md @@ -281,7 +281,7 @@ flowchart TD ST["result stores
2_pipeline/id/run/region/"] CR["collect_results()
per-species summaries"] T["3_output/id/tables/"] - B["compare with exp_000
comparison_*.csv
every experiment but exp_000"] + B["compare with exp_000
comparison_metrics.csv
every experiment but exp_000"] X["the experiment's own steps
exp_000: compare to v2 · plot · report"] RR["run_record.md"] @@ -335,8 +335,8 @@ flowchart TD 5. **Summarize.** `collect_results()` reduces the stores to per-species tables in `3_output//tables/`. 6. **Compare with exp_000.** Every experiment except exp_000 itself is - compared with the v2 baseline: `tables/comparison_*.csv`, with the - headline printed. Set `baseline = NULL` in `experiment_config()` to skip. + compared with the v2 baseline: `tables/comparison_metrics.csv`, with + the per-taxon headline printed. Set `baseline = NULL` in `experiment_config()` to skip. 7. **The experiment's own steps**, in order. For exp_000: compare with v2, plot, write the report. 8. **Record.** `run_record.md` says what ran, for the commit. @@ -758,12 +758,13 @@ flowchart LR The red files are written for every experiment by the harness; the blue ones are exp_000's own steps. Every other experiment also writes -`comparison_*.csv` against exp_000. +`comparison_metrics.csv` against exp_000. A *draw* is one bootstrap iteration; draw 1 is the full data. Every summary -reduces the draws to a median and a 10th–90th percentile band (`p10`, `p90`) -rather than a mean and standard deviation, because the spread over draws is -often skewed. `boot1` is the draw-1 value. +reduces the draws to a median and a 10th–90th percentile band (`p10`, `p90`), +which is what comparisons read because the spread over draws is often +skewed. Each also carries the `mean` and standard deviation (`sd`) for readers +and tools that expect them. `boot1` is the draw-1 value. ### Result stores (`2_pipeline////`) @@ -785,9 +786,8 @@ often skewed. `boot1` is the draw-1 value. | `run_record.md`, `report.md` | `figures/` | | `tables/coverage.csv` | `tables/coefficient_summary.csv` | | `tables/metric_summary.csv` | `tables/parity_terms.csv` | -| `tables/grid_summary.csv` | `tables/comparison_metrics.csv` | -| `tables/comparison_summary.csv`, `tables/comparison_grid.csv` (experiments after exp_000) | | -| `tables/parity_summary.csv`, `tables/v2_self_agreement_summary.csv` | | +| `tables/grid_summary.csv` | | +| `tables/parity_summary.csv`, `tables/v2_self_agreement_summary.csv` | `tables/comparison_metrics.csv` | **Commit only runs that count.** A trial writes the same files as a full run. Commit `3_output/` after a run with the full species list and @@ -841,13 +841,15 @@ metric summaries are not comparable with these. **`tables/grid_summary.csv`** — the final model's prediction for each habitat type, one row per taxon × region × species × `grid_unit`, on the -response scale. Each row is a pure stand of that type at the stage's +response scale, with `n`, `median`, `p10`, `p90`, `boot1`, `mean` and `sd` +over draws. Each row is a pure stand of that type at the stage's constants (`Climate` 0, the new protocol where fitted, 100 sampling days for mammals). v2's later coefficient adjustments, such as the plant stand-age splines, are in the coefficients, not the grid. **`tables/coefficient_summary.csv`** (gitignored) — one row per run × -region × stage × species × term. A term means something different by taxon +region × stage × species × term, with `n`, `median`, `p10`, `p90`, `boot1`, +`mean` and `sd` over draws. A term means something different by taxon and stage: | Taxon and stage | `term` holds | @@ -858,13 +860,13 @@ and stage: | Birds, `landcover` | Raw `glm` coefficients (e.g. `vegcCrop`) | | Birds, `habitat` | The same, translated onto v2's standardized habitat types, log scale | -**`tables/comparison_*.csv`** (every experiment except exp_000) — against -exp_000, written automatically by `run_experiment()`: `comparison_summary.csv` per taxon, region and metric, with the -median difference, the share of species that did better, and each side's -draw count (a mismatch is warned about); -`comparison_metrics.csv` per species, with both sides' median, band, mean and -standard deviation; `comparison_grid.csv` with the rank -correlation of habitat effects on the grid. "Better" is higher AUC, deviance +**`tables/comparison_metrics.csv`** (every experiment except exp_000; +gitignored) — against exp_000, written automatically by `run_experiment()`: +one row per species and metric, with both sides' median, band, mean and +standard deviation, the difference, and whether the experiment did better. +The per-taxon headline (median difference, share of species that did +better, each side's draw count) is printed to the console, not written; a +draw-count mismatch is warned about. "Better" is higher AUC, deviance explained and Spearman, lower RMSE, and a calibration slope closer to 1. ### exp_000's parity outputs @@ -951,7 +953,7 @@ and [`docs/taxon_quirks.md`](docs/taxon_quirks.md). candidate formulas, or `specs` for a different engine or selection rule. Keep exp_000's species, draws and seed unless they are the question. 5. Run it, first at 5 draws to check it works. It is compared with exp_000 - automatically, in `tables/comparison_*.csv`. Compare like with like: run + automatically, in `tables/comparison_metrics.csv`. Compare like with like: run exp_000 at the same number of draws; a mismatch is warned about. [`docs/getting_started.md`](docs/getting_started.md#test-a-change) walks diff --git a/docs/getting_started.md b/docs/getting_started.md index 7061295..cc7c22a 100644 --- a/docs/getting_started.md +++ b/docs/getting_started.md @@ -198,15 +198,11 @@ that, it is a name in a spec, as in lever 2. ### Reading the comparison Every experiment is compared with exp_000 automatically: -`run_experiment()` writes three tables to `tables/`, and prints -the headline (set `baseline = NULL` in `experiment_config()` to -skip it): - -| File | Holds | -| --- | --- | -| `comparison_summary.csv` | Per taxon, region and metric: the median difference from exp_000, and the share of species that did better | -| `comparison_metrics.csv` | Per species and metric, with both runs' 10–90% bands | -| `comparison_grid.csv` | Per species: rank correlation and absolute difference of the habitat effects on the grid | +`run_experiment()` prints the headline per taxon, region and +metric (the median difference from exp_000, and the share of +species that did better), and writes `tables/comparison_metrics.csv`: +one row per species and metric, with both runs' 10–90% bands. Set +`baseline = NULL` in `experiment_config()` to skip it. "Better" means: From 44b6e31764d705b4f13a020d8b6190e78b409450 Mon Sep 17 00:00:00 2001 From: bgcasey Date: Tue, 6 Oct 2026 05:37:34 -0600 Subject: [PATCH 11/16] Add new_experiment function to scaffold experiment folders and update documentation --- 1_code/experiments/_template/run.R | 8 +- 1_code/harness/harness.R | 6 +- 1_code/harness/new_experiment.R | 348 ++++++++++++++++++++ 1_code/tests/testthat/test-new_experiment.R | 127 +++++++ README.md | 20 +- docs/getting_started.md | 16 +- 6 files changed, 515 insertions(+), 10 deletions(-) create mode 100644 1_code/harness/new_experiment.R create mode 100644 1_code/tests/testthat/test-new_experiment.R diff --git a/1_code/experiments/_template/run.R b/1_code/experiments/_template/run.R index 502440b..93b2129 100644 --- a/1_code/experiments/_template/run.R +++ b/1_code/experiments/_template/run.R @@ -12,9 +12,11 @@ # - tables/ (summaries, and comparison_metrics.csv against the # baseline), run_record.md # notes: -# - Copy this folder to 1_code/experiments/exp_NNN_*/, set `id` -# below to the folder's name, and state the question in the -# README. +# - Start an experiment with new_experiment("description") +# (harness/new_experiment.R), which numbers it, fills this +# header and creates its 2_pipeline/ and 3_output/ folders. +# Copying by hand instead, set `id` below to the folder's name. +# - State the question in the README. # - Change one thing relative to exp_000, so a difference in the # comparison is a difference in that thing. Use the same # species, draws and seed as exp_000 unless they are the diff --git a/1_code/harness/harness.R b/1_code/harness/harness.R index af9facb..36a48e3 100644 --- a/1_code/harness/harness.R +++ b/1_code/harness/harness.R @@ -24,6 +24,9 @@ # use, such as the named focal-species sets. # - Within a methods folder, files whose names start with an # underscore are shared helpers and are loaded first. +# - harness/new_experiment.R, which scaffolds a new +# experiment's folders, is loaded too, but also works sourced +# on its own, before an experiment exists. # --- # 1. Setup ---- @@ -67,7 +70,8 @@ load_harness <- function( "run_model.R", "summarise.R", "compare.R", - "experiment.R" + "experiment.R", + "new_experiment.R" ) source_all(file.path(harness_dir, files), envir) diff --git a/1_code/harness/new_experiment.R b/1_code/harness/new_experiment.R new file mode 100644 index 0000000..1372ffc --- /dev/null +++ b/1_code/harness/new_experiment.R @@ -0,0 +1,348 @@ +# --- +# title: Scaffold a New Experiment +# author: Brendan Casey +# created: 2026-10-06 +# inputs: +# - 1_code/experiments/_template/, the run.R and README.md every +# experiment starts from +# - the exp_NNN_* folders already in 1_code/experiments/, +# 2_pipeline/ and 3_output/, which set the next number +# outputs: +# - 1_code/experiments//: run.R and README.md, from the +# template with the id, title, author and date filled in +# - 2_pipeline// and its logs/, for the gitignored +# intermediates +# - 3_output//: figures/, tables/ and a stub report.md +# notes: +# - One call starts an experiment, so its id is chosen once and +# used verbatim in all three places: +# source("1_code/harness/new_experiment.R") +# new_experiment("covariate scale") +# - The number is one past the highest exp_NNN in any of the +# three folders, not just 1_code/experiments/. A pipeline +# folder left from a removed experiment still holds its +# number, so a new experiment never shares stores with an old +# one. Gaps are not reused, for the same reason. +# - Nothing is written until every target is known to be free, +# and a call that fails partway removes what it created. +# - Base R only, so it can be sourced without load_framework(). +# - The empty folders carry a .gitkeep, which .gitignore lets +# through, so the structure is committed with the code. +# --- + +# 1. Setup ---- +# Base R only; no packages to load. + +# 2. experiment_slug() ---- + +#' Turn an Experiment Description into its Folder-Name Slug +#' +#' @param description Character. A short description, e.g. +#' "Covariate scale". +#' @return Character. The snake_case slug, e.g. "covariate_scale". +#' +#' @example # Example usage of the function +#' # experiment_slug("SoilGrids 0-5 cm") +#' # #> "soilgrids_0_5_cm" +experiment_slug <- function(description) { + if (!is.character(description) || length(description) != 1L || + is.na(description)) { + stop("description must be a single string.", call. = FALSE) + } + + slug <- tolower(trimws(description)) + slug <- gsub("[^a-z0-9]+", "_", slug) + slug <- gsub("^_+|_+$", "", slug) + + if (!nzchar(slug)) { + stop( + "description has no letters or digits to name a folder.", + call. = FALSE + ) + } + + # The number is assigned here, so a user-supplied one would be + # doubled or contradicted + if (grepl("^exp_[0-9]{3}_", slug)) { + stop( + "Give the description without the exp_NNN_ prefix; ", + "the number is assigned for you.", + call. = FALSE + ) + } + + slug +} + +# 3. next_experiment_number() ---- + +#' Find the Next Free Experiment Number +#' +#' @param project_root Character. The repository root. +#' @return Integer. One past the highest exp_NNN folder in +#' 1_code/experiments/, 2_pipeline/ or 3_output/; 0 if there is +#' none. +#' +#' @example # Example usage of the function +#' # next_experiment_number(".") +#' # #> 3 +next_experiment_number <- function(project_root = ".") { + roots <- file.path( + project_root, c("1_code/experiments", "2_pipeline", "3_output") + ) + + folders <- unlist(lapply(roots[dir.exists(roots)], function(root) { + list.dirs(root, recursive = FALSE, full.names = FALSE) + })) + folders <- folders[grepl("^exp_[0-9]{3}_", folders)] + + if (length(folders) == 0) { + return(0L) + } + + number <- max(as.integer(substr(folders, 5, 7))) + 1L + + if (number > 999L) { + stop( + "Experiment numbers are three digits; 999 is taken.", + call. = FALSE + ) + } + + number +} + +# 4. new_experiment() ---- + +#' Scaffold a New Experiment's Folders +#' +#' Creates 1_code/experiments// from the template, +#' 2_pipeline// with logs/, and 3_output// with figures/, +#' tables/ and a stub report.md, where is +#' exp__ and NNN is the next free number. +#' +#' @param description Character. A short description of the +#' question; becomes the id's slug and the run.R title. +#' @param author Character or NULL. For the run.R header; NULL +#' reads `git config user.name`, then the system user. +#' @param project_root Character. The repository root. +#' @param template_dir Character or NULL. The template folder; +#' NULL for 1_code/experiments/_template. +#' @param dry_run Logical. TRUE reports the id and paths without +#' writing anything. +#' @param open Logical. Open the new run.R for editing. +#' @return A list, invisibly: `id`, `number`, `code_dir`, +#' `pipeline_dir` and `out_dir`. +#' +#' @example # Example usage of the function +#' # source("1_code/harness/new_experiment.R") +#' # new_experiment("covariate scale", dry_run = TRUE) +#' # #> exp_003_covariate_scale (dry run; nothing written) +new_experiment <- function( + description, + author = NULL, + project_root = getOption("sdm.project_root", "."), + template_dir = NULL, + dry_run = FALSE, + open = interactive() +) { + # Step 1: The id and where it goes + slug <- experiment_slug(description) + number <- next_experiment_number(project_root) + id <- sprintf("exp_%03d_%s", number, slug) + + template_dir <- template_dir %||% + file.path(project_root, "1_code", "experiments", "_template") + dirs <- c( + code_dir = file.path(project_root, "1_code", "experiments", id), + pipeline_dir = file.path(project_root, "2_pipeline", id), + out_dir = file.path(project_root, "3_output", id) + ) + out <- c(list(id = id, number = number), as.list(dirs)) + + # Step 2: Check everything before writing anything + if (!dir.exists(template_dir)) { + stop("Template folder not found: ", template_dir, call. = FALSE) + } + + taken <- dirs[dir.exists(dirs)] + + if (length(taken) > 0) { + stop( + "Already exists, so ", id, " cannot be created:\n ", + paste(taken, collapse = "\n "), + call. = FALSE + ) + } + + if (dry_run) { + cat(id, " (dry run; nothing written)\n ", + paste(dirs, collapse = "\n "), "\n", sep = "") + return(invisible(out)) + } + + author <- author %||% git_user_name(project_root) + + # Step 3: Remove what this call made if a later step fails, so + # a half-built experiment does not hold the number + created <- character(0) + done <- FALSE + on.exit( + if (!done) unlink(created, recursive = TRUE), + add = TRUE + ) + + for (dir in dirs) { + dir.create(dir, recursive = TRUE) + created <- c(created, dir) + } + + # Step 4: The code, from the template with its placeholders + # filled in + fill_template( + template_dir, dirs[["code_dir"]], + id = id, number = number, slug = slug, author = author + ) + + # Step 5: The pipeline and output structure + for (sub in c( + dirs[["pipeline_dir"]], + file.path(dirs[["pipeline_dir"]], "logs"), + file.path(dirs[["out_dir"]], "figures"), + file.path(dirs[["out_dir"]], "tables") + )) { + dir.create(sub, recursive = TRUE, showWarnings = FALSE) + file.create(file.path(sub, ".gitkeep")) + } + + writeLines( + c( + paste("#", id), + "", + "_Not yet run._ The question and design are in", + paste0("`1_code/experiments/", id, "/README.md`."), + "Write the result here, or replace this file with a report", + "step; `run_record.md` is written beside it on every run." + ), + file.path(dirs[["out_dir"]], "report.md") + ) + + done <- TRUE + + cat( + "Created ", id, "\n ", + paste(dirs, collapse = "\n "), "\n", + "Next:\n", + " 1. State the question and design in its README.md.\n", + " 2. Set the one change in its run.R.\n", + " 3. Run it at 5 draws to check it works, then at 100.\n", + sep = "" + ) + + if (open) { + utils::file.edit(file.path(dirs[["code_dir"]], "run.R")) + } + + invisible(out) +} + +## 4.1 fill_template() ---- + +#' Copy the Template, Filling its Placeholders +#' +#' Replaces the template's placeholders with the experiment's +#' values in every file, and drops the run.R note on how to start +#' an experiment, which is done once the copy exists. +#' +#' @param template_dir Character. The template folder. +#' @param code_dir Character. The new experiment's code folder. +#' @param id,slug,author Character. The experiment's values. +#' @param number Integer. The experiment's number. +#' @return The files written, invisibly. +#' +#' @example # Example usage of the function +#' # fill_template("1_code/experiments/_template", +#' # "1_code/experiments/exp_003_covariate_scale", +#' # id = "exp_003_covariate_scale", number = 3L, +#' # slug = "covariate_scale", author = "B. Casey") +fill_template <- function(template_dir, code_dir, id, number, slug, + author) { + # "covariate_scale" -> "Covariate Scale" + words <- strsplit(slug, "_", fixed = TRUE)[[1]] + title <- paste0( + "Experiment ", sprintf("%03d", number), " - ", + paste0(toupper(substr(words, 1, 1)), substring(words, 2), + collapse = " ") + ) + + placeholders <- c( + "exp_NNN_short_description" = id, + "Experiment NNN - [Short Description]" = title, + "[Your Name]" = author, + "[YYYY-MM-DD]" = format(Sys.Date(), "%Y-%m-%d") + ) + + files <- list.files(template_dir, recursive = TRUE) + + for (file in files) { + text <- readLines(file.path(template_dir, file), warn = FALSE) + + for (key in names(placeholders)) { + text <- gsub(key, placeholders[[key]], text, fixed = TRUE) + } + + # The note bullet and its continuation lines + start <- grep("^# - Start an experiment with new_experiment", + text) + + if (length(start) == 1L) { + end <- start + while (end < length(text) && grepl("^# ", text[end + 1])) { + end <- end + 1L + } + text <- text[-(start:end)] + } + + target <- file.path(code_dir, file) + dir.create(dirname(target), recursive = TRUE, + showWarnings = FALSE) + writeLines(text, target) + } + + invisible(file.path(code_dir, files)) +} + +## 4.2 git_user_name() ---- + +#' The Author for a New Script's Header +#' +#' @param project_root Character. The repository root. +#' @return Character. `git config user.name`, or the system user +#' when git is unavailable or has no name set. +#' +#' @example # Example usage of the function +#' # git_user_name(".") +git_user_name <- function(project_root = ".") { + name <- tryCatch( + suppressWarnings(system2( + "git", c("-C", shQuote(project_root), "config", "user.name"), + stdout = TRUE, stderr = FALSE + )), + error = function(e) character(0) + ) + + if (length(name) == 1L && nzchar(trimws(name))) { + trimws(name) + } else { + Sys.info()[["user"]] + } +} + +## 4.3 %||% ---- +# Defined here only when missing, so the file can be sourced on +# its own; R >= 4.4 and the harness both provide it. +if (!exists("%||%", mode = "function")) { + `%||%` <- function(x, y) if (is.null(x)) y else x +} + +# End of script ---- diff --git a/1_code/tests/testthat/test-new_experiment.R b/1_code/tests/testthat/test-new_experiment.R new file mode 100644 index 0000000..6c1e609 --- /dev/null +++ b/1_code/tests/testthat/test-new_experiment.R @@ -0,0 +1,127 @@ +# new_experiment() numbers an experiment from every folder that +# could hold one, and scaffolds all three of its folders or none. +# Each test builds a throwaway repository, so the real one is +# never touched. + +# A minimal repository: the real template, and an exp_ folder in +# each of the given roots +fake_repo <- function(existing = list()) { + root <- tempfile("repo_") + template <- file.path(root, "1_code", "experiments", "_template") + dir.create(template, recursive = TRUE) + # testthat runs from the tests folder; the framework records + # the repository root + source_template <- file.path( + getOption("sdm.project_root", "."), "1_code", "experiments", + "_template" + ) + file.copy(list.files(source_template, full.names = TRUE), template) + + for (where in names(existing)) { + dir.create(file.path(root, where, existing[[where]]), + recursive = TRUE) + } + + root +} + +test_that("a description becomes a snake_case slug", { + expect_equal(experiment_slug("Covariate scale"), "covariate_scale") + expect_equal(experiment_slug(" SoilGrids 0-5 cm! "), + "soilgrids_0_5_cm") + expect_error(experiment_slug(""), "no letters or digits") + expect_error(experiment_slug("---"), "no letters or digits") + expect_error(experiment_slug(NA_character_), "single string") + expect_error(experiment_slug(c("a", "b")), "single string") + expect_error(experiment_slug("exp_004_scale"), "exp_NNN_ prefix") +}) + +test_that("the number is one past the highest in any folder", { + expect_equal(next_experiment_number(fake_repo()), 0L) + + # A pipeline-only folder, as a removed experiment leaves, still + # holds its number + root <- fake_repo(list( + "1_code/experiments" = "exp_001_xgboost", + "2_pipeline" = "exp_004_stale", + "3_output" = "exp_002_soilgrids", + "2_pipeline/_setup" = "exp_009_nested" + )) + expect_equal(next_experiment_number(root), 5L) +}) + +test_that("new_experiment() scaffolds all three folders", { + root <- fake_repo(list("2_pipeline" = "exp_002_old")) + out <- expect_output( + new_experiment("Covariate scale", author = "Test Author", + project_root = root, open = FALSE), + "Created exp_003_covariate_scale" + ) + + expect_equal(out$id, "exp_003_covariate_scale") + + code <- file.path(root, "1_code/experiments", out$id) + expected <- c( + file.path(code, c("run.R", "README.md")), + file.path(root, "2_pipeline", out$id, + c(".gitkeep", "logs/.gitkeep")), + file.path(root, "3_output", out$id, + c("figures/.gitkeep", "tables/.gitkeep", "report.md")) + ) + expect_true(all(file.exists(expected))) + + run <- readLines(file.path(code, "run.R")) + readme <- readLines(file.path(code, "README.md")) + text <- c(run, readme) + + expect_false(any(grepl("exp_NNN|\\[Your Name\\]|\\[YYYY-MM-DD\\]", + text))) + expect_true(any(grepl( + 'id = "exp_003_covariate_scale"', run, fixed = TRUE + ))) + expect_true(any(grepl("Experiment 003 - Covariate Scale", run, + fixed = TRUE))) + expect_true(any(grepl("author: Test Author", run, fixed = TRUE))) + expect_false(any(grepl("new_experiment", run, fixed = TRUE))) + expect_equal(readme[1], "# exp_003_covariate_scale") + expect_silent(parse(file.path(code, "run.R"))) +}) + +test_that("each call takes a new number; a failure leaves none", { + root <- fake_repo(list("2_pipeline" = "exp_000_x")) + + # The same description twice: the second gets the next number + scaffold <- function() { + expect_output( + new_experiment("scale", author = "a", project_root = root, + open = FALSE), + "Created" + ) + } + scaffold() + second <- scaffold() + expect_equal(second$id, "exp_002_scale") + + # A missing template stops the call before any folder is made + expect_error( + new_experiment("other", author = "a", project_root = root, + template_dir = file.path(root, "missing"), + open = FALSE), + "Template folder not found" + ) + expect_equal(next_experiment_number(root), 3L) +}) + +test_that("a dry run writes nothing", { + root <- fake_repo() + before <- list.files(root, recursive = TRUE, include.dirs = TRUE) + + expect_output( + new_experiment("scale", project_root = root, dry_run = TRUE), + "dry run" + ) + + expect_equal( + list.files(root, recursive = TRUE, include.dirs = TRUE), before + ) +}) diff --git a/README.md b/README.md index 88bdbcb..101bb5e 100644 --- a/README.md +++ b/README.md @@ -563,6 +563,7 @@ sdmMethodsDev/ │ ├── harness/ # the shared pipeline; names no taxon or method │ │ ├── harness.R # load_framework(): loads everything │ │ ├── experiment.R # experiment_config(), run_experiment() +│ │ ├── new_experiment.R # new_experiment(): scaffold an experiment's folders │ │ ├── run_model.R # run_specs(): prepare, fit (parallel), merge │ │ ├── spec.R # validate_spec() and spec helpers │ │ ├── registry.R # register_*(), list_methods() @@ -580,7 +581,7 @@ sdmMethodsDev/ │ │ └── birds/ # spec.R, standardize.R (v2's term translation) │ ├── experiments/ │ │ ├── _shared/ # named focal-species sets -│ │ ├── _template/ # copy to start an experiment +│ │ ├── _template/ # what new_experiment() fills in │ │ ├── exp_000_parity_v2/ # run.R, 01_compare_to_v2.R, 02_plot_parity.R, │ │ │ # 03_build_report.R, utils/parity_targets.R │ │ ├── exp_001_xgboost/ # test: habitat stage fitted with xgboost @@ -946,8 +947,21 @@ and [`docs/taxon_quirks.md`](docs/taxon_quirks.md). ## Adding an experiment -1. Copy `1_code/experiments/_template/` to `exp_00N_short_description/`. -2. Set `id` in its `run.R` to the folder's name. Every path derives from it. +1. Scaffold it, from the repository root: + + ```r + source("1_code/harness/new_experiment.R") + new_experiment("covariate scale") # dry_run = TRUE to preview + ``` + + This takes the next free number across `1_code/experiments/`, + `2_pipeline/` and `3_output/`, so a stale pipeline folder still holds + its number. It then creates `1_code/experiments//` from + `_template/` with `id`, title, author and date filled in, + `2_pipeline//logs/`, and `3_output//` with `figures/`, + `tables/` and a stub `report.md`. +2. `id` in its `run.R` is already the folder's name. Every path derives + from it, so leave it as it is. 3. State the question and design in its `README.md`. 4. Change one thing relative to exp_000: `stage_models` for different candidate formulas, or `specs` for a different engine or selection rule. diff --git a/docs/getting_started.md b/docs/getting_started.md index cc7c22a..f13ea41 100644 --- a/docs/getting_started.md +++ b/docs/getting_started.md @@ -114,9 +114,19 @@ for plants. It is not the single best candidate. ## Test a change -Copy `1_code/experiments/_template/` to -`1_code/experiments/exp_001_short_description/`, set `id`, and -write the question in the README. Then change one thing. There are +Scaffold an experiment from the repository root: + +```r +source("1_code/harness/new_experiment.R") +new_experiment("short description") +``` + +It numbers the experiment (one past the highest `exp_NNN` in +`1_code/experiments/`, `2_pipeline/` or `3_output/`), copies +`1_code/experiments/_template/` with `id` set, and creates the +matching `2_pipeline//logs/` and `3_output//` folders +(`figures/`, `tables/`, `report.md`). Write the question in the +README. Then change one thing. There are three levers, from least to most invasive. ### 1. Different candidate formulas: `stage_models` From d4ce5658f49550f6dd9bf0b8f0cc19f96e07680b Mon Sep 17 00:00:00 2001 From: bgcasey Date: Tue, 6 Oct 2026 05:37:48 -0600 Subject: [PATCH 12/16] Add parity summary CSV file with climate and habitat data for various taxa --- 3_output/exp_000_parity_v2/report.md | 159 +++ 3_output/exp_000_parity_v2/run_record.md | 365 +++++++ .../exp_000_parity_v2/tables/coverage.csv | 15 + .../exp_000_parity_v2/tables/grid_summary.csv | 945 ++++++++++++++++++ .../tables/metric_summary.csv | 617 ++++++++++++ .../tables/parity_summary.csv | 23 + 6 files changed, 2124 insertions(+) create mode 100644 3_output/exp_000_parity_v2/report.md create mode 100644 3_output/exp_000_parity_v2/run_record.md create mode 100644 3_output/exp_000_parity_v2/tables/coverage.csv create mode 100644 3_output/exp_000_parity_v2/tables/grid_summary.csv create mode 100644 3_output/exp_000_parity_v2/tables/metric_summary.csv create mode 100644 3_output/exp_000_parity_v2/tables/parity_summary.csv diff --git a/3_output/exp_000_parity_v2/report.md b/3_output/exp_000_parity_v2/report.md new file mode 100644 index 0000000..8e123ac --- /dev/null +++ b/3_output/exp_000_parity_v2/report.md @@ -0,0 +1,159 @@ +# exp_000_parity_v2 + +Generated 2026-10-06 05:25:57 + +**Trial run.** 14 focal species, 5 of 100 draws. Its parity numbers show the pipeline ran; they are not a parity read. + +Draws: `seed = 20260909`, one derived seed per species. + +## What each spec reproduces of v2 + +Read from each spec's `v2_coverage`, which is where coverage is +stated. Change it there, not here. + +| taxon | stage | status | note | +| --- | --- | --- | --- | +| bryophyte | climate | reproduced | The v2 58-model set, bayesglm, full AICc averaging, fitted once per draw on every unit and shared by both regions, as v2 fits it. | +| bryophyte | habitat | reproduced | IVW on the prediction grid, the stand-age splines, cutblock convergence, footprint pooling, the south pAspen and the 20-detection skip. Matches v2 to 2e-12 on the full-data draw, north and south. | +| bryophyte | validation | reproduced | v2's seven validation AUCs, in-bag as v2 scores them and out-of-bag as well. South exact; north within 2e-4, a residual v2's own coefficients show too. | +| bryophyte | resampling | reproduced | v2's spatial-block bootstrap, drawn once per species across the province with its 20-detection redraw rule. The same method, not the same draws: v2 is unseeded. | +| lichen | climate | reproduced | The v2 58-model set, bayesglm, full AICc averaging, fitted once per draw on every unit and shared by both regions, as v2 fits it. | +| lichen | habitat | reproduced | IVW on the prediction grid, the stand-age splines, cutblock convergence, footprint pooling, the south pAspen and the 20-detection skip. Matches v2 to 2e-12 on the full-data draw, north and south. | +| lichen | validation | reproduced | v2's seven validation AUCs, in-bag as v2 scores them and out-of-bag as well. South exact; north within 2e-4, a residual v2's own coefficients show too. | +| lichen | resampling | reproduced | v2's spatial-block bootstrap, drawn once per species across the province with its 20-detection redraw rule. The same method, not the same draws: v2 is unseeded. | +| mite | climate | reproduced | The v2 58-model set, bayesglm, full AICc averaging, fitted once per draw on every unit and shared by both regions, as v2 fits it. | +| mite | habitat | reproduced | IVW on the prediction grid, the stand-age splines, cutblock convergence, footprint pooling, the south pAspen and the 20-detection skip. Matches v2 to 2e-12 on the full-data draw, north and south. | +| mite | validation | reproduced | v2's seven validation AUCs, in-bag as v2 scores them and out-of-bag as well. South exact; north within 2e-4, a residual v2's own coefficients show too. | +| mite | resampling | reproduced | v2's spatial-block bootstrap, drawn once per species across the province with its 20-detection redraw rule. The same method, not the same draws: v2 is unseeded. | +| vascular_plant | climate | reproduced | The v2 58-model set, bayesglm, full AICc averaging, fitted once per draw on every unit and shared by both regions, as v2 fits it. | +| vascular_plant | habitat | reproduced | IVW on the prediction grid, the stand-age splines, cutblock convergence, footprint pooling, the south pAspen and the 20-detection skip. Matches v2 to 2e-12 on the full-data draw, north and south. | +| vascular_plant | validation | reproduced | v2's seven validation AUCs, in-bag as v2 scores them and out-of-bag as well. South exact; north within 2e-4, a residual v2's own coefficients show too. | +| vascular_plant | resampling | reproduced | v2's spatial-block bootstrap, drawn once per species across the province with its 20-detection redraw rule. The same method, not the same draws: v2 is unseeded. | +| mammal_summer | climate | reproduced | v2's precomputed climate prediction, read per species; deployments without one are dropped, as in v2. | +| mammal_summer | habitat | reproduced | v2's hurdle: presence, abundance and total abundance on the full habitat set, with the stand-age splines, calibration and cutblock convergence. Matches v2's published tables to 2e-14, north and south. | +| mammal_summer | resampling | partial | Spatial-block bootstrap. v2 fits the habitat stage once, so only iteration 1, the full data, is like for like. | +| mammal_summer | season | reproduced | One season per spec; run.R runs both, and the gate averages them as v2's `.all` references do. | +| mammal_winter | climate | reproduced | v2's precomputed climate prediction, read per species; deployments without one are dropped, as in v2. | +| mammal_winter | habitat | reproduced | v2's hurdle: presence, abundance and total abundance on the full habitat set, with the stand-age splines, calibration and cutblock convergence. Matches v2's published tables to 2e-14, north and south. | +| mammal_winter | resampling | partial | Spatial-block bootstrap. v2 fits the habitat stage once, so only iteration 1, the full data, is like for like. | +| mammal_winter | season | reproduced | One season per spec; run.R runs both, and the gate averages them as v2's `.all` references do. | +| bird | climate | reproduced | v2's 25 candidates, AICc averaged, fitted once on the province-wide draw, unweighted, and carried as exp(link) without the offset, as MuMIn predicts it. | +| bird | landcover | reproduced | Staged BIC over v2's groups, weighted by vegw or soilw, always advancing to each group's winner. Raw coefficients are translated onto v2's standardized template by standardize.R, a port checked exact against v2's packaged output. | +| bird | resampling | reproduced | v2's 100 stored draws, keyed on surveyid, each survey once per draw as v2's %in% selects them. Only when harmonized from the Stratified.Rdata v2 was fitted on (58,210 surveys per draw); the BirdModels Data/Archive/2025 copy was rewritten on 2026-08-19 with different draws. | + +## v2 references + +Scored against `abmiexplorer`, built by `1_code/_setup/08_harmonize_abmiexplorer_results.R`. What it holds, from `v2_results_coverage.csv`: + +| source_label | reachable | rows | species | note | +| --- | --- | --- | --- | --- | +| amphibian north habitat | TRUE | 364 | 4 | - | +| amphibian south habitat | FALSE | 0 | 0 | - | +| amphibian all climate | TRUE | 44 | 4 | - | +| bird north habitat | TRUE | 10609 | 103 | - | +| bird south habitat | TRUE | 1747 | 65 | - | +| bird all climate | TRUE | 1240 | 124 | - | +| bryophyte north habitat | TRUE | 12154 | 118 | - | +| bryophyte south habitat | TRUE | 673 | 25 | - | +| bryophyte all climate | TRUE | 2242 | 118 | - | +| lichen north habitat | TRUE | 13596 | 132 | - | +| lichen south habitat | TRUE | 1206 | 45 | - | +| lichen all climate | TRUE | 2755 | 145 | - | +| mammal north habitat | TRUE | 5760 | 15 | - | +| mammal south habitat | TRUE | 1079 | 13 | - | +| mammal all climate | TRUE | 105 | 21 | - | +| mite north habitat | TRUE | 9785 | 95 | - | +| mite south habitat | TRUE | 755 | 28 | - | +| mite all climate | TRUE | 2052 | 108 | - | +| vascular_plant north habitat | TRUE | 32754 | 318 | - | +| vascular_plant south habitat | TRUE | 6257 | 233 | - | +| vascular_plant all climate | TRUE | 8246 | 434 | - | + +What this run's comparison could not reach: + +_Every taxon and region that ran had a reference to compare against._ + +## What ran + +| taxon | run | region | season | part | species | draws | stages | has_coefficients | has_grid | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| bird | bird | north | - | - | 2 | 5 | climate, landcover, habitat | TRUE | TRUE | +| bird | bird | south | - | - | 2 | 5 | climate, landcover, habitat | TRUE | TRUE | +| bryophyte | bryophyte | north | - | - | 2 | 5 | climate, habitat | TRUE | TRUE | +| bryophyte | bryophyte | south | - | - | 2 | 5 | climate, habitat | TRUE | TRUE | +| lichen | lichen | north | - | - | 2 | 5 | climate, habitat | TRUE | TRUE | +| lichen | lichen | south | - | - | 2 | 5 | climate, habitat | TRUE | TRUE | +| mammal | mammal_summer | north | summer | hurdle | 2 | 5 | habitat_presence, habitat_abundance, habitat_total | TRUE | TRUE | +| mammal | mammal_summer | south | summer | hurdle | 2 | 5 | habitat_presence, habitat_abundance, habitat_total | TRUE | TRUE | +| mammal | mammal_winter | north | winter | hurdle | 2 | 5 | habitat_presence, habitat_abundance, habitat_total | TRUE | TRUE | +| mammal | mammal_winter | south | winter | hurdle | 2 | 5 | habitat_presence, habitat_abundance, habitat_total | TRUE | TRUE | +| mite | mite | north | - | - | 2 | 5 | climate, habitat | TRUE | TRUE | +| mite | mite | south | - | - | 2 | 5 | climate, habitat | TRUE | TRUE | +| vascular_plant | vascular_plant | north | - | - | 2 | 5 | climate, habitat | TRUE | TRUE | +| vascular_plant | vascular_plant | south | - | - | 2 | 5 | climate, habitat | TRUE | TRUE | + +## Parity against v2, by stage + +Every stage is compared against `v2_results.csv`. Climate is +scored against v2's province-wide fit in both regions. Terms v2 +fixes at a placeholder are left out of the reachable scores. + +`verdict` reads each row against the parity targets in `utils/parity_targets.R` (proposed, not yet agreed): numerical rows (iteration 1) pass when every reachable term is within 1e-06; distributional rows when at least 90% of reachable terms are in band, the median standardized difference is at most 0.25, and the median band-width ratio (this run's band over v2's) is between 0.75 and 1.33. `median_spearman` is reported, not gated. A trial run is not gated. + +| taxon | region | stage | comparison | species | terms_compared | min_draws | in_band_pct | reachable_terms | reachable_in_band_pct | median_standardized_difference | median_absolute_difference | max_absolute_difference | negligible_terms | median_spearman | median_band_ratio | verdict | indicative_verdict | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| bird | north | climate | median | 2 | 20 | 5 | 90.000 | 20 | 90.000 | 0.351 | 0.000 | 0.651 | 0 | 1.000 | 0.694 | not gated (store holds 5 draws) | - | +| bryophyte | north | climate | median | 1 | 19 | 5 | 94.700 | 19 | 94.700 | 0.671 | 0.000 | 1.810 | 5 | 0.991 | 0.214 | not gated (store holds 5 draws) | - | +| lichen | north | climate | median | 2 | 38 | 5 | 89.500 | 38 | 89.500 | 0.003 | 0.000 | 1.990 | 17 | 0.991 | 0.301 | not gated (store holds 5 draws) | - | +| mite | north | climate | median | 2 | 38 | 5 | 94.700 | 38 | 94.700 | 0.082 | 0.000 | 3.790 | 20 | 0.973 | 0.656 | not gated (store holds 5 draws) | - | +| vascular_plant | north | climate | median | 2 | 38 | 5 | 97.400 | 38 | 97.400 | 0.000 | 0.000 | 0.120 | 24 | 0.982 | 0.602 | not gated (store holds 5 draws) | - | +| bird | south | climate | median | 2 | 20 | 5 | 90.000 | 20 | 90.000 | 0.351 | 0.000 | 0.651 | 0 | 1.000 | 0.694 | not gated (store holds 5 draws) | - | +| bryophyte | south | climate | median | 1 | 19 | 5 | 94.700 | 19 | 94.700 | 0.671 | 0.000 | 1.810 | 5 | 0.991 | 0.214 | not gated (store holds 5 draws) | - | +| lichen | south | climate | median | 2 | 38 | 5 | 89.500 | 38 | 89.500 | 0.003 | 0.000 | 1.990 | 17 | 0.991 | 0.301 | not gated (store holds 5 draws) | - | +| mite | south | climate | median | 2 | 38 | 5 | 94.700 | 38 | 94.700 | 0.082 | 0.000 | 3.790 | 20 | 0.973 | 0.656 | not gated (store holds 5 draws) | - | +| vascular_plant | south | climate | median | 2 | 38 | 5 | 97.400 | 38 | 97.400 | 0.000 | 0.000 | 0.120 | 24 | 0.982 | 0.602 | not gated (store holds 5 draws) | - | +| bird | north | habitat | median | 2 | 178 | 5 | 92.700 | 168 | 92.300 | 0.569 | 0.023 | 2.820 | 0 | 0.989 | 0.699 | not gated (store holds 5 draws) | - | +| bryophyte | north | habitat | median | 1 | 94 | 5 | 98.900 | 94 | 98.900 | 0.360 | 0.062 | 0.256 | 0 | 0.987 | 0.502 | not gated (store holds 5 draws) | - | +| lichen | north | habitat | median | 2 | 188 | 5 | 94.700 | 188 | 94.700 | 0.251 | 0.038 | 0.289 | 0 | 0.996 | 0.642 | not gated (store holds 5 draws) | - | +| mammal | north | habitat | iteration 1 | 2 | 448 | 4 | 100.000 | 436 | 100.000 | 0.000 | 0.000 | 0.000 | 0 | 1.000 | - | not gated (trial run) | - | +| mite | north | habitat | median | 1 | 94 | 5 | 76.600 | 94 | 76.600 | 0.579 | 0.078 | 0.673 | 0 | 0.993 | 0.642 | not gated (store holds 5 draws) | - | +| vascular_plant | north | habitat | median | 2 | 188 | 5 | 91.500 | 188 | 91.500 | 0.303 | 0.034 | 0.326 | 0 | 0.997 | 0.596 | not gated (store holds 5 draws) | - | +| bird | south | habitat | median | 2 | 46 | 5 | 80.400 | 40 | 77.500 | 0.334 | 0.021 | 0.121 | 0 | 0.995 | 0.508 | not gated (store holds 5 draws) | - | +| bryophyte | south | habitat | median | 1 | 19 | 5 | 100.000 | 19 | 100.000 | 0.399 | 0.066 | 0.267 | 0 | 0.991 | 0.633 | not gated (store holds 5 draws) | - | +| lichen | south | habitat | median | 2 | 40 | 5 | 87.500 | 40 | 87.500 | 0.337 | 0.048 | 0.655 | 1 | 0.985 | 0.554 | not gated (store holds 5 draws) | - | +| mammal | south | habitat | iteration 1 | 2 | 126 | 5 | 100.000 | 120 | 100.000 | 0.000 | 0.000 | 0.000 | 0 | 1.000 | - | not gated (trial run) | - | +| mite | south | habitat | median | 2 | 40 | 5 | 95.000 | 40 | 95.000 | 0.175 | 0.030 | 0.754 | 1 | 0.992 | 0.581 | not gated (store holds 5 draws) | - | +| vascular_plant | south | habitat | median | 2 | 40 | 5 | 75.000 | 40 | 75.000 | 0.585 | 0.070 | 0.552 | 0 | 0.977 | 0.566 | not gated (store holds 5 draws) | - | + +Where v2 bootstraps, parity is **distributional**: v2 seeds no +random draw, so two v2 runs differ, and each term is scored on +whether the v2 median falls inside this run's +10th-to-90th percentile band. Where v2 fits once +(`comparison` = iteration 1: mammals), the run's full-data fit +is compared directly; read `median_absolute_difference`. + +## Model fit + +Median AUC over species, scored on each run's final model: for plants, v2's own prediction from its coefficient tables. `insample` scores the units each draw fitted; `oob` the units it left out, the held-out read. `v2val` is v2's validation, scored from the coefficients as v2 does (plants only), so for plants `v2val_full` equals `insample_auc`. Iteration 1 is the full data and has no out-of-bag units. + +| taxon | region | species | median_insample_auc | median_oob_auc | median_v2val_full | median_oob_v2val_full | +| --- | --- | --- | --- | --- | --- | --- | +| bird | north | 2 | 0.752 | 0.729 | - | - | +| bryophyte | north | 2 | 0.668 | 0.650 | 0.668 | 0.650 | +| lichen | north | 2 | 0.808 | 0.803 | 0.808 | 0.803 | +| mammal | north | 4 | 0.746 | 0.731 | - | - | +| mite | north | 2 | 0.733 | 0.716 | 0.733 | 0.716 | +| vascular_plant | north | 2 | 0.833 | 0.828 | 0.833 | 0.828 | +| bird | south | 2 | 0.704 | 0.702 | - | - | +| bryophyte | south | 2 | 0.671 | 0.669 | 0.671 | 0.669 | +| lichen | south | 2 | 0.802 | 0.792 | 0.802 | 0.792 | +| mammal | south | 4 | 0.753 | 0.686 | - | - | +| mite | south | 2 | 0.799 | 0.774 | 0.799 | 0.774 | +| vascular_plant | south | 2 | 0.848 | 0.846 | 0.848 | 0.846 | + +## What is still needed + +See the experiment's `README.md` for what blocks the gate, and +`docs/reviews/2026-09-28_alignment_review.md` for the full +remediation plan. + diff --git a/3_output/exp_000_parity_v2/run_record.md b/3_output/exp_000_parity_v2/run_record.md new file mode 100644 index 0000000..17f6105 --- /dev/null +++ b/3_output/exp_000_parity_v2/run_record.md @@ -0,0 +1,365 @@ +# Run record: exp_000_parity_v2 + +Written by `run_record()`. The result stores this describes are gitignored; this file is what remains. + +## Provenance + +_Volatile. Excluded from cross-run comparison._ + +- **git_commit**: a45a17d +- **pipeline_dir**: D:/local_projects/active/sdmMethodsDev/2_pipeline/exp_000_parity_v2 +- **r_version**: 4.5.0 +- **written_at**: 2026-10-06 11:25:57 + +## Configuration + +- **boot_seed**: 20260909.0000 +- **changes_from_v2**: none +- **compared_with**: none (baseline) +- **covariate_files**: none +- **data_dir**: published 2026-10-05 (//ABMI-DATA2/science/sdmMethodsDev/0_data/test_dataset/2026-10-05) +- **engines**: bayesglm, glm +- **focal_species**: bird=AMRO, bird=YEWA, bryophyte=Bryum.All, bryophyte=Ceratodon.purpureus, lichen=Cladonia.chlorophaea, lichen=Physcia.adscendens, mammal=Coyote_Summer, mammal=Coyote_Winter, mammal=Moose_Summer, mammal=Moose_Winter, mite=Ceratozetes.gracilis, mite=Trhypochthonius.tectorum, vascular_plant=Galium.boreale, vascular_plant=Vicia.americana +- **jobs_not_ok**: 0 +- **jobs_ok**: 140 +- **jobs_total**: 140 +- **n_bootstraps**: 5 +- **plant_bootstrap**: spatial_block +- **selection**: aic_average, hurdle, ivw_grid, staged_bic +- **species_n**: 14 +- **stage_models**: spec defaults (v2 candidate sets) +- **taxa**: bird, bryophyte, lichen, mammal_summer, mammal_winter, mite, vascular_plant +- **v2_bootstraps**: 100 + +## Coverage + +| taxon | region | species | draws | coefficient_rows | metric_rows | grid_rows | +| --- | --- | --- | --- | --- | --- | --- | +| bird | north | 2 | 5 | 467 | 140 | 890 | +| bird | south | 2 | 5 | 350 | 140 | 170 | +| bryophyte | north | 2 | 5 | 1100 | 280 | 430 | +| bryophyte | south | 2 | 5 | 390 | 280 | 160 | +| lichen | north | 2 | 5 | 1100 | 280 | 430 | +| lichen | south | 2 | 5 | 390 | 280 | 160 | +| mammal_summer | north | 2 | 5 | 2204 | 140 | 450 | +| mammal_summer | south | 2 | 5 | 690 | 140 | 200 | +| mammal_winter | north | 2 | 5 | 2222 | 140 | 450 | +| mammal_winter | south | 2 | 5 | 690 | 140 | 200 | +| mite | north | 2 | 5 | 1090 | 280 | 430 | +| mite | south | 2 | 5 | 380 | 280 | 160 | +| vascular_plant | north | 2 | 5 | 1090 | 280 | 430 | +| vascular_plant | south | 2 | 5 | 380 | 280 | 160 | + +## Metrics + +| taxon | region | metric | n | median | p10 | p90 | mean | sd | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | +| bird | north | insample_auc | 10 | 0.7522 | 0.7235 | 0.7796 | 0.7516 | 0.0288 | +| bird | north | insample_calibration_slope | 10 | 0.7559 | 0.6982 | 0.8102 | 0.7542 | 0.0543 | +| bird | north | insample_deviance_explained | 10 | 0.1996 | 0.1409 | 0.2605 | 0.2005 | 0.0613 | +| bird | north | insample_n | 10 | 46747.0000 | 46744.0000 | 46750.0000 | 46747.6000 | 2.3664 | +| bird | north | insample_prevalence | 10 | 0.1851 | 0.1178 | 0.2520 | 0.1850 | 0.0702 | +| bird | north | insample_rmse | 10 | 0.6070 | 0.5467 | 0.6643 | 0.6056 | 0.0609 | +| bird | north | insample_spearman | 10 | 0.3277 | 0.3148 | 0.3446 | 0.3293 | 0.0149 | +| bird | north | oob_auc | 10 | 0.7299 | 0.7284 | 0.7308 | 0.7296 | 0.0010 | +| bird | north | oob_calibration_slope | 10 | 0.7875 | 0.6454 | 0.8810 | 0.7730 | 0.1073 | +| bird | north | oob_deviance_explained | 10 | 0.1647 | 0.1509 | 0.1821 | 0.1658 | 0.0150 | +| bird | north | oob_n | 10 | 124877.0000 | 124874.0000 | 124880.0000 | 124876.4000 | 2.3664 | +| bird | north | oob_prevalence | 10 | 0.1877 | 0.1343 | 0.2411 | 0.1877 | 0.0561 | +| bird | north | oob_rmse | 10 | 0.6250 | 0.5831 | 0.6583 | 0.6230 | 0.0372 | +| bird | north | oob_spearman | 10 | 0.3117 | 0.2736 | 0.3483 | 0.3110 | 0.0389 | +| bird | south | insample_auc | 10 | 0.7052 | 0.6892 | 0.7215 | 0.7054 | 0.0153 | +| bird | south | insample_calibration_slope | 10 | 0.8775 | 0.8649 | 0.8901 | 0.8777 | 0.0119 | +| bird | south | insample_deviance_explained | 10 | 0.1561 | 0.0911 | 0.2337 | 0.1609 | 0.0728 | +| bird | south | insample_n | 10 | 23639.0000 | 23636.0000 | 23640.0000 | 23638.4000 | 1.4298 | +| bird | south | insample_prevalence | 10 | 0.2142 | 0.1711 | 0.2590 | 0.2149 | 0.0459 | +| bird | south | insample_rmse | 10 | 0.6840 | 0.6232 | 0.7452 | 0.6839 | 0.0623 | +| bird | south | insample_spearman | 10 | 0.2943 | 0.2880 | 0.2978 | 0.2933 | 0.0046 | +| bird | south | oob_auc | 10 | 0.7013 | 0.6892 | 0.7156 | 0.7019 | 0.0134 | +| bird | south | oob_calibration_slope | 10 | 0.9220 | 0.8622 | 0.9549 | 0.9086 | 0.0414 | +| bird | south | oob_deviance_explained | 10 | 0.1483 | 0.0969 | 0.2066 | 0.1498 | 0.0555 | +| bird | south | oob_n | 10 | 67168.0000 | 67167.0000 | 67171.0000 | 67168.6000 | 1.4298 | +| bird | south | oob_prevalence | 10 | 0.2178 | 0.1757 | 0.2603 | 0.2180 | 0.0444 | +| bird | south | oob_rmse | 10 | 0.6869 | 0.6369 | 0.7359 | 0.6867 | 0.0513 | +| bird | south | oob_spearman | 10 | 0.2916 | 0.2888 | 0.2927 | 0.2913 | 0.0017 | +| bryophyte | north | insample_auc | 10 | 0.6642 | 0.6314 | 0.7085 | 0.6676 | 0.0347 | +| bryophyte | north | insample_calibration_slope | 10 | 0.8499 | 0.7585 | 0.8973 | 0.8326 | 0.0644 | +| bryophyte | north | insample_deviance_explained | 10 | -0.1896 | -0.2902 | -0.0937 | -0.1928 | 0.0883 | +| bryophyte | north | insample_n | 10 | 3091.0000 | 3041.1000 | 4852.0000 | 3429.3000 | 750.2771 | +| bryophyte | north | insample_prevalence | 10 | 0.4175 | 0.3976 | 0.4423 | 0.4194 | 0.0223 | +| bryophyte | north | insample_rmse | 10 | 0.4736 | 0.4634 | 0.4802 | 0.4727 | 0.0076 | +| bryophyte | north | insample_spearman | 10 | 0.2805 | 0.2228 | 0.3578 | 0.2866 | 0.0614 | +| bryophyte | north | oob_auc | 8 | 0.6562 | 0.6254 | 0.6808 | 0.6537 | 0.0253 | +| bryophyte | north | oob_calibration_slope | 8 | 0.7707 | 0.6959 | 0.8841 | 0.7784 | 0.0797 | +| bryophyte | north | oob_deviance_explained | 8 | -0.1858 | -0.2157 | -0.1326 | -0.1818 | 0.0371 | +| bryophyte | north | oob_n | 10 | 1761.0000 | 0.0000 | 1810.9000 | 1422.7000 | 750.2771 | +| bryophyte | north | oob_prevalence | 8 | 0.4201 | 0.4007 | 0.4503 | 0.4233 | 0.0233 | +| bryophyte | north | oob_rmse | 8 | 0.4801 | 0.4711 | 0.4829 | 0.4781 | 0.0053 | +| bryophyte | north | oob_spearman | 8 | 0.2675 | 0.2128 | 0.3105 | 0.2630 | 0.0449 | +| bryophyte | north | oob_v2val_Climate | 8 | 0.6045 | 0.5487 | 0.6482 | 0.5986 | 0.0463 | +| bryophyte | north | oob_v2val_Climate_Truncated | 8 | 0.6045 | 0.5486 | 0.6482 | 0.5986 | 0.0463 | +| bryophyte | north | oob_v2val_Full | 8 | 0.6562 | 0.6254 | 0.6808 | 0.6537 | 0.0253 | +| bryophyte | north | oob_v2val_Full_Joint | 8 | 0.6538 | 0.6242 | 0.6786 | 0.6519 | 0.0247 | +| bryophyte | north | oob_v2val_Full_Joint_Truncated | 8 | 0.6546 | 0.6248 | 0.6788 | 0.6524 | 0.0246 | +| bryophyte | north | oob_v2val_Full_Truncated | 8 | 0.6571 | 0.6259 | 0.6811 | 0.6542 | 0.0252 | +| bryophyte | north | oob_v2val_Landcover | 8 | 0.5971 | 0.5798 | 0.6148 | 0.5974 | 0.0150 | +| bryophyte | north | v2val_Climate | 10 | 0.6069 | 0.5555 | 0.6643 | 0.6086 | 0.0518 | +| bryophyte | north | v2val_Climate_Truncated | 10 | 0.6069 | 0.5555 | 0.6643 | 0.6086 | 0.0518 | +| bryophyte | north | v2val_Full | 10 | 0.6642 | 0.6314 | 0.7085 | 0.6676 | 0.0347 | +| bryophyte | north | v2val_Full_Joint | 10 | 0.6615 | 0.6293 | 0.7047 | 0.6648 | 0.0336 | +| bryophyte | north | v2val_Full_Joint_Truncated | 10 | 0.6621 | 0.6299 | 0.7052 | 0.6652 | 0.0334 | +| bryophyte | north | v2val_Full_Truncated | 10 | 0.6647 | 0.6320 | 0.7089 | 0.6679 | 0.0346 | +| bryophyte | north | v2val_Landcover | 10 | 0.6082 | 0.5829 | 0.6350 | 0.6089 | 0.0226 | +| bryophyte | south | insample_auc | 10 | 0.6741 | 0.6221 | 0.7221 | 0.6723 | 0.0498 | +| bryophyte | south | insample_calibration_slope | 10 | 0.8833 | 0.8604 | 0.9293 | 0.8836 | 0.0487 | +| bryophyte | south | insample_deviance_explained | 10 | -0.0076 | -0.1062 | 0.0587 | -0.0180 | 0.0817 | +| bryophyte | south | insample_n | 10 | 1454.5000 | 1440.8000 | 2310.0000 | 1623.0000 | 362.3789 | +| bryophyte | south | insample_prevalence | 10 | 0.3052 | 0.2352 | 0.3713 | 0.3043 | 0.0687 | +| bryophyte | south | insample_rmse | 10 | 0.4407 | 0.3994 | 0.4751 | 0.4384 | 0.0377 | +| bryophyte | south | insample_spearman | 10 | 0.2678 | 0.2042 | 0.3271 | 0.2668 | 0.0610 | +| bryophyte | south | oob_auc | 8 | 0.6737 | 0.6156 | 0.7162 | 0.6682 | 0.0497 | +| bryophyte | south | oob_calibration_slope | 8 | 0.8626 | 0.7944 | 0.9233 | 0.8595 | 0.0569 | +| bryophyte | south | oob_deviance_explained | 8 | 0.0177 | -0.0430 | 0.0521 | 0.0106 | 0.0409 | +| bryophyte | south | oob_n | 10 | 855.5000 | 0.0000 | 869.2000 | 687.0000 | 362.3789 | +| bryophyte | south | oob_prevalence | 8 | 0.3139 | 0.2297 | 0.3751 | 0.3071 | 0.0716 | +| bryophyte | south | oob_rmse | 8 | 0.4447 | 0.3999 | 0.4766 | 0.4408 | 0.0371 | +| bryophyte | south | oob_spearman | 8 | 0.2693 | 0.1933 | 0.3245 | 0.2610 | 0.0620 | +| bryophyte | south | oob_v2val_Climate | 8 | 0.6045 | 0.5487 | 0.6482 | 0.5986 | 0.0463 | +| bryophyte | south | oob_v2val_Climate_Truncated | 8 | 0.6045 | 0.5486 | 0.6482 | 0.5986 | 0.0463 | +| bryophyte | south | oob_v2val_Full | 8 | 0.6737 | 0.6156 | 0.7162 | 0.6682 | 0.0497 | +| bryophyte | south | oob_v2val_Full_Joint | 8 | 0.6754 | 0.6148 | 0.7178 | 0.6689 | 0.0510 | +| bryophyte | south | oob_v2val_Full_Joint_Truncated | 8 | 0.6754 | 0.6148 | 0.7178 | 0.6689 | 0.0510 | +| bryophyte | south | oob_v2val_Full_Truncated | 8 | 0.6737 | 0.6156 | 0.7162 | 0.6682 | 0.0497 | +| bryophyte | south | oob_v2val_Landcover | 8 | 0.6029 | 0.5970 | 0.6332 | 0.6102 | 0.0172 | +| bryophyte | south | v2val_Climate | 10 | 0.6069 | 0.5555 | 0.6643 | 0.6086 | 0.0518 | +| bryophyte | south | v2val_Climate_Truncated | 10 | 0.6069 | 0.5555 | 0.6643 | 0.6086 | 0.0518 | +| bryophyte | south | v2val_Full | 10 | 0.6741 | 0.6221 | 0.7221 | 0.6723 | 0.0498 | +| bryophyte | south | v2val_Full_Joint | 10 | 0.6743 | 0.6214 | 0.7227 | 0.6726 | 0.0505 | +| bryophyte | south | v2val_Full_Joint_Truncated | 10 | 0.6743 | 0.6215 | 0.7227 | 0.6726 | 0.0505 | +| bryophyte | south | v2val_Full_Truncated | 10 | 0.6741 | 0.6221 | 0.7221 | 0.6723 | 0.0498 | +| bryophyte | south | v2val_Landcover | 10 | 0.6137 | 0.5905 | 0.6386 | 0.6139 | 0.0223 | +| lichen | north | insample_auc | 10 | 0.8074 | 0.7781 | 0.8388 | 0.8083 | 0.0311 | +| lichen | north | insample_calibration_slope | 10 | 1.0001 | 0.9745 | 1.0269 | 0.9999 | 0.0221 | +| lichen | north | insample_deviance_explained | 10 | 0.1360 | 0.1091 | 0.1649 | 0.1405 | 0.0261 | +| lichen | north | insample_n | 10 | 3692.0000 | 3654.0000 | 5811.0000 | 4109.1000 | 897.3877 | +| lichen | north | insample_prevalence | 10 | 0.3839 | 0.3815 | 0.3891 | 0.3840 | 0.0037 | +| lichen | north | insample_rmse | 10 | 0.4112 | 0.3929 | 0.4298 | 0.4111 | 0.0183 | +| lichen | north | insample_spearman | 10 | 0.5176 | 0.4685 | 0.5707 | 0.5194 | 0.0520 | +| lichen | north | oob_auc | 8 | 0.7997 | 0.7622 | 0.8453 | 0.8016 | 0.0403 | +| lichen | north | oob_calibration_slope | 8 | 0.9794 | 0.9485 | 1.0076 | 0.9784 | 0.0272 | +| lichen | north | oob_deviance_explained | 8 | 0.1271 | 0.0891 | 0.1748 | 0.1334 | 0.0469 | +| lichen | north | oob_n | 10 | 2119.0000 | 0.0000 | 2157.0000 | 1701.9000 | 897.3877 | +| lichen | north | oob_prevalence | 8 | 0.3864 | 0.3761 | 0.3921 | 0.3853 | 0.0072 | +| lichen | north | oob_rmse | 8 | 0.4171 | 0.3889 | 0.4363 | 0.4142 | 0.0224 | +| lichen | north | oob_spearman | 8 | 0.5059 | 0.4420 | 0.5824 | 0.5084 | 0.0681 | +| lichen | north | oob_v2val_Climate | 8 | 0.7041 | 0.6878 | 0.7158 | 0.7028 | 0.0127 | +| lichen | north | oob_v2val_Climate_Truncated | 8 | 0.7041 | 0.6878 | 0.7158 | 0.7028 | 0.0127 | +| lichen | north | oob_v2val_Full | 8 | 0.7997 | 0.7622 | 0.8453 | 0.8016 | 0.0403 | +| lichen | north | oob_v2val_Full_Joint | 8 | 0.7969 | 0.7616 | 0.8417 | 0.7996 | 0.0394 | +| lichen | north | oob_v2val_Full_Joint_Truncated | 8 | 0.7969 | 0.7615 | 0.8418 | 0.7996 | 0.0396 | +| lichen | north | oob_v2val_Full_Truncated | 8 | 0.7997 | 0.7624 | 0.8453 | 0.8016 | 0.0404 | +| lichen | north | oob_v2val_Landcover | 8 | 0.7481 | 0.6957 | 0.8186 | 0.7528 | 0.0579 | +| lichen | north | v2val_Climate | 10 | 0.7093 | 0.6916 | 0.7289 | 0.7101 | 0.0183 | +| lichen | north | v2val_Climate_Truncated | 10 | 0.7093 | 0.6916 | 0.7290 | 0.7101 | 0.0183 | +| lichen | north | v2val_Full | 10 | 0.8074 | 0.7781 | 0.8388 | 0.8083 | 0.0311 | +| lichen | north | v2val_Full_Joint | 10 | 0.8057 | 0.7771 | 0.8370 | 0.8071 | 0.0308 | +| lichen | north | v2val_Full_Joint_Truncated | 10 | 0.8057 | 0.7770 | 0.8372 | 0.8071 | 0.0309 | +| lichen | north | v2val_Full_Truncated | 10 | 0.8074 | 0.7780 | 0.8390 | 0.8083 | 0.0312 | +| lichen | north | v2val_Landcover | 10 | 0.7424 | 0.7115 | 0.8121 | 0.7566 | 0.0468 | +| lichen | south | insample_auc | 10 | 0.8021 | 0.7789 | 0.8223 | 0.8009 | 0.0226 | +| lichen | south | insample_calibration_slope | 10 | 0.9035 | 0.8740 | 1.0439 | 0.9436 | 0.0783 | +| lichen | south | insample_deviance_explained | 10 | 0.1705 | 0.0924 | 0.2412 | 0.1684 | 0.0753 | +| lichen | south | insample_n | 10 | 1484.5000 | 1478.5000 | 2346.0000 | 1657.8000 | 362.9370 | +| lichen | south | insample_prevalence | 10 | 0.1511 | 0.0868 | 0.2167 | 0.1525 | 0.0659 | +| lichen | south | insample_rmse | 10 | 0.3163 | 0.2688 | 0.3582 | 0.3146 | 0.0440 | +| lichen | south | insample_spearman | 10 | 0.3667 | 0.2735 | 0.4597 | 0.3676 | 0.0948 | +| lichen | south | oob_auc | 8 | 0.7976 | 0.7632 | 0.8185 | 0.7926 | 0.0270 | +| lichen | south | oob_calibration_slope | 8 | 0.9438 | 0.7927 | 1.1880 | 0.9710 | 0.1829 | +| lichen | south | oob_deviance_explained | 8 | 0.1218 | -0.0135 | 0.2395 | 0.1153 | 0.1246 | +| lichen | south | oob_n | 10 | 861.5000 | 0.0000 | 867.5000 | 688.2000 | 362.9370 | +| lichen | south | oob_prevalence | 8 | 0.1578 | 0.0943 | 0.2207 | 0.1582 | 0.0637 | +| lichen | south | oob_rmse | 8 | 0.3261 | 0.2806 | 0.3630 | 0.3232 | 0.0402 | +| lichen | south | oob_spearman | 8 | 0.3688 | 0.2665 | 0.4581 | 0.3651 | 0.0946 | +| lichen | south | oob_v2val_Climate | 8 | 0.7041 | 0.6878 | 0.7158 | 0.7028 | 0.0127 | +| lichen | south | oob_v2val_Climate_Truncated | 8 | 0.7041 | 0.6878 | 0.7158 | 0.7028 | 0.0127 | +| lichen | south | oob_v2val_Full | 8 | 0.7976 | 0.7632 | 0.8185 | 0.7926 | 0.0270 | +| lichen | south | oob_v2val_Full_Joint | 8 | 0.7958 | 0.7656 | 0.8153 | 0.7914 | 0.0240 | +| lichen | south | oob_v2val_Full_Joint_Truncated | 8 | 0.7958 | 0.7656 | 0.8153 | 0.7914 | 0.0240 | +| lichen | south | oob_v2val_Full_Truncated | 8 | 0.7976 | 0.7632 | 0.8185 | 0.7926 | 0.0270 | +| lichen | south | oob_v2val_Landcover | 8 | 0.7535 | 0.7464 | 0.7630 | 0.7537 | 0.0086 | +| lichen | south | v2val_Climate | 10 | 0.7093 | 0.6916 | 0.7289 | 0.7101 | 0.0183 | +| lichen | south | v2val_Climate_Truncated | 10 | 0.7093 | 0.6916 | 0.7290 | 0.7101 | 0.0183 | +| lichen | south | v2val_Full | 10 | 0.8021 | 0.7789 | 0.8223 | 0.8009 | 0.0226 | +| lichen | south | v2val_Full_Joint | 10 | 0.8018 | 0.7799 | 0.8189 | 0.8001 | 0.0202 | +| lichen | south | v2val_Full_Joint_Truncated | 10 | 0.8018 | 0.7799 | 0.8189 | 0.8001 | 0.0202 | +| lichen | south | v2val_Full_Truncated | 10 | 0.8021 | 0.7789 | 0.8223 | 0.8009 | 0.0226 | +| lichen | south | v2val_Landcover | 10 | 0.7535 | 0.7435 | 0.7653 | 0.7532 | 0.0119 | +| mammal_summer | north | insample_auc | 10 | 0.7207 | 0.6085 | 0.8216 | 0.7173 | 0.1099 | +| mammal_summer | north | insample_calibration_slope | 10 | 0.9417 | 0.8161 | 1.0198 | 0.9320 | 0.0845 | +| mammal_summer | north | insample_deviance_explained | 10 | 0.1542 | 0.0268 | 0.2763 | 0.1529 | 0.1296 | +| mammal_summer | north | insample_n | 10 | 2587.5000 | 2542.1000 | 4053.0000 | 2865.2000 | 626.3850 | +| mammal_summer | north | insample_prevalence | 10 | 0.2736 | 0.2243 | 0.3206 | 0.2726 | 0.0496 | +| mammal_summer | north | insample_rmse | 10 | 0.3836 | 0.3234 | 0.4410 | 0.3831 | 0.0608 | +| mammal_summer | north | insample_spearman | 10 | 0.3160 | 0.1627 | 0.4610 | 0.3131 | 0.1542 | +| mammal_summer | north | oob_auc | 8 | 0.7007 | 0.5879 | 0.8116 | 0.7020 | 0.1114 | +| mammal_summer | north | oob_calibration_slope | 8 | 0.8971 | 0.7046 | 0.9590 | 0.8583 | 0.1139 | +| mammal_summer | north | oob_deviance_explained | 8 | 0.1194 | 0.0155 | 0.2466 | 0.1282 | 0.1142 | +| mammal_summer | north | oob_n | 10 | 1465.5000 | 0.0000 | 1510.9000 | 1187.8000 | 626.3850 | +| mammal_summer | north | oob_prevalence | 8 | 0.2774 | 0.2208 | 0.3261 | 0.2746 | 0.0539 | +| mammal_summer | north | oob_rmse | 8 | 0.3919 | 0.3312 | 0.4445 | 0.3895 | 0.0585 | +| mammal_summer | north | oob_spearman | 8 | 0.2911 | 0.1268 | 0.4415 | 0.2892 | 0.1555 | +| mammal_summer | south | insample_auc | 10 | 0.7054 | 0.6336 | 0.8030 | 0.7149 | 0.0833 | +| mammal_summer | south | insample_calibration_slope | 10 | 0.9832 | 0.8710 | 1.0087 | 0.9605 | 0.0585 | +| mammal_summer | south | insample_deviance_explained | 10 | 0.1016 | 0.0257 | 0.2383 | 0.1233 | 0.1035 | +| mammal_summer | south | insample_n | 10 | 676.5000 | 670.8000 | 1065.0000 | 753.7000 | 164.1402 | +| mammal_summer | south | insample_prevalence | 10 | 0.4451 | 0.1814 | 0.7098 | 0.4419 | 0.2704 | +| mammal_summer | south | insample_rmse | 10 | 0.3814 | 0.3405 | 0.4191 | 0.3811 | 0.0380 | +| mammal_summer | south | insample_spearman | 10 | 0.2798 | 0.1705 | 0.4148 | 0.2864 | 0.1148 | +| mammal_summer | south | oob_auc | 8 | 0.6568 | 0.5888 | 0.7557 | 0.6672 | 0.0845 | +| mammal_summer | south | oob_calibration_slope | 8 | 0.6589 | 0.4354 | 1.0000 | 0.7200 | 0.2938 | +| mammal_summer | south | oob_deviance_explained | 8 | 0.0059 | -0.0790 | 0.1356 | 0.0219 | 0.1214 | +| mammal_summer | south | oob_n | 10 | 388.5000 | 0.0000 | 394.2000 | 311.3000 | 164.1402 | +| mammal_summer | south | oob_prevalence | 8 | 0.4195 | 0.1726 | 0.6930 | 0.4251 | 0.2678 | +| mammal_summer | south | oob_rmse | 8 | 0.3986 | 0.3422 | 0.4425 | 0.3948 | 0.0479 | +| mammal_summer | south | oob_spearman | 8 | 0.2181 | 0.1135 | 0.3243 | 0.2204 | 0.1080 | +| mammal_winter | north | insample_auc | 10 | 0.7608 | 0.6687 | 0.8445 | 0.7578 | 0.0888 | +| mammal_winter | north | insample_calibration_slope | 10 | 0.9604 | 0.9077 | 1.0052 | 0.9518 | 0.0647 | +| mammal_winter | north | insample_deviance_explained | 10 | 0.1877 | 0.0712 | 0.3014 | 0.1868 | 0.1161 | +| mammal_winter | north | insample_n | 10 | 2624.5000 | 2596.8000 | 4127.0000 | 2921.0000 | 635.9504 | +| mammal_winter | north | insample_prevalence | 10 | 0.1752 | 0.1467 | 0.2040 | 0.1753 | 0.0287 | +| mammal_winter | north | insample_rmse | 10 | 0.3149 | 0.2994 | 0.3346 | 0.3161 | 0.0165 | +| mammal_winter | north | insample_spearman | 10 | 0.3463 | 0.2134 | 0.4714 | 0.3427 | 0.1314 | +| mammal_winter | north | oob_auc | 8 | 0.7383 | 0.6458 | 0.8353 | 0.7401 | 0.0953 | +| mammal_winter | north | oob_calibration_slope | 8 | 0.8540 | 0.6612 | 0.9533 | 0.8259 | 0.1149 | +| mammal_winter | north | oob_deviance_explained | 8 | 0.1614 | 0.0413 | 0.2853 | 0.1646 | 0.1234 | +| mammal_winter | north | oob_n | 10 | 1502.5000 | 0.0000 | 1530.2000 | 1206.0000 | 635.9504 | +| mammal_winter | north | oob_prevalence | 8 | 0.1756 | 0.1450 | 0.2025 | 0.1746 | 0.0269 | +| mammal_winter | north | oob_rmse | 8 | 0.3180 | 0.3015 | 0.3423 | 0.3198 | 0.0192 | +| mammal_winter | north | oob_spearman | 8 | 0.3198 | 0.1800 | 0.4528 | 0.3184 | 0.1382 | +| mammal_winter | south | insample_auc | 10 | 0.7642 | 0.6906 | 0.8292 | 0.7651 | 0.0684 | +| mammal_winter | south | insample_calibration_slope | 10 | 0.9542 | 0.8588 | 1.0389 | 0.9614 | 0.0769 | +| mammal_winter | south | insample_deviance_explained | 10 | 0.1574 | 0.0675 | 0.2501 | 0.1637 | 0.0946 | +| mammal_winter | south | insample_n | 10 | 694.0000 | 684.8000 | 1098.0000 | 773.7000 | 171.0842 | +| mammal_winter | south | insample_prevalence | 10 | 0.3450 | 0.0865 | 0.6052 | 0.3446 | 0.2704 | +| mammal_winter | south | insample_rmse | 10 | 0.3145 | 0.2215 | 0.4071 | 0.3127 | 0.0960 | +| mammal_winter | south | insample_spearman | 10 | 0.3224 | 0.2964 | 0.3373 | 0.3206 | 0.0167 | +| mammal_winter | south | oob_auc | 8 | 0.7095 | 0.6257 | 0.7915 | 0.7074 | 0.0854 | +| mammal_winter | south | oob_calibration_slope | 8 | 0.7307 | 0.4495 | 0.8353 | 0.6770 | 0.1665 | +| mammal_winter | south | oob_deviance_explained | 8 | 0.0389 | 0.0035 | 0.1901 | 0.0790 | 0.0856 | +| mammal_winter | south | oob_n | 10 | 404.0000 | 0.0000 | 413.2000 | 324.3000 | 171.0842 | +| mammal_winter | south | oob_prevalence | 8 | 0.3501 | 0.0777 | 0.6225 | 0.3492 | 0.2818 | +| mammal_winter | south | oob_rmse | 8 | 0.3337 | 0.2202 | 0.4271 | 0.3264 | 0.1027 | +| mammal_winter | south | oob_spearman | 8 | 0.2450 | 0.1833 | 0.2817 | 0.2399 | 0.0463 | +| mite | north | insample_auc | 10 | 0.7336 | 0.6697 | 0.7962 | 0.7334 | 0.0621 | +| mite | north | insample_calibration_slope | 10 | 1.0028 | 0.9276 | 1.0341 | 0.9867 | 0.0488 | +| mite | north | insample_deviance_explained | 10 | 0.0502 | -0.0427 | 0.1395 | 0.0479 | 0.0867 | +| mite | north | insample_n | 10 | 3630.0000 | 3598.5000 | 5711.0000 | 4041.0000 | 880.4163 | +| mite | north | insample_prevalence | 10 | 0.1545 | 0.0943 | 0.2113 | 0.1531 | 0.0602 | +| mite | north | insample_rmse | 10 | 0.3279 | 0.2873 | 0.3658 | 0.3272 | 0.0404 | +| mite | north | insample_spearman | 10 | 0.2958 | 0.1729 | 0.4186 | 0.2953 | 0.1234 | +| mite | north | oob_auc | 8 | 0.7189 | 0.6461 | 0.7894 | 0.7187 | 0.0708 | +| mite | north | oob_calibration_slope | 8 | 0.9472 | 0.7462 | 1.0295 | 0.9187 | 0.1294 | +| mite | north | oob_deviance_explained | 8 | 0.0324 | -0.0828 | 0.1165 | 0.0211 | 0.1006 | +| mite | north | oob_n | 10 | 2081.0000 | 0.0000 | 2112.5000 | 1670.0000 | 880.4163 | +| mite | north | oob_prevalence | 8 | 0.1509 | 0.0925 | 0.2048 | 0.1495 | 0.0588 | +| mite | north | oob_rmse | 8 | 0.3263 | 0.2853 | 0.3680 | 0.3268 | 0.0416 | +| mite | north | oob_spearman | 8 | 0.2764 | 0.1475 | 0.4035 | 0.2761 | 0.1298 | +| mite | north | oob_v2val_Climate | 8 | 0.6835 | 0.6308 | 0.7383 | 0.6832 | 0.0539 | +| mite | north | oob_v2val_Climate_Truncated | 8 | 0.6834 | 0.6308 | 0.7383 | 0.6832 | 0.0539 | +| mite | north | oob_v2val_Full | 8 | 0.7189 | 0.6461 | 0.7894 | 0.7187 | 0.0708 | +| mite | north | oob_v2val_Full_Joint | 8 | 0.7191 | 0.6447 | 0.7888 | 0.7183 | 0.0712 | +| mite | north | oob_v2val_Full_Joint_Truncated | 8 | 0.7192 | 0.6448 | 0.7887 | 0.7183 | 0.0712 | +| mite | north | oob_v2val_Full_Truncated | 8 | 0.7190 | 0.6462 | 0.7893 | 0.7188 | 0.0708 | +| mite | north | oob_v2val_Landcover | 8 | 0.6850 | 0.6172 | 0.7620 | 0.6890 | 0.0750 | +| mite | north | v2val_Climate | 10 | 0.6950 | 0.6449 | 0.7401 | 0.6928 | 0.0480 | +| mite | north | v2val_Climate_Truncated | 10 | 0.6950 | 0.6449 | 0.7401 | 0.6928 | 0.0480 | +| mite | north | v2val_Full | 10 | 0.7336 | 0.6697 | 0.7962 | 0.7334 | 0.0621 | +| mite | north | v2val_Full_Joint | 10 | 0.7336 | 0.6692 | 0.7962 | 0.7334 | 0.0622 | +| mite | north | v2val_Full_Joint_Truncated | 10 | 0.7336 | 0.6692 | 0.7962 | 0.7334 | 0.0621 | +| mite | north | v2val_Full_Truncated | 10 | 0.7336 | 0.6697 | 0.7961 | 0.7334 | 0.0620 | +| mite | north | v2val_Landcover | 10 | 0.7057 | 0.6335 | 0.7708 | 0.7020 | 0.0683 | +| mite | south | insample_auc | 10 | 0.7997 | 0.7044 | 0.8840 | 0.7968 | 0.0893 | +| mite | south | insample_calibration_slope | 10 | 0.7882 | 0.6097 | 0.9768 | 0.7906 | 0.1787 | +| mite | south | insample_deviance_explained | 10 | 0.0405 | -0.0053 | 0.1740 | 0.0764 | 0.0831 | +| mite | south | insample_n | 10 | 1493.0000 | 1480.9000 | 2363.0000 | 1665.8000 | 367.6444 | +| mite | south | insample_prevalence | 10 | 0.0721 | 0.0556 | 0.0841 | 0.0703 | 0.0144 | +| mite | south | insample_rmse | 10 | 0.2482 | 0.2139 | 0.2709 | 0.2446 | 0.0273 | +| mite | south | insample_spearman | 10 | 0.2519 | 0.1954 | 0.3151 | 0.2550 | 0.0557 | +| mite | south | oob_auc | 8 | 0.7769 | 0.6582 | 0.8839 | 0.7745 | 0.1136 | +| mite | south | oob_calibration_slope | 8 | 0.6139 | 0.5353 | 0.8012 | 0.6444 | 0.1288 | +| mite | south | oob_deviance_explained | 8 | 0.0535 | 0.0095 | 0.2026 | 0.0819 | 0.0851 | +| mite | south | oob_n | 10 | 870.0000 | 0.0000 | 882.1000 | 697.2000 | 367.6444 | +| mite | south | oob_prevalence | 8 | 0.0719 | 0.0489 | 0.0868 | 0.0689 | 0.0174 | +| mite | south | oob_rmse | 8 | 0.2447 | 0.2147 | 0.2788 | 0.2456 | 0.0307 | +| mite | south | oob_spearman | 8 | 0.2233 | 0.1492 | 0.3189 | 0.2298 | 0.0764 | +| mite | south | oob_v2val_Climate | 8 | 0.6835 | 0.6308 | 0.7383 | 0.6832 | 0.0539 | +| mite | south | oob_v2val_Climate_Truncated | 8 | 0.6834 | 0.6308 | 0.7383 | 0.6832 | 0.0539 | +| mite | south | oob_v2val_Full | 8 | 0.7769 | 0.6582 | 0.8839 | 0.7745 | 0.1136 | +| mite | south | oob_v2val_Full_Joint | 8 | 0.7766 | 0.6587 | 0.8846 | 0.7751 | 0.1137 | +| mite | south | oob_v2val_Full_Joint_Truncated | 8 | 0.7766 | 0.6587 | 0.8846 | 0.7751 | 0.1137 | +| mite | south | oob_v2val_Full_Truncated | 8 | 0.7769 | 0.6582 | 0.8839 | 0.7745 | 0.1136 | +| mite | south | oob_v2val_Landcover | 8 | 0.6792 | 0.6125 | 0.7124 | 0.6651 | 0.0460 | +| mite | south | v2val_Climate | 10 | 0.6950 | 0.6449 | 0.7401 | 0.6928 | 0.0480 | +| mite | south | v2val_Climate_Truncated | 10 | 0.6950 | 0.6449 | 0.7401 | 0.6928 | 0.0480 | +| mite | south | v2val_Full | 10 | 0.7997 | 0.7044 | 0.8840 | 0.7968 | 0.0893 | +| mite | south | v2val_Full_Joint | 10 | 0.8014 | 0.7048 | 0.8843 | 0.7975 | 0.0894 | +| mite | south | v2val_Full_Joint_Truncated | 10 | 0.8014 | 0.7048 | 0.8843 | 0.7975 | 0.0894 | +| mite | south | v2val_Full_Truncated | 10 | 0.7997 | 0.7044 | 0.8840 | 0.7968 | 0.0893 | +| mite | south | v2val_Landcover | 10 | 0.7027 | 0.6602 | 0.7282 | 0.6970 | 0.0287 | +| vascular_plant | north | insample_auc | 10 | 0.8331 | 0.8298 | 0.8373 | 0.8332 | 0.0032 | +| vascular_plant | north | insample_calibration_slope | 10 | 0.9949 | 0.9743 | 1.0061 | 0.9918 | 0.0148 | +| vascular_plant | north | insample_deviance_explained | 10 | 0.1616 | 0.1396 | 0.1816 | 0.1602 | 0.0191 | +| vascular_plant | north | insample_n | 10 | 4347.5000 | 4314.6000 | 6874.0000 | 4846.9000 | 1068.6395 | +| vascular_plant | north | insample_prevalence | 10 | 0.3951 | 0.3770 | 0.4211 | 0.3974 | 0.0209 | +| vascular_plant | north | insample_rmse | 10 | 0.4022 | 0.3958 | 0.4067 | 0.4017 | 0.0048 | +| vascular_plant | north | insample_spearman | 10 | 0.5651 | 0.5611 | 0.5668 | 0.5644 | 0.0038 | +| vascular_plant | north | oob_auc | 8 | 0.8283 | 0.8227 | 0.8329 | 0.8284 | 0.0052 | +| vascular_plant | north | oob_calibration_slope | 8 | 0.9755 | 0.9539 | 1.0021 | 0.9776 | 0.0210 | +| vascular_plant | north | oob_deviance_explained | 8 | 0.1803 | 0.1354 | 0.2064 | 0.1750 | 0.0321 | +| vascular_plant | north | oob_n | 10 | 2526.5000 | 0.0000 | 2559.4000 | 2027.1000 | 1068.6395 | +| vascular_plant | north | oob_prevalence | 8 | 0.3990 | 0.3725 | 0.4275 | 0.3991 | 0.0248 | +| vascular_plant | north | oob_rmse | 8 | 0.4052 | 0.3988 | 0.4110 | 0.4048 | 0.0061 | +| vascular_plant | north | oob_spearman | 8 | 0.5545 | 0.5499 | 0.5651 | 0.5564 | 0.0065 | +| vascular_plant | north | oob_v2val_Climate | 8 | 0.6916 | 0.6808 | 0.6996 | 0.6902 | 0.0106 | +| vascular_plant | north | oob_v2val_Climate_Truncated | 8 | 0.6916 | 0.6808 | 0.6996 | 0.6902 | 0.0106 | +| vascular_plant | north | oob_v2val_Full | 8 | 0.8283 | 0.8227 | 0.8329 | 0.8284 | 0.0052 | +| vascular_plant | north | oob_v2val_Full_Joint | 8 | 0.8258 | 0.8182 | 0.8325 | 0.8258 | 0.0065 | +| vascular_plant | north | oob_v2val_Full_Joint_Truncated | 8 | 0.8258 | 0.8183 | 0.8323 | 0.8258 | 0.0064 | +| vascular_plant | north | oob_v2val_Full_Truncated | 8 | 0.8285 | 0.8228 | 0.8328 | 0.8284 | 0.0051 | +| vascular_plant | north | oob_v2val_Landcover | 8 | 0.8009 | 0.7954 | 0.8101 | 0.8024 | 0.0067 | +| vascular_plant | north | v2val_Climate | 10 | 0.6886 | 0.6855 | 0.6950 | 0.6902 | 0.0048 | +| vascular_plant | north | v2val_Climate_Truncated | 10 | 0.6886 | 0.6855 | 0.6949 | 0.6902 | 0.0048 | +| vascular_plant | north | v2val_Full | 10 | 0.8331 | 0.8298 | 0.8373 | 0.8332 | 0.0032 | +| vascular_plant | north | v2val_Full_Joint | 10 | 0.8318 | 0.8275 | 0.8367 | 0.8320 | 0.0039 | +| vascular_plant | north | v2val_Full_Joint_Truncated | 10 | 0.8319 | 0.8277 | 0.8366 | 0.8321 | 0.0038 | +| vascular_plant | north | v2val_Full_Truncated | 10 | 0.8330 | 0.8299 | 0.8373 | 0.8332 | 0.0031 | +| vascular_plant | north | v2val_Landcover | 10 | 0.8087 | 0.8049 | 0.8130 | 0.8092 | 0.0040 | +| vascular_plant | south | insample_auc | 10 | 0.8460 | 0.8042 | 0.8967 | 0.8490 | 0.0462 | +| vascular_plant | south | insample_calibration_slope | 10 | 0.9608 | 0.9208 | 0.9855 | 0.9580 | 0.0297 | +| vascular_plant | south | insample_deviance_explained | 10 | 0.2841 | 0.1600 | 0.3822 | 0.2752 | 0.1074 | +| vascular_plant | south | insample_n | 10 | 1688.5000 | 1654.9000 | 2648.0000 | 1869.6000 | 410.6067 | +| vascular_plant | south | insample_prevalence | 10 | 0.2438 | 0.2212 | 0.2654 | 0.2437 | 0.0227 | +| vascular_plant | south | insample_rmse | 10 | 0.3477 | 0.3070 | 0.3827 | 0.3458 | 0.0374 | +| vascular_plant | south | insample_spearman | 10 | 0.5180 | 0.4628 | 0.5647 | 0.5163 | 0.0529 | +| vascular_plant | south | oob_auc | 8 | 0.8412 | 0.8038 | 0.8909 | 0.8455 | 0.0409 | +| vascular_plant | south | oob_calibration_slope | 8 | 0.9408 | 0.9073 | 0.9701 | 0.9401 | 0.0277 | +| vascular_plant | south | oob_deviance_explained | 8 | 0.2459 | 0.1728 | 0.3387 | 0.2532 | 0.0850 | +| vascular_plant | south | oob_n | 10 | 959.5000 | 0.0000 | 993.1000 | 778.4000 | 410.6067 | +| vascular_plant | south | oob_prevalence | 8 | 0.2418 | 0.2131 | 0.2706 | 0.2421 | 0.0259 | +| vascular_plant | south | oob_rmse | 8 | 0.3513 | 0.3168 | 0.3827 | 0.3502 | 0.0336 | +| vascular_plant | south | oob_spearman | 8 | 0.5033 | 0.4643 | 0.5589 | 0.5099 | 0.0446 | +| vascular_plant | south | oob_v2val_Climate | 8 | 0.6916 | 0.6808 | 0.6996 | 0.6902 | 0.0106 | +| vascular_plant | south | oob_v2val_Climate_Truncated | 8 | 0.6916 | 0.6808 | 0.6996 | 0.6902 | 0.0106 | +| vascular_plant | south | oob_v2val_Full | 8 | 0.8412 | 0.8038 | 0.8909 | 0.8455 | 0.0409 | +| vascular_plant | south | oob_v2val_Full_Joint | 8 | 0.8369 | 0.8023 | 0.8809 | 0.8406 | 0.0373 | +| vascular_plant | south | oob_v2val_Full_Joint_Truncated | 8 | 0.8369 | 0.8023 | 0.8809 | 0.8406 | 0.0373 | +| vascular_plant | south | oob_v2val_Full_Truncated | 8 | 0.8412 | 0.8038 | 0.8908 | 0.8455 | 0.0409 | +| vascular_plant | south | oob_v2val_Landcover | 8 | 0.7762 | 0.7677 | 0.7961 | 0.7793 | 0.0125 | +| vascular_plant | south | v2val_Climate | 10 | 0.6886 | 0.6855 | 0.6950 | 0.6902 | 0.0048 | +| vascular_plant | south | v2val_Climate_Truncated | 10 | 0.6886 | 0.6855 | 0.6949 | 0.6902 | 0.0048 | +| vascular_plant | south | v2val_Full | 10 | 0.8460 | 0.8042 | 0.8967 | 0.8490 | 0.0462 | +| vascular_plant | south | v2val_Full_Joint | 10 | 0.8411 | 0.8013 | 0.8920 | 0.8446 | 0.0448 | +| vascular_plant | south | v2val_Full_Joint_Truncated | 10 | 0.8411 | 0.8013 | 0.8920 | 0.8446 | 0.0448 | +| vascular_plant | south | v2val_Full_Truncated | 10 | 0.8460 | 0.8042 | 0.8967 | 0.8490 | 0.0462 | +| vascular_plant | south | v2val_Landcover | 10 | 0.7783 | 0.7609 | 0.8028 | 0.7802 | 0.0202 | + diff --git a/3_output/exp_000_parity_v2/tables/coverage.csv b/3_output/exp_000_parity_v2/tables/coverage.csv new file mode 100644 index 0000000..cc2de87 --- /dev/null +++ b/3_output/exp_000_parity_v2/tables/coverage.csv @@ -0,0 +1,15 @@ +taxon,run,region,season,part,species,draws,stages,has_coefficients,has_grid +bird,bird,north,,,2,5,"climate, landcover, habitat",TRUE,TRUE +bird,bird,south,,,2,5,"climate, landcover, habitat",TRUE,TRUE +bryophyte,bryophyte,north,,,2,5,"climate, habitat",TRUE,TRUE +bryophyte,bryophyte,south,,,2,5,"climate, habitat",TRUE,TRUE +lichen,lichen,north,,,2,5,"climate, habitat",TRUE,TRUE +lichen,lichen,south,,,2,5,"climate, habitat",TRUE,TRUE +mammal,mammal_summer,north,summer,hurdle,2,5,"habitat_presence, habitat_abundance, habitat_total",TRUE,TRUE +mammal,mammal_summer,south,summer,hurdle,2,5,"habitat_presence, habitat_abundance, habitat_total",TRUE,TRUE +mammal,mammal_winter,north,winter,hurdle,2,5,"habitat_presence, habitat_abundance, habitat_total",TRUE,TRUE +mammal,mammal_winter,south,winter,hurdle,2,5,"habitat_presence, habitat_abundance, habitat_total",TRUE,TRUE +mite,mite,north,,,2,5,"climate, habitat",TRUE,TRUE +mite,mite,south,,,2,5,"climate, habitat",TRUE,TRUE +vascular_plant,vascular_plant,north,,,2,5,"climate, habitat",TRUE,TRUE +vascular_plant,vascular_plant,south,,,2,5,"climate, habitat",TRUE,TRUE diff --git a/3_output/exp_000_parity_v2/tables/grid_summary.csv b/3_output/exp_000_parity_v2/tables/grid_summary.csv new file mode 100644 index 0000000..2c15e38 --- /dev/null +++ b/3_output/exp_000_parity_v2/tables/grid_summary.csv @@ -0,0 +1,945 @@ +taxon,run,region,season,part,species,grid_unit,n,median,p10,p90,boot1,mean,sd +bird,bird,north,,,AMRO,SpruceR,5,0.0460214970922903,0.0454744611146199,0.0478061585686823,0.0460214970922903,0.0464553702378501,0.00127197102591019 +bird,bird,north,,,AMRO,Spruce1,5,0.0336956807487701,0.0322810241650681,0.0345043254597905,0.0348507381455713,0.0334501194856929,0.00111752698926678 +bird,bird,north,,,AMRO,Spruce2,5,0.029967501134538,0.028689533256257,0.0309030506053303,0.0314691851923315,0.0298058122210272,0.00115338472906637 +bird,bird,north,,,AMRO,Spruce3,5,0.0258465915567713,0.0248847311078244,0.0269161638569105,0.0275986396962082,0.0258442666230429,0.00110362371041956 +bird,bird,north,,,AMRO,Spruce4,5,0.0234032880077339,0.0227504665773472,0.0245509472534085,0.0252157131909561,0.0235452704143634,0.00100329299043297 +bird,bird,north,,,AMRO,Spruce5,5,0.021731186122784,0.0213608104410011,0.0229344203019209,0.0235320177392087,0.0220072737052839,0.000897599585942329 +bird,bird,north,,,AMRO,Spruce6,5,0.0205987834958812,0.0203164427428931,0.0217537403151274,0.0222602046395292,0.0209098073999222,0.000807535567378126 +bird,bird,north,,,AMRO,Spruce7,5,0.0200852925184205,0.0194255140428591,0.0208590897859755,0.0212606901038818,0.0201004990260241,0.000749493164941381 +bird,bird,north,,,AMRO,Spruce8,5,0.0197353820173931,0.0187353929181975,0.020184041325968,0.0204546292796539,0.0194949645525674,0.000737409567340656 +bird,bird,north,,,AMRO,PineR,5,0.055663430449507,0.0543192030149498,0.0562118535015652,0.0535435973650151,0.0554222551033113,0.00109941804600945 +bird,bird,north,,,AMRO,Pine1,5,0.0400367096048969,0.0393476184649974,0.0404105539729648,0.0405470054004968,0.0398971042060573,0.000533927985762279 +bird,bird,north,,,AMRO,Pine2,5,0.0356069417161638,0.0348465927331193,0.0362895221196775,0.0366127459514038,0.0355486479216501,0.000734768131510243 +bird,bird,north,,,AMRO,Pine3,5,0.0307105378920888,0.0301269732104456,0.0316527175268143,0.0321095693334898,0.0308232640754777,0.000810293506935437 +bird,bird,north,,,AMRO,Pine4,5,0.0278758021291746,0.027484805318442,0.0288506206173034,0.0293371593640406,0.02808218595386,0.000767241565317905 +bird,bird,north,,,AMRO,Pine5,5,0.0261879900411373,0.0256371542993188,0.0269648161579907,0.0273782680404298,0.0262492756503036,0.000708980982835126 +bird,bird,north,,,AMRO,Pine6,5,0.0247842187753593,0.0243295516540588,0.0256818169038513,0.0258985802241854,0.0249420574021771,0.000679984539350903 +bird,bird,north,,,AMRO,Pine7,5,0.0237257385224398,0.0233340026010986,0.0247312486059623,0.0247356975011427,0.0239786994144854,0.000706043794957849 +bird,bird,north,,,AMRO,Pine8,5,0.0229103307685888,0.022572936039687,0.0241270556938794,0.0237978880218547,0.0232585155386345,0.000793690250372404 +bird,bird,north,,,AMRO,DecidR,5,0.0229559115592863,0.0221306044429141,0.0235352610263104,0.0237579890560399,0.0228382610280493,0.000702614250549723 +bird,bird,north,,,AMRO,Decid1,5,0.030553448874834,0.0298317579364032,0.031292026146399,0.0315584625182446,0.0305372824644636,0.000731937077174177 +bird,bird,north,,,AMRO,Decid2,5,0.0321828552741194,0.0315537397610501,0.0329318625383302,0.0331998686079368,0.0322057305060789,0.000695310231250941 +bird,bird,north,,,AMRO,Decid3,5,0.0324092194941181,0.031901614565924,0.0331074352588107,0.0333598077618143,0.0324673474226511,0.000609213373089749 +bird,bird,north,,,AMRO,Decid4,5,0.0309081262409317,0.0304692552537095,0.0315217987870488,0.0317500403920757,0.0309728473938434,0.000540903174694158 +bird,bird,north,,,AMRO,Decid5,5,0.0286739687567556,0.0282544017321468,0.0291788293287055,0.0293809707313715,0.0287147521596427,0.000501576553529028 +bird,bird,north,,,AMRO,Decid6,5,0.026263369067971,0.0256592232040337,0.0265292756315766,0.0267049789894919,0.0261396737871554,0.000487038563065855 +bird,bird,north,,,AMRO,Decid7,5,0.0235829355542547,0.022996829053316,0.0238783254234698,0.0239651842606415,0.0234890258373333,0.000486787939794446 +bird,bird,north,,,AMRO,Decid8,5,0.0209712010709133,0.020405623716483,0.0212840394420598,0.0212996862068994,0.0209009094923812,0.000490950705287533 +bird,bird,north,,,AMRO,MixedwoodR,5,0.0216440418420787,0.0214366764666218,0.0229103918922939,0.0235968351556159,0.0220089762264377,0.000908464817530186 +bird,bird,north,,,AMRO,Mixedwood1,5,0.0291224189433723,0.0286974308645267,0.0305147340021009,0.0313443968700871,0.0294293794567081,0.0010999235629169 +bird,bird,north,,,AMRO,Mixedwood2,5,0.0306755089393133,0.0302969705278782,0.0321556893179631,0.0329746690631811,0.0310373758199453,0.00111497918591993 +bird,bird,north,,,AMRO,Mixedwood3,5,0.0308912709528129,0.030589685080101,0.0323492807237952,0.0331335233264806,0.0312892785989983,0.00106272343336921 +bird,bird,north,,,AMRO,Mixedwood4,5,0.0295710415430225,0.0291898679692672,0.0307877153702325,0.0315346752432942,0.0298485867463704,0.000975648708630527 +bird,bird,north,,,AMRO,Mixedwood5,5,0.0274075295438599,0.0270457330870442,0.0285447239533767,0.0291816753271841,0.0276719693316288,0.000884980899063123 +bird,bird,north,,,AMRO,Mixedwood6,5,0.0248744913880928,0.024598727956784,0.0260231600770452,0.0265238352270822,0.0251899056928364,0.000802290447826292 +bird,bird,north,,,AMRO,Mixedwood7,5,0.0223638470242142,0.0220520253761532,0.0234214558496831,0.0238026249249641,0.0226350829214757,0.000731084140709001 +bird,bird,north,,,AMRO,Mixedwood8,5,0.0199126764372763,0.0195738570800957,0.0208756562752855,0.0211552073327846,0.0201406033213722,0.000670966355515117 +bird,bird,north,,,AMRO,TreedBogR,5,0.0331850952367972,0.0319507285402324,0.0343298174584785,0.0320053956170601,0.0331519445129201,0.00118442927359984 +bird,bird,north,,,AMRO,TreedBog1,5,0.0441859758905737,0.04277191207391,0.0459514038332503,0.0425137445589404,0.0443337761762291,0.00156198810108254 +bird,bird,north,,,AMRO,TreedBog2,5,0.0465280988683981,0.0450759279854423,0.0485442094151598,0.0447249523823355,0.0467597382128024,0.00170719065750671 +bird,bird,north,,,AMRO,TreedBog3,5,0.0468127655397305,0.0453501172953296,0.0491179865619394,0.0449404132061633,0.0471460379457872,0.00186526187035362 +bird,bird,north,,,AMRO,TreedBog4,5,0.0445965703925972,0.0431609344939285,0.0470359967670578,0.0427718272455254,0.0449814750753084,0.00192768335450474 +bird,bird,north,,,AMRO,TreedBog5,5,0.0413013718566653,0.0399132456880923,0.043776679654854,0.0395803529352897,0.0417070190418488,0.00193042065727443 +bird,bird,north,,,AMRO,TreedBog6,5,0.0375650211610718,0.03623802297114,0.0400079459227759,0.0359754108602334,0.0379711836795942,0.0018921239404454 +bird,bird,north,,,AMRO,TreedBog7,5,0.0337311435879773,0.032474706589339,0.0360937692651888,0.0322845170729035,0.0341246159398247,0.00182499536957324 +bird,bird,north,,,AMRO,TreedBog8,5,0.0299955276096956,0.0288159490396316,0.0322449753172705,0.028693711490609,0.0303679835711985,0.00173785947843209 +bird,bird,north,,,AMRO,TreedFenR,5,0.0422645144129336,0.0411206711160944,0.0444612609388868,0.0416408069894085,0.0426593947598897,0.00168457584655721 +bird,bird,north,,,AMRO,TreedFen1,5,0.0567852320289917,0.0546993980136261,0.0595487401346133,0.0553127557852217,0.057053309735497,0.00238325844479936 +bird,bird,north,,,AMRO,TreedFen2,5,0.0601053333210814,0.057576793915605,0.062801721494816,0.0581896606449257,0.0601748343893455,0.0025620770336273 +bird,bird,north,,,AMRO,TreedFen3,5,0.061004684620066,0.0578987833513519,0.0632661157627814,0.0584699872088007,0.0606684764795377,0.00263876467136345 +bird,bird,north,,,AMRO,TreedFen4,5,0.0585750472403725,0.0551364039392565,0.060286084605513,0.0556485357726957,0.0578783628836603,0.002555165865925 +bird,bird,north,,,AMRO,TreedFen5,5,0.0546495586388256,0.0510462396551786,0.0558163205477266,0.0514962494721526,0.053660035636928,0.00240507475761092 +bird,bird,north,,,AMRO,TreedFen6,5,0.0499841351763957,0.0464156762019834,0.0507663812147309,0.0468060185201128,0.0488485601936305,0.0022298132966526 +bird,bird,north,,,AMRO,TreedFen7,5,0.0447008747250632,0.0416684838734553,0.0457440880993633,0.0420039595905649,0.0438953797644894,0.00204991323315053 +bird,bird,north,,,AMRO,TreedFen8,5,0.0395694346049872,0.0370458190070238,0.0408183339762998,0.0373321210050387,0.0390587727531739,0.00187548466068124 +bird,bird,north,,,AMRO,GrassHerb,5,0.0391157074651561,0.0374665801039995,0.0407064521459671,0.0414109112421211,0.0390437971413913,0.0016402212390184 +bird,bird,north,,,AMRO,Shrub,5,0.0242992189479925,0.0228825094225992,0.0246776245457063,0.0249051907368317,0.0238911541881936,0.000924348597764569 +bird,bird,north,,,AMRO,GraminoidFen,5,0.0240253006082896,0.0229416430615678,0.0249398229795977,0.0240253006082896,0.023983448309286,0.000993958517209816 +bird,bird,north,,,AMRO,Marsh,5,0.0190409138857816,0.0176773805870109,0.0216818753326244,0.0201855790618525,0.0195090503185658,0.00208856238176789 +bird,bird,north,,,AMRO,RoughP,5,0.0284487010336342,0.0273540658384352,0.029100651467195,0.0283163935552878,0.028312104577748,0.000976790108762144 +bird,bird,north,,,AMRO,TameP,5,0.0337677662581705,0.0332118392222873,0.036508679760649,0.037370361410168,0.0345916414986334,0.00176937305868641 +bird,bird,north,,,AMRO,Crop,5,0.0303304446509559,0.0292521806779319,0.0312352000249702,0.0316675460758044,0.0302312594816356,0.00100540739345621 +bird,bird,north,,,AMRO,Industrial,5,0.0347264320174887,0.033312971177683,0.0355682981118906,0.0357679771660033,0.0344866786749583,0.00111665066023152 +bird,bird,north,,,AMRO,Mine,5,0.0436153300361437,0.0381990210765919,0.0459245387062479,0.0436153300361437,0.0423961825295189,0.00389106674125516 +bird,bird,north,,,AMRO,Rural,5,0.0396443515023387,0.038005707047867,0.0414176232218955,0.041757773007241,0.0396782863611264,0.0016777934772785 +bird,bird,north,,,AMRO,Urban,5,0.0403436023988292,0.0374075928778925,0.0427692941093427,0.0377072326980573,0.040094022635699,0.00264783886461812 +bird,bird,north,,,AMRO,CCSpruceR,5,0.0464207068040547,0.0457292776866576,0.0488055453828144,0.0464207068040547,0.0470442907734406,0.00167197396263071 +bird,bird,north,,,AMRO,CCSpruce1,5,0.0334382471003622,0.0328903186279197,0.0349792099606696,0.0351307392341287,0.0338342587671066,0.00104802117766549 +bird,bird,north,,,AMRO,CCSpruce2,5,0.0297844962219075,0.0291681742313691,0.0312403869295451,0.0316709611104685,0.0300774692961451,0.00106585636584408 +bird,bird,north,,,AMRO,CCSpruce3,5,0.0257839800291967,0.0250483982402682,0.0270314998715563,0.0276685704867883,0.0259369345988329,0.00106777390956264 +bird,bird,north,,,AMRO,CCSpruce4,5,0.0233883758956751,0.0227898099129418,0.0245785085975324,0.0252324884758929,0.0235674959495998,0.000996700398796307 +bird,bird,north,,,AMRO,CCPineR,5,0.0556588717866301,0.0544149295122647,0.058052743467746,0.0540080569202541,0.0561277724704085,0.00180666291382705 +bird,bird,north,,,AMRO,CCPine1,5,0.0402344808099467,0.0399196288909847,0.0408216202332076,0.0408727719768734,0.040357160451343,0.00046025801408057 +bird,bird,north,,,AMRO,CCPine2,5,0.0358025164520706,0.0354021820907293,0.0364721654805386,0.0368475016460527,0.0358739771129343,0.000590299549843217 +bird,bird,north,,,AMRO,CCPine3,5,0.0306877354469581,0.0303682798458408,0.0317012367664505,0.0321909301394351,0.0309342419940114,0.000755692302324986 +bird,bird,north,,,AMRO,CCPine4,5,0.0279566387258189,0.0275081026095794,0.0288622599803365,0.0293566765279551,0.0281088057786237,0.000758937295851063 +bird,bird,north,,,AMRO,CCDecidR,5,0.0235157538328627,0.0220205659375402,0.0240398063704617,0.0239640757885976,0.0231324711414825,0.00101843877053024 +bird,bird,north,,,AMRO,CCDecid1,5,0.0311469864460262,0.0297314532115381,0.0318112029859532,0.031776862556441,0.0308482456975221,0.00104616123097925 +bird,bird,north,,,AMRO,CCDecid2,5,0.0325949076990241,0.0314791572519253,0.0332838607667157,0.0333516171167642,0.0324211482728123,0.000897113117886519 +bird,bird,north,,,AMRO,CCDecid3,5,0.0325265668622635,0.0318777585482393,0.033207441139438,0.0334030551273305,0.0325285168793225,0.00065734364091383 +bird,bird,north,,,AMRO,CCDecid4,5,0.0309528425918292,0.0304601698476958,0.0315598462965716,0.0317664981841116,0.0309961301025662,0.000557779201706145 +bird,bird,north,,,AMRO,CCMixedwoodR,5,0.0224136935821678,0.0213872957159068,0.0232466535727542,0.0238015239718475,0.0222860528997309,0.000988289616189019 +bird,bird,north,,,AMRO,CCMixedwood1,5,0.0296185552493973,0.0288303211553137,0.0308120520947235,0.0315613154690116,0.0297222065212846,0.00110977637889517 +bird,bird,north,,,AMRO,CCMixedwood2,5,0.0308728597959445,0.0305223049649659,0.0323025377803166,0.033125388239769,0.0312402265656467,0.00108688467332021 +bird,bird,north,,,AMRO,CCMixedwood3,5,0.0310031221297793,0.0306928887240712,0.0323595803262164,0.033176477338817,0.0313468792258484,0.00104120784061213 +bird,bird,north,,,AMRO,CCMixedwood4,5,0.0295708962308159,0.0292462349147995,0.0307916306804173,0.0315510213997294,0.0298705111701574,0.00096556171349458 +bird,bird,north,,,AMRO,ShrubbySwamp,5,0.0280532806155646,0.0272120492548132,0.0304723043995906,0.0293807705242182,0.028642432626409,0.00168768533141114 +bird,bird,north,,,AMRO,ShrubbyBog,5,0.0312066411236273,2.39623255235884e-06,0.0912997718305207,0.0987592495876081,0.0420163327688555,0.0456017647742937 +bird,bird,north,,,AMRO,ShrubbyFen,5,0.0199096452985301,0.0173227067986502,0.0204962269519268,0.0179711671460881,0.0191153200531081,0.00163113398716313 +bird,bird,north,,,AMRO,TreedSwamp,5,0.0150538387752528,0.0144236036440235,0.0158664078264896,0.0147780567655432,0.0151226098591078,0.000732979915113703 +bird,bird,north,,,YEWA,SpruceR,5,0.0258559745060982,0.0234403345263018,0.0260111209530433,0.0244391479557886,0.0250156649200479,0.00141587922713189 +bird,bird,north,,,YEWA,Spruce1,5,0.0228379925381185,0.0217902474136419,0.0235046389346874,0.0217244417914461,0.0226588624294516,0.000867039120790799 +bird,bird,north,,,YEWA,Spruce2,5,0.0202131466194631,0.0195276592826221,0.0212015763249332,0.0191951189565087,0.0203300867521231,0.000872220968316701 +bird,bird,north,,,YEWA,Spruce3,5,0.0152260266705766,0.014857155524532,0.0172302414914592,0.0147168214368909,0.015884604119312,0.00122343184525584 +bird,bird,north,,,YEWA,Spruce4,5,0.0111004447615773,0.011013191632923,0.0132562242110949,0.0110142694942302,0.0119062108855284,0.0011988279728585 +bird,bird,north,,,YEWA,Spruce5,5,0.00804666353131241,0.00782404584193233,0.00956383307230264,0.00804666353131241,0.00855088083029275,0.000905640135543961 +bird,bird,north,,,YEWA,Spruce6,5,0.00573844799961777,0.00536607662283719,0.00647092405422643,0.00573844799961777,0.00588369887690215,0.000555796810229676 +bird,bird,north,,,YEWA,Spruce7,5,0.0039947676530843,0.0035660316198102,0.00416241768282985,0.0039947676530843,0.00388279318439441,0.00030409785039464 +bird,bird,north,,,YEWA,Spruce8,5,0.00235082179047476,0.00227361425460549,0.00270649382245452,0.00271460762119826,0.00246262309860069,0.000223214918491482 +bird,bird,north,,,YEWA,PineR,5,0.0205785305776538,0.016318274681477,0.0214352987031151,0.0205785305776538,0.019217883621867,0.00262425459458988 +bird,bird,north,,,YEWA,Pine1,5,0.0182926626777856,0.0153708906689175,0.01895474719957,0.0182926626777856,0.0173660023342792,0.00184714292249953 +bird,bird,north,,,YEWA,Pine2,5,0.0161628933669374,0.0141454379072083,0.0166341234332659,0.0161628933669374,0.0155489855935594,0.00126842607226756 +bird,bird,north,,,YEWA,Pine3,5,0.0123056049633671,0.0114779279888745,0.0125556597430834,0.0123920261251661,0.0121106264069309,0.000641272645106542 +bird,bird,north,,,YEWA,Pine4,5,0.00925626382247502,0.00858692715044315,0.00939389903902125,0.00927436103695466,0.00906124080178095,0.000445903613405282 +bird,bird,north,,,YEWA,Pine5,5,0.00657162382380723,0.00614692336606859,0.00680475100874576,0.0067755435593238,0.00650526021516012,0.000331932489863419 +bird,bird,north,,,YEWA,Pine6,5,0.00453218358829318,0.00422748241429677,0.00472061781142898,0.00483195354609082,0.00448089947179597,0.000253288198947572 +bird,bird,north,,,YEWA,Pine7,5,0.00285709675383384,0.00277596123213307,0.00323273918784264,0.00336371989925068,0.00296438042813188,0.000247212233446868 +bird,bird,north,,,YEWA,Pine8,5,0.00182760895381318,0.00166130029618671,0.00216184116705074,0.00228578492344407,0.00188735457061119,0.000259401049664766 +bird,bird,north,,,YEWA,DecidR,5,0.067934626437015,0.0674576672463633,0.0729195663394245,0.067934626437015,0.0695161849099952,0.00337617618393999 +bird,bird,north,,,YEWA,Decid1,5,0.0765302527003605,0.0753508333805385,0.0809224163873259,0.0757433785005077,0.0775653404553756,0.0034849797906858 +bird,bird,north,,,YEWA,Decid2,5,0.0831933705848618,0.0821163970415955,0.0879817188793552,0.0824551590396893,0.084437018083834,0.00354655002105156 +bird,bird,north,,,YEWA,Decid3,5,0.0909542914829032,0.0906172695168214,0.09667461567637,0.0909542914829032,0.0929168749649886,0.00348284090180142 +bird,bird,north,,,YEWA,Decid4,5,0.0911816141264914,0.0902820435873628,0.0960411655989214,0.0911816141264914,0.0926283291485939,0.00310481576821379 +bird,bird,north,,,YEWA,Decid5,5,0.0830749476256945,0.0815385432720113,0.0862567937273009,0.0830749476256945,0.0836509205612147,0.00245302779264785 +bird,bird,north,,,YEWA,Decid6,5,0.0684511157991116,0.0668156484857424,0.0701683129834214,0.0687878278508456,0.0684357600162802,0.00175553578959361 +bird,bird,north,,,YEWA,Decid7,5,0.0502439884002606,0.0495409659411423,0.052147813318469,0.0517644774974931,0.0507231692666107,0.00130741350672055 +bird,bird,north,,,YEWA,Decid8,5,0.0339005594888284,0.0329378261237809,0.0352547173481443,0.0354022441617264,0.0340630233668366,0.00114017049560887 +bird,bird,north,,,YEWA,MixedwoodR,5,0.0321181710498639,0.0319864486524918,0.0343492759912242,0.0321181710498639,0.0329514089784471,0.00125801887647939 +bird,bird,north,,,YEWA,Mixedwood1,5,0.0361186343792291,0.0357543657081755,0.0381193002267473,0.0358099972600774,0.0367664871038007,0.00122372290033736 +bird,bird,north,,,YEWA,Mixedwood2,5,0.0396578845880583,0.0389647638764836,0.0412876201913861,0.0389831966535626,0.0400235347483558,0.00116873050229461 +bird,bird,north,,,YEWA,Mixedwood3,5,0.044161071804344,0.0430114778126448,0.0450311260127699,0.0430014212895615,0.0440431761917261,0.00100387518506072 +bird,bird,north,,,YEWA,Mixedwood4,5,0.0442351820713005,0.0430824404362304,0.0445653556762868,0.0431088950173672,0.0439072599866513,0.000761025409505987 +bird,bird,north,,,YEWA,Mixedwood5,5,0.0398578791525603,0.0391443456983723,0.0400558611174636,0.0392762206512514,0.0396532399203009,0.000461594422361296 +bird,bird,north,,,YEWA,Mixedwood6,5,0.0324703166414877,0.032179685405207,0.0326999878711223,0.0325215480961012,0.0324424353965295,0.000268202474568964 +bird,bird,north,,,YEWA,Mixedwood7,5,0.0239356684881771,0.0236920166090268,0.0244336977342141,0.0244732389028849,0.0240472848311377,0.00037626223519239 +bird,bird,north,,,YEWA,Mixedwood8,5,0.0161253113583632,0.0156693072501918,0.0166180780337648,0.0167374929865786,0.0161502413826242,0.000485932289158991 +bird,bird,north,,,YEWA,TreedBogR,5,0.011556676565964,0.0106150734211072,0.015167132081919,0.0131547525960213,0.0125010321176789,0.00246609868223356 +bird,bird,north,,,YEWA,TreedBog1,5,0.0130294668017344,0.0118161055388771,0.0168577424412391,0.0146668268778186,0.0139449259066216,0.00270635025396768 +bird,bird,north,,,YEWA,TreedBog2,5,0.0143062189240542,0.0128370960433458,0.0182880974231299,0.0159664853451186,0.0151767961731582,0.00290241602990773 +bird,bird,north,,,YEWA,TreedBog3,5,0.0159307025000537,0.0140854433394799,0.0200138051382188,0.0176122437813552,0.0166943895130734,0.00311323961347103 +bird,bird,north,,,YEWA,TreedBog4,5,0.0159574371006158,0.0140225317629725,0.0198790018140412,0.0176562621751068,0.0166376260902294,0.00304031786082071 +bird,bird,north,,,YEWA,TreedBog5,5,0.0143783651328877,0.0126656720514962,0.0179214155743405,0.0160865002173325,0.0150221957500339,0.00270292011233113 +bird,bird,north,,,YEWA,TreedBog6,5,0.0116539735513248,0.0103793735442064,0.0146647056806911,0.0133199651555387,0.012288662885541,0.00219011143934681 +bird,bird,north,,,YEWA,TreedBog7,5,0.00849682553839672,0.00771705937769765,0.0108920493747369,0.0100235907733028,0.00910814502782403,0.00162151072877657 +bird,bird,north,,,YEWA,TreedBog8,5,0.00557259559451445,0.00520557300073712,0.00734335343414964,0.00685523403478533,0.00611717440175423,0.00110087226572051 +bird,bird,north,,,YEWA,TreedFenR,5,0.0236371088398181,0.0172768808475891,0.024924502499633,0.0236371088398181,0.0216232860603613,0.00391878121541672 +bird,bird,north,,,YEWA,TreedFen1,5,0.0263540785518553,0.0192542019396591,0.0279298914574923,0.0263540785518553,0.0241380888094778,0.00443627285396668 +bird,bird,north,,,YEWA,TreedFen2,5,0.0286893690426434,0.0209405142100181,0.0305054446689458,0.0286893690426434,0.0262867689668403,0.00489124468060123 +bird,bird,north,,,YEWA,TreedFen3,5,0.031404364802713,0.0230203258078457,0.0337911333203274,0.0316465490426032,0.0289430156828602,0.00548345748227703 +bird,bird,north,,,YEWA,TreedFen4,5,0.0310353005156193,0.0229524913747421,0.0338582352701967,0.0317256434654338,0.0288609514455203,0.00550888542351665 +bird,bird,north,,,YEWA,TreedFen5,5,0.0278154609778999,0.0207556385456937,0.0306353026947788,0.0289050176894887,0.0260631606546629,0.0049565302639343 +bird,bird,north,,,YEWA,TreedFen6,5,0.0226089781361948,0.0170225823525394,0.0250329038492433,0.023933970922363,0.0213158555743729,0.00399734472991934 +bird,bird,north,,,YEWA,TreedFen7,5,0.0166663297897427,0.0126617741481907,0.0184756251524069,0.0180108827091141,0.0157894768182317,0.00289715122347528 +bird,bird,north,,,YEWA,TreedFen8,5,0.0111420056428385,0.00854164778652357,0.0123193300297175,0.0123178229176012,0.010594291818947,0.0018963603193835 +bird,bird,north,,,YEWA,GrassHerb,5,0.0932809108920782,0.0913238743042866,0.099354153490354,0.0901967196519561,0.0947526791900974,0.00452534589281357 +bird,bird,north,,,YEWA,Shrub,5,0.0137692356170479,0.0119314278078182,0.0157329585961985,0.0157895871550544,0.0138175228868595,0.00189032792293432 +bird,bird,north,,,YEWA,GraminoidFen,5,0.0568382240230587,0.0469653962284414,0.0581610479717628,0.0584309966782358,0.0538402009564441,0.00660625447641818 +bird,bird,north,,,YEWA,Marsh,5,0.0523104434118613,0.0513226604208148,0.0592605534505783,0.0508708598171353,0.0546191488316924,0.00413758571332043 +bird,bird,north,,,YEWA,RoughP,5,0.0682370509878256,0.0670669867920174,0.0695536106096402,0.0675367024470256,0.0682490773036854,0.0013325208003094 +bird,bird,north,,,YEWA,TameP,5,0.0388719938949029,0.0351357025693022,0.0407515647841364,0.0388719938949029,0.0381829277637048,0.00280038505345587 +bird,bird,north,,,YEWA,Crop,5,0.0480473182692122,0.0467260154201003,0.0494996772635692,0.0480608449912437,0.048048644626923,0.00153038688777236 +bird,bird,north,,,YEWA,Industrial,5,0.0209926161493617,0.0179403892660471,0.0274121855791778,0.0163774906175213,0.0224244654410295,0.00477087310459995 +bird,bird,north,,,YEWA,Mine,5,0.0298281089999606,0.0252803812327327,0.0438712258060967,0.0425264275216284,0.0335602920110228,0.00942421656959815 +bird,bird,north,,,YEWA,Rural,5,0.0520106523964021,0.0509948165571747,0.0580204328798446,0.0511767629721787,0.0538135079742067,0.00385508094702323 +bird,bird,north,,,YEWA,Urban,5,0.0189358775335448,0.0180723788869236,0.0232307511964699,0.0175580460951392,0.0200793068448389,0.00338352975115308 +bird,bird,north,,,YEWA,CCSpruceR,5,0.0152672175746062,0.0139145872911392,0.0165869364759518,0.0140004857871316,0.0152198272082254,0.00132815720387295 +bird,bird,north,,,YEWA,CCSpruce1,5,0.0145361447342197,0.0133048327331401,0.0151662007660585,0.0129654763620514,0.0142937917361502,0.000959125878049657 +bird,bird,north,,,YEWA,CCSpruce2,5,0.0142897376611622,0.0132388070120826,0.0146721348538594,0.0127102186233497,0.0140660338253786,0.000805593935662693 +bird,bird,north,,,YEWA,CCSpruce3,5,0.0134450799502097,0.0127354661170899,0.0148322925225234,0.0125004237260447,0.0137249541584959,0.00104203775139054 +bird,bird,north,,,YEWA,CCSpruce4,5,0.0107434349248054,0.0105759890760241,0.0127445041685453,0.0105517888223615,0.0114569858337227,0.00114367697811895 +bird,bird,north,,,YEWA,CCPineR,5,0.0117888489972604,0.00978058439715013,0.0136122385160046,0.0117888489972604,0.0117069884728364,0.00190028909974178 +bird,bird,north,,,YEWA,CCPine1,5,0.0109173385362286,0.00950427775443443,0.0124464416038799,0.0109173385362286,0.0109676663715755,0.0014493957862129 +bird,bird,north,,,YEWA,CCPine2,5,0.0107024034987813,0.00963763502050784,0.0118767346358323,0.0107024034987813,0.0107680430445057,0.00110689821889728 +bird,bird,north,,,YEWA,CCPine3,5,0.0105322296684723,0.00985879892133643,0.0109469939924601,0.0105257496024575,0.0104678436776119,0.000624606314885391 +bird,bird,north,,,YEWA,CCPine4,5,0.00888493777781158,0.00827021172815224,0.00903877043393079,0.00888493777781158,0.00872016122181434,0.000433694848090059 +bird,bird,north,,,YEWA,CCDecidR,5,0.0408740518525815,0.0395742880103873,0.0463855635812126,0.0389177958906805,0.0423301854605452,0.00406186997061815 +bird,bird,north,,,YEWA,CCDecid1,5,0.0504993452950062,0.0491803622371971,0.0566278245259164,0.048545974417128,0.0521870283212628,0.00434829871604341 +bird,bird,north,,,YEWA,CCDecid2,5,0.062995265035987,0.0619691334562304,0.0695286705182462,0.0614429350398245,0.0649617151096108,0.00438105204093069 +bird,bird,north,,,YEWA,CCDecid3,5,0.0839595481698585,0.0837446499537815,0.090415392433214,0.0836626760316502,0.0862405157433662,0.00384879137472909 +bird,bird,north,,,YEWA,CCDecid4,5,0.0881841836019783,0.0875140301840755,0.0935026282391147,0.0881841836019783,0.089905070222935,0.00326484969143502 +bird,bird,north,,,YEWA,CCMixedwoodR,5,0.0198089465088669,0.0188166896946456,0.0215401269632987,0.0183995775182405,0.0200471562894921,0.00152526660104984 +bird,bird,north,,,YEWA,CCMixedwood1,5,0.0246050062604319,0.0233792653816228,0.0262550008779679,0.0229515931990476,0.0247196289741307,0.0015772935132775 +bird,bird,north,,,YEWA,CCMixedwood2,5,0.0307677459222674,0.0294152736977039,0.0322590575421635,0.0290490255252145,0.0307779939565969,0.00150046114776195 +bird,bird,north,,,YEWA,CCMixedwood3,5,0.0410887724516163,0.0397071014363877,0.0419786408808556,0.0395540872189119,0.0408732849664851,0.00113007823491948 +bird,bird,north,,,YEWA,CCMixedwood4,5,0.0429775093725811,0.0417350634696179,0.0433309104754257,0.0416917681213261,0.0426142220574469,0.000811468917178181 +bird,bird,north,,,YEWA,ShrubbySwamp,5,0.084170088903374,0.0814218719690635,0.0880371848217152,0.079822188726824,0.0845953556361207,0.00359783935045764 +bird,bird,north,,,YEWA,ShrubbyBog,5,4.8908918803986e-06,4.23856436295343e-06,5.39123857787991e-06,4.42578200846098e-06,4.83402759311359e-06,5.66960969792273e-07 +bird,bird,north,,,YEWA,ShrubbyFen,5,0.0414566214404942,0.039261597045695,0.0505385114750219,0.0484352778746871,0.0440925167844869,0.00577045904748459 +bird,bird,north,,,YEWA,TreedSwamp,5,0.0406512816816615,0.0399137539513559,0.0426021810257371,0.0406996342472028,0.041037209932847,0.00163945654589851 +bird,bird,south,,,AMRO,Loamy,5,0.0241321618221621,0.0236693559161623,0.0244417594641063,0.0239569869686121,0.0240845194350461,0.000397588872294506 +bird,bird,south,,,AMRO,Blowout,5,0.00525978394452474,0.00483082627794943,0.00554114840096604,0.00559111949874543,0.00521832850528163,0.000380997984164263 +bird,bird,south,,,AMRO,ClaySub,5,0.0224545103948504,0.0209236101394104,0.0249199215728223,0.0250347637306298,0.0228949983648061,0.00202623689619071 +bird,bird,south,,,AMRO,Crop,5,0.0230932157889498,0.0226956842202502,0.0238595151902264,0.0236839952497224,0.0232465903153888,0.000582704673265551 +bird,bird,south,,,AMRO,Industrial,5,0.0262354418047225,0.0234169654211887,0.029992373999167,0.0233617397737627,0.0264579449889971,0.00338847243340584 +bird,bird,south,,,AMRO,Mine,5,0.0159069410465305,0.014010684448404,0.025109840836752,0.0159069410465305,0.018698641258821,0.00572004799070757 +bird,bird,south,,,AMRO,Other,5,0.016098468661524,0.0128083644871958,0.0205965606097986,0.0210202102474962,0.016661932215088,0.00387486651255373 +bird,bird,south,,,AMRO,RapidDrain,5,0.0236194782771747,0.0230076960669836,0.0255994765544292,0.0251675270889975,0.0241724133059695,0.00131670630516629 +bird,bird,south,,,AMRO,RoughP,5,0.0117188270413036,0.0109276575293055,0.0122383602743591,0.0112036711001846,0.0116002215755914,0.000670782916246255 +bird,bird,south,,,AMRO,Rural,5,0.0437070809393601,0.0424258544652182,0.0441423406644261,0.0437070809393601,0.0434272383100641,0.00106086054088164 +bird,bird,south,,,AMRO,SandyLoam,5,0.0147924310215059,0.0145440646614329,0.0149852796963371,0.0148469628367301,0.0147628355850776,0.000223475299912133 +bird,bird,south,,,AMRO,SoilUnknown,5,0.0243829782616065,0.0238722939341933,0.0257510776949805,0.0235542385568422,0.0247241157220053,0.00096914474918751 +bird,bird,south,,,AMRO,TameP,5,0.0270019486472823,0.0254866831491566,0.0280561852466744,0.0286155273878474,0.0268110439620644,0.00133276654620004 +bird,bird,south,,,AMRO,ThinBreak,5,0.0338003999398653,0.0330400812092674,0.037911798723991,0.0338003999398653,0.0350955166553413,0.00251362313805057 +bird,bird,south,,,AMRO,Urban,5,0.0508184548862111,0.0491287965989474,0.0516212401204611,0.0483719535027645,0.0505268596480749,0.00133294289276666 +bird,bird,south,,,AMRO,Water,5,0.0162706932878444,0.0146410988852416,0.0316387080129026,0.0364343359767869,0.0213464232510502,0.00935524776744551 +bird,bird,south,,,AMRO,Wellsites,5,0.0389513908707596,0.0124040818853545,0.0420540796368127,0.0437526708429192,0.0306430201674771,0.0177335069810587 +bird,bird,south,,,YEWA,Loamy,5,0.0889862342739654,0.0833142720796077,0.0912893187301941,0.0911235422512483,0.0878843046841073,0.00434504301981026 +bird,bird,south,,,YEWA,Blowout,5,0.0401628947157703,0.0373442373283019,0.0409157196574691,0.0401628947157703,0.0393477535478598,0.00184103064636671 +bird,bird,south,,,YEWA,ClaySub,5,0.0776026172652354,0.072738347688647,0.0806537209465533,0.0776026172652354,0.0770737187243197,0.00428126144830476 +bird,bird,south,,,YEWA,Crop,5,0.0477258909723985,0.0445439418592085,0.0483983633635829,0.0485578693440802,0.0468618523426874,0.00225396025244564 +bird,bird,south,,,YEWA,Industrial,5,0.0527276712827915,0.0407707589259449,0.0732258847421466,0.0332758320869208,0.0564078240303074,0.0167976738050071 +bird,bird,south,,,YEWA,Mine,5,0.0971806065268231,0.0846776257647363,0.121933813451961,0.112500894420852,0.101522798600799,0.0187712933702914 +bird,bird,south,,,YEWA,Other,5,0.0875251951229225,0.0772673767356427,0.0958802062242052,0.100975326566864,0.0863792254951111,0.0097153991353414 +bird,bird,south,,,YEWA,RapidDrain,5,0.0665179523278429,0.0604144987507378,0.0698664068896251,0.0626153705338298,0.0654553589739474,0.00472953584424184 +bird,bird,south,,,YEWA,RoughP,5,0.0573815111243077,0.0533876378460484,0.0600900298992678,0.0564654939180325,0.0569589790219802,0.00361546417207247 +bird,bird,south,,,YEWA,Rural,5,0.0661716927633792,0.0628530852788089,0.0689878709663489,0.0657781939712168,0.0660096425642764,0.00343389323428838 +bird,bird,south,,,YEWA,SandyLoam,5,0.0511277264137194,0.0440509842319305,0.0548605397562365,0.0475053886435979,0.0500154530025099,0.0055363202275427 +bird,bird,south,,,YEWA,SoilUnknown,5,0.0997155153997096,0.0970882713180495,0.100977766167759,0.0979710879919298,0.0991489817590435,0.00200077514407797 +bird,bird,south,,,YEWA,TameP,5,0.0457686292658743,0.0435985886063968,0.0531975721116954,0.050747465664211,0.0477197523221636,0.00492698526781333 +bird,bird,south,,,YEWA,ThinBreak,5,0.183371746527312,0.178987377035422,0.188606353214059,0.179236197079509,0.183711346298015,0.00477581737073191 +bird,bird,south,,,YEWA,Urban,5,0.0507331439696001,0.0448023038764347,0.0520602501639247,0.0507331439696001,0.0488964675676067,0.00370427005030944 +bird,bird,south,,,YEWA,Water,5,5.79878735375159e-07,4.76822525465649e-07,1.2010658345155e-06,6.60804504718257e-07,7.52565880644025e-07,4.58515195214571e-07 +bird,bird,south,,,YEWA,Wellsites,5,6.90003938618652e-06,5.25255285811954e-06,0.365617585043016,0.413267228722246,0.141485598674952,0.19825432154381 +bryophyte,bryophyte,north,,,Bryum.All,WhiteSpruce,5,0.104623666278372,0.0874722861544613,0.112679942833954,0.105666560031913,0.101095355834302,0.0132153348867197 +bryophyte,bryophyte,north,,,Bryum.All,Pine,5,0.0674475602586271,0.0606847013691161,0.0749869714210322,0.0672116807219031,0.0678337227606607,0.00792832957785061 +bryophyte,bryophyte,north,,,Bryum.All,Deciduous,5,0.0919819625968023,0.0817645391225394,0.0978941606981865,0.0919819625968023,0.0907672040562639,0.008858552895604 +bryophyte,bryophyte,north,,,Bryum.All,Mixedwood,5,0.0937191187701653,0.0766558041922239,0.101378049564084,0.0937191187701653,0.0906024818416207,0.0130996076667672 +bryophyte,bryophyte,north,,,Bryum.All,BlackSpruce,5,0.0821737878210885,0.0796472718492078,0.0914478284992744,0.082297728208448,0.0843434814639106,0.00751140230506868 +bryophyte,bryophyte,north,,,Bryum.All,TreedFen,5,0.103825175281253,0.09066068154714,0.115404378478857,0.103825175281253,0.102851672188754,0.0127091628628293 +bryophyte,bryophyte,north,,,Bryum.All,TreedSwamp,5,0.14838302487508,0.134285947262339,0.15433966365031,0.14838302487508,0.145026963697524,0.0100379018142146 +bryophyte,bryophyte,north,,,Bryum.All,GraminoidFen,5,0.102608545171503,0.091652995844401,0.112334612258834,0.102608545171503,0.101863685320028,0.0108083654561642 +bryophyte,bryophyte,north,,,Bryum.All,ShrubbyFen,5,0.108214861633538,0.0993466210779264,0.120681656680431,0.108214861633538,0.109555249188518,0.0105175724757792 +bryophyte,bryophyte,north,,,Bryum.All,ShrubbyBog,5,0.0822115868613973,0.0802689106984959,0.0930553295605826,0.0837594118723497,0.0852163915453797,0.00798883798126357 +bryophyte,bryophyte,north,,,Bryum.All,ShrubbySwamp,5,0.142659930075182,0.128769149552852,0.158781358177345,0.147623294355338,0.143670605582959,0.0164498267712743 +bryophyte,bryophyte,north,,,Bryum.All,Marsh,5,0.103008117733597,0.0928698823634094,0.112264034639262,0.105256814676515,0.102812793714352,0.0108157208529732 +bryophyte,bryophyte,north,,,Bryum.All,Shrub,5,0.205603841480222,0.174880422823466,0.253531593550174,0.19679926045177,0.213170463378129,0.0395744190804504 +bryophyte,bryophyte,north,,,Bryum.All,Grass,5,0.205731498249484,0.170688321636038,0.244995847117187,0.195483946860916,0.207623905262506,0.0385480440688637 +bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruceR,5,0.165475582798583,0.15518207397193,0.199998766587222,0.169554083366261,0.173608751875238,0.0270490393438733 +bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce1,5,0.177961608354587,0.154126217921708,0.209058286085648,0.177961608354587,0.18107397234559,0.0302138318102788 +bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce2,5,0.202884480777997,0.171266875481849,0.231723154322466,0.202884480777997,0.200890380741,0.0305589414199888 +bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce3,5,0.202884480777997,0.171266875481849,0.231723154322466,0.202884480777997,0.200890380741,0.0305589414199888 +bryophyte,bryophyte,north,,,Bryum.All,CCWhiteSpruce4,5,0.202884480777997,0.171266875481849,0.231723154322466,0.202884480777997,0.200890380741,0.0305589414199888 +bryophyte,bryophyte,north,,,Bryum.All,CCPineR,5,0.16022882422794,0.145827136293942,0.180254773430031,0.16022882422794,0.16121093845615,0.0194156293916364 +bryophyte,bryophyte,north,,,Bryum.All,CCPine1,5,0.164291720401128,0.133145499888549,0.203845059962508,0.164291720401128,0.16608604674609,0.0373996968191405 +bryophyte,bryophyte,north,,,Bryum.All,CCPine2,5,0.166830898209846,0.13451769307428,0.206946727968588,0.166830898209846,0.168100580656605,0.0385257305816659 +bryophyte,bryophyte,north,,,Bryum.All,CCPine3,5,0.166830898209846,0.13451769307428,0.206946727968588,0.166830898209846,0.168100580656605,0.0385257305816659 +bryophyte,bryophyte,north,,,Bryum.All,CCPine4,5,0.166830898209846,0.13451769307428,0.206946727968588,0.166830898209846,0.168100580656605,0.0385257305816659 +bryophyte,bryophyte,north,,,Bryum.All,CCDeciduousR,5,0.161533823124016,0.1404659727257,0.174401252222805,0.161533823124016,0.158553527581378,0.0169028615434247 +bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous1,5,0.174108402828508,0.161888476473846,0.17922980187219,0.17800935952687,0.171879211863207,0.00993958041925984 +bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous2,5,0.150834982909368,0.122713525430442,0.157034030570364,0.150834982909368,0.142500719768878,0.0176710184164726 +bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous3,5,0.150834982909368,0.122713525430442,0.157034030570364,0.150834982909368,0.142500719768878,0.0176710184164726 +bryophyte,bryophyte,north,,,Bryum.All,CCDeciduous4,5,0.150834982909368,0.122713525430442,0.157034030570364,0.150834982909368,0.142500719768878,0.0176710184164726 +bryophyte,bryophyte,north,,,Bryum.All,CCMixedwoodR,5,0.161533823124016,0.1404659727257,0.174401252222805,0.161533823124016,0.158553527581378,0.0169028615434247 +bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood1,5,0.174108402828508,0.161888476473846,0.17922980187219,0.17800935952687,0.171879211863207,0.00993958041925984 +bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood2,5,0.150834982909368,0.122713525430442,0.157034030570364,0.150834982909368,0.142500719768878,0.0176710184164726 +bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood3,5,0.150834982909368,0.122713525430442,0.157034030570364,0.150834982909368,0.142500719768878,0.0176710184164726 +bryophyte,bryophyte,north,,,Bryum.All,CCMixedwood4,5,0.150834982909368,0.122713525430442,0.157034030570364,0.150834982909368,0.142500719768878,0.0176710184164726 +bryophyte,bryophyte,north,,,Bryum.All,EnSeismic,5,0.143247261154779,0.132144241170755,0.15978556612201,0.143247261154779,0.145235354857167,0.0137587578338995 +bryophyte,bryophyte,north,,,Bryum.All,EnSoftLin,5,0.181976104710237,0.176334441522147,0.207421144310894,0.181976104710237,0.188523522297283,0.0195432641471242 +bryophyte,bryophyte,north,,,Bryum.All,TrSoftLin,5,0.172100168424541,0.147841165917588,0.187901203255329,0.169203477599876,0.169132193136031,0.0230076012908074 +bryophyte,bryophyte,north,,,Bryum.All,HardLin,5,0.119094247542269,0.0902286867109537,0.153196513874268,0.124691301578451,0.121155863573338,0.035675361881301 +bryophyte,bryophyte,north,,,Bryum.All,UrbInd,5,0.15870235487759,0.131129493678025,0.174263860237473,0.15870235487759,0.154671253635583,0.0218939433100647 +bryophyte,bryophyte,north,,,Bryum.All,Wellsites,5,0.133875416816634,0.127095175106388,0.159927124091914,0.133875416816634,0.14193011214681,0.0168562821513424 +bryophyte,bryophyte,north,,,Bryum.All,Crop,5,0.0820223721088346,0.0684673797777877,0.0983546690511286,0.078395085879973,0.0834195722128434,0.0152344649418885 +bryophyte,bryophyte,north,,,Bryum.All,TameP,5,0.14146232517738,0.121223613545195,0.153442524325088,0.14146232517738,0.138962795983375,0.0169647163928601 +bryophyte,bryophyte,north,,,Bryum.All,RoughP,5,0.144150717399513,0.133810027719149,0.158938339577548,0.143669438263278,0.14578740024442,0.0141397169788724 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,WhiteSpruce,5,0.170617726106481,0.150531559521949,0.174419709411094,0.176935668903147,0.164807860658135,0.0139893488460334 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Pine,5,0.155784234979198,0.149699740009459,0.170954712542573,0.172791155095638,0.159310643176365,0.0106361302435088 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Deciduous,5,0.157244630521525,0.142941372795819,0.163468234285499,0.162052893569508,0.154697151179962,0.0115856768365642 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Mixedwood,5,0.158627676901957,0.13860286258159,0.171247492283289,0.15788444654738,0.15647078515815,0.018649527031244 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,BlackSpruce,5,0.0677921007733422,0.0521429659792482,0.0729564235762428,0.0685353715648879,0.0638599149238077,0.0110949308248088 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,TreedFen,5,0.0704119831070097,0.059745149134307,0.0811325128636527,0.0794290899103082,0.0706134625134515,0.0105585327678486 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,TreedSwamp,5,0.112752005656074,0.0984937696101871,0.137854437407414,0.122922619803698,0.116412196602916,0.0203688771304333 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,GraminoidFen,5,0.071246619098096,0.0646705299404144,0.0824857475812227,0.0833874009572022,0.0733295931607397,0.00895134876938999 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,ShrubbyFen,5,0.0704520736989616,0.0644476326851635,0.0829604405865539,0.0826619615495143,0.0733794195671157,0.00945907870284914 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,ShrubbyBog,5,0.0669469626238629,0.0541167658533186,0.0737851895171726,0.0696158682654045,0.0648674857861799,0.0105595763340405 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,ShrubbySwamp,5,0.115517060865014,0.0928903325785583,0.132534115088148,0.121979163778046,0.112959172899961,0.0198288996671609 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Marsh,5,0.113514973804854,0.096254727615824,0.137347333930943,0.121750013890524,0.115138525017619,0.0213109634132099 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Shrub,5,0.258030208654547,0.21433734112913,0.288008334755188,0.275203776452487,0.251704525155945,0.0367095721590051 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Grass,5,0.271067495374639,0.240923289977324,0.31781564474553,0.292406492273734,0.276440725276057,0.0390993119735511 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruceR,5,0.338256695749658,0.31824880432862,0.364273497154808,0.345415843034206,0.340062112951671,0.0241555437358403 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce1,5,0.310222319426016,0.28440620861304,0.33208710700024,0.310222319426016,0.308604286297291,0.0258019292550109 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce2,5,0.344912345599046,0.314582284578097,0.372632043273075,0.35184667493467,0.343098817236955,0.0297346606357341 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce3,5,0.344912345599046,0.314582284578097,0.372632043273075,0.35184667493467,0.343098817236955,0.0297346606357341 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCWhiteSpruce4,5,0.344912345599046,0.314582284578097,0.372632043273075,0.35184667493467,0.343098817236955,0.0297346606357341 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPineR,5,0.332237563055896,0.30230266389427,0.354086616306992,0.332237563055896,0.327969786265574,0.0265319724200263 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine1,5,0.345687365666162,0.317841589858981,0.373089123054865,0.354005283762296,0.344278366892055,0.0283247255662619 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine2,5,0.348225414237899,0.321582172515133,0.377622132855574,0.359033033466831,0.348154712660996,0.0285763459461223 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine3,5,0.348225414237899,0.321582172515133,0.377622132855574,0.359033033466831,0.348154712660996,0.0285763459461223 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCPine4,5,0.348225414237899,0.321582172515133,0.377622132855574,0.359033033466831,0.348154712660996,0.0285763459461223 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduousR,5,0.318830335897459,0.27955994009676,0.332129458277748,0.329698896772244,0.308702802560019,0.0264775701221862 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous1,5,0.311890371027914,0.291615240620109,0.319691638401899,0.321691125624866,0.307838810847009,0.0161966294285432 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous2,5,0.30432063546174,0.283360736827309,0.339489268918774,0.311263402327306,0.309378509074765,0.0314758135403339 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous3,5,0.30432063546174,0.283360736827309,0.339489268918774,0.311263402327306,0.309378509074765,0.0314758135403339 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCDeciduous4,5,0.30432063546174,0.283360736827309,0.339489268918774,0.311263402327306,0.309378509074765,0.0314758135403339 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwoodR,5,0.318830335897459,0.27955994009676,0.332129458277748,0.329698896772244,0.308702802560019,0.0264775701221862 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood1,5,0.311890371027914,0.291615240620109,0.319691638401899,0.321691125624866,0.307838810847009,0.0161966294285432 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood2,5,0.30432063546174,0.283360736827309,0.339489268918774,0.311263402327306,0.309378509074765,0.0314758135403339 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood3,5,0.30432063546174,0.283360736827309,0.339489268918774,0.311263402327306,0.309378509074765,0.0314758135403339 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,CCMixedwood4,5,0.30432063546174,0.283360736827309,0.339489268918774,0.311263402327306,0.309378509074765,0.0314758135403339 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,EnSeismic,5,0.159710015581722,0.116043191735016,0.17072117947456,0.165838564517478,0.148662018229779,0.0324110247868619 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,EnSoftLin,5,0.159418027877254,0.124794622673536,0.167171385865762,0.168995137454078,0.15011162020904,0.0243734811900978 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,TrSoftLin,5,0.171669259495879,0.127684819372006,0.18790477785131,0.180401709818175,0.162342674332897,0.0340630905757622 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,HardLin,5,0.10993941717652,0.0990227818218094,0.119734614597133,0.113196196589015,0.109200436852334,0.0104589500726513 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,UrbInd,5,0.125398730461756,0.108350462054011,0.129809259709619,0.129273397383927,0.120827281896463,0.0113320859784318 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Wellsites,5,0.120865154448231,0.106933037026666,0.135907579517197,0.135555384778656,0.121358221869125,0.0143857836418377 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,Crop,5,0.074461797530342,0.0663055752886782,0.0784646756931369,0.080469463459423,0.0727333613705306,0.00612570365671694 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,TameP,5,0.139209058513911,0.127041125175049,0.146790768834801,0.148781802724197,0.137618984018511,0.0100770984650779 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,RoughP,5,0.141247542624157,0.127091822586834,0.155254205987659,0.153373422859104,0.141796780024815,0.0145812899277074 +bryophyte,bryophyte,south,,,Bryum.All,Loamy,5,0.128371275228788,0.126267345563482,0.192554766969062,0.156609764097912,0.150844569501336,0.0388926494419214 +bryophyte,bryophyte,south,,,Bryum.All,SandyLoam,5,0.163687813793554,0.157864329641462,0.257888717822438,0.209805018041589,0.196019214469412,0.0568093152706092 +bryophyte,bryophyte,south,,,Bryum.All,ClaySub,5,0.138847380253595,0.129440293252389,0.192920064856309,0.163480694825708,0.154866293409777,0.0350918992412223 +bryophyte,bryophyte,south,,,Bryum.All,RapidDrain,5,0.151000064270357,0.12841178366917,0.214806584231797,0.179839142499951,0.165207990926408,0.0458845605396699 +bryophyte,bryophyte,south,,,Bryum.All,Blowout,5,0.177847228366661,0.13169779331486,0.213345983888902,0.18962303788414,0.172170997481874,0.0412393742258946 +bryophyte,bryophyte,south,,,Bryum.All,ThinBreak,5,0.108774649500815,0.100351516195694,0.149118127661729,0.13142432263142,0.120624872013578,0.0258432353890413 +bryophyte,bryophyte,south,,,Bryum.All,Other,5,0.153008911192339,0.143619231829843,0.22761954763385,0.192944265564736,0.176977047927853,0.0459440004598543 +bryophyte,bryophyte,south,,,Bryum.All,EnSeismic,5,0.334606425412252,0.156177390749094,0.434765493190856,0.334606425412252,0.302593815200546,0.140891000271527 +bryophyte,bryophyte,south,,,Bryum.All,EnSoftLin,5,0.329548544110659,0.161421900535046,0.471022939170799,0.329548544110659,0.317093878942589,0.158105322154712 +bryophyte,bryophyte,south,,,Bryum.All,TrSoftLin,5,0.375563737003068,0.183612394029062,0.460581289024939,0.383815980210159,0.332867119897228,0.143170601701847 +bryophyte,bryophyte,south,,,Bryum.All,HardLin,5,0.1468328366873,0.0883371659600431,0.208225904838994,0.1468328366873,0.147701185603674,0.0590188717154669 +bryophyte,bryophyte,south,,,Bryum.All,UrbInd,5,0.104701482537215,0.103446912111058,0.180846515565828,0.15376441179003,0.132924773411517,0.0427257127054497 +bryophyte,bryophyte,south,,,Bryum.All,Wellsites,5,0.103827170399858,0.0947594363214667,0.177418037109713,0.140420183947776,0.127451513800266,0.0457368790572256 +bryophyte,bryophyte,south,,,Bryum.All,Crop,5,0.0834326498037117,0.0762103903441286,0.118437315338461,0.100381454106891,0.0935683426293577,0.0228646836791101 +bryophyte,bryophyte,south,,,Bryum.All,TameP,5,0.124085918128196,0.113948945983715,0.179967952926487,0.164423435504234,0.141507431179504,0.0342621971358284 +bryophyte,bryophyte,south,,,Bryum.All,RoughP,5,0.102704627973536,0.0996345261643043,0.149622110445284,0.13419258459678,0.119382463691813,0.0269065385329828 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,Loamy,5,0.0641849871927666,0.050457745645129,0.07270277108154,0.0641849871927666,0.062283620197523,0.0112971952892291 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,SandyLoam,5,0.0742797240604397,0.0646788146747532,0.0864582537717612,0.0742797240604397,0.0755252597804641,0.0107846710275309 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,ClaySub,5,0.0592505109132571,0.0488344242492647,0.0699996689330231,0.0592505109132571,0.0597454510981899,0.010682085375127 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,RapidDrain,5,0.102551453445416,0.0986747245418018,0.114617392978353,0.102551453445416,0.105621369756077,0.00812414366804172 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,Blowout,5,0.108577749315386,0.0975839841162081,0.119450204289074,0.108577749315386,0.109033282223042,0.0116238846665256 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,ThinBreak,5,0.0863196169586629,0.0821949327472845,0.0998445672388945,0.0863196169586629,0.0901856350845793,0.0089444795540914 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,Other,5,0.0345770287640794,0.0255035080368273,0.0522013822338746,0.0345770287640794,0.037612312759654,0.0151375482648069 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,EnSeismic,5,0.21574628197629,0.142477035309188,0.248955821906755,0.16811461642476,0.20078218558815,0.05348224298659 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,EnSoftLin,5,0.211754576394213,0.13866240930989,0.222190780941109,0.169876045775971,0.188478407991055,0.0449378897052303 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,TrSoftLin,5,0.194018984551885,0.147159530414209,0.240287969097993,0.160797502761418,0.194008212581741,0.0456931192595006 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,HardLin,5,0.0304162076535258,0.029166064034397,0.0432718766595132,0.0318703430228878,0.0343665218104774,0.00930525115482798 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,UrbInd,5,0.0356740467063795,0.0286632065765225,0.0429956144747444,0.0356740467063795,0.0357589664307443,0.00723711747496788 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,Wellsites,5,0.0429922761944743,0.0335372326498226,0.0467533160557549,0.0401699600814057,0.0411525817485948,0.00727575405039167 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,Crop,5,0.0228689540457825,0.0221752232262121,0.0277192165390448,0.0251044943216744,0.0243976201715565,0.00308215429653747 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,TameP,5,0.0603942872656395,0.0505159739370433,0.0666385260267113,0.054988635814872,0.0588718286082372,0.00839424264952957 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,RoughP,5,0.0576120452574267,0.0486453851644709,0.0647244005298698,0.0547537316462016,0.0571023350335811,0.00830015570016307 +lichen,lichen,north,,,Cladonia.chlorophaea,WhiteSpruce,5,0.299712823406177,0.267794399850091,0.31752477391247,0.299712823406177,0.294332455268539,0.0254319271895433 +lichen,lichen,north,,,Cladonia.chlorophaea,Pine,5,0.211658158470293,0.187362325848506,0.221031041496282,0.213983673760142,0.205564667451797,0.0169792480382245 +lichen,lichen,north,,,Cladonia.chlorophaea,Deciduous,5,0.242873835985486,0.212311835312585,0.251351915041242,0.242873835985486,0.234339735870853,0.0204421025800494 +lichen,lichen,north,,,Cladonia.chlorophaea,Mixedwood,5,0.236140666947542,0.203901410662992,0.241600545650375,0.236140666947542,0.225630360660801,0.0195391792025033 +lichen,lichen,north,,,Cladonia.chlorophaea,BlackSpruce,5,0.225302562827919,0.196261190714303,0.244967963651107,0.227843083435444,0.22067099355486,0.0249924693619386 +lichen,lichen,north,,,Cladonia.chlorophaea,TreedFen,5,0.224783844707001,0.197704546932338,0.235642483863854,0.224783844707001,0.218150987211939,0.0190646078283693 +lichen,lichen,north,,,Cladonia.chlorophaea,TreedSwamp,5,0.242591050953153,0.214272220682311,0.263632169592523,0.252640022245541,0.239209971917443,0.024497807226558 +lichen,lichen,north,,,Cladonia.chlorophaea,GraminoidFen,5,0.202508662292495,0.17836174844921,0.21210857272356,0.202508662292495,0.19688618246433,0.0169331647912046 +lichen,lichen,north,,,Cladonia.chlorophaea,ShrubbyFen,5,0.199216086052812,0.177644856358741,0.212793282034292,0.199216086052812,0.196320054390399,0.0174207915910404 +lichen,lichen,north,,,Cladonia.chlorophaea,ShrubbyBog,5,0.221625062963166,0.192800896978028,0.237791260930442,0.22188456568578,0.215779368688039,0.0231976975585119 +lichen,lichen,north,,,Cladonia.chlorophaea,ShrubbySwamp,5,0.200597494570593,0.181101882111374,0.22301802236821,0.214356168657179,0.201391766660484,0.0207072653283275 +lichen,lichen,north,,,Cladonia.chlorophaea,Marsh,5,0.175479744974187,0.145546102447274,0.1832220543811,0.175479744974187,0.166610979908685,0.019157106802069 +lichen,lichen,north,,,Cladonia.chlorophaea,Shrub,5,0.106371701235334,0.0787744447962615,0.122122293070246,0.12074279741616,0.10224974598974,0.0217390056603546 +lichen,lichen,north,,,Cladonia.chlorophaea,Grass,5,0.096028783987272,0.0852156012169443,0.115683635060321,0.119014260443607,0.0998143813618244,0.0154318059448801 +lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruceR,5,0.169230436345503,0.139669943547809,0.195621086516419,0.18615405031743,0.168442254933479,0.0281649616426591 +lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce1,5,0.181781734947402,0.144657786769576,0.210046678174516,0.20367100535893,0.17894644898064,0.0325932819474839 +lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce2,5,0.208024972338578,0.167844483274645,0.235168093350801,0.225668903881609,0.203677228485813,0.0342607412322384 +lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce3,5,0.208024972338578,0.167844483274645,0.235168093350801,0.225668903881609,0.203677228485813,0.0342607412322384 +lichen,lichen,north,,,Cladonia.chlorophaea,CCWhiteSpruce4,5,0.208024972338578,0.167844483274645,0.235168093350801,0.225668903881609,0.203677228485813,0.0342607412322384 +lichen,lichen,north,,,Cladonia.chlorophaea,CCPineR,5,0.167651692032762,0.133400179473255,0.18613840582969,0.177981748325327,0.16153475071322,0.0262767055968338 +lichen,lichen,north,,,Cladonia.chlorophaea,CCPine1,5,0.205931254374661,0.156797989826113,0.214389722872389,0.215966217533035,0.190474350731153,0.0300029266310009 +lichen,lichen,north,,,Cladonia.chlorophaea,CCPine2,5,0.20940040025485,0.161084160390568,0.217535050260925,0.219134448870029,0.194244531984155,0.0295998827337324 +lichen,lichen,north,,,Cladonia.chlorophaea,CCPine3,5,0.20940040025485,0.161084160390568,0.217535050260925,0.219134448870029,0.194244531984155,0.0295998827337324 +lichen,lichen,north,,,Cladonia.chlorophaea,CCPine4,5,0.20940040025485,0.161084160390568,0.217535050260925,0.219134448870029,0.194244531984155,0.0295998827337324 +lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduousR,5,0.182662436599129,0.143290947030515,0.19168320742142,0.185594844139235,0.170905137694288,0.0249018018786431 +lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous1,5,0.169020934098229,0.153496766364474,0.186476102510212,0.18593824743331,0.170474553252928,0.0168133393763722 +lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous2,5,0.192198726287736,0.158139093430204,0.206351929165891,0.20739871277065,0.184869780779868,0.0243239274357252 +lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous3,5,0.192198726287736,0.158139093430204,0.206351929165891,0.20739871277065,0.184869780779868,0.0243239274357252 +lichen,lichen,north,,,Cladonia.chlorophaea,CCDeciduous4,5,0.192198726287736,0.158139093430204,0.206351929165891,0.20739871277065,0.184869780779868,0.0243239274357252 +lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwoodR,5,0.182662436599129,0.143290947030515,0.19168320742142,0.185594844139235,0.170905137694288,0.0249018018786431 +lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood1,5,0.169020934098229,0.153496766364474,0.186476102510212,0.18593824743331,0.170474553252928,0.0168133393763722 +lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood2,5,0.192198726287736,0.158139093430204,0.206351929165891,0.20739871277065,0.184869780779868,0.0243239274357252 +lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood3,5,0.192198726287736,0.158139093430204,0.206351929165891,0.20739871277065,0.184869780779868,0.0243239274357252 +lichen,lichen,north,,,Cladonia.chlorophaea,CCMixedwood4,5,0.192198726287736,0.158139093430204,0.206351929165891,0.20739871277065,0.184869780779868,0.0243239274357252 +lichen,lichen,north,,,Cladonia.chlorophaea,EnSeismic,5,0.0677503172110941,0.0471429245544719,0.0732894752325876,0.0738978700051816,0.0617492589794445,0.0133508758867419 +lichen,lichen,north,,,Cladonia.chlorophaea,EnSoftLin,5,0.0560689010826879,0.0412420864698087,0.0607043262160254,0.0624980816232269,0.0520148802546486,0.00982245734083476 +lichen,lichen,north,,,Cladonia.chlorophaea,TrSoftLin,5,0.0605465982137621,0.0416835448522874,0.0681202259279406,0.0691216097124846,0.0563835551646629,0.0133846793873165 +lichen,lichen,north,,,Cladonia.chlorophaea,HardLin,5,0.0163800997555834,0.0142046646641618,0.0207897341200193,0.0172490121407761,0.0170729876025659,0.00365003569007476 +lichen,lichen,north,,,Cladonia.chlorophaea,UrbInd,5,0.026932901747997,0.0217317496788856,0.032534963821666,0.0293523293874362,0.0268883344802531,0.00545997483483957 +lichen,lichen,north,,,Cladonia.chlorophaea,Wellsites,5,0.0269864370031369,0.0206711523672041,0.0318822891198792,0.0309948356921504,0.0263704156910059,0.00555421916938355 +lichen,lichen,north,,,Cladonia.chlorophaea,Crop,5,0.00896331783563511,0.0086673108662899,0.0116267325606197,0.00981647353265912,0.00980133894395803,0.00175930642910351 +lichen,lichen,north,,,Cladonia.chlorophaea,TameP,5,0.0284182757721163,0.0236344354897084,0.0319552752867162,0.0276152084684389,0.0280727667342162,0.0044863473416081 +lichen,lichen,north,,,Cladonia.chlorophaea,RoughP,5,0.025017860881902,0.0188312694768778,0.026815348770033,0.0254030986816399,0.0234837747077663,0.00461769635994761 +lichen,lichen,north,,,Physcia.adscendens,WhiteSpruce,5,0.0674088713205342,0.0614470981390403,0.0709653557850045,0.0640273150290537,0.0664616657481686,0.00483973536953268 +lichen,lichen,north,,,Physcia.adscendens,Pine,5,0.0472827411302775,0.0444708053145572,0.0510027667554357,0.0463066694973039,0.0475721599857571,0.00352533170238091 +lichen,lichen,north,,,Physcia.adscendens,Deciduous,5,0.171848485649294,0.166777961008327,0.183050642925004,0.171848485649294,0.173855238772586,0.00914403110161088 +lichen,lichen,north,,,Physcia.adscendens,Mixedwood,5,0.103902979074589,0.0988920160049394,0.118672559907655,0.103902979074589,0.107234040275857,0.0114771871495709 +lichen,lichen,north,,,Physcia.adscendens,BlackSpruce,5,0.0116692571413722,0.0109018461718084,0.0148387626612113,0.0111517688016057,0.0125461466167073,0.00209093161445967 +lichen,lichen,north,,,Physcia.adscendens,TreedFen,5,0.0134516061910062,0.0123980063480553,0.0165551828482426,0.0127565152125194,0.0141541095221522,0.00229453976133663 +lichen,lichen,north,,,Physcia.adscendens,TreedSwamp,5,0.0684768936890089,0.0623100924562356,0.0815946560942004,0.0684768936890089,0.0705801981762149,0.0108957147150476 +lichen,lichen,north,,,Physcia.adscendens,GraminoidFen,5,0.0143523346004894,0.0138707572661006,0.0201350817078948,0.0143523346004894,0.0163626382844971,0.00335206751763776 +lichen,lichen,north,,,Physcia.adscendens,ShrubbyFen,5,0.0135292337016339,0.0132145942878114,0.0184646324742449,0.0134564657796432,0.0152732316995139,0.0028508926162948 +lichen,lichen,north,,,Physcia.adscendens,ShrubbyBog,5,0.0122579132788025,0.0117121025240539,0.0159189671771411,0.0119692218653384,0.0134175491402069,0.00225699190399091 +lichen,lichen,north,,,Physcia.adscendens,ShrubbySwamp,5,0.0642372109431116,0.0574653507523936,0.0782239746399321,0.0642372109431116,0.0669036310187336,0.0104713536929674 +lichen,lichen,north,,,Physcia.adscendens,Marsh,5,0.0421183317862372,0.0354669594231994,0.0538859562288842,0.0421183317862372,0.0442954195638172,0.00917399885026702 +lichen,lichen,north,,,Physcia.adscendens,Shrub,5,0.148981950749374,0.139298464646428,0.195805779656963,0.159263060245612,0.161673968525425,0.0337376300319071 +lichen,lichen,north,,,Physcia.adscendens,Grass,5,0.155922328843144,0.144176169953379,0.217726117790744,0.165761675145329,0.172790434462016,0.0454060373755947 +lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruceR,5,0.0524933497432348,0.0448033430759125,0.0658373565662838,0.0524933497432348,0.0544000314789238,0.0109830467809342 +lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce1,5,0.0676142549226719,0.0595386229110912,0.0842373851191382,0.0676142549226719,0.0707090727129221,0.0133590871961955 +lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce2,5,0.075962081883682,0.0661774643260701,0.0924254985770442,0.075962081883682,0.0784452753755624,0.013398142459152 +lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce3,5,0.075962081883682,0.0661774643260701,0.0924254985770442,0.075962081883682,0.0784452753755624,0.013398142459152 +lichen,lichen,north,,,Physcia.adscendens,CCWhiteSpruce4,5,0.075962081883682,0.0661774643260701,0.0924254985770442,0.075962081883682,0.0784452753755624,0.013398142459152 +lichen,lichen,north,,,Physcia.adscendens,CCPineR,5,0.0530687182992354,0.0447898946528459,0.0673364978932711,0.0530687182992354,0.0551521174496051,0.0115755412404529 +lichen,lichen,north,,,Physcia.adscendens,CCPine1,5,0.054822170261719,0.0468044875054749,0.0681089706028397,0.054822170261719,0.0567280326295669,0.0111281917828034 +lichen,lichen,north,,,Physcia.adscendens,CCPine2,5,0.0575642554040823,0.0490603503195198,0.0707082507546723,0.0575642554040823,0.0592950171173939,0.0111107786936451 +lichen,lichen,north,,,Physcia.adscendens,CCPine3,5,0.0575642554040823,0.0490603503195198,0.0707082507546723,0.0575642554040823,0.0592950171173939,0.0111107786936451 +lichen,lichen,north,,,Physcia.adscendens,CCPine4,5,0.0575642554040823,0.0490603503195198,0.0707082507546723,0.0575642554040823,0.0592950171173939,0.0111107786936451 +lichen,lichen,north,,,Physcia.adscendens,CCDeciduousR,5,0.0827606661851487,0.0719443499282712,0.0987851185715972,0.0827606661851487,0.08424359648793,0.013891073963227 +lichen,lichen,north,,,Physcia.adscendens,CCDeciduous1,5,0.100618826509217,0.0877886957545074,0.125713872307938,0.100618826509217,0.105057955345838,0.0192301298426666 +lichen,lichen,north,,,Physcia.adscendens,CCDeciduous2,5,0.084212382915902,0.073575752550813,0.103101354854498,0.084212382915902,0.0874790260715549,0.01475504906051 +lichen,lichen,north,,,Physcia.adscendens,CCDeciduous3,5,0.084212382915902,0.073575752550813,0.103101354854498,0.084212382915902,0.0874790260715549,0.01475504906051 +lichen,lichen,north,,,Physcia.adscendens,CCDeciduous4,5,0.084212382915902,0.073575752550813,0.103101354854498,0.084212382915902,0.0874790260715549,0.01475504906051 +lichen,lichen,north,,,Physcia.adscendens,CCMixedwoodR,5,0.0827606661851487,0.0719443499282712,0.0987851185715972,0.0827606661851487,0.08424359648793,0.013891073963227 +lichen,lichen,north,,,Physcia.adscendens,CCMixedwood1,5,0.100618826509217,0.0877886957545074,0.125713872307938,0.100618826509217,0.105057955345838,0.0192301298426666 +lichen,lichen,north,,,Physcia.adscendens,CCMixedwood2,5,0.084212382915902,0.073575752550813,0.103101354854498,0.084212382915902,0.0874790260715549,0.01475504906051 +lichen,lichen,north,,,Physcia.adscendens,CCMixedwood3,5,0.084212382915902,0.073575752550813,0.103101354854498,0.084212382915902,0.0874790260715549,0.01475504906051 +lichen,lichen,north,,,Physcia.adscendens,CCMixedwood4,5,0.084212382915902,0.073575752550813,0.103101354854498,0.084212382915902,0.0874790260715549,0.01475504906051 +lichen,lichen,north,,,Physcia.adscendens,EnSeismic,5,0.0256366775276155,0.0220396461224062,0.0258667757531508,0.0258176949589414,0.0244432729669476,0.00230206038606853 +lichen,lichen,north,,,Physcia.adscendens,EnSoftLin,5,0.0273345543422601,0.0238543237522917,0.0285016462750445,0.0273345543422601,0.0265845186308551,0.00281690803091184 +lichen,lichen,north,,,Physcia.adscendens,TrSoftLin,5,0.0237240874831371,0.0199061804072359,0.0246224989022288,0.0242538337610053,0.022644867925346,0.00248798442401649 +lichen,lichen,north,,,Physcia.adscendens,HardLin,5,0.019409667521594,0.0160175308478019,0.0222563530629276,0.0164220788059039,0.0190357313695079,0.00329744230865101 +lichen,lichen,north,,,Physcia.adscendens,UrbInd,5,0.0269462495385606,0.0228419440845845,0.0343747203469902,0.0269462495385606,0.0279577105129281,0.00665341387285884 +lichen,lichen,north,,,Physcia.adscendens,Wellsites,5,0.0189042713169681,0.0175846129876694,0.0279662325594366,0.0189042713169681,0.0215065656131665,0.00650008155356583 +lichen,lichen,north,,,Physcia.adscendens,Crop,5,0.0061978772206181,0.00485501825215725,0.00819431107983461,0.0061978772206181,0.00646734484973649,0.00175972170076663 +lichen,lichen,north,,,Physcia.adscendens,TameP,5,0.0217469866099191,0.0205259688525677,0.0269346862339065,0.0217469866099191,0.0231110724644053,0.00372969845233129 +lichen,lichen,north,,,Physcia.adscendens,RoughP,5,0.039996203554655,0.0376640264085737,0.0479047806634932,0.039996203554655,0.0418609321868831,0.00636136742819892 +lichen,lichen,south,,,Cladonia.chlorophaea,Loamy,5,0.118687300046851,0.104702736998946,0.12654114918338,0.118687300046851,0.117003347991407,0.0123251487872755 +lichen,lichen,south,,,Cladonia.chlorophaea,SandyLoam,5,0.119258055085243,0.104379389676667,0.12444806981178,0.122725360583689,0.116076296806775,0.0115812144030893 +lichen,lichen,south,,,Cladonia.chlorophaea,ClaySub,5,0.115647388648516,0.100225827670201,0.120420274007026,0.11648008810727,0.112104149326241,0.0125379204899668 +lichen,lichen,south,,,Cladonia.chlorophaea,RapidDrain,5,0.134401942825707,0.130919679999458,0.142386868085905,0.134401942825707,0.135822231258499,0.00674887938113901 +lichen,lichen,south,,,Cladonia.chlorophaea,Blowout,5,0.151003729060033,0.142629562152347,0.160102906059062,0.143701037126792,0.151258127765863,0.00859040607681507 +lichen,lichen,south,,,Cladonia.chlorophaea,ThinBreak,5,0.137503969297793,0.129839880347417,0.148096403740304,0.137503969297793,0.138488768710106,0.00920385085107052 +lichen,lichen,south,,,Cladonia.chlorophaea,Other,5,0.011592343091593,0.0046173071411171,0.0231715222749202,0.011592343091593,0.0131772510513215,0.0108696999060124 +lichen,lichen,south,,,Cladonia.chlorophaea,EnSeismic,5,0.0962488205728889,0.0753549922631135,0.252780357762154,0.0746380066039094,0.142260934924217,0.1103764472823 +lichen,lichen,south,,,Cladonia.chlorophaea,EnSoftLin,5,0.100106376262895,0.0629831331203498,0.25663036318437,0.0593528864488744,0.140489678275968,0.112766217720885 +lichen,lichen,south,,,Cladonia.chlorophaea,TrSoftLin,5,0.104765725082673,0.0622678835132489,0.285864107347038,0.104765725082673,0.152752793742919,0.12644472051553 +lichen,lichen,south,,,Cladonia.chlorophaea,HardLin,5,0.0224141883326856,0.0219404643210603,0.0240466025090097,0.0224141883326856,0.0228389695045971,0.00110409171662926 +lichen,lichen,south,,,Cladonia.chlorophaea,UrbInd,5,0.0316560982778314,0.0261042267475289,0.0343242569398769,0.0287494220624193,0.0306598280995116,0.0042085259092217 +lichen,lichen,south,,,Cladonia.chlorophaea,Wellsites,5,0.0355928387293783,0.0297480296972117,0.0456614857314296,0.0355928387293783,0.0370490799107639,0.00881310026886407 +lichen,lichen,south,,,Cladonia.chlorophaea,Crop,5,0.0115918691627171,0.0109797156544521,0.0127817951554016,0.0108908943675099,0.0118111694039124,0.000895132212105925 +lichen,lichen,south,,,Cladonia.chlorophaea,TameP,5,0.0528035523685076,0.0519157543218056,0.0592890736068868,0.0527988783208814,0.0548657123745536,0.00411763620408946 +lichen,lichen,south,,,Cladonia.chlorophaea,RoughP,5,0.0704617752927988,0.0683113023707642,0.0754893494676391,0.0704617752927988,0.0715386169482165,0.00392836590938631 +lichen,lichen,south,,,Physcia.adscendens,Loamy,5,0.165058834401252,0.151196844376258,0.179127371014315,0.169700398944145,0.164609273022419,0.0142193641222609 +lichen,lichen,south,,,Physcia.adscendens,SandyLoam,5,0.178172116249331,0.161926494649089,0.189941302784499,0.181481384725004,0.176731233762671,0.0154464567930835 +lichen,lichen,south,,,Physcia.adscendens,ClaySub,5,0.155520095046812,0.142809679634744,0.167690632468226,0.162178734164762,0.154965775121554,0.0123850335584002 +lichen,lichen,south,,,Physcia.adscendens,RapidDrain,5,0.133157166351654,0.123712598889612,0.139250440689584,0.138113163461797,0.132146689844523,0.00806228414697056 +lichen,lichen,south,,,Physcia.adscendens,Blowout,5,0.0780059275319079,0.0605615716646166,0.0817059444700948,0.0791009289771177,0.0731408926112592,0.0121622767884476 +lichen,lichen,south,,,Physcia.adscendens,ThinBreak,5,0.103023942244417,0.0819954494155731,0.103983652295498,0.103023942244417,0.0955490857463932,0.0122219699134275 +lichen,lichen,south,,,Physcia.adscendens,Other,5,0.108836563387276,0.0821453221454944,0.133452128995239,0.127814796703126,0.109107706996853,0.0269474171371931 +lichen,lichen,south,,,Physcia.adscendens,EnSeismic,5,0.140820975204423,0.129482190661842,0.19424153380181,0.134144710345317,0.156786420793645,0.0335710178960414 +lichen,lichen,south,,,Physcia.adscendens,EnSoftLin,5,0.106052188933668,0.0814400391043974,0.130572037732656,0.0868856909303751,0.104827215208426,0.0262751436146954 +lichen,lichen,south,,,Physcia.adscendens,TrSoftLin,5,0.157835534383738,0.120487024187209,0.209774497540774,0.157835534383738,0.163288539797896,0.0441400473178623 +lichen,lichen,south,,,Physcia.adscendens,HardLin,5,0.0165350535429243,0.0120621070012098,0.0195286140965431,0.0165350535429243,0.0160352349984333,0.00373898650121779 +lichen,lichen,south,,,Physcia.adscendens,UrbInd,5,0.0389262598086267,0.0294939748318359,0.0530990959477553,0.0431506202004028,0.0404214534693983,0.0124003014049701 +lichen,lichen,south,,,Physcia.adscendens,Wellsites,5,0.0361212212999052,0.0282999511156899,0.0508786677112775,0.0413073764753538,0.0385851768216347,0.0119892304602698 +lichen,lichen,south,,,Physcia.adscendens,Crop,5,0.00923975055880215,0.00688935614723793,0.00990739362805418,0.00923975055880215,0.00866135825638311,0.00174961488852405 +lichen,lichen,south,,,Physcia.adscendens,TameP,5,0.026713869603247,0.0180795051503958,0.0297402158652557,0.026713869603247,0.0245784040412905,0.00588581925861034 +lichen,lichen,south,,,Physcia.adscendens,RoughP,5,0.039320400519205,0.0281759149172245,0.0418780712232037,0.039320400519205,0.0359534518990116,0.00708818168961686 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Decid,5,0.047640807803491,0.0421034563656317,0.0521300438758573,0.0487558878166635,0.0473450096826365,0.0056501316974934 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Mixedwood,5,0.0279054540414128,0.0181658689236166,0.0367559849225421,0.0339606541972421,0.0278096939902147,0.00951815620753908 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Pine,5,0.0268788058190438,0.0209609632124494,0.0305097583077334,0.0258942184497686,0.0262889918843959,0.00524934568929363 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Spruce,5,0.0176721263875699,0.0146608207690292,0.0193257868464236,0.0155269078679997,0.0171502536690568,0.00231397502995575 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,TreedBog,5,0.0312070092273878,0.0296707284210888,0.0333575322543523,0.0299192022319042,0.0313555861600363,0.00196530518299601 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,TreedFen,5,0.031652259109271,0.0295795976387661,0.0337216938968473,0.0299192022319042,0.0315963400302195,0.00207244069441546 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,TreedSwamp,5,0.0344943810177399,0.0306124249828509,0.0489375718055997,0.0299192022319042,0.0386608055204566,0.00930458029009551 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,GrassHerb,5,0.0653279741583057,0.061888271218626,0.089856562855897,0.0701423452426464,0.0725277655971948,0.0173644289990184 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Shrub,5,0.0611030881192147,0.0442445083456052,0.0682165968089101,0.0701423452426464,0.0581276698433782,0.0144904584849003 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,GraminoidFen,5,0.0329008222005278,0.0311059034360441,0.0791720523993423,0.0320501190239091,0.0501938242980929,0.0256718232770762 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Marsh,5,0.0329008222005278,0.0311059034360441,0.0791720523993423,0.0320501190239091,0.0501938242980929,0.0256718232770762 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,ShrubbyBog,5,0.0304764263774674,0.0254605104823409,0.0325605409298803,0.0320501190239091,0.0294402995205514,0.00368131508014908 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,ShrubbyFen,5,0.0304764263774674,0.0254605104823409,0.0325605409298803,0.0320501190239091,0.0294402995205514,0.00368131508014908 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,ShrubbySwamp,5,0.0304764263774674,0.0207171959827077,0.0325605409298803,0.0320501190239091,0.027783252167868,0.00665855467631068 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCDecidR,5,0.0519264751930211,0.0421909761363827,0.0610656929689814,0.0664247062431653,0.0513344183248704,0.00990292477458262 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCDecid1,5,0.0664247062431653,0.0454313130756783,0.161801935827499,0.0664247062431653,0.0956407900305149,0.0594616376704109 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCDecid2,5,0.0403674064209935,0.0226811921693289,0.0610656929689814,0.0664247062431653,0.0413647407355767,0.0189529178903395 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCDecid3,5,0.0664247062431653,0.0454313130756783,0.13984577572166,0.0664247062431653,0.0874581435990877,0.047869158265578 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCDecid4,5,0.0664247062431653,0.0454313130756783,0.13984577572166,0.0664247062431653,0.0874581435990877,0.047869158265578 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCMixedwoodR,5,0.0403674064209935,1.86696880287542e-07,0.0610656929689814,0.0664247062431653,0.0319639391176817,0.0305989508139031 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCMixedwood1,5,0.0664247062431653,0.0454313130756783,0.0985082759740731,0.0664247062431653,0.0708925437744992,0.0261644585445364 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCMixedwood2,5,0.0664247062431653,0.0454313130756783,0.0927460852883475,0.0664247062431653,0.0679067027845017,0.0243051352751106 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCMixedwood3,5,0.0664247062431653,0.0454313130756783,0.13984577572166,0.0664247062431653,0.0874581435990877,0.047869158265578 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCMixedwood4,5,0.0664247062431653,0.0454313130756783,0.13984577572166,0.0664247062431653,0.0874581435990877,0.047869158265578 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCPineR,5,0.0329977774300808,0.0275981212995825,0.055494150911045,0.0418434478038768,0.0389994170914637,0.0154321958967688 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCPine1,5,0.0286931152246994,0.00895589257187608,0.0383051796543584,0.0418434478038768,0.0246424860352798,0.0146575340381232 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCPine2,5,0.0418434478038768,0.030414980106852,0.13984577572166,0.0418434478038768,0.0762011545464462,0.0574167919857827 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCPine3,5,0.0418434478038768,0.030414980106852,0.13984577572166,0.0418434478038768,0.0762011545464462,0.0574167919857827 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCPine4,5,0.0418434478038768,0.030414980106852,0.13984577572166,0.0418434478038768,0.0762011545464462,0.0574167919857827 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCSpruceR,5,0.0418434478038768,0.030414980106852,0.305015280094132,0.0418434478038768,0.134680455516499,0.154520697103704 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCSpruce1,5,0.0329977774300808,0.0114772753535638,0.0426296284343427,0.0418434478038768,0.0293376276172234,0.0174770304250845 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCSpruce2,5,0.0329977774300808,0.0196456208529556,0.0493468226750582,0.0418434478038768,0.0342994741972592,0.0151650436180593 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCSpruce3,5,0.0418434478038768,0.030414980106852,0.13984577572166,0.0418434478038768,0.0762011545464462,0.0574167919857827 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,CCSpruce4,5,0.0418434478038768,0.030414980106852,0.13984577572166,0.0418434478038768,0.0762011545464462,0.0574167919857827 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,HardLin,5,0.134939746303501,0.11313165192637,0.138252211851646,0.140140987080189,0.128430781048037,0.0150773054438261 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,EnSoftLin,5,0.135928985585703,0.114033932348076,0.146463088964367,0.108633567141907,0.131593724319033,0.0163096665223475 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,EnSeismic,5,0.12213448015733,0.0890416535123073,0.143994279540726,0.108633567141907,0.11836959804192,0.0281935358437126 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,TrSoftLin,5,0.108633567141907,0.0713041482970402,0.138717152503764,0.108633567141907,0.105920961385117,0.0342224601999073 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Urban,5,0.134939746303501,0.11313165192637,0.138252211851646,0.140140987080189,0.128430781048037,0.0150773054438261 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Rural,5,0.134939746303501,0.11313165192637,0.138252211851646,0.140140987080189,0.128430781048037,0.0150773054438261 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Industrial,5,0.134939746303501,0.11313165192637,0.138252211851646,0.140140987080189,0.128430781048037,0.0150773054438261 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Well,5,0.129304108911142,0.0508739875681123,0.138060490769514,0.140140987080189,0.101626632226259,0.0457159602942333 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,Crop,5,0.134939746303501,0.130856632631654,0.142628003268766,0.140140987080189,0.136371254913681,0.0058948625509627 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,TameP,5,0.140140987080189,0.131558363868086,0.166944782085177,0.140140987080189,0.146328175511539,0.0200400340628098 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,RoughP,5,0.134939746303501,0.107211805137829,0.197177402914023,0.140140987080189,0.146414025010739,0.0530459646613359 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Decid,5,0.257670301669833,0.25268511782041,0.299216536351889,0.250263196314734,0.272180704204058,0.0242350996923886 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Mixedwood,5,0.275371757751266,0.246931841338979,0.300679741105016,0.267778296796379,0.274736706733593,0.0279617066651882 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Pine,5,0.191627552662267,0.185639377125035,0.22504720435644,0.191627552662267,0.201501274262095,0.0214876480685103 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Spruce,5,0.227199239938309,0.197719069725711,0.261529215102722,0.211937623492895,0.229168587007038,0.0318091845104133 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,TreedBog,5,0.148793830904151,0.132497404514779,0.155371350064858,0.13349759896445,0.144807122602355,0.0114762101186987 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,TreedFen,5,0.144475982710738,0.132978225672994,0.154438886014026,0.140460621172556,0.144313480947399,0.0109807508607257 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,TreedSwamp,5,0.249048354321576,0.223475542712116,0.289138875493625,0.219333664647888,0.254605490569608,0.0323842455145578 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,GrassHerb,5,0.2480296169969,0.237318154647019,0.315522864674229,0.243208536186666,0.268568532907938,0.0437249717988789 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Shrub,5,0.23362253489809,0.21634137243735,0.257032219262653,0.23362253489809,0.236470744324128,0.0201811658199 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,GraminoidFen,5,0.272335942420037,0.244138225439184,0.296606395166859,0.272335942420037,0.270211095150555,0.026687514195625 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Marsh,5,0.272335942420037,0.244138225439184,0.296606395166859,0.272335942420037,0.270211095150555,0.026687514195625 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,ShrubbyBog,5,0.129805148819312,0.116205825982704,0.158770458351882,0.123758665516073,0.134605575728791,0.0251125137099972 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,ShrubbyFen,5,0.129805148819312,0.116205825982704,0.158770458351882,0.123758665516073,0.134605575728791,0.0251125137099972 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,ShrubbySwamp,5,0.188745324781336,0.167005561530848,0.253626121411953,0.188745324781336,0.202711431947935,0.0494613150959488 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCDecidR,5,0.231790845755958,0.199250708118932,0.239359596218743,0.204735734181689,0.222063537492967,0.0204896232573866 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCDecid1,5,0.231790845755958,0.199250708118932,0.239359596218743,0.204735734181689,0.222063537492967,0.0204896232573866 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCDecid2,5,0.231790845755958,0.199250708118932,0.239359596218743,0.204735734181689,0.222063537492967,0.0204896232573866 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCDecid3,5,0.231790845755958,0.199250708118932,0.239359596218743,0.204735734181689,0.222063537492967,0.0204896232573866 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCDecid4,5,0.231790845755958,0.199250708118932,0.239359596218743,0.204735734181689,0.222063537492967,0.0204896232573866 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCMixedwoodR,5,0.231790845755958,0.199250708118932,0.239359596218743,0.204735734181689,0.222063537492967,0.0204896232573866 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCMixedwood1,5,0.231790845755958,0.199250708118932,0.239359596218743,0.204735734181689,0.222063537492967,0.0204896232573866 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCMixedwood2,5,0.231790845755958,0.199250708118932,0.239359596218743,0.204735734181689,0.222063537492967,0.0204896232573866 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCMixedwood3,5,0.231790845755958,0.199250708118932,0.239359596218743,0.204735734181689,0.222063537492967,0.0204896232573866 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCMixedwood4,5,0.231790845755958,0.199250708118932,0.239359596218743,0.204735734181689,0.222063537492967,0.0204896232573866 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCPineR,5,0.334283211887097,0.223646034396249,0.350195977658891,0.252728055432474,0.297760629606335,0.0659734111545076 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCPine1,5,0.334283211887097,0.223646034396249,0.350195977658891,0.252728055432474,0.297760629606335,0.0659734111545076 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCPine2,5,0.334283211887097,0.223646034396249,0.350195977658891,0.252728055432474,0.297760629606335,0.0659734111545076 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCPine3,5,0.334283211887097,0.223646034396249,0.350195977658891,0.252728055432474,0.297760629606335,0.0659734111545076 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCPine4,5,0.334283211887097,0.223646034396249,0.350195977658891,0.252728055432474,0.297760629606335,0.0659734111545076 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCSpruceR,5,0.321916199827704,0.226786073940564,0.3362304790634,0.251426565070253,0.290385479825988,0.0569310858978242 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCSpruce1,5,0.321916199827704,0.226786073940564,0.3362304790634,0.251426565070253,0.290385479825988,0.0569310858978242 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCSpruce2,5,0.321916199827704,0.226786073940564,0.3362304790634,0.251426565070253,0.290385479825988,0.0569310858978242 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCSpruce3,5,0.321916199827704,0.226786073940564,0.3362304790634,0.251426565070253,0.290385479825988,0.0569310858978242 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,CCSpruce4,5,0.321916199827704,0.226786073940564,0.3362304790634,0.251426565070253,0.290385479825988,0.0569310858978242 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,HardLin,5,0.19071774622534,0.0974007399519308,0.240733568496156,0.111539574120126,0.17127771039873,0.0732372269463743 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,EnSoftLin,5,0.248284317219045,0.226169685664436,0.301392052670499,0.245765939186683,0.25939698564774,0.0420508019366517 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,EnSeismic,5,0.426961347747829,0.389435322188954,0.481650459050364,0.40014515763882,0.432415278327126,0.047044930339176 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,TrSoftLin,5,0.17814172514827,0.12158426489911,0.222472294628215,0.191095088735685,0.172686214591363,0.0514005542419291 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Urban,5,0.19071774622534,0.0974007399519308,0.240733568496156,0.111539574120126,0.17127771039873,0.0732372269463743 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Rural,5,0.19071774622534,0.0974007399519308,0.240733568496156,0.111539574120126,0.17127771039873,0.0732372269463743 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Industrial,5,0.19071774622534,0.0974007399519308,0.240733568496156,0.111539574120126,0.17127771039873,0.0732372269463743 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Well,5,0.204111777253966,0.157588378902068,0.3180994853061,0.135502134019886,0.226718306143626,0.0934254943677214 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,Crop,5,0.177273110573243,0.159339604167137,0.20698726239642,0.177273110573243,0.181419649055733,0.0243804143233458 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,TameP,5,0.106013821908483,0.0894430978024326,0.17346343225447,0.0952839991630323,0.12502933843141,0.0436710630773195 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,RoughP,5,0.274174686267773,0.223732051403491,0.374273016748219,0.274174686267773,0.292241558777143,0.0847262045748597 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,ClaySub,5,0.555220139484688,0.394498331723014,0.702736975528346,0.555220139484688,0.548583153087831,0.151762015935046 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Other,5,0.555220139484688,0.394498331723014,0.702736975528346,0.555220139484688,0.548583153087831,0.151762015935046 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,RapidDrain,5,0.634195131080269,0.466725133776188,0.702736975528346,0.555220139484688,0.598286530503394,0.123050914931351 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Loamy,5,0.585624995059312,0.517090683974723,0.733450970235701,0.585624995059312,0.612539176846356,0.112558481100448 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,SandyLoam,5,0.779017339675273,0.680988596683654,0.866425950439531,0.779017339675273,0.77884451338414,0.0956809767276209 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,ThinBreak,5,0.555220139484688,0.448231043418837,0.702736975528346,0.555220139484688,0.573244487005602,0.126605629946665 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Blowout,5,0.555220139484688,0.448231043418837,0.702736975528346,0.555220139484688,0.573244487005602,0.126605629946665 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Urban,5,0.583445114492641,0.499588697752921,0.825386051737734,0.487723056831294,0.639664312948093,0.170888464211465 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Rural,5,0.583445114492641,0.499588697752921,0.825386051737734,0.487723056831294,0.639664312948093,0.170888464211465 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Industrial,5,0.583445114492641,0.499588697752921,0.825386051737734,0.487723056831294,0.639664312948093,0.170888464211465 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Well,5,0.517387159135361,0.485351712822258,0.654799112289952,0.487723056831294,0.554938918286071,0.0915711112104892 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Mine,5,0.583445114492641,0.499588697752921,0.825386051737734,0.487723056831294,0.639664312948093,0.170888464211465 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,EnSoftLin,5,0.551988691379397,0.472907672172372,0.746855800537036,0.551988691379397,0.596628214316857,0.137830596967816 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,EnSeismic,5,0.551988691379397,0.472907672172372,0.746855800537036,0.551988691379397,0.596628214316857,0.137830596967816 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,HardLin,5,0.583445114492641,0.499588697752921,0.825386051737734,0.487723056831294,0.639664312948093,0.170888464211465 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,TrSoftLin,5,0.551988691379397,0.472907672172372,0.661295206321867,0.551988691379397,0.564149522780887,0.093422616108171 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,Crop,5,0.664605920258043,0.543810341278273,0.777406068435428,0.664605920258043,0.66361926030854,0.115409799954802 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,RoughP,5,0.661922813941234,0.543810341278273,0.734870844221513,0.664605920258043,0.641815026938221,0.0992280794953468 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,TameP,5,0.664605920258043,0.543810341278273,0.762991086100113,0.664605920258043,0.656411769140883,0.107913421931019 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,WetlandMargin,5,0.585444465824865,0.239308585750385,0.749205253519565,0.585444465824865,0.514520714062245,0.25399488681222 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,ClaySub,5,0.0667209228725318,0.0471871616217136,0.0745121978337484,0.0784267337005647,0.0619677799657342,0.0138015043715517 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Other,5,0.0667209228725318,0.0471871616217136,0.0745121978337484,0.0784267337005647,0.0619677799657342,0.0138015043715517 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,RapidDrain,5,0.0784267337005647,0.0580184128835627,0.182475942831045,0.0784267337005647,0.108634134915957,0.0683649493619883 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Loamy,5,0.0565859324870483,0.0491432799330989,0.0744882681216602,0.0784267337005647,0.0605808564697218,0.0127502513381831 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,SandyLoam,5,0.0522167395575833,0.022088416299373,0.106394166195476,0.0784267337005647,0.0614464088165364,0.0437090748528919 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,ThinBreak,5,0.0667209228725318,0.0526910929547497,0.0819102188921822,0.0784267337005647,0.0669999123068879,0.0144139003416867 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Blowout,5,0.0667209228725318,0.0526910929547497,0.0819102188921822,0.0784267337005647,0.0669999123068879,0.0144139003416867 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Urban,5,0.00922653651061864,0.0027634925310201,0.030904020696116,0.00922653651061864,0.0144698682404388,0.0153586078670068 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Rural,5,0.00922653651061864,0.0027634925310201,0.030904020696116,0.00922653651061864,0.0144698682404388,0.0153586078670068 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Industrial,5,0.00922653651061864,0.0027634925310201,0.030904020696116,0.00922653651061864,0.0144698682404388,0.0153586078670068 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Well,5,0.00242981545308046,4.85369257366382e-09,0.00684152516554301,0.00922653651061864,0.0029840741768291,0.00378031859912425 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Mine,5,0.00922653651061864,0.0027634925310201,0.030904020696116,0.00922653651061864,0.0144698682404388,0.0153586078670068 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,EnSoftLin,5,0.036098691627639,0.0108694320397718,0.0881199281160513,0.036098691627639,0.0452302386297233,0.0427459018693586 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,EnSeismic,5,0.036098691627639,0.0108694320397718,0.0881199281160513,0.036098691627639,0.0452302386297233,0.0427459018693586 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,HardLin,5,0.00922653651061864,0.0027634925310201,0.030904020696116,0.00922653651061864,0.0144698682404388,0.0153586078670068 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,TrSoftLin,5,0.0271735638239476,0.0226676570357414,0.0432617606269774,0.036098691627639,0.0315033862556764,0.0107685423453701 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,Crop,5,0.0206055204843312,0.0177111458771107,0.0251768860663094,0.0270020288489522,0.0211820007883143,0.00385182168133274 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,RoughP,5,0.0225176634330294,0.0183397065659335,0.0271753939444167,0.0270020288489522,0.0228490694789415,0.00442606378043097 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,TameP,5,0.0168291639536684,0.00689293851916878,0.0244434255031038,0.0270020288489522,0.0157357123464475,0.00870155989086529 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,WetlandMargin,5,1.94731766462466e-08,9.60713813825307e-09,2.26961479274612e-08,2.33837497296015e-08,1.70089835588826e-08,6.72415947275868e-09 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Decid,5,0.0449203614522765,0.0399272055174853,0.0461207026143072,0.0449203614522765,0.0433845385662547,0.00315950589820464 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Mixedwood,5,0.0273241474240622,0.0148672640830864,0.029705093739567,0.0273241474240622,0.0234559291752824,0.00765746375489848 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Pine,5,0.0196006162097023,0.0177223221151389,0.0208573336024009,0.0176556438960936,0.0193416828929529,0.00155313864498343 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Spruce,5,0.0133118475600801,0.00928641896189441,0.0154669185911262,0.0137961282417973,0.0125673305270286,0.00317121265527406 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,TreedBog,5,0.0269986743089763,0.0246332515524093,0.0296528479842816,0.0286355651253948,0.0271316160284842,0.00251156778735683 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,TreedFen,5,0.0346703571209486,0.0300665281749436,0.0351451063464642,0.0316720599445966,0.0330965907211805,0.00271068571353499 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,TreedSwamp,5,0.0562955719457925,0.0435834392821119,0.07751039884971,0.0562955719457925,0.0596535487656531,0.0168206952691527 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,GrassHerb,5,0.0804381287263335,0.077265490603449,0.0897442881448977,0.0783755759784833,0.0824259622430937,0.00737264781225501 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Shrub,5,0.0681831360493072,0.0495067618820586,0.0834804792057293,0.0693588214886089,0.0659469604326635,0.0178542302535926 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,GraminoidFen,5,0.08298929154192,0.0746709031965066,0.0861134405713966,0.0834692933781883,0.0811320484264769,0.00639156303460706 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Marsh,5,0.08298929154192,0.0746709031965066,0.0861134405713966,0.0834692933781883,0.0811320484264769,0.00639156303460706 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,ShrubbyBog,5,0.0137861868727856,0.0133312667653021,0.0163982311535578,0.0174941754511015,0.0145534097592103,0.00174334914133735 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,ShrubbyFen,5,0.0137861868727856,0.0133312667653021,0.0163982311535578,0.0174941754511015,0.0145534097592103,0.00174334914133735 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,ShrubbySwamp,5,0.023346797778904,0.015694365834426,0.0247290058987953,0.0195830589922788,0.0210911900079341,0.00493525892739733 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCDecidR,5,0.0634232741924905,0.0524183155350296,0.0816623550282871,0.0634232741924905,0.0661907389690236,0.0145258686389515 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCDecid1,5,0.0634232741924905,0.0524183155350296,0.0816623550282871,0.0634232741924905,0.0661907389690236,0.0145258686389515 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCDecid2,5,0.0634232741924905,0.0524183155350296,0.0816623550282871,0.0634232741924905,0.0661907389690236,0.0145258686389515 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCDecid3,5,0.0634232741924905,0.0524183155350296,0.0816623550282871,0.0634232741924905,0.0661907389690236,0.0145258686389515 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCDecid4,5,0.0634232741924905,0.0524183155350296,0.0816623550282871,0.0634232741924905,0.0661907389690236,0.0145258686389515 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCMixedwoodR,5,0.0634232741924905,0.0524183155350296,0.0816623550282871,0.0634232741924905,0.0661907389690236,0.0145258686389515 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCMixedwood1,5,0.0634232741924905,0.0524183155350296,0.0816623550282871,0.0634232741924905,0.0661907389690236,0.0145258686389515 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCMixedwood2,5,0.0634232741924905,0.0524183155350296,0.0816623550282871,0.0634232741924905,0.0661907389690236,0.0145258686389515 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCMixedwood3,5,0.0634232741924905,0.0524183155350296,0.0816623550282871,0.0634232741924905,0.0661907389690236,0.0145258686389515 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCMixedwood4,5,0.0634232741924905,0.0524183155350296,0.0816623550282871,0.0634232741924905,0.0661907389690236,0.0145258686389515 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCPineR,5,0.0429017164110987,0.0334830377890367,0.05791632388432,0.0429017164110987,0.0456388904072951,0.0126462818641536 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCPine1,5,0.0429017164110987,0.0334830377890367,0.05791632388432,0.0429017164110987,0.0456388904072951,0.0126462818641536 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCPine2,5,0.0429017164110987,0.0334830377890367,0.05791632388432,0.0429017164110987,0.0456388904072951,0.0126462818641536 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCPine3,5,0.0429017164110987,0.0334830377890367,0.05791632388432,0.0429017164110987,0.0456388904072951,0.0126462818641536 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCPine4,5,0.0429017164110987,0.0334830377890367,0.05791632388432,0.0429017164110987,0.0456388904072951,0.0126462818641536 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCSpruceR,5,0.024139993434008,0.0150053643826653,0.0287361913785556,0.0309648973086927,0.0221568969593286,0.00691592629008353 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCSpruce1,5,0.024139993434008,0.0150053643826653,0.0287361913785556,0.0309648973086927,0.0221568969593286,0.00691592629008353 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCSpruce2,5,0.024139993434008,0.0150053643826653,0.0287361913785556,0.0309648973086927,0.0221568969593286,0.00691592629008353 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCSpruce3,5,0.024139993434008,0.0150053643826653,0.0287361913785556,0.0309648973086927,0.0221568969593286,0.00691592629008353 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,CCSpruce4,5,0.024139993434008,0.0150053643826653,0.0287361913785556,0.0309648973086927,0.0221568969593286,0.00691592629008353 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,HardLin,5,0.121863990133419,0.119864788586073,0.129947053494084,0.118992631310027,0.124132350649919,0.00533782210285643 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,EnSoftLin,5,0.108883674200791,0.0983056772774538,0.132874774675726,0.0980871465772408,0.113902365396764,0.0173390198715597 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,EnSeismic,5,0.0980871465772408,0.0436913018520788,0.104783593851584,0.0980871465772408,0.0799588266598827,0.0326087744287224 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,TrSoftLin,5,0.0980871465772408,0.0718039852980543,0.104783593851584,0.0980871465772408,0.0908443583884561,0.0180214456135981 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Urban,5,0.121863990133419,0.119864788586073,0.129947053494084,0.118992631310027,0.124132350649919,0.00533782210285643 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Rural,5,0.121863990133419,0.119864788586073,0.129947053494084,0.118992631310027,0.124132350649919,0.00533782210285643 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Industrial,5,0.121863990133419,0.119864788586073,0.129947053494084,0.118992631310027,0.124132350649919,0.00533782210285643 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Well,5,0.121863990133419,0.119864788586073,0.129947053494084,0.118992631310027,0.124132350649919,0.00533782210285643 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,Crop,5,0.121863990133419,0.119864788586073,0.129947053494084,0.118992631310027,0.124132350649919,0.00533782210285643 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,TameP,5,0.121863990133419,0.119864788586073,0.129947053494084,0.118992631310027,0.124132350649919,0.00533782210285643 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,RoughP,5,0.121863990133419,0.119864788586073,0.129947053494084,0.118992631310027,0.124132350649919,0.00533782210285643 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Decid,5,0.111664402452981,0.0925676785255877,0.12838442931739,0.111664402452981,0.110119895193492,0.0190661663439829 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Mixedwood,5,0.0666129636526026,0.0517060528658316,0.0780092522284266,0.0655577834788831,0.0661193316569303,0.0145003800102491 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Pine,5,0.0387812701455966,0.0349164779226351,0.0431552649817136,0.0434917161194809,0.0391574742770485,0.00424769857635412 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Spruce,5,0.0695392350566296,0.0500711157624263,0.0819420036005477,0.0695392350566296,0.0666263862635545,0.0157200412672632 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,TreedBog,5,0.026015783845678,0.0246467881759166,0.0391195468077491,0.0324223167296191,0.0303153574549933,0.00808061452875623 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,TreedFen,5,0.0324223167296191,0.0231448273336468,0.0416424211240961,0.0324223167296191,0.0323574475758651,0.00908161962000169 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,TreedSwamp,5,0.12705806311569,0.0777590339638333,0.135275094643934,0.138924945537604,0.111707211905002,0.0308139140813987 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,GrassHerb,5,0.0538649801932773,0.0494114363460887,0.0771016483764267,0.0674988002326724,0.0610238337471224,0.0146762162898288 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Shrub,5,0.0845204524428601,0.0813230199104712,0.110177551407743,0.0845204524428601,0.0919694455707154,0.0196217660132652 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,GraminoidFen,5,0.0664848446869057,0.0548562317765635,0.0823057352013198,0.0715579377130805,0.0681187967555788,0.0148350802392212 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Marsh,5,0.0664848446869057,0.0548562317765635,0.0823057352013198,0.0715579377130805,0.0681187967555788,0.0148350802392212 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,ShrubbyBog,5,0.0664848446869057,0.0400219913426505,0.0823057352013198,0.0715579377130805,0.0618909308970976,0.0211868093289378 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,ShrubbyFen,5,0.0664848446869057,0.0400219913426505,0.0823057352013198,0.0715579377130805,0.0618909308970976,0.0211868093289378 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,ShrubbySwamp,5,0.0894709335268126,0.0685140818973756,0.11559222101601,0.0715579377130805,0.091532280448262,0.0231972179734856 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCDecidR,5,0.0979659072936202,0.056000550317278,0.119035445956366,0.0987996864776002,0.0899407938396021,0.0339449857842051 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCDecid1,5,0.0979659072936202,0.0754740008765856,0.119035445956366,0.0987996864776002,0.0964319440260379,0.0232198918994744 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCDecid2,5,0.0987996864776002,0.0879270736378564,0.143484471733302,0.0987996864776002,0.112263243057184,0.0284752655903563 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCDecid3,5,0.0979659072936202,0.0621286619393974,0.119035445956366,0.0987996864776002,0.0919834977136418,0.0302306364918027 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCDecid4,5,0.0979659072936202,0.0621286619393974,0.119035445956366,0.0987996864776002,0.0919834977136418,0.0302306364918027 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCMixedwoodR,5,0.0979659072936202,0.0324939517016264,0.119035445956366,0.0987996864776002,0.0821052609677182,0.0495340856552004 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCMixedwood1,5,0.0987996864776002,0.0879270736378564,0.190271057342052,0.0987996864776002,0.127858771593434,0.0594059091938825 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCMixedwood2,5,0.0979659072936202,0.0408003100761594,0.119035445956366,0.0987996864776002,0.0848740470925625,0.043859188592961 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCMixedwood3,5,0.0979659072936202,0.0621286619393974,0.119035445956366,0.0987996864776002,0.0919834977136418,0.0302306364918027 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCMixedwood4,5,0.0979659072936202,0.0621286619393974,0.119035445956366,0.0987996864776002,0.0919834977136418,0.0302306364918027 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCPineR,5,0.0979659072936202,0.06146626030886,0.119035445956366,0.0987996864776002,0.0917626971701294,0.0306210063404481 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCPine1,5,0.0979659072936202,0.0742813046037392,0.119035445956366,0.0987996864776002,0.0960343786017558,0.0237613346782708 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCPine2,5,0.0979659072936202,0.0621286619393974,0.119035445956366,0.0987996864776002,0.0919834977136418,0.0302306364918027 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCPine3,5,0.0979659072936202,0.0621286619393974,0.119035445956366,0.0987996864776002,0.0919834977136418,0.0302306364918027 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCPine4,5,0.0979659072936202,0.0621286619393974,0.119035445956366,0.0987996864776002,0.0919834977136418,0.0302306364918027 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCSpruceR,5,0.0987996864776002,0.0879270736378564,0.133811680469912,0.0987996864776002,0.109038979302721,0.0235003797651685 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCSpruce1,5,0.0979659072936202,0.0842318615581226,0.119035445956366,0.0987996864776002,0.0998507882016794,0.0196380282283496 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCSpruce2,5,0.0979659072936202,0.0553515374833462,0.119035445956366,0.0987996864776002,0.0897244562282914,0.0343504130227519 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCSpruce3,5,0.0979659072936202,0.0621286619393974,0.119035445956366,0.0987996864776002,0.0919834977136418,0.0302306364918027 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,CCSpruce4,5,0.0979659072936202,0.0621286619393974,0.119035445956366,0.0987996864776002,0.0919834977136418,0.0302306364918027 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,HardLin,5,0.0655704593026337,0.0386964513077742,0.0806664925562941,0.0681539858129174,0.061490055174022,0.0235635493086013 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,EnSoftLin,5,0.0499491621686334,0.0432606306115374,0.0917851939975131,0.0630037477010183,0.0622091308002257,0.0284117016778473 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,EnSeismic,5,0.0630037477010183,0.0470136277181822,0.0956609574711948,0.0630037477010183,0.0683350991735864,0.0261979131095086 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,TrSoftLin,5,0.0499491621686334,0.0381918030077569,0.0917851939975131,0.0630037477010183,0.0605195215989655,0.03010971736645 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Urban,5,0.0655704593026337,0.0386964513077742,0.0806664925562941,0.0681539858129174,0.061490055174022,0.0235635493086013 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Rural,5,0.0655704593026337,0.0386964513077742,0.0806664925562941,0.0681539858129174,0.061490055174022,0.0235635493086013 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Industrial,5,0.0655704593026337,0.0386964513077742,0.0806664925562941,0.0681539858129174,0.061490055174022,0.0235635493086013 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Well,5,0.0656654516139695,0.0626306304625554,0.0806664925562941,0.0681539858129174,0.0698137610034471,0.0110678450805123 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,Crop,5,0.0655704593026337,0.0539031526201264,0.0806664925562941,0.0681539858129174,0.0665589556114727,0.0144644680111463 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,TameP,5,0.0655704593026337,0.0400397821358317,0.0806664925562941,0.0681539858129174,0.0619378321167078,0.0226787995328322 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,RoughP,5,0.0681539858129174,0.0626306304625554,0.157698264126943,0.0681539858129174,0.097379003560495,0.0602979045619669 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,ClaySub,5,0.691634949610229,0.550848790356094,0.802465195536948,0.714170375192759,0.68019609479513,0.13479154309237 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Other,5,0.691634949610229,0.550848790356094,0.802465195536948,0.714170375192759,0.68019609479513,0.13479154309237 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,RapidDrain,5,0.710928475172056,0.569824590326749,0.802465195536948,0.714170375192759,0.693542699892822,0.133909499622018 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Loamy,5,0.614208250714799,0.535537936114048,0.793086839692097,0.714170375192759,0.65392920928007,0.134177594939503 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,SandyLoam,5,0.710928475172056,0.569824590326749,0.851537864173555,0.714170375192759,0.709900256105024,0.161650897739812 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,ThinBreak,5,0.714170375192759,0.493395564734683,0.821258910605355,0.714170375192759,0.665373424635133,0.164378669365967 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Blowout,5,0.714170375192759,0.493395564734683,0.821258910605355,0.714170375192759,0.665373424635133,0.164378669365967 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Urban,5,0.757773549137013,0.657116840415395,0.839728338581547,0.757773549137013,0.745609599201415,0.0963118964374143 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Rural,5,0.757773549137013,0.657116840415395,0.839728338581547,0.757773549137013,0.745609599201415,0.0963118964374143 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Industrial,5,0.757773549137013,0.657116840415395,0.839728338581547,0.757773549137013,0.745609599201415,0.0963118964374143 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Well,5,0.665294102611545,0.500844990155389,0.838316421030783,0.757773549137013,0.673408549679142,0.180300241875787 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Mine,5,0.757773549137013,0.657116840415395,0.839728338581547,0.757773549137013,0.745609599201415,0.0963118964374143 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,EnSoftLin,5,0.652008305064925,0.550739776228706,0.78332637135667,0.628634628150965,0.663407830088547,0.123697662896884 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,EnSeismic,5,0.652008305064925,0.550739776228706,0.78332637135667,0.628634628150965,0.663407830088547,0.123697662896884 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,HardLin,5,0.757773549137013,0.657116840415395,0.839728338581547,0.757773549137013,0.745609599201415,0.0963118964374143 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,TrSoftLin,5,0.628634628150965,0.425072256873216,0.765678825360405,0.628634628150965,0.599365165042208,0.174842335297327 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,Crop,5,0.753168326869958,0.644219978099744,0.838316421030783,0.757773549137013,0.738775057178943,0.101908824049686 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,RoughP,5,0.753168326869958,0.5812621652318,0.838316421030783,0.757773549137013,0.717789119556295,0.133449191398277 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,TameP,5,0.753168326869958,0.660198982643474,0.838316421030783,0.757773549137013,0.745523667086661,0.0945203457137365 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,WetlandMargin,5,0.870880735779777,0.824509912771411,0.934646436936643,0.870880735779777,0.878612329229634,0.0544004215859729 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,ClaySub,5,0.0108355773911345,0.00400015925223842,0.0145163537839974,0.0141945654676911,0.00964996452335385,0.00522727711737457 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Other,5,0.0108355773911345,0.00400015925223842,0.0145163537839974,0.0141945654676911,0.00964996452335385,0.00522727711737457 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,RapidDrain,5,0.0141945654676911,0.00412645388529901,0.0149565220342368,0.0141945654676911,0.0106852617341246,0.0058358125599737 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Loamy,5,0.0141945654676911,0.00459311158353375,0.0160836483068433,0.0141945654676911,0.0112135235259748,0.00595036378174178 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,SandyLoam,5,0.0141945654676911,0.0101099232735522,0.0149565220342368,0.0141945654676911,0.0131064936286486,0.00313916311192032 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,ThinBreak,5,0.0147308793282016,0.0124614000782512,0.0267202462630917,0.0141945654676911,0.0185713582518418,0.00732893490342272 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Blowout,5,0.0147308793282016,0.0124614000782512,0.0267202462630917,0.0141945654676911,0.0185713582518418,0.00732893490342272 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Urban,5,9.37290365828135e-10,5.80885222938139e-10,1.02858504274146e-09,9.67698723675452e-10,8.39452871070888e-10,2.39628364395568e-10 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Rural,5,9.37290365828135e-10,5.80885222938139e-10,1.02858504274146e-09,9.67698723675452e-10,8.39452871070888e-10,2.39628364395568e-10 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Industrial,5,9.37290365828135e-10,5.80885222938139e-10,1.02858504274146e-09,9.67698723675452e-10,8.39452871070888e-10,2.39628364395568e-10 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Well,5,8.90552084803996e-10,3.87060694623438e-10,1.24813630833937e-09,8.90552084803996e-10,8.29769567113585e-10,4.42230997130351e-10 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Mine,5,9.37290365828135e-10,5.80885222938139e-10,1.02858504274146e-09,9.67698723675452e-10,8.39452871070888e-10,2.39628364395568e-10 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,EnSoftLin,5,0.0367985674989132,0.018521560297194,0.0629261097189651,0.0367985674989132,0.0409860878361041,0.0232841750821887 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,EnSeismic,5,0.0367985674989132,0.018521560297194,0.0629261097189651,0.0367985674989132,0.0409860878361041,0.0232841750821887 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,HardLin,5,9.37290365828135e-10,5.80885222938139e-10,1.02858504274146e-09,9.67698723675452e-10,8.39452871070888e-10,2.39628364395568e-10 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,TrSoftLin,5,0.0022392793878417,0.00098112936391626,0.00374456156057241,0.00374705166332369,0.002382448206564,0.00138529642908284 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,Crop,5,0.0051325112730342,0.00259608383885104,0.00661901820530916,0.00559204853976238,0.00475794570322879,0.00214570634790766 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,RoughP,5,0.00988095151082199,0.00435679506693851,0.0155976420996964,0.00988095151082199,0.0098898655353174,0.00559256086775056 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,TameP,5,0.00292203063138844,0.000742013980820096,0.00419414527275806,0.00325978967361389,0.00253230027213867,0.00173829261991583 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,WetlandMargin,5,2.01430416447776e-09,1.84918028139387e-09,3.24837282140699e-09,2.06303834717273e-09,2.3671775646272e-09,9.39547051285219e-10 +mite,mite,north,,,Ceratozetes.gracilis,WhiteSpruce,5,0.083324839926525,0.0773341259190752,0.0945808748551744,0.0783644708180673,0.0853402065330667,0.00855276292906888 +mite,mite,north,,,Ceratozetes.gracilis,Pine,5,0.058491231242114,0.0555475742526604,0.0633659637812255,0.0561087495328157,0.0592708435583154,0.00387279881709013 +mite,mite,north,,,Ceratozetes.gracilis,Deciduous,5,0.126688146057812,0.122367096566167,0.134062754480131,0.120032888034155,0.127932927536251,0.00601740175453024 +mite,mite,north,,,Ceratozetes.gracilis,Mixedwood,5,0.0990912857393305,0.0936387390038836,0.106178442160669,0.0922465109400969,0.099754338890101,0.0061787047771312 +mite,mite,north,,,Ceratozetes.gracilis,BlackSpruce,5,0.0210071881552033,0.0194431031984639,0.0243987448926687,0.0201312092719344,0.0216292215405341,0.00266784711827234 +mite,mite,north,,,Ceratozetes.gracilis,TreedFen,5,0.026580724324828,0.024242440270075,0.0332422257164936,0.0260589020761079,0.0282071028227065,0.00473764455368065 +mite,mite,north,,,Ceratozetes.gracilis,TreedSwamp,5,0.0749606880704819,0.0680207443603623,0.0931006713769451,0.0749606880704819,0.0790188543800901,0.0129650555502465 +mite,mite,north,,,Ceratozetes.gracilis,GraminoidFen,5,0.0274581642389803,0.0235853563324741,0.0322028810746652,0.0256468478624544,0.0277164575380178,0.00451584646869259 +mite,mite,north,,,Ceratozetes.gracilis,ShrubbyFen,5,0.0270291842209052,0.0233274790353779,0.0319634992742681,0.0254940252637942,0.0274147093852006,0.00460949355442051 +mite,mite,north,,,Ceratozetes.gracilis,ShrubbyBog,5,0.0221218552654225,0.0203526759367032,0.0258708245808148,0.0212207018552364,0.0228041297102978,0.00295575949415321 +mite,mite,north,,,Ceratozetes.gracilis,ShrubbySwamp,5,0.0787981143345215,0.0700959541686417,0.0912831982274847,0.0787981143345215,0.0801664992667429,0.0104554025659284 +mite,mite,north,,,Ceratozetes.gracilis,Marsh,5,0.0614924047415441,0.0503717579633235,0.0745768553412364,0.0549398690582114,0.0617365809631295,0.0133002434093838 +mite,mite,north,,,Ceratozetes.gracilis,Shrub,5,0.0690326282206128,0.0637085121852232,0.0855845655242005,0.0690326282206128,0.0728644764878167,0.0133405493919686 +mite,mite,north,,,Ceratozetes.gracilis,Grass,5,0.0717095541732357,0.0665149686947679,0.0985453710875707,0.0717095541732357,0.0801620849184831,0.0164795867929258 +mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruceR,5,0.107672074614269,0.0972477109913009,0.118541349512236,0.104199864858387,0.107929352562419,0.0109657793464986 +mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce1,5,0.123393977309761,0.112425193396225,0.139387320231618,0.123393977309761,0.125728485214081,0.0140274122599666 +mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce2,5,0.12437831599326,0.111359493905728,0.132705413454322,0.121062001485335,0.123126831939747,0.0114011890353867 +mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce3,5,0.12437831599326,0.111359493905728,0.132705413454322,0.121062001485335,0.123126831939747,0.0114011890353867 +mite,mite,north,,,Ceratozetes.gracilis,CCWhiteSpruce4,5,0.12437831599326,0.111359493905728,0.132705413454322,0.121062001485335,0.123126831939747,0.0114011890353867 +mite,mite,north,,,Ceratozetes.gracilis,CCPineR,5,0.113773520489961,0.101859256408014,0.122211261862114,0.108797637100679,0.112569868029736,0.0104271811989201 +mite,mite,north,,,Ceratozetes.gracilis,CCPine1,5,0.116106855588166,0.100441204830365,0.123976852017442,0.108122243613567,0.113246745405846,0.0120392008920083 +mite,mite,north,,,Ceratozetes.gracilis,CCPine2,5,0.11817066960193,0.100316838150487,0.122679046365626,0.107706392899407,0.113074011687537,0.0117087853519938 +mite,mite,north,,,Ceratozetes.gracilis,CCPine3,5,0.11817066960193,0.100316838150487,0.122679046365626,0.107706392899407,0.113074011687537,0.0117087853519938 +mite,mite,north,,,Ceratozetes.gracilis,CCPine4,5,0.11817066960193,0.100316838150487,0.122679046365626,0.107706392899407,0.113074011687537,0.0117087853519938 +mite,mite,north,,,Ceratozetes.gracilis,CCDeciduousR,5,0.144899037202292,0.133976042079909,0.148502963566285,0.134759239890019,0.14193514316751,0.00733510776173594 +mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous1,5,0.173136461097876,0.161422569448153,0.176484401334677,0.159272382892999,0.169983786435827,0.00768804108229138 +mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous2,5,0.134339082107598,0.127640012945417,0.1355719650486,0.12851467723662,0.132140904595935,0.00407933337080277 +mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous3,5,0.134339082107598,0.127640012945417,0.1355719650486,0.12851467723662,0.132140904595935,0.00407933337080277 +mite,mite,north,,,Ceratozetes.gracilis,CCDeciduous4,5,0.134339082107598,0.127640012945417,0.1355719650486,0.12851467723662,0.132140904595935,0.00407933337080277 +mite,mite,north,,,Ceratozetes.gracilis,CCMixedwoodR,5,0.144899037202292,0.133976042079909,0.148502963566285,0.134759239890019,0.14193514316751,0.00733510776173594 +mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood1,5,0.173136461097876,0.161422569448153,0.176484401334677,0.159272382892999,0.169983786435827,0.00768804108229138 +mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood2,5,0.134339082107598,0.127640012945417,0.1355719650486,0.12851467723662,0.132140904595935,0.00407933337080277 +mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood3,5,0.134339082107598,0.127640012945417,0.1355719650486,0.12851467723662,0.132140904595935,0.00407933337080277 +mite,mite,north,,,Ceratozetes.gracilis,CCMixedwood4,5,0.134339082107598,0.127640012945417,0.1355719650486,0.12851467723662,0.132140904595935,0.00407933337080277 +mite,mite,north,,,Ceratozetes.gracilis,EnSeismic,5,0.0802806120357541,0.0732029866316614,0.108944026446484,0.0802806120357541,0.0889151563754509,0.0183077040123399 +mite,mite,north,,,Ceratozetes.gracilis,EnSoftLin,5,0.0877847291238477,0.0716619099530992,0.114953790660522,0.0797199425033713,0.0919192069743567,0.0218745202790536 +mite,mite,north,,,Ceratozetes.gracilis,TrSoftLin,5,0.0824456293556031,0.0689700330268259,0.109575945632792,0.0742439958268106,0.087725018747832,0.0202270595680831 +mite,mite,north,,,Ceratozetes.gracilis,HardLin,5,0.0268643924591711,0.0257899412772818,0.0304421627930103,0.0268643924591711,0.0278383582584405,0.0023610121346177 +mite,mite,north,,,Ceratozetes.gracilis,UrbInd,5,0.0514318415097621,0.0380292662597745,0.0597468130162695,0.0442950175704556,0.0497575520724983,0.0109608497443732 +mite,mite,north,,,Ceratozetes.gracilis,Wellsites,5,0.035050889042714,0.0311049144974151,0.0455477284585666,0.0328506872802035,0.0375357285513769,0.00732507152064465 +mite,mite,north,,,Ceratozetes.gracilis,Crop,5,0.0215366173604663,0.0212023183077577,0.027823845073315,0.0215366173604663,0.0237248493509573,0.00377213954135615 +mite,mite,north,,,Ceratozetes.gracilis,TameP,5,0.0350884778505926,0.0296620798510974,0.0366792367119695,0.0304807640689111,0.0335100259921961,0.00357425249741613 +mite,mite,north,,,Ceratozetes.gracilis,RoughP,5,0.0516992449980882,0.0487998406748331,0.0647307503735416,0.0516284245607066,0.0557447503800291,0.00818009586326218 +mite,mite,north,,,Trhypochthonius.tectorum,WhiteSpruce,5,0.0556561525490625,0.0510717677245686,0.0590786392356535,0.0510483651362441,0.0550945831947592,0.00398683118385017 +mite,mite,north,,,Trhypochthonius.tectorum,Pine,5,0.0594751004150133,0.0567146072015788,0.07263415395067,0.0594751004150133,0.0635901086572095,0.00817455694019514 +mite,mite,north,,,Trhypochthonius.tectorum,Deciduous,5,0.0535252270853639,0.0476609061082985,0.0610014811112496,0.0514776313631932,0.0542589538223274,0.00671799963208163 +mite,mite,north,,,Trhypochthonius.tectorum,Mixedwood,5,0.0563420244590419,0.0494241961076028,0.0610897108501066,0.0518923527010723,0.0554261228003333,0.00588626866974516 +mite,mite,north,,,Trhypochthonius.tectorum,BlackSpruce,5,0.0479250894638649,0.0425692505329721,0.053061593643466,0.0479250894638649,0.047801363444515,0.00523509405567491 +mite,mite,north,,,Trhypochthonius.tectorum,TreedFen,5,0.0408841194527538,0.0377784135790944,0.0459994038000058,0.0408841194527538,0.0415437643159498,0.00430137829845262 +mite,mite,north,,,Trhypochthonius.tectorum,TreedSwamp,5,0.0337675075759103,0.0315015742262157,0.0379398823268421,0.033440734757267,0.034577386415437,0.00328149143833793 +mite,mite,north,,,Trhypochthonius.tectorum,GraminoidFen,5,0.0407667314478653,0.0375105292015872,0.0453644606141766,0.0407667314478653,0.0412580654715362,0.00397523017374455 +mite,mite,north,,,Trhypochthonius.tectorum,ShrubbyFen,5,0.040625299041178,0.0380204987264493,0.0451305060870398,0.040625299041178,0.0413277749642994,0.00367908136762045 +mite,mite,north,,,Trhypochthonius.tectorum,ShrubbyBog,5,0.0468903066670746,0.0421032711447172,0.0516624938386451,0.0468903066670746,0.0468445466693048,0.00485242361640853 +mite,mite,north,,,Trhypochthonius.tectorum,ShrubbySwamp,5,0.0292316557779894,0.0280267417712238,0.0321894546760997,0.0286964469315836,0.0299491838822735,0.00208326484249253 +mite,mite,north,,,Trhypochthonius.tectorum,Marsh,5,0.0364031182916975,0.03246314137157,0.0387931260174801,0.0341610990357597,0.0358147412526288,0.00318818300839268 +mite,mite,north,,,Trhypochthonius.tectorum,Shrub,5,0.025223191055215,0.020275577906772,0.0300665662767551,0.0282145223452054,0.0251788966856238,0.00483753272341203 +mite,mite,north,,,Trhypochthonius.tectorum,Grass,5,0.0390477719581986,0.0270406150928457,0.0418778229533938,0.0390477719581986,0.0356863738057074,0.00785398705488737 +mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruceR,5,0.0467252252362432,0.0453107339176826,0.0515629452365753,0.0467252252362432,0.0479127175322202,0.00344675695471763 +mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce1,5,0.0439503346126213,0.0425636157475749,0.0475181466638955,0.0423468795516491,0.0446340028664967,0.0029027760022658 +mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce2,5,0.0443841971990541,0.0430576800412776,0.0470857489800855,0.043016752346317,0.0447823320518329,0.00228950512145567 +mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce3,5,0.0443841971990541,0.0430576800412776,0.0470857489800855,0.043016752346317,0.0447823320518329,0.00228950512145567 +mite,mite,north,,,Trhypochthonius.tectorum,CCWhiteSpruce4,5,0.0443841971990541,0.0430576800412776,0.0470857489800855,0.043016752346317,0.0447823320518329,0.00228950512145567 +mite,mite,north,,,Trhypochthonius.tectorum,CCPineR,5,0.0526683392262,0.0494908781950819,0.0603392406871664,0.0518112255096306,0.0542593278877188,0.0059740696863024 +mite,mite,north,,,Trhypochthonius.tectorum,CCPine1,5,0.0468991106936687,0.0446094454502591,0.0499294662723947,0.0447974822354535,0.0471891769898958,0.00263347402531829 +mite,mite,north,,,Trhypochthonius.tectorum,CCPine2,5,0.0470893805229334,0.0447496174892123,0.0504045194737155,0.0449930704020798,0.0474865986654937,0.00280934882782067 +mite,mite,north,,,Trhypochthonius.tectorum,CCPine3,5,0.0470893805229334,0.0447496174892123,0.0504045194737155,0.0449930704020798,0.0474865986654937,0.00280934882782067 +mite,mite,north,,,Trhypochthonius.tectorum,CCPine4,5,0.0470893805229334,0.0447496174892123,0.0504045194737155,0.0449930704020798,0.0474865986654937,0.00280934882782067 +mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduousR,5,0.0514484824942495,0.0469845195905157,0.052906753720658,0.0451521693584135,0.050407563825017,0.00321163341168778 +mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous1,5,0.0404798408803705,0.0375927192417578,0.0440082227599156,0.0368681428962799,0.0407762801539658,0.00315994871488567 +mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous2,5,0.0425578952838125,0.0405173081997961,0.0458365008762514,0.039821927948205,0.0429957451821641,0.00274287276636226 +mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous3,5,0.0425578952838125,0.0405173081997961,0.0458365008762514,0.039821927948205,0.0429957451821641,0.00274287276636226 +mite,mite,north,,,Trhypochthonius.tectorum,CCDeciduous4,5,0.0425578952838125,0.0405173081997961,0.0458365008762514,0.039821927948205,0.0429957451821641,0.00274287276636226 +mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwoodR,5,0.0514484824942495,0.0469845195905157,0.052906753720658,0.0451521693584135,0.050407563825017,0.00321163341168778 +mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood1,5,0.0404798408803705,0.0375927192417578,0.0440082227599156,0.0368681428962799,0.0407762801539658,0.00315994871488567 +mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood2,5,0.0425578952838125,0.0405173081997961,0.0458365008762514,0.039821927948205,0.0429957451821641,0.00274287276636226 +mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood3,5,0.0425578952838125,0.0405173081997961,0.0458365008762514,0.039821927948205,0.0429957451821641,0.00274287276636226 +mite,mite,north,,,Trhypochthonius.tectorum,CCMixedwood4,5,0.0425578952838125,0.0405173081997961,0.0458365008762514,0.039821927948205,0.0429957451821641,0.00274287276636226 +mite,mite,north,,,Trhypochthonius.tectorum,EnSeismic,5,0.0522085190169312,0.0252569549779169,0.0665538824210485,0.0544387764396551,0.0480639407088111,0.0242917296488739 +mite,mite,north,,,Trhypochthonius.tectorum,EnSoftLin,5,0.0357984916598279,0.0190297380136641,0.0645302317518731,0.0402530079505476,0.0399474391546608,0.0257997073771445 +mite,mite,north,,,Trhypochthonius.tectorum,TrSoftLin,5,0.0330350845777108,0.0153319420477188,0.0512108000402237,0.0363880404889003,0.0331889308199334,0.0196952425672342 +mite,mite,north,,,Trhypochthonius.tectorum,HardLin,5,0.0243958652679851,0.0239704518035738,0.0279997624131438,0.0243958652679851,0.0256743635254181,0.00210475588272506 +mite,mite,north,,,Trhypochthonius.tectorum,UrbInd,5,0.0191105703106928,0.0167840749551519,0.0272407405128375,0.0191105703106928,0.0212349933310677,0.00546676273320779 +mite,mite,north,,,Trhypochthonius.tectorum,Wellsites,5,0.023351034935016,0.021158057868554,0.03223617749299,0.023351034935016,0.0259815706015033,0.00569106451947394 +mite,mite,north,,,Trhypochthonius.tectorum,Crop,5,0.015382693809727,0.0151069200337959,0.016892523752058,0.0152304430995811,0.0158155351878053,0.00103439159129019 +mite,mite,north,,,Trhypochthonius.tectorum,TameP,5,0.0258915433874115,0.0222945289246262,0.0264680931726066,0.024941743213498,0.0248462640710173,0.00249172002079151 +mite,mite,north,,,Trhypochthonius.tectorum,RoughP,5,0.0328180516103049,0.0322239355913061,0.0387542589134784,0.0375661766298358,0.0348949895183175,0.00342630396737567 +mite,mite,south,,,Ceratozetes.gracilis,Loamy,5,0.0218423245463604,0.0173672203176517,0.0230295231243844,0.0218423245463604,0.020747214981276,0.00349328573027265 +mite,mite,south,,,Ceratozetes.gracilis,SandyLoam,5,0.0188962100537126,0.0162686755399601,0.0200379292106758,0.0185871549772747,0.0184312571346189,0.00217691199563813 +mite,mite,south,,,Ceratozetes.gracilis,ClaySub,5,0.0190796631779778,0.0156078918819073,0.0210172713505711,0.0190796631779778,0.018604719484685,0.00298067726778378 +mite,mite,south,,,Ceratozetes.gracilis,RapidDrain,5,0.00969791273666386,0.00942196936388417,0.0112386251640146,0.0110451655878437,0.010200805407554,0.000934771929061484 +mite,mite,south,,,Ceratozetes.gracilis,Blowout,5,0.0106020081675796,0.00863605999566094,0.0123463313279677,0.0108663421303504,0.0105398831320641,0.00211371743591744 +mite,mite,south,,,Ceratozetes.gracilis,ThinBreak,5,0.00878234749614848,0.00798269496694178,0.0107794669342902,0.00996372938352331,0.00924540029110673,0.00143456006902455 +mite,mite,south,,,Ceratozetes.gracilis,Other,5,0.0042686164608738,0.00063572314444851,0.00731890391266918,0.0042686164608738,0.00407391061994681,0.00329148805533948 +mite,mite,south,,,Ceratozetes.gracilis,EnSeismic,5,0.0128342993205689,0.00852724915739246,0.0633937793424426,0.0128342993205689,0.0301196175594858,0.0296767966386737 +mite,mite,south,,,Ceratozetes.gracilis,EnSoftLin,5,0.0100953485593809,0.00859879515579537,0.0518084711684424,0.0100953485593809,0.0252270354093779,0.0237484297671399 +mite,mite,south,,,Ceratozetes.gracilis,TrSoftLin,5,0.00945493320863686,0.00758629346095882,0.0565822367112004,0.00945493320863686,0.0263834449674863,0.0270499023163353 +mite,mite,south,,,Ceratozetes.gracilis,HardLin,5,0.0012818592428196,0.00122480067982412,0.00171071495716722,0.00176154072489266,0.00142873179782241,0.000252311336064879 +mite,mite,south,,,Ceratozetes.gracilis,UrbInd,5,0.00425941571595646,0.00295877473501209,0.00595057748445942,0.00425941571595646,0.00440787198450415,0.00153151605374925 +mite,mite,south,,,Ceratozetes.gracilis,Wellsites,5,0.00295291600474109,0.0021973086508854,0.00411443751717638,0.00295291600474109,0.00310781362870248,0.000980789777054813 +mite,mite,south,,,Ceratozetes.gracilis,Crop,5,0.00116588959329944,0.00104101704994527,0.00133284725072961,0.00116588959329944,0.00117831505621224,0.000167208502276051 +mite,mite,south,,,Ceratozetes.gracilis,TameP,5,0.0024464095231432,0.00214847243566944,0.00305858273470107,0.0023921447017999,0.00257807014953875,0.000460747234171761 +mite,mite,south,,,Ceratozetes.gracilis,RoughP,5,0.0023839015453601,0.00176469662219973,0.00260842275480983,0.00218127936434137,0.00224033670141993,0.000466899834329463 +mite,mite,south,,,Trhypochthonius.tectorum,Loamy,5,0.0499778174612043,0.0477160469108668,0.0521891286113536,0.0467852744100426,0.0500400973814781,0.00226406307817558 +mite,mite,south,,,Trhypochthonius.tectorum,SandyLoam,5,0.0427437044233035,0.0388352222189595,0.0446878887454315,0.0397630370091323,0.0419370284087006,0.00292844495366087 +mite,mite,south,,,Trhypochthonius.tectorum,ClaySub,5,0.0448532047061975,0.0434266302673582,0.0480060341777117,0.0429142869672478,0.0454925438914735,0.00235630079412914 +mite,mite,south,,,Trhypochthonius.tectorum,RapidDrain,5,0.0431738225185761,0.036600607606764,0.0449491670506471,0.0431738225185761,0.0415360440333195,0.0048551707088825 +mite,mite,south,,,Trhypochthonius.tectorum,Blowout,5,0.0612889561023144,0.0491998328469309,0.0746776432481998,0.0612889561023144,0.0622915416103894,0.013487238751435 +mite,mite,south,,,Trhypochthonius.tectorum,ThinBreak,5,0.0472879860660164,0.037920270451541,0.0523574915662019,0.0472879860660164,0.0458133113776339,0.00776225914513275 +mite,mite,south,,,Trhypochthonius.tectorum,Other,5,0.0366771544480599,0.0228268207831538,0.0785517999620398,0.0478734329425522,0.0465964414370044,0.0315527855316975 +mite,mite,south,,,Trhypochthonius.tectorum,EnSeismic,5,0.005718045734362,0.000756250016234319,0.00887832731960815,0.00888461717648373,0.00506648764138872,0.00403707236060029 +mite,mite,south,,,Trhypochthonius.tectorum,EnSoftLin,5,0.00350908933263554,0.000310987183741067,0.00741715216602833,0.00723292387135889,0.0038111174289397,0.00351580714176629 +mite,mite,south,,,Trhypochthonius.tectorum,TrSoftLin,5,0.00296547128398102,0.000271010557576361,0.00513825945876903,0.00426948908637977,0.00272565881367204,0.0023988556977813 +mite,mite,south,,,Trhypochthonius.tectorum,HardLin,5,0.0352820429856263,0.0249011898739522,0.0517606271764086,0.0281443034455901,0.0370353971906418,0.0145923801432061 +mite,mite,south,,,Trhypochthonius.tectorum,UrbInd,5,0.0197564607327612,0.0161346626233351,0.0233198049521763,0.0197564607327612,0.0196905028450629,0.00383354217797874 +mite,mite,south,,,Trhypochthonius.tectorum,Wellsites,5,0.0218127811081771,0.0174582402547921,0.0273373033988181,0.0219652759405907,0.0220697701960811,0.00550369496809574 +mite,mite,south,,,Trhypochthonius.tectorum,Crop,5,0.0174842052478879,0.0146182157223179,0.0189255858640754,0.0177171723605232,0.0168444896471002,0.00219178225580625 +mite,mite,south,,,Trhypochthonius.tectorum,TameP,5,0.0334374326549006,0.0271748172003896,0.0414968532162421,0.0334374326549006,0.0341507630943171,0.00734564079431658 +mite,mite,south,,,Trhypochthonius.tectorum,RoughP,5,0.0330917206876311,0.0281248674259134,0.0375615466118284,0.0330917206876311,0.0330472057370728,0.00502984292008219 +vascular_plant,vascular_plant,north,,,Galium.boreale,WhiteSpruce,5,0.136563367302205,0.119462518901444,0.14703521115999,0.128707314176715,0.134438167919802,0.0140790776061126 +vascular_plant,vascular_plant,north,,,Galium.boreale,Pine,5,0.116853425497967,0.107796441903968,0.124081762452193,0.108967866096832,0.115733912410419,0.00857502539967135 +vascular_plant,vascular_plant,north,,,Galium.boreale,Deciduous,5,0.25887511408307,0.239156447325757,0.263482889907708,0.243876909457892,0.252938955637841,0.0124338313554241 +vascular_plant,vascular_plant,north,,,Galium.boreale,Mixedwood,5,0.193041971414329,0.179396957180547,0.201982078860589,0.180205162477876,0.190818610539326,0.0113637588317406 +vascular_plant,vascular_plant,north,,,Galium.boreale,BlackSpruce,5,0.0197313184843524,0.0186615095379396,0.0216346630739543,0.0190889513235295,0.019992432400775,0.00162296400530185 +vascular_plant,vascular_plant,north,,,Galium.boreale,TreedFen,5,0.0190279322211574,0.0171394699429018,0.0204803027951359,0.0184868712710714,0.0188628976679575,0.00180798674115567 +vascular_plant,vascular_plant,north,,,Galium.boreale,TreedSwamp,5,0.0537157382799687,0.0494547113304226,0.0594834887289069,0.0502065849301497,0.0541128640771137,0.00517780601239197 +vascular_plant,vascular_plant,north,,,Galium.boreale,GraminoidFen,5,0.0207928426181494,0.0196811431002025,0.0226503378120183,0.0207928426181494,0.0210542335971933,0.0015438256424816 +vascular_plant,vascular_plant,north,,,Galium.boreale,ShrubbyFen,5,0.0201391073392683,0.0190935576196826,0.0221089799761179,0.0201391073392683,0.0204418135172878,0.00167612468006209 +vascular_plant,vascular_plant,north,,,Galium.boreale,ShrubbyBog,5,0.0199495272991526,0.0188220126503618,0.0218233356490728,0.0193388406568705,0.0201794222265195,0.00164466018474895 +vascular_plant,vascular_plant,north,,,Galium.boreale,ShrubbySwamp,5,0.045688982509881,0.042171496476318,0.0571441122739526,0.045688982509881,0.0487114824451972,0.00788260483962487 +vascular_plant,vascular_plant,north,,,Galium.boreale,Marsh,5,0.041347185000327,0.0369944475953885,0.0480790679841081,0.041347185000327,0.0422373156592065,0.00549952228800232 +vascular_plant,vascular_plant,north,,,Galium.boreale,Shrub,5,0.189304761120091,0.175516236345066,0.241103793907795,0.189304761120091,0.204712579589746,0.033439991322378 +vascular_plant,vascular_plant,north,,,Galium.boreale,Grass,5,0.214959292683282,0.180869477747652,0.249359372444126,0.191616359545112,0.215525986480311,0.0336975831668747 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruceR,5,0.154137545244941,0.132581336610888,0.172927485618722,0.143043678232451,0.153186792800721,0.0202008044704786 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce1,5,0.163315085825216,0.141002273364349,0.18905935770425,0.158059058434557,0.165296954029114,0.0246109466321505 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce2,5,0.160436563203294,0.14069222929203,0.183967841364971,0.148743886710094,0.161992104476718,0.021365400368824 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce3,5,0.160436563203294,0.14069222929203,0.183967841364971,0.148743886710094,0.161992104476718,0.021365400368824 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCWhiteSpruce4,5,0.160436563203294,0.14069222929203,0.183967841364971,0.148743886710094,0.161992104476718,0.021365400368824 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCPineR,5,0.143905674843488,0.117440734273828,0.157542491898074,0.126516675922557,0.13912009366266,0.0200221797521959 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine1,5,0.135255973929374,0.114079157254064,0.142460383178462,0.123115076680262,0.129792039810823,0.0148449152061657 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine2,5,0.134477552857653,0.11341349299191,0.141401321460665,0.12088426096238,0.128884997779635,0.0144383340887116 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine3,5,0.134477552857653,0.11341349299191,0.141401321460665,0.12088426096238,0.128884997779635,0.0144383340887116 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCPine4,5,0.134477552857653,0.11341349299191,0.141401321460665,0.12088426096238,0.128884997779635,0.0144383340887116 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduousR,5,0.208696634917917,0.175761239502858,0.219246203164378,0.186398225011703,0.200187968090386,0.022106120959872 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous1,5,0.256400751129383,0.223605802344556,0.280481606679469,0.232409451432954,0.253034900240866,0.0279823632616457 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous2,5,0.196550402723055,0.177363867788528,0.223430883577534,0.189116187021577,0.199874753985579,0.0230468937687924 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous3,5,0.196550402723055,0.177363867788528,0.223430883577534,0.189116187021577,0.199874753985579,0.0230468937687924 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCDeciduous4,5,0.196550402723055,0.177363867788528,0.223430883577534,0.189116187021577,0.199874753985579,0.0230468937687924 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwoodR,5,0.208696634917917,0.175761239502858,0.219246203164378,0.186398225011703,0.200187968090386,0.022106120959872 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood1,5,0.256400751129383,0.223605802344556,0.280481606679469,0.232409451432954,0.253034900240866,0.0279823632616457 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood2,5,0.196550402723055,0.177363867788528,0.223430883577534,0.189116187021577,0.199874753985579,0.0230468937687924 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood3,5,0.196550402723055,0.177363867788528,0.223430883577534,0.189116187021577,0.199874753985579,0.0230468937687924 +vascular_plant,vascular_plant,north,,,Galium.boreale,CCMixedwood4,5,0.196550402723055,0.177363867788528,0.223430883577534,0.189116187021577,0.199874753985579,0.0230468937687924 +vascular_plant,vascular_plant,north,,,Galium.boreale,EnSeismic,5,0.0675357940232228,0.0536641840810974,0.0782448772200584,0.0666893133709304,0.067002736116644,0.0134984598966857 +vascular_plant,vascular_plant,north,,,Galium.boreale,EnSoftLin,5,0.0666450469830431,0.0514688065567067,0.0769360972499699,0.0632085789748528,0.0651110464552629,0.0136601040156264 +vascular_plant,vascular_plant,north,,,Galium.boreale,TrSoftLin,5,0.0681813236346331,0.0554454641142448,0.0796107459686051,0.0681813236346331,0.0680202870748694,0.0125432834976175 +vascular_plant,vascular_plant,north,,,Galium.boreale,HardLin,5,0.032772954964339,0.0254952937216265,0.0427628821147054,0.0304014203144609,0.0337542163171502,0.00906837104577133 +vascular_plant,vascular_plant,north,,,Galium.boreale,UrbInd,5,0.032891069156295,0.0290596861735981,0.0426826279515852,0.0323859521239614,0.0350214724592512,0.00762900448359572 +vascular_plant,vascular_plant,north,,,Galium.boreale,Wellsites,5,0.0313114303488669,0.0258224080114288,0.0445788771357667,0.0313114303488669,0.03407323779985,0.0104681365081302 +vascular_plant,vascular_plant,north,,,Galium.boreale,Crop,5,0.0114819275038514,0.00962690543049514,0.0155602283722968,0.0114819275038514,0.0123694186188488,0.00300450571509112 +vascular_plant,vascular_plant,north,,,Galium.boreale,TameP,5,0.0336485279117461,0.0256580113642758,0.0375637064974261,0.0283837215953415,0.0320336236319229,0.00600032864643425 +vascular_plant,vascular_plant,north,,,Galium.boreale,RoughP,5,0.0579560450257088,0.045965364331808,0.0773913737984615,0.0532646872909717,0.0606155261777185,0.0164348500854686 +vascular_plant,vascular_plant,north,,,Vicia.americana,WhiteSpruce,5,0.0717211911881468,0.0649940227788211,0.0757806047387571,0.0717211911881468,0.0707611702697563,0.00560071424718983 +vascular_plant,vascular_plant,north,,,Vicia.americana,Pine,5,0.0717443897992296,0.0637388171549185,0.0792558735029598,0.0717443897992296,0.0716467451517877,0.00773413521691436 +vascular_plant,vascular_plant,north,,,Vicia.americana,Deciduous,5,0.174528296976248,0.164090538301261,0.183795585911188,0.174528296976248,0.173876959799232,0.0107120597059939 +vascular_plant,vascular_plant,north,,,Vicia.americana,Mixedwood,5,0.12738407433249,0.118327966346565,0.12914316163785,0.123903841395087,0.124825781574101,0.00609464551627694 +vascular_plant,vascular_plant,north,,,Vicia.americana,BlackSpruce,5,0.0108602686526196,0.00947682296052838,0.0111197345835797,0.0110635169948055,0.0104434018004056,0.000868359893238048 +vascular_plant,vascular_plant,north,,,Vicia.americana,TreedFen,5,0.0104889884001634,0.00918775668655501,0.0114259715545775,0.0111781283427943,0.0104110091403938,0.00125060799360988 +vascular_plant,vascular_plant,north,,,Vicia.americana,TreedSwamp,5,0.0474586407623415,0.0434617027113533,0.0573459768855838,0.0505384149026876,0.0495081405966026,0.00757780069669055 +vascular_plant,vascular_plant,north,,,Vicia.americana,GraminoidFen,5,0.012380186783363,0.0106055968142056,0.0129729819618124,0.0128602111397556,0.0119986050213911,0.00138377521512343 +vascular_plant,vascular_plant,north,,,Vicia.americana,ShrubbyFen,5,0.0122885356189932,0.0107844229705085,0.0129771366500186,0.0127117113440904,0.0120371989894358,0.001277638072515 +vascular_plant,vascular_plant,north,,,Vicia.americana,ShrubbyBog,5,0.0111679104948312,0.00984870753108598,0.01144241264329,0.0114521553910913,0.0107985890482843,0.000879046887316585 +vascular_plant,vascular_plant,north,,,Vicia.americana,ShrubbySwamp,5,0.0442619565088811,0.039395611852956,0.0514550187832082,0.0467803608934761,0.045111534045516,0.00637251444497983 +vascular_plant,vascular_plant,north,,,Vicia.americana,Marsh,5,0.0395269377197916,0.0379010981822006,0.0480740857526984,0.0426749909362641,0.0419761840756894,0.00575798827386886 +vascular_plant,vascular_plant,north,,,Vicia.americana,Shrub,5,0.124413496826489,0.11630879041929,0.148831794626625,0.129561071424494,0.129997351609217,0.0187159161627647 +vascular_plant,vascular_plant,north,,,Vicia.americana,Grass,5,0.140899561631048,0.132647046765579,0.149765706126522,0.140899561631048,0.141003833991578,0.00975138040532848 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruceR,5,0.106333838059199,0.10563563998252,0.1113390336656,0.113324612808195,0.107878609308115,0.00324098638860528 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce1,5,0.132673132079881,0.131014835763159,0.139245186106205,0.140904763899433,0.134539838012183,0.00426782271680661 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce2,5,0.122518637692463,0.118113328719225,0.134306251834235,0.129378591587472,0.125179320953689,0.0083140378258789 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce3,5,0.122518637692463,0.118113328719225,0.134306251834235,0.129378591587472,0.125179320953689,0.0083140378258789 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCWhiteSpruce4,5,0.122518637692463,0.118113328719225,0.134306251834235,0.129378591587472,0.125179320953689,0.0083140378258789 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCPineR,5,0.108086061678854,0.105116454412193,0.111847166658453,0.113106276644051,0.108442371914164,0.00352518043702876 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine1,5,0.1122188310588,0.109732769391169,0.12258810268514,0.121735348725543,0.115445950654567,0.00657248417948193 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine2,5,0.109183815724588,0.106720994046657,0.120537973445125,0.118682344001148,0.112706633163643,0.00705791950102736 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine3,5,0.109183815724588,0.106720994046657,0.120537973445125,0.118682344001148,0.112706633163643,0.00705791950102736 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCPine4,5,0.109183815724588,0.106720994046657,0.120537973445125,0.118682344001148,0.112706633163643,0.00705791950102736 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduousR,5,0.145906249437239,0.140931022371577,0.15495341081461,0.151623580611421,0.147413609979929,0.00700112483338789 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous1,5,0.180166516850587,0.168695392463167,0.188786472181105,0.183212683986236,0.178869118903198,0.010081669607544 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous2,5,0.156982604814944,0.145251669372505,0.15939063660912,0.156982604814944,0.153284371506591,0.00726664394733218 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous3,5,0.156982604814944,0.145251669372505,0.15939063660912,0.156982604814944,0.153284371506591,0.00726664394733218 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCDeciduous4,5,0.156982604814944,0.145251669372505,0.15939063660912,0.156982604814944,0.153284371506591,0.00726664394733218 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwoodR,5,0.145906249437239,0.140931022371577,0.15495341081461,0.151623580611421,0.147413609979929,0.00700112483338789 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood1,5,0.180166516850587,0.168695392463167,0.188786472181105,0.183212683986236,0.178869118903198,0.010081669607544 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood2,5,0.156982604814944,0.145251669372505,0.15939063660912,0.156982604814944,0.153284371506591,0.00726664394733218 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood3,5,0.156982604814944,0.145251669372505,0.15939063660912,0.156982604814944,0.153284371506591,0.00726664394733218 +vascular_plant,vascular_plant,north,,,Vicia.americana,CCMixedwood4,5,0.156982604814944,0.145251669372505,0.15939063660912,0.156982604814944,0.153284371506591,0.00726664394733218 +vascular_plant,vascular_plant,north,,,Vicia.americana,EnSeismic,5,0.216656015711896,0.168139707348619,0.254376282862556,0.216656015711896,0.213098910528715,0.0452535455491439 +vascular_plant,vascular_plant,north,,,Vicia.americana,EnSoftLin,5,0.240353254005159,0.182193409855272,0.287354412958843,0.240353254005159,0.235885270025637,0.0525043948865044 +vascular_plant,vascular_plant,north,,,Vicia.americana,TrSoftLin,5,0.185413846451138,0.143618351581936,0.21612482061455,0.185413846451138,0.182132121492675,0.03663912522577 +vascular_plant,vascular_plant,north,,,Vicia.americana,HardLin,5,0.0510142064754805,0.0476995560327749,0.0534135994986585,0.0494242045429297,0.0506844765474707,0.00289619110670257 +vascular_plant,vascular_plant,north,,,Vicia.americana,UrbInd,5,0.060270971424988,0.0527176972963101,0.0669155114807268,0.0570164101210413,0.0598116387590278,0.00755833843006598 +vascular_plant,vascular_plant,north,,,Vicia.americana,Wellsites,5,0.0495816235777512,0.045261299115898,0.0675981711099802,0.0583800066861835,0.0547080768995733,0.0120228518497499 +vascular_plant,vascular_plant,north,,,Vicia.americana,Crop,5,0.0198021833360757,0.0187130492427477,0.0215978803800823,0.020499648487122,0.0200793479234006,0.00155071434603584 +vascular_plant,vascular_plant,north,,,Vicia.americana,TameP,5,0.0435685547091363,0.0402056228771878,0.0533172713621298,0.0435685547091363,0.0457946494684893,0.00709067313037913 +vascular_plant,vascular_plant,north,,,Vicia.americana,RoughP,5,0.0428632794956036,0.0372440489603054,0.0534178816037923,0.0428632794956036,0.0444803287325393,0.00836089560838824 +vascular_plant,vascular_plant,south,,,Galium.boreale,Loamy,5,0.128653205010673,0.114611972972335,0.130784674892184,0.129566548831882,0.123883607184517,0.00838623611422754 +vascular_plant,vascular_plant,south,,,Galium.boreale,SandyLoam,5,0.0836110810472021,0.0746816948024742,0.0894208141830331,0.0846341790254643,0.0821153995584725,0.00751049498598007 +vascular_plant,vascular_plant,south,,,Galium.boreale,ClaySub,5,0.101500964583409,0.0940741502041846,0.108970943759895,0.106582920663178,0.101462761523999,0.00731517240310769 +vascular_plant,vascular_plant,south,,,Galium.boreale,RapidDrain,5,0.0388994289485226,0.0346245997860596,0.0529303847658474,0.0448318785090138,0.0424505639887575,0.00987053097134808 +vascular_plant,vascular_plant,south,,,Galium.boreale,Blowout,5,0.0506231282331206,0.0397681707601058,0.0574808564556098,0.0506231282331206,0.0488032044086913,0.00890397864448909 +vascular_plant,vascular_plant,south,,,Galium.boreale,ThinBreak,5,0.0479802424154928,0.0420075163241584,0.0517461800601525,0.051022562219615,0.0472278000794808,0.00488658793646957 +vascular_plant,vascular_plant,south,,,Galium.boreale,Other,5,0.0106061234511555,0.00720081589340935,0.0217479373094132,0.0177197087652051,0.0136291572357968,0.00750330686270611 +vascular_plant,vascular_plant,south,,,Galium.boreale,EnSeismic,5,0.0472125133205467,0.0295924639744709,0.110125197726374,0.0287456404184259,0.0636144790463627,0.0421297958204094 +vascular_plant,vascular_plant,south,,,Galium.boreale,EnSoftLin,5,0.0457108677001631,0.0342927417032321,0.133999583987908,0.0329811808897455,0.0738711315094049,0.0544940604720431 +vascular_plant,vascular_plant,south,,,Galium.boreale,TrSoftLin,5,0.0254268182100485,0.0116038912895437,0.0640062980763588,0.0143164876649795,0.0337396409014619,0.0288740328272036 +vascular_plant,vascular_plant,south,,,Galium.boreale,HardLin,5,0.0032621931802875,0.00285851385150083,0.00701707647763527,0.00538608376568717,0.00451424153984983,0.00226371892322936 +vascular_plant,vascular_plant,south,,,Galium.boreale,UrbInd,5,0.00523304185300579,0.00516680867336443,0.00698867393616868,0.00519980939835304,0.00583554776095676,0.00110498090685346 +vascular_plant,vascular_plant,south,,,Galium.boreale,Wellsites,5,0.00835585771334364,0.00699275850468526,0.00923375703992824,0.00769427442003421,0.0081731242777985,0.00114681019974826 +vascular_plant,vascular_plant,south,,,Galium.boreale,Crop,5,0.00170386065696764,0.00159546521345581,0.00280933357726183,0.00225132683231577,0.00206801467544986,0.00067868464225799 +vascular_plant,vascular_plant,south,,,Galium.boreale,TameP,5,0.00370735476367147,0.00294261667373477,0.00558659216344689,0.00460921237816997,0.00410416049108617,0.00137496323633074 +vascular_plant,vascular_plant,south,,,Galium.boreale,RoughP,5,0.00542654337673869,0.00450815448744484,0.00938121797095186,0.00706698519527935,0.00652782936700246,0.00267894412351735 +vascular_plant,vascular_plant,south,,,Vicia.americana,Loamy,5,0.280824609747584,0.267644583576923,0.289709776497706,0.273848614363572,0.279520051194194,0.0111565423059792 +vascular_plant,vascular_plant,south,,,Vicia.americana,SandyLoam,5,0.243407150088342,0.234204092076879,0.250601947319584,0.239431294773893,0.242922321341985,0.00832583255140513 +vascular_plant,vascular_plant,south,,,Vicia.americana,ClaySub,5,0.29707235668037,0.282488985824439,0.305118529233993,0.291486932950625,0.294780505613319,0.0118392065552878 +vascular_plant,vascular_plant,south,,,Vicia.americana,RapidDrain,5,0.149586849572318,0.132500335286096,0.175603735182626,0.149586849572318,0.152479085699985,0.0216357444325811 +vascular_plant,vascular_plant,south,,,Vicia.americana,Blowout,5,0.106950650814662,0.0907039605371348,0.121336311234738,0.103869081093715,0.106769891695465,0.0160956019903277 +vascular_plant,vascular_plant,south,,,Vicia.americana,ThinBreak,5,0.165570611241508,0.152106899610986,0.186190099937036,0.165570611241508,0.167794270266068,0.0186214443757594 +vascular_plant,vascular_plant,south,,,Vicia.americana,Other,5,0.102651600983928,0.0624149706900878,0.11235472915199,0.102651600983928,0.0922572898504469,0.0286236891835733 +vascular_plant,vascular_plant,south,,,Vicia.americana,EnSeismic,5,0.0987770601076429,0.0590846473435492,0.125153182170927,0.142317281363727,0.0937633038233823,0.0369262953861683 +vascular_plant,vascular_plant,south,,,Vicia.americana,EnSoftLin,5,0.124641821593195,0.0681868022186765,0.173426846411391,0.184942717247886,0.121843755999216,0.0520061572176103 +vascular_plant,vascular_plant,south,,,Vicia.americana,TrSoftLin,5,0.0632469144327385,0.0350786082680709,0.083335221572322,0.0865561569046063,0.0607365434283008,0.0244516505628151 +vascular_plant,vascular_plant,south,,,Vicia.americana,HardLin,5,0.034768741467538,0.0317254788925045,0.0411641044703837,0.0319213954295495,0.0358461107697019,0.00503353926558842 +vascular_plant,vascular_plant,south,,,Vicia.americana,UrbInd,5,0.0317815932567955,0.0271544908564896,0.0356957214790492,0.0250464912812154,0.0316935547923611,0.00440557843195001 +vascular_plant,vascular_plant,south,,,Vicia.americana,Wellsites,5,0.0341400292126126,0.0279864934648464,0.0423488240839157,0.0262553863998158,0.034854112138194,0.00723959324487174 +vascular_plant,vascular_plant,south,,,Vicia.americana,Crop,5,0.0239011853373428,0.0220577047645298,0.0264567603480559,0.0226673334870154,0.0241526345182289,0.00219200225599506 +vascular_plant,vascular_plant,south,,,Vicia.americana,TameP,5,0.0312372001895896,0.0292297510784975,0.0351771559180196,0.0306301444015498,0.0319120315749738,0.00324668537783287 +vascular_plant,vascular_plant,south,,,Vicia.americana,RoughP,5,0.0374123655632768,0.0359902090243626,0.0432584803569596,0.0374123655632768,0.0388877931026711,0.00439952763870878 diff --git a/3_output/exp_000_parity_v2/tables/metric_summary.csv b/3_output/exp_000_parity_v2/tables/metric_summary.csv new file mode 100644 index 0000000..546c2e7 --- /dev/null +++ b/3_output/exp_000_parity_v2/tables/metric_summary.csv @@ -0,0 +1,617 @@ +taxon,run,region,season,part,species,metric,n,median,p10,p90,boot1,mean,sd +bird,bird,north,,,AMRO,insample_auc,5,0.72487649207557,0.722489112963132,0.72576145123834,0.721701661835893,0.724313916200942,0.00170956352292163 +bird,bird,north,,,AMRO,insample_deviance_explained,5,0.142215080261758,0.140707166105981,0.144363142127984,0.140587647159979,0.142358220452553,0.00199530922315655 +bird,bird,north,,,AMRO,insample_rmse,5,0.663619993960517,0.661624845419777,0.664719637388853,0.664239276180889,0.663325410909454,0.00165768430943888 +bird,bird,north,,,AMRO,insample_spearman,5,0.344389309730045,0.340479678130316,0.345510088540595,0.339249301212572,0.343324801699925,0.00266479191004938 +bird,bird,north,,,AMRO,insample_calibration_slope,5,0.80440117768677,0.799100431621395,0.810804150827482,0.80440117768677,0.805142929671317,0.00621763816210709 +bird,bird,north,,,AMRO,insample_prevalence,5,0.251486631016043,0.251004373826971,0.252433263182893,0.250861017819325,0.251649276245993,0.000745639638422784 +bird,bird,north,,,AMRO,insample_n,5,46747,46745.2,46750,46747,46747.6,2.50998007960223 +bird,bird,north,,,AMRO,oob_auc,5,0.730373137296335,0.729897207197475,0.730684827423547,0.730766733254682,0.730315896538717,0.000399387356506946 +bird,bird,north,,,AMRO,oob_deviance_explained,5,0.151664799728976,0.150795650809459,0.152520757577584,0.152754178062373,0.151645303910227,0.000851367053496551 +bird,bird,north,,,AMRO,oob_rmse,5,0.658090400254619,0.657748490410106,0.658646272283023,0.657851304309638,0.658152604633444,0.000488187377741323 +bird,bird,north,,,AMRO,oob_spearman,5,0.348000943732488,0.347176086570868,0.348405542162744,0.348509330988823,0.34783832412029,0.000612352651071532 +bird,bird,north,,,AMRO,oob_calibration_slope,5,0.878884682385081,0.857978242744613,0.881378788597934,0.881696624797909,0.871660692760926,0.0122350948521806 +bird,bird,north,,,AMRO,oob_prevalence,5,0.241010939026539,0.240656718532255,0.241191818078906,0.241245385459292,0.240950250724789,0.000279167052473422 +bird,bird,north,,,AMRO,oob_n,5,124877,124874,124878.8,124877,124876.4,2.50998007960223 +bird,bird,north,,,YEWA,insample_auc,5,0.778635633427003,0.778333348933502,0.779726988023268,0.779841092447633,0.778948847840918,0.000705556804087617 +bird,bird,north,,,YEWA,insample_deviance_explained,5,0.259141214360432,0.25548753680516,0.260976441286628,0.259141214360432,0.258564177416315,0.00302380870747948 +bird,bird,north,,,YEWA,insample_rmse,5,0.547361440801496,0.544308917361954,0.551849139043791,0.547158394049375,0.547972539003203,0.00399109094044317 +bird,bird,north,,,YEWA,insample_spearman,5,0.315565876581618,0.314186701701599,0.31608982965666,0.316093683296469,0.315273234600625,0.00100534988197753 +bird,bird,north,,,YEWA,insample_calibration_slope,5,0.705708332778131,0.69321277112837,0.712055437422832,0.716264166431109,0.703225661526711,0.009932019727973 +bird,bird,north,,,YEWA,insample_prevalence,5,0.118296361263824,0.117706951871658,0.119214980837802,0.118296361263824,0.118418937588893,0.00074585019883292 +bird,bird,north,,,YEWA,insample_n,5,46747,46745.2,46750,46747,46747.6,2.50998007960223 +bird,bird,north,,,YEWA,oob_auc,5,0.728595786591222,0.728230136724689,0.73005150345856,0.730809600284142,0.728967653050156,0.00107004022194788 +bird,bird,north,,,YEWA,oob_deviance_explained,5,0.179475572495229,0.177360125449593,0.182723444677448,0.183210182399369,0.179952283630345,0.00265860832017606 +bird,bird,north,,,YEWA,oob_rmse,5,0.591197627682823,0.582204245542092,0.591914132572009,0.581496589737255,0.587923953982158,0.00511357694956418 +bird,bird,north,,,YEWA,oob_spearman,5,0.273873998143111,0.273042129222169,0.27544277961002,0.276382265893519,0.274116908523614,0.00138126305304161 +bird,bird,north,,,YEWA,oob_calibration_slope,5,0.66953950556298,0.63693641889123,0.713887951481982,0.718728425403305,0.674429581507813,0.0378468170998992 +bird,bird,north,,,YEWA,oob_prevalence,5,0.13458843502006,0.134244406707603,0.134809487963868,0.13458843502006,0.134542639141448,0.000279456693593184 +bird,bird,north,,,YEWA,oob_n,5,124877,124874,124878.8,124877,124876.4,2.50998007960223 +bird,bird,south,,,AMRO,insample_auc,5,0.689537506786954,0.689085767534014,0.694179854134546,0.689537506786954,0.69116429025569,0.00267686382030874 +bird,bird,south,,,AMRO,insample_deviance_explained,5,0.0914919911243302,0.0907862366206112,0.0936622473347538,0.0905093060629211,0.0920142540132908,0.0015677422769352 +bird,bird,south,,,AMRO,insample_rmse,5,0.742475038662062,0.740051841768597,0.745694348908307,0.746104469516561,0.742888160715582,0.00289570319718642 +bird,bird,south,,,AMRO,insample_spearman,5,0.289206389172517,0.287837179517966,0.295789973779885,0.287696121760142,0.291229007576228,0.00408372016605238 +bird,bird,south,,,AMRO,insample_calibration_slope,5,0.885482053955006,0.883345065042026,0.893982715783319,0.885403476414633,0.887857917212169,0.00576920241512031 +bird,bird,south,,,AMRO,insample_prevalence,5,0.258598079444985,0.257039179794386,0.259660332963851,0.25655668358714,0.258393144664086,0.00135079625989253 +bird,bird,south,,,AMRO,insample_n,5,23639,23636.8,23639.6,23640,23638.4,1.51657508881031 +bird,bird,south,,,AMRO,oob_auc,5,0.689591934626615,0.688348632550972,0.689843166919568,0.689591934626615,0.68924802394965,0.000920081348058652 +bird,bird,south,,,AMRO,oob_deviance_explained,5,0.0984328670162571,0.094117282107193,0.0994994384196623,0.0984328670162571,0.0973395768527953,0.00316116064937106 +bird,bird,south,,,AMRO,oob_rmse,5,0.735225643291462,0.734322072987703,0.736655125441161,0.734395013830007,0.735378999246935,0.00121712350913242 +bird,bird,south,,,AMRO,oob_spearman,5,0.291547044066434,0.289653619948351,0.29213277997847,0.291376773818019,0.291100972713629,0.00151818475240607 +bird,bird,south,,,AMRO,oob_calibration_slope,5,0.934404203818623,0.926891186190493,0.961180760134325,0.953623540744284,0.941985087798582,0.0175025538271432 +bird,bird,south,,,AMRO,oob_prevalence,5,0.259989876131491,0.259616009340861,0.260538534890505,0.260708383581223,0.260061995930024,0.000475417680104008 +bird,bird,south,,,AMRO,oob_n,5,67168,67167.4,67170.2,67167,67168.6,1.51657508881031 +bird,bird,south,,,YEWA,insample_auc,5,0.719332020865892,0.7167959223474,0.722607418769604,0.721262730392428,0.719662412560823,0.00297152545331512 +bird,bird,south,,,YEWA,insample_deviance_explained,5,0.231210217495144,0.222251823593889,0.235961745747393,0.229114411717017,0.229807382164686,0.00749454908006547 +bird,bird,south,,,YEWA,insample_rmse,5,0.625043487437273,0.62080865697937,0.628590391800858,0.629305991109963,0.624889605300925,0.00399863862852713 +bird,bird,south,,,YEWA,insample_spearman,5,0.295095530582618,0.291167713950288,0.299659209105424,0.297439751075024,0.295393951865559,0.00438378006368663 +bird,bird,south,,,YEWA,insample_calibration_slope,5,0.866874540634912,0.862503477222317,0.872567336726769,0.860619291916303,0.867538534232098,0.00505022303747937 +bird,bird,south,,,YEWA,insample_prevalence,5,0.171376597004823,0.170895553957443,0.17183640258529,0.171742808798646,0.171382167859753,0.000475861876686407 +bird,bird,south,,,YEWA,insample_n,5,23639,23636.8,23639.6,23640,23638.4,1.51657508881031 +bird,bird,south,,,YEWA,oob_auc,5,0.714680925082376,0.712798268254752,0.716148435308362,0.716561203894474,0.714502329965285,0.00165165381687826 +bird,bird,south,,,YEWA,oob_deviance_explained,5,0.20248138732713,0.197183679478114,0.207430346720716,0.208119807948008,0.202298579885998,0.00504819057507152 +bird,bird,south,,,YEWA,oob_rmse,5,0.638667289278492,0.636815197956095,0.639153235243619,0.636772974666958,0.63809587657418,0.00120027991161497 +bird,bird,south,,,YEWA,oob_spearman,5,0.291734550104421,0.289334731699639,0.29340482100249,0.294073915420202,0.291424590009334,0.00203454648872441 +bird,bird,south,,,YEWA,oob_calibration_slope,5,0.871741212363925,0.853830810138639,0.901368353942083,0.871741212363925,0.875139424030135,0.0275139438874958 +bird,bird,south,,,YEWA,oob_prevalence,5,0.175869820899522,0.175707986864887,0.176039185326346,0.175741063319785,0.175867891893267,0.000167508533766851 +bird,bird,south,,,YEWA,oob_n,5,67168,67167.4,67170.2,67167,67168.6,1.51657508881031 +bryophyte,bryophyte,north,,,Bryum.All,insample_auc,5,0.638127846001886,0.629068513424739,0.639705775242135,0.638127846001886,0.635308902250384,0.00556090012471537 +bryophyte,bryophyte,north,,,Bryum.All,insample_deviance_explained,5,-0.275950193493276,-0.30093504049497,-0.246978357823554,-0.24424818155784,-0.273766521408161,0.0268076084815421 +bryophyte,bryophyte,north,,,Bryum.All,insample_rmse,5,0.479527636307096,0.479331369604887,0.480302514101111,0.479248548520264,0.479762898472393,0.000494745588454859 +bryophyte,bryophyte,north,,,Bryum.All,insample_spearman,5,0.234421074075063,0.218639785436767,0.237098983905807,0.234421074075063,0.229509973229964,0.00968700796838076 +bryophyte,bryophyte,north,,,Bryum.All,insample_calibration_slope,5,0.76525545060837,0.744233658530692,0.8107675025251,0.800400269549026,0.775500149433843,0.0336341853608396 +bryophyte,bryophyte,north,,,Bryum.All,insample_prevalence,5,0.398261429491307,0.395579807718977,0.401857219116663,0.400041220115416,0.3986710498744,0.00332558122320578 +bryophyte,bryophyte,north,,,Bryum.All,insample_n,5,3097,3072.4,4153.6,4852,3440.8,789.041633882522 +bryophyte,bryophyte,north,,,Bryum.All,oob_auc,4,0.630809068622639,0.623078012227396,0.646295585466171,,0.6335788759256,0.0130102647026339 +bryophyte,bryophyte,north,,,Bryum.All,oob_deviance_explained,4,-0.19138651532205,-0.229639096179351,-0.14780622710667,,-0.189483762694165,0.0443897167597502 +bryophyte,bryophyte,north,,,Bryum.All,oob_rmse,4,0.480264599990569,0.480001687050415,0.482221755757651,,0.480869686714472,0.00145214204934777 +bryophyte,bryophyte,north,,,Bryum.All,oob_spearman,4,0.222299987465914,0.20864983396156,0.249132606040734,,0.227008010705366,0.022676062398745 +bryophyte,bryophyte,north,,,Bryum.All,oob_calibration_slope,4,0.767411113061744,0.685944635693733,0.863863918531363,,0.772763373098032,0.0990836541433614 +bryophyte,bryophyte,north,,,Bryum.All,oob_prevalence,4,0.403358051486104,0.397360409603543,0.408630979157295,,0.403099224982043,0.006528394280969 +bryophyte,bryophyte,north,,,Bryum.All,oob_n,5,1755,698.4,1779.6,0,1411.2,789.041633882522 +bryophyte,bryophyte,north,,,Bryum.All,v2val_Climate,5,0.562296054365257,0.554173006352827,0.563975593348497,0.563268568361301,0.559777731714894,0.00502167306258926 +bryophyte,bryophyte,north,,,Bryum.All,v2val_Climate_Truncated,5,0.562295197193571,0.554169893407269,0.56396889522421,0.563263005953167,0.559774417476873,0.00502075379775713 +bryophyte,bryophyte,north,,,Bryum.All,v2val_Landcover,5,0.59031873097319,0.582725624858305,0.592734774936281,0.59031873097319,0.58822375369532,0.00508433205604652 +bryophyte,bryophyte,north,,,Bryum.All,v2val_Full,5,0.638127846001886,0.629068513424739,0.639705775242135,0.638127846001886,0.635308902250384,0.00556090012471537 +bryophyte,bryophyte,north,,,Bryum.All,v2val_Full_Truncated,5,0.639020549706553,0.629556667762114,0.64021053224959,0.639020549706553,0.635852413234428,0.00561081241692955 +bryophyte,bryophyte,north,,,Bryum.All,v2val_Full_Joint,5,0.63656986211763,0.627565538171321,0.638033581053569,0.63656986211763,0.633648909724541,0.00542015487462954 +bryophyte,bryophyte,north,,,Bryum.All,v2val_Full_Joint_Truncated,5,0.637367602039122,0.62809310218947,0.638655312558534,0.637500263262641,0.634239708554392,0.00549431056719841 +bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Climate,4,0.557120566175802,0.540969693146743,0.575367468760527,,0.557869148159969,0.0192626917262308 +bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Climate_Truncated,4,0.557104758803387,0.540966602037286,0.575374474456983,,0.557866029834635,0.0192692966023613 +bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Landcover,4,0.586912742882926,0.576860469268986,0.598756809203001,,0.587552668849403,0.0117834395761671 +bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Full,4,0.630809068622639,0.623078012227396,0.646295585466171,,0.6335788759256,0.0130102647026339 +bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Full_Truncated,4,0.63137585065822,0.623530655084542,0.647529866197263,,0.634343286360136,0.0135026415297771 +bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Full_Joint,4,0.62971870560941,0.622041714357572,0.644532558641158,,0.63226758481652,0.012530612942673 +bryophyte,bryophyte,north,,,Bryum.All,oob_v2val_Full_Joint_Truncated,4,0.630321350629701,0.622479940089637,0.645772715128109,,0.63303919132911,0.0130277082370542 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_auc,5,0.698174658798715,0.69094551695802,0.709058701464829,0.694675016541229,0.699837511037708,0.00901778644380229 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_deviance_explained,5,-0.114510476579041,-0.131813022554523,-0.0904615002285642,-0.127187969172517,-0.111764640500469,0.0203388736323564 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_rmse,5,0.466695436776973,0.462912051047972,0.467727184931025,0.467432435043113,0.465613065181239,0.00244205972530663 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_spearman,5,0.341399187547095,0.328255177404971,0.359282419780438,0.334844748701068,0.343616320027039,0.0154028239772293 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_calibration_slope,5,0.886684142091591,0.88294240979435,0.897629158250886,0.897907532572089,0.889629148428203,0.00742841787636394 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_prevalence,5,0.441055234954658,0.434155026365629,0.445516968426104,0.441055234954658,0.440040906513639,0.00592042164227121 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,insample_n,5,3068,3031.6,4152,4852,3417.8,802.273768734838 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_auc,4,0.669185680513321,0.66194940480315,0.689277603994979,,0.673776983288852,0.0156568896063866 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_deviance_explained,4,-0.185591758024389,-0.197381970216131,-0.141841988806489,,-0.174177630515047,0.0329785238818983 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_rmse,4,0.475105452566444,0.469359003725674,0.481375013261819,,0.475292278228802,0.00645345889371808 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_spearman,4,0.29101450640103,0.278786640187495,0.325621827918843,,0.299007169009701,0.0269716818569824 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_calibration_slope,4,0.772810531065414,0.725727448039512,0.851082802104523,,0.783949526784417,0.0700828360330596 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_prevalence,4,0.443665764352131,0.432608384046217,0.454192825112108,,0.443476364514296,0.0116999631210214 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_n,5,1784,700,1820.4,0,1434.2,802.273768734838 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Climate,5,0.656006784390431,0.650667856695395,0.664851582602822,0.652571065182321,0.657491388780721,0.00702864165145057 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Climate_Truncated,5,0.656014130093929,0.650669976200325,0.664873979724118,0.652577122144193,0.657501706850359,0.00703792811898215 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Landcover,5,0.626159436771152,0.623847896625279,0.63744965808967,0.626159436771152,0.629605667370405,0.00700538360157201 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Full,5,0.698174658798715,0.69094551695802,0.709058701464829,0.694675016541229,0.699837511037708,0.00901778644380229 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Full_Truncated,5,0.698175100984084,0.691211313926766,0.709267355194508,0.694914692057453,0.700043394374941,0.00901659546042277 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Full_Joint,5,0.693839915631032,0.687220562229904,0.705393695319871,0.69133661745651,0.696035361241937,0.00910536620980844 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,v2val_Full_Joint_Truncated,5,0.693823112587028,0.687469531659753,0.705583368208495,0.69158473589171,0.69622715639523,0.00910978022700139 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Climate,4,0.636250911438379,0.627380368267631,0.653685141830713,,0.639309371160374,0.0145611916830304 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Climate_Truncated,4,0.636263529886685,0.627402598788168,0.653701328647776,,0.639326696909033,0.0145585625333492 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Landcover,4,0.608585612621007,0.595998860291286,0.617214693566341,,0.607172158555155,0.0115275207748297 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Full,4,0.669185680513321,0.66194940480315,0.689277603994979,,0.673776983288852,0.0156568896063866 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Full_Truncated,4,0.669430040893281,0.6621007168852,0.689600433702903,,0.674016136893831,0.0157430215314559 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Full_Joint,4,0.667551944528101,0.659697874596654,0.686791205149657,,0.671618084060283,0.0153861204532186 +bryophyte,bryophyte,north,,,Ceratodon.purpureus,oob_v2val_Full_Joint_Truncated,4,0.667760268462804,0.659841527855415,0.687057304097503,,0.671823945258272,0.015448661895241 +bryophyte,bryophyte,south,,,Bryum.All,insample_auc,5,0.624781080501705,0.619098305791523,0.631250290557445,0.631477859980203,0.62531135077244,0.00613408721709493 +bryophyte,bryophyte,south,,,Bryum.All,insample_deviance_explained,5,-0.0882074375042718,-0.116317967526412,-0.0745997780131311,-0.0659569204939741,-0.0940636853986955,0.0217357006072699 +bryophyte,bryophyte,south,,,Bryum.All,insample_rmse,5,0.473712635656491,0.473250036655967,0.475178356015742,0.473182584522988,0.474116438717835,0.000979445089225269 +bryophyte,bryophyte,south,,,Bryum.All,insample_spearman,5,0.208905797682641,0.198735688372861,0.219564280666345,0.21996433153061,0.209499332030303,0.0105641202170489 +bryophyte,bryophyte,south,,,Bryum.All,insample_calibration_slope,5,0.874557636620987,0.806197667935386,0.910286420946533,0.929039182089329,0.863965312292241,0.0611476778254253 +bryophyte,bryophyte,south,,,Bryum.All,insample_prevalence,5,0.370562770562771,0.365528360602252,0.371569237798783,0.370562770562771,0.369235286484943,0.00385091464779508 +bryophyte,bryophyte,south,,,Bryum.All,insample_n,5,1444,1429.8,1968,2310,1614.6,388.936113005722 +bryophyte,bryophyte,south,,,Bryum.All,oob_auc,4,0.622587939645232,0.609906666129414,0.635174456157602,,0.622554097858286,0.0139528811025767 +bryophyte,bryophyte,south,,,Bryum.All,oob_deviance_explained,4,-0.0294046792827352,-0.0439442359246929,0.0123272085791315,,-0.019693132418482,0.0322171478788032 +bryophyte,bryophyte,south,,,Bryum.All,oob_rmse,4,0.475290386543187,0.473040753420391,0.476838977026333,,0.475040014171884,0.00206603954639396 +bryophyte,bryophyte,south,,,Bryum.All,oob_spearman,4,0.204907419101645,0.18388423679321,0.22723046467613,,0.205371655982377,0.0239816446700714 +bryophyte,bryophyte,south,,,Bryum.All,oob_calibration_slope,4,0.862631630882613,0.796586982841539,0.926986747501851,,0.862028226803386,0.0714420365714851 +bryophyte,bryophyte,south,,,Bryum.All,oob_prevalence,4,0.3703593055487,0.368749240306309,0.380219211352906,,0.37330567717792,0.0072755089177001 +bryophyte,bryophyte,south,,,Bryum.All,oob_n,5,866,342,880.2,0,695.4,388.936113005722 +bryophyte,bryophyte,south,,,Bryum.All,v2val_Climate,5,0.562296054365257,0.554173006352827,0.563975593348497,0.563268568361301,0.559777731714894,0.00502167306258926 +bryophyte,bryophyte,south,,,Bryum.All,v2val_Climate_Truncated,5,0.562295197193571,0.554169893407269,0.56396889522421,0.563263005953167,0.559774417476873,0.00502075379775713 +bryophyte,bryophyte,south,,,Bryum.All,v2val_Landcover,5,0.590977483143704,0.588222769171523,0.60141327621516,0.604777025029246,0.593896071204394,0.0070332679741888 +bryophyte,bryophyte,south,,,Bryum.All,v2val_Full,5,0.624781080501705,0.619098305791523,0.631250290557445,0.631477859980203,0.62531135077244,0.00613408721709493 +bryophyte,bryophyte,south,,,Bryum.All,v2val_Full_Truncated,5,0.624781080501705,0.619154420181747,0.631292646881434,0.631535708776305,0.625345448851566,0.00612033629471389 +bryophyte,bryophyte,south,,,Bryum.All,v2val_Full_Joint,5,0.624358409137791,0.618605858115063,0.631039389378428,0.630846343956086,0.624944360355056,0.00625821729858158 +bryophyte,bryophyte,south,,,Bryum.All,v2val_Full_Joint_Truncated,5,0.624356386786767,0.618642020722096,0.631057597953052,0.630860002699611,0.624962990194972,0.0062460677616445 +bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Climate,4,0.557120566175802,0.540969693146743,0.575367468760527,,0.557869148159969,0.0192626917262308 +bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Climate_Truncated,4,0.557104758803387,0.540966602037286,0.575374474456983,,0.557866029834635,0.0192692966023613 +bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Landcover,4,0.597272483474034,0.596765466015466,0.601974542549405,,0.598770712622892,0.00348361543505928 +bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Full,4,0.622587939645232,0.609906666129414,0.635174456157602,,0.622554097858286,0.0139528811025767 +bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Full_Truncated,4,0.622567363513545,0.609906666129414,0.63516211047859,,0.622543809792443,0.0139501445980818 +bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Full_Joint,4,0.622331585916656,0.607992717674767,0.636786215054005,,0.622372929093606,0.0160574239141607 +bryophyte,bryophyte,south,,,Bryum.All,oob_v2val_Full_Joint_Truncated,4,0.622313949232352,0.607992717674767,0.636775633043423,,0.622364110751454,0.0160556605380964 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_auc,5,0.717485896729522,0.71685899652647,0.72287874285206,0.717485896729522,0.719337658395294,0.00314832137641283 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_deviance_explained,5,0.0555144394517471,0.0525022042487002,0.0659817133460382,0.0552076565672067,0.0580917971366114,0.00804978167070715 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_rmse,5,0.403372277591519,0.398339551678763,0.406855811762638,0.403372277591519,0.402708178674735,0.00422999542451598 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_spearman,5,0.324238098784219,0.318040132102534,0.330331200221374,0.321683515420121,0.324176941097839,0.00635489788234709 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_calibration_slope,5,0.900294144555213,0.878293846695361,0.929217371465325,0.926240194199798,0.903277573722839,0.025082790791702 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_prevalence,5,0.23982683982684,0.231460603487586,0.246697056850865,0.23982683982684,0.239405392468179,0.00765174673579537 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,insample_n,5,1462,1452.8,1977.6,2310,1631.4,379.498089586759 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_auc,4,0.715093054248096,0.709938966718536,0.716833687112666,,0.713873963296314,0.00407985613655125 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_deviance_explained,4,0.0485196427393902,0.0213884985438529,0.0541796492701325,,0.0408513792876777,0.0205022125506785 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_rmse,4,0.406296961312814,0.398165216308586,0.415127438523745,,0.406546508529494,0.00911762395306138 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_spearman,4,0.316460819822169,0.305912040269855,0.327620546786264,,0.316679015326377,0.0116401179241884 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_calibration_slope,4,0.856225115735854,0.811357325680967,0.90322965680456,,0.856988241097932,0.0492572682113721 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_prevalence,4,0.238999572635154,0.227667581639544,0.255610993801512,,0.240885083410421,0.0151422609821477 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_n,5,848,332.4,857.2,0,678.6,379.498089586759 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Climate,5,0.656006784390431,0.650667856695395,0.664851582602822,0.652571065182321,0.657491388780721,0.00702864165145057 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Climate_Truncated,5,0.656014130093929,0.650669976200325,0.664873979724118,0.652577122144193,0.657501706850359,0.00703792811898215 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Landcover,5,0.633036828963795,0.625748811394207,0.642238687874322,0.630393575816386,0.633819706982903,0.00839614169240918 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Full,5,0.717485896729522,0.71685899652647,0.72287874285206,0.717485896729522,0.719337658395294,0.00314832137641283 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Full_Truncated,5,0.717485896729522,0.71685899652647,0.72287874285206,0.717485896729522,0.719337658395294,0.00314832137641283 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Full_Joint,5,0.718564200718732,0.717751679375772,0.723867311169212,0.718564200718732,0.720297293047133,0.00318115267699769 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,v2val_Full_Joint_Truncated,5,0.718564200718732,0.717751679375772,0.723867311169212,0.718564200718732,0.720297293047133,0.00318115267699769 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Climate,4,0.636250911438379,0.627380368267631,0.653685141830713,,0.639309371160374,0.0145611916830304 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Climate_Truncated,4,0.636263529886685,0.627402598788168,0.653701328647776,,0.639326696909033,0.0145585625333492 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Landcover,4,0.621073947742974,0.605174465777582,0.638800057775284,,0.621726314909731,0.0180551389037002 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Full,4,0.715093054248096,0.709938966718536,0.716833687112666,,0.713873963296314,0.00407985613655125 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Full_Truncated,4,0.715093054248096,0.709938966718536,0.716833687112666,,0.713873963296314,0.00407985613655125 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Full_Joint,4,0.716849054867145,0.711184101825957,0.718706027458805,,0.715489061849456,0.00457687182026539 +bryophyte,bryophyte,south,,,Ceratodon.purpureus,oob_v2val_Full_Joint_Truncated,4,0.716849054867145,0.711184101825957,0.718706027458805,,0.715489061849456,0.00457687182026539 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_auc,5,0.778362159718991,0.777313519482956,0.781078019062442,0.776659932196605,0.778941977854504,0.00220139213343037 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_deviance_explained,5,0.129922817133758,0.116058360191463,0.137037124714767,0.126180029301491,0.127497727648612,0.0115563906422122 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_rmse,5,0.428984342825858,0.426484514201266,0.429776953204885,0.429796613403064,0.428367541663588,0.00170602773901413 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_spearman,5,0.46931020347218,0.467301179157511,0.473793771369763,0.466302441462258,0.470210732962937,0.00348588836105702 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_calibration_slope,5,1.02280943622485,1.00638380806286,1.02708521369247,1.02280943622485,1.0184707448443,0.011026980822553 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_prevalence,5,0.384787472035794,0.382719077877937,0.387875670039505,0.384787472035794,0.385092893007771,0.00278105998275642 +lichen,lichen,north,,,Cladonia.chlorophaea,insample_n,5,3685,3644,4976.6,5811,4102.6,955.610956404331 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_auc,4,0.766320433722221,0.757378470612268,0.770532908104046,,0.764631330605033,0.00773409788726129 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_deviance_explained,4,0.113996779288933,0.0998702886563739,0.140537458619322,,0.118430418109587,0.0237257998755231 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_rmse,4,0.434233197376139,0.431409497762948,0.437875343465515,,0.434525499689062,0.00353785187767737 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_spearman,4,0.448965855284841,0.434402780928462,0.454722953452224,,0.445820863788771,0.0120096288277829 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_calibration_slope,4,0.967661500539704,0.947481883037204,0.982662848959669,,0.965812118724513,0.0194935179999311 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_prevalence,4,0.385212683681362,0.378550429000763,0.388624647224836,,0.384051865418103,0.00565743785692542 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_n,5,2126,834.4,2167,0,1708.4,955.610956404331 +lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Climate,5,0.726648362079003,0.7237588448296,0.731162951758353,0.723004804073768,0.72719557447664,0.00380494512788104 +lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Climate_Truncated,5,0.726660385143037,0.723768652905815,0.731181039693866,0.72301652132686,0.727208895973783,0.00380873317415131 +lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Landcover,5,0.714897867010021,0.711070873547497,0.715616075360572,0.710689730662897,0.713682108226793,0.00234024727927697 +lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Full,5,0.778362159718991,0.777313519482956,0.781078019062442,0.776659932196605,0.778941977854504,0.00220139213343037 +lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Full_Truncated,5,0.778213392638019,0.777186308510683,0.780963739171022,0.77651231594881,0.778814568724427,0.00222483325194008 +lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Full_Joint,5,0.777290152345703,0.776349528728965,0.780295682938712,0.77578324180292,0.778055337809396,0.00214296304404187 +lichen,lichen,north,,,Cladonia.chlorophaea,v2val_Full_Joint_Truncated,5,0.777190658438047,0.776223771512686,0.780168440645134,0.775630371417491,0.777933926824515,0.00215290328592244 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Climate,4,0.714982827935826,0.71142147790233,0.716134560839275,,0.714122250389381,0.00278710207176498 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Climate_Truncated,4,0.714986555031238,0.711429083580888,0.716141935437511,,0.714128665372639,0.00278474056829603 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Landcover,4,0.6993486440522,0.695238223478961,0.703833711587922,,0.699482446538801,0.00471231540415982 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Full,4,0.766320433722221,0.757378470612268,0.770532908104046,,0.764631330605033,0.00773409788726129 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Full_Truncated,4,0.766446335783094,0.757266971247998,0.770241672495975,,0.764523468703731,0.00779476503948412 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Full_Joint,4,0.76558237025298,0.756446722492137,0.76890475840522,,0.76350620610705,0.00763281653645435 +lichen,lichen,north,,,Cladonia.chlorophaea,oob_v2val_Full_Joint_Truncated,4,0.765720545345162,0.756181429801128,0.768751167860589,,0.763396083549231,0.00772657199336835 +lichen,lichen,north,,,Physcia.adscendens,insample_auc,5,0.837335108574662,0.833892427673138,0.841684373333987,0.838268220834197,0.837631185433223,0.00421142443545695 +lichen,lichen,north,,,Physcia.adscendens,insample_deviance_explained,5,0.153309875432323,0.124539848626552,0.181355576712871,0.153309875432323,0.153462981135222,0.0313003485289416 +lichen,lichen,north,,,Physcia.adscendens,insample_rmse,5,0.394413849121186,0.390679733700768,0.396338542998067,0.393389135816662,0.393852028605293,0.00305493252353979 +lichen,lichen,north,,,Physcia.adscendens,insample_spearman,5,0.569716833320736,0.562212442609498,0.574320845837935,0.569949863531718,0.568531717754906,0.00642768440020838 +lichen,lichen,north,,,Physcia.adscendens,insample_calibration_slope,5,0.977543215514836,0.973882604264117,0.992189734009598,0.974581235728712,0.981283244985178,0.01051079416882 +lichen,lichen,north,,,Physcia.adscendens,insample_prevalence,5,0.382961350027218,0.378754207234193,0.387054085275807,0.384099122354156,0.382969715660275,0.00456567123234541 +lichen,lichen,north,,,Physcia.adscendens,insample_n,5,3699,3673.4,4975,5811,4115.6,947.965083745177 +lichen,lichen,north,,,Physcia.adscendens,oob_auc,4,0.839292658298271,0.829533400959301,0.846965637654569,,0.838547559018745,0.00938564979201381 +lichen,lichen,north,,,Physcia.adscendens,oob_deviance_explained,4,0.143454749419506,0.0949908751245048,0.205499371215224,,0.148305016384047,0.0631136911709378 +lichen,lichen,north,,,Physcia.adscendens,oob_rmse,4,0.391817546344859,0.388424442525194,0.400850115043751,,0.393831640944583,0.00707925330540285 +lichen,lichen,north,,,Physcia.adscendens,oob_spearman,4,0.570820101540557,0.556966290991812,0.585222167374373,,0.571015906999511,0.0152763365469035 +lichen,lichen,north,,,Physcia.adscendens,oob_calibration_slope,4,0.993551581711484,0.96245857697318,1.01756614536709,,0.991023567039093,0.0304614734345619 +lichen,lichen,north,,,Physcia.adscendens,oob_prevalence,4,0.386432660247333,0.378648004672367,0.394703317951312,,0.386606232436266,0.00923888826136022 +lichen,lichen,north,,,Physcia.adscendens,oob_n,5,2112,836,2137.6,0,1695.4,947.965083745177 +lichen,lichen,north,,,Physcia.adscendens,v2val_Climate,5,0.693422907498,0.690915989050979,0.694883881152127,0.693422907498,0.692986505923955,0.00201451745990401 +lichen,lichen,north,,,Physcia.adscendens,v2val_Climate_Truncated,5,0.693419511127206,0.690911780963104,0.694883929491704,0.693419511127206,0.692985163486467,0.00201463625805256 +lichen,lichen,north,,,Physcia.adscendens,v2val_Landcover,5,0.801861109542011,0.782213209132931,0.812598365772438,0.812994033294577,0.799562929201212,0.0178185824794553 +lichen,lichen,north,,,Physcia.adscendens,v2val_Full,5,0.837335108574662,0.833892427673138,0.841684373333987,0.838268220834197,0.837631185433223,0.00421142443545695 +lichen,lichen,north,,,Physcia.adscendens,v2val_Full_Truncated,5,0.837482703696643,0.83402227575171,0.841815848139725,0.838439032548488,0.837773708478258,0.00421550438320122 +lichen,lichen,north,,,Physcia.adscendens,v2val_Full_Joint,5,0.836047248740013,0.832067905608026,0.840315800616736,0.836357683360022,0.836103552465423,0.0046074652071796 +lichen,lichen,north,,,Physcia.adscendens,v2val_Full_Joint_Truncated,5,0.836286222674123,0.832185134167773,0.840452132671447,0.836525866238843,0.836258764262809,0.00461711990867249 +lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Climate,4,0.690146520368093,0.687623451889863,0.696399093335788,,0.691478486257188,0.00495021261044504 +lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Climate_Truncated,4,0.690133662354544,0.687619313393814,0.696403232441228,,0.69147481275667,0.00495756138170841 +lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Landcover,4,0.80689396202876,0.792826777899119,0.818710192371022,,0.806090049961839,0.0145903596426596 +lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Full,4,0.839292658298271,0.829533400959301,0.846965637654569,,0.838547559018745,0.00938564979201381 +lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Full_Truncated,4,0.839479011781648,0.829796481228334,0.8470008753914,,0.83870734501609,0.00926667222581543 +lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Full_Joint,4,0.835740019351969,0.826152734502598,0.845016117951229,,0.835628881405501,0.0101826777472231 +lichen,lichen,north,,,Physcia.adscendens,oob_v2val_Full_Joint_Truncated,4,0.835910659316576,0.826439317818255,0.845028920277397,,0.835784559124612,0.0100393680766585 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_auc,5,0.782940004828585,0.771430317517624,0.78704102003786,0.782940004828585,0.780384815223684,0.00892062786427006 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_deviance_explained,5,0.101560194956707,0.0833055588905147,0.10855690687591,0.0760150539678254,0.0977267101316104,0.0134864921912352 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_rmse,5,0.273630488580498,0.266940670870867,0.27923536011912,0.27615265636656,0.273137946045151,0.00613430562265861 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_spearman,5,0.278345072756788,0.271410866729923,0.283855802016148,0.284558850730728,0.277868922002142,0.00614111968498575 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_calibration_slope,5,1.00445803190767,0.923032164793458,1.06063235332037,1.00400781901235,0.998413735524807,0.0779356859153725 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_prevalence,5,0.0907849829351536,0.0854880550520455,0.0942546707117982,0.092924126172208,0.0900691492139895,0.00433337917377339 +lichen,lichen,south,,,Cladonia.chlorophaea,insample_n,5,1482,1471.8,2004.4,2346,1653.4,387.296785424305 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_auc,4,0.767777065619901,0.759098616020395,0.777508870753697,,0.768153264025005,0.0103158231014254 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_deviance_explained,4,0.00020738830490835,-0.0197727594970929,0.0186135944535137,,-0.0003547337141616,0.0206046152183967 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_rmse,4,0.285215861553978,0.278859149933553,0.293735548818788,,0.285988352855544,0.00803695663998821 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_spearman,4,0.280771471067578,0.258586974156161,0.293911115946987,,0.277541166770433,0.0193124585097445 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_calibration_slope,4,1.11452074384603,0.83884295294175,1.23312243580024,,1.05842213707815,0.227871215589685 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_prevalence,4,0.0997452652709462,0.0913286406440493,0.106312613843352,,0.0990848095371992,0.00808662138066247 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_n,5,864,341.6,874.2,0,692.6,387.296785424305 +lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Climate,5,0.726648362079003,0.7237588448296,0.731162951758353,0.723004804073768,0.72719557447664,0.00380494512788104 +lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Climate_Truncated,5,0.726660385143037,0.723768652905815,0.731181039693866,0.72301652132686,0.727208895973783,0.00380873317415131 +lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Landcover,5,0.746232134390029,0.738477213352093,0.757183243479499,0.74708991515486,0.747240463783824,0.0106065443436887 +lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Full,5,0.782940004828585,0.771430317517624,0.787041020037861,0.782940004828585,0.780384815223684,0.0089206278642703 +lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Full_Truncated,5,0.782940004828585,0.771430317517624,0.787041020037861,0.782940004828585,0.780384815223684,0.0089206278642703 +lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Full_Joint,5,0.783724649927571,0.773780455672375,0.788033764122229,0.783724649927571,0.781776344950047,0.00786739974674226 +lichen,lichen,south,,,Cladonia.chlorophaea,v2val_Full_Joint_Truncated,5,0.783724649927571,0.773780455672375,0.788033764122229,0.783724649927571,0.781776344950047,0.00786739974674226 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Climate,4,0.714982827935826,0.71142147790233,0.716134560839275,,0.714122250389381,0.00278710207176498 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Climate_Truncated,4,0.714986555031238,0.711429083580888,0.716141935437511,,0.714128665372639,0.00278474056829603 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Landcover,4,0.75082184394749,0.74168570185442,0.752461597648907,,0.748144562379042,0.00674874952586361 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Full,4,0.767777065619901,0.759098616020395,0.777508870753697,,0.768153264025005,0.0103158231014254 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Full_Truncated,4,0.767777065619901,0.759098616020395,0.777508870753697,,0.768153264025005,0.0103158231014254 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Full_Joint,4,0.76868800182822,0.762466250385714,0.777619034446911,,0.769655602248286,0.00865338800241536 +lichen,lichen,south,,,Cladonia.chlorophaea,oob_v2val_Full_Joint_Truncated,4,0.76868800182822,0.762466250385714,0.777619034446911,,0.769655602248286,0.00865338800241536 +lichen,lichen,south,,,Physcia.adscendens,insample_auc,5,0.821353781719635,0.817185593102722,0.825672849056938,0.821573724007562,0.82133199677784,0.00470181458246041 +lichen,lichen,south,,,Physcia.adscendens,insample_deviance_explained,5,0.239704709286469,0.231908892003898,0.24739316046634,0.239704709286469,0.239170938481984,0.00836987471623949 +lichen,lichen,south,,,Physcia.adscendens,insample_rmse,5,0.356794925429378,0.352929674110169,0.358725757363671,0.356794925429378,0.356142732606163,0.00305057472651177 +lichen,lichen,south,,,Physcia.adscendens,insample_spearman,5,0.458171869563314,0.449023619570466,0.466231041170605,0.458171869563314,0.457232139057486,0.00919412871966326 +lichen,lichen,south,,,Physcia.adscendens,insample_calibration_slope,5,0.881651302841094,0.877029058458768,0.905002744726106,0.895884570463108,0.888780956639862,0.014710326211831 +lichen,lichen,south,,,Physcia.adscendens,insample_prevalence,5,0.215686274509804,0.210370852380551,0.218705697782215,0.215686274509804,0.214933253293698,0.00478783760132252 +lichen,lichen,south,,,Physcia.adscendens,insample_n,5,1487,1480.8,2014,2346,1662.2,382.531305908418 +lichen,lichen,south,,,Physcia.adscendens,oob_auc,4,0.816688066173278,0.814577556447952,0.819582119521717,,0.816967903181533,0.00271138269936014 +lichen,lichen,south,,,Physcia.adscendens,oob_deviance_explained,4,0.229581557918766,0.221042427704859,0.242028578202743,,0.230977232943791,0.0116106526749679 +lichen,lichen,south,,,Physcia.adscendens,oob_rmse,4,0.361221111344793,0.357219734510275,0.363119037857434,,0.360469879086979,0.00328089666967988 +lichen,lichen,south,,,Physcia.adscendens,oob_spearman,4,0.454435749483605,0.444604153459308,0.459399541619317,,0.452697248094824,0.00824469525388058 +lichen,lichen,south,,,Physcia.adscendens,oob_calibration_slope,4,0.869323881706107,0.820424126275093,0.95799881977588,,0.883529304077092,0.0756154292842296 +lichen,lichen,south,,,Physcia.adscendens,oob_prevalence,4,0.21549434057534,0.209833885194357,0.226186106799465,,0.217291237305033,0.00944381193189753 +lichen,lichen,south,,,Physcia.adscendens,oob_n,5,859,332,865.2,0,683.8,382.531305908418 +lichen,lichen,south,,,Physcia.adscendens,v2val_Climate,5,0.693422907498,0.690915989050979,0.694883881152127,0.693422907498,0.692986505923955,0.00201451745990401 +lichen,lichen,south,,,Physcia.adscendens,v2val_Climate_Truncated,5,0.693419511127206,0.690911780963104,0.694883929491704,0.693419511127206,0.692985163486467,0.00201463625805256 +lichen,lichen,south,,,Physcia.adscendens,v2val_Landcover,5,0.755367662346663,0.753354388319629,0.769154488554709,0.755514263619179,0.75923726755233,0.0106880634487565 +lichen,lichen,south,,,Physcia.adscendens,v2val_Full,5,0.821353781719635,0.817185593102722,0.825672849056938,0.821573724007562,0.82133199677784,0.00470181458246041 +lichen,lichen,south,,,Physcia.adscendens,v2val_Full_Truncated,5,0.821369179600887,0.817185593102722,0.825672849056938,0.821573724007562,0.82133507635409,0.00470183746079766 +lichen,lichen,south,,,Physcia.adscendens,v2val_Full_Joint,5,0.818351194875585,0.815473629919288,0.821595518961059,0.818413816807012,0.818450596628366,0.0035138580973253 +lichen,lichen,south,,,Physcia.adscendens,v2val_Full_Joint_Truncated,5,0.818366592756837,0.815473629919288,0.821595518961059,0.818413816807012,0.818453676204616,0.0035137559475432 +lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Climate,4,0.690146520368093,0.687623451889863,0.696399093335788,,0.691478486257188,0.00495021261044504 +lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Climate_Truncated,4,0.690133662354544,0.687619313393814,0.696403232441228,,0.69147481275667,0.00495756138170841 +lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Landcover,4,0.757543713583416,0.754237750244239,0.765899299116814,,0.759347150081352,0.00659093377352209 +lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Full,4,0.816688066173278,0.814577556447952,0.819582119521717,,0.816967903181533,0.00271138269936014 +lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Full_Truncated,4,0.816692374438254,0.814577556447952,0.819584704480702,,0.81697005731402,0.00271219354015405 +lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Full_Joint,4,0.812861687935889,0.810647101871693,0.815758867203804,,0.813105471222931,0.00283145974958857 +lichen,lichen,south,,,Physcia.adscendens,oob_v2val_Full_Joint_Truncated,4,0.81287030446584,0.810647101871693,0.815764037121775,,0.813109779487907,0.00283515421967582 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_auc,5,0.820367038624296,0.819088803830954,0.825096132690793,0.820911148938545,0.821548232901657,0.00368021243181869 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_deviance_explained,5,0.274643755760762,0.273047064346357,0.2795535093301,0.272167552780268,0.275794916286106,0.0037829114549962 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_rmse,5,0.325649814939506,0.323044576138151,0.32774821127909,0.327783381237672,0.325475899728406,0.0023268778087488 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_spearman,5,0.457622037926128,0.455146980332479,0.464800704476141,0.457622037926128,0.459282943376137,0.0052329898486681 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_calibration_slope,5,0.987210797047211,0.964756720342875,1.04226829149403,0.987210797047211,0.999628097376395,0.040457896858658 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_prevalence,5,0.22526523562793,0.222685585610422,0.228865718677616,0.22526523562793,0.225662811559798,0.00324773944134521 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,insample_n,5,2588,2554.4,3469,4053,2869.4,661.914873680899 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_auc,4,0.807437018082126,0.795187683185118,0.814600712078279,,0.805620717760392,0.0109848697690175 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_deviance_explained,4,0.234952851608951,0.215144910318834,0.252509532861174,,0.234148830166846,0.0201759809192477 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_rmse,4,0.33540874228767,0.32943601838744,0.340042074806677,,0.334930388222947,0.00571392258320504 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_spearman,4,0.436123893428745,0.419582521233002,0.446016838076314,,0.433749455018683,0.0150488838521891 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_calibration_slope,4,0.947080559125973,0.940176391586403,0.972191240627968,,0.953582885541124,0.0195519425313773 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_prevalence,4,0.224511499051979,0.218291264544164,0.230417458254175,,0.224399257871401,0.00661456979352361 +mammal,mammal_summer,north,summer,hurdle,Coyote_Summer,oob_n,5,1465,584,1498.6,0,1183.6,661.914873680899 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_auc,5,0.61119205862304,0.608247846213005,0.619766590249117,0.614800455189874,0.613133257123311,0.00617079565055122 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_deviance_explained,5,0.0293312456190202,0.0254868824061227,0.034855941334284,0.0327130199155846,0.0299655255688071,0.00466042949610858 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_rmse,5,0.440494520447441,0.439655702708701,0.441992443932362,0.440494520447441,0.440710638869574,0.00129009568326754 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_spearman,5,0.166867112583273,0.161253581705846,0.173443277843013,0.166867112583273,0.166942767059625,0.00668917082484309 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_calibration_slope,5,0.871613828265815,0.807561232834562,0.918699876937025,0.901041907949805,0.864331745671229,0.05473797753352 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_prevalence,5,0.320047355958958,0.317847829087179,0.320941159211816,0.321243523316062,0.319582666739872,0.00164288413830535 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,insample_n,5,2587,2537.6,3467,4053,2861,666.806193732482 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_auc,4,0.599789507623449,0.585096398809124,0.610287133771428,,0.598291120956897,0.0139243777141284 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_deviance_explained,4,0.0222358139724005,0.0154302383695453,0.0289963709245666,,0.0222197358828687,0.00780005134828563 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_rmse,4,0.444244510956,0.443337295940116,0.444727707984992,,0.444093075960681,0.000801980504115758 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_spearman,4,0.1428985967646,0.125110680243685,0.165466638254086,,0.144605784253376,0.0220824267179884 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_calibration_slope,4,0.750011624893702,0.699600524966396,0.836834785057386,,0.76301593212098,0.0752804461935625 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_prevalence,4,0.324076824388238,0.322733281306541,0.3276244709432,,0.324864004200118,0.00280085582083958 +mammal,mammal_summer,north,summer,hurdle,Moose_Summer,oob_n,5,1466,586,1515.4,0,1192,666.806193732482 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_auc,5,0.634240369366988,0.632910641847936,0.642195650517714,0.634240369366988,0.636730093444244,0.00492494577892738 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_deviance_explained,5,0.0264112493368064,0.0244020509882967,0.0303865560800429,0.0264112493368064,0.0271321926805094,0.00319183688778419 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_rmse,5,0.418769573067301,0.41254704078318,0.420323940326511,0.421286846656193,0.41688100357794,0.00397229497435235 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_spearman,5,0.175369074792115,0.169472066216479,0.19311238624043,0.175369074792115,0.17910418059275,0.0143000493783131 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_calibration_slope,5,0.975536082659011,0.869669271029773,0.999133512851468,1.00531761653027,0.942116568564117,0.0667346863953477 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_prevalence,5,0.691079812206573,0.689952548788955,0.71053806886065,0.691079812206573,0.698355803841802,0.0110051698108056 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,insample_n,5,675,672.2,911.8,1065,753.4,174.236333753899 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_auc,4,0.590185162579443,0.588561095758765,0.594993617451278,,0.591322444026285,0.00370894024345057 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_deviance_explained,4,-0.00660912212895907,-0.0246222554112858,0.00596211189481146,,-0.00855265757844343,0.0170007059445371 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_rmse,4,0.438945021715404,0.435169754735052,0.442994297582763,,0.439042882032192,0.00430413105762848 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_spearman,4,0.119269331592725,0.112670153678564,0.141855035472014,,0.1249788051517,0.0171203610940835 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_calibration_slope,4,0.529521999315492,0.405879483641657,0.748020467389396,,0.56339912517266,0.188100087615398 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_prevalence,4,0.675933879994794,0.656439043984736,0.693034260713775,,0.675078717390838,0.0207397429628256 +mammal,mammal_summer,south,summer,hurdle,Coyote_Summer,oob_n,5,390,153.2,392.8,0,311.6,174.236333753899 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_auc,5,0.800563803516706,0.774332077165384,0.807116397983381,0.786049924840508,0.793142123263336,0.0172774284548912 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_deviance_explained,5,0.235315369629889,0.184794016646685,0.243734500249067,0.205216892616348,0.219402980661022,0.0313035508744373 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_rmse,5,0.345153854253612,0.340273324511787,0.350387335024819,0.345153854253612,0.345250928073386,0.00498539064156107 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_spearman,5,0.399822439479778,0.365817333025682,0.416474286805188,0.381089371361329,0.393764975108055,0.025777771060145 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_calibration_slope,5,0.983951125311349,0.934535204259224,1.0182141754068,0.986324497785332,0.978961877909731,0.0489672106534818 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_prevalence,5,0.182159624413146,0.181333087877553,0.193172072927236,0.182159624413146,0.185526823886116,0.00827314119136472 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,insample_n,5,678,670.6,913,1065,754,173.956891211587 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_auc,4,0.729574202549047,0.71815250764054,0.778542353806383,,0.742983651245057,0.0363678903345032 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_deviance_explained,4,0.0957319747373082,-0.112729476086203,0.182551981226243,,0.0522886017606739,0.177839885253858 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_rmse,4,0.349900330806755,0.341019339169151,0.360550613582775,,0.350532220499047,0.0106010756691699 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_spearman,4,0.291859756320935,0.287348724179463,0.363426726063271,,0.315808305464101,0.0514234239419856 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_calibration_slope,4,0.774041963702232,0.646822148840561,1.18815164727979,,0.876502631100762,0.317190446694699 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_prevalence,4,0.182520739834082,0.160534290271133,0.183610188261351,,0.175057525142768,0.01572313523028 +mammal,mammal_summer,south,summer,hurdle,Moose_Summer,oob_n,5,387,152,394.4,0,311,173.956891211587 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_auc,5,0.843771320712376,0.837298705573725,0.845386776229526,0.839440907842931,0.841900799199367,0.00416458415403682 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_deviance_explained,5,0.296908480586636,0.290887810793796,0.302200604755114,0.294409607036222,0.296791618459388,0.00570554859270136 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_rmse,5,0.300280860452662,0.299352741208206,0.302368697081708,0.30069616131153,0.300636486451009,0.00169518301694859 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_spearman,5,0.466818565812599,0.461436555661139,0.473138781426199,0.463240577826878,0.467175270468735,0.00576420559514205 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_calibration_slope,5,0.972690836668142,0.921935358308296,0.979611212169833,0.982050704865843,0.955256551495782,0.0299777079445712 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_prevalence,5,0.201509433962264,0.199761756423448,0.205640478898507,0.201356917858008,0.202439531288226,0.00307554695366447 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,insample_n,5,2612,2595.8,3536.2,4127,2916.2,677.217616427689 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_auc,4,0.827458353428436,0.817805717079038,0.840574988117616,,0.828695495692644,0.0124179160962348 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_deviance_explained,4,0.276689902789578,0.265842733106712,0.294949072324388,,0.279337045593844,0.0167940142463136 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_rmse,4,0.303789329751735,0.298771516378234,0.304833455528629,,0.302370155610089,0.00382820840385957 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_spearman,4,0.444765026946551,0.435147313816253,0.460529325956992,,0.446960236189459,0.0143757349540166 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_calibration_slope,4,0.912370954577014,0.861212539179959,0.954228059409819,,0.909049057946925,0.0520155611998991 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_prevalence,4,0.199234448913847,0.193549889929862,0.204483398915383,,0.199078874277258,0.00592784350128194 +mammal,mammal_winter,north,winter,hurdle,Coyote_Winter,oob_n,5,1515,590.8,1531.2,0,1210.8,677.217616427689 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_auc,5,0.672085273881372,0.668633720672182,0.680693747031501,0.668767750495832,0.673650345261601,0.00705894383852787 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_deviance_explained,5,0.0758678220182751,0.0704991263862156,0.0841775407251298,0.0713753243188524,0.0768329848204126,0.00689725835100292 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_rmse,5,0.332910274284271,0.327210641524145,0.335100999244875,0.332910274284271,0.331554332789458,0.00395381643788123 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_spearman,5,0.215829774013176,0.212589282113879,0.226422981371282,0.211955551417089,0.218242903591179,0.00816350970165605 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_calibration_slope,5,0.94812085347111,0.856889525073144,1.03389671800408,0.94812085347111,0.948321951639006,0.092126092648448 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_prevalence,5,0.148776350860189,0.144579171619019,0.151265484707482,0.148776350860189,0.148217744909364,0.00345089736498891 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,insample_n,5,2637,2606,3537,4127,2925.8,671.783223964398 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_auc,4,0.654372882277188,0.640403021566792,0.6605591763494,,0.651593037049265,0.0112866225169797 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_deviance_explained,4,0.0514858356828411,0.0379579660013158,0.0604573235872615,,0.0498585564767322,0.0123265017677637 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_rmse,4,0.337444976131703,0.331449906564068,0.342571110976009,,0.337134642301943,0.00618013722586392 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_spearman,4,0.19099043338874,0.174162150130626,0.204597549588522,,0.189840016582193,0.0164077747297465 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_calibration_slope,4,0.732075381978751,0.657958194547818,0.836247242841193,,0.742809193918576,0.0983856367690785 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_prevalence,4,0.148630312373211,0.144212802079742,0.157027721824677,,0.150051704929638,0.00706694376971498 +mammal,mammal_winter,north,winter,hurdle,Moose_Winter,oob_n,5,1490,590,1521,0,1201.2,671.783223964398 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_auc,5,0.706112866420923,0.689756836780519,0.712422673247893,0.689082366331686,0.701766116171277,0.0115819259664459 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_deviance_explained,5,0.077948761211899,0.0672394512735814,0.0862779229583741,0.0670547674954939,0.0767109599030692,0.00953073159442438 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_rmse,5,0.401891914348534,0.400056693343447,0.408313222434912,0.406888363248781,0.403660884327179,0.00418719958207863 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_spearman,5,0.328404695790939,0.293718951070702,0.340256897739946,0.296933239332004,0.319246035124502,0.0234446146251979 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_calibration_slope,5,1.02265042079081,0.949079646474498,1.06820491938664,1.03306130883064,1.01079025774546,0.0605675993019255 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_prevalence,5,0.602816901408451,0.593809006916747,0.607790307126989,0.604735883424408,0.60104129788425,0.00700249933764362 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,insample_n,5,696,686.6,942.8,1098,775.8,180.377936566532 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_auc,4,0.642530046696975,0.604052771943084,0.646988682070108,,0.630380532632419,0.0285027427030458 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_deviance_explained,4,0.0177640077575169,-0.00914291472953676,0.0380006855045052,,0.0153817774932079,0.0262728517098914 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_rmse,4,0.423675312133193,0.412365569779127,0.4289659133495,,0.421525618869708,0.00945427379070984 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_spearman,4,0.215041364313525,0.166273559830134,0.234657571247567,,0.204630079474472,0.0385961235199444 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_calibration_slope,4,0.666986903656138,0.480343171377765,0.83150584600084,,0.659085192965541,0.188467730825247 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_prevalence,4,0.614967084834182,0.599715606114469,0.623570700713301,,0.612592848105398,0.0130873792975551 +mammal,mammal_winter,south,winter,hurdle,Coyote_Winter,oob_n,5,402,155.2,411.4,0,322.2,180.377936566532 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_auc,5,0.823493333333333,0.815129597967925,0.847125543751909,0.819927852628077,0.828483048702628,0.0191754521582077 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_deviance_explained,5,0.240858392609539,0.229287932861753,0.282840102014879,0.234870911391229,0.250773020824705,0.0333046711345811 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_rmse,5,0.223331046901821,0.21469247206876,0.227275887816135,0.223331046901821,0.221804231165123,0.00746931749125918 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_spearman,5,0.319693927847967,0.314626273281237,0.331123877059782,0.313170610278462,0.321987168463127,0.00854028427675327 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_calibration_slope,5,0.926166715024209,0.8521293240645,0.969181499315011,0.926166715024209,0.911949295173001,0.0594253375701516 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_prevalence,5,0.0875912408759124,0.0815913826315997,0.0946898807160816,0.0874316939890711,0.0882209860082516,0.00699025063520411 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,insample_n,5,693,685.8,936.8,1098,771.6,182.509725768245 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_auc,4,0.77744050520223,0.771065167348639,0.803486958443855,,0.784465903555099,0.0194119950156149 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_deviance_explained,4,0.17108179189974,0.0694866534919466,0.192858665045726,,0.142575268591952,0.0750549614358755 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_rmse,4,0.226318832277226,0.216290927259541,0.250116289221731,,0.231236529393947,0.0196223161851492 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_spearman,4,0.278455188286047,0.262015370235656,0.285433310292326,,0.275076011127436,0.0140713668010713 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_calibration_slope,4,0.751176575138291,0.529405518004174,0.815471311990914,,0.694935032180614,0.168343487942426 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_prevalence,4,0.0837295205104187,0.0742110480309994,0.0991029746633899,,0.0858205853938301,0.0138195684717859 +mammal,mammal_winter,south,winter,hurdle,Moose_Winter,oob_n,5,405,161.2,412.2,0,326.4,182.509725768245 +mite,mite,north,,,Ceratozetes.gracilis,insample_auc,5,0.793023395932593,0.785116760768433,0.797585561245424,0.791183069113511,0.791977110922841,0.00673340419157571 +mite,mite,north,,,Ceratozetes.gracilis,insample_deviance_explained,5,0.134692532005047,0.108608328871156,0.141811919550427,0.125527507164404,0.128052047876132,0.0184307041865782 +mite,mite,north,,,Ceratozetes.gracilis,insample_rmse,5,0.364641744759417,0.36299256091057,0.368618183340602,0.364308079016483,0.365438034871869,0.00324688670297244 +mite,mite,north,,,Ceratozetes.gracilis,insample_spearman,5,0.41429348998048,0.402422002613553,0.419681351800533,0.409677886636093,0.412099312835312,0.00911372223585555 +mite,mite,north,,,Ceratozetes.gracilis,insample_calibration_slope,5,1.0224894029886,1.00755092646514,1.03915812721702,1.0224894029886,1.02287359767688,0.0156175294996684 +mite,mite,north,,,Ceratozetes.gracilis,insample_prevalence,5,0.211169769380383,0.208505864577966,0.211369634473166,0.208369812642269,0.210190443530451,0.00151474200965215 +mite,mite,north,,,Ceratozetes.gracilis,insample_n,5,3651,3606.6,4890.2,5711,4047.6,930.188045504779 +mite,mite,north,,,Ceratozetes.gracilis,oob_auc,4,0.779665972511523,0.773198985489411,0.798395168992114,,0.784045333032408,0.0147724589078592 +mite,mite,north,,,Ceratozetes.gracilis,oob_deviance_explained,4,0.0923986988857812,0.0862667569754759,0.144304465844404,,0.108746493545894,0.037849846139005 +mite,mite,north,,,Ceratozetes.gracilis,oob_rmse,4,0.36680003014665,0.360411853868392,0.368997514633471,,0.365303354506851,0.00518143947194182 +mite,mite,north,,,Ceratozetes.gracilis,oob_spearman,4,0.389977816116695,0.383012434237582,0.415943717902066,,0.396763716083216,0.0196903404412637 +mite,mite,north,,,Ceratozetes.gracilis,oob_calibration_slope,4,0.956222238793897,0.921365026616042,1.05973298874715,,0.980741359427966,0.0799378045179831 +mite,mite,north,,,Ceratozetes.gracilis,oob_prevalence,4,0.203407429558746,0.203105380508127,0.206516438658429,,0.204409915290554,0.0022495255846381 +mite,mite,north,,,Ceratozetes.gracilis,oob_n,5,2060,820.8,2104.4,0,1663.4,930.188045504779 +mite,mite,north,,,Ceratozetes.gracilis,v2val_Climate,5,0.738382414749567,0.734358129806975,0.742005285315151,0.738382414749567,0.738111987253943,0.00384260421914782 +mite,mite,north,,,Ceratozetes.gracilis,v2val_Climate_Truncated,5,0.738392463572007,0.734342356311168,0.742026178178654,0.738392463572007,0.738117914905037,0.00385983439540224 +mite,mite,north,,,Ceratozetes.gracilis,v2val_Landcover,5,0.766722893536977,0.759062628411847,0.772422596192916,0.766722893536977,0.766125561315905,0.00683173671440066 +mite,mite,north,,,Ceratozetes.gracilis,v2val_Full,5,0.793023395932593,0.785116760768433,0.797585561245424,0.791183069113511,0.791977110922841,0.00673340419157571 +mite,mite,north,,,Ceratozetes.gracilis,v2val_Full_Truncated,5,0.793016443892401,0.785027851595894,0.797500866905145,0.791105466738786,0.791908988560901,0.00674045451455018 +mite,mite,north,,,Ceratozetes.gracilis,v2val_Full_Joint,5,0.793386060695946,0.785055839040043,0.797509252679056,0.791225262500488,0.792011165992849,0.00676871644676792 +mite,mite,north,,,Ceratozetes.gracilis,v2val_Full_Joint_Truncated,5,0.793386524165292,0.784963217939285,0.797444970586129,0.7911589984368,0.791952343573282,0.00679046380342073 +mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Climate,4,0.731027419469463,0.725410991997312,0.741834431700471,,0.732881199740483,0.00906851156052711 +mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Climate_Truncated,4,0.731045119285728,0.72540173801145,0.741842884282973,,0.732885970615359,0.00907305785634944 +mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Landcover,4,0.752661723212296,0.748458309671417,0.773156655512682,,0.758480122769263,0.0155945518677711 +mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Full,4,0.779665972511523,0.773198985489411,0.798395168992114,,0.784045333032408,0.0147724589078592 +mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Full_Truncated,4,0.77962848748914,0.773216243029163,0.798382692848602,,0.784036330667528,0.014780937706049 +mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Full_Joint,4,0.779066438961531,0.77354347637541,0.798343558984922,,0.78397863804627,0.0148677753889034 +mite,mite,north,,,Ceratozetes.gracilis,oob_v2val_Full_Joint_Truncated,4,0.779044896212606,0.773564180389716,0.798356007315929,,0.783984323098475,0.01488666359881 +mite,mite,north,,,Trhypochthonius.tectorum,insample_auc,5,0.672907942808574,0.669208813819547,0.682343647003947,0.669778092188547,0.674857259308144,0.0070191421865739 +mite,mite,north,,,Trhypochthonius.tectorum,insample_deviance_explained,5,-0.0324180258517079,-0.0527646417815135,-0.0101623689114898,-0.0407269697080057,-0.0321707940218346,0.0231090933708154 +mite,mite,north,,,Trhypochthonius.tectorum,insample_rmse,5,0.288562681524747,0.286522184662904,0.291945228269945,0.288562681524747,0.288981155568958,0.00296084278549151 +mite,mite,north,,,Trhypochthonius.tectorum,insample_spearman,5,0.174619892294846,0.172564649955749,0.187939106716607,0.1729413278484,0.178541440689235,0.00902094001424548 +mite,mite,north,,,Trhypochthonius.tectorum,insample_calibration_slope,5,0.938290627841302,0.909627160028179,0.994839719200875,0.931192865479756,0.95045611024787,0.0429430392043578 +mite,mite,north,,,Trhypochthonius.tectorum,insample_prevalence,5,0.0956049728593941,0.0940001763114542,0.0987931854359719,0.0956049728593941,0.0960754727002272,0.00270898671716411 +mite,mite,north,,,Trhypochthonius.tectorum,insample_n,5,3624,3599.2,4881,5711,4034.4,937.384819591186 +mite,mite,north,,,Trhypochthonius.tectorum,oob_auc,4,0.651421835190664,0.64513479278205,0.663121005511504,,0.653354738016459,0.00989688245354325 +mite,mite,north,,,Trhypochthonius.tectorum,oob_deviance_explained,4,-0.0625612551961812,-0.104386756333539,-0.0317884651562399,,-0.066508652016687,0.0413281120013629 +mite,mite,north,,,Trhypochthonius.tectorum,oob_rmse,4,0.289482213990474,0.281791769789717,0.293681830417276,,0.28823548978549,0.00666038076943173 +mite,mite,north,,,Trhypochthonius.tectorum,oob_spearman,4,0.153802350804888,0.145130738202924,0.167192976536939,,0.155487712637062,0.0120299047392454 +mite,mite,north,,,Trhypochthonius.tectorum,oob_calibration_slope,4,0.866440051991562,0.715195080326882,0.99057532202289,,0.856758015693936,0.149800198792233 +mite,mite,north,,,Trhypochthonius.tectorum,oob_prevalence,4,0.0963264503316864,0.0893459374618542,0.0984905896614327,,0.0946063169245129,0.00535078906761863 +mite,mite,north,,,Trhypochthonius.tectorum,oob_n,5,2087,830,2111.8,0,1676.6,937.384819591186 +mite,mite,north,,,Trhypochthonius.tectorum,v2val_Climate,5,0.646091585413555,0.643946189711462,0.652343816700896,0.646091585413555,0.647435005669506,0.00501081050104212 +mite,mite,north,,,Trhypochthonius.tectorum,v2val_Climate_Truncated,5,0.646095557008706,0.643948358640746,0.65233771826661,0.646095557008706,0.647436539502018,0.00500120525659027 +mite,mite,north,,,Trhypochthonius.tectorum,v2val_Landcover,5,0.637987440117159,0.627044747234771,0.648796943002273,0.637987440117159,0.637774648879966,0.0120277548025983 +mite,mite,north,,,Trhypochthonius.tectorum,v2val_Full,5,0.672907942808574,0.669208813819547,0.682343647003947,0.669778092188547,0.674857259308144,0.0070191421865739 +mite,mite,north,,,Trhypochthonius.tectorum,v2val_Full_Truncated,5,0.672968462835808,0.669234243838635,0.682370652186889,0.669767986128102,0.67489223986993,0.00700566517575936 +mite,mite,north,,,Trhypochthonius.tectorum,v2val_Full_Joint,5,0.673039662867848,0.668775078579256,0.682456515305188,0.66926215120794,0.674743399528349,0.00725984991743693 +mite,mite,north,,,Trhypochthonius.tectorum,v2val_Full_Joint_Truncated,5,0.673102852896284,0.66877285388055,0.682481051437855,0.669242116386356,0.674767969249559,0.0072566620089462 +mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Climate,4,0.637448091750764,0.62319195321542,0.64083947116042,,0.633567820634447,0.0109633746747622 +mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Climate_Truncated,4,0.637447116712891,0.623191511787853,0.640852747518307,,0.633572125955883,0.0109617111390789 +mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Landcover,4,0.619482659509824,0.616517647587969,0.622452812919573,,0.6194844957555,0.00319182447037644 +mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Full,4,0.651421835190664,0.64513479278205,0.663121005511504,,0.653354738016459,0.00989688245354325 +mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Full_Truncated,4,0.651598760851872,0.645145346470754,0.66328863933151,,0.653468926601344,0.00996350123797742 +mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Full_Joint,4,0.650909465977038,0.643507260329979,0.663048883832917,,0.652601327480188,0.0106588967286394 +mite,mite,north,,,Trhypochthonius.tectorum,oob_v2val_Full_Joint_Truncated,4,0.65107837071969,0.643490423905209,0.66321170510179,,0.652701723422411,0.0107382013149323 +mite,mite,south,,,Ceratozetes.gracilis,insample_auc,5,0.883740175681923,0.875951595662976,0.884218489485534,0.880842240129472,0.881127727799286,0.00491960965959818 +mite,mite,south,,,Ceratozetes.gracilis,insample_deviance_explained,5,0.169227984866749,0.102917912757133,0.174897444771582,0.169227984866749,0.148837676671015,0.0479777276568308 +mite,mite,south,,,Ceratozetes.gracilis,insample_rmse,5,0.223410917578014,0.207894263041054,0.228617168412238,0.215105469199925,0.219622699857429,0.0107678160117743 +mite,mite,south,,,Ceratozetes.gracilis,insample_spearman,5,0.304054710362117,0.292604158893579,0.321411532274628,0.304054710362117,0.306352068526036,0.0145523795554875 +mite,mite,south,,,Ceratozetes.gracilis,insample_calibration_slope,5,0.646501812554423,0.571714943118018,0.663896293625869,0.652084939529121,0.625798242702713,0.0510970524920574 +mite,mite,south,,,Ceratozetes.gracilis,insample_prevalence,5,0.056970509383378,0.0521775638545351,0.0622115928022082,0.0562843842573,0.0572190090351997,0.00535467847864499 +mite,mite,south,,,Ceratozetes.gracilis,insample_n,5,1494,1479.4,2024.6,2363,1667.4,389.193139713433 +mite,mite,south,,,Ceratozetes.gracilis,oob_auc,4,0.877556363090999,0.870858501486971,0.891246533596325,,0.880053616270034,0.0119804912573777 +mite,mite,south,,,Ceratozetes.gracilis,oob_deviance_explained,4,0.149139947228324,0.081863654137057,0.211545016984438,,0.147400224608626,0.0705190613624988 +mite,mite,south,,,Ceratozetes.gracilis,oob_rmse,4,0.217549055983636,0.21158190570823,0.223701160718158,,0.217615111147606,0.00687714178519329 +mite,mite,south,,,Ceratozetes.gracilis,oob_spearman,4,0.297912570168464,0.269110530526911,0.325939210959734,,0.297635642007648,0.0304788257744718 +mite,mite,south,,,Ceratozetes.gracilis,oob_calibration_slope,4,0.588033894967732,0.50519914194533,0.720419749435623,,0.60573071691255,0.11934507589046 +mite,mite,south,,,Ceratozetes.gracilis,oob_prevalence,4,0.0533392883804503,0.0452752248602848,0.0645232647455575,,0.0544535429679295,0.0107814199736608 +mite,mite,south,,,Ceratozetes.gracilis,oob_n,5,869,338.4,883.6,0,695.6,389.193139713433 +mite,mite,south,,,Ceratozetes.gracilis,v2val_Climate,5,0.738382414749567,0.734358129806975,0.742005285315151,0.738382414749567,0.738111987253943,0.00384260421914782 +mite,mite,south,,,Ceratozetes.gracilis,v2val_Climate_Truncated,5,0.738392463572007,0.734342356311168,0.742026178178654,0.738392463572007,0.738117914905037,0.00385983439540224 +mite,mite,south,,,Ceratozetes.gracilis,v2val_Landcover,5,0.722020131552721,0.71607655717679,0.728899344516339,0.719697225125594,0.722583698825812,0.00643427629050986 +mite,mite,south,,,Ceratozetes.gracilis,v2val_Full,5,0.883740175681923,0.875951595662976,0.884218489485534,0.880842240129472,0.881127727799286,0.00491960965959818 +mite,mite,south,,,Ceratozetes.gracilis,v2val_Full_Truncated,5,0.883740175681923,0.875951595662976,0.884218489485534,0.880842240129472,0.881127727799286,0.00491960965959818 +mite,mite,south,,,Ceratozetes.gracilis,v2val_Full_Joint,5,0.883869625520111,0.877386169471364,0.884867266298163,0.880966991469706,0.88186690451822,0.00416238011000395 +mite,mite,south,,,Ceratozetes.gracilis,v2val_Full_Joint_Truncated,5,0.883869625520111,0.877386169471364,0.884867266298163,0.880966991469706,0.88186690451822,0.00416238011000395 +mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Climate,4,0.731027419469463,0.725410991997312,0.741834431700471,,0.732881199740483,0.00906851156052711 +mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Climate_Truncated,4,0.731045119285728,0.72540173801145,0.741842884282973,,0.732885970615359,0.00907305785634944 +mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Landcover,4,0.704830138651714,0.697578522816295,0.713165675388293,,0.705217253259271,0.00876901015163448 +mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Full,4,0.877556363090999,0.870858501486971,0.891246533596325,,0.880053616270034,0.0119804912573777 +mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Full_Truncated,4,0.877556363090999,0.870858501486971,0.891281973045494,,0.880066273216166,0.0120040417679418 +mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Full_Joint,4,0.87838605738981,0.870791888918913,0.892459363692493,,0.880700035186876,0.0128370905847578 +mite,mite,south,,,Ceratozetes.gracilis,oob_v2val_Full_Joint_Truncated,4,0.87838605738981,0.870791888918913,0.892494803141663,,0.880712692133008,0.012860350145155 +mite,mite,south,,,Trhypochthonius.tectorum,insample_auc,5,0.714545787058589,0.69969622945697,0.724109648011322,0.705313075635924,0.712537633834069,0.0121603195766141 +mite,mite,south,,,Trhypochthonius.tectorum,insample_deviance_explained,5,-2.20551740843788e-05,-0.00644243886806564,0.0163984110082346,0.01492775208855,0.00397390748081414,0.0114643898167834 +mite,mite,south,,,Trhypochthonius.tectorum,insample_rmse,5,0.269858367078513,0.266406986696229,0.272808873150662,0.270464873051431,0.269513931566532,0.00330133552867803 +mite,mite,south,,,Trhypochthonius.tectorum,insample_spearman,5,0.210611679646456,0.189085620295154,0.213764285932634,0.196610759018781,0.203586560421865,0.0130220945300142 +mite,mite,south,,,Trhypochthonius.tectorum,insample_calibration_slope,5,0.964366086336983,0.916309849664698,0.989356334697425,0.964366086336983,0.955309012900657,0.0368054765299321 +mite,mite,south,,,Trhypochthonius.tectorum,insample_prevalence,5,0.0833685992382565,0.0807473443243282,0.0863035095821866,0.0833685992382565,0.083401335320589,0.00299510185415199 +mite,mite,south,,,Trhypochthonius.tectorum,insample_n,5,1489,1484.4,2017.4,2363,1664.2,390.68875079787 +mite,mite,south,,,Trhypochthonius.tectorum,oob_auc,4,0.669707753515078,0.654014549095664,0.683226886999099,,0.66893129960958,0.0157013541907933 +mite,mite,south,,,Trhypochthonius.tectorum,oob_deviance_explained,4,0.0238861350837344,-0.00501344344448882,0.0319775842734965,,0.0164546603199983,0.0222551548342608 +mite,mite,south,,,Trhypochthonius.tectorum,oob_rmse,4,0.275344693909917,0.2660800590245,0.279902566485838,,0.273663707370811,0.00770431969533571 +mite,mite,south,,,Trhypochthonius.tectorum,oob_spearman,4,0.16338068295489,0.142721241028181,0.180002438567577,,0.161938652128453,0.0200563721519488 +mite,mite,south,,,Trhypochthonius.tectorum,oob_calibration_slope,4,0.640530845430618,0.577798461860074,0.822553046730012,,0.68313435176235,0.143050298074835 +mite,mite,south,,,Trhypochthonius.tectorum,oob_prevalence,4,0.0842873358196854,0.0775201528145626,0.0881856815952926,,0.0832627510948584,0.00595703320150957 +mite,mite,south,,,Trhypochthonius.tectorum,oob_n,5,874,345.6,878.6,0,698.8,390.68875079787 +mite,mite,south,,,Trhypochthonius.tectorum,v2val_Climate,5,0.646091585413555,0.643946189711462,0.652343816700896,0.646091585413555,0.647435005669506,0.00501081050104212 +mite,mite,south,,,Trhypochthonius.tectorum,v2val_Climate_Truncated,5,0.646095557008706,0.643948358640746,0.65233771826661,0.646095557008706,0.647436539502018,0.00500120525659027 +mite,mite,south,,,Trhypochthonius.tectorum,v2val_Landcover,5,0.671864124042916,0.659898184775652,0.684374697179488,0.660231262098608,0.671375041215641,0.0130121969567772 +mite,mite,south,,,Trhypochthonius.tectorum,v2val_Full,5,0.714545787058589,0.69969622945697,0.724109648011322,0.705313075635924,0.712537633834069,0.0121603195766141 +mite,mite,south,,,Trhypochthonius.tectorum,v2val_Full_Truncated,5,0.714545787058589,0.69969622945697,0.724109648011322,0.705313075635924,0.712537633834069,0.0121603195766141 +mite,mite,south,,,Trhypochthonius.tectorum,v2val_Full_Joint,5,0.714906009620713,0.700143210072346,0.72490193539616,0.705786473932628,0.713089166909465,0.012325737475379 +mite,mite,south,,,Trhypochthonius.tectorum,v2val_Full_Joint_Truncated,5,0.714906009620713,0.700143210072346,0.72490193539616,0.705786473932628,0.713089166909465,0.012325737475379 +mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Climate,4,0.637448091750764,0.62319195321542,0.64083947116042,,0.633567820634447,0.0109633746747622 +mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Climate_Truncated,4,0.637447116712891,0.623191511787853,0.640852747518307,,0.633572125955883,0.0109617111390789 +mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Landcover,4,0.613895073569526,0.611766319340838,0.647057552774624,,0.624978546775387,0.0240120090979382 +mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Full,4,0.669707753515078,0.654014549095664,0.683226886999099,,0.66893129960958,0.0157013541907933 +mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Full_Truncated,4,0.669707753515078,0.654014549095664,0.683226886999099,,0.66893129960958,0.0157013541907933 +mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Full_Joint,4,0.670252865183779,0.654581402849557,0.683544630202293,,0.669402973285312,0.0155825833517288 +mite,mite,south,,,Trhypochthonius.tectorum,oob_v2val_Full_Joint_Truncated,4,0.670252865183779,0.654581402849557,0.683544630202293,,0.669402973285312,0.0155825833517288 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_auc,5,0.830322798090827,0.829752014715758,0.833521610487142,0.830322798090827,0.831256480687861,0.00210224952478856 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_deviance_explained,5,0.169049735433044,0.156535489819263,0.180380243811949,0.172184312829234,0.16845440325201,0.01233664255535 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_rmse,5,0.406331801158912,0.404646760463192,0.406711203597052,0.406706951792596,0.405904427434075,0.00126412825140784 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_spearman,5,0.564448272444098,0.564022722895439,0.568538539772008,0.564448272444098,0.565752949420103,0.002625462296498 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_calibration_slope,5,0.979847210350883,0.969126982244339,0.991954887525608,0.979847210350883,0.980520168665477,0.0114519899974685 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_prevalence,5,0.418242653476869,0.411391418988775,0.421189975169674,0.418242653476869,0.416870814782784,0.00501851999449775 +vascular_plant,vascular_plant,north,,,Galium.boreale,insample_n,5,4366,4320.2,5874.4,6874,4851.6,1130.83522230252 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_auc,4,0.825970385744679,0.820899166013025,0.829858683383589,,0.825547913568699,0.00483682169731863 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_deviance_explained,4,0.180338934815369,0.153363367618616,0.193673751289778,,0.175467238128817,0.0239800671027935 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_rmse,4,0.409024585589369,0.407545829323972,0.412796643199926,,0.409843621784069,0.00304952623195646 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_spearman,4,0.556036446141893,0.549781718602555,0.564239538039467,,0.556732290555549,0.00779665231289283 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_calibration_slope,4,0.961989811631539,0.953282864779601,0.97698898933143,,0.964237036934379,0.0130331463165358 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_prevalence,4,0.419241311741466,0.413108455574493,0.430771977433407,,0.421169100857526,0.00978800188867454 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_n,5,2508,999.6,2553.8,0,2022.4,1130.83522230252 +vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Climate,5,0.688882537608652,0.686220497467121,0.693315342224415,0.691923775211569,0.689606019273988,0.00355153250685828 +vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Climate_Truncated,5,0.688853782361867,0.686211230349888,0.693311107621612,0.691928871889894,0.689595671925047,0.00355473297057612 +vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Landcover,5,0.806658535413912,0.804749026795703,0.81034804923884,0.804887352272851,0.807185726647177,0.00308448997445622 +vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Full,5,0.830322798090827,0.829752014715758,0.833521610487142,0.830322798090827,0.831256480687861,0.00210224952478856 +vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Full_Truncated,5,0.830433260489035,0.829860825639713,0.833584571804586,0.830433260489035,0.83134635595991,0.00208467504714064 +vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Full_Joint,5,0.82780564706394,0.827522559630011,0.831849313017971,0.82780564706394,0.829181386915621,0.00243189954325233 +vascular_plant,vascular_plant,north,,,Galium.boreale,v2val_Full_Joint_Truncated,5,0.827924459375713,0.827636541171172,0.831943133083281,0.827924459375713,0.829288457143518,0.0024223441955198 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Climate,4,0.69847723797285,0.691752649872066,0.699715919161363,,0.696517985504182,0.00490694367651728 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Climate_Truncated,4,0.698467309951771,0.691745994349179,0.699715497383917,,0.696512621319469,0.0049068149193327 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Landcover,4,0.798538423391199,0.793813753185317,0.801044488836154,,0.797746064548011,0.0039851186104012 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Full,4,0.825970385744679,0.820899166013025,0.829858683383589,,0.825547913568699,0.00483682169731863 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Full_Truncated,4,0.826084368160094,0.821025133464921,0.829955751376353,,0.825660135489053,0.00481955559769384 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Full_Joint,4,0.822407455245542,0.816503165651276,0.825556259025818,,0.821423353169117,0.00501007923907512 +vascular_plant,vascular_plant,north,,,Galium.boreale,oob_v2val_Full_Joint_Truncated,4,0.822548387109745,0.816621603632805,0.825661726608092,,0.821543585688819,0.00501141542481554 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_auc,5,0.836315133959189,0.831991084674704,0.837528607951877,0.834425701496386,0.835217103556636,0.00298930683727749 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_deviance_explained,5,0.154953219466334,0.129409063699085,0.172774430677382,0.160280734393984,0.151845840183807,0.0222292641700649 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_rmse,5,0.397835953480652,0.39520050591856,0.39953977885822,0.397892542228527,0.397399168674453,0.00225088132355584 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_spearman,5,0.565718307196976,0.558075214292711,0.566158340164243,0.561646901356684,0.563051440283389,0.00452676813056749 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_calibration_slope,5,1.00378490707536,0.996670213069317,1.00931321625889,1.00546871573532,1.00306243102853,0.00640638209817766 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_prevalence,5,0.377654931626418,0.37492184315556,0.38072781584232,0.377654931626418,0.377957278345016,0.00308047552556824 +vascular_plant,vascular_plant,north,,,Vicia.americana,insample_n,5,4329,4315.8,5874,6874,4842.2,1136.06104589498 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_auc,4,0.829938952959948,0.828125419425383,0.835304874971869,,0.831207663130432,0.00415809140956838 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_deviance_explained,4,0.177626825486026,0.135153586377154,0.21154877519812,,0.174572793558605,0.0427317407176602 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_rmse,4,0.400006137187779,0.39713029702198,0.40231573999719,,0.399803909560497,0.0030220247869821 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_spearman,4,0.554463344935879,0.551184680243305,0.562068414950895,,0.556008489693894,0.00617058608931537 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_calibration_slope,4,0.988524116774644,0.97389136931948,1.00993315311349,,0.990944219947388,0.0195740205696745 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_prevalence,4,0.375247544204322,0.372430611979277,0.382966913772923,,0.376998414684163,0.00599903919350225 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_n,5,2545,1000,2558.2,0,2031.8,1136.06104589498 +vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Climate,5,0.688388374288585,0.686629323150551,0.697141250977293,0.688388374288585,0.69087203080297,0.00615433602729216 +vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Climate_Truncated,5,0.688377053340582,0.686621028690138,0.697132635984666,0.688377053340582,0.690862704228311,0.00615461616566359 +vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Landcover,5,0.812599770966484,0.806923106797722,0.814411627611935,0.809938249660894,0.811141578894183,0.00400693028240299 +vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Full,5,0.836315133959189,0.831991084674704,0.837528607951877,0.834425701496386,0.835217103556636,0.00298930683727749 +vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Full_Truncated,5,0.836225603913632,0.831944005617998,0.837453646171789,0.834353666337466,0.835150674964538,0.0029708276538074 +vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Full_Joint,5,0.836242738307649,0.831840647476923,0.837075962254889,0.833795663987679,0.834913342412997,0.00279108797567405 +vascular_plant,vascular_plant,north,,,Vicia.americana,v2val_Full_Joint_Truncated,5,0.836167732781523,0.831822036390158,0.836995692851111,0.833746590035665,0.834858253988271,0.00275653331501612 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Climate,4,0.687058088763642,0.673058403439112,0.691946304395709,,0.683803992444905,0.0115178096712181 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Climate_Truncated,4,0.687038471404578,0.673051662415016,0.691940326726772,,0.683793845094804,0.0115133321710675 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Landcover,4,0.807847376592108,0.801759141298583,0.811699920923116,,0.807048915534066,0.00558077270332568 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Full,4,0.829938952959948,0.828125419425383,0.835304874971869,,0.831207663130432,0.00415809140956838 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Full_Truncated,4,0.829888329553378,0.828175765215782,0.835181080251946,,0.831166967539439,0.00409066773151742 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Full_Joint,4,0.828971535109331,0.826291764196716,0.83479597749998,,0.830094632065772,0.00475621189002634 +vascular_plant,vascular_plant,north,,,Vicia.americana,oob_v2val_Full_Joint_Truncated,4,0.828915617285276,0.826336395712055,0.834689140179746,,0.830056439185722,0.00469352433889885 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_auc,5,0.890081979393699,0.886120541286867,0.900531693288428,0.890081979393699,0.8925816929913,0.0074671519015807 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_deviance_explained,5,0.376511843709018,0.359648245967408,0.39273006526476,0.36183949121173,0.375558492410363,0.0170745413457127 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_rmse,5,0.308360864442848,0.306833389069796,0.315704381717812,0.312233283277407,0.31046772667452,0.00475923236811526 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_spearman,5,0.561632279820523,0.56034731464871,0.575734647134824,0.561632279820523,0.565885670838601,0.0104854350954813 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_calibration_slope,5,0.980281716931255,0.970651842047086,0.998280590750127,0.982887664309838,0.982912614118871,0.0154729818019227 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_prevalence,5,0.222088835534214,0.217190546592102,0.228625506806496,0.222054380664653,0.222881775063893,0.00607679419012681 +vascular_plant,vascular_plant,south,,,Galium.boreale,insample_n,5,1692,1666,2267.2,2648,1873.6,433.131388841769 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_auc,4,0.884065848019888,0.870449780280702,0.894068384737495,,0.882775301226467,0.0128406847119162 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_deviance_explained,4,0.334099694985671,0.299899048318077,0.344909076796622,,0.325745671822584,0.0279649666452476 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_rmse,4,0.322280229393816,0.311448708149722,0.324570568538386,,0.319229807215414,0.0080667999016699 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_spearman,4,0.558011118128369,0.532461517776284,0.559103143514103,,0.549276269926101,0.0182973871982467 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_calibration_slope,4,0.947730194323529,0.912734464703454,0.971381900858514,,0.943678757507426,0.0317919329981155 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_prevalence,4,0.218666030567013,0.210018355611084,0.23207994955219,,0.220368260577459,0.0121728164316861 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_n,5,956,380.8,982,0,774.4,433.131388841769 +vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Climate,5,0.688882537608652,0.686220497467121,0.693315342224415,0.691923775211569,0.689606019273988,0.00355153250685828 +vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Climate_Truncated,5,0.688853782361867,0.686211230349888,0.693311107621612,0.691928871889894,0.689595671925047,0.00355473297057612 +vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Landcover,5,0.795978634172116,0.790420342908561,0.808241109353126,0.795978634172116,0.79826909072766,0.00925670982213445 +vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Full,5,0.890081979393699,0.886120541286867,0.900531693288428,0.890081979393699,0.8925816929913,0.0074671519015807 +vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Full_Truncated,5,0.890081979393699,0.886107519131847,0.900531693288428,0.890081979393699,0.892577213245043,0.00747321026543204 +vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Full_Joint,5,0.885428136469803,0.879749497228007,0.894203850953663,0.88338493164256,0.886730028942607,0.00724717960067507 +vascular_plant,vascular_plant,south,,,Galium.boreale,v2val_Full_Joint_Truncated,5,0.885423965632299,0.87972024605796,0.894203850953663,0.88338493164256,0.886719444385091,0.00726319634118945 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Climate,4,0.69847723797285,0.691752649872066,0.699715919161363,,0.696517985504182,0.00490694367651728 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Climate_Truncated,4,0.698467309951771,0.691745994349179,0.699715497383917,,0.696512621319469,0.0049068149193327 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Landcover,4,0.785174421252252,0.769559195023864,0.799812878397794,,0.784825575151236,0.016225503840661 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Full,4,0.884065848019888,0.870449780280702,0.894068384737495,,0.882775301226467,0.0128406847119162 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Full_Truncated,4,0.884061344921756,0.870449780280702,0.894063477626334,,0.882772262087301,0.0128382393423392 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Full_Joint,4,0.873729773605152,0.862934967954651,0.88650495339372,,0.874437050083033,0.0129679425986572 +vascular_plant,vascular_plant,south,,,Galium.boreale,oob_v2val_Full_Joint_Truncated,4,0.873725270507021,0.862934967954651,0.886486814768876,,0.874429285403265,0.0129581962884508 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_auc,5,0.805930865573238,0.802524114144756,0.807930971919586,0.808012980346143,0.805492289441972,0.00279684596223116 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_deviance_explained,5,0.166618669672263,0.15835736048416,0.197983766968233,0.179903957587885,0.174785331031235,0.0215605448558036 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_rmse,5,0.381878187765555,0.378497935845721,0.383275373980955,0.380313032587985,0.381159180017538,0.00249488775218777 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_spearman,5,0.465238638302507,0.460583361067045,0.473614426763325,0.470529100145484,0.466694650560087,0.00654368164273618 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_calibration_slope,5,0.933688472158773,0.920475046205582,0.947214542702693,0.933688472158773,0.933156328591101,0.0138732265313946 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_prevalence,5,0.264350453172205,0.25911663216011,0.270295509723619,0.264350453172205,0.264443478235907,0.00620048832939598 +vascular_plant,vascular_plant,south,,,Vicia.americana,insample_n,5,1685,1649.4,2266.4,2648,1865.6,437.838212128635 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_auc,4,0.807298000134658,0.803023991535991,0.814183808910683,,0.808230785912286,0.0060785023634324 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_deviance_explained,4,0.201855986026952,0.138430007183509,0.206184030963771,,0.180749581060301,0.0455406997595895 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_rmse,4,0.37987633843542,0.378039277925496,0.38526074563498,,0.381143247967433,0.00422553209428043 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_spearman,4,0.471049244528984,0.458945127185501,0.481459447588745,,0.47044427514194,0.0124124270312768 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_calibration_slope,4,0.934673431866213,0.911850976434992,0.962640657947191,,0.936510849955412,0.0273611637238912 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_prevalence,4,0.266148052343275,0.252246321440467,0.273763588267456,,0.263902982708051,0.0122396324927964 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_n,5,963,381.6,998.6,0,782.4,437.838212128635 +vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Climate,5,0.688388374288585,0.686629323150551,0.697141250977293,0.688388374288585,0.69087203080297,0.00615433602729216 +vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Climate_Truncated,5,0.688377053340582,0.686621028690138,0.697132635984666,0.688377053340582,0.690862704228311,0.00615461616566359 +vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Landcover,5,0.761379244969105,0.759537679717784,0.765001614229777,0.76658587562335,0.762041460585166,0.00296099903341381 +vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Full,5,0.805930865573238,0.802524114144756,0.807930971919586,0.808012980346143,0.805492289441972,0.00279684596223116 +vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Full_Truncated,5,0.805930865573238,0.802524057680271,0.807932999886811,0.808015180404811,0.805493243742915,0.0027981951952029 +vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Full_Joint,5,0.802576290466739,0.799474271873651,0.804841725613092,0.804804561454972,0.802383816798592,0.00280990996220882 +vascular_plant,vascular_plant,south,,,Vicia.americana,v2val_Full_Joint_Truncated,5,0.802576290466739,0.799476478074435,0.804843080852285,0.804805294807862,0.802385231980135,0.00280955135311763 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Climate,4,0.687058088763642,0.673058403439112,0.691946304395709,,0.683803992444905,0.0115178096712181 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Climate_Truncated,4,0.687038471404578,0.673051662415016,0.691940326726772,,0.683793845094804,0.0115133321710675 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Landcover,4,0.774223898160634,0.769748999911181,0.777668369854279,,0.773855888676417,0.00434521003225348 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Full,4,0.807298000134658,0.803023991535991,0.814183808910683,,0.808230785912286,0.0060785023634324 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Full_Truncated,4,0.807292347351227,0.803023991535991,0.814176792476235,,0.808226664961859,0.00607512490581962 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Full_Joint,4,0.805961431482898,0.801581678357063,0.812743710082227,,0.80681947629486,0.00606828197945081 +vascular_plant,vascular_plant,south,,,Vicia.americana,oob_v2val_Full_Joint_Truncated,4,0.805961431482898,0.801581678357063,0.812736460553446,,0.806816887177438,0.00606401787708264 diff --git a/3_output/exp_000_parity_v2/tables/parity_summary.csv b/3_output/exp_000_parity_v2/tables/parity_summary.csv new file mode 100644 index 0000000..bc9bbba --- /dev/null +++ b/3_output/exp_000_parity_v2/tables/parity_summary.csv @@ -0,0 +1,23 @@ +taxon,region,stage,comparison,species,terms_compared,min_draws,in_band_pct,reachable_terms,reachable_in_band_pct,median_standardized_difference,median_absolute_difference,max_absolute_difference,negligible_terms,median_spearman,median_band_ratio,verdict,indicative_verdict +bird,north,climate,median,2,20,5,90,20,90,0.351,0,0.651,0,1,0.694,not gated (store holds 5 draws), +bryophyte,north,climate,median,1,19,5,94.7,19,94.7,0.671,0,1.81,5,0.991,0.214,not gated (store holds 5 draws), +lichen,north,climate,median,2,38,5,89.5,38,89.5,0.003,0,1.99,17,0.991,0.301,not gated (store holds 5 draws), +mite,north,climate,median,2,38,5,94.7,38,94.7,0.082,0,3.79,20,0.973,0.656,not gated (store holds 5 draws), +vascular_plant,north,climate,median,2,38,5,97.4,38,97.4,0,0,0.12,24,0.982,0.602,not gated (store holds 5 draws), +bird,south,climate,median,2,20,5,90,20,90,0.351,0,0.651,0,1,0.694,not gated (store holds 5 draws), +bryophyte,south,climate,median,1,19,5,94.7,19,94.7,0.671,0,1.81,5,0.991,0.214,not gated (store holds 5 draws), +lichen,south,climate,median,2,38,5,89.5,38,89.5,0.003,0,1.99,17,0.991,0.301,not gated (store holds 5 draws), +mite,south,climate,median,2,38,5,94.7,38,94.7,0.082,0,3.79,20,0.973,0.656,not gated (store holds 5 draws), +vascular_plant,south,climate,median,2,38,5,97.4,38,97.4,0,0,0.12,24,0.982,0.602,not gated (store holds 5 draws), +bird,north,habitat,median,2,178,5,92.7,168,92.3,0.569,0.023,2.82,0,0.989,0.699,not gated (store holds 5 draws), +bryophyte,north,habitat,median,1,94,5,98.9,94,98.9,0.36,0.062,0.256,0,0.987,0.502,not gated (store holds 5 draws), +lichen,north,habitat,median,2,188,5,94.7,188,94.7,0.251,0.038,0.289,0,0.996,0.642,not gated (store holds 5 draws), +mammal,north,habitat,iteration 1,2,448,4,100,436,100,0,0,9.77e-15,0,1,,not gated (trial run), +mite,north,habitat,median,1,94,5,76.6,94,76.6,0.579,0.078,0.673,0,0.993,0.642,not gated (store holds 5 draws), +vascular_plant,north,habitat,median,2,188,5,91.5,188,91.5,0.303,0.034,0.326,0,0.997,0.596,not gated (store holds 5 draws), +bird,south,habitat,median,2,46,5,80.4,40,77.5,0.334,0.021,0.121,0,0.995,0.508,not gated (store holds 5 draws), +bryophyte,south,habitat,median,1,19,5,100,19,100,0.399,0.066,0.267,0,0.991,0.633,not gated (store holds 5 draws), +lichen,south,habitat,median,2,40,5,87.5,40,87.5,0.337,0.048,0.655,1,0.985,0.554,not gated (store holds 5 draws), +mammal,south,habitat,iteration 1,2,126,5,100,120,100,0,0,5.33e-15,0,1,,not gated (trial run), +mite,south,habitat,median,2,40,5,95,40,95,0.175,0.03,0.754,1,0.992,0.581,not gated (store holds 5 draws), +vascular_plant,south,habitat,median,2,40,5,75,40,75,0.585,0.07,0.552,0,0.977,0.566,not gated (store holds 5 draws), From 70bbdaccdbb3389fcafaa20be963855cff8965be Mon Sep 17 00:00:00 2001 From: bgcasey Date: Tue, 6 Oct 2026 13:36:10 -0600 Subject: [PATCH 13/16] Refactor code for clarity and efficiency; update comments and headers across multiple scripts --- 1_code/_scratch.R | 5 - 1_code/_setup/01_harmonize_model_ready_v2.R | 2 +- .../07_harmonize_v2_plant_bootstrap_ids.R | 5 +- 1_code/_setup/run.R | 14 +- .../exp_000_parity_v2/02_plot_parity.R | 2 +- .../exp_000_parity_v2/utils/parity_targets.R | 4 +- .../exp_000_parity_v2/v2_self_agreement.R | 2 +- 1_code/harness/result.R | 1 + 1_code/harness/spec.R | 3 +- 1_code/modules/birds/standardize.R | 4 +- 1_code/tests/testthat/test-dataset.R | 16 +- 1_code/tests/testthat/test-methods.R | 16 +- 1_code/tests/testthat/test-new_experiment.R | 20 +- 1_code/tests/testthat/test-results.R | 16 +- 1_code/tests/testthat/test-specs.R | 16 +- code_audit_2026-10-06.md | 244 ++++++++++++++++++ 16 files changed, 339 insertions(+), 31 deletions(-) create mode 100644 code_audit_2026-10-06.md diff --git a/1_code/_scratch.R b/1_code/_scratch.R index 9bf49b2..a3df377 100644 --- a/1_code/_scratch.R +++ b/1_code/_scratch.R @@ -26,8 +26,3 @@ # --- # End of script ---- - -## 2026-09-09 ---- -load( - "\\\\abmi-data2\\science\\sc\\sdmMethodsDev\\0_data\\data_snapshots\\model_ready_v2\\mite-model-data.Rdata" -) diff --git a/1_code/_setup/01_harmonize_model_ready_v2.R b/1_code/_setup/01_harmonize_model_ready_v2.R index 3e229f7..8f41b90 100644 --- a/1_code/_setup/01_harmonize_model_ready_v2.R +++ b/1_code/_setup/01_harmonize_model_ready_v2.R @@ -2381,7 +2381,7 @@ for (matrix_name in names(prediction_matrices)) { # The four aggregate columns the vegetation models predict onto. # Their absence is what separates the snapshot's veg.pm from the # CSV the v2 scripts read, so it is reported here rather than -# found later by check_prediction_terms(). +# found later, at prediction time. veg_aggregates <- c("Peatland", "Mineral", "Upland", "CCR1234") absent_aggregates <- setdiff( veg_aggregates, diff --git a/1_code/_setup/07_harmonize_v2_plant_bootstrap_ids.R b/1_code/_setup/07_harmonize_v2_plant_bootstrap_ids.R index 46dae7a..4db7323 100644 --- a/1_code/_setup/07_harmonize_v2_plant_bootstrap_ids.R +++ b/1_code/_setup/07_harmonize_v2_plant_bootstrap_ids.R @@ -144,7 +144,10 @@ for (taxon in taxa) { } unmatched <- unmatched + sum(!draws[, 1] %in% sites) - saveRDS(unname(draws), file.path(out_dir, paste0(species, ".rds"))) + saveRDS( + unname(draws), + file.path(out_dir, paste0(species, ".rds")) + ) written <- written + 1L } diff --git a/1_code/_setup/run.R b/1_code/_setup/run.R index 5224afb..7e1abc7 100644 --- a/1_code/_setup/run.R +++ b/1_code/_setup/run.R @@ -48,14 +48,14 @@ # finished dataset, 07 reads 03's bryophyte draws. steps <- c( "00_mirror_setup_inputs.R" = FALSE, - "01_harmonize_model_ready_v2.R" = FALSE, - "06_harmonize_bird_translation_lookup.R" = FALSE, - "09_harmonize_lookups.R" = FALSE, - "02_validate_test_dataset.R" = FALSE, + "01_harmonize_model_ready_v2.R" = TRUE, + "06_harmonize_bird_translation_lookup.R" = TRUE, + "09_harmonize_lookups.R" = TRUE, + "02_validate_test_dataset.R" = TRUE, "03_rerun_bryophyte_v2_reference.R" = FALSE, - "07_harmonize_v2_plant_bootstrap_ids.R" = FALSE, - "08_harmonize_abmiexplorer_results.R" = FALSE, - "10_publish_datasets.R" = TRUE + "07_harmonize_v2_plant_bootstrap_ids.R" = TRUE, + "08_harmonize_abmiexplorer_results.R" = TRUE, + "10_publish_datasets.R" = FALSE ) ## 1.3 Check the paths ---- diff --git a/1_code/experiments/exp_000_parity_v2/02_plot_parity.R b/1_code/experiments/exp_000_parity_v2/02_plot_parity.R index 8da6ccc..b0a5e8a 100644 --- a/1_code/experiments/exp_000_parity_v2/02_plot_parity.R +++ b/1_code/experiments/exp_000_parity_v2/02_plot_parity.R @@ -396,7 +396,7 @@ bell_terms <- copy(plottable) if (!"negligible" %in% names(bell_terms)) { message( "parity_terms.csv has no `negligible` column; rerun ", - "02_compare_to_v2.R. Every term is drawn." + "01_compare_to_v2.R. Every term is drawn." ) bell_terms[, negligible := FALSE] } diff --git a/1_code/experiments/exp_000_parity_v2/utils/parity_targets.R b/1_code/experiments/exp_000_parity_v2/utils/parity_targets.R index 4263fbf..caf6a46 100644 --- a/1_code/experiments/exp_000_parity_v2/utils/parity_targets.R +++ b/1_code/experiments/exp_000_parity_v2/utils/parity_targets.R @@ -164,7 +164,9 @@ parity_verdict <- function( return("no comparison") } - return(if (max_absolute_difference <= targets$numerical_tolerance) { + return(if ( + max_absolute_difference <= targets$numerical_tolerance + ) { "pass" } else { "fail" diff --git a/1_code/experiments/exp_000_parity_v2/v2_self_agreement.R b/1_code/experiments/exp_000_parity_v2/v2_self_agreement.R index ef5bdfb..7fd1a3f 100644 --- a/1_code/experiments/exp_000_parity_v2/v2_self_agreement.R +++ b/1_code/experiments/exp_000_parity_v2/v2_self_agreement.R @@ -26,7 +26,7 @@ # different unseeded draws; 19 terms by 100 draws for each # species both hold. Bryum.All is not published, so it # drops out (133 of the rerun's 134 species). -# - Scored exactly as 02_compare_to_v2.R scores the harness, in +# - Scored exactly as 01_compare_to_v2.R scores the harness, in # both directions: is one run's median inside the other's # 10th-to-90th percentile band, and how far apart are the # medians relative to half that band. The two directions are diff --git a/1_code/harness/result.R b/1_code/harness/result.R index e49d792..517ce85 100644 --- a/1_code/harness/result.R +++ b/1_code/harness/result.R @@ -2,6 +2,7 @@ # title: The Standard Result Object # author: Brendan Casey # created: 2026-09-09 +# inputs: none; writes to the store directory it is given # outputs: # in the store directory: # - grid_predictions.csv diff --git a/1_code/harness/spec.R b/1_code/harness/spec.R index b7afd06..663fb7b 100644 --- a/1_code/harness/spec.R +++ b/1_code/harness/spec.R @@ -587,7 +587,8 @@ replace_stage_method <- function( spec$models_overridden, paste0(stage, " <- ", label) ) spec$notes <- paste0( - spec$notes %||% "", " Stage `", stage, "` fitted with ", label, "." + spec$notes %||% "", " Stage `", stage, "` fitted with ", + label, "." ) spec diff --git a/1_code/modules/birds/standardize.R b/1_code/modules/birds/standardize.R index 8db8215..9e54dc5 100644 --- a/1_code/modules/birds/standardize.R +++ b/1_code/modules/birds/standardize.R @@ -231,7 +231,9 @@ bird_translation_context <- function(data_dir, region) { # Step 3: The design matrix, with v2's column names design <- stats::model.matrix( - stats::as.formula(paste("~", paste(model_terms, collapse = " + "))), + stats::as.formula( + paste("~", paste(model_terms, collapse = " + ")) + ), stats::model.frame( stats::as.formula( paste("~", paste(model_terms, collapse = " + ")) diff --git a/1_code/tests/testthat/test-dataset.R b/1_code/tests/testthat/test-dataset.R index 6103e78..597b45a 100644 --- a/1_code/tests/testthat/test-dataset.R +++ b/1_code/tests/testthat/test-dataset.R @@ -1,5 +1,15 @@ -# The harmonized lookups agree with each other and with the files -# they describe. Skipped when the dataset is not present. +# --- +# title: Tests - Dataset Lookups +# author: Brendan Casey +# created: 2026-10-03 +# inputs: the published test dataset (`data_dir`) +# outputs: none; testthat results +# notes: +# - The harmonized lookups agree with each other and with the files +# they describe. Skipped when the dataset is not present. +# - Run through 1_code/tests/run_tests.R, which loads the +# framework and sets `data_dir`. +# --- skip_if_not(dir.exists(data_dir), "No test dataset") @@ -111,3 +121,5 @@ test_that("an experiment's covariate file is checked and joined", { joined <- add_covariate_files(x, good, "new_1") expect_equal(joined$new_1, c(10, 20, NA)) }) + +# End of script ---- diff --git a/1_code/tests/testthat/test-methods.R b/1_code/tests/testthat/test-methods.R index a6bdc85..bcf86e7 100644 --- a/1_code/tests/testthat/test-methods.R +++ b/1_code/tests/testthat/test-methods.R @@ -1,5 +1,15 @@ -# Every registered method meets its contract, and the registry -# behaves as a spec relies on it to. +# --- +# title: Tests - Method Contracts and Registry +# author: Brendan Casey +# created: 2026-10-03 +# inputs: none; the loaded framework +# outputs: none; testthat results +# notes: +# - Every registered method meets its contract, and the registry +# behaves as a spec relies on it to. +# - Run through 1_code/tests/run_tests.R, which loads the +# framework and sets `data_dir`. +# --- test_that("every registered engine passes check_engine()", { for (name in registered_names("engine")) { @@ -88,3 +98,5 @@ test_that("an engine without coefficients can run the single rule", { problems <- validate_spec(spec, stop_on_error = FALSE) expect_true(any(grepl("aic_average.*needs", problems))) }) + +# End of script ---- diff --git a/1_code/tests/testthat/test-new_experiment.R b/1_code/tests/testthat/test-new_experiment.R index 6c1e609..f7f92c7 100644 --- a/1_code/tests/testthat/test-new_experiment.R +++ b/1_code/tests/testthat/test-new_experiment.R @@ -1,7 +1,17 @@ -# new_experiment() numbers an experiment from every folder that -# could hold one, and scaffolds all three of its folders or none. -# Each test builds a throwaway repository, so the real one is -# never touched. +# --- +# title: Tests - Experiment Scaffolding +# author: Brendan Casey +# created: 2026-10-06 +# inputs: none; throwaway repositories under tempfile() +# outputs: none; testthat results +# notes: +# - new_experiment() numbers an experiment from every folder that +# could hold one, and scaffolds all three of its folders or none. +# Each test builds a throwaway repository, so the real one is +# never touched. +# - Run through 1_code/tests/run_tests.R, which loads the +# framework and sets `data_dir`. +# --- # A minimal repository: the real template, and an exp_ folder in # each of the given roots @@ -125,3 +135,5 @@ test_that("a dry run writes nothing", { list.files(root, recursive = TRUE, include.dirs = TRUE), before ) }) + +# End of script ---- diff --git a/1_code/tests/testthat/test-results.R b/1_code/tests/testthat/test-results.R index 66328e1..1658aef 100644 --- a/1_code/tests/testthat/test-results.R +++ b/1_code/tests/testthat/test-results.R @@ -1,5 +1,15 @@ -# Result stores, shards and seeds behave as a parallel run relies -# on them to. +# --- +# title: Tests - Result Stores, Shards and Seeds +# author: Brendan Casey +# created: 2026-10-03 +# inputs: none; temporary stores under tempdir() +# outputs: none; testthat results +# notes: +# - Result stores, shards and seeds behave as a parallel run relies +# on them to. +# - Run through 1_code/tests/run_tests.R, which loads the +# framework and sets `data_dir`. +# --- test_that("merged shards equal a store written in one pass", { root <- file.path(tempdir(), "shard_test") @@ -179,3 +189,5 @@ test_that("draw summaries carry the mean and standard deviation", { "mean", "sd") ) }) + +# End of script ---- diff --git a/1_code/tests/testthat/test-specs.R b/1_code/tests/testthat/test-specs.R index a21da9e..f3e12c0 100644 --- a/1_code/tests/testthat/test-specs.R +++ b/1_code/tests/testthat/test-specs.R @@ -1,5 +1,15 @@ -# The v2 specs are valid, and validate_spec() catches the mistakes -# a user is likely to make. +# --- +# title: Tests - Taxon Spec Validation +# author: Brendan Casey +# created: 2026-10-03 +# inputs: none; the loaded framework +# outputs: none; testthat results +# notes: +# - The v2 specs are valid, and validate_spec() catches the mistakes +# a user is likely to make. +# - Run through 1_code/tests/run_tests.R, which loads the +# framework and sets `data_dir`. +# --- test_that("every standard spec validates", { for (key in names(standard_specs())) { @@ -116,3 +126,5 @@ test_that("stage_models replaces a set and is recorded", { spec_covariates(spec, "climate"), c("MAP", "FFP") ) }) + +# End of script ---- diff --git a/code_audit_2026-10-06.md b/code_audit_2026-10-06.md new file mode 100644 index 0000000..729849d --- /dev/null +++ b/code_audit_2026-10-06.md @@ -0,0 +1,244 @@ +# Code audit: sdmMethodsDev, 2026-10-06 + +Phase 1: read-only static scan of branch `improve_code_efficiency`. +Nothing was executed: only `parse()`, token and `codetools` analysis, +and path checks. All 83 R files outside `0_data/v2_scripts/` and all +50 legacy v2 scripts were covered. ⚠ marks a file in exp_000 (the +parity gate); those are not edited without separate approval. + + +## Summary + +- All 83 R files outside `v2_scripts/` parse cleanly. +- Every `source()` target and every `.R` path string resolves. +- `codetools` finds no function that is called but never defined, + and no package that is used but never loaded. The remaining + "global variable" notes are data.table column names or + package-level environments (`.sdm_cache`, `.sdm_registry`). +- No pipes of either kind (`|>` or `%>%`) are used anywhere. This + matches the repo's base-R/data.table, no-pipe convention, so + nothing is flagged. +- Sequenced naming: `_setup/` runs 00–03 and 06–10. The 04/05 gap is + deliberate history, since 08 says it replaced the old 04/05. There + are no prefix collisions and no `MM_NN_` staging in use. +- Errors: **0 high, 1 medium, 7 low**, plus 4 informational items + that need no change. +- Deprecated candidates: **1** (`1_code/_scratch.R`, low + confidence). It is not eligible for deletion under the rules. + +## Errors table + +| # | file | line | issue | severity | proposed fix | +|---|------|------|-------|----------|--------------| +| E1 | `1_code/_setup/run.R` | 49–59 | Step defaults contradict the header (lines 21–29: "defaults rebuild everything local and publish nothing"; 00, 03 and 10 off). In the code every step is `FALSE` except `10_publish_datasets.R = TRUE`, so sourcing `run.R` publishes whatever is in `0_data/` as today's version, with no rebuild and no 02 tally. 10 refuses to overwrite an existing version, which limits the damage. | medium | Set the defaults to match the header: 01, 06, 09, 02, 07 and 08 `TRUE`; 00, 03 and 10 `FALSE`. (Alternative: only set 10 to `FALSE`. See J1.) | +| E2 | `1_code/experiments/exp_000_parity_v2/02_plot_parity.R` ⚠ exp_000 | 399 | A runtime `message()` tells the user to "rerun `02_compare_to_v2.R`", but the script is `01_compare_to_v2.R`. | low | Change the string to `01_compare_to_v2.R`. Message text only; no change to outputs. | +| E3 | `1_code/experiments/exp_000_parity_v2/v2_self_agreement.R` ⚠ exp_000 | 29 | Header comment says "Scored exactly as `02_compare_to_v2.R`"; the file is `01_`. | low | Fix the comment. | +| E4 | `1_code/_setup/01_harmonize_model_ready_v2.R` | 2384 | Comment cites `check_prediction_terms()`, which no longer exists anywhere in the repo. | low | Reword to "found later, at prediction time" without naming a function (the successor is not certain). | +| E5 | `1_code/harness/result.R` | 1–10 | The header has no `inputs:` field (template §5.1). | low | Add `# inputs: none; writes to the store directory it is given`. | +| E6 | `1_code/_setup/07_harmonize_v2_plant_bootstrap_ids.R:147`, `harness/spec.R:590`, `modules/birds/standardize.R:234`, `experiments/exp_000_parity_v2/utils/parity_targets.R:167` ⚠ exp_000 | — | Single lines over the 70-character limit. | low | Re-wrap each line. Line breaks only; no change to the code's logic. | +| E7 | `1_code/tests/testthat/test-*.R` (5 files) | 1 | No standard header and no `# End of script ----`. | low | See J5. Testthat files commonly omit headers, so this needs a decision. | +| E8 | `1_code/_scratch.R` | 30–33 | Code sits *after* `# End of script ----`. It holds a hard-coded UNC path to the old `science\sc\sdmMethodsDev\...` share and a line over 70 characters. | low | See J6 and the deprecated table. | +| I1 | `0_data/v2_scripts/mammals/north-models/archive/04 Basic Models Figures Maps.R` | 1465 | Parse error: unexpected `}`. | info | **No change** (`v2_scripts/` is off-limits). Recorded for taxon leads. | +| I2 | `1_code/harness/model_sets.R` | 154–200 (57 lines) | Lines over 70 characters. These are v2 habitat formula strings, spliced verbatim. | info | No change. Splitting them hurts the line-by-line match with v2. | +| I3 | `1_code/harness/model_sets.R` | 156 | `TreedFen + + NonTreedFen`. The doubled `+` is copied from v2 (`02a/b/c/d_hierarchical-models-*.R:102`) and is a harmless unary plus. | info | No change, to keep fidelity with v2. | +| I4 | `%||%` defined in `harness/spec.R:683`, `harness/new_experiment.R:345` (guarded), `_setup/07…:82`, `tests/compare_stores.R:166` | — | Duplicate definitions. All four are identical, and base R ≥ 4.4 also provides `%||%`. The other duplicated names (`combine`, `failed`, `table_of`, `take_block`, `rows`) are local to their functions, so they never collide. | info | No change. | + +## Deprecated candidates + +| file | reason | evidence it is unused | confidence | +|------|--------|-----------------------|------------| +| `1_code/_scratch.R` | `scratch` naming. Its only code is a stray 2026-09-09 `load()` of an old-share file, placed after the end marker. | No `source()` or path reference in any code. **However**, `README.md:593` documents it as the "dated workspace for exploration", and it follows the personal scratch-file convention. | **low**: documented and intentional, so do not delete. A better option is to clear the stray snippet (J6). | + +Nothing else qualifies: +- Every other file is loaded by `load_framework()` (harness/, + methods/ kind folders, modules/, experiments/_shared/), is an + entry point (`run.R`, `run_tests.R`, `compare_stores.R`, + `v2_self_agreement.R`, `new_experiment.R`), or is called from one. +- `methods/_templates/` and `experiments/_template/` are scaffolding + referenced from READMEs and `new_experiment()`. +- Every file in `3_output/` has a generating script. + +## Items needing human judgement + +- **J1. `_setup/run.R` defaults (E1).** Should the defaults restore + the header's stated behaviour (rebuild everything local), or just + turn 10 off? The current state looks like a leftover from the + 2026-10-05 publish. +- **J2. Committed exp_000 summaries are from a 5-draw plumbing run.** + `3_output/exp_000_parity_v2/run_record.md` records + `n_bootstraps: 5` and 14 parity_check species, and every verdict + reads "not gated (store holds 5 draws)". But `run.R:125–126` says + to commit these only after a full run (all species, 100 draws). Is + this a known interim state? exp_001 and exp_002 compare against + this baseline. +- **J3. `v2_self_agreement_summary.csv` is missing.** + `parity_targets.R` lists it as an input, and `.gitignore` + whitelists it, but it is not in `3_output/exp_000_parity_v2/tables/`. + - *What the script does.* v2 seeds none of its bootstraps, so two + v2 runs of the same code on the same data give different + coefficients. `v2_self_agreement.R` measures how far apart two + such runs are. The first is v2's original bryophyte climate + stage, as published in ABMIexploreR (from `_setup/08`). The + second is `_setup/03`'s re-run of the frozen v2 functions, in + `2_pipeline/v2_reference/`. It scores them against each other + with the gate's own statistics, in both directions: + - median-in-band (each run's median inside the other's + 10–90% band); + - standardized median difference; + - per-species band-width ratio; + - Spearman of the medians (reported, not gated). + It writes `v2_self_agreement.csv` (per term) and a one-row + summary. + - *Why it exists.* It sets the ceiling for the gate: a + reimplementation cannot be expected to agree with v2 more + closely than v2 agrees with itself. The results (100% in band, + standardized difference 0.019, band ratio 0.78–1.21) are the + stated evidence for the thresholds hard-coded in + `parity_targets()`: 90%, 0.25, and 0.75–1.33. + - *Is it necessary?* No experiment or test needs it at run time. + It is not in `run.R`'s sequence, and nothing reads its CSV. It + is the provenance for the gate's thresholds, which + `parity_targets()` still labels "proposed, not yet agreed". + Whoever agrees them, or later questions a pass/fail, needs that + evidence. Keep the script. + - *Limits.* It covers only the bryophyte climate stage; applying + the same thresholds to the habitat and bird stages is an + assumption. Re-running it needs `_setup/03` (hours) and the + gitignored `2_pipeline/v2_reference/`. `_setup/07`'s `v2_ids` + option also depends on 03. + - *Where it runs.* By hand, from the repo root: + `source("1_code/experiments/exp_000_parity_v2/v2_self_agreement.R")`. + Its header says "Run once … after _setup/03 and 08. Not part of + run.R's sequence". It is not one of `run.R`'s `script_step()`s + (compare, plot, report). + - *Should it join the exp_000 pipeline?* No. Its folder is right + (it calibrates exp_000's gate), but it should not be a + `run.R` step: + 1. It reads no harness result. Its output changes only when + the v2 reference changes (`_setup/03` or `08`), not when + exp_000 runs, so every run would recompute an identical + table. + 2. Its key input, `2_pipeline/v2_reference/…Rdata`, is local + and gitignored, and exists only on the machine that ran 03. + Everything else in exp_000 reads the published datasets, so + anyone can run it. As a step, this script would stop + exp_000 for every other user. + 3. Moving it to `_setup/` breaks the rule that `_setup` is + fixed and that experiments own their scripts. + A cleaner long-term option, if wanted, is outside this audit. + `_setup/10` could publish 03's re-run inside `v2_results/`, and + the script could read it via `v2_results_dir()`. It could then + become an optional step that anyone can run. + - *Recommendation.* No code change. Either run it once and commit + the summary CSV, which `.gitignore` already allows (this needs + your go-ahead, because it reads data and writes outputs), or + accept that the numbers recorded in `parity_targets.R:38–47` + are the record and drop the CSV from that header's `inputs:`. + - *Confidence: High* on what it does. *Moderate* on "necessary": + that depends on whether the team treats the thresholds as + settled. +- **J4. Absolute local path in a committed file.** + `run_record.md` records `pipeline_dir: + D:/local_projects/active/...`. It sits in the "volatile" section, + so it is harmless, but the path is machine-specific. +- **J5. Test-file conventions (E7 and naming).** `test-*.R` uses a + hyphen, which is the testthat convention. `test_*.R` also works, + but renaming has little value. Should the 5 test files get + standard headers? +- **J6. `_scratch.R` (E8).** Empty the 2026-09-09 snippet (keeping + the header), leave it as is, or delete the file (it is documented + in the README)? +- **J7. Out-of-scope leftovers I will not touch.** + - `2_pipeline/exp_001_gbm/` is an orphan store from a renamed + experiment. + - `0_data/test_dataset_backup_2026-10-02_aug2026_birds/` is a + backup dataset folder. + - `3_output/exp_001_xgboost/` and `exp_002_soilgrids/` are empty + folders. + - None of these is tracked by git; you may want to clear them by + hand. +- **J8. "the project file sets it"** (`exp_000/run.R:34`). No + `.Rproj` is tracked in the repo. This is a documentation and setup + question for the separate docs prompt. + +## Appendix A: repository map + +The table lists each file with its purpose, from its header title, +and its main reads and writes. Key reads: TD is the published test +dataset via `data_source.R`; V2R is the published v2 results; SI is +the `setup_inputs` mirror via `_setup/utils/input_paths.R`. + +| file | purpose | reads → writes | +|------|---------|----------------| +| `_setup/run.R` | Entry point: runs the _setup steps in isolated environments | _setup scripts → `2_pipeline/_setup/run_log.csv` | +| `_setup/00_mirror_setup_inputs.R` | Mirror the original inputs (old shares, G: drives) onto ABMI-DATA2 | originals → SI | +| `_setup/01_harmonize_model_ready_v2.R` | v2 snapshot → harmonized CSVs | SI → `0_data/test_dataset/` | +| `_setup/02_validate_test_dataset.R` | Pass/fail tally of the dataset | `0_data/test_dataset/`, SI → console | +| `_setup/03_rerun_bryophyte_v2_reference.R` | Re-run the v2 bryophyte models (sources `v2_scripts/plants/*functions.R`) | SI → `2_pipeline/v2_reference/` | +| `_setup/06_…bird_translation_lookup.R` | Bird coefficient translation lookup | SI → `test_dataset/lookup/` | +| `_setup/07_…plant_bootstrap_ids.R` | v2's stored plant bootstrap ids | SI, v2_reference → `lookup/v2_bootstrap_ids/` | +| `_setup/08_…abmiexplorer_results.R` | ABMIexploreR coefficients at a pinned commit | GitHub → `0_data/v2_results/abmiexplorer/` | +| `_setup/09_harmonize_lookups.R` | Cross-taxa lookups | 01/06 outputs → `lookup/` | +| `_setup/10_publish_datasets.R` | Publish a versioned copy with checksums | `0_data/` → ABMI-DATA2 | +| `_setup/utils/input_paths.R` | `setup_input()` resolver | — | +| `harness/harness.R` | `load_framework()`: sources harness, then methods, then modules, then experiments/_shared | all of those | +| `harness/{registry,cache,data_source,spec,data_load,covariate_sets,species,model_sets,resample,engines,selection,eval_metrics,predict_grid,result,run_record,run_model,summarise,compare,experiment,new_experiment}.R` | Taxon-agnostic pipeline (loaded in this order) | TD/V2R → `2_pipeline//`, `3_output//` | +| `methods/engines/{_glm_family,glm,bayesglm,xgboost}.R` | Engine plug-ins | — | +| `methods/selection/{aic_average,aic_best,hurdle,ivw_grid,single,staged_bic}.R` | Selection plug-ins | — | +| `methods/resampling/{precomputed,spatial_block,spatial_cv}.R` | Resampling plug-ins (precomputed reads `lookup/v2_bootstrap_ids/`) | TD | +| `methods/metrics/{auc,calibration_slope,deviance_explained,n,prevalence,rmse,spearman}.R` | Metric plug-ins | — | +| `methods/_templates/*.R` | Skeletons; not loaded | — | +| `modules/_shared/{plant_group,standard_specs}.R` | Plant-group spec builder; the v2 spec list | — | +| `modules//spec.R` (+ `birds/standardize.R`, `mammals/hurdle.R`) | Per-taxon v2 specs and helpers | TD lookups | +| `experiments/_shared/focal_species.R` | Named focal-species sets | — | +| `experiments/_template/run.R` | Scaffold copied by `new_experiment()` | — | +| `experiments/exp_000_parity_v2/run.R` | Entry: parity gate; runs 01–03 as `script_step`s | TD, V2R → `2_pipeline/exp_000…`, `3_output/exp_000…` | +| `exp_000/01_compare_to_v2.R` | Coefficient parity vs v2 | stores, V2R → `parity_summary.csv`, `parity_terms.csv`, `coefficient_summary.csv` | +| `exp_000/02_plot_parity.R` | Parity figures | tables → `figures/*.png` | +| `exp_000/03_build_report.R` | `report.md` | tables → `report.md` | +| `exp_000/utils/parity_targets.R` | Gate thresholds | — | +| `exp_000/v2_self_agreement.R` | Stand-alone: v2 vs v2 calibration | `2_pipeline/v2_reference/`, V2R → `v2_self_agreement*.csv` | +| `experiments/exp_001_xgboost/run.R` | Entry: xgboost habitat stage | TD → `2_pipeline/exp_001_xgboost/`, `3_output/…` | +| `experiments/exp_002_soilgrids/run.R` | Entry: soil terms in the climate stage; sources 01 if the input is missing | soil CSV, TD → stores and outputs | +| `exp_002/01_extract_soilgrids_covariates.R` | sciSpatialR/sf extraction | TD sites, SoilGrids → `2_pipeline/exp_002…/inputs/soilgrids_0_5cm.csv` | +| `tests/run_tests.R` | Entry: testthat over `tests/testthat/` | TD (skipped if unreachable) | +| `tests/testthat/test-{dataset,methods,new_experiment,results,specs}.R` | Contract tests | TD | +| `tests/compare_stores.R` | Stand-alone/CLI: compare two store trees | `2_pipeline` stores | +| `_scratch.R` | Personal scratch | old-share `.Rdata` | + +## Appendix B: dependency map + +- **Entry points**: + - `_setup/run.R` + - each `experiments/*/run.R` + - `tests/run_tests.R` + - `tests/compare_stores.R` (CLI) + - `exp_000/v2_self_agreement.R` + - `harness/new_experiment.R` (also stand-alone) + - `_scratch.R` +- **Sourced by `load_framework()`**: all of `harness/`, the + `methods/{engines,selection,resampling,metrics}/` folders (files + starting with `_` first), `modules/*/` (`_shared` first), and + `experiments/_shared/`. +- **Also re-sourced**: parallel workers source it again via + `run_model.R:555` (`load_worker`). exp_000's 01–03 run through + `experiment.R:556` (`sys.source`). +- **Other `source()` edges**: + - `_setup/{01,02,03,06,07,08}` → `_setup/utils/input_paths.R` + - `00` → `input_paths.R` (via `helper`) + - `10` → `harness/data_source.R` (via `resolver`) + - `03` → `0_data/v2_scripts/plants/{hierarchical-model_functions,bootstrapping_functions}.R` + - `v2_self_agreement.R` → `parity_targets.R` and `data_source.R` + - `exp_002/run.R` → `exp_002/01_…R` + - `exp_002/01` → `data_source.R` +- **Packages**: + - Attached with `library()`: data.table, ggplot2 (exp_000/02), + testthat, foreach and parallel (03), sciSpatialR and sf + (exp_002/01). + - Attached on cluster workers in 03 only: AICcmodavg, arm, binom, + mapproj, mgcv, MuMIn, pROC, RcmdrMisc. + - Called with `::` and guarded by `requireNamespace()`: arm, + xgboost, MuMIn, mgcv, pROC, jsonlite, terra, withr, stats, + utils, tools, parallel. + - All the `::` packages are installed on this machine. + From 944158f616b4e2dc44fb70045a5bb813058d4cff Mon Sep 17 00:00:00 2001 From: bgcasey Date: Wed, 7 Oct 2026 03:18:03 -0600 Subject: [PATCH 14/16] Refactor documentation and comments across multiple modules for clarity and consistency - Updated comments in `single.R` to clarify the purpose of the `single` rule. - Revised notes in `staged_bic.R` to enhance understanding of model selection process. cleaned up wrong or stale comments, condensed narrative explanations, dropped changelog notes, and removed duplicate comments repeated for the same shared logic across files, keeping the one at the definition. --- 1_code/_setup/00_mirror_setup_inputs.R | 31 +- 1_code/_setup/01_harmonize_model_ready_v2.R | 629 +++++------------- 1_code/_setup/02_validate_test_dataset.R | 88 +-- .../_setup/03_rerun_bryophyte_v2_reference.R | 72 +- .../06_harmonize_bird_translation_lookup.R | 36 +- .../07_harmonize_v2_plant_bootstrap_ids.R | 39 +- .../08_harmonize_abmiexplorer_results.R | 65 +- 1_code/_setup/09_harmonize_lookups.R | 68 +- 1_code/_setup/10_publish_datasets.R | 17 +- 1_code/_setup/run.R | 16 +- 1_code/experiments/_shared/focal_species.R | 73 +- .../exp_000_parity_v2/01_compare_to_v2.R | 94 +-- .../exp_000_parity_v2/02_plot_parity.R | 74 +-- .../exp_000_parity_v2/03_build_report.R | 23 +- 1_code/experiments/exp_000_parity_v2/run.R | 65 +- .../exp_000_parity_v2/utils/parity_targets.R | 9 +- .../exp_000_parity_v2/v2_self_agreement.R | 7 +- 1_code/experiments/exp_001_xgboost/run.R | 33 +- .../01_extract_soilgrids_covariates.R | 35 +- 1_code/experiments/exp_002_soilgrids/run.R | 32 +- 1_code/harness/cache.R | 17 +- 1_code/harness/compare.R | 26 +- 1_code/harness/covariate_sets.R | 182 ++--- 1_code/harness/data_load.R | 222 ++----- 1_code/harness/data_source.R | 34 +- 1_code/harness/engines.R | 40 +- 1_code/harness/eval_metrics.R | 27 +- 1_code/harness/experiment.R | 51 +- 1_code/harness/harness.R | 25 +- 1_code/harness/model_sets.R | 155 ++--- 1_code/harness/new_experiment.R | 21 +- 1_code/harness/predict_grid.R | 54 +- 1_code/harness/registry.R | 64 +- 1_code/harness/resample.R | 96 +-- 1_code/harness/result.R | 66 +- 1_code/harness/run_model.R | 258 +++---- 1_code/harness/run_record.R | 78 +-- 1_code/harness/selection.R | 59 +- 1_code/harness/spec.R | 121 +--- 1_code/harness/species.R | 48 +- 1_code/harness/summarise.R | 45 +- 1_code/methods/engines/_glm_family.R | 49 +- 1_code/methods/engines/bayesglm.R | 25 +- 1_code/methods/engines/xgboost.R | 76 +-- 1_code/methods/metrics/auc.R | 22 +- 1_code/methods/metrics/calibration_slope.R | 10 +- 1_code/methods/metrics/deviance_explained.R | 4 +- 1_code/methods/metrics/n.R | 4 +- 1_code/methods/metrics/prevalence.R | 9 +- 1_code/methods/metrics/rmse.R | 4 +- 1_code/methods/metrics/spearman.R | 7 +- 1_code/methods/resampling/precomputed.R | 21 +- 1_code/methods/resampling/spatial_block.R | 38 +- 1_code/methods/resampling/spatial_cv.R | 16 +- 1_code/methods/selection/aic_average.R | 14 +- 1_code/methods/selection/hurdle.R | 47 +- 1_code/methods/selection/ivw_grid.R | 45 +- 1_code/methods/selection/single.R | 6 +- 1_code/methods/selection/staged_bic.R | 22 +- 1_code/modules/_shared/plant_group.R | 102 +-- 1_code/modules/_shared/standard_specs.R | 15 +- 1_code/modules/birds/spec.R | 64 +- 1_code/modules/birds/standardize.R | 19 +- 1_code/modules/bryophytes/spec.R | 24 +- 1_code/modules/lichens/spec.R | 8 +- 1_code/modules/mammals/hurdle.R | 35 +- 1_code/modules/mammals/spec.R | 113 +--- 1_code/modules/soil_mites/spec.R | 24 +- 1_code/modules/vascular_plants/spec.R | 12 +- 69 files changed, 1191 insertions(+), 2839 deletions(-) diff --git a/1_code/_setup/00_mirror_setup_inputs.R b/1_code/_setup/00_mirror_setup_inputs.R index bc04d87..4a2430a 100644 --- a/1_code/_setup/00_mirror_setup_inputs.R +++ b/1_code/_setup/00_mirror_setup_inputs.R @@ -21,18 +21,11 @@ # the date it was copied # - README.md: what the folder is and the rules for it # notes: -# - Makes _setup/ runnable by anyone with access to ABMI-DATA2. -# The _setup/ scripts read the mirror by default (through -# utils/input_paths.R); their SDM_* variables still point -# them back at the originals. -# - Read-only with respect to the originals: nothing is moved, -# renamed or deleted at the source. -# - Never overwrites the mirror. A file already mirrored is -# checked by md5 and skipped; if its source has changed since, -# the script stops and says so. Re-mirroring a changed source -# is a deliberate step: move the old copy aside first. -# - Each file is copied to a .partial name, checked by md5, and -# only then renamed, so a reader never sees a half copy. +# - Makes _setup/ runnable by anyone with ABMI-DATA2 access. +# Originals are never modified. +# - Never overwrites the mirror: mirrored files are md5-checked +# and skipped, and a changed source stops the script (move the +# old copy aside to re-mirror). Copies go via a .partial name. # - Not mirrored, deliberately: # - the v2 coefficient outputs on the drives (the bird # coefficient CSVs, COEFS.RData, the mammal coefficient @@ -41,8 +34,8 @@ # - _setup/08's species-coefs.RData, which 08 downloads from # the public ABMIexploreR repository at a pinned commit. # - 0_data/v2_scripts/, which is tracked in git. -# - Run from the repository root, once, by someone who can -# reach every source. Google Drive reads are serial: its +# - Run once, from the repository root, by someone who can +# reach every source. Reads are serial: the Google Drive # mount refuses concurrent reads. # --- @@ -124,9 +117,7 @@ sources <- list( ) # 2. List the files ---- -# Expands folders into their files, and stops before copying -# anything if a source cannot be reached, so a partial mirror is -# never mistaken for a complete one. +# Stops before copying if any source is unreachable ## 2.1 Expand each source ---- files <- rbindlist(lapply(names(sources), function(name) { @@ -169,8 +160,6 @@ cat( ) # 3. Copy ---- -# Serial, one file at a time. Each is hashed at the source, -# copied to a .partial name, re-hashed, and renamed into place. ## 3.1 The previous manifest, to keep first-copy dates ---- previous <- if (file.exists(manifest_path)) { @@ -244,8 +233,8 @@ for (i in seq_len(nrow(files))) { # 4. Record ---- ## 4.1 The manifest ---- -# Rows for files no longer in the inventory are kept: the copies -# are still in the mirror, and the manifest is their provenance. +# Rows for files dropped from the inventory are kept as +# provenance for copies still in the mirror manifest <- rbindlist(rows) if (!is.null(previous)) { diff --git a/1_code/_setup/01_harmonize_model_ready_v2.R b/1_code/_setup/01_harmonize_model_ready_v2.R index 8f41b90..523fcd8 100644 --- a/1_code/_setup/01_harmonize_model_ready_v2.R +++ b/1_code/_setup/01_harmonize_model_ready_v2.R @@ -3,10 +3,8 @@ # author: Brendan Casey # created: 2026-09-05 # inputs: -# Read from the input mirror on ABMI-DATA2 (utils/ -# input_paths.R; 00_mirror_setup_inputs.R made it). The -# locations below are the originals, which the SDM_* variables -# can point back to. +# Read via setup_input() (utils/input_paths.R); the original +# locations are listed, and SDM_* variables can point back. # from 0_data/data_snapshots/model_ready_v2/ on ABMI-DATA2: # - vascular-plant-model-data.Rdata # - bryophyte-model-data.Rdata @@ -47,107 +45,30 @@ # - covariate_columns.csv which block each covariates # column came from, per taxon # notes: -# Source files use two incompatible survey designs, so -# they are harmonized into one shared convention rather than -# one table: every taxon CSV is `survey_unit_id` followed by -# that taxon's species columns, and every identity, design and -# location field is factored out into sites.csv. Join any taxon -# CSV to sites.csv on survey_unit_id. -# -# The response tables above carry detections only. The -# covariate and lookup tables carry everything else the v2 -# hierarchical models regress against, so the modelling code in -# the plant-group modules can run from 0_data/test_dataset/ -# alone rather than reaching back to the snapshot. -# -# covariates.csv is keyed on survey_unit_id AND taxon, where -# sites.csv is keyed on survey_unit_id alone. That is forced by -# the source: on the 7001 quadrats vascular plant and mite -# share, 154 of 162 vegetation columns and 58 of 59 soil -# columns hold different values, while climate agrees to the -# last digit. Bryophyte and lichen match vascular plant -# exactly. -# -# The covariates were never shared to begin with: -# 01a_data-standardization.R lifts each taxon's veg and soil -# blocks wholesale from its own raw SpTable *_Quad.RData file, -# so the four are four separate extractions. The quadrats -# themselves are the same places - Lat, Long, Easting, -# Northing and NSR are identical on every shared unit. -# -# Where mite differs is concentrated in the Surr* surrounding -# buffer terms: 20 columns carry 67 per cent of the differing -# veg cells and 80 per cent of the soil ones. It is not a -# footprint vintage, since every year from 2007 to 2022 -# disagrees. That points at a different spatial extraction -# upstream, but the raw files are in neither this repository -# nor the snapshot, so it cannot be confirmed here. -# -# Either way they are two descriptions of one quadrat, and -# choosing between them is not this script's call. Filter on -# taxon before joining. -# -# Its columns are the union across taxa, so each taxon fills -# its own blocks and leaves the rest empty - about 16 per cent -# of cells are populated. Drop the empty columns after -# filtering to a taxon. -# -# A name that more than one block carries is suffixed with its -# block: the plant files spell 42 footprint terms the same way -# in the veg and soil blocks, and 14 of those hold different -# values because each is computed under its own landcover -# framework. So `Crop_veg` and `Crop_soil` are both kept. -# lookup/covariate_columns.csv maps every column back to the -# block and the v2 spelling it came from. -# -# Mammal covariates come from the same two SpTable files as -# the mammal response, because those files are themselves the -# output of the v2 scripts in 0_data/v2_scripts/mammals/. Their -# embedded pred_matrix objects were checked against -# prediction-matrix_north.csv and Prediction matrix for ABMI -# South coefficients 2020.csv on the ABMI Mammals drive and are -# identical, so no separate lookup is needed for them. -# -# Mammals contribute two taxon values, mammal_north and -# mammal_south, rather than one. They are separate models on -# overlapping deployments - 512 location_project values appear -# in both files - so their covariates cannot be pooled the way -# the response is. -# -# Birds come from one file, Stratified.Rdata, rather than from -# the snapshot. It is the output of a stratification stage that -# is not in 0_data/v2_scripts/birds/ - those scripts start at -# 06 and take it as given - so this script reads it where it -# sits on the BirdModels drive and never writes there. -# -# Birds need two things no other taxon does. Every survey has a -# QPAD offset per species, written as bird_offsets.csv, which -# is response-shaped rather than a covariate and is by far the -# largest table here. And every survey is separately eligible -# for the north and south models, so eligibility is two flags -# in covariates.csv rather than one region in sites.csv; a -# survey can feed both models, or neither. -# -# Bird counts are integer point counts. Plants are 0/1 and -# mammals are densities, so the three responses are on three -# different scales and are not comparable across taxa without -# the offsets and weights their own models apply. -# -# Set SDM_BIRD_DATA to read Stratified.Rdata from elsewhere. -# -# The prediction matrices come from the vegetation models -# project on ABMI-DATA2, not from the snapshot, because the -# snapshot's veg.pm lacks the four aggregate columns four of -# the twelve vegetation models are predicted onto. Set -# SDM_V2_LOOKUP to read them from elsewhere. If the folder is -# unreachable the snapshot objects are used instead and -# section 7.4 says so, because such a run cannot fit the -# vegetation models. -# -# Future improvement - the plant-group files are read twice, -# once for the response and once for the covariates. That is -# simpler to follow than threading one environment through both -# readers, and this script runs once per snapshot. +# - Every taxon CSV is survey_unit_id + species columns; +# identity, design and location fields go to sites.csv. The +# covariate and lookup tables let the modules run from +# 0_data/test_dataset/ alone. +# - covariates.csv is keyed on survey_unit_id AND taxon (taxa +# disagree on shared quadrats; see section 5.4). Filter on +# taxon before joining, then drop empty columns. +# - Names in more than one block are block-suffixed (e.g. +# Crop_veg, Crop_soil); lookup/covariate_columns.csv maps +# each column to its block and v2 spelling. +# - The plant-group mite covariates differ from vascular plant +# mostly in the Surr* buffer terms (20 columns carry 67% of +# differing veg cells, 80% of soil), in every year 2007-2022: +# likely a different upstream extraction, unconfirmable here. +# - Mammal covariates and prediction matrices come from the +# SpTable files (matrices checked identical to the ABMI +# Mammals drive CSVs); the climate block is replaced (1.6). +# - Birds come from Stratified.Rdata (1.10), read-only +# (SDM_BIRD_DATA overrides). Prediction matrices come from +# the vegetation models project (1.8; SDM_V2_LOOKUP +# overrides). +# - TODO: the plant-group files are read twice (response, then +# covariates); simpler than threading one environment, and +# this runs once per snapshot. # --- # 1. Setup ---- @@ -161,30 +82,20 @@ project_root <- normalizePath(getwd(), winslash = "/") # The _setup inputs mirrored on ABMI-DATA2 (setup_input()) source(file.path(project_root, "1_code/_setup/utils/input_paths.R")) -# Directory containing the v2 model ready snapshot files on ABMI-DATA2 snapshot_dir <- Sys.getenv( "SDM_SNAPSHOT_V2", unset = setup_input("model_ready_v2") ) -# Output is the frozen test dataset itself, so it lands in -# 0_data/test_dataset/. That folder is otherwise read-only: this -# script is what writes it, by hand and once per snapshot, and -# every experiment then treats the result as fixed. The CSVs are -# gitignored along with the rest of 0_data/. +# The frozen test dataset; only this script writes it output_dir <- file.path(project_root, "0_data/test_dataset") -# Lookups sit in their own folder so the response and covariate -# tables stay the obvious contents of test_dataset/. lookup_dir <- file.path(output_dir, "lookup") ## 1.3 Name the source files ---- -# Plant-group files share one schema, mammal files another. -# -# "Plant group" names a file layout, not a taxonomy. It covers -# vascular plants, bryophytes, lichens and soil mites, because -# all four are surveyed on the same site-year-quadrant design -# and arrive in the same three-frame layout. +# "Plant group" is a file layout (the site-year-quadrant design), +# not a taxonomy: vascular plants, bryophytes, lichens and soil +# mites. Mammal files have another schema. plant_files <- c( vascular_plant = "vascular-plant-model-data.Rdata", bryophyte = "bryophyte-model-data.Rdata", @@ -204,12 +115,9 @@ mammal_files <- c( ) ## 1.4 Name the plant-group non-species columns ---- -# Plant-group frames are identity + species + site and climate. -# Species are whatever is left once the other two are named, so -# both are listed here rather than found by position: column -# order is an accident of how the files were built, and `Protocol` -# already sits last in two of the four files rather than with the -# site block it belongs to. +# Species are whatever is left once identity and site columns +# are named; column order is not reliable (`Protocol` sits last +# in two of the four files). # The six identity columns every plant-group frame opens with. plant_id_cols <- c( @@ -278,10 +186,8 @@ plant_site_cols <- c( "Protocol" ) -# Of those, the fields sites.csv already carries. They are -# dropped from the climate covariate table so each value has one -# home, and the model-data loader joins them back from sites.csv -# under their v2 names. +# Fields sites.csv carries, dropped from the climate table; the +# loader joins them back under their v2 names plant_site_cols_in_sites <- c( "Lat", "Long", @@ -293,17 +199,9 @@ plant_site_cols_in_sites <- c( "Northing" ) -# And the ones that are products of other stored columns. They -# are not written: the model-data loader recomputes them with the -# same expressions 01a_data-standardization.R used. -# -# Storing them would be worse than redundant. A CSV holds about -# 15 significant digits, so Northing lands within ~2e-9 of the -# source value; squaring it lifts that to ~0.05 in absolute -# terms. Written and read back independently, Northing2 would no -# longer be exactly Northing * Northing, and a model fitting both -# would see an inconsistent pair. Deriving keeps them consistent -# with whatever precision the stored columns carry. +# Products of stored columns, not written: the loader recomputes +# them as 01a_data-standardization.R did. Stored separately they +# would drift apart at CSV precision (Northing2 off by ~0.05). plant_site_cols_derived <- c( "Easting2", "Northing2", @@ -315,13 +213,9 @@ plant_site_cols_derived <- c( ) ## 1.5 Name the mammal column blocks ---- -# The mammal files are one frame, `d`, holding design fields, -# species-season columns and covariates. The species span is -# given by the file's own first_sp_col/last_sp_col indices, and -# the rest is split by naming the two non-habitat blocks; what -# is left over is habitat. That is the same split-by-elimination -# the plant-group reader uses, and section 6.6 checks that the -# three blocks account for every column. +# The mammal frame `d`: species from its first_sp_col and +# last_sp_col indices; the two non-habitat blocks are named +# below and habitat is the remainder (checked in 6.6). # Design and identity fields. sites.csv already carries these, # so they are dropped from the covariate tables. @@ -362,16 +256,10 @@ mammal_climate_cols <- c( ) ## 1.6 Name the mammal camera climate ---- -# The SpTable files carry a climate block, but it is not the one -# the mammal models were fitted against. The v2 climate pipeline -# joins this file instead, and at matched deployments the two -# disagree by up to 531 mm of MAP - they are different -# extractions. This file is therefore the authority for the -# mammal climate block, and its columns replace the SpTable's -# rather than sitting beside them. -# -# It is also the only source of CMD and TD for mammals, which -# four of the nine v2 climate models need. +# The v2 mammal climate pipeline joins this file, not the +# SpTable's climate block (they differ by up to 531 mm MAP at +# matched deployments), so its columns replace the SpTable's. +# Also the only mammal source of CMD and TD. mammal_camera_climate_file <- Sys.getenv( "SDM_MAMMAL_CAMERA_CLIMATE", unset = setup_input( @@ -379,14 +267,8 @@ mammal_camera_climate_file <- Sys.getenv( ) ) -# What it supplies. Everything else in the file - coordinates, -# natural region, elevation - is already in sites.csv. -# -# pAspen is deliberately not taken from it. The file carries a -# pAspen, but v2's south habitat models fit the SpTable's own, -# a different extraction that differs by up to 0.92 at matched -# deployments; replacing it made every south candidate with -# pAspen disagree with v2. The SpTable's column is kept. +# Not pAspen: v2's south models fit the SpTable's own (up to +# 0.92 different at matched deployments) mammal_camera_climate_cols <- c( "MAT", "MWMT", "MCMT", "TD", "MAP", "MSP", "AHM", "SHM", "DD_0", "DD5", "DD_18", "DD18", "NFFD", "bFFP", "eFFP", @@ -395,10 +277,8 @@ mammal_camera_climate_cols <- c( ) ## 1.7 Name the mammal climate predictions ---- -# The mammal habitat models take a climate offset rather than -# fitting climate themselves: 03_basic-models.R reads this file -# for both regions. It is produced by a separate climate -# pipeline, so it is copied in rather than derived here. +# The climate prediction 03_basic-models.R reads for both +# regions, from a separate pipeline; copied in mammal_climate_pred_file <- Sys.getenv( "SDM_MAMMAL_CLIMATE_PRED", unset = setup_input( @@ -409,20 +289,12 @@ mammal_climate_pred_file <- Sys.getenv( ) ## 1.8 Name the v2 prediction-matrix lookups ---- -# The v2 modelling scripts do not use the veg.pm and soil.pm -# objects carried in the snapshot. They read these two CSVs from -# the vegetation models project instead, and for veg the two are -# not the same grid. Over the same 43 habitat rows, the CSV adds -# Peatland, Mineral, Upland and CCR1234 - the aggregates that -# four of the twelve vegetation models are predicted onto - and -# drops MarshSwamp, CCPineR1, CCPine234, CCWhiteSpruceR1 and -# CCDecidMixedR1. The 51 columns they share hold identical -# values. The soil matrices are identical either way. -# -# So the CSVs are preferred, with the snapshot objects as the -# fallback if the drive is unreachable. Section 7.4 says which -# was used, because a fallback run cannot fit the vegetation -# models. +# The v2 scripts read these CSVs, not the snapshot's veg.pm and +# soil.pm. The veg CSV adds Peatland, Mineral, Upland and +# CCR1234 (needed by four of the twelve veg models) and drops +# MarshSwamp, CCPineR1, CCPine234, CCWhiteSpruceR1 and +# CCDecidMixedR1; shared columns are identical, as are the soil +# matrices. The snapshot is the fallback (reported in 7.4). v2_lookup_dir <- Sys.getenv( "SDM_V2_LOOKUP", unset = setup_input( @@ -446,31 +318,21 @@ wt_species_file <- Sys.getenv( ) ## 1.10 Name the bird data package ---- -# One .Rdata holding every frame the bird models read: `covs`, -# `bird`, `off`, `boot` and `birdlist`. It is the output of the -# stratification stage, which is not in 0_data/v2_scripts/birds/ -# - those start at 06 and take this file as given. -# -# The copy read is the one v2's archived bird results were -# fitted on, kept in this project's remote/birds_data_v2/. The -# BirdModels drive's Data/Archive/2025/Stratified.Rdata is NOT -# it: that file was rebuilt in place on 2026-08-19 with 175 -# fewer surveys per draw and different draws, so no bird draw -# could match v2. With this copy, the harness reproduces v2's -# per-draw bird coefficients to ~1e-10 (checked 2026-10-02). -# -# The BirdModels drive is read-only for this repository. Nothing -# below writes to it. +# `covs`, `bird`, `off`, `boot` and `birdlist`, from a +# stratification stage not in 0_data/v2_scripts/birds/. Use the +# copy v2 was fitted on (remote/birds_data_v2/), NOT the +# BirdModels drive's Archive/2025 file, rebuilt on 2026-08-19 +# with different draws. With this copy the harness reproduces +# v2's per-draw bird coefficients to ~1e-10 (checked +# 2026-10-02). Read-only. bird_data_file <- Sys.getenv( "SDM_BIRD_DATA", unset = setup_input("birds_data_v2", "Stratified.Rdata") ) ## 1.11 Name the bird covariate blocks ---- -# Taken from the model definitions rather than guessed: every -# name below appears in a formula in 00.ClimateModels.R, -# 00.NorthModels.R or 00.SouthModels.R. Section 6.8 checks that -# the four blocks account for every column of `covs`. +# Every name appears in a formula in 00.ClimateModels.R, +# 00.NorthModels.R or 00.SouthModels.R (checked in 6.8) # The climate stage. EMT is carried because it sits with the # other climate normals in the source, but no formula uses it. @@ -482,10 +344,8 @@ bird_climate_cols <- c( "EMT" ) -# The north landcover stage. The human-footprint, method and -# water terms are shared with the south, so they appear in both -# blocks; each file is then the whole right-hand side of the -# models it feeds. +# The north landcover stage. Footprint, method and water terms +# are shared with the south block. bird_veg_cols <- c( "vegc", "wtAge", @@ -572,17 +432,11 @@ if (length(missing_files) > 0) { dir.create(output_dir, recursive = TRUE, showWarnings = FALSE) # 2. Helper functions ---- -# One reader per source family, plus a name normalizer for the -# mammal crosswalk and a duplicate-key guard shared by both. ## 2.1 load_rdata() ---- #' Load an .RData File into an Isolated Environment #' -#' Reads a saved workspace without touching the global -#' environment, so the six files cannot overwrite each other's -#' objects. -#' #' @param path Character. Path to an .RData file. #' @return An environment holding the file's objects. #' @@ -641,11 +495,8 @@ make_unique_ids <- function(ids, label) { #' Reduce a Species String to a Column-Safe Token #' -#' Collapses a common-name string to CamelCase with no -#' punctuation. -#' Apostrophes are deleted before splitting, so "Richardson's" -#' becomes "Richardsons" and not "Richardson" + "S"; the -#' remaining punctuation and spaces are split points. +#' CamelCase without punctuation; apostrophes are deleted first +#' ("Richardson's" becomes "Richardsons"). #' #' @param x Character. Species strings. #' @return Character. One token per input. @@ -676,11 +527,8 @@ squash_name <- function(x) { #' Resolve Source Species Names against the WildTrax Strings #' -#' Maps each source species name to its WildTrax common-name -#' string, which is the naming authority for mammals. An exact -#' match is tried first, then a punctuation-insensitive one: the -#' North file already uses the WildTrax strings verbatim, while -#' the South file uses their camel-cased form. +#' WildTrax is the mammal naming authority. Exact match first, +#' then punctuation-insensitive (the South file camel-cases). #' #' @param base Character. Source species names, no season suffix. #' @param native_sp Character. WildTrax common-name strings. @@ -776,19 +624,9 @@ normalize_mammal_column <- function(x, native_sp, label) { #' Read One Plant-Group Snapshot File #' -#' Despite the name, "plant group" is a file layout rather than a -#' taxon: this reads the vascular plant, bryophyte, lichen and -#' mite files, which share one site-year-quadrant schema. -#' -#' Splits a plant-group file into its species block and its site -#' block. Species are identified by elimination: every column -#' that is neither an identity column (`plant_id_cols`) nor a -#' site or climate column (`plant_site_cols`) is a species. -#' -#' Two checks keep the rule honest in both directions. Anything -#' wrongly counted as a species fails the 0/1 test, and anything -#' wrongly excluded is caught against the file's own -#' `veg.species.list` and `soil.species.list`. +#' Species are identified by elimination (neither +#' `plant_id_cols` nor `plant_site_cols`), checked both ways: a +#' 0/1 test, and the file's own species lists. #' #' @param path Character. Path to a plant-group .Rdata file. #' @param taxon Character. Taxon slug, used in messages and in @@ -819,8 +657,7 @@ read_plant_taxon <- function(path, taxon) { ) } - # Step 2: Species are what remains once identity and site - # columns are removed, so column order does not matter. + # Step 2: Species by elimination species_cols <- setdiff(cols, c(plant_id_cols, plant_site_cols)) # Step 3: Confirm the block really is presence/absence data. @@ -921,20 +758,10 @@ read_plant_taxon <- function(path, taxon) { #' Read One Plant-Group File's Covariate and Lookup Blocks #' -#' Companion to `read_plant_taxon()`, which takes the response. -#' This takes what the v2 hierarchical models regress against: -#' the climate block, the north vegetation and HF block, the -#' south soil and HF block, the two habitat prediction matrices, -#' and the lists naming which species each model set is fitted -#' for. -#' -#' The habitat blocks are found by difference rather than by -#' position. `climate.data` is identity + species + climate, so -#' whatever `veg.data` holds that `climate.data` does not is the -#' vegetation block, and likewise for soil. That reproduces the -#' positional spans the v2 scripts hard-code - `[403:489]` for -#' bryophytes, `[448:534]`, `[328:414]` and `[1408:1494]` for the -#' other three - without depending on column order staying put. +#' Habitat blocks are found by difference from `climate.data`, +#' reproducing the column spans the v2 scripts hard-code +#' (`[403:489]` for bryophytes, `[448:534]`, `[328:414]` and +#' `[1408:1494]` for the others) without relying on order. #' #' @param path Character. Path to a plant-group .Rdata file. #' @param taxon Character. Taxon slug, used in messages. @@ -964,9 +791,7 @@ read_plant_covariates <- function(path, taxon) { stringsAsFactors = FALSE ) - # Step 2: Take each habitat block by difference from - # climate.data, which leaves the covariates behind and drops - # the identity, species and climate columns both frames share. + # Step 2: Each habitat block, by difference from climate.data take_block <- function(frame) { block_cols <- setdiff(names(frame), clim_cols) @@ -980,10 +805,8 @@ read_plant_covariates <- function(path, taxon) { veg <- take_block(env$veg.data) soil <- take_block(env$soil.data) - # Step 3: The v2 coefficient template is the first 87 columns - # of this block, taken positionally. A snapshot that reordered - # or shortened it would silently rename every vegetation - # coefficient, so the width is checked rather than assumed. + # Step 3: v2 takes the first 87 columns positionally as its + # coefficient template, so check the width if (ncol(veg) - 1 < 87) { stop( taxon, @@ -994,9 +817,7 @@ read_plant_covariates <- function(path, taxon) { ) } - # Step 4: All three frames must describe the same survey units - # in the same order, or the tables cannot be recombined on - # survey_unit_id downstream. + # Step 4: All three frames must list the same units in order if ( !identical(climate$survey_unit_id, veg$survey_unit_id) || !identical(climate$survey_unit_id, soil$survey_unit_id) @@ -1009,17 +830,11 @@ read_plant_covariates <- function(path, taxon) { ) } - # Step 5: Record which species each model set is fitted for. - # These are subsets of the response columns, and the v2 scripts - # read them straight out of the .Rdata, so they have to travel - # with the dataset or the work queue cannot be rebuilt. + # Step 5: Which species each model set is fitted for (the v2 + # work queue) modelled <- union(env$veg.species.list, env$soil.species.list) - # The two lists are separately ordered, and the v2 scripts walk - # each in its own order. A single stacked table would lose that, - # so each species carries its position in whichever lists hold - # it, and the loader sorts on those rather than on the row - # order of this file. + # Each list keeps its own v2 order, as a position per list species_lists <- data.frame( taxon = taxon, species = modelled, @@ -1058,15 +873,9 @@ read_plant_covariates <- function(path, taxon) { #' Read the Mammal Camera Climate #' -#' Climate normals interpolated to each camera deployment. The -#' file is keyed on site and year, but the normals are 30-year -#' averages and so identical across years at one location; v2 -#' strips the year and keeps one row per location, which is -#' reproduced here. -#' -#' The CMU and NWSAR prefixes are project tags on the site name -#' rather than part of the location, and are stripped for the -#' same reason. +#' 30-year normals, so identical across years: as v2, the year +#' and the CMU and NWSAR project prefixes are stripped, leaving +#' one row per location. #' #' @param path Character. Path to abmi-camera-climate_*.Rdata. #' @param columns Character vector of climate columns to keep. @@ -1118,13 +927,8 @@ read_camera_climate <- function(path, columns) { #' Read One Mammal Snapshot File #' -#' Reads the camera tibble `d` and harmonizes its species-season -#' column names. The values are densities. -#' -#' The v2 script 02_process-data-files.R sets a season's -#' densities to NA when that season has fewer than 10 -#' camera-days, so an NA records too little effort to estimate -#' from. +#' Values are densities; NA means fewer than 10 camera-days that +#' season (v2's 02_process-data-files.R). #' #' @param path Character. Path to a mammal .RData file. #' @param region Character. "north" or "south". @@ -1217,12 +1021,8 @@ read_mammal_region <- function(path, region, native_sp) { stringsAsFactors = FALSE ) - # Step 5: Split the covariates off the same frame. The species - # span is already known, and the two non-habitat blocks are - # named in section 1.5, so habitat is what is left. The unit - # ids are reused rather than rebuilt: make_unique_ids() numbers - # duplicate deployments, and a second call would have to - # reproduce that numbering exactly. + # Step 5: Split the covariates off (section 1.5). Reuse the + # unit ids: make_unique_ids() numbered duplicate deployments. take_block <- function(wanted) { present <- intersect(wanted, names(d)) @@ -1236,18 +1036,9 @@ read_mammal_region <- function(path, region, native_sp) { climate <- take_block(mammal_climate_cols) - # Step 5b: Replace the SpTable's climate columns with the - # camera climate, which is what the v2 climate pipeline - # actually fitted against. The two are different extractions - - # they disagree by up to 531 mm of MAP at matched deployments - - # so taking some columns from one and some from the other would - # leave the block internally inconsistent. It is also the only - # source of CMD and TD, which four of the nine v2 climate - # models need. - # - # A deployment the climate file does not reach keeps NA rather - # than a substitute. v2 excludes those sites; a nearest-site - # value would be a different extraction again. + # Step 5b: Replace the climate block wholesale with the camera + # climate (section 1.6). Unmatched deployments keep NA, as v2 + # excludes them. camera_climate <- read_camera_climate( mammal_camera_climate_file, mammal_camera_climate_cols ) @@ -1288,9 +1079,7 @@ read_mammal_region <- function(path, region, native_sp) { ) habitat <- take_block(habitat_cols) - # The four blocks must partition `d` exactly. They are built by - # difference, so an overlap or a gap would quietly move a - # column into the wrong table. + # The four blocks must partition `d` exactly accounted <- length(species_cols) + length(habitat_cols) + length(intersect(mammal_site_cols, names(d))) + length(intersect(mammal_climate_cols, names(d))) @@ -1308,12 +1097,9 @@ read_mammal_region <- function(path, region, native_sp) { ) } - # Step 6: Record the work queue. Mammals model each season - # separately and at two occurrence thresholds - sp_table_* are - # the species with at least 20 detections, which get the full - # habitat model, and sp_table_*_ua those with at least 3, which - # get the use-availability model. One row per species-season, - # with its position in each list it belongs to. + # Step 6: The work queue: per season, sp_table_* (20+ + # detections, full habitat model) and sp_table_*_ua (3+, + # use-availability) season_lists <- list( summer = list( modelled = env$sp_table_summer, @@ -1375,17 +1161,9 @@ read_mammal_region <- function(path, region, native_sp) { #' Read the Bird Data Package #' -#' Splits Stratified.Rdata into the same shape the other taxa -#' use: a response table, covariate blocks, site rows, and the -#' lookups that say what to model. -#' -#' Birds differ from the other taxa in three ways that the output -#' has to carry. Each survey has a QPAD offset per species, so -#' the offsets are a second response-shaped table rather than a -#' covariate. Each survey is separately eligible for the north -#' and south models, so eligibility is two flags rather than one -#' region. And the counts are integer point counts, not the -#' plants' 0/1 or the mammals' densities. +#' Birds add a response-shaped QPAD offset table, eligibility as +#' two flags (north and south; a survey may feed both or +#' neither), and integer point counts. #' #' @param path Character. Path to Stratified.Rdata. #' @return A list with `species`, `offsets`, `sites`, `climate`, @@ -1415,12 +1193,9 @@ read_bird_data <- function(path) { counts <- as.data.frame(env$bird, stringsAsFactors = FALSE) offsets <- as.data.frame(env$off, stringsAsFactors = FALSE) - # Step 1: The three frames are stored row-aligned, but `covs` - # holds surveyid as double and the other two as integer, so - # identical() on them is FALSE for a reason that does not - # matter. Compare on a common type, and refuse to continue if - # the rows ever stop lining up: every table below is built by - # position, not by joining. + # Step 1: The frames must be row-aligned (tables below are + # built by position). Compare surveyid on a common type: `covs` + # holds it as double, the others as integer. key <- as.integer(covs$surveyid) if ( @@ -1440,10 +1215,8 @@ read_bird_data <- function(path) { unit_id <- paste0("bird|", key) - # Step 2: Counts are the response. Offsets are the same shape, - # restricted to the species that have counts: `off` carries 219 - # species and `bird` 127, and an offset with no count column - # cannot be modelled. + # Step 2: Counts, and offsets for species with counts (`off` + # has 219 species, `bird` 127) species_cols <- setdiff(names(counts), "surveyid") absent_offsets <- setdiff(species_cols, names(offsets)) @@ -1472,10 +1245,8 @@ read_bird_data <- function(path) { stringsAsFactors = FALSE ) - # Step 3: Take each covariate block by name. Shared footprint, - # method and water terms appear in both habitat blocks, so the - # blocks are not a partition of the covariate columns and are - # built by intersection rather than by difference. + # Step 3: Blocks by name (intersection): shared terms sit in + # both habitat blocks take_block <- function(wanted) { present <- setdiff( intersect(wanted, names(covs)), @@ -1495,17 +1266,13 @@ read_bird_data <- function(path) { soil <- take_block(bird_soil_cols) design <- take_block(bird_design_cols) - # date_time is POSIXct in local time. fwrite would render it as - # UTC, so a 07:07 Mountain survey would be read back as 13:07 - # and every survey would silently move six hours. Formatting it - # here stores exactly what the source displays. + # Format local time: fwrite would write UTC, shifting surveys + # by six hours design$date_time <- format(design$date_time) - # Step 4: Build the site rows. Birds carry UTM coordinates but - # no latitude, longitude or natural region, so those stay NA - # rather than being reprojected here. `year` is the calendar - # year taken from date_time; the model's recoded year travels - # in the design table. + # Step 4: Site rows. Lat, long and natural region stay NA (not + # reprojected); `year` is calendar year (the recoded model year + # is in the design table). calendar_year <- as.integer(format(covs$date_time, "%Y")) if (!all(covs$year == calendar_year - 1992)) { @@ -1542,27 +1309,21 @@ read_bird_data <- function(path) { stringsAsFactors = FALSE ) - # Step 5: The work queue. birdlist is one row per species and - # region, with the detection counts that decided inclusion. + # Step 5: The work queue (birdlist, per species and region) species_lists <- data.frame( as.data.frame(env$birdlist, stringsAsFactors = FALSE), stringsAsFactors = FALSE ) - # Step 6: Name the bootstrap columns. The source calls them - # "1" to "100", which a CSV header cannot distinguish from a - # row of data: read back, the header becomes a 58036th row and - # the columns are renamed V1 to V100. A word prefix makes the - # header unmistakable and keeps the draw number. + # Step 6: Prefix the bootstrap columns "1" to "100", which a + # CSV reader takes for a data row rather than a header bootstrap <- as.data.frame(env$boot) names(bootstrap) <- sprintf( "boot_%03d", seq_len(ncol(bootstrap)) ) - # Step 7: Record every factor's levels in source order. A CSV - # stores labels, and re-reading gives alphabetical levels; that - # would move the reference level and silently change which - # coefficient a model reports as the intercept. + # Step 7: Factor levels in source order, since a CSV re-read + # would give alphabetical levels and move the reference factor_cols <- names(covs)[vapply(covs, is.factor, logical(1))] factor_levels <- do.call(rbind, lapply( @@ -1625,9 +1386,7 @@ plant_parts <- lapply( names(plant_parts) <- names(plant_files) ## 3.2 Read the plant-group covariates and lookups ---- -# A second pass over the same four files. The response and the -# covariates are kept in separate readers because they answer -# separate questions, and this script runs once per snapshot. +# A second pass over the same four files (see the header TODO) message("Reading plant-group covariates ...") covariate_parts <- lapply( @@ -1642,8 +1401,6 @@ covariate_parts <- lapply( names(covariate_parts) <- names(plant_files) ## 3.3 Read the mammal files ---- -# The WildTrax strings are loaded once and passed to both -# regions, so each resolves its names against the same authority. message("Reading mammal files ...") native_sp <- load_rdata(wt_species_file)$native_sp @@ -1674,12 +1431,9 @@ message("Reading bird data ...") bird_parts <- read_bird_data(bird_data_file) # 4. Harmonize the mammal regions into one taxon table ---- -# North and South are one taxon split across two models, so they -# are stacked. ## 4.1 Confirm the North names reconcile with the South ---- -# A North name that no longer matches means the crosswalk has -# drifted and would split one species across two columns. +# A mismatch would split one species across two columns north_species <- setdiff( names(mammal_parts$north$species), "survey_unit_id" @@ -1736,8 +1490,7 @@ message( ) # 5. Build the master site table ---- -# One row per survey unit across all six sources, plus a flag per -# taxon recording which taxon files cover that unit. +# One row per survey unit, with an in_ flag per taxon ## 5.1 Stack every source's site rows ---- all_sites <- do.call( @@ -1751,8 +1504,7 @@ all_sites <- do.call( rownames(all_sites) <- NULL ## 5.2 Record which taxon files cover each unit ---- -# The four plant taxa share the SiteYearQu key but sample -# different unit sets. The flags make that coverage explicit. +# The plant taxa share keys but sample different units taxon_units <- c( lapply(plant_parts, function(x) x$species$survey_unit_id), list( @@ -1767,8 +1519,6 @@ for (taxon in names(taxon_units)) { } ## 5.3 Collapse to one row per survey unit ---- -# A plant unit contributes an identical site row from each taxon -# file that sampled it. flag_cols <- grep("^in_", names(all_sites), value = TRUE) attribute_cols <- setdiff( names(all_sites), @@ -1795,35 +1545,20 @@ sites <- all_sites[!duplicated(all_sites$survey_unit_id), ] rownames(sites) <- NULL ## 5.4 Build the master covariate table ---- -# One table for every taxon, keyed on survey_unit_id and taxon -# the way sites.csv is keyed on survey_unit_id alone. -# -# Taxon has to be part of the key, because the four plant files -# disagree. On the 7001 quadrats vascular plant and mite share, -# 154 of 162 vegetation columns and 58 of 59 soil columns hold -# different values, while climate agrees to the last digit. -# Bryophyte and lichen match vascular plant exactly. Two -# descriptions of the same quadrat cannot share one row, and -# choosing between them is not this script's call to make. -# -# Columns are the union across taxa. Each taxon fills only the -# blocks it has and leaves the rest empty, so the table is about -# 16 per cent populated - the price of one file instead of -# twenty, paid mostly by the bird rows, which are 86 per cent of -# the rows and share almost no column names with the others. +# Keyed on survey_unit_id and taxon because the plant files +# disagree: on the 7001 quadrats vascular plant and mite share, +# 154 of 162 veg and 58 of 59 soil columns differ (climate +# agrees; bryophyte and lichen match vascular plant). Each file +# is a separate extraction (01a_data-standardization.R); choosing +# between them is not this script's call. Columns are the union +# across taxa (~16% populated; birds are 86% of rows). #' Join One Taxon's Covariate Blocks Side by Side #' -#' Blocks come from one source frame in one row order, so they -#' are combined by position rather than by key. -#' -#' A name carried by more than one block is suffixed with the -#' block it came from. That is not tidiness: in the plant files -#' 42 names sit in both the veg and soil blocks, and 14 of them -#' hold different values, because the footprint terms are -#' computed once under the north vegetation framework and again -#' under the south soil one. Keeping a single `Crop` would feed -#' the south models north numbers. +#' Combined by position (one source frame). Names in more than +#' one block are block-suffixed: of 42 plant names in both veg +#' and soil, 14 differ (footprint computed under each framework), +#' so a single `Crop` would feed the south models north numbers. #' #' @param blocks Named list of data frames, each keyed on #' survey_unit_id. The names become the block suffixes. @@ -1888,10 +1623,9 @@ merge_blocks <- function(blocks, taxon) { return(list(table = out, map = do.call(rbind, map))) } -# The blocks each taxon owns. Mammals are split by region -# because north and south are separate models on overlapping -# deployments; birds add a design block that is neither a -# covariate nor a field sites.csv carries. +# Mammals are split by region (separate models on overlapping +# deployments: 512 location_project values in both); birds add +# a design block covariate_blocks <- c( lapply(covariate_parts, function(x) { list(climate = x$climate, veg = x$veg, soil = x$soil) @@ -1927,8 +1661,6 @@ covariates <- as.data.frame(rbindlist( use.names = TRUE )) -# Where every column came from, so a block can be reconstructed -# exactly and a suffixed name traced back to its v2 spelling. covariate_columns <- do.call( rbind, lapply(merged_covariates, function(x) x$map) @@ -1952,8 +1684,7 @@ message( ) # 6. Validate the assembled tables ---- -# Cheap checks that would catch a layout change in a future -# snapshot before the CSVs are trusted downstream. +# Catch layout changes in a future snapshot species_tables <- c( lapply(plant_parts, function(x) x$species), @@ -1998,11 +1729,8 @@ for (taxon in names(species_tables)) { } ## 6.3 Covariates must cover the response, unit for unit ---- -# A survey unit with a detection but no covariates would be -# dropped silently at model time, so the two are required to -# describe exactly the same set. Mammals contribute two taxon -# values to the covariate table and one response table, so the -# two regions are pooled before comparing. +# Otherwise units drop silently at model time. Mammal regions +# are pooled first (two covariate keys, one response table). covariate_taxa <- list( vascular_plant = "vascular_plant", bryophyte = "bryophyte", @@ -2048,9 +1776,7 @@ if (length(orphan_covariates) > 0) { } ## 6.4 Modelled species must exist as response columns ---- -# veg.species.list and soil.species.list are the work queue. A -# name that is not a column would fail per bootstrap inside a -# tryCatch, so it is caught here instead. +# Otherwise it fails per bootstrap, inside a tryCatch for (taxon in names(covariate_parts)) { declared <- covariate_parts[[taxon]]$species_lists$species available <- setdiff( @@ -2072,8 +1798,7 @@ for (taxon in names(covariate_parts)) { } ## 6.5 The prediction matrices must agree across taxa ---- -# They are written once rather than per taxon, which is only -# sound while all four files carry the same grid. +# Written once, so all four files must carry the same grid for (matrix_name in c("veg_pm", "soil_pm")) { reference <- covariate_parts[[1]][[matrix_name]] @@ -2096,11 +1821,8 @@ for (matrix_name in c("veg_pm", "soil_pm")) { } ## 6.6 Mammal habitat must be cover proportions ---- -# The habitat block is what is left once the design, climate and -# species columns are named, so a new unnamed column would land -# in it silently. The reader has already checked that the blocks -# partition the frame; this checks that nothing non-numeric -# arrived, which is the shape a stray design field would have. +# Habitat is the remainder, so a stray design field would land +# here; check it is all numeric for (region in names(mammal_parts)) { part <- mammal_parts[[region]] @@ -2144,10 +1866,8 @@ for (region in names(mammal_parts)) { } ## 6.8 Bird blocks must account for every covariate column ---- -# The four blocks are taken by name, so a column the source adds -# would be dropped silently rather than landing somewhere wrong. -# Easting and Northing are deliberately excluded: sites.csv -# carries them. +# Blocks are taken by name, so a new source column would drop +# silently. Easting and Northing are in sites.csv. bird_named <- unique(c( bird_climate_cols, bird_veg_cols, @@ -2170,8 +1890,6 @@ if (length(bird_unnamed) > 0) { } ## 6.9 Bird counts and offsets must be model ready ---- -# The models are Poisson with a log offset, so counts must be -# non-negative whole numbers and every count needs an offset. bird_counts <- as.matrix( bird_parts$species[, -1, drop = FALSE] ) @@ -2228,8 +1946,6 @@ if (length(bird_unknown) > 0) { } ## 6.11 Bootstrap draws must resolve to surveys ---- -# The bootstrap matrix holds raw surveyids. They join to the -# design table, so a draw outside it would drop rows at fit time. bird_boot_ids <- unique(unlist(bird_parts$bootstrap)) bird_orphan_draws <- setdiff( bird_boot_ids, @@ -2247,8 +1963,6 @@ if (length(bird_orphan_draws) > 0) { } # 7. Write the CSVs ---- -# One file per taxon plus the site table, all sharing the -# survey_unit_id key. ## 7.1 Write the taxon tables ---- for (taxon in names(species_tables)) { @@ -2279,14 +1993,8 @@ message( ) ## 7.3 Write the master covariate table ---- -# One file beside sites.csv, keyed on survey_unit_id and taxon, -# holding every covariate every taxon's models regress against. -# A model-data frame is rebuilt by joining it to sites.csv and -# the taxon's response table on survey_unit_id, filtering to that -# taxon, and dropping the columns that came back empty. -# -# The per-taxon covariate folder this replaces is removed, so a -# stale copy cannot be picked up by mistake. +# Also removes the old per-taxon covariate folder, so a stale +# copy cannot be read old_covariate_dir <- file.path(output_dir, "covariates") if (dir.exists(old_covariate_dir)) { @@ -2327,8 +2035,7 @@ message( ) ## 7.4 Write the shared lookups ---- -# Section 6.5 has already confirmed the two prediction matrices -# are the same in all four files, so they are written once. +# Written once (checked identical across taxa in 6.5) dir.create(lookup_dir, recursive = TRUE, showWarnings = FALSE) prediction_matrices <- list( @@ -2336,9 +2043,7 @@ prediction_matrices <- list( soil_prediction_matrix = covariate_parts[[1]]$soil_pm ) -# Take the v2 CSVs when they are reachable. They are what the v2 -# scripts read, and the snapshot objects are missing columns the -# vegetation models need. +# The v2 CSVs when reachable (section 1.8) for (matrix_name in names(prediction_matrices)) { if (is.na(v2_lookup_dir) || !nzchar(v2_lookup_dir)) { next @@ -2378,10 +2083,8 @@ for (matrix_name in names(prediction_matrices)) { ) } -# The four aggregate columns the vegetation models predict onto. -# Their absence is what separates the snapshot's veg.pm from the -# CSV the v2 scripts read, so it is reported here rather than -# found later, at prediction time. +# Report whether the four aggregate columns are present, rather +# than fail later at prediction time veg_aggregates <- c("Peatland", "Mineral", "Upland", "CCR1234") absent_aggregates <- setdiff( veg_aggregates, @@ -2418,9 +2121,7 @@ message( ) ## 7.5 Write the mammal lookups ---- -# The prediction matrices are per region and were checked against -# the CSVs on the ABMI Mammals drive, so they are taken from the -# snapshot rather than copied in. +# From the snapshot (checked identical to the ABMI Mammals CSVs) for (region in names(mammal_parts)) { path <- file.path( lookup_dir, @@ -2439,9 +2140,7 @@ for (region in names(mammal_parts)) { ) } -# Mammals get their own species table rather than rows in -# modelled_species.csv: their work queue is season by occurrence -# threshold, which the plant north/south schema has no room for. +# Own table: season by threshold does not fit the plant schema mammal_modelled <- do.call( rbind, lapply(mammal_parts, function(x) x$species_lists) @@ -2461,11 +2160,8 @@ message( " cols" ) -# The climate offset the mammal habitat models take. It is -# produced by a separate climate pipeline, so it is copied in -# with survey_unit_id added, keyed the way the rest of the -# dataset is. A deployment with no climate prediction keeps the -# NA the v2 join would have produced. +# Copied in with survey_unit_id added; unmatched deployments +# keep NA, as the v2 join gives if (file.exists(mammal_climate_pred_file)) { climate_pred <- as.data.frame( fread(mammal_climate_pred_file), stringsAsFactors = FALSE @@ -2526,10 +2222,7 @@ if (file.exists(mammal_climate_pred_file)) { } ## 7.6 Write the bird offsets ---- -# The QPAD offsets. Response-shaped rather than covariate-shaped: -# one value per survey and species, carrying the detectability -# correction each Poisson model takes as its offset. It is the -# largest table in the dataset by a wide margin. +# One QPAD offset per survey and species; the largest table offsets_path <- file.path(output_dir, "bird_offsets.csv") fwrite(bird_parts$offsets, offsets_path, na = "") @@ -2559,9 +2252,8 @@ message( " cols" ) -# Raw surveyids, not survey_unit_ids: they join to the surveyid -# column carried in covariates.csv for taxon "bird". Keeping them -# raw holds the file to a tenth of the size prefixed keys need. +# Raw surveyids (joined via covariates.csv's surveyid), a tenth +# the size of prefixed keys bird_boot_path <- file.path( lookup_dir, "bird_bootstrap_ids.csv" ) @@ -2575,9 +2267,6 @@ message( " cols" ) -# Without this, re-reading a factor from CSV gives alphabetical -# levels, which moves the reference level and renames every -# coefficient the model reports. bird_levels_path <- file.path( lookup_dir, "bird_factor_levels.csv" ) diff --git a/1_code/_setup/02_validate_test_dataset.R b/1_code/_setup/02_validate_test_dataset.R index 79f633b..64078d2 100644 --- a/1_code/_setup/02_validate_test_dataset.R +++ b/1_code/_setup/02_validate_test_dataset.R @@ -3,10 +3,8 @@ # author: Brendan Casey # created: 2026-09-08 # inputs: -# Read from the input mirror on ABMI-DATA2 (utils/ -# input_paths.R; 00_mirror_setup_inputs.R made it). The -# locations below are the originals, which the SDM_* variables -# can point back to. +# Read via setup_input() (utils/input_paths.R); the original +# locations are listed, and SDM_* variables can point back. # in 0_data/test_dataset/, written by # _setup/01_harmonize_model_ready_v2.R: # - sites.csv @@ -37,27 +35,15 @@ # outputs: # - none; every result is printed to the console # notes: -# Two passes over the harmonized dataset. Section 2 describes -# it: sizes, coverage, value ranges, and whether the tables -# join the way they are meant to. Section 3 traces every -# written value back to the snapshot it came from: responses in -# 3.3 to 3.5, covariates in 3.6, and lookups in 3.7 to 3.9. -# -# Covariates now live in one master table keyed on -# survey_unit_id and taxon, not in a file per taxon and block. -# Section 3.6 rebuilds each block from it using -# lookup/covariate_columns.csv, which maps every master column -# back to the block and the v2 spelling it came from. That is -# also what catches a column being dropped or renamed, since a -# block is only checked against the map's own account of it. -# -# Covariate values are compared on relative difference, not -# absolute. A CSV carries about 15 significant digits, so UTMY -# at 6.6e6 comes back about 6e-9 away from the source; that is -# a round-trip artefact, not a harmonization error. -# -# Run after 01_harmonize_model_ready_v2.R, and again whenever -# the snapshot or that script changes. +# - Section 2 describes the dataset (sizes, coverage, ranges, +# joins); section 3 traces every written value back to its +# source snapshot. +# - Covariate blocks are rebuilt from the master table via +# lookup/covariate_columns.csv, which also catches dropped or +# renamed columns. +# - Covariates are compared on relative difference: CSV keeps +# ~15 significant digits (UTMY at 6.6e6 drifts ~6e-9). +# - Run after 01, and whenever the snapshot or 01 changes. # --- # 1. Setup ---- @@ -615,10 +601,8 @@ for (rg in names(mammal_files)) { #' Count Disagreements on Relative Difference #' -#' The absolute counterpart, compare_blocks(), is right for the -#' response, whose values are small integers. Covariates span -#' UTM coordinates at 1e6 and cover proportions at 1e-4, so a -#' single absolute tolerance cannot serve both. +#' Covariates span 1e-4 (cover) to 1e6 (UTM), so no single +#' absolute tolerance fits; compare_blocks() suits responses. #' #' @param a,b Data frames or matrices of the same shape. #' @param tol Numeric. Largest relative difference treated as @@ -665,11 +649,9 @@ derived_terms <- list( #' Check One Taxon's Covariate Blocks Against Their Source #' -#' Rebuilds each block from the master table using the column -#' map, then compares it to the frame it came from. The map is -#' what makes this possible: a master column may be suffixed -#' with its block, so the v2 spelling cannot be recovered from -#' the header alone. +#' Rebuilds each block from the master table via the column map +#' (master columns may carry a block suffix) and compares it to +#' its source frame. #' #' @param taxon_label Character. Value in covariates$taxon. #' @param source_frames Named list of source data frames, one @@ -700,9 +682,7 @@ check_covariates <- function(taxon_label, source_frames, return(invisible(NULL)) } - # Step 1: Line the rows up with the source before any value is - # compared, by key where there is one and by position where - # there is not + # Step 1: Align rows with the source, by key or by position n_source <- nrow(source_frames[[1]]) if (is.null(source_ids)) { @@ -916,8 +896,8 @@ for (taxon in names(plant_files)) { ) } -# The prediction matrices are written once for all four taxa, so -# they are checked once, against the last taxon read above. +# Shared by all four taxa, so checked once (against the last +# taxon read above) veg_pm_csv <- as.data.frame(fread( file.path(data_dir, "lookup", "veg_prediction_matrix.csv") )) @@ -963,9 +943,7 @@ note( ) ## 3.6 Mammal covariates and lookups against source ---- -# Mammal covariates come from the same two SpTable files as the -# mammal response, and are written per region because north and -# south are separate models on overlapping deployments. +# From the same two SpTable files as the mammal response mammal_habitat_name <- c(north = "veg", south = "soil") @@ -974,10 +952,9 @@ for (region in names(mammal_files)) { d <- as.data.frame(env$d, stringsAsFactors = FALSE) label <- paste("mammal", region) - # Mammal covariates carry a taxon of mammal_, because - # north and south are separate models on overlapping - # deployments. The habitat block is called veg in the north and - # soil in the south, matching the model each one feeds. + # Keyed mammal_: north and south are separate models on + # overlapping deployments. The habitat block is veg in the north + # and soil in the south. habitat <- mammal_habitat_name[[region]] frames <- list(d, d) names(frames) <- c("climate", habitat) @@ -1142,8 +1119,7 @@ if (file.exists(bird_data_file)) { sprintf("%d cells, max diff %.1g", cmp$n, cmp$max_diff) ) - # Counts feed a Poisson model, so they have to be whole and - # non-negative for the fit to mean anything. + # Poisson counts: whole and non-negative bird_counts <- as.matrix(bird_csv[, ..bird_spp]) note( "bird", @@ -1154,8 +1130,7 @@ if (file.exists(bird_data_file)) { paste("max", max(bird_counts)) ) - # Offsets are response-shaped: one per survey and species, and - # the model cannot run without the pair. + # One offset per survey and species off_csv <- fread(file.path(data_dir, "bird_offsets.csv")) note( @@ -1248,9 +1223,8 @@ if (file.exists(bird_data_file)) { ) ) - # Factor levels have to travel separately: read back from a - # CSV a factor takes alphabetical levels, which moves the - # reference level and renames every coefficient. + # Read back from CSV, factors take alphabetical levels, moving + # the reference level levels_csv <- fread( file.path(data_dir, "lookup", "bird_factor_levels.csv") ) @@ -1283,11 +1257,9 @@ if (file.exists(bird_data_file)) { ) } -## 3.6.3 Harmonized lookups ---- -# _setup/09 writes one species queue, one factor-level table, the -# bird grids and the dataset manifest from the files checked -# above. They are checked here against those files, so a lookup -# left stale by a rebuild of 01 or 06 fails rather than passing. +## 3.6.4 Harmonized lookups ---- +# _setup/09's outputs against the files checked above, so a +# lookup left stale by a rebuild of 01 or 06 fails lookup_dir <- file.path(data_dir, "lookup") harmonized <- c( "species_queue.csv", "factor_levels.csv", "dataset_manifest.csv", diff --git a/1_code/_setup/03_rerun_bryophyte_v2_reference.R b/1_code/_setup/03_rerun_bryophyte_v2_reference.R index 9d61a53..580aa08 100644 --- a/1_code/_setup/03_rerun_bryophyte_v2_reference.R +++ b/1_code/_setup/03_rerun_bryophyte_v2_reference.R @@ -3,10 +3,8 @@ # author: Brendan Casey # created: 2026-09-10 # inputs: -# Read from the input mirror on ABMI-DATA2 (utils/ -# input_paths.R; 00_mirror_setup_inputs.R made it). The -# locations below are the originals, which the SDM_* variables -# can point back to. +# Read via setup_input() (utils/input_paths.R); the original +# locations are listed, and SDM_* variables can point back. # in the v2 project (SDM_V2_PROJECT): # - 0_data/species/processed/bryophyte-model-data.Rdata # - 0_data/bootstrap/bryophyte-bootstrap-ids.Rdata @@ -17,31 +15,15 @@ # in 2_pipeline/v2_reference/: # - bryophyte-species-models.Rdata # notes: -# The published bryophyte reference is unusable. Every species -# and every bootstrap in the copy on ABMI-DATA2 is an error -# object reading `could not find function "model.avg"` - MuMIn -# was not on the library path of the cluster workers that -# produced it. The other three plant taxa came through intact. -# -# This regenerates it by running the frozen v2 functions, -# unmodified, against the v2 project's own data. It reproduces -# what 02a_hierarchical-models-bryophytes.R does rather than -# improving on it: the point is a reference to measure the new -# framework against, so any change would defeat it. -# -# It writes to 2_pipeline/, never to the v2 project. The -# network copy is someone else's artefact and is left alone; -# whoever owns that pipeline can decide whether to replace it. -# -# The run is large - 134 species by 100 bootstraps by 58 -# climate models, then the habitat sets - so `species_n` and -# `boot_n` are here to make a partial reference deliberately. -# A partial one is still useful: the gate compares per species, -# so any species present can be gated. -# -# MuMIn must be installed, and must be loadable by the cluster -# workers, which is exactly what failed before. Section 2.3 -# checks that on a worker rather than trusting it. +# - The published bryophyte reference is unusable: every entry +# is a `could not find function "model.avg"` error (MuMIn was +# missing on the cluster workers). +# - Regenerates the climate stage with the frozen v2 functions, +# unmodified, writing to 2_pipeline/ only. +# - 134 species x 100 draws x 58 models is large; +# `species_n` and `boot_n` build a partial reference, which +# the per-species gate can still use. +# - Section 3.3 checks MuMIn loads on a worker before fitting. # --- # 1. Setup ---- @@ -70,16 +52,14 @@ boot_n <- NULL n_clusters <- 14 ## 1.3 Load the frozen v2 functions ---- -# From this repository's snapshot, which is byte-identical to the -# originals and has recorded provenance. +# From the byte-identical snapshot in 0_data/v2_scripts/ source(file.path( project_root, "0_data/v2_scripts/plants/hierarchical-model_functions.R" )) ## 1.4 Set the seed ---- -# v2 seeds nothing. A reference that cannot reproduce itself -# is hard to argue from, so this one is seeded. +# Seeded, unlike v2, so this reference reproduces itself boot_seed <- 20260910L ## 1.5 Load the v2 data ---- @@ -124,9 +104,7 @@ cat( ) # 2. Bootstrap ids ---- -# The stored ids are checked rather than trusted. The bryophyte -# file holds only 3 draws where every other plant taxon holds -# 100, and that is invisible until draw 4 fails hours into a run. +# Checked, not trusted: the bryophyte file holds 3 draws, not 100 ## 2.1 Check what the stored ids carry ---- stored_draws <- min(vapply(bootstrap.ids, ncol, integer(1))) @@ -134,10 +112,8 @@ stored_draws <- min(vapply(bootstrap.ids, ncol, integer(1))) cat("Stored bootstrap draws: ", stored_draws, "\n", sep = "") ## 2.2 Regenerate when they fall short ---- -# A regenerated set is a fresh draw, not the missing part of the -# stored one: v2's bootstrap is unseeded and a partial set cannot -# be extended. The seed is saved beside the ids so this reference -# reproduces itself, which the published one never could. +# A fresh, seeded draw (an unseeded partial set cannot be +# extended); the seed is saved beside the ids if (stored_draws < max(boot.iter)) { cat( "Regenerating: ", max(boot.iter), " draws needed, ", @@ -224,8 +200,7 @@ if (stored_draws < max(boot.iter)) { } # 3. Climate models ---- -# The candidate set and its assembly are v2's: 14 base models, -# a bioclim version of each, and spatial versions of ten of them. +# v2's 58 candidates: 14 base, 14 bioclim, 30 spatial ## 3.1 Define the model sets ---- climate.models <- list( @@ -277,9 +252,7 @@ invisible(clusterEvalQ(core.input, { })) ## 3.3 Confirm MuMIn is loadable on a worker ---- -# The failure that produced the unusable reference was exactly -# this: model.avg missing on the workers, caught only after the -# whole run. Checking here costs nothing. +# The failure behind the unusable published reference worker_has_mumin <- unlist(clusterEvalQ( core.input, exists("model.avg") )) @@ -322,9 +295,7 @@ climate.coef <- foreach(species = species.list) %dopar% names(climate.coef) <- species.list stopCluster(core.input) -# A species is counted on its draws, not all-or-nothing. One bad -# draw in a hundred still leaves a usable distribution, and the -# earlier version of this check called such a species a failure. +# Counted per draw: one bad draw in 100 leaves a usable species usable_species <- sum( vapply(climate.coef, is.numeric, logical(1)) ) @@ -370,9 +341,8 @@ if (usable_species == 0 && failed_draws > 0) { } # 4. Save ---- -# Only the climate object is regenerated here. The habitat sets -# take the climate coefficients as an input, so they can only be -# rebuilt once this one is sound; that is a separate run. +# Climate only; the habitat sets depend on it and are a separate +# run save( climate.coef, file = file.path(out_dir, "bryophyte-species-models.Rdata") diff --git a/1_code/_setup/06_harmonize_bird_translation_lookup.R b/1_code/_setup/06_harmonize_bird_translation_lookup.R index 8c3a0af..16268d7 100644 --- a/1_code/_setup/06_harmonize_bird_translation_lookup.R +++ b/1_code/_setup/06_harmonize_bird_translation_lookup.R @@ -3,37 +3,23 @@ # author: Brendan Casey # created: 2026-09-29 # inputs: -# Read from the input mirror on ABMI-DATA2 (utils/ -# input_paths.R; 00_mirror_setup_inputs.R made it). The -# locations below are the originals, which the SDM_* variables -# can point back to. +# Read via setup_input() (utils/input_paths.R); the original +# locations are listed, and SDM_* variables can point back. # in the BirdModels project (SDM_V2_BIRD_ROOT): # - Data/lookups/Xn-veg-v2024.Rdata # outputs: # in 0_data/test_dataset/lookup/: # - bird_veg_age_matrix.csv # notes: -# - v2 does not report raw bird landcover coefficients. Its -# 08.PackageCoefficients.R translates them onto the -# standardized cross-taxa habitat types - WhiteSpruceR to -# WhiteSpruce8 and the rest - by multiplying them by the -# `age` matrix in Xn-veg-v2024.Rdata: one row per standardized -# type, one column per raw model term, holding the design -# values of a pure stand of that type, with the age terms -# integrated over each age class. -# - The harness translates bird coefficients the same way, in -# 1_code/modules/birds/standardize.R, so it needs this matrix. -# Copying it here keeps experiments runnable from -# 0_data/test_dataset/ alone. -# - A separate script rather than a section of -# 01_harmonize_model_ready_v2.R, because it reads one small -# file from a different source and 01 takes hours to re-run. -# It writes into test_dataset/lookup/ all the same; re-run it -# whenever 01 rebuilds that folder. -# - The matrix is written as read. Column names are the raw -# glm names v2 used, with interaction terms sorted -# (isCon:wtAge, not wtAge:isCon), which is how v2 matches -# them. +# - v2's 08.PackageCoefficients.R translates raw bird landcover +# coefficients onto the standardized habitat types by the +# `age` matrix (one row per type, one column per raw term: +# a pure stand's design values, age terms integrated over each +# class). modules/birds/standardize.R needs it. +# - Separate from 01 (hours to re-run), but re-run it whenever +# 01 rebuilds lookup/. +# - Written as read: raw glm column names, interactions sorted +# (isCon:wtAge), as v2 matches them. # --- # 1. Setup ---- diff --git a/1_code/_setup/07_harmonize_v2_plant_bootstrap_ids.R b/1_code/_setup/07_harmonize_v2_plant_bootstrap_ids.R index 4db7323..66f1fea 100644 --- a/1_code/_setup/07_harmonize_v2_plant_bootstrap_ids.R +++ b/1_code/_setup/07_harmonize_v2_plant_bootstrap_ids.R @@ -3,10 +3,8 @@ # author: Brendan Casey # created: 2026-09-29 # inputs: -# Read from the input mirror on ABMI-DATA2 (utils/ -# input_paths.R; 00_mirror_setup_inputs.R made it). The -# locations below are the originals, which the SDM_* variables -# can point back to. +# Read via setup_input() (utils/input_paths.R); the original +# locations are listed, and SDM_* variables can point back. # in the v2 plant project (SDM_V2_PROJECT): # - 0_data/bootstrap/lichen-bootstrap-ids.Rdata # - 0_data/bootstrap/mite-bootstrap-ids.Rdata @@ -18,25 +16,17 @@ # in 0_data/test_dataset/lookup/v2_bootstrap_ids//: # - .rds, one per species # notes: -# - v2 draws its plant bootstrap once per species, without a -# seed, and stores the draws. Replaying them is what makes -# parity numerical rather than distributional: the harness -# then fits the rows v2 fitted, draw by draw. The plant specs -# read them with `bootstrap = "v2_ids"`. -# - Each file is v2's matrix for one species, survey units by -# 100 draws, holding SiteYearQu, which is the test dataset's -# survey_unit_id for the plant-group taxa. Draw 1 is the full -# data; the others are drawn with replacement, so ids repeat. -# - Written per species rather than per taxon, because the full -# sets are large - 1.3 GB compressed for vascular plants - and -# a run needs only the species it models. Set SDM_V2_BOOT_TAXA -# and SDM_V2_BOOT_SPECIES (comma-separated) to harmonize a -# subset; unset, every species of every taxon is written. -# - Bryophytes come from the regenerated draws, because the -# published file holds 3 draws. Those are the draws the -# regenerated reference in 2_pipeline/v2_reference/ was fitted -# on, not the ones behind COEFS.RData, so bryophyte parity -# against v2_results.csv stays distributional. +# - v2's stored plant draws, replayed with +# `bootstrap = "v2_ids"` so parity can be numerical. +# - Each file: one species' matrix, units (SiteYearQu = +# survey_unit_id) by 100 draws; draw 1 is the full data. +# - Per species because the full sets are large (1.3 GB +# compressed for vascular plants). SDM_V2_BOOT_TAXA and +# SDM_V2_BOOT_SPECIES (comma-separated) select a subset. +# - Bryophytes use 03's regenerated draws (the published file +# holds 3), which are not those behind COEFS.RData, so +# bryophyte parity against v2_results.csv stays +# distributional. # - Ids not in sites.csv are counted and reported, not dropped. # --- @@ -136,8 +126,7 @@ for (taxon in taxa) { for (species in keep) { draws <- ids[[species]] - # A species whose draws errored in v2 is stored as an error - # object, not a matrix; there is nothing to replay. + # Draws that errored in v2 are stored as error objects if (!is.matrix(draws) || !is.character(draws)) { skipped <- c(skipped, species) next diff --git a/1_code/_setup/08_harmonize_abmiexplorer_results.R b/1_code/_setup/08_harmonize_abmiexplorer_results.R index 4bba60b..8ee573e 100644 --- a/1_code/_setup/08_harmonize_abmiexplorer_results.R +++ b/1_code/_setup/08_harmonize_abmiexplorer_results.R @@ -4,10 +4,8 @@ # author: Brendan Casey # created: 2026-10-02 # inputs: -# Read from the input mirror on ABMI-DATA2 (utils/ -# input_paths.R; 00_mirror_setup_inputs.R made it). The -# locations below are the originals, which the SDM_* variables -# can point back to. +# Read via setup_input() (utils/input_paths.R); the original +# locations are listed, and SDM_* variables can point back. # - data/species-coefs.RData from the ABbiodiversity/ABMIexploreR # GitHub repository, at the commit pinned in section 1.2 # - Data/lookups/birdlist.csv on the BirdModels drive, for the @@ -20,30 +18,17 @@ # - 0_data/v2_results/abmiexplorer/v2_results.csv # - 0_data/v2_results/abmiexplorer/v2_results_coverage.csv # notes: -# - The v2 parity reference: exp_000_parity_v2's -# 01_compare_to_v2.R scores every run against its -# v2_results.csv. It needs no network drive for any taxon -# but birds, and those only for names. -# - It replaced 05_harmonize_v2_results.R, which compiled the -# same schema by hand from the v2 outputs on the network -# drives (COEFS.RData, the mammal coefficient tables, and a -# Birds2024.RData that 04_package_bird_coefficients.R -# rebuilt). Both were removed once this was checked against -# them; "05" below refers to that build. -# -# - ABMIexploreR is ABMI's published distribution of the v2 -# coefficients: one `species.coefs` list holding, per taxon, -# species x term x draw arrays for Vegetation (north), Soil -# (south) and Climate (province-wide), on the link scale. -# -# - Pinned to a commit, not to HEAD. The data file changes -# between commits: on 2026-07-27 the mammal models added in -# July 2025 (an earlier fit, presence in the north only) were -# replaced by the 2024 models the harness reproduces. An -# unpinned read would move the reference under a finished -# run. Only the data file is -# downloaded; installing the package would pull terra and -# friends for nothing this script uses. +# - Builds the v2 parity reference exp_000 scores against. +# Only birds need a network drive, for names. "05" below is +# the retired by-hand build from the v2 network outputs, which +# this was verified against. +# - ABMIexploreR holds species x term x draw arrays per taxon +# for Vegetation (north), Soil (south) and Climate, on the +# link scale. +# - Pinned to a commit: the data file changes between commits +# (on 2026-07-27 the mammal models were replaced by the 2024 +# models the harness reproduces). Only the data file is +# downloaded, not the package and its dependencies. # # - Checked against 05's reference on 2026-10-02, at the pinned # commit: @@ -69,14 +54,11 @@ # - Amphibians are in the package and have no module yet. # Their rows are written; nothing joins them. # -# - The package relabels some terms against the names the -# harness writes, and mammals on the cross-taxa template -# rather than their native terms. Where the values were -# verified identical, an alias row is added under the -# harness's name and the package's row is kept; see -# term_aliases(). Bird TreedFen +# - The package relabels some terms, and puts mammals on the +# cross-taxa template. Verified-identical terms get an alias +# row under the harness's name (term_aliases()). Bird TreedFen # is one coefficient in the package and nine age classes in -# v2 (r ~ 0.99 with each), so it is not aliased. +# v2 (r ~ 0.99), so it is not aliased. # # - The package pads every species to a full term template # with exact zeros. A cell whose every draw is exactly zero @@ -155,9 +137,8 @@ if (!file.exists(coefs_path)) { cat("Downloading", url, "\n") - # Written to a temporary name first, so an interrupted - # download never leaves a truncated file where a good one is - # expected. + # Via a temporary name, so an interrupted download leaves no + # truncated file partial <- paste0(coefs_path, ".part") old_timeout <- options(timeout = max(600, getOption("timeout"))) status <- utils::download.file(url, partial, mode = "wb") @@ -395,9 +376,8 @@ flatten_array <- function(values, slug, model, hurdle = NA) { padding <- counts > 0 & is.na(hurdle) & rowSums(draws != 0, na.rm = TRUE) == 0 - # v2 fits mammals once; the package repeats that fit in every - # draw. A repeated fit is one value, not a distribution, so it - # is written as v2_n 1 and scored on iteration 1. + # The package repeats v2's single mammal fit in every draw: + # written as v2_n 1, scored on iteration 1 single_fit <- slug == "mammal" && all(apply(draws, 1, function(x) { length(unique(x[!is.na(x)])) <= 1 @@ -507,8 +487,7 @@ for (taxon in names(species_coefs)) { rows <- add_aliases(rows, slug) blocks[[label]] <- rows - # A bird without a code keeps its package name and cannot - # join, so the count is reported rather than discovered. + # Birds without a code cannot join; report the count unkeyed <- if (slug == "bird" && !is.null(rows)) { sum(!unique(rows$species_v2) %in% names(bird_codes)) } else { diff --git a/1_code/_setup/09_harmonize_lookups.R b/1_code/_setup/09_harmonize_lookups.R index 7607f08..05baa77 100644 --- a/1_code/_setup/09_harmonize_lookups.R +++ b/1_code/_setup/09_harmonize_lookups.R @@ -18,43 +18,19 @@ # - bird_north_prediction_matrix.csv # - bird_south_prediction_matrix.csv # notes: -# - The response tables were harmonized to one shape by 01; the -# lookups were not. Each taxon lead's species queue arrived in -# its own schema, factor levels were per taxon, and which file -# belongs to which taxon was known only to the harness code. -# This writes one form of each, so a method or a new taxon -# never needs taxon-specific file logic. -# - Offline. It reads only 0_data/test_dataset/, so it can be -# re-run at any time. Run it after 01 and 06, whenever either -# rebuilds lookup/. The source files are left in place. -# - species_queue.csv: one row per taxon, region, season, tier -# and species, with `order` the source list's own order, so a -# narrowed run visits species in the order v2 would, and -# `source_name` the name the source pipeline used. `tier` -# separates mammals' full habitat models (20+ detections) from -# their use-availability models (3+); it is "modelled" -# elsewhere. `season` is empty for all but mammals. -# - dataset_manifest.csv: one row per taxon and region, naming -# the response file, the offset file, the key the taxon's rows -# carry in covariates.csv, the habitat prediction grid, and -# where any stored bootstrap draws are. The harness reads file -# locations from here and nowhere else. -# - The bird prediction grids. Every other taxon predicts onto a -# grid with one row per habitat type; birds had none, because -# v2 translates bird coefficients onto habitat types with a -# model matrix (bird_veg_age_matrix.csv) rather than predicting -# a grid. The north grid is that matrix rebuilt in covariate -# space - each row's vegetation class from its dummy column, -# its stand age and type flags from the age terms - and is -# checked to reproduce the matrix exactly before it is -# written. The south grid is one row per soil class. Terms the -# matrix does not carry - roads, wells, water, survey method - -# are at zero, or at the reference level for a factor, which -# is what v2's translation assumes. -# - The stored bootstrap draws keep their two layouts (one -# table per taxon for birds, one file per species for the -# plant-group taxa), because v2 drew them that way. The -# manifest records which layout each taxon has. +# - Writes one cross-taxon form of each lookup, so no method or +# new taxon needs taxon-specific file logic. Reads only +# 0_data/test_dataset/; run after 01 and 06. +# - species_queue.csv: `order` is the source list's order; +# `tier` separates mammals' full habitat models (20+ +# detections) from use-availability models (3+). +# - dataset_manifest.csv: the only place the harness learns file +# locations, covariate keys, grids and stored-draw layouts. +# - Bird grids: v2 translates bird coefficients with a model +# matrix, not a grid. The north grid rebuilds that matrix in +# covariate space and is checked to reproduce it exactly; the +# south grid is one row per soil class. Terms the matrix lacks +# are zero or the factor reference level, as v2 assumes. # --- # 1. Setup ---- @@ -95,8 +71,7 @@ write_lookup <- function(frame, name) { } # 2. Species queue ---- -# Three schemas become one. The logic is the one species.R used to -# apply on every read; it now runs once, here. +# Three source schemas become one ## 2.1 queue_rows() ---- @@ -193,8 +168,6 @@ if (any(duplicated_rows)) { write_lookup(species_queue, "species_queue.csv") # 3. Factor levels ---- -# One table with a taxon column, so any taxon can record the -# level order of its categorical covariates the same way. factor_files <- list.files( lookup_dir, pattern = "_factor_levels\\.csv$" ) @@ -247,10 +220,9 @@ vegc <- vapply(seq_len(nrow(age)), function(i) { if (length(hit) == 0) vegc_levels[1] else sub("^vegc", "", hit) }, character(1)) -# A type flag enters only through its interactions with age, so -# it is read back from them: the interaction divided by the age -# term, wherever age is non-zero. Where every age term is zero the -# flag cannot affect a prediction and is left at zero. +# Type flags enter only via age interactions, so are recovered as +# interaction / age where age is non-zero; else left at zero (no +# effect on predictions) flags <- c("isCon", "isUpCon", "isBogFen", "isMix", "isPine", "isWSpruce") age_terms <- c("wtAge", "wtAge2", "wtAge05") @@ -281,8 +253,7 @@ bird_north <- data.frame( ) ### 4.1.1 Check the rebuild ---- -# The grid must reproduce v2's matrix column for column, or the -# grid predictions would not be the quantity v2 translates to. +# Must reproduce v2's matrix column for column rebuilt <- stats::model.matrix( ~ vegc + wtAge + wtAge2 + wtAge05 + fcc2 + (wtAge + wtAge2 + wtAge05):(isCon + isUpCon + isBogFen + @@ -331,8 +302,7 @@ bird_south <- data.frame( write_lookup(bird_south, "bird_south_prediction_matrix.csv") # 5. Dataset manifest ---- -# Where each taxon's files are. A new taxon is added here, with -# its files, and needs no harness change. +# A new taxon is added here and needs no harness change plant_taxa <- c("vascular_plant", "bryophyte", "lichen", "mite") manifest <- rbind( diff --git a/1_code/_setup/10_publish_datasets.R b/1_code/_setup/10_publish_datasets.R index e0cbca7..30396f0 100644 --- a/1_code/_setup/10_publish_datasets.R +++ b/1_code/_setup/10_publish_datasets.R @@ -13,20 +13,15 @@ # - //publish_record.md: when, by whom, from # which commit # notes: -# - Experiments, tests and downstream scripts read these -# published copies (1_code/harness/data_source.R), so only -# whoever rebuilds the data runs _setup/. -# - A published version is never overwritten. The script stops -# if / exists; a rebuilt dataset is published as a -# new version and data_source.R's pin is moved to it. -# - Files go to .partial/ first, are re-hashed there -# against the local md5s, and only then is the folder renamed -# to /, so a reader never sees a half copy. +# - Runs read these copies (harness/data_source.R). A version +# is never overwritten: publish a new one and move the pin. +# - Files are copied to .partial/, re-hashed, then +# renamed, so readers never see a half copy. # - SDM_DATASET_VERSION sets the version (default: today's # date, YYYY-MM-DD). SDM_PUBLISH picks the datasets, # comma-separated (default: test_dataset,v2_results). -# - Run 02_validate_test_dataset.R first. It is not run from -# here because it re-reads every source. +# - Run 02_validate_test_dataset.R first (not run here: it +# re-reads every source). # - Run from the repository root. # --- diff --git a/1_code/_setup/run.R b/1_code/_setup/run.R index 7e1abc7..519de94 100644 --- a/1_code/_setup/run.R +++ b/1_code/_setup/run.R @@ -27,14 +27,11 @@ # - 10 publishes a new version. Run it deliberately, after # checking 02's tally, then move the pin in # 1_code/harness/data_source.R. -# - Each script runs in an environment of its own, so one -# cannot pick up another's objects. A step that errors stops -# the rebuild; the log says which. -# - 02 prints a pass / fail tally rather than stopping. Read it -# before using or publishing the rebuilt data. -# - Experiments read the published copies. To run one against -# this rebuild, set SDM_TEST_DATASET and SDM_V2_RESULTS to the -# local folders (section 3 prints the lines). +# - Each script runs in its own environment; an error stops +# the rebuild and is logged. +# - 02 prints a pass / fail tally rather than stopping; read it +# before using or publishing. +# - Section 3 prints how to point experiments at this rebuild. # - Run from the repository root. # --- @@ -88,9 +85,6 @@ dir.create(log_dir, recursive = TRUE, showWarnings = FALSE) log_path <- file.path(log_dir, "run_log.csv") # 2. Run the steps ---- -# Each step is sourced into a fresh environment and timed. The -# log row is written before an error is re-raised, so a failed -# rebuild still records where it stopped. ## 2.1 run_step() ---- diff --git a/1_code/experiments/_shared/focal_species.R b/1_code/experiments/_shared/focal_species.R index 7736d96..9f999d5 100644 --- a/1_code/experiments/_shared/focal_species.R +++ b/1_code/experiments/_shared/focal_species.R @@ -5,29 +5,13 @@ # inputs: none # outputs: none; returns objects in memory # notes: -# - Holds the species vectors an experiment's run.R chooses -# between, so run.R stays a page of decisions rather than a -# page of names. Shared, so a later experiment can run exactly -# the species exp_000 ran and compare against it like for -# like. Loaded by load_framework(). -# - Every set uses the named-vector convention the harness -# expects: names are taxa, values are species, names may -# repeat, and an unnamed entry applies to every taxon. NULL -# means every species the spec's queue declares, which is the -# full parity run. -# - Names are data slugs, not directory names. Soil mites key -# on "mite". See 1_code/modules/soil_mites/spec.R. -# - Species names must match the response columns exactly. The -# loader stops and lists any name it cannot find, so a typo -# fails before modelling starts rather than part-way through. -# - To see what is available for a taxon: -# head(list_species(data_dir, "mite", "north"), 20) -# - A taxon a set does not name is unrestricted, not excluded. -# Narrow the run's taxa alongside a partial set; -# experiment_config() warns if a taxon would silently run its -# full species list. -# - This mirrors model_sets() and get_model_set() in the -# harness, so the two registries read the same way. +# - Named species sets shared by experiments, so a later +# experiment can run exactly exp_000's species. Sets follow +# taxon_values() (names are data slugs, e.g. "mite"); NULL +# means every species. +# - A taxon a set does not name is unrestricted, not excluded; +# narrow `taxa` alongside a partial set. +# - Available species: list_species(data_dir, "mite", "north"). # --- # 1. Setup ---- @@ -49,28 +33,15 @@ focal_species_sets <- function() { list( ## 2.1 full ---- - # Every species each spec declares. The parity run. + # The full parity run full = NULL, ## 2.2 parity_check ---- - # Two per taxon, for a first run that is meant to be read - # rather than merely survived. - # - # These were not picked for being familiar. A rare species - # has a wide bootstrap band, so the v2 value falls inside it - # whatever the harness does and the parity test passes - # without discriminating. These are the species whose bands - # are tight enough for an in-band result to mean something. - # - # Each was chosen on four criteria: present in both regions - # well above the 20-detection bootstrap threshold; - # prevalence between roughly 5 and 45 per cent, so neither - # floor nor ceiling; present in the v2 reference with all - # 100 draws usable; and, across the pair, one balanced - # between north and south so the southern model is genuinely - # exercised. - # - # Birds use v2's stored draws, so their bands are v2's own. + # Two per taxon, chosen so the parity test discriminates: rare + # species have bands wide enough to pass anything. Criteria: + # well above 20 detections in both regions; prevalence ~5-45%; + # all 100 v2 draws usable; and one of each pair balanced + # between north and south. # # Detections north / south, and prevalence north / south: # Ceratodon.purpureus 2140 / 554 44.1 / 24.0 @@ -125,14 +96,8 @@ focal_species_sets <- function() { ), ## 2.3 plants_only ---- - # The four plant-group taxa, for a run that skips the two - # taxa with the slowest stages. - # - # Pair this with a narrowed run_taxa. A taxon that a set does - # not name is unrestricted rather than excluded, so leaving - # mammals and birds in run_taxa would run every species of - # each and make this the longest run in the file. run.R warns - # when that happens. + # Pair with a narrowed `taxa`, or mammals and birds run every + # species (experiment_config() warns) plants_only = c( bryophyte = "Ceratodon.purpureus", bryophyte = "Bryum.All", @@ -145,8 +110,7 @@ focal_species_sets <- function() { ), ## 2.4 one_each ---- - # One species per taxon. The shortest run that still touches - # every module, for checking plumbing after a change. + # Shortest run touching every module, for plumbing checks one_each = c( bryophyte = "Ceratodon.purpureus", lichen = "Physcia.adscendens", @@ -163,9 +127,8 @@ focal_species_sets <- function() { #' Look Up One Focal-Species Set by Name #' -#' An unrecognized value is returned unchanged, so run.R can -#' hand this either a set name or a species vector written -#' inline and get the right thing back either way. +#' An unrecognized value (e.g. an inline species vector) is +#' returned unchanged. #' #' @param name Character. A name from focal_species_sets(), or #' a species vector to pass through, or NULL for all species. diff --git a/1_code/experiments/exp_000_parity_v2/01_compare_to_v2.R b/1_code/experiments/exp_000_parity_v2/01_compare_to_v2.R index 6673367..6195a41 100644 --- a/1_code/experiments/exp_000_parity_v2/01_compare_to_v2.R +++ b/1_code/experiments/exp_000_parity_v2/01_compare_to_v2.R @@ -14,16 +14,12 @@ # - `results$parity`, `results$parity_summary` and # `results$parity_notes`, for the later steps # notes: -# - The gate itself. Compares this run's coefficients against -# the published v2 ones, per stage, species and term. -# - Reads only the one v2_results.csv, so it runs with the -# network drives unmounted. +# - The gate: this run's coefficients against v2's, per stage, +# species and term. Reads only v2_results.csv. # - What is joined to what: -# - Climate is fitted once, province-wide, in v2, so its -# reference rows carry region "all". A run's north and -# south climate results are both scored against them. -# The harness fits climate per region, so expect a gap -# until it does not. +# - v2 climate reference rows carry region "all"; a run's +# north and south climate results are both scored against +# them. # - Habitat is joined on region. Plant terms are relabelled # as v2's 04a standardization does; bird terms are the # translated ones collect_results() adds (stage "habitat", @@ -32,21 +28,13 @@ # - Mammals are joined on the hurdle part, and their two # season runs are averaged first, because v2's `.all` # references average summer and winter. -# - Parity is distributional where v2 bootstraps: the v2 -# median is scored on whether it falls inside this run's -# 10th-to-90th percentile band. Where v2 fits once (v2_n of -# 1: mammal climate and habitat), the like-for-like run value -# is iteration 1, the full-data fit, and the absolute -# difference is the number to read. -# - Terms v2 overwrites with machinery the harness does not -# have, or fixes at a placeholder, are flagged from -# v2_unreachable_terms() and left out of the reachable -# scores. -# - Whatever cannot be compared is left in -# `results$parity_notes`, which the report prints. -# - Run by run_experiment() as a step, in an environment of its -# own holding only `config` and `results`; see -# script_step(). +# - Where v2 bootstraps, the v2 median is scored against this +# run's 10-90% band. Where v2 fits once (mammals, v2_n = 1), +# iteration 1 is compared and the absolute difference read. +# - Terms from v2_unreachable_terms() are left out of the +# reachable scores. What cannot be compared goes to +# `results$parity_notes`. +# - Run as a script_step(). # --- # 1. Setup ---- @@ -141,9 +129,8 @@ if (!is.null(run_coefficients)) { !(run_rows$taxon == "bird" & run_rows$stage == "landcover"), ] - # glm names terms as the formula writes them; v2's published - # tables use plain names. The spatial ones are the bird climate - # terms; the plant ones are stored columns already. + # glm names terms as the formula writes them (e.g. the bird + # spatial terms); v2's tables use plain names v2_names <- c( "(Intercept)" = "Intercept", "I(Easting^2)" = "Easting2", @@ -153,9 +140,7 @@ if (!is.null(run_coefficients)) { renamed <- run_rows$term %in% names(v2_names) run_rows$term[renamed] <- v2_names[run_rows$term[renamed]] - # The mammal hurdle writes one stage per v2 table, - # habitat_presence, habitat_abundance and habitat_total; each - # is v2's habitat stage for that part. + # The hurdle's habitat_ stages map to v2's habitat stage hurdle <- grepl( "^habitat_(presence|abundance|total)$", run_rows$stage ) @@ -206,17 +191,14 @@ if (!is.null(run_coefficients)) { } ## 3.3 Average the mammal seasons ---- - # v2's `.all` references are the mean of the summer and winter - # fits where both exist. The season is part of the harness's - # species name, so it is stripped and the runs averaged. + # v2's `.all` references average summer and winter is_mammal <- run_rows$group == "mammal" if (any(is_mammal)) { mammals <- run_rows[is_mammal, ] - # Stores written before meta.json recorded the season and - # part lack them. The season is in the species name, and - # those runs fitted presence, the spec's default. + # Older stores lack season and part in meta.json: take the + # season from the species name; those runs fitted presence no_season <- is.na(mammals$season) | mammals$season == "" mammals$season[no_season] <- tolower( sub("^.*_(Summer|Winter)$", "\\1", mammals$species[no_season]) @@ -285,8 +267,7 @@ if (!is.null(run_rows) && !is.null(reference) && ) ## 4.1 The run value to compare ---- - # Where v2 fits once, its value is a full-data fit, and the - # like-for-like run value is iteration 1. + # Where v2 fits once, compare iteration 1 parity$comparison <- ifelse( !is.na(parity$v2_n) & parity$v2_n == 1, "iteration 1", "median" @@ -318,10 +299,8 @@ if (!is.null(run_rows) && !is.null(reference) && parity$reachable <- is.na(parity$unreachable_reason) ## 4.2a Flag negligible terms ---- - # Terms model averaging has shrunk to nothing in both runs. They - # stay in the in-band scores, which the numerical tolerance - # already handles, but not in the band ratio or the Spearman, - # where their noise would decide the row. + # Kept in the in-band scores (the tolerance handles them), not + # in the band ratio or Spearman, where their noise would decide term_scales <- term_scale(reference, c("taxon", "stage")) parity <- merge( parity, term_scales, @@ -339,11 +318,8 @@ if (!is.null(run_rows) && !is.null(reference) && matched, abs(parity$run_value - parity$v2_median), NA_real_ ) - # A term agrees when the v2 median is inside this run's band, - # or when the two are within numerical tolerance. The second - # matters for averaged terms carrying almost no model weight: - # their values run to 1e-20 or 1e-137, and banding numerical - # noise is meaningless. + # In band, or within numerical tolerance (near-zero averaged + # terms run to 1e-20 or 1e-137) parity$in_band <- matched & ( (is.finite(parity$p10) & is.finite(parity$p90) & parity$v2_median >= parity$p10 & @@ -418,9 +394,7 @@ if (!is.null(parity) && nrow(parity) > 0) { collapse = "+"), species = length(unique(compared$species)), terms_compared = nrow(compared), - # The draws the store actually holds, which the verdict - # checks: a store overwritten by a shorter run still reads - # the configured draw count. + # Draws actually stored, not configured min_draws = if (nrow(compared) == 0) { NA_integer_ } else { @@ -441,9 +415,8 @@ if (!is.null(parity) && nrow(parity) > 0) { signif(max(reachable$absolute_difference, na.rm = TRUE), 3) }, negligible_terms = sum(reachable$negligible), - # Per species, then the median: the terms span twenty - # orders of magnitude, so a rank correlation, as the v2 - # self-agreement calibration uses. Reported, not gated. + # Per species, then the median (as the v2 calibration). + # Reported, not gated. median_spearman = med(vapply( split(substantive, substantive$species), function(one) { @@ -456,11 +429,8 @@ if (!is.null(parity) && nrow(parity) > 0) { }, numeric(1) )), - # This run's 10-90% band over v2's, per term; the median - # per species, then over species, as the v2 calibration - # takes it. Single terms vary threefold between two v2 - # runs, a species' median does not. NA where v2 has no - # band: the iteration-1 rows. + # Band ratio: median per species, then over species (as + # the calibration). NA for iteration-1 rows. median_band_ratio = med(vapply( split(substantive, substantive$species), function(one) { @@ -496,18 +466,14 @@ if (!is.null(parity) && nrow(parity) > 0) { parity_summary$verdict <- verdict_of(gated) - # A run with v2's full draw count on a species subset is not the - # gate, but its rows can still be read against the targets. Said - # separately, so it is never mistaken for the verdict. + # Full draws on a species subset: readable, but not the gate parity_summary$indicative_verdict <- if (!gated && full_length) { verdict_of(TRUE) } else { NA_character_ } - # A distributional row read from fewer stored draws than v2 has - # no verdict, whatever the run was configured for: a band from - # five draws is narrower than one from a hundred. + # Fewer stored draws than v2: no verdict short <- grepl("median", parity_summary$comparison) & !is.na(parity_summary$min_draws) & parity_summary$min_draws < config$v2_bootstraps diff --git a/1_code/experiments/exp_000_parity_v2/02_plot_parity.R b/1_code/experiments/exp_000_parity_v2/02_plot_parity.R index b0a5e8a..cec6f34 100644 --- a/1_code/experiments/exp_000_parity_v2/02_plot_parity.R +++ b/1_code/experiments/exp_000_parity_v2/02_plot_parity.R @@ -13,39 +13,18 @@ # - parity_bell.png, v2 and the run as bell curves, one facet # each # notes: -# - One figure per taxon. Each panel is a stage and region (and, -# for mammals, a hurdle part) for one species; each row a term. -# v2 and exp_000 are drawn in different colours as a median and -# a 10th-to-90th percentile bar, the same summaries the gate -# compares. -# - Intervals, not densities: v2's reference keeps only the -# median and the 10th and 90th percentiles of its draws, so its -# full distribution cannot be drawn. The run's is summarized -# the same way, so the two are read alike. -# - Terms span 1e-144 to 1e2, so no single axis holds them. Each -# term is put on its own scale, relative to v2: 0 is v2's -# median and one unit is half v2's 10-90% band, the scale the -# gate's standardized difference uses. Where v2 fitted once and -# has no band (the mammal hurdle), one unit is half the run's -# band instead, and v2 is drawn as a point. There the gate -# compares the run's first draw with v2's single fit, so that -# draw is drawn too, as its own colour. -# - Values beyond +/- 4 units are drawn at the panel's edge, so -# one far-off term does not flatten the rest. Terms the gate -# cannot reach, or with no band to scale by, are left out and -# counted in the caption. -# - parity_mean.png averages the same scaled values over every -# species and term, one facet per taxon (or per group; section -# 1.4), one row per stage and region. -# - parity_bell.png draws each row as two curves, v2 and the run, -# each the average of its terms read as normal curves from -# their median and band. A shifted curve is a location -# difference, a wider or narrower one a spread difference. The -# normal shape is a drawing convenience; v2 keeps only three -# summaries of its draws. -# - Run by run_experiment() as a step, in an environment of its -# own; see script_step(). Can also be run on its own from the -# repository root after 01_compare_to_v2.R. +# - Medians and 10-90% bars, not densities: v2 keeps only those +# three summaries of its draws. +# - Terms span 1e-144 to 1e2, so each is scaled to v2: 0 is v2's +# median, one unit is half v2's band (the gate's standardized +# difference). Where v2 fitted once (mammal hurdle), the unit +# is half the run's band, v2 is a point, and the run's first +# draw (what the gate compares) is shown. +# - Values beyond +/- 4 units are clamped to the edge; +# unreachable or unscalable terms are dropped and counted in +# the caption. +# - Runs as a script_step(), or alone from the repository root +# after 01_compare_to_v2.R. # --- # 1. Setup ---- @@ -261,15 +240,9 @@ for (one_taxon in sort(unique(plot_data$taxon))) { # One figure, one facet per taxon (or group), each row a stage and # region. Input: plot_data. Output: parity_mean.png. # -# The per-term values are averaged over every species and term in -# the row, still in v2 units, so v2 sits at 0 and its bar is its -# mean band. The averages use the clamped values, so a term past -# the axis counts as +/- 4, not as its full distance. -# -# A signed mean shows bias but lets a +2 and a -2 cancel, so each -# row is also labelled with the mean absolute difference of the -# run's median from v2's, and the share of terms whose v2 median -# lies inside the run's band: the gate's first two measures. +# Averages the clamped scaled values over species and terms. A +# signed mean lets +2 and -2 cancel, so rows are also labelled +# with the mean absolute difference and the in-band share. ## 4.1 Average per facet, row and source ---- plot_data[, facet := get(mean_facet)] @@ -373,19 +346,10 @@ cat("Parity figure: ", mean_file, "\n", sep = "") # stage and region, stacked. Input: plottable. Output: # parity_bell.png. # -# Each term's 100 draws are summarized, in both runs, by a median -# and a 10-90% band. Read as a normal curve, the median is its -# centre and the band spans 2 x 1.2816 standard deviations. Each -# row's curve is the average of its terms' curves, in v2 units, -# so v2's sits at 0 and the run's shows where, and how widely, the -# run lands against it: shifted if the medians differ, wider or -# narrower if the bands do. -# -# The normal shape is a drawing convenience, not a claim: v2 keeps -# only the three summaries, so the true shape of its draws is not -# known. Negligible terms are left out, as the gate leaves them -# out. Where v2 fitted once (the mammal hurdle) it has no band and -# is drawn as a line at 0. +# Each term as a normal curve (median centre; the 10-90% band is +# 2 x 1.2816 SD), averaged per row in v2 units. The normal shape +# is a drawing convenience, not a claim. Negligible terms are +# left out; v2 without a band is a line at 0. ## 5.1 One normal curve per term ---- # qnorm(0.9): the 90th percentile is this many standard deviations diff --git a/1_code/experiments/exp_000_parity_v2/03_build_report.R b/1_code/experiments/exp_000_parity_v2/03_build_report.R index 29f4969..242ca87 100644 --- a/1_code/experiments/exp_000_parity_v2/03_build_report.R +++ b/1_code/experiments/exp_000_parity_v2/03_build_report.R @@ -14,20 +14,11 @@ # in out_dir/: # - report.md # notes: -# - Holds no status of its own. What each spec reproduces of v2 -# is read from the specs' `v2_coverage`, what v2 reference -# exists from v2_results_coverage.csv, and what the gate -# actually reached from the comparison step. Coverage is -# stated once, in the specs, so the report cannot drift from -# them. -# - States what kind of run this was first. A trial run writes -# the same files as a full one, and its parity numbers are -# not a parity read. -# - Written on every run, so a partial run still leaves a -# legible record of what it was. -# - Run by run_experiment() as a step, in an environment of its -# own holding only `config` and `results`; see -# script_step(). +# - Holds no status of its own: coverage comes from the specs' +# `v2_coverage`, references from v2_results_coverage.csv, and +# results from the comparison step. +# - Leads with the kind of run, since a trial writes the same +# files as a full run. Run as a script_step(). # --- # 1. Setup ---- @@ -118,9 +109,7 @@ gate_lines <- if (length(gate_notes) == 0) { fit_lines <- if (is.null(metric_summary)) { "_No metrics recorded._" } else { - # In-sample against held-out, and v2's own validation where - # the spec supplies it. Out-of-bag is the honest read; - # in-sample is what v2 reports. + # Out-of-bag is the honest read; in-sample is what v2 reports shown <- c( insample_auc = "insample_auc", oob_auc = "oob_auc", diff --git a/1_code/experiments/exp_000_parity_v2/run.R b/1_code/experiments/exp_000_parity_v2/run.R index 97eb45b..8cb8266 100644 --- a/1_code/experiments/exp_000_parity_v2/run.R +++ b/1_code/experiments/exp_000_parity_v2/run.R @@ -13,42 +13,30 @@ # in 3_output/exp_000_parity_v2/: # - tables/, figures/, report.md, run_record.md # notes: -# - The validation gate, and the baseline every later -# experiment is compared against. Runs each taxon's v2 spec -# through the framework and compares the result with the -# published v2 output. -# - The only file to edit. Section 1.2 is the whole -# configuration; experiment_config() checks it before -# anything is fitted. -# - Parity here is distributional, not numerical: v2 seeds -# nothing, so two v2 runs give different coefficients, and -# the comparison is between bootstrap distributions. See the +# - The validation gate and the baseline for every experiment: +# each taxon's v2 spec against the published v2 output. +# - Section 1.2 is the whole configuration. +# - Parity is mostly distributional (v2 seeds nothing); see the # parity ledger in docs/framework_design.md. -# - What each taxon reproduces of v2 is stated once, in its -# spec's `v2_coverage`, and the report prints it from there. # --- # 1. Setup ---- ## 1.1 Load the framework ---- -# Run from the repository root. In RStudio or Positron, the -# project file sets it. +# Run from the repository root source("1_code/harness/harness.R") load_framework() exp_dir <- "1_code/experiments/exp_000_parity_v2" -# The parity targets the comparison reads its verdict against source(file.path(exp_dir, "utils", "parity_targets.R")) ## 1.2 Configure the run ---- -# Every decision is here. See experiment_config() for each -# argument, and docs/getting_started.md for what they mean. +# See experiment_config() and docs/getting_started.md config <- experiment_config( id = "exp_000_parity_v2", - # Runs, from names(standard_specs()). Mammals run once per - # season, because v2's mammal references average the two. + # Runs, from names(standard_specs()) taxa = c( "bryophyte", "lichen", @@ -59,45 +47,35 @@ config <- experiment_config( "bird" ), - # A named set from focal_species_sets(), a vector named by - # taxon, or NULL for every species (the full parity run). - # "parity_check" is two species per taxon with tight bands. - # Shortening the species list is the right way to shorten a - # trial: it keeps every draw, so the parity bands stay honest. + # A focal_species_sets() name, a vector named by taxon, or NULL + # for every species. Shorten trials by species, not draws, so + # the bands stay honest. species = "parity_check", - # Draws per species. 100 is v2's, and the only setting the gate - # reads. Below about 20 the 10-90% bands are too unstable for - # the parity numbers to mean anything; 5 checks the plumbing. + # 100 is v2's and the only count the gate reads; below ~20 the + # 10-90% bands are unstable. 5 checks the plumbing. n_bootstraps = 5, - # One number governs every random draw; each species draws - # under its own seed derived from it. NULL leaves the draws - # unseeded, as v2 did. Birds replay v2's stored draws. + # Base seed; NULL is unseeded, as v2. Birds replay v2's draws. seed = 20260909, # "spatial_block" draws v2's plant bootstrap afresh; # "v2_ids" replays v2's stored draws (needs _setup/07). plant_bootstrap = "spatial_block", - # NULL fits each spec's v2 candidate sets, which is what a - # parity run does. See extend_models() and - # models_from_covariates() to fit others. + # NULL fits each spec's v2 candidate sets stage_models = NULL, - # Species fitted at once. Each worker is a separate R session. + # Species fitted at once, one R session each workers = 12, - # "none" writes no per-unit predictions (metrics are scored in - # memory); "oob" or "all" write them, at several GB for birds. + # "oob" or "all" write per-unit predictions (GBs for birds) unit_predictions = "none" ) ## 1.3 The v2 reference ---- -# The published v2 coefficients the run is scored against: ABMI's -# ABMIexploreR package, pinned to a commit and harmonized by -# _setup/08. It holds the published species of every taxon. The -# report prints the label and builder. +# ABMIexploreR's published coefficients, pinned to a commit and +# harmonized by _setup/08 config$v2_reference <- "abmiexplorer" config$v2_reference_dir <- file.path( v2_results_dir(), "abmiexplorer" @@ -106,14 +84,11 @@ config$v2_reference_builder <- "1_code/_setup/08_harmonize_abmiexplorer_results.R" # 2. Run ---- -# Fits every species, collects the stores into summary tables, -# then compares with v2, plots and reports. Set `fit = FALSE` to -# re-summarize the stores already in 2_pipeline/ without fitting. +# `fit = FALSE` re-summarizes existing stores without fitting results <- run_experiment( config, fit = TRUE, - # Bird landcover is translated onto v2's habitat template so it - # can be compared; see modules/birds/standardize.R. + # Bird landcover onto v2's habitat template translate = list(bird = bird_habitat_translation), steps = list( compare = script_step(file.path(exp_dir, "01_compare_to_v2.R")), diff --git a/1_code/experiments/exp_000_parity_v2/utils/parity_targets.R b/1_code/experiments/exp_000_parity_v2/utils/parity_targets.R index caf6a46..ff0758a 100644 --- a/1_code/experiments/exp_000_parity_v2/utils/parity_targets.R +++ b/1_code/experiments/exp_000_parity_v2/utils/parity_targets.R @@ -30,11 +30,10 @@ # easily. The ratio closes that: too wide or too narrow a band # fails, including one read from a store holding too few # draws. -# - Spearman of the medians is reported but no longer gated. -# Model averaging shrinks unsupported terms towards zero in -# both runs, and ranking values of 1e-30 against 1e-40 ranks -# noise: it failed the mite climate stage with every term in -# band. It caught nothing the other tests missed. +# - Spearman of the medians is reported, not gated: averaging +# shrinks unsupported terms to ~1e-30 in both runs, so it +# ranks noise (it failed the mite climate stage with every +# term in band). # - The calibration (bryophyte climate, two v2 runs of the same # code): 100% in band, median standardized difference 0.019; # per-species median band ratio 1.00, 5th to 95th percentile diff --git a/1_code/experiments/exp_000_parity_v2/v2_self_agreement.R b/1_code/experiments/exp_000_parity_v2/v2_self_agreement.R index 7fd1a3f..7113bae 100644 --- a/1_code/experiments/exp_000_parity_v2/v2_self_agreement.R +++ b/1_code/experiments/exp_000_parity_v2/v2_self_agreement.R @@ -31,10 +31,9 @@ # 10th-to-90th percentile band, and how far apart are the # medians relative to half that band. The two directions are # reported separately and averaged. -# - Also the Spearman correlation of the medians across terms, -# per species, because the terms span twenty orders of -# magnitude and a Pearson correlation would read only the -# intercept. Reported, no longer gated. +# - Also the per-species Spearman of the medians (terms span +# twenty orders of magnitude, so not Pearson). Reported, not +# gated. # - And the band-width ratio, the rerun's 10-90% band over the # published run's, as a median per species. Its 5th to 95th # percentile over species sets the gate's band_ratio_range. diff --git a/1_code/experiments/exp_001_xgboost/run.R b/1_code/experiments/exp_001_xgboost/run.R index 3de2869..c5c3bdb 100644 --- a/1_code/experiments/exp_001_xgboost/run.R +++ b/1_code/experiments/exp_001_xgboost/run.R @@ -12,23 +12,13 @@ # - tables/ (summaries, and comparison_metrics.csv against # exp_000), run_record.md # notes: -# - A test experiment: does a boosted regression tree fit the -# habitat stage better than v2's linear models? See README.md. -# - One change from exp_000, made the same way for every taxon. -# Each keeps v2's climate stage (a GLM) and carries it into the -# habitat stage as `Climate`, as v2 does. Only the habitat -# stage - each spec's `habitat_stage`, landcover for birds - -# is fitted with xgboost, on every covariate v2's habitat -# candidates use, through replace_stage_method(). -# - Mammals run too. Their habitat stage is the generic `hurdle` -# rule, so the boosted trees fit both halves: presence on the -# lure-scaled response, abundance given presence on a log-link -# Gamma. v2's table-building, which reads GLM coefficients, is -# removed with the GLMs. -# - The settings are untuned starting points (see -# 1_code/methods/engines/xgboost.R). Read the result as "does -# the pipeline run boosted trees and compare them", not as -# their best. +# - Does xgboost fit the habitat stage better than v2's GLMs? +# See README.md. Only each spec's `habitat_stage` changes +# (via replace_stage_method()); v2's climate stage is kept +# and carried as `Climate`. For mammals, xgboost fits both +# hurdle halves. +# - Settings are untuned (see methods/engines/xgboost.R): this +# tests the pipeline, not the method's best. # --- # 1. Setup ---- @@ -38,8 +28,6 @@ source("1_code/harness/harness.R") load_framework() ## 1.2 The change: fit the habitat stage with xgboost ---- -# Every other stage and setting stays v2's, so a difference from -# exp_000 is the habitat method's. xgb_settings <- list( nrounds = 1000, # the most rounds; early stopping picks eta = 0.05, # learning rate @@ -55,8 +43,7 @@ specs <- lapply( ) ## 1.3 Configure the run ---- -# The same species, seed and draws as the exp_000 run it is -# compared against, so the comparison is like for like. +# Same species and seed as exp_000 config <- experiment_config( id = "exp_001_xgboost", taxa = names(specs), @@ -69,9 +56,7 @@ config <- experiment_config( ) # 2. Run ---- -# Fit, summarize, and compare with exp_000; every experiment is -# compared with it. The comparison is written to -# tables/comparison_metrics.csv. +# Fit, summarize, and compare with exp_000 results <- run_experiment(config) # End of script ---- diff --git a/1_code/experiments/exp_002_soilgrids/01_extract_soilgrids_covariates.R b/1_code/experiments/exp_002_soilgrids/01_extract_soilgrids_covariates.R index 0f84066..ca9e776 100644 --- a/1_code/experiments/exp_002_soilgrids/01_extract_soilgrids_covariates.R +++ b/1_code/experiments/exp_002_soilgrids/01_extract_soilgrids_covariates.R @@ -14,30 +14,17 @@ # sg_*_0_5cm columns, one row per survey unit # - soilgrids_0_5cm_source.csv: where the columns came from # notes: -# - The experiment's own covariates. They are written here, not -# into the test dataset, which stays the frozen v2 data; -# run.R names the file in experiment_config(covariate_files =) -# and the harness joins it on survey_unit_id when loading. -# - The shallowest depth, 0-5 cm, of the ten SoilGrids -# properties published at it: bulk density, cation exchange -# capacity, coarse fragments, clay, nitrogen, pH, sand, silt, -# soil organic carbon and organic carbon density. Organic -# carbon stock is published for 0-30 cm only and is left out. -# Units are the layer's: kg/dm3, cmol(c)/kg, vol %, %, g/kg, -# pH, %, %, g/kg and kg/m3. -# - Each survey unit takes the value of the 1 km cell it falls -# in. The layer has no missing cells inside Alberta: gaps were -# filled from the nearest data (see the layer's readme), so a -# filled cell is an interpolation, not a measurement. -# - Survey units are located by their easting and northing, -# which are Alberta 10-TM (EPSG:3400), the layer's own grid: -# for plant units they match latitude and longitude projected -# to EPSG:3400 to within 1e-8 m, and bird units with v2's -# south-only flag fall 98% in the Grassland and Parkland -# natural regions (checked 2026-10-04). Mammal deployments -# carry no coordinates in the dataset, so their values are NA. -# - Values depend only on location, so one row per survey unit -# serves every taxon. +# - Written to 2_pipeline/, not the frozen test dataset; run.R +# passes the file as `covariate_files`. +# - All ten SoilGrids properties published at 0-5 cm (organic +# carbon stock is 0-30 cm only, so excluded), in the layer's +# units. Gap-filled cells are interpolations (see the layer's +# readme). +# - Each unit takes its 1 km cell's value, located by easting +# and northing in EPSG:3400 (the layer's grid). Checked +# 2026-10-04: plant units match projected lat/long to 1e-8 m; +# 98% of v2's south-only bird units fall in the Grassland and +# Parkland regions. Mammals have no coordinates, so NA. # --- # 1. Setup ---- diff --git a/1_code/experiments/exp_002_soilgrids/run.R b/1_code/experiments/exp_002_soilgrids/run.R index 4a5a328..367d145 100644 --- a/1_code/experiments/exp_002_soilgrids/run.R +++ b/1_code/experiments/exp_002_soilgrids/run.R @@ -15,19 +15,11 @@ # - tables/ (summaries, and comparison_metrics.csv against # exp_000), run_record.md # notes: -# - A test experiment: does adding near-surface soil properties -# from SoilGrids improve the models? See README.md. -# - The soil columns come from this experiment's own file, joined -# on survey_unit_id through `covariate_files`; the dataset and -# the _setup scripts are not touched. -# - One change from exp_000: every candidate in each taxon's -# climate stage gains the same soil terms. Climate is fitted -# once, province-wide, so one set of formulas serves every -# region, and its prediction is still carried into the habitat -# stage as `Climate`, as v2 does. -# - Mammals are not run: their v2 climate is a precomputed -# prediction, not a stage that can take new terms, and their -# deployments carry no coordinates for a soil value. +# - Does adding 0-5 cm SoilGrids properties to every climate +# candidate improve the models? See README.md. Soil columns +# come from this experiment's file via `covariate_files`. +# - Mammals are not run: their v2 climate is precomputed, and +# their deployments have no coordinates. # --- # 1. Setup ---- @@ -49,8 +41,8 @@ if (!file.exists(soil_file)) { } ## 1.3 The change: soil terms in every climate candidate ---- -# The 0-5 cm SoilGrids properties. Silt is left out because sand, -# silt and clay sum to 100%, so any one is fixed by the other two. +# The 0-5 cm SoilGrids properties. Silt is left out: sand, silt +# and clay sum to 100%. soil_terms <- c( "sg_bdod_0_5cm", # bulk density, kg/dm3 "sg_cec_0_5cm", # cation exchange capacity, cmol(c)/kg @@ -65,8 +57,7 @@ soil_terms <- c( plant_taxa <- c("bryophyte", "lichen", "mite", "vascular_plant") -# Keys are "taxon.stage". Each taxon keeps its own v2 climate set -# and adds the soil terms to every candidate in it. +# Keys are "taxon.stage" stage_models <- c( stats::setNames( rep(list(extend_models("climate_plant_v2_full", soil_terms)), @@ -77,8 +68,7 @@ stage_models <- c( ) ## 1.4 Configure the run ---- -# The same species, seed and draws as the exp_000 run it is -# compared against, so the comparison is like for like. +# Same species and seed as exp_000 config <- experiment_config( id = "exp_002_soilgrids", taxa = c(plant_taxa, "bird"), @@ -93,9 +83,7 @@ config <- experiment_config( ) # 2. Run ---- -# Fit, summarize, and compare with exp_000; every experiment is -# compared with it. The comparison is written to -# tables/comparison_metrics.csv. +# Fit, summarize, and compare with exp_000 results <- run_experiment( config, translate = list(bird = bird_habitat_translation) diff --git a/1_code/harness/cache.R b/1_code/harness/cache.R index 03a0ab6..55a303a 100644 --- a/1_code/harness/cache.R +++ b/1_code/harness/cache.R @@ -5,18 +5,11 @@ # inputs: none # outputs: none; holds read results in memory # notes: -# - The frozen dataset does not change during a run, but the -# small lookups were being re-read many times: the covariate -# catalogue several times per region, the species queue once -# per region, the stored bird draws once per species. This -# keeps one copy per file per session. -# - Entries are keyed on the file's path, its modification time -# and size, and a tag naming how it was read, so editing a -# lookup (or rebuilding the dataset) is picked up on the next -# read rather than served stale. -# - Only files are cached, never model fits or results, so the -# cache cannot change what a run computes - only how often it -# reads. clear_cache() empties it. +# - Keeps one copy per file per session of lookups that were +# re-read many times per run. Keyed on path, mtime, size and a +# read tag, so an edited file is re-read, not served stale. +# - Only file reads are cached, never fits or results, so the +# cache cannot change what a run computes. # --- # 1. Setup ---- diff --git a/1_code/harness/compare.R b/1_code/harness/compare.R index 7d4a644..625ef43 100644 --- a/1_code/harness/compare.R +++ b/1_code/harness/compare.R @@ -11,26 +11,12 @@ # the per-taxon, region and metric summary is returned (and # printed by run_experiment()) but not written # notes: -# - Every experiment after exp_000 asks the same thing: did the -# change do better or worse than the v2 baseline? This answers -# it the same way for any method, from the two experiments' -# summary tables, so a new experiment needs one call. -# - Model fit is compared on the out-of-bag metrics, which -# score each draw on the units it left out. In-sample metrics -# flatter a flexible method, so they are not the default. -# - Rows are matched on taxon, region, season, part, species -# and metric, so two experiments that name -# their runs differently still line up. -# - "Better" depends on the metric: higher AUC, deviance -# explained and Spearman; lower RMSE; a calibration slope -# closer to 1. better_direction() states it once. -# - Each side's draw count is kept in the summary -# (`draws_baseline`, `draws_candidate`), and a mismatch is -# warned about: a trial against a full run is not a result. -# - A difference is a difference in medians over draws. Whether -# it is larger than draw-to-draw noise is read from -# `share_better` across species and from the p10-p90 bands in -# comparison_metrics.csv, not from a single number. +# - Rows match on taxon, region, season, part, species and +# metric, not run name; differences are in medians over draws. +# - Defaults to out-of-bag metrics: in-sample metrics flatter +# flexible methods. +# - Warns when the two sides hold different draw counts. Judge +# noise from `share_better` and the p10-p90 bands. # --- # 1. Setup ---- diff --git a/1_code/harness/covariate_sets.R b/1_code/harness/covariate_sets.R index 817e75e..a933b2b 100644 --- a/1_code/harness/covariate_sets.R +++ b/1_code/harness/covariate_sets.R @@ -7,28 +7,13 @@ # - covariate_columns.csv # outputs: none; returns objects in memory # notes: -# - Turns a named covariate set into the master column names a -# taxon actually has. This is what lets an experiment ask for -# "climate_v2_topography" instead of editing a formula list, -# which is the mechanism behind the include/exclude -# covariate questions this repository exists to ask. -# - covariate_columns.csv maps taxon and block to master column, -# so the same set resolves to different columns per taxon -# where the source data differ, and fails loudly where a -# taxon simply does not have a covariate. -# - Requires covariate_key() from data_load.R, which is the one -# place a taxon's covariate key is derived; source that file -# first. -# - Sets are defined here rather than in a spec because they -# cross taxa: the point of a named set is that the same -# request means the same thing for plants, mammals and birds. -# - A set may name another set, so sets compose. Recursion is -# depth-limited rather than trusted, because a typo that -# makes a set reference itself would otherwise hang. -# - Future improvement - topography and remote-sensing sets are -# declared below but resolve to nothing until a _setup script -# adds those columns to covariates.csv. They are listed so -# the gap is visible rather than discovered mid-experiment. +# - Resolves named, cross-taxa covariate sets to the master +# columns each taxon has (via covariate_columns.csv), failing +# loudly where a taxon lacks one. Sets may name other sets. +# - Needs covariate_key() from data_load.R. +# - The topography and remote_sensing sets are not in the frozen +# dataset and resolve to nothing; they are listed so the gap +# is visible. # --- # 1. Setup ---- @@ -42,10 +27,9 @@ library(data.table) # lookup table reading (version: 1.16.4) #' Named Covariate Bundles #' -#' Each entry is a character vector of master column names, of -#' block names, or of other set names. Blocks are taken from -#' covariate_columns.csv, so `block:veg` means whatever the veg -#' block holds for the taxon being resolved. +#' Entries hold master column names, other set names, or +#' `block:`, which means whatever that block holds for the +#' taxon being resolved. #' #' @return A named list of character vectors. #' @@ -54,34 +38,22 @@ library(data.table) # lookup table reading (version: 1.16.4) #' # covariate_sets()$climate_v2 covariate_sets <- function() { list( - # The whole of a block, as the source file defines it. These - # are what a parity run uses. + # Whole blocks, as parity runs use climate_all = "block:climate", veg_all = "block:veg", soil_all = "block:soil", design_all = "block:design", - # The climate terms the v2 plant model sets draw on. Named - # explicitly rather than as the block, because the block - # carries derived and design columns too. - # - # This is a plant-scale set. Birds carry only five climate - # columns, so asking for it on birds fails; use - # climate_common for an experiment spanning both. + # The climate terms v2 plant model sets draw on (the block + # also holds derived and design columns). Fails on birds; use + # climate_common across taxa. climate_v2 = c( "MAT", "MAP", "MWMT", "MCMT", "TD", "MSP", "AHM", "SHM", "PET", "CMD", "FFP", "EMT", "EXT", "MTD", "PS" ), - # The climate columns every taxon has, and so the widest set - # a cross-taxa experiment can use without the taxa silently - # fitting different models. - # - # Five columns. Birds have no MAT or PET, which is what keeps - # the shared set at five rather than more. - # - # Re-derive with common_covariates() after any dataset - # version change rather than trusting this list. + # Climate columns every taxon has (birds lack MAT and PET). + # Re-derive with common_covariates() after a dataset change. climate_common = c("MAP", "FFP", "TD", "CMD", "EMT"), # The wider set birds and the plant groups share, for an @@ -90,15 +62,12 @@ covariate_sets <- function() { "MAP", "TD", "CMD", "FFP", "EMT" ), - # Topography. Not in the dataset yet; see the header. topography = c("elevation", "slope", "aspect", "TRI", "TPI"), - # Remote sensing. Not in the dataset yet; see the header. remote_sensing = c( "canopy_height", "canopy_cover", "ndvi", "lai" ), - # Compositions, which is the point of naming sets at all. climate_v2_topography = c("climate_v2", "topography"), climate_v2_remote = c("climate_v2", "remote_sensing") ) @@ -110,16 +79,9 @@ covariate_sets <- function() { #' Covariates Computed from Other Stored Columns #' -#' Some taxa lack a covariate that their own model set needs, but -#' hold the columns it is defined from. Deriving it lets that -#' taxon join an experiment it would otherwise be excluded from. -#' -#' Derivation is only sound where the definition is exact. Each -#' entry records how it was checked against a taxon that carries -#' both the inputs and the answer, so a derivation is a verified -#' claim rather than an assumption. A quantity that only -#' correlates with its supposed formula does not belong here - -#' see the note on CMD below. +#' Only exact definitions belong here; each entry's `note` says +#' how it was verified. A quantity that merely correlates with a +#' formula does not (see CMD below). #' #' @return A named list, each entry with `inputs`, `fn` and #' `note`. @@ -129,10 +91,6 @@ covariate_sets <- function() { #' # derived_covariates()$TD$note derived_covariates <- function() { list( - # Continentality: the summer-winter temperature range. - # Checked against the vascular plant table, which carries - # TD, MWMT and MCMT: agrees to 0.1 degrees, which is the - # precision the normals are stored at. TD = list( inputs = c("MWMT", "MCMT"), fn = function(d) d$MWMT - d$MCMT, @@ -142,20 +100,14 @@ derived_covariates <- function() { ) ) - # CMD is deliberately absent. The mammal climate script - # glosses it as "PET - MAP, >= 0", but checked against the - # vascular plant table that formula is off by up to 195 mm - # (r = 0.975). Climatic moisture deficit is a monthly sum, - # not an annual difference, so it cannot be recovered from - # the stored annual columns and has to be sourced. + # CMD is deliberately absent: "PET - MAP, >= 0" (the mammal + # script's gloss) is off by up to 195 mm against + # vascular_plant, because CMD is a monthly sum. , - # The products the harmonizer deliberately does not store, - # because a separately stored square would not equal the - # square of the stored column at CSV precision. The plant - # climate model set fits all four, so a plant run needs them - # derived. Each was checked against the frozen v2 source and - # agrees exactly. + # Products are not stored: a stored square would not equal + # the square of the stored column at CSV precision. The plant + # climate set fits all four. MAPPET = list( inputs = c("MAP", "PET"), fn = function(d) d$MAP * d$PET, @@ -177,11 +129,8 @@ derived_covariates <- function() { note = "MWMT squared. Exact against the v2 source." ), - # The spatial trend terms, likewise. Easting and Northing are - # UTMX and UTMY under another name - identical in the v2 - # source - and sites.csv carries them too, but the model set - # names them, so they are reachable from the covariate table - # alone rather than only through a join. + # Spatial trend terms, named as the v2 model sets name them, + # so they come from the covariate table without a join Easting = list( inputs = "UTMX", fn = function(d) d$UTMX, @@ -301,8 +250,7 @@ covariate_catalogue <- function(data_dir, taxon = NULL) { catalogue <- cached_read(path, function(p) as.data.frame(fread(p))) if (!is.null(taxon)) { - # The catalogue is keyed the way covariates.csv is, so a - # split taxon has one row set per region. + # A taxon split by region has keys like `_` keys <- unique(catalogue$taxon) matching <- keys[ keys == taxon | startsWith(keys, paste0(taxon, "_")) @@ -332,10 +280,8 @@ covariate_catalogue <- function(data_dir, taxon = NULL) { #' @param taxon Character. Taxon slug. #' @param region Character. Region name, or NULL. #' @param block Character. Restrict to one block, or NULL. -#' @param include_derived Logical. Count covariates that are not -#' stored but can be computed from stored ones. TRUE by -#' default, because a derived column is as usable as a stored -#' one; FALSE answers what the dataset literally holds. +#' @param include_derived Logical. Also count covariates +#' derivable from stored ones (see derived_covariates()). #' @return A character vector of master column names. #' #' @example # Example usage of the function @@ -368,8 +314,7 @@ available_covariates <- function( return(stored) } - # A derived column counts as available wherever its inputs are, - # which is what lets mammals reach TD without it being stored. + # e.g. mammals reach TD without it being stored derived <- derived_covariates() reachable <- names(derived)[vapply( names(derived), @@ -384,10 +329,8 @@ available_covariates <- function( #' Find the Covariates Several Taxa Share #' -#' A cross-taxa experiment can only compare taxa on covariates -#' they all have. Asking for more means each taxon quietly fits a -#' different model, which is the one thing a comparison must not -#' do. +#' Cross-taxa comparisons must use only shared covariates, or +#' each taxon fits a different model. #' #' @param data_dir Character. The test dataset folder. #' @param taxa Character vector of taxon slugs. @@ -420,8 +363,7 @@ common_covariates <- function(data_dir, taxa, block = NULL) { rows <- rows[rows$block %in% block, ] } - # A split taxon must have the column in every region, or it - # is not usable for that taxon as a whole. + # A split taxon must have the column in every region per_key <- split(rows$master_column, rows$taxon) Reduce(intersect, lapply(per_key, unique)) @@ -434,18 +376,11 @@ common_covariates <- function(data_dir, taxa, block = NULL) { #' Map v2 Term Names onto Harmonized Column Names #' -#' The v2 model formulas name columns as the source files did. -#' The harmonizer suffixed any column that appears in more than -#' one block with the block it came from, because the north and -#' south files carry columns of the same name holding different -#' values - `HardLin` means the hard linear cover measured for -#' the vegetation model in one and for the soil model in the -#' other. 84 plant columns and 6 bird columns are affected. -#' -#' Without this mapping a v2 formula asks for `HardLin`, which -#' exists in the wide table for some other taxon and reads back -#' as NA, so the map is what keeps a habitat model from silently -#' losing its footprint terms. +#' The harmonizer suffixed columns found in more than one block +#' with their block, because same-named columns hold different +#' values (e.g. `HardLin` in the veg and soil blocks). 84 plant +#' and 6 bird columns are affected. Unmapped, a v2 formula would +#' read another taxon's column as NA and silently lose terms. #' #' @param data_dir Character. The test dataset folder. #' @param taxon Character. Taxon slug. @@ -484,9 +419,8 @@ term_map <- function( #' Rewrite Source Names to Master Names #' -#' Applied to model formula text and to prediction grid column -#' names, so both speak the dataset's names while the v2 sets and -#' the grids keep the names they were written with. +#' Applied to formula text and prediction grid column names, so +#' v2 sets and grids keep their original names. #' #' @param x Character vector of formula text, or of column names. #' @param map A named vector from term_map(). @@ -499,16 +433,13 @@ apply_term_map <- function(x, map) { return(x) } - # A staged model set is a list of groups, so the rewrite - # recurses rather than assuming a flat vector. + # Staged model sets are lists of groups if (is.list(x)) { return(lapply(x, apply_term_map, map = map)) } # Longest names first, so `SurrHardLin` is not half-rewritten - # by the rule for `HardLin`. Word boundaries alone would not - # settle it, because the shorter name is a suffix of the - # longer one rather than a separate word. + # by the rule for `HardLin` order_by_length <- order(nchar(names(map)), decreasing = TRUE) for (i in order_by_length) { @@ -524,11 +455,8 @@ apply_term_map <- function(x, map) { #' Resolve Covariate Set Names to Master Columns #' -#' Expands set names, block references and bare column names into -#' the master columns a taxon and region actually have. A name -#' that resolves to nothing is an error, not an empty result: -#' silently dropping a covariate would make an experiment look -#' like it tested something it did not. +#' An unavailable covariate is an error by default: dropping it +#' silently would misreport what an experiment tested. #' #' @param requested Character vector of set names, `block:` #' references, or master column names. @@ -536,12 +464,9 @@ apply_term_map <- function(x, map) { #' @param taxon Character. Taxon slug. #' @param region Character. Region name, or NULL. #' @param sets Named list of covariate sets. -#' @param strict Logical. TRUE stops when a requested covariate -#' is unavailable. FALSE drops it with a warning, which is a -#' deliberate research choice - each taxon then fits its own -#' best available set - and is never the default, because a -#' silently different model per taxon would invalidate a -#' cross-taxa comparison. +#' @param strict Logical. FALSE drops unavailable covariates with +#' a warning, so each taxon fits a different set; never use it +#' for cross-taxa comparisons. #' @param max_depth Integer. How far a set may reference another #' set before the nesting is treated as circular. #' @return A character vector of master column names, in the @@ -561,9 +486,8 @@ resolve_covariates <- function( ) { available <- available_covariates(data_dir, taxon, region) - # Step 1: Expand set names and block references until only - # column names are left. Depth-limited, so a set that names - # itself fails rather than hanging. + # Step 1: Expand sets and blocks to columns. Depth-limited, so + # a self-referencing set fails rather than hanging. expand <- function(names_in, depth) { if (depth > max_depth) { stop( @@ -594,10 +518,8 @@ resolve_covariates <- function( columns <- unique(expand(requested, 1L)) - # Step 2: Report what this taxon does not have. Set names are - # reported separately from bare columns, because an empty set - # usually means a covariate has not been added to the dataset - # yet, while an unknown column usually means a typo. + # Step 2: Report what this taxon lacks. Empty sets are named + # separately: they usually mean missing data, not a typo. missing_columns <- setdiff(columns, available) if (length(missing_columns) > 0 && !strict) { diff --git a/1_code/harness/data_load.R b/1_code/harness/data_load.R index 36eeaa7..80762a8 100644 --- a/1_code/harness/data_load.R +++ b/1_code/harness/data_load.R @@ -11,37 +11,17 @@ # - lookup/factor_levels.csv # outputs: none; returns objects in memory # notes: -# - The taxon-agnostic data layer. Every reader takes the taxon -# as an argument and knows nothing else about it; what a taxon -# means is carried by its spec, not by this file. -# - Where each taxon's files are, and the key its rows carry in -# covariates.csv, is read from lookup/dataset_manifest.csv -# (written by _setup/09). Nothing here names a taxon. The key -# is the taxon for most taxa, but the taxon and region for -# mammals, whose north and south files carry different values -# for the same deployment. -# - Reading is column-selective. covariates.csv is 218 MB and -# 457 columns wide; a run wants a handful, so every reader -# takes the columns it needs rather than loading the table. -# - build_model_data() loads once per taxon and region, and -# model_frame() then cuts a per-species frame out of it. A -# bird run is 215,758 units by 172 species, so re-reading per -# species would dominate the run time. -# - covariates.csv is one wide table across every taxon, so a -# column another taxon carries reads back as all NA here. -# load_covariates() checks the per-taxon catalogue rather -# than the file header for that reason. -# - A covariate a taxon does not store but can be computed from -# ones it does is derived on load, through the registry in -# covariate_sets.R. That is how mammals reach TD, which their -# own climate model set needs and their source file lacks. -# Requires covariate_sets.R to be sourced first. -# - An experiment can add covariates the frozen dataset does not -# hold, from its own CSVs keyed on survey_unit_id -# (experiment_config(covariate_files = )). They are joined on -# load; 0_data/ is never changed by an experiment. -# - Future improvement - a Parquet or duckdb backing store -# would let a bird run select rows as well as columns. +# - Taxon-agnostic: file locations and covariate keys come from +# lookup/dataset_manifest.csv (_setup/09). The key is +# `_` for mammals, whose north and south files +# hold different values for the same deployment. +# - Reads are column-selective (covariates.csv is ~218 MB, 457 +# columns). build_model_data() loads once per taxon and +# region; model_frame() cuts per-species frames from it. +# - Derivable covariates are computed on load (needs +# covariate_sets.R); an experiment's covariate_files are +# joined on load, so 0_data/ is never changed. +# - TODO: a Parquet or duckdb store would allow row selection. # --- # 1. Setup ---- @@ -55,9 +35,7 @@ library(data.table) # column-selective CSV reading (version: 1.16.4) #' Read Where Each Taxon's Files Are #' -#' One row per taxon and region: the response file, the offset -#' file, the covariate key, the habitat prediction grid, and any -#' stored bootstrap draws. +#' One row per taxon and region. #' #' @param data_dir Character. The test dataset folder. #' @return A data frame. @@ -146,9 +124,8 @@ covariate_key <- function(taxon, region = NULL, data_dir) { #' Load the Survey Unit Table #' -#' One row per survey unit across every design. Carries the -#' identity, design and location fields the covariate tables -#' factor out, and an `in_` flag per taxon. +#' One row per survey unit across every design, with an +#' `in_` coverage flag per taxon. #' #' @param data_dir Character. The test dataset folder. #' @param taxon Character. Keep only units that taxon covers, or @@ -164,8 +141,7 @@ load_sites <- function(data_dir, taxon = NULL, columns = NULL) { path <- file.path(data_dir, "sites.csv") check_dataset_file(path) - # Step 1: The coverage flag has to be read even when it is not - # among the requested columns, or the filter cannot be applied + # Step 1: Read the coverage flag even if not requested flag <- if (is.null(taxon)) NULL else paste0("in_", taxon) if (!is.null(columns)) { @@ -201,11 +177,8 @@ load_sites <- function(data_dir, taxon = NULL, columns = NULL) { #' Load One Taxon's Response Table #' -#' `survey_unit_id` plus one column per species. Values are -#' whatever the source recorded - detections for plants, densities -#' for mammals, counts for birds - and are left untransformed -#' here. The spec's response transform is applied in -#' model_frame(). +#' Values are as recorded (plant detections, mammal densities, +#' bird counts); model_frame() applies the spec's transform. #' #' @param taxon Character. Taxon slug. #' @param data_dir Character. The test dataset folder. @@ -226,8 +199,7 @@ load_response <- function(taxon, data_dir, species = NULL) { return(as.data.frame(fread(path))) } - # Step 1: Fail on an unknown species here rather than returning - # a frame that is quietly missing a column + # Step 1: Fail on an unknown species available <- names(fread(path, nrows = 0)) unknown <- setdiff(species, available) @@ -248,11 +220,9 @@ load_response <- function(taxon, data_dir, species = NULL) { #' Load One Taxon's Offsets #' -#' Birds carry a QPAD log-offset per survey unit and species, -#' which makes a count comparable across survey protocols and -#' detectability. No other taxon has one, and NULL is the honest -#' answer for them rather than a column of zeros - a zero offset -#' is a modelling choice, and this is a data reader. +#' Only birds have offsets (QPAD log-offsets per unit and +#' species). Other taxa return NULL, not zeros: a zero offset is +#' a modelling choice. #' #' @param taxon Character. Taxon slug. #' @param data_dir Character. The test dataset folder. @@ -293,8 +263,6 @@ load_offsets <- function(taxon, data_dir, species = NULL) { #' Load Covariates for One Taxon and Region #' -#' Reads the requested columns from covariates.csv and keeps the -#' rows belonging to one covariate key. #' #' @param taxon Character. Taxon slug. #' @param data_dir Character. The test dataset folder. @@ -319,19 +287,14 @@ load_covariates <- function( key <- covariate_key(taxon, region, data_dir) - # Step 1: Check against what this taxon has, not against the - # file header. covariates.csv is one wide table across every - # taxon, so a column another taxon carries is present in the - # header and reads back as all NA here. Checking the header - # alone would hand back a column of nothing and let the model - # silently drop every row. + # Step 1: Check the taxon's catalogue, not the file header: the + # wide table holds other taxa's columns, which read back as all + # NA here. stored <- available_covariates( taxon, data_dir = data_dir, region = region, include_derived = FALSE ) - # A column this taxon does not store may still be computable - # from ones it does. derivable <- derivable_covariates(columns, stored) to_read <- setdiff(columns, derivable) @@ -353,11 +316,8 @@ load_covariates <- function( ) } - # Step 2: Read the columns this key has not read before. The - # file is 218 MB, and a spec asks for overlapping column sets - - # the province climate, then each region's habitat - so columns - # already read for the key are kept for the session and only - # the rest are read. + # Step 2: Read only columns not already cached for this key; + # stages request overlapping column sets. info <- file.info(path) cache_key <- paste( "covariates", normalizePath(path, winslash = "/"), @@ -376,8 +336,6 @@ load_covariates <- function( path, select = unique(c("survey_unit_id", "taxon", to_load)) ) - # Keep this key's rows, then drop the key column so the result - # is survey_unit_id plus covariates fresh <- fresh[fresh$taxon == key, ] if (nrow(fresh) == 0) { @@ -395,8 +353,7 @@ load_covariates <- function( held <- if (is.null(held)) { fresh } else { - # Rows come back in file order every time, so the new - # columns line up with the held ones + # Rows always come back in file order, so columns line up cbind(held, fresh[, to_load, drop = FALSE]) } @@ -406,8 +363,7 @@ load_covariates <- function( covariates <- held[, unique(c("survey_unit_id", to_read)), drop = FALSE] - # Step 3: Compute whatever was derivable rather than stored, - # then hand back exactly the columns that were asked for + # Step 3: Derive, then return exactly the requested columns if (length(derivable) > 0) { covariates <- apply_derivations(covariates, derivable) } @@ -419,9 +375,8 @@ load_covariates <- function( #' Check the Covariate Files an Experiment Adds #' -#' Each file must exist, be keyed on a unique survey_unit_id, and -#' add only columns that neither covariates.csv nor another file -#' already has, so no column has two possible sources. +#' Each file must have a unique survey_unit_id key and only +#' columns no other source has. #' #' @param files Character vector of CSV paths. #' @param data_dir Character. The test dataset folder. @@ -498,8 +453,8 @@ covariate_file_columns <- function(files) { #' Join Covariates from an Experiment's Own Files #' -#' A unit a file does not list gets NA, as a unit missing a value -#' in covariates.csv does, and drops out of any model using it. +#' Units a file does not list get NA and drop out of models that +#' use the column. #' #' @param x A data frame with survey_unit_id, from #' load_covariates(). @@ -539,16 +494,10 @@ add_covariate_files <- function(x, files, columns) { #' Restore Stored Factor Levels #' -#' Some covariates are categorical - the bird vegetation and soil -#' classes, and the survey method. A CSV reads them back as -#' character, and a model then factors them alphabetically, which -#' silently changes the reference level and so every contrast -#' coefficient. lookup/factor_levels.csv records, per taxon, the -#' order the source used, and this restores it. -#' -#' A level present in the data but not in the lookup is an error -#' rather than an extra level: it means the lookup is stale, and -#' quietly admitting it would change the contrasts. +#' CSV reads categoricals back as character, and alphabetical +#' factoring would change the reference level and every contrast. +#' Restores the source order from lookup/factor_levels.csv. An +#' unknown level is an error: the lookup is stale. #' #' @param frame A data frame. #' @param data_dir Character. The test dataset folder. @@ -570,13 +519,8 @@ apply_factor_levels <- function(frame, data_dir, taxon) { return(frame) } - # The lookup names columns as the source did. A column the - # harmonizer suffixed because it sits in more than one block - - # the bird `method`, stored as method_veg and method_soil - is - # loaded under its suffixed name, so the lookup is matched - # through covariate_columns.csv as well. Without this those - # columns fall back to alphabetical levels, which moves the - # reference level and every contrast. + # Also match block-suffixed columns (e.g. bird `method` as + # method_veg, method_soil) via covariate_columns.csv map_path <- file.path(data_dir, "lookup", "covariate_columns.csv") column_map <- if (file.exists(map_path)) { map <- covariate_catalogue(data_dir) @@ -622,16 +566,10 @@ apply_factor_levels <- function(frame, data_dir, taxon) { restore_factor <- function(x, ordered_levels, taxon, column) { values <- as.character(x) - # Every harmonized table is written with `na = ""`, so a - # missing factor value reads back as a blank string rather - # than NA. Left alone it survives as an extra level, and the - # guard below then rejects the whole run over a level that - # is not a level at all - which is what a blank `soilc` - # does to 194 of the 91,001 southern bird surveys. - # - # v2 never sees this: it reads the same values as NA and - # glm's default na.action drops those rows. Restoring the - # NA here reproduces that, rather than inventing a rule. + # Tables are written with `na = ""`, so a missing value reads + # back as "" and would fail the level guard (e.g. blank `soilc` + # in 194 southern bird surveys). Restoring NA matches v2, where + # glm drops those rows. values[!nzchar(trimws(values))] <- NA_character_ unknown <- setdiff(stats::na.omit(unique(values)), ordered_levels) @@ -658,13 +596,8 @@ reference level and every contrast.", #' Assemble Everything One Taxon and Region Needs #' -#' Loads the response, covariates, offsets and site fields once, -#' aligned on survey_unit_id, and applies the region filter. The -#' per-species frame is then cut from this by model_frame(). -#' -#' Loading once matters: a bird run is 215,758 survey units by -#' 172 species, and re-reading per species would cost more than -#' the fitting. +#' Loaded once per taxon and region, aligned on survey_unit_id; +#' re-reading per species would cost more than fitting. #' #' @param taxon Character. Taxon slug. #' @param data_dir Character. The test dataset folder. @@ -675,8 +608,7 @@ reference level and every contrast.", #' assembled frame, or NULL. Rows where it is not TRUE are #' dropped (e.g. ~ nr != "Grassland"). #' @param weight_column Character. A covariate to use as model -#' weights. Added to `covariates` automatically, so a caller -#' naming a weight does not also have to remember to load it. +#' weights; loaded automatically. #' @param aliases Named list, alias to source column. Lets a #' model set name a column the dataset stores otherwise. #' @param site_columns Character vector of sites.csv columns to @@ -708,9 +640,7 @@ build_model_data <- function( ) { site_columns <- site_columns %||% site_columns() - # Step 1: Read each piece, narrowed to what was asked for. The - # weight is a covariate like any other, so it is added here - # rather than left for the caller to remember. + # Step 1: Read each piece, narrowed to what was asked for if (!is.null(weight_column)) { covariates <- unique(c(covariates, weight_column)) } @@ -726,9 +656,7 @@ build_model_data <- function( off <- load_offsets(taxon, data_dir, species) sites <- load_sites(data_dir, taxon, site_columns) - # Step 2: Take the survey units the covariates and the response - # agree on. A unit in one but not the other cannot be modelled, - # and silently dropping it is what a plain join would do. + # Step 2: Keep units present in covariates, response and sites units <- intersect( as.character(x$survey_unit_id), as.character(y$survey_unit_id) ) @@ -758,15 +686,11 @@ build_model_data <- function( frame <- cbind(x, site_rows[, keep, drop = FALSE]) rownames(frame) <- NULL - # Step 3b: Restore any recorded factor levels, before the - # region filter, so a filter may name a categorical column. + # Step 3b: Restore factor levels before the region filter frame <- apply_factor_levels(frame, data_dir, taxon) - # Step 3c: Alias columns a model set names under a different - # name than the dataset stores them under. The mammal formulas - # fit `seas_days`, which is summer_days or winter_days - # depending on which season is being modelled - one name for a - # column whose identity is part of the run's configuration. + # Step 3c: Aliases, e.g. mammal `seas_days` is summer_days or + # winter_days depending on the season modelled for (alias in names(aliases)) { source_column <- aliases[[alias]] @@ -781,9 +705,7 @@ build_model_data <- function( frame[[alias]] <- frame[[source_column]] } - # Step 4: Apply the region filter. It is a spec-supplied - # expression rather than a taxon rule known here, which is what - # keeps this file taxon-agnostic. + # Step 4: Apply the spec's region filter if (!is.null(region_filter)) { keep_rows <- eval( rlang_f_rhs(region_filter), @@ -829,18 +751,15 @@ build_model_data <- function( #' Cut a One-Species Modelling Frame #' -#' Adds the response, offset and weight for one species to the -#' shared covariate frame, under fixed names, so a model formula -#' and a fitting engine never have to know the species. +#' Adds one species' response, offset and weight under fixed +#' names, so formulas and engines never name the species. #' #' @param model_data A list from build_model_data(). #' @param species Character. One species column. -#' @param transform Character or function. "identity" leaves the -#' response alone; "detection" makes it 1 where the value is -#' above zero, which is how the plant scripts turn a cover -#' value into a presence. A function is applied as given, and -#' is passed the frame as a second argument when it takes one - -#' the mammal lure correction needs `lured` and `location`. +#' @param transform Character or function. "identity", or +#' "detection" (value > 0 becomes 1, as in the plant scripts). +#' A function taking two arguments also gets the frame (e.g. +#' the mammal lure correction needs `lured` and `location`). #' @param weight_column Character. A covariate column to use as #' model weights, or NULL. #' @param response_name,offset_name,weight_name Character. Column @@ -871,22 +790,17 @@ model_frame <- function( frame <- model_data$covariates values <- model_data$response[[species]] - # Step 1: Apply the response transform - # The untransformed values are kept alongside, because a stage - # may need a different transform of the same response. The - # mammal climate stage fits presence whichever half of the - # hurdle is being run, so the abundance run still needs the - # presence form to get its climate offset. + # Step 1: Apply the response transform, keeping raw values for + # stages that transform differently (the mammal climate stage + # fits presence even in the abundance run) frame[[paste0(response_name, "_raw")]] <- values frame[[response_name]] <- apply_response_transform( values, transform, frame ) - # Step 2: Attach the offset when the taxon has one. A species - # missing from the offsets file is an error rather than a zero: - # a silent zero offset would make that species' counts look - # like every other species' rates. + # Step 2: Attach the offset. A species missing from the offsets + # file is an error, not a silent zero offset. if (!is.null(model_data$offset)) { if (!species %in% names(model_data$offset)) { stop( @@ -942,9 +856,8 @@ check_dataset_file <- function(path) { #' The Site Fields Every Model Frame Carries #' -#' Read from sites.csv rather than covariates.csv, so a region -#' filter or a formula may name them without loading them as -#' covariates. +#' Read from sites.csv, so filters and formulas can name them +#' without loading them as covariates. #' #' @return A character vector of sites.csv column names. #' @@ -994,9 +907,7 @@ apply_response_transform <- function( values, transform, frame = NULL ) { if (is.function(transform)) { - # A transform that declares a second argument gets the - # frame, so a correction can depend on design columns - # rather than on the response alone. + # A two-argument transform also gets the frame if (length(formals(transform)) > 1) { return(transform(values, frame)) } @@ -1020,8 +931,7 @@ apply_response_transform <- function( #' Take the Right-Hand Side of a One-Sided Formula #' -#' Kept as a small local helper rather than a rlang dependency, -#' because the harness is otherwise base R plus data.table. +#' Local helper to avoid an rlang dependency. #' #' @param f A one-sided formula, e.g. ~ nr != "Grassland". #' @return The unevaluated right-hand side. diff --git a/1_code/harness/data_source.R b/1_code/harness/data_source.R index 4896dc7..c3d90ed 100644 --- a/1_code/harness/data_source.R +++ b/1_code/harness/data_source.R @@ -12,20 +12,14 @@ # read instead # outputs: none; returns the folder to read # notes: -# - Both datasets are built once by 1_code/_setup/ and -# published to ABMI-DATA2 by _setup/10_publish_datasets.R. -# Experiments, tests and downstream scripts read the -# published copies, so nobody else has to run _setup/. -# - sdm_published$versions pins the version every run reads. -# A published version is a folder that is never overwritten; -# moving to a rebuilt dataset is a one-line change here. -# - The environment variables point runs at another folder - a -# local copy for working off the network, or the _setup/ -# output in 0_data/ straight after a rebuild. -# - Every call checks that each file in checksums.csv is -# present at its published size. That catches a missing or -# half-copied file in a second; a full md5 check is left to -# verify_published(). +# - Runs read the copies published by +# _setup/10_publish_datasets.R, so only maintainers run +# _setup/. sdm_published$versions pins the version read; +# published versions are never overwritten. +# - The environment variables redirect to a local copy or to +# fresh _setup/ output in 0_data/. +# - Each call checks presence and size against checksums.csv +# (fast); verify_published() does the full md5 check. # --- # 1. Setup ---- @@ -56,9 +50,8 @@ sdm_published <- list( #' Resolve a Published Dataset Folder #' -#' Returns, in order of preference, `dir`, the folder named by -#' the dataset's environment variable, or its pinned published -#' version. +#' Precedence: `dir`, then the dataset's environment variable, +#' then the pinned published version. #' #' @param name Character. "test_dataset" or "v2_results". #' @param dir Character or NULL. A folder to use as is. @@ -135,10 +128,9 @@ v2_results_dir <- function(dir = NULL, check = TRUE) { #' Check a Dataset Folder Is Complete #' -#' Checks the folder exists and, when it carries a -#' checksums.csv (every published version does), that each file -#' listed is present at its listed size. A local copy without -#' checksums.csv is only checked for the dataset's marker file. +#' Published copies are checked file by file against +#' checksums.csv (presence and size); a local copy without one is +#' only checked for the dataset's marker file. #' #' @param dir Character. The folder. #' @param name Character. The dataset, for its marker file. diff --git a/1_code/harness/engines.R b/1_code/harness/engines.R index efbdba3..7bb25bf 100644 --- a/1_code/harness/engines.R +++ b/1_code/harness/engines.R @@ -5,20 +5,10 @@ # inputs: none # outputs: none; defines functions in memory # notes: -# - An engine is a fitting method behind one interface, so that -# swapping a GLM for a boosted tree is a one-word change in a -# spec rather than a rewrite. The engines themselves live in -# 1_code/methods/engines/, one file each; this file is how the -# harness talks to them. -# - The contract, in full, is in 1_code/methods/README.md: -# `fit(formula, data, family, weights, offset, control)` -# returns list(fit, ok, message) and never raises; -# `predict(fit, newdata, type, se)` returns a numeric vector -# (or list(fit, se.fit) when se = TRUE), or NULL on failure; -# `coef(fit)` and `ic(fit, type)` exist when the engine -# declares the `coefficients` and `ic` capabilities. -# - check_engine() runs that contract on small synthetic data, -# so a new engine can be tested before it meets the dataset. +# - The harness's interface to the engines in +# 1_code/methods/engines/, so swapping engines is a one-word +# spec change. The contract is in 1_code/methods/README.md; +# check_engine() tests an engine against it on synthetic data. # --- # 1. Setup ---- @@ -59,9 +49,7 @@ engine_has <- function(engine, capability) { #' Coefficients from a Fit, Where the Engine Has Them #' -#' A fit made through fit_with() carries its coefficients -#' already, so they are computed once per fit however many times -#' a rule reads them. +#' Reuses coefficients cached on the fit by fit_with(). #' #' @param engine An engine definition. #' @param fit A fit from engine$fit(). @@ -140,9 +128,8 @@ engine_nobs <- function(engine, fit) { #' Fit One Formula Through an Engine #' -#' The one place a candidate is fitted, so every rule gets the -#' same thing back: the engine's fit, with its coefficients -#' computed once and kept on it. +#' The one place a candidate is fitted. Coefficients are computed +#' once and cached on the fit (bayesglm's summary() is slow). #' #' @param engine An engine definition. #' @param formula A model formula. @@ -172,10 +159,9 @@ fit_with <- function( #' Test an Engine Against the Contract #' -#' Fits small synthetic binomial and Poisson data - with weights, -#' an offset in the formula, and a factor - and checks each part -#' of the contract the engine claims. Run it on a new engine -#' before using it in a spec. +#' Fits synthetic binomial and Poisson data (weights, a formula +#' offset, a factor) and checks each part of the contract the +#' engine declares. #' #' @param engine An engine definition, or a registered name. #' @param n Integer. Rows of synthetic data. @@ -192,8 +178,7 @@ check_engine <- function(engine, n = 400L, seed = 1L, quiet = FALSE) { engine <- get_engine(engine) } - # Step 1: Synthetic data with a known signal, built under its - # own seed so the session's random state is left alone. + # Step 1: Synthetic data with a known signal data <- with_seed(seed, { x1 <- stats::rnorm(n) x2 <- stats::runif(n) @@ -273,8 +258,7 @@ check_engine <- function(engine, n = 400L, seed = 1L, quiet = FALSE) { } ) - # The offset is part of a survey, not of the model: changing - # it on new data must change a Poisson prediction. + # Doubling effort on new data must double a Poisson prediction if (family == "poisson") { shifted <- newdata shifted$offset <- shifted$offset + log(2) diff --git a/1_code/harness/eval_metrics.R b/1_code/harness/eval_metrics.R index e3f45c9..100b875 100644 --- a/1_code/harness/eval_metrics.R +++ b/1_code/harness/eval_metrics.R @@ -5,18 +5,13 @@ # inputs: none # outputs: none; returns objects in memory # notes: -# - Metrics are what experiments are compared on, so a change -# affects every past and future experiment and should be -# reviewed on that basis. -# - The metrics themselves live in 1_code/methods/metrics/, one -# file each, registered by name. Every metric takes observed -# and predicted vectors on the response scale and returns one -# number. -# - Metrics are computed from predictions, never from a fitted -# object, so a GLM and a boosted tree are scored the same way. -# - A metric that cannot be computed returns NA rather than -# stopping. A bootstrap where a species was never detected -# has no AUC, and that is a fact about the draw, not an error. +# - Experiments are compared on these metrics, so a change here +# affects every experiment. Metrics live in +# 1_code/methods/metrics/ and score response-scale +# predictions, never a fitted object, so all engines are +# scored alike. +# - An uncomputable metric returns NA rather than stopping (e.g. +# no AUC for a draw with no detections). # --- # 1. Setup ---- @@ -28,9 +23,9 @@ #' The Metrics Scored When a Run Names None #' -#' Every registered metric. The seven original ones come first in -#' their original order, so a metrics table lists them the same -#' way it always has; any added later follow alphabetically. +#' Every registered metric: the seven original ones first, in +#' their original order, so tables stay stable; later additions +#' follow alphabetically. #' #' @return A character vector of metric names. #' @@ -70,7 +65,7 @@ compute_metrics <- function(observed, predicted, metrics = NULL) { function(name) get_method("metric", name) ) - # Step 1: Drop pairs where either side is missing, so every + # Step 1: Drop pairs where either side is non-finite, so every # metric sees the same rows keep <- is.finite(observed) & is.finite(predicted) observed <- observed[keep] diff --git a/1_code/harness/experiment.R b/1_code/harness/experiment.R index 79a1122..fc28df1 100644 --- a/1_code/harness/experiment.R +++ b/1_code/harness/experiment.R @@ -9,24 +9,12 @@ # in 3_output//: tables/, run_record.md, and whatever the # experiment's own steps write # notes: -# - An experiment is a configuration plus a few steps. This -# holds the part every experiment shares, so each run.R is a -# short list of decisions: -# - experiment_config() states and checks the decisions - -# which runs, species, draws, seed, candidate models and -# workers - before anything is fitted. Every check that used -# to sit in run.R lives here. -# - run_experiment() fits (optionally), collects the stores -# into summary tables, compares them with the baseline -# experiment (exp_000, the v2 configuration), runs the -# experiment's own steps in order, and writes the run -# record. -# - Every experiment is compared with the baseline without -# asking, because that comparison is the point of an -# experiment here: a result is read as a difference from v2. -# - Everything the steps need travels in the config and the -# results passed to them; nothing is read from the global -# environment, so a step can be run on its own. +# - The part every experiment shares, so each run.R is a short +# list of decisions. experiment_config() checks them before +# anything is fitted; run_experiment() fits, summarizes, +# compares with the baseline (exp_000, v2), runs the +# experiment's own steps and writes the run record. +# - Steps receive everything through `config` and `results`. # --- # 1. Setup ---- @@ -170,8 +158,7 @@ experiment_config <- function( } # Step 4: The species. A taxon the set does not name runs every - # species, because an absent taxon means "no restriction". Said - # out loud, because it makes a partial set the longest run. + # species, so say so: it makes a partial set the longest run. focal <- get_focal_species(species) if (!is.null(focal)) { @@ -356,9 +343,7 @@ run_experiment <- function( #' The Settings a Run Record States #' -#' Settings rather than paths: an absolute directory differs -#' between machines and would diff on every line without meaning -#' anything. +#' Settings, not absolute paths, which differ between machines. #' #' @param config An experiment_config(). #' @param run_log The run log, or NULL when nothing was fitted. @@ -413,9 +398,7 @@ record_config <- function(config, run_log = NULL) { data_dir = published_label(config$data_dir) ) - # Failures belong in the record. Without them, a run that lost - # half its jobs and one that lost none look alike wherever the - # survivors agree. + # Record failures, or a run that lost jobs looks complete if (!is.null(run_log)) { ok <- sum(run_log$status == "ok", na.rm = TRUE) out$jobs_total <- nrow(run_log) @@ -464,11 +447,9 @@ experiment_changes <- function(config) { #' Compare an Experiment's Summaries with the Baseline's #' -#' Run by run_experiment() for every experiment but the baseline. -#' Writes tables/comparison_metrics.csv and prints the per-taxon -#' headline; see compare_experiments(). A baseline -#' that has not been run is reported and skipped rather than -#' stopping the experiment. +#' Writes tables/comparison_metrics.csv and prints the headline +#' (see compare_experiments()). A baseline not yet run is +#' reported and skipped, not an error. #' #' @param config An experiment_config(). #' @param results The results so far. @@ -528,11 +509,9 @@ compare_to_baseline <- function( #' Turn an Experiment Script into a Step #' -#' An experiment's own scripts - a comparison, a figure, a -#' report - are written top to bottom and read `config` and -#' `results`. This runs one in an environment of its own holding -#' only those two, so it cannot depend on, or leave behind, any -#' other variable, and hands back the `results` it updated. +#' Runs the script in a fresh environment (parent: global) +#' holding `config` and `results`, so it leaves nothing behind, +#' and returns the updated `results`. #' #' @param path Character. The script. #' @return A function(config, results) for run_experiment()'s diff --git a/1_code/harness/harness.R b/1_code/harness/harness.R index 36a48e3..1531714 100644 --- a/1_code/harness/harness.R +++ b/1_code/harness/harness.R @@ -8,25 +8,12 @@ # - the files in 1_code/modules/ # outputs: none; defines the framework in the calling environment # notes: -# - One entry point. An experiment sources this file and calls -# load_framework(), rather than sourcing thirty files in the -# right order. -# - Four layers, loaded in this order: -# 1. harness/ - the taxon-agnostic machinery, including the -# method registry the next layer fills. -# 2. methods/ - engines, selection rules, resampling schemes -# and metrics, one file each. Every file registers itself, -# so adding a method is adding a file; nothing here lists -# them. -# 3. modules/ - one folder per taxon, holding its spec, after -# _shared/, which the plant-group taxa build on. -# 4. experiments/_shared/ - settings every experiment can -# use, such as the named focal-species sets. -# - Within a methods folder, files whose names start with an -# underscore are shared helpers and are loaded first. -# - harness/new_experiment.R, which scaffolds a new -# experiment's folders, is loaded too, but also works sourced -# on its own, before an experiment exists. +# - Single entry point: experiments source this file and call +# load_framework(). +# - Load order: harness/ (including the method registry), +# methods/ (each file registers itself), modules/, then +# experiments/_shared/. Files or folders starting with "_" +# are shared helpers and load first. # --- # 1. Setup ---- diff --git a/1_code/harness/model_sets.R b/1_code/harness/model_sets.R index 688480c..db11d9a 100644 --- a/1_code/harness/model_sets.R +++ b/1_code/harness/model_sets.R @@ -5,25 +5,13 @@ # inputs: none # outputs: none; returns objects in memory # notes: -# - The candidate formulas each v2 pipeline chooses among, as -# text, so a spec names a set rather than carrying 40 lines of -# formulas. Text rather than formula objects, because a -# formula captures the environment it was built in, and these -# are evaluated against whatever frame the run assembles. -# - Candidates are updates - `. ~ . + MAP` - applied to a base -# formula by the selection layer. The base supplies the -# response, so one set serves any taxon whose response column -# is named the same way. -# - The climate set is shared by birds and mammals. Their two v2 -# pipelines were written separately by different authors and -# arrived at the same eight combinations of the same four -# variables; the mammal script adds an explicit null, which -# here is the base formula. That is why one set covers both. -# - The plant climate formulas are spliced verbatim from -# 0_data/v2_scripts/plants/, not retyped. -# - Habitat model sets are not here. They are large, taxon -# specific and bound up with a prediction grid, so they belong -# with the taxon specs. +# - v2's candidate formulas, named so a spec can refer to a set. +# Stored as text, not formula objects, so no environment is +# captured. Candidates are updates (`. ~ . + MAP`) applied to a +# base formula that supplies the response. +# - Plant and mammal formulas are spliced verbatim from +# 0_data/v2_scripts/, not retyped; long lines are kept so they +# match v2 line for line. # --- # 1. Setup ---- @@ -41,18 +29,9 @@ #' # names(model_sets()) #' # model_sets()$climate_bird_mammal_v2 model_sets <- function() { - # The mammal climate set, which is also the climate part of the - # bird one. Four variables - frost free period, mean annual - # precipitation, climatic moisture deficit and continentality - - # in eight combinations. - # - # Mammals fit it in full: the camera climate the harmonizer - # joins carries CMD and TD. Birds fit it with spatial terms - # added, 25 candidates in all: climate_bird_v2 below. - # - # The null is a candidate, not just the base: v2 averages over - # `climate.list` including the intercept-only model it starts - # from, so leaving it out would shift every weight. + # Shared by the v2 bird and mammal climate stages. The null is + # a candidate because v2 averages over it too; dropping it + # would shift every weight. climate_bird_mammal_v2 <- c( ". ~ .", ". ~ . + FFP", @@ -65,12 +44,9 @@ model_sets <- function() { ". ~ . + MAP + FFP + TD + CMD" ) - # The bird climate set as 06.ModelClimate.R assembles it: the - # null, the eight climate combinations, each of the eight with - # a linear spatial trend and interaction, and each of those - # again with quadratic terms. 25 candidates, averaged at once. - # The spatial terms are in metres, as v2 fits them, which is - # why their coefficients run to 1e-12. + # As 06.ModelClimate.R assembles it: 25 candidates (null, 8 + # climate, 8 + linear space, 8 + quadratic space). Spatial terms + # are in metres, as in v2, hence coefficients near 1e-12. spatial_linear <- "Easting + Northing + Easting:Northing" spatial_quadratic <- "I(Easting^2) + I(Northing^2)" @@ -83,9 +59,6 @@ model_sets <- function() { ) ) - # The plant climate set, spliced from the v2 source. Wider - # than the bird and mammal one, and includes interaction and - # squared terms the other two do not use. climate_plant_v2 <- c( ". ~ .", ". ~ . + PET", @@ -103,16 +76,11 @@ model_sets <- function() { ". ~ . + TD + FFP + MAT" ) - # The plant climate candidate set as v2 actually assembles it. - # v2 does not fit these 14 alone: it appends a bioclim version - # of every one, then spatial versions of ten of them, and - # averages over all 58 at once. Fitting only the base 14 makes - # a different model, and its coefficients are not comparable - # with the published ones. - # - # The ten that take spatial terms are the models carrying - # neither MAT, TD nor PET - v2's `model.update.id`, which - # indexes the base models and their bioclim counterparts. + # v2 averages over 58 candidates, not the 14 above: each with + # and without bioclim, plus spatial versions of the ten + # (five base, five bioclim) without MAT, TD or PET (v2's + # `model.update.id`). The 14 alone give coefficients not + # comparable with the published ones. spatial_targets <- c(1, 3, 5, 6, 7) bioclim_plant <- paste0( @@ -142,14 +110,10 @@ model_sets <- function() { )) ) - # The v2 plant habitat sets, spliced from the source. These - # are fitted with the ivw_grid rule, which predicts each - # candidate onto the prediction matrix and combines those - # predictions by precision - so a "coefficient" here is an - # effect per habitat type, not a regression coefficient. - # - # Protocol appears in the bryophyte and lichen variants - # only; plant_group_spec() adds it, matching v2. + # Fitted with ivw_grid, so a "coefficient" is an effect per + # habitat type, not a regression coefficient. Protocol (in the + # bryophyte and lichen variants only) is added by + # plant_group_spec(). habitat_veg_plant_v2 <- c( ". ~ . + Climate + WhiteSpruce + Pine + Deciduous + Mixedwood + BlackSpruce + TreedFen + TreedSwamp + GraminoidFen + ShrubbyFen + ShrubbyBog + ShrubbySwamp + Marsh + Grass + Shrub + CCWhiteSpruceR + CCWhiteSpruce1 + CCWhiteSpruce234 + CCPineR + CCPine1234 + CCDecidMixedR + CCDecidMixed1 + CCDecidMixed234 + HardLin + EnSeismic + EnSoftLin + TrSoftLin + UrbInd + Wellsites + Crop + RoughP + TameP", ". ~ . + Climate + WhiteSpruce + Pine + Deciduous + Mixedwood + Peatland + Mineral + Grass + Shrub + CCWhiteSpruceR + CCWhiteSpruce1 + CCWhiteSpruce234 + CCPineR + CCPine1234 + CCDecidMixedR + CCDecidMixed1 + CCDecidMixed234 + HardLin + EnSeismic + EnSoftLin + TrSoftLin + UrbInd + Wellsites + Crop + RoughP + TameP", @@ -186,14 +150,10 @@ model_sets <- function() { ". ~ . + Climate + Productive + Nonproductive + Other + Alien + SoftLin + paspen" ) - # The bird landcover sets, as groups. staged_bic walks them in - # order, fitting each group as an update to the previous - # group's winner, so the groups are a claim about the order the - # questions are asked in: habitat type first, then stand age, - # then cutblocks, then contrasts, then survey method and water. - # - # Terms name the source columns; the harness rewrites them to - # the block-suffixed names the dataset uses. See term_map(). + # staged_bic walks the groups in order, each updating the + # previous group's winner, so group order is part of the model. + # Terms are source names; term_map() rewrites them to the + # dataset's block-suffixed names. landcover_bird_north_v2 <- list( Hab = c( ". ~ . + vegc" @@ -251,19 +211,11 @@ model_sets <- function() { ) ) - # The mammal north presence/absence set. Seventeen candidates - # running from fine vegetation and footprint resolution to - # coarse aggregation, selected on AICc. - # - # Each carries a reference category rather than a factor: the - # land cover type left out of the formula, whose effect the - # intercept absorbs. Models 1, 2 and 10 omit Crop, the rest - # omit Alien, and a coefficient table has to name it to be - # read. The two vectors are parallel and must stay so. - # - # This is the presence half of a hurdle model; v2 fits a Gamma - # abundance-given-presence part alongside it and multiplies - # the two. modules/mammals/hurdle.R fits both. + # Presence half of the v2 mammal hurdle (see + # modules/mammals/hurdle.R), 17 candidates selected on AICc. + # intercept_mammal_north_pa_v2 names each model's omitted + # reference category, which the intercept absorbs; the two + # vectors are parallel and must stay so. habitat_mammal_north_pa_v2 <- c( ". ~ . + Decid + Mixedwood + Pine + Spruce + TreedBog + TreedFen + TreedSwamp + GrassHerb + Shrub + Marsh + ShrubbySwamp + ShrubbyBogFen + CCDecidR + CCDecid1 + CCDecid2 + CCMixedwoodR + CCMixedwood1 + CCMixedwood2 + CCPineR + CCPine1 + CCSpruceR + CCSpruce1 + CCSpruce2 + EnSoftLin + EnSeismic + TrSoftLin + TameP + RoughP + Well + RurUrbInd + seas_days + Climate", ". ~ . + Decid + Mixedwood + Pine + Spruce + TreedBog + TreedFen + TreedSwamp + GrassHerb + Shrub + Marsh + ShrubbySwamp + ShrubbyBogFen + CCDecidMixed + CCPine + CCSpruce + EnSoftLin + EnSeismic + TrSoftLin + TameP + RoughP + Well + RurUrbInd + seas_days + Climate", @@ -343,20 +295,16 @@ model_sets <- function() { } # 3. Building model sets ---- -# A stage's `models` may be a name in model_sets() or a character -# vector of formulas given directly, so an experiment defines its -# own candidate set without editing a spec. The covariates a run -# loads are read off whatever formulas it ends up with, so a set -# defined here needs no matching covariate declaration - naming a -# term is what loads it. +# A stage's `models` is a model_sets() name or a vector of +# formulas. Covariates are loaded from the terms the formulas +# name, so no separate declaration is needed. ## 3.1 extend_models() ---- #' Add Terms to Every Candidate in a Set #' -#' The include/exclude comparison: take a v2 candidate set and -#' put the same extra terms in all of it, so the only difference -#' between two runs is those terms. +#' For include/exclude comparisons: two runs then differ only by +#' these terms. #' #' @param models Character vector of formulas, or a name in #' model_sets(). @@ -381,20 +329,13 @@ extend_models <- function(models, terms, sets = model_sets()) { #' Build a Candidate Set from a List of Covariates #' -#' For an experiment asking which covariates matter rather than -#' reproducing a v2 set. `form` decides the shape of the -#' comparison, and the choice is a modelling decision rather than -#' a convenience: +#' `form` is a modelling choice: #' -#' - `single` fits one model holding every covariate. Use when -#' the question is about the whole set, not its members. -#' - `each` fits one model per covariate, so they compete singly. -#' - `ladder` adds them cumulatively in the order given, which -#' asks whether each one earns its place given the ones before -#' it. Order therefore matters and is the user's claim. -#' - `all_subsets` fits every combination. Honest but explosive: -#' ten covariates is 1,023 models per species per draw, so it -#' is capped rather than left to run away. +#' - `single`: one model with every covariate. +#' - `each`: one model per covariate. +#' - `ladder`: cumulative, in the order given (order matters). +#' - `all_subsets`: every combination, capped by `max_subsets` +#' (ten covariates is 1,023 models per species per draw). #' #' @param covariates Character vector of covariate names. #' @param form Character. One of the shapes above. @@ -465,11 +406,9 @@ models_from_covariates <- function( #' One Formula Holding Every Covariate a Candidate Set Uses #' -#' For an engine that selects its own variables and finds its own -#' curvature and interactions - a boosted tree, say - comparing a -#' v2 candidate set is meaningless; it is given every covariate any -#' candidate uses, once, as main effects. `I(x^2)` and `a:b` -#' contribute x, a and b. +#' For engines that find their own variables, curvature and +#' interactions (e.g. boosted trees). `I(x^2)` and `a:b` +#' contribute x, a and b as main effects. #' #' @param models Character vector of formulas, a list of groups of #' them (a staged set), or a name in model_sets(). @@ -505,9 +444,7 @@ models_union <- function(models, sets = model_sets()) { #' @example # Example usage of the function #' # get_model_set("climate_bird_mammal_v2") get_model_set <- function(name, sets = model_sets()) { - # A stage that declares no set at all - most stages have no - # intercept categories - asks for nothing rather than for a - # set called NULL. + # Most stages declare no intercept-category set if (is.null(name) || length(name) == 0) { return(NULL) } diff --git a/1_code/harness/new_experiment.R b/1_code/harness/new_experiment.R index 1372ffc..4e5752a 100644 --- a/1_code/harness/new_experiment.R +++ b/1_code/harness/new_experiment.R @@ -14,20 +14,14 @@ # intermediates # - 3_output//: figures/, tables/ and a stub report.md # notes: -# - One call starts an experiment, so its id is chosen once and -# used verbatim in all three places: +# - Usage: # source("1_code/harness/new_experiment.R") # new_experiment("covariate scale") # - The number is one past the highest exp_NNN in any of the -# three folders, not just 1_code/experiments/. A pipeline -# folder left from a removed experiment still holds its -# number, so a new experiment never shares stores with an old -# one. Gaps are not reused, for the same reason. -# - Nothing is written until every target is known to be free, -# and a call that fails partway removes what it created. -# - Base R only, so it can be sourced without load_framework(). -# - The empty folders carry a .gitkeep, which .gitignore lets -# through, so the structure is committed with the code. +# three folders, and gaps are not reused, so a new experiment +# never shares stores with a removed one. +# - Base R only, so it runs without load_framework(). Empty +# folders get a .gitkeep so the structure is committed. # --- # 1. Setup ---- @@ -250,9 +244,8 @@ new_experiment <- function( #' Copy the Template, Filling its Placeholders #' -#' Replaces the template's placeholders with the experiment's -#' values in every file, and drops the run.R note on how to start -#' an experiment, which is done once the copy exists. +#' Also drops the template run.R's note on starting an +#' experiment. #' #' @param template_dir Character. The template folder. #' @param code_dir Character. The new experiment's code folder. diff --git a/1_code/harness/predict_grid.R b/1_code/harness/predict_grid.R index fa7f3d6..5b9e5cf 100644 --- a/1_code/harness/predict_grid.R +++ b/1_code/harness/predict_grid.R @@ -7,28 +7,13 @@ # - _prediction_matrix.csv # outputs: none; returns objects in memory # notes: -# - A prediction grid has one row per habitat type and one -# column per model term, holding the cover composition of a -# stand made entirely of that type. Predicting onto it turns -# a fitted model into an effect per habitat type, which is -# the quantity v2 reports and the Biodiversity Browser shows. -# - This is the comparison currency. Coefficients cannot compare -# a GLM against a boosted tree, because a tree has none, but -# every engine can predict onto these rows. Every taxon has a -# grid; the bird ones are rebuilt by _setup/09 from v2's -# coefficient translation matrix. -# - The grid prediction is the stage's final model - the -# averaged or combined one where the rule combines candidates. -# v2's later coefficient adjustments (the plant stand-age -# splines, say) are in the coefficients, not the grid. -# - Terms the grid does not carry are set to zero, not dropped. -# A grid row describes a pure stand, so a human footprint term -# is genuinely absent from it rather than unknown. Terms the -# stage holds fixed - Climate, Protocol, sampling effort - are -# set to the stage's constants. -# - A grid whose VegType column is missing is an error rather -# than a silent positional fallback, because the row order of -# a prediction matrix is not something to guess at. +# - A grid row is a pure stand of one habitat type, so +# predicting onto it gives the per-habitat effect v2 reports. +# Every engine can predict (a tree has no coefficients), so +# grids are how engines are compared. Bird grids are rebuilt +# by _setup/09 from v2's coefficient translation matrix. +# - v2's later coefficient adjustments (e.g. plant stand-age +# splines) are in the coefficients, not the grid. # --- # 1. Setup ---- @@ -83,12 +68,10 @@ load_prediction_grid <- function(data_dir, name) { #' Predict a Selection's Final Model onto a Grid #' -#' Builds a prediction frame carrying every column the model -#' reads: the grid's own where it has them, the stage's constants -#' (v2 holds Climate at zero, and Protocol at the new protocol), -#' and zero for anything else. Predicts with the selection's own -#' predictor, so an averaged or combined model is projected as a -#' whole, whatever the engine. +#' Columns come from the grid, then the stage's constants (v2 +#' holds Climate at zero and Protocol at the new protocol), then +#' zero. Uses the selection's own predictor, so an averaged or +#' combined model is projected as a whole. #' #' @param selected A selection result, carrying `predict`. #' @param grid A prediction grid, from load_prediction_grid(). @@ -151,16 +134,11 @@ predict_grid <- function( #' Predict from a Coefficient Vector Rather Than a Fit #' -#' A stage carried forward is not the best single candidate's -#' prediction: it is the averaged coefficient vector applied to -#' the data. v2 computes the climate term as -#' `plogis(X %*% averaged_coefficients)`, so the habitat models -#' see a probability between 0 and 1, and their coefficient on it -#' is correspondingly large. -#' -#' Carrying a single model's prediction instead would discard the -#' averaging the stage just did, and carrying it on the link -#' scale would change what the next stage's coefficient means. +#' Carries a stage forward as v2 does: the averaged coefficients +#' applied to the data, `plogis(X %*% b)`, so the next stage sees +#' a probability. A single candidate's prediction would discard +#' the averaging; the link scale would change what the next +#' stage's coefficient means. #' #' @param coefficients A data frame of term and estimate. #' @param data A data frame carrying those terms. diff --git a/1_code/harness/registry.R b/1_code/harness/registry.R index b584b81..f8e6c73 100644 --- a/1_code/harness/registry.R +++ b/1_code/harness/registry.R @@ -5,23 +5,12 @@ # inputs: none # outputs: none; holds the registered methods in memory # notes: -# - Every method a spec can name - a fitting engine, a selection -# rule, a resampling scheme or a metric - is registered here -# under a name. A spec names it; the harness looks it up. Adding -# a method is therefore one new file in 1_code/methods/ that -# calls a register_*() function, and no harness file changes. -# - The registry is one environment, created when this file is -# sourced and filled as 1_code/methods/ is sourced after it. -# Re-sourcing a method file replaces its entry, so a method can -# be edited and reloaded during development. -# - Each entry carries a one-line description, which -# list_methods() prints, so a user can see what is available -# without reading code. -# - Requirements are explicit. A selection rule names the engine -# capabilities it needs, and validate_spec() (spec.R) checks -# them before any data is read, so an engine that cannot -# supply standard errors fails with a sentence rather than -# silently returning no predictions hours into a run. +# - Engines, selection rules, resamplers and metrics register +# here by name, so adding a method is one new file in +# 1_code/methods/ with no harness change. Re-sourcing a method +# file replaces its entry. +# - Selection rules declare the engine capabilities they need; +# validate_spec() (spec.R) checks them before any data is read. # --- # 1. Setup ---- @@ -30,9 +19,8 @@ # Base R only. ## 1.2 The registry ---- -# One environment per kind of method. Created only if absent, so -# re-sourcing this file does not empty a registry that the method -# files have already filled. +# Created only if absent, so re-sourcing this file keeps +# registered methods if (!exists(".sdm_registry", inherits = FALSE)) { .sdm_registry <- new.env(parent = emptyenv()) } @@ -89,8 +77,6 @@ engine_capabilities <- function() { #' Add One Method to the Registry #' -#' The general form behind the four register_*() functions. -#' #' @param kind Character. One of names(method_kinds()). #' @param name Character. The name a spec uses. #' @param value The method: a function, or for an engine a list. @@ -154,13 +140,11 @@ register_method <- function( #' Register a Fitting Engine #' -#' An engine is a list with `name`, `description`, `capabilities` -#' and the functions `fit`, `predict`, and - where its -#' capabilities include them - `coef` and `ic`. See -#' 1_code/methods/README.md for the contract, and check_engine() -#' to test one. +#' See 1_code/methods/README.md for the contract. #' -#' @param engine A list, as described above. +#' @param engine A list with `name`, `description`, +#' `capabilities`, `fit`, `predict`, and `coef`/`ic` where +#' declared. #' @return The engine name, invisibly. #' #' @example # Example usage of the function @@ -203,10 +187,10 @@ register_engine <- function(engine) { #' Register a Selection Rule #' -#' A rule is a function taking at least `models`, `base`, `data`, -#' `engine`, `family`, `weights`, `offset`, `ic` and `control`, -#' and returning selection_result(). Any further argument it -#' declares is filled from the stage field of the same name. +#' Rules take `models`, `base`, `data`, `engine`, `family`, +#' `weights`, `offset`, `ic` and `control` and return +#' selection_result(). Further arguments are filled from the +#' stage field of the same name. #' #' @param name Character. The name a spec uses. #' @param fn The rule function. @@ -237,11 +221,10 @@ register_selection <- function(name, fn, description, #' Register a Resampling Scheme #' -#' A resampler is a function of `frame`, `iterations`, `seed` and -#' `context`, plus any settings it declares, which come from the -#' spec's `resample` list. It returns a list of character vectors -#' of survey unit ids, one per iteration: the units that draw is -#' fitted on. Units left out are scored as out-of-bag. +#' Resamplers take `frame`, `iterations`, `seed`, `context` and +#' any settings from `spec$resample`, and return one vector of +#' survey unit ids per iteration. Units left out are scored +#' out-of-bag. #' #' @param name Character. The name a spec's `resample$scheme` #' uses. @@ -271,8 +254,8 @@ register_resampler <- function(name, fn, description) { #' Register a Metric #' -#' A metric is a function of `observed` and `predicted`, both on -#' the response scale, returning one number. +#' Metrics take response-scale `observed` and `predicted` and +#' return one number. #' #' @param name Character. The name metrics are reported under. #' @param fn The metric function. @@ -363,9 +346,6 @@ registered_names <- function(kind) { #' Show Every Registered Method #' -#' What a spec can name, with a line on each. The quickest answer -#' to "which engines are there?". -#' #' @param kind Character, or NULL for every kind. #' @return A data frame of kind, name, requires and description, #' printed and returned invisibly. diff --git a/1_code/harness/resample.R b/1_code/harness/resample.R index 28c699e..4503358 100644 --- a/1_code/harness/resample.R +++ b/1_code/harness/resample.R @@ -5,35 +5,13 @@ # inputs: none # outputs: none; returns objects in memory # notes: -# - Produces the survey units one model fit sees. Every scheme -# returns the same thing - a list of character vectors of -# survey unit ids, one per draw, with replacement where the -# scheme resamples - so the fitting loop does not know which -# scheme it is running. -# - The schemes themselves live in 1_code/methods/resampling/: -# `precomputed`, `spatial_block` and `spatial_cv`. This file -# holds what they share - seeding and spatial blocks - and -# resample_for_species(), which looks a scheme up by name. -# - Iteration 1 of a bootstrap is the complete data by -# convention, matching v2, so the first fit of every run is -# the full-data fit. -# - v2 sets no seed, so v2 is not reproducible against itself: -# two v2 runs give different coefficients. Strict numerical -# parity is impossible by construction, and a parity check -# can only ever show distributional agreement. -# - `seed` therefore defaults to harness_seed() rather than to -# NULL. Reproducibility is worth more than bit-matching a -# behaviour that does not reproduce itself. Pass NULL to -# restore the v2 behaviour explicitly. See the parity ledger -# in docs/framework_design.md. -# - An experiment sets one base seed. Each species draws from -# its own seed, derived from that base and the species name -# by species_seed(), so species are resampled independently -# as in v2, and a species' draws do not change when others -# are added to or removed from a run. -# - Seeding never leaks. with_seed() restores the caller's -# random state on exit, so resampling does not change what -# any later random call in the session produces. +# - Shared resampling plumbing: seeding, spatial blocks, and +# resample_for_species(), which dispatches to a scheme in +# 1_code/methods/resampling/. Every scheme returns a list of +# survey unit id vectors, one per draw. +# - Seeds default to harness_seed(), not NULL. v2 set no seed, +# so parity with v2 can only be distributional (see the +# parity ledger in docs/framework_design.md). # --- # 1. Setup ---- @@ -47,14 +25,8 @@ library(data.table) # lookup table reading (version: 1.16.4) #' The Default Random Seed #' -#' Every scheme that draws at random seeds from this unless told -#' otherwise, so two runs of the same configuration produce the -#' same result. v2 seeded nothing, so its runs do not reproduce -#' even against themselves; that is the behaviour this default -#' deliberately departs from. -#' -#' The value is recorded in each run's meta.json, so a result can -#' be traced back to the draw that produced it. +#' Used unless a run sets its own seed. Deliberately departs from +#' v2, which seeded nothing and so does not reproduce itself. #' #' @return An integer. #' @@ -68,21 +40,12 @@ harness_seed <- function() { #' Derive One Species' Seed from the Experiment's Base Seed #' -#' Resetting every species to the same seed would give every -#' species the same draws, which v2 did not do and which -#' correlates results across species. Deriving a seed per species -#' keeps one number in charge of the run while giving each -#' species its own stream. -#' -#' The species key is hashed with a polynomial rolling hash, taken -#' modulo a prime below the integer maximum, and added to the -#' base. Every intermediate value stays below 2^53, so the -#' arithmetic is exact in double precision and the result is the -#' same on every platform. -#' -#' Region is deliberately not part of the key. v2 draws once per -#' species across the province, and a species should keep the -#' same draws whichever regions a run includes. +#' A shared seed would give every species identical draws. A +#' per-species seed keeps them independent, as in v2, and stable +#' when other species are added to or dropped from a run. The +#' rolling hash stays below 2^53, so it is exact in double +#' precision on every platform. Region is left out of the key +#' because v2 draws once per species across the province. #' #' @param base Integer or NULL. The experiment's base seed. NULL #' leaves the draw unseeded, which is what v2 did. @@ -116,11 +79,8 @@ species_seed <- function(base, taxon, species) { #' Evaluate Code Under a Seed, Then Restore the Random State #' -#' set.seed() changes the session's random state for everything -#' that follows. Restoring it on exit keeps resampling from -#' changing any later random call, and makes the result depend -#' only on the seed given here - not on the session's generator, -#' which is set explicitly to R's default. +#' Restoring the caller's state keeps resampling from changing +#' any later random call in the session. #' #' @param seed Integer or NULL. NULL evaluates the code without #' seeding. @@ -141,8 +101,7 @@ with_seed <- function(seed, code) { old_kind <- RNGkind() on.exit({ - # The generator first, because setting it reseeds; then the - # caller's exact state on top + # Restore the generator first: setting it reseeds suppressWarnings(do.call(RNGkind, as.list(old_kind))) if (had_state) { @@ -153,9 +112,8 @@ with_seed <- function(seed, code) { } }, add = TRUE) - # R's default generator, named rather than assumed, so the draws - # are the same whatever generator the session or a package (a - # parallel backend, say) has switched to + # Name R's default generator explicitly; a package (e.g. a + # parallel backend) may have switched the session's set.seed( seed, kind = "Mersenne-Twister", normal.kind = "Inversion", sample.kind = "Rejection" @@ -168,16 +126,13 @@ with_seed <- function(seed, code) { #' Cut Survey Units into Coarse Spatial Blocks #' -#' Both the bootstrap and the spatial cross-validation scheme -#' need a block label per survey unit. The default cut points are -#' the v2 plant grid. +#' Default cut points are the v2 plant grid. #' #' @param long,lat Numeric vectors of coordinates. #' @param long_breaks,lat_breaks Numeric vectors of cut points. #' @return A character vector of block labels, one per unit. -#' Labels are plain letters rather than interval notation, -#' because a label carrying brackets and commas cannot be used -#' in a regular expression or a file name. +#' Plain letters (or `b1`, `b2`, ... beyond 26), not interval +#' notation, so labels are safe in regexes and file names. #' #' @example # Example usage of the function #' # blocks <- spatial_blocks(frame$long, frame$lat) @@ -211,9 +166,8 @@ spatial_blocks <- function( #' Draw the Resampling Sets for One Species #' -#' Looks the spec's scheme up in the registry and passes it the -#' spec's `resample` settings. `scheme`, `seed` and `scope` are -#' read here and by run_spec(), not by a scheme. +#' Passes the scheme every `spec$resample` setting except +#' `scheme`, `seed` and `scope`, which the harness consumes. #' #' @param spec A taxon spec. #' @param frame The one-species frame, one row per unit that can diff --git a/1_code/harness/result.R b/1_code/harness/result.R index 517ce85..6e44bd0 100644 --- a/1_code/harness/result.R +++ b/1_code/harness/result.R @@ -11,36 +11,16 @@ # - metrics.csv # - meta.json # notes: -# - Every run writes the same five files whatever the engine, -# which is what makes a GLM run and a boosted-tree run -# comparable. Comparison code reads this contract and nothing -# else. -# - grid_predictions.csv is the common currency. Coefficients -# cannot compare a GLM to a tree - a tree has no Peatland -# coefficient - but every engine can predict onto the rows of -# a prediction matrix, which is also the quantity v2 reports. -# - coefficients.csv is still written when the engine has -# coefficients, because parity against v2 is checked there. -# Its absence is recorded in meta.json rather than being -# silently empty. -# - Writing is append-per-draw rather than one object at the -# end. A bird run is 172 species by 100 bootstraps, and -# holding all of it before the first write would risk losing -# a long run to a failure in its last species. -# - Species are fitted in parallel, so each writes to a shard -# store of its own, without headers. merge_result_shards() -# then writes each file's header once and appends the shards -# in queue order, so the merged store is byte for byte what a -# serial run writes. -# - unit_predictions.csv is optional. It holds every survey unit -# for every draw - gigabytes for birds - and nothing -# downstream reads it, because metrics are scored in memory. -# A run writes it only when asked. -# - meta.json records the configuration a run cannot be -# reproduced without: engine, selection rule, covariates, -# seed, and the resampling scheme. The seed matters most - v2 -# set none, so a v2-configured run is not reproducible even -# against itself. +# - Every engine writes the same files, so comparison code reads +# only this contract. grid_predictions.csv compares any +# engines; coefficients.csv is written only when the engine +# has coefficients (v2 parity is checked there). +# - Rows are appended per draw, so a failure late in a long run +# loses little. Parallel species write headerless shards; +# merge_result_shards() appends them in queue order, matching +# a serial run byte for byte. +# - unit_predictions.csv is opt-in: it can reach gigabytes +# (birds) and nothing downstream reads it. # --- # 1. Setup ---- @@ -54,9 +34,6 @@ library(data.table) # fast appending writes (version: 1.16.4) #' The Columns of Each Result File #' -#' Fixed per file, so a comparison can rely on them and a shard -#' written without a header can be given one when merged. -#' #' @return A named list of character vectors. #' #' @example # Example usage of the function @@ -83,8 +60,7 @@ result_columns <- function() { #' #' @param dir Character. Directory to write into. #' @param overwrite Logical. Remove existing result files first. -#' FALSE lets a run add to a store, which is how a run that -#' stopped part way is continued. +#' FALSE continues a run that stopped part way. #' @param header Logical. Write a header line when a file is #' started. FALSE for a shard, which is merged under one header. #' @param unit_predictions Character. "none" writes no unit @@ -183,8 +159,7 @@ result_append <- function(store, what, rows) { path <- file.path(store$dir, paste0(what, ".csv")) started <- file.exists(path) - # The header is written once, on the first call, so the file - # stays a single valid CSV across appends. A shard has none. + # Header on first write only; shards have none fwrite( rows, path, append = started, col.names = store$header && !started, na = "" @@ -194,8 +169,6 @@ result_append <- function(store, what, rows) { } # 4. Writers ---- -# One per file, each fixing the column set so that a downstream -# comparison can rely on it. ## 4.1 write_grid_predictions() ---- @@ -278,9 +251,8 @@ write_unit_predictions <- function( #' @param boot Integer. #' @param coefficients A data frame of term, estimate and se, or #' NULL for an engine that has none. -#' @param stage Character. The stage the coefficients came from. -#' Every stage is recorded, not only the last, so a staged -#' model can be compared stage by stage. +#' @param stage Character. The stage the coefficients came from; +#' every stage is recorded, not only the last. #' @return NULL, invisibly. #' #' @example # Example usage of the function @@ -337,9 +309,8 @@ write_metrics <- function(store, species, region, boot, metrics) { #' Record What a Run Was #' -#' Everything needed to say what produced the other four files. -#' Written as JSON by hand rather than through jsonlite, so the -#' harness keeps its base-R-plus-data.table dependency. +#' Hand-written JSON, not jsonlite, to keep the harness to base R +#' plus data.table. #' #' @param store A result_store(). #' @param meta A named list of scalars and character vectors. @@ -397,9 +368,8 @@ write_meta <- function(store, meta) { #' Read a Result Store Back #' -#' What comparison scripts use. A missing file returns NULL -#' rather than stopping, because an engine without coefficients -#' legitimately writes none. +#' A missing file returns NULL: an engine without coefficients +#' writes none. #' #' @param dir Character. A store directory. #' @param what Character. Which file, without the extension. diff --git a/1_code/harness/run_model.R b/1_code/harness/run_model.R index ac7c9b7..9c1c8de 100644 --- a/1_code/harness/run_model.R +++ b/1_code/harness/run_model.R @@ -9,32 +9,13 @@ # in each run directory, one result store per region; see # result.R # notes: -# - The loop a spec drives. Everything it does is taken from -# the spec, so this file names no taxon. In order: -# 1. prepare_spec(): check the spec, decide the species, and -# load each region's data and grid once. -# 2. fit_species(): for one species, every region, draw and -# stage. This is the unit of work, run in parallel when -# `workers` is above 1. -# 3. merge_spec_shards(): each species wrote to a shard of its -# own; the shards are joined, in queue order, into one -# store per region, with its meta.json. -# - Stages run in order and each may carry the previous one -# forward. v2's habitat models take the fitted climate -# prediction as a term called `Climate`; here that is -# `carry_as` on a stage, and dropping it is how an experiment -# asks whether staging helps at all. -# - Seeds are derived per species (species_seed()), so results -# do not depend on how many workers ran or in what order: a -# parallel run writes the same stores as a serial one. -# - Metrics and grid predictions come from each stage's final -# model - the averaged or combined one where the rule -# combines candidates - or from the spec's `final_prediction` -# where it states its own, as the plant specs do with v2's. -# - A species or draw that fails is recorded and the run -# continues. Across 172 species and 100 draws something always -# fails, and losing the whole run to it would be worse than -# losing the cell. +# - The spec-driven loop; names no taxon. prepare_spec() loads +# each region once; fit_species() is the unit of (parallel) +# work; merge_spec_shards() joins shards in queue order. +# - Stages run in order; `carry_as` passes a stage's prediction +# forward (v2's `Climate` term). +# - Per-species seeds make parallel and serial runs identical. +# - A failed species or draw is logged and the run continues. # --- # 1. Setup ---- @@ -48,9 +29,8 @@ #' Run Several Specs Through One Pool of Workers #' -#' What an experiment calls. Every species of every spec is one -#' job, so a run with few species per taxon still keeps every -#' worker busy. +#' Every species of every spec is one job, so few species per +#' taxon still keeps every worker busy. #' #' @param specs A named list of taxon specs. The names name the #' runs, and so the folders under `pipeline_dir`. @@ -67,10 +47,8 @@ #' or NULL; see apply_stage_models(). #' @param metrics Character vector of metric names, or NULL for #' default_metrics(). -#' @param boot_seed Integer or NULL. The base seed. Each species -#' resamples under its own seed derived from it. NULL falls back -#' to the spec's `resample$seed`, and when that is NULL too the -#' draws are unseeded, as in v2. +#' @param boot_seed Integer or NULL. The base seed; NULL falls +#' back to `spec$resample$seed`, then to unseeded (as v2). #' @param workers Integer. Species fitted at once. 1 runs in this #' session; more start background R sessions. #' @param unit_predictions Character. "none", "oob" or "all"; see @@ -103,8 +81,7 @@ run_specs <- function( call. = FALSE) } - # Step 1: Prepare every spec before fitting any, so a problem in - # the last spec stops the run before hours are spent on the first + # Step 1: Prepare every spec first, so a bad spec fails early prepared <- lapply(stats::setNames(names(specs), names(specs)), function(key) { prepare_spec( @@ -193,23 +170,17 @@ prepare_spec <- function( iterations = 1:100, stage_models = NULL, metrics = NULL, boot_seed = NULL, unit_predictions = "none" ) { - # An experiment's own candidate sets replace the spec's before - # anything is read, so the covariates follow from them. + # Before any read, so covariates follow the replacement sets spec <- apply_stage_models(spec, stage_models) - # Checked before any data is read, so a misspelt field or an - # unregistered method stops the run here with a sentence. validate_spec(spec) - # One base seed governs the run; the experiment's wins over the - # spec's, so a run can seed every taxon from one setting. + # The experiment's seed wins over the spec's base_seed <- boot_seed %||% spec$resample$seed - # Step 1: The species. A named species is validated once - # against the whole taxon, so a typo stops the run here. Per - # region it is then intersected rather than re-validated: a - # species modelled in the north and not the south is a fact - # about the species, not a mistake by the caller. + # Step 1: The species. Named species are validated against the + # whole taxon, then intersected per region (a species may be + # modelled in one region only). species <- taxon_values(species, spec$taxon) %||% species if (!is.null(species)) { @@ -272,13 +243,9 @@ prepare_spec <- function( #' Resolve One Region's Stages and Load Its Data and Grid #' -#' A stage with no models of its own takes the region's, which is -#' how one spec fits vegetation types in the north and soil types -#' in the south. The v2 formulas name columns as the source files -#' did; any column in more than one block was suffixed by the -#' harmonizer, so the names are rewritten here (see term_map()). -#' Without it a habitat model asks for HardLin, gets a column -#' belonging to another taxon, and reads NA. +#' A stage with no models takes the region's (veg in the north, +#' soil in the south). Formula terms are rewritten to the +#' dataset's block-suffixed names (see term_map()). #' #' @param spec A taxon spec. #' @param region Character. @@ -301,9 +268,8 @@ prepare_region <- function(spec, region, species, data_dir) { # takes them, and every formula in the dataset's names spec$stages <- lapply(spec$stages, function(stage) { if (is.null(stage$models)) { - # A region that supplies the models also supplies what goes - # with them: the mammal one-hot rule's reference categories, - # constants, and the columns its age splines read. + # Plus what goes with them: reference categories, + # constants, and columns the age splines read stage$models <- region_spec$habitat_models stage$intercept_cats <- region_spec$intercept_cats %||% stage$intercept_cats @@ -329,8 +295,7 @@ prepare_region <- function(spec, region, species, data_dir) { stage }) - # Step 2: The columns to load. Read off the formulas, plus the - # weight, the stored-draw key and any filter column. + # Step 2: The columns to load weight_column <- region_spec$weight_column %||% spec$weight_column covariates <- covariate_request( spec, spec_covariates(spec), region_spec$filter @@ -349,11 +314,9 @@ prepare_region <- function(spec, region, species, data_dir) { covariate_files = spec$covariate_files ) - # Step 4: The grid. A spec may name its own; otherwise the - # dataset manifest's grid for the taxon and region is used. Its - # columns are renamed to match the data, but its row names - the - # habitat types effects are reported under - are left as v2 - # wrote them. + # Step 4: The grid (the spec's, else the manifest's). Columns + # are renamed to the data's names; row names stay as v2 wrote + # them. grid_name <- region_spec$grid %||% manifest_entry(data_dir, spec$taxon, region)$grid grid <- load_prediction_grid(data_dir, grid_name) @@ -361,8 +324,7 @@ prepare_region <- function(spec, region, species, data_dir) { if (!is.null(grid)) { names(grid) <- apply_term_map(names(grid), rename) - # A region may leave rows or columns out, as v2 drops the - # mammal north's WetlandMargin and Climate rows. + # e.g. v2 drops the mammal north's WetlandMargin and Climate grid <- grid[ !rownames(grid) %in% region_spec$grid_drop_rows, !names(grid) %in% region_spec$grid_drop_cols, @@ -386,12 +348,10 @@ prepare_region <- function(spec, region, species, data_dir) { #' Assemble the Province-Wide Data a Spec's Province Scope Needs #' -#' v2 fits the plant and bird climate stages once, on every unit -#' in the draw, and draws the plant bootstrap once per species -#' across the province; only the habitat stage is fitted per -#' region. A spec says so with `scope = "province"` on a stage -#' and on `resample`. This loads the unfiltered data those need, -#' once per spec. +#' v2 fits plant and bird climate stages, and draws the plant +#' bootstrap, province-wide; only habitat is per region. Specs +#' declare this with `scope = "province"`. Loads the unfiltered +#' data once per spec. #' #' @param spec A taxon spec, with stage models already resolved. #' @param data_dir Character. @@ -412,8 +372,7 @@ province_context <- function(spec, data_dir, species) { return(NULL) } - # A province stage is fitted before any region exists, so it - # can take nothing from a region-scope stage. + # Province stages run first, so cannot carry from region stages for (stage in province_stages) { if (!is.null(stage$carry_from) || is.null(stage$models)) { stop( @@ -431,8 +390,7 @@ province_context <- function(spec, data_dir, species) { character(0) } - # The region filters are evaluated on the province frame for - # v2's redraw rule, so their columns are loaded too. + # v2's redraw rule evaluates region filters on this frame filters <- lapply(spec$regions, `[[`, "filter") covariates <- covariate_request(spec, covariates, filters) @@ -457,10 +415,9 @@ province_context <- function(spec, data_dir, species) { #' The Columns to Load, Given the Covariates the Formulas Name #' -#' Adds what no formula names but a run still needs - the column -#' stored draws are keyed on, and any column a region filter reads -#' - and drops what is not read from covariates.csv: aliases, -#' which are made from columns already loaded, and site fields. +#' Adds the stored-draw key and region-filter columns; drops +#' aliases and site fields, which do not come from +#' covariates.csv. #' #' @param spec A taxon spec. #' @param covariates Character vector from spec_covariates(). @@ -495,10 +452,8 @@ covariate_request <- function(spec, covariates, filters = NULL) { #' Fit Every Job, in This Session or in Parallel #' -#' Parallel runs start a cluster of background R sessions with the -#' base `parallel` package, load the framework on every one of -#' them at once, then hand out jobs one at a time as workers come -#' free, so a slow species (a bird) does not hold up the rest. +#' In parallel, jobs are handed out as workers free up, so a +#' slow species does not hold up the rest. #' #' @param jobs List of `key` and `species` pairs. #' @param prepared Named list of prepare_spec() results. @@ -524,15 +479,13 @@ run_jobs <- function(jobs, prepared, workers = 1L, verbose = TRUE) { "called, so workers can load it too.", call. = FALSE) } - # Step 1: Start the workers and load the framework on all of - # them at once + # Step 1: Start the workers and load the framework cluster <- parallel::makePSOCKcluster(min(workers, length(jobs))) on.exit(parallel::stopCluster(cluster), add = TRUE) parallel::clusterCall(cluster, load_worker, project_root) - # Step 2: One job at a time per worker. Each carries only its - # own spec's prepared data. + # Step 2: Each job carries only its own spec's prepared data tasks <- lapply(jobs, function(job) { list(species = job$species, prepared = prepared[[job$key]]) }) @@ -566,9 +519,7 @@ load_worker <- function(project_root) { #' Fit One Job in a Background Session #' -#' What a worker runs. It refers to nothing in the calling -#' session, so the worker needs only the job, and finds -#' fit_species() in the framework load_worker() loaded. +#' Self-contained, so a worker needs only the job. #' #' @param task List of `species` and `prepared`. #' @return The job's log data frame. @@ -583,9 +534,8 @@ fit_species_worker <- function(task) { #' Fit One Species in Every Region of a Spec #' -#' The unit of work. Writes a shard store per region and returns -#' the log. Province-wide draws and stage fits are made once and -#' shared by the species' regions. +#' Writes a shard store per region. Province-wide draws and +#' stage fits are made once and shared by the regions. #' #' @param species Character. #' @param p A prepare_spec() result. @@ -606,9 +556,8 @@ fit_species <- function(species, p) { ) } - # Step 1: The province-wide frame and draws, when the spec has - # province scope. A species whose draws cannot be made is - # logged and skipped, not fatal. + # Step 1: Province-wide frame and draws, if any. A species + # whose draws cannot be made is logged and skipped. province <- NULL province_fits <- list() @@ -645,15 +594,13 @@ fit_species <- function(species, p) { weight_column = region$weight_column ) - # A spec may attach per-species columns, and drop rows, - # before fitting: the mammal precomputed climate. + # Per-species columns (e.g. mammal precomputed climate) if (is.function(spec$species_frame)) { frame <- spec$species_frame(frame, species, p$data_dir, spec) } - # Step 2: The draws. Province-wide ones are shared by every - # region and filtered to the region's units when fitted, which - # is how v2 subsets its draws. + # Step 2: The draws. Province-wide draws are filtered to the + # region's units when fitted, as v2 subsets them. draws <- if (!is.null(province$draws)) { province$draws } else { @@ -696,8 +643,6 @@ fit_species <- function(species, p) { store = shard, species = species, region = region$name, boot = boot, grid = region$grid, metrics = p$metrics, fixed = fixed, - # The province-wide frame, for validation that scores - # climate over every unit validation_frame = province$frame ) }) @@ -762,8 +707,7 @@ run_stage <- function( models <- get_model_set(stage$models) response <- spec$response_name %||% "response" - # A staged rule takes groups of formulas; the others take a - # flat list. Both arrive here as text and become formulas now. + # Text to formulas; staged rules take groups as_formulas <- function(x) { if (is.list(x)) { return(lapply(x, as_formulas)) @@ -772,23 +716,16 @@ run_stage <- function( lapply(x, stats::as.formula) } - # The offset goes in the formula, not in an argument. An offset - # supplied as an argument is not carried by predict() onto new - # data: R silently recycles the fitted offset against the new - # rows, which for birds would make every prediction outside the - # draw wrong. v2 writes `offset(offset)` for the same reason. - # - # A stage may start every candidate from terms of its own. v2's - # bird landcover selection starts from `count ~ climate`, so - # each group updates a model that already carries the climate - # stage. + # The offset goes in the formula: an offset argument is not + # applied by predict() to new data (R recycles the fitted one). + # `base_terms` start every candidate from given terms, as v2's + # bird landcover selection starts from `count ~ climate`. base <- stats::as.formula(paste( response, "~", paste(c("1", stage$base_terms), collapse = " + "), if (is.null(offset)) "" else "+ offset(offset)" )) - # Every stage field the rule declares as an argument is passed - # to it by name, so a new rule's settings need no change here. + # Stage fields the rule declares are passed by name rule <- if (is.function(stage$selection)) { stage$selection } else { @@ -821,8 +758,7 @@ run_stage <- function( control = stage$control %||% list() ), settings, - # Supplied by the harness rather than the stage, and passed - # only to a rule that declares them + # Harness-supplied, only to rules that declare them list( grid = grid, species = species, @@ -840,8 +776,7 @@ run_stage <- function( #' Prepare One Stage's Data and Fit It #' -#' Shared by the per-region loop and by stages fitted once for -#' the whole province, so both prepare a stage the same way. +#' Shared by region-scope and province-scope stages. #' #' @param stage A stage definition. #' @param fitting The draw's rows, with any carried stage added. @@ -862,8 +797,7 @@ fit_one_stage <- function(stage, fitting, spec, grid = NULL, response_name <- spec$response_name %||% "response" stage_data <- fitting - # A stage may read the response differently from the spec's - # default; recomputed from the retained raw values. + # Stage-specific response transform, from the raw values raw_name <- paste0(response_name, "_raw") if (!is.null(stage$response_transform) && @@ -873,9 +807,8 @@ fit_one_stage <- function(stage, fitting, spec, grid = NULL, ) } - # A stage may fit on a subset: the mammal abundance half is - # estimated from the units where the species was seen, because - # abundance given presence is not defined where there was none. + # Row subset, e.g. the mammal abundance half fits only units + # where the species was seen if (!is.null(stage$row_filter)) { keep <- stage$row_filter(stage_data) keep[is.na(keep)] <- FALSE @@ -886,8 +819,8 @@ fit_one_stage <- function(stage, fitting, spec, grid = NULL, } } - # v2 skips a plant habitat model outright when the draw, after - # the region filter, holds fewer than 20 detections. + # v2 skips a plant habitat model with fewer than 20 + # detections in the filtered draw if (!is.null(stage$min_detections)) { detections <- sum(stage_data[[response_name]] > 0, na.rm = TRUE) @@ -920,12 +853,9 @@ fit_one_stage <- function(stage, fitting, spec, grid = NULL, return(failed("stage_failed")) } - # A stage may reshape its result after selection with steps its - # spec supplies, applied in order: the plant stand-age splines, - # cutblock convergence and footprint pooling. Each takes and - # returns the selection result, and sees the stage's data. A - # step that declares `grid`, `species` or `stage` is given them, - # as a rule is: the mammal v2 tables read all three. + # Spec-supplied post-processing, in order (e.g. plant stand-age + # splines, cutblock convergence, footprint pooling). Steps that + # declare `grid`, `species` or `stage` are given them. for (step in stage$post_process) { context <- list(grid = grid, species = species, stage = stage) context <- context[names(context) %in% names(formals(step))] @@ -939,12 +869,10 @@ fit_one_stage <- function(stage, fitting, spec, grid = NULL, #' The Value a Stage Hands the Next One #' -#' Computed from the stage's final model, not from its best -#' single candidate: the averaging is the point of the stage. -#' Where the stage has coefficients that is the averaged -#' coefficients applied to the data, exactly as v2 computes it; -#' an engine without coefficients carries its final model's -#' prediction instead. +#' From the stage's final (averaged) model, not its best +#' candidate: averaged coefficients applied to the data, as v2 +#' does, or the final model's prediction for engines without +#' coefficients. #' #' @param selected A selection result. #' @param data The rows to compute it for. @@ -986,9 +914,8 @@ carry_values <- function(selected, data, stage) { #' @param spec A taxon spec, with the region's stages. #' @param frame The full one-species frame for the region. #' @param draw Character vector of survey unit ids in the draw. -#' Ids not in the frame are dropped, so a province-wide draw -#' passed to one region keeps only that region's units, with -#' their repeats, as v2 filters its draws. +#' Ids not in the frame are dropped (repeats kept), as v2 +#' filters province-wide draws per region. #' @param store A result_store(). #' @param species,region Character. #' @param boot Integer. @@ -997,8 +924,7 @@ carry_values <- function(selected, data, stage) { #' @param fixed Named list of fit_one_stage() results for stages #' already fitted at province scope, or NULL. #' @param validation_frame The province-wide frame, or NULL; -#' passed to the spec's `validate` function, which scores -#' climate over every unit. +#' passed to the spec's `validate` function. #' @return A one-row data frame recording the outcome. #' #' @example # Example usage of the function @@ -1033,16 +959,14 @@ run_one_draw <- function( stage_coefficients <- list() for (stage in spec$stages) { - # A stage that carries the previous one forward gets it as - # a column, which is how v2's habitat models take Climate + # Carried stage as a column (v2's `Climate` term) if (!is.null(stage$carry_from) && !is.null(carried)) { column <- stage$carry_from_as %||% "Climate" fitting[[column]] <- carried$fitting frame[[column]] <- carried$full } - # A province-scope stage was fitted once for the species - # and draw, and is shared by every region. + # Province-scope stages were fitted once per draw fitted <- if (stage$name %in% names(fixed)) { fixed[[stage$name]] } else { @@ -1062,11 +986,9 @@ run_one_draw <- function( ) } - # Every stage's coefficients are kept, not only the last, - # so each stage can be compared against its own v2 - # reference. A rule with several outputs - the mammal - # hurdle's presence, abundance and total tables - writes - # each as its own stage, `_`. + # Every stage's coefficients are kept, for per-stage v2 + # comparison. Multi-output rules (the mammal hurdle) write + # `_`. if (!is.null(selected$outputs)) { for (output in names(selected$outputs)) { key <- paste(stage$name, output, sep = "_") @@ -1093,8 +1015,8 @@ run_one_draw <- function( frame <- result$frame - # Step 2: The final model's prediction at every unit. A spec - # may state its own final model, as the plant specs state v2's. + # Step 2: The final model's prediction at every unit (or the + # spec's `final_prediction`, as the plant specs give v2's) predicted <- tryCatch( if (is.function(spec$final_prediction)) { spec$final_prediction(result$stage_coefficients, frame) @@ -1108,8 +1030,7 @@ run_one_draw <- function( return(outcome("predict_failed", result$stage$name)) } - # Written only once the whole draw succeeded, so a store never - # holds half a draw + # Written only once the whole draw succeeded for (stage_name in names(result$stage_coefficients)) { write_coefficients( store, species, region, boot, @@ -1125,10 +1046,8 @@ run_one_draw <- function( predicted, frame[[response_name]], in_bag = in_bag ) - # Step 3: Score twice: on the units the draw fitted (in-sample) - # and on the units it left out (out-of-bag), the held-out read. - # Iteration 1 is the full data and has no out-of-bag units, so - # its out-of-bag metrics are NA. + # Step 3: Score in-sample and out-of-bag. A full-data draw + # (bootstrap iteration 1) has no out-of-bag units, so NA. scored <- function(keep, prefix) { out <- compute_metrics( frame[[response_name]][keep], predicted[keep], metrics @@ -1142,8 +1061,7 @@ run_one_draw <- function( scored(!in_bag, "oob_") ) - # A spec may add its own validation: the plant specs add v2's - # seven validation AUCs, in-bag and out-of-bag. + # Spec validation, e.g. the plant specs' v2 validation AUCs if (is.function(spec$validate)) { extra <- tryCatch( spec$validate( @@ -1158,8 +1076,7 @@ run_one_draw <- function( write_metrics(store, species, region, boot, metric_rows) - # Step 4: Project the final model onto the prediction grid, the - # quantity that makes engines comparable + # Step 4: Project the final model onto the prediction grid if (!is.null(grid)) { grid_prediction <- predict_grid( result$selected, grid, @@ -1186,9 +1103,8 @@ run_one_draw <- function( #' Join a Spec's Shards into One Store per Region #' -#' Shards are joined in the region's queue order, so each store -#' holds its rows in the order a serial run writes them. The -#' store's meta.json is written here, and the shards removed. +#' Joins shards in queue order (matching a serial run), writes +#' meta.json, and removes the shards. #' #' @param p A prepare_spec() result. #' @return NULL, invisibly. @@ -1232,9 +1148,7 @@ run_meta <- function(p, region) { list( taxon = spec$taxon, region = region$name, - # Mammal specs are fitted per season, as a hurdle, and the - # comparison needs both to find the right reference. NA for - # every other taxon. + # Mammals only: needed to find the right v2 reference season = spec$season %||% NA_character_, part = if (any(vapply( stages, function(s) identical(s$selection, "hurdle"), logical(1) diff --git a/1_code/harness/run_record.R b/1_code/harness/run_record.R index bc16dcb..33d53f7 100644 --- a/1_code/harness/run_record.R +++ b/1_code/harness/run_record.R @@ -8,42 +8,14 @@ # outputs: # - one Markdown or plain-text file per run # notes: -# - The result stores are large and gitignored. This writes the -# one committed artefact of a run: what it was configured to -# do, what it produced, and what it scored. When the stores -# are gone, this is what is left. -# - The format is built to be diffed. Two runs of the same -# configuration should produce byte-identical bodies, so any -# difference in a diff is a real difference in the run. -# Three things follow from that and are not style choices: -# -# 1. Everything that changes between identical runs - the -# timestamp, the host, the elapsed time - is confined to -# one Provenance section at the top, and can be dropped -# with `provenance = FALSE`. Interleaved, it would make -# every diff non-empty and therefore useless. -# 2. Numbers are formatted to a fixed number of decimals. -# Unformatted doubles differ in the last place between -# runs that agree, which reads as a difference. -# 3. Rows and columns are ordered deterministically, and a -# missing value is written as "-" rather than dropped, so -# tables stay aligned and a diff points at the value that -# changed rather than at a row that moved. -# - What the format guarantees is that identical results -# render identically. It cannot make an unseeded run -# reproduce: with `seed = NULL` (v2's behaviour) two runs of -# the same configuration draw different bootstrap samples -# and their Metrics sections genuinely differ. With a seed - -# the default - and with the birds' stored draws, every -# section is exact. -# - File sizes are deliberately not recorded. They vary by a -# few bytes between runs that agree, which is noise in a -# document whose purpose is comparison. Row counts carry the -# same information and are stable. -# - "Record" rather than "manifest": a manifest is an inventory -# of contents, and this leads with results. The inventory is -# one section of it. See the repository discussion in -# docs/framework_design.md. +# - The committed record of a run (configuration, coverage, +# metrics); the result stores themselves are gitignored. +# - Built to diff: identical results render byte-identically. +# Volatile fields sit only in the Provenance section +# (`provenance = FALSE` drops it), numbers use fixed decimals, +# rows are ordered deterministically, and missing values are +# "-". An unseeded run (`seed = NULL`) still differs between +# runs. # --- # 1. Setup ---- @@ -71,11 +43,8 @@ fmt_value <- function(x, digits = 4L) { return("-") } - # Decided by type rather than by value. Choosing the number - # of decimals from whether the values happen to be whole - # would let the same column render as "1" in one run and - # "1.0000" in the next, which is a formatting change showing - # up as a result change. + # Format by type, not value, so a column never flips between + # "1" and "1.0000" across runs if (is.integer(x)) { out <- formatC(x, format = "d") out[is.na(x)] <- "-" @@ -102,9 +71,8 @@ fmt_value <- function(x, digits = 4L) { #' Render a Data Frame as a Markdown Table #' -#' @param df A data frame. Zero rows yields a stated absence -#' rather than an empty table, so the section still appears -#' and the diff shows what changed. +#' @param df A data frame. Zero rows renders as "_None._" so the +#' section still appears in a diff. #' @param digits Integer. Decimal places for numeric columns. #' @return A character vector of lines. #' @@ -189,13 +157,10 @@ kv_lines <- function(values, digits = 4L) { #' taxa, species count, draws, engines, selection rules. #' Rendered sorted by name. #' @param provenance Logical. Include the volatile section. -#' FALSE gives a body that is byte-identical between two runs -#' of the same configuration, which is what makes a diff -#' between experiments readable. +#' FALSE gives a body byte-identical across identical runs. #' @param digits Integer. Decimal places for every number. -#' @param collected The result of collect_results() for this -#' pipeline directory, or NULL to read the stores here. Passing -#' it saves reading every store a second time. +#' @param collected collect_results() output for this pipeline +#' directory, or NULL to read the stores here. #' @return The path written, invisibly. #' #' @example # Example usage of the function @@ -227,8 +192,6 @@ run_record <- function( ) ## 3.1 Provenance ---- - # Everything that differs between two identical runs lives - # here and nowhere else, so the rest of the file diffs clean. if (provenance) { commit <- tryCatch( system2("git", c("rev-parse", "--short", "HEAD"), @@ -263,8 +226,7 @@ run_record <- function( ) ## 3.3 Coverage and artefacts ---- - # The inventory. Row counts rather than file sizes: both say - # what was produced, only one is stable between runs. + # Row counts, not file sizes: sizes vary between identical runs coverage <- collected$store_rows if (!is.null(coverage)) { @@ -283,8 +245,7 @@ run_record <- function( ) ## 3.4 Metrics ---- - # One row per run, region and metric, pooled over species and - # draws, ordered so that two records line up row for row. + # Pooled over species and draws metric_summary <- NULL if (!is.null(collected$metrics) && nrow(collected$metrics) > 0) { @@ -310,11 +271,8 @@ run_record <- function( ) ## 3.5 Write ---- - # A .txt record drops the table pipes rather than the tables, - # so the same content survives in a plain-text reader. if (grepl("[.]txt$", out_file, ignore.case = TRUE)) { - # Dividers go first: once the pipes are gone the line is - # no longer recognisable as a divider. + # Drop dividers before the pipes, while still recognizable lines <- lines[!grepl("^[|] --- ([|] --- )*[|]$", lines)] lines <- gsub("^[|] | [|]$", "", lines) lines <- gsub(" [|] ", " ", lines) diff --git a/1_code/harness/selection.R b/1_code/harness/selection.R index 0c9b3b3..a211056 100644 --- a/1_code/harness/selection.R +++ b/1_code/harness/selection.R @@ -5,20 +5,12 @@ # inputs: none # outputs: none; defines functions in memory # notes: -# - A selection rule turns a candidate model set into one result: -# coefficients, a fit, and a predictor for the final model. The -# rules themselves live in 1_code/methods/selection/, one file -# each; this file holds what every rule shares. -# - A rule fits its own candidates rather than being handed -# fitted objects, because staged selection has to refit as it -# goes: each stage updates the previous stage's winner. One -# interface then covers both shapes. -# - Every rule returns selection_result(), so the fitting loop -# and the result writer do not know which rule ran. -# - Candidates are fitted through fit_with() (engines.R), which -# computes a fit's coefficients once and keeps them on it. -# Rules read `fit$coefficients` rather than recomputing them, -# which matters for bayesglm, where summary() is slow. +# - Shared plumbing for the rules in 1_code/methods/selection/. +# Every rule returns selection_result(), so callers need not +# know which rule ran. +# - Rules fit their own candidates rather than receiving fits, +# because staged selection refits each stage on the previous +# stage's winner. # --- # 1. Setup ---- @@ -30,8 +22,6 @@ #' Run One Selection Rule #' -#' The single entry point the fitting loop calls. -#' #' @param rule Character, a registered rule name, or a function a #' spec supplies with the same arguments. #' @param models A list of formulas, or for staged rules a list @@ -45,9 +35,8 @@ #' @param weights,offset Numeric vectors or NULL. #' @param ic Character. "AIC", "AICc" or "BIC". #' @param control Named list passed to the engine. -#' @param ... Further arguments. Only those the rule declares are -#' passed, so a stage can carry settings for one rule without -#' another failing on them. +#' @param ... Further arguments; only those the rule declares are +#' passed on. #' @return A selection result; see selection_result(). `rule` is #' set to the rule's name, and `predict` to a predictor for the #' final model when the rule did not supply one. @@ -68,9 +57,8 @@ selection_run <- function( control = list(), ... ) { - # A rule is a registered name, or a function a spec supplies - # for a model the registry has no shape for: the v2 mammal - # hurdle is one. + # A function rule covers shapes the registry lacks (e.g. the v2 + # mammal hurdle) if (is.function(rule)) { rule_fn <- rule rule_name <- "custom" @@ -154,8 +142,8 @@ fit_candidates <- function( #' Apply a Candidate to a Base Formula #' -#' A candidate may be a complete formula or an update such as -#' `. ~ . + MAP`. Both forms appear in the v2 model sets. +#' v2 model sets mix complete formulas and updates such as +#' `. ~ . + MAP`. #' #' @param model A formula. #' @param base A formula to update. @@ -164,8 +152,7 @@ fit_candidates <- function( #' @example # Example usage of the function #' # resolve_formula(. ~ . + MAP, response ~ 1) resolve_formula <- function(model, base) { - # A one-sided candidate, or one whose left side is a dot, is an - # update; anything else is complete in itself. + # One-sided or dot-left candidates are updates left <- if (length(model) == 3) deparse(model[[2]]) else "." if (left == ".") { @@ -179,10 +166,9 @@ resolve_formula <- function(model, base) { #' The Data Columns a Formula Reads #' -#' Read from the formula rather than from a fitted object, so it -#' works for any engine. The response and the harness-supplied -#' offset and weight are left out: a prediction frame never has -#' to supply them as data. +#' Read from the formula, not a fit, so it works for any engine. +#' Excludes response, offset and weight, which a prediction frame +#' never supplies as data. #' #' @param formula A formula, or formula text. #' @return A character vector of column names. @@ -234,8 +220,7 @@ candidate_table <- function(fitted, names_in = NULL) { best <- suppressWarnings(min(scores, na.rm = TRUE)) delta <- scores - best - # Akaike weights. A failed model scores Inf, so exp(-Inf/2) is - # zero and it carries no weight. + # Akaike weights; a failed model scores Inf and gets weight 0 raw <- exp(-delta / 2) raw[!is.finite(raw)] <- 0 total <- sum(raw) @@ -278,9 +263,8 @@ family_linkinv <- function(family) { #' A Predictor That Averages Several Fits on the Link Scale #' -#' What a rule that combines candidates returns as `predict`, so -#' the final model scored and projected onto a grid is the -#' combined one, not the best single candidate. +#' Returned as `predict` by combining rules, so scoring and grid +#' projection use the combined model, not the best candidate. #' #' @param fits List of engine fits. #' @param engine An engine definition. @@ -314,9 +298,8 @@ combined_predictor <- function(fits, engine, family, weights = NULL) { engine$predict(f, newdata, "link", se = TRUE) }) - # Precision weights renormalize by construction, so a - # candidate that cannot predict is left out, as v2 leaves - # out a failed fit + # Precision weights renormalize, so a candidate that cannot + # predict is dropped, as v2 drops a failed fit predictions <- predictions[ !vapply(predictions, is.null, logical(1)) ] diff --git a/1_code/harness/spec.R b/1_code/harness/spec.R index 663fb7b..9f4ba9c 100644 --- a/1_code/harness/spec.R +++ b/1_code/harness/spec.R @@ -5,21 +5,13 @@ # inputs: none # outputs: none; defines functions in memory # notes: -# - A spec is a list that states one taxon's configuration as -# data: response, family, regions, stages, resampling. It holds -# no modelling code; every method it names is looked up in the -# registry (registry.R). The fields are documented in -# docs/getting_started.md. -# - validate_spec() checks a spec before any data is read, and -# reports every problem at once in plain language: a misspelt -# field, an engine or rule that is not registered, a rule that -# needs a capability the engine lacks. Without it those surface -# as a failed species hours into a run, or not at all. -# - Unknown fields are errors rather than warnings, because a -# misspelt field is silently ignored by everything downstream. -# A field a selection rule or resampler declares as an -# argument is known, so a new method's settings need no -# change here. +# - A spec states one taxon's configuration as data; methods it +# names are looked up in the registry. Fields are documented +# in docs/getting_started.md. +# - validate_spec() reports every problem at once, before any +# data is read. Unknown fields are errors, because a misspelt +# field is otherwise silently ignored; arguments of the named +# rule or resampler count as known fields. # --- # 1. Setup ---- @@ -33,10 +25,8 @@ #' The Fields a Spec, Region or Stage May Carry #' -#' Each entry is what the harness itself reads. Settings for a -#' particular selection rule or resampling scheme are known -#' through that method's arguments instead, so they are not -#' listed. +#' Fields the harness itself reads; method-specific settings are +#' known through the method's arguments. #' #' @return A named list of character vectors: `spec`, `region`, #' `stage` and `resample`. @@ -219,9 +209,8 @@ validate_spec <- function(spec, stop_on_error = TRUE) { problem(where, ": `ic` must be \"AIC\", \"AICc\" or \"BIC\".") } - # A carried column may instead be attached per species, as - # the mammal precomputed climate is, through - # `supplied_columns`; then no earlier stage is needed. + # Or the carried column is attached per species via + # `supplied_columns` (mammal precomputed climate) carried_column <- stage$carry_from_as %||% "Climate" if (!is.null(stage$carry_from) && @@ -296,9 +285,8 @@ validate_spec <- function(spec, stop_on_error = TRUE) { #' Check a Stage's Models Name Something Real #' -#' A single string that is neither a registered set nor a -#' formula is almost always a misspelt set name. Without this it -#' would be fitted as a one-formula candidate and fail later. +#' A lone string that is neither a set nor a formula is almost +#' always a misspelt set name. #' #' @param models A set name, or formulas as text. #' @param where Character. Prefix for the message. @@ -330,10 +318,9 @@ check_model_set <- function(models, where) { #' Read the Covariates a Spec's Model Sets Name #' -#' Taken from the formulas rather than declared separately, so a -#' spec cannot name a term it forgot to load. Terms the harness -#' supplies itself - the response, the offset, and any stage -#' carried forward - are excluded. +#' Read from the formulas, so a spec cannot name a term it forgot +#' to load. Excludes harness-supplied terms (response, offset, +#' weight, carried stages, `supplied_columns`). #' #' @param spec A taxon spec. #' @param stage_names Character vector of stages to read, or NULL @@ -355,14 +342,10 @@ spec_covariates <- function(spec, stage_names = NULL) { spec$response_name %||% "response", "offset", "weight", vapply(spec$stages, function(s) s$carry_as %||% "", character(1)), - # Columns a spec attaches per species rather than reads from - # the dataset: the mammal precomputed Climate. spec$supplied_columns ) terms <- unlist(lapply(stages, function(stage) { - # A staged set is a list of groups; flatten before reading - # terms off the formulas. models <- unlist(get_model_set(stage$models), use.names = FALSE) unlist(lapply(models, function(one) { @@ -372,11 +355,10 @@ spec_covariates <- function(spec, stage_names = NULL) { covariates <- setdiff(unique(terms), c(supplied, ".")) - # A stage may need columns no formula names: the plant age - # splines read the aged stand-cover columns. + # Columns no formula names, e.g. the plant age splines' aged + # stand-cover columns extra <- unlist(lapply(stages, `[[`, "extra_covariates")) - # The weight is a covariate too, and is loaded with the rest unique(c(covariates, extra, spec$weight_column)) } @@ -384,15 +366,10 @@ spec_covariates <- function(spec, stage_names = NULL) { #' Swap a Spec's Candidate Sets for an Experiment's Own #' -#' Lets an experiment define the models a stage fits without -#' editing the taxon spec, which keeps the spec as the record of -#' what v2 did and the experiment as the record of what was -#' changed. -#' -#' Entries are named `taxon.stage`, or `stage` to apply to every -#' taxon. Each value is either a name in model_sets() or a -#' character vector of formulas, so an experiment can hand over a -#' set built by extend_models() or models_from_covariates(). +#' Keeps the spec as the record of v2 and the experiment as the +#' record of what changed. Entries are named `taxon.stage`, or +#' `stage` for every taxon; values are a model_sets() name or +#' formulas. #' #' \preformatted{ #' stage_models <- list( @@ -421,8 +398,7 @@ apply_stage_models <- function(spec, stage_models) { for (i in seq_along(spec$stages)) { stage <- spec$stages[[i]] - # The taxon-specific key wins over the bare stage name, so a - # run can set a default and then override one taxon. + # `taxon.stage` wins over a bare `stage` keys <- c(paste(spec$taxon, stage$name, sep = "."), stage$name) hit <- keys[keys %in% names(stage_models)][1] @@ -434,9 +410,7 @@ apply_stage_models <- function(spec, stage_models) { changed <- c(changed, paste0(stage$name, " <- ", hit)) } - # Recorded so meta.json shows a run that did not fit the v2 - # candidate sets, which otherwise looks identical to one that - # did. + # Recorded in meta.json; otherwise indistinguishable from v2 spec$models_overridden <- if (length(changed) > 0) { changed } else { @@ -450,36 +424,17 @@ apply_stage_models <- function(spec, stage_models) { #' Fit One Stage of a v2 Spec with a Different Method #' -#' The lever for a methods experiment: the rest of the spec stays -#' v2's, so a difference in the result is the method's. Sets the -#' stage's engine, selection rule and settings, and gives it one -#' formula holding every covariate its v2 candidates use (see -#' models_union()), per region where the region supplies the -#' models. -#' -#' The stage defaults to the spec's `habitat_stage`, so one call -#' serves every taxon: -#' `lapply(standard_specs(), replace_stage_method, engine = "x")`. -#' -#' A stage whose rule is composite - it declares -#' `part_selection`, as the mammal `hurdle` does - keeps its rule, -#' and the new rule becomes the one each part runs. The hurdle's -#' structure (presence, then abundance given presence) is a -#' property of the data, not of the method, so it stays. -#' -#' Removed, because they read v2 coefficient tables a different -#' engine may not produce: -#' -#' - the stage's `post_process` steps (the plant stand-age -#' splines, cutblock convergence, pAspen and footprint pooling; -#' the mammal v2 habitat tables); -#' - stage fields only the old rule took (`head_terms`, say); -#' - when the stage is the last, the spec's `final_prediction` and -#' `validate` (v2's plant prediction and validation AUCs), so the -#' harness scores the new method's own prediction. +#' The rest of the spec stays v2's, so a difference in results is +#' the method's. By default the candidates become one formula of +#' all their covariates (models_union()). A composite rule (e.g. +#' the mammal `hurdle`) keeps its structure and runs the new rule +#' in each part. #' -#' The stage's `v2_coverage` and the run's `models_overridden` -#' record the change. +#' Removes what reads v2 coefficient tables a new engine may not +#' produce: the stage's `post_process`, fields only the old rule +#' took, and (for the last stage) `final_prediction` and +#' `validate`. The change is recorded in `v2_coverage` and +#' `models_overridden`. #' #' @param spec A taxon spec. #' @param stage Character. The stage's name; the spec's @@ -600,9 +555,8 @@ replace_stage_method <- function( #' State How Much of One v2 Stage a Spec Reproduces #' -#' The entries of a spec's `v2_coverage`. The status vocabulary -#' is fixed, so a typo fails when the spec is built rather than -#' reading as a fourth category in the report. +#' The status vocabulary is fixed, so a typo fails when the spec +#' is built. #' #' @param status Character. "reproduced", "partial" or #' "not reproduced". @@ -635,9 +589,6 @@ v2_status <- function(status, note) { #' Tabulate What a Set of Specs Reproduces of v2 #' -#' Flattens each spec's `v2_coverage` into one table, which is -#' what the report prints. Coverage is stated once, in the specs, -#' and read from there. #' #' @param specs A named list of specs. #' @return A data frame of taxon, stage, status and note. diff --git a/1_code/harness/species.R b/1_code/harness/species.R index 2862f00..3d8c898 100644 --- a/1_code/harness/species.R +++ b/1_code/harness/species.R @@ -7,22 +7,11 @@ # - species_queue.csv, from _setup/09_harmonize_lookups.R # outputs: none; returns objects in memory # notes: -# - One species queue for every taxon, in one schema: taxon, -# region, season, tier, species, order and source_name. The -# three taxon leads' lookups are flattened into it once, by -# _setup/09, so an experiment asks for species the same way -# whatever the taxon. -# - `tier` separates a taxon's model classes where it has them - -# mammals fit a full habitat model for species with at least -# 20 detections and a use-availability model for those with -# at least 3 - and is "modelled" elsewhere. `season` is empty -# for everything but mammals. -# - `order` preserves each source list's own ordering, so a -# narrowed run visits species in the order v2 would have. -# - resolve_species() is the entry point an experiment uses to -# pick focal species. Passing NULL takes every modelled -# species; passing a vector takes those, and an unknown name -# stops the run before any fitting rather than after. +# - One queue for every taxon, flattened from the taxon leads' +# lookups by _setup/09. `tier` separates model classes where a +# taxon has them (mammals) and is "modelled" elsewhere; +# `season` is empty except for mammals; `order` keeps v2's +# species order. # --- # 1. Setup ---- @@ -80,16 +69,13 @@ species_catalogue <- function(data_dir, taxon = NULL) { #' List the Species Available for a Taxon #' -#' What an experiment reads to decide which focal species to run. -#' #' @param data_dir Character. The test dataset folder. #' @param taxon Character. Taxon slug. #' @param region Character. Restrict to one region, or NULL. #' @param tier Character. Restrict to one model tier, or NULL. #' @param season Character. Restrict to one season, or NULL. -#' Only mammals have seasons, and a mammal spec is fitted for -#' one; without this, a summer spec would also queue the -#' `_Winter` species and fit them with summer weights. +#' Mammal specs must pass it, or a summer spec would also queue +#' the `_Winter` species and fit them with summer weights. #' @return A character vector of species names, in source order. #' #' @example # Example usage of the function @@ -155,10 +141,8 @@ species_source_name <- function(data_dir, taxon, species) { #' Choose the Focal Species for a Run #' -#' NULL means every species the queue declares as modelled. A -#' character vector means those species, and an unknown name -#' stops the run here rather than failing inside a bootstrap -#' hours later. +#' NULL means every modelled species. An unknown name stops the +#' run here rather than hours later inside a bootstrap. #' #' @param species Character vector of species, or NULL for all. #' @param data_dir Character. The test dataset folder. @@ -203,8 +187,7 @@ resolve_species <- function( ) } - # Intersecting rather than reordering keeps the source order, - # so a narrowed run visits species in the sequence v2 would. + # Keeps source (v2) order rather than the caller's intersect(available, species) } @@ -212,10 +195,9 @@ resolve_species <- function( #' Read a Named Vector's Entries for One Taxon #' -#' The convention an experiment uses to select species and -#' covariates: a named character vector whose names are taxa. -#' Names may repeat, so several entries can apply to the same -#' taxon, and an unnamed entry applies to every taxon. +#' Experiments select species and covariates with a character +#' vector named by taxon. Names may repeat; unnamed entries apply +#' to every taxon. #' #' \preformatted{ #' species <- c( @@ -228,9 +210,7 @@ resolve_species <- function( #' @param x A named character vector, or NULL. #' @param taxon Character. The taxon to read. #' @return A character vector of the entries that apply, or NULL -#' when none do. NULL means "no selection", which callers read -#' as "everything", so an empty result is never an empty -#' selection. +#' when none do. Callers read NULL as "everything". #' #' @example # Example usage of the function #' # taxon_values(c(lichen = "a", mite = "b"), "lichen") diff --git a/1_code/harness/summarise.R b/1_code/harness/summarise.R index 05818ac..f87882e 100644 --- a/1_code/harness/summarise.R +++ b/1_code/harness/summarise.R @@ -13,30 +13,15 @@ # (small; committed) # - coefficient_summary.csv (large; gitignored) # notes: -# - Reduces the per-draw result stores to per-species summaries, -# which is what every experiment compares. The same for any -# experiment, so it lives in the harness: an experiment's own -# scripts start from these tables. -# - Draws are summarized by median and the 10th and 90th -# percentiles, which is what comparisons read. A -# coefficient's distribution over draws is routinely skewed, -# and a rare species can produce an extreme draw that would -# drag a mean somewhere no draw actually is. The mean and -# standard deviation are added to every summary for readers -# and tools that expect them. -# - `boot1` is the iteration-1 value, the full-data fit. It is -# the like-for-like quantity where a reference fits once -# rather than bootstrapping, as the v2 mammal models do. -# - `run` is the folder a store sits in, which run.R names; the -# taxon, season and part come from the store's meta.json, so -# the two mammal season runs share the taxon "mammal". -# - A taxon whose coefficients need translating before they can -# be compared (birds, onto v2's habitat template) is handled -# by a function the experiment passes in `translate`, so the -# harness stays taxon-agnostic. -# - Each store is read once. The row counts and pooled metrics -# the run record needs are kept from that read and handed to -# run_record(), rather than read again. +# - Reduces per-draw result stores to the per-species summaries +# experiments compare. `boot1` is the full-data fit, the +# like-for-like value where a reference fits once (v2 +# mammals). +# - `run` is the store's folder; taxon, season and part come +# from meta.json, so both mammal season runs share "mammal". +# - Taxa whose coefficients need translating (birds, onto v2's +# habitat template) pass a function in `translate`, keeping +# the harness taxon-agnostic. # --- # 1. Setup ---- @@ -75,9 +60,7 @@ find_stores <- function(pipeline_dir) { rows <- lapply(dirs, function(dir) { meta <- store_meta(dir) - # The run is read off the folder; the rest from meta.json, - # rather than parsed out of a path that may not use forward - # slashes. + # Only the run comes from the path; the rest from meta.json data.frame( dir = dir, run = basename(dirname(dir)), @@ -168,11 +151,9 @@ summarise_draws <- function(rows, value, keys) { #' Summarize One Value over Its Draws #' -#' The median and 10-90% band are the summary every comparison -#' reads, because a distribution over draws is often skewed. The -#' mean and standard deviation are there for readers and tools -#' that expect them; with a skewed distribution they describe it -#' less well. +#' Comparisons read the median and 10-90% band because draw +#' distributions are often skewed; mean and sd are added for +#' tools that expect them. #' #' @param x Numeric vector, one value per draw. #' @param boot Integer vector of the draw each value came from. diff --git a/1_code/methods/engines/_glm_family.R b/1_code/methods/engines/_glm_family.R index 719b4b1..1f054e1 100644 --- a/1_code/methods/engines/_glm_family.R +++ b/1_code/methods/engines/_glm_family.R @@ -5,16 +5,10 @@ # inputs: none # outputs: none; defines functions in memory # notes: -# - glm and bayesglm take the same arguments and return objects -# of the same shape, so fitting, coefficients, prediction and -# scoring are written once here and both engines point at -# them. A new engine with a different shape writes its own. -# - The leading underscore makes the loader source this before -# the engine files that use it. -# - Fitting failures are caught and returned, not raised. A -# candidate model set is expected to contain models that -# cannot be estimated for a given species and bootstrap, and -# the selection rule needs to see which ones failed. +# - Shared by glm and bayesglm, which take and return the same +# shapes. The leading underscore makes it load first. +# - Fitting failures are returned, not raised, so selection +# rules can see which candidates failed. # --- # 1. Setup ---- @@ -51,9 +45,9 @@ fit_glm_family <- function( control ) - # Weights and offsets are passed as values rather than named in - # the formula, so the same formula serves a taxon that has them - # and one that does not. + # Passed as values so one formula serves taxa with and without + # weights. The harness passes offset = NULL and puts offsets in + # the formula instead (see run_stage()). if (!is.null(weights)) { args$weights <- weights } @@ -62,10 +56,9 @@ fit_glm_family <- function( args$offset <- offset } - # A Gamma fit starts at the mean response unless told otherwise. - # The default start, y itself, spans orders of magnitude for a - # right-skewed density and sends the fitting off; v2's mammal - # abundance models start at the mean for that reason. + # Gamma fits start at the mean response, as v2's mammal + # abundance models do: starting at y diverges for skewed + # densities family_name <- if (is.character(family)) family else family$family starts <- c("mustart", "start", "etastart") @@ -75,11 +68,8 @@ fit_glm_family <- function( args$mustart <- rep(mean(y, na.rm = TRUE), nrow(data)) } - # A convergence warning still leaves a usable fit, so it is - # recorded rather than treated as a failure. It is caught with - # withCallingHandlers() and muffled, so the model is fitted - # once; catching it with tryCatch() would abandon the fit and - # force a second one. + # Warnings (e.g. non-convergence) are recorded, not failures; + # muffled rather than caught so the model is fitted once warnings_seen <- character(0) tryCatch( @@ -179,9 +169,8 @@ fit_predict <- function(fit, newdata, type = "link", se = FALSE) { #' Score a Fit for Model Selection #' -#' AICc rather than AIC by default, because the candidate sets -#' are large relative to the number of survey units a rare -#' species is detected at. +#' AICc by default: candidate sets are large relative to a rare +#' species' detections. #' #' @param fit A list from fit_glm_family(). #' @param type Character. "AIC", "AICc" or "BIC". @@ -201,15 +190,11 @@ information_criterion <- function(fit, type = "AICc") { AIC = stats::AIC(fit$fit), BIC = stats::BIC(fit$fit), AICc = { - # The parameter count is the log-likelihood's degrees of - # freedom, as MuMIn uses, not the length of the - # coefficient vector, which also counts aliased (NA) - # terms and so over-penalizes a rank-deficient model. + # k from logLik df, as MuMIn, so aliased (NA) terms are + # not counted k <- attr(stats::logLik(fit$fit), "df") n <- stats::nobs(fit$fit) - # The correction is undefined once the parameter count - # reaches the sample size; Inf keeps such a model out of - # the selection rather than returning a negative score. + # Undefined once k + 1 >= n; Inf excludes the model if (is.na(n) || n - k - 1 <= 0) { Inf } else { diff --git a/1_code/methods/engines/bayesglm.R b/1_code/methods/engines/bayesglm.R index 2228b0f..164507a 100644 --- a/1_code/methods/engines/bayesglm.R +++ b/1_code/methods/engines/bayesglm.R @@ -5,23 +5,14 @@ # inputs: none # outputs: registers the `bayesglm` engine # notes: -# - arm::bayesglm with its default Cauchy priors, which is what -# the v2 plant models use. -# - bayesglm and glm sit on different axes and should not be -# read as "frequentist versus Bayesian". bayesglm is -# penalized maximum likelihood - augmented IRLS under weakly -# informative Cauchy priors - giving a point estimate and a -# standard error, with no posterior. It belongs on a -# regularization axis. A Bayesian framework comparison needs -# brms or rstanarm. -# - The plant v2 models use it because rare species fitted -# against 30-term habitat formulas separate completely, and -# plain glm then returns infinite coefficients. The -# regularization is load-bearing, so swapping plants to glm as -# a control will fail outright for the rare end of the species -# list rather than give a clean comparison. -# - arm is loaded lazily, so a run that never uses this engine -# does not need it installed. +# - arm::bayesglm with default Cauchy priors, as the v2 plant +# models use. It is penalized maximum likelihood (point +# estimate and SE, no posterior), so glm vs bayesglm is a +# regularization contrast, not frequentist vs Bayesian. +# - Rare plant species separate completely under 30-term habitat +# formulas, so plain glm fails for them; the penalty is +# load-bearing. +# - arm is loaded lazily, only when this engine is used. # --- # 1. Setup ---- diff --git a/1_code/methods/engines/xgboost.R b/1_code/methods/engines/xgboost.R index b5f920e..e3e5cf9 100644 --- a/1_code/methods/engines/xgboost.R +++ b/1_code/methods/engines/xgboost.R @@ -5,50 +5,30 @@ # inputs: none # outputs: registers the `xgboost` engine # notes: -# - xgboost::xgb.train. Trees choose their own variables, split -# points and interactions, so a stage fitted with this engine -# is given one formula holding every candidate covariate -# (models_union()) and the `single` rule, through -# replace_stage_method(). -# - It replaces the earlier gbm engine, which could not fit the -# mammal hurdle: gbm's bernoulli refuses a response between 0 -# and 1 (v2's lure-scaled presence), and gbm has no Gamma. -# xgboost's `binary:logistic` takes a proportion as the label, -# and `reg:gamma` is a log-link Gamma. -# - It has no coefficients, no information criterion and no -# standard errors, and declares none. validate_spec() therefore -# refuses it with a rule that needs them; use `single`. -# - Only the formula's variables are used: `I(x^2)` and `a:b` -# contribute x, a and b, because a tree finds curvature and -# interactions itself. Text and factor columns are one-hot -# coded with the fitted levels. A missing value stays missing: -# xgboost routes it down a branch of its own. -# - The offset is honoured on the link scale, in fitting and in -# prediction, as xgboost's `base_margin`. Without it on new -# data xgboost would substitute its own fitted intercept, so a -# bird prediction would be neither a rate nor a count. -# - The number of rounds is chosen per fit by early stopping on -# a held-out share of the rows (`valid_fraction`, 20%), then -# the model is refitted on every row at that number. The -# holdout is drawn under the fit's seed, so a run reproduces -# exactly. Pitfall: on a small draw the holdout is small and -# the chosen number of rounds noisy. -# - Settings, through the stage's `control`: nrounds (the most), -# eta, max_depth, subsample, colsample_bytree, -# min_child_weight, early_stopping_rounds, valid_fraction, -# seed. The defaults are untuned starting points chosen to -# keep a test run quick (eta 0.05 is higher than Elith, -# Leathwick and Hastie 2008 generally advise for boosted -# trees). Tune before reading a result as the method's best. -# - One thread per fit, because the harness already runs one -# species per worker. +# - Use via replace_stage_method() (one models_union() formula, +# `single` rule): it declares no coefficients, IC or SE. +# - Replaces gbm, which cannot fit the mammal hurdle (no 0-1 +# proportion response, no Gamma); xgboost has +# `binary:logistic` with proportions and log-link `reg:gamma`. +# - Only formula variables are used (`I(x^2)`, `a:b` give x, a, +# b). Categoricals are one-hot coded with the fitted levels; +# NAs stay NA. The offset is the `base_margin`, in fitting and +# prediction. +# - Rounds are chosen by early stopping on a seeded holdout +# (`valid_fraction`), then refitted on all rows. Noisy on +# small draws. +# - `control` settings: nrounds, eta, max_depth, subsample, +# colsample_bytree, min_child_weight, early_stopping_rounds, +# valid_fraction, seed. Defaults are untuned and quick (eta +# 0.05 is higher than Elith, Leathwick and Hastie 2008 +# advise); tune before judging the method. +# - One thread per fit; the harness parallelizes over species. # --- # 1. Setup ---- ## 1.1 Load packages ---- -# xgboost (version: 3.2.1), lazily, so a run that never uses this -# engine does not need it installed. +# xgboost (version: 3.2.1), loaded lazily # 2. engine_xgboost() ---- @@ -103,9 +83,8 @@ xgboost_fit <- function(formula, data, family, weights = NULL, control ) - # Step 1: The response, the predictors and any offset. A row - # missing its response, weight or offset is dropped, as a GLM - # drops it; a missing predictor is kept. + # Step 1: Drop rows missing response, weight or offset (as a + # GLM does); missing predictors are kept terms <- xgboost_terms(formula) w_all <- if (is.null(weights)) rep(1, nrow(data)) else weights keep <- !is.na(data[[terms$response]]) & !is.na(w_all) @@ -138,8 +117,7 @@ xgboost_fit <- function(formula, data, family, weights = NULL, ) } - # Step 2: The number of rounds, by early stopping on a - # held-out share, then a refit on every row at that number + # Step 2: Rounds by early stopping, then refit on every row model <- with_seed(settings$seed, { n <- length(y) held <- sample.int( @@ -201,8 +179,7 @@ xgboost_predict <- function(fit, newdata, type = "link", se = FALSE) { tree <- fit$fit design <- xgboost_design(newdata, tree$variables, tree$levels) - # A model fitted with an offset reads it as the base margin; - # a model fitted without one uses its own fitted intercept + # Without base_margin xgboost uses its own fitted intercept matrix <- xgboost::xgb.DMatrix( design$x[, tree$columns, drop = FALSE], base_margin = if (tree$offset) newdata$offset else NULL @@ -248,11 +225,8 @@ xgboost_terms <- function(formula) { #' The Numeric Matrix xgboost Takes #' -#' Numeric columns pass through, missing values included. Text, -#' logical and factor columns become one indicator column per -#' level, with the fitted levels when predicting, so a category is -#' read on new data as it was in fitting. A missing category is -#' missing in every indicator rather than a level of its own. +#' Text, logical and factor columns become one indicator per +#' fitted level; a missing category is NA in every indicator. #' #' @param data A data frame. #' @param variables Character vector of column names. diff --git a/1_code/methods/metrics/auc.R b/1_code/methods/metrics/auc.R index 60fdc4d..a7ffb0c 100644 --- a/1_code/methods/metrics/auc.R +++ b/1_code/methods/metrics/auc.R @@ -5,9 +5,7 @@ # inputs: none # outputs: registers the `auc` metric # notes: -# - Takes observed and predicted vectors on the response scale -# and returns one number. Computed from predictions only, so -# every engine is scored the same way. +# - Metric contract: see register_metric() (harness/registry.R). # --- # 1. Setup ---- @@ -19,11 +17,8 @@ #' Area Under the ROC Curve #' -#' The Mann-Whitney form: the probability that a randomly chosen -#' detection scores above a randomly chosen non-detection, with -#' ties counting a half. Values above zero are treated as -#' detections, so a count or a density scores the same way a -#' presence does. +#' Mann-Whitney form (ties count a half). Values above zero are +#' detections, so counts and densities score like presences. #' #' @param observed,predicted Numeric vectors. #' @return A number between 0 and 1, or NA when the observations @@ -34,20 +29,15 @@ metric_auc <- function(observed, predicted) { positive <- observed > 0 - # An AUC needs both classes present. A bootstrap where a - # species was never detected has none, which is a fact about - # the draw rather than a failure. + # Both classes are needed; a draw without detections has none if (!any(positive) || all(positive)) { return(NA_real_) } ranks <- rank(predicted, ties.method = "average") - # Counted as doubles, not integers. sum() of a logical returns - # an integer, and at bird scale - 16,745 detections against - # 199,013 non-detections - their product is 3.3e9, past the - # 32-bit maximum. That overflows to NA silently, so every large - # run would report no AUC at all. + # Doubles, not integers: at bird scale the product of the class + # counts (~3.3e9) overflows 32-bit integers to NA n_pos <- as.numeric(sum(positive)) n_neg <- as.numeric(sum(!positive)) diff --git a/1_code/methods/metrics/calibration_slope.R b/1_code/methods/metrics/calibration_slope.R index 7d80f90..fe181dc 100644 --- a/1_code/methods/metrics/calibration_slope.R +++ b/1_code/methods/metrics/calibration_slope.R @@ -5,9 +5,7 @@ # inputs: none # outputs: registers the `calibration_slope` metric # notes: -# - Takes observed and predicted vectors on the response scale -# and returns one number. Computed from predictions only, so -# every engine is scored the same way. +# - Metric contract: see register_metric() (harness/registry.R). # --- # 1. Setup ---- @@ -19,10 +17,8 @@ #' Calibration Slope #' -#' The slope of observed on predicted. One is perfect -#' calibration; below one means the predictions are too extreme, -#' which is the usual signature of overfitting and the thing a -#' regularized fit is trying to fix. +#' Slope of observed on predicted. One is perfect; below one +#' means predictions are too extreme (typical of overfitting). #' #' @param observed,predicted Numeric vectors. #' @return A number. diff --git a/1_code/methods/metrics/deviance_explained.R b/1_code/methods/metrics/deviance_explained.R index 5b34973..cc12998 100644 --- a/1_code/methods/metrics/deviance_explained.R +++ b/1_code/methods/metrics/deviance_explained.R @@ -5,9 +5,7 @@ # inputs: none # outputs: registers the `deviance_explained` metric # notes: -# - Takes observed and predicted vectors on the response scale -# and returns one number. Computed from predictions only, so -# every engine is scored the same way. +# - Metric contract: see register_metric() (harness/registry.R). # --- # 1. Setup ---- diff --git a/1_code/methods/metrics/n.R b/1_code/methods/metrics/n.R index ac30238..6239db4 100644 --- a/1_code/methods/metrics/n.R +++ b/1_code/methods/metrics/n.R @@ -5,9 +5,7 @@ # inputs: none # outputs: registers the `n` metric # notes: -# - Takes observed and predicted vectors on the response scale -# and returns one number. Computed from predictions only, so -# every engine is scored the same way. +# - Metric contract: see register_metric() (harness/registry.R). # --- # 1. Setup ---- diff --git a/1_code/methods/metrics/prevalence.R b/1_code/methods/metrics/prevalence.R index 456786a..b133506 100644 --- a/1_code/methods/metrics/prevalence.R +++ b/1_code/methods/metrics/prevalence.R @@ -5,9 +5,7 @@ # inputs: none # outputs: registers the `prevalence` metric # notes: -# - Takes observed and predicted vectors on the response scale -# and returns one number. Computed from predictions only, so -# every engine is scored the same way. +# - Metric contract: see register_metric() (harness/registry.R). # --- # 1. Setup ---- @@ -19,9 +17,8 @@ #' Proportion of Survey Units with a Detection #' -#' Carried alongside the scores because most of them are only -#' interpretable against it: an AUC of 0.9 means something -#' different at 2 per cent prevalence than at 40. +#' Reported because most scores are only interpretable against +#' it. #' #' @param observed,predicted Numeric vectors. #' @return A number between 0 and 1. diff --git a/1_code/methods/metrics/rmse.R b/1_code/methods/metrics/rmse.R index 7fae66f..eb1d8d6 100644 --- a/1_code/methods/metrics/rmse.R +++ b/1_code/methods/metrics/rmse.R @@ -5,9 +5,7 @@ # inputs: none # outputs: registers the `rmse` metric # notes: -# - Takes observed and predicted vectors on the response scale -# and returns one number. Computed from predictions only, so -# every engine is scored the same way. +# - Metric contract: see register_metric() (harness/registry.R). # --- # 1. Setup ---- diff --git a/1_code/methods/metrics/spearman.R b/1_code/methods/metrics/spearman.R index 9fb90b8..97edab2 100644 --- a/1_code/methods/metrics/spearman.R +++ b/1_code/methods/metrics/spearman.R @@ -5,9 +5,7 @@ # inputs: none # outputs: registers the `spearman` metric # notes: -# - Takes observed and predicted vectors on the response scale -# and returns one number. Computed from predictions only, so -# every engine is scored the same way. +# - Metric contract: see register_metric() (harness/registry.R). # --- # 1. Setup ---- @@ -19,8 +17,7 @@ #' Rank Correlation of Observed and Predicted #' -#' Scale-free, so it compares a density model against a count -#' model without either being rescaled. +#' Scale-free, so density and count models compare directly. #' #' @param observed,predicted Numeric vectors. #' @return A number between -1 and 1. diff --git a/1_code/methods/resampling/precomputed.R b/1_code/methods/resampling/precomputed.R index 14166c2..8f104f2 100644 --- a/1_code/methods/resampling/precomputed.R +++ b/1_code/methods/resampling/precomputed.R @@ -10,15 +10,11 @@ # - per_species_rds: one file per species (plant groups) # outputs: registers the `precomputed` scheme # notes: -# - Replays draws the source pipeline stored. Replaying v2's own -# draws is what makes parity numerical rather than -# distributional: the harness then fits the same rows v2 -# fitted, draw by draw. -# - Two layouts. Birds store one table for the taxon, one column -# per draw, keyed on `surveyid`. The plant-group taxa store -# v2's draws per species, because v2 drew them per species, -# written by 1_code/_setup/07_harmonize_v2_plant_bootstrap_ids.R. -# - The seed is ignored: the draws are stored, not drawn. +# - Replays v2's stored draws, so parity can be numerical rather +# than distributional. Birds: one table keyed on `surveyid`. +# Plant groups: per species, as v2 drew them (written by +# _setup/07_harmonize_v2_plant_bootstrap_ids.R). +# - The seed is ignored. # --- # 1. Setup ---- @@ -79,8 +75,7 @@ resample_precomputed <- function( ids <- unique(ids) } - # Step 2: Translate to survey unit ids when the stored ids - # are a different key, which is how the bird ids are stored + # Step 2: Translate other keys (birds) to survey unit ids if (is.null(id_column)) { return(as.character(ids)) } @@ -102,8 +97,8 @@ resample_precomputed <- function( #' Read One Taxon's or Species' Stored Draws #' -#' Cached for the session, because a bird run otherwise re-reads -#' the 38 MB draw table once per species. +#' Cached: the bird draw table (~38 MB) is otherwise re-read per +#' species. #' #' @param data_dir,taxon,species,per_species As in #' resample_precomputed(). diff --git a/1_code/methods/resampling/spatial_block.R b/1_code/methods/resampling/spatial_block.R index 45d8057..19717e0 100644 --- a/1_code/methods/resampling/spatial_block.R +++ b/1_code/methods/resampling/spatial_block.R @@ -5,15 +5,11 @@ # inputs: none # outputs: registers the `spatial_block` scheme # notes: -# - Reproduces the v2 plant bootstrap: resample survey units -# with replacement within coarse latitude and longitude -# blocks, so a draw keeps the geographic spread rather than -# drifting toward whichever region is best surveyed. -# - Iteration 1 is the complete data, matching v2, so the first -# fit of every run is the full-data fit. -# - Every draw comes from one stream under the species' seed, so -# draws 1 to 5 of a 5-draw run are the same as draws 1 to 5 of -# a 100-draw run. +# - The v2 plant bootstrap: resample units with replacement +# within coarse lat/long blocks, keeping the geographic spread. +# - Iteration 1 is the complete data, as in v2. +# - One seeded stream per species, so draws 1-5 of a 5-draw run +# equal draws 1-5 of a 100-draw run. # --- # 1. Setup ---- @@ -25,8 +21,7 @@ #' Draw a Spatially Blocked Bootstrap #' -#' Resamples survey units with replacement within each spatial -#' block, so every block keeps its original number of units. +#' Each block keeps its original number of units. #' #' @param frame A data frame with `survey_unit_id` and the #' coordinate columns. @@ -37,9 +32,7 @@ #' check. #' @param response Numeric vector, one per row of `frame`, used #' only for the detection check. -#' @param max_attempts Integer. How many redraws before giving -#' up, so a species that can never meet the threshold fails -#' rather than looping forever. +#' @param max_attempts Integer. Redraws before failing. #' @param seed Integer or NULL. NULL leaves the stream unseeded, #' which is what v2 did. #' @return A list of character vectors, one per iteration. @@ -87,8 +80,7 @@ resample_spatial_block <- function( return(units) } - # Step 2: Redraw until the sample carries enough detections - # for a model to be estimable + # Step 2: Redraw until the sample has enough detections for (attempt in seq_len(max_attempts)) { rows <- draw_once() @@ -114,10 +106,9 @@ resample_spatial_block <- function( #' The Registered Form of the Spatially Blocked Bootstrap #' -#' Adds v2's redraw rule: a sample is redrawn for detections only -#' when the full data could meet the threshold in at least one -#' model region; otherwise the first draw is taken. Checked per -#' region, on the full data. +#' Adds v2's redraw rule: redraw for detections only if the full +#' data meets the threshold in at least one region; otherwise +#' take the first draw. #' #' @param frame The one-species frame. #' @param iterations Integer vector. @@ -139,9 +130,7 @@ resampler_spatial_block <- function( if (min_detections > 0) { viable <- any(vapply(context$spec$regions, function(region) { - # A region whose filter names columns this frame lacks - - # another region's, when the draw is not province-wide - - # cannot be judged here, and does not count. + # Skip regions whose filter columns this frame lacks if (!is.null(region$filter) && !all(all.vars(region$filter) %in% names(frame))) { return(FALSE) @@ -162,8 +151,7 @@ resampler_spatial_block <- function( } } - # `seed = NULL` is passed through deliberately: it means - # unseeded, not the resampler's harness_seed() default. + # Pass NULL through: unseeded, not the harness_seed() default resample_spatial_block( frame = frame, iterations = iterations, long_column = long_column, lat_column = lat_column, diff --git a/1_code/methods/resampling/spatial_cv.R b/1_code/methods/resampling/spatial_cv.R index 94117f2..2d63b3f 100644 --- a/1_code/methods/resampling/spatial_cv.R +++ b/1_code/methods/resampling/spatial_cv.R @@ -5,14 +5,11 @@ # inputs: none # outputs: registers the `spatial_cv` scheme # notes: -# - Holds out whole spatial blocks rather than random units, so -# a held-out score is not inflated by a training unit sitting -# beside its own test unit. This is the scheme a spatial -# autocorrelation experiment needs; v2 has no equivalent. -# - One "iteration" per fold. Each draw is that fold's training -# units, so the fold's test units are exactly what the harness -# scores as out-of-bag (`oob_` metrics). Set `n_bootstraps` to -# the number of folds wanted. +# - Holds out whole spatial blocks, so held-out scores are not +# inflated by spatial autocorrelation. No v2 equivalent. +# - One iteration per fold; each draw is the fold's training +# units, so `oob_` metrics score its test units. Set +# `n_bootstraps` to the number of folds. # --- # 1. Setup ---- @@ -57,8 +54,7 @@ resample_spatial_cv <- function( ) } - # Step 1: Deal whole blocks into folds, so no fold shares a - # block with another + # Step 1: Deal whole blocks into folds assignment <- with_seed( seed, sample(rep_len(seq_len(folds), length(present))) ) diff --git a/1_code/methods/selection/aic_average.R b/1_code/methods/selection/aic_average.R index 9809569..503c540 100644 --- a/1_code/methods/selection/aic_average.R +++ b/1_code/methods/selection/aic_average.R @@ -5,13 +5,10 @@ # inputs: none # outputs: registers the `aic_average` rule # notes: -# - The v2 climate rule for plants and birds. Coefficients are -# averaged across candidates with Akaike weights, treating a -# term absent from a candidate as zero - that model's statement -# that the effect is nil, and MuMIn's "full" average. -# - The final model's predictor is the weighted average of the -# candidates' link predictions, which for a linear predictor is -# the averaged coefficients applied to the data. +# - The v2 plant and bird climate rule: Akaike-weighted +# coefficients, absent terms counting as zero (MuMIn's "full" +# average). The predictor averages link predictions, which +# equals applying the averaged coefficients. # --- # 1. Setup ---- @@ -63,8 +60,7 @@ select_aic_average <- function( next } - # A term the candidate lacks, or estimated as NA because it - # is aliased, counts as zero, as in MuMIn's full average. + # Absent or aliased (NA) terms count as zero row <- match(term, cf$term) absent <- is.na(row) || is.na(cf$estimate[row]) value <- if (absent) 0 else cf$estimate[row] diff --git a/1_code/methods/selection/hurdle.R b/1_code/methods/selection/hurdle.R index e241475..d1b7746 100644 --- a/1_code/methods/selection/hurdle.R +++ b/1_code/methods/selection/hurdle.R @@ -6,35 +6,19 @@ # inputs: none # outputs: registers the `hurdle` rule # notes: -# - A two-part model for a response that is zero at most units -# and a right-skewed amount where it is not. Presence is fitted -# on every unit; abundance given presence on the units where -# the species was found. Their product is total abundance. -# v2's mammal habitat models are this shape. -# - Engine-agnostic. Both halves are fitted with the stage's -# engine through an inner rule, `part_selection`: `aic_best` -# for v2's GLMs, `single` for an engine with no information -# criterion. replace_stage_method() swaps the inner rule and -# the engine, so a boosted tree fits both halves. -# - What the rule reports works for any engine: each half and -# their product predicted onto the prediction grid, one value -# per habitat type, as three outputs (`presence`, `abundance`, -# `total`). The harness writes them as the stages -# `_presence`, `_abundance` and `_total`. -# v2's own post-processing (modules/mammals/hurdle.R) replaces -# them with v2's tables when the stage keeps v2's GLMs. -# - The final model the harness scores and projects is the -# presence half, so metrics compare like with like across -# engines and with the presence response. -# - The abundance candidates are the presence candidates with -# `abundance_drop` removed - v2 notes that climate effects on -# abundance given presence are minimal - plus a null carrying -# sampling effort. For an engine with coefficients, a -# candidate whose cover terms account for all the cover at -# every present unit is left out, as v2 leaves it out: with an -# intercept as well it cannot be estimated. Terms the stage -# holds constant (Climate, sampling effort, pAspen) are not -# cover. +# - v2's mammal habitat shape: presence on every unit, abundance +# given presence where detected; their product is total +# abundance. Both halves use the stage's engine via the inner +# `part_selection` rule, so any engine works. +# - Outputs are each half and the product on the grid, written +# as `_presence`, `_abundance` and `_total` +# (modules/mammals/hurdle.R swaps in v2's tables for v2 GLMs). +# The scored final model is the presence half. +# - Abundance candidates are the presence ones minus +# `abundance_drop` (v2: climate effects on abundance are +# minimal) plus a null. With coefficients, a candidate whose +# cover terms sum to all the cover is dropped, as in v2: it is +# not identifiable with an intercept. # --- # 1. Setup ---- @@ -197,9 +181,8 @@ hurdle_abundance_models <- function(presence, models, base, d_p, base_text <- paste(deparse(base[[3]]), collapse = " ") has_offset <- grepl("offset(offset)", base_text, fixed = TRUE) - # A presence candidate that could not be fitted has no abundance - # counterpart, as in v2. A rule that fits only some candidates - # (single) reports only those. + # Only fitted presence candidates get an abundance counterpart, + # as in v2; `single` fits only the first table <- presence$ic_table formulas <- lapply(models, resolve_formula, base = base) diff --git a/1_code/methods/selection/ivw_grid.R b/1_code/methods/selection/ivw_grid.R index dd54993..d540db7 100644 --- a/1_code/methods/selection/ivw_grid.R +++ b/1_code/methods/selection/ivw_grid.R @@ -5,28 +5,16 @@ # inputs: none # outputs: registers the `ivw_grid` rule # notes: -# - The v2 plant habitat rule, and the one place where a -# "coefficient" is not a regression coefficient. v2 fits each -# candidate, predicts it onto the prediction matrix - one row -# per habitat type - and combines those predictions across -# candidates weighting each by the precision of its own -# prediction. The result is an effect per habitat type on the -# link scale, which is what the v2 coefficient tables hold. -# - Weighting by precision rather than by AICc is a different -# claim: a candidate that is confident about a habitat type -# dominates there even if it is a poor model overall, and the -# weighting is per habitat type rather than per model. -# - Non-converged candidates are dropped from the grid average, -# not down-weighted, matching v2. A zero standard error is -# floored at 1e-4, because a precision weight of 1/0 would take -# the whole average. -# - The site-level prediction - v2 keeps it as `data$prediction` -# and uses it as the offset of its stand-age splines - is the -# result's `predict()` on the link scale. It averages every -# fitted candidate, converged or not, as v2 does; one that -# failed outright is left out, where v2's would turn the whole -# average into NaN. It is computed when a step asks for it, -# not on every draw. +# - The v2 plant habitat rule. Candidates are predicted onto the +# grid and combined per habitat type by inverse variance, so a +# "coefficient" is a link-scale effect per habitat type. +# - Unlike AICc weighting, a candidate confident about one +# habitat type dominates there even if it is poor overall. +# - Non-converged candidates are dropped from the grid average +# (as v2). Zero SEs are floored at 1e-4. +# - `predict()` gives v2's site-level `data$prediction` (offset +# of the stand-age splines): every fitted candidate, converged +# or not, as v2; failed fits are left out (v2 would give NaN). # --- # 1. Setup ---- @@ -112,15 +100,12 @@ select_ivw_grid <- function( rbind, lapply(predictions[usable], function(x) x$se.fit) ) - # A zero standard error would carry infinite weight error[error == 0] <- 1e-4 grid_coefficients <- ivw_combine(estimate, error) - # Step 2: The leading coefficients are averaged the same way, - # from each model's own coefficient table rather than from a - # prediction. Read by position, as v2 reads them: the head - # terms lead every candidate's formula. + # Step 2: Head terms, from each model's coefficient table, read + # by position as v2 does (they lead every formula) head_estimate <- do.call(rbind, lapply( which(converged), function(i) { fitted$fits[[i]]$coefficients$estimate[seq_along(head_terms)] @@ -155,8 +140,7 @@ select_ivw_grid <- function( ) ) - # Each fitted candidate's own coefficients, for steps that - # average a term the grid does not carry: v2's pAspen. + # For steps averaging a term the grid lacks (v2's pAspen) result$candidate_coefficients <- lapply( which(table$ok), function(i) fitted$fits[[i]]$coefficients ) @@ -178,9 +162,6 @@ select_ivw_grid <- function( ivw_combine <- function(estimate, error) { precision <- 1 / error^2 - # The variance of the combined estimate is the reciprocal of - # the summed precision, not its mean, so adding candidates - # sharpens rather than dilutes it. list( estimate = colSums(estimate * precision) / colSums(precision), se = sqrt(1 / colSums(precision)) diff --git a/1_code/methods/selection/single.R b/1_code/methods/selection/single.R index 2cad9cc..0bd52c3 100644 --- a/1_code/methods/selection/single.R +++ b/1_code/methods/selection/single.R @@ -5,10 +5,8 @@ # inputs: none # outputs: registers the `single` rule # notes: -# - Fits the first formula and keeps it. No ranking, so it needs -# nothing of the engine beyond fit and predict, which makes it -# the rule for an engine with no information criterion - a -# boosted tree, say - or for any one-model question. +# - Fits the first formula only. Needs only fit and predict, so +# it suits engines without an information criterion. # --- # 1. Setup ---- diff --git a/1_code/methods/selection/staged_bic.R b/1_code/methods/selection/staged_bic.R index 682a5bd..c8964b6 100644 --- a/1_code/methods/selection/staged_bic.R +++ b/1_code/methods/selection/staged_bic.R @@ -5,11 +5,9 @@ # inputs: none # outputs: registers the `staged_bic` rule # notes: -# - The v2 bird landcover rule. `models` is a list of named -# groups. Each group is fitted as an update to the previous -# group's winner, and the winner is the smallest model within -# `threshold` of the best score - a parsimony tie-break, not -# simply the minimum. +# - The v2 bird landcover rule. Each group of `models` updates +# the previous group's winner: the smallest model within +# `threshold` of the best score. # --- # 1. Setup ---- @@ -38,8 +36,7 @@ select_staged_bic <- function( weights = NULL, offset = NULL, ic = "BIC", control = list(), threshold = 2, always_advance = TRUE ) { - # Step 1: Fit the base model. It is the starting point every - # group updates, and the fallback if no group improves on it. + # Step 1: Fit the base model, the fallback if no group improves current <- fit_with( engine, base, data, family, weights, offset, control ) @@ -82,18 +79,13 @@ select_staged_bic <- function( next } - # Step 3: Among candidates within `threshold` of the best, - # take the one with fewest parameters. This is a parsimony - # rule, and it is why the winner is not simply which.min(). + # Step 3: Fewest parameters within `threshold` of the best best <- min(fitted$scores[eligible]) close <- eligible[fitted$scores[eligible] <= best + threshold] winner <- close[which.min(table$k[close])] - # Step 4: Carry the group's winner forward. v2 always does, - # even when it scores worse than the model it updated - # (07.ModelLandcover.R, section 14); `always_advance = FALSE` - # keeps the running model instead unless the group improves - # on it. + # Step 4: Carry the winner forward. v2 always does, even when + # it scores worse (07.ModelLandcover.R, section 14) if (always_advance || fitted$scores[winner] < current_score) { current <- fitted$fits[[winner]] current_formula <- fitted$formulas[[winner]] diff --git a/1_code/modules/_shared/plant_group.R b/1_code/modules/_shared/plant_group.R index 7460c4b..f7c3fff 100644 --- a/1_code/modules/_shared/plant_group.R +++ b/1_code/modules/_shared/plant_group.R @@ -5,24 +5,12 @@ # inputs: none # outputs: none; returns objects in memory # notes: -# - Bryophytes, lichens, soil mites and vascular plants each -# have their own module directory, because each is free to -# diverge and a taxon-specific quirk should have one obvious -# home. What they still share is the v2 pipeline shape, and -# that lives here so four copies cannot drift apart. -# - "Plant group" names a survey design rather than a taxonomy. -# Soil mites are animals; they are here because v2 fits them -# with the plant scripts, on the plant survey design. -# - Each taxon module states its own facts and calls this -# builder. Nothing in here looks a taxon up in a table, so -# adding a quirk means editing that taxon's file rather than -# adding a branch to a shared one. -# - The underscore prefix marks this as shared machinery rather -# than a taxon, matching _setup/. -# - What this spec reproduces of v2 is stated once, in -# `v2_coverage` below. The report is generated from it, so -# change it here when the harness changes, and nowhere else. -# Per-quirk detail is in docs/taxon_quirks.md. +# - The v2 pipeline shape shared by the four plant-group taxa +# (a survey design, not a taxonomy). Taxon quirks live in each +# taxon's module, which calls this builder. +# - `v2_coverage` below is the single statement of what is +# reproduced; the report reads it. Detail is in +# docs/taxon_quirks.md. # --- # 1. Setup ---- @@ -34,27 +22,18 @@ #' Build a v2 Spec for One Plant-Group Taxon #' -#' The v2 pipeline shape shared by bryophytes, lichens, soil -#' mites and vascular plants. Called by each taxon module rather -#' than directly. +#' Called by each taxon module rather than directly. #' -#' @param taxon Character. The data slug, which keys the response -#' file, the species catalogue and the covariate catalogue. -#' Note that soil mites carry the slug "mite". +#' @param taxon Character. The data slug ("mite" for soil mites). #' @param protocol_in_v2 Logical. Whether v2 fits Protocol for -#' this taxon. Recorded so a run can say whether it followed v2 -#' or overrode it. +#' this taxon. #' @param use_protocol Logical, or NULL to take the v2 value. -#' Setting it equalizes a term v2 applies inconsistently, which -#' is what a cross-taxa experiment wants. #' @param reference_note Character, or NULL. One clause on where #' this taxon's v2 reference comes from, appended to the spec #' notes. Bryophytes differ from the other three. -#' @param bootstrap Character. "spatial_block" draws v2's -#' spatially blocked bootstrap afresh; "v2_ids" replays the -#' draws v2 itself made, stored per species by -#' _setup/07_harmonize_v2_plant_bootstrap_ids.R, which makes -#' parity numerical draw by draw. +#' @param bootstrap Character. "spatial_block" draws afresh; +#' "v2_ids" replays v2's stored draws (_setup/07), making +#' parity numerical. #' @return A spec list, as run_spec() consumes. #' #' @example # Example usage of the function @@ -86,11 +65,9 @@ plant_group_spec <- function( use_protocol <- protocol_in_v2 } - # The habitat sets are spliced from the mite script, which - # fits no Protocol. In the bryophyte and lichen scripts the - # same formulas carry the term directly after Climate and - # nowhere else, so inserting it there reproduces them. The - # climate set carries no Protocol in any variant. + # The habitat sets come from the mite script (no Protocol); the + # bryophyte and lichen scripts differ only by Protocol directly + # after Climate. No climate set carries Protocol. with_protocol <- function(set) { models <- get_model_set(set) @@ -110,8 +87,7 @@ plant_group_spec <- function( # The stage a methods experiment replaces by default habitat_stage = "habitat", - # Plant-group responses are cover or abundance values; v2 - # models presence, so anything above zero is a detection. + # v2 models presence: any value above zero is a detection response_transform = "detection", family = "binomial", weight_column = NULL, @@ -142,17 +118,14 @@ plant_group_spec <- function( selection = "aic_average", ic = "AICc", control = list(maxit = 250), - # Fitted once per draw on every unit, as v2's - # climate_models() is, and shared by both regions. + # Province-wide, as v2's climate_models() scope = "province", - # The habitat stage takes this stage's prediction as a - # term called Climate, which is how v2 composes them. + # Carried into the habitat stage as `Climate`, as in v2 carry_as = "Climate" ), list( name = "habitat", - # Set per region below, because north fits vegetation - # types and south fits soil types. + # Per region below: veg in the north, soil in the south models = NULL, engine = "bayesglm", selection = "ivw_grid", @@ -160,10 +133,7 @@ plant_group_spec <- function( control = list(maxit = 250), carry_from = "climate", carry_from_as = "Climate", - # v2 predicts each candidate onto the grid holding - # Climate at zero, and at the new protocol where Protocol - # is fitted, so the habitat effects are read at an - # average climate under one protocol. + # v2 predicts the grid at Climate = 0 and the new protocol grid_constants = if (use_protocol) { list( Climate = 0, @@ -177,11 +147,9 @@ plant_group_spec <- function( } else { c("Intercept", "Climate") }, - # v2's steps after the averaging, in v2's order: the - # stand-age splines, the cutblock convergence, the south - # pAspen, then the footprint pooling, which borrows from - # a spline-fitted age class. The splines read the aged - # stand-cover columns, which no formula names. + # v2's post-averaging steps, in v2's order (pooling + # borrows from a spline-fitted age class). The splines + # read aged stand-cover columns no formula names. post_process = list( plant_age_splines, plant_cutblock_convergence, plant_paspen, plant_footprint_pooling @@ -196,19 +164,13 @@ plant_group_spec <- function( c("R", 1:4), paste0 ))) ), - # v2 skips the habitat model when the draw, after the - # region filter, holds fewer than 20 detections. min_detections = 20L ) ), - # One draw per species for the whole province, as v2's - # bootstrap_data() makes it, filtered to each region's units - # when the habitat stage is fitted. - # - # No seed here. The experiment sets one base seed, `boot_seed` - # in run.R, and each species derives its own from it. Without - # one the fresh draws are unseeded, as in v2. + # One province-wide draw per species, as v2's + # bootstrap_data(). No seed here: the experiment's seed is + # used. resample = if (bootstrap == "v2_ids") { list( scheme = "precomputed", @@ -223,8 +185,6 @@ plant_group_spec <- function( ) }, - # What this spec reproduces of v2, per stage. The single - # source of truth for coverage: the report reads it. v2_coverage = list( climate = v2_status( "reproduced", @@ -279,8 +239,6 @@ plant_group_spec <- function( use_protocol = use_protocol, protocol_is_v2 = identical(use_protocol, protocol_in_v2), - # Facts about this taxon's configuration. Coverage is in - # v2_coverage, not here. notes = paste0( "Protocol ", if (use_protocol) "fitted" else "not fitted", if (identical(use_protocol, protocol_in_v2)) { @@ -428,9 +386,8 @@ plant_age_splines <- function(selected, data) { return(selected) } - # The site-level IVW prediction, on the link scale, is the - # ivw_grid rule's final model. Computed here rather than by the - # rule, so regions without aged stand types never pay for it. + # Site-level IVW prediction (link scale), computed only where + # aged stand types exist prediction <- if (is.function(selected$predict)) { selected$predict(data, "link") } else { @@ -1060,8 +1017,7 @@ cutblock_recovery_weights <- function() { #' Every Plant-Group Spec #' -#' A convenience for running all four at once. Each taxon module -#' must already be sourced. +#' Each taxon module must already be sourced. #' #' @param use_protocol Logical, or NULL for the v2 setting per #' taxon. diff --git a/1_code/modules/_shared/standard_specs.R b/1_code/modules/_shared/standard_specs.R index ab07691..e1cf499 100644 --- a/1_code/modules/_shared/standard_specs.R +++ b/1_code/modules/_shared/standard_specs.R @@ -5,16 +5,11 @@ # inputs: none # outputs: none; returns objects in memory # notes: -# - One place that lists the runs an experiment can choose -# between, each a taxon spec in its v2 configuration. An -# experiment names runs (`taxa = c("lichen", "bird")`) rather -# than building specs, so its run.R stays short and every -# experiment starts from the same v2 configuration. -# - Run names are the folder names results are written under. -# Mammals run once per season, because v2's mammal references -# average the summer and winter fits; the two runs share the -# data slug "mammal". Soil mites run as "mite", their slug. -# - A new taxon module adds its run here. +# - The runs an experiment can name (`taxa = c("lichen", +# "bird")`), each in its v2 configuration. Run names are the +# result folder names. Mammals run once per season (v2's +# references average summer and winter), both with slug +# "mammal". A new taxon module adds its run here. # --- # 1. Setup ---- diff --git a/1_code/modules/birds/spec.R b/1_code/modules/birds/spec.R index 0563257..51145c6 100644 --- a/1_code/modules/birds/spec.R +++ b/1_code/modules/birds/spec.R @@ -5,27 +5,13 @@ # inputs: none # outputs: none; returns objects in memory # notes: -# - The v2 configuration for birds, as data. -# - Counts with a QPAD log-offset, which is what makes a count -# comparable across survey protocol and detectability. The -# offset is not optional: without it a bird model is fitting -# effort as much as abundance. -# - Two stages. Climate is model-averaged by AICc. Landcover is -# staged forward selection: groups of formulas, each fitted -# as an update to the previous group's winner, keeping the -# smallest model within 2 BIC of the best. -# - The climate set is v2's 25 candidates (06.ModelClimate.R): -# the null, eight climate combinations, and each of the eight -# with linear and with quadratic spatial terms. The spatial -# terms are the UTM easting and northing sites.csv carries -# for birds, aliased to v2's names. -# - Climate is fitted once per draw on every survey, as v2 -# does, and shared by both regions (`scope = "province"`). -# - Bootstrap ids are precomputed and stored against surveyid -# rather than survey_unit_id, so the draw is translated -# through the design block. -# - What this spec reproduces of v2 is stated once, in -# `v2_coverage`. The report is generated from it. +# - Counts with a QPAD log-offset (required: it separates +# effort and detectability from abundance). +# - Climate: v2's 25 candidates averaged by AICc, province-wide +# per draw. Landcover: staged_bic, smallest model within 2 +# BIC of the best. +# - v2's stored draws are keyed on surveyid and translated to +# survey units. # --- # 1. Setup ---- @@ -55,8 +41,7 @@ bird_spec <- function() { weight_column = NULL, tier = NULL, - # v2's spatial terms are the survey's UTM easting and northing - # in metres, which sites.csv carries for birds. + # v2's spatial terms: UTM easting and northing, in metres aliases = list(Easting = "easting", Northing = "northing"), regions = list( @@ -84,35 +69,27 @@ bird_spec <- function() { stages = list( list( name = "climate", - # v2's 25 candidates, averaged at once by AICc - # (06.ModelClimate.R); only the landcover stage walks - # groups. + # 06.ModelClimate.R models = "climate_bird_v2", engine = "glm", selection = "aic_average", ic = "AICc", - # Fitted once on every survey in the draw, as v2 fits it, - # and shared by both regions. Unweighted, as in v2. + # Province-wide and unweighted, as in v2 scope = "province", weighted = FALSE, - # v2 carries the averaged prediction on the response - # scale WITHOUT the QPAD offset: exp(link), the rate. - # 06.ModelClimate.R asks for predict(type = "link") on a - # MuMIn average, which is built from the averaged - # coefficients and drops the offset. Checked 2026-10-02: - # v2's stored AMRO draw-1 prediction averages 0.118; - # exp(link) on the same surveys gives 0.118, and - # exp(link + offset) gives 0.315. Carrying the offset cut - # the landcover Climate coefficient about threefold - # (AMRO draw 1: 1.60 against v2's 4.91; 4.76 without). + # v2 carries exp(link) WITHOUT the QPAD offset: MuMIn's + # averaged predict(type = "link") drops it. Evidence (AMRO + # draw 1): v2's stored prediction mean 0.118 = exp(link); + # exp(link + offset) = 0.315, and carrying the offset cut + # the landcover Climate coefficient from 4.91 (v2) to + # 1.60. carry_as = "Climate", carry_scale = "exp", carry_offset = FALSE ), list( name = "landcover", - # Set per region: vegetation classes in the north, soil - # classes in the south. + # Per region: veg in the north, soil in the south models = NULL, engine = "glm", selection = "staged_bic", @@ -129,15 +106,12 @@ bird_spec <- function() { resample = list( scheme = "precomputed", id_column = "surveyid", - # v2 selects a draw with %in%, so a survey drawn twice is - # fitted once. + # v2 selects a draw with %in%: repeats are fitted once unique_ids = TRUE, # One draw for the whole province, filtered per region. scope = "province" ), - # What this spec reproduces of v2, per stage. The single - # source of truth for coverage: the report reads it. v2_coverage = list( climate = v2_status( "reproduced", @@ -170,8 +144,6 @@ bird_spec <- function() { ) ), - # Facts about this taxon's configuration. Coverage is in - # v2_coverage, not here. notes = paste0( "QPAD offset inside the formula. The landcover groups' ", "derived terms (wtAge, isCon, fcc2) are all present; ", diff --git a/1_code/modules/birds/standardize.R b/1_code/modules/birds/standardize.R index 9e54dc5..772da70 100644 --- a/1_code/modules/birds/standardize.R +++ b/1_code/modules/birds/standardize.R @@ -10,13 +10,10 @@ # - lookup/covariate_columns.csv, lookup/bird_factor_levels.csv # outputs: none; returns objects in memory # notes: -# - A port of the translation in v2's 08.PackageCoefficients.R -# (kept in 0_data/v2_scripts/birds/). -# v2 publishes bird landcover effects on the standardized -# cross-taxa habitat types - WhiteSpruceR to WhiteSpruce8, -# Loamy, EnSoftLin and so on - not as raw glm coefficients, -# so the harness's raw coefficients have to be translated -# the same way before they can be compared. +# - Port of v2's 08.PackageCoefficients.R translation. v2 +# publishes bird landcover effects on the standardized +# cross-taxa habitat types, not raw glm coefficients, so the +# harness's coefficients are translated the same way. # - North: the raw coefficients are multiplied by v2's `age` # matrix, one row per standardized type. Linear features and # wellsites are re-expressed as the mean predicted abundance @@ -30,8 +27,7 @@ # reads -10,000 rather than -Inf. # - Standard errors are not translated. The gate compares # estimates only. -# - Two v2 quirks are reproduced rather than corrected, because -# the point is to match v2: +# - v2 quirks reproduced for parity: # - The mSoft substitution tests for zero after the # coefficients are exponentiated, so it never fires. # - The NESP north Climate effect is multiplied by 0.1 twice, @@ -337,9 +333,8 @@ standardize_bird_draw <- function(raw, context, species) { # Step 1: Standardized habitat types from the age matrix lam <- exp(drop(age %*% value(colnames(age)))) - # Step 2: Linear features. v2 exponentiates, then tests for - # zero, so the mSoft substitution below never fires; kept - # so the code reads as v2's does. + # Step 2: Linear features. The mSoft substitution never fires + # (v2 tests for zero after exponentiating); kept as in v2. hf <- exp(value(c("mWell", "mSoft", "mEnSft", "mTrSft", "mSeism"))) diff --git a/1_code/modules/bryophytes/spec.R b/1_code/modules/bryophytes/spec.R index 7b855d9..8183d7a 100644 --- a/1_code/modules/bryophytes/spec.R +++ b/1_code/modules/bryophytes/spec.R @@ -7,22 +7,14 @@ # outputs: none; returns objects in memory # notes: # - Data slug: "bryophyte". Response file bryophyte.csv. -# - v2 fits Protocol for this taxon. Only bryophytes and -# lichens get it; soil mites and vascular plants do not. The -# asymmetry is v2's and is preserved here for parity, with -# `use_protocol` exposed so an experiment can equalize it. -# - The published bryophyte model file is unusable twice over: -# every species and draw in it is an error object reading -# `could not find function "model.avg"`, and the bootstrap-id -# file held 3 draws where the other three taxa hold 100. -# - The parity reference is ABMIexploreR's bryophyte arrays -# (_setup/08), which are complete and match v2's own -# COEFS.RData to ~1e-15. _setup/03_rerun_bryophyte_v2_ -# reference.R also regenerated the climate stage into -# 2_pipeline/v2_reference/, for v2_self_agreement.R and the -# stored bootstrap draws. -# - Anything true of every plant-group taxon belongs in -# _shared/plant_group.R, not here. +# - v2 fits Protocol for this taxon (bryophytes and lichens +# only); `use_protocol` can equalize it across taxa. +# - The published bryophyte model file is unusable (every entry +# is a `could not find function "model.avg"` error; 3 stored +# draws, not 100). The parity reference is ABMIexploreR's +# arrays (_setup/08), matching v2's COEFS.RData to ~1e-15. +# _setup/03 regenerated the climate stage into +# 2_pipeline/v2_reference/ for v2_self_agreement.R. # --- # 1. Setup ---- diff --git a/1_code/modules/lichens/spec.R b/1_code/modules/lichens/spec.R index 590fc01..3eadb1b 100644 --- a/1_code/modules/lichens/spec.R +++ b/1_code/modules/lichens/spec.R @@ -7,14 +7,10 @@ # outputs: none; returns objects in memory # notes: # - Data slug: "lichen". Response file lichen.csv. -# - v2 fits Protocol for this taxon. Only bryophytes and -# lichens get it; soil mites and vascular plants do not. The -# asymmetry is v2's and is preserved here for parity, with -# `use_protocol` exposed so an experiment can equalize it. +# - v2 fits Protocol for this taxon (bryophytes and lichens +# only); `use_protocol` can equalize it across taxa. # - The v2 reference is the published file on ABMI-DATA2 and is # intact, unlike the bryophyte one. -# - Anything true of every plant-group taxon belongs in -# _shared/plant_group.R, not here. # --- # 1. Setup ---- diff --git a/1_code/modules/mammals/hurdle.R b/1_code/modules/mammals/hurdle.R index 5cce267..d52fd4d 100644 --- a/1_code/modules/mammals/hurdle.R +++ b/1_code/modules/mammals/hurdle.R @@ -9,18 +9,12 @@ # - species_queue.csv (each species' v2 name) # outputs: none; returns objects in memory # notes: -# - The hurdle itself - presence, then abundance given presence - -# is fitted by the generic `hurdle` rule -# (methods/selection/hurdle.R), through whatever engine the -# stage names. This file holds what is v2's own: how v2 turns -# the two fitted GLMs into its published tables. It is a port -# of the per-species, per-season body of v2's 03_basic-models.R -# after the fits, north (sections 6.3 to 6.6 and 6.11) and -# south (6.3 to 6.6). -# - mammal_v2_habitat_tables() runs as the habitat stage's -# post_process step, so replace_stage_method() removes it with -# the GLMs: an engine experiment reports the hurdle rule's own -# grid tables instead. It stops if either half is not a GLM. +# - Ports how v2 turns the two hurdle GLMs into its published +# tables: 03_basic-models.R after the fits, north sections +# 6.3-6.6 and 6.11, south 6.3-6.6. The hurdle itself is fitted +# by methods/selection/hurdle.R. +# - mammal_v2_habitat_tables() is a post_process step, removed +# by replace_stage_method(); it stops if a half is not a GLM. # - Effects are reported on v2's full habitat set, not the # winning model's categories: each category is spread over # the fine types the prediction matrix assigns to it. @@ -49,11 +43,9 @@ #' Attach v2's Precomputed Climate Prediction to a Mammal Frame #' -#' v2's habitat models do not fit climate; they read a -#' per-species prediction from a separate climate pipeline, and -#' drop the deployments that have none. This does the same, then -#' recomputes the response on the remaining rows, because the lure -#' correction and scaling depend on which rows are in. +#' As v2: drops deployments without a prediction, then recomputes +#' the response, since lure correction and scaling depend on the +#' rows kept. #' #' @param frame A one-species frame from model_frame(). #' @param species Character. The harness species name, e.g. @@ -154,9 +146,8 @@ mammal_held_constants <- function(has_aspen) { #' Turn the Fitted Hurdle into v2's Three Habitat Tables #' -#' The habitat stage's post_process step. Reads the two GLMs the -#' `hurdle` rule chose and replaces its outputs with v2's -#' presence, abundance and total tables. +#' Replaces the `hurdle` rule's outputs with v2's presence, +#' abundance and total tables. #' #' @param selected The `hurdle` rule's selection result. #' @param data The stage's data: `response` is the lure-scaled @@ -182,9 +173,7 @@ mammal_v2_habitat_tables <- function(selected, data, grid, pa <- selected$parts$presence$fit$fit agp <- selected$parts$abundance$fit$fit - # v2's tables are read from GLM coefficients. A stage fitted - # with another engine should have had this step removed by - # replace_stage_method(); say so rather than mix the two. + # Needs GLM coefficients; other engines should not reach here if (!inherits(pa, "glm") || !inherits(agp, "glm")) { stop( "The mammal v2 tables read GLM fits, but this hurdle was ", diff --git a/1_code/modules/mammals/spec.R b/1_code/modules/mammals/spec.R index 527d10b..fd62ed4 100644 --- a/1_code/modules/mammals/spec.R +++ b/1_code/modules/mammals/spec.R @@ -5,34 +5,16 @@ # inputs: none # outputs: none; returns objects in memory # notes: -# - The v2 configuration for mammals, as data. -# - v2 does not fit climate in this pipeline. It reads a -# prediction from mammal_climate_predictions.csv, produced by -# 1_code/2_habitat-modeling/climate/ in ABbiodiversity/ -# MammalModels: nine binomial GLMs over FFP, MAP, CMD and TD, -# averaged by AICc weight. That pipeline is adapted here as a -# fitted stage, so a bioclimatic question can be asked of -# mammals at all. `climate_source` selects which: -# "precomputed" (the default, v2's) reads the prediction file -# through mammal_precomputed_climate() in hurdle.R; "fitted" -# fits climate as the first stage. -# - The climate block, CMD and TD included, comes from -# abmi-camera-climate_2023.Rdata, the file v2 fitted against, -# joined by the harmonizer. The fitted stage runs the full -# nine-model v2 set. -# - What this spec reproduces of v2 is stated once, in -# `v2_coverage`. The report is generated from it. -# - North and south are separate models on overlapping -# deployments, and their covariates disagree, so the two are -# separate covariate keys rather than a filter on one table. -# - Weights are season days. The season a species is modelled -# in is part of its name, so the weight column follows the -# species rather than the taxon. -# - The habitat stage is the generic `hurdle` rule with v2's -# GLMs, and v2's table-building as a post_process step -# (hurdle.R). It has the same shape as the plant habitat -# stage, so replace_stage_method() swaps its engine for both -# halves of the hurdle. +# - v2 reads mammal climate from mammal_climate_predictions.csv +# (ABbiodiversity/MammalModels, 1_code/2_habitat-modeling/ +# climate/: nine binomial GLMs over FFP, MAP, CMD, TD, AICc +# averaged). `climate_source = "fitted"` instead fits that set +# as a stage, on the climate from +# abmi-camera-climate_2023.Rdata that v2 used. +# - North and south are separate covariate keys: overlapping +# deployments with disagreeing covariates. +# - Weights are season days, so the weight column follows the +# season in the species name. # --- # 1. Setup ---- @@ -44,20 +26,11 @@ #' Standardise Detections to the No-Lure Scale #' -#' A lured camera detects more, so a raw detection is not -#' comparable across lured and unlured deployments. v2 estimates -#' the lure effect from the numbered ABMI grid sites alone - -#' those are the ones deployed in matched lured and unlured pairs, -#' so the ratio between them is a lure effect rather than a -#' difference in where cameras were put - and divides the lured -#' detections by it. -#' -#' The result is then scaled to a maximum of one, which is what -#' makes it a proportion a binomial model can take. -#' -#' A ratio that cannot be estimated - no lured or no unlured grid -#' sites for this species and season - leaves the detections -#' uncorrected rather than dividing by zero or by NA. +#' As v2: lured detections are divided by the lure ratio +#' estimated from the numbered ABMI grid sites (matched lured and +#' unlured pairs), then scaled to a maximum of one for a binomial +#' model. If the ratio cannot be estimated, detections are left +#' uncorrected. #' #' @param values Numeric vector of counts. #' @param frame The assembled frame, carrying `lured` and @@ -69,8 +42,7 @@ mammal_pa_response <- function(values, frame) { detected <- sign(values) - # Numbered locations are the ABMI grid; other projects are - # not part of the lure comparison. + # Numbered locations are the ABMI grid grid_site <- grepl("^[[:digit:]]+", as.character(frame$location)) lured <- as.character(frame$lured) == "Yes" @@ -101,17 +73,9 @@ mammal_pa_response <- function(values, frame) { #' Standardise Abundance to the No-Lure Scale #' -#' The abundance half of the hurdle. Lure is corrected as for -#' presence, but from the ratio of mean counts rather than mean -#' detections, because the question is how many rather than -#' whether. -#' -#' The result is winsorized at the 99th percentile of the -#' positive counts. A handful of density estimates are genuinely -#' enormous, and a Gamma model fitted on the log scale gives them -#' leverage out of all proportion to how much they say about a -#' habitat type. Capping is a judgement that those points are -#' real but uninformative, not that they are wrong. +#' Lure-corrected from the ratio of mean counts, then winsorized +#' at the 99th percentile of positive counts: a few enormous +#' densities would otherwise dominate the log-link Gamma fit. #' #' @param values Numeric vector of counts. #' @param frame The assembled frame, carrying `lured` and @@ -155,12 +119,9 @@ mammal_agp_response <- function(values, frame) { #' Build the v2 Spec for Mammals #' -#' The habitat stage is v2's hurdle: presence, then abundance -#' given presence, fitted by the generic `hurdle` rule with v2's -#' GLMs and best-by-AICc selection, then turned into v2's three -#' tables by mammal_v2_habitat_tables() (hurdle.R). A methods -#' experiment swaps the engine for both halves with one -#' replace_stage_method() call, as for any taxon. +#' The habitat stage is the generic `hurdle` rule with v2's GLMs +#' (best by AICc), turned into v2's tables by +#' mammal_v2_habitat_tables() (hurdle.R). #' #' @param climate_source Character. "precomputed", the v2 #' default, reads each species' climate prediction from @@ -191,16 +152,13 @@ mammal_spec <- function( stages <- list( list( name = "climate", - # The full v2 set. CMD and TD come from the camera - # climate file, which the harmonizer now joins. + # The full v2 set (CMD and TD from the camera climate file) models = "climate_bird_mammal_v2", engine = "glm", selection = "aic_average", ic = "AICc", carry_as = "Climate", - # Climate is modelled on presence: the abundance half - # takes the same climate term, and fitting a binomial on - # counts would fail outright. + # Fitted on presence; the abundance half reuses it response_transform = mammal_pa_response ) ) @@ -212,8 +170,7 @@ mammal_spec <- function( # The stage a methods experiment replaces by default habitat_stage = "habitat", - # v2 models presence rather than the recorded density; the - # abundance half reads the raw count (see the habitat stage). + # Presence; the abundance half reads the raw count response_transform = mammal_pa_response, # v2 reads climate from a separate pipeline's prediction @@ -230,8 +187,7 @@ mammal_spec <- function( family = "binomial", weight_column = paste0("wt_", season), - # The formulas fit `seas_days`; which column that is depends - # on the season being modelled. + # `seas_days` is the season's days column aliases = list(seas_days = paste0(season, "_days")), tier = tier, season = season, @@ -273,9 +229,8 @@ mammal_spec <- function( # v2's 30 south candidates, from south-models/00_models.R habitat_models = "habitat_mammal_south_pa_v2", intercept_cats = "intercept_mammal_south_pa_v2", - # Half the south candidates carry pAspen. Like sampling - # effort, it is held fixed on the grid rather than read - # as a habitat type, and it is not cover. + # pAspen (in half the candidates) is held fixed on the + # grid and is not cover constants = list(seas_days = 100, Climate = 0, pAspen = 0) ) ), @@ -285,9 +240,7 @@ mammal_spec <- function( name = "habitat", models = NULL, engine = "glm", - # Presence, then abundance given presence, each the best - # of its candidates by AICc. See - # methods/selection/hurdle.R. + # Each half best by AICc; see methods/selection/hurdle.R selection = "hurdle", part_selection = "aic_best", ic = "AICc", @@ -317,15 +270,11 @@ mammal_spec <- function( resample = list( scheme = "spatial_block", min_detections = 20L - # No seed here. The experiment sets one base seed, - # `boot_seed` in run.R, and each species derives its own - # from it. Without one the draws are unseeded, as in v2. + # No seed here: the experiment's seed is used ), climate_source = climate_source, - # What this spec reproduces of v2, per stage. The single - # source of truth for coverage: the report reads it. v2_coverage = list( climate = if (climate_source == "precomputed") { v2_status( @@ -371,8 +320,6 @@ mammal_spec <- function( ) ), - # Facts about this run's configuration. Coverage is in - # v2_coverage, not here. notes = paste0( if (climate_source == "fitted") { "Climate fitted with the full 9-model v2 set." diff --git a/1_code/modules/soil_mites/spec.R b/1_code/modules/soil_mites/spec.R index e6661cb..910bece 100644 --- a/1_code/modules/soil_mites/spec.R +++ b/1_code/modules/soil_mites/spec.R @@ -6,24 +6,12 @@ # - 1_code/modules/_shared/plant_group.R # outputs: none; returns objects in memory # notes: -# - Data slug: "mite", not "soil_mite". The directory is named -# for the taxon; the slug is the key the response file, the -# species catalogue and the covariate catalogue all use, and -# renaming it would mean renaming harmonized data. Use "mite" -# wherever a taxon is passed to the harness, including in -# focal_species and run_taxa. -# - Soil mites are animals. They sit with the plant group -# because v2 fits them with the plant scripts, on the plant -# survey design, and the harness follows v2. -# - v2 does not fit Protocol for this taxon, passing the flag -# as FALSE. Only bryophytes and lichens get it. The asymmetry -# is v2's and is preserved here for parity, with -# `use_protocol` exposed so an experiment can equalize it. -# - The habitat model sets the shared builder uses are spliced -# from this taxon's v2 script, which is why they carry no -# Protocol term until one is inserted. -# - Anything true of every plant-group taxon belongs in -# _shared/plant_group.R, not here. +# - Data slug: "mite", not "soil_mite"; it keys the harmonized +# data, so pass "mite" wherever a taxon is named. +# - Animals, but fitted with the plant scripts on the plant +# survey design, as in v2. +# - v2 does not fit Protocol for this taxon (bryophytes and +# lichens only); `use_protocol` can equalize it across taxa. # --- # 1. Setup ---- diff --git a/1_code/modules/vascular_plants/spec.R b/1_code/modules/vascular_plants/spec.R index 46a9ad2..6f4dcd8 100644 --- a/1_code/modules/vascular_plants/spec.R +++ b/1_code/modules/vascular_plants/spec.R @@ -9,15 +9,9 @@ # - Data slug: "vascular_plant". Response file # vascular_plant.csv. v2 names this taxon with a hyphen in # its file names, which the parity gate translates. -# - The largest plant-group taxon by species count, so it is -# usually the slowest of the four to run and the one worth -# restricting with focal_species during a smoke test. -# - v2 does not fit Protocol for this taxon, passing the flag -# as FALSE. Only bryophytes and lichens get it. The asymmetry -# is v2's and is preserved here for parity, with -# `use_protocol` exposed so an experiment can equalize it. -# - Anything true of every plant-group taxon belongs in -# _shared/plant_group.R, not here. +# - The most species of the four, so the slowest to run. +# - v2 does not fit Protocol for this taxon (bryophytes and +# lichens only); `use_protocol` can equalize it across taxa. # --- # 1. Setup ---- From e548251764d9cb85ecb6795ed7aeb79dc065eadd Mon Sep 17 00:00:00 2001 From: bgcasey Date: Wed, 7 Oct 2026 11:27:06 -0600 Subject: [PATCH 15/16] Add comprehensive documentation for setup, experiments, harness, modules, and tests - Introduced README.md files in the following directories: - `1_code/_setup/`: Details the process for building the frozen test dataset and v2 reference, including script descriptions and environment variables. - `1_code/experiments/`: Outlines the structure for experiments, including how to add new experiments and the required folder organization. - `1_code/harness/`: Describes the shared pipeline, its functions, and the experiment configuration process. - `1_code/modules/`: Provides guidelines for taxon modules, including the module interface and how to add new modules. - `1_code/tests/`: Lists available tests and their purposes, along with instructions for running them. These changes enhance the clarity and usability of the codebase for current and future contributors. --- 1_code/_setup/README.md | 89 ++ 1_code/experiments/README.md | 46 + .../experiments/exp_000_parity_v2/README.md | 345 ++---- 1_code/experiments/exp_001_xgboost/README.md | 21 +- .../experiments/exp_002_soilgrids/README.md | 5 + 1_code/harness/README.md | 123 ++ 1_code/methods/README.md | 14 +- 1_code/modules/README.md | 78 ++ 1_code/tests/README.md | 26 + README.md | 1054 +++-------------- 10 files changed, 629 insertions(+), 1172 deletions(-) create mode 100644 1_code/_setup/README.md create mode 100644 1_code/experiments/README.md create mode 100644 1_code/harness/README.md create mode 100644 1_code/modules/README.md create mode 100644 1_code/tests/README.md diff --git a/1_code/_setup/README.md b/1_code/_setup/README.md new file mode 100644 index 0000000..85bcd14 --- /dev/null +++ b/1_code/_setup/README.md @@ -0,0 +1,89 @@ +# _setup + +Builds the frozen test dataset and the v2 reference in `0_data/`, then +publishes them to ABMI-DATA2. Run by hand, by maintainers, once per +source snapshot. No experiment runs these scripts: experiments read the +published copies (see `harness/data_source.R`). + +The scripts read their external inputs from a mirror on +`//ABMI-DATA2/science/sdmMethodsDev/0_data/setup_inputs/`, through +`utils/input_paths.R`, so anyone with access to that share can +rebuild. + +## Run + +From the repository root: + +```r +source("1_code/_setup/run.R") +``` + +`run.R` runs the steps in dependency order, with on/off switches in +section 1.2, and logs timings to `2_pipeline/_setup/run_log.csv`. `00`, +`03` and `10` are off by default. Run order: `01`, `06`, `09`, `02`, +`03`, `07`, `08`, then `10`. There is no `04` or `05`; they were +retired once `08` replaced them. + +## Scripts + +| Script | Reads | Writes | +| --- | --- | --- | +| `00_mirror_setup_inputs.R` | Every external input, at its original location | `setup_inputs/` on ABMI-DATA2, with `inputs_manifest.csv`. Run once; never overwrites | +| `01_harmonize_model_ready_v2.R` | The `model_ready_v2` snapshot, mammal camera climate, WildTrax species lookup, v2 prediction matrices, bird `Stratified.Rdata` | `0_data/test_dataset/`: responses, `sites.csv`, `covariates.csv`, `bird_offsets.csv`, and most of `lookup/` | +| `02_validate_test_dataset.R` | The test dataset and the same sources | Nothing; prints a pass / fail tally. Run after `01`, `06` and `09` | +| `03_rerun_bryophyte_v2_reference.R` | v2 plant project bryophyte data, frozen v2 functions in `0_data/v2_scripts/plants/` | `2_pipeline/v2_reference/`: `bryophyte-species-models.Rdata`, `bryophyte-bootstrap-ids.Rdata`. Takes hours | +| `06_harmonize_bird_translation_lookup.R` | v2's bird `Xn-veg-v2024.Rdata` | `lookup/bird_veg_age_matrix.csv`. Re-run whenever `01` rebuilds `lookup/` | +| `07_harmonize_v2_plant_bootstrap_ids.R` | v2's stored plant draws; `03`'s bryophyte draws | `lookup/v2_bootstrap_ids//.rds`, for `plant_bootstrap = "v2_ids"` | +| `08_harmonize_abmiexplorer_results.R` | ABMIexploreR's `species-coefs.RData` at a pinned commit; bird `birdlist.csv` | `0_data/external/abmiexplorer//`; `0_data/v2_results/abmiexplorer/v2_results.csv` and `v2_results_coverage.csv` | +| `09_harmonize_lookups.R` | `0_data/test_dataset/lookup/` only; offline, seconds | `species_queue.csv`, `factor_levels.csv`, `dataset_manifest.csv`, bird prediction grids | +| `10_publish_datasets.R` | `0_data/test_dataset/`, `0_data/v2_results/` | A new `/` of each on ABMI-DATA2, with `checksums.csv` and `publish_record.md` | +| `run.R` | The scripts above | Runs them in order | +| `utils/input_paths.R` | | `setup_input()`: paths inside the input mirror | + +After `10`, move the pin in `1_code/harness/data_source.R`. A +published version is never overwritten. + +## The test dataset + +`0_data/test_dataset/` holds the data the v2 models were fitted on. It +does not change between experiments. + +| File | Holds | +| --- | --- | +| `sites.csv` | One row per survey unit: identity, design, location, and an `in_` flag per taxon | +| `.csv` | `survey_unit_id` plus one column per species: detections (plants), densities (mammals), counts (birds) | +| `bird_offsets.csv` | QPAD log offsets per survey unit and bird species | +| `covariates.csv` | Every covariate for every taxon, keyed on `survey_unit_id` and a taxon covariate key | +| `lookup/dataset_manifest.csv` | Per taxon and region: files, covariate key, grid and stored draws. The harness reads file locations only from here | +| `lookup/species_queue.csv` | Every taxon's species queue in one schema | +| `lookup/covariate_columns.csv` | Each covariate's block and v2 spelling, per taxon | +| `lookup/factor_levels.csv` | Source order of categorical levels, so contrasts match v2 | +| `lookup/*_prediction_matrix.csv` | Habitat grids: one row per habitat type, a pure stand | +| `lookup/bird_bootstrap_ids.csv`, `lookup/v2_bootstrap_ids/` | v2's stored draws: birds, and plants per species | +| `lookup/mammal_climate_predictions.csv` | v2's precomputed mammal climate prediction | +| `lookup/bird_veg_age_matrix.csv` | v2's bird landcover translation matrix | + +Columns in more than one block are suffixed (`HardLin_veg`, +`HardLin_soil`). Ten derived columns (`TD`, `MAT2`, `Easting2` and +others) are computed on load, not stored. Taxon-specific details are in +[`docs/taxon_quirks.md`](../../docs/taxon_quirks.md). + +## Environment variables + +Each overrides a default path. + +| Variable | Read by | Points at | +| --- | --- | --- | +| `SDM_SETUP_INPUT_ROOT` | `00`–`08` | The input mirror | +| `SDM_SNAPSHOT_V2` | `01`, `02` | The `model_ready_v2` snapshot folder | +| `SDM_MAMMAL_CAMERA_CLIMATE` | `01` | `abmi-camera-climate_2023.Rdata` | +| `SDM_MAMMAL_CLIMATE_PRED` | `01`, `02` | `All Species Climate Predictions.csv` | +| `SDM_V2_LOOKUP` | `01` | The v2 folder holding the plant prediction matrices | +| `SDM_WT_SPECIES` | `01` | `WildTrax Species Strings.RData` | +| `SDM_BIRD_DATA` | `01`, `02` | The bird `Stratified.Rdata` v2 was fitted on | +| `SDM_V2_PROJECT` | `03`, `07` | The v2 plant project (`VegetationModels`) | +| `SDM_V2_BIRD_ROOT` | `06` | The v2 bird project (`BirdModels`) | +| `SDM_V2_BOOT_TAXA`, `SDM_V2_BOOT_SPECIES` | `07` | Comma-separated subsets to copy | +| `SDM_ABMIEXPLORER_SHA` | `08` | The ABMIexploreR commit to download | +| `SDM_V2_BIRD_LOOKUP` | `08` | The v2 bird `birdlist.csv` | +| `SDM_SHARE_ROOT`, `SDM_DATASET_VERSION`, `SDM_PUBLISH` | `10` | Publish root, version folder (default today, `YYYY-MM-DD`), datasets | diff --git a/1_code/experiments/README.md b/1_code/experiments/README.md new file mode 100644 index 0000000..03dae98 --- /dev/null +++ b/1_code/experiments/README.md @@ -0,0 +1,46 @@ +# experiments + +One folder per methods question, keyed `exp_NNN_short_description`. +Each folder has a `run.R` entry point that calls `experiment_config()` +and `run_experiment()` (see the [harness README](../harness/README.md)), +and a `README.md` stating the question. The same id names the +experiment's folders in `2_pipeline/` and `3_output/`. + +| Folder | Holds | Status | +| --- | --- | --- | +| `_shared/` | `focal_species.R`: `focal_species_sets()`, the named species sets (`full`, `parity_check`, `plants_only`, `one_each`) | | +| `_template/` | The `run.R` and `README.md` that `new_experiment()` fills in | | +| [`exp_000_parity_v2/`](exp_000_parity_v2/README.md) | The v2 parity check and the baseline for every other experiment | Not yet a gate | +| [`exp_001_xgboost/`](exp_001_xgboost/README.md) | Habitat stage fitted with xgboost, every taxon | Test; 5-draw check only | +| [`exp_002_soilgrids/`](exp_002_soilgrids/README.md) | SoilGrids 0–5 cm terms in the climate stage, plants and birds | Test; 5-draw check only | + +exp_000 is the required gate before iterative R&D: every other +experiment is compared against its tables. + +## Adding an experiment + +1. Scaffold it from the repository root: + + ```r + source("1_code/harness/new_experiment.R") + new_experiment("covariate scale") # dry_run = TRUE to preview + ``` + + This takes the next free number across `1_code/experiments/`, + `2_pipeline/` and `3_output/`, copies `_template/` with the id, + title, author and date filled in, and creates + `2_pipeline//logs/` and `3_output//` with `figures/`, + `tables/` and a stub `report.md`. Leave `id` in `run.R` as it is. +2. State the question and design in its `README.md`. +3. Change one thing relative to exp_000: `stage_models`, + `covariate_files` or `specs`. Keep exp_000's species, draws and seed + unless they are the question. +4. Never add columns to `0_data/` or change `_setup/` for an + experiment. Covariates the dataset lacks are written by a script in + the experiment's folder to `2_pipeline//inputs/` and named in + `covariate_files`; `exp_002_soilgrids` is the example. +5. Run it at 5 draws to check it works, then at 100. Compare it with + an exp_000 run at the same number of draws. + +Each lever is walked through in +[`docs/getting_started.md`](../../docs/getting_started.md#test-a-change). diff --git a/1_code/experiments/exp_000_parity_v2/README.md b/1_code/experiments/exp_000_parity_v2/README.md index 42ba481..7d4736c 100644 --- a/1_code/experiments/exp_000_parity_v2/README.md +++ b/1_code/experiments/exp_000_parity_v2/README.md @@ -4,7 +4,14 @@ ![Languages](https://img.shields.io/badge/Languages-R-blue) The validation gate. Runs each taxon's v2 spec through the harness and -compares the result against the published v2 output. +compares the result with the published v2 output. Every other +experiment is compared against this one. + +## Question + +Does the framework, configured as v2, reproduce the v2 results? If it +does, a difference in a later experiment is a difference in method, +not in plumbing. ## How to run @@ -14,273 +21,137 @@ From the repository root: source("1_code/experiments/exp_000_parity_v2/run.R") ``` -Every decision is in `run.R`'s `experiment_config()` call: the runs, the -species set, the draws, the seed, and the workers. `run_experiment()` then -fits, summarizes the stores with the harness's `collect_results()`, and runs -this experiment's three steps in order: +Every decision is in `run.R`'s `experiment_config()` call (section +1.2); section 1.3 points the run at the v2 reference. As committed, +`run.R` runs the `parity_check` species at 5 draws on 12 workers. For +the gate, set `species = NULL` and `n_bootstraps = 100`. +`run_experiment()` fits, summarizes, then runs this experiment's steps: -| Step | Script | Writes | +| Step | Script | Writes, in `3_output/exp_000_parity_v2/` | | --- | --- | --- | | compare | `01_compare_to_v2.R` | `tables/parity_terms.csv`, `tables/parity_summary.csv` | -| plot | `02_plot_parity.R` | `figures/parity_*.png` | +| plot | `02_plot_parity.R` | `figures/parity_.png`, `parity_mean.png`, `parity_bell.png` | | report | `03_build_report.R` | `report.md` | -Each step runs in an environment of its own and reads only `config` and -`results`. `fit = FALSE` re-summarizes existing stores without refitting. - -Metrics and grid predictions score each run's final model: for plants, v2's -own prediction from its coefficient tables, so `insample_auc` equals -`v2val_Full`. Coefficients, and so the parity verdicts, do not depend on -this. +`utils/parity_targets.R` holds the targets the compare step reads. +`v2_self_agreement.R` is not part of `run.R`: run it once, after +`_setup/03` and `_setup/08`, to write +`tables/v2_self_agreement.csv` and `v2_self_agreement_summary.csv`. -## Question +## Inputs and outputs -Does the framework, configured as v2, reproduce the v2 results? +- **Inputs:** the published test dataset, and + `abmiexplorer/v2_results.csv` from the published v2 results (both + via `harness/data_source.R`). +- **Outputs:** the stores in `2_pipeline/exp_000_parity_v2/`, the + summary tables every experiment writes (see the + [harness README](../../harness/README.md#outputs)), and: -Everything downstream depends on the answer. Later experiments are -compared against this one, so a difference here is a difference in the -plumbing, not in the method being tested. +| Output | Holds | +| --- | --- | +| `tables/parity_terms.csv` | Term by term: `coefficient_summary.csv` joined to the v2 reference. Adds `ref_region`, `ref_part`, the v2 summary (`v2_median`, `v2_p10`, `v2_p90`, `v2_n`), `comparison` (`median`, or `iteration 1` where v2 fits once), `reachable`, `in_band`, `absolute_difference` and `standardized_difference` (gap ÷ half this run's band). Gitignored | +| `tables/parity_summary.csv` | The gate: one row per taxon × region × stage, with in-band rates, gaps, `median_band_ratio`, `median_spearman` (not gated), `min_draws`, `verdict` and `indicative_verdict` | +| `figures/` | Each term's run and v2 median and band relative to v2; the per-taxon mean; v2 and the run as distributions | +| `report.md` | Run kind and seed, what each spec reproduces of v2, parity by stage, model fit | ## What it covers -Coverage is stated in one place: each spec's `v2_coverage`, in -`1_code/modules//spec.R` (the four plant-group taxa share -`_shared/plant_group.R`). The report prints it from there on every run, -so read `3_output/exp_000_parity_v2/report.md` for the current -statement. In short: +Each spec's `v2_coverage` is the authoritative statement, and +`report.md` prints it. In short: | Taxon | Climate | Habitat or landcover | Resampling | | --- | --- | --- | --- | -| Plant group (×4) | Reproduced: v2's 58-model set, fitted once province-wide; exact to v2's code | Reproduced: IVW on the grid, stand-age splines, cutblock convergence, footprint pooling and pAspen; exact to v2 on the full-data draw | Reproduced: once per species over the province, or v2's own stored draws | -| Mammals | Reproduced: v2's precomputed climate prediction | Reproduced: the hurdle (presence, abundance, total) on the full habitat set, with splines, calibration and convergence; exact to v2's published tables | v2 fits once; iteration 1 is compared | -| Birds | Reproduced: v2's 25 candidates, province-wide, carried as exp(link + offset); exact to v2's code | Reproduced: weighted staged BIC from `count ~ climate`; exact to v2's code | Reproduced: v2's stored draws | - -If this table and the specs disagree, the specs are right; update this -table. - -## What the gate compares today - -`01_compare_to_v2.R` compares **every stage** against one -`v2_results.csv`, so it runs with the network drives unmounted. That -file is built by `_setup/08_harmonize_abmiexplorer_results.R` from -`data/species-coefs.RData` in -[ABMIexploreR](https://github.com/ABbiodiversity/ABMIexploreR), -ABMI's published distribution of the v2 coefficients, pinned to -commit `848eeed`. It holds the published species of every taxon, -plus amphibians. `run.R` section 1.3 points the run at it. - -The reference used to be compiled by hand from the v2 outputs on the -network drives (`_setup/04` and `05`, now removed). On 2026-10-02 the -two builds matched to about 1e-15 on every shared species and term, -except where some v2 draws failed: the drives build dropped them, and -the package stores 100 finite draws for every cell. Re-scoring the -`parity_check` run against both gave the same in-band rates, -standardized differences and verdicts wherever both had the species. -What the package does not cover: - -- **Species.** `Bryum.All`, plus `Trhypochthonius.tectorum` in the - north, are not published, so they have no package reference. -- **Bird `TreedFen`.** The package holds one `TreedFen` coefficient - where v2 has nine age classes, so those terms do not join. The - package's value correlates at about 0.99 with each age class. -- **Mammals.** The package's mammal data were replaced on 2026-07-27. - The pinned commit holds the 2024 coefficient tables the harness - reproduces (an earlier July 2025 set was a different fit, presence - in the north only). The package stores them on the link scale, and - `08` back-transforms them (logit for presence, log for abundance - and total). Its 100 draws are one fit repeated, so they are scored - on iteration 1. South `WetlandMargin` and the - placeholder `Bare` are not in the package. Woodland caribou and - deer are not published. - -`08` adds the package's relabelled terms under the harness's names -(`TreedBog*` → `BlackSpruce*` for birds, `TreedFen` → each plant fen -age, `RuralResidential` → `Rural`, mammals' `WhiteSpruce*` → `Spruce*`, -and so on). It adds these only where -the values were checked to be identical. It also drops the template's -all-zero padding cells. - -- **Climate:** scored against v2's single province-wide fit - (`region = "all"`), which the harness now reproduces: one fit per draw, - shared by both regions. -- **Plant habitat:** terms relabelled as v2's `04a` standardization - publishes them (`BlackSpruce` as `TreedBog`, `UrbInd` copied to - `Urban`, `Industrial` and `Rural`, and so on). The unaged stand types do - not join, because v2 publishes only their spline-fitted age classes. -- **Bird habitat:** the landcover coefficients translated onto v2's - standardized template by `modules/birds/standardize.R`, a port of - v2's `08.PackageCoefficients.R`. Checked against v2's own packaged - output: translating v2's raw per-draw coefficients reproduces - v2's packaged bird coefficients exactly. The raw `landcover` stage is kept in the - summary but not scored. -- **Mammals:** the summer and winter runs are averaged, as v2's `.all` - tables are, and compared at iteration 1, because v2 fits once. The - hurdle writes presence, abundance and total abundance on v2's full - habitat set, each joined to its own v2 table. - -Terms v2 sets with machinery the harness lacks, or fixes at a placeholder, -are listed from the v2 code in `v2_unreachable_terms()` and left out of -the reachable scores. The report lists anything its comparison could not -join, so this is checkable run by run. - -Earlier ad hoc checks put mammal presence at r = 0.985 and abundance at -r = 0.79 against v2 on iteration 1. They were not produced by the -committed gate and cannot be regenerated from it. +| Plant group (×4) | v2's 58-model set, fitted once province-wide; exact to v2's code | IVW on the grid, stand-age splines, cutblock convergence, footprint pooling and pAspen; exact to v2 on the full-data draw | Once per species over the province, or v2's stored draws | +| Mammals | v2's precomputed climate prediction | The hurdle (presence, abundance, total) on the full habitat set, with splines, calibration and convergence; exact to v2's published tables | v2 fits once; iteration 1 is compared | +| Birds | v2's 25 candidates, province-wide, carried as exp(link) without the QPAD offset; exact to v2's code | Weighted staged BIC; exact to v2's code | v2's stored draws | + +If this table and the specs disagree, the specs are right. + +## The v2 reference + +`v2_results.csv` is built by `_setup/08` from ABMIexploreR's published +coefficients (`data/species-coefs.RData`), pinned to commit `848eeed`. +On 2026-10-02 it matched the retired by-hand build from the network +drives to about 1e-15 on every shared species and term. Gaps: + +- `Bryum.All`, and `Trhypochthonius.tectorum` in the north, are not + published. +- Bird `TreedFen` is one coefficient in the package and nine age + classes in v2, so those terms do not join. +- Mammals: the pinned commit holds the 2024 tables the harness + reproduces, on the link scale; `08` back-transforms them. Its draws + are one fit repeated, so they are scored on iteration 1. South + `WetlandMargin`, the placeholder `Bare`, woodland caribou and deer + are not published. + +`08` relabels the package's terms to the harness's names only where +values were checked identical. Plant habitat terms are relabelled as +v2 publishes them; bird landcover is translated onto v2's habitat +template by `modules/birds/standardize.R`; mammal seasons are averaged, +as v2's `.all` tables are. Terms v2 sets by machinery the harness +lacks are listed in `v2_unreachable_terms()` (`01_compare_to_v2.R`) +and left out of the reachable scores. ## Parity targets (proposed) -The targets live in `utils/parity_targets.R`, and `01_compare_to_v2.R` -reads a `verdict` per taxon, region and stage against them. **They are -proposals until agreed**; the report says so. +In `utils/parity_targets.R`. **Proposals until agreed.** + +| Comparison | Passes when | +| --- | --- | +| Numerical (iteration 1, where v2 fits once: the mammal hurdle) | Every reachable term within 1e-6 | +| Distributional (plant and bird stages) | At least 90% of reachable terms in band, median standardized difference ≤ 0.25, and median band-width ratio between 0.75 and 1.33 | -**How closely v2 agrees with itself.** `v2_self_agreement.R` compares two -v2 runs of the same code on the same data: the bryophyte climate stage as -ABMIexploreR publishes it, and the rerun `_setup/03` made, 19 terms by 100 -draws for each species both hold, scored exactly as the gate scores the -harness. The table below was measured against v2's `COEFS.RData` (134 -species); the script now reads the ABMIexploreR reference, which matches -it to ~1e-15 but does not publish `Bryum.All`. +They are set from how closely two v2 runs agree with each other +(`v2_self_agreement.R`: the bryophyte climate stage, ABMIexploreR's +run against `_setup/03`'s rerun). Measured against v2's `COEFS.RData`: | Measure | v2 against itself | | --- | --- | | Terms with one run's median in the other's 10–90% band | 100% | | Median standardized difference | 0.019 | -| Band-width ratio (one run's band over the other's), median per species | 1.005 (5th–95th percentile over species 0.81–1.19) | -| Median per-species Spearman correlation of the medians | 0.998 (10th percentile 0.917) | +| Band-width ratio, median per species | 1.005 (5th–95th percentile 0.81–1.19) | +| Median per-species Spearman of the medians | 0.998 | -The ratio and the Spearman leave out **negligible terms**: those both runs -put below a millionth of the term's typical size, the 90th percentile of its -absolute v2 median over every species of the taxon and stage -(`is_negligible()` in `utils/parity_targets.R`). Model averaging shrinks -unsupported terms to 1e-20 or 1e-140, where band widths and ranks are -noise. Typical size is per term because terms carry units: an `Easting` -coefficient of 1e-6 is real, a `MAP` one of 1e-21 is not. +The band ratio and Spearman skip **negligible terms**, those both runs +put below a millionth of the term's typical size (`is_negligible()`). +Spearman is reported but not gated: it failed mite climate with every +term in band, on the ordering of near-zero terms. -At 100 draws a median is stable relative to the 10–90% band, so a correct -reimplementation should reach close to these. The targets leave a margin -for one run being compared with one run: +Only a full run (every species, 100 draws) is gated. A 100-draw run on +a species subset gets an `indicative_verdict` instead. Neither is +given to a row whose store holds fewer draws than v2 (`min_draws`). -| Comparison | Passes when | -| --- | --- | -| Numerical (iteration 1, where v2 fits once: the mammal hurdle) | Every reachable term within 1e-6 | -| Distributional (v2 bootstraps: plant and bird stages) | At least 90% of reachable terms in band, median standardized difference ≤ 0.25, and median band-width ratio between 0.75 and 1.33 | - -**Why a band-width ratio, and not Spearman.** The in-band and standardized -difference tests both measure against this run's own band, so a harness -noisier than v2 passes them more easily; the ratio fails a band that is too -wide or too narrow, including one read from a store holding too few draws. -Spearman of the medians is still reported (`median_spearman`) but not -gated: it failed mite climate with every term in band, on the ordering of -near-zero terms, and caught nothing the other tests missed. - -Only a full run is gated: every species, 100 draws. A run with 100 draws -on a species subset also gets an `indicative_verdict`, never to be read -as the gate. Either verdict is withheld from a distributional row whose -store holds fewer draws than v2 (`min_draws` in `parity_summary.csv`), -whatever the run was configured for; a store overwritten by a shorter run -would otherwise be scored on five-draw bands. - -**Indicative result (2026-10-03, `parity_check` set, 100 draws).** All 22 -rows pass (`3_output/exp_000_parity_v2/tables/parity_summary.csv`), 100% of -reachable terms in band. The history: on 2026-09-30, 18 of 22 rows passed. Mammal habitat matches v2 to ≤1e-14; every plant climate and -habitat row passes, with band-width ratios of 0.88–1.05. Only birds fail: - -- **Birds, all four rows.** The published bird results (December 2025) - were fitted on a `Stratified.Rdata` that was rebuilt in place on - 2026-08-19; the test dataset is built from the rebuilt one. v2's own - code on the test data matches a 2026-08 v2 re-run to 1.5e-12 and the - published files only to 40%, and the harness matches v2's code to - 2.5e-15. See `docs/taxon_quirks.md`. - - **Resolved 2026-10-02.** Two causes, both fixed. The test dataset is - now harmonized from the pre-rebuild `Stratified.Rdata`, kept in - `remote/birds_data_v2/`. The bird spec had also been carrying the - climate prediction with the QPAD offset in it, which v2 does not. - With both fixed, birds reproduce v2's per-draw coefficients to - ~1e-10 and pass. - -Assumptions, stated because they carry the targets: - -- The calibration covers the plant climate stage only; the same targets - are applied to plant habitat and to birds, on the assumption that v2's - self-agreement is similar there. No second v2 run exists to check it. -- The review's strawman asked for a grid-prediction correlation; v2's - reference holds no grid predictions, and the rank correlation of the - coefficient medians that first stood in for it is no longer gated. No - test compares the whole model's predictions. -- The negligible-term fraction (1e-6) and the 90th-percentile typical - size are judgement calls, not calibrated; they only decide which terms - the band ratio and Spearman read. +Assumptions: the calibration covers plant climate only, and is applied +to plant habitat and birds without a second v2 run to check it. No test +compares whole-model predictions. The negligible-term fraction and the +90th-percentile typical size are judgement calls. + +## Status + +**Indicative result, 2026-10-03, `parity_check` set, 100 draws:** all +22 rows pass, 100% of reachable terms in band. Mammal habitat matches +v2 to ≤1e-14; plant band-width ratios are 0.88–1.05. Birds passed after +two fixes on 2026-10-02: the dataset is harmonized from the +pre-rebuild `Stratified.Rdata` in `remote/birds_data_v2/`, and the +carried climate prediction no longer includes the QPAD offset. + +The committed `tables/` and `run_record.md` are from a later 5-draw +trial (2026-10-06) and are not gated. ## Before this gate can be closed -1. **Agree the parity targets above**, or change them in +1. **Agree the parity targets**, or change them in `utils/parity_targets.R`. 2. **Run the full species queues at 100 draws** and commit the report - and record. That run is days of compute (every species of four plant - taxa, mammals and birds); run it on a machine that can be left. -3. **Get references that can be matched exactly.** The harness now - matches v2's own code to numerical precision, but the published lichen, - mite and vascular plant models were fitted on bootstrap draws v2 did - not keep, and the published bird results on a different vintage of - `Stratified.Rdata`. Re-running v2 on the stored draws (as `_setup/03` - did for bryophytes), or finding the bird data those results used, would - make those gates numerical. Until then they stay distributional. - -The review, `docs/reviews/2026-09-28_alignment_review.md`, has the -evidence for each and an ordered plan. - -## Resolved - -- **`CMD` for mammals.** The mammal climate now comes from - `abmi-camera-climate_2023.Rdata` on ABMI-DATA2, the file the v2 - climate pipeline fitted against. `read_camera_climate()` in the - harmonizer joins it as v2 does: strip the year from the site key, - strip the `CMU-` and `NWSAR-` project prefixes, keep one row per - location. It **replaces** the species table's climate block rather - than filling gaps, because the two are different extractions — at - matched deployments they disagree by up to 531 mm of `MAP`. It - matched 4,243 of 4,654 north deployments (91.2%) and all 1,168 - south; unmatched deployments keep `NA`, as v2 excludes them. The - mammal climate stage now fits the full 9-model set, and the climate - covariates all three taxa share went from two to five (`MAP`, `FFP`, - `TD`, `CMD`, `EMT`). -- **A usable bryophyte reference.** The published file failed twice - over: every draw is an error object (`could not find function - "model.avg"`), and the bootstrap-id file holds 3 draws where the - other taxa hold 100. `_setup/03_rerun_bryophyte_v2_reference.R` - re-ran the frozen v2 functions: 134 of 134 species, 100 draws of 19 - climate terms each, no failures. Separately, ABMIexploreR publishes - complete bryophyte arrays, and `v2_results.csv` uses those. -- **The seed.** `seed` in `run.R` seeds every resampled taxon from - one number, with a derived seed per species. v2 is unseeded, so - parity stays distributional, but this side of it now repeats. - -### The plant age splines, scoped - -- Assemble one frame per stand type from units where that type's cover - exceeds 10%, carrying detection, age class, a weight that is cover - times visits, and the site-level IVW prediction as an offset. Grassy - sites join the upland types at age 0.5 and shrubby sites at age 1, - each at half weight. -- Fit `gam(pCount ~ s(sqrt(age), k = 3, m = 2) + offset(p))` per type, - intercept-only where there are 8 or fewer detections, plus two pooled - variants, an all-types model and an intercept-only all-types model — - nine fits. -- Choose among four groupings by summed AIC, corrected for the extra - variance parameters. -- Predict at ages 0.5 and 1–8 with the type's grid effect as offset. -- Converge the cutblock trajectories onto the natural ones for age - classes 2, 3 and 4, then apply the footprint pooling. v2 does it in - that order. - -`select_ivw_grid()` would also need to return the site-level prediction, -which it currently computes only on the grid. + and record. That run is days of compute. +3. **Get references that can be matched exactly.** The published + lichen, mite and vascular plant models were fitted on draws v2 did + not keep. Re-running v2 on the stored draws, as `_setup/03` did for + bryophytes, would make those gates numerical. ## See also -- [`docs/taxon_quirks.md`](../../../docs/taxon_quirks.md) — every - taxon-specific behaviour in the v2 pipelines and the harness's status - against each. -- [`docs/reviews/2026-09-28_alignment_review.md`](../../../docs/reviews/2026-09-28_alignment_review.md) - — the evidence behind the gaps above. +- [`docs/taxon_quirks.md`](../../../docs/taxon_quirks.md): every + taxon-specific v2 behaviour and the harness's status against each. +- [`docs/reviews/2026-09-28_alignment_review.md`](../../../docs/reviews/2026-09-28_alignment_review.md): + the evidence behind the gaps above. diff --git a/1_code/experiments/exp_001_xgboost/README.md b/1_code/experiments/exp_001_xgboost/README.md index 13ed3cc..4f5afe9 100644 --- a/1_code/experiments/exp_001_xgboost/README.md +++ b/1_code/experiments/exp_001_xgboost/README.md @@ -24,7 +24,8 @@ draws with tuned settings. - **What changes:** the habitat stage's engine, selection rule and candidate set. `run.R` makes the change with one call for every run: - `lapply(standard_specs(), replace_stage_method, engine = "xgboost")`. + `lapply(standard_specs(), replace_stage_method, engine = "xgboost", + control = xgb_settings)`. - **Why one formula:** a tree chooses its own variables, splits and interactions, so it is given every candidate covariate once (as main effects) rather than v2's competing formulas. @@ -54,6 +55,11 @@ From the repository root: source("1_code/experiments/exp_001_xgboost/run.R") ``` +It reads the published test dataset and exp_000's +`3_output/exp_000_parity_v2/tables/`, and writes stores to +`2_pipeline/exp_001_xgboost/` and summaries to +`3_output/exp_001_xgboost/`. + `run.R` uses 5 draws to check the pipeline. For a result, set `n_bootstraps = 100`, and make sure the exp_000 tables it is compared against are from a 100-draw run of the same species. @@ -73,9 +79,10 @@ GLM does, so in-sample metrics would flatter it. ## Assumptions and caveats - **The xgboost settings are untuned.** At most 1000 rounds, learning - rate 0.05, depth 3, subsample 0.5, minimum child weight 1. The number of - rounds is chosen by early stopping on a seeded 20% holdout of each draw, - then the model is refitted on all of the draw. A fair comparison tunes + rate 0.05, depth 3, subsample 0.5, minimum child weight 1 (`run.R` + section 1.2). The number of rounds is chosen by early stopping on a + seeded 20% holdout of each draw, then the model is refitted on all of + the draw. A fair comparison tunes these, ideally per taxon. - **The grid compares like with like only roughly.** The grid holds each habitat type as a pure stand at `Climate` 0. A GLM extrapolates to that @@ -93,9 +100,9 @@ GLM does, so in-sample metrics would flatter it. - **Bird counts keep the QPAD offset**, which the engine passes as the base margin in fitting and prediction. - **gbm was replaced.** The first version of this experiment - (`exp_001_gbm`, 2026-10-03; its output is kept in - `3_output/exp_001_gbm/`) used `gbm`, which cannot fit the mammal hurdle: - its bernoulli rejects a 0–1 proportion and it has no Gamma family. + (`exp_001_gbm`, 2026-10-03) used `gbm`, which cannot fit the mammal + hurdle: its bernoulli rejects a 0–1 proportion and it has no Gamma + family. ## Result diff --git a/1_code/experiments/exp_002_soilgrids/README.md b/1_code/experiments/exp_002_soilgrids/README.md index c4a9e1d..8c4d393 100644 --- a/1_code/experiments/exp_002_soilgrids/README.md +++ b/1_code/experiments/exp_002_soilgrids/README.md @@ -75,6 +75,11 @@ reads the layer from the `//ABMI-DATA2` share; set `SDM_SOILGRIDS` to a local copy of the raster to read it from there instead. Delete the file to extract again. +It also reads the published test dataset and exp_000's +`3_output/exp_000_parity_v2/tables/`, and writes stores to +`2_pipeline/exp_002_soilgrids/` and summaries to +`3_output/exp_002_soilgrids/`. + `run.R` uses 5 draws to check the pipeline. For a result, set `n_bootstraps = 100` and compare against a 100-draw exp_000. diff --git a/1_code/harness/README.md b/1_code/harness/README.md new file mode 100644 index 0000000..a75af9d --- /dev/null +++ b/1_code/harness/README.md @@ -0,0 +1,123 @@ +# harness + +The shared pipeline. It names no taxon and no method: taxon modules +supply specs, `methods/` supplies what the specs name, and the harness +runs them. A change here affects every experiment, past and future; +review it as such and check it with [`1_code/tests/`](../tests/). + +Load everything with: + +```r +source("1_code/harness/harness.R") +load_framework() # harness/, methods/, modules/, experiments/_shared/ +``` + +`new_experiment.R` is the exception: it is base R and runs without +`load_framework()`. + +## Files + +| File | Holds | +| --- | --- | +| `harness.R` | `load_framework()`: sources the harness, methods, modules and `experiments/_shared/`, in that order | +| `experiment.R` | `experiment_config()`, `run_experiment()`, `script_step()` | +| `new_experiment.R` | `new_experiment()`: scaffold an experiment's three folders | +| `data_source.R` | The pinned published dataset versions; `test_dataset_dir()`, `v2_results_dir()`, `verify_published()` | +| `data_load.R` | `lookup/dataset_manifest.csv`, loaders, `covariate_files` joins, model frames | +| `cache.R` | Session cache for dataset reads | +| `covariate_sets.R` | Named covariate sets, derived columns, term renaming | +| `model_sets.R` | v2 candidate formulas, spliced verbatim; `extend_models()`, `models_from_covariates()` | +| `spec.R` | `validate_spec()`, `apply_stage_models()`, `replace_stage_method()` | +| `registry.R` | `register_engine()` and the other `register_*()`; `list_methods()` | +| `engines.R` | Engine interface and `check_engine()` | +| `selection.R` | Plumbing for selection rules: `fit_candidates()`, `combined_predictor()`, `selection_result()` | +| `resample.R` | Per-species seeds, `with_seed()`, spatial blocks | +| `species.R` | Species lists and focal-species resolution | +| `predict_grid.R` | Projects a final model onto a habitat grid | +| `eval_metrics.R` | Scores a prediction with every registered metric | +| `run_model.R` | `run_specs()`: prepare each spec, fit species in parallel, merge shards | +| `result.R` | The result store: writes and reads its files | +| `summarise.R` | `collect_results()`: stores to summary tables | +| `compare.R` | `compare_experiments()`: one experiment against another | +| `run_record.R` | `run_record()`: writes `run_record.md` | + +## What `run_experiment()` does + +1. **Configure.** `experiment_config()` checks every decision before + anything is fitted. +2. **Fit.** Every spec is validated and each region's data and grid + are loaded once. Each species is one job; with `workers` above 1, + jobs run in parallel R sessions. Each species draws under its own + seed, so results do not depend on the worker count. A failed + species or draw is logged and the run continues. +3. **Store.** Shards are merged into one store per run and region in + `2_pipeline//`, plus `run_log.csv`. +4. **Summarize.** `collect_results()` writes `3_output//tables/`. +5. **Compare.** Every experiment except the baseline writes + `tables/comparison_metrics.csv` against exp_000. +6. **Steps.** The experiment's own `steps`, in order. +7. **Record.** `run_record.md`. + +`run_experiment(config, fit = FALSE)` re-summarizes existing stores. +Nothing outside `2_pipeline//` and `3_output//` is written. + +## `experiment_config()` arguments + +| Argument | Default | Sets | +| --- | --- | --- | +| `id` | | Folder name under `2_pipeline/` and `3_output/` | +| `taxa` | all | Runs, from `names(standard_specs())` | +| `species` | every species | A `focal_species_sets()` name, or a vector named by taxon | +| `n_bootstraps` | `100` | Draws per species; v2 used 100. 5 checks a run works | +| `seed` | `20260909` | Base seed; `NULL` leaves draws unseeded, as v2 did | +| `stage_models` | v2's | Replacement candidate sets, keyed `stage` or `taxon.stage` | +| `covariate_files` | none | CSVs of extra covariates keyed on `survey_unit_id` | +| `specs` | `standard_specs()` | Changed specs, such as a different engine or rule | +| `plant_bootstrap` | `"spatial_block"` | `"v2_ids"` replays v2's stored plant draws | +| `workers` | `1` | Species fitted at once | +| `unit_predictions` | `"none"` | `"oob"` or `"all"` writes per-unit predictions | +| `baseline` | `"exp_000_parity_v2"` | Experiment to compare with; `NULL` skips | +| `v2_bootstraps` | `100` | Draws a run needs to be gated | +| `project_root`, `data_dir`, `pipeline_dir`, `out_dir` | derived | Path overrides | + +## Outputs + +A *draw* is one bootstrap iteration; draw 1 is the full data. Every +summary reduces draws to `median`, `p10` and `p90` (what comparisons +read), plus `mean`, `sd`, `n` and `boot1` (the draw-1 value). + +### Result stores: `2_pipeline////` + +| File | Holds | +| --- | --- | +| `coefficients.csv` | Every stage's coefficients per species, draw and term | +| `metrics.csv` | Metrics per species and draw | +| `grid_predictions.csv` | The final model's prediction for each habitat type | +| `unit_predictions.csv` | Only with `unit_predictions = "oob"` or `"all"`; several GB for birds | +| `meta.json` | Stages, engines, rules, covariates, resampling, seed, overrides | + +`2_pipeline//run_log.csv` records every species, region and draw: +`ok`, or why not. + +### Summary tables: `3_output//tables/` + +| File | One row per | Notes | +| --- | --- | --- | +| `coverage.csv` | run × region | Species, draws and stages written; `species = 0` means nothing ran (see `run_log.csv`) | +| `metric_summary.csv` | taxon × region × species × metric | Prefixes: `insample_`, `oob_` (held-out; NA for draw 1), `v2val_` and `oob_v2val_` (v2's seven plant validation AUCs) | +| `grid_summary.csv` | taxon × region × species × `grid_unit` | Response scale; pure stand at the stage's constants (`Climate` 0) | +| `coefficient_summary.csv` | run × region × stage × species × term | Gitignored. Term meaning varies by taxon and stage | +| `comparison_metrics.csv` | species × metric | Against exp_000; both sides' summaries, the difference, and whether this run did better. Gitignored | + +Metrics: `auc`, `deviance_explained`, `rmse`, `spearman`, +`calibration_slope`, `prevalence`, `n`. They score each run's final +model, so for plants `insample_auc` equals `v2val_Full`. "Better" is +higher AUC, deviance explained and Spearman, lower RMSE, and a +calibration slope closer to 1. + +## Data access + +Runs read the published dataset versions pinned in `data_source.R` +(`sdm_published$versions`), on `//ABMI-DATA2/science/sdmMethodsDev/0_data/`. +Set `SDM_TEST_DATASET` or `SDM_V2_RESULTS` to read another copy. Each +call checks file presence and size; `verify_published()` checks md5. diff --git a/1_code/methods/README.md b/1_code/methods/README.md index d1ecdd5..6c5788c 100644 --- a/1_code/methods/README.md +++ b/1_code/methods/README.md @@ -71,7 +71,8 @@ such as `xgboost`'s `objective = "binary:logistic"`, translates it. ### Testing an engine ```r -check_engine(engine_mine()) +check_engine(my_engine()) # a definition, or a registered name +check_engine("glm") ``` `check_engine()` fits small synthetic binomial and Poisson data, @@ -81,14 +82,15 @@ the engine meets the dataset. ### Which rules an engine can use -An engine without an information criterion or coefficients - a -boosted regression tree, a random forest - can still run any +An engine without an information criterion or coefficients (a +boosted regression tree, a random forest) can still run any stage, using the `single` rule: one formula, fitted as given. To compare it with v2 on a stage v2 fits with model averaging, replace that stage's engine, selection and models together. The v2 post-processing steps that read coefficients (the plant stand-age splines, say) then do not apply, and the stage should -drop them; see `docs/getting_started.md`. +drop them; see +[`docs/getting_started.md`](../../docs/getting_started.md#2-a-different-engine-or-rule-specs). `replace_stage_method()` does all of this in one call. Its stage defaults to the spec's `habitat_stage`, so the same call serves @@ -99,8 +101,8 @@ specs <- lapply(standard_specs(), replace_stage_method, engine = "xgboost") ``` -A **composite** rule - one that declares `part_selection`, as -`hurdle` does - keeps its place, and the new rule becomes the one +A **composite** rule (one that declares `part_selection`, as +`hurdle` does) keeps its place, and the new rule becomes the one each part runs. The mammal hurdle's structure (presence on every unit, abundance where the species was found) is a property of the data, so it stays; the new engine fits both halves, and v2's diff --git a/1_code/modules/README.md b/1_code/modules/README.md new file mode 100644 index 0000000..45fad3b --- /dev/null +++ b/1_code/modules/README.md @@ -0,0 +1,78 @@ +# modules + +One v2 spec per taxon. A module holds configuration, not modelling +code: it states what v2 does for a taxon as a spec list, and the +[harness](../harness/) runs it. A change here affects every +experiment; review it as such. + +`load_framework()` sources `_shared/` first, then every other folder, +each in file-name order. + +## Files + +| Folder | File | Defines | +| --- | --- | --- | +| `_shared/` | `plant_group.R` | `plant_group_spec()`, the builder for the four plant-group taxa, and their v2 post-processing (`plant_age_splines()`, `plant_cutblock_convergence()`, `plant_paspen()`, `plant_footprint_pooling()`) | +| `_shared/` | `standard_specs.R` | `standard_specs(plant_bootstrap)`: every run in its v2 configuration | +| `bryophytes/` | `spec.R` | `bryophyte_spec(use_protocol, bootstrap)` | +| `lichens/` | `spec.R` | `lichen_spec(use_protocol, bootstrap)` | +| `soil_mites/` | `spec.R` | `soil_mite_spec(use_protocol, bootstrap)` | +| `vascular_plants/` | `spec.R` | `vascular_plant_spec(use_protocol, bootstrap)` | +| `mammals/` | `spec.R` | `mammal_spec(climate_source, season, tier)` | +| `mammals/` | `hurdle.R` | v2's hurdle tables: presence and abundance effects, splines, calibration, convergence | +| `birds/` | `spec.R` | `bird_spec()` | +| `birds/` | `standardize.R` | `bird_habitat_translation()`: landcover coefficients onto v2's standardized habitat types (port of v2's `08.PackageCoefficients.R`) | + +`standard_specs()` returns seven runs: `bryophyte`, `lichen`, `mite`, +`vascular_plant`, `mammal_summer`, `mammal_winter` and `bird`. + +## The module interface + +A taxon module must: + +1. Define a function `_spec(...)` in + `modules//spec.R` that returns a spec list. +2. Return a spec that passes `validate_spec()`. Unknown fields are + errors, and every named engine, rule and resampler must be + registered. +3. Add its run to `standard_specs()` in `_shared/standard_specs.R`. + +Spec fields the harness reads (full list: `spec_fields()` in +`harness/spec.R`): + +| Field | Sets | +| --- | --- | +| `taxon` | Data slug that keys the response file, covariates and lookups | +| `response_name`, `response_transform`, `family`, `weight_column` | How the recorded value becomes a response; error family; weights | +| `regions` | Per region: `filter` (one-sided formula), `grid`, `habitat_models`, constants | +| `stages` | In order: `name`, `models`, `engine`, `selection`, `ic`, `post_process`, and `carry_as` for the stage carried into the next as `Climate` | +| `habitat_stage` | The stage `replace_stage_method()` replaces by default | +| `resample` | `scheme` and its settings | +| `final_prediction` | Optional. The model scored and projected | +| `v2_coverage` | Per stage, what the spec reproduces of v2. The one place coverage is stated; `report.md` prints it | +| `notes` | Configuration facts, such as whether `Protocol` is fitted | + +Fields that a stage's selection rule or resampler takes as arguments +are also accepted, as settings for that method. + +## Adding a taxon module + +1. Put the v2 scripts as received in `0_data/v2_scripts//` and + log the source and commit in its README. +2. Extend `_setup/01` to write the taxon's response, covariates, + lookups, and any grid or stored draws; extend `_setup/02` to trace + them to the source. +3. Add the taxon's species queue and manifest rows to `_setup/09`, + and re-run it. +4. Splice the v2 candidate formulas into `harness/model_sets.R`, + verbatim. +5. Add `spec.R`, modelled on `lichens/spec.R` (plant group), + `birds/spec.R` or `mammals/spec.R`, and add the run to + `standard_specs()`. If v2 does something no registered method + covers, add one to [`methods/`](../methods/README.md). +6. Add the taxon's published v2 results to `_setup/08`, if + ABMIexploreR publishes them. +7. Check that `validate_spec()` passes and + `Rscript 1_code/tests/run_tests.R` runs clean. Record each + taxon-specific behaviour in + [`docs/taxon_quirks.md`](../../docs/taxon_quirks.md). diff --git a/1_code/tests/README.md b/1_code/tests/README.md new file mode 100644 index 0000000..74a4a3e --- /dev/null +++ b/1_code/tests/README.md @@ -0,0 +1,26 @@ +# tests + +Checks for any change to `harness/`, `methods/` or `modules/`. Run both +from the repository root. + +| File | Does | +| --- | --- | +| `run_tests.R` | Loads the framework and runs `testthat/`. Takes seconds. Dataset checks are skipped when the published dataset cannot be reached | +| `compare_stores.R` | Compares two sets of result stores, matched on keys, to a tolerance (default 1e-10) | +| `testthat/test-dataset.R` | Manifest, species queue, covariate keys, bird grid, covariate cache, `covariate_files` joins | +| `testthat/test-methods.R` | Every engine passes `check_engine()`; registry lookups; metrics | +| `testthat/test-new_experiment.R` | Slugs, numbering and scaffolding of `new_experiment()` | +| `testthat/test-results.R` | Shard merging, seeds, spatial CV folds, baseline comparison, draw summaries | +| `testthat/test-specs.R` | Every standard spec validates; `replace_stage_method()`; hurdle; error reporting; `stage_models` | + +```sh +Rscript 1_code/tests/run_tests.R +Rscript 1_code/tests/compare_stores.R [max_boot] [file,file] +``` + +The tests do not replace the parity check. For a change meant to leave +results alone, run the `parity_check` species at 5 draws to a scratch +folder and compare its stores with exp_000's, as in +[`docs/getting_started.md`](../../docs/getting_started.md#check-that-nothing-broke). +Draws are seeded per species and made in order, so draws 1–5 match +those of a 100-draw run. diff --git a/README.md b/README.md index 101bb5e..dc4722d 100644 --- a/README.md +++ b/README.md @@ -12,99 +12,58 @@ Institute (ABMI). It is intended for internal use. > -A shared, static cross-taxa test dataset and one modelling pipeline, so that -methods questions for Species Models 3.0 can be asked once and answered for -every taxon, against the same v2.0 baseline. - -## Contents - -- [Why this repository exists](#why-this-repository-exists) -- [Quick start](#quick-start) -- [Status](#status) -- [How it works](#how-it-works) - - [One pipeline, taxon as configuration](#one-pipeline-taxon-as-configuration) - - [Everything is compared with one v2 baseline](#everything-is-compared-with-one-v2-baseline) - - [What a taxon spec holds](#what-a-taxon-spec-holds) - - [Methods are plug-ins](#methods-are-plug-ins) -- [The experiment pipeline](#the-experiment-pipeline) - - [From run.R to results](#from-runr-to-results) - - [Inside one species job](#inside-one-species-job) - - [Configuring a run](#configuring-a-run) -- [Building the dataset](#building-the-dataset) -- [Directory structure](#directory-structure) -- [Data: `0_data/`](#data-0_data) -- [Outputs: `2_pipeline/` and `3_output/`](#outputs-2_pipeline-and-3_output) -- [Parity gate](#parity-gate) -- [Known gaps](#known-gaps) -- [Adding an experiment](#adding-an-experiment) -- [Contributing a taxon module](#contributing-a-taxon-module) -- [Naming conventions](#naming-conventions) -- [Setup](#setup) -- [Related resources](#related-resources) -- [Contact](#contact) - -## Why this repository exists - -Species Models are produced one taxon at a time, each by its taxon lead. That -works for production, but it confines R&D to one taxon: a method that improves -plant models may or may not improve bird models, and testing it three times in -three codebases duplicates effort. - -This repository holds: - -- a **frozen test dataset** of 10–20 focal species per taxon, harmonized to - one format (`0_data/test_dataset/`); -- **one pipeline** that runs every taxon's v2.0 model as configuration rather - than as separate code (`1_code/`); -- **exp_000**, which checks that the pipeline reproduces v2.0, and is the - baseline every later experiment is compared against. - -It is for methods research and development. It does not produce the final -species models or reporting products. - -## Quick start - -New to the repository? Read [`docs/getting_started.md`](docs/getting_started.md) -first: the vocabulary, how to run the baseline, how to read what it writes, -and how to test a change. - -```r -source("1_code/harness/harness.R") -load_framework() # the harness, every method, every taxon module -list_methods() # engines, selection rules, resampling, metrics -names(standard_specs()) # the runs an experiment can choose - -# The v2 baseline: check the settings at the top of run.R, then -source("1_code/experiments/exp_000_parity_v2/run.R") -``` - -| To | Start from | -| --- | --- | -| Run the v2 baseline | `1_code/experiments/exp_000_parity_v2/run.R` | -| Test a methods question | A copy of `1_code/experiments/_template/` | -| Add an engine, selection rule, resampling scheme or metric | [`1_code/methods/README.md`](1_code/methods/README.md) | -| Check a code change broke nothing | `Rscript 1_code/tests/run_tests.R`, then [this check](docs/getting_started.md#check-that-nothing-broke) | +The ABMI Science Centre's shared R&D repository for Species Models 3.0. +It holds a frozen cross-taxa test dataset, one modelling pipeline that +runs every taxon's v2.0 model as configuration, and a v2 parity check +(`exp_000`) that every later experiment is compared against. A methods +question is asked once and answered for every taxon. It is for +Science Centre modellers testing methods; it does not produce the +final species models or reporting products. ## Status | Component | State | | --- | --- | -| Test dataset | Built for the four plant-group taxa (bryophytes, lichens, soil mites, vascular plants), mammals and birds. Validated by `_setup/02` | -| v2 reference | Published v2 results harmonized into one table, `0_data/v2_results/` | +| Test dataset | Built for bryophytes, lichens, soil mites, vascular plants, mammals and birds. Validated by `_setup/02`. Published to ABMI-DATA2, version 2026-10-05 | +| v2 reference | ABMIexploreR's published coefficients, harmonized by `_setup/08` | | Pipeline | Built: plug-in methods, parallel species, final-model metrics and habitat grids for every taxon, experiment runner, contract tests | -| Taxon specs | Every stage of every taxon runs. What each reproduces of v2 is stated in its spec's `v2_coverage`, printed in `report.md` | -| exp_000 (v2 parity) | At 100 draws on the 14-species `parity_check` set, all 22 taxon × region × stage rows pass the proposed targets. Not yet a gate: see [Parity gate](#parity-gate) | +| Taxon specs | Every stage of every taxon runs. Each spec's `v2_coverage` states what it reproduces; `report.md` prints it | +| exp_000 (v2 parity) | A 100-draw run on the `parity_check` species passed all 22 taxon × region × stage rows on 2026-10-03 (see the [exp_000 README](1_code/experiments/exp_000_parity_v2/README.md)). The committed tables are from a later 5-draw trial. Not yet a gate: see [Parity gate](#parity-gate) | -## How it works +## Repository structure + +``` +sdmMethodsDev/ +├── 0_data/ # gitignored except v2_scripts/ and *.R +│ ├── test_dataset/ # _setup/ output; runs read the published copy +│ ├── v2_results/ # the v2 parity reference, from _setup/08 +│ ├── external/ # downloaded sources (ABMIexploreR), from _setup/08 +│ ├── covariates/ # reserved; empty +│ └── v2_scripts/ # v2 scripts as received; reference only +├── 1_code/ +│ ├── harness/ # the shared pipeline; names no taxon or method +│ ├── methods/ # engines, selection rules, resampling, metrics +│ ├── modules/ # one v2 spec per taxon; _shared/ for common code +│ ├── experiments/ # one folder per question; _template/, _shared/ +│ ├── _setup/ # 00-10: build, check and publish the dataset +│ ├── tests/ # contract tests and the store comparison +│ └── _scratch.R # dated workspace for exploration +├── 2_pipeline/ # result stores and intermediates; gitignored +├── 3_output// # per-experiment outputs; summaries committed +└── docs/ # getting started, design, taxon quirks, reviews +``` + +What each folder is for, and what an edit there affects, is in +[`docs/getting_started.md`](docs/getting_started.md#where-things-are). -### One pipeline, taxon as configuration +## How it works -The three v2.0 pipelines differ in nearly every detail but share one sequence: -pick survey units, fit candidate models, choose among or average them, -predict and score. What differs is the contents of each step. Here those -contents are data, in a **spec** per taxon, and one **harness** runs any spec. -How a model is fitted, selected, resampled or scored is a **method**, looked -up by the name the spec gives. +The v2.0 pipelines share one sequence: pick survey units, fit candidate +models, choose among or average them, predict and score. Here each +taxon's contents of those steps are data, in a **spec** +(`1_code/modules//spec.R`). One **harness** runs any spec, and +looks up each **method** (engine, selection rule, resampling scheme, +metric) by the name the spec gives. ```mermaid %% ---------------------------- @@ -146,9 +105,6 @@ flowchart TD style R fill:#E8A396,stroke:#2D415B,stroke-width:4px ``` -The harness names no taxon and no method. A taxon module contributes only a -spec; an experiment changes parts of a spec or names different methods in it. - ### Everything is compared with one v2 baseline ```mermaid @@ -194,882 +150,136 @@ flowchart TD style C fill:#E8A396,stroke:#2D415B,stroke-width:4px ``` -exp_000 runs every taxon's v2 spec and checks the result against the published -v2.0 output. Every later experiment changes one thing and is compared with -exp_000, so a difference is a difference in method rather than in plumbing. -Because the dataset is frozen, results stay comparable over time. - -### What a taxon spec holds - -A spec is a list returned by a function such as `lichen_spec()`, in -`1_code/modules//spec.R`. It holds no modelling code. - -| Field | What it sets | -| --- | --- | -| `taxon` | The data slug that keys the response file, covariates and lookups | -| `response_transform`, `family`, `weight_column` | How the recorded value becomes a response, and the error family and weights | -| `regions` | Per region: the row filter, the prediction grid, and the habitat candidate models | -| `stages` | In order: candidate models, engine, selection rule, information criterion, any rule settings, and which stage's prediction is carried into the next as `Climate` | -| `resample` | The resampling scheme and its settings | -| `final_prediction` | Optional. The model scored and projected; the plant specs name v2's own prediction from its coefficient tables | -| `v2_coverage` | Per stage, whether the spec reproduces v2 and what differs. **The one place coverage is stated**; the report prints it | -| `notes` | Configuration facts, such as whether `Protocol` is fitted | - -`validate_spec()` checks every field before a run reads any data. A misspelt -field, an unregistered method, or a selection rule paired with an engine that -cannot serve it stops the run with a sentence saying which. - -The covariates a run loads are read off the formulas it fits, so a term can -never be fitted without its column being loaded. The v2 candidate formulas -are in `1_code/harness/model_sets.R`, spliced verbatim from the v2 scripts. - -### Methods are plug-ins - -Each method is one file in `1_code/methods/` that registers itself under a -name. Adding a method is adding a file; no harness code changes. - -| Kind | Folder | Registered | -| --- | --- | --- | -| Engines: how a model is fitted | `methods/engines/` | `glm`, `bayesglm`, `xgboost` (boosted regression trees) | -| Selection rules: how candidates become one result | `methods/selection/` | `single`, `aic_best`, `aic_average`, `staged_bic`, `ivw_grid`, `hurdle` (presence, then abundance given presence; v2 mammals) | -| Resampling: which units each draw fits | `methods/resampling/` | `precomputed`, `spatial_block`, `spatial_cv` | -| Metrics: how a prediction is scored | `methods/metrics/` | `auc`, `deviance_explained`, `rmse`, `spearman`, `calibration_slope`, `prevalence`, `n` | - -A selection rule states the engine capabilities it needs (coefficients, an -information criterion, standard errors), and `validate_spec()` checks them. -`replace_stage_method()` swaps one stage of a v2 spec to another engine and -rule, leaving the rest v2's. Each spec names its `habitat_stage`, so one -call serves every taxon, mammals included: the mammal hurdle keeps its -presence-then-abundance structure and the new engine fits both halves. -`exp_001_xgboost` uses it to fit the habitat stage with boosted regression -trees. `extend_models()` adds terms to every -candidate in a model set, and `covariate_files` supplies terms the dataset -does not hold; `exp_002_soilgrids` uses both to add SoilGrids soil -properties to the climate stage. -`check_engine()` tests a new engine against the contract on synthetic data. -The contracts are in [`1_code/methods/README.md`](1_code/methods/README.md). - -## The experiment pipeline +exp_000 runs every taxon's v2 spec and checks it against the published +v2.0 output. Every later experiment changes one thing and is compared +with exp_000, so a difference is a difference in method rather than in +plumbing. Because the dataset is frozen, results stay comparable. -### From run.R to results +The design, the spec and result contracts, and the parity ledger are in +[`docs/framework_design.md`](docs/framework_design.md). Every +taxon-specific v2 behaviour is in +[`docs/taxon_quirks.md`](docs/taxon_quirks.md). -An experiment is a `run.R` that states its decisions in `experiment_config()` -and calls `run_experiment()`. Everything after that is the same for every -experiment. +## Getting started -```mermaid -%% ---------------------------- -%% The experiment pipeline -%% ---------------------------- -%%{init: {"themeVariables": {"edgeLabelBackground": "#ffffff"}}}%% -flowchart TD - - subgraph cfg["run.R"] - direction TB - C["experiment_config()
runs · species · draws · seed · changes · workers"] - end - - subgraph run["run_experiment()"] - direction TB - V["validate every spec
before any data is read"] - P["prepare each spec once
region data · prediction grids"] - J["one job per species"] - W1["worker 1"] - W2["worker 2"] - WN["worker n"] - S["merge shards
in queue order"] - ST["result stores
2_pipeline/id/run/region/"] - CR["collect_results()
per-species summaries"] - T["3_output/id/tables/"] - B["compare with exp_000
comparison_metrics.csv
every experiment but exp_000"] - X["the experiment's own steps
exp_000: compare to v2 · plot · report"] - RR["run_record.md"] +New to the repository? Read +[`docs/getting_started.md`](docs/getting_started.md) first: vocabulary, +running the baseline, reading the outputs, and testing a change. - V --> P --> J - J --> W1 & W2 & WN - W1 & W2 & WN --> S --> ST - ST --> CR --> T --> B --> X --> RR - end +### Prerequisites - C --> V +R 4.4 or later, and these packages: - %% ---------------------------- - %% Styles - %% ---------------------------- - - %% Containers - style cfg fill:none,stroke:#2D415B,stroke-width:1px - style run fill:none,stroke:#2D415B,stroke-width:1px - - %% Configuration - style C fill:#A3B4C7,stroke:#2D415B,stroke-width:1px - - %% Shared pipeline - style V fill:#A4A88780,stroke:#C8A02C,stroke-width:2px - style P fill:#A4A88780,stroke:#C8A02C,stroke-width:2px - style J fill:#A4A88780,stroke:#C8A02C,stroke-width:2px - style W1 fill:#ffffff,stroke:#C8A02C,stroke-width:1px - style W2 fill:#ffffff,stroke:#C8A02C,stroke-width:1px - style WN fill:#ffffff,stroke:#C8A02C,stroke-width:1px,stroke-dasharray: 5 5 - style S fill:#A4A88780,stroke:#C8A02C,stroke-width:2px - style CR fill:#A4A88780,stroke:#C8A02C,stroke-width:2px - - %% Outputs - style ST fill:#ffffff,stroke:#2D415B,stroke-width:1px,stroke-dasharray: 5 5 - style T fill:#E8A396,stroke:#2D415B,stroke-width:4px - style B fill:#E8A396,stroke:#2D415B,stroke-width:2px - style X fill:#A3B4C7,stroke:#2D415B,stroke-width:1px - style RR fill:#E8A396,stroke:#2D415B,stroke-width:2px -``` - -1. **Configure.** `experiment_config()` holds every decision and checks it - before anything is fitted. -2. **Prepare.** Each spec is validated, and each region's data and grid are - loaded once. -3. **Fit.** Every species of every spec is one job; with `workers` above 1 - the jobs run in parallel R sessions. Each species draws under its own - seed, so results are the same on one worker or twelve. A failed species - or draw is logged and the run continues. -4. **Store.** Each job writes a shard; the shards are merged into one result - store per run and region in `2_pipeline//`. -5. **Summarize.** `collect_results()` reduces the stores to per-species - tables in `3_output//tables/`. -6. **Compare with exp_000.** Every experiment except exp_000 itself is - compared with the v2 baseline: `tables/comparison_metrics.csv`, with - the per-taxon headline printed. Set `baseline = NULL` in `experiment_config()` to skip. -7. **The experiment's own steps**, in order. For exp_000: compare with v2, - plot, write the report. -8. **Record.** `run_record.md` says what ran, for the commit. - -Nothing outside `2_pipeline//` and `3_output//` is written during a -run, and `0_data/` is never written outside `1_code/_setup/`. - -### Inside one species job - -```mermaid -%% ---------------------------- -%% One species, one draw -%% ---------------------------- -%%{init: {"themeVariables": {"edgeLabelBackground": "#ffffff"}}}%% -flowchart LR - - subgraph job["one species job: every region, every draw"] - direction LR - F["species frame
response · offset · weights · covariates"] - DR["draw
resampling scheme"] - S1["stage 1: climate
candidates → selection rule"] - S2["stage 2: habitat
candidates → selection rule
→ v2 post-processing"] - FM["final model"] - F --> DR --> S1 - S1 -->|"carried as Climate"| S2 --> FM - end - - FM --> CO["coefficients.csv
every stage"] - FM --> ME["metrics.csv
in-sample and out-of-bag"] - FM --> GR["grid_predictions.csv
one row per habitat type"] - - %% ---------------------------- - %% Styles - %% ---------------------------- - - %% Container - style job fill:none,stroke:#2D415B,stroke-width:1px - - %% Steps - style F fill:#ffffff,stroke:#2D415B,stroke-width:1px,stroke-dasharray: 5 5 - style DR fill:#A4A88780,stroke:#C8A02C,stroke-width:2px - style S1 fill:#A4A88780,stroke:#C8A02C,stroke-width:2px - style S2 fill:#A4A88780,stroke:#C8A02C,stroke-width:2px - style FM fill:#A3B4C7,stroke:#2D415B,stroke-width:2px - - %% Outputs - style CO fill:#E8A396,stroke:#2D415B,stroke-width:1px - style ME fill:#E8A396,stroke:#2D415B,stroke-width:1px - style GR fill:#E8A396,stroke:#2D415B,stroke-width:1px +```r +install.packages(c( + "data.table", "arm", "mgcv", "MuMIn", "pROC", # harness, methods + "jsonlite", "ggplot2", # summaries, figures + "xgboost", # xgboost engine + "testthat", "withr" # 1_code/tests/ +)) ``` -Plants and birds fit climate, then habitat (birds: landcover), carrying the -climate prediction into the habitat stage as a term called `Climate`, as v2 -does. The **final model** is the averaged or combined one where a rule -combines candidates, and for plants v2's own prediction from its coefficient -tables. Metrics score it in-sample and on the units the draw left out -(out-of-bag). The **grid** holds its prediction for a pure stand of each -habitat type, the one quantity every engine can produce, so it is what a -method without coefficients is compared on. - -### Configuring a run - -`run.R` is the only file to edit. Its `experiment_config()` call holds every -decision: - -| Argument | Sets | -| --- | --- | -| `id` | The experiment's folders under `2_pipeline/` and `3_output/` | -| `taxa` | The runs, from `names(standard_specs())` | -| `species` | A named set from `focal_species_sets()`, a vector named by taxon, or `NULL` for every species | -| `n_bootstraps` | Draws per species; 100 is v2's. Use 5 to check that a run works | -| `seed` | The base seed; `NULL` leaves draws unseeded, as v2 did | -| `stage_models` | Replacement candidate formulas, or `NULL` for v2's | -| `specs` | Changed specs (a different engine or selection rule), or `NULL` for `standard_specs()` | -| `plant_bootstrap` | `"spatial_block"` draws v2's bootstrap afresh; `"v2_ids"` replays v2's stored draws | -| `workers` | Species fitted at once | -| `unit_predictions` | `"none"` (default), `"oob"` or `"all"` per-unit predictions written | - -Shorten a trial by cutting species, not draws: a 10–90% band read from a -handful of draws does not mean much. On a 24-core machine, the 14 -`parity_check` species take about 1.6 minutes at 5 draws on 12 workers. +`_setup/03` also needs `foreach`, `AICcmodavg`, `binom`, `mapproj` and +`RcmdrMisc` (v2's functions). `exp_002_soilgrids` also needs `sf`, +`terra` and [sciSpatialR](https://github.com/ABbiodiversity/sciSpatialR). -## Building the dataset - -The dataset is built once per source snapshot by the scripts in -`1_code/_setup/`, run by hand and in order. No experiment runs them. -The built dataset and v2 results are then published to ABMI-DATA2 -(`10`), and experiments read those copies, so only whoever rebuilds the -data runs `_setup/`. The scripts read their inputs from a mirror on the -same share (`00`), so anyone with access to it can rebuild. - -```mermaid -%% ---------------------------- -%% Building the frozen dataset and the v2 reference -%% ---------------------------- -%%{init: {"themeVariables": {"edgeLabelBackground": "#ffffff"}}}%% -flowchart TD - - subgraph src["network sources"] - direction LR - SN["model_ready_v2 snapshot
bird Stratified.Rdata
mammal camera climate"] - VP["v2 project outputs
plants · mammals · birds"] - AX["ABMIexploreR package"] - end - - subgraph setup["1_code/_setup/"] - direction TB - S01["01 harmonize"] - S02["02 validate"] - S06["06 bird translation matrix"] - S07["07 v2 plant draws"] - S09["09 harmonize lookups
manifest · species queue · bird grids"] - S03["03 rerun bryophyte reference"] - S08["08 harmonize ABMIexploreR"] - end - - DS["0_data/test_dataset/
frozen"] - VR["0_data/v2_results/
the v2 reference"] - - SN --> S01 --> DS - DS --> S02 - VP --> S06 --> DS - VP --> S07 --> DS - DS --> S09 --> DS - VP --> S03 - AX --> S08 --> VR - - %% ---------------------------- - %% Styles - %% ---------------------------- - - %% Containers - style src fill:none,stroke:#2D415B,stroke-width:1px,stroke-dasharray: 5 5 - style setup fill:none,stroke:#2D415B,stroke-width:1px +Runs need read access to `//ABMI-DATA2/science/sdmMethodsDev/` (ABMI +network or VPN). They read the published test dataset and v2 results +from there, at the versions pinned in +[`1_code/harness/data_source.R`](1_code/harness/data_source.R); nothing +in `_setup/` has to be run. To read another copy, such as a local one, +set `SDM_TEST_DATASET` and `SDM_V2_RESULTS` to its folders. - %% Sources - style SN fill:#ffffff,stroke:#2D415B,stroke-width:1px - style VP fill:#ffffff,stroke:#2D415B,stroke-width:1px - style AX fill:#ffffff,stroke:#2D415B,stroke-width:1px +### Run the v2 baseline (exp_000) - %% Scripts - style S01 fill:#A3B4C7,stroke:#2D415B,stroke-width:1px - style S02 fill:#A3B4C7,stroke:#2D415B,stroke-width:1px - style S06 fill:#A3B4C7,stroke:#2D415B,stroke-width:1px - style S07 fill:#A3B4C7,stroke:#2D415B,stroke-width:1px - style S09 fill:#A3B4C7,stroke:#2D415B,stroke-width:1px - style S03 fill:#A3B4C7,stroke:#2D415B,stroke-width:1px - style S08 fill:#A3B4C7,stroke:#2D415B,stroke-width:1px +From the repository root: - %% Products - style DS fill:#A4A88780,stroke:#B8860B,stroke-width:4px - style VR fill:#A4A88780,stroke:#B8860B,stroke-width:4px -``` - -| Script | Reads | Writes | -| --- | --- | --- | -| `00_mirror_setup_inputs.R` | Every external input below, at its original location | `setup_inputs/` on ABMI-DATA2, with `inputs_manifest.csv`; run once | -| `01_harmonize_model_ready_v2.R` | The `model_ready_v2` snapshot, the mammal camera climate, the WildTrax species lookup, the v2 prediction matrices, the bird `Stratified.Rdata` | `0_data/test_dataset/` | -| `02_validate_test_dataset.R` | The test dataset and the same sources | Nothing; prints a pass / fail tally | -| `03_rerun_bryophyte_v2_reference.R` | The v2 plant project's bryophyte data, and the frozen v2 functions | `2_pipeline/v2_reference/bryophyte-species-models.Rdata` | -| `06_harmonize_bird_translation_lookup.R` | v2's bird `Xn-veg-v2024.Rdata` | `lookup/bird_veg_age_matrix.csv` | -| `07_harmonize_v2_plant_bootstrap_ids.R` | v2's stored plant bootstrap draws | `lookup/v2_bootstrap_ids/` | -| `08_harmonize_abmiexplorer_results.R` | ABMIexploreR's packaged coefficients | `0_data/v2_results/abmiexplorer/` | -| `09_harmonize_lookups.R` | `0_data/test_dataset/lookup/` only (offline) | `species_queue.csv`, `factor_levels.csv`, `dataset_manifest.csv`, the bird prediction grids | -| `10_publish_datasets.R` | `0_data/test_dataset/`, `0_data/v2_results/abmiexplorer/` | A new `/` of each on ABMI-DATA2, with `checksums.csv` | - -- **`00`** copies every external file `_setup/` reads to - `//ABMI-DATA2/science/sdmMethodsDev/0_data/setup_inputs/`, unchanged and - under each source's own relative paths, and records each copy's origin - and md5 in `inputs_manifest.csv`. The originals are left in place. The - scripts read the mirror by default (`_setup/utils/input_paths.R`); their - `SDM_*` variables still point them back at the originals. It never - overwrites the mirror: a source that has changed since is reported. - -- **`01`** writes every response, covariate and lookup table, so experiments - run from `0_data/test_dataset/` alone. Mammal species names are resolved - against `WildTrax Species Strings.RData`, so the north and south files - reach the same column name. -- **`02`** is run after `01`, `06` and `09`, and whenever the snapshot or a - harmonizer changes. It traces every written value back to its source, - restating the rules rather than calling the harmonizer, so a bug there - shows up rather than cancelling out. It writes nothing. -- **`03`** exists because the published bryophyte reference is unusable: - every draw is an error object. It re-runs the frozen v2 functions - unmodified, climate stage only. Its rerun feeds `07`'s bryophyte draws - and exp_000's `v2_self_agreement.R`. -- There is no `04` or `05`. They compiled the v2 reference by hand from - the network drives and were removed once `08`'s ABMIexploreR build was - shown to agree with theirs to about 1e-15 on shared species. The - 2026-10-05 published `v2_results/` still holds their output at its top - level; nothing reads it. -- **`06`** copies the matrix v2 uses to translate bird landcover coefficients - onto the standardized habitat types. Re-run it whenever `01` rebuilds - `lookup/`. -- **`07`** copies v2's stored plant draws, so `plant_bootstrap = "v2_ids"` - fits exactly the rows v2 fitted. The sets are large (1.3 GB for vascular - plants); `SDM_V2_BOOT_TAXA` and `SDM_V2_BOOT_SPECIES` restrict it. -- **`08`** harmonizes ABMIexploreR's published coefficients, pinned to a - commit, into the v2 reference exp_000 scores every run against. Mammal - results average the two seasons, as v2's `.all` tables do. -- **`09`** writes one form of the lookups for every taxon: one species queue - (the three taxon leads' lookups had three schemas), one factor-level table, - the bird habitat grids, and `dataset_manifest.csv`, which names each - taxon's files. The harness reads file locations from the manifest and - nowhere else. It runs offline in seconds; re-run it after `01` or `06`. -- **`10`** publishes `0_data/test_dataset/` and `0_data/v2_results/` as a - new version folder each (default: today's date), copied to a `.partial` - folder, checked by md5 and only then renamed into place. A published - version is never overwritten. Point experiments at it by changing the - pin in `1_code/harness/data_source.R`. - -## Directory structure +```r +source("1_code/harness/harness.R") +load_framework() # the harness, every method, every taxon module +list_methods() # engines, selection rules, resampling, metrics +names(standard_specs()) # the runs an experiment can choose +# Check species, n_bootstraps and workers in run.R first +source("1_code/experiments/exp_000_parity_v2/run.R") ``` -sdmMethodsDev/ -├── README.md -├── 0_data/ # _setup/ output; experiments read the published copy -│ ├── test_dataset/ # the frozen dataset; see "Data" below -│ ├── v2_results/ # the published v2 results, one table -│ ├── v2_scripts/ # the v2 scripts as received; reference only -│ └── covariates/ # reserved for a covariate catalogue; empty -│ -├── 1_code/ -│ ├── harness/ # the shared pipeline; names no taxon or method -│ │ ├── harness.R # load_framework(): loads everything -│ │ ├── experiment.R # experiment_config(), run_experiment() -│ │ ├── new_experiment.R # new_experiment(): scaffold an experiment's folders -│ │ ├── run_model.R # run_specs(): prepare, fit (parallel), merge -│ │ ├── spec.R # validate_spec() and spec helpers -│ │ ├── registry.R # register_*(), list_methods() -│ │ ├── data_load.R # the dataset manifest, loaders, model frames -│ │ ├── summarise.R # collect_results() -│ │ ├── compare.R # compare_experiments() -│ │ └── … # model sets, selection, engines, metrics, grids, stores -│ ├── methods/ # one file per method; see its README -│ │ ├── engines/ selection/ resampling/ metrics/ -│ │ └── _templates/ # copy-and-fill skeletons; not loaded -│ ├── modules/ # one v2 spec per taxon -│ │ ├── _shared/ # plant_group.R (four plant taxa); standard_specs.R -│ │ ├── bryophytes/ lichens/ soil_mites/ vascular_plants/ -│ │ ├── mammals/ # spec.R, hurdle.R (v2's hurdle tables) -│ │ └── birds/ # spec.R, standardize.R (v2's term translation) -│ ├── experiments/ -│ │ ├── _shared/ # named focal-species sets -│ │ ├── _template/ # what new_experiment() fills in -│ │ ├── exp_000_parity_v2/ # run.R, 01_compare_to_v2.R, 02_plot_parity.R, -│ │ │ # 03_build_report.R, utils/parity_targets.R -│ │ ├── exp_001_xgboost/ # test: habitat stage fitted with xgboost -│ │ └── exp_002_soilgrids/ # test: SoilGrids terms in the climate stage; -│ │ # 01_extract_soilgrids_covariates.R, run.R -│ ├── _setup/ # 00–10: mirror inputs, build the v2 data in -│ │ # 0_data/, publish it to ABMI-DATA2; fixed -│ ├── tests/ # run_tests.R; compare_stores.R -│ └── _scratch.R # dated workspace for exploration -│ -├── 2_pipeline/ # result stores and intermediates; gitignored -│ ├── /// # one result store per run and region -│ └── v2_reference/ # rerun bryophyte reference, from _setup/03 -│ -├── 3_output/ # deliverables, per experiment; summaries committed -│ └── / # tables/, figures/, report.md, run_record.md -│ -└── docs/ - ├── getting_started.md # start here - ├── framework_design.md # the design, contracts and parity ledger - ├── taxon_quirks.md # every taxon-specific v2 behaviour - └── reviews/ # dated code reviews -``` - -| Folder | Edit it to | Affects | -| --- | --- | --- | -| `1_code/experiments/exp_NNN_*/` | Ask a question | That experiment only | -| `1_code/experiments/_shared/` | Add a reusable species set | Experiments that use it | -| `1_code/methods/` | Add or change a method | Every experiment that names it | -| `1_code/modules//` | Record what v2 does for a taxon | Every experiment; review as such | -| `1_code/harness/` | Change how every run works | Every experiment, past and future; review as such | -| `1_code/_setup/` | Rebuild or extend the dataset | The dataset, and so every experiment | - -## Data: `0_data/` -Gitignored except `v2_scripts/`. `test_dataset/` and `v2_results/` are -built here by `_setup/`, then published to ABMI-DATA2 as versioned, -checksummed copies: +### Check that a change broke nothing +```sh +Rscript 1_code/tests/run_tests.R ``` -//ABMI-DATA2/science/sdmMethodsDev/0_data/ -├── test_dataset// # + checksums.csv, publish_record.md -├── v2_results// -└── setup_inputs/ # _setup/'s inputs; see "Building the dataset" -``` - -**Experiments, tests and downstream scripts read the published copies,** -through `test_dataset_dir()` and `v2_results_dir()` in -[`1_code/harness/data_source.R`](1_code/harness/data_source.R). That file -pins the version every run reads, and each run record names it. Every call -checks the published files are present at their published sizes; -`verify_published()` checks them by md5. To read another copy (a local one -for working off the network, or `0_data/` straight after a rebuild), set -`SDM_TEST_DATASET` or `SDM_V2_RESULTS` to its folder. - -### `test_dataset/` - -The frozen cross-taxa dataset: the data the v2 models were fitted on. It -does not change between experiments, and neither do the `_setup/` scripts -that build it; a rebuild happens only when the v2 sources change, checked by -`_setup/02`. Anything an experiment adds lives in that experiment's folder. - -| File | Holds | -| --- | --- | -| `sites.csv` | One row per survey unit across every design: identity, design and location fields, and an `in_` flag per taxon | -| `.csv` | `survey_unit_id` plus one column per species: detections for plants, densities for mammals, counts for birds. Join to `sites.csv` on `survey_unit_id` | -| `bird_offsets.csv` | QPAD log offsets per survey unit and bird species | -| `covariates.csv` | Everything the models regress against, every taxon, in one wide table keyed on `survey_unit_id` and a covariate key | -| `lookup/dataset_manifest.csv` | Per taxon and region: the response and offset files, the covariate key, the prediction grid, and any stored draws. **The harness reads file locations from here** | -| `lookup/species_queue.csv` | Every taxon's work queue in one schema: taxon, region, season, tier, species, order, and the name v2 used | -| `lookup/covariate_columns.csv` | Per taxon, the block each covariate came from (climate, veg, soil, design) and its v2 spelling | -| `lookup/factor_levels.csv` | The source order of categorical levels, so reference levels and every contrast match v2 | -| `lookup/*_prediction_matrix.csv` | Habitat prediction grids: one row per habitat type, the cover of a pure stand. Plants (`veg`, `soil`), mammals and birds | -| `lookup/bird_bootstrap_ids.csv`, `lookup/v2_bootstrap_ids/` | v2's stored draws: birds, keyed on `surveyid`; plants per species | -| `lookup/mammal_climate_predictions.csv` | The climate offset v2's mammal habitat models read from a separate climate pipeline; the mammal specs read it by default | -| `lookup/bird_veg_age_matrix.csv` | v2's bird landcover translation matrix | - -Things to know about the data: - -- **Covariate keys include the taxon,** because the sources disagree: mites - differ from the other plant-group taxa on shared survey units, and mammals - are keyed per region (`mammal_north`, `mammal_south`) because north and - south are separate models on overlapping deployments. -- **A column in more than one block was suffixed** (`HardLin_veg`, - `HardLin_soil`); the harness renames model terms to match, so v2 formulas - run unchanged. -- **Ten derived columns are not stored** (`TD`, `MAPPET`, `MAT2`, `CMDMAT`, - `MWMT2`, `Easting`, `Northing`, `Easting2`, `Northing2`, - `EastingNorthing`). The harness computes them on load, so a squared term - always equals its square. -- **Mammal climate** comes from `abmi-camera-climate_2023.Rdata`, the file - v2's mammal climate pipeline fitted against. It matched 4,243 of 4,654 - north deployments and all 1,168 south; unmatched deployments carry `NA`, as - v2 excludes them. -- **The bird grids** are v2's translation matrix rebuilt in covariate space - by `_setup/09`, checked to reproduce it exactly. -- **Covariates v2 did not use are not added here.** An experiment that - tests new covariates extracts them with a script in its own folder, writes - them to `2_pipeline//inputs/` keyed on `survey_unit_id`, and names that - file in `experiment_config(covariate_files = )`; the harness joins it on - load. `exp_002_soilgrids` is the example. - -### `v2_results/` - -The published v2 results as one long table, so a run is scored against one -file rather than three storage formats on two drives: `taxon`, `region`, -`stage`, `part`, `season`, `species`, `species_v2`, `term`, `v2_median`, -`v2_p10`, `v2_p90`, `v2_se`, `v2_n` and `source`. Plant climate is fitted once -province-wide in v2, so those rows carry `region = "all"`. The reference is -in `abmiexplorer/`, built by `_setup/08` from ABMI's published ABMIexploreR -coefficients, so it holds the published species only. -`v2_results_coverage.csv` records which source each part came from. -### `v2_scripts/` - -The modelling scripts as received from the taxon leads, unmodified, one -subfolder per source repository, snapshotted on 2026-09-08. They are the -reference the pipeline is checked against and are **never run**. Sources and -commits are in [`0_data/v2_scripts/README.md`](0_data/v2_scripts/README.md). -The v2 method is restated here rather than copied: what differed between the -v2 scripts became spec fields, what they shared became harness code, and the -candidate formulas were spliced verbatim. +Then compare stores at 5 draws with `1_code/tests/compare_stores.R`, as +in [`docs/getting_started.md`](docs/getting_started.md#check-that-nothing-broke). ## Outputs: `2_pipeline/` and `3_output/` -```mermaid -%% ---------------------------- -%% What a run writes, in order -%% ---------------------------- -%%{init: {"themeVariables": {"edgeLabelBackground": "#ffffff"}}}%% -flowchart LR - - subgraph pipe["2_pipeline/id/ — gitignored"] - direction TB - ST["result stores
coefficients · metrics · grid_predictions · meta.json"] - LG["run_log.csv"] - end - - subgraph out["3_output/id/"] - direction TB - TS["tables/
coverage · metric_summary · grid_summary
coefficient_summary"] - PT["tables/
parity_terms · parity_summary"] - FG["figures/
parity_taxon · parity_mean · parity_bell"] - RP["report.md"] - RR["run_record.md"] - end - - ST -->|"collect_results()"| TS - TS -->|"01_compare_to_v2"| PT - PT -->|"02_plot_parity"| FG - PT -->|"03_build_report"| RP - ST -->|"run_record()"| RR - - %% ---------------------------- - %% Styles - %% ---------------------------- - - %% Containers - style pipe fill:none,stroke:#2D415B,stroke-width:1px,stroke-dasharray: 5 5 - style out fill:none,stroke:#2D415B,stroke-width:1px - - %% Stores - style ST fill:#A4A88780,stroke:#C8A02C,stroke-width:2px - style LG fill:#ffffff,stroke:#2D415B,stroke-width:1px - - %% Every experiment - style TS fill:#E8A396,stroke:#2D415B,stroke-width:2px - style RR fill:#E8A396,stroke:#2D415B,stroke-width:2px - - %% exp_000's own steps - style PT fill:#A3B4C7,stroke:#2D415B,stroke-width:1px - style FG fill:#A3B4C7,stroke:#2D415B,stroke-width:1px - style RP fill:#A3B4C7,stroke:#2D415B,stroke-width:1px -``` - -The red files are written for every experiment by the harness; the blue ones -are exp_000's own steps. Every other experiment also writes -`comparison_metrics.csv` against exp_000. - -A *draw* is one bootstrap iteration; draw 1 is the full data. Every summary -reduces the draws to a median and a 10th–90th percentile band (`p10`, `p90`), -which is what comparisons read because the spread over draws is often -skewed. Each also carries the `mean` and standard deviation (`sd`) for readers -and tools that expect them. `boot1` is the draw-1 value. - -### Result stores (`2_pipeline////`) - -| File | Holds | -| --- | --- | -| `coefficients.csv` | Every stage's coefficients per species, draw and term | -| `metrics.csv` | Metrics per species and draw | -| `grid_predictions.csv` | The final model's prediction for each habitat type | -| `unit_predictions.csv` | Only when `unit_predictions` is `"oob"` or `"all"`: predictions at survey units. Off by default: several GB for birds | -| `meta.json` | What produced the store: stages, engines, selection rules, covariates, resampling, the seed, any model overrides | - -`2_pipeline//run_log.csv` records every species, region and draw: -`ok`, or why not. - -### What is committed - -| Committed | Gitignored (rebuilt with `run_experiment(config, fit = FALSE)`) | -| --- | --- | -| `run_record.md`, `report.md` | `figures/` | -| `tables/coverage.csv` | `tables/coefficient_summary.csv` | -| `tables/metric_summary.csv` | `tables/parity_terms.csv` | -| `tables/grid_summary.csv` | | -| `tables/parity_summary.csv`, `tables/v2_self_agreement_summary.csv` | `tables/comparison_metrics.csv` | - -**Commit only runs that count.** A trial writes the same files as a full run. -Commit `3_output/` after a run with the full species list and -`n_bootstraps = 100`, and check that `run_record.md` says so. Output folders -are named by experiment rather than by version; each experiment is its own -record, and its history is in git. - -### Tables written for every experiment - -**`run_record.md`** — what ran. Read it first: if it is not a full run, the -tables describe a trial. - -| Section | Holds | -| --- | --- | -| Provenance | Git commit, R version, time written. Volatile; ignored when comparing records | -| Configuration | Runs, focal species, draws, seed, candidate model sets, engines, selection rules, jobs ok / not ok | -| Coverage | Rows written per run and region | -| Metrics | Metrics pooled over species and draws: median, 10–90% band, mean and standard deviation | - -**`tables/coverage.csv`** — what ran, one row per run × region: `taxon`, -`run`, `region`, `season` and `part` (mammals), `species`, `draws`, `stages`, -`has_coefficients`, `has_grid`. A row with `species = 0` produced nothing; -the reason is in `run_log.csv`. - -**`tables/metric_summary.csv`** — how well the models fit. One row per -taxon × region × species × metric, with `n`, `median`, `p10`, `p90`, -`boot1`, `mean` and `sd` over draws. The median and band are what comparisons -read, because the spread over draws is often skewed; the mean and standard -deviation are there for readers and tools that expect them. - -| Prefix | Scored on | -| --- | --- | -| `insample_` | The units the draw fitted | -| `oob_` | The units the draw left out: the held-out read. NA for draw 1 | -| `v2val_` | v2's own validation (plants): seven AUCs from the coefficients | -| `oob_v2val_` | The same seven, out-of-bag | - -| Metric | Meaning | -| --- | --- | -| `auc` | Separation of detections from non-detections; 0.5 is chance, 1 is perfect | -| `deviance_explained` | Share of the null deviance the model explains | -| `rmse` | Typical prediction error | -| `spearman` | Rank agreement between observed and predicted | -| `calibration_slope` | 1 is well calibrated; below 1, predictions are over-confident | -| `prevalence`, `n` | Observed detection rate; survey units scored | -| `Climate` … `Full_Joint_Truncated` | v2's seven validation AUCs: climate alone (and capped), landcover alone, the two combined, and combined per habitat type | - -Metrics score each run's final model, so for plants `insample_auc` equals -`v2val_Full`. Runs before 2026-10-03 scored the best single candidate; their -metric summaries are not comparable with these. - -**`tables/grid_summary.csv`** — the final model's prediction for each -habitat type, one row per taxon × region × species × `grid_unit`, on the -response scale, with `n`, `median`, `p10`, `p90`, `boot1`, `mean` and `sd` -over draws. Each row is a pure stand of that type at the stage's -constants (`Climate` 0, the new protocol where fitted, 100 sampling days for -mammals). v2's later coefficient adjustments, such as the plant stand-age -splines, are in the coefficients, not the grid. - -**`tables/coefficient_summary.csv`** (gitignored) — one row per run × -region × stage × species × term, with `n`, `median`, `p10`, `p90`, `boot1`, -`mean` and `sd` over draws. A term means something different by taxon -and stage: - -| Taxon and stage | `term` holds | -| --- | --- | -| Any, `climate` | Model-averaged climate coefficients, link scale | -| Plant group, `habitat` | Effect of each habitat type, logit scale, plus `Intercept`, `Climate` and, for bryophytes and lichens, `Protocol` | -| Mammals, `habitat_presence` / `_abundance` / `_total` | Per habitat type, from v2's hurdle model | -| Birds, `landcover` | Raw `glm` coefficients (e.g. `vegcCrop`) | -| Birds, `habitat` | The same, translated onto v2's standardized habitat types, log scale | - -**`tables/comparison_metrics.csv`** (every experiment except exp_000; -gitignored) — against exp_000, written automatically by `run_experiment()`: -one row per species and metric, with both sides' median, band, mean and -standard deviation, the difference, and whether the experiment did better. -The per-taxon headline (median difference, share of species that did -better, each side's draw count) is printed to the console, not written; a -draw-count mismatch is warned about. "Better" is higher AUC, deviance -explained and Spearman, lower RMSE, and a calibration slope closer to 1. +Each run writes result stores to `2_pipeline////` +(`coefficients.csv`, `metrics.csv`, `grid_predictions.csv`, +`meta.json`) and `2_pipeline//run_log.csv`. It then writes +summary tables and `run_record.md` to `3_output//`. Every +experiment except exp_000 also writes `tables/comparison_metrics.csv` +against exp_000. The file and column definitions are in +[`1_code/harness/`](1_code/harness/). -### exp_000's parity outputs +Committed per experiment, by `.gitignore`: `run_record.md`, `report.md`, +and `tables/` `coverage.csv`, `metric_summary.csv`, `grid_summary.csv`, +`parity_summary.csv` and `v2_self_agreement_summary.csv`. Everything else +is rebuilt from the stores with `run_experiment(config, fit = FALSE)`. -**`tables/parity_terms.csv`** (gitignored) — the term-by-term comparison: -`coefficient_summary.csv` joined to the v2 reference on taxon, region, stage, -part, species and term, with plant habitat terms relabelled as v2 publishes -them and mammal seasons averaged. - -| Column | Meaning | -| --- | --- | -| `ref_region`, `ref_part` | The reference rows joined to; climate joins region `all` | -| `median`, `p10`, `p90`, `boot1`, `n` | This run over draws | -| `v2_median`, `v2_p10`, `v2_p90`, `v2_n`, `source` | v2's summary; `v2_n = 1` means v2 fitted once | -| `comparison`, `run_value` | `median`, or `iteration 1` where v2 fitted once, and the value used | -| `reachable`, `unreachable_reason` | Whether v2 fixes the term at a placeholder | -| `in_band` | `TRUE` where the v2 median falls inside this run's `p10`–`p90` band | -| `absolute_difference`, `standardized_difference` | The gap, raw and ÷ half this run's band. Below 1 is close | - -**`tables/parity_summary.csv`** — the gate, one row per taxon × region × -stage: `species`, `terms_compared`, `min_draws`, `in_band_pct`, -`reachable_terms`, `reachable_in_band_pct`, the median and maximum gaps, -`negligible_terms`, `median_spearman` (reported, not gated), -`median_band_ratio` (this run's band width ÷ v2's; gated between 0.75 and -1.33), `verdict` and `indicative_verdict` (a 100-draw run on a species -subset: the same test, **not** the gate). - -**`figures/`** — `parity_.png` draws each term's run and v2 median -and 10–90% band, relative to v2 (0 is v2's median, one unit half v2's band); -`parity_mean.png` averages them per taxon; `parity_bell.png` shows v2 and the -run as distributions, so a shift is a difference in location and a wider or -narrower curve a difference in spread. - -**`report.md`** — generated: run kind and seed, what each spec reproduces of -v2, the v2 references reached, what ran, parity by stage, and model fit. +**Commit only runs that count:** every species at `n_bootstraps = 100`. +Check that `run_record.md` says so. ## Parity gate -exp_000 is the validation gate: it runs every taxon's v2.0 configuration -through the pipeline and compares the result with the published v2.0 output. - -v2 sets no random seed, so two v2 runs of the same code give different -coefficients, and parity is **distributional**: each term passes when the v2 -median falls inside this run's 10–90% band. Where v2 fits once (mammals), the -run's full-data fit is compared directly. The proposed targets, in -`utils/parity_targets.R`, are set from how closely two v2 runs agree with each -other (`v2_self_agreement.R`): at least 90% of reachable terms in band, a -median standardized difference of 0.25 or less, and a band-width ratio between -0.75 and 1.33. - -`seed` in `run.R` makes this side repeatable: each species draws from its own -seed, derived from the base seed and the species name. `NULL` restores v2's -unseeded behaviour. Birds replay v2's stored draws. +exp_000 runs every taxon's v2 configuration and compares it with the +published v2 coefficients. v2 sets no seed, so parity is distributional: +a term passes when the v2 median falls inside the run's 10–90% band. +Mammals, which v2 fits once, are compared on the full-data fit. The +proposed targets are in +`1_code/experiments/exp_000_parity_v2/utils/parity_targets.R`. -Two things are needed before the gate is closed: +Before the gate is closed: -- **Agree the parity targets** above, per taxon, or change them. -- **Run the full species queues at 100 draws** and commit the report and - record. Only a full run is gated; a run on a species subset gets an - indicative verdict. +- Agree the parity targets, per taxon, or change them. +- Run the full species queues at 100 draws and commit the report and + record. Only a full run is gated. -## Known gaps +Known gaps: published lichen, mite and vascular plant models were +fitted on draws v2 did not keep, so parity against them stays +distributional; and no parity target has been agreed. Each spec's +`v2_coverage` is the authoritative statement per stage. Details are in +the [exp_000 README](1_code/experiments/exp_000_parity_v2/README.md). -Each spec's `v2_coverage` is the authoritative statement per stage and taxon, -and `report.md` prints it. The full list, with evidence, is in -[`docs/reviews/2026-09-28_alignment_review.md`](docs/reviews/2026-09-28_alignment_review.md) -and [`docs/taxon_quirks.md`](docs/taxon_quirks.md). +## Extending the repository -- **Some published v2 results cannot be matched exactly.** The pipeline - matches v2's own code to numerical precision, but the published lichen, - mite and vascular plant models were fitted on bootstrap draws v2 did not - keep, so parity against those is distributional. -- **Birds reproduce only from the right data.** v2's birds were fitted on the - `Stratified.Rdata` in `remote/birds_data_v2/`; the BirdModels drive's copy - was rebuilt after v2 and no longer matches. -- **No parity target has been agreed.** - -## Adding an experiment - -1. Scaffold it, from the repository root: - - ```r - source("1_code/harness/new_experiment.R") - new_experiment("covariate scale") # dry_run = TRUE to preview - ``` - - This takes the next free number across `1_code/experiments/`, - `2_pipeline/` and `3_output/`, so a stale pipeline folder still holds - its number. It then creates `1_code/experiments//` from - `_template/` with `id`, title, author and date filled in, - `2_pipeline//logs/`, and `3_output//` with `figures/`, - `tables/` and a stub `report.md`. -2. `id` in its `run.R` is already the folder's name. Every path derives - from it, so leave it as it is. -3. State the question and design in its `README.md`. -4. Change one thing relative to exp_000: `stage_models` for different - candidate formulas, or `specs` for a different engine or selection rule. - Keep exp_000's species, draws and seed unless they are the question. -5. Run it, first at 5 draws to check it works. It is compared with exp_000 - automatically, in `tables/comparison_metrics.csv`. Compare like with like: run - exp_000 at the same number of draws; a mismatch is warned about. - -[`docs/getting_started.md`](docs/getting_started.md#test-a-change) walks -through each lever. - -## Contributing a taxon module +| To | See | +| --- | --- | +| Add an experiment | `new_experiment("short description")` in `1_code/harness/new_experiment.R`; then [`1_code/experiments/`](1_code/experiments/) and [`docs/getting_started.md`](docs/getting_started.md#test-a-change) | +| Add an engine, selection rule, resampling scheme or metric | [`1_code/methods/README.md`](1_code/methods/README.md) | +| Add a taxon module | [`1_code/modules/`](1_code/modules/) | +| Rebuild or republish the dataset | [`1_code/_setup/`](1_code/_setup/); only maintainers need this | -1. Put the v2 scripts as received in `0_data/v2_scripts//`, - unmodified, and log the source and commit in its `README.md`. -2. Extend `_setup/01` to write the taxon's response table, its covariates, - its species queue, and any prediction grid or stored draws. Extend - `_setup/02` to trace them back to the source. -3. Add the taxon to `_setup/09`: its species queue rows and its rows in - `dataset_manifest.csv`. Re-run `09`. -4. Splice the v2 candidate formulas into `harness/model_sets.R`, verbatim. -5. Add `1_code/modules//spec.R`, modelled on `lichens/spec.R` for a - plant-group taxon or on `birds/spec.R` or `mammals/spec.R` otherwise, and - add its run to `modules/_shared/standard_specs.R`. If v2 does something no - registered method covers, add one to `1_code/methods/`. -6. Add the taxon's published v2 results to `_setup/08`, if ABMIexploreR - publishes them. -7. Check that `validate_spec()` passes and `run_tests.R` runs clean, then - check the result against the originals. Record every taxon-specific - behaviour in `docs/taxon_quirks.md`. +## Conventions -## Naming conventions +Code follows [code_standards](https://github.com/bgcasey/code_standards): +`snake_case` names, a standard header and numbered sections in every +script, ≤70-character lines, and tidyverse style. | Item | Convention | Example | | --- | --- | --- | -| Experiments | `exp_NNN_short_description` | `exp_001_covariate_scale` | +| Experiments | `exp_NNN_short_description`, the same in `1_code/experiments/`, `2_pipeline/` and `3_output/` | `exp_001_xgboost` | +| Sequenced scripts | `NN_` run order; entry points are `run.R` | `08_harmonize_abmiexplorer_results.R` | | Taxon slugs | As the data files name them | `vascular_plant`, `mite`, `bird` | | Module folders | Plural taxon name | `vascular_plants/`, `soil_mites/` | -| Setup scripts | `NN_` run order, in `1_code/_setup/` | `08_harmonize_abmiexplorer_results.R` | - -An experiment's identifier is used verbatim in `1_code/experiments/`, -`2_pipeline/` and `3_output/`. Soil mites use the data slug `mite`. - -## Setup - -R 4.4 or later, plus: - -```r -install.packages(c( - "data.table", "foreach", "AICcmodavg", "arm", "binom", - "mapproj", "mgcv", "MuMIn", "pROC", "RcmdrMisc", - "jsonlite", "ggplot2", # summaries and figures - "testthat" # 1_code/tests/ -)) -``` - -Fitting an experiment needs only read access to -`//ABMI-DATA2/science/sdmMethodsDev/` (on the ABMI network or VPN); nothing -in `_setup/` has to be run. Off the network, copy the published folders -locally and set `SDM_TEST_DATASET` and `SDM_V2_RESULTS` to them. - -Rebuilding the dataset needs the same share, once per snapshot, from the -repository root. `source("1_code/_setup/run.R")` runs the steps below in -order, with switches for each in its section 1.2 (`00`, `03` and `10` are off -by default), and logs timings to `2_pipeline/_setup/run_log.csv`. By hand: - -```r -source("1_code/_setup/01_harmonize_model_ready_v2.R") -source("1_code/_setup/06_harmonize_bird_translation_lookup.R") -source("1_code/_setup/09_harmonize_lookups.R") # offline; seconds -source("1_code/_setup/02_validate_test_dataset.R") - -# The v2 reference. 03 takes hours; re-run only if its sources change -source("1_code/_setup/03_rerun_bryophyte_v2_reference.R") -source("1_code/_setup/07_harmonize_v2_plant_bootstrap_ids.R") -source("1_code/_setup/08_harmonize_abmiexplorer_results.R") - -# Publish, then move the pin in 1_code/harness/data_source.R -source("1_code/_setup/10_publish_datasets.R") -``` - -`00_mirror_setup_inputs.R` is run once, by someone who can reach the -original drives, and again only if a source changes. - -Set these to read or write somewhere other than the default: - -| Variable | Read by | Points at | -| --- | --- | --- | -| `SDM_TEST_DATASET` | the harness, tests | A test dataset folder to read instead of the pinned published version | -| `SDM_V2_RESULTS` | exp_000 | A v2 results folder to read instead of the pinned published version | -| `SDM_SETUP_INPUT_ROOT` | `00`–`08` | The input mirror; defaults to `//ABMI-DATA2/science/sdmMethodsDev/0_data/setup_inputs` | -| `SDM_SHARE_ROOT`, `SDM_DATASET_VERSION`, `SDM_PUBLISH` | `10` | Where to publish, the version folder (`YYYY-MM-DD`), and which datasets | -| `SDM_SNAPSHOT_V2` | `01`, `02` | The `model_ready_v2` snapshot folder | -| `SDM_MAMMAL_CAMERA_CLIMATE` | `01` | `abmi-camera-climate_2023.Rdata` | -| `SDM_MAMMAL_CLIMATE_PRED` | `01`, `02` | `All Species Climate Predictions.csv` | -| `SDM_V2_LOOKUP` | `01` | The v2 folder holding the two plant prediction-matrix CSVs | -| `SDM_WT_SPECIES` | `01` | `WildTrax Species Strings.RData` | -| `SDM_BIRD_DATA` | `01`, `02` | The bird `Stratified.Rdata` v2 was fitted on; mirrored from `work_abmi/1_projects/active/sdmMethodsDev/remote/birds_data_v2/` | -| `SDM_V2_PROJECT` | `03`, `07` | The v2 plant project (`VegetationModels`) | -| `SDM_V2_BIRD_ROOT` | `06` | The v2 bird project (`BirdModels`) | -| `SDM_V2_BIRD_LOOKUP` | `08` | The v2 bird `birdlist.csv` | ## Related resources -- [code_standards](https://github.com/ABbiodiversity/code_standards) — Science - Centre coding conventions -- [sciCentRverse](https://github.com/ABbiodiversity/sciCentRverse) — Science - Centre R functions +- [sciCentRverse](https://github.com/ABbiodiversity/sciCentRverse): + Science Centre R functions. +- [sciSpatialR](https://github.com/ABbiodiversity/sciSpatialR): + Science Centre spatial catalogue. ## Contact From 7b1c8a71a2352a69a448ea1c5c1b56ac9e366df1 Mon Sep 17 00:00:00 2001 From: bgcasey Date: Wed, 7 Oct 2026 13:41:25 -0600 Subject: [PATCH 16/16] Add Quarto documentation site with GitHub Actions workflow - Created .github/workflows/docs.yaml to automate building and deploying the Quarto documentation site to GitHub Pages on pushes to the main branch. - Added docs/.gitignore to exclude Quarto build artifacts from version control. - Introduced docs/_quarto.yml to configure the Quarto project, specifying the website structure and rendering settings. - Created index.md as the homepage for the documentation site, providing an overview and links to getting started. - Added mermaid.lua filter to render Mermaid diagrams in Markdown, enabling compatibility with both GitHub and Quarto rendering. --- .github/workflows/docs.yaml | 75 ++++ docs/.gitignore | 2 + docs/_quarto.yml | 37 ++ docs/getting_started.md | 827 ++++++++++++++++++++++++++++-------- docs/index.md | 15 + docs/mermaid.lua | 41 ++ 6 files changed, 813 insertions(+), 184 deletions(-) create mode 100644 .github/workflows/docs.yaml create mode 100644 docs/.gitignore create mode 100644 docs/_quarto.yml create mode 100644 docs/index.md create mode 100644 docs/mermaid.lua diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml new file mode 100644 index 0000000..a685168 --- /dev/null +++ b/.github/workflows/docs.yaml @@ -0,0 +1,75 @@ +# Build the Quarto docs site in docs/ and publish it to GitHub +# Pages. Same pattern as sciSpatialR's pkgdown workflow. +# +# The site is rebuilt from docs/ on every run and handed to Pages +# as a build artifact, so no rendered HTML is ever committed and +# there is no gh-pages branch to keep in sync. Pull requests build +# but do not publish, which surfaces a broken page during review +# rather than after merge. +# +# The pages are plain Markdown, so Quarto renders them without R. +# Which pages are built is set by `project: render` in +# docs/_quarto.yml. +# +# Repository prerequisite: Settings > Pages > Source = "GitHub +# Actions". Without that, the deploy job fails with a 404. + +name: docs + +on: + push: + branches: [main] + paths: + - "docs/**" + - ".github/workflows/docs.yaml" + pull_request: + paths: + - "docs/**" + - ".github/workflows/docs.yaml" + workflow_dispatch: + +# Deny by default; each job requests only the scopes it needs. +permissions: {} + +# Serialize publishing. Queued runs collapse to the newest, but an +# in-flight deployment is allowed to finish so the live site is +# never left half-written. +concurrency: + group: pages + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - uses: actions/checkout@v7 + + - uses: quarto-dev/quarto-actions/setup@v2 + + # Renders to docs/_site, as set in docs/_quarto.yml + - name: Build site + run: quarto render docs + + # No configure-pages step: Quarto reads its base URL from + # `site-url` in docs/_quarto.yml, so this job stays on + # contents:read alone. + - uses: actions/upload-pages-artifact@v5 + with: + path: docs/_site + + deploy: + # Publishing is a main-branch-only consequence of a green build. + if: github.event_name != 'pull_request' && github.ref == 'refs/heads/main' + needs: build + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + permissions: + pages: write + id-token: write + steps: + - id: deployment + uses: actions/deploy-pages@v5 diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000..47c274c --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,2 @@ +/.quarto/ +/_site/ diff --git a/docs/_quarto.yml b/docs/_quarto.yml new file mode 100644 index 0000000..34b918a --- /dev/null +++ b/docs/_quarto.yml @@ -0,0 +1,37 @@ +# Docs site for sdmMethodsDev, published to GitHub Pages by +# .github/workflows/docs.yaml on every push to main that touches +# docs/. Preview locally from this folder: quarto preview +# Only the pages listed under `render` are built; the other +# docs stay repository-only. +project: + type: website + output-dir: _site + render: + - index.md + - getting_started.md + +website: + title: "sdmMethodsDev" + site-url: "https://abbiodiversity.github.io/sdmMethodsDev/" + repo-url: "https://github.com/ABbiodiversity/sdmMethodsDev" + navbar: + logo: images/abmi_logo.png + left: + - href: index.md + text: Home + - href: getting_started.md + text: Getting started + right: + - icon: github + href: https://github.com/ABbiodiversity/sdmMethodsDev + +format: + html: + theme: cosmo + toc: true + toc-depth: 3 + code-copy: true + +# Renders ```mermaid blocks as diagrams, as GitHub does +filters: + - mermaid.lua diff --git a/docs/getting_started.md b/docs/getting_started.md index f13ea41..3790ca7 100644 --- a/docs/getting_started.md +++ b/docs/getting_started.md @@ -1,252 +1,648 @@ -# Getting started - -This guide covers running the v2 baseline, reading what it writes, -and testing a change against it. It assumes you know R. It does not -assume you know how the v2 models were built. - -- [The idea in one paragraph](#the-idea-in-one-paragraph) -- [Words used throughout](#words-used-throughout) -- [Run the baseline](#run-the-baseline) -- [Read the outputs](#read-the-outputs) +# Getting started with sdmMethodsDev + +This guide takes you from a fresh clone to a run of the v2 +baseline, and then to your first experiment or module change. It +assumes you know R, species distribution models, and spatial +analysis. It does not assume you know this repository or how the +v2.0 models were built. Work through it in order; it takes under +an hour, plus run time. + +Run every code block from the repository root. Lines starting +`#>` are the output the block printed when this guide was written. + +- [What this repository is for](#what-this-repository-is-for) +- [Setup](#setup) +- [How the pipeline fits together](#how-the-pipeline-fits-together) +- [Run the baseline (exp_000)](#run-the-baseline-exp_000) - [Test a change](#test-a-change) -- [Add a method](#add-a-method) +- [Add or update a taxon module](#add-or-update-a-taxon-module) - [Check that nothing broke](#check-that-nothing-broke) -- [Where things are](#where-things-are) - -## The idea in one paragraph - -Every taxon's v2 model follows the same sequence: +- [Working conventions](#working-conventions) +- [Where to get help](#where-to-get-help) -1. Pick survey units. -2. Fit a set of candidate models. -3. Choose among them or average them. -4. Predict and score. +## What this repository is for -What differs between taxa is the contents of each step: the -response, the formulas, the selection rule. Here those contents are -data, in a **spec**, one per taxon. One shared pipeline, the -**harness**, runs any spec. +`sdmMethodsDev` is the Science Centre's shared R&D repository for +Species Models 3.0. It holds a frozen cross-taxa test dataset, one +pipeline that runs every taxon's v2.0 model as configuration, and +a v2 parity check (`exp_000_parity_v2`) that every later +experiment is compared against. A methods question is asked once +and answered for every taxon. -So a methods question is asked once, by changing one entry, and -answered for every taxon. `exp_000_parity_v2` runs the v2 specs and -checks they reproduce v2. Every later experiment changes one thing -and is compared against it. +It is for testing methods. It does not produce the final species +models or reporting products. The status, structure, and design +summary are in the [root README][readme]. -## Words used throughout +### Words used throughout | Word | Means | | --- | --- | | **Spec** | A taxon's v2 configuration as a list: response, family, regions, stages, resampling. Built by functions such as `lichen_spec()` in `1_code/modules//spec.R`. Holds no modelling code. | | **Run** | One spec in an experiment, named as its output folder: `lichen`, `mammal_summer`. `standard_specs()` lists them. | | **Stage** | One model fitted in order. Plants and birds fit `climate`, then `habitat` (or `landcover`). | -| **Carry** | Passing one stage's prediction into the next as a covariate called `Climate`, which is how v2 combines its climate and habitat models. | -| **Candidate set** | The formulas a stage chooses among. The v2 sets are in `harness/model_sets.R`. | -| **Engine** | How one formula is fitted: `glm`, `bayesglm`. | -| **Selection rule** | How a candidate set becomes one result: `aic_average`, `staged_bic`, `ivw_grid`, and so on. | +| **Carry** | Passing one stage's prediction into the next as a covariate called `Climate`. This is how v2 combines its climate and habitat models. | +| **Candidate set** | The formulas a stage chooses among. The v2 sets are in `1_code/harness/model_sets.R`. | +| **Method** | A named, registered piece: an engine (`glm`, `bayesglm`, `xgboost`), a selection rule (`aic_average`, `staged_bic`, `ivw_grid`), a resampling scheme, or a metric. | | **Draw** | One bootstrap resample of the survey units. v2 uses 100. Draw 1 is the full data. | -| **Store** | A folder of results for one run and region: `coefficients.csv`, `metrics.csv`, `grid_predictions.csv`, `meta.json`. | -| **Grid** | A prediction matrix with one row per habitat type, each row a pure stand of that type. Predicting onto it gives each method's effect per habitat type, so methods without coefficients can be compared. | -| **Out-of-bag (oob)** | Scored on the survey units a draw left out, which is the held-out read. `insample` scores the units the draw fitted. | -| **Parity** | Whether a run reproduces v2. Distributional, not numerical: v2 sets no random seed, so two v2 runs differ. | +| **Store** | The results for one run and region: `coefficients.csv`, `metrics.csv`, `grid_predictions.csv`, `meta.json`. | +| **Grid** | A prediction matrix with one row per habitat type, each row a pure stand of that type. Predicting onto it lets methods without coefficients be compared. | +| **Out-of-bag (oob)** | Scored on the survey units a draw left out. `insample` scores the units the draw fitted. | +| **Parity** | Whether a run reproduces v2. Distributional, not numerical: v2 sets no seed, so two v2 runs differ. | -## Run the baseline +## Setup -Open the project in RStudio or Positron. The working directory is -then the repository root. You need read access to -`//ABMI-DATA2/science/sdmMethodsDev/` (on the ABMI network or VPN): -the test dataset and the v2 results are read from there, so you do -not run `_setup/`. Off the network, copy the published folders and -set `SDM_TEST_DATASET` and `SDM_V2_RESULTS` to them. Then: +### Prerequisites + +You need R 4.4 or later. Open the repository in RStudio or +Positron so the working directory is the repository root. Every +path in this guide, and every script, assumes that. + +The repository has no `renv.lock` or `DESCRIPTION`, so packages +are installed by hand. These are the packages the +[root README][readme-prereq] lists: ```r -source("1_code/experiments/exp_000_parity_v2/run.R") +install.packages(c( + "data.table", "arm", "mgcv", "MuMIn", "pROC", # harness, methods + "jsonlite", "ggplot2", # summaries, figures + "xgboost", # xgboost engine + "testthat", "withr" # 1_code/tests/ +)) ``` -`run.R` is a page of decisions, `experiment_config()`, followed by -one call, `run_experiment()`. Before you run it, check three -settings: +`exp_002_soilgrids` also needs `sf`, `terra`, and +[sciSpatialR](https://github.com/ABbiodiversity/sciSpatialR). +Maintainers rebuilding the dataset with `_setup/03` also need +`foreach`, `AICcmodavg`, `binom`, `mapproj`, and `RcmdrMisc`. -| Setting | For a quick check | For the real thing | -| --- | --- | --- | -| `species` | `"one_each"` (one species per taxon) | `"parity_check"`, or `NULL` for every species | -| `n_bootstraps` | `5` | `100` | -| `workers` | 4 | up to the cores you can spare | +> **TODO:** confirm with Brendan Casey whether package versions +> will be pinned (for example with `renv`). Until then, the version +> comments in each script's `library()` calls are the only record. + +### Getting the data + +You do not build the data. `0_data/` is gitignored, and runs do +not read it. Runs read two published, versioned datasets from the +ABMI network share: + +- **Test dataset:** + `//ABMI-DATA2/science/sdmMethodsDev/0_data/test_dataset//` +- **v2 results** (the parity reference): + `//ABMI-DATA2/science/sdmMethodsDev/0_data/v2_results//` + +The version read is pinned in `sdm_published$versions` in +[`1_code/harness/data_source.R`][data-source]. A published version +is never overwritten. Each folder carries a `checksums.csv`, and +the test dataset's file index is `lookup/dataset_manifest.csv`. +The harness reads file locations only from that manifest. + +So the one requirement is **read access to the share**, on the +ABMI network or VPN. + +> **TODO:** confirm with Brendan Casey how new staff request read +> access to `//ABMI-DATA2/science/sdmMethodsDev/` and the VPN. + +Off the network, copy the two published folders to your machine +and point the harness at them. The variables can also go in your +user `.Renviron`: + +```r +Sys.setenv( + SDM_TEST_DATASET = "D:/data/sdmMethodsDev/test_dataset/2026-10-05", + SDM_V2_RESULTS = "D:/data/sdmMethodsDev/v2_results/2026-10-05" +) +``` + +`1_code/_setup/` builds and publishes these datasets. Only +maintainers run it; see the [`_setup` README][setup] if that is +you. + +### Check that the setup works + +First, load the framework. This sources the harness, every +method, every taxon module, and the shared species sets. It reads +no data. + +```r +source("1_code/harness/harness.R") +load_framework() +``` + +Then confirm the data can be reached. `test_dataset_dir()` and +`v2_results_dir()` stop with a clear message if the share is +unreachable or a file is missing or the wrong size. + +```r +data_dir <- test_dataset_dir() +v2_dir <- v2_results_dir() + +file.exists(c( + file.path(data_dir, "lookup", "dataset_manifest.csv"), + file.path(v2_dir, "abmiexplorer", "v2_results.csv") +)) +#> [1] TRUE TRUE +``` + +`verify_published(test_dataset_dir())` does a full md5 check. It +is slow over the network (about 0.9 GB), so use it only when a +copy is in doubt. + +Last, run the contract tests from a terminal at the repository +root. They take seconds, and skip the dataset checks if the share +cannot be reached. + +```sh +Rscript 1_code/tests/run_tests.R +``` -`experiment_config()` checks the configuration before anything is -fitted, and prints what it will do. Shorten a trial by cutting -species, not draws: a 10–90% band read from five draws does not -mean much. +If the tests pass and both files exist, you are ready to run. + +## How the pipeline fits together + +The v2.0 pipelines share one sequence: pick survey units, fit +candidate models, choose among or average them, then predict and +score. What differs between taxa is the contents of each step. +Here, those contents are data in a **spec**, and one **harness** +runs any spec. + +```mermaid +%% ---------------------------- +%% How one experiment runs +%% ---------------------------- +%%{init: {"themeVariables": {"edgeLabelBackground": "#ffffff"}}}%% +flowchart TD + + subgraph fw["framework: one experiment, from spec to comparison"] + direction TB + M["1_code/modules/[taxon]/
v2 spec per taxon"] --> SS["standard_specs()"] + SS --> C["1_code/experiments/exp_NNN/run.R
experiment_config()"] + C --> H["1_code/harness/
run_experiment()"] + MT["1_code/methods/
engines · selection rules · resampling · metrics"] + MT -.->|"looked up by name"| H + D["published test dataset
harness/data_source.R"] --> H + H --> P["2_pipeline/[id]/
result stores · run_log.csv"] + P --> O["3_output/[id]/
tables · run_record.md"] + O --> CMP["compare_experiments()
against exp_000"] + end + + %% ---------------------------- + %% Styles + %% ---------------------------- + + %% Container + style fw fill:none,stroke:#2D415B,stroke-width:1px + + %% Configuration + style M fill:#A3B4C7,stroke:#2D415B,stroke-width:1px + style SS fill:#A3B4C7,stroke:#2D415B,stroke-width:1px + style C fill:#A3B4C7,stroke:#2D415B,stroke-width:1px + style MT fill:#A3B4C7,stroke:#2D415B,stroke-width:1px,stroke-dasharray: 5 5 + + %% Inputs and outputs + style D fill:#ffffff,stroke:#2D415B,stroke-width:1px,stroke-dasharray: 5 5 + style P fill:#ffffff,stroke:#2D415B,stroke-width:1px,stroke-dasharray: 5 5 + style O fill:#ffffff,stroke:#2D415B,stroke-width:1px,stroke-dasharray: 5 5 + + %% Shared pipeline + style H fill:#A4A88780,stroke:#C8A02C,stroke-width:4px + + %% Comparison + style CMP fill:#E8A396,stroke:#2D415B,stroke-width:4px +``` + +The runs the standard specs offer, and the methods registered: -On a 24-core machine, for the 14 `parity_check` species (5-draw rows measured): +```r +names(standard_specs()) +#> [1] "bryophyte" "lichen" "mite" "vascular_plant" +#> [5] "mammal_summer" "mammal_winter" "bird" -| Draws | Workers | Time | +list_methods() # kind, name, requires, description +``` + +`run_experiment()` does seven things in order: + +1. **Configure.** `experiment_config()` checks every decision + before anything is fitted. +2. **Fit.** Each spec is validated, and each species is one job. + With `workers` above 1, jobs run in parallel R sessions. Each + species draws under its own seed, so results do not depend on + the worker count. A failed species or draw is logged and the + run continues. +3. **Store.** One store per run and region in `2_pipeline//`, + plus `run_log.csv`. +4. **Summarize.** `collect_results()` writes + `3_output//tables/`. +5. **Compare.** Every experiment except exp_000 writes + `tables/comparison_metrics.csv` against exp_000. +6. **Steps.** The experiment's own `steps`, in order. +7. **Record.** `run_record.md`. + +The full argument list and output file definitions are in the +[harness README][harness]. + +### Where things are + +| Folder | Holds | Edit it to | | --- | --- | --- | -| 5 | 1 | about 6 min | -| 5 | 12 | about 1.6 min, set by the slowest species (a bird, about 1 min) | -| 100 | 12 | estimated 25–30 min (not yet run); the previous, serial code took 3.3 h | +| `1_code/harness/` | The shared pipeline: configure, fit, store, summarize, compare. Names no taxon and no method | Change how every experiment runs (review as such) | +| `1_code/methods/` | Engines, selection rules, resampling schemes, metrics; each file registers one method | Add a method | +| `1_code/modules//` | Each taxon's v2 spec; `_shared/` holds the plant-group builder and `standard_specs()` | Record what v2 does for a taxon | +| `1_code/experiments/exp_NNN_*/` | One folder per question; `run.R` holds the decisions | Ask a question | +| `1_code/experiments/_shared/` | Named focal-species sets | Add a reusable species set | +| `1_code/tests/` | Contract tests and the store comparison | Add a check | +| `1_code/_setup/` | One-off scripts that build and publish the dataset | Rebuild or extend the dataset (maintainers) | +| `0_data/test_dataset/` | The dataset as `_setup/` builds it; runs read the published copy | Nothing; rebuilt by `_setup/` | +| `2_pipeline//` | Result stores and intermediates; gitignored | Nothing; written by runs | +| `3_output//` | Summary tables, figures, report, run record | Nothing by hand; small summaries are committed | +| `docs/` | This guide, design, taxon quirks, reviews | | -Parallel workers are separate R sessions that load the framework from -disk when the run starts, so do not edit `1_code/` files while one is -starting. +## Run the baseline (exp_000) -## Read the outputs +`exp_000_parity_v2` runs each taxon's v2 spec and compares the +result with the published v2 coefficients. It is the baseline for +every other experiment. It is intended as the gate before +iterative R&D, but it is **not yet a gate**: the parity targets +are proposals, and no full run has been committed. See the +[exp_000 README][exp000] for what must happen first. -Everything lands in `3_output//`. Read these in order: +### Step 1: Check the settings -1. **`run_record.md`**: what ran. If it is not every species at 100 - draws, the numbers describe a trial. -2. **`report.md`**: what each spec reproduces of v2, parity by - stage, and model fit (AUC). -3. **`tables/parity_summary.csv`**: one row per taxon, region and - stage, with a verdict. -4. **`tables/metric_summary.csv`**: fit metrics per species. Read - the `oob_` rows. -5. **`tables/grid_summary.csv`**: the predicted effect of each - habitat type, per species. +Open [`1_code/experiments/exp_000_parity_v2/run.R`][exp000-run]. +Section 1.2, the `experiment_config()` call, is the whole +configuration. Check three settings: -The column definitions are in the -[README's outputs section](../README.md#outputs-2_pipeline-and-3_output). +| Setting | Quick check | Full run | +| --- | --- | --- | +| `species` | `"one_each"` (one species per taxon) or `"parity_check"` (two per taxon; the committed value) | `NULL`, every species | +| `n_bootstraps` | `5` (the committed value) | `100` | +| `workers` | 4 | Up to the cores you can spare (committed: 12) | -The model behind every metric and grid prediction is each stage's -**final** model. That is the averaged one where v2 averages -candidates, and v2's own prediction from its coefficient tables -for plants. It is not the single best candidate. +The named species sets are: -## Test a change +```r +names(focal_species_sets()) +#> [1] "full" "parity_check" "plants_only" "one_each" +``` + +Shorten a trial by cutting species, not draws. A 10-90% band read +from five draws is unstable. On a 24-core machine, the 14 +`parity_check` species at 5 draws took about 6 minutes on one +worker and about 1.6 minutes on 12. A full run of every species +at 100 draws is days of compute. + +Parallel workers load the framework from disk when the run +starts, so do not edit files in `1_code/` while one is starting. -Scaffold an experiment from the repository root: +### Step 2: Run it ```r -source("1_code/harness/new_experiment.R") -new_experiment("short description") +source("1_code/experiments/exp_000_parity_v2/run.R") ``` -It numbers the experiment (one past the highest `exp_NNN` in -`1_code/experiments/`, `2_pipeline/` or `3_output/`), copies -`1_code/experiments/_template/` with `id` set, and creates the -matching `2_pipeline//logs/` and `3_output//` folders -(`figures/`, `tables/`, `report.md`). Write the question in the -README. Then change one thing. There are -three levers, from least to most invasive. +`experiment_config()` prints what it will do, and notes if you are +running fewer than 100 draws. After fitting, `run_experiment()` +runs exp_000's three steps: `01_compare_to_v2.R`, +`02_plot_parity.R`, and `03_build_report.R`. -### 1. Different candidate formulas: `stage_models` +To rebuild the tables, figures, and report from existing stores +without refitting, set `fit = FALSE` in the `run_experiment()` call +in section 2 of `run.R`. + +### Step 3: Find the outputs + +| Where | What | +| --- | --- | +| `2_pipeline/exp_000_parity_v2///` | Result stores: `coefficients.csv`, `metrics.csv`, `grid_predictions.csv`, `meta.json` | +| `2_pipeline/exp_000_parity_v2/run_log.csv` | Every species, region, and draw: `ok`, or why not | +| `3_output/exp_000_parity_v2/run_record.md` | What ran: species, draws, seed, data versions | +| `3_output/exp_000_parity_v2/report.md` | What each spec reproduces of v2, parity by stage, and model fit | +| `3_output/exp_000_parity_v2/tables/parity_summary.csv` | The gate table: one row per taxon, region, and stage | +| `3_output/exp_000_parity_v2/tables/parity_terms.csv` | Term-by-term comparison (gitignored) | +| `3_output/exp_000_parity_v2/tables/metric_summary.csv` | Fit metrics per species; read the `oob_` rows | +| `3_output/exp_000_parity_v2/tables/grid_summary.csv` | Predicted effect of each habitat type, per species | +| `3_output/exp_000_parity_v2/figures/` | Parity plots per taxon | + +Read `run_record.md` first. If it does not say every species at +100 draws, the numbers describe a trial. -The covariates a run loads are read off the formulas it fits. -Changing the formulas is therefore all it takes to try new -covariates. +### Step 4: Tell whether parity passed + +Open `tables/parity_summary.csv`: ```r -stage_models = list( - # every v2 climate candidate, plus elevation - climate = extend_models("climate_plant_v2_full", "elevation"), - # or, for mites only, a ladder built from covariates - mite.climate = models_from_covariates( - c("MAP", "FFP", "CMD"), form = "ladder" - ) +library(data.table) + +parity <- fread( + "3_output/exp_000_parity_v2/tables/parity_summary.csv" ) +parity[, .( + taxon, region, stage, comparison, min_draws, + reachable_in_band_pct, verdict, indicative_verdict +)] +``` + +Read the `verdict` and `indicative_verdict` columns: + +| Value | Means | +| --- | --- | +| `pass` / `fail` | Against the targets in `utils/parity_targets.R` | +| `not gated (trial run)` | Fewer draws than v2, or a species subset; no verdict given | +| `not gated (store holds N draws)` | The store holds fewer draws than v2 | +| `no comparison` | No reachable terms to compare | + +Only a full run (`species = NULL`, `n_bootstraps = 100`) fills +`verdict`. A 100-draw run on a species subset fills +`indicative_verdict` instead. The proposed targets: + +- **Distributional** (plant and bird stages): at least 90% of + reachable terms with the v2 median inside the run's 10-90% band, + median standardized difference at most 0.25, and median + band-width ratio between 0.75 and 1.33. +- **Numerical** (mammals, fitted once by v2): every reachable term + within 1e-6 on iteration 1. + +Commit `run_record.md`, `report.md`, and the summary tables only +after a full run. `.gitignore` already limits what can be +committed from `3_output/`. + +## Test a change + +An experiment asks one question by changing one thing relative to +exp_000. Everything else (taxa, species, draws, seed) stays the +same unless it is the question. + +### Scaffold an experiment + +`new_experiment()` is base R and runs without `load_framework()`. +Preview first; a dry run writes nothing: + +```r +source("1_code/harness/new_experiment.R") +new_experiment("covariate scale", dry_run = TRUE) +#> exp_003_covariate_scale (dry run; nothing written) +#> ./1_code/experiments/exp_003_covariate_scale +#> ./2_pipeline/exp_003_covariate_scale +#> ./3_output/exp_003_covariate_scale ``` -Keys are `stage` (every taxon) or `taxon.stage` (one taxon). -`meta.json` records the override, so a run that did not fit the v2 -sets cannot be mistaken for one that did. +Then create it: + +```r +new_experiment("covariate scale") +``` + +It takes the next free number across `1_code/experiments/`, +`2_pipeline/`, and `3_output/`, and creates: + +- `1_code/experiments//`: `run.R` and `README.md` from + `_template/`, with id, title, author, and date filled in. +- `2_pipeline//logs/`: for intermediates (gitignored). +- `3_output//`: `figures/`, `tables/`, and a stub `report.md`. + +Leave `id` in `run.R` as it is. Write the question and design in +the experiment's `README.md` before you run anything. -A covariate the dataset does not hold comes from the experiment -itself. Write a script in the experiment's folder that saves a CSV -to `2_pipeline//inputs/`, with one row per `survey_unit_id`, -and name the file in the config: +`run.R` loads the framework, calls `experiment_config()`, then +`run_experiment()`. Change one thing, using one of three levers, +from least to most invasive. + +### 1. Different candidate formulas: `stage_models` + +The covariates a run loads are read off its formulas, so this is +also how you try new covariates. Keys are `stage` (every taxon in +the run) or `taxon.stage` (one taxon). ```r config <- experiment_config( - ..., + id = "exp_003_covariate_scale", + taxa = c("bryophyte", "lichen", "mite", "vascular_plant"), + species = "parity_check", + n_bootstraps = 5, stage_models = list( - climate = extend_models("climate_plant_v2_full", "sg_clay_0_5cm") + # every v2 plant climate candidate, plus elevation + climate = extend_models("climate_plant_v2_full", "elevation"), + # mites only: a ladder built from three covariates + mite.climate = models_from_covariates( + c("MAP", "FFP", "CMD"), + form = "ladder" + ) ), - covariate_files = "2_pipeline/exp_NNN/inputs/my_covariates.csv" + workers = 4 ) ``` -Never add columns to `0_data/` or change `_setup/` for an -experiment: those hold the v2 data every experiment is compared -against. `exp_002_soilgrids` is a worked example. +A covariate the dataset does not hold comes from the experiment. +Write a script in the experiment's folder that saves a CSV to +`2_pipeline//inputs/`, one row per `survey_unit_id`, and name +it in `covariate_files`. Never add columns to `0_data/` or change +`_setup/`: those hold the v2 data every experiment is compared +against. [`exp_002_soilgrids`][exp002] is the worked example. ### 2. A different engine or rule: `specs` -Build the standard specs, change a stage, and pass them in. For -example, to fit the bird landcover stage with a registered engine -called `my_engine`, one formula, no ranking: +Build the standard specs, change a stage, and pass them in. +`replace_stage_method()` swaps each spec's habitat stage, and +drops v2 post-processing that needs coefficients: ```r -specs <- standard_specs() -specs$bird$stages[[2]]$engine <- "my_engine" -specs$bird$stages[[2]]$selection <- "single" +specs <- lapply( + standard_specs(), replace_stage_method, + engine = "xgboost" +) config <- experiment_config( - id = "exp_002_my_engine", taxa = "bird", specs = specs, ... + id = "exp_003_covariate_scale", + specs = specs, + species = "parity_check", + n_bootstraps = 5 ) ``` +To change one stage by hand instead, edit the spec list directly, +for example `specs$bird$stages[[2]]$selection <- "single"`. + `validate_spec()` checks the combination before anything runs. A -rule that needs something the engine cannot give, such as standard +rule that needs what the engine cannot give, such as standard errors for inverse-variance averaging, stops the run with a -sentence that says so. +sentence that says so. [`exp_001_xgboost`][exp001] is the worked +example. + +### 3. A new method -v2 post-processing steps that read coefficients do not apply to an -engine without them. Examples are the plant stand-age splines and -footprint pooling, set in a stage's `post_process`. Remove them -when you swap such an engine in: +Copy the matching template from `1_code/methods/_templates/` into +the right folder of `1_code/methods/`, fill it in, and register +it. Check an engine with `check_engine()`, confirm it appears in +`list_methods()`, then name it in a spec as in lever 2: ```r -specs$lichen$stages[[2]]$post_process <- NULL +check_engine("glm") # or check_engine(engine_mine()) +list_methods("engine") ``` -### 3. A new method +The engine, selection, resampler, and metric contracts, and a +checklist, are in the [methods README][methods]. + +### Run it and read the comparison + +Run it at 5 draws to check it works, then at 100. Compare it with +an exp_000 run at the same number of draws. + +```r +source("1_code/experiments/exp_003_covariate_scale/run.R") +``` + +Outputs go to `2_pipeline//` and `3_output//`, laid out as +for exp_000. `run_experiment()` prints a headline per taxon, +region, and metric (the median difference from exp_000, and the +share of species that did better). It writes +`tables/comparison_metrics.csv`: one row per species and metric, +with both runs' 10-90% bands. Set `baseline = NULL` in +`experiment_config()` to skip the comparison. -See [`1_code/methods/README.md`](../1_code/methods/README.md). A new -engine, rule, resampling scheme or metric is one file there. After -that, it is a name in a spec, as in lever 2. +"Better" means higher AUC, deviance explained, and Spearman; lower +RMSE; and a calibration slope closer to 1. A difference is worth +reading only if it is consistent across species and large relative +to the bands. -### Reading the comparison +## Add or update a taxon module -Every experiment is compared with exp_000 automatically: -`run_experiment()` prints the headline per taxon, region and -metric (the median difference from exp_000, and the share of -species that did better), and writes `tables/comparison_metrics.csv`: -one row per species and metric, with both runs' 10–90% bands. Set -`baseline = NULL` in `experiment_config()` to skip it. +A module is configuration, not modelling code. It states what v2 +does for a taxon as a spec list, and the harness runs it. -"Better" means: +### The interface -- higher AUC, deviance explained and Spearman; -- lower RMSE; -- a calibration slope closer to 1. +From the [modules README][modules] and `1_code/harness/spec.R`, a +module must: -A difference is only worth reading if it is consistent across -species (`share_better`) and large relative to the bands. +1. Define `_spec(...)` in + `1_code/modules//spec.R`, returning a spec list. +2. Return a spec that passes `validate_spec()`. Unknown fields are + errors, and every engine, rule, and resampler it names must be + registered. +3. Add its run to `standard_specs()` in + `1_code/modules/_shared/standard_specs.R`. -## Add a method +`load_framework()` sources `_shared/` first, then every other +module folder, each in file-name order. The fields a spec may use +are defined by `spec_fields()`, one vector per level: -The short version: +```r +names(spec_fields()) +#> [1] "spec" "region" "stage" "resample" + +spec_fields()$stage +#> [1] "name" "models" "engine" +#> [4] "selection" "ic" "control" +#> [7] "family" "scope" "weighted" +#> [10] "base_terms" "response_transform" "row_filter" +#> [13] "min_detections" "extra_covariates" "post_process" +#> [16] "calibrate" "carry_as" "carry_scale" +#> [19] "carry_offset" "carry_from" "carry_from_as" +#> [22] "constants" "grid_constants" +``` -1. Copy the matching template from `1_code/methods/_templates/` - into the matching folder of `1_code/methods/`. -2. Fill it in, and register it. -3. Check it: +A stage may also hold any argument its selection rule takes, as a +setting for that rule (for example `always_advance` for +`staged_bic`). Check an existing spec, and what it reproduces: - ```r - source("1_code/harness/harness.R") - load_framework() - check_engine(engine_mine()) # for an engine - list_methods() # it should be listed - ``` +```r +validate_spec(lichen_spec()) +spec_coverage(list(bird = bird_spec())) +``` -4. Run `Rscript 1_code/tests/run_tests.R`. -5. Name it in a spec (lever 2 above), then try it on - `species = "one_each"` with `n_bootstraps = 5`. +### A minimal skeleton + +Modelled on `bird_spec()`. Replace every `<...>`. The model set +names must exist in `model_sets()` (`1_code/harness/model_sets.R`), +and the grid name must exist in the dataset manifest. + +```r +#' Build the v2 Spec for +#' +#' @return A spec list, as run_spec() consumes. +#' +#' @example # Example usage of the function +#' # validate_spec(_spec()) +_spec <- function() { + list( + taxon = "", + habitat_stage = "habitat", + response_name = "response", + response_transform = "identity", + family = "binomial", + weight_column = NULL, + + # One-sided formulas on the site columns, as in bird_spec() + regions = list( + north = list( + filter = ~ useNorth == 1, + grid = "", + habitat_models = "" + ), + south = list( + filter = ~ useSouth == 1, + grid = "", + habitat_models = "" + ) + ), + + stages = list( + list( + name = "climate", + models = "", + engine = "glm", + selection = "aic_average", + ic = "AICc", + carry_as = "Climate" + ), + list( + name = "habitat", + models = NULL, # per region: habitat_models + engine = "glm", + selection = "aic_best", + ic = "AICc", + carry_from = "climate", + carry_from_as = "Climate" + ) + ), + + resample = list(scheme = "spatial_block"), + + v2_coverage = list( + climate = v2_status("partial", ""), + habitat = v2_status("partial", "") + ), + + notes = "" + ) +} +``` + +Then add it to `standard_specs()`: + +```r +# in 1_code/modules/_shared/standard_specs.R +standard_specs <- function(plant_bootstrap = "spatial_block") { + list( + # ... existing runs ... + = _spec() + ) +} +``` + +A new taxon also needs data. The full sequence is in the +[modules README][modules-add]: v2 scripts into +`0_data/v2_scripts/`, `_setup/01`, `02`, `09`, and `08` extended, +candidate formulas spliced into `model_sets.R`, and each +taxon-specific behaviour recorded in +[`docs/taxon_quirks.md`][quirks]. Those `_setup/` steps are +maintainer work. ## Check that nothing broke -A change to `harness/`, `methods/` or `modules/` affects every -experiment, past and future. Before relying on one, take two steps. +A change to `harness/`, `methods/`, or `modules/` affects every +experiment, past and future. Before relying on it, take two steps. **1. Run the tests.** These take seconds: @@ -255,27 +651,90 @@ Rscript 1_code/tests/run_tests.R ``` **2. Confirm the v2 results are unchanged.** Draws are seeded per -species and made in order, so draws 1–5 of a 5-draw run are the -same rows as draws 1–5 of the 100-draw baseline. Run the parity -species at 5 draws to a scratch folder, then compare: +species and made in order, so draws 1-5 of a 5-draw run match +draws 1-5 of a 100-draw run. Run the `parity_check` species at 5 +draws to a scratch folder (set `pipeline_dir` and `out_dir` in +`experiment_config()`), then compare: ```sh Rscript 1_code/tests/compare_stores.R \ 2_pipeline/exp_000_parity_v2 2_pipeline/ 5 ``` -Every coefficient file should match to 1e-10. A change that is -meant to alter results should alter only what it says it does. - -## Where things are - -| Folder | Holds | Edit it to | -| --- | --- | --- | -| `1_code/harness/` | The shared pipeline: loading, the fitting loop, summaries, comparison | Change how every experiment runs (review as such) | -| `1_code/methods/` | Engines, selection rules, resampling schemes, metrics | Add a method | -| `1_code/modules//` | Each taxon's v2 spec | Record what v2 does for a taxon | -| `1_code/experiments/exp_NNN_*/` | One folder per question | Ask a question | -| `1_code/experiments/_shared/` | Named focal-species sets | Add a reusable species set | -| `1_code/_setup/` | One-off scripts that build `0_data/` | Rebuild or extend the dataset | -| `0_data/test_dataset/` | The frozen dataset as `_setup/` builds it. Runs read the copy published on ABMI-DATA2, pinned in `1_code/harness/data_source.R`. `lookup/dataset_manifest.csv` says which file is whose | Nothing; it is rebuilt by `_setup/` and republished by `_setup/10` | -| `docs/` | Design, taxon quirks, this guide | | +Every coefficient file should match to 1e-10. A change meant to +alter results should alter only what it says it does. More on both +tools is in the [tests README][tests]. + +## Working conventions + +- **Naming:** `snake_case` everywhere. Experiments are + `exp_NNN_short_description`, the same in `1_code/experiments/`, + `2_pipeline/`, and `3_output/`. Sequenced scripts take an `NN_` + prefix; entry points are `run.R`. Module folders use the plural + taxon name (`soil_mites/`); specs use the data slug (`mite`). + See the [root README conventions][readme-conv] and + [code_standards: project structure][cs-structure]. +- **Scripts and style:** every script has the standard header and + numbered `----` sections; tidyverse style, `%>%`, lines of 70 + characters or fewer. See [code_standards: templates][cs-templates] + and [code style][cs-style]. +- **Code review:** review against the five areas in + [code_standards: code review][cs-review]. Treat any change to + `harness/`, `methods/`, or `modules/` as a change to every + experiment: include passing tests and a `compare_stores.R` + result. +- **Commits from `3_output/`:** commit only runs that count, every + species at 100 draws, and check `run_record.md` says so. +- **Branching and pull requests:** + + > **TODO:** confirm with Brendan Casey. Neither this repository + > nor `code_standards` documents a branching or pull request + > workflow. + +## Where to get help + +- **Repository and data access:** Brendan Casey, + brendan.casey@ualberta.ca (contact in the + [root README][readme-contact]). +- **Taxon-specific v2 questions:** + + > **TODO:** confirm with Brendan Casey who owns each taxon + > (bryophytes, lichens, soil mites, vascular plants, mammals, + > birds). + +- **Design and contracts:** [`docs/framework_design.md`][design]. +- **Every taxon-specific v2 behaviour:** + [`docs/taxon_quirks.md`][quirks]. +- **Folder detail:** the READMEs in [`harness/`][harness], + [`methods/`][methods], [`modules/`][modules], + [`experiments/`][experiments], [`tests/`][tests], and + [`_setup/`][setup]. +- **Related tools:** + [sciCentRverse](https://github.com/ABbiodiversity/sciCentRverse) + and [sciSpatialR](https://github.com/ABbiodiversity/sciSpatialR). + + + +[readme]: https://github.com/ABbiodiversity/sdmMethodsDev/blob/main/README.md +[readme-prereq]: https://github.com/ABbiodiversity/sdmMethodsDev/blob/main/README.md#prerequisites +[readme-conv]: https://github.com/ABbiodiversity/sdmMethodsDev/blob/main/README.md#conventions +[readme-contact]: https://github.com/ABbiodiversity/sdmMethodsDev/blob/main/README.md#contact +[data-source]: https://github.com/ABbiodiversity/sdmMethodsDev/blob/main/1_code/harness/data_source.R +[harness]: https://github.com/ABbiodiversity/sdmMethodsDev/blob/main/1_code/harness/README.md +[methods]: https://github.com/ABbiodiversity/sdmMethodsDev/blob/main/1_code/methods/README.md +[modules]: https://github.com/ABbiodiversity/sdmMethodsDev/blob/main/1_code/modules/README.md +[modules-add]: https://github.com/ABbiodiversity/sdmMethodsDev/blob/main/1_code/modules/README.md#adding-a-taxon-module +[experiments]: https://github.com/ABbiodiversity/sdmMethodsDev/blob/main/1_code/experiments/README.md +[exp000]: https://github.com/ABbiodiversity/sdmMethodsDev/blob/main/1_code/experiments/exp_000_parity_v2/README.md +[exp000-run]: https://github.com/ABbiodiversity/sdmMethodsDev/blob/main/1_code/experiments/exp_000_parity_v2/run.R +[exp001]: https://github.com/ABbiodiversity/sdmMethodsDev/blob/main/1_code/experiments/exp_001_xgboost/README.md +[exp002]: https://github.com/ABbiodiversity/sdmMethodsDev/blob/main/1_code/experiments/exp_002_soilgrids/README.md +[tests]: https://github.com/ABbiodiversity/sdmMethodsDev/blob/main/1_code/tests/README.md +[setup]: https://github.com/ABbiodiversity/sdmMethodsDev/blob/main/1_code/_setup/README.md +[design]: https://github.com/ABbiodiversity/sdmMethodsDev/blob/main/docs/framework_design.md +[quirks]: https://github.com/ABbiodiversity/sdmMethodsDev/blob/main/docs/taxon_quirks.md +[cs-structure]: https://github.com/bgcasey/code_standards#6-project-directory-structure +[cs-templates]: https://github.com/bgcasey/code_standards#1-script-templates +[cs-style]: https://github.com/bgcasey/code_standards#2-code-style +[cs-review]: https://github.com/bgcasey/code_standards#7-code-review diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..01746a5 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,15 @@ +# sdmMethodsDev + +The ABMI Science Centre's shared R&D repository for Species Models +3.0: a frozen cross-taxa test dataset, one pipeline that runs every +taxon's v2.0 model as configuration, and a v2 parity check that +every later experiment is compared against. + +This site is for Science Centre modellers. It is intended for +internal use. + +- **New here?** Start with [Getting started](getting_started.md): + setup, running the v2 baseline, starting an experiment, and + adding a taxon module. +- **The code and the full documentation** are in the + [repository](https://github.com/ABbiodiversity/sdmMethodsDev). diff --git a/docs/mermaid.lua b/docs/mermaid.lua new file mode 100644 index 0000000..7955a03 --- /dev/null +++ b/docs/mermaid.lua @@ -0,0 +1,41 @@ +-- --- +-- title: Render Mermaid Code Blocks on the Docs Site +-- author: Brendan Casey +-- created: 2026-10-07 +-- inputs: ```mermaid fenced code blocks in the site's pages +-- outputs:
 blocks, and the mermaid.js
+--   script, in the HTML
+-- notes:
+--   - GitHub renders ```mermaid blocks; Quarto only renders its
+--     own {mermaid} cells. This filter lets one Markdown source
+--     show the diagram in both places.
+-- ---
+
+local function escape_html(text)
+  return (text:gsub("&", "&"):gsub("<", "<"):gsub(">", ">"))
+end
+
+local used = false
+
+function CodeBlock(block)
+  if not block.classes:includes("mermaid") then
+    return nil
+  end
+
+  used = true
+  return pandoc.RawBlock(
+    "html",
+    '
' .. escape_html(block.text) .. "
" + ) +end + +function Pandoc(doc) + if used then + quarto.doc.include_text("after-body", [[ +]]) + end + return doc +end