## ----include = FALSE---------------------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.width = 7, fig.height = 6 ) ## ----results='hide', message=FALSE, warning=FALSE----------------------------- # Load packages library(kuenm2) library(terra) # Current directory getwd() # Define new directory #setwd("YOUR/DIRECTORY") # uncomment and modify if setting a new directory ## ----Download CHELSA past, eval=FALSE----------------------------------------- # # Define variables to download # var_to_use <- c("BIO_01", "BIO_07", "BIO_12", "BIO_15") # # # Define GCMs # gcms <- c("CCSM4", "CNRM-CM5", "FGOALS-g2", "IPSL-CM5A-LR", "MIROC-ESM", # "MPI-ESM-P", "MRI-CGCM3") # # # Create a grid combining variables and GCMs # g <- expand.grid("gcm" = gcms, "var" = var_to_use) # # # Create links to download # l <- do.call(paste, c(g, sep = "_")) # l <- paste0("https://os.zhdk.cloud.switch.ch/chelsav1/pmip3/bioclim/CHELSA_PMIP_", # l, ".tif") # # # See links # head(l) # #> [1] "https://os.zhdk.cloud.switch.ch/chelsav1/pmip3/bioclim/CHELSA_PMIP_CCSM4_BIO_01.tif" # #> [2] "https://os.zhdk.cloud.switch.ch/chelsav1/pmip3/bioclim/CHELSA_PMIP_CNRM-CM5_BIO_01.tif" # #> [3] "https://os.zhdk.cloud.switch.ch/chelsav1/pmip3/bioclim/CHELSA_PMIP_FGOALS-g2_BIO_01.tif" # #> [4] "https://os.zhdk.cloud.switch.ch/chelsav1/pmip3/bioclim/CHELSA_PMIP_IPSL-CM5A-LR_BIO_01.tif" # #> [5] "https://os.zhdk.cloud.switch.ch/chelsav1/pmip3/bioclim/CHELSA_PMIP_MIROC-ESM_BIO_01.tif" # #> [6] "https://os.zhdk.cloud.switch.ch/chelsav1/pmip3/bioclim/CHELSA_PMIP_MPI-ESM-P_BIO_01.tif" # # # Create a directory to save the raw variables # raw_past_chelsa <- file.path(tempdir(), "Raw_past") # Here, in a temporary directory # dir.create(raw_past_chelsa) # # # Download files and save in the Raw_past directory # options(timeout = 300) # To avoid errors with timeout # sapply(l, function(i) { # downfile <- file.path(raw_past_chelsa, basename(i)) # # # Download only if the file has not been downloaded yet # if(!file.exists(downfile)) { # download.file(url = i, destfile = downfile, method = "curl") # } # }) # It will take a while # # #Check the files in the Raw_past # list.files(raw_past_chelsa) # #> [1] "CHELSA_PMIP_CCSM4_BIO_01.tif" "CHELSA_PMIP_CCSM4_BIO_07.tif" # #> [3] "CHELSA_PMIP_CCSM4_BIO_12.tif" "CHELSA_PMIP_CCSM4_BIO_15.tif" # #> [5] "CHELSA_PMIP_CNRM-CM5_BIO_01.tif" "CHELSA_PMIP_CNRM-CM5_BIO_07.tif" # #> [7] "CHELSA_PMIP_CNRM-CM5_BIO_12.tif" "CHELSA_PMIP_CNRM-CM5_BIO_15.tif" # #> [9] "CHELSA_PMIP_FGOALS-g2_BIO_01.tif" "CHELSA_PMIP_FGOALS-g2_BIO_07.tif" # #> [11] "CHELSA_PMIP_FGOALS-g2_BIO_12.tif" "CHELSA_PMIP_FGOALS-g2_BIO_15.tif" # #> [13] "CHELSA_PMIP_IPSL-CM5A-LR_BIO_01.tif" "CHELSA_PMIP_IPSL-CM5A-LR_BIO_07.tif" # #> [15] "CHELSA_PMIP_IPSL-CM5A-LR_BIO_12.tif" "CHELSA_PMIP_IPSL-CM5A-LR_BIO_15.tif" # #> [17] "CHELSA_PMIP_MIROC-ESM_BIO_01.tif" "CHELSA_PMIP_MIROC-ESM_BIO_07.tif" # #> [19] "CHELSA_PMIP_MIROC-ESM_BIO_12.tif" "CHELSA_PMIP_MIROC-ESM_BIO_15.tif" # #> [21] "CHELSA_PMIP_MPI-ESM-P_BIO_01.tif" "CHELSA_PMIP_MPI-ESM-P_BIO_07.tif" # #> [23] "CHELSA_PMIP_MPI-ESM-P_BIO_12.tif" "CHELSA_PMIP_MPI-ESM-P_BIO_15.tif" # #> [25] "CHELSA_PMIP_MRI-CGCM3_BIO_01.tif" "CHELSA_PMIP_MRI-CGCM3_BIO_07.tif" # #> [27] "CHELSA_PMIP_MRI-CGCM3_BIO_12.tif" "CHELSA_PMIP_MRI-CGCM3_BIO_15.tif" ## ----download CHELSA present, eval=FALSE-------------------------------------- # # Create directory to save the variables # present_dir <- file.path(tempdir(), "Present_raw") # dir.create(present_dir) # # # Define variables to download # var_present <- c("bio1", "bio7", "bio12", "bio15") # # # Create links, download and save in the Present_raw directory # l_present <- sapply(var_present, function(i){ # # Create link to download # l_present_i <- paste0("https://os.zhdk.cloud.switch.ch/chelsav2/GLOBAL/climatologies/1981-2010/bio/CHELSA_", # i, "_1981-2010_V.2.1.tif") # # # Donwload only if the file has not been downloaded yet # if(!file.exists(file.path(present_dir, basename(l_present_i)))) # download.file(url = l_present_i, # destfile = file.path(present_dir, basename(l_present_i)), # method = "curl") # }) # This might take a while # # # Check the files in the directory # list.files(present_dir) # #> [1] "CHELSA_bio1_1981-2010_V.2.1.tif" "CHELSA_bio12_1981-2010_V.2.1.tif" # #> [3] "CHELSA_bio15_1981-2010_V.2.1.tif" "CHELSA_bio7_1981-2010_V.2.1.tif" ## ----prepare present, eval=FALSE---------------------------------------------- # # Import are for model calibration (M) # m <- vect(system.file("extdata", "m.gpkg", # package = "kuenm2")) # # # Import present variables # present_files <- list.files(present_dir, full.names = TRUE) # List files # present_var <- rast(present_files) # # # Mask variables using the calibration area (m) # present_m <- crop(present_var, m, mask = TRUE) # # # Check variables names # names(present_m) # #> [1] "CHELSA_bio1_1981-2010_V.2.1" "CHELSA_bio12_1981-2010_V.2.1" # #> [3] "CHELSA_bio15_1981-2010_V.2.1" "CHELSA_bio7_1981-2010_V.2.1" # # # Rename variables # names(present_m) <- c("bio1", "bio12", "bio15", "bio7") # names(present_m) # #> [1] "bio1" "bio12" "bio15" "bio7" # # # Check current resolution (30arc-sec) # res(present_m) # #> [1] 0.008333333 0.008333333 # # # Decrease resolution to 10arc-min # present_chelsa <- aggregate(present_m, fact = 20, fun = "mean") # # # Save processed raster # dir_current <- file.path(tempdir(), "Current_CHELSA") # dir.create(dir_current) # # writeRaster(present_chelsa, # filename = file.path(dir_current, "Current_CHELSA.tif")) ## ----mask future, eval=FALSE-------------------------------------------------- # # Import LGM variables # lgm_files <- list.files(raw_past_chelsa, full.names = TRUE) # List files # lgm_var <- rast(lgm_files) # # # Mask variables using the calibration area (m) # lgm_m <- crop(lgm_var, m, mask = TRUE) # # # Decrease resolution to 10arc-min # lgm_chelsa <- aggregate(lgm_m, fact = 20, fun = "mean") # # # Check variables names # names(lgm_chelsa) # #> [1] "CHELSA_PMIP_CCSM4_BIO_01" "CHELSA_PMIP_CCSM4_BIO_07" # #> [3] "CHELSA_PMIP_CCSM4_BIO_12" "CHELSA_PMIP_CCSM4_BIO_15" # #> [5] "CHELSA_PMIP_CNRM-CM5_BIO_01" "CHELSA_PMIP_CNRM-CM5_BIO_07" # #> [7] "CHELSA_PMIP_CNRM-CM5_BIO_12" "CHELSA_PMIP_CNRM-CM5_BIO_15" # #> [9] "CHELSA_PMIP_FGOALS-g2_BIO_01" "CHELSA_PMIP_FGOALS-g2_BIO_07" # #> [11] "CHELSA_PMIP_FGOALS-g2_BIO_12" "CHELSA_PMIP_FGOALS-g2_BIO_15" # #> [13] "CHELSA_PMIP_IPSL-CM5A-LR_BIO_01" "CHELSA_PMIP_IPSL-CM5A-LR_BIO_07" # #> [15] "CHELSA_PMIP_IPSL-CM5A-LR_BIO_12" "CHELSA_PMIP_IPSL-CM5A-LR_BIO_15" # #> [17] "CHELSA_PMIP_MIROC-ESM_BIO_01" "CHELSA_PMIP_MIROC-ESM_BIO_07" # #> [19] "CHELSA_PMIP_MIROC-ESM_BIO_12" "CHELSA_PMIP_MIROC-ESM_BIO_15" # #> [21] "CHELSA_PMIP_MPI-ESM-P_BIO_01" "CHELSA_PMIP_MPI-ESM-P_BIO_07" # #> [23] "CHELSA_PMIP_MPI-ESM-P_BIO_12" "CHELSA_PMIP_MPI-ESM-P_BIO_15" # #> [25] "CHELSA_PMIP_MRI-CGCM3_BIO_01" "CHELSA_PMIP_MRI-CGCM3_BIO_07" # #> [27] "CHELSA_PMIP_MRI-CGCM3_BIO_12" "CHELSA_PMIP_MRI-CGCM3_BIO_15" ## ----group future by gcm, eval=FALSE------------------------------------------ # # In each iteration, 'i' is a GCM # lgm_by_gcm <- lapply(gcms, function(i){ # # Subset variables that belong to GCM i # lgm_gcm_i <- lgm_chelsa[[grepl(i, names(lgm_chelsa))]] # # # Rename variables # names(lgm_gcm_i) <- c("bio1", "bio7", "bio12", "bio15") # return(lgm_gcm_i) # }) # # names(lgm_by_gcm) <- gcms ## ----check units, eval = FALSE------------------------------------------------ # # Check values of variables in present # #> minmax(present_chelsa[[c("bio1", "bio7", "bio12", "bio15")]]) # #> bio1 bio7 bio12 bio15 # #> min 12.87700 10.11300 1211.605 10.32925 # #> max 24.70025 21.06125 3063.049 70.45125 # # # Check values of variables in LGM (CCSM4) # minmax(lgm_by_gcm$CCSM4) # #> bio1 bio7 bio12 bio15 # #> min 2822.425 173.5125 10710.62 86.9125 # #> max 2946.758 219.7700 23159.20 659.0025 ## ----convert units, eval=FALSE------------------------------------------------ # # Fixing units in loop # lgm_fixed_units <- lapply(lgm_by_gcm, function(x) { # x$bio1 <- (x$bio1 / 10) - 273 # Divide by 10 and subtracts -273 # x$bio7 <- x$bio7 / 10 # Divide by 10 # x$bio12 <- x$bio12 / 10 # Divide by 10 # x$bio15 <- x$bio15 / 10 # Divide by 10 # return(x) # }) # # # Check units # minmax(lgm_fixed_units$CCSM4) # #> bio1 bio7 bio12 bio15 # #> min 9.24250 17.35125 1071.062 8.69125 # #> max 21.67575 21.97700 2315.920 65.90025 ## ----Save lgm, eval=FALSE----------------------------------------------------- # # Create directory to save processed lgm variables # dir_lgm <- file.path(tempdir(), "LGM_CHELSA") # dir.create(dir_lgm) # # # Processing in loop # lapply(names(lgm_fixed_units), function(i) { # # Subset SpatRaster from GCM i # r_i <- lgm_fixed_units[[i]] # # # Name the file with the Period (LGM) and GCM (i) # filename_i <- paste0("CHELSA_LGM_", i, ".tif") # # # Write Raster # writeRaster(r_i, filename = file.path(dir_lgm, filename_i)) # }) ## ----set directory with examples do not show, include=FALSE------------------- dir_current <- system.file("extdata", package = "kuenm2") dir_lgm <- system.file("extdata", package = "kuenm2") ## ----list files--------------------------------------------------------------- # Listing files in directories present_list <- list.files(path = dir_current, pattern = "Current_CHELSA", full.names = TRUE) lgm_list <- list.files(path = dir_lgm, pattern = "LGM", full.names = TRUE) ## ----check files, eval=FALSE-------------------------------------------------- # # Check list of files with full paths # ## Present # present_list # Paths can be different in distinct computers # #> "Local\\Temp\\Current_CHELSA.tif" # # # Past # lgm_list # Paths can be different in distinct computers # #> [1] "Local\\Temp\\CHELSA_LGM_CCSM4.tif" # #> [2] "Local\\Temp\\CHELSA_LGM_CNRM-CM5.tif" # #> [3] "Local\\Temp\\CHELSA_LGM_FGOALS-g2.tif" # #> [4] "Local\\Temp\\CHELSA_LGM_IPSL-CM5A-LR.tif" # #> [5] "Local\\Temp\\CHELSA_LGM_MIROC-ESM.tif" # #> [6] "Local\\Temp\\CHELSA_LGM_MPI-ESM-P.tif" # #> [7] "Local\\Temp\\CHELSA_LGM_MRI-CGCM3.tif" ## ----organize files, results='hide'------------------------------------------- # Create a directory to save the variables # Here, in a temporary directory. Change to your work directory in your computer out_dir <- file.path(tempdir(), "Projection_variables") # Organizing files the way it is needed organize_for_projection(output_dir = out_dir, variable_names = c("bio1", "bio7", "bio12", "bio15"), present_file = present_list, past_files = lgm_list, past_period = "LGM", past_gcm = c("CCSM4", "CNRM-CM5", "FGOALS-g2", "IPSL-CM5A-LR", "MIROC-ESM", "MPI-ESM-P", "MRI-CGCM3"), resample_to_present = TRUE, overwrite = TRUE) ## ----fs, eval = FALSE--------------------------------------------------------- # # Install package if necessary # if(!require("fs")) { # install.packages("fs") # } # # fs::dir_tree(out_dir) # #> Local\Temp\Projection_variables # #> ├── Past # #> │ └── LGM # #> │ ├── CCSM4 # #> │ │ └── Variables.tif # #> │ ├── CNRM-CM5 # #> │ │ └── Variables.tif # #> │ ├── FGOALS-g2 # #> │ │ └── Variables.tif # #> │ ├── IPSL-CM5A-LR # #> │ │ └── Variables.tif # #> │ ├── MIROC-ESM # #> │ │ └── Variables.tif # #> │ ├── MPI-ESM-P # #> │ │ └── Variables.tif # #> │ └── MRI-CGCM3 # #> │ └── Variables.tif # #> └── Present # #> └── Variables.tif ## ----create fitted models with CHELSA, eval=FALSE, include=FALSE-------------- # d_chelsa <- prepare_data(algorithm = "maxnet", occ = occ_data, x = "x", y = "y", # raster_variables = present_chelsa, # species = "Myrcia hatschbachii", partition_method = "kfolds", # n_partitions = 4, # n_background = 1000, # features = c("l", "q", "lq", "lqp"), # r_multiplier = c(0.1, 1, 2)) # # m_chelsa <- calibration(data = d_chelsa, # error_considered = c(5, 10), # omission_rate = 10, # parallel = TRUE, # Set TRUE to run in parallel # ncores = 8) # # fitted_model_chelsa <- fit_selected(m_chelsa, n_replicates = 4) ## ----import fitted_model_chelsa, include=TRUE--------------------------------- # Load the object with fitted models data(fitted_model_chelsa, package = "kuenm2") ## ----prepare projections------------------------------------------------------ # Define present_dir and past_dir in_dir_present <- file.path(out_dir, "Present") in_dir_past <- file.path(out_dir, "Past") # Prepare projections using fitted models to check variables pr <- prepare_projection(models = fitted_model_chelsa, present_dir = in_dir_present, # Directory with present variables past_dir = in_dir_past, past_period = "LGM", past_gcm = c("CCSM4", "CNRM-CM5", "FGOALS-g2", "IPSL-CM5A-LR", "MIROC-ESM", "MPI-ESM-P", "MRI-CGCM3"), future_dir = NULL, # NULL because we won't project to the Future future_period = NULL, future_pscen = NULL, future_gcm = NULL) ## ----print pr, eval=FALSE----------------------------------------------------- # pr # #> projection_data object summary # #> ============================== # #> Variables prepared to project models for Present and Past # #> Past projections contain the following periods and GCMs: # #> - Periods: LGM # #> - GCMs: CCSM4 | CNRM-CM5 | FGOALS-g2 | IPSL-CM5A-LR | MIROC-ESM | MPI-ESM-P | MRI-CGCM3 # #> All variables are located in the following root directory: # #> Local/Temp/Projection_variables ## ----project selected--------------------------------------------------------- # Create a folder to save projection results # Here, in a temporary directory out_dir_projections <- file.path(tempdir(), "Projection_results/chelsa") dir.create(out_dir_projections, recursive = TRUE) # Project selected models to multiple scenarios p <- project_selected(models = fitted_model_chelsa, projection_data = pr, out_dir = out_dir_projections, write_replicates = TRUE, progress_bar = FALSE, # Do not print progress bar overwrite = TRUE) # Import mean of each projected scenario p_mean <- import_results(projection = p, consensus = "mean") # Plot all scenarios terra::plot(p_mean, cex.main = 0.8) ## ----changes------------------------------------------------------------------ # Run function to detect changes changes <- projection_changes(model_projections = p, consensus = "mean", output_dir = out_dir_projections, write_bin_models = TRUE, # Write individual binary results return_raster = TRUE, overwrite = TRUE) # Set colors summary_with_colors <- colors_for_changes(changes_projections = changes) # Plot terra::plot(summary_with_colors$Summary_changes)