From 92336b533900df2a713f5dcaf9bd622b1b13037e Mon Sep 17 00:00:00 2001 From: raflima1981 Date: Tue, 7 Nov 2023 12:34:19 -0300 Subject: [PATCH 01/23] changing items order --- vignettes/articles/ConR.Rmd | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/vignettes/articles/ConR.Rmd b/vignettes/articles/ConR.Rmd index 62066d5..e4575e3 100644 --- a/vignettes/articles/ConR.Rmd +++ b/vignettes/articles/ConR.Rmd @@ -105,6 +105,19 @@ years <- names(pop.sizes[,-1]) pop.sizes[, 1:4] ``` + +# Population metrics + +Before we start calculating the population metrics, we need to load ``ConR`` to +make the functions available in our R workspace. + +```{r setup} +library(ConR) +``` + + +## Population size decline + To match the time frame of 1-3 generation times into the past or into the future, we need to estimate the population sizes for the years that we do not have information available. These estimates are produced using the fit of @@ -113,14 +126,6 @@ logistic) to the population size trends. Here, we will only estimate population sizes into the past, but one can also use the same `ConR` function `pop.decline.fit()` to estimate them into the future. -But first we need to load ``ConR`` to make the functions available in our R -workspace. - -```{r setup} -library(ConR) -``` - -Then we actually do the estimates using function `pop.decline.fit()` ```{r est-pop-sizes, eval = TRUE, collapse = TRUE} # Vector of years missing from the input data @@ -153,10 +158,6 @@ We now have a new object called `mean.pop` which stores both the input population sizes and the estimates based on the statistical models that best describe the input data. -

- -# Population metrics - ## Number of spatially valid and unique occurrences @@ -227,7 +228,11 @@ sub <- subpop.comp(XY = occs[, c(1:3)], ## Number of locations -One of the conditions to detect threat under the IUCN criterion B (restricted geographic range) is related to the number of locations where the species occur. Locations depend on the spatial extent of the threats faced by the species. Here we used an extent of 10 km that makes sense for the target region, the Atlantic Forest. This computation is performed using the function `locations.comp()`. +One of the conditions to detect threat under the IUCN criterion B (restricted +geographic range) is related to the number of locations where the species occur. +Locations depend on the spatial extent of the threats faced by the species. Here +we used an extent of 10 km that makes sense for the target region, the Atlantic +Forest. This computation is performed using the function `locations.comp()`. ```{r locations, eval = TRUE, collapse = TRUE} locs <- locations.comp(occs[, c(1:3),], From c4d050ea4dfe3d4354fd80681b3c1fcbfd074fbe Mon Sep 17 00:00:00 2001 From: gdauby Date: Thu, 9 Nov 2023 11:12:13 +0100 Subject: [PATCH 02/23] new version severe frag --- R/{get.patches.R => severe_frag.R} | 221 ++++++++++++------------- man/get.patches.Rd | 35 +--- man/{frag_assess.Rd => severe_frag.Rd} | 50 +++--- 3 files changed, 142 insertions(+), 164 deletions(-) rename R/{get.patches.R => severe_frag.R} (56%) rename man/{frag_assess.Rd => severe_frag.Rd} (57%) diff --git a/R/get.patches.R b/R/severe_frag.R similarity index 56% rename from R/get.patches.R rename to R/severe_frag.R index 269e643..288d76c 100644 --- a/R/get.patches.R +++ b/R/severe_frag.R @@ -1,24 +1,25 @@ - - - #' @title Assessment of fragmentation subpopulations #' #' @description #' `r lifecycle::badge("experimental")` -#' Assess whether species populations are severaly fragmented +#' Assess whether species populations are severely fragmented #' #' @param XY data frame #' @param cell_size numeric -#' @param nbe_rep numeric -#' @param AOO numeric. AOO of the species in squared kilometres. -#' @param Resol_sub_pop numeric. Defines in kilometres the radius of the circles +#' @param nbe_rep numeric, by default is 0. Indicate the number of +#' raster with random starting position used for estimating the AOO. If 0 but +#' some translation of the raster are still done. +#' @param AOO_poly numeric. AOO of the species in squared kilometres. +#' @param resol_sub_pop numeric. Defines in kilometres the radius of the circles #' around each occurrence -#' @param subpop_poly Simple feature collection, output of -#' ```subpop.estimation``` function +#' @param habitat_poly Simple feature collection documenting habitat of species, see Details #' @param dist_isolated numeric vector providing a value for each species. Distance in kilometres for identifying -#' subpopulations considered to be isolated -#' @param proj_type projected coordinate system (in meters) +#' subpopulations considered to be isolated. See details +#' @inheritParams proj_crs #' @param export_shp logical +#' @inheritParams activate_parallel +#' @param show_progress logical. Whether progress informations should displayed. TRUE by default +#' @param threshold_severe numeric of one value indicates the threshold to identify severe fragmentation. By default is 50 #' #' @details This function evaluates the proportion of the total area of #' occupancy in habitat patches separated from others by a large distance. Based @@ -34,48 +35,49 @@ #' AOO concerned by those "isolated" subpopulations is calculated. #' #' @examples -#' -#' \donttest{ #' mydf <- data.frame(ddlat = c(-44.6,-46.2,-45.4,-42.2,-43.7,-45.0,-48.0), #' ddlon = c(-42.2,-42.6,-45.3,-42.5,-42.3,-39.0,-37.2), #' tax = rep("a", 7), #' stringsAsFactors = FALSE) #' -#' get.patches(XY = mydf, dist_isolated = 200) -#' } +#' severe_frag(XY = mydf, dist_isolated = 200, resol_sub_pop = 10) #' #' #' -#' @importFrom sf st_as_sf st_transform st_coordinates st_distance st_geometry +#' +#' @importFrom sf st_intersects #' @export -frag_assess <- function(XY, +severe_frag <- function(XY = NULL, cell_size = 2, nbe_rep = 0, - AOO = NULL, - Resol_sub_pop = NULL, - subpop_poly = NULL, + AOO_poly = NULL, + resol_sub_pop = NULL, + habitat_poly = NULL, dist_isolated = NULL, proj_type = "cea", export_shp = FALSE, parallel = FALSE, show_progress = TRUE, - NbeCores = 2) { - - - if (!is.null(AOO) & is.null(cell_size)) - stop("Please provide the size (in km) of the grid cells used for AOO") + NbeCores = 2, + threshold_severe = 50) { + if (is.null(AOO_poly) & is.null(cell_size)) + stop("Please provide the 'cell_size' (in km) of the grid cells used for AOO") - if (length(dist_isolated) != length(unique(XY[,3]))) - stop("dist_isolated should be a vector with as many as values as there are species in the provided dataset") + if (is.null(habitat_poly) & is.null(resol_sub_pop)) + stop("'habitat_poly' is not provided so you must provide 'resol_sub_pop'") - # proj_type <- - # proj_crs(proj_type = proj_type) - # - # list_data <- coord.check(XY = XY, proj_type = proj_type) + if (!is.null(XY)) { + if (length(dist_isolated) != length(unique(XY[,3]))) { + if (length(dist_isolated) == 1) { + dist_isolated <- rep(dist_isolated, length(unique(XY[,3]))) + } else { + stop("'dist_isolated' should be a vector with as many as values as there are species in the provided dataset or with one value") + } + } + } - ## if no AOO is provided, getting the AOO raster for the points - if (is.null(AOO)) { + if (is.null(AOO_poly)) { if (show_progress) message("Area of occupancy computation") res_aoo <- @@ -90,35 +92,18 @@ frag_assess <- function(XY, proj_type = proj_type ) - # res_aoo <- - # #For Casearia sylvestris (AOO = 3104): 24.5 secs; For Annona neosalicifoli (AOO = 604): 1.11 secs - # AOO.estimation( - # coordEAC = XY_proj_coord[, c(2, 1)], - # cell_size = cell_size, - # nbe_rep = nbe_rep, - # export_shp = TRUE, - # proj_type = proj_type - # ) - - res_aoo_poly <- + AOO_poly <- res_aoo$AOO_poly - cells <- table(st_drop_geometry(res_aoo_poly)) ### RENATO, it does not make sense to use the number of row in the polygon - - # cells <- nrow(res_aoo_poly) - } - # else { - # cells <- round(AOO / (cell_size * cell_size), 0) ### RENATO, It do not undderstand this neither - # } - ## if no subpopulation sf provided, getting it - if (is.null(subpop_poly)) { + + if (is.null(habitat_poly)) { if (show_progress) message("Subpopulations computation") res_subpop <- subpop.comp( XY = XY, - Resol_sub_pop = Resol_sub_pop, + resol_sub_pop = resol_sub_pop, parallel = parallel, show_progress = show_progress, NbeCores = NbeCores, @@ -126,29 +111,73 @@ frag_assess <- function(XY, export_shp = TRUE ) - # res_subpop <- #For Casearia sylvestris: 0.30 secs; For Annona neosalicifolia: 0.07 secs - # subpop.estimation( - # XY = XY_proj_coord, - # Resol_sub_pop = Resol_sub_pop, - # proj_type = proj_type, - # export_shp = TRUE - # ) - - res_subpop_poly <- + habitat_poly <- res_subpop$poly_subpop - } else { - - res_subpop_poly <- - subpop_poly - } ### This provide the number of isolated patches for each species if (show_progress) message("Isolated patches computation") - res <- get_isolated_subpop <- get.patches(subpop_poly = res_subpop_poly, dist_isolated = dist_isolated) - return(res) + all_tax <- unique(habitat_poly$tax) + if (identical(class(dist_isolated), "data.frame")) { + all_tax_ok <- dist_isolated[which(!is.na(dist_isolated[,2])),1] + dist_isolated <- dist_isolated[which(!is.na(dist_isolated[,2])),2] + habitat_poly <- habitat_poly[which(habitat_poly$tax %in% all_tax_ok),] + AOO_poly <- AOO_poly[which(AOO_poly$tax %in% all_tax_ok),] + } + + res_isol <- + get.patches(subpop_poly = habitat_poly, + dist_isolated = dist_isolated, export_shp = TRUE, show_progress = show_progress) + + list_frag <- split(res_isol$subpop_poly, f = res_isol$subpop_poly$tax) + list_aoo <- split(AOO_poly, f = AOO_poly$tax) + + cl <- activate_parallel(parallel = parallel, NbeCores = NbeCores) + `%d%` <- c_par(parallel = parallel) + pro_res <- display_progress_bar(show_progress = show_progress, max_pb = length(list_frag)) + opts <- pro_res$opts + pb <- pro_res$pb + + output <- + foreach::foreach( + x = 1:length(list_aoo), + .combine = 'c', + .options.snow = opts + ) %d% { + + if (!parallel & show_progress) + setTxtProgressBar(pb, x) + + aoo <- list_aoo[[x]] + isol <- list_frag[[x]] + isol <- isol[which(isol$frag == "isolated"),] + + if (nrow(isol) > 0) { + + intersects_aoo <- sf::st_intersects(isol, aoo, sparse = TRUE) + frac <- nrow(aoo[unique(unlist(intersects_aoo)),])/nrow(aoo)*100 + + } else { + + frac <- 0 + + } + + frac + + } + + res <- data.frame(tax = names(list_aoo), frac = output, severe_frag = output > threshold_severe) + + severe_freg_results <- merge(data.frame(tax = all_tax), res, by = c("tax"), all.x = T) + + if (export_shp) { + return(list(res = severe_freg_results, isolated_patches = res_isol$subpop_poly)) + } else { + return(severe_freg_results) + } } @@ -166,32 +195,9 @@ frag_assess <- function(XY, #' ```subpop.estimation``` function #' @param dist_isolated numeric. Distance in kilometres for identifying #' subpopulations considered to be isolated -#' @param proj_type projected coordinate system (in meters) #' @param export_shp logical -#' -#' @details This function evaluates the proportion of the total area of -#' occupancy in habitat patches separated from others by a large distance. Based -#' on IUCN guidelines page(48): "A taxon can be considered to be severely -#' fragmented if most (>50%) of its total area of occupancy is in habitat -#' patches that are (...) (2) separated from other habitat patches by a large -#' distance." -#' -#' This function interpret subpopulations as obtained using -#' ```subpop.estimation``` function as habitat patches. First, subpopulations -#' that are isolated i.e. distant to all others subpopulations by at least -#' ```dist_isolated``` kilometres, are identified. Then, the percentage of the -#' AOO concerned by those "isolated" subpopulations is calculated. -#' -#' @examples -#' -#' \donttest{ -#' mydf <- data.frame(ddlat = c(-44.6,-46.2,-45.4,-42.2,-43.7,-45.0,-48.0), -#' ddlon = c(-42.2,-42.6,-45.3,-42.5,-42.3,-39.0,-37.2), -#' tax = rep("a", 7), -#' stringsAsFactors = FALSE) -#' -#' get.patches(XY = mydf, dist_isolated = 200) -#' } +#' @inheritParams activate_parallel +#' @inheritParams proj_crs #' #' #' @keywords internal @@ -199,8 +205,6 @@ frag_assess <- function(XY, #' @importFrom sf st_as_sf st_transform st_coordinates st_distance st_geometry #' get.patches <- function( - # XY, - # aoo_poly = NULL, subpop_poly = NULL, dist_isolated = NULL, proj_type = "cea", @@ -209,18 +213,8 @@ get.patches <- function( show_progress = TRUE, NbeCores = 2) { - # proj_type <- - # proj_crs(proj_type = proj_type) - # - # ## Creating and projecting the points - # XY_proj <- - # sf::st_as_sf(XY, coords = c("ddlon", "ddlat")) - # sf::st_crs(XY_proj) <- 4326 - # XY_proj <- sf::st_transform(XY_proj, crs = proj_type) - # XY_proj_coord <- sf::st_coordinates(XY_proj) - # XY_proj_coord <- as.data.frame(XY_proj_coord) - res_subpop_poly_proj <- st_transform(res_subpop_poly, crs = proj_crs(proj_type = proj_type)) + res_subpop_poly_proj <- st_transform(subpop_poly, crs = proj_crs(proj_type = proj_type)) list_dataset <- split(res_subpop_poly_proj, f = res_subpop_poly_proj$tax) @@ -242,7 +236,7 @@ get.patches <- function( subpop <- list_dataset[[x]] - dist_btw_poly <- sf::st_distance(subpop) #For Casearia sylvestris (11 subpops): 0.85 secs; For Annona neosalicifolia (12 subpops): 0.45 secs + dist_btw_poly <- sf::st_distance(subpop) dist_btw_poly <- matrix(dist_btw_poly, nrow = nrow(dist_btw_poly), ncol = nrow(dist_btw_poly)) @@ -256,7 +250,7 @@ get.patches <- function( apply(mat_above_thres, 2, FUN = function(x) all(x, na.rm = T)) isolated_subpop_poly <- - res_subpop_poly[isolated_subpop1 & isolated_subpop2, ] + subpop[isolated_subpop1 & isolated_subpop2, ] if (nrow(isolated_subpop_poly) > 0) { df <- data.frame(tax = subpop$tax[1], @@ -265,7 +259,7 @@ get.patches <- function( sf::st_as_sf(data.frame(sf::st_geometry(isolated_subpop_poly), df)) } - connected_subpop_poly <- res_subpop_poly[!(isolated_subpop1 & isolated_subpop2),] + connected_subpop_poly <- subpop[!(isolated_subpop1 & isolated_subpop2),] if (nrow(connected_subpop_poly) > 0) { df <- data.frame(tax = subpop$tax[1], @@ -292,13 +286,12 @@ get.patches <- function( polys <- do.call('rbind', polys) row.names(polys) <- 1:nrow(polys) + polys <- st_transform(polys, crs = 4326) + return(list(isolated_subpop_poly = isolated_subpop_poly, subpop_poly = polys)) } else { - # names(fraction_aoo) <- as.character(unique(XY$tax)) return(isolated_subpop_poly) } - - } \ No newline at end of file diff --git a/man/get.patches.Rd b/man/get.patches.Rd index 263cad8..d4cb7e2 100644 --- a/man/get.patches.Rd +++ b/man/get.patches.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/get.patches.R +% Please edit documentation in R/severe_frag.R \name{get.patches} \alias{get.patches} \title{Internal function} @@ -21,39 +21,16 @@ get.patches( \item{dist_isolated}{numeric. Distance in kilometres for identifying subpopulations considered to be isolated} -\item{proj_type}{projected coordinate system (in meters)} +\item{proj_type}{string or numeric} \item{export_shp}{logical} + +\item{parallel}{a logical. Whether running in parallel. By default, it is FALSE} + +\item{NbeCores}{an integer. Register the number of cores for parallel execution. By default, it is 2} } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} Get Occupied Cells and Patches -} -\details{ -This function evaluates the proportion of the total area of -occupancy in habitat patches separated from others by a large distance. Based -on IUCN guidelines page(48): "A taxon can be considered to be severely -fragmented if most (>50\%) of its total area of occupancy is in habitat -patches that are (...) (2) separated from other habitat patches by a large -distance." - -This function interpret subpopulations as obtained using -\code{subpop.estimation} function as habitat patches. First, subpopulations -that are isolated i.e. distant to all others subpopulations by at least -\code{dist_isolated} kilometres, are identified. Then, the percentage of the -AOO concerned by those "isolated" subpopulations is calculated. -} -\examples{ - -\donttest{ -mydf <- data.frame(ddlat = c(-44.6,-46.2,-45.4,-42.2,-43.7,-45.0,-48.0), - ddlon = c(-42.2,-42.6,-45.3,-42.5,-42.3,-39.0,-37.2), - tax = rep("a", 7), - stringsAsFactors = FALSE) - -get.patches(XY = mydf, dist_isolated = 200) -} - - } \keyword{internal} diff --git a/man/frag_assess.Rd b/man/severe_frag.Rd similarity index 57% rename from man/frag_assess.Rd rename to man/severe_frag.Rd index 1fd2ff5..b6e5214 100644 --- a/man/frag_assess.Rd +++ b/man/severe_frag.Rd @@ -1,22 +1,23 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/get.patches.R -\name{frag_assess} -\alias{frag_assess} +% Please edit documentation in R/severe_frag.R +\name{severe_frag} +\alias{severe_frag} \title{Assessment of fragmentation subpopulations} \usage{ -frag_assess( - XY, +severe_frag( + XY = NULL, cell_size = 2, nbe_rep = 0, - AOO = NULL, - Resol_sub_pop = NULL, - subpop_poly = NULL, + AOO_poly = NULL, + resol_sub_pop = NULL, + habitat_poly = NULL, dist_isolated = NULL, proj_type = "cea", export_shp = FALSE, parallel = FALSE, show_progress = TRUE, - NbeCores = 2 + NbeCores = 2, + threshold_severe = 50 ) } \arguments{ @@ -24,26 +25,35 @@ frag_assess( \item{cell_size}{numeric} -\item{nbe_rep}{numeric} +\item{nbe_rep}{numeric, by default is 0. Indicate the number of +raster with random starting position used for estimating the AOO. If 0 but +some translation of the raster are still done.} -\item{AOO}{numeric. AOO of the species in squared kilometres.} +\item{AOO_poly}{numeric. AOO of the species in squared kilometres.} -\item{Resol_sub_pop}{numeric. Defines in kilometres the radius of the circles +\item{resol_sub_pop}{numeric. Defines in kilometres the radius of the circles around each occurrence} -\item{subpop_poly}{Simple feature collection, output of -\code{subpop.estimation} function} +\item{habitat_poly}{Simple feature collection documenting habitat of species, see Details} \item{dist_isolated}{numeric vector providing a value for each species. Distance in kilometres for identifying -subpopulations considered to be isolated} +subpopulations considered to be isolated. See details} -\item{proj_type}{projected coordinate system (in meters)} +\item{proj_type}{string or numeric} \item{export_shp}{logical} + +\item{parallel}{a logical. Whether running in parallel. By default, it is FALSE} + +\item{show_progress}{logical. Whether progress informations should displayed. TRUE by default} + +\item{NbeCores}{an integer. Register the number of cores for parallel execution. By default, it is 2} + +\item{threshold_severe}{numeric of one value indicates the threshold to identify severe fragmentation. By default is 50} } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} -Assess whether species populations are severaly fragmented +Assess whether species populations are severely fragmented } \details{ This function evaluates the proportion of the total area of @@ -60,15 +70,13 @@ that are isolated i.e. distant to all others subpopulations by at least AOO concerned by those "isolated" subpopulations is calculated. } \examples{ - -\donttest{ mydf <- data.frame(ddlat = c(-44.6,-46.2,-45.4,-42.2,-43.7,-45.0,-48.0), ddlon = c(-42.2,-42.6,-45.3,-42.5,-42.3,-39.0,-37.2), tax = rep("a", 7), stringsAsFactors = FALSE) -get.patches(XY = mydf, dist_isolated = 200) -} +severe_frag(XY = mydf, dist_isolated = 200, resol_sub_pop = 10) + From 83a44f2453a9c8fb70c8e5ec18583fb06aae0077 Mon Sep 17 00:00:00 2001 From: gdauby Date: Thu, 9 Nov 2023 11:12:35 +0100 Subject: [PATCH 03/23] new vers man --- man/AOO.computing.Rd | 14 ++++++-------- man/AOO.decline.Rd | 10 ++++------ man/EOO.computing.Rd | 2 +- man/EOO.sensitivity.Rd | 2 +- man/Locations.estimation.Rd | 4 ++-- man/activate_parallel.Rd | 6 ++---- man/coord.check.Rd | 2 ++ man/criterion_B.Rd | 31 +++++++++++++++++++++---------- man/criterion_D.Rd | 4 ++-- man/locations.comp.Rd | 8 ++++---- man/subpop.comp.Rd | 22 +++++++++------------- man/subpop.estimation.Rd | 7 +++---- man/subpop.radius.Rd | 3 +-- 13 files changed, 58 insertions(+), 57 deletions(-) diff --git a/man/AOO.computing.Rd b/man/AOO.computing.Rd index 86987f0..8ef04df 100644 --- a/man/AOO.computing.Rd +++ b/man/AOO.computing.Rd @@ -25,18 +25,16 @@ in kilometres used for estimating Area of Occupancy.} raster with random starting position used for estimating the AOO. If 0 but some translation of the raster are still done.} -\item{parallel}{logical, by default is FALSE. Whether running in parallel.} +\item{parallel}{a logical. Whether running in parallel. By default, it is FALSE} -\item{NbeCores}{integer, by default is 2. Register the number of cores for -parallel execution. Only used if parallel is TRUE.} +\item{NbeCores}{an integer. Register the number of cores for parallel execution. By default, it is 2} -\item{show_progress}{logical, by default is TRUE. Whether a progress bar -during computation is shown.} +\item{show_progress}{logical. Whether progress informations should displayed. TRUE by default} \item{export_shp}{logical, by default is FALSE. Whether a shapefile of occupied cells should be exported.} -\item{proj_type}{character or numeric, by default is "cea", see Details.} +\item{proj_type}{string or numeric} } \value{ If \code{export_shp} if FALSE (the default) a numeric vector of AOO estimates for each taxa @@ -82,9 +80,9 @@ AOO <- AOO.computing(dataset.ex) # This would estimate AOO for all taxa by overlaying randomly a -# grid 10 times. For each taxa, the minimum value is kept +# grid 3 times. For each taxa, the minimum value is kept -AOO <- AOO.computing(dataset.ex, nbe.rep.rast.AO = 10) +AOO <- AOO.computing(dataset.ex, nbe.rep.rast.AO = 3) } diff --git a/man/AOO.decline.Rd b/man/AOO.decline.Rd index 762e3d6..fad701e 100644 --- a/man/AOO.decline.Rd +++ b/man/AOO.decline.Rd @@ -31,15 +31,13 @@ in kilometres used for estimating Area of Occupancy.} raster with random starting position used for estimating the AOO. If 0 but some translation of the raster are still done.} -\item{parallel}{logical, by default is FALSE. Whether running in parallel.} +\item{parallel}{a logical. Whether running in parallel. By default, it is FALSE} -\item{NbeCores}{integer, by default is 2. Register the number of cores for -parallel execution. Only used if parallel is TRUE.} +\item{NbeCores}{an integer. Register the number of cores for parallel execution. By default, it is 2} -\item{show_progress}{logical, by default is TRUE. Whether a progress bar -during computation is shown.} +\item{show_progress}{logical. Whether progress informations should displayed. TRUE by default} -\item{proj_type}{character or numeric, by default is "cea", see Details.} +\item{proj_type}{string or numeric} \item{hab.class}{classes of values in \code{hab.map} to be considered as suitable} diff --git a/man/EOO.computing.Rd b/man/EOO.computing.Rd index 503441a..1d1e2ca 100644 --- a/man/EOO.computing.Rd +++ b/man/EOO.computing.Rd @@ -64,7 +64,7 @@ is "not comp"} \item{NbeCores}{an integer. Register the number of cores for parallel execution. By default, it is 2} -\item{show_progress}{logical. Whether a progress bar should displayed. TRUE by default} +\item{show_progress}{logical. Whether progress informations should displayed. TRUE by default} \item{proj_type}{string or numeric} diff --git a/man/EOO.sensitivity.Rd b/man/EOO.sensitivity.Rd index f09d905..6d1c394 100644 --- a/man/EOO.sensitivity.Rd +++ b/man/EOO.sensitivity.Rd @@ -64,7 +64,7 @@ file. By default is "EOO.sensitivity.results"} \item{NbeCores}{an integer. Register the number of cores for parallel execution. By default, it is 2} -\item{show_progress}{logical. Whether a progress bar should displayed. TRUE by default} +\item{show_progress}{logical. Whether progress informations should displayed. TRUE by default} \item{proj_type}{string or numeric} diff --git a/man/Locations.estimation.Rd b/man/Locations.estimation.Rd index 7cd0c71..f9a0b2a 100644 --- a/man/Locations.estimation.Rd +++ b/man/Locations.estimation.Rd @@ -11,7 +11,7 @@ locations.estimation( export_shp = FALSE, proj_type = proj_type, method = "fixed_grid", - Rel_cell_size = 0.05 + rel_cell_size = 0.05 ) } \arguments{ @@ -27,7 +27,7 @@ locations.estimation( \item{method}{character string} -\item{Rel_cell_size}{numeric, if \code{method ="sliding_scale"}, \code{Cell_size_locations} is ignored and the resolution is given by the maximum distance separating two occurrences multiplied by \code{Rel_cell_size}. By default, it is 0.05} +\item{rel_cell_size}{numeric, if \code{method ="sliding_scale"}, \code{Cell_size_locations} is ignored and the resolution is given by the maximum distance separating two occurrences multiplied by \code{Rel_cell_size}. By default, it is 0.05} } \value{ a list diff --git a/man/activate_parallel.Rd b/man/activate_parallel.Rd index 8b91b69..017751e 100644 --- a/man/activate_parallel.Rd +++ b/man/activate_parallel.Rd @@ -7,11 +7,9 @@ activate_parallel(parallel = FALSE, NbeCores = 2) } \arguments{ -\item{XY}{data.frame} +\item{parallel}{a logical. Whether running in parallel. By default, it is FALSE} -\item{mode}{character string either 'spheroid' or 'planar'. By default 'spheroid'} - -\item{proj_type}{crs} +\item{NbeCores}{an integer. Register the number of cores for parallel execution. By default, it is 2} } \description{ Activate paralle processing diff --git a/man/coord.check.Rd b/man/coord.check.Rd index 00ba3e1..b34e30a 100644 --- a/man/coord.check.Rd +++ b/man/coord.check.Rd @@ -22,6 +22,8 @@ coord.check( \item{listing_by_valid}{logical} +\item{cell_size}{numeric value} + \item{check_eoo}{logical} } \value{ diff --git a/man/criterion_B.Rd b/man/criterion_B.Rd index 155b15c..19ef3cf 100644 --- a/man/criterion_B.Rd +++ b/man/criterion_B.Rd @@ -5,16 +5,22 @@ \title{Assess IUCN Criterion B} \usage{ criterion_B( - x, + x = NULL, + AOO = NULL, + EOO = NULL, + locations = NULL, + severe.frag = NULL, + subpops = NULL, EOO.threshold = c(20000, 5000, 100), AOO.threshold = c(2000, 500, 10), Loc.threshold = c(10, 5, 1), - SubPop = TRUE, - Resol_sub_pop = 5, + comp_subpop = TRUE, + comp_severe.frag = FALSE, + resol_sub_pop = 5, cell_size_locations = 10, method_locations = "fixed_grid", method_polygons = "no_more_than_one", - Rel_cell_size = 0.05, + rel_cell_size = 0.05, threat_list = NULL, names_threat = NULL, threat_weight = NULL, @@ -26,6 +32,7 @@ criterion_B( exclude.area = FALSE, cell_size_AOO = 2, nbe.rep.rast.AOO = 0, + threshold_severe = 50, parallel = FALSE, show_progress = TRUE, NbeCores = 2, @@ -45,9 +52,9 @@ criterion_B( \item{Loc.threshold}{numeric vector indicating the thresholds used to categorize the number of locations in IUCN categories} -\item{SubPop}{logical if the number of sub-populations should be computed. By default is TRUE} +\item{comp_subpop}{logical if the number of sub-populations should be computed. By default is TRUE} -\item{Resol_sub_pop}{a value defining the radius of the circles around each +\item{resol_sub_pop}{a value defining the radius of the circles around each occurrence (in kilometres) or data frame vector containing a column 'tax' with the taxa names and a column 'radius' with the species-specific radius (in kilometre as well). Typically, this data frame is the output of @@ -57,7 +64,7 @@ with the taxa names and a column 'radius' with the species-specific radius \item{method_locations}{string, indicating the method used for estimating the number of locations. See Details \itemize{ -\item \code{"fixed_grid"} (the default) +\item \code{"fixed_grid"} (by default) \item \code{"sliding_scale"} }} @@ -67,8 +74,8 @@ with the taxa names and a column 'radius' with the species-specific radius \item \code{"grid"}: a grid of \code{cell_size_locations} size will be used to estimate the number of location within polygons }} -\item{Rel_cell_size}{numeric, if \code{method_locations="sliding_scale"}, \code{cell_size_locations} is ignored -and the resolution is given by the maximum distance separating two occurrences multiplied by \code{Rel_cell_size}. By default, it is 0.05} +\item{rel_cell_size}{numeric, if \code{method_locations="sliding_scale"}, \code{cell_size_locations} is ignored +and the resolution is given by the maximum distance separating two occurrences multiplied by \code{rel_cell_size}. By default, it is 0.05} \item{threat_list}{list or sfc objects POLYGON or MULTIPOLYGON documenting threats. If provided, this will be taken into account for calculating number of location (see Details and \code{method_polygons}). By default, no shapefile is provided} @@ -103,6 +110,9 @@ in kilometres used for estimating Area of Occupancy.} raster with random starting position used for estimating the AOO. If 0 but some translation of the raster are still done.} +\item{threshold_severe}{numeric of one value indicates the threshold +to identify severe fragmentation. By default is 50} + \item{parallel}{logical, whether running in parallel. By default, it is FALSE} \item{show_progress}{logical, whether a bar showing progress in computation should be shown. By default, it is TRUE} @@ -113,7 +123,8 @@ some translation of the raster are still done.} \item{mode}{character string either 'spheroid' or 'planar'. By default 'spheroid'} -\item{DrawMap}{logical, by default is FALSE, if TRUE, a png map is created in a diectory of the working environment} +\item{DrawMap}{logical, by default is FALSE, if TRUE, a png map is created for each species +in a directory of the working environment} \item{add.legend}{logical, whether legend should be added to map} } diff --git a/man/criterion_D.Rd b/man/criterion_D.Rd index c35ee16..ed92170 100644 --- a/man/criterion_D.Rd +++ b/man/criterion_D.Rd @@ -6,7 +6,7 @@ \usage{ criterion_D( pop.size = NULL, - Name_Sp = NULL, + name_sp = NULL, AOO = NULL, n.Locs = NULL, prop.mature = NULL, @@ -22,7 +22,7 @@ criterion_D( subpopulations) containing the population sizes (e.g. number of mature individuals).} -\item{Name_Sp}{a vector containing the name of the taxa to be assessed. +\item{name_sp}{a vector containing the name of the taxa to be assessed. Default to "Species 1", "Species 2", ..., "Species n", where n is the number of taxa.} diff --git a/man/locations.comp.Rd b/man/locations.comp.Rd index 324bcb4..04f1e77 100644 --- a/man/locations.comp.Rd +++ b/man/locations.comp.Rd @@ -14,7 +14,7 @@ locations.comp( cell_size_locations = 10, method_polygons = c("no_more_than_one"), id_shape = "id_orig", - Rel_cell_size = 0.05, + rel_cell_size = 0.05, parallel = FALSE, NbeCores = 2, show_progress = TRUE, @@ -48,8 +48,8 @@ locations.comp( \item{id_shape}{string} -\item{Rel_cell_size}{numeric, if \code{method_locations="sliding_scale"}, \code{cell_size_locations} is ignored -and the resolution is given by the maximum distance separating two occurrences multiplied by \code{Rel_cell_size}. By default, it is 0.05} +\item{rel_cell_size}{numeric, if \code{method_locations="sliding_scale"}, \code{cell_size_locations} is ignored +and the resolution is given by the maximum distance separating two occurrences multiplied by \code{rel_cell_size}. By default, it is 0.05} \item{parallel}{logical, whether running in parallel. By default, it is FALSE} @@ -99,7 +99,7 @@ If \code{method} is "fixed_grid" as it is by default, the resolution is fixed an by the argument \code{cell_size_locations}. If \code{method} is "sliding_scale", the resolution is defind as 1/x*max.dist where max.dist is the maximum distance between any pairs of occurrences -and x is a defined parameter. 1/x is defined by \code{Rel_cell_size} argument and is 0.05 by default. +and x is a defined parameter. 1/x is defined by \code{rel_cell_size} argument and is 0.05 by default. See Rivers M.C. et al. (2010) for more information on the methods. } } diff --git a/man/subpop.comp.Rd b/man/subpop.comp.Rd index a1a96cf..9b6da92 100644 --- a/man/subpop.comp.Rd +++ b/man/subpop.comp.Rd @@ -6,7 +6,7 @@ \usage{ subpop.comp( XY, - Resol_sub_pop = NULL, + resol_sub_pop = NULL, proj_type = "cea", export_shp = FALSE, parallel = FALSE, @@ -18,26 +18,22 @@ subpop.comp( \item{XY}{a data frame containing the geographical coordinates for each taxon (see Details).} -\item{Resol_sub_pop}{a value defining the radius of the circles around each +\item{resol_sub_pop}{a value defining the radius of the circles around each occurrence (in kilometres) or data frame vector containing a column 'tax' with the taxa names and a column 'radius' with the species-specific radius (in kilometre as well). Typically, this data frame is the output of \code{ConR} function \code{subpop.radius}.} -\item{proj_type}{character string or numeric or object of CRS class, by -default is "cea"} +\item{proj_type}{string or numeric} \item{export_shp}{logical. Whether the resulting shapefiles should be exported. FALSE by default.} -\item{parallel}{logical. Whether compute should run in parallel. FALSE by -default.} +\item{parallel}{a logical. Whether running in parallel. By default, it is FALSE} -\item{show_progress}{logical. Whether a bar showing progress in computation -should be shown. TRUE by default.} +\item{show_progress}{logical. Whether progress informations should displayed. TRUE by default} -\item{NbeCores}{integer. Number of cores for parallel computation. Default to -2.} +\item{NbeCores}{an integer. Register the number of cores for parallel execution. By default, it is 2} } \value{ If \code{export_shp} is TRUE, @@ -70,14 +66,14 @@ subpopulation) \examples{ data(dataset.ex) -subpop.comp(dataset.ex, Resol_sub_pop = 5) +subpop.comp(dataset.ex, resol_sub_pop = 5) rad.df <- data.frame( tax = unique(dataset.ex$tax), radius = seq(3,13, by=2), stringsAsFactors = FALSE ) -subpop.comp(dataset.ex, Resol_sub_pop = rad.df) -subpop.comp(dataset.ex, Resol_sub_pop = rad.df, export_shp = TRUE) +subpop.comp(dataset.ex, resol_sub_pop = rad.df) +subpop.comp(dataset.ex, resol_sub_pop = rad.df, export_shp = TRUE) } \references{ diff --git a/man/subpop.estimation.Rd b/man/subpop.estimation.Rd index deb40f9..8b859b0 100644 --- a/man/subpop.estimation.Rd +++ b/man/subpop.estimation.Rd @@ -4,19 +4,18 @@ \alias{subpop.estimation} \title{Internal function} \usage{ -subpop.estimation(XY, Resol_sub_pop, export_shp = FALSE, proj_type = "cea") +subpop.estimation(XY, resol_sub_pop, export_shp = FALSE, proj_type = "cea") } \arguments{ \item{XY}{data.frame with first two columns are projected coordinates (numeric)} -\item{Resol_sub_pop}{numeric. Defines the radius of the circles +\item{resol_sub_pop}{numeric. Defines the radius of the circles around each occurrence, in kilometres.} \item{export_shp}{logical. Whether the resulting shapefiles should be exported. FALSE by default.} -\item{proj_type}{character string or numeric or object of CRS class, by -default is "cea"} +\item{proj_type}{string or numeric} } \description{ Subpopulations estimation diff --git a/man/subpop.radius.Rd b/man/subpop.radius.Rd index 6bfadd2..443ac42 100644 --- a/man/subpop.radius.Rd +++ b/man/subpop.radius.Rd @@ -22,8 +22,7 @@ the maximum distance. Default to 10.} be considered as a threshold of maximum distance. Can vary between 0 and 1. Default to 1.} -\item{mode}{a character. Type of coordinate projection: "spheroid" or -"planar". Defualts to "spheroid".} +\item{mode}{character string either 'spheroid' or 'planar'. By default 'spheroid'} \item{proj_type}{string or numeric} } From da6224919a90d8845b55fcd90244a7f4631826e0 Mon Sep 17 00:00:00 2001 From: gdauby Date: Thu, 9 Nov 2023 11:13:00 +0100 Subject: [PATCH 04/23] minor change roxygen --- R/subpop.radius.R | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/R/subpop.radius.R b/R/subpop.radius.R index 67a77b5..1a06178 100644 --- a/R/subpop.radius.R +++ b/R/subpop.radius.R @@ -12,8 +12,7 @@ #' @param quant.max numeric. The upper-quantile of the inter-point distance to #' be considered as a threshold of maximum distance. Can vary between 0 and 1. #' Default to 1. -#' @param mode a character. Type of coordinate projection: "spheroid" or -#' "planar". Defualts to "spheroid". +#' @param mode character string either 'spheroid' or 'planar'. By default 'spheroid' #' @inheritParams proj_crs #' #' @@ -109,11 +108,6 @@ subpop.radius = function(XY, return(d.inter) } - ## Getting the maximum inter-point distance - #### GILLES: I did not changed yet this part, which is done using - #package data.table. Maybe use another approach to not import the - #the package just for this small function? But I am not sure if - #the foreach loop is really necessary. ddlat <- ddlon <- tax <- NULL XY.dt <- data.table::data.table(XY$list_data) From 6442cf23754c9a46f9800ff35b76ba9ae6d9b490 Mon Sep 17 00:00:00 2001 From: gdauby Date: Thu, 9 Nov 2023 11:13:31 +0100 Subject: [PATCH 05/23] minor change roxy plus arg lower case --- R/subpop.comp.R | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/R/subpop.comp.R b/R/subpop.comp.R index 2935d49..5704643 100644 --- a/R/subpop.comp.R +++ b/R/subpop.comp.R @@ -11,21 +11,16 @@ #' #' @param XY a data frame containing the geographical coordinates for each taxon #' (see Details). -#' @param Resol_sub_pop a value defining the radius of the circles around each +#' @param resol_sub_pop a value defining the radius of the circles around each #' occurrence (in kilometres) or data frame vector containing a column 'tax' #' with the taxa names and a column 'radius' with the species-specific radius #' (in kilometre as well). Typically, this data frame is the output of #' ```ConR``` function ```subpop.radius```. #' @param export_shp logical. Whether the resulting shapefiles should be #' exported. FALSE by default. -#' @param parallel logical. Whether compute should run in parallel. FALSE by -#' default. -#' @param NbeCores integer. Number of cores for parallel computation. Default to -#' 2. -#' @param show_progress logical. Whether a bar showing progress in computation -#' should be shown. TRUE by default. -#' @param proj_type character string or numeric or object of CRS class, by -#' default is "cea" +#' @inheritParams activate_parallel +#' @param show_progress logical. Whether progress informations should displayed. TRUE by default +#' @inheritParams proj_crs #' #' @details #' `XY` as a [data.frame][base::data.frame()] should have the following structure: @@ -57,14 +52,14 @@ #' @examples #' data(dataset.ex) #' -#' subpop.comp(dataset.ex, Resol_sub_pop = 5) +#' subpop.comp(dataset.ex, resol_sub_pop = 5) #' rad.df <- data.frame( #' tax = unique(dataset.ex$tax), #' radius = seq(3,13, by=2), #' stringsAsFactors = FALSE #' ) -#' subpop.comp(dataset.ex, Resol_sub_pop = rad.df) -#' subpop.comp(dataset.ex, Resol_sub_pop = rad.df, export_shp = TRUE) +#' subpop.comp(dataset.ex, resol_sub_pop = rad.df) +#' subpop.comp(dataset.ex, resol_sub_pop = rad.df, export_shp = TRUE) #' #' @importFrom utils setTxtProgressBar #' @importFrom parallel stopCluster @@ -72,25 +67,25 @@ #' @export subpop.comp #' subpop.comp <- function(XY, - Resol_sub_pop = NULL, + resol_sub_pop = NULL, proj_type = "cea", export_shp = FALSE, parallel = FALSE, show_progress = TRUE, NbeCores = 2) { - if (is.null(Resol_sub_pop)) - stop("Radius is missing, please provide a value for all species or a data frame with species-specific values") + if (is.null(resol_sub_pop)) + stop(" is missing, please provide a value for all species or a data frame with species-specific values") proj_type <- proj_crs(proj_type = proj_type) - if ("data.frame" %in% class(Resol_sub_pop)) { - XY <- merge(XY, Resol_sub_pop, + if ("data.frame" %in% class(resol_sub_pop)) { + XY <- merge(XY, resol_sub_pop, by = "tax", all.X = TRUE, sort = FALSE) XY <- XY[,c("ddlat", "ddlon", "tax", "radius")] } else { - XY$radius <- Resol_sub_pop + XY$radius <- resol_sub_pop } list_data <- @@ -99,7 +94,7 @@ subpop.comp <- function(XY, cl <- activate_parallel(parallel = parallel, NbeCores = NbeCores) `%d%` <- c_par(parallel = parallel) - pro_res <- display_progress_bar(show_progress = show_progress, max_pb = length(list_data)) + pro_res <- display_progress_bar(show_progress = show_progress, max_pb = length(list_data[[1]])) opts <- pro_res$opts pb <- pro_res$pb @@ -116,7 +111,7 @@ subpop.comp <- function(XY, res <- subpop.estimation( XY = list_data[[1]][[x]], - Resol_sub_pop = unique(list_data[[1]][[x]]$radius), + resol_sub_pop = unique(list_data[[1]][[x]]$radius), proj_type = proj_type, export_shp = export_shp ) From b1efbe3fe1bb43e267d00bd5b63c9d3fc6183861 Mon Sep 17 00:00:00 2001 From: gdauby Date: Thu, 9 Nov 2023 11:13:59 +0100 Subject: [PATCH 06/23] minor changes roxy plus args lower case --- R/locations.comp.R | 22 +++++++++------------- R/subpop.estimation.R | 9 ++++----- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/R/locations.comp.R b/R/locations.comp.R index 013f883..8aca8b7 100644 --- a/R/locations.comp.R +++ b/R/locations.comp.R @@ -20,8 +20,8 @@ #' * `"no_more_than_one"` (the default): each single POLYGON will be considered as a single location #' * `"grid"`: a grid of `cell_size_locations` size will be used to estimate the number of location within polygons #' @param id_shape string -#' @param Rel_cell_size numeric, if `method_locations="sliding_scale"`, `cell_size_locations` is ignored -#' and the resolution is given by the maximum distance separating two occurrences multiplied by `Rel_cell_size`. By default, it is 0.05 +#' @param rel_cell_size numeric, if `method_locations="sliding_scale"`, `cell_size_locations` is ignored +#' and the resolution is given by the maximum distance separating two occurrences multiplied by `rel_cell_size`. By default, it is 0.05 #' @param parallel logical, whether running in parallel. By default, it is FALSE #' @param NbeCores integer, register the number of cores for parallel execution. By default, it is 2 #' @param show_progress logical, whether a bar showing progress in computation should be shown. By default, it is TRUE @@ -56,7 +56,7 @@ #' by the argument `cell_size_locations`. #' #' If `method` is "sliding_scale", the resolution is defind as 1/x*max.dist where max.dist is the maximum distance between any pairs of occurrences -#' and x is a defined parameter. 1/x is defined by `Rel_cell_size` argument and is 0.05 by default. +#' and x is a defined parameter. 1/x is defined by `rel_cell_size` argument and is 0.05 by default. #' See Rivers M.C. et al. (2010) for more information on the methods. #' #' @references @@ -98,7 +98,7 @@ locations.comp <- function(XY, cell_size_locations = 10, method_polygons = c("no_more_than_one"), id_shape = "id_orig", - Rel_cell_size = 0.05, + rel_cell_size = 0.05, parallel = FALSE, NbeCores = 2, show_progress = TRUE, @@ -193,17 +193,13 @@ locations.comp <- function(XY, locations = rep(NA, length(list_data)), issue_locations = rep(NA, length(list_data))) - if (length(issue_close_to_anti) > 0) { - - list_data <- list_data[-issue_close_to_anti] - - } + if (length(issue_close_to_anti) > 0) list_data <- list_data[-issue_close_to_anti] res_list <- .generate_loc(dataset = list_data, method = method, nbe_rep = nbe_rep, cell_size_locations = cell_size_locations, - Rel_cell_size = Rel_cell_size, + rel_cell_size = rel_cell_size, parallel = parallel, NbeCores = NbeCores, show_progress = show_progress, @@ -592,7 +588,7 @@ locations.comp <- function(XY, method = method, nbe_rep = nbe_rep, cell_size_locations = cell_size_locations, - Rel_cell_size = Rel_cell_size, + rel_cell_size = rel_cell_size, parallel = parallel, NbeCores = NbeCores, show_progress = show_progress, @@ -660,7 +656,7 @@ locations.comp <- function(XY, method = "fixed_grid", nbe_rep = 0, cell_size_locations = 10, - Rel_cell_size = 0.05, + rel_cell_size = 0.05, parallel = FALSE, NbeCores = 2, show_progress = TRUE, @@ -696,7 +692,7 @@ locations.comp <- function(XY, proj_type = proj_type, method = method, nbe_rep = nbe_rep, - Rel_cell_size = Rel_cell_size + rel_cell_size = rel_cell_size ) names(res) <- c("nbe_occ", "spatial") diff --git a/R/subpop.estimation.R b/R/subpop.estimation.R index 7930467..a6e1a8e 100644 --- a/R/subpop.estimation.R +++ b/R/subpop.estimation.R @@ -3,23 +3,22 @@ #' @description Subpopulations estimation #' #' @param XY data.frame with first two columns are projected coordinates (numeric) -#' @param Resol_sub_pop numeric. Defines the radius of the circles +#' @param resol_sub_pop numeric. Defines the radius of the circles #' around each occurrence, in kilometres. #' @param export_shp logical. Whether the resulting shapefiles should be #' exported. FALSE by default. -#' @param proj_type character string or numeric or object of CRS class, by -#' default is "cea" +#' @inheritParams proj_crs #' #' @import sf #' @keywords internal #' @export subpop.estimation <- function(XY, - Resol_sub_pop, + resol_sub_pop, export_shp = FALSE, proj_type = "cea") { points_sf <- st_as_sf(XY, coords = c(2, 1)) - buff_sf <- st_buffer(points_sf, dist = Resol_sub_pop * 1000) + buff_sf <- st_buffer(points_sf, dist = resol_sub_pop * 1000) buff_sf <- st_union(buff_sf) buff_sf <- st_cast(buff_sf, "POLYGON") SubPopPoly <- From c9a6ffb30a9f322b742a5e9351392c982aff9e6f Mon Sep 17 00:00:00 2001 From: gdauby Date: Thu, 9 Nov 2023 11:14:17 +0100 Subject: [PATCH 07/23] naming outputs --- R/criterion_A.R | 4 ++-- R/criterion_C.R | 15 ++++++++------- R/criterion_D.R | 31 ++++++++++++++++--------------- 3 files changed, 26 insertions(+), 24 deletions(-) diff --git a/R/criterion_A.R b/R/criterion_A.R index 2f741aa..8f0e449 100644 --- a/R/criterion_A.R +++ b/R/criterion_A.R @@ -232,7 +232,7 @@ criterion_A = function(x, } - x <- cbind.data.frame(data.frame(species = "species 1"), x) + x <- cbind.data.frame(data.frame(tax = "species 1"), x) } @@ -520,7 +520,7 @@ criterion_A = function(x, ## Population reduction using IUCN criteria Results = data.frame( - species = names(pop_data), + tax = names(pop_data), assessment.year = assess.year, assessment.period = as.character(unlist(assess.period)), assessment.pop.sizes = as.character(unlist(ps.interval)), diff --git a/R/criterion_C.R b/R/criterion_C.R index 8e29ed6..c6cb4bf 100644 --- a/R/criterion_C.R +++ b/R/criterion_C.R @@ -269,7 +269,7 @@ criterion_C = function(x, } - x <- cbind.data.frame(data.frame(species = "species 1"), x) + x <- cbind.data.frame(data.frame(tax = "species 1"), x) } @@ -334,10 +334,11 @@ criterion_C = function(x, subpop.size <- split(x[ , which(names(x) == assess.year)], f = x[,1]) - x <- cbind.data.frame(data.frame (species = x[,1]), - rowsum(x[, which(names(x) %in% years)], x[,1], reorder = FALSE, row.names = FALSE)) + x <- cbind.data.frame(data.frame(tax = x[,1]), + rowsum(x[, which(names(x) %in% years)], x[,1], reorder = FALSE, row.names = FALSE), + row.names = NULL) - row.names(x) <- NULL + # row.names(x) <- NULL } else { @@ -361,7 +362,7 @@ criterion_C = function(x, stop("The overall population size provided in 'x' does not match the sum of the subpopulation sizes for one or more taxa. Please, double-check the input data") if (is.null(names(subpop.size)) & class(x[, 1]) %in% c("factor", "character")) { - names(subpop.size) = unique(x$species) + names(subpop.size) = unique(x$tax) warning("Taxon(a) name(s) of 'subpop.size' were not given and were taken from the input population data") } @@ -370,7 +371,7 @@ criterion_C = function(x, warning("Taxon(a) name(s) of 'subpop.size' were not given and were created by 'ConR'") } - } + } } if(is.null(generation.time)) { @@ -688,7 +689,7 @@ criterion_C = function(x, ## Small population size and continuing decline using IUCN criteria Results <- data.frame( - species = names(pop_data), + tax = names(pop_data), assessment.year = assess.year, assessment.period = as.character(unlist(assess.period)), assessment.pop.sizes = as.character(unlist(ps.interval)), diff --git a/R/criterion_D.R b/R/criterion_D.R index 26cfe12..ae65a7b 100644 --- a/R/criterion_D.R +++ b/R/criterion_D.R @@ -7,7 +7,7 @@ #' @param pop.size a value (one species) or a vector (multiple species/ #' subpopulations) containing the population sizes (e.g. number of mature #' individuals). -#' @param Name_Sp a vector containing the name of the taxa to be assessed. +#' @param name_sp a vector containing the name of the taxa to be assessed. #' Default to "Species 1", "Species 2", ..., "Species n", where n is the #' number of taxa. #' @param AOO a vector containing the Area of Occupancy of each taxon (in km2). @@ -84,7 +84,7 @@ #' #' @export criterion_D criterion_D = function(pop.size = NULL, - Name_Sp = NULL, + name_sp = NULL, AOO = NULL, n.Locs = NULL, prop.mature = NULL, @@ -114,17 +114,18 @@ criterion_D = function(pop.size = NULL, if(is.null(pop.size) & all(subcriteria == "D2")) pop.size = rep(NA, max(length(AOO), length(n.Locs))) - if(is.null(Name_Sp)) { + # if(is.null(name_sp)) { - x = as.data.frame(matrix(pop.size, nrow = length(pop.size), dimnames = list(paste("Species",1:length(pop.size)), "pop.size")), + x <- as.data.frame(matrix(pop.size, nrow = length(pop.size), + dimnames = list(paste("Species",1:length(pop.size)), "pop.size")), stringsAsFactors = FALSE) - } else { - - x = as.data.frame(matrix(pop.size, nrow = length(pop.size), dimnames = list(Name_Sp, "pop.size")), - stringsAsFactors = FALSE) - - } + # } else { + # + # x <- as.data.frame(matrix(pop.size, nrow = length(pop.size), dimnames = list(name_sp, "pop.size")), + # stringsAsFactors = FALSE) + # + # } if("D2" %in% subcriteria & (!is.null(AOO) | !is.null(n.Locs))) { @@ -132,11 +133,11 @@ criterion_D = function(pop.size = NULL, stop("The number of values in AOO and n.Locs is not the same. Please check entry data") if(!is.null(AOO)) - x = cbind.data.frame(x, AOO = AOO, - stringsAsFactors = FALSE) + x <- cbind.data.frame(x, AOO = AOO, + stringsAsFactors = FALSE, row.names = NULL) if(!is.null(n.Locs)) - x = cbind.data.frame(x, n.Locs = n.Locs, - stringsAsFactors = FALSE) + x <- cbind.data.frame(x, n.Locs = n.Locs, + stringsAsFactors = FALSE, row.names = NULL) } if(is.null(prop.mature)) { @@ -166,7 +167,7 @@ criterion_D = function(pop.size = NULL, ## Very small or restricted population using IUCN criteria Results <- data.frame( - species = row.names(x), + tax = if (!is.null(name_sp)) name_sp else paste("Species",1:length(pop.size)), stringsAsFactors = FALSE ) From 9b3737a2f0a77f4c6ef4c064c9548982e626a84b Mon Sep 17 00:00:00 2001 From: gdauby Date: Thu, 9 Nov 2023 11:14:46 +0100 Subject: [PATCH 08/23] minor changes docs funcs plus args lower case --- R/AOO.computing.R | 15 ++++++--------- R/EOO.computing.R | 5 ++--- R/Locations.estimation.R | 4 ++-- R/activate_parallel.R | 5 ++--- R/coord.check.R | 1 + 5 files changed, 13 insertions(+), 17 deletions(-) diff --git a/R/AOO.computing.R b/R/AOO.computing.R index 4d9ff69..9fdc92c 100644 --- a/R/AOO.computing.R +++ b/R/AOO.computing.R @@ -11,14 +11,11 @@ #' @param nbe.rep.rast.AOO numeric, by default is 0. Indicate the number of #' raster with random starting position used for estimating the AOO. If 0 but #' some translation of the raster are still done. -#' @param parallel logical, by default is FALSE. Whether running in parallel. -#' @param NbeCores integer, by default is 2. Register the number of cores for -#' parallel execution. Only used if parallel is TRUE. -#' @param show_progress logical, by default is TRUE. Whether a progress bar -#' during computation is shown. +#' @inheritParams activate_parallel +#' @param show_progress logical. Whether progress informations should displayed. TRUE by default #' @param export_shp logical, by default is FALSE. Whether a shapefile of #' occupied cells should be exported. -#' @param proj_type character or numeric, by default is "cea", see Details. +#' @inheritParams proj_crs #' #' @details #' # Input data @@ -66,9 +63,9 @@ #' #' #'# This would estimate AOO for all taxa by overlaying randomly a -#'# grid 10 times. For each taxa, the minimum value is kept +#'# grid 3 times. For each taxa, the minimum value is kept #' -#' AOO <- AOO.computing(dataset.ex, nbe.rep.rast.AO = 10) +#' AOO <- AOO.computing(dataset.ex, nbe.rep.rast.AO = 3) #' #' #' @importFrom utils txtProgressBar setTxtProgressBar @@ -189,7 +186,7 @@ AOO.computing <- function(XY, #' @importFrom foreach %dopar% %do% foreach -#' @keywords intenal +#' @keywords internal #' @export AOO.estimation <- function(coordEAC, cell_size = 2, diff --git a/R/EOO.computing.R b/R/EOO.computing.R index b32b5d9..0b87c2a 100644 --- a/R/EOO.computing.R +++ b/R/EOO.computing.R @@ -80,11 +80,10 @@ #' give a value to species with two unique occurrences, see Details. By default #' is "not comp" #' @param file.name a character string. Name file for exported results in csv file. By default is "EOO.results" -#' @param parallel a logical. Whether running in parallel. By default, it is FALSE -#' @param NbeCores an integer. Register the number of cores for parallel execution. By default, it is 2 -#' @param show_progress logical. Whether a progress bar should displayed. TRUE by default +#' @param show_progress logical. Whether progress informations should displayed. TRUE by default #' @param mode character string either 'spheroid' or 'planar'. By default 'spheroid' #' @inheritParams proj_crs +#' @inheritParams activate_parallel #' #' @return #' If `export_shp` is FALSE, a `dataframe` with one field diff --git a/R/Locations.estimation.R b/R/Locations.estimation.R index 5aefe89..445b4ef 100644 --- a/R/Locations.estimation.R +++ b/R/Locations.estimation.R @@ -7,7 +7,7 @@ #' @param nbe_rep integer #' @param export_shp logical #' @param proj_type character string -#' @param Rel_cell_size numeric, if `method ="sliding_scale"`, `Cell_size_locations` is ignored and the resolution is given by the maximum distance separating two occurrences multiplied by `Rel_cell_size`. By default, it is 0.05 +#' @param rel_cell_size numeric, if `method ="sliding_scale"`, `Cell_size_locations` is ignored and the resolution is given by the maximum distance separating two occurrences multiplied by `Rel_cell_size`. By default, it is 0.05 #' @param method character string #' #' @return a list @@ -21,7 +21,7 @@ locations.estimation <- function(coordEAC, export_shp = FALSE, proj_type = proj_type, method = "fixed_grid", - Rel_cell_size = 0.05 + rel_cell_size = 0.05 ) { diff --git a/R/activate_parallel.R b/R/activate_parallel.R index 1c3d1b2..6e11c4e 100644 --- a/R/activate_parallel.R +++ b/R/activate_parallel.R @@ -4,9 +4,8 @@ #' #' @author Gilles Dauby, \email{gildauby@gmail.com} #' -#' @param XY data.frame -#' @param mode character string either 'spheroid' or 'planar'. By default 'spheroid' -#' @param proj_type crs +#' @param parallel a logical. Whether running in parallel. By default, it is FALSE +#' @param NbeCores an integer. Register the number of cores for parallel execution. By default, it is 2 #' #' @importFrom doSNOW registerDoSNOW #' @importFrom parallel makePSOCKcluster diff --git a/R/coord.check.R b/R/coord.check.R index 9e9ecda..e79147a 100644 --- a/R/coord.check.R +++ b/R/coord.check.R @@ -6,6 +6,7 @@ #' @param listing logical, whether the dataset should be splitted in a list by taxa #' @param proj_type crs #' @param listing_by_valid logical +#' @param cell_size numeric value #' @param check_eoo logical #' #' From 88c4253157e1588e7b8db41e7dcfe54d18c59b59 Mon Sep 17 00:00:00 2001 From: gdauby Date: Thu, 9 Nov 2023 11:15:04 +0100 Subject: [PATCH 09/23] aggregate false output --- R/cell.occupied.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/cell.occupied.R b/R/cell.occupied.R index f648fe5..41f9d78 100644 --- a/R/cell.occupied.R +++ b/R/cell.occupied.R @@ -214,7 +214,7 @@ cell.occupied <- r2_pol <- terra::as.polygons( - r2_) + r2_, aggregate = FALSE) r2_pol_sf <- sf::st_as_sf(r2_pol) From 18f60dba592946c37fc09e395f05362af62fd6f9 Mon Sep 17 00:00:00 2001 From: gdauby Date: Thu, 9 Nov 2023 11:15:27 +0100 Subject: [PATCH 10/23] major change to adapt to others func criterion --- R/criterion_B.R | 391 +++++++++++++++++++++++++++++++----------------- 1 file changed, 252 insertions(+), 139 deletions(-) diff --git a/R/criterion_B.R b/R/criterion_B.R index f45476f..50b0fc7 100644 --- a/R/criterion_B.R +++ b/R/criterion_B.R @@ -9,16 +9,20 @@ #' @param EOO.threshold numeric vector indicating the thresholds used to categorize EOO in IUCN categories #' @param AOO.threshold numeric vector indicating the thresholds used to categorize AOO in IUCN categories #' @param Loc.threshold numeric vector indicating the thresholds used to categorize the number of locations in IUCN categories -#' @param SubPop logical if the number of sub-populations should be computed. By default is TRUE +#' @param comp_subpop logical if the number of sub-populations should be computed. By default is TRUE #' @param method_locations string, indicating the method used for estimating the number of locations. See Details -#' * `"fixed_grid"` (the default) +#' * `"fixed_grid"` (by default) #' * `"sliding_scale"` #' @inheritParams locations.comp #' @inheritParams EOO.computing #' @inheritParams AOO.computing #' @inheritParams subpop.comp -#' @param DrawMap logical, by default is FALSE, if TRUE, a png map is created in a diectory of the working environment +#' @param threshold_severe numeric of one value indicates the threshold +#' to identify severe fragmentation. By default is 50 +#' @param DrawMap logical, by default is FALSE, if TRUE, a png map is created for each species +#' in a directory of the working environment #' @param add.legend logical, whether legend should be added to map +#' @inheritParams activate_parallel #' #' @return A data frame containing, for each of taxon, (EOO, AOO, n.locs, n.subpops?), #' the IUCN categories associated with the sub-criteria and the consensus category @@ -38,17 +42,23 @@ #' @importFrom rnaturalearth ne_countries #' #' @export criterion_B -criterion_B <- function(x, +criterion_B <- function(x = NULL, + AOO = NULL, + EOO = NULL, + locations = NULL, + severe.frag = NULL, + subpops = NULL, #add.legend = FALSE, DrawMap = FALSE, map_pdf = FALSE, draw.poly.EOO = FALSE, EOO.threshold = c(20000, 5000, 100), AOO.threshold = c(2000, 500, 10), Loc.threshold = c(10, 5, 1), - SubPop = TRUE, - Resol_sub_pop = 5, + comp_subpop = TRUE, + comp_severe.frag = FALSE, + resol_sub_pop = 5, cell_size_locations = 10, method_locations = "fixed_grid", method_polygons = "no_more_than_one", - Rel_cell_size = 0.05, + rel_cell_size = 0.05, threat_list = NULL, names_threat = NULL, threat_weight = NULL, @@ -60,6 +70,7 @@ criterion_B <- function(x, exclude.area = FALSE, cell_size_AOO = 2, nbe.rep.rast.AOO = 0, + threshold_severe = 50, parallel = FALSE, show_progress = TRUE, NbeCores = 2, @@ -68,129 +79,226 @@ criterion_B <- function(x, DrawMap = FALSE, add.legend = TRUE) { - if(identical(class(x)[1], "spgeoIN")) { - x <- cbind(x$species_coordinates, x$identifier) - x <- x[,c(2,1,3)] - } - colnames(x)[1:3] <- c("ddlat","ddlon","tax") - if (!requireNamespace("lwgeom", quietly = TRUE)) - stop( - "The 'lwgeom' package is required to run this function.", - "Please install it first." - ) + stop("The 'lwgeom' package is required to run this function.", + "Please install it first.") if (is.null(country_map)) { - country_map <- rnaturalearth::ne_countries(scale = 50, returnclass = "sf") country_map <- sf::st_make_valid(country_map) } else { - if (any(!st_is_valid(country_map))) country_map <- sf::st_make_valid(country_map) } + if (is.null(AOO) | is.null(EOO) | is.null(locations) | is.null(severe.frag) | ifelse(comp_subpop, is.null(subpops), FALSE)) + if (is.null(x)) stop("The argument 'x' is needed because at least one of AOO, EOO, locations, severe.frag and subpops is not provided") + + if (!is.null(x)) { + if (identical(class(x)[1], "spgeoIN")) { + x <- cbind(x$species_coordinates, x$identifier) + x <- x[, c(2, 1, 3)] + } + colnames(x)[1:3] <- c("ddlat", "ddlon", "tax") + } + ########################################################################################## ############################## Sub-populations estimations ############################## - if(SubPop) { - - if (show_progress) message("Subpopulations computation") - - subpop_stats <- - subpop.comp( - XY = x, - Resol_sub_pop = 10, - parallel = parallel, - show_progress = show_progress, - NbeCores = NbeCores, - proj_type = proj_type, - export_shp = ifelse(DrawMap, TRUE, FALSE) - ) - - if (DrawMap) { + if (comp_subpop) { + + if(!is.null(x) & is.null(subpops)) { + + if (show_progress) message("Subpopulations computation") - SubPopPoly <- subpop_stats$poly_subpop - NbeSubPop <- subpop_stats$number_subpop + subpop_stats <- + subpop.comp( + XY = x, + resol_sub_pop = resol_sub_pop, + parallel = parallel, + show_progress = show_progress, + NbeCores = NbeCores, + proj_type = proj_type, + export_shp = any(c(DrawMap, comp_severe.frag)) + ) + if (DrawMap | comp_severe.frag) { + + SubPopPoly <- subpop_stats$poly_subpop + NbeSubPop <- subpop_stats$number_subpop + + } else { + + NbeSubPop <- subpop_stats + + } } else { - NbeSubPop <- subpop_stats + NbeSubPop <- subpops + + if (!identical(class(NbeSubPop), "data.frame")) + stop("subpops should be a data.frame similar to the results of the function 'subpop.comp'") + + if (!all(colnames(NbeSubPop[,c(1:2)]) == c("tax", "subpop"))) + stop("subpops data.frame first two columns should be named as tax, subpop") + + if (DrawMap) { + DrawMap <- FALSE + message("Cannot draw map if subpops is provided") + } } + } + + ########################################################################################## ############################## Estimations of number of Locations ####################### - if (show_progress) message("Locations computation") - - locations_res <- - locations.comp( - XY = x, - method = method_locations, - threat_list = threat_list, - threat_weight = threat_weight, - names_threat = names_threat, - cell_size_locations = cell_size_locations, - method_polygons = method_polygons, - id_shape = id_shape, - show_progress = show_progress, - Rel_cell_size = Rel_cell_size, - parallel = parallel, - NbeCores = NbeCores, - proj_type = proj_type - ) + if (!is.null(x) & is.null(locations)) { + + if (show_progress) message("Locations computation") + + locations_res <- + locations.comp( + XY = x, + method = method_locations, + threat_list = threat_list, + threat_weight = threat_weight, + names_threat = names_threat, + cell_size_locations = cell_size_locations, + method_polygons = method_polygons, + id_shape = id_shape, + show_progress = show_progress, + rel_cell_size = rel_cell_size, + parallel = parallel, + NbeCores = NbeCores, + proj_type = proj_type + ) + + if (DrawMap) locations_poly <- locations_res$locations_poly + locations_res <- locations_res$locations + + } else { + + locations_res <- locations + + if (!identical(class(locations_res), "data.frame")) + stop("locations should be a data.frame similar to the results of the function 'locations.comp'") + + if (!all(colnames(locations_res[,c(1:3)]) == c("tax", "locations", "issue_locations"))) + stop("locations data.frame first three columns should be named as tax, locations, issue_locations") + + if (DrawMap) { + DrawMap <- FALSE + message("Cannot draw map if locations is provided") + } + + } + + ########################################################################################## ############################## EOO ####################### - if (show_progress) message("Extent of occurrences computation") - EOO <- - EOO.computing( - XY = x, - exclude.area = exclude.area, - country_map = country_map, - export_shp = ifelse(DrawMap, TRUE, FALSE), - alpha = alpha, - buff.alpha = buff.alpha, - method.range = method.range, - parallel = parallel, - show_progress = show_progress, - NbeCores = NbeCores, - proj_type = proj_type, - mode = mode - ) # , verbose=FALSE - - if (DrawMap) { + + if (!is.null(x) & is.null(EOO)) { + if (show_progress) message("Extent of occurrences computation") + EOO <- + EOO.computing( + XY = x, + exclude.area = exclude.area, + country_map = country_map, + export_shp = DrawMap, + alpha = alpha, + buff.alpha = buff.alpha, + method.range = method.range, + parallel = parallel, + show_progress = show_progress, + NbeCores = NbeCores, + proj_type = proj_type, + mode = mode + ) # , verbose=FALSE + + if (DrawMap) { + EOO <- EOO$results + eoo_poly <- EOO$spatial + } + + } else { - eoo_poly <- EOO$spatial - EOO <- EOO$results + if (!identical(class(EOO), "data.frame")) + stop("EOO should be a data.frame similar to the results of the function 'EOO.computing'") + + if (!all(colnames(EOO[,c(1:3)]) == c("tax", "eoo", "issue_eoo"))) + stop("EOO data.frame first three columns should be named as tax, eoo, issue_eoo") + + if (DrawMap) { + DrawMap <- FALSE + message("Cannot draw map if EOO is provided") + } } - ################### AOO estimation ####################################################### - if (show_progress) message("Area of occupancy computation") - AOO <- - AOO.computing( - XY = x, - cell_size_AOO = cell_size_AOO, - nbe.rep.rast.AOO = nbe.rep.rast.AOO, - export_shp = ifelse(DrawMap, TRUE, FALSE), - parallel = parallel, - show_progress = show_progress, - NbeCores = NbeCores, - proj_type = proj_type - ) - - if (DrawMap) { + if (!is.null(x) & is.null(AOO)) { + if (show_progress) message("Area of occupancy computation") + AOO <- + AOO.computing( + XY = x, + cell_size_AOO = cell_size_AOO, + nbe.rep.rast.AOO = nbe.rep.rast.AOO, + export_shp = any(c(DrawMap, comp_severe.frag)), + parallel = parallel, + show_progress = show_progress, + NbeCores = NbeCores, + proj_type = proj_type + ) - aoo_poly <- AOO$AOO_poly + if (DrawMap | comp_severe.frag) { + + aoo_poly <- AOO$AOO_poly + AOO <- AOO$AOO + + } + } else { + if (!identical(class(AOO), "data.frame")) + stop("AOO should be a data.frame similar to the results of the function 'AOO.computing'") - AOO <- AOO$AOO + if (!all(colnames(AOO[,c(1:3)]) == c("tax", "aoo", "issue_aoo"))) + stop("AOO data.frame first three columns should be named as tax, aoo, issue_aoo") + if (DrawMap) { + DrawMap <- FALSE + message("Cannot draw map if AOO is provided") + } + } + + if (comp_severe.frag & !is.null(x)) { + + if (is.null(severe.frag)) { + if (show_progress) message("Assessment of severe fragmentation") + + radius <- subpop.radius(XY = x[, c(1:3)], + quant.max = 0.9) + + severe.frag <- + severe_frag(AOO_poly = aoo_poly, + habitat_poly = SubPopPoly, + dist_isolated = radius, + show_progress = show_progress, + threshold_severe = threshold_severe) + + } else { + + if (!identical(class(severe.frag), "data.frame")) + stop("severe.frag should be a data.frame similar to the results of the function 'severe_frag'") + + if (!all(colnames(AOO[,c(1:3)]) == c("tax", "frac", "severe_frag"))) + stop("AOO data.frame first three columns should be named as tax, aoo, issue_aoo") + } } if (any(EOO$eoo - AOO$aoo < 0) || any(is.na(EOO$eoo))) { @@ -212,66 +320,73 @@ criterion_B <- function(x, } - categories <- cat_criterion_b(EOO = EOO$eoo, AOO = AOO$aoo, - locations = locations_res$locations$locations) + locations = locations_res$locations, + sever.frag = if (any(c(comp_severe.frag, !is.null(severe.frag)))) severe.frag$severe_frag else NA) + + if (!is.null(x)) list_data <- coord.check(XY = x) results_full <- data.frame( tax = AOO$tax, EOO = EOO$eoo, AOO = AOO$aoo, - locations = locations_res$locations$locations, + locations = locations_res$locations, + nbe_unique_occs = if (!is.null(x)) list_data$unique_occs else NA_integer_, category_B = categories$ranks_B, category_B_code = categories$cats_code, - subpop = if (SubPop) NbeSubPop$subpop else NA, + subpop = if (comp_subpop) NbeSubPop$subpop else NA_real_, + severe_frag = if (any(c(comp_severe.frag, !is.null(severe.frag)))) severe.frag$severe_frag else NA, issue_aoo = AOO$issue_aoo, issue_eoo = EOO$issue_eoo, - issue_locations = locations_res$locations$issue_locations, - main_threat = if (any(colnames(locations_res$locations) == "main_threat")) locations_res$locations$main_threat else NA, - locations_res$locations[colnames(locations_res$locations) %in% names(threat_list)] + issue_locations = locations_res$issue_locations, + main_threat = if (any(colnames(locations_res) == "main_threat")) locations_res$main_threat else NA_character_, + locations_res[colnames(locations_res) %in% names(threat_list)] ) - list_data <- coord.check(XY = x) + row.names(results_full) <- NULL - if (DrawMap) { + if (!is.null(x)) { - poly_borders <- - suppressWarnings(sf::st_crop(country_map, c(xmin = min(x[,2]), ymin = min(x[,1]), xmax = max(x[,2]), ymax = max(x[,1])))) - poly_borders <- st_make_valid(poly_borders) - - for (i in 1:length(list_data$list_data)) { + if (DrawMap) { + + poly_borders <- + suppressWarnings(sf::st_crop(country_map, c(xmin = min(x[,2]), ymin = min(x[,1]), xmax = max(x[,2]), ymax = max(x[,1])))) + poly_borders <- st_make_valid(poly_borders) - name_sp = results_full$tax[i] + for (i in 1:length(list_data$list_data)) { + + name_sp = results_full$tax[i] + + draw_map_cb(XY = list_data$list_data[[i]], + name_sp = name_sp, + eoo_poly = eoo_poly[which(eoo_poly$tax == name_sp),], + aoo_poly = aoo_poly[which(aoo_poly$tax == name_sp),], + locations_poly = locations_poly[which(locations_poly$tax == name_sp),], + subpop = SubPopPoly[which(SubPopPoly$tax == name_sp),], + proj_type = proj_crs(proj_type = proj_type), + results = results_full[which(results_full$tax == name_sp),], + add.legend = add.legend, + poly_borders = poly_borders) + + } - draw_map_cb(XY = list_data$list_data[[i]], - name_sp = name_sp, - eoo_poly = eoo_poly[which(eoo_poly$tax == name_sp),], - aoo_poly = aoo_poly[which(aoo_poly$tax == name_sp),], - locations_poly = locations_res$locations_poly[which(locations_res$locations_poly$tax == name_sp),], - subpop = SubPopPoly[which(SubPopPoly$tax == name_sp),], - proj_type = proj_crs(proj_type = proj_type), - results = results_full[which(results_full$tax == name_sp),], - add.legend = add.legend, - poly_borders = poly_borders) + # name_sp <- results_full$tax[1] + # eoo_poly <- eoo_poly[which(eoo_poly$tax == name_sp),] + # aoo_poly <- aoo_poly[which(aoo_poly$tax == name_sp),] + # locations_poly <- locations_res$locations_poly[which(locations_res$locations_poly$tax == name_sp),] + # XY <- x[which(x[,3] == name_sp),] + # SubPopPoly <- SubPopPoly[which(SubPopPoly$tax == name_sp),] + # + # draw_map_cb(XY = x[which(x[,3] == name_sp),], + # name_sp = results_full$tax[1], + # eoo_poly = eoo_poly[which(eoo_poly$tax == name_sp),], + # aoo_poly = aoo_poly[which(aoo_poly$tax == name_sp),], + # locations_poly = locations_res$locations_poly[which(locations_res$locations_poly$tax == name_sp),]) } - - # name_sp <- results_full$tax[1] - # eoo_poly <- eoo_poly[which(eoo_poly$tax == name_sp),] - # aoo_poly <- aoo_poly[which(aoo_poly$tax == name_sp),] - # locations_poly <- locations_res$locations_poly[which(locations_res$locations_poly$tax == name_sp),] - # XY <- x[which(x[,3] == name_sp),] - # SubPopPoly <- SubPopPoly[which(SubPopPoly$tax == name_sp),] - # - # draw_map_cb(XY = x[which(x[,3] == name_sp),], - # name_sp = results_full$tax[1], - # eoo_poly = eoo_poly[which(eoo_poly$tax == name_sp),], - # aoo_poly = aoo_poly[which(aoo_poly$tax == name_sp),], - # locations_poly = locations_res$locations_poly[which(locations_res$locations_poly$tax == name_sp),]) - } return(results_full) @@ -295,7 +410,8 @@ criterion_B <- function(x, #' @param add.legend logical #' #' @importFrom grDevices rgb -#' @importFrom graphics mtext +#' @importFrom graphics mtext layout legend box +#' @import sf #' #' @return a plot #' @@ -340,7 +456,7 @@ draw_map_cb <- function(XY, las = 1) if (add.legend) nf <- - layout(matrix(c(1, 1, 2, 3), 2, 2, byrow = TRUE), c(4, 1.5), c(4, 1.5)) + graphics::layout(matrix(c(1, 1, 2, 3), 2, 2, byrow = TRUE), c(4, 1.5), c(4, 1.5)) XY_sf <- st_as_sf(XY, coords = c("ddlon", "ddlat")) st_crs(XY_sf) <- 4326 @@ -423,13 +539,13 @@ draw_map_cb <- function(XY, # type = "bar", # below = "kilometers", # cex=2.5, xy = "bottomright") - mtext(name_sp, side=3, cex=3, line=3) + graphics::mtext(name_sp, side=3, cex=3, line=3) if (add.legend) { graphics::par(mar=c(1,1,1,1), xpd=T) plot(1:10, 1:10, type="n", bty='n', xaxt='n', yaxt='n') - legend(1,10, c(paste("EOO=", ifelse(!is.na(results$EOO), format(round(as.numeric(results$EOO),1), scientific = 5), NA), "km2"), + graphics::legend(1,10, c(paste("EOO=", ifelse(!is.na(results$EOO), format(round(as.numeric(results$EOO),1), scientific = 5), NA), "km2"), paste("AOO=", format(results$AOO, scientific = 5),"km2"), # paste("Number of unique occurrences=", results$), paste("Number of sub-populations=", results$subpop), @@ -443,9 +559,6 @@ draw_map_cb <- function(XY, - - - grDevices::dev.off() } From b5c81a3d242502591a58380bebe64edec1a37e78 Mon Sep 17 00:00:00 2001 From: gdauby Date: Thu, 9 Nov 2023 11:15:49 +0100 Subject: [PATCH 11/23] adapts to new version funcs --- vignettes/articles/ConR.Rmd | 108 ++++++++++++------------------------ 1 file changed, 37 insertions(+), 71 deletions(-) diff --git a/vignettes/articles/ConR.Rmd b/vignettes/articles/ConR.Rmd index e4575e3..bb63602 100644 --- a/vignettes/articles/ConR.Rmd +++ b/vignettes/articles/ConR.Rmd @@ -152,6 +152,16 @@ mean.pop <- matrix(NA, ncol = ncols, nrow = nrows, dimnames = list(spp, new.years)) for(i in seq_along(spp)) mean.pop[i,] <- results[[i]]$Predicted + +mean.pop <- + cbind.data.frame(data.frame( + tax = c( + "Araucaria angustifolia", + "Euterpe edulis", + "Paubrasilia echinata" + ) + ), mean.pop) + ``` We now have a new object called `mean.pop` which stores both the input @@ -172,15 +182,6 @@ nb.occs <- nb.occs$unique_occs ## Extent of Occurrence (EOO) -```{r criterion-b, eval = TRUE, collapse = TRUE} - -pop_metrics <- criterion_B(x = occs, method.range = "convex.hull", show_progress = FALSE) - -``` - - - - We then use the species occurrences to compute their extent of occurrences (EOO) in square kilometers using the function `EOO.computing()` and the IUCN-recommended Convex Hull method. @@ -222,7 +223,7 @@ used as a proxy of species' dispersal abilities: radius <- subpop.radius(XY = occs[, c(1:3)], quant.max = 0.9) sub <- subpop.comp(XY = occs[, c(1:3)], - Resol_sub_pop = radius[,c("tax", "radius")], + resol_sub_pop = radius[,c("tax", "radius")], show_progress = FALSE) ``` @@ -239,7 +240,7 @@ locs <- locations.comp(occs[, c(1:3),], method = "fixed_grid", nbe_rep = 30, cell_size_locations = 10, - Rel_cell_size = 0.05, + rel_cell_size = 0.05, #threat_list = strict.ucs.spdf, #id_shape = "NAME", method_polygons = "no_more_than_one", @@ -249,35 +250,17 @@ locs <- locations.comp(occs[, c(1:3),], ## Severe fragmentation -Another condition to detect threat under the IUCN criterion B is whether the species populations is severely fragmented: _more than half of species AOO corresponds to habitat patches separated from others by a large distance_. Thus, to assess the level of fragmentation we need the information on the species AOO and the dispersal ability. The function ``get.patches()`` computes the percentage of AOO that is isolated across a large distance. +Another condition to detect threat under the IUCN criterion B is whether the species populations is severely fragmented: _more than half of species AOO corresponds to habitat patches separated from others by a large distance_. Thus, to assess the level of fragmentation we need the information on the species AOO and the dispersal ability. The function ``severe_frag()`` computes the percentage of AOO that is isolated across a large distance. ```{r fragmentation, eval = TRUE, collapse = TRUE} -merged_data <- merge(occs, radius, by = "tax", all.x = TRUE, sort = FALSE) -merged_data <- merge(merged_data, AOO[,c("tax", "aoo")], by = "tax", all.x = TRUE, sort = FALSE) -merged_data <- merged_data[, c("ddlat","ddlon","tax","radius","aoo")] -list_data <- coord.check(XY = merged_data, - listing = TRUE) -res <- rep(NA, length(list_data$list_data)) -for (i in seq_along(list_data$list_data)) { - res[i] <- get.patches(list_data$list_data[[i]], - cell_size = 2, - nbe_rep = 0, - AOO = as.double(unique(list_data$list_data[[i]]$aoo)), - Resol_sub_pop = as.double(unique(list_data$list_data[[i]]$radius)), - subpop_poly = NULL, - dist_isolated = as.double(unique(list_data$list_data[[i]]$radius)), - proj_type = "cea", - export_shp = FALSE) - -} -frag.level <- 100 * sub$subpop/ (AOO$aoo / 4) -sever.frag <- frag.level > 50 + +sever.frag <- severe_frag(XY = occs, + resol_sub_pop = radius[,c("tax", "radius")], + dist_isolated = radius$radius) ``` - - ## Area of habitat (AOH) @@ -335,50 +318,33 @@ The IUCN criterion A mainly evaluates paste and projects population size reducti `ConR` also allows to include information on exploitation levels for commercial species (e.g. timber), related to the base d of criterion A. These levels are provided using the argument `exploitation`. ```{r criterion-A, eval = TRUE, collapse = TRUE} -critA <- criterion_A(mean.pop, +critA <- criterion_A(x = mean.pop, assess.year = assess.year, project.years = NULL, subcriteria = c("A2"), generation.time = gen.length, exploitation = harvest) -names(critA)[which(names(critA) %in% "category_A")] <- "A2" +# names(critA)[which(names(critA) %in% "category_A")] <- "A2" ``` ## Species geographic range (IUCN criterion B) -We first combine all spatial metrics obtained in the previous section. +The function `criterion_B()` help to obtain assessments based on the criterion B, as well as others parameters documenting the species geographic range. ```{r metrics-B, eval = TRUE, collapse = TRUE} -critB <- data.frame(species = spp, - Nbe_occs = nb.occs, - EOO = EOO.hull$results$eoo, - AOO = AOO$aoo, - Nbe_subpops = sub$subpop, - Nbe_locs = locs$locations$locations, - declineB = declineB, - sever.frag = sever.frag) -``` -And now we actually compare the metrics against the IUCN criteria and -thresholds, using the function `cat_criterion_b()`. - - -```{r criterion-B, eval = TRUE, collapse = TRUE} -cats_B <- cat_criterion_b(EOO = EOO.hull$results$eoo, - AOO = AOO$aoo, - locations = locs$locations$locations, - sever.frag = sever.frag, - decline = declineB, - protected.threshold = 100, - all.cats = TRUE) -critB$category_B <- cats_B$ranks_B -critB$category_B_code <- cats_B$cats_code -critB$B1 <- cats_B$all_cats$B1a -critB$B2 <- cats_B$all_cats$B2a +critB <- criterion_B( + x = occs, + AOO = AOO, + EOO = EOO.hull$results, + locations = locs$locations, + severe.frag = sever.frag, + subpops = sub +) + + ``` - ## Small and declining populations (IUCN criterion C) @@ -433,14 +399,14 @@ est.decline <- critC$cont.decline The IUCN criterion D is assessed using the function `criterion_D()`. We have no spatially explicit information for future human activities or stochastic events for the Atlantic Forest. Therefore, here we assess the subcriterion D and not D2. -However, function `criterion_D()` can be used to assess D2 if AOO and Number of -locations are provided. +However, function `criterion_D()` can be used to assess D2 only if the AOO and the +number of locations are provided. ```{r criterion-D, eval = TRUE, collapse = TRUE} p.mature.explo <- p.mature - harvest/100 # accounting for exploitation of commercial species #pop.sizes.assess <- mean.pop[id.assess]] # population sizes at the year of assessment critD <- criterion_D(pop.size = mean.pop[[28]], - Name_Sp = mean.pop[[1]], + name_sp = mean.pop[[1]], AOO = AOO$aoo, n.Locs = locs$locations$locations, prop.mature = p.mature.explo, @@ -458,16 +424,16 @@ Because we are assessing multiple criteria for the same set of species, we need to combine the results from all criteria. We try to avoid duplicated columns in the final object `all.crit`. ```{r all-criteria, eval = TRUE, collapse = TRUE} -all.crit <- merge(critA, critB, by = "species", all = TRUE) +all.crit <- merge(critA, critB, by = "tax", all = TRUE) rm.dup.columns <- which(names(critC) %in% c("assessment.year", "assessment.period")) -all.crit <- merge(all.crit, critC[, -rm.dup.columns], by = "species", all = TRUE, +all.crit <- merge(all.crit, critC[, -rm.dup.columns], by = "tax", all = TRUE, suffixes = c(".A",".C")) rm.dup.columns <- which(names(critD) %in% c("AOO")) -all.crit <- merge(all.crit, critD[, -rm.dup.columns], by = "species", all = TRUE) +all.crit <- merge(all.crit, critD[, -rm.dup.columns], by = "tax", all = TRUE) -all.crit <- all.crit[order(all.crit$species),] +all.crit <- all.crit[order(all.crit$tax),] ``` From ba908654a648f99c5116ea3358395cb30629e01d Mon Sep 17 00:00:00 2001 From: gdauby Date: Thu, 9 Nov 2023 11:15:56 +0100 Subject: [PATCH 12/23] updates --- NAMESPACE | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/NAMESPACE b/NAMESPACE index 1ba2b3f..6b89782 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -20,7 +20,6 @@ export(criterion_B) export(criterion_C) export(criterion_D) export(dummy_dist) -export(frag_assess) export(locations.comp) export(map.res) export(near.threatened) @@ -29,6 +28,7 @@ export(pop.decline.fit) export(pop.decline.test) export(pop.fluctuation) export(proj_crs) +export(severe_frag) export(subpop.comp) export(subpop.estimation) export(subpop.radius) @@ -50,6 +50,8 @@ importFrom(foreach,foreach) importFrom(grDevices,chull) importFrom(grDevices,rgb) importFrom(graphics,axis) +importFrom(graphics,box) +importFrom(graphics,layout) importFrom(graphics,legend) importFrom(graphics,mtext) importFrom(graphics,par) @@ -67,6 +69,7 @@ importFrom(sf,st_as_sf) importFrom(sf,st_coordinates) importFrom(sf,st_distance) importFrom(sf,st_geometry) +importFrom(sf,st_intersects) importFrom(sf,st_linestring) importFrom(sf,st_multilinestring) importFrom(sf,st_sfc) From 606ac4c1524d7fd01913e42614b570a64456e908 Mon Sep 17 00:00:00 2001 From: raflima1981 Date: Sat, 18 Nov 2023 00:42:44 -0300 Subject: [PATCH 13/23] Fixing the bug related to Issue #36 --- R/criterion_C.R | 24 +++++++++++++++--------- R/pop.decline.fit.R | 15 ++++++++------- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/R/criterion_C.R b/R/criterion_C.R index c6cb4bf..2e8135e 100644 --- a/R/criterion_C.R +++ b/R/criterion_C.R @@ -166,7 +166,7 @@ #' project.years = NULL, #' generation.time = 10, #' subpop.size = NULL, -#' models = c("linear", "quadratic", "exponential", "logistic", "general_logistic"), +#' models = c("linear", "exponential", "logistic", "general_logistic"), #' subcriteria = c("C1", "C2") #' ) #' @@ -178,7 +178,7 @@ #' generation.time = 10, #' prop.mature = 0.85, #' subpop.size = NULL, -#' models = c("linear", "quadratic", "exponential", "logistic", "general_logistic"), +#' models = c("linear", "exponential", "logistic", "general_logistic"), #' subcriteria = c("C1", "C2") #' ) #' @@ -323,7 +323,6 @@ criterion_C = function(x, } - if("C2" %in% subcriteria) { if(is.null(subpop.size)) { @@ -334,7 +333,8 @@ criterion_C = function(x, subpop.size <- split(x[ , which(names(x) == assess.year)], f = x[,1]) - x <- cbind.data.frame(data.frame(tax = x[,1]), + #x <- cbind.data.frame(data.frame(tax = x[,1]), + x <- cbind.data.frame(data.frame(tax = unique(x[,1])), rowsum(x[, which(names(x) %in% years)], x[,1], reorder = FALSE, row.names = FALSE), row.names = NULL) @@ -372,6 +372,13 @@ criterion_C = function(x, } } + } else { + + if(any(duplicated(x[,1]))) + x <- cbind.data.frame(data.frame(tax = unique(x[,1])), + rowsum(x[, which(names(x) %in% years)], x[,1], reorder = FALSE, row.names = FALSE), + row.names = NULL) + } if(is.null(generation.time)) { @@ -494,7 +501,6 @@ criterion_C = function(x, } } - if ("C1" %in% subcriteria) { if (project) { @@ -532,9 +538,9 @@ criterion_C = function(x, pop_data.names <- names(pop_data) pop_data <- lapply(1:length(pop_data), function(i) { - df <- pop_data[[i]] - nomes <- names(df) - new.df <- as.data.frame(t(as.numeric(df) * prop.mature[i]), row.names = 1) + old.df <- pop_data[[i]] + nomes <- names(old.df) + new.df <- as.data.frame(t(as.numeric(old.df) * prop.mature[i]), row.names = 1) names(new.df) <- nomes pop_data[[i]] <- new.df }) @@ -563,7 +569,7 @@ criterion_C = function(x, if(pv.yr %in% names(y)) { y1 <- as.numeric(y[which(names(y) == pv.yr):which(names(y) == assess.year)]) - + } else { avail.ys <- as.double(names(pop_data[[i]])) diff --git a/R/pop.decline.fit.R b/R/pop.decline.fit.R index eec1c0d..2650096 100644 --- a/R/pop.decline.fit.R +++ b/R/pop.decline.fit.R @@ -115,23 +115,24 @@ #' #' @export pop.decline.fit #' -pop.decline.fit <- function(pop.size, - years, +pop.decline.fit <- function(pop.size = NULL, + years = NULL, models = "all", project.years = NULL, plot.fit = TRUE, max.count = 50, ...) { - + + if(is.null(pop.size)) + stop("Please provide a vector of population sizes") + if(is.null(years)) { anos <- as.numeric(gsub("[^0-9]", "", names(pop.size)[grepl("[0-9]", names(pop.size))])) - if(is.null(anos)) { - + if(is.null(anos)) stop("Please provide at least two years with estimates of population sizes") - - } + } else { anos <- years From 2bd53644b8661e6549cd5f1092134b0f534cdb8d Mon Sep 17 00:00:00 2001 From: raflima1981 Date: Sat, 18 Nov 2023 01:47:58 -0300 Subject: [PATCH 14/23] Fixing the near. threat bug in the tutorial --- R/near.threatened.R | 92 ++++++++++++++++++++----------------- vignettes/articles/ConR.Rmd | 52 ++++++--------------- 2 files changed, 65 insertions(+), 79 deletions(-) diff --git a/R/near.threatened.R b/R/near.threatened.R index d4f4cc8..64064bd 100644 --- a/R/near.threatened.R +++ b/R/near.threatened.R @@ -5,61 +5,71 @@ #' "LC or NT" (the standard output string in ConR). #' #' @param cats a character string containing the Red List categories. -#' @param EOO numeric vector with species extent of occurrence - EOO (i.e. sub-criterion B1) -#' @param AOO numeric vector with species area of occupancy - AOO (i.e. sub-criterion B2) -#' @param decline string vector providing the status of the species continuing decline in EOO, AOO, habitat, -#' locations or subpopulations or population size (i.e. condition 'b'). -#' @param pop.reduction numeric vector with the estimated percentage of population -#' reduction in the last three generations. -#' @param pop.size numeric vector with the mean estimate of population size in number -#' of mature individuals. -#' @param pop.size.low numeric vector with the lower bound of the confidence interval -#' of the population size in number of mature individuals. -#' @param locations numeric vector with the number of locations where the species occur (i.e. condition 'a') -#' @param sever.frag numeric vector with the proportion AOO which is in patches that are separated from other patches by a large distance. -#' @param subpop numeric vector with the number of sub-populationsfor the species +#' @param EOO numeric vector with species extent of occurrence - EOO (i.e. +#' sub-criterion B1) +#' @param AOO numeric vector with species area of occupancy - AOO (i.e. +#' sub-criterion B2) +#' @param decline string vector providing the status of the species continuing +#' decline in EOO, AOO, habitat, locations or subpopulations or population +#' size (i.e. condition 'b'). +#' @param pop.reduction numeric vector with the estimated percentage of +#' population reduction in the last three generations. +#' @param pop.size numeric vector with the mean estimate of population size in +#' number of mature individuals. +#' @param pop.size.low numeric vector with the lower bound of the confidence +#' interval of the population size in number of mature individuals. +#' @param locations numeric vector with the number of locations where the +#' species occur (i.e. condition 'a') +#' @param sever.frag numeric vector with the proportion AOO which is in patches +#' that are separated from other patches by a large distance. +#' @param subpop numeric vector with the number of sub-populationsfor the +#' species #' @param ext.fluct numeric vector with the mean order of magnitude of the #' differences between population minima and maxima. -#' @param subcriteria character string with the sub-criteria used to perform the assessments (e.g. "A1") +#' @param subcriteria character string with the sub-criteria used to perform +#' the assessments (e.g. "A1") #' @param many.more numeric value to numerically express what "many more" means. -#' @param extra.case logical. Should the extra case to detected probable "LC" be used? -#' Default to TRUE. +#' @param extra.case logical. Should the extra case to detected probable "LC" be +#' used? Default to TRUE. #' -#' @return A vector of the same length as ```cats``` with NT separated from -#' the LC category. If the category provided is different than "LC" or "LC or NT" -#' the function returns the same category. +#' @return A vector of the same length as ```cats``` with NT separated from the +#' LC category. If the category provided is different than "LC" or "LC or NT" +#' the function returns the same category. #' -#' @details This function automatically identify the Near Threatened (NT) category -#' among the "LC or NT" general category. A species qualify as NT if it is close -#' to qualifying for the Vulnerable category (IUCN, 2019). +#' @details +#' +#' This function automatically identify the Near Threatened (NT) category among +#' the "LC or NT" general category. A species qualify as NT if it is close to +#' qualifying for the Vulnerable category (IUCN, 2019). #' -#' The function try to translate the list of cases where NT applies and does not -#' applies (IUCN 2019, pp 76-77). Not all the cases listed were translated here, -#' particularly those based on uncertainties of the estimates. To perform this -#' translation some interpretation, adaptation or generalization was carried out, -#' namely: +#' The function try to translate the list of cases where NT applies and does +#' not applies (IUCN 2019, pp 76-77). Not all the cases listed were translated +#' here, particularly those based on uncertainties of the estimates. To perform +#' this translation some interpretation, adaptation or generalization was +#' carried out, namely: #' - "Population has declined by an estimated 20 - 25% in the last three generations: pop. reduction between 20 and 30%; #' - "Population has declined by an estimated 10%": pop. reduction >10%; #' - "many more": by default we use triple to numerically express many more; #' - "(...) has about 15,000/1,500 mature individuals": mature individuals between 10000 and 16000/1000 and 1600, respectively; #' - "The population has more than 2,000 mature individuals": pop. size <2000 & #' -#' For many of the cases listed by IUCN (2019, pp 76 - 77), there is a minimum +#' For many of the cases listed by IUCN (2019, pp 76 - 77), there is a minimum #' number of arguments that should be provided so that the NT criteria can be -#' assigned. For instance, if only ```EOO``` and ```AOO``` is given no species will -#' be classified as NT and the function will return "LC" for all "LC" or "LC or NT" -#' provided as an input. On the other hand, if only ```pop.size``` species can be -#' classified as "NT". Please see all the IUCN cases for more details on this -#' (IUCN 2019, pp 76-77). +#' assigned. For instance, if only ```EOO``` and ```AOO``` is given no species +#' will be classified as NT and the function will return "LC" for all "LC" or +#' "LC or NT" provided as an input. On the other hand, if only ```pop.size``` +#' species can be classified as "NT". Please see all the IUCN cases for more +#' details on this (IUCN 2019, pp 76-77). #' -#' We added one extra case to the list of cases from IUCN (2019) where species should -#' be classified as "LC" and not "NT". This case comes from an interpretation of the -#' IUCN (2019) guidelines and it is unoficially used by the IUCN/SSC Global Tree Specialist -#' Group as an indication of low probability of triggering a threatened or NT categories, -#' if the species is not cited as threatened based on other criteria (e.g. uses and threats): -#' - EOO > 30000 km2 or AOO > 3000 km2, and number of locations > 30. This extra case can -#' be excluded from the separation between "LC" and "NT" by setting the argument -#' ```extra.case``` to FALSE. +#' We added one extra case to the list of cases from IUCN (2019) where species +#' should be classified as "LC" and not "NT". This case comes from an +#' interpretation of the IUCN (2019) guidelines and it is unoficially used by +#' the IUCN/SSC Global Tree Specialist Group as an indication of low +#' probability of triggering a threatened or NT categories, if the species is +#' not cited as threatened based on other criteria (e.g. uses and threats): +#' - EOO > 30000 km2 or AOO > 3000 km2, and number of locations > 30. This +#' extra case can be excluded from the separation between "LC" and "NT" by +#' setting the argument ```extra.case``` to FALSE. #' #' @author Renato A. Ferreira de Lima #' diff --git a/vignettes/articles/ConR.Rmd b/vignettes/articles/ConR.Rmd index bb63602..539bfbf 100644 --- a/vignettes/articles/ConR.Rmd +++ b/vignettes/articles/ConR.Rmd @@ -102,7 +102,7 @@ provided within the internal object `example_tutorial`. We will name it ```{r pop-sizes, eval = TRUE, collapse = TRUE} pop.sizes <- example_tutorial$population.sizes years <- names(pop.sizes[,-1]) -pop.sizes[, 1:4] +pop.sizes[, 1:6] ``` @@ -152,15 +152,7 @@ mean.pop <- matrix(NA, ncol = ncols, nrow = nrows, dimnames = list(spp, new.years)) for(i in seq_along(spp)) mean.pop[i,] <- results[[i]]$Predicted - -mean.pop <- - cbind.data.frame(data.frame( - tax = c( - "Araucaria angustifolia", - "Euterpe edulis", - "Paubrasilia echinata" - ) - ), mean.pop) +mean.pop <- cbind.data.frame(tax = spp, mean.pop, row.names = NULL) ``` @@ -254,10 +246,10 @@ Another condition to detect threat under the IUCN criterion B is whether the spe ```{r fragmentation, eval = TRUE, collapse = TRUE} - sever.frag <- severe_frag(XY = occs, resol_sub_pop = radius[,c("tax", "radius")], - dist_isolated = radius$radius) + dist_isolated = radius$radius, + show_progress = FALSE) ``` @@ -267,29 +259,12 @@ sever.frag <- severe_frag(XY = occs, The area of habitat (AOH) is currently not an official population metric that is compared against the IUCN Criteria. However, it provides important information on the amount of habitat left for a given species within its EOO and more -importantly how this amount changes through time. +importantly how this amount is changing through time. Here, we compute AOH to infer the continuing declines of the species area of habitat, another important condition to assess the IUCN criterion B. ```{r area-of-habitat, eval = TRUE, collapse = TRUE} -# toto <- read.csv("C:\\Users/renato/Documents/Artigo Extincao na MA/data analysis/data/ESACCI-LC-Legend.csv", as.is=TRUE) -# hab.class <- toto$NB_LAB[grepl("ForestCover", toto$LegendTreeCoSimp)] - -## Loading aggregated rasters and extracting the habitat loss/quality -# ano1 = 2000 -# hab.map <- raster::stack(paste0("C:\\Users/renato/Documents/Artigo Extincao na MA/data analysis/data/ESA_Land_Cover_map_", ano1, "_2015_AF_1km.tif")) -# hab.map <- stars::read_stars(paste0("C:\\Users/renato/Documents/Artigo Extincao na MA/data analysis/data/ESA_Land_Cover_map_", ano1, "_2015_AF_1km.tif")) -# names(hab.map) <- paste("ESA",c(ano1,2015), sep=".") -# hab.map1 <- as(hab.map, "SpatRaster") -# anos <- 2015 - ano1 -# -# AOH <- AOH.estimation(XY = occs[, c(1:3),], -# hab.map = hab.map, -# hab.class = hab.class, -# # years = c(2000, 2015), -# # years = anos, -# parallel = TRUE, NbeCores = 5) AOH <- data.frame(tax = spp, prop.EOO = c(18.80422, 18.74939, 16.89696), area.EOO = c(309588.7, 389226.0, 274717.6), @@ -324,12 +299,13 @@ critA <- criterion_A(x = mean.pop, subcriteria = c("A2"), generation.time = gen.length, exploitation = harvest) -# names(critA)[which(names(critA) %in% "category_A")] <- "A2" +names(critA)[which(names(critA) %in% "category_A")] <- "A2" ``` ## Species geographic range (IUCN criterion B) -The function `criterion_B()` help to obtain assessments based on the criterion B, as well as others parameters documenting the species geographic range. +The function `criterion_B()` help to obtain assessments based on the criterion +B, as well as others parameters documenting the species geographic range. ```{r metrics-B, eval = TRUE, collapse = TRUE} @@ -443,20 +419,20 @@ Next, we try to tell apart the Least Concern (LC) from Near-Threatened (NT) species using the function `near.threatened()`: ```{r near-threatened, eval = TRUE, collapse = TRUE} -subcriteria <- c("A2", "B1", "B2", "C1", "C2", "D") +subcriteria <- c("A2", "category_B", "C1", "C2", "D") for(i in 1:length(subcriteria)) { all.crit[,subcriteria[i]] <- near.threatened(cats = all.crit[,subcriteria[i]], EOO = all.crit$EOO, AOO = all.crit$AOO, - decline = all.crit$declineB, + decline = all.crit$any.decline, pop.reduction = all.crit$reduction_A12, pop.size = all.crit$pop.size, pop.size.low = NULL, - locations = all.crit$Nbe_locs, - sever.frag = all.crit$sever.frag, + locations = all.crit$locations, + sever.frag = all.crit$severe_frag, ext.fluct = NULL, - subpop = all.crit$Nbe_subpops, + subpop = all.crit$subpop, subcriteria = subcriteria[i]) } ``` @@ -470,7 +446,7 @@ restrictive category for each species prevails, the function returns the evaluation result using other criteria. ```{r consensus, eval = TRUE, collapse = TRUE} -consensus <- cat_mult_criteria(all.crit[,c("species", subcriteria)]) +consensus <- cat_mult_criteria(all.crit[,c("tax", subcriteria)]) all.crit <- cbind.data.frame(all.crit, consensus[,c("category","main.criteria","aux.criteria")]) ``` From 249462aa2fd2e52937d4eed897c1b7ef240db952 Mon Sep 17 00:00:00 2001 From: raflima1981 Date: Wed, 10 Jan 2024 13:36:20 -0300 Subject: [PATCH 15/23] Vectoring function to calculate population declines, adpating the functions that depend on them and creating the tests for all these functions --- R/criterion_A.R | 101 ++++++------- R/criterion_C.R | 93 ++++-------- R/pop.decline.R | 323 ++++++++++++++++++++++++++++++++++++++++ R/pop.decline.fit.R | 154 ++++++++----------- R/pop.decline.test.R | 104 +++++++++---- man/criterion_A.Rd | 11 +- man/criterion_C.Rd | 4 +- man/pop.decline.Rd | 131 ++++++++++++++++ man/pop.decline.fit.Rd | 77 +++++----- man/pop.decline.test.Rd | 13 +- tests/testthat/test-5.R | 41 +++++ tests/testthat/test-6.R | 72 +++++++++ tests/testthat/test-7.R | 165 ++++++++++++++++++++ tests/testthat/test-8.R | 133 +++++++++++++++++ tests/testthat/test-9.R | 30 ++++ 15 files changed, 1150 insertions(+), 302 deletions(-) create mode 100644 R/pop.decline.R create mode 100644 man/pop.decline.Rd create mode 100644 tests/testthat/test-5.R create mode 100644 tests/testthat/test-6.R create mode 100644 tests/testthat/test-7.R create mode 100644 tests/testthat/test-8.R create mode 100644 tests/testthat/test-9.R diff --git a/R/criterion_A.R b/R/criterion_A.R index 8f0e449..b719c18 100644 --- a/R/criterion_A.R +++ b/R/criterion_A.R @@ -130,8 +130,7 @@ #' generation.time = 10) #' #' ## Another example: one species, more observations and subcriteria -#' pop = c("1970" = 10000, "1980" = 8900, "1990" = 7000, "2000" = 6000, -#' "2030" = 4000) +#' pop = c("1970" = 10000, "1980" = 8900, "1990" = 7000, "2000" = 6000, "2030" = 4000) #' criterion_A(x = pop, #' years = c(1970, 1980, 1990, 2000, 2030), #' assess.year = 2000, @@ -167,24 +166,18 @@ #' subcriteria = c("A1", "A2", "A3", "A4"), #' generation.time = c(2,5,10,15,30,50)) #' -#' ## Same data but with different options (need to use predictions from statistical models) -#' criterion_A(example_criterionA, -#' years = NULL, -#' assess.year = 2010, -#' project.years = NULL, -#' subcriteria = c("A1", "A2", "A3", "A4"), -#' generation.time = 10) -#' -#' @importFrom utils txtProgressBar setTxtProgressBar head +#' @importFrom utils setTxtProgressBar head #' @importFrom parallel stopCluster #' #' @export criterion_A -criterion_A = function(x, +#' +criterion_A <- function(x, years = NULL, assess.year = NULL, project.years = NULL, generation.time = NULL, - models = c("linear", "quadratic", "exponential", "logistic", "general_logistic","piecewise"), + models = c("linear", "quadratic", "exponential", "logistic", + "general_logistic","piecewise"), subcriteria = c("A1", "A2", "A3", "A4"), exploitation = NULL, correction = NULL, @@ -409,10 +402,10 @@ criterion_A = function(x, if(any(miss.prev)) { - ids1 = which(miss.prev + min.prev == 1) + ids1 <- which(miss.prev + min.prev == 1) yrs[ids1] <- lapply(1:length(yrs[ids1]), function(i) sort(unique(c(prev.year[ids1[i]], yrs[[ids1[i]]])))) - ids2 = which(miss.prev + min.prev == 2) + ids2 <- which(miss.prev + min.prev == 2) yrs[ids2] <- lapply(1:length(yrs[ids2]), function(i) unique(c(prev.year[ids2[i]], seq(prev.year[ids2[i]], min(yrs[[ids2[i]]]), by= int), @@ -449,7 +442,7 @@ criterion_A = function(x, } else { names(x) <- gsub("[^0-9]", "", names(x)[grepl("[0-9]", names(x))]) - nomes <- paste("species", 1:dim(x)[1]) + nomes <- paste0("species", 1:dim(x)[1]) pop_data <- split(x, f = nomes) } @@ -468,46 +461,44 @@ criterion_A = function(x, which.pred <- which(sapply(miss.years, any)) - cat("Computing the predictions based on population trends...", sep= "\n") + proj.years1 <- sort(unique(unlist(yrs))) - cl <- activate_parallel(parallel = parallel, NbeCores = NbeCores) - `%d%` <- c_par(parallel = parallel) + cat("Computing the predictions based on population trends...", sep= "\n") - pro_res <- display_progress_bar(show_progress = show_progress, max_pb = length(which.pred)) - opts <- pro_res$opts - pb <- pro_res$pb + models.fit <- pop.decline(pop.size = do.call(rbind, pop_data), + years = years, + taxa = names(pop_data), + models = models, + project.years = proj.years1, + output = c("predictions", "best.model"), + show_progress = show_progress) - x <- NULL - models.fit <- foreach::foreach( - x = which.pred, - .options.snow = opts - ) %d% { - - if (!parallel & show_progress) setTxtProgressBar(pb, x) - - pred.sp <- pop.decline.fit(pop.size = pop_data[[x]], - years = years, - models = models, - project.years = yrs[[x]], - plot.fit = FALSE - #) - ,...) + for (i in 1:length(which.pred)) { + + old.data <- pop_data[[which.pred[i]]] + if(inherits(models.fit$predictions, "data.frame")) { + new.data <- models.fit$predictions + best.models[[which.pred[i]]] <- models.fit[[2]] + } + + if(inherits(models.fit$predictions, "list")) { + new.data <- models.fit$predictions[[which.pred[i]]] + best.models[[which.pred[i]]] <- models.fit[[2]][[which.pred[i]]] + } + + new.data$pop.size[is.na(new.data$pop.size)] <- + new.data$predicted[is.na(new.data$pop.size)] + new.data1 <- matrix(new.data$pop.size, nrow =1, + dimnames = list(row.names(old.data), new.data$years)) + new.data1 <- as.data.frame(new.data1) - pred.pop.size <- pred.sp$data$Observed - pred.pop.size[is.na(pred.sp$data$Observed)] <- - pred.sp$data$Predicted[is.na(pred.sp$data$Observed)] - names(pred.pop.size) <- pred.sp$data$Year - res <- list(pred.pop.size, attributes(pred.sp$best.model)$best.model.name) - res + pop_data[[which.pred[i]]] <- new.data1 } - if(parallel) parallel::stopCluster(cl) - if(show_progress) close(pb) - - for (i in 1:length(which.pred)) { - pop_data[[which.pred[i]]] <- models.fit[[i]][[1]] - best.models[[which.pred[i]]] <- models.fit[[i]][[2]] - } + # for (i in 1:length(which.pred)) { + # pop_data[[which.pred[i]]] <- models.fit[[i]][[1]] + # best.models[[which.pred[i]]] <- models.fit[[i]][[2]] + # } } assess.period <- lapply(1:length(pop_data), @@ -535,7 +526,7 @@ criterion_A = function(x, row.names(Results) <- NULL if(!is.null(best.models)) - Results$predictive.model <- as.character(unlist(best.models)) + Results$predictive.model <- unlist(best.models) # criteria A1/A2 if("A1" %in% subcriteria | "A2" %in% subcriteria) { @@ -611,9 +602,10 @@ criterion_A = function(x, Results$reduction_A4 <- 100 * sapply(1:length(pop_data), function(y) - max(1 - (as.numeric(pop_data[[y]][names(pop_data[[y]]) %in% as.character(anos2[[y]])][!dup.yrs[[y]]]) / + #max(1 - (as.numeric(pop_data[[y]][names(pop_data[[y]]) %in% as.character(anos2[[y]])][!dup.yrs[[y]]]) / + max(1 - (as.numeric(pop_data[[y]][names(pop_data[[y]]) %in% as.character(anos2[[y]])]) / as.numeric(pop_data[[y]][names(pop_data[[y]]) %in% as.character(anos1[[y]])][!dup.yrs[[y]]])), na.rm = TRUE)) - + if (any(Results$reduction_A4 > 100)) { Results$reduction_A4[Results$reduction_A4 > 100] <- 100 warning("One or more values of pop. size reduction were above 100% for subcriterion A4") @@ -672,5 +664,8 @@ criterion_A = function(x, Results[, apply(Results, MARGIN = 2, function(x) ! all(is.na(x)))] + if (length(subcriteria) == 1) + names(Results)[which(names(Results) %in% "category_A")] <- subcriteria + return(Results) } diff --git a/R/criterion_C.R b/R/criterion_C.R index 2e8135e..08631e4 100644 --- a/R/criterion_C.R +++ b/R/criterion_C.R @@ -210,7 +210,8 @@ criterion_C = function(x, generation.time = NULL, prop.mature = NULL, subpop.size = NULL, - models = c("linear", "quadratic", "exponential", "logistic", "general_logistic","piecewise"), + models = c("linear", "quadratic", "exponential", "logistic", + "general_logistic","piecewise"), subcriteria = c("C1", "C2"), correction = NULL, #data.type = NULL, @@ -367,7 +368,7 @@ criterion_C = function(x, } if (is.null(names(subpop.size)) & !class(x[, 1]) %in% c("factor", "character")) { - names(subpop.size) = paste("species", 1:dim(x)[1]) + names(subpop.size) = paste0("species", 1:dim(x)[1]) warning("Taxon(a) name(s) of 'subpop.size' were not given and were created by 'ConR'") } @@ -531,7 +532,7 @@ criterion_C = function(x, } else { names(x) <- gsub("[^0-9]", "", names(x)[grepl("[0-9]", names(x))]) - nomes <- paste("species", 1:dim(x)[1]) + nomes <- paste0("species", 1:dim(x)[1]) pop_data <- split(x, f = nomes) } @@ -546,24 +547,13 @@ criterion_C = function(x, }) names(pop_data) <- pop_data.names - ## Continuing decline at any rate - - # any.decline <- sapply(pop_data, ## old version -> all years - # function(y) { - # if(!is.null(ignore.years)) - # y = y[,!names(y) %in% ignore.years] - # y1 = as.numeric(y[1:which(names(y) == assess.year)]) - # y1 = y1[!is.na(y1)] - # mean(diff(y1), na.rm=TRUE) / - # utils::head(y1, 1)}) - - any.decline <- sapply(1:length(pop_data), ## new version -> recent decline between assess.year and recent.year + ## Continuing decline at any rate (between assess.year and recent.year) + any.decline <- sapply(1:length(pop_data), function(i) { y <- pop_data[[i]] if(!is.null(ignore.years)) y <- y[,!names(y) %in% ignore.years] - # pv.yr <- prev.year1[i] pv.yr <- recent.year if(pv.yr %in% names(y)) { @@ -591,53 +581,20 @@ criterion_C = function(x, if(length(x) < 3) stop("Too few year intervals to fit a model to population trends") - #models.fit <- as.list(rep(NA, length(pop_data))) - cat("Computing the estimated continuing decline (subcriteria C1)...", sep= "\n") - cl <- activate_parallel(parallel = parallel, NbeCores = NbeCores) - `%d%` <- c_par(parallel = parallel) + proj.years1 <- sort(unique(unlist(yrs))) - pro_res <- display_progress_bar(show_progress = show_progress, max_pb = length(pop_data)) - opts <- pro_res$opts - pb <- pro_res$pb + models.fit <- pop.decline(pop.size = do.call(rbind, pop_data), + years = years, + taxa = names(pop_data), + models = models, + project.years = proj.years1, + output = "all", by.taxon = TRUE, + show_progress = show_progress) - models.fit <- foreach::foreach( - w = 1:length(pop_data), - .options.snow = opts - ) %d% { - - if (!parallel & show_progress) - setTxtProgressBar(pb, w) - - pop.size.i <- pop_data[[w]] - years.i <- years - project.years.i <- yrs[[w]] - - if(!is.null(ignore.years)) { - pop.size.i <- pop.size.i[,!names(pop.size.i) %in% ignore.years] - years.i <- years.i[!years.i %in% ignore.years] - project.years.i <- project.years.i[!project.years.i %in% ignore.years] - } - - if(all(project.years.i %in% names(pop.size.i))) - project.years.i <- NULL - - res <- pop.decline.fit(pop.size = pop.size.i, - years = years.i, - models = models, - project.years = project.years.i, - plot.fit = FALSE - ,...) - res - } + cont.decline <- sapply(models.fit, pop.decline.test) - if(parallel) parallel::stopCluster(cl) - if(show_progress) close(pb) - - cont.decline <- sapply(models.fit, pop.decline.test, - assess.year = assess.year) - } miss.years <- lapply(1:length(yrs), @@ -647,18 +604,19 @@ criterion_C = function(x, if (any(sapply(miss.years, any))) { # Predictions based on the best model fit to population trends - best.models = as.list(rep(NA, length(pop_data))) - which.pred = which(sapply(miss.years, any)) + best.models <- as.list(rep(NA, length(pop_data))) + which.pred <- which(sapply(miss.years, any)) for(i in 1:length(which.pred)) { pred.sp <- models.fit[[which.pred[i]]] - pred.pop.size <- pred.sp$data$Observed - pred.pop.size[is.na(pred.sp$data$Observed)] <- - pred.sp$data$Predicted[is.na(pred.sp$data$Observed)] - names(pred.pop.size) <- pred.sp$data$Year + pred.pop.size <- pred.sp$predictions$pop.size + pred.pop.size[is.na(pred.sp$predictions$pop.size)] <- + pred.sp$predictions$predicted[is.na(pred.sp$predictions$pop.size)] + names(pred.pop.size) <- pred.sp$predictions$year pop_data[[which.pred[i]]] <- pred.pop.size - best.models[[which.pred[i]]] <- attributes(pred.sp$best.model)$best.model.name + best.models[[which.pred[i]]] <- pred.sp$best.model + # best.models[[which.pred[i]]] <- attributes(pred.sp$best.model)$best.model.name } } @@ -686,10 +644,8 @@ criterion_C = function(x, paste(unique(sort( c( names(pop_data1[[i]])[which(names(pop_data1[[i]]) %in% prev.year3[i])], - #min(names(pop_data1[[i]])), assess.year, names(pop_data1[[i]])[which(names(pop_data1[[i]]) %in% proj.year3[i])] - #max(names(pop_data1[[i]])) ) )), collapse = "-")) @@ -705,7 +661,8 @@ criterion_C = function(x, row.names(Results) <- NULL if(!is.null(best.models)) - Results$predictive.model[which.pred] <- as.character(unlist(best.models))[which.pred] + Results$predictive.model[which.pred] <- + as.character(unlist(best.models))[which.pred] ## Population size at the assessment Results$assess.pop.size <- sapply(1:length(pop_data), diff --git a/R/pop.decline.R b/R/pop.decline.R new file mode 100644 index 0000000..671b04a --- /dev/null +++ b/R/pop.decline.R @@ -0,0 +1,323 @@ +#' @title Calculating Population Reduction +#' +#' @description Based on the fit of statistical models to population data, the +#' function estimates the decline on the number of mature individuals across +#' time, expressed in percentage. +#' +#' @param pop.size a vector, data frame or matrix containing the (estimated) +#' number of mature individuals of species (i.e. population size). If a data +#' frame or matrix, rows are the species and columns are the population sizes. +#' @param years a vector containing the years for which the population sizes is +#' available +#' @param taxa a vector containing the name of the species in ```pop.size``` +#' @param models a vector containing the names of the statistical models to be +#' fitted to species population data +#' @param project.years a vector containing the years for which the number of +#' mature individuals should be predicted using the best candidate statistical +#' model +#' @param output a character or vector containing the desired output from the +#' function. The options are: "predictions", "model.fit", "model.selection" +#' and "best.model". By default, the function returns only the precitions. +#' @param by.taxon logical. Should the output list be organized by the selected +#' output options (i.e. predictions, model.fit, model.selection and +#' best.model) for all taxa or should it cointain one taxon per taxon with +#' all selected outputs? Defaults to FALSE (list organized by outputs and not +#' taxa). +#' @inheritParams activate_parallel +#' @param show_progress logical. Whether progress informations should be +#' displayed. TRUE by default +#' @param ... other parameters to be passed as arguments for functions +#' ```pop.decline.fit``` and ```ICtab.mod.select``` +#' +#' @return a named list +#' +#' @details +#' By default, the function compares the fit of six statistical models to the +#' population trends, namely: linear, quadratic, exponential, logistic, +#' generalized logistic and piece-wise. But users can use different combinations +#' of those models using the argument ```models```, according to the specificity +#' of their study region or groups of organism. See ```pop.decline.fit``` for +#' more details and assumptions on how those models are fitted to population +#' data and how the candidate models are selected. +#' +#' @seealso \link[ConR]{pop.decline.fit} +#' +#' @author Renato A. Ferreira de Lima +#' +#' @references +#' +#' IUCN 2019. Guidelines for Using the IUCN Red List Categories and +#' Criteria. Version 14. Standards and Petitions Committee. Downloadable from: +#' http://www.iucnredlist.org/documents/RedListGuidelines.pdf. +#' +#' @examples +#' ## Creating vectors with the population data and time intervals +#' #(adapted from the IUCN 2019 workbook for Criterion A, available +#' #at: https://www.iucnredlist.org/resources/criterion-a) +#' +#' pop = c(10000, 9050, 8250, 7500, 7200, 6950) +#' pop1 = c(10000, NA, 8200, NA, NA, 6000) +#' yrs = c(1970, 1975, 1980, 1985, 1990, 2000) +#' tax = c("species A", "species B") +#' pops = matrix(c(pop, pop1), nrow = length(tax), +#' dimnames = list(tax, yrs), byrow = TRUE) +#' +#' ## Fitting data with different models and settings +#' # only one species, all models (default) +#' pop.decline(pop, yrs) +#' +#' # two species or more +#' pop.decline(pops) +#' +#' # two species or more, less models +#' pop.decline(pops, models = c("linear", "quadratic")) +#' pop.decline(pops, models = "exponential") +#' +#' # two species or more, exponential models with projections +#' pop.decline(pops, models = "exponential", project.years = c(1960, 2050)) +#' pop.decline(pops, models = "exponential", project.years = c(1973, 2005)) +#' +#' # two species or more, different outputs +#' pop.decline(pops, models = "exponential", output = "model.fit") +#' pop.decline(pops, models = c("linear", "quadratic", "exponential"), +#' output = "model.selection") +#' +#' ## Another examples +#' # Few observations (warning or no model fit below 3 observations) +#' pop.decline(pop.size = c(10000, 8200, 6000), years = c(1970, 1985, 2000), +#' models = "all", project.years = 2030) +#' +#' \dontrun{ +#' # Not enough observations (error) +#' pop.decline(pop.size = c(10000, 6000), years = c(1970, 2000)) +#' } +#' +#' +#' @importFrom foreach foreach +#' +#' @export pop.decline +#' +pop.decline <- function(pop.size = NULL, + years = NULL, + taxa = NULL, + models = "all", + project.years = NULL, + output = "all", + by.taxon = FALSE, + parallel = FALSE, + NbeCores = 2, + show_progress = TRUE, + ...) { + + if(is.null(pop.size)) + stop("Please provide a numeric vector, data frame or matrix of population sizes") + + if(!inherits(pop.size, c("matrix", "numeric", "data.frame"))) + stop("Please provide a numeric vector, data frame or matrix of population sizes") + + if(inherits(pop.size, "matrix")) + pop.size <- as.data.frame(pop.size) + + if(inherits(pop.size, "numeric")) { + nomes <- names(pop.size) + pop.size <- as.data.frame(matrix(pop.size, nrow = 1)) + + if(is.null(taxa)) { + row.names(pop.size) <- NULL + } else { + row.names(pop.size) <- taxa[1] + } + + if(is.null(nomes)) { + colnames(pop.size) <- years + } else { + colnames(pop.size) <- nomes + } + } + + if(is.null(years)) { + + anos <- as.numeric(gsub("[^0-9]", "", names(pop.size)[grepl("[0-9]", names(pop.size))])) + + if(is.null(anos)) + stop("Please provide at least two years with estimates of population sizes") + + } else { + + anos <- years + + } + + if(dim(pop.size)[2] > length(as.numeric(anos))) + pop.size <- pop.size[,grepl(paste0(years, collapse = "|"), names(pop.size)), + drop = FALSE] + + years <- anos + + if(dim(pop.size)[2] < 3 | length(years) < 3) + stop("Too few time intervals (years) to fit trends of population reduction") + + if(is.null(taxa)) { + nomes <- row.names(pop.size) + + if(length(nomes) == 1 & nomes[1] == "1") + nomes <- "species1" + + taxa <- nomes + + } else { + taxa <- paste0("species", 1:dim(pop.size)[1]) + } + + if(!is.null(output)) { + if (any(!output %in% c("predictions", "model.fit", + "model.selection", "best.model", "all"))) + stop("Please provide one or more of the following output options: 'predictions', 'model.fit', 'model.selection", "best.model' or 'all'") + } + + proj.yrs <- NULL + if(!is.null(project.years)) + proj.yrs <- + sort(unique(project.years[!project.years %in% colnames(pop.size)])) + + pop_data <- split(pop.size, f = taxa) + + cl <- activate_parallel(parallel = parallel, NbeCores = NbeCores) + `%d%` <- c_par(parallel = parallel) + + pro_res <- display_progress_bar(show_progress = show_progress, + max_pb = length(pop_data)) + opts <- pro_res$opts + pb <- pro_res$pb + + models.fit <- foreach::foreach( + x = 1:length(pop_data), + .options.snow = opts + ) %d% { + + if (!parallel & show_progress) setTxtProgressBar(pb, x) + + df.x <- data.frame(pop.size = as.numeric(pop_data[[x]]), + years = as.numeric(years)) + project.x <- years[is.na(df.x$pop.size)] + if(length(project.x) == 0) + project.x <- NULL + + if(!is.null(proj.yrs)) + project.x <- sort(unique(c(project.x, proj.yrs))) + + df.x <- df.x[!is.na(df.x$pop.size), , drop = FALSE] + + pred.sp <- pop.decline.fit(x = df.x, + models = models, + project.years = project.x, + plot.fit = FALSE + ,...) + pred.sp + } + + if(parallel) parallel::stopCluster(cl) + if(show_progress) close(pb) + + names(models.fit) <- taxa + + if (by.taxon) { + + if (is.null(output)) { + + res.tax <- list(predictions = NULL) + result <- vector("list", length(taxa)) + result <- lapply(result, function(x) x <- res.tax) + + res <- lapply(models.fit, function(x) x$predictions) + res <- lapply(res, function(x) x[,c("years", "pop.size", "predicted")]) + for(i in seq_along(result)) + result[[i]]$predictions <- res[[i]] + + names(result) <- taxa + + } else { + + res.tax <- list(predictions = NULL, model.fit = NULL, model.selection = NULL, + best.model = NULL) + #res.tax <- res.tax[output] + result <- vector("list", length(taxa)) + result <- lapply(result, function(x) x <- res.tax) + + if ("predictions" %in% output | "all" %in% output) { + res <- lapply(models.fit, function(x) x$predictions) + res <- lapply(res, function(x) x[,c("years", "pop.size", "predicted")]) + for(i in seq_along(result)) + result[[i]]$predictions <- res[[i]] + } + + if ("model.fit" %in% output | "all" %in% output) { + fits <- lapply(models.fit, function(x) x$best.model) + for(i in seq_along(result)) + result[[i]]$model.fit <- fits[[i]] + } + + if ("model.selection" %in% output | "all" %in% output) { + if ("model.selection.result" %in% names(models.fit[[1]])) { + selection <- lapply(models.fit, function(x) x$model.selection.result) + for(i in seq_along(result)) + result[[i]]$model.selection <- selection[[i]] + } + } + + if ("best.model" %in% output | "all" %in% output) { + best <- lapply(models.fit, + function(x) attributes(x$best.model)$best.model.name[1]) + for(i in seq_along(result)) + result[[i]]$best.model <- best[[i]] + } + + names(result) <- taxa + } + + } else { + + if (is.null(output)) { + + result <- list() + + res <- lapply(models.fit, function(x) x$predictions) + res <- lapply(res, function(x) x[,c("years", "pop.size", "predicted")]) + result$predictions <- res + + } else { + + result <- list() + + if ("predictions" %in% output | "all" %in% output) { + res <- lapply(models.fit, function(x) x$predictions) + res <- lapply(res, function(x) x[,c("years", "pop.size", "predicted")]) + result$predictions <- res + } + + if ("model.fit" %in% output | "all" %in% output) { + fits <- lapply(models.fit, function(x) x$best.model) + result$model.fit <- fits + } + + if ("model.selection" %in% output | "all" %in% output) { + if ("model.selection.result" %in% names(models.fit[[1]])) { + selection <- lapply(models.fit, function(x) x$model.selection.result) + result$model.selection <- selection + } else { + res <- vector("list", length(taxa)) + names(res) <- taxa + result$model.selection <- res + } + } + + if ("best.model" %in% output | "all" %in% output) { + best <- lapply(models.fit, + function(x) attributes(x$best.model)$best.model.name[1]) + result$best.model <- best + } + } + } + + return(result) +} diff --git a/R/pop.decline.fit.R b/R/pop.decline.fit.R index 2650096..dcb9d82 100644 --- a/R/pop.decline.fit.R +++ b/R/pop.decline.fit.R @@ -6,21 +6,25 @@ #' 2019). This function provide a comparison of five different models and #' returns the predictions of the model with best fit to data. #' -#' @param pop.size a vector containing the (estimated) number of mature -#' individuals of the species -#' @param years a vector containing the years for which the population sizes is -#' available +#' @param x a data frame containing in the first column a vector of (estimated) +#' population size and in the second column a vector of years for which the +#' population sizes is available #' @param models a vector containing the names of the statistical models to be #' fitted to species population data #' @param project.years a vector containing the years for which the number of -#' mature individuals should be predicted +#' mature individuals should be predicted using the best candidate statistical +#' model #' @param plot.fit logical. Should the fit of the best model be plotted against #' the population data? #' @param max.count numerical. Maximum number of attempts to fit piece-wise #' models. Default to 50. -#' @param ... other parameters to be passed as arguments for function ```ICtab.mod.select``` +#' @param ... other parameters to be passed as arguments for +#' function ```ICtab.mod.select``` #' #' @details +#' The names of the columns of the data frame ``x`` do not matter, as long as +#' population sizes are in the first column and years in the second. +#' #' By default, the function compares the fit of six statistical models #' to the population trends, namely: linear, quadratic, exponential, logistic, #' generalized logistic and piece-wise. But, as stated in IUCN (2019), the @@ -38,14 +42,14 @@ #' existence of more "complex patterns of decline". To describe more complex #' patterns, ```pop.decline.fit``` provides fits to logistic and piece-wise #' patterns of decline. Despite the options of models provided by -#' ```pop.decline.fit```, depending on the numbers of observations or the patterns -#' of decline, many or none of the models may provide a good fit to data. This -#' reinforces the role of the user in choosing the more appropriate pattern -#' for the area or taxon considered. +#' ```pop.decline.fit```, depending on the numbers of observations or the +#' patterns of decline, many or none of the models may provide a good fit to +#' data. This reinforces the role of the user in choosing the more appropriate +#' pattern for the area or taxon considered. #' #' For simplicity, the population size data provided is transformed into #' proportions using the maximum population estimate provided. Therefore, -#' models are fit to proportional data, but the projections are provided in +#' models are fitted to proportional data, but the projections are returned in #' proportions and in the original scale. As suggested in IUCN (2019), no #' model fit is performed if only two estimates of population size are #' provided. @@ -56,12 +60,12 @@ #' projections depending on the population data or on the years chosen for the #' projection (see example). Fitting piece-wise models can be unstable (model #' fitting is quite sensitive to the start parameters) and may take a while to -#' converge; so, it should preferably be used when many years of population +#' converge; so, it should preferably be used when many years of population size #' data are available. For simplicity, only piece-wise models with up to 3 -#' breaks and linear functions between breaks are provided. For time intervals > 80, -#' the best model among the candidate models is chosen based on Akaike -#' Information Criterion, or AIC; the corrected AIC or the AICc (Burnham and -#' Anderson, 2004) is used for time intervals < 80. +#' breaks and linear functions between breaks are provided. For time intervals > +#' 80, the best model among the candidate models is chosen based on Akaike +#' Information Criterion, or AIC; the corrected AIC or the AICc (Anderson and +#' Burnham, 2004) is used for time intervals < 80. #' #' #' @author Renato A. Ferreira de Lima & Gilles Dauby @@ -81,31 +85,20 @@ #' #at: https://www.iucnredlist.org/resources/criterion-a) #' pop = c(10000, 9100, 8200, 7500, 7000) #' yrs = c(1970, 1975, 1980, 1985, 1990) +#' pop.data <- cbind.data.frame(pop.size = pop, years = yrs) +#' #' -#' ## Fitting data with different models and setting -#' pop.decline.fit(pop.size = pop, years = yrs) -#' pop.decline.fit(pop.size = pop, years = yrs, -#' models = c("linear")) -#' pop.decline.fit(pop.size = pop, years = yrs, -#' models = c("linear", "exponential","quadratic")) -#' pop.decline.fit(pop.size = pop, years = yrs, -#' models = c("linear", "exponential"), project.years = c(1960, 2005)) -#' pop.decline.fit(pop.size = pop, years = yrs, -#' models = c("linear", "exponential"), project.years = c(1973, 2005)) -#' pop.decline.fit(pop.size = pop, years = yrs, -#' models = c("quadratic", "general_logistic")) -#' pop.decline.fit(pop.size = pop, years = yrs, -#' models = c("general_logistic")) -#' pop.decline.fit(pop.size = pop, years = yrs, -#' models = c("quadratic"), project.years = c(1960, 2050)) +#' ## Fitting data with different models and settings +#' # All models, without and with the plot of the model fit to data +#' pop.decline.fit(pop.data, plot.fit = FALSE) +#' pop.decline.fit(pop.data) #' -#' ## Another examples, with less observations (warning or no model fit below 3 observations) -#' pop.decline.fit(pop.size = c(10000, 8200, 6000), years = c(1970, 1985, 2000), -#' models = "all", project.years = 2030) +#' # Different model combinations +#' pop.decline.fit(pop.data, models = c("exponential","quadratic")) +#' pop.decline.fit(pop.data, models = c("quadratic", "exponential")) #' -#' \dontrun{ -#' pop.decline.fit(pop.size = c(10000, 6000), years = c(1970, 2000)) -#' } +#' # Projecting/interpolating population size estimates +#' pop.decline.fit(pop.data, models = "exponential", project.years = c(1960, 2005)) #' #' #' @importFrom nls.multstart nls_multstart @@ -115,57 +108,39 @@ #' #' @export pop.decline.fit #' -pop.decline.fit <- function(pop.size = NULL, - years = NULL, +pop.decline.fit <- function(x = NULL, models = "all", project.years = NULL, plot.fit = TRUE, max.count = 50, ...) { - if(is.null(pop.size)) - stop("Please provide a vector of population sizes") + if(is.null(x)) + stop("Please provide a data frame with population sizes and years") - if(is.null(years)) { - - anos <- as.numeric(gsub("[^0-9]", "", names(pop.size)[grepl("[0-9]", names(pop.size))])) - - if(is.null(anos)) - stop("Please provide at least two years with estimates of population sizes") + if(dim(x)[2] <2) + stop("Please provide a data frame with population sizes and years") - } else { - - anos <- years - - } - - if(length(as.numeric(pop.size)) > length(as.numeric(anos))) - pop.size <- pop.size[grepl(paste0(years, collapse = "|"), names(pop.size))] - - years <- anos - - if(length(as.numeric(pop.size)) < 3 | length(years) < 3) + if(dim(x)[1] < 3) stop("Too few time intervals to fit trends of population reduction") if(!is.null(project.years)) { - - proj <- project.years[!project.years %in% years] - years1 <- c(years, proj) - pop.size1 <- c(as.numeric(pop.size), rep(NA, length(proj))) - DATA <- cbind.data.frame(pop.size = as.numeric(pop.size1[order(years1)]), - years = as.numeric(years1[order(years1)]), - stringsAsFactors = FALSE) - + + proj <- project.years[!project.years %in% x[[2]]] + years1 <- c(x[[2]], proj) + pop.size1 <- c(as.numeric(x[[1]]), rep(NA, length(proj))) + DATA <- cbind.data.frame(pop.size = as.numeric(pop.size1[order(years1)]), + years = as.numeric(years1[order(years1)])) + } else { - - DATA <- cbind.data.frame(pop.size = as.numeric(pop.size), - years = as.numeric(years), - stringsAsFactors = FALSE) - + + DATA <- cbind.data.frame(pop.size = as.numeric(x[[1]]), + years = as.numeric(x[[2]])) + } - DATA$ps <- DATA$pop.size/max(as.double(pop.size), na.rm = TRUE) - DATA$ys <- DATA$years - min(DATA$years, na.rm = TRUE) + DATA$ps <- DATA[[1]]/max(as.double(DATA[[1]]), na.rm = TRUE) + DATA$ys <- DATA[[2]] - min(DATA[[2]], na.rm = TRUE) if(all(models == "all")) { @@ -394,8 +369,8 @@ pop.decline.fit <- function(pop.size = NULL, xlim <- range(DATA$ys, na.rm=TRUE) preds <- predict(best, data.frame(ys = seq(range(DATA$ys)[1], range(DATA$ys)[2], by = 1))) - if(!is.null(project.years) & (any(min(preds) < min(ylim)) | any(max(preds) < max(ylim)))) - ylim <- range(c(ylim, preds), na.rm=TRUE) + if(!is.null(project.years) & (any(min(preds) < min(ylim)) | any(max(preds) < max(ylim)))) + ylim <- range(c(ylim, preds), na.rm=TRUE) graphics::par(mfrow= c(1, 1), mgp = c(2.8,0.6,0), mar= c(4,4,1,1)) graphics::plot(DATA$ps ~ DATA$ys, pch=19, cex=1.2, #data = DATA, @@ -406,7 +381,7 @@ pop.decline.fit <- function(pop.size = NULL, ats <- pretty(seq(min(ylim), max(ylim), 0.1)) axis(2, at = ats, labels = ats*100, las = 1, tcl = -0.3) - if(!is.null(project.years)) + if(!is.null(project.years)) graphics::points(est.prop ~ ys, cex=1.2, data = subset(DATA, is.na(DATA$ps))) range1 <- (range(stats::na.omit(DATA)$ys)[1] - 1) @@ -418,7 +393,7 @@ pop.decline.fit <- function(pop.size = NULL, #mod <- model.ls[["linear"]] mod <- best - if(!is.null(project.years)) graphics::curve(stats::coef(mod)[1] + stats::coef(mod)[2]*x, + if(!is.null(project.years)) graphics::curve(stats::coef(mod)[1] + stats::coef(mod)[2]*x, add= TRUE, lwd= 2, lty= 2, col = "#D55E00") graphics::curve(stats::coef(mod)[1] + stats::coef(mod)[2]*x, from = range1, to = range2, add= TRUE, lwd= 2, col = "#D55E00") @@ -442,7 +417,7 @@ pop.decline.fit <- function(pop.size = NULL, #mod <- model.ls[["exponential"]] mod <- best - if(!is.null(project.years)) graphics::curve(stats::coef(mod)[1]*exp(stats::coef(mod)[2]*x), + if(!is.null(project.years)) graphics::curve(stats::coef(mod)[1]*exp(stats::coef(mod)[2]*x), add= TRUE, lwd=2, lty= 2, col = "#009E73") graphics::curve(stats::coef(mod)[1]*exp(stats::coef(mod)[2]*x), from = range1, to = range2, add= TRUE, lwd=2, col = "#009E73") @@ -486,24 +461,27 @@ pop.decline.fit <- function(pop.size = NULL, } if(!is.null(project.years)) { - - DATA1 <- DATA[,c("pop.size", "years", "ps", "est.prop","predicted")] + + DATA1 <- DATA[,c("pop.size", "years", "ps", "est.prop","predicted")] names(DATA1) <- c("Observed", "Year", "Obs_proportion", "Est_proportion", "Predicted") - + } else { - - DATA1 <- DATA[,c("pop.size", "years", "ps")] + + DATA1 <- DATA[,c("pop.size", "years", "ps")] names(DATA1) <- c("Observed", "Year", "Obs_proportion") - + } if(length(models) > 1 | all(models == "all")) { - res <- list(best.model = best, model.selection.result = AICs, data = DATA1) + res <- list(best.model = best, + model.selection.result = AICs, + predictions = DATA) } else { - res <- list(best.model = best, data = DATA1) + res <- list(best.model = best, + predictions = DATA) } diff --git a/R/pop.decline.test.R b/R/pop.decline.test.R index 1f01c53..c87bb5f 100644 --- a/R/pop.decline.test.R +++ b/R/pop.decline.test.R @@ -59,44 +59,67 @@ #' yrs = c(1970, 1973, 1975, 1980, 1985, 1987, 1990) #' #' ## Fitting data with different models and setting -#' best.model = pop.decline.fit(pop.size = pop, years = yrs, -#' models = c("linear","exponential","logistic")) +#' best.model = pop.decline(pop.size = pop, years = yrs, +#' models = c("linear","exponential","logistic"), by.taxon = TRUE) #' pop.decline.test(x = best.model, assess.year = 1990) #' -#' best.model = pop.decline.fit(pop.size = pop, years = yrs, models = c("general_logistic")) +#' best.model = pop.decline(pop.size = pop, years = yrs, +#' models = c("general_logistic"), by.taxon = TRUE) #' pop.decline.test(x = best.model, assess.year = 1990) #' -#' best.model = pop.decline.fit(pop.size = pop, years = yrs, models = c("quadratic")) +#' best.model = pop.decline(pop.size = pop, years = yrs, +#' models = c("quadratic"), by.taxon = TRUE) #' pop.decline.test(x = best.model, assess.year = 1990) #' -#' best.model = pop.decline.fit(pop.size = pop, years = yrs, models = c("piecewise")) +#' best.model = pop.decline(pop.size = pop, years = yrs, +#' models = c("piecewise"), by.taxon = TRUE) #' pop.decline.test(x = best.model, assess.year = 1990) #' pop.decline.test <- function(x, best.name = NULL, assess.year = NULL) { + if(is.null(x)) + stop("Please provide an non-empty object with model fits and predictions") + + if(length(x) == 1 & lengths(x)[1] > 1) + x <- x[[1]] + + if(!"best.model" %in% names(x)) + stop("The input object does not contain the element with the model fits") + + if(!"predictions" %in% names(x)) + stop("The input object does not contain the element with the model predictions") + if(is.null(best.name)) { - best.name <- attributes(x$best.model)$best.model.name[1] + #best.name <- attributes(x$best.model)$best.model.name[1] + best.name <- x$best.model - if(is.null(best.name)) { - + if(is.null(best.name)) stop("Please provide one of the name of the model selected to fit population data") - } } - params <- stats::coef(x$best.model) - ys <- x$data$Year[1:which.min(assess.year - x$data$Year)] - - min(x$data$Year[1:which.min(assess.year - x$data$Year)], na.rm = TRUE) - CI <- suppressMessages( - try(stats::confint(x$best.model), TRUE)) + if(is.null(assess.year)) { + + assess.year <- max(x$predictions$years, na.rm = TRUE) + + if(is.null(assess.year)) + stop("Please provide the years of assessment") + + } + + params <- stats::coef(x$model.fit) + ys <- x$predictions$years[1:which.min(assess.year - x$predictions$years)] - + min(x$predictions$years[1:which.min(assess.year - x$predictions$years)], + na.rm = TRUE) + CI <- suppressWarnings(suppressMessages( + try(stats::confint(x$model.fit), TRUE))) if(class(CI)[1] == "try-error") { CI <- suppressMessages( - # try(stats::confint(x$best.model), TRUE)) - try(stats::confint(x$best.model, "b"), TRUE)) + try(stats::confint(x$model.fit, "b"), TRUE)) if(class(CI)[1] != "try-error") CI <- t(as.matrix(CI)) @@ -106,15 +129,17 @@ pop.decline.test <- function(x, if(class(CI)[1] == "try-error") { seq.ys <- seq(min(ys), max(ys), by = 1) - preds <- stats::predict(x$best.model, newdata = data.frame(ys = seq.ys)) + preds <- stats::predict(x$model.fit, newdata = data.frame(ys = seq.ys)) mod <- stats::lm(I(diff(preds) / head(preds, 1)) ~ 1) ci.diff <- suppressMessages(stats::confint(mod)) if(stats::coef(mod) < 0) - test <- if(ci.diff[1]<0 & ci.diff[2]<0) "decrease" else "not.decreasing" + test <- if(ci.diff[1]<0 & + ci.diff[2]<0) "decrease" else "not.decreasing" if(stats::coef(mod) >= 0) - test <- if(ci.diff[1]>0 & ci.diff[2]>0) "increase" else "not.increasing" + test <- if(ci.diff[1]>0 & + ci.diff[2]>0) "increase" else "not.increasing" } else { @@ -128,8 +153,9 @@ pop.decline.test <- function(x, CI1 <- CI while(any(is.na(CI1["b",]))) { # CI1 <- stats::confint(x$best.model, level = p.values[i]) - CI1 <- - try(stats::confint(x$best.model, "b", level = p.values[i]), TRUE) + p.val.i <- p.values[i] + CI1 <- suppressMessages( + try(stats::confint(x$model.fit, "b", level = p.val.i), TRUE)) if(class(CI1)[1] != "try-error") { CI1 <- t(as.matrix(CI1)) @@ -139,26 +165,32 @@ pop.decline.test <- function(x, } if(is.na(CI["b",][1])) - CI["b",][1] <- CI1["b",][1] + CI["b",][1] <- CI1["b",][1] * p.val.i/0.95 + # CI["b",][1] <- CI1["b",][1] if(is.na(CI["b",][2])) - CI["b",][2] <- CI1["b",][2] + CI["b",][2] <- CI1["b",][2] * p.val.i/0.95 + # CI["b",][2] <- CI1["b",][2] * p.val.i0.95 - } + } if(params["b"] < 0) - test <- if(CI["b",][1]<0 & CI["b",][2]<0) "signif.decline" else "non.signif.decline" + test <- if(CI["b",][1]<0 & + CI["b",][2]<0) "signif.decline" else "non.signif.decline" if(params["b"] >= 0) - test <- if(CI["b",][1]>0 & CI["b",][2]>0) "signif.increase" else "non.signif.increase" + test <- if(CI["b",][1]>0 & + CI["b",][2]>0) "signif.increase" else "non.signif.increase" } if(best.name == "quadratic") { f <- function(x) params["a"] + params["b"]*x + x*I(params["c"]^2) - decrease <- FuzzyNumbers.Ext.2::is.decreasing(fun = f, x.bound = range(ys), step = 1) - increase <- FuzzyNumbers.Ext.2::is.increasing(fun = f, x.bound = range(ys), step = 1) + decrease <- + FuzzyNumbers.Ext.2::is.decreasing(fun = f, x.bound = range(ys), step = 1) + increase <- + FuzzyNumbers.Ext.2::is.increasing(fun = f, x.bound = range(ys), step = 1) if(params["b"] < 0 & decrease) test <- if(CI["b",][1]<0 & CI["b",][2]<0) "signif.decline" else "non.signif.decline" @@ -175,7 +207,7 @@ pop.decline.test <- function(x, if(best.name == "piecewise") { ys.groups <- findInterval(ys, CI[,1]) - params.CI <- segmented::slope(x$best.model)[[1]] + params.CI <- suppressWarnings(segmented::slope(x$model.fit)[[1]]) tests <- vector("list", length(unique(ys.groups))) periods <- vector("list", length(unique(ys.groups))) @@ -183,7 +215,9 @@ pop.decline.test <- function(x, for(i in 1:length(unique(ys.groups))) { grp <- unique(ys.groups)[i] - periods[[i]] <- paste0(" (",paste0(range(x$data$Year[ys.groups %in% grp]), collapse="-"), ")") + periods[[i]] <- paste0(" (", + paste0(range(x$predictions$years[ys.groups %in% grp]), + collapse="-"), ")") if(params.CI[,1][i] < 0) tests[[i]] <- "decrease" @@ -195,15 +229,19 @@ pop.decline.test <- function(x, for(i in 1:length(unique(ys.groups))) { grp <- unique(ys.groups)[i] - periods[[i]] <- paste0(" (",paste0(range(x$data$Year[ys.groups %in% grp]), collapse="-"), ")") + periods[[i]] <- paste0(" (", + paste0(range(x$predictions$years[ys.groups %in% grp]), + collapse="-"), ")") if(params.CI[,1][i] < 0) tests[[i]] <- - if(params.CI[,4][i]<0 & params.CI[,5][i]<0) "signif.decline" else "non.signif.decline" + if(params.CI[,4][i]<0 & + params.CI[,5][i]<0) "signif.decline" else "non.signif.decline" if(params.CI[,1][i] > 0) tests[[i]] <- - if(params.CI[,4][i]>0 & params.CI[,5][i]>0) "signif.increase" else "non.signif.increase" + if(params.CI[,4][i]>0 & + params.CI[,5][i]>0) "signif.increase" else "non.signif.increase" } } diff --git a/man/criterion_A.Rd b/man/criterion_A.Rd index 7c89bcf..ca50015 100644 --- a/man/criterion_A.Rd +++ b/man/criterion_A.Rd @@ -169,8 +169,7 @@ subcriterion (A1, A2, A3 and A4) with a warning. generation.time = 10) ## Another example: one species, more observations and subcriteria -pop = c("1970" = 10000, "1980" = 8900, "1990" = 7000, "2000" = 6000, - "2030" = 4000) +pop = c("1970" = 10000, "1980" = 8900, "1990" = 7000, "2000" = 6000, "2030" = 4000) criterion_A(x = pop, years = c(1970, 1980, 1990, 2000, 2030), assess.year = 2000, @@ -206,14 +205,6 @@ criterion_A(example_criterionA, subcriteria = c("A1", "A2", "A3", "A4"), generation.time = c(2,5,10,15,30,50)) -## Same data but with different options (need to use predictions from statistical models) -criterion_A(example_criterionA, - years = NULL, - assess.year = 2010, - project.years = NULL, - subcriteria = c("A1", "A2", "A3", "A4"), - generation.time = 10) - } \references{ IUCN 2019. Guidelines for Using the IUCN Red List Categories and diff --git a/man/criterion_C.Rd b/man/criterion_C.Rd index 42954b7..1a89939 100644 --- a/man/criterion_C.Rd +++ b/man/criterion_C.Rd @@ -217,7 +217,7 @@ increase them. project.years = NULL, generation.time = 10, subpop.size = NULL, - models = c("linear", "quadratic", "exponential", "logistic", "general_logistic"), + models = c("linear", "exponential", "logistic", "general_logistic"), subcriteria = c("C1", "C2") ) @@ -229,7 +229,7 @@ increase them. generation.time = 10, prop.mature = 0.85, subpop.size = NULL, - models = c("linear", "quadratic", "exponential", "logistic", "general_logistic"), + models = c("linear", "exponential", "logistic", "general_logistic"), subcriteria = c("C1", "C2") ) diff --git a/man/pop.decline.Rd b/man/pop.decline.Rd new file mode 100644 index 0000000..2dd4ec7 --- /dev/null +++ b/man/pop.decline.Rd @@ -0,0 +1,131 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/pop.decline.R +\name{pop.decline} +\alias{pop.decline} +\title{Calculating Population Reduction} +\usage{ +pop.decline( + pop.size = NULL, + years = NULL, + taxa = NULL, + models = "all", + project.years = NULL, + output = "all", + by.taxon = FALSE, + parallel = FALSE, + NbeCores = 2, + show_progress = TRUE, + ... +) +} +\arguments{ +\item{pop.size}{a vector, data frame or matrix containing the (estimated) +number of mature individuals of species (i.e. population size). If a data +frame or matrix, rows are the species and columns are the population sizes.} + +\item{years}{a vector containing the years for which the population sizes is +available} + +\item{taxa}{a vector containing the name of the species in \code{pop.size}} + +\item{models}{a vector containing the names of the statistical models to be +fitted to species population data} + +\item{project.years}{a vector containing the years for which the number of +mature individuals should be predicted using the best candidate statistical +model} + +\item{output}{a character or vector containing the desired output from the +function. The options are: "predictions", "model.fit", "model.selection" +and "best.model". By default, the function returns only the precitions.} + +\item{by.taxon}{logical. Should the output list be organized by the selected +output options (i.e. predictions, model.fit, model.selection and +best.model) for all taxa or should it cointain one taxon per taxon with +all selected outputs? Defaults to FALSE (list organized by outputs and not +taxa).} + +\item{parallel}{a logical. Whether running should be performed in parallel. +FALSE by default.} + +\item{NbeCores}{an integer. Register the number of cores for parallel +execution. Two by default.} + +\item{show_progress}{logical. Whether progress informations should be +displayed. TRUE by default} + +\item{...}{other parameters to be passed as arguments for functions +\code{pop.decline.fit} and \code{ICtab.mod.select}} +} +\value{ +a named list +} +\description{ +Based on the fit of statistical models to population data, the +function estimates the decline on the number of mature individuals across +time, expressed in percentage. +} +\details{ +By default, the function compares the fit of six statistical models to the +population trends, namely: linear, quadratic, exponential, logistic, +generalized logistic and piece-wise. But users can use different combinations +of those models using the argument \code{models}, according to the specificity +of their study region or groups of organism. See \code{pop.decline.fit} for +more details and assumptions on how those models are fitted to population +data and how the candidate models are selected. +} +\examples{ +## Creating vectors with the population data and time intervals +#(adapted from the IUCN 2019 workbook for Criterion A, available +#at: https://www.iucnredlist.org/resources/criterion-a) + +pop = c(10000, 9050, 8250, 7500, 7200, 6950) +pop1 = c(10000, NA, 8200, NA, NA, 6000) +yrs = c(1970, 1975, 1980, 1985, 1990, 2000) +tax = c("species A", "species B") +pops = matrix(c(pop, pop1), nrow = length(tax), + dimnames = list(tax, yrs), byrow = TRUE) + +## Fitting data with different models and settings +# only one species, all models (default) +pop.decline(pop, yrs) + +# two species or more +pop.decline(pops) + +# two species or more, less models +pop.decline(pops, models = c("linear", "quadratic")) +pop.decline(pops, models = "exponential") + +# two species or more, exponential models with projections +pop.decline(pops, models = "exponential", project.years = c(1960, 2050)) +pop.decline(pops, models = "exponential", project.years = c(1973, 2005)) + +# two species or more, different outputs +pop.decline(pops, models = "exponential", output = "model.fit") +pop.decline(pops, models = c("linear", "quadratic", "exponential"), + output = "model.selection") + +## Another examples +# Few observations (warning or no model fit below 3 observations) +pop.decline(pop.size = c(10000, 8200, 6000), years = c(1970, 1985, 2000), + models = "all", project.years = 2030) + +\dontrun{ +# Not enough observations (error) +pop.decline(pop.size = c(10000, 6000), years = c(1970, 2000)) +} + + +} +\references{ +IUCN 2019. Guidelines for Using the IUCN Red List Categories and +Criteria. Version 14. Standards and Petitions Committee. Downloadable from: +http://www.iucnredlist.org/documents/RedListGuidelines.pdf. +} +\seealso{ +\link[ConR]{pop.decline.fit} +} +\author{ +Renato A. Ferreira de Lima +} diff --git a/man/pop.decline.fit.Rd b/man/pop.decline.fit.Rd index 7a8c949..69ab333 100644 --- a/man/pop.decline.fit.Rd +++ b/man/pop.decline.fit.Rd @@ -5,8 +5,7 @@ \title{Fit Statistical Models to Population Reduction} \usage{ pop.decline.fit( - pop.size, - years, + x = NULL, models = "all", project.years = NULL, plot.fit = TRUE, @@ -15,17 +14,16 @@ pop.decline.fit( ) } \arguments{ -\item{pop.size}{a vector containing the (estimated) number of mature -individuals of the species} - -\item{years}{a vector containing the years for which the population sizes is -available} +\item{x}{a data frame containing in the first column a vector of (estimated) +population size and in the second column a vector of years for which the +population sizes is available} \item{models}{a vector containing the names of the statistical models to be fitted to species population data} \item{project.years}{a vector containing the years for which the number of -mature individuals should be predicted} +mature individuals should be predicted using the best candidate statistical +model} \item{plot.fit}{logical. Should the fit of the best model be plotted against the population data?} @@ -33,7 +31,8 @@ the population data?} \item{max.count}{numerical. Maximum number of attempts to fit piece-wise models. Default to 50.} -\item{...}{other parameters to be passed as arguments for function \code{ICtab.mod.select}} +\item{...}{other parameters to be passed as arguments for +function \code{ICtab.mod.select}} } \description{ Fitting statistical models to the decline on the number of @@ -43,6 +42,9 @@ trends, so that a reduction of three generations can be calculated" (IUCN returns the predictions of the model with best fit to data. } \details{ +The names of the columns of the data frame \code{x} do not matter, as long as +population sizes are in the first column and years in the second. + By default, the function compares the fit of six statistical models to the population trends, namely: linear, quadratic, exponential, logistic, generalized logistic and piece-wise. But, as stated in IUCN (2019), the @@ -60,14 +62,14 @@ Figure 4.2, pg. 33 of IUCN 2019). But IUCN (2019) also recognizes the existence of more "complex patterns of decline". To describe more complex patterns, \code{pop.decline.fit} provides fits to logistic and piece-wise patterns of decline. Despite the options of models provided by -\code{pop.decline.fit}, depending on the numbers of observations or the patterns -of decline, many or none of the models may provide a good fit to data. This -reinforces the role of the user in choosing the more appropriate pattern -for the area or taxon considered. +\code{pop.decline.fit}, depending on the numbers of observations or the +patterns of decline, many or none of the models may provide a good fit to +data. This reinforces the role of the user in choosing the more appropriate +pattern for the area or taxon considered. For simplicity, the population size data provided is transformed into proportions using the maximum population estimate provided. Therefore, -models are fit to proportional data, but the projections are provided in +models are fitted to proportional data, but the projections are returned in proportions and in the original scale. As suggested in IUCN (2019), no model fit is performed if only two estimates of population size are provided. @@ -78,12 +80,12 @@ IUCN (2019), but note that the quadratic model can generate non-realistic projections depending on the population data or on the years chosen for the projection (see example). Fitting piece-wise models can be unstable (model fitting is quite sensitive to the start parameters) and may take a while to -converge; so, it should preferably be used when many years of population +converge; so, it should preferably be used when many years of population size data are available. For simplicity, only piece-wise models with up to 3 -breaks and linear functions between breaks are provided. For time intervals > 80, -the best model among the candidate models is chosen based on Akaike -Information Criterion, or AIC; the corrected AIC or the AICc (Burnham and -Anderson, 2004) is used for time intervals < 80. +breaks and linear functions between breaks are provided. For time intervals > +80, the best model among the candidate models is chosen based on Akaike +Information Criterion, or AIC; the corrected AIC or the AICc (Anderson and +Burnham, 2004) is used for time intervals < 80. } \examples{ ## Creating vectors with the population data and time intervals @@ -91,31 +93,20 @@ Anderson, 2004) is used for time intervals < 80. #at: https://www.iucnredlist.org/resources/criterion-a) pop = c(10000, 9100, 8200, 7500, 7000) yrs = c(1970, 1975, 1980, 1985, 1990) +pop.data <- cbind.data.frame(pop.size = pop, years = yrs) -## Fitting data with different models and setting -pop.decline.fit(pop.size = pop, years = yrs) -pop.decline.fit(pop.size = pop, years = yrs, -models = c("linear")) -pop.decline.fit(pop.size = pop, years = yrs, -models = c("linear", "exponential","quadratic")) -pop.decline.fit(pop.size = pop, years = yrs, -models = c("linear", "exponential"), project.years = c(1960, 2005)) -pop.decline.fit(pop.size = pop, years = yrs, -models = c("linear", "exponential"), project.years = c(1973, 2005)) -pop.decline.fit(pop.size = pop, years = yrs, -models = c("quadratic", "general_logistic")) -pop.decline.fit(pop.size = pop, years = yrs, -models = c("general_logistic")) -pop.decline.fit(pop.size = pop, years = yrs, -models = c("quadratic"), project.years = c(1960, 2050)) - -## Another examples, with less observations (warning or no model fit below 3 observations) -pop.decline.fit(pop.size = c(10000, 8200, 6000), years = c(1970, 1985, 2000), -models = "all", project.years = 2030) - -\dontrun{ -pop.decline.fit(pop.size = c(10000, 6000), years = c(1970, 2000)) -} + +## Fitting data with different models and settings +# All models, without and with the plot of the model fit to data +pop.decline.fit(pop.data, plot.fit = FALSE) +pop.decline.fit(pop.data) + +# Different model combinations +pop.decline.fit(pop.data, models = c("exponential","quadratic")) +pop.decline.fit(pop.data, models = c("quadratic", "exponential")) + +# Projecting/interpolating population size estimates +pop.decline.fit(pop.data, models = "exponential", project.years = c(1960, 2005)) } diff --git a/man/pop.decline.test.Rd b/man/pop.decline.test.Rd index a56a70f..ab9c6c7 100644 --- a/man/pop.decline.test.Rd +++ b/man/pop.decline.test.Rd @@ -57,17 +57,20 @@ pop = c(10000, 9600, 9100, 8200, 7500, 7200, 7000) yrs = c(1970, 1973, 1975, 1980, 1985, 1987, 1990) ## Fitting data with different models and setting -best.model = pop.decline.fit(pop.size = pop, years = yrs, -models = c("linear","exponential","logistic")) +best.model = pop.decline(pop.size = pop, years = yrs, + models = c("linear","exponential","logistic"), by.taxon = TRUE) pop.decline.test(x = best.model, assess.year = 1990) -best.model = pop.decline.fit(pop.size = pop, years = yrs, models = c("general_logistic")) +best.model = pop.decline(pop.size = pop, years = yrs, + models = c("general_logistic"), by.taxon = TRUE) pop.decline.test(x = best.model, assess.year = 1990) -best.model = pop.decline.fit(pop.size = pop, years = yrs, models = c("quadratic")) +best.model = pop.decline(pop.size = pop, years = yrs, + models = c("quadratic"), by.taxon = TRUE) pop.decline.test(x = best.model, assess.year = 1990) -best.model = pop.decline.fit(pop.size = pop, years = yrs, models = c("piecewise")) +best.model = pop.decline(pop.size = pop, years = yrs, + models = c("piecewise"), by.taxon = TRUE) pop.decline.test(x = best.model, assess.year = 1990) } diff --git a/tests/testthat/test-5.R b/tests/testthat/test-5.R new file mode 100644 index 0000000..abc255a --- /dev/null +++ b/tests/testthat/test-5.R @@ -0,0 +1,41 @@ +library(ConR) + +context("Test that pop.decline.fit outputs are correct") + +pop = c(10000, 9100, 8200, 7500, 7000) +yrs = c(1970, 1975, 1980, 1985, 1990) +dataset.ex <- cbind.data.frame(pop.size = pop, years = yrs) +modelos <- c("linear","exponential","quadratic") +yrs.prj <- c(1960, 2005) + + +test_that("pop.decline.fit", { + + result <- pop.decline.fit(dataset.ex, + models = modelos, + plot.fit = FALSE, + project.years = yrs.prj) + + testthat::expect_equal(class(result), "list") + testthat::expect_output(str(result$best.model), "nlsModel", fixed = TRUE) + + testthat::expect_equal(attributes(result$best.model)$best.model.name, + "exponential", fixed = TRUE) + + testthat::expect_output(str(result$model.selection.result), + "data.frame", fixed = TRUE) + testthat::expect_equal(row.names(result$model.selection.result), + modelos, fixed = TRUE) + + testthat::expect_equal(result$predictions$years, + sort(c(yrs, yrs.prj)), fixed = TRUE) + + testthat::expect_equal(round(result$predictions$predicted, 0), + c(11967,9960,9086,8290,7562,6899,5238), fixed = TRUE) + + testthat::expect_error(pop.decline.fit(dataset.ex[1:2, ])) + + testthat::expect_error(pop.decline.fit(dataset.ex[ ,1])) + + +}) diff --git a/tests/testthat/test-6.R b/tests/testthat/test-6.R new file mode 100644 index 0000000..febcffe --- /dev/null +++ b/tests/testthat/test-6.R @@ -0,0 +1,72 @@ +library(ConR) + +context("Test that pop.decline outputs are correct") + +pop = c(10000, 9050, 8250, 7500, 7200, 6950) +pop1 = c(10000, NA, 8200, NA, NA, 6000) +yrs = c(1970, 1975, 1980, 1985, 1990, 2000) +tax = c("species A", "species B") +dataset.ex = matrix(c(pop, pop1), nrow = length(tax), + dimnames = list(tax, yrs), byrow = TRUE) +modelos <- c("linear","exponential","quadratic") +yrs.prj <- c(1960, 2050) + + + +test_that("pop.decline", { + + # only one species, all models (default) + result <- suppressWarnings(pop.decline(pop, yrs)) + + testthat::expect_equal(class(result), "list") + testthat::expect_output(str(result$predictions$species1), "data.frame", fixed = TRUE) + testthat::expect_equal(result$predictions$species1$years, yrs) + testthat::expect_equal(result$predictions$species1$pop.size, pop) + testthat::expect_equal(round(result$predictions$species1$predicted, 0), + c(9670, 9042, 8456, 7907, 7394, 6465)) + + + # two species or more, exponential models with projections + result <- pop.decline(dataset.ex, models = modelos, project.years = yrs.prj) + + testthat::expect_equal(class(result), "list") + testthat::expect_equivalent(length(result), 4) + testthat::expect_output(str(result$predictions$`species A`), "data.frame", fixed = TRUE) + testthat::expect_output(str(result$predictions$`species B`), "data.frame", fixed = TRUE) + testthat::expect_equal(result$predictions$`species A`$years, + sort(c(yrs, yrs.prj)), fixed = TRUE) + testthat::expect_equal(result$predictions$`species B`$pop.size, + c(NA, pop1, NA), fixed = TRUE) + testthat::expect_equal(round(result$predictions$`species B`$predicted, 0), + c(11768,9914,9100,8353,7666,7037,5928,2516), fixed = TRUE) + + # two species or more, different outputs + result <- pop.decline(dataset.ex, models = modelos, project.years = yrs.prj, + output = "model.fit") + testthat::expect_equal(class(result), "list") + testthat::expect_equal(length(result), 1) + testthat::expect_equivalent(lengths(result), 2) + testthat::expect_output(str(result$model.fit$`species A`), "nls", fixed = TRUE) + testthat::expect_output(str(result$model.fit$`species B`), "nls", fixed = TRUE) + testthat::expect_equal(attributes(result$model.fit$`species A`)$best.model.name, + "exponential", fixed = TRUE) + testthat::expect_equal(attributes(result$model.fit$`species B`)$best.model.name, + "exponential", fixed = TRUE) + + result <- pop.decline(dataset.ex, models = modelos, project.years = yrs.prj, + output = "model.selection") + testthat::expect_equal(class(result), "list") + testthat::expect_equal(length(result), 1) + testthat::expect_equivalent(lengths(result), 2) + testthat::expect_output(str(result$model.selection$`species A`), + "data.frame", fixed = TRUE) + testthat::expect_output(str(result$model.selection$`species B`), + "data.frame", fixed = TRUE) + + # Few observations + testthat::expect_warning(pop.decline(c(10000, 8200, 6000), + c(1970, 1985, 2000), + models = "all", project.years = 2030)) + testthat::expect_error(pop.decline(c(10000, 6000), c(1970, 2000))) + +}) diff --git a/tests/testthat/test-7.R b/tests/testthat/test-7.R new file mode 100644 index 0000000..be8acbf --- /dev/null +++ b/tests/testthat/test-7.R @@ -0,0 +1,165 @@ +library(ConR) + +context("Test that criterion_A outputs are correct") + +data(example_criterionA) +assess.yr <- 2000 +GL <- 10 +explo <- 5 + +test_that("criterion_A", { + + # one species, two observations in time, one subcriterion + pop <- c("1970" = 10000, "2000" = 6000) + result <- suppressWarnings(criterion_A(x = pop, + years = as.double(names(pop)), + assess.year = assess.yr, + subcriteria = c("A2"), + generation.time = GL)) + + testthat::expect_equal(class(result), "data.frame") + testthat::expect_equal(dim(result)[2], 7) + testthat::expect_equal(result$tax, "species 1", fixed = TRUE) + testthat::expect_equal(result$assessment.year, assess.yr, fixed = TRUE) + testthat::expect_equal(result$reduction_A12, 40, fixed = TRUE) + testthat::expect_equal(result$A2, "VU", fixed = TRUE) + testthat::expect_equal(result$category_A_code, "A2", fixed = TRUE) + + + # one species, more observations and subcriteria + pop <- c("1970"= 10000, "1980"= 8900, "1990"= 7000, "2000"= 6000, "2030"= 4000) + result <- criterion_A(x = pop, + years = as.double(names(pop)), + assess.year = assess.yr, + project.years = c(2010, 2020, 2030), + generation.time = GL) + + testthat::expect_equal(class(result), "data.frame") + testthat::expect_equal(dim(result)[2], 14) + testthat::expect_equal(result$tax, "species 1", fixed = TRUE) + testthat::expect_equal(result$predictive.model, "exponential", fixed = TRUE) + testthat::expect_equal(result$assessment.year, assess.yr, fixed = TRUE) + testthat::expect_equal(result$reduction_A12, 40, fixed = TRUE) + testthat::expect_equal(round(result$reduction_A3, 1), 33.3, fixed = TRUE) + testthat::expect_equal(round(result$reduction_A4, 1), 40.9, fixed = TRUE) + testthat::expect_equal(result$category_A, "VU", fixed = TRUE) + testthat::expect_equal(result$category_A_code, "A2+A3+A4", fixed = TRUE) + testthat::expect_equal(result$A1, "LC or NT", fixed = TRUE) + testthat::expect_equal(result$A2, "VU", fixed = TRUE) + testthat::expect_equal(result$A3, "VU", fixed = TRUE) + testthat::expect_equal(result$A4, "VU", fixed = TRUE) + + + # Another example: subcriterion A2 and exploitation (A2d) + pop <- c("1980"= 9000, "1985"= 7500, "1990"= 6000) + result <- suppressWarnings(criterion_A(x = pop, + years = as.double(names(pop)), + assess.year = assess.yr, + subcriteria = c("A2"), + generation.time = GL, + exploitation = explo)) + + testthat::expect_equal(class(result), "data.frame") + testthat::expect_equal(dim(result)[2], 9) + testthat::expect_equal(result$tax, "species 1", fixed = TRUE) + testthat::expect_equal(result$predictive.model, "linear", fixed = TRUE) + testthat::expect_equal(result$assessment.year, 1990, fixed = TRUE) + testthat::expect_equal(result$reduction_A12, 65, fixed = TRUE) + testthat::expect_equal(result$A2, "EN", fixed = TRUE) + testthat::expect_equal(result$category_A_code, "A2", fixed = TRUE) + testthat::expect_equal("basis_d" %in% names(result), TRUE) + testthat::expect_equal(result$basis_d, + "Extra reduction: 5%; no change in ranking") + + # IUCN (2019) example for criterion A (as in the guideliness) + result <- suppressWarnings(criterion_A(example_criterionA, + years = seq(1970, 2000, by = 2), + assess.year = assess.yr, + project.years = seq(2002, 2030, by = 2), + generation.time = GL)) + + testthat::expect_equal(class(result), "data.frame") + testthat::expect_equal(dim(result)[2], 13) + testthat::expect_equal(result$tax, + paste0("species ", 1:6), fixed = TRUE) + testthat::expect_equal(result$assessment.year, rep(assess.yr, 6), fixed = TRUE) + testthat::expect_equal(round(result$reduction_A12, 0), + c(33,30,30,34,26,29), fixed = TRUE) + testthat::expect_equal(round(result$reduction_A3, 0), + c(40,50,44,34,57,10), fixed = TRUE) + testthat::expect_equal(round(result$reduction_A4, 0), + c(58,44,42,33,53,31), fixed = TRUE) + testthat::expect_equal(result$category_A, + c("EN","EN","VU","VU","EN","VU"), fixed = TRUE) + testthat::expect_equal(result$category_A_code, + c("A4","A3","A3+A4","A2+A3+A4","A3+A4","A4")) + testthat::expect_equal(result$A1, rep("LC or NT", 6)) + testthat::expect_equal(result$A2, + c("VU","VU","LC or NT","VU","LC or NT","LC or NT")) + testthat::expect_equal(result$A3, + c("VU","EN","VU","VU","EN","LC or NT")) + testthat::expect_equal(result$A4, + c("EN","VU","VU","VU","EN","VU")) + + + # Same IUCN data and options but assuming different generation lengths + result <- suppressWarnings(criterion_A(example_criterionA, + years = seq(1970, 2000, by = 2), + assess.year = assess.yr, + project.years = seq(2002, 2030, by = 2), + generation.time = c(2,5,10,15,30,50))) + testthat::expect_equal(class(result), "data.frame") + testthat::expect_equal(dim(result)[2], 14) + testthat::expect_equal(result$tax, + paste0("species ", 1:6), fixed = TRUE) + testthat::expect_equal(result$assessment.year, rep(assess.yr, 6), fixed = TRUE) + testthat::expect_equal(round(result$reduction_A12, 0), + c(26,9,30,45,26,29), fixed = TRUE) + testthat::expect_equal(round(result$reduction_A3, 0), + c(31,-13,44,45,10,1), fixed = TRUE) + testthat::expect_equal(round(result$reduction_A4, 0), + c(33,8,42,46,34,30), fixed = TRUE) + testthat::expect_equal(result$category_A, + c("VU","LC or NT","VU","VU","VU","LC or NT"), fixed = TRUE) + testthat::expect_equal(result$category_A_code, + c("A3+A4","A1+A2+A3+A4","A3+A4","A2+A3+A4","A4","A1+A2+A3+A4")) + testthat::expect_equal(result$A1, + rep("LC or NT",6)) + testthat::expect_equal(result$A2, + c(rep("LC or NT",3),"VU",rep("LC or NT",2))) + testthat::expect_equal(result$A3, + c("VU","LC or NT","VU","VU","LC or NT","LC or NT")) + testthat::expect_equal(result$A4, + c("VU","LC or NT","VU","VU","VU","LC or NT")) + + # Same data but with different options + result <- suppressWarnings(criterion_A(example_criterionA, + years = NULL, + assess.year = assess.yr + 10, + generation.time = GL)) + + testthat::expect_equal(class(result), "data.frame") + testthat::expect_equal(dim(result)[2], 14) + testthat::expect_equal(result$tax, + paste0("species ", 1:6), fixed = TRUE) + testthat::expect_equal(result$assessment.year, rep(assess.yr + 10, 6), fixed = TRUE) + testthat::expect_equal(round(result$reduction_A12, 0), + c(54,21,32,33,42,30), fixed = TRUE) + testthat::expect_equal(round(result$reduction_A3, 0), + c(14,79,51,33,62,9), fixed = TRUE) + testthat::expect_equal(round(result$reduction_A4, 0), + c(58,73,48,34,60,31), fixed = TRUE) + testthat::expect_equal(result$category_A, + c("EN","EN","EN","VU","EN","VU"), fixed = TRUE) + testthat::expect_equal(result$category_A_code, + c("A2+A4","A3+A4","A3","A2+A3+A4","A3+A4","A2+A4")) + testthat::expect_equal(result$A1, + c("VU",rep("LC or NT",5))) + testthat::expect_equal(result$A2, + c("EN","LC or NT",rep("VU",4))) + testthat::expect_equal(result$A3, + c("LC or NT","EN","EN","VU","EN","LC or NT")) + testthat::expect_equal(result$A4, + c("EN","EN","VU","VU","EN","VU")) + +}) diff --git a/tests/testthat/test-8.R b/tests/testthat/test-8.R new file mode 100644 index 0000000..b6b1f43 --- /dev/null +++ b/tests/testthat/test-8.R @@ -0,0 +1,133 @@ +library(ConR) + +context("Test that criterion_C outputs are correct") + +data(example_criterionC_subpops) +data(example_criterionC) +assess.yr <- 2000 +GL <- 10 +modelos <- c("linear", "exponential", "logistic", "general_logistic") + + +test_that("criterion_C", { + + # Example with subpopulations + result <- suppressWarnings(criterion_C(x = example_criterionC_subpops, + years = NULL, + assess.year = assess.yr, + project.years = NULL, + generation.time = GL, + subpop.size = NULL, + models = modelos, + subcriteria = c("C1", "C2"))) + + testthat::expect_equal(class(result), "data.frame") + testthat::expect_equal(dim(result)[2], 19) + testthat::expect_equal(result$tax, + paste0("species ", 1:9), fixed = TRUE) + testthat::expect_equal(result$assessment.year, rep(assess.yr, 9), fixed = TRUE) + testthat::expect_equal(result$predictive.model, + c(rep("exponential", 5),"logistic","exponential", + "linear", "linear"), fixed = TRUE) + testthat::expect_equal(round(result$assess.pop.size, 0), + c(227,555,49,8000,11000,1245000,229,13900,97)) + testthat::expect_equal(result$any.decline, + c(rep("Decreasing", 6),"Increasing","Decreasing", + "Increasing"), fixed = TRUE) + testthat::expect_equal(result$cont.decline, + c(rep("Decreasing", 6),"Increasing","Decreasing", + "Stable"), fixed = TRUE) + testthat::expect_equal(round(result$reduction_3gen,1), + c(8.5,35.1,63.7,13.0,51.1,94.4,-9.0,39.6,35.3)) + testthat::expect_equal(result$max.subpop.size, + c(100,500,45,6000,9000,1200000,100,7300,82)) + testthat::expect_equal(round(result$prop.subpop.size,1), + c(44.1,90.1,91.8,75.0,81.8,96.4,43.7,52.5,84.5)) + testthat::expect_equal(result$C1, + c("LC or NT","EN","CR","VU",rep("LC or NT", 5))) + testthat::expect_equal(result$C2, + c("EN","VU","CR","LC or NT",rep("LC or NT", 5))) + testthat::expect_equal(result$category_C, + c("EN","EN","CR","VU",rep("LC or NT", 5))) + testthat::expect_equal(result$category_C_code, + c("C2ai","C1","C1+C2ai+C2aii","C1",rep("", 5))) + + + # Same example, but using the argument `prop.mature` + result <- suppressWarnings(criterion_C(x = example_criterionC_subpops, + years = NULL, + assess.year = assess.yr, + project.years = NULL, + generation.time = GL, + prop.mature = 0.85, + subpop.size = NULL, + models = modelos, + subcriteria = c("C1", "C2"))) + + testthat::expect_equal(class(result), "data.frame") + testthat::expect_equal(dim(result)[2], 19) + testthat::expect_equal(result$tax, + paste0("species ", 1:9), fixed = TRUE) + testthat::expect_equal(result$assessment.year, rep(assess.yr, 9), fixed = TRUE) + testthat::expect_equal(result$predictive.model, + c(rep("exponential", 5),"logistic","exponential", + "linear", "linear"), fixed = TRUE) + testthat::expect_equal(round(result$assess.pop.size, 0), + c(193,472,42,6800,9350,1058250,195,11815,82)) + testthat::expect_equal(result$any.decline, + c(rep("Decreasing", 6),"Increasing","Decreasing", + "Increasing"), fixed = TRUE) + testthat::expect_equal(result$cont.decline, + c(rep("Decreasing", 6),"Increasing","Decreasing", + "Stable"), fixed = TRUE) + testthat::expect_equal(round(result$reduction_3gen,1), + c(8.5,35.1,63.7,13.0,51.1,94.4,-9.0,39.6,35.3)) + testthat::expect_equal(result$max.subpop.size, + c(100,500,45,6000,9000,1200000,100,7300,82)) + testthat::expect_equal(round(result$prop.subpop.size,1), + c(44.1,90.1,91.8,75.0,81.8,96.4,43.7,52.5,84.5)) + testthat::expect_equal(result$C1, + c("LC or NT","EN","CR","VU","VU",rep("LC or NT", 4))) + testthat::expect_equal(result$C2, + c("EN","VU","CR","LC or NT",rep("LC or NT", 5))) + testthat::expect_equal(result$category_C, + c("EN","EN","CR","VU","VU",rep("LC or NT", 4))) + testthat::expect_equal(result$category_C_code, + c("C2ai","C1","C1+C2ai+C2aii","C1","C1",rep("", 4))) + + # Example without subpopulations (cannot assess subcriteria C2) + result <- suppressWarnings(criterion_C(x = example_criterionC, + years = NULL, + assess.year = assess.yr, + project.years = NULL, + generation.time = GL, + subpop.size = NULL, + models = c("quadratic", modelos), + subcriteria = c("C1"))) + + testthat::expect_equal(class(result), "data.frame") + testthat::expect_equal(dim(result)[2], 14) + testthat::expect_equal(result$tax, + paste0("species", 1:9), fixed = TRUE) + testthat::expect_equal(result$assessment.year, rep(assess.yr, 9), fixed = TRUE) + testthat::expect_equal(result$predictive.model, + c("quadratic",rep("exponential", 4),"logistic", + "quadratic", "linear","exponential"), fixed = TRUE) + testthat::expect_equal(round(result$assess.pop.size, 0), + c(227,555,49,8000,11000,1245000,229,13900,97)) + testthat::expect_equal(result$any.decline, + c(rep("Decreasing", 6),"Increasing","Decreasing", + "Increasing"), fixed = TRUE) + testthat::expect_equal(result$cont.decline, + c(rep("Decreasing", 6),"Increasing","Decreasing", + "Stable"), fixed = TRUE) + testthat::expect_equal(round(result$reduction_3gen,1), + c(8.5,35.1,63.7,13.0,51.1,94.4,-9.0,39.6,35.3)) + testthat::expect_equal(result$C1, + c("LC or NT","EN","CR","VU",rep("LC or NT", 5))) + testthat::expect_equal(result$category_C, + c("LC or NT","EN","CR","VU",rep("LC or NT", 5))) + testthat::expect_equal(result$category_C_code, + c("","C1","C1","C1",rep("", 5))) + +}) diff --git a/tests/testthat/test-9.R b/tests/testthat/test-9.R new file mode 100644 index 0000000..f8933dd --- /dev/null +++ b/tests/testthat/test-9.R @@ -0,0 +1,30 @@ +library(ConR) + +context("Test that pop.decline.test outputs are correct") + +pop = c(10000, 9600, 9100, 8200, 7500, 7200, 7000) +pop1 = c(10000, 9900, 9800, 9900, 1000, 9700, 9800) +pop2 = c(7000, 7200, 7500, 8200, 9100, 9600, 1000) +yrs = c(1970, 1973, 1975, 1980, 1985, 1987, 1990) +modelos = c("linear", "quadratic", "exponential", "logistic", "general_logistic") + +test_that("pop.decline.test", { + + result0 <- pop.decline(pop.size = pop, years = yrs, models = modelos, + by.taxon = TRUE, show_progress = FALSE) + testthat::expect_equal(pop.decline.test(result0), "signif.decline") + + result0 <- pop.decline(pop.size = pop, years = yrs, models = "logistic", + by.taxon = TRUE, show_progress = FALSE) + testthat::expect_equal(pop.decline.test(result0), "signif.decline") + + + result0 <- suppressWarnings(pop.decline(pop.size = pop1, years = yrs, + models = modelos, + by.taxon = TRUE, show_progress = FALSE)) + testthat::expect_equal(pop.decline.test(result0), "non.signif.decline") + + result <- pop.decline.test(result0) + + +}) From 9c2f335208d194701160155b9efe3430e227b633 Mon Sep 17 00:00:00 2001 From: raflima1981 Date: Wed, 10 Jan 2024 13:37:50 -0300 Subject: [PATCH 16/23] Improving functions documentation and adding some minor improvements --- R/AOO.computing.R | 8 ++-- R/Locations.estimation.R | 7 ++- R/activate_parallel.R | 9 +++- R/cat_mult_criteria.R | 23 ++++++++-- R/criterion_B.R | 94 ++++++++++++++++++++++++---------------- R/severe_frag.R | 7 ++- 6 files changed, 94 insertions(+), 54 deletions(-) diff --git a/R/AOO.computing.R b/R/AOO.computing.R index 9fdc92c..ac8e72a 100644 --- a/R/AOO.computing.R +++ b/R/AOO.computing.R @@ -150,7 +150,7 @@ AOO.computing <- function(XY, if(parallel) parallel::stopCluster(cl) if(show_progress) close(pb) - + res <- unlist(output[names(output) != "spatial"]) res_df[res_df$tax %in% names(res), 2] <- @@ -161,11 +161,11 @@ AOO.computing <- function(XY, "AOO could not computed because grid cells would overlap with antimeridian" if (export_shp) { - + shapes <- output[names(output) == "spatial"] shapes <- do.call('rbind', shapes) row.names(shapes) <- 1:nrow(shapes) - + } } else { @@ -187,7 +187,7 @@ AOO.computing <- function(XY, #' @importFrom foreach %dopar% %do% foreach #' @keywords internal -#' @export +#' AOO.estimation <- function(coordEAC, cell_size = 2, nbe_rep = 0, diff --git a/R/Locations.estimation.R b/R/Locations.estimation.R index 445b4ef..4ebb18b 100644 --- a/R/Locations.estimation.R +++ b/R/Locations.estimation.R @@ -7,7 +7,10 @@ #' @param nbe_rep integer #' @param export_shp logical #' @param proj_type character string -#' @param rel_cell_size numeric, if `method ="sliding_scale"`, `Cell_size_locations` is ignored and the resolution is given by the maximum distance separating two occurrences multiplied by `Rel_cell_size`. By default, it is 0.05 +#' @param rel_cell_size numeric, if `method ="sliding_scale"`, +#' `Cell_size_locations` is ignored and the resolution is given by the maximum +#' distance separating two occurrences multiplied by `rel_cell_size`. By +#' default, it is 0.05 #' @param method character string #' #' @return a list @@ -33,7 +36,7 @@ locations.estimation <- function(coordEAC, pairwise_dist <- stats::dist(coordEAC[, 1:2], upper = F) - cell_size <- max(pairwise_dist) * Rel_cell_size / 1000 + cell_size <- max(pairwise_dist) * rel_cell_size / 1000 } else{ diff --git a/R/activate_parallel.R b/R/activate_parallel.R index 6e11c4e..03f8c14 100644 --- a/R/activate_parallel.R +++ b/R/activate_parallel.R @@ -4,14 +4,19 @@ #' #' @author Gilles Dauby, \email{gildauby@gmail.com} #' -#' @param parallel a logical. Whether running in parallel. By default, it is FALSE -#' @param NbeCores an integer. Register the number of cores for parallel execution. By default, it is 2 +#' @param parallel a logical. Whether running should be performed in parallel. +#' FALSE by default. +#' @param NbeCores an integer. Register the number of cores for parallel +#' execution. Two by default. #' #' @importFrom doSNOW registerDoSNOW #' @importFrom parallel makePSOCKcluster #' @importFrom foreach %dopar% %do% foreach +#' #' @keywords internal +#' #' @export +#' activate_parallel <- function(parallel = FALSE, NbeCores = 2) { if (parallel) { cl <- parallel::makePSOCKcluster(NbeCores) diff --git a/R/cat_mult_criteria.R b/R/cat_mult_criteria.R index f4163b6..359b62b 100644 --- a/R/cat_mult_criteria.R +++ b/R/cat_mult_criteria.R @@ -40,10 +40,21 @@ #' @export cat_mult_criteria cat_mult_criteria <- function(assess.df = NULL, evidence.df = NULL){ + assess.df$tmp.order.plantr <- 1:dim(assess.df)[1] tmp <- assess.df tax <- names(tmp)[1] - n.crits <- dim(tmp)[2] - assess.df$order <- 1:dim(tmp)[1] + + possible_crits <- c(LETTERS[1:5], paste0(LETTERS[1], 1:4), + paste0(rep(LETTERS[2:4], each = 2), 1:2), + paste0("category_", LETTERS[1:5]), "D2.Loc", "D.AOO") + if (!any(names(tmp) %in% possible_crits)) + stop("Please provide a data frame with at least one of the following column names: ", + paste0(possible_crits, collapse = ", ")) + col.name.df <- names(tmp)[names(tmp) %in% possible_crits] + tmp0 <- tmp[, names(tmp) %in% possible_crits] + n.crits <- dim(tmp0)[2] + + tmp <- cbind.data.frame(tax = tmp[[1]], tmp0) ## Establishing an hierarchy of data availability hier <- c("Observed","Estimated","Projected","Inferred","Suspected") @@ -92,16 +103,20 @@ cat_mult_criteria <- function(assess.df = NULL, evidence.df = NULL){ tmp$aux.criteria <- gsub(": \\+", ": ", tmp$aux.criteria, perl = TRUE) tmp$aux.criteria <- gsub("\\+$", "", tmp$aux.criteria, perl = TRUE) tmp$aux.criteria <- gsub("\\+;", ";", tmp$aux.criteria, perl = TRUE) + tmp$aux.criteria <- gsub("category_B", "B1+B2", tmp$aux.criteria, perl = TRUE) + tmp$aux.criteria <- gsub("category_C", "C1+C2", tmp$aux.criteria, perl = TRUE) tmp$main.criteria[is.infinite(as.double(tmp$category))] <- "" tmp$category[is.infinite(as.double(tmp$category))] <- "" tmp$category <- stringr::str_replace_all(tmp$category, rpl.cds) + tmp$category <- gsub("category_B", "B1+B2", tmp$category, perl = TRUE) + tmp$category <- gsub("category_C", "C1+C2", tmp$category, perl = TRUE) #Merging with the entry data.frame res <- merge(assess.df, tmp[,c(tax,"category","main.criteria","aux.criteria")], by = tax) - res <- res[order(res$order),] - res <- res[,-which(names(res) %in% "order")] + res <- res[order(res$tmp.order.plantr),] + res <- res[,-which(names(res) %in% "tmp.order.plantr")] return(res) } diff --git a/R/criterion_B.R b/R/criterion_B.R index 50b0fc7..4e23cba 100644 --- a/R/criterion_B.R +++ b/R/criterion_B.R @@ -6,10 +6,28 @@ #' #' @param x a `dataframe` or an object of class `spgeoIN` see #' . See Details -#' @param EOO.threshold numeric vector indicating the thresholds used to categorize EOO in IUCN categories -#' @param AOO.threshold numeric vector indicating the thresholds used to categorize AOO in IUCN categories -#' @param Loc.threshold numeric vector indicating the thresholds used to categorize the number of locations in IUCN categories -#' @param comp_subpop logical if the number of sub-populations should be computed. By default is TRUE +#' @param AOO a vector of species AOO, if available +#' @param EOO a vector of species EOO, if available +#' @param locations a vector of species number of locations, if available +#' @param severe.frag a vector indicating if species is severely fragmented, if +#' available +#' @param subpops a vector of the number of subpopulations (sensu IUCN), if +#' available +#' @param decline a vector providing the status of the species continuing +#' decline in EOO, AOO, habitat, locations or subpopulations or population +#' size (i.e. condition 'b') to be passed on to function `cat_criterion_b()`. +#' If different of 'Decreasing', the condition 'b' of criterion B will not be +#' met. +#' @param EOO.threshold numeric vector indicating the thresholds used to +#' categorize EOO in IUCN categories +#' @param AOO.threshold numeric vector indicating the thresholds used to +#' categorize AOO in IUCN categories +#' @param Loc.threshold numeric vector indicating the thresholds used to +#' categorize the number of locations in IUCN categories +#' @param comp_subpop logical if the number of sub-populations should be +#' computed. By default is TRUE +#' @param comp_severe.frag logical if severe fragmentation should be +#' computed. By default is FALSE #' @param method_locations string, indicating the method used for estimating the number of locations. See Details #' * `"fixed_grid"` (by default) #' * `"sliding_scale"` @@ -27,9 +45,7 @@ #' @return A data frame containing, for each of taxon, (EOO, AOO, n.locs, n.subpops?), #' the IUCN categories associated with the sub-criteria and the consensus category #' for criterion B. -#' -#' @details The function ... -#' +#' #' @author Gilles Dauby & Renato A. Ferreira de Lima #' #' @references IUCN 2019. Guidelines for Using the IUCN Red List Categories and @@ -48,36 +64,37 @@ criterion_B <- function(x = NULL, locations = NULL, severe.frag = NULL, subpops = NULL, - #add.legend = FALSE, DrawMap = FALSE, map_pdf = FALSE, draw.poly.EOO = FALSE, - EOO.threshold = c(20000, 5000, 100), - AOO.threshold = c(2000, 500, 10), - Loc.threshold = c(10, 5, 1), - comp_subpop = TRUE, - comp_severe.frag = FALSE, - resol_sub_pop = 5, - cell_size_locations = 10, - method_locations = "fixed_grid", - method_polygons = "no_more_than_one", - rel_cell_size = 0.05, - threat_list = NULL, - names_threat = NULL, - threat_weight = NULL, - id_shape = "id_orig", - country_map = NULL, - method.range = "convex.hull", - alpha = 1, - buff.alpha = 0.1, - exclude.area = FALSE, - cell_size_AOO = 2, - nbe.rep.rast.AOO = 0, - threshold_severe = 50, - parallel = FALSE, - show_progress = TRUE, - NbeCores = 2, - proj_type = "cea", - mode = "spheroid", - DrawMap = FALSE, - add.legend = TRUE) { + decline = NULL, + #add.legend = FALSE, DrawMap = FALSE, map_pdf = FALSE, draw.poly.EOO = FALSE, + EOO.threshold = c(20000, 5000, 100), + AOO.threshold = c(2000, 500, 10), + Loc.threshold = c(10, 5, 1), + comp_subpop = TRUE, + comp_severe.frag = FALSE, + resol_sub_pop = 5, + cell_size_locations = 10, + method_locations = "fixed_grid", + method_polygons = "no_more_than_one", + rel_cell_size = 0.05, + threat_list = NULL, + names_threat = NULL, + threat_weight = NULL, + id_shape = "id_orig", + country_map = NULL, + method.range = "convex.hull", + alpha = 1, + buff.alpha = 0.1, + exclude.area = FALSE, + cell_size_AOO = 2, + nbe.rep.rast.AOO = 0, + threshold_severe = 50, + parallel = FALSE, + show_progress = TRUE, + NbeCores = 2, + proj_type = "cea", + mode = "spheroid", + DrawMap = FALSE, + add.legend = TRUE) { if (!requireNamespace("lwgeom", quietly = TRUE)) stop("The 'lwgeom' package is required to run this function.", @@ -324,7 +341,8 @@ criterion_B <- function(x = NULL, cat_criterion_b(EOO = EOO$eoo, AOO = AOO$aoo, locations = locations_res$locations, - sever.frag = if (any(c(comp_severe.frag, !is.null(severe.frag)))) severe.frag$severe_frag else NA) + sever.frag = if (any(c(comp_severe.frag, !is.null(severe.frag)))) severe.frag$severe_frag else NA, + decline = if (!is.null(decline)) decline else NA) if (!is.null(x)) list_data <- coord.check(XY = x) diff --git a/R/severe_frag.R b/R/severe_frag.R index 288d76c..ecf8928 100644 --- a/R/severe_frag.R +++ b/R/severe_frag.R @@ -23,9 +23,9 @@ #' #' @details This function evaluates the proportion of the total area of #' occupancy in habitat patches separated from others by a large distance. Based -#' on IUCN guidelines page(48): "A taxon can be considered to be severely +#' on IUCN guidelines page 48: "A taxon can be considered to be severely #' fragmented if most (>50%) of its total area of occupancy is in habitat -#' patches that are (...) (2) separated from other habitat patches by a large +#' patches that are (...) separated from other habitat patches by a large #' distance." #' #' This function interpret subpopulations as obtained using @@ -204,8 +204,7 @@ severe_frag <- function(XY = NULL, #' #' @importFrom sf st_as_sf st_transform st_coordinates st_distance st_geometry #' -get.patches <- function( - subpop_poly = NULL, +get.patches <- function(subpop_poly = NULL, dist_isolated = NULL, proj_type = "cea", export_shp = FALSE, From 13dd0d3dcaf3b0dd819ba719ab76fd0266c70467 Mon Sep 17 00:00:00 2001 From: raflima1981 Date: Wed, 10 Jan 2024 13:38:42 -0300 Subject: [PATCH 17/23] Updating package documentations related to version 2.1 --- .gitignore | 3 +- DESCRIPTION | 2 +- NAMESPACE | 2 +- man/AOO.computing.Rd | 6 ++- man/AOO.decline.Rd | 6 ++- man/EOO.computing.Rd | 6 ++- man/EOO.sensitivity.Rd | 6 ++- man/Locations.estimation.Rd | 5 ++- man/activate_parallel.Rd | 6 ++- man/criterion_B.Rd | 37 ++++++++++++--- man/get.patches.Rd | 6 ++- man/near.threatened.Rd | 90 ++++++++++++++++++++----------------- man/severe_frag.Rd | 10 +++-- man/subpop.comp.Rd | 6 ++- 14 files changed, 121 insertions(+), 70 deletions(-) diff --git a/.gitignore b/.gitignore index 5ac1e1b..2bf4d22 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ inst/doc *.Rproj *.Rhistory test_data.R -data-raw/ \ No newline at end of file +data-raw/ +data/data-raw \ No newline at end of file diff --git a/DESCRIPTION b/DESCRIPTION index 2c2c653..b4dacf8 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: ConR Type: Package Title: Computation of Parameters Used in Preliminary Assessment of Species Conservation Status -Version: 2.0.12 +Version: 2.1 Maintainer: Gilles Dauby Description: Multi-species estimation of biological indicators of populations used for the preliminary assessment of conservation status following the Red List diff --git a/NAMESPACE b/NAMESPACE index 6b89782..f435bac 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -3,7 +3,6 @@ export(AOH.estimation) export(AOO.computing) export(AOO.decline) -export(AOO.estimation) export(EOO.comp) export(EOO.computing) export(EOO.sensitivity) @@ -24,6 +23,7 @@ export(locations.comp) export(map.res) export(near.threatened) export(over.valid.poly) +export(pop.decline) export(pop.decline.fit) export(pop.decline.test) export(pop.fluctuation) diff --git a/man/AOO.computing.Rd b/man/AOO.computing.Rd index 8ef04df..bd4962a 100644 --- a/man/AOO.computing.Rd +++ b/man/AOO.computing.Rd @@ -25,9 +25,11 @@ in kilometres used for estimating Area of Occupancy.} raster with random starting position used for estimating the AOO. If 0 but some translation of the raster are still done.} -\item{parallel}{a logical. Whether running in parallel. By default, it is FALSE} +\item{parallel}{a logical. Whether running should be performed in parallel. +FALSE by default.} -\item{NbeCores}{an integer. Register the number of cores for parallel execution. By default, it is 2} +\item{NbeCores}{an integer. Register the number of cores for parallel +execution. Two by default.} \item{show_progress}{logical. Whether progress informations should displayed. TRUE by default} diff --git a/man/AOO.decline.Rd b/man/AOO.decline.Rd index fad701e..03da9fb 100644 --- a/man/AOO.decline.Rd +++ b/man/AOO.decline.Rd @@ -31,9 +31,11 @@ in kilometres used for estimating Area of Occupancy.} raster with random starting position used for estimating the AOO. If 0 but some translation of the raster are still done.} -\item{parallel}{a logical. Whether running in parallel. By default, it is FALSE} +\item{parallel}{a logical. Whether running should be performed in parallel. +FALSE by default.} -\item{NbeCores}{an integer. Register the number of cores for parallel execution. By default, it is 2} +\item{NbeCores}{an integer. Register the number of cores for parallel +execution. Two by default.} \item{show_progress}{logical. Whether progress informations should displayed. TRUE by default} diff --git a/man/EOO.computing.Rd b/man/EOO.computing.Rd index 1d1e2ca..e1e0100 100644 --- a/man/EOO.computing.Rd +++ b/man/EOO.computing.Rd @@ -60,9 +60,11 @@ is "not comp"} \item{file.name}{a character string. Name file for exported results in csv file. By default is "EOO.results"} -\item{parallel}{a logical. Whether running in parallel. By default, it is FALSE} +\item{parallel}{a logical. Whether running should be performed in parallel. +FALSE by default.} -\item{NbeCores}{an integer. Register the number of cores for parallel execution. By default, it is 2} +\item{NbeCores}{an integer. Register the number of cores for parallel +execution. Two by default.} \item{show_progress}{logical. Whether progress informations should displayed. TRUE by default} diff --git a/man/EOO.sensitivity.Rd b/man/EOO.sensitivity.Rd index 6d1c394..b2c56ec 100644 --- a/man/EOO.sensitivity.Rd +++ b/man/EOO.sensitivity.Rd @@ -60,9 +60,11 @@ is "not comp"} \item{file.name}{a character string. Name file for exported results in csv file. By default is "EOO.sensitivity.results"} -\item{parallel}{a logical. Whether running in parallel. By default, it is FALSE} +\item{parallel}{a logical. Whether running should be performed in parallel. +FALSE by default.} -\item{NbeCores}{an integer. Register the number of cores for parallel execution. By default, it is 2} +\item{NbeCores}{an integer. Register the number of cores for parallel +execution. Two by default.} \item{show_progress}{logical. Whether progress informations should displayed. TRUE by default} diff --git a/man/Locations.estimation.Rd b/man/Locations.estimation.Rd index f9a0b2a..f02336d 100644 --- a/man/Locations.estimation.Rd +++ b/man/Locations.estimation.Rd @@ -27,7 +27,10 @@ locations.estimation( \item{method}{character string} -\item{rel_cell_size}{numeric, if \code{method ="sliding_scale"}, \code{Cell_size_locations} is ignored and the resolution is given by the maximum distance separating two occurrences multiplied by \code{Rel_cell_size}. By default, it is 0.05} +\item{rel_cell_size}{numeric, if \code{method ="sliding_scale"}, +\code{Cell_size_locations} is ignored and the resolution is given by the maximum +distance separating two occurrences multiplied by \code{rel_cell_size}. By +default, it is 0.05} } \value{ a list diff --git a/man/activate_parallel.Rd b/man/activate_parallel.Rd index 017751e..95fa4fc 100644 --- a/man/activate_parallel.Rd +++ b/man/activate_parallel.Rd @@ -7,9 +7,11 @@ activate_parallel(parallel = FALSE, NbeCores = 2) } \arguments{ -\item{parallel}{a logical. Whether running in parallel. By default, it is FALSE} +\item{parallel}{a logical. Whether running should be performed in parallel. +FALSE by default.} -\item{NbeCores}{an integer. Register the number of cores for parallel execution. By default, it is 2} +\item{NbeCores}{an integer. Register the number of cores for parallel +execution. Two by default.} } \description{ Activate paralle processing diff --git a/man/criterion_B.Rd b/man/criterion_B.Rd index 19ef3cf..f1bcdbf 100644 --- a/man/criterion_B.Rd +++ b/man/criterion_B.Rd @@ -11,6 +11,7 @@ criterion_B( locations = NULL, severe.frag = NULL, subpops = NULL, + decline = NULL, EOO.threshold = c(20000, 5000, 100), AOO.threshold = c(2000, 500, 10), Loc.threshold = c(10, 5, 1), @@ -46,13 +47,38 @@ criterion_B( \item{x}{a \code{dataframe} or an object of class \code{spgeoIN} see \url{https://github.com/azizka/speciesgeocodeR}. See Details} -\item{EOO.threshold}{numeric vector indicating the thresholds used to categorize EOO in IUCN categories} +\item{AOO}{a vector of species AOO, if available} -\item{AOO.threshold}{numeric vector indicating the thresholds used to categorize AOO in IUCN categories} +\item{EOO}{a vector of species EOO, if available} -\item{Loc.threshold}{numeric vector indicating the thresholds used to categorize the number of locations in IUCN categories} +\item{locations}{a vector of species number of locations, if available} -\item{comp_subpop}{logical if the number of sub-populations should be computed. By default is TRUE} +\item{severe.frag}{a vector indicating if species is severely fragmented, if +available} + +\item{subpops}{a vector of the number of subpopulations (sensu IUCN), if +available} + +\item{decline}{a vector providing the status of the species continuing +decline in EOO, AOO, habitat, locations or subpopulations or population +size (i.e. condition 'b') to be passed on to function \code{cat_criterion_b()}. +If different of 'Decreasing', the condition 'b' of criterion B will not be +met.} + +\item{EOO.threshold}{numeric vector indicating the thresholds used to +categorize EOO in IUCN categories} + +\item{AOO.threshold}{numeric vector indicating the thresholds used to +categorize AOO in IUCN categories} + +\item{Loc.threshold}{numeric vector indicating the thresholds used to +categorize the number of locations in IUCN categories} + +\item{comp_subpop}{logical if the number of sub-populations should be +computed. By default is TRUE} + +\item{comp_severe.frag}{logical if severe fragmentation should be +computed. By default is FALSE} \item{resol_sub_pop}{a value defining the radius of the circles around each occurrence (in kilometres) or data frame vector containing a column 'tax' @@ -138,9 +164,6 @@ Preliminary assessment of species conservation status following IUCN Criterion B, which is based on species geographic distribution (i.e. extent of occurrence - EOO, and area of occupancy, AOO) } -\details{ -The function ... -} \references{ IUCN 2019. Guidelines for Using the IUCN Red List Categories and Criteria. Version 14. Standards and Petitions Committee. Downloadable from: diff --git a/man/get.patches.Rd b/man/get.patches.Rd index d4cb7e2..d48801f 100644 --- a/man/get.patches.Rd +++ b/man/get.patches.Rd @@ -25,9 +25,11 @@ subpopulations considered to be isolated} \item{export_shp}{logical} -\item{parallel}{a logical. Whether running in parallel. By default, it is FALSE} +\item{parallel}{a logical. Whether running should be performed in parallel. +FALSE by default.} -\item{NbeCores}{an integer. Register the number of cores for parallel execution. By default, it is 2} +\item{NbeCores}{an integer. Register the number of cores for parallel +execution. Two by default.} } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} diff --git a/man/near.threatened.Rd b/man/near.threatened.Rd index 8c95080..85f98ed 100644 --- a/man/near.threatened.Rd +++ b/man/near.threatened.Rd @@ -24,41 +24,48 @@ near.threatened( \arguments{ \item{cats}{a character string containing the Red List categories.} -\item{EOO}{numeric vector with species extent of occurrence - EOO (i.e. sub-criterion B1)} +\item{EOO}{numeric vector with species extent of occurrence - EOO (i.e. +sub-criterion B1)} -\item{AOO}{numeric vector with species area of occupancy - AOO (i.e. sub-criterion B2)} +\item{AOO}{numeric vector with species area of occupancy - AOO (i.e. +sub-criterion B2)} -\item{decline}{string vector providing the status of the species continuing decline in EOO, AOO, habitat, -locations or subpopulations or population size (i.e. condition 'b').} +\item{decline}{string vector providing the status of the species continuing +decline in EOO, AOO, habitat, locations or subpopulations or population +size (i.e. condition 'b').} -\item{pop.reduction}{numeric vector with the estimated percentage of population -reduction in the last three generations.} +\item{pop.reduction}{numeric vector with the estimated percentage of +population reduction in the last three generations.} -\item{pop.size}{numeric vector with the mean estimate of population size in number -of mature individuals.} +\item{pop.size}{numeric vector with the mean estimate of population size in +number of mature individuals.} -\item{pop.size.low}{numeric vector with the lower bound of the confidence interval -of the population size in number of mature individuals.} +\item{pop.size.low}{numeric vector with the lower bound of the confidence +interval of the population size in number of mature individuals.} -\item{locations}{numeric vector with the number of locations where the species occur (i.e. condition 'a')} +\item{locations}{numeric vector with the number of locations where the +species occur (i.e. condition 'a')} -\item{sever.frag}{numeric vector with the proportion AOO which is in patches that are separated from other patches by a large distance.} +\item{sever.frag}{numeric vector with the proportion AOO which is in patches +that are separated from other patches by a large distance.} \item{ext.fluct}{numeric vector with the mean order of magnitude of the differences between population minima and maxima.} -\item{subpop}{numeric vector with the number of sub-populationsfor the species} +\item{subpop}{numeric vector with the number of sub-populationsfor the +species} -\item{subcriteria}{character string with the sub-criteria used to perform the assessments (e.g. "A1")} +\item{subcriteria}{character string with the sub-criteria used to perform +the assessments (e.g. "A1")} \item{many.more}{numeric value to numerically express what "many more" means.} -\item{extra.case}{logical. Should the extra case to detected probable "LC" be used? -Default to TRUE.} +\item{extra.case}{logical. Should the extra case to detected probable "LC" be +used? Default to TRUE.} } \value{ -A vector of the same length as \code{cats} with NT separated from -the LC category. If the category provided is different than "LC" or "LC or NT" +A vector of the same length as \code{cats} with NT separated from the +LC category. If the category provided is different than "LC" or "LC or NT" the function returns the same category. } \description{ @@ -67,15 +74,15 @@ Near Threatened (NT) instead of Least Concerned (LC) or more generally "LC or NT" (the standard output string in ConR). } \details{ -This function automatically identify the Near Threatened (NT) category -among the "LC or NT" general category. A species qualify as NT if it is close -to qualifying for the Vulnerable category (IUCN, 2019). - -The function try to translate the list of cases where NT applies and does not -applies (IUCN 2019, pp 76-77). Not all the cases listed were translated here, -particularly those based on uncertainties of the estimates. To perform this -translation some interpretation, adaptation or generalization was carried out, -namely: +This function automatically identify the Near Threatened (NT) category among +the "LC or NT" general category. A species qualify as NT if it is close to +qualifying for the Vulnerable category (IUCN, 2019). + +The function try to translate the list of cases where NT applies and does +not applies (IUCN 2019, pp 76-77). Not all the cases listed were translated +here, particularly those based on uncertainties of the estimates. To perform +this translation some interpretation, adaptation or generalization was +carried out, namely: \itemize{ \item "Population has declined by an estimated 20 - 25\% in the last three generations: pop. reduction between 20 and 30\%; \item "Population has declined by an estimated 10\%": pop. reduction >10\%; @@ -86,21 +93,22 @@ namely: For many of the cases listed by IUCN (2019, pp 76 - 77), there is a minimum number of arguments that should be provided so that the NT criteria can be -assigned. For instance, if only \code{EOO} and \code{AOO} is given no species will -be classified as NT and the function will return "LC" for all "LC" or "LC or NT" -provided as an input. On the other hand, if only \code{pop.size} species can be -classified as "NT". Please see all the IUCN cases for more details on this -(IUCN 2019, pp 76-77). - -We added one extra case to the list of cases from IUCN (2019) where species should -be classified as "LC" and not "NT". This case comes from an interpretation of the -IUCN (2019) guidelines and it is unoficially used by the IUCN/SSC Global Tree Specialist -Group as an indication of low probability of triggering a threatened or NT categories, -if the species is not cited as threatened based on other criteria (e.g. uses and threats): +assigned. For instance, if only \code{EOO} and \code{AOO} is given no species +will be classified as NT and the function will return "LC" for all "LC" or +"LC or NT" provided as an input. On the other hand, if only \code{pop.size} +species can be classified as "NT". Please see all the IUCN cases for more +details on this (IUCN 2019, pp 76-77). + +We added one extra case to the list of cases from IUCN (2019) where species +should be classified as "LC" and not "NT". This case comes from an +interpretation of the IUCN (2019) guidelines and it is unoficially used by +the IUCN/SSC Global Tree Specialist Group as an indication of low +probability of triggering a threatened or NT categories, if the species is +not cited as threatened based on other criteria (e.g. uses and threats): \itemize{ -\item EOO > 30000 km2 or AOO > 3000 km2, and number of locations > 30. This extra case can -be excluded from the separation between "LC" and "NT" by setting the argument -\code{extra.case} to FALSE. +\item EOO > 30000 km2 or AOO > 3000 km2, and number of locations > 30. This +extra case can be excluded from the separation between "LC" and "NT" by +setting the argument \code{extra.case} to FALSE. } } \examples{ diff --git a/man/severe_frag.Rd b/man/severe_frag.Rd index b6e5214..6a8ac3e 100644 --- a/man/severe_frag.Rd +++ b/man/severe_frag.Rd @@ -43,11 +43,13 @@ subpopulations considered to be isolated. See details} \item{export_shp}{logical} -\item{parallel}{a logical. Whether running in parallel. By default, it is FALSE} +\item{parallel}{a logical. Whether running should be performed in parallel. +FALSE by default.} \item{show_progress}{logical. Whether progress informations should displayed. TRUE by default} -\item{NbeCores}{an integer. Register the number of cores for parallel execution. By default, it is 2} +\item{NbeCores}{an integer. Register the number of cores for parallel +execution. Two by default.} \item{threshold_severe}{numeric of one value indicates the threshold to identify severe fragmentation. By default is 50} } @@ -58,9 +60,9 @@ Assess whether species populations are severely fragmented \details{ This function evaluates the proportion of the total area of occupancy in habitat patches separated from others by a large distance. Based -on IUCN guidelines page(48): "A taxon can be considered to be severely +on IUCN guidelines page 48: "A taxon can be considered to be severely fragmented if most (>50\%) of its total area of occupancy is in habitat -patches that are (...) (2) separated from other habitat patches by a large +patches that are (...) separated from other habitat patches by a large distance." This function interpret subpopulations as obtained using diff --git a/man/subpop.comp.Rd b/man/subpop.comp.Rd index 9b6da92..4c7e5be 100644 --- a/man/subpop.comp.Rd +++ b/man/subpop.comp.Rd @@ -29,11 +29,13 @@ with the taxa names and a column 'radius' with the species-specific radius \item{export_shp}{logical. Whether the resulting shapefiles should be exported. FALSE by default.} -\item{parallel}{a logical. Whether running in parallel. By default, it is FALSE} +\item{parallel}{a logical. Whether running should be performed in parallel. +FALSE by default.} \item{show_progress}{logical. Whether progress informations should displayed. TRUE by default} -\item{NbeCores}{an integer. Register the number of cores for parallel execution. By default, it is 2} +\item{NbeCores}{an integer. Register the number of cores for parallel +execution. Two by default.} } \value{ If \code{export_shp} is TRUE, From 9c60e4563848baccdd6ed49e6bef445171642d74 Mon Sep 17 00:00:00 2001 From: raflima1981 Date: Wed, 10 Jan 2024 20:05:34 -0300 Subject: [PATCH 18/23] Spell checks in the package documentation --- R/.Rhistory | 0 R/AOO.computing.R | 8 ++++--- R/EOO.comp.R | 2 +- R/EOO.computing.R | 26 +++++++++++++--------- R/EOO.sensitivity.R | 2 +- R/ICtab.mod.select.R | 2 +- R/activate_parallel.R | 2 +- R/ahull_to_SPLDF.R | 6 +++-- R/cat_downlist.R | 8 +++---- R/cat_mult_criteria.R | 2 +- R/criterion_D.R | 2 +- R/locations.comp.R | 48 +++++++++++++++++++++++++--------------- R/near.threatened.R | 4 ++-- R/pop.decline.R | 4 ++-- R/pop.fluctuation.R | 7 +++--- man/AOO.computing.Rd | 8 ++++--- man/AOO.decline.Rd | 3 ++- man/EOO.comp.Rd | 2 +- man/EOO.computing.Rd | 26 +++++++++++++--------- man/EOO.sensitivity.Rd | 8 ++++--- man/ICtab.mod.select.Rd | 2 +- man/activate_parallel.Rd | 2 +- man/ahull_to_SPLDF.Rd | 6 +++-- man/cat_downlist.Rd | 8 +++---- man/cat_mult_criteria.Rd | 2 +- man/criterion_B.Rd | 23 +++++++++++++------ man/criterion_D.Rd | 2 +- man/locations.comp.Rd | 48 +++++++++++++++++++++++++--------------- man/near.threatened.Rd | 4 ++-- man/pop.decline.Rd | 4 ++-- man/pop.fluctuation.Rd | 7 +++--- tests/testthat/test-2.R | 4 ++-- tests/testthat/test-7.R | 4 ++-- 33 files changed, 172 insertions(+), 114 deletions(-) delete mode 100644 R/.Rhistory diff --git a/R/.Rhistory b/R/.Rhistory deleted file mode 100644 index e69de29..0000000 diff --git a/R/AOO.computing.R b/R/AOO.computing.R index ac8e72a..22f100e 100644 --- a/R/AOO.computing.R +++ b/R/AOO.computing.R @@ -1,7 +1,8 @@ #' @title Area of occupancy #' -#' @description Compute areas of occupancy (AOO) for multiple taxa in square kilometers +#' @description Compute areas of occupancy (AOO) for multiple taxa in square +#' kilometers #' #' @author Gilles Dauby \email{gilles.dauby@@ird.fr} #' @@ -12,7 +13,8 @@ #' raster with random starting position used for estimating the AOO. If 0 but #' some translation of the raster are still done. #' @inheritParams activate_parallel -#' @param show_progress logical. Whether progress informations should displayed. TRUE by default +#' @param show_progress logical. Whether progress informations should displayed. +#' TRUE by default #' @param export_shp logical, by default is FALSE. Whether a shapefile of #' occupied cells should be exported. #' @inheritParams proj_crs @@ -45,7 +47,7 @@ #' See `proj_type` #' #' -#' @references Gaston & Fuller 2009 The sizes of species'geographic ranges, +#' @references Gaston & Fuller 2009 The sizes of species' geographic ranges, #' Journal of Applied Ecology, 49 1-9 #' #' @return diff --git a/R/EOO.comp.R b/R/EOO.comp.R index 054a974..69864e0 100644 --- a/R/EOO.comp.R +++ b/R/EOO.comp.R @@ -15,7 +15,7 @@ #' @param proj_type crs #' @param reproject logical FALSE whether the polygon should be converted to geographic coordinates if mode is `planar` #' -#' @author Gilles Dauby & Renato A. Ferreira de LimaA +#' @author Gilles Dauby & Renato A. Ferreira de Lima #' #' @return A list #' \enumerate{ diff --git a/R/EOO.computing.R b/R/EOO.computing.R index 0b87c2a..1579fb6 100644 --- a/R/EOO.computing.R +++ b/R/EOO.computing.R @@ -20,13 +20,15 @@ #' If `exclude.area` is TRUE and country_map is not provided, #' the world country polygons used comes from the package [rnaturalearth](https://www.rdocumentation.org/packages/rnaturalearth/versions/0.1.0/topics/ne_countries) #' -#' By default (`mode = "spheroid"`),the area of the polygon is based -#' on a polygon in longitude/latitude coordinates considering the earth as an ellipsoid. +#' By default (`mode = "spheroid"`), the area of the polygon is based on a +#' polygon in longitude/latitude coordinates considering the earth as an +#' ellipsoid. #' #' To make a polygon more accurate, the function use the function `st_segmentize` #' from the [sf](https://CRAN.R-project.org/package=sf) package. -#' This adds vertices on the great circles (in order to make shortest distances between points, see example below) -#' which can make difference for species with large distribution. +#' This adds vertices on the great circles (in order to make shortest distances +#' between points, see example below) which can make difference for species with +#' large distribution. #' #' An estimation of EOO based on projected data is also possible (`mode = "planar"`). #' This allow the user to use its own projection. @@ -52,8 +54,9 @@ #' #' **Limitation**\cr #' -#' For a species whose occurrences span more than 180 degrees, EOO should not be considered. -#' This is the case for example for species whose distribution span the 180th meridian. +#' For a species whose occurrences span more than 180 degrees, EOO should not be +#' considered. This is the case for example for species whose distribution span +#' the 180th meridian. #' #' @param XY `dataframe` see Details #' @param exclude.area a logical, if TRUE, areas outside of `country_map` @@ -79,9 +82,12 @@ #' @param method.less.than3 a character string. If equal to "arbitrary", will #' give a value to species with two unique occurrences, see Details. By default #' is "not comp" -#' @param file.name a character string. Name file for exported results in csv file. By default is "EOO.results" -#' @param show_progress logical. Whether progress informations should displayed. TRUE by default -#' @param mode character string either 'spheroid' or 'planar'. By default 'spheroid' +#' @param file.name a character string. Name file for exported results in csv +#' file. By default is "EOO.results" +#' @param show_progress logical. Whether progress informations should displayed. +#' TRUE by default +#' @param mode character string either 'spheroid' or 'planar'. By default +#' 'spheroid' #' @inheritParams proj_crs #' @inheritParams activate_parallel #' @@ -102,7 +108,7 @@ #' #' #' -#' @references Gaston & Fuller 2009 The sizes of species'geographic ranges, +#' @references Gaston & Fuller 2009 The sizes of species' geographic ranges, #' Journal of Applied Ecology, 49 1-9 #' #' @examples diff --git a/R/EOO.sensitivity.R b/R/EOO.sensitivity.R index 221e839..e0461da 100644 --- a/R/EOO.sensitivity.R +++ b/R/EOO.sensitivity.R @@ -64,7 +64,7 @@ #' #' **Notes on computational time** The processing time depends on several #' factors, including the total number of occurrences, number of confidence -#' levels rpovided and user's computer specifications. Using argument `parallel` +#' levels provided and user's computer specifications. Using argument `parallel` #' equals `TRUE`, greatly increase the processing time, but the processing of #' large data sets (millions of occurrences) may take hours. On a Intel Core i5, #' CPU 1.70GHz, 64-bit OS and 16 GB RAM it took 20 min to process about 800 diff --git a/R/ICtab.mod.select.R b/R/ICtab.mod.select.R index 5b5e8f2..9b3500e 100644 --- a/R/ICtab.mod.select.R +++ b/R/ICtab.mod.select.R @@ -27,7 +27,7 @@ #' For the process of selecting the best model, we followed some basic steps. #' By default, if two or more models had delta-AIC smaller than the cutoff #' provided, the more parsimonious model (i.e. the model with less parameters) -#' is selected. However, this decision can be changed (i.e. slect the model +#' is selected. However, this decision can be changed (i.e. select the model #' with best fit) by setting the argument 'parsimony' to FALSE. Next, if more #' than one model is selected (i.e. both have the same number of parameters), #' the selection process give preference to models that are not linear or diff --git a/R/activate_parallel.R b/R/activate_parallel.R index 03f8c14..97325ed 100644 --- a/R/activate_parallel.R +++ b/R/activate_parallel.R @@ -1,6 +1,6 @@ #' @title Internal function #' -#' @description Activate paralle processing +#' @description Activate parallel processing #' #' @author Gilles Dauby, \email{gildauby@gmail.com} #' diff --git a/R/ahull_to_SPLDF.R b/R/ahull_to_SPLDF.R index f955a15..fe3827a 100644 --- a/R/ahull_to_SPLDF.R +++ b/R/ahull_to_SPLDF.R @@ -5,8 +5,10 @@ #' @param x ahull class object #' #' @details -#' The functions ahull_to_SPLDF and alpha.hull.poly were originally posted in the website https://casoilresource.lawr.ucdavis.edu/software/r-advanced-statistical-package/working-spatial-data/converting-alpha-shapes-sp-objects/ -#' in a now broken link. It is also used in functions written by David Bucklin, see https://github.com/dnbucklin/r_movement_homerange +#' The functions ahull_to_SPLDF and alpha.hull.poly were originally posted in +#' the website https://casoilresource.lawr.ucdavis.edu/software/r-advanced-statistical-package/working-spatial-data/converting-alpha-shapes-sp-objects/ +#' in a now broken link. It is also used in functions written by David Bucklin, +#' see https://github.com/dnbucklin/r_movement_homerange #' #' @importFrom sf st_linestring st_multilinestring st_as_sf st_sfc #' diff --git a/R/cat_downlist.R b/R/cat_downlist.R index bdf0e54..6650684 100644 --- a/R/cat_downlist.R +++ b/R/cat_downlist.R @@ -1,13 +1,13 @@ #' @title Downlist Threat Categories #' #' @description Perform the downlisting of threat categories which is often -#' necessary for regional conservation assessmentes (IUCN 2012). +#' necessary for regional conservation assessments (IUCN 2012). #' #' @param cats character. The vector containing the IUCN threat categories. #' @param down.by numerical. The number of steps to downlist the categories. #' Default to 1. #' @param dd logical. Should the Data Deficient (DD) category be included in the -#' downlisting? Defaut to FALSE. +#' downlisting? Default to FALSE. #' @param sign logical. Should the degrees sign be indicated in the downlisted #' category. Default to TRUE. #' @@ -17,12 +17,12 @@ #' thus to the possibility of a possible rescue effect (IUCN 2012). #' #' Although the IUCN (2012) considers the exceptional possibility of -#' uplisting, the function only performs downliting of the categories of +#' uplisting, the function only performs downlisting of the categories of #' threat. Downlisting normally is a one-step change in the category (i.e. #' from EN to VU), but this can be controlled by the argument ```down.by``` #' (default to 1). #' -#' By default, the Data Deficient category is excluded from the donwlisting. +#' By default, the Data Deficient category is excluded from the downlisting. #' The Least Concern category remains unaltered as well. #' #' Note that "if it is unknown whether or not extra-regional populations diff --git a/R/cat_mult_criteria.R b/R/cat_mult_criteria.R index 359b62b..454d842 100644 --- a/R/cat_mult_criteria.R +++ b/R/cat_mult_criteria.R @@ -12,7 +12,7 @@ #' category ('main.criteria'). It also returns the auxiliary category provided #' by other criteria ('aux.criteria'), separated by a ';' #' -#' @details The definiton of the main category of threat, follows the +#' @details The definition of the main category of threat, follows the #' recommendations of IUCN (2019) that states "Only the criteria for the #' highest category of threat that the taxon qualifies for should be listed". #' Therefore, the consensus category is the highest category of threat among diff --git a/R/criterion_D.R b/R/criterion_D.R index ae65a7b..b0a07e7 100644 --- a/R/criterion_D.R +++ b/R/criterion_D.R @@ -49,7 +49,7 @@ #' specific proportions. #' -#' Currenlty, the function does not supports data separated by subpopulation. +#' Currently, the function does not supports data separated by subpopulation. #' #' @author Renato A. Ferreira de Lima & Gilles Dauby #' diff --git a/R/locations.comp.R b/R/locations.comp.R index 8aca8b7..78c5820 100644 --- a/R/locations.comp.R +++ b/R/locations.comp.R @@ -11,20 +11,30 @@ #' @param method string, indicating the method used for estimating the number of locations. See Details #' * `"fixed_grid"` (the default) #' * `"sliding_scale"` -#' @param nbe_rep numeric, the number of raster with random starting position for estimating the number of locations By default, it is 0 but some minimal translation of the raster are still done -#' @param threat_list list or sfc objects POLYGON or MULTIPOLYGON documenting threats. If provided, this will be taken into account for calculating number of location (see Details and `method_polygons`). By default, no shapefile is provided +#' @param nbe_rep numeric, the number of raster with random starting position +#' for estimating the number of locations By default, it is 0 but some minimal +#' translation of the raster are still done +#' @param threat_list list or sfc objects POLYGON or MULTIPOLYGON documenting +#' threats. If provided, this will be taken into account for calculating +#' number of location (see Details and `method_polygons`). By default, no +#' shapefile is provided #' @param names_threat character vector, indicating names of threats, optional #' @param threat_weight numeric vector, indicating weight given to each threat -#' @param cell_size_locations numeric, value indicating the grid size in kilometres used for estimating the number of location. By default, equal to 10 +#' @param cell_size_locations numeric, value indicating the grid size in +#' kilometres used for estimating the number of location. By default, equal to 10 #' @param method_polygons string. Used if `threat_list` is provided. See Details. #' * `"no_more_than_one"` (the default): each single POLYGON will be considered as a single location #' * `"grid"`: a grid of `cell_size_locations` size will be used to estimate the number of location within polygons #' @param id_shape string -#' @param rel_cell_size numeric, if `method_locations="sliding_scale"`, `cell_size_locations` is ignored -#' and the resolution is given by the maximum distance separating two occurrences multiplied by `rel_cell_size`. By default, it is 0.05 +#' @param rel_cell_size numeric, if `method_locations="sliding_scale"`, +#' `cell_size_locations` is ignored and the resolution is given by the maximum +#' distance separating two occurrences multiplied by `rel_cell_size`. By +#' default, it is 0.05 #' @param parallel logical, whether running in parallel. By default, it is FALSE -#' @param NbeCores integer, register the number of cores for parallel execution. By default, it is 2 -#' @param show_progress logical, whether a bar showing progress in computation should be shown. By default, it is TRUE +#' @param NbeCores integer, register the number of cores for parallel execution. +#' By default, it is 2 +#' @param show_progress logical, whether a bar showing progress in computation +#' should be shown. By default, it is TRUE #' @inheritParams proj_crs #' #' @details @@ -41,27 +51,29 @@ #' #' #' -#' Locations are estimated by overlaying a grid of a given resolution (see `cell_size_locations` for -#' specifying the resolution). The number of locations is the number of -#' occupied locations. Note that the grid position is overlaid in order to -#' minimize the number of locations (several translation of the grid are -#' performed and the one providing the minimum number of occupied cells is +#' Locations are estimated by overlaying a grid of a given resolution (see +#' `cell_size_locations` for specifying the resolution). The number of locations +#' is the number of occupied locations. Note that the grid position is overlaid +#' in order to minimize the number of locations (several translation of the grid +#' are performed and the one providing the minimum number of occupied cells is #' provided). #' #' If `threat_list` is provided, which means occurrences within polygon #' documenting threats (if provided) will not be taken into account for #' estimating the number of locations following the grid system, #' -#' If `method` is "fixed_grid" as it is by default, the resolution is fixed and determined -#' by the argument `cell_size_locations`. +#' If `method` is "fixed_grid" as it is by default, the resolution is fixed and +#' determined by the argument `cell_size_locations`. #' -#' If `method` is "sliding_scale", the resolution is defind as 1/x*max.dist where max.dist is the maximum distance between any pairs of occurrences -#' and x is a defined parameter. 1/x is defined by `rel_cell_size` argument and is 0.05 by default. -#' See Rivers M.C. et al. (2010) for more information on the methods. +#' If `method` is "sliding_scale", the resolution is defined as 1/x*max.dist +#' where max.dist is the maximum distance between any pairs of occurrences and x +#' is a defined parameter. 1/x is defined by `rel_cell_size` argument and is +#' 0.05 by default. See Rivers M.C. et al. (2010) for more information on the +#' methods. #' #' @references #' -#' Gaston & Fuller (2009) The sizes of species'geographic ranges, Journal of +#' Gaston & Fuller (2009) The sizes of species' geographic ranges, Journal of #' Applied Ecology: 49 1-9 #' #' Rivers, Bachman, Meagher, Lughadha & Brummitt (2010) Subpopulations, diff --git a/R/near.threatened.R b/R/near.threatened.R index 64064bd..e3ef6eb 100644 --- a/R/near.threatened.R +++ b/R/near.threatened.R @@ -22,7 +22,7 @@ #' species occur (i.e. condition 'a') #' @param sever.frag numeric vector with the proportion AOO which is in patches #' that are separated from other patches by a large distance. -#' @param subpop numeric vector with the number of sub-populationsfor the +#' @param subpop numeric vector with the number of sub-populations for the #' species #' @param ext.fluct numeric vector with the mean order of magnitude of the #' differences between population minima and maxima. @@ -63,7 +63,7 @@ #' #' We added one extra case to the list of cases from IUCN (2019) where species #' should be classified as "LC" and not "NT". This case comes from an -#' interpretation of the IUCN (2019) guidelines and it is unoficially used by +#' interpretation of the IUCN (2019) guidelines and it is unofficially used by #' the IUCN/SSC Global Tree Specialist Group as an indication of low #' probability of triggering a threatened or NT categories, if the species is #' not cited as threatened based on other criteria (e.g. uses and threats): diff --git a/R/pop.decline.R b/R/pop.decline.R index 671b04a..c488659 100644 --- a/R/pop.decline.R +++ b/R/pop.decline.R @@ -17,10 +17,10 @@ #' model #' @param output a character or vector containing the desired output from the #' function. The options are: "predictions", "model.fit", "model.selection" -#' and "best.model". By default, the function returns only the precitions. +#' and "best.model". By default, the function returns only the predictions. #' @param by.taxon logical. Should the output list be organized by the selected #' output options (i.e. predictions, model.fit, model.selection and -#' best.model) for all taxa or should it cointain one taxon per taxon with +#' best.model) for all taxa or should it contain one taxon per taxon with #' all selected outputs? Defaults to FALSE (list organized by outputs and not #' taxa). #' @inheritParams activate_parallel diff --git a/R/pop.fluctuation.R b/R/pop.fluctuation.R index cc3a9b1..8ce690e 100644 --- a/R/pop.fluctuation.R +++ b/R/pop.fluctuation.R @@ -8,7 +8,8 @@ #' individuals) per year, from the oldest to the most recent estimate. #' @param years a vector containing the years for which the population sizes is #' available (i.e. time series). -#' @param plot.test logical. Should the the results be plotted with the popuation data? +#' @param plot.test logical. Should the the results be plotted with the +#' population data? #' #' @return A data frame containing the mean change of the population #' ("Magnitude.fluctuation"), the percentage of intervals presenting @@ -37,7 +38,7 @@ #' The same linear regression model is used to obtain the standard error of #' the estimate (SEE) of the linear regression fitted to the population trend, #' which can be used as a measure of the temporal variability in population -#' size (Cuervo & Møller 2017). +#' size (Cuervo & Moller 2017). #' #' @author Renato A. Ferreira de Lima #' @@ -46,7 +47,7 @@ #' Version 14. Standards and Petitions Committee. Downloadable from: #' https://www.iucnredlist.org/resources/redlistguidelines. #' -#' Cuervo, J.J. & Møller, A.P. (2017). Colonial, more widely distributed and +#' Cuervo, J.J. & Moller, A.P. (2017). Colonial, more widely distributed and #' less abundant bird species undergo wider population fluctuations independent #' of their population trend. PloS one, 12(3): e0173220. #' diff --git a/man/AOO.computing.Rd b/man/AOO.computing.Rd index bd4962a..ecf3044 100644 --- a/man/AOO.computing.Rd +++ b/man/AOO.computing.Rd @@ -31,7 +31,8 @@ FALSE by default.} \item{NbeCores}{an integer. Register the number of cores for parallel execution. Two by default.} -\item{show_progress}{logical. Whether progress informations should displayed. TRUE by default} +\item{show_progress}{logical. Whether progress informations should displayed. +TRUE by default} \item{export_shp}{logical, by default is FALSE. Whether a shapefile of occupied cells should be exported.} @@ -47,7 +48,8 @@ If \code{export_shp} if TRUE a list with two elements } } \description{ -Compute areas of occupancy (AOO) for multiple taxa in square kilometers +Compute areas of occupancy (AOO) for multiple taxa in square +kilometers } \section{Input data}{ \strong{XY} as a \link[base:data.frame]{data.frame} should have the following structure: @@ -89,7 +91,7 @@ AOO <- AOO.computing(dataset.ex, nbe.rep.rast.AO = 3) } \references{ -Gaston & Fuller 2009 The sizes of species'geographic ranges, +Gaston & Fuller 2009 The sizes of species' geographic ranges, Journal of Applied Ecology, 49 1-9 } \author{ diff --git a/man/AOO.decline.Rd b/man/AOO.decline.Rd index 03da9fb..45b23f1 100644 --- a/man/AOO.decline.Rd +++ b/man/AOO.decline.Rd @@ -37,7 +37,8 @@ FALSE by default.} \item{NbeCores}{an integer. Register the number of cores for parallel execution. Two by default.} -\item{show_progress}{logical. Whether progress informations should displayed. TRUE by default} +\item{show_progress}{logical. Whether progress informations should displayed. +TRUE by default} \item{proj_type}{string or numeric} diff --git a/man/EOO.comp.Rd b/man/EOO.comp.Rd index 392631c..83104ed 100644 --- a/man/EOO.comp.Rd +++ b/man/EOO.comp.Rd @@ -49,6 +49,6 @@ A list Compute EOO given a data frame of coordinate in decimals degrees } \author{ -Gilles Dauby & Renato A. Ferreira de LimaA +Gilles Dauby & Renato A. Ferreira de Lima } \keyword{internal} diff --git a/man/EOO.computing.Rd b/man/EOO.computing.Rd index e1e0100..7d9b287 100644 --- a/man/EOO.computing.Rd +++ b/man/EOO.computing.Rd @@ -58,7 +58,8 @@ default is "convex.hull"} give a value to species with two unique occurrences, see Details. By default is "not comp"} -\item{file.name}{a character string. Name file for exported results in csv file. By default is "EOO.results"} +\item{file.name}{a character string. Name file for exported results in csv +file. By default is "EOO.results"} \item{parallel}{a logical. Whether running should be performed in parallel. FALSE by default.} @@ -66,11 +67,13 @@ FALSE by default.} \item{NbeCores}{an integer. Register the number of cores for parallel execution. Two by default.} -\item{show_progress}{logical. Whether progress informations should displayed. TRUE by default} +\item{show_progress}{logical. Whether progress informations should displayed. +TRUE by default} \item{proj_type}{string or numeric} -\item{mode}{character string either 'spheroid' or 'planar'. By default 'spheroid'} +\item{mode}{character string either 'spheroid' or 'planar'. By default +'spheroid'} } \value{ If \code{export_shp} is FALSE, a \code{dataframe} with one field @@ -100,13 +103,15 @@ matter} If \code{exclude.area} is TRUE and country_map is not provided, the world country polygons used comes from the package \href{https://www.rdocumentation.org/packages/rnaturalearth/versions/0.1.0/topics/ne_countries}{rnaturalearth} -By default (\code{mode = "spheroid"}),the area of the polygon is based -on a polygon in longitude/latitude coordinates considering the earth as an ellipsoid. +By default (\code{mode = "spheroid"}), the area of the polygon is based on a +polygon in longitude/latitude coordinates considering the earth as an +ellipsoid. To make a polygon more accurate, the function use the function \code{st_segmentize} from the \href{https://CRAN.R-project.org/package=sf}{sf} package. -This adds vertices on the great circles (in order to make shortest distances between points, see example below) -which can make difference for species with large distribution. +This adds vertices on the great circles (in order to make shortest distances +between points, see example below) which can make difference for species with +large distribution. An estimation of EOO based on projected data is also possible (\code{mode = "planar"}). This allow the user to use its own projection. @@ -130,8 +135,9 @@ constant across multiple estimation (although the variation should be small) \strong{Limitation}\cr -For a species whose occurrences span more than 180 degrees, EOO should not be considered. -This is the case for example for species whose distribution span the 180th meridian. +For a species whose occurrences span more than 180 degrees, EOO should not be +considered. This is the case for example for species whose distribution span +the 180th meridian. } \examples{ @@ -208,7 +214,7 @@ plot(p1, lwd = 2, col = 'red', add = TRUE) } \references{ -Gaston & Fuller 2009 The sizes of species'geographic ranges, +Gaston & Fuller 2009 The sizes of species' geographic ranges, Journal of Applied Ecology, 49 1-9 } \seealso{ diff --git a/man/EOO.sensitivity.Rd b/man/EOO.sensitivity.Rd index b2c56ec..17183de 100644 --- a/man/EOO.sensitivity.Rd +++ b/man/EOO.sensitivity.Rd @@ -66,11 +66,13 @@ FALSE by default.} \item{NbeCores}{an integer. Register the number of cores for parallel execution. Two by default.} -\item{show_progress}{logical. Whether progress informations should displayed. TRUE by default} +\item{show_progress}{logical. Whether progress informations should displayed. +TRUE by default} \item{proj_type}{string or numeric} -\item{mode}{character string either 'spheroid' or 'planar'. By default 'spheroid'} +\item{mode}{character string either 'spheroid' or 'planar'. By default +'spheroid'} \item{min.dist}{minimum tolerated distance between polygons and points. Default to 0.1 m.} @@ -144,7 +146,7 @@ localized on a straight line (in which case EOO would be null), \strong{Notes on computational time} The processing time depends on several factors, including the total number of occurrences, number of confidence -levels rpovided and user's computer specifications. Using argument \code{parallel} +levels provided and user's computer specifications. Using argument \code{parallel} equals \code{TRUE}, greatly increase the processing time, but the processing of large data sets (millions of occurrences) may take hours. On a Intel Core i5, CPU 1.70GHz, 64-bit OS and 16 GB RAM it took 20 min to process about 800 diff --git a/man/ICtab.mod.select.Rd b/man/ICtab.mod.select.Rd index fbf5a6c..9436256 100644 --- a/man/ICtab.mod.select.Rd +++ b/man/ICtab.mod.select.Rd @@ -40,7 +40,7 @@ observations (e.g. population size estimates). For the process of selecting the best model, we followed some basic steps. By default, if two or more models had delta-AIC smaller than the cutoff provided, the more parsimonious model (i.e. the model with less parameters) -is selected. However, this decision can be changed (i.e. slect the model +is selected. However, this decision can be changed (i.e. select the model with best fit) by setting the argument 'parsimony' to FALSE. Next, if more than one model is selected (i.e. both have the same number of parameters), the selection process give preference to models that are not linear or diff --git a/man/activate_parallel.Rd b/man/activate_parallel.Rd index 95fa4fc..7c5ecac 100644 --- a/man/activate_parallel.Rd +++ b/man/activate_parallel.Rd @@ -14,7 +14,7 @@ FALSE by default.} execution. Two by default.} } \description{ -Activate paralle processing +Activate parallel processing } \author{ Gilles Dauby, \email{gildauby@gmail.com} diff --git a/man/ahull_to_SPLDF.Rd b/man/ahull_to_SPLDF.Rd index 1fd87ea..cb7d464 100644 --- a/man/ahull_to_SPLDF.Rd +++ b/man/ahull_to_SPLDF.Rd @@ -13,6 +13,8 @@ ahull_to_SPLDF(x) Alpha hull processing } \details{ -The functions ahull_to_SPLDF and alpha.hull.poly were originally posted in the website https://casoilresource.lawr.ucdavis.edu/software/r-advanced-statistical-package/working-spatial-data/converting-alpha-shapes-sp-objects/ -in a now broken link. It is also used in functions written by David Bucklin, see https://github.com/dnbucklin/r_movement_homerange +The functions ahull_to_SPLDF and alpha.hull.poly were originally posted in +the website https://casoilresource.lawr.ucdavis.edu/software/r-advanced-statistical-package/working-spatial-data/converting-alpha-shapes-sp-objects/ +in a now broken link. It is also used in functions written by David Bucklin, +see https://github.com/dnbucklin/r_movement_homerange } diff --git a/man/cat_downlist.Rd b/man/cat_downlist.Rd index 7be0854..db26848 100644 --- a/man/cat_downlist.Rd +++ b/man/cat_downlist.Rd @@ -13,14 +13,14 @@ cat_downlist(cats = NULL, down.by = 1, dd = FALSE, sign = TRUE) Default to 1.} \item{dd}{logical. Should the Data Deficient (DD) category be included in the -downlisting? Defaut to FALSE.} +downlisting? Default to FALSE.} \item{sign}{logical. Should the degrees sign be indicated in the downlisted category. Default to TRUE.} } \description{ Perform the downlisting of threat categories which is often -necessary for regional conservation assessmentes (IUCN 2012). +necessary for regional conservation assessments (IUCN 2012). } \details{ For regional conservation assessments, the IUCN recommends an @@ -29,12 +29,12 @@ the same taxon in neighbouring regions on the regional population", and thus to the possibility of a possible rescue effect (IUCN 2012). Although the IUCN (2012) considers the exceptional possibility of -uplisting, the function only performs downliting of the categories of +uplisting, the function only performs downlisting of the categories of threat. Downlisting normally is a one-step change in the category (i.e. from EN to VU), but this can be controlled by the argument \code{down.by} (default to 1). -By default, the Data Deficient category is excluded from the donwlisting. +By default, the Data Deficient category is excluded from the downlisting. The Least Concern category remains unaltered as well. Note that "if it is unknown whether or not extra-regional populations diff --git a/man/cat_mult_criteria.Rd b/man/cat_mult_criteria.Rd index a927b2a..806f9f1 100644 --- a/man/cat_mult_criteria.Rd +++ b/man/cat_mult_criteria.Rd @@ -23,7 +23,7 @@ Provide the consensus IUCN category based on multiples IUCN sub-criteria. } \details{ -The definiton of the main category of threat, follows the +The definition of the main category of threat, follows the recommendations of IUCN (2019) that states "Only the criteria for the highest category of threat that the taxon qualifies for should be listed". Therefore, the consensus category is the highest category of threat among diff --git a/man/criterion_B.Rd b/man/criterion_B.Rd index f1bcdbf..c2c65a7 100644 --- a/man/criterion_B.Rd +++ b/man/criterion_B.Rd @@ -86,7 +86,8 @@ with the taxa names and a column 'radius' with the species-specific radius (in kilometre as well). Typically, this data frame is the output of \code{ConR} function \code{subpop.radius}.} -\item{cell_size_locations}{numeric, value indicating the grid size in kilometres used for estimating the number of location. By default, equal to 10} +\item{cell_size_locations}{numeric, value indicating the grid size in +kilometres used for estimating the number of location. By default, equal to 10} \item{method_locations}{string, indicating the method used for estimating the number of locations. See Details \itemize{ @@ -100,10 +101,15 @@ with the taxa names and a column 'radius' with the species-specific radius \item \code{"grid"}: a grid of \code{cell_size_locations} size will be used to estimate the number of location within polygons }} -\item{rel_cell_size}{numeric, if \code{method_locations="sliding_scale"}, \code{cell_size_locations} is ignored -and the resolution is given by the maximum distance separating two occurrences multiplied by \code{rel_cell_size}. By default, it is 0.05} +\item{rel_cell_size}{numeric, if \code{method_locations="sliding_scale"}, +\code{cell_size_locations} is ignored and the resolution is given by the maximum +distance separating two occurrences multiplied by \code{rel_cell_size}. By +default, it is 0.05} -\item{threat_list}{list or sfc objects POLYGON or MULTIPOLYGON documenting threats. If provided, this will be taken into account for calculating number of location (see Details and \code{method_polygons}). By default, no shapefile is provided} +\item{threat_list}{list or sfc objects POLYGON or MULTIPOLYGON documenting +threats. If provided, this will be taken into account for calculating +number of location (see Details and \code{method_polygons}). By default, no +shapefile is provided} \item{names_threat}{character vector, indicating names of threats, optional} @@ -141,13 +147,16 @@ to identify severe fragmentation. By default is 50} \item{parallel}{logical, whether running in parallel. By default, it is FALSE} -\item{show_progress}{logical, whether a bar showing progress in computation should be shown. By default, it is TRUE} +\item{show_progress}{logical, whether a bar showing progress in computation +should be shown. By default, it is TRUE} -\item{NbeCores}{integer, register the number of cores for parallel execution. By default, it is 2} +\item{NbeCores}{integer, register the number of cores for parallel execution. +By default, it is 2} \item{proj_type}{string or numeric} -\item{mode}{character string either 'spheroid' or 'planar'. By default 'spheroid'} +\item{mode}{character string either 'spheroid' or 'planar'. By default +'spheroid'} \item{DrawMap}{logical, by default is FALSE, if TRUE, a png map is created for each species in a directory of the working environment} diff --git a/man/criterion_D.Rd b/man/criterion_D.Rd index ed92170..2b70ddf 100644 --- a/man/criterion_D.Rd +++ b/man/criterion_D.Rd @@ -78,7 +78,7 @@ By default, the proportion of mature individuals in the total population proport is taken as 1, but the user can provide one proportion for all species or species- specific proportions. -Currenlty, the function does not supports data separated by subpopulation. +Currently, the function does not supports data separated by subpopulation. } \examples{ diff --git a/man/locations.comp.Rd b/man/locations.comp.Rd index 04f1e77..f8cffc0 100644 --- a/man/locations.comp.Rd +++ b/man/locations.comp.Rd @@ -30,15 +30,21 @@ locations.comp( \item \code{"sliding_scale"} }} -\item{nbe_rep}{numeric, the number of raster with random starting position for estimating the number of locations By default, it is 0 but some minimal translation of the raster are still done} +\item{nbe_rep}{numeric, the number of raster with random starting position +for estimating the number of locations By default, it is 0 but some minimal +translation of the raster are still done} -\item{threat_list}{list or sfc objects POLYGON or MULTIPOLYGON documenting threats. If provided, this will be taken into account for calculating number of location (see Details and \code{method_polygons}). By default, no shapefile is provided} +\item{threat_list}{list or sfc objects POLYGON or MULTIPOLYGON documenting +threats. If provided, this will be taken into account for calculating +number of location (see Details and \code{method_polygons}). By default, no +shapefile is provided} \item{names_threat}{character vector, indicating names of threats, optional} \item{threat_weight}{numeric vector, indicating weight given to each threat} -\item{cell_size_locations}{numeric, value indicating the grid size in kilometres used for estimating the number of location. By default, equal to 10} +\item{cell_size_locations}{numeric, value indicating the grid size in +kilometres used for estimating the number of location. By default, equal to 10} \item{method_polygons}{string. Used if \code{threat_list} is provided. See Details. \itemize{ @@ -48,14 +54,18 @@ locations.comp( \item{id_shape}{string} -\item{rel_cell_size}{numeric, if \code{method_locations="sliding_scale"}, \code{cell_size_locations} is ignored -and the resolution is given by the maximum distance separating two occurrences multiplied by \code{rel_cell_size}. By default, it is 0.05} +\item{rel_cell_size}{numeric, if \code{method_locations="sliding_scale"}, +\code{cell_size_locations} is ignored and the resolution is given by the maximum +distance separating two occurrences multiplied by \code{rel_cell_size}. By +default, it is 0.05} \item{parallel}{logical, whether running in parallel. By default, it is FALSE} -\item{NbeCores}{integer, register the number of cores for parallel execution. By default, it is 2} +\item{NbeCores}{integer, register the number of cores for parallel execution. +By default, it is 2} -\item{show_progress}{logical, whether a bar showing progress in computation should be shown. By default, it is TRUE} +\item{show_progress}{logical, whether a bar showing progress in computation +should be shown. By default, it is TRUE} \item{proj_type}{string or numeric} } @@ -84,23 +94,25 @@ taking into account spatial threats if provided. \item The third column is contains character value i.e. the names of the species } -Locations are estimated by overlaying a grid of a given resolution (see \code{cell_size_locations} for -specifying the resolution). The number of locations is the number of -occupied locations. Note that the grid position is overlaid in order to -minimize the number of locations (several translation of the grid are -performed and the one providing the minimum number of occupied cells is +Locations are estimated by overlaying a grid of a given resolution (see +\code{cell_size_locations} for specifying the resolution). The number of locations +is the number of occupied locations. Note that the grid position is overlaid +in order to minimize the number of locations (several translation of the grid +are performed and the one providing the minimum number of occupied cells is provided). If \code{threat_list} is provided, which means occurrences within polygon documenting threats (if provided) will not be taken into account for estimating the number of locations following the grid system, -If \code{method} is "fixed_grid" as it is by default, the resolution is fixed and determined -by the argument \code{cell_size_locations}. +If \code{method} is "fixed_grid" as it is by default, the resolution is fixed and +determined by the argument \code{cell_size_locations}. -If \code{method} is "sliding_scale", the resolution is defind as 1/x*max.dist where max.dist is the maximum distance between any pairs of occurrences -and x is a defined parameter. 1/x is defined by \code{rel_cell_size} argument and is 0.05 by default. -See Rivers M.C. et al. (2010) for more information on the methods. +If \code{method} is "sliding_scale", the resolution is defined as 1/x*max.dist +where max.dist is the maximum distance between any pairs of occurrences and x +is a defined parameter. 1/x is defined by \code{rel_cell_size} argument and is +0.05 by default. See Rivers M.C. et al. (2010) for more information on the +methods. } } \examples{ @@ -117,7 +129,7 @@ locations <- locations.comp(dataset.ex, nbe_rep = 100) } \references{ -Gaston & Fuller (2009) The sizes of species'geographic ranges, Journal of +Gaston & Fuller (2009) The sizes of species' geographic ranges, Journal of Applied Ecology: 49 1-9 Rivers, Bachman, Meagher, Lughadha & Brummitt (2010) Subpopulations, diff --git a/man/near.threatened.Rd b/man/near.threatened.Rd index 85f98ed..7944c77 100644 --- a/man/near.threatened.Rd +++ b/man/near.threatened.Rd @@ -52,7 +52,7 @@ that are separated from other patches by a large distance.} \item{ext.fluct}{numeric vector with the mean order of magnitude of the differences between population minima and maxima.} -\item{subpop}{numeric vector with the number of sub-populationsfor the +\item{subpop}{numeric vector with the number of sub-populations for the species} \item{subcriteria}{character string with the sub-criteria used to perform @@ -101,7 +101,7 @@ details on this (IUCN 2019, pp 76-77). We added one extra case to the list of cases from IUCN (2019) where species should be classified as "LC" and not "NT". This case comes from an -interpretation of the IUCN (2019) guidelines and it is unoficially used by +interpretation of the IUCN (2019) guidelines and it is unofficially used by the IUCN/SSC Global Tree Specialist Group as an indication of low probability of triggering a threatened or NT categories, if the species is not cited as threatened based on other criteria (e.g. uses and threats): diff --git a/man/pop.decline.Rd b/man/pop.decline.Rd index 2dd4ec7..e4cfaa6 100644 --- a/man/pop.decline.Rd +++ b/man/pop.decline.Rd @@ -37,11 +37,11 @@ model} \item{output}{a character or vector containing the desired output from the function. The options are: "predictions", "model.fit", "model.selection" -and "best.model". By default, the function returns only the precitions.} +and "best.model". By default, the function returns only the predictions.} \item{by.taxon}{logical. Should the output list be organized by the selected output options (i.e. predictions, model.fit, model.selection and -best.model) for all taxa or should it cointain one taxon per taxon with +best.model) for all taxa or should it contain one taxon per taxon with all selected outputs? Defaults to FALSE (list organized by outputs and not taxa).} diff --git a/man/pop.fluctuation.Rd b/man/pop.fluctuation.Rd index ea6c1ea..6f7e444 100644 --- a/man/pop.fluctuation.Rd +++ b/man/pop.fluctuation.Rd @@ -14,7 +14,8 @@ individuals) per year, from the oldest to the most recent estimate.} \item{years}{a vector containing the years for which the population sizes is available (i.e. time series).} -\item{plot.test}{logical. Should the the results be plotted with the popuation data?} +\item{plot.test}{logical. Should the the results be plotted with the +population data?} } \value{ A data frame containing the mean change of the population @@ -49,7 +50,7 @@ evaluated if the declining or increasing tendencies are significant The same linear regression model is used to obtain the standard error of the estimate (SEE) of the linear regression fitted to the population trend, which can be used as a measure of the temporal variability in population -size (Cuervo & Møller 2017). +size (Cuervo & Moller 2017). } \examples{ @@ -63,7 +64,7 @@ IUCN 2019. Guidelines for Using the IUCN Red List Categories and Criteria. Version 14. Standards and Petitions Committee. Downloadable from: https://www.iucnredlist.org/resources/redlistguidelines. -Cuervo, J.J. & Møller, A.P. (2017). Colonial, more widely distributed and +Cuervo, J.J. & Moller, A.P. (2017). Colonial, more widely distributed and less abundant bird species undergo wider population fluctuations independent of their population trend. PloS one, 12(3): e0173220. } diff --git a/tests/testthat/test-2.R b/tests/testthat/test-2.R index 0910d0e..369611b 100644 --- a/tests/testthat/test-2.R +++ b/tests/testthat/test-2.R @@ -8,9 +8,9 @@ context("Test that subpop.comp outputs are correct length and objects") test_that("subpop.comp", { - SUB <- subpop.comp(XY = dummy_ex, Resol_sub_pop = 25) + SUB <- subpop.comp(XY = dummy_ex, resol_sub_pop = 25) - expect_equal(length(SUB), 1) + expect_equal(length(SUB), 2) expect_equal(SUB$subpop, 10) }) diff --git a/tests/testthat/test-7.R b/tests/testthat/test-7.R index be8acbf..10bf1c6 100644 --- a/tests/testthat/test-7.R +++ b/tests/testthat/test-7.R @@ -146,9 +146,9 @@ test_that("criterion_A", { testthat::expect_equal(round(result$reduction_A12, 0), c(54,21,32,33,42,30), fixed = TRUE) testthat::expect_equal(round(result$reduction_A3, 0), - c(14,79,51,33,62,9), fixed = TRUE) + c(14,78,51,33,62,9), fixed = TRUE) testthat::expect_equal(round(result$reduction_A4, 0), - c(58,73,48,34,60,31), fixed = TRUE) + c(58,72,48,34,60,31), fixed = TRUE) testthat::expect_equal(result$category_A, c("EN","EN","EN","VU","EN","VU"), fixed = TRUE) testthat::expect_equal(result$category_A_code, From f2ce53a53156f5782ef28f0c7f597205608bba2d Mon Sep 17 00:00:00 2001 From: raflima1981 Date: Wed, 10 Jan 2024 20:22:32 -0300 Subject: [PATCH 19/23] Updating package vignette with the new versios of the functions --- vignettes/articles/ConR.Rmd | 137 ++++++++++++++++++------------------ vignettes/articles/eoo.Rmd | 29 -------- 2 files changed, 70 insertions(+), 96 deletions(-) delete mode 100644 vignettes/articles/eoo.Rmd diff --git a/vignettes/articles/ConR.Rmd b/vignettes/articles/ConR.Rmd index 539bfbf..3e50138 100644 --- a/vignettes/articles/ConR.Rmd +++ b/vignettes/articles/ConR.Rmd @@ -1,6 +1,5 @@ --- title: "Conservation assessments based on multiple-IUCN criteria using ConR" - # date: "`r format(Sys.time(), '%B %Y')`" # author: # - Renato A. F. de Lima^[Universidade de São Paulo, https://github.com/LimaRAF] # and Gilles Dauby^[IRD, https://github.com/gdauby] @@ -10,11 +9,10 @@ output: number_sections: true md_document: variant: gfm - vignette: > %\VignetteIndexEntry{Introduction to ConR} - %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} + %\VignetteEngine{knitr::rmarkdown} %\VignetteEngine{rmarkdown::render} \usepackage[utf8]{inputenc} --- @@ -105,6 +103,7 @@ years <- names(pop.sizes[,-1]) pop.sizes[, 1:6] ``` +

# Population metrics @@ -124,7 +123,7 @@ have information available. These estimates are produced using the fit of different statistical models (i.e. quadratic, exponential, logistic, general logistic) to the population size trends. Here, we will only estimate population sizes into the past, but one can also use the same `ConR` -function `pop.decline.fit()` to estimate them into the future. +function `pop.decline()` to estimate them into the future. ```{r est-pop-sizes, eval = TRUE, collapse = TRUE} @@ -134,26 +133,18 @@ possible.years <- missing.years <- assess.year - possible.years # Estimating population sizes for the missing years -results <- vector("list", length(spp)) -for (i in seq_along(spp)) { - res <- pop.decline.fit(pop.size = pop.sizes[i,], - years = years, - project.years = missing.years, - models = c("quadratic", "exponential", - "logistic", "general_logistic"), - plot.fit = FALSE) - results[[i]] <- res$data[,c("Year", "Observed", "Predicted")] -} +est.pop.sizes <- pop.decline(pop.sizes[,-1], taxa = spp, output = "predictions", + show_progress = FALSE) -new.years <- results[[1]]$Year +# Re-organizing the information for downstream analyses +new.years <- est.pop.sizes[[1]][[1]]$years ncols <- length(new.years) nrows <- length(spp) mean.pop <- matrix(NA, ncol = ncols, nrow = nrows, dimnames = list(spp, new.years)) -for(i in seq_along(spp)) mean.pop[i,] <- results[[i]]$Predicted +for(i in seq_along(spp)) mean.pop[i,] <- est.pop.sizes[[1]][[i]]$predicted mean.pop <- cbind.data.frame(tax = spp, mean.pop, row.names = NULL) - ``` We now have a new object called `mean.pop` which stores both the input @@ -256,15 +247,8 @@ sever.frag <- severe_frag(XY = occs, ## Area of habitat (AOH) -The area of habitat (AOH) is currently not an official population metric that is -compared against the IUCN Criteria. However, it provides important information -on the amount of habitat left for a given species within its EOO and more -importantly how this amount is changing through time. - -Here, we compute AOH to infer the continuing declines of the species area of -habitat, another important condition to assess the IUCN criterion B. - -```{r area-of-habitat, eval = TRUE, collapse = TRUE} + + + + + +The area of habitat (AOH) is currently not an official population metric that is +compared against the IUCN Criteria. However, it provides important information +on the amount of habitat left for a given species within its EOO and more +importantly how this amount is changing through time. + +`ConR` computes AOH using the function `AOH.estimation()`. If habitat maps are +available for different periods in time, the function can be used to infer the +continuing declines of the species AOH, which is an important condition to +assess the IUCN criterion B. + +For this example, we do not provide habitat maps for the area of study (i.e. +rasters with the Atlantic Forest cover through time), which are demanding in +terms of storage and computational time. So we will assume that we already have +available a vector containing the relative losses (in %) of AOH previously +estimated for each species between 2000 and 2018. + + +```{r area-of-habitat, eval = TRUE, collapse = TRUE} +rel.loss <- c(8.5, 8.1, 9.0) +declineB <- ifelse(rel.loss >= 1, "Decreasing", "Not Decreasing") ``` -

@@ -298,8 +307,7 @@ critA <- criterion_A(x = mean.pop, project.years = NULL, subcriteria = c("A2"), generation.time = gen.length, - exploitation = harvest) -names(critA)[which(names(critA) %in% "category_A")] <- "A2" + exploitation = harvest, show_progress = FALSE) ``` ## Species geographic range (IUCN criterion B) @@ -308,17 +316,13 @@ The function `criterion_B()` help to obtain assessments based on the criterion B, as well as others parameters documenting the species geographic range. ```{r metrics-B, eval = TRUE, collapse = TRUE} - -critB <- criterion_B( - x = occs, - AOO = AOO, - EOO = EOO.hull$results, - locations = locs$locations, - severe.frag = sever.frag, - subpops = sub -) - - +critB <- criterion_B(x = occs, + AOO = AOO, + EOO = EOO.hull$results, + locations = locs$locations, + severe.frag = sever.frag, + subpops = sub, + decline = declineB, show_progress = FALSE) ``` @@ -347,22 +351,16 @@ subpopulation sizes obtained above (`subpop.sizes`). ```{r criterion-C, eval = TRUE, collapse = TRUE} critC <- criterion_C(x = mean.pop, - assess.year = assess.year, - project = FALSE, - recent.year = recent.year, - # ignore.years = c(1808,1818,1823,1838), - subcriteria = c("C1","C2"), - generation.time = gen.length, - prop.mature = p.mature, - subpop.size = subpop.sizes, - correction = early.sucession, - show_progress = TRUE) + assess.year = assess.year, + project = FALSE, + recent.year = recent.year, + subcriteria = c("C1","C2"), + generation.time = gen.length, + prop.mature = p.mature, + subpop.size = subpop.sizes, + correction = early.sucession, show_progress = FALSE) ``` - - If C1 is listed within the argument `subcriteria`, the function returns the estimated continuing decline: @@ -379,9 +377,12 @@ However, function `criterion_D()` can be used to assess D2 only if the AOO and t number of locations are provided. ```{r criterion-D, eval = TRUE, collapse = TRUE} -p.mature.explo <- p.mature - harvest/100 # accounting for exploitation of commercial species -#pop.sizes.assess <- mean.pop[id.assess]] # population sizes at the year of assessment -critD <- criterion_D(pop.size = mean.pop[[28]], +# accounting for exploitation of commercial species +p.mature.explo <- p.mature - harvest/100 +# population sizes at the year of assessment +pop.sizes.assess <- mean.pop[[18]] +# assessing criterion D +critD <- criterion_D(pop.size = pop.sizes.assess, name_sp = mean.pop[[1]], AOO = AOO$aoo, n.Locs = locs$locations$locations, @@ -392,8 +393,6 @@ critD <- criterion_D(pop.size = mean.pop[[28]], ``` - - ## Combining the results from all criteria Because we are assessing multiple criteria for the same set of species, we need @@ -418,6 +417,9 @@ all.crit <- all.crit[order(all.crit$tax),] Next, we try to tell apart the Least Concern (LC) from Near-Threatened (NT) species using the function `near.threatened()`: + + + ```{r near-threatened, eval = TRUE, collapse = TRUE} subcriteria <- c("A2", "category_B", "C1", "C2", "D") for(i in 1:length(subcriteria)) { @@ -446,8 +448,9 @@ restrictive category for each species prevails, the function returns the evaluation result using other criteria. ```{r consensus, eval = TRUE, collapse = TRUE} -consensus <- cat_mult_criteria(all.crit[,c("tax", subcriteria)]) -all.crit <- cbind.data.frame(all.crit, consensus[,c("category","main.criteria","aux.criteria")]) +consensus <- cat_mult_criteria(all.crit[, c("tax", subcriteria)]) +all.crit <- cbind.data.frame(all.crit, + consensus[, c("category","main.criteria","aux.criteria")]) ``` The object `all.crit` now contains all relevant population metrics and the diff --git a/vignettes/articles/eoo.Rmd b/vignettes/articles/eoo.Rmd deleted file mode 100644 index 4d3941f..0000000 --- a/vignettes/articles/eoo.Rmd +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: "Extent of occurences" -author: "Gilles Dauby" -date: "`r format(Sys.time(), '%B %Y')`" -output: html_document ---- - - -```{r test1} - -test_data <- dummy_dist() - -``` - -```{r test2} - -## default running -EOO.computing(XY = test_data) - -## export polygons -EOO.computing(XY = test_data, export_shp = T) - -``` - - - - - - From f7a8f6b3484197ee30769de17036e15db6dde323 Mon Sep 17 00:00:00 2001 From: Renato Lima Date: Wed, 10 Jan 2024 20:36:00 -0300 Subject: [PATCH 20/23] Add the html version of the package vignette --- vignettes/articles/ConR.html | 805 +++++++++++++++++++++++++++++++++++ 1 file changed, 805 insertions(+) create mode 100644 vignettes/articles/ConR.html diff --git a/vignettes/articles/ConR.html b/vignettes/articles/ConR.html new file mode 100644 index 0000000..da1514a --- /dev/null +++ b/vignettes/articles/ConR.html @@ -0,0 +1,805 @@ + + + + + + + + + + + + + + +Conservation assessments based on multiple-IUCN criteria using ConR + + + + + + + + + + + + + + + + + + + + + + + + + + +

Conservation assessments based on +multiple-IUCN criteria using ConR

+ + + + +



+

This vignette shows how to use ConR to apply a workflow +for conducting conservation assessments for multiple species using the +IUCN criteria A, B, C and D. Here, we use only three species to make it +simple. But ConR was developed to perform assessments for +many more species at the same time.

+



+
+

1 Definitions

+

We will use as examples three emblematic and threatened arborescent +species that are endemic or near-endemic to the Atlantic Forest in South +America: Araucaria angustifolia, Euterpe edulis and +Paubrasilia echinata. Thus, it is necessary to obtain +information for this specific region of the world (e.g. habitat cover +maps, protected areas), which should be available to run this +tutorial.

+
spp <- c("Araucaria angustifolia", "Euterpe edulis", "Paubrasilia echinata")
+

Another more general but important piece of information is the year +of the assessment itself (which depends on the information available) +and the starting year used to assess recent continuing decline (which +depends on the region):

+
assess.year <- 2018
+recent.year <- 2000
+



+
+
+

2 Species +information

+

To perform the IUCN conservation assessments, we need different types +of species information related to their biology, distribution, +population size, threats, among other information.

+
+

2.1 Occurrence +records

+

We will use real occurrence data for our target species. This example +dataset data is provided with ConR within the internal +object example_tutorial, but users can load a file +containing a similar format. We will name it occs for +simplicity.

+
data(example_tutorial)
+occs <- example_tutorial$occurrences
+head(occs, 2)
+#>       ddlat     ddlon                    tax coly   UC   source tax.check
+#> 1 -23.40102 -51.96764 Araucaria angustifolia 2004 <NA> herbaria      high
+#> 2 -22.86267 -48.46837 Araucaria angustifolia 1998 <NA> herbaria      high
+
+
+

2.2 Species biology and +uses

+

Then, we need to define objects with the basic species information +that are necessary for the IUCN assessments.

+
gen.length <- c(40, 65, 50) ## generation length in years
+p.mature <- c(0.4485, 0.3028, 0.4143) ## proportion of mature individuals in the population
+early.sucession <- c(0.9, 1, 1) ## correction applied to population decline
+harvest <- c(10, 10, 10) ##  levels of exploitation causing reductions in population size (in %)
+
+
+

2.3 Population sizes

+

To assess the IUCN criteria A, C and D, we also need to provide +ConR the population size information. For this tutorial, +this information is also provided within the internal object +example_tutorial. We will name it +pop.sizes:

+
pop.sizes <- example_tutorial$population.sizes
+years <- names(pop.sizes[,-1])
+pop.sizes[, 1:6]
+#>                  species       1850       1940       1945       1950       1955
+#> 1 Araucaria angustifolia 2263714973 1763953733 1742714122 1706724090 1672711025
+#> 2         Euterpe edulis 4131301664 3423126071 3375255741 3301309873 3173853514
+#> 3   Paubrasilia echinata   24777189   20519325   20094366   19379164   18179102
+



+
+
+
+

3 Population metrics

+

Before we start calculating the population metrics, we need to load +ConR to make the functions available in our R +workspace.

+
library(ConR)
+
+

3.1 Population size +decline

+

To match the time frame of 1-3 generation times into the past or into +the future, we need to estimate the population sizes for the years that +we do not have information available. These estimates are produced using +the fit of different statistical models (i.e. quadratic, exponential, +logistic, general logistic) to the population size trends. Here, we will +only estimate population sizes into the past, but one can also use the +same ConR function pop.decline() to estimate +them into the future.

+
# Vector of years missing from the input data
+possible.years <- 
+  sort(unique(gen.length * rep(c(1:3), each=length(gen.length))), decreasing = TRUE)
+missing.years <- assess.year - possible.years
+
+# Estimating population sizes for the missing years
+est.pop.sizes <- pop.decline(pop.sizes[,-1], taxa = spp, output = "predictions",
+                             show_progress = FALSE)
+
+# Re-organizing the information for downstream analyses
+new.years <- est.pop.sizes[[1]][[1]]$years
+ncols <- length(new.years)
+nrows <- length(spp)
+mean.pop <- 
+  matrix(NA, ncol = ncols, nrow = nrows, dimnames = list(spp, new.years))
+
+for(i in seq_along(spp)) mean.pop[i,] <- est.pop.sizes[[1]][[i]]$predicted
+mean.pop <- cbind.data.frame(tax = spp, mean.pop, row.names = NULL)
+

We now have a new object called mean.pop which stores +both the input population sizes and the estimates based on the +statistical models that best describe the input data.

+
+
+

3.2 Number of spatially +valid and unique occurrences

+

We can begin by expecting how many valid occurrences are available +for each species.

+
nb.occs <- coord.check(XY = occs)
+nb.occs <- nb.occs$unique_occs
+
+
+

3.3 Extent of Occurrence +(EOO)

+

We then use the species occurrences to compute their extent of +occurrences (EOO) in square kilometers using the function +EOO.computing() and the IUCN-recommended Convex Hull +method.

+
EOO.hull <- EOO.computing(XY = occs[, c(1:3)], method.range = "convex.hull", 
+                          export_shp = TRUE, show_progress = FALSE)
+
+
+

3.4 Area of occupancy +(AOO)

+

Another important metric for IUCN assessments is the species’ area of +occupancy (AOO), also in square kilometers, which is computed using the +function AOO.computing(). Here, we also set as defaults the +IUCN recommendation of using 2x2 km grid cells to compute AOO. +ConR allows for computing AOO using multiple random +starting positions of the grid, to make sure the AOO estimate is not +influenced by the grid start position.

+
AOO <- AOO.computing(occs[, c(1:3)], 
+                     cell_size_AOO = 2, nbe.rep.rast.AOO = 30,
+                     show_progress = FALSE)
+
+
+

3.5 Number of +subpopulations

+

The number of subpopulations for each species is also an important +information. The delimitation of subpopulations depends on species +dispersal abilities. If this information is available, it can be +directly provided to the function subpop.comp(). If it is +not available, ConR offers the possibility of estimating +the maximum distance between species occurrences using the function +subpop.radius() and the circular buffer method. This +distance can be used as a proxy of species’ dispersal abilities:

+
radius <- subpop.radius(XY = occs[, c(1:3)], 
+                       quant.max = 0.9)
+sub <- subpop.comp(XY = occs[, c(1:3)],
+                   resol_sub_pop = radius[,c("tax", "radius")],
+                   show_progress = FALSE)
+
+
+

3.6 Number of +locations

+

One of the conditions to detect threat under the IUCN criterion B +(restricted geographic range) is related to the number of locations +where the species occur. Locations depend on the spatial extent of the +threats faced by the species. Here we used an extent of 10 km that makes +sense for the target region, the Atlantic Forest. This computation is +performed using the function locations.comp().

+
locs <- locations.comp(occs[, c(1:3),],  
+                       method = "fixed_grid",
+                       nbe_rep = 30,
+                       cell_size_locations = 10, 
+                       rel_cell_size = 0.05, 
+                       #threat_list = strict.ucs.spdf, 
+                       #id_shape = "NAME",
+                       method_polygons = "no_more_than_one", 
+                       show_progress = FALSE)
+ +
+
+

3.7 Severe +fragmentation

+

Another condition to detect threat under the IUCN criterion B is +whether the species populations is severely fragmented: more than +half of species AOO corresponds to habitat patches separated from others +by a large distance. Thus, to assess the level of fragmentation we +need the information on the species AOO and the dispersal ability. The +function severe_frag() computes the percentage of AOO that +is isolated across a large distance.

+
sever.frag <- severe_frag(XY = occs, 
+                          resol_sub_pop = radius[,c("tax", "radius")], 
+                          dist_isolated = radius$radius,
+                          show_progress = FALSE)
+
+
+

3.8 Area of habitat +(AOH)

+ + + +

The area of habitat (AOH) is currently not an official population +metric that is compared against the IUCN Criteria. However, it provides +important information on the amount of habitat left for a given species +within its EOO and more importantly how this amount is changing through +time.

+

ConR computes AOH using the function +AOH.estimation(). If habitat maps are available for +different periods in time, the function can be used to infer the +continuing declines of the species AOH, which is an important condition +to assess the IUCN criterion B.

+

For this example, we do not provide habitat maps for the area of +study (i.e. rasters with the Atlantic Forest cover through time), which +are demanding in terms of storage and computational time. So we will +assume that we already have available a vector containing the relative +losses (in %) of AOH previously estimated for each species between 2000 +and 2018.

+
rel.loss <- c(8.5, 8.1, 9.0)
+declineB <- ifelse(rel.loss >= 1, "Decreasing", "Not Decreasing")
+



+
+
+
+

4 IUCN criteria +assessments

+
+

4.1 Population size +reduction (IUCN criterion A)

+

The IUCN criterion A mainly evaluates paste and projects population +size reductions. In ConR, it is assessed using the function +criterion_A(), which requires population sizes through time +(mean.pop) and generation lengths +(gen.length). For this tutorial, we will assess only the +subcriterion A2, which makes more sense in the specific context of the +Atlantic Forest.

+

ConR also allows to include information on exploitation +levels for commercial species (e.g. timber), related to the base d of +criterion A. These levels are provided using the argument +exploitation.

+
critA <- criterion_A(x = mean.pop, 
+                     assess.year = assess.year,
+                     project.years = NULL, 
+                     subcriteria = c("A2"),
+                     generation.time = gen.length,
+                     exploitation = harvest, show_progress = FALSE)
+#> Warning: The years of the population sizes were not given and were taken from
+#> the input population data
+#> Warning in criterion_A(x = mean.pop, assess.year = assess.year, project.years =
+#> NULL, : Maximum projection of population sizes is more than 100 years into the
+#> future: assuming 100 years after the year of assessment
+#> Computing the predictions based on population trends...
+#> Warning: The following subcriteria were not used in the assessment: A1, A3, A4
+
+
+

4.2 Species geographic +range (IUCN criterion B)

+

The function criterion_B() help to obtain assessments +based on the criterion B, as well as others parameters documenting the +species geographic range.

+
critB <- criterion_B(x = occs, 
+                     AOO = AOO, 
+                     EOO = EOO.hull$results, 
+                     locations = locs$locations,
+                     severe.frag = sever.frag,
+                     subpops = sub, 
+                     decline = declineB, show_progress = FALSE)
+
+
+

4.3 Small and declining +populations (IUCN criterion C)

+

The IUCN criterion C is about small and declining populations. In +ConR, this criterion is assessed using the function +criterion_C(), which requires subpopulation sizes to apply +the sub-criterion C2.

+

We do not have estimates of subpopulation sizes available. So, we +take a simple approach which is assuming that all subpopulations have +the same size. And we store this simplification in the object +subpop.sizes.

+
id.assess <- which(names(mean.pop) %in% assess.year)
+df <- merge(data.frame(tax = spp, '2018' = mean.pop[,id.assess]), sub)
+subpop.sizes <- vector("list", dim(sub)[1])
+names(subpop.sizes) <- sub$tax
+for(i in seq_along(subpop.sizes)) {
+  subpop.sizes[[i]] <- rep(df$X2018[i]/df$subpop[i], df$subpop[i])
+}
+

Now, we apply criterion C itself using criterion_C(), +which requires information on population sizes through time +(mean.pop), generation lengths (gen.length) +and proportion of mature individuals (p.mature), besides +the subpopulation sizes obtained above (subpop.sizes).

+
critC <- criterion_C(x = mean.pop,
+                     assess.year = assess.year,
+                     project = FALSE,
+                     recent.year = recent.year,
+                     subcriteria = c("C1","C2"),
+                     generation.time = gen.length,
+                     prop.mature = p.mature,
+                     subpop.size = subpop.sizes,
+                     correction = early.sucession, show_progress = FALSE)
+#> Warning: The years of the population sizes were not given and were taken from
+#> the input population data
+#> Warning in criterion_C(x = mean.pop, assess.year = assess.year, project =
+#> FALSE, : Maximum year to project population sizes is more than 100 years into
+#> the future: assuming 100 years after the year of assessment
+#> Computing the estimated continuing decline (subcriteria C1)...
+

If C1 is listed within the argument subcriteria, the +function returns the estimated continuing decline:

+
est.decline <- critC$cont.decline
+
+
+

4.4 Very small population +sizes (IUCN criterion D)

+

The IUCN criterion D is assessed using the function +criterion_D(). We have no spatially explicit information +for future human activities or stochastic events for the Atlantic +Forest. Therefore, here we assess the subcriterion D and not D2. +However, function criterion_D() can be used to assess D2 +only if the AOO and the number of locations are provided.

+
# accounting for exploitation of commercial species
+p.mature.explo <- p.mature - harvest/100
+# population sizes at the year of assessment
+pop.sizes.assess <- mean.pop[[18]]
+# assessing criterion D
+critD <- criterion_D(pop.size = pop.sizes.assess, 
+                     name_sp = mean.pop[[1]], 
+                     AOO = AOO$aoo,
+                     n.Locs = locs$locations$locations,
+                     prop.mature = p.mature.explo, 
+                     subcriteria = c("D", "D2"),
+                     AOO.threshold = 20, 
+                     Loc.threshold = 5)
+
+
+

4.5 Combining the results +from all criteria

+

Because we are assessing multiple criteria for the same set of +species, we need to combine the results from all criteria. We try to +avoid duplicated columns in the final object all.crit.

+
all.crit <- merge(critA, critB, by = "tax", all = TRUE)
+
+rm.dup.columns <- which(names(critC) %in% c("assessment.year", "assessment.period"))
+all.crit <- merge(all.crit, critC[, -rm.dup.columns], by = "tax", all = TRUE, 
+                  suffixes = c(".A",".C"))
+
+rm.dup.columns <- which(names(critD) %in% c("AOO"))
+all.crit <- merge(all.crit, critD[, -rm.dup.columns], by = "tax", all = TRUE)
+
+all.crit <- all.crit[order(all.crit$tax),]
+
+
+

4.6 Near threatened

+

Next, we try to tell apart the Least Concern (LC) from +Near-Threatened (NT) species using the function +near.threatened():

+ +
subcriteria <- c("A2", "category_B", "C1", "C2", "D")
+for(i in 1:length(subcriteria)) {
+  all.crit[,subcriteria[i]] <- 
+    near.threatened(cats = all.crit[,subcriteria[i]],
+                    EOO = all.crit$EOO,
+                    AOO = all.crit$AOO,
+                    decline = all.crit$any.decline,
+                    pop.reduction = all.crit$reduction_A12,
+                    pop.size = all.crit$pop.size,
+                    pop.size.low = NULL,
+                    locations = all.crit$locations,
+                    sever.frag = all.crit$severe_frag,
+                    ext.fluct = NULL,
+                    subpop = all.crit$subpop, 
+                    subcriteria = subcriteria[i])
+}
+
+
+

4.7 Consensus +assessment

+

Finally, we obtained the consensus categories for all four IUCN +criteria using the function cat_mult_criteria(). Although +the criteria resulting in the most restrictive category for each species +prevails, the function returns the evaluation result using other +criteria.

+
consensus <- cat_mult_criteria(all.crit[, c("tax", subcriteria)])
+all.crit <- cbind.data.frame(all.crit, 
+                             consensus[, c("category","main.criteria","aux.criteria")])
+

The object all.crit now contains all relevant population +metrics and the results of the IUCN conservation assessments using the +Red List criteria A-D.

+
+
+ + + + + + + + + + + From 76efd50d5a2a77f2c8bee926edd975d2a52be597 Mon Sep 17 00:00:00 2001 From: raflima1981 Date: Wed, 10 Jan 2024 20:40:42 -0300 Subject: [PATCH 21/23] Removing the html file --- vignettes/articles/ConR.html | 805 ----------------------------------- 1 file changed, 805 deletions(-) delete mode 100644 vignettes/articles/ConR.html diff --git a/vignettes/articles/ConR.html b/vignettes/articles/ConR.html deleted file mode 100644 index da1514a..0000000 --- a/vignettes/articles/ConR.html +++ /dev/null @@ -1,805 +0,0 @@ - - - - - - - - - - - - - - -Conservation assessments based on multiple-IUCN criteria using ConR - - - - - - - - - - - - - - - - - - - - - - - - - - -

Conservation assessments based on -multiple-IUCN criteria using ConR

- - - - -



-

This vignette shows how to use ConR to apply a workflow -for conducting conservation assessments for multiple species using the -IUCN criteria A, B, C and D. Here, we use only three species to make it -simple. But ConR was developed to perform assessments for -many more species at the same time.

-



-
-

1 Definitions

-

We will use as examples three emblematic and threatened arborescent -species that are endemic or near-endemic to the Atlantic Forest in South -America: Araucaria angustifolia, Euterpe edulis and -Paubrasilia echinata. Thus, it is necessary to obtain -information for this specific region of the world (e.g. habitat cover -maps, protected areas), which should be available to run this -tutorial.

-
spp <- c("Araucaria angustifolia", "Euterpe edulis", "Paubrasilia echinata")
-

Another more general but important piece of information is the year -of the assessment itself (which depends on the information available) -and the starting year used to assess recent continuing decline (which -depends on the region):

-
assess.year <- 2018
-recent.year <- 2000
-



-
-
-

2 Species -information

-

To perform the IUCN conservation assessments, we need different types -of species information related to their biology, distribution, -population size, threats, among other information.

-
-

2.1 Occurrence -records

-

We will use real occurrence data for our target species. This example -dataset data is provided with ConR within the internal -object example_tutorial, but users can load a file -containing a similar format. We will name it occs for -simplicity.

-
data(example_tutorial)
-occs <- example_tutorial$occurrences
-head(occs, 2)
-#>       ddlat     ddlon                    tax coly   UC   source tax.check
-#> 1 -23.40102 -51.96764 Araucaria angustifolia 2004 <NA> herbaria      high
-#> 2 -22.86267 -48.46837 Araucaria angustifolia 1998 <NA> herbaria      high
-
-
-

2.2 Species biology and -uses

-

Then, we need to define objects with the basic species information -that are necessary for the IUCN assessments.

-
gen.length <- c(40, 65, 50) ## generation length in years
-p.mature <- c(0.4485, 0.3028, 0.4143) ## proportion of mature individuals in the population
-early.sucession <- c(0.9, 1, 1) ## correction applied to population decline
-harvest <- c(10, 10, 10) ##  levels of exploitation causing reductions in population size (in %)
-
-
-

2.3 Population sizes

-

To assess the IUCN criteria A, C and D, we also need to provide -ConR the population size information. For this tutorial, -this information is also provided within the internal object -example_tutorial. We will name it -pop.sizes:

-
pop.sizes <- example_tutorial$population.sizes
-years <- names(pop.sizes[,-1])
-pop.sizes[, 1:6]
-#>                  species       1850       1940       1945       1950       1955
-#> 1 Araucaria angustifolia 2263714973 1763953733 1742714122 1706724090 1672711025
-#> 2         Euterpe edulis 4131301664 3423126071 3375255741 3301309873 3173853514
-#> 3   Paubrasilia echinata   24777189   20519325   20094366   19379164   18179102
-



-
-
-
-

3 Population metrics

-

Before we start calculating the population metrics, we need to load -ConR to make the functions available in our R -workspace.

-
library(ConR)
-
-

3.1 Population size -decline

-

To match the time frame of 1-3 generation times into the past or into -the future, we need to estimate the population sizes for the years that -we do not have information available. These estimates are produced using -the fit of different statistical models (i.e. quadratic, exponential, -logistic, general logistic) to the population size trends. Here, we will -only estimate population sizes into the past, but one can also use the -same ConR function pop.decline() to estimate -them into the future.

-
# Vector of years missing from the input data
-possible.years <- 
-  sort(unique(gen.length * rep(c(1:3), each=length(gen.length))), decreasing = TRUE)
-missing.years <- assess.year - possible.years
-
-# Estimating population sizes for the missing years
-est.pop.sizes <- pop.decline(pop.sizes[,-1], taxa = spp, output = "predictions",
-                             show_progress = FALSE)
-
-# Re-organizing the information for downstream analyses
-new.years <- est.pop.sizes[[1]][[1]]$years
-ncols <- length(new.years)
-nrows <- length(spp)
-mean.pop <- 
-  matrix(NA, ncol = ncols, nrow = nrows, dimnames = list(spp, new.years))
-
-for(i in seq_along(spp)) mean.pop[i,] <- est.pop.sizes[[1]][[i]]$predicted
-mean.pop <- cbind.data.frame(tax = spp, mean.pop, row.names = NULL)
-

We now have a new object called mean.pop which stores -both the input population sizes and the estimates based on the -statistical models that best describe the input data.

-
-
-

3.2 Number of spatially -valid and unique occurrences

-

We can begin by expecting how many valid occurrences are available -for each species.

-
nb.occs <- coord.check(XY = occs)
-nb.occs <- nb.occs$unique_occs
-
-
-

3.3 Extent of Occurrence -(EOO)

-

We then use the species occurrences to compute their extent of -occurrences (EOO) in square kilometers using the function -EOO.computing() and the IUCN-recommended Convex Hull -method.

-
EOO.hull <- EOO.computing(XY = occs[, c(1:3)], method.range = "convex.hull", 
-                          export_shp = TRUE, show_progress = FALSE)
-
-
-

3.4 Area of occupancy -(AOO)

-

Another important metric for IUCN assessments is the species’ area of -occupancy (AOO), also in square kilometers, which is computed using the -function AOO.computing(). Here, we also set as defaults the -IUCN recommendation of using 2x2 km grid cells to compute AOO. -ConR allows for computing AOO using multiple random -starting positions of the grid, to make sure the AOO estimate is not -influenced by the grid start position.

-
AOO <- AOO.computing(occs[, c(1:3)], 
-                     cell_size_AOO = 2, nbe.rep.rast.AOO = 30,
-                     show_progress = FALSE)
-
-
-

3.5 Number of -subpopulations

-

The number of subpopulations for each species is also an important -information. The delimitation of subpopulations depends on species -dispersal abilities. If this information is available, it can be -directly provided to the function subpop.comp(). If it is -not available, ConR offers the possibility of estimating -the maximum distance between species occurrences using the function -subpop.radius() and the circular buffer method. This -distance can be used as a proxy of species’ dispersal abilities:

-
radius <- subpop.radius(XY = occs[, c(1:3)], 
-                       quant.max = 0.9)
-sub <- subpop.comp(XY = occs[, c(1:3)],
-                   resol_sub_pop = radius[,c("tax", "radius")],
-                   show_progress = FALSE)
-
-
-

3.6 Number of -locations

-

One of the conditions to detect threat under the IUCN criterion B -(restricted geographic range) is related to the number of locations -where the species occur. Locations depend on the spatial extent of the -threats faced by the species. Here we used an extent of 10 km that makes -sense for the target region, the Atlantic Forest. This computation is -performed using the function locations.comp().

-
locs <- locations.comp(occs[, c(1:3),],  
-                       method = "fixed_grid",
-                       nbe_rep = 30,
-                       cell_size_locations = 10, 
-                       rel_cell_size = 0.05, 
-                       #threat_list = strict.ucs.spdf, 
-                       #id_shape = "NAME",
-                       method_polygons = "no_more_than_one", 
-                       show_progress = FALSE)
- -
-
-

3.7 Severe -fragmentation

-

Another condition to detect threat under the IUCN criterion B is -whether the species populations is severely fragmented: more than -half of species AOO corresponds to habitat patches separated from others -by a large distance. Thus, to assess the level of fragmentation we -need the information on the species AOO and the dispersal ability. The -function severe_frag() computes the percentage of AOO that -is isolated across a large distance.

-
sever.frag <- severe_frag(XY = occs, 
-                          resol_sub_pop = radius[,c("tax", "radius")], 
-                          dist_isolated = radius$radius,
-                          show_progress = FALSE)
-
-
-

3.8 Area of habitat -(AOH)

- - - -

The area of habitat (AOH) is currently not an official population -metric that is compared against the IUCN Criteria. However, it provides -important information on the amount of habitat left for a given species -within its EOO and more importantly how this amount is changing through -time.

-

ConR computes AOH using the function -AOH.estimation(). If habitat maps are available for -different periods in time, the function can be used to infer the -continuing declines of the species AOH, which is an important condition -to assess the IUCN criterion B.

-

For this example, we do not provide habitat maps for the area of -study (i.e. rasters with the Atlantic Forest cover through time), which -are demanding in terms of storage and computational time. So we will -assume that we already have available a vector containing the relative -losses (in %) of AOH previously estimated for each species between 2000 -and 2018.

-
rel.loss <- c(8.5, 8.1, 9.0)
-declineB <- ifelse(rel.loss >= 1, "Decreasing", "Not Decreasing")
-



-
-
-
-

4 IUCN criteria -assessments

-
-

4.1 Population size -reduction (IUCN criterion A)

-

The IUCN criterion A mainly evaluates paste and projects population -size reductions. In ConR, it is assessed using the function -criterion_A(), which requires population sizes through time -(mean.pop) and generation lengths -(gen.length). For this tutorial, we will assess only the -subcriterion A2, which makes more sense in the specific context of the -Atlantic Forest.

-

ConR also allows to include information on exploitation -levels for commercial species (e.g. timber), related to the base d of -criterion A. These levels are provided using the argument -exploitation.

-
critA <- criterion_A(x = mean.pop, 
-                     assess.year = assess.year,
-                     project.years = NULL, 
-                     subcriteria = c("A2"),
-                     generation.time = gen.length,
-                     exploitation = harvest, show_progress = FALSE)
-#> Warning: The years of the population sizes were not given and were taken from
-#> the input population data
-#> Warning in criterion_A(x = mean.pop, assess.year = assess.year, project.years =
-#> NULL, : Maximum projection of population sizes is more than 100 years into the
-#> future: assuming 100 years after the year of assessment
-#> Computing the predictions based on population trends...
-#> Warning: The following subcriteria were not used in the assessment: A1, A3, A4
-
-
-

4.2 Species geographic -range (IUCN criterion B)

-

The function criterion_B() help to obtain assessments -based on the criterion B, as well as others parameters documenting the -species geographic range.

-
critB <- criterion_B(x = occs, 
-                     AOO = AOO, 
-                     EOO = EOO.hull$results, 
-                     locations = locs$locations,
-                     severe.frag = sever.frag,
-                     subpops = sub, 
-                     decline = declineB, show_progress = FALSE)
-
-
-

4.3 Small and declining -populations (IUCN criterion C)

-

The IUCN criterion C is about small and declining populations. In -ConR, this criterion is assessed using the function -criterion_C(), which requires subpopulation sizes to apply -the sub-criterion C2.

-

We do not have estimates of subpopulation sizes available. So, we -take a simple approach which is assuming that all subpopulations have -the same size. And we store this simplification in the object -subpop.sizes.

-
id.assess <- which(names(mean.pop) %in% assess.year)
-df <- merge(data.frame(tax = spp, '2018' = mean.pop[,id.assess]), sub)
-subpop.sizes <- vector("list", dim(sub)[1])
-names(subpop.sizes) <- sub$tax
-for(i in seq_along(subpop.sizes)) {
-  subpop.sizes[[i]] <- rep(df$X2018[i]/df$subpop[i], df$subpop[i])
-}
-

Now, we apply criterion C itself using criterion_C(), -which requires information on population sizes through time -(mean.pop), generation lengths (gen.length) -and proportion of mature individuals (p.mature), besides -the subpopulation sizes obtained above (subpop.sizes).

-
critC <- criterion_C(x = mean.pop,
-                     assess.year = assess.year,
-                     project = FALSE,
-                     recent.year = recent.year,
-                     subcriteria = c("C1","C2"),
-                     generation.time = gen.length,
-                     prop.mature = p.mature,
-                     subpop.size = subpop.sizes,
-                     correction = early.sucession, show_progress = FALSE)
-#> Warning: The years of the population sizes were not given and were taken from
-#> the input population data
-#> Warning in criterion_C(x = mean.pop, assess.year = assess.year, project =
-#> FALSE, : Maximum year to project population sizes is more than 100 years into
-#> the future: assuming 100 years after the year of assessment
-#> Computing the estimated continuing decline (subcriteria C1)...
-

If C1 is listed within the argument subcriteria, the -function returns the estimated continuing decline:

-
est.decline <- critC$cont.decline
-
-
-

4.4 Very small population -sizes (IUCN criterion D)

-

The IUCN criterion D is assessed using the function -criterion_D(). We have no spatially explicit information -for future human activities or stochastic events for the Atlantic -Forest. Therefore, here we assess the subcriterion D and not D2. -However, function criterion_D() can be used to assess D2 -only if the AOO and the number of locations are provided.

-
# accounting for exploitation of commercial species
-p.mature.explo <- p.mature - harvest/100
-# population sizes at the year of assessment
-pop.sizes.assess <- mean.pop[[18]]
-# assessing criterion D
-critD <- criterion_D(pop.size = pop.sizes.assess, 
-                     name_sp = mean.pop[[1]], 
-                     AOO = AOO$aoo,
-                     n.Locs = locs$locations$locations,
-                     prop.mature = p.mature.explo, 
-                     subcriteria = c("D", "D2"),
-                     AOO.threshold = 20, 
-                     Loc.threshold = 5)
-
-
-

4.5 Combining the results -from all criteria

-

Because we are assessing multiple criteria for the same set of -species, we need to combine the results from all criteria. We try to -avoid duplicated columns in the final object all.crit.

-
all.crit <- merge(critA, critB, by = "tax", all = TRUE)
-
-rm.dup.columns <- which(names(critC) %in% c("assessment.year", "assessment.period"))
-all.crit <- merge(all.crit, critC[, -rm.dup.columns], by = "tax", all = TRUE, 
-                  suffixes = c(".A",".C"))
-
-rm.dup.columns <- which(names(critD) %in% c("AOO"))
-all.crit <- merge(all.crit, critD[, -rm.dup.columns], by = "tax", all = TRUE)
-
-all.crit <- all.crit[order(all.crit$tax),]
-
-
-

4.6 Near threatened

-

Next, we try to tell apart the Least Concern (LC) from -Near-Threatened (NT) species using the function -near.threatened():

- -
subcriteria <- c("A2", "category_B", "C1", "C2", "D")
-for(i in 1:length(subcriteria)) {
-  all.crit[,subcriteria[i]] <- 
-    near.threatened(cats = all.crit[,subcriteria[i]],
-                    EOO = all.crit$EOO,
-                    AOO = all.crit$AOO,
-                    decline = all.crit$any.decline,
-                    pop.reduction = all.crit$reduction_A12,
-                    pop.size = all.crit$pop.size,
-                    pop.size.low = NULL,
-                    locations = all.crit$locations,
-                    sever.frag = all.crit$severe_frag,
-                    ext.fluct = NULL,
-                    subpop = all.crit$subpop, 
-                    subcriteria = subcriteria[i])
-}
-
-
-

4.7 Consensus -assessment

-

Finally, we obtained the consensus categories for all four IUCN -criteria using the function cat_mult_criteria(). Although -the criteria resulting in the most restrictive category for each species -prevails, the function returns the evaluation result using other -criteria.

-
consensus <- cat_mult_criteria(all.crit[, c("tax", subcriteria)])
-all.crit <- cbind.data.frame(all.crit, 
-                             consensus[, c("category","main.criteria","aux.criteria")])
-

The object all.crit now contains all relevant population -metrics and the results of the IUCN conservation assessments using the -Red List criteria A-D.

-
-
- - - - - - - - - - - From 17ea0504fab7e05c2e5e2cad7b552356e9008057 Mon Sep 17 00:00:00 2001 From: raflima1981 Date: Wed, 10 Jan 2024 21:04:12 -0300 Subject: [PATCH 22/23] Updating package README --- README.md | 21 ++++++++------------- readme.Rmd | 6 ++++-- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 0dc220a..5e9aac2 100644 --- a/README.md +++ b/README.md @@ -3,17 +3,9 @@ # ConR package - - -[![Travis build -status](https://travis-ci.com/gdauby/ConR.svg?branch=master)](https://travis-ci.com/gdauby/ConR) -[![CRAN RStudio mirror -downloads](https://cranlogs.r-pkg.org/badges/ConR)](https://www.r-pkg.org/pkg/ConR) - -

-The `ConR` pacakge aims at assisting the preliminary assessment of +The `ConR` package aims at assisting the preliminary assessment of species conservation status based on the International Union for Conservation of Nature (IUCN) Red List Categories and Criteria. More specifically, it helps users to calculate the population metrics related @@ -26,11 +18,11 @@ institutes. -The package it not anymore available on CRAN because of the recent +The package it not available anymore on CRAN because of the recent retirement of various packages (rgdal, rgeos). The new version is nevertheless available on github and will soon be available on CRAN. -To install the version from github : +To install the github version : install.packages("devtools") devtools::install_github("gdauby/ConR") @@ -58,6 +50,9 @@ be obtained by the following code: ?criterion_A ?EOO.sensitivity +A manual for using the package is available +[here](https://raw.githubusercontent.com/gdauby/ConR/devel/vignettes/articles/ConR.html). + ## Funding The development of this package was supported by: @@ -75,9 +70,9 @@ The development of this package was supported by: ## Citation -G. Dauby & R. A. F. de Lima (2022). ConR: Computation of Parameters Used +G. Dauby & R. A. F. de Lima (2023). ConR: Computation of Parameters Used in Preliminary Assessment of Species Conservation Status. R package -(version 2.0.0). +(version 2.1.0). ## See Also diff --git a/readme.Rmd b/readme.Rmd index 7ddcb8b..814dcf7 100644 --- a/readme.Rmd +++ b/readme.Rmd @@ -77,6 +77,8 @@ following code: ?EOO.sensitivity ``` +A manual for using the package is available [here](https://raw.githubusercontent.com/gdauby/ConR/devel/vignettes/articles/ConR.html). + ## Funding @@ -90,9 +92,9 @@ The development of this package was supported by: ## Citation -G. Dauby & R. A. F. de Lima (2022). ConR: Computation of Parameters Used in +G. Dauby & R. A. F. de Lima (2023). ConR: Computation of Parameters Used in Preliminary Assessment of Species Conservation Status. R package (version -2.0.0). +2.1.0). ## See Also From f419e61ebf80bdb774a878d0f023b845bbc25d3d Mon Sep 17 00:00:00 2001 From: raflima1981 Date: Wed, 10 Jan 2024 21:31:33 -0300 Subject: [PATCH 23/23] Adding the pdf version of the vignette --- README.md | 4 ++-- readme.Rmd | 2 +- vignettes/articles/ConR.Rmd | 2 +- vignettes/articles/ConR.pdf | Bin 0 -> 275260 bytes 4 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 vignettes/articles/ConR.pdf diff --git a/README.md b/README.md index 5e9aac2..37a5e77 100644 --- a/README.md +++ b/README.md @@ -50,8 +50,8 @@ be obtained by the following code: ?criterion_A ?EOO.sensitivity -A manual for using the package is available -[here](https://raw.githubusercontent.com/gdauby/ConR/devel/vignettes/articles/ConR.html). +A mode detailed manual on how to use this package is available +[here](https://raw.githubusercontent.com/gdauby/ConR/devel/vignettes/articles/ConR.pdf). ## Funding diff --git a/readme.Rmd b/readme.Rmd index 814dcf7..87f047a 100644 --- a/readme.Rmd +++ b/readme.Rmd @@ -77,7 +77,7 @@ following code: ?EOO.sensitivity ``` -A manual for using the package is available [here](https://raw.githubusercontent.com/gdauby/ConR/devel/vignettes/articles/ConR.html). +A mode detailed manual on how to use this package is available [here](https://raw.githubusercontent.com/gdauby/ConR/devel/vignettes/articles/ConR.pdf). ## Funding diff --git a/vignettes/articles/ConR.Rmd b/vignettes/articles/ConR.Rmd index 3e50138..e2e1210 100644 --- a/vignettes/articles/ConR.Rmd +++ b/vignettes/articles/ConR.Rmd @@ -4,7 +4,7 @@ title: "Conservation assessments based on multiple-IUCN criteria using ConR" # author: # - Renato A. F. de Lima^[Universidade de São Paulo, https://github.com/LimaRAF] # and Gilles Dauby^[IRD, https://github.com/gdauby] output: - rmarkdown::html_vignette: + rmarkdown::pdf_document: toc: true number_sections: true md_document: diff --git a/vignettes/articles/ConR.pdf b/vignettes/articles/ConR.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6bb5a907b05317765e55e7dee2f43b38e51c871f GIT binary patch literal 275260 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ⅈ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

  • U9_zLQ>MS{z&Qi_{{|Du-ki zXOf_YRxy;FjU7RC@P^jaE^mqCb7LAUaDhwhNEcm(0KlJhe9<>b&TPc&qQu|+G|A-+KW5)7&eiHGQk2VL+%8(e7Ci;* zAcyG>$Eww$_3aTOJ95u5XypiJAell|$1#y}aeBVzANe70F66>}Qj0_WQ%4g@e=WKo zh*Z91&Wa-KHsuj(3U|1+%8A){+~veFI$o#2GWE^8Bahjwvi3_lZ?oQa2G@3`F?R#% zqvYt3@B_&ifH-g?u-I*;3vk@nE8+UU3hdAcd(>v6v(AV7{JN-4xnO

    MXxw-*0?j6k(8luT*hO`)wN{fppRFO^d9DyK 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 M!eL>NS69IKf4Ee8BLDyZ literal 0 HcmV?d00001

  • 6N2JU=n^dEUP^Zlc?5uM?ZJ3V?RN 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