## ----setup, include=FALSE----------------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.width = 7, fig.height = 5, dpi = 100, out.width = "95%" ) ## ----------------------------------------------------------------------------- # Load packages library(nicheR) # Saving original plotting parameters original_par <- par(no.readonly = TRUE) # 1. Load environmental background raster bios <- terra::rast(system.file("extdata", "ma_bios.tif", package = "nicheR")) # 2. Load pre-calculated reference niches data("ref_ellipse", package = "nicheR") # 2D Niche (Bio1, Bio12) data("example_sp_4", package = "nicheR") # 3D Niche (Bio1, Bio12, Bio15) # 3. Load pre-calculated virtual backgrounds (E-Space only) pred_virt_2d <- utils::read.csv(system.file("extdata", "predictions_virt.csv", package = "nicheR")) pred_virt_3d <- utils::read.csv(system.file("extdata", "predictions_virt_3d.csv", package = "nicheR")) # 4. Load pre-calculated geographic prediction surfaces pred_2d <- terra::rast(system.file("extdata", "predictions_rast.tif", package = "nicheR")) pred_3d <- terra::rast(system.file("extdata", "predictions_3d_rast.tif", package = "nicheR")) # 5. Load pre-calculated biased prediction surfaces # (Habitat Suitability * Accessibility Bias) bias_2d <- terra::rast(system.file("extdata", "applied_bias_rast.tif", package = "nicheR")) bias_3d <- terra::rast(system.file("extdata", "applied_bias_3d_rast.tif", package = "nicheR")) ## ----------------------------------------------------------------------------- occ_virt_basic <- virtual_data(object = ref_ellipse, n = 1000) head(occ_virt_basic) ## ----------------------------------------------------------------------------- plot_ellipsoid(ref_ellipse, dim = c(1, 2), pch = ".", col_bg = "#9a9797", xlab = "Bio1 (Temp)", ylab = "Bio12 (Precip)", main = "Virtual E-Space") add_data(occ_virt_basic, x = "bio_1", y = "bio_12", pts_col = "orange", pch = 20) add_data(as.data.frame(t(ref_ellipse$centroid)), x = "bio_1", y = "bio_12", pts_col = "red", pch = 15, cex = 1.5) ## ----------------------------------------------------------------------------- # Sample 100 virtual occurrences from the 3D background occ_virt_3d <- virtual_data( n = 100, object = example_sp_4 ) # Visualize across multiple dimensions in E-Space par(mfrow = c(1, 2), mar = c(4, 4, 3, 2)) plot_ellipsoid(example_sp_4, dim = c(1, 2), pch = ".", col_bg = "#9a9797", main = "Virtual: Bio1 v Bio12") add_data(occ_virt_3d, x = "bio_1", y = "bio_12", pts_col = "orange", pch = 20) add_data(as.data.frame(t(example_sp_4$centroid)), x = "bio_1", y = "bio_12", pts_col = "red", pch = 15, cex = 1.5) plot_ellipsoid(example_sp_4, dim = c(1, 3), pch = ".", col_bg = "#9a9797", main = "Virtual: Bio1 v Bio15") add_data(occ_virt_3d, x = "bio_1", y = "bio_15", pts_col = "orange", pch = 20) add_data(as.data.frame(t(example_sp_4$centroid)), x = "bio_1", y = "bio_15", pts_col = "red", pch = 15, cex = 1.5) ## ----------------------------------------------------------------------------- occ_geo_basic <- sample_data( n_occ = 100, prediction = pred_2d, prediction_layer = "suitability", seed = 123 ) par(mfrow = c(1, 2), mar = c(4, 4, 3, 2)) # 1. Geographic Space terra::plot(pred_2d[["suitability"]], main = "G-Space: Geographic Map") points(occ_geo_basic[, c("x", "y")], pch = 20, col = "red", cex = 1.2) # 2. Environmental Space plot_ellipsoid(ref_ellipse, background = as.data.frame(bios[[c("bio_1", "bio_12")]]), dim = c(1, 2), pch = ".", col_bg = "#9a9797", main = "E-Space: Temp vs Precip") add_data(occ_geo_basic, x = "bio_1", y = "bio_12", pts_col = "orange", pch = 20) add_data(as.data.frame(t(ref_ellipse$centroid)), x = "bio_1", y = "bio_12", pts_col = "red", pch = 15, cex = 1.5) ## ----------------------------------------------------------------------------- occ_cent <- sample_data(100, pred_2d, "suitability", sampling = "centroid", seed = 123) occ_edge <- sample_data(100, pred_2d, "suitability", sampling = "edge", seed = 123) occ_rand <- sample_data(100, pred_2d, "suitability", sampling = "random", seed = 123) par(mfrow = c(3, 2), mar = c(3, 3, 2, 1), cex.main = 0.9) # Centroid terra::plot(pred_2d[["suitability"]], main = "G-Space: Centroid Sampling"); points(occ_cent[, 1:2], pch = 20, col = "red") plot_ellipsoid(ref_ellipse, background = as.data.frame(bios[[c("bio_1", "bio_12")]]), dim = c(1, 2), pch = ".", col_bg = "#9a9797", main = "E-Space: Centroid") add_data(occ_cent, x = "bio_1", y = "bio_12", pts_col = "orange", pch = 20) # Edge terra::plot(pred_2d[["suitability"]], main = "G-Space: Edge Sampling"); points(occ_edge[, 1:2], pch = 20, col = "red") plot_ellipsoid(ref_ellipse, background = as.data.frame(bios[[c("bio_1", "bio_12")]]), dim = c(1, 2), pch = ".", col_bg = "#9a9797", main = "E-Space: Edge") add_data(occ_edge, x = "bio_1", y = "bio_12", pts_col = "orange", pch = 20) # Random terra::plot(pred_2d[["suitability"]], main = "G-Space: Random Sampling"); points(occ_rand[, 1:2], pch = 20, col = "red") plot_ellipsoid(ref_ellipse, background = as.data.frame(bios[[c("bio_1", "bio_12")]]), dim = c(1, 2), pch = ".", col_bg = "#9a9797", main = "E-Space: Random") add_data(occ_rand, x = "bio_1", y = "bio_12", pts_col = "orange", pch = 20) ## ----------------------------------------------------------------------------- occ_meth_suit <- sample_data(100, pred_2d, "suitability", method = "suitability", seed = 123) occ_meth_maha <- sample_data(100, pred_2d, "Mahalanobis", method = "mahalanobis", seed = 123) par(mfrow = c(2, 2), mar = c(3, 3, 2, 1), cex.main = 0.9) # Suitability terra::plot(pred_2d[["suitability"]], main = "G-Space: Method = Suitability"); points(occ_meth_suit[, 1:2], pch = 20, col = "red") plot_ellipsoid(ref_ellipse, background = as.data.frame(bios[[c("bio_1", "bio_12")]]), dim = c(1, 2), pch = ".", col_bg = "#9a9797", main = "E-Space: Suitability") add_data(occ_meth_suit, x = "bio_1", y = "bio_12", pts_col = "orange", pch = 20) # Mahalanobis terra::plot(pred_2d[["Mahalanobis"]], main = "G-Space: Method = Mahalanobis"); points(occ_meth_maha[, 1:2], pch = 20, col = "red") plot_ellipsoid(ref_ellipse, background = as.data.frame(bios[[c("bio_1", "bio_12")]]), dim = c(1, 2), pch = ".", col_bg = "#9a9797", main = "E-Space: Mahalanobis") add_data(occ_meth_maha, x = "bio_1", y = "bio_12", pts_col = "orange", pch = 20) ## ----------------------------------------------------------------------------- occ_lax <- sample_data(100, pred_2d, "suitability", strict = FALSE, seed = 123) occ_strict <- sample_data(100, pred_2d, "suitability_trunc", strict = TRUE, seed = 123) par(mfrow = c(2, 2), mar = c(3, 3, 2, 1), cex.main = 0.9) # Lax terra::plot(pred_2d[["suitability"]], main = "G-Space: Strict = FALSE"); points(occ_lax[, 1:2], pch = 20, col = "red") plot_ellipsoid(ref_ellipse, background = as.data.frame(bios[[c("bio_1", "bio_12")]]), dim = c(1, 2), pch = ".", col_bg = "#9a9797", main = "E-Space: Strict = FALSE") add_data(occ_lax, x = "bio_1", y = "bio_12", pts_col = "orange", pch = 20) # Strict terra::plot(pred_2d[["suitability_trunc"]], main = "G-Space: Strict = TRUE"); points(occ_strict[, 1:2], pch = 20, col = "red") plot_ellipsoid(ref_ellipse, background = as.data.frame(bios[[c("bio_1", "bio_12")]]), dim = c(1, 2), pch = ".", col_bg = "#9a9797", main = "E-Space: Strict = TRUE") add_data(occ_strict, x = "bio_1", y = "bio_12", pts_col = "orange", pch = 20) ## ----------------------------------------------------------------------------- occ_geo_3d <- sample_data(100, pred_3d, "suitability", seed = 123) par(mfrow = c(1, 3), mar = c(4, 4, 3, 2)) terra::plot(pred_3d[["suitability"]], main = "G-Space: 3D Projection") points(occ_geo_3d[, c("x", "y")], pch = 20, col = "red", cex = 1.2) plot_ellipsoid(example_sp_4, background = as.data.frame(bios[[c("bio_1", "bio_12", "bio_15")]]), dim = c(1, 2), pch = ".", col_bg = "#9a9797", main = "E-Space: Bio1 v Bio12") add_data(occ_geo_3d, x = "bio_1", y = "bio_12", pts_col = "orange", pch = 20) plot_ellipsoid(example_sp_4, background = as.data.frame(bios[[c("bio_1", "bio_12", "bio_15")]]), dim = c(1, 3), pch = ".", col_bg = "#9a9797", main = "E-Space: Bio1 v Bio15") add_data(occ_geo_3d, x = "bio_1", y = "bio_15", pts_col = "orange", pch = 20) ## ----------------------------------------------------------------------------- occ_bias_xy <- sample_biased_data( n_occ = 100, prediction = bias_2d, prediction_layer = "suitability_biased_direct", strict = FALSE, seed = 123 ) # Extract environmental data at these coordinates to view E-space distortion occ_bias_env <- terra::extract(bios, occ_bias_xy[, c("x", "y")]) par(mfrow = c(1, 2), mar = c(4, 4, 3, 2)) terra::plot(bias_2d[["suitability_biased_direct"]], main = "G-Space: Biased Map") terra::points(occ_bias_xy[, c("x", "y")], pch = 20, col = "red", cex = 1.2) plot_ellipsoid(ref_ellipse, background = as.data.frame(bios[[c("bio_1", "bio_12")]]), dim = c(1, 2), pch = ".", col_bg = "#9a9797", main = "E-Space: Distorted Niche") add_data(occ_bias_env, x = "bio_1", y = "bio_12", pts_col = "orange", pch = 20) add_data(as.data.frame(t(ref_ellipse$centroid)), x = "bio_1", y = "bio_12", pts_col = "red", pch = 15, cex = 1.5) ## ----------------------------------------------------------------------------- # strict = TRUE ensures sampling ONLY happens in explicitly positive bias areas occ_bias_strict_xy <- sample_biased_data(100, bias_2d, "suitability_biased_direct", strict = TRUE, seed = 123) occ_bias_strict_env <- terra::extract(bios, occ_bias_strict_xy[, c("x", "y")]) par(mfrow = c(1, 2), mar = c(4, 4, 3, 2)) terra::plot(bias_2d[["suitability_biased_direct"]], main = "G-Space: Biased Map (Strict)") terra::points(occ_bias_strict_xy[, c("x", "y")], pch = 20, col = "red", cex = 1.2) plot_ellipsoid(ref_ellipse, background = as.data.frame(bios[[c("bio_1", "bio_12")]]), dim = c(1, 2), pch = ".", col_bg = "#9a9797", main = "E-Space: Strict Bias") add_data(occ_bias_strict_env, x = "bio_1", y = "bio_12", pts_col = "orange", pch = 20) ## ----------------------------------------------------------------------------- occ_bias_3d_xy <- sample_biased_data(100, bias_3d, "suitability_biased_direct", seed = 123) occ_bias_3d_env <- terra::extract(bios, occ_bias_3d_xy[, c("x", "y")]) par(mfrow = c(1, 3), mar = c(4, 4, 3, 2)) terra::plot(bias_3d[["suitability_biased_direct"]], main = "G-Space: 3D Biased Map") terra::points(occ_bias_3d_xy[, c("x", "y")], pch = 20, col = "red", cex = 1.2) plot_ellipsoid(example_sp_4, background = as.data.frame(bios[[c("bio_1", "bio_12", "bio_15")]]), dim = c(1, 2), pch = ".", col_bg = "#9a9797", main = "E-Space: Bio1 v Bio12") add_data(occ_bias_3d_env, x = "bio_1", y = "bio_12", pts_col = "orange", pch = 20) add_data(as.data.frame(t(example_sp_4$centroid)), x = "bio_1", y = "bio_12", pts_col = "red", pch = 15, cex = 1.5) plot_ellipsoid(example_sp_4, background = as.data.frame(bios[[c("bio_1", "bio_12", "bio_15")]]), dim = c(1, 3), pch = ".", col_bg = "#9a9797", main = "E-Space: Bio1 v Bio15") add_data(occ_bias_3d_env, x = "bio_1", y = "bio_15", pts_col = "orange", pch = 20) add_data(as.data.frame(t(example_sp_4$centroid)), x = "bio_1", y = "bio_15", pts_col = "red", pch = 15, cex = 1.5) ## ----par_reset---------------------------------------------------------------- # Reset plotting parameters par(original_par) ## ----------------------------------------------------------------------------- # Save Pure Virtual Data write.csv(occ_virt_basic, file = tempfile(), row.names = FALSE) # Save Geographic Data write.csv(occ_geo_basic, file = tempfile(), row.names = FALSE) # Save Biased Data (combining XY and environmental data) biased_final <- cbind(occ_bias_xy, occ_bias_env) write.csv(biased_final, file = tempfile(), row.names = FALSE)