diff --git a/.Rbuildignore b/.Rbuildignore index b1879124..65e110af 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -13,3 +13,5 @@ ci_dependencies ^codecov.yml ^data-raw$ .covrignore +^doc$ +^Meta$ diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..58ac06eb --- /dev/null +++ b/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,28 @@ + + + +# Contributor Code of Conduct + +As contributors and maintainers of this project, we pledge to respect all people who +contribute through reporting issues, posting feature requests, updating documentation, +submitting pull requests or patches, and other activities. + +We are committed to making participation in this project a harassment-free experience for +everyone, regardless of level of experience, gender, gender identity and expression, +sexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion. + +Examples of unacceptable behavior by participants include the use of sexual language or +imagery, derogatory comments or personal attacks, trolling, public or private harassment, +insults, or other unprofessional conduct. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, +commits, code, wiki edits, issues, and other contributions that are not aligned to this +Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed +from the project team. + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by +opening an issue or contacting one or more of the project maintainers. + +This Code of Conduct is adapted from the Contributor Covenant +(https://www.contributor-covenant.org), version 1.0.0, available at +https://contributor-covenant.org/version/1/0/0/. diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 00000000..2b9c8b9e --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,104 @@ +# Contributing to tidysdm + + +This document outlines how to contribute to the development of `tidysdm`. The +package is maintained on a voluntary basis, so help is always appreciated. + +## The basic process of contributing + +Development work for `tidysdm` occurs in the `dev` branch. So, if you want to +propose any changes, you should work on `dev`. Start by forking the project +onto your github repository, make the changes directly in your fork (either in +the `dev` branch, or make a custom branch). After updating all the documentation +and checking that all tests pass (see below), start a Pull Request. Your proposed +changes will be reviewed, and you might be asked to fix/improve your code. This +can be an iterative process, requiring a few rounds of revision depending on +the complexity of the code. + +Functions should be documented using [`roxygen`](https://cran.r-project.org/web/packages/roxygen2/vignettes/roxygen2.html). +If any of your changes affects the documentation , you should rebuild it. +From the root directory of the package, simply run: + +``` +devtools::document() +``` + +If you implemented a new functionality, or patched a bug, you should consider +whether you should add an appropriate unit test. `tidysdm` uses the `testthat` +framework for unit tests. You should make sure that tests work with : +``` +devtools::test() +``` + +Finally, before you submit a push request, you should check that your changes +don't break the build. You can do that with `check`, which also builds the +vignette and runs the tests.: +``` +devtools::check() +``` + +Make sure that you have resolved all warnings and notes raised by +`devtools::check()`! + +Once you have followed **those 3 steps**, you are ready to make your Pull Request. +Your changes will go through automatic continuous integration, which will check +the impact of those changes on multiple platforms. If everything goes well, you +will see a green tick on your submission. + +## Fixing typos + +If you spot typos, spelling mistakes, or grammatical errors in the documentation, +you should fix them directly in the file that describes the function. This is the +`.R` file in the `R` directory, NOT the `.Rd` file in the `man` directory. `.Rd` +files are automatically generated by `roxygen2` and should not be edited by hand. +We recommend that you study first how +[roxygen2 comments](https://roxygen2.r-lib.org/articles/roxygen2.html) work. + +## Functional changes + +If you want to make a change that impacts the functioning of `tidysdm`, +it's a good idea to first file an issue +explaining what you have in mind. If the change is meant to fix a bug, then +add a minimal +[reprex](https://www.tidyverse.org/help/#reprex). + +A good reprex is also the +perfect starting point for writing a unit test, which should accompany any +functional change in the code. Unit tests are also essential when fix bugs, so +that you can both demonstrate that the fix work, and prevent future changes +from undoing your work. For unit testing, we use `testthat`; you will find tests under +`tests`, with a file dedicated to each function, following the convention +`test_my_function.R` for naming files. + +Ideally, the body of your Pull Request will include the phrase `Fixes #issue-number`, +where `issue_number` is the number on Github. In this way, your Pull Request +will be automatically linked to the issue, and the issue will be closed when +the Pull Request is merged in. + +For user-facing changes, add a bullet to the top of `NEWS.md` +(i.e. just below the first header). Follow the style described +in . + +### Code style + +New code should follow the tidyverse [style guide](https://style.tidyverse.org). +You can use the [styler](https://CRAN.R-project.org/package=styler) package +to apply these styles, but please don't restyle code that has nothing to do with your PR. + +Lot's of commenting in the code helps mantainability; so, if in doubt, always +add an explanation to your new code. + +As discussed above, we use [roxygen2](https://cran.r-project.org/package=roxygen2), with [Markdown syntax](https://roxygen2.r-lib.org/articles/rd-formatting.html), for documentation. + +We use [testthat](https://cran.r-project.org/package=testthat) for unit tests. +Contributions that change functionality should always include test cases. Our +continuous integration checks that the Pull Request does not reduce test coverage. +When creating tests, try to make use built-in datasets, rather than adding data +files to the package. + +## Code of Conduct + +Please note that the tidyverse project is released with a +[Contributor Code of Conduct](CODE_OF_CONDUCT.md). By contributing to this +project you agree to abide by its terms. + diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index fb84dc7a..fa38717e 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -44,13 +44,13 @@ jobs: extra-packages: any::rcmdcheck needs: check - - name: Get dev terra and pastclim +# - name: Get dev terra and pastclim # if: matrix.config.os == 'macos-latest' || ${{ github.base_ref == 'dev' }} || ${{ github.ref_name == 'dev' }} - run: | - install.packages('terra', repos='https://rspatial.r-universe.dev') - install.packages('devtools') - devtools::install_github("EvolEcolGroup/pastclim", ref="dev") - shell: Rscript {0} +# run: | +# install.packages('terra', repos='https://rspatial.r-universe.dev') +# install.packages('devtools') +# devtools::install_github("EvolEcolGroup/pastclim", ref="dev") +# shell: Rscript {0} - uses: r-lib/actions/check-r-package@v2 with: diff --git a/.github/workflows/pkgdown.yaml b/.github/workflows/pkgdown.yaml index 394b5318..86bc32ab 100644 --- a/.github/workflows/pkgdown.yaml +++ b/.github/workflows/pkgdown.yaml @@ -35,12 +35,12 @@ jobs: extra-packages: any::pkgdown, local::. needs: website - - name: Get dev terra and pastclim - run: | - install.packages('terra', repos='https://rspatial.r-universe.dev') - install.packages('devtools') - devtools::install_github("EvolEcolGroup/pastclim", ref="dev") - shell: Rscript {0} +# - name: Get dev terra and pastclim +# run: | +# install.packages('terra', repos='https://rspatial.r-universe.dev') +# install.packages('devtools') +# devtools::install_github("EvolEcolGroup/pastclim", ref="dev") +# shell: Rscript {0} - name: Build site run: pkgdown::build_site_github_pages(new_process = FALSE, install = FALSE) diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml index 272b8e05..532eb2c5 100644 --- a/.github/workflows/test-coverage.yaml +++ b/.github/workflows/test-coverage.yaml @@ -31,12 +31,12 @@ jobs: extra-packages: any::covr needs: coverage - - name: Get dev terra and pastclim - run: | - install.packages('terra', repos='https://rspatial.r-universe.dev') - install.packages('devtools') - devtools::install_github("EvolEcolGroup/pastclim", ref="dev") - shell: Rscript {0} +# - name: Get dev terra and pastclim +# run: | +# install.packages('terra', repos='https://rspatial.r-universe.dev') +# install.packages('devtools') +# devtools::install_github("EvolEcolGroup/pastclim", ref="dev") +# shell: Rscript {0} - name: Test coverage run: covr::codecov(type="all") diff --git a/.gitignore b/.gitignore index 138866d2..6c7d6709 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,9 @@ .Rproj.user +*.Rproj .Rhistory .RData .Ruserdata inst/doc docs +/doc/ +/Meta/ diff --git a/DESCRIPTION b/DESCRIPTION index 70a0e53d..5fcb1ef1 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,11 +1,16 @@ Package: tidysdm -Title: Species Distribution Models with tidymodels -Version: 0.9.1 +Title: Species Distribution Models with Tidymodels +Version: 0.9.2 Authors@R: c( person("Michela", "Leonardi", role = "aut"), person("Margherita", "Colucci", role = "aut"), person("Andrea", "Manica", , "am315@cam.ac.uk", role = c("aut", "cre"))) -Description: Fit Species Distribution Models using the tidymodels framework, as described +Description: Fit species distribution models (SDMs) using the 'tidymodels' framework, + which provides a standardised interface to define models and process their + outputs. 'tidysdm' expands 'tidymodels' by providing methods for spatial objects, + as well as a number of specialised functions to process presences and pseudoabsences + for contemporary and palaeo datasets. The full + functionalities of the package are described in Leonardi et al. (2023) . License: AGPL (>= 3) Encoding: UTF-8 @@ -48,14 +53,16 @@ Suggests: kernlab, knitr, overlapping, - pastclim, + pastclim (>= 2.0.0), ranger, readr, rmarkdown, + spelling, stacks, testthat (>= 3.0.0), tidyterra, - xgboost + xgboost, + V8 VignetteBuilder: knitr Config/testthat/edition: 3 LazyData: true diff --git a/NAMESPACE b/NAMESPACE index 57772aae..24b09707 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -57,7 +57,6 @@ export(check_splits_balance) export(control_ensemble_bayes) export(control_ensemble_grid) export(control_ensemble_resamples) -export(date2ybp) export(dist_pres_vs_bg) export(explain_tidysdm) export(feature_classes) @@ -98,7 +97,6 @@ export(tss) export(tss_max) export(tss_max_vec) export(y2d) -export(ybp2date) import(recipes) import(spatialsample) import(tidymodels) diff --git a/NEWS.md b/NEWS.md index aa333a09..39ae1273 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,7 @@ +# `tidysdm` 0.9.2 + +* Release on CRAN + # `tidysdm` 0.9.1 * Add a `spatial_recipe` class. This is a BREAKING change that makes previously diff --git a/R/add_member.R b/R/add_member.R index a4da9ada..438552c5 100644 --- a/R/add_member.R +++ b/R/add_member.R @@ -2,7 +2,8 @@ #' #' This function adds member(s) to a [simple_ensemble()] object, taking the #' best member from each workflow provided. It is possible to pass individual -#' `tune_results` objects from a tuned `workflow`, or a [workflowsets::workflow_set()]. +#' `tune_results` objects from a tuned `workflow`, or a +#' [workflowsets::workflow_set()]. #' #' @param x a [simple_ensemble] to which member(s) will be added #' @param member a `tune_results`, or a [`workflowsets::workflow_set`] @@ -14,60 +15,64 @@ # Note that `add_member` is tested in `test_simple_ensemble.R` -add_member <- function (x, member, ...) { +add_member <- function(x, member, ...) { UseMethod("add_member", object = member) } #' @rdname add_member #' @export -add_member.default <- function(x, member, ...){ +add_member.default <- function(x, member, ...) { stop("no method available for this object type") } #' @param id the name to be given to this workflow in the `wflow_id` column. #' @rdname add_member #' @export -add_member.tune_results <- function(x, member, metric = NULL, id=NULL, ...){ +add_member.tune_results <- function(x, member, metric = NULL, id = NULL, ...) { # set the metric if the simple ensemble is empty (and thus has no metric) - if (is.null(attr(x,"best_metric"))){ - attr(x,"best_metric") <- utils::getFromNamespace("choose_metric", "tune")(metric, member) + if (is.null(attr(x, "best_metric"))) { + attr(x, "best_metric") <- utils::getFromNamespace( + "choose_metric", + "tune" + )(metric, member) } # if metric is NULL - if (is.null(metric)){ + if (is.null(metric)) { # use the metric from the simple ensemble - metric <- attr(x,"best_metric") + metric <- attr(x, "best_metric") } else { - if (metric!=attr(x,"best_metric")){ + if (metric != attr(x, "best_metric")) { stop("the requested metric is not the same as the one previously used in x") } } # use name of object as id if we don't have one - if (is.null(id)){ - id <-deparse(substitute(member)) + if (is.null(id)) { + id <- deparse(substitute(member)) } # check that id is unique - if (id %in% x$wflow_id){ + if (id %in% x$wflow_id) { stop("x already has a member with the same name, provide an alternative name") } # get the best config, metric, etc. - best_config <- tune::select_best(member,metric)$.config + best_config <- tune::select_best(member, metric)$.config best_metrics <- tune::collect_metrics(member) %>% - dplyr::filter(.data$.config ==best_config) %>% + dplyr::filter(.data$.config == best_config) %>% dplyr::select(dplyr::all_of(c(".metric", "mean", "std_err", "n"))) %>% - dplyr::mutate(wflow_id=id, .before=dplyr::all_of(c(".metric"))) + dplyr::mutate(wflow_id = id, .before = dplyr::all_of(c(".metric"))) # now check that metrics are the same as in best_metrics - if (!is.null(attr(x,"metrics"))){ - if(!all(attr(x,"metrics")%in%best_metrics$.metric)){ + if (!is.null(attr(x, "metrics"))) { + if (!all(attr(x, "metrics") %in% best_metrics$.metric)) { stop("x and member were not evaluated for the same metrics") } } else { - attr(x,"metrics")<-best_metrics$.metric + attr(x, "metrics") <- best_metrics$.metric } # subset best metrics to just the metrics used in the ensemble - best_metrics <- best_metrics %>% dplyr::filter(.data$.metric %in% attr(x,"metrics")) + best_metrics <- best_metrics %>% + dplyr::filter(.data$.metric %in% attr(x, "metrics")) best_fit <- tune::fit_best(member, metric = metric) @@ -83,9 +88,9 @@ add_member.tune_results <- function(x, member, metric = NULL, id=NULL, ...){ #' @rdname add_member #' @export add_member.workflow_set <- function(x, member, metric = NULL, ...) { - for (i_wflow in member$wflow_id){ + for (i_wflow in member$wflow_id) { this_res <- workflowsets::extract_workflow_set_result(member, id = i_wflow) - x <- x %>% add_member(this_res, metric=metric, id = i_wflow) + x <- x %>% add_member(this_res, metric = metric, id = i_wflow) } x } diff --git a/R/add_repeat.R b/R/add_repeat.R index 2d17f64e..37521e22 100644 --- a/R/add_repeat.R +++ b/R/add_repeat.R @@ -13,47 +13,46 @@ # Note that `add_repeat` is tested in `test_repeat_ensemble.R` -add_repeat <- function (x, rep, ...) { +add_repeat <- function(x, rep, ...) { UseMethod("add_repeat", object = rep) } #' @rdname add_repeat #' @export -add_repeat.default <- function(x, rep, ...){ +add_repeat.default <- function(x, rep, ...) { stop("no method available for this object type") } #' @rdname add_repeat #' @export -add_repeat.simple_ensemble <- function(x, rep, ...){ +add_repeat.simple_ensemble <- function(x, rep, ...) { # if the repeated ensemble is empty - if (nrow(x)==0){ - attr(x,"best_metric") <- attr(rep,"best_metric") - attr(x,"metrics") <- attr(rep,"metrics") + if (nrow(x) == 0) { + attr(x, "best_metric") <- attr(rep, "best_metric") + attr(x, "metrics") <- attr(rep, "metrics") new_rep <- "rep_01" } else { # check that the new rep is compatible # check that metrics match - if (attr(x,"best_metric") !=attr(rep,"best_metric")){ - stop ("the best metric in the repeated ensemble differs from the repeat being added") + if (attr(x, "best_metric") != attr(rep, "best_metric")) { + stop("the best metric in the repeated ensemble differs from the repeat being added") } - if (all(attr(x,"metrics") !=attr(rep,"metrics"))){ - stop ("the metrics in the repeated ensemble differ from the repeat being added") + if (all(attr(x, "metrics") != attr(rep, "metrics"))) { + stop("the metrics in the repeated ensemble differ from the repeat being added") } - rep_number <- max(as.numeric(substr(x$rep_id,5, nchar(x$rep_id))))+1 - new_rep <- paste0("rep_",sprintf("%02d", rep_number)) - if (!setequal(unique(x$wflow_id),rep$wflow_id)){ + rep_number <- max(as.numeric(substr(x$rep_id, 5, nchar(x$rep_id)))) + 1 + new_rep <- paste0("rep_", sprintf("%02d", rep_number)) + if (!setequal(unique(x$wflow_id), rep$wflow_id)) { stop("the models in the repeated ensemble differ from the repeat being added") } } - rep<-rep %>% dplyr::mutate(rep_id=new_rep, .before = "wflow_id") + rep <- rep %>% dplyr::mutate(rep_id = new_rep, .before = "wflow_id") x %>% dplyr::bind_rows(rep) - } #' @rdname add_repeat #' @export -add_repeat.list <- function(x, rep, ...){ - for (i in seq_along(rep)){ +add_repeat.list <- function(x, rep, ...) { + for (i in seq_along(rep)) { x <- x %>% add_repeat(rep[[i]]) } x diff --git a/R/autoplot_simple_ensemble.R b/R/autoplot_simple_ensemble.R index c416261f..5755cf5d 100644 --- a/R/autoplot_simple_ensemble.R +++ b/R/autoplot_simple_ensemble.R @@ -1,7 +1,7 @@ #' Plot the results of a simple ensemble #' -#' This `autoplot()` method plots performance metrics that have been ranked using -#' a metric. +#' This `autoplot()` method plots performance metrics that have been +#' ranked using a metric. #' #' @param object A [`simple_ensemble`] whose elements have results. #' @param rank_metric A character string for which metric should be used to rank @@ -15,7 +15,8 @@ #' @details #' This function is intended to produce a default plot to visualize helpful #' information across all possible applications of a [`simple_ensemble`]. More -#' sophisticated plots can be produced using standard `ggplot2` code for plotting. +#' sophisticated plots can be produced using standard `ggplot2` code for +#' plotting. #' #' The x-axis is the workflow rank in the set (a value of one being the best) #' versus the performance metric(s) on the y-axis. With multiple metrics, there @@ -27,23 +28,23 @@ #' (95% confidence, by default). #' @returns A ggplot object. #' @examples -#' # we use the two_class_example from `workflowsets` -#' two_class_ens <- simple_ensemble() %>% -#' add_member(two_class_res, metric = "roc_auc") -#' autoplot(two_class_ens) +#' # we use the two_class_example from `workflowsets` +#' two_class_ens <- simple_ensemble() %>% +#' add_member(two_class_res, metric = "roc_auc") +#' autoplot(two_class_ens) #' #' @export autoplot.simple_ensemble <- function(object, rank_metric = NULL, metric = NULL, - std_errs = stats::qnorm(0.95), ...) { + std_errs = stats::qnorm(0.95), ...) { # get metrics table res <- object$metrics %>% dplyr::bind_rows() # vector of available metrics - metric_avail <- attr(object,"metrics") + metric_avail <- attr(object, "metrics") # if we requested metrics, make sure they are all available if (!is.null(metric)) { # all necessary metrics (rank_metric plus all in metric) keep_metrics <- unique(c(rank_metric, metric)) - if (!all(keep_metrics %in% metric_avail)){ + if (!all(keep_metrics %in% metric_avail)) { stop("some metrics are not part of the ensemble") } res <- dplyr::filter(res, .data$.metric %in% keep_metrics) @@ -54,35 +55,44 @@ autoplot.simple_ensemble <- function(object, rank_metric = NULL, metric = NULL, # check we have the rank_metric, or, if we were not given one, take the # metric that was to choose models in the workflows when simple_ensemble was # created - if (!is.null(rank_metric)){ - if (!rank_metric %in% metric_avail){ + if (!is.null(rank_metric)) { + if (!rank_metric %in% metric_avail) { stop("rank metric ", rank_metric, " is not part of the ensemble") } } else { - rank_metric <- attr(object,"best_metric") + rank_metric <- attr(object, "best_metric") } # rank models by the metric of choice res_rank_metric <- res %>% - dplyr::filter(.data$.metric==rank_metric) %>% + dplyr::filter(.data$.metric == rank_metric) %>% dplyr::arrange(mean) - res$rank <- (1:nrow(res_rank_metric))[match(res$wflow_id, res_rank_metric$wflow_id)] + res$rank <- (1:nrow(res_rank_metric))[match( + res$wflow_id, + res_rank_metric$wflow_id + )] # relevel the .metric factor to show first the rank metric - res <- res %>% dplyr::mutate (.metric=stats::relevel(factor(res$.metric),ref=rank_metric)) + res <- res %>% + dplyr::mutate(.metric = stats::relevel(factor(res$.metric), + ref = rank_metric + )) num_metrics <- length(unique(res$.metric)) has_std_error <- !all(is.na(res$std_err)) p <- - ggplot2::ggplot(res, ggplot2::aes(x = .data$rank, y = .data$mean, col = .data$wflow_id)) + + ggplot2::ggplot(res, ggplot2::aes( + x = .data$rank, + y = .data$mean, + col = .data$wflow_id + )) + ggplot2::geom_point(ggplot2::aes(shape = .data$wflow_id)) if (num_metrics > 1) { - #res$.metric <- factor(as.character(res$.metric)) #, levels = metrics$metric) p <- p + - ggplot2::facet_wrap(~.data$.metric, scales = "free_y", as.table = FALSE) + + ggplot2::facet_wrap(~ .data$.metric, scales = "free_y", as.table = FALSE) + ggplot2::labs(x = "Workflow Rank", y = "Metric") } else { p <- p + ggplot2::labs(x = "Workflow Rank", y = unique(res$.metric)) @@ -93,10 +103,10 @@ autoplot.simple_ensemble <- function(object, rank_metric = NULL, metric = NULL, p + ggplot2::geom_errorbar( ggplot2::aes( - ymin = .data$mean - .data$std_err *std_errs, + ymin = .data$mean - .data$std_err * std_errs, ymax = .data$mean + .data$std_err * std_errs ), - width = diff(range(res$rank)) / 75 + width = diff(range(res$rank)) / 75 ) } diff --git a/R/autoplot_spatial_initial_split.R b/R/autoplot_spatial_initial_split.R index a28868c8..a132a6e7 100644 --- a/R/autoplot_spatial_initial_split.R +++ b/R/autoplot_spatial_initial_split.R @@ -1,11 +1,12 @@ #' Create a ggplot for a spatial initial rsplit. #' -#' This method provides a good visualization method for a spatial initial rsplit. +#' This method provides a good visualization method for a spatial +#' initial rsplit. #' #' @details #' This plot method is a wrapper around the standard `spatial_rsplit` method, -#' but it re-labels the folds as *Testing* and *Training* following the convention -#' for a standard `initial_split` object +#' but it re-labels the folds as *Testing* and *Training* following the +#' convention for a standard `initial_split` object #' #' @param object A `spatial_initial_rsplit` object. #' Note that only resamples made from @@ -22,13 +23,16 @@ #' @examples #' #' set.seed(123) -#' block_initial <- spatial_initial_split(boston_canopy, prop = 1/5, spatial_block_cv) +#' block_initial <- spatial_initial_split(boston_canopy, +#' prop = 1 / 5, spatial_block_cv +#' ) #' autoplot(block_initial) #' @importFrom ggplot2 autoplot #' @export autoplot.spatial_initial_split <- function(object, ..., alpha = 0.6) { - p<- utils::getS3method("autoplot","spatial_rsplit")(object, alpha=alpha, ...) - p$data$.class. <- p$data$.class. %>% dplyr::case_match("Assessment" ~ "Testing", "Analysis" ~ "Training") + p <- utils::getS3method("autoplot", "spatial_rsplit")(object, alpha = alpha, ...) + p$data$.class. <- p$data$.class. %>% + dplyr::case_match("Assessment" ~ "Testing", "Analysis" ~ "Training") p } diff --git a/R/blockcv2rsample.R b/R/blockcv2rsample.R index e1bf04ce..768b1807 100644 --- a/R/blockcv2rsample.R +++ b/R/blockcv2rsample.R @@ -7,21 +7,28 @@ #' @returns an `rsample` object #' @export #' @examples +#' \donttest{ #' library(blockCV) #' points <- read.csv(system.file("extdata/", "species.csv", package = "blockCV")) #' pa_data <- sf::st_as_sf(points, coords = c("x", "y"), crs = 7845) -#' sb1 <- cv_spatial(x = pa_data, -#' column = "occ", # the response column (binary or multi-class) -#' k = 5, # number of folds -#' size = 350000, # size of the blocks in metres -#' selection = "random", # random blocks-to-fold -#' iteration = 50) # find evenly dispersed folds +#' sb1 <- cv_spatial( +#' x = pa_data, +#' column = "occ", # the response column (binary or multi-class) +#' k = 5, # number of folds +#' size = 350000, # size of the blocks in metres +#' selection = "random", # random blocks-to-fold +#' iteration = 10 +#' ) # find evenly dispersed folds #' sb1_rsample <- blockcv2rsample(sb1, pa_data) #' class(sb1_rsample) - -blockcv2rsample <- function(x, data){ - splits<-lapply(x$folds_list, - function(this_fold){names(this_fold)<-c("analysis","assessment") - rsample::make_splits(this_fold, data=data)}) - rsample::manual_rset(splits,ids=paste0("Fold",seq(1:length(splits)))) -} \ No newline at end of file +#' } +blockcv2rsample <- function(x, data) { + splits <- lapply( + x$folds_list, + function(this_fold) { + names(this_fold) <- c("analysis", "assessment") + rsample::make_splits(this_fold, data = data) + } + ) + rsample::manual_rset(splits, ids = paste0("Fold", seq(1:length(splits)))) +} diff --git a/R/boyce_cont.R b/R/boyce_cont.R index 41fb215e..cffdbb1b 100644 --- a/R/boyce_cont.R +++ b/R/boyce_cont.R @@ -12,11 +12,11 @@ #' and estimate arguments, or a table/matrix where the true class #' results should be in the columns of the table. #' @param ... A set of unquoted column names or one or more dplyr selector functions to choose which variables contain the class probabilities. If truth is binary, only 1 column should be selected, and it should correspond to the value of event_level. Otherwise, there should be as many columns as factor levels of truth and the ordering of the columns should be the same as the factor levels of truth. -#' @param truth The column identifier for the true class results (that is a factor). This should be an unquoted column name although this argument is passed by expression and supports quasiquotation (you can unquote column names). For ⁠_vec()⁠ functions, a factor vector. +#' @param truth The column identifier for the true class results (that is a factor). This should be an unquoted column name although this argument is passed by expression and supports quasiquotation (you can unquote column names). For _vec() functions, a factor vector. #' @param estimator One of "binary", "hand_till", "macro", or "macro_weighted" to specify the type of averaging to be done. "binary" is only relevant for the two class case. The others are general methods for calculating multiclass metrics. The default will automatically choose "binary" if truth is binary, "hand_till" if truth has >2 levels and case_weights isn't specified, or "macro" if truth has >2 levels and case_weights is specified (in which case "hand_till" isn't well-defined). #' @param na_rm A logical value indicating whether NA values should be stripped before the computation proceeds. #' @param event_level A single string. Either "first" or "second" to specify which level of truth to consider as the "event". This argument is only applicable when estimator = "binary". The default uses an internal helper that generally defaults to "first" -#' @param case_weights The optional column identifier for case weights. This should be an unquoted column name that evaluates to a numeric column in data. For ⁠_vec()⁠ functions, a numeric vector. +#' @param case_weights The optional column identifier for case weights. This should be an unquoted column name that evaluates to a numeric column in data. For _vec() functions, a numeric vector. #' @param estimate If truth is binary, a numeric vector of class probabilities corresponding to the "relevant" class. Otherwise, a matrix with as many columns as factor levels of truth. It is assumed that these are in the same order as the levels of truth. #' @returns A tibble with columns .metric, .estimator, and .estimate and 1 row of values. #' For grouped data frames, the number of rows returned will be the same as the @@ -46,12 +46,12 @@ boyce_cont <- new_prob_metric( #' @rdname boyce_cont #' @export boyce_cont.data.frame <- function(data, - truth, - ..., - estimator = NULL, - na_rm = TRUE, - event_level = "first", - case_weights = NULL) { + truth, + ..., + estimator = NULL, + na_rm = TRUE, + event_level = "first", + case_weights = NULL) { prob_metric_summarizer( name = "boyce_cont", fn = boyce_cont_vec, @@ -67,20 +67,22 @@ boyce_cont.data.frame <- function(data, #' @rdname boyce_cont #' @export -boyce_cont.sf <- function(data,...){ - data %>% dplyr::as_tibble() %>% boyce_cont(...) +boyce_cont.sf <- function(data, ...) { + data %>% + dplyr::as_tibble() %>% + boyce_cont(...) } #' @export #' @rdname boyce_cont boyce_cont_vec <- function(truth, - estimate, - estimator = NULL, - na_rm = TRUE, - event_level = "first", - case_weights = NULL, - ...) { + estimate, + estimator = NULL, + na_rm = TRUE, + event_level = "first", + case_weights = NULL, + ...) { utils::getFromNamespace("abort_if_class_pred", "yardstick")(truth) estimator <- yardstick::finalize_estimator(truth, estimator, "boyce_cont") @@ -107,10 +109,10 @@ boyce_cont_vec <- function(truth, } boyce_cont_estimator_impl <- function(truth, - estimate, - estimator, - event_level, - case_weights) { + estimate, + estimator, + event_level, + case_weights) { if (!utils::getFromNamespace("is_binary", "yardstick")(estimator)) { stop("boyce_cont is only available for binary classes; multiclass is not supported") } @@ -122,14 +124,14 @@ boyce_cont_estimator_impl <- function(truth, pres_level <- levels(truth)[2] contrast_level <- levels(truth)[1] } - pres <- estimate[truth==pres_level] - contrast <- estimate[truth==contrast_level] - if (!is.null(case_weights)){ - presWeight <- case_weights[truth==pres_level] - contrastWeight <- case_weights[truth==contrast_level] + pres <- estimate[truth == pres_level] + contrast <- estimate[truth == contrast_level] + if (!is.null(case_weights)) { + presWeight <- case_weights[truth == pres_level] + contrastWeight <- case_weights[truth == contrast_level] } else { - presWeight = rep(1, length(pres)) - contrastWeight = rep(1, length(contrast)) + presWeight <- rep(1, length(pres)) + contrastWeight <- rep(1, length(contrast)) } contBoyce(pres = pres, contrast = contrast, presWeight = presWeight, contrastWeight = contrastWeight) } @@ -145,15 +147,15 @@ contBoyce <- function( numBins = 101, binWidth = 0.1, autoWindow = TRUE, - method = 'spearman', + method = "spearman", dropZeros = TRUE, - #graph = FALSE, + # graph = FALSE, na.rm = FALSE, - ... -) { - + ...) { # if all NAs - if (all(is.na(pres)) | all(is.na(contrast)) | all(is.na(presWeight)) | all(is.na(contrastWeight))) return(NA) + if (all(is.na(pres)) | all(is.na(contrast)) | all(is.na(presWeight)) | all(is.na(contrastWeight))) { + return(NA) + } # catch errors if (binWidth > 1 | binWidth <= 0) stop('Argument "binWidth" must be between 0 and 1.') @@ -161,15 +163,23 @@ contBoyce <- function( eps <- .Machine$double.eps # right hand side of each class (assumes max value is >0) - lowest <- if (autoWindow) { min(c(pres, contrast), na.rm=na.rm) } else { 0 } - highest <- if (autoWindow) { max(c(pres, contrast), na.rm=na.rm) + eps } else { 1 + eps } + lowest <- if (autoWindow) { + min(c(pres, contrast), na.rm = na.rm) + } else { + 0 + } + highest <- if (autoWindow) { + max(c(pres, contrast), na.rm = na.rm) + eps + } else { + 1 + eps + } windowWidth <- binWidth * (highest - lowest) - lows <- seq(lowest, highest - windowWidth, length.out=numBins) - highs <- seq(lowest + windowWidth + eps, highest, length.out=numBins) + lows <- seq(lowest, highest - windowWidth, length.out = numBins) + highs <- seq(lowest + windowWidth + eps, highest, length.out = numBins) ########## ## MAIN ## @@ -180,17 +190,15 @@ contBoyce <- function( ### tally proportion of test presences/background sites in each class for (countClass in 1:numBins) { - # number of presence predictions in this class presInBin <- pres >= lows[countClass] & pres < highs[countClass] presInBin <- presInBin * presWeight - freqPres[countClass] <- sum(presInBin, na.rm=na.rm) + freqPres[countClass] <- sum(presInBin, na.rm = na.rm) # number of background predictions in this class bgInBin <- contrast >= lows[countClass] & contrast < highs[countClass] bgInBin <- bgInBin * contrastWeight - freqContrast[countClass] <- sum(bgInBin, na.rm=na.rm) - + freqContrast[countClass] <- sum(bgInBin, na.rm = na.rm) } # next predicted value class # mean bin prediction @@ -218,8 +226,8 @@ contBoyce <- function( freqContrast[zeros] <- NA } - P <- freqPres / sum(presWeight, na.rm=TRUE) - E <- freqContrast / sum(contrastWeight, na.rm=TRUE) + P <- freqPres / sum(presWeight, na.rm = TRUE) + E <- freqContrast / sum(contrastWeight, na.rm = TRUE) PE <- P / E # # plot (transfer the code to a boyce_curve function in the future) @@ -238,8 +246,6 @@ contBoyce <- function( PE <- PE[!na_in_either] # calculate continuous Boyce index (cbi) - cbi <- stats::cor(x=meanPred, y=PE, method=method) + cbi <- stats::cor(x = meanPred, y = PE, method = method) cbi - } - diff --git a/R/calib_class_thresh.R b/R/calib_class_thresh.R index eea41eb9..879770b0 100644 --- a/R/calib_class_thresh.R +++ b/R/calib_class_thresh.R @@ -14,49 +14,54 @@ #' along as a second element of a vector, e.g. c("sensitivity",0.8). #' @returns a [simple_ensemble] object #' @examples -#' test_ens <- simple_ensemble() %>% add_member(two_class_res[1:3, ], metric="roc_auc") -#' test_ens <- calib_class_thresh(test_ens, class_thresh="tss_max") -#' test_ens <- calib_class_thresh(test_ens, class_thresh="kap_max") -#' test_ens <- calib_class_thresh(test_ens, class_thresh=c("sens",0.9)) +#' test_ens <- simple_ensemble() %>% +#' add_member(two_class_res[1:3, ], metric = "roc_auc") +#' test_ens <- calib_class_thresh(test_ens, class_thresh = "tss_max") +#' test_ens <- calib_class_thresh(test_ens, class_thresh = "kap_max") +#' test_ens <- calib_class_thresh(test_ens, class_thresh = c("sens", 0.9)) #' @export -calib_class_thresh <- function(object, class_thresh, metric_thresh=NULL){ +calib_class_thresh <- function(object, class_thresh, metric_thresh = NULL) { # check that there is no entry for this calibration - if (!is.null(attr(object,"class_thresholds"))){ - ref_calib_tb <- attr(object,"class_thresholds") - if (any(unlist(lapply(ref_calib_tb %>% dplyr::pull("metric_thresh"),identical, metric_thresh)) & - unlist(lapply(ref_calib_tb %>% dplyr::pull("class_thresh"),identical, class_thresh)))){ + if (!is.null(attr(object, "class_thresholds"))) { + ref_calib_tb <- attr(object, "class_thresholds") + if (any(unlist(lapply(ref_calib_tb %>% dplyr::pull("metric_thresh"), identical, metric_thresh)) & + unlist(lapply(ref_calib_tb %>% dplyr::pull("class_thresh"), identical, class_thresh)))) { message("this ensemble is already calibrated for this combination of `class_thresh` and `metric_thresh`") return(object) } } - fun_names <- c("mean", "median","weighted_mean","weighted_median") + fun_names <- c("mean", "median", "weighted_mean", "weighted_median") # generate predictions from the training data - training_preds <-stats::predict(object,new_data=workflows::extract_mold(object$workflow[[1]])$predictors, - type="prob", fun = fun_names, - class_thresh = class_thresh, metric_thresh= metric_thresh + training_preds <- stats::predict(object, + new_data = workflows::extract_mold(object$workflow[[1]])$predictors, + type = "prob", fun = fun_names, + class_thresh = class_thresh, metric_thresh = metric_thresh ) # extract the truth from the training data - training_outcomes <- workflows::extract_mold((object$workflow[[1]]))$outcome %>% dplyr::pull(1) + training_outcomes <- + workflows::extract_mold((object$workflow[[1]]))$outcome %>% dplyr::pull(1) # get the thresholds for each model - calib_tb <- tibble::tibble(class_thresh=list(), - metric_thresh=list(), - fun = character(), - optim_value=numeric() + calib_tb <- tibble::tibble( + class_thresh = list(), + metric_thresh = list(), + fun = character(), + optim_value = numeric() ) - for (i_col in seq.int(ncol(training_preds))){ + for (i_col in seq.int(ncol(training_preds))) { optim_value <- optim_thresh(training_outcomes, - training_preds[,i_col], - metric = class_thresh) + training_preds[, i_col], + metric = class_thresh + ) calib_tb <- calib_tb %>% - dplyr::bind_rows(tibble::tibble(class_thresh=list(class_thresh), - metric_thresh=list(metric_thresh), - fun = fun_names[i_col], - optim_value = optim_value - ) - ) + dplyr::bind_rows(tibble::tibble( + class_thresh = list(class_thresh), + metric_thresh = list(metric_thresh), + fun = fun_names[i_col], + optim_value = optim_value + )) } # now store the new thresholds @@ -69,4 +74,3 @@ calib_class_thresh <- function(object, class_thresh, metric_thresh=NULL){ } object } - diff --git a/R/check_coords_names.R b/R/check_coords_names.R index 73fbddec..e7b3a48f 100644 --- a/R/check_coords_names.R +++ b/R/check_coords_names.R @@ -9,20 +9,22 @@ #' @returns A vector of length 2 with the valid names, in the correct order #' @keywords internal -check_coords_names <-function(data, coords){ - if (is.null(coords)){ - valid_names <- list(c("x","y"), c("longitude", "latitude"), c("lon","lat"), - c("X","Y")) +check_coords_names <- function(data, coords) { + if (is.null(coords)) { + valid_names <- list( + c("x", "y"), c("longitude", "latitude"), c("lon", "lat"), + c("X", "Y") + ) } else { valid_names <- list(coords) } # internal function to check that both x and y names are present - check_pair <- function(valid_names, var_names){ + check_pair <- function(valid_names, var_names) { all(!is.na(match(valid_names, var_names))) } # find if we have any pair valid_pair <- which(unlist(lapply(valid_names, check_pair, names(data)))) - if (length(valid_pair)!=1){ + if (length(valid_pair) != 1) { stop("There are no recognised coordinate columns, set their names with 'coords'") } diff --git a/R/check_sdm_presence.R b/R/check_sdm_presence.R index 8539e70d..33ec15f4 100644 --- a/R/check_sdm_presence.R +++ b/R/check_sdm_presence.R @@ -12,19 +12,21 @@ check_sdm_presence <- function( .data, .col, - presence_level="presence") - { - .col = rlang::enquo(.col) %>% rlang::quo_get_expr() %>% rlang::as_string() - presence_level = rlang::enquo(presence_level) %>% rlang::quo_get_expr() %>% + presence_level = "presence") { + .col <- rlang::enquo(.col) %>% + rlang::quo_get_expr() %>% + rlang::as_string() + presence_level <- rlang::enquo(presence_level) %>% + rlang::quo_get_expr() %>% rlang::as_string() x <- .data %>% dplyr::pull(.col) - if (!is.factor(x)){ + if (!is.factor(x)) { stop(.col, " should be a factor") } - if (!presence_level %in% levels(x)){ - stop("level ", presence_level," is not used in ",.col) + if (!presence_level %in% levels(x)) { + stop("level ", presence_level, " is not used in ", .col) } - if (presence_level!=levels(x)[1]){ + if (presence_level != levels(x)[1]) { stop("level ", presence_level, " is not the first level in ", .col) } return(TRUE) diff --git a/R/check_split_balance.R b/R/check_split_balance.R index 4eb780d9..611a0b79 100644 --- a/R/check_split_balance.R +++ b/R/check_split_balance.R @@ -1,24 +1,27 @@ #' Check the balance of presences vs pseudoabsences among splits #' -#' @param splits the data splits (an `rset` object), generated by a function such as +#' @param splits the data splits (an `rset` object), generated by a function such as #' [spatialsample::spatial_block_cv()] #' @param .col the column containing the presences #' @returns a table of number of presences and pseudoabsences #' @export #' @examples #' lacerta_thin <- readRDS(system.file("extdata/lacerta_climate_sf.RDS", -#' package="tidysdm")) +#' package = "tidysdm" +#' )) #' lacerta_cv <- spatial_block_cv(lacerta_thin, v = 5) #' check_splits_balance(lacerta_cv, class) -#' - +#' check_splits_balance <- function( splits, .col) { - .col = rlang::enquo(.col) %>% rlang::quo_get_expr() %>% rlang::as_string() - balance_list <- lapply(splits$splits,function(x) table(rsample::training(x) %>% - sf::st_drop_geometry() %>% dplyr::pull(.col))) + .col <- rlang::enquo(.col) %>% + rlang::quo_get_expr() %>% + rlang::as_string() + balance_list <- lapply(splits$splits, function(x) { + table(rsample::training(x) %>% + sf::st_drop_geometry() %>% dplyr::pull(.col)) + }) balance_df <- do.call("rbind", balance_list) return(balance_df) } - diff --git a/R/confusion_matrix_df.R b/R/confusion_matrix_df.R index c024472d..53756a20 100644 --- a/R/confusion_matrix_df.R +++ b/R/confusion_matrix_df.R @@ -8,27 +8,27 @@ #' @keywords internal -conf_matrix_df <- function (presences, absences) { -# Threshold breaks (nice idea from flexsdm): -if (length(presences) > 1000) { - thresh <- as.vector(stats::quantile(presences, seq(0,1,0.001))) -} else { - thresh <- presences -} -if (length(absences) > 1000) { - thresh <- c(thresh, as.vector(stats::quantile(absences, seq(0,1,0.001)))) -} else { - thresh <- c(thresh, absences) -} -# think whether we want to round here -thresh <- sort(unique(round(thresh, 8))) +conf_matrix_df <- function(presences, absences) { + # Threshold breaks (nice idea from flexsdm): + if (length(presences) > 1000) { + thresh <- as.vector(stats::quantile(presences, seq(0, 1, 0.001))) + } else { + thresh <- presences + } + if (length(absences) > 1000) { + thresh <- c(thresh, as.vector(stats::quantile(absences, seq(0, 1, 0.001)))) + } else { + thresh <- c(thresh, absences) + } + # think whether we want to round here + thresh <- sort(unique(round(thresh, 8))) -# confusion matrix at different thresholds, 1 flattened matrix per row -return(data.frame( - thresh = thresh, - tp = unlist(lapply(thresh,FUN=function(x)sum(presences >= x))), - fp = unlist(lapply(thresh,FUN=function(x)sum(absences >= x))), - fn = unlist(lapply(thresh,FUN=function(x)sum(presences < x))), - tn = unlist(lapply(thresh,FUN=function(x)sum(absences < x)))) -) + # confusion matrix at different thresholds, 1 flattened matrix per row + return(data.frame( + thresh = thresh, + tp = unlist(lapply(thresh, FUN = function(x) sum(presences >= x))), + fp = unlist(lapply(thresh, FUN = function(x) sum(absences >= x))), + fn = unlist(lapply(thresh, FUN = function(x) sum(presences < x))), + tn = unlist(lapply(thresh, FUN = function(x) sum(absences < x))) + )) } diff --git a/R/datasets_docs.R b/R/datasets_docs.R index cb260a7f..ff8cef76 100644 --- a/R/datasets_docs.R +++ b/R/datasets_docs.R @@ -25,7 +25,7 @@ #' A simple ensemble for the lacerta data #' -#' Ensemble SDM for *Lacerta schreiberi*. +#' Ensemble SDM for *Lacerta schreiberi*. #' #' @format A [`simple_ensemble`] object -"lacerta_ensemble" \ No newline at end of file +"lacerta_ensemble" diff --git a/R/dist_pres_vs_abs.R b/R/dist_pres_vs_abs.R index e6da62ef..e8fd7324 100644 --- a/R/dist_pres_vs_abs.R +++ b/R/dist_pres_vs_abs.R @@ -13,10 +13,15 @@ #' @returns a name vector of distances #' @examples #' # This should be updated to use a dataset from tidysdm -#' data("bradypus", package="maxnet") -#' bradypus_tb <- tibble::as_tibble(bradypus) %>% dplyr::mutate(presence = relevel(factor( -#' dplyr::case_match (presence, 1~"presence",0 ~"absence")), -#' ref="presence")) %>% select(-ecoreg) +#' data("bradypus", package = "maxnet") +#' bradypus_tb <- tibble::as_tibble(bradypus) %>% +#' dplyr::mutate(presence = relevel( +#' factor( +#' dplyr::case_match(presence, 1 ~ "presence", 0 ~ "absence") +#' ), +#' ref = "presence" +#' )) %>% +#' select(-ecoreg) #' #' bradypus_tb %>% dist_pres_vs_bg(presence) #' @@ -24,26 +29,30 @@ dist_pres_vs_bg <- function( .data, - .col){ - - if(requireNamespace("overlapping", quietly = TRUE)) { - - .col = rlang::enquo(.col) %>% rlang::quo_get_expr() %>% rlang::as_string() - if (inherits(.data, "sf")){ + .col) { + if (requireNamespace("overlapping", quietly = TRUE)) { + .col <- rlang::enquo(.col) %>% + rlang::quo_get_expr() %>% + rlang::as_string() + if (inherits(.data, "sf")) { .data <- .data %>% sf::st_drop_geometry() } # subset to only columns which are numeric - num_vars <- names(.data)[!names(.data)%in%.col] - dist_vec<- numeric() - for (i_var in num_vars){ - vals_list <- list(.data[[i_var]][.data[[.col]]==levels(.data[[.col]])[1]], - .data[[i_var]][.data[[.col]]==levels(.data[[.col]])[2]]) - dist_vec <- c(dist_vec, 1-overlapping::overlap(vals_list)$OV) + num_vars <- names(.data)[!names(.data) %in% .col] + dist_vec <- numeric() + for (i_var in num_vars) { + vals_list <- list( + .data[[i_var]][.data[[.col]] == levels(.data[[.col]])[1]], + .data[[i_var]][.data[[.col]] == levels(.data[[.col]])[2]] + ) + dist_vec <- c(dist_vec, 1 - overlapping::overlap(vals_list)$OV) } - names(dist_vec)<- num_vars + names(dist_vec) <- num_vars dist_vec[order(dist_vec, decreasing = TRUE)] } else { - stop("to use this function, first install package 'overlapping' with\n", - "install.packages('overlapping')") + stop( + "to use this function, first install package 'overlapping' with\n", + "install.packages('overlapping')" + ) } } diff --git a/R/explain_tidysdm.R b/R/explain_tidysdm.R index 983fcab4..de3cea83 100644 --- a/R/explain_tidysdm.R +++ b/R/explain_tidysdm.R @@ -4,32 +4,33 @@ #' methods. This function creates a DALEX explainer (see [DALEX::explain()]), which can then be queried #' by multiple function to create explanations of the model. #' @inheritParams DALEX::explain -#' @param by_workflow boolean determing whether a list of explainer, one per model, +#' @param by_workflow boolean determining whether a list of explainer, one per model, #' should be returned instead of a single explainer for the ensemble #' @return explainer object [`DALEX::explain`] ready to work with DALEX #' @export #' @examples +#' \donttest{ #' # using the whole ensemble #' lacerta_explainer <- explain_tidysdm(tidysdm::lacerta_ensemble) #' # by workflow -#' explainer_list <- explain_tidysdm(tidysdm::lacerta_ensemble, -#' by_workflow = TRUE) -#' - -explain_tidysdm <- function (model, - data, - y, - predict_function, - predict_function_target_column, - residual_function, - ..., - label, - verbose, - precalculate, - colorize, - model_info, - type, - by_workflow) { +#' explainer_list <- explain_tidysdm(tidysdm::lacerta_ensemble, +#' by_workflow = TRUE +#' ) +#' } +explain_tidysdm <- function(model, + data, + y, + predict_function, + predict_function_target_column, + residual_function, + ..., + label, + verbose, + precalculate, + colorize, + model_info, + type, + by_workflow) { UseMethod("explain_tidysdm", object = model) } @@ -49,9 +50,7 @@ explain_tidysdm.default <- function( colorize = !isTRUE(getOption("knitr.in.progress")), model_info = NULL, type = "classification", - by_workflow = FALSE -) -{ + by_workflow = FALSE) { stop("no method defined for this object type") } @@ -71,9 +70,8 @@ explain_tidysdm.simple_ensemble <- function( colorize = !isTRUE(getOption("knitr.in.progress")), model_info = NULL, type = "classification", - by_workflow = FALSE -) { - if (by_workflow){ + by_workflow = FALSE) { + if (by_workflow) { explain_simple_ensemble_by_workflow( model = model, data = data, @@ -87,24 +85,26 @@ explain_tidysdm.simple_ensemble <- function( precalculate = precalculate, colorize = colorize, model_info = model_info, - type = type) - } else { - explain_simple_ensemble( - model = model, - data = data, - y = y, - predict_function = predict_function, - predict_function_target_column = predict_function_target_column, - residual_function = residual_function, - weights = NULL, - label = label, - verbose = verbose, - precalculate = precalculate, - colorize = colorize, - model_info = model_info, - type = type) - } + type = type + ) + } else { + explain_simple_ensemble( + model = model, + data = data, + y = y, + predict_function = predict_function, + predict_function_target_column = predict_function_target_column, + residual_function = residual_function, + weights = NULL, + label = label, + verbose = verbose, + precalculate = precalculate, + colorize = colorize, + model_info = model_info, + type = type + ) } +} #' @rdname explain_tidysdm #' @export @@ -122,12 +122,11 @@ explain_tidysdm.repeat_ensemble <- function( colorize = !isTRUE(getOption("knitr.in.progress")), model_info = NULL, type = "classification", - by_workflow = FALSE -) { + by_workflow = FALSE) { # we change the names of the workflows to combine with the repeat ids - model$workflow_id <- paste(model$rep_id,model$wflow_id, sep=".") + model$workflow_id <- paste(model$rep_id, model$wflow_id, sep = ".") class(model)[1] <- "simple_ensemble" - explain_tidysdm ( + explain_tidysdm( model = model, data = data, y = y, @@ -141,7 +140,8 @@ explain_tidysdm.repeat_ensemble <- function( colorize = colorize, model_info = model_info, type = type, - by_workflow = by_workflow) + by_workflow = by_workflow + ) } explain_simple_ensemble <- function( @@ -157,25 +157,24 @@ explain_simple_ensemble <- function( precalculate = TRUE, colorize = !isTRUE(getOption("knitr.in.progress")), model_info = NULL, - type = "classification" -) { - if (type!="classification"){ + type = "classification") { + if (type != "classification") { stop("type has to be classification for a tidysdm ensemble") } - if (is.null(data)){ - data = workflowsets::extract_mold(model$workflow[[1]])$predictors + if (is.null(data)) { + data <- workflowsets::extract_mold(model$workflow[[1]])$predictors } - if (is.null(y)){ + if (is.null(y)) { # note that we need presences to be 1 and absences to be zero - y <- (as.numeric(workflowsets::extract_mold(model$workflow[[1]])$outcomes %>% dplyr::pull())-2)*-1 + y <- (as.numeric(workflowsets::extract_mold(model$workflow[[1]])$outcomes %>% dplyr::pull()) - 2) * -1 } else { - if (!is.factor(y)){ + if (!is.factor(y)) { stop("y should be a factor with presences as reference levels") } else { - y <- (as.numeric(y)-2)*-1 + y <- (as.numeric(y) - 2) * -1 } } - if (is.null(predict_function)){ + if (is.null(predict_function)) { predict_function <- function(model, newdata) { stats::predict(model, newdata)$mean } @@ -202,14 +201,15 @@ explain_simple_ensemble <- function( #' @importFrom DALEX model_info #' @export #' @method model_info simple_ensemble -model_info.simple_ensemble<- function(model, is_multiclass = FALSE, ...){ - if (is_multiclass){ +model_info.simple_ensemble <- function(model, is_multiclass = FALSE, ...) { + if (is_multiclass) { stop("tidysdm simple_ensembles can not be multiclass") } package <- "tidysdm" type <- "classification" - ver <- try(as.character(utils::packageVersion(package)), - silent = TRUE) + ver <- try(as.character(utils::packageVersion(package)), + silent = TRUE + ) if (inherits(ver, "try-error")) { ver <- "Unknown" } @@ -222,14 +222,15 @@ model_info.simple_ensemble<- function(model, is_multiclass = FALSE, ...){ #' @importFrom DALEX model_info #' @export #' @method model_info repeat_ensemble -model_info.repeat_ensemble<- function(model, is_multiclass = FALSE, ...){ - if (is_multiclass){ +model_info.repeat_ensemble <- function(model, is_multiclass = FALSE, ...) { + if (is_multiclass) { stop("tidysdm repeat_ensembles can not be multiclass") } package <- "tidysdm" type <- "classification" - ver <- try(as.character(utils::packageVersion(package)), - silent = TRUE) + ver <- try(as.character(utils::packageVersion(package)), + silent = TRUE + ) if (inherits(ver, "try-error")) { ver <- "Unknown" } @@ -252,29 +253,28 @@ explain_simple_ensemble_by_workflow <- function( precalculate = TRUE, colorize = !isTRUE(getOption("knitr.in.progress")), model_info = NULL, - type = "classification" -) { - if (type!="classification"){ + type = "classification") { + if (type != "classification") { stop("type has to be classification for a tidysdm ensemble") } explainer_list <- list() - for (i in 1:nrow(model)){ - if (is.null(data)){ + for (i in seq_len(nrow(model))) { + if (is.null(data)) { data_train <- workflowsets::extract_mold(model$workflow[[i]])$predictors } else { - data_train = data + data_train <- data } - if (is.null(y)){ - data_response <- as.numeric(workflowsets::extract_mold(model$workflow[[i]])$outcomes %>% dplyr::pull())-1 + if (is.null(y)) { + data_response <- as.numeric(workflowsets::extract_mold(model$workflow[[i]])$outcomes %>% dplyr::pull()) - 1 } else { data_response <- y } - - explainer_list[[i]] <- + + explainer_list[[i]] <- DALEXtra::explain_tidymodels( - model$workflow[[i]], - data= data_train, - y=data_response, + model$workflow[[i]], + data = data_train, + y = data_response, predict_function = predict_function, predict_function_target_column = predict_function_target_column, residual_function = residual_function, @@ -283,8 +283,8 @@ explain_simple_ensemble_by_workflow <- function( precalculate = precalculate, colorize = colorize, model_info = model_info, - type = "classification") + type = "classification" + ) } return(explainer_list) } - diff --git a/R/filter_high_cor.R b/R/filter_high_cor.R index 03b7b55b..5ed85f0e 100644 --- a/R/filter_high_cor.R +++ b/R/filter_high_cor.R @@ -1,6 +1,6 @@ #' Filter to retain only variables below a given correlation threshold #' -#' This method finds a subset of variable such that all have a correlation +#' This method finds a subset of variable such that all have a correlation #' below a certain cutoff. There are methods for [`terra::SpatRaster`], #' [`data.frame`], and to work directly on a correlation matrix that was #' previously estimated. For `data.frame`, only numeric variables will be @@ -23,19 +23,19 @@ #' the column index `FALSE`)? #' @param to_keep A vector of variable names that we want to force in the set #' (note that the function will return an error if the correlation among any of -#' those varialbes is higher thna the cutoff). +#' those variables is higher than the cutoff). #' @returns A vector of names of columns that are below the correlation threshold -#' (when \code{names = TRUE}), otherwise a vector of indices. Note that the indeces -#' are only for numeric variables (i.e. if factors are present, the indeces do +#' (when \code{names = TRUE}), otherwise a vector of indices. Note that the indices +#' are only for numeric variables (i.e. if factors are present, the indices do #' not take them into account). #' #' @export -filter_high_cor <- function (x, - cutoff = 0.7, - verbose = FALSE, - names = TRUE, - to_keep = NULL) { +filter_high_cor <- function(x, + cutoff = 0.7, + verbose = FALSE, + names = TRUE, + to_keep = NULL) { UseMethod("filter_high_cor", object = x) } @@ -44,7 +44,7 @@ filter_high_cor <- function (x, filter_high_cor.default <- function(x, cutoff = 0.7, verbose = FALSE, names = TRUE, - to_keep = NULL){ + to_keep = NULL) { stop("no method available for this object type") } @@ -52,106 +52,112 @@ filter_high_cor.default <- function(x, cutoff = 0.7, #' @rdname filter_high_cor #' @export filter_high_cor.SpatRaster <- - function (x, - cutoff = 0.7, - verbose = FALSE, - names = TRUE, - to_keep = NULL) { - cor_matrix <- terra::layerCor(x, "pearson", na.rm = TRUE)$pearson - dimnames(cor_matrix) <- list(names(x), names(x)) - filter_high_cor(x = cor_matrix, - cutoff = cutoff, - verbose = verbose, - names = names, - to_keep) -} - + function(x, + cutoff = 0.7, + verbose = FALSE, + names = TRUE, + to_keep = NULL) { + cor_matrix <- terra::layerCor(x, "pearson", na.rm = TRUE)$pearson + dimnames(cor_matrix) <- list(names(x), names(x)) + filter_high_cor( + x = cor_matrix, + cutoff = cutoff, + verbose = verbose, + names = names, + to_keep + ) + } + #' @rdname filter_high_cor #' @export filter_high_cor.data.frame <- - function (x, - cutoff = 0.7, - verbose = FALSE, - names = TRUE, - to_keep = NULL) { - x <- x %>% dplyr::select(dplyr::where(is.numeric)) %>% + function(x, + cutoff = 0.7, + verbose = FALSE, + names = TRUE, + to_keep = NULL) { + x <- x %>% + dplyr::select(dplyr::where(is.numeric)) %>% sf::st_drop_geometry() cor_matrix <- stats::cor(x) - filter_high_cor(x = cor_matrix, - cutoff = cutoff, - verbose = verbose, - names = names, - to_keep = to_keep) - } + filter_high_cor( + x = cor_matrix, + cutoff = cutoff, + verbose = verbose, + names = names, + to_keep = to_keep + ) + } #' @rdname filter_high_cor #' @export filter_high_cor.matrix <- - function (x, - cutoff = 0.7, - verbose = FALSE, - names = TRUE, - to_keep = NULL) { - - if (!isTRUE(all.equal(x, t(x)))) + function(x, + cutoff = 0.7, + verbose = FALSE, + names = TRUE, + to_keep = NULL) { + if (!isTRUE(all.equal(x, t(x)))) { stop("correlation matrix is not symmetric") - if (dim(x)[1] == 1) + } + if (dim(x)[1] == 1) { stop("only one variable given") - + } + var_names <- dimnames(x)[[1]] - diag(x)<-NA + diag(x) <- NA # if we have some variables to force in - if (!is.null(to_keep)){ - if (!any(to_keep %in% var_names)){ - stop ("to_keep should only include numeric variables in x") + if (!is.null(to_keep)) { + if (!any(to_keep %in% var_names)) { + stop("to_keep should only include numeric variables in x") } - if (length(to_keep)>1){ + if (length(to_keep) > 1) { x_keep <- x[to_keep, to_keep] - #diag(x_keep)<-NA - if (any(x_keep>cutoff, na.rm = TRUE)){ + # diag(x_keep)<-NA + if (any(x_keep > cutoff, na.rm = TRUE)) { stop("some variables in `to_keep` have a correlation higher than the `cutoff`") } - max_cor_vs_keep <- apply(abs(x[,to_keep]),1,max,na.rm=TRUE) + max_cor_vs_keep <- apply(abs(x[, to_keep]), 1, max, na.rm = TRUE) } else { # if only 1 var to keep, we just need to take the abs value of correlations - max_cor_vs_keep <- abs(x[,to_keep]) + max_cor_vs_keep <- abs(x[, to_keep]) } # remove variables that are too highly correlated with variables to keep - - x <- x[!var_names %in% names(which(max_cor_vs_keep > cutoff)), - !var_names %in% names(which(max_cor_vs_keep > cutoff))] + + x <- x[ + !var_names %in% names(which(max_cor_vs_keep > cutoff)), + !var_names %in% names(which(max_cor_vs_keep > cutoff)) + ] x <- x[!dimnames(x)[[1]] %in% to_keep, !dimnames(x)[[1]] %in% to_keep] - } - filter_output <- filter_high_cor_algorithm(x = x, - cutoff = cutoff, - verbose = verbose) - if (!is.null(to_keep)){ + filter_output <- filter_high_cor_algorithm( + x = x, + cutoff = cutoff, + verbose = verbose + ) + if (!is.null(to_keep)) { to_remove <- attr(filter_output, "to_remove") filter_output <- c(to_keep, filter_output) - attr(filter_output, "to_remove")<- to_remove + attr(filter_output, "to_remove") <- to_remove } - - if (!names){ - # return their indices - to_remove <- match(attr(filter_output, "to_remove"), var_names) - filter_output <- match(filter_output, var_names) - attr(filter_output, "to_remove")<- to_remove + + if (!names) { + # return their indices + to_remove <- match(attr(filter_output, "to_remove"), var_names) + filter_output <- match(filter_output, var_names) + attr(filter_output, "to_remove") <- to_remove + } + return(filter_output) } - return(filter_output) - -} #' @rdname filter_high_cor #' @export # this funciton is only ever called from the cor.matrix method filter_high_cor_algorithm <- - function (x, - cutoff = 0.7, - verbose = FALSE) { - - + function(x, + cutoff = 0.7, + verbose = FALSE) { var_num <- dim(x)[1] var_names <- dimnames(x)[[1]] @@ -161,8 +167,9 @@ filter_high_cor_algorithm <- original_order <- 1:var_num average_corr <- - function(x) + function(x) { mean(x, na.rm = TRUE) + } tmp <- x diag(tmp) <- NA @@ -179,18 +186,20 @@ filter_high_cor_algorithm <- for (i in 1:(var_num - 1)) { if (!any(x2[!is.na(x2)] > cutoff)) { - if (verbose) + if (verbose) { message("All correlations <=", cutoff, "\n") + } break() } - if (col_to_delete[i]) + if (col_to_delete[i]) { next + } for (j in (i + 1):var_num) { if (!col_to_delete[i] & !col_to_delete[j]) { if (x[i, j] > cutoff) { mn1 <- mean(x2[i, ], na.rm = TRUE) mn2 <- mean(x2[-j, ], na.rm = TRUE) - if (verbose) + if (verbose) { message( "Compare row", newOrder[i], @@ -200,30 +209,33 @@ filter_high_cor_algorithm <- round(x[i, j], 3), "\n" ) - if (verbose) + } + if (verbose) { message(" Means: ", round(mn1, 3), "vs", round(mn2, 3)) + } if (mn1 > mn2) { col_to_delete[i] <- TRUE - x2[i,] <- NA + x2[i, ] <- NA x2[, i] <- NA - if (verbose) + if (verbose) { message(" so flagging column", newOrder[i], "\n") - } - else { + } + } else { col_to_delete[j] <- TRUE - x2[j,] <- NA + x2[j, ] <- NA x2[, j] <- NA - if (verbose) + if (verbose) { message(" so flagging column", newOrder[j], "\n") + } } } } } } - - # return variable names - passed_filter <- var_names[newOrder][!col_to_delete] - attr(passed_filter, "to_remove")<- var_names[!var_names %in% passed_filter] + + # return variable names + passed_filter <- var_names[newOrder][!col_to_delete] + attr(passed_filter, "to_remove") <- var_names[!var_names %in% passed_filter] return(passed_filter) - } + } diff --git a/R/gam_formula.R b/R/gam_formula.R index 466d0890..080e84e8 100644 --- a/R/gam_formula.R +++ b/R/gam_formula.R @@ -7,25 +7,31 @@ #' @param k the *k* value for the smooth #' @returns a formula #' @export -gam_formula<-function(object, k=10){ - base_formula <- object %>% recipes::prep() %>% stats::formula() +gam_formula <- function(object, k = 10) { + base_formula <- object %>% + recipes::prep() %>% + stats::formula() predictors <- rsample::form_pred(base_formula) # Now check which predictors are numeric, and thus should be used in smooths - predictors_type <- object$var_info$type[match(predictors, - object$var_info$variable)] + predictors_type <- object$var_info$type[match( + predictors, + object$var_info$variable + )] predictors_numeric <- predictors[!is.na( unlist( - lapply(predictors_type, function(table) match("numeric",table))))] - if (length(predictors_numeric)>1){ - rhs <- paste0("s(", predictors, ", k = ",k,")",collapse=" + ") + lapply(predictors_type, function(table) match("numeric", table)) + ) + )] + if (length(predictors_numeric) > 1) { + rhs <- paste0("s(", predictors, ", k = ", k, ")", collapse = " + ") } else { stop("there are no numeric predictors; a gam does not really make much sense...") } predictors_factor <- predictors[!predictors %in% predictors_numeric] - if (length(predictors_factor)){ - rhs<-paste(rhs,predictors_factor, collapse = "+") + if (length(predictors_factor)) { + rhs <- paste(rhs, predictors_factor, collapse = "+") } - stats::formula(paste (form_resp(base_formula), "~", rhs)) + stats::formula(paste(form_resp(base_formula), "~", rhs)) } #' Get the response variable from a formula @@ -39,10 +45,10 @@ gam_formula<-function(object, k=10){ #' @param x a formula #' @returns character the name of the response #' @keywords internal -form_resp <- function(x){ - if (attr(stats::terms(x), which = 'response')){ +form_resp <- function(x) { + if (attr(stats::terms(x), which = "response")) { all.vars(x)[1] - } else{ + } else { NULL } } diff --git a/R/geom_split_violin.R b/R/geom_split_violin.R index e6176803..61a6ade4 100644 --- a/R/geom_split_violin.R +++ b/R/geom_split_violin.R @@ -15,15 +15,20 @@ #' allotted to a given factor on the x-axis. #' @returns a [`ggplot2::layer`] object #' @examples -#' data("bradypus", package="maxnet") -#' bradypus_tb <- tibble::as_tibble(bradypus) %>% dplyr::mutate(presence = relevel(factor( -#' dplyr::case_match (presence, 1~"presence",0 ~"absence")), -#' ref="presence")) +#' data("bradypus", package = "maxnet") +#' bradypus_tb <- tibble::as_tibble(bradypus) %>% dplyr::mutate(presence = relevel( +#' factor( +#' dplyr::case_match(presence, 1 ~ "presence", 0 ~ "absence") +#' ), +#' ref = "presence" +#' )) #' -#' ggplot(bradypus_tb, aes(x = "", -#' y= cld6190_ann, -#' fill = presence)) + -#' geom_split_violin(nudge=0.01) +#' ggplot(bradypus_tb, aes( +#' x = "", +#' y = cld6190_ann, +#' fill = presence +#' )) + +#' geom_split_violin(nudge = 0.01) #' #' @export @@ -40,21 +45,24 @@ geom_split_violin <- function(mapping = NULL, na.rm = FALSE, show.legend = NA, inherit.aes = TRUE) { - - ggplot2::layer(data = data, - mapping = mapping, - stat = stat, - geom = GeomSplitViolin, - position = position, - show.legend = show.legend, - inherit.aes = inherit.aes, - params = list(trim = trim, - scale = scale, - # don't forget the nudge - nudge = nudge, - draw_quantiles = draw_quantiles, - na.rm = na.rm, - ...)) + ggplot2::layer( + data = data, + mapping = mapping, + stat = stat, + geom = GeomSplitViolin, + position = position, + show.legend = show.legend, + inherit.aes = inherit.aes, + params = list( + trim = trim, + scale = scale, + # don't forget the nudge + nudge = nudge, + draw_quantiles = draw_quantiles, + na.rm = na.rm, + ... + ) + ) } #' @keywords internal @@ -68,43 +76,56 @@ GeomSplitViolin <- ggplot2::ggproto( nudge = 0, draw_quantiles = NULL) { data <- transform(data, - xminv = x - violinwidth * (x - xmin), - xmaxv = x + violinwidth * (xmax - x)) + xminv = x - violinwidth * (x - xmin), + xmaxv = x + violinwidth * (xmax - x) + ) grp <- data[1, "group"] - newdata <- dplyr::arrange(transform(data, - x = if (grp %% 2 == 1) xminv else xmaxv), - if (grp %% 2 == 1) y else -y) - newdata <- rbind(newdata[1, ], - newdata, - newdata[nrow(newdata), ], - newdata[1, ]) - newdata[c(1, nrow(newdata)-1, nrow(newdata)), "x"] <- round(newdata[1, "x"]) + newdata <- dplyr::arrange( + transform(data, + x = if (grp %% 2 == 1) xminv else xmaxv + ), + if (grp %% 2 == 1) y else -y + ) + newdata <- rbind( + newdata[1, ], + newdata, + newdata[nrow(newdata), ], + newdata[1, ] + ) + newdata[c(1, nrow(newdata) - 1, nrow(newdata)), "x"] <- round(newdata[1, "x"]) # now nudge them apart newdata$x <- ifelse(newdata$group %% 2 == 1, - newdata$x - nudge, - newdata$x + nudge) + newdata$x - nudge, + newdata$x + nudge + ) if (length(draw_quantiles) > 0 & !scales::zero_range(range(data$y))) { - stopifnot(all(draw_quantiles >= 0), all(draw_quantiles <= 1)) - quantiles <- ggplot2:::create_quantile_segment_frame(data, - draw_quantiles) + quantiles <- ggplot2:::create_quantile_segment_frame( + data, + draw_quantiles + ) aesthetics <- data[rep(1, nrow(quantiles)), - setdiff(names(data), c("x", "y")), - drop = FALSE] + setdiff(names(data), c("x", "y")), + drop = FALSE + ] aesthetics$alpha <- rep(1, nrow(quantiles)) both <- cbind(quantiles, aesthetics) quantile_grob <- ggplot2::GeomPath$draw_panel(both, ...) - ggplot2:::ggname("geom_split_violin", - grid::grobTree(ggplot2::GeomPolygon$draw_panel(newdata, ...), - quantile_grob)) - } - else { - ggplot2:::ggname("geom_split_violin", - ggplot2::GeomPolygon$draw_panel(newdata, ...)) + ggplot2:::ggname( + "geom_split_violin", + grid::grobTree( + ggplot2::GeomPolygon$draw_panel(newdata, ...), + quantile_grob + ) + ) + } else { + ggplot2:::ggname( + "geom_split_violin", + ggplot2::GeomPolygon$draw_panel(newdata, ...) + ) } } ) - diff --git a/R/grid_cellsize.R b/R/grid_cellsize.R index 4b97f407..74ce73de 100644 --- a/R/grid_cellsize.R +++ b/R/grid_cellsize.R @@ -14,15 +14,13 @@ #' @returns the cell size #' @export -grid_cellsize<-function( - data, - n=c(10,10) -){ +grid_cellsize <- function( + data, + n = c(10, 10)) { # TODO check that this is an sf object grid_box <- sf::st_bbox(data) if (utils::getFromNamespace("is_longlat", "spatialsample")(data)) { grid_box <- utils::getFromNamespace("expand_grid", "spatialsample")(grid_box) } - c(diff(sf::st_bbox(grid_box)[c(1, 3)]), diff(sf::st_bbox(grid_box)[c(2, 4)]))/n + c(diff(sf::st_bbox(grid_box)[c(1, 3)]), diff(sf::st_bbox(grid_box)[c(2, 4)])) / n } - diff --git a/R/grid_offset.R b/R/grid_offset.R index 58889414..d3d543c9 100644 --- a/R/grid_offset.R +++ b/R/grid_offset.R @@ -12,9 +12,8 @@ #' @returns the grid offset #' @export -grid_offset<-function( - data -){ +grid_offset <- function( + data) { # TODO check that this is an sf object grid_box <- sf::st_bbox(data) if (utils::getFromNamespace("is_longlat", "spatialsample")(data)) { diff --git a/R/kap_max.R b/R/kap_max.R index 538c1ce7..a6963028 100644 --- a/R/kap_max.R +++ b/R/kap_max.R @@ -13,17 +13,17 @@ #' and estimate arguments, or a table/matrix where the true class #' results should be in the columns of the table. #' @param ... A set of unquoted column names or one or more dplyr selector functions to choose which variables contain the class probabilities. If truth is binary, only 1 column should be selected, and it should correspond to the value of event_level. Otherwise, there should be as many columns as factor levels of truth and the ordering of the columns should be the same as the factor levels of truth. -#' @param truth The column identifier for the true class results (that is a factor). This should be an unquoted column name although this argument is passed by expression and supports quasiquotation (you can unquote column names). For ⁠_vec()⁠ functions, a factor vector. +#' @param truth The column identifier for the true class results (that is a factor). This should be an unquoted column name although this argument is passed by expression and supports quasiquotation (you can unquote column names). For _vec() functions, a factor vector. #' @param estimator One of "binary", "hand_till", "macro", or "macro_weighted" to specify the type of averaging to be done. "binary" is only relevant for the two class case. The others are general methods for calculating multiclass metrics. The default will automatically choose "binary" if truth is binary, "hand_till" if truth has >2 levels and case_weights isn't specified, or "macro" if truth has >2 levels and case_weights is specified (in which case "hand_till" isn't well-defined). #' @param na_rm A logical value indicating whether NA values should be stripped before the computation proceeds. #' @param event_level A single string. Either "first" or "second" to specify which level of truth to consider as the "event". This argument is only applicable when estimator = "binary". The default uses an internal helper that generally defaults to "first" -#' @param case_weights The optional column identifier for case weights. This should be an unquoted column name that evaluates to a numeric column in data. For ⁠_vec()⁠ functions, a numeric vector. +#' @param case_weights The optional column identifier for case weights. This should be an unquoted column name that evaluates to a numeric column in data. For _vec() functions, a numeric vector. #' @param estimate If truth is binary, a numeric vector of class probabilities corresponding to the "relevant" class. Otherwise, a matrix with as many columns as factor levels of truth. It is assumed that these are in the same order as the levels of truth. #' @returns A tibble with columns .metric, .estimator, and .estimate and 1 row of values. #' For grouped data frames, the number of rows returned will be the same as the #' number of groups. #' @family class probability metrics -#' +#' #' @references #' Cohen, J. (1960). "A coefficient of agreement for nominal #' scales". _Educational and Psychological Measurement_. 20 (1): 37-46. @@ -68,20 +68,22 @@ kap_max.data.frame <- function(data, #' @rdname kap_max #' @export -kap_max.sf <- function(data,...){ - data %>% dplyr::as_tibble() %>% kap_max(...) +kap_max.sf <- function(data, ...) { + data %>% + dplyr::as_tibble() %>% + kap_max(...) } #' @export #' @rdname kap_max kap_max_vec <- function(truth, - estimate, - estimator = NULL, - na_rm = TRUE, - event_level = "first", - case_weights = NULL, - ...) { + estimate, + estimator = NULL, + na_rm = TRUE, + event_level = "first", + case_weights = NULL, + ...) { utils::getFromNamespace("abort_if_class_pred", "yardstick")(truth) estimator <- yardstick::finalize_estimator(truth, estimator, "kap_max") @@ -107,10 +109,10 @@ kap_max_vec <- function(truth, } kap_max_estimator_impl <- function(truth, - estimate, - estimator, - event_level, - case_weights) { + estimate, + estimator, + event_level, + case_weights) { if (!utils::getFromNamespace("is_binary", "yardstick")(estimator)) { stop("kap_max is only available for binary classes; multiclass is not supported") } @@ -122,23 +124,21 @@ kap_max_estimator_impl <- function(truth, pres_level <- levels(truth)[2] absence_level <- levels(truth)[1] } - presences <- estimate[truth==pres_level] - absences <- estimate[truth==absence_level] + presences <- estimate[truth == pres_level] + absences <- estimate[truth == absence_level] # TODO we could implement case weights by properly fitting kap from yardstick - if (!is.null(case_weights)){ + if (!is.null(case_weights)) { stop("kap_max with case_weights has not been implemented yet") } - + conf_matrix_df <- conf_matrix_df(presences, absences) - n <- rowSums(conf_matrix_df[,2:5]) + n <- rowSums(conf_matrix_df[, 2:5]) obs_accuracy <- (conf_matrix_df$tp + conf_matrix_df$tn) / n exp_accuracy <- (((conf_matrix_df$tn + conf_matrix_df$fp) * - (conf_matrix_df$tn + conf_matrix_df$fn) /n ) + + (conf_matrix_df$tn + conf_matrix_df$fn) / n) + ((conf_matrix_df$tp + conf_matrix_df$fn) * - (conf_matrix_df$tp + conf_matrix_df$fp) /n ))/n - kap = (obs_accuracy - exp_accuracy)/(1 - exp_accuracy) + (conf_matrix_df$tp + conf_matrix_df$fp) / n)) / n + kap <- (obs_accuracy - exp_accuracy) / (1 - exp_accuracy) max(kap) ## return the maximum kap } - - diff --git a/R/km2m.R b/R/km2m.R index 400ee0da..240bca83 100644 --- a/R/km2m.R +++ b/R/km2m.R @@ -11,6 +11,6 @@ #' #' @export -km2m <- function(x){ +km2m <- function(x) { x * 1000 } diff --git a/R/make_maxent.R b/R/make_maxent.R index 5583bbe2..8865da46 100644 --- a/R/make_maxent.R +++ b/R/make_maxent.R @@ -12,7 +12,7 @@ make_maxent <- function() { ) parsnip::set_dependency("maxent", eng = "maxnet", pkg = "maxnet") parsnip::set_dependency("maxent", eng = "maxnet", pkg = "tidysdm") - + parsnip::set_model_arg( model = "maxent", eng = "maxnet", @@ -21,7 +21,7 @@ make_maxent <- function() { func = list(pkg = "tidysdm", fun = "feature_classes"), has_submodel = FALSE ) - + parsnip::set_model_arg( model = "maxent", eng = "maxnet", @@ -30,7 +30,7 @@ make_maxent <- function() { func = list(pkg = "tidysdm", fun = "regularization_multiplier"), has_submodel = FALSE ) - + parsnip::set_fit( model = "maxent", eng = "maxnet", @@ -42,7 +42,7 @@ make_maxent <- function() { defaults = list() ) ) - + parsnip::set_encoding( model = "maxent", eng = "maxnet", @@ -54,20 +54,20 @@ make_maxent <- function() { allow_sparse_x = FALSE ) ) - + class_info <- list( pre = NULL, - post = function(x,object){ - class_vect<-rep(object$lvl[2],length(x)) - class_vect[x==1]<- object$lvl[1] - class_vect <- stats::relevel(factor(class_vect),ref=object$lvl[1]) + post = function(x, object) { + class_vect <- rep(object$lvl[2], length(x)) + class_vect[x == 1] <- object$lvl[1] + class_vect <- stats::relevel(factor(class_vect), ref = object$lvl[1]) tibble::tibble(class = class_vect) }, - func = c(pkg="tidysdm", fun = "maxnet_predict"), + func = c(pkg = "tidysdm", fun = "maxnet_predict"), args = - # These lists should be of the form: - # {predict.maxnet argument name} = {values provided from parsnip objects} + # These lists should be of the form: + # {predict.maxnet argument name} = {values provided from parsnip objects} list( # We don't want the first two arguments evaluated right now # since they don't exist yet. `type` is a simple object that @@ -77,7 +77,7 @@ make_maxent <- function() { type = "class" ) ) - + parsnip::set_pred( model = "maxent", eng = "maxnet", @@ -85,21 +85,23 @@ make_maxent <- function() { type = "class", value = class_info ) - + prob_info <- parsnip::pred_value_template( post = function(x, object) { - tibble::tibble("{object$lvl[1]}" := as.vector(x), - "{object$lvl[2]}" := 1-as.vector(x)) + tibble::tibble( + "{object$lvl[1]}" := as.vector(x), + "{object$lvl[2]}" := 1 - as.vector(x) + ) }, - func = c(pkg="tidysdm", fun = "maxnet_predict"), + func = c(pkg = "tidysdm", fun = "maxnet_predict"), # Now everything else is put into the `args` slot object = quote(object$fit), newdata = quote(new_data), type = "prob" - #TODO do we add here maxent_type and clamp??? + # TODO do we add here maxent_type and clamp??? ) - + parsnip::set_pred( model = "maxent", eng = "maxnet", diff --git a/R/maxent.R b/R/maxent.R index 3c818c56..5b7ea380 100644 --- a/R/maxent.R +++ b/R/maxent.R @@ -14,34 +14,42 @@ #' @param regularization_multiplier numeric, a constant to adjust regularization #' @returns a [`model_spec`] for a `maxent` model #' @examples +#' \donttest{ #' # format the data -#' data("bradypus", package="maxnet") -#' bradypus_tb <- tibble::as_tibble(bradypus) %>% dplyr::mutate(presence = relevel(factor( -#' dplyr::case_match (presence, 1~"presence",0 ~"absence")), -#' ref="presence")) %>% select(-ecoreg) +#' data("bradypus", package = "maxnet") +#' bradypus_tb <- tibble::as_tibble(bradypus) %>% +#' dplyr::mutate(presence = relevel( +#' factor( +#' dplyr::case_match(presence, 1 ~ "presence", 0 ~ "absence") +#' ), +#' ref = "presence" +#' )) %>% +#' select(-ecoreg) #' #' # fit the model, and make some predictions #' maxent_spec <- maxent(feature_classes = "lq") #' maxent_fitted <- maxent_spec %>% #' fit(presence ~ ., data = bradypus_tb) -#' pred_prob <-predict(maxent_fitted,new_data = bradypus[,-1], type="prob") -#' pred_class <- predict(maxent_fitted,new_data = bradypus[,-1], type="class") +#' pred_prob <- predict(maxent_fitted, new_data = bradypus[, -1], type = "prob") +#' pred_class <- predict(maxent_fitted, new_data = bradypus[, -1], type = "class") #' #' # Now with tuning -#' maxent_spec <- maxent(regularization_multiplier = tune(), -#' feature_classes = tune()) +#' maxent_spec <- maxent( +#' regularization_multiplier = tune(), +#' feature_classes = tune() +#' ) #' set.seed(452) -#' cv <- vfold_cv(bradypus_tb, v=2) +#' cv <- vfold_cv(bradypus_tb, v = 2) #' maxent_tune_res <- maxent_spec %>% #' tune_grid(presence ~ ., cv, grid = 3) #' show_best(maxent_tune_res, metric = "roc_auc") -#' +#' } #' @export maxent <- - function(mode = "classification", engine = "maxnet", feature_classes = NULL, + function(mode = "classification", engine = "maxnet", feature_classes = NULL, regularization_multiplier = NULL) { # Check for correct mode - if (mode != "classification") { + if (mode != "classification") { rlang::abort("`mode` should be 'classification'") } @@ -50,8 +58,10 @@ maxent <- } # Capture the arguments in quosures - args <- list(feature_classes = rlang::enquo(feature_classes), - regularization_multiplier = regularization_multiplier) + args <- list( + feature_classes = rlang::enquo(feature_classes), + regularization_multiplier = regularization_multiplier + ) # Save some empty slots for future parts of the specification parsnip::new_model_spec( @@ -67,11 +77,10 @@ maxent <- #' @export update.maxent <- function(object, - parameters = NULL, - feature_classes = NULL, - regularization_multiplier = NULL, - fresh = FALSE, ...) { - + parameters = NULL, + feature_classes = NULL, + regularization_multiplier = NULL, + fresh = FALSE, ...) { args <- list( feature_classes = rlang::enquo(feature_classes), regularization_multiplier = rlang::enquo(regularization_multiplier) @@ -87,4 +96,4 @@ update.maxent <- function(object, ) } -# see make_maxent for the function to register the model with parsnip \ No newline at end of file +# see make_maxent for the function to register the model with parsnip diff --git a/R/maxent_params.R b/R/maxent_params.R index ab953c83..b1e2d753 100644 --- a/R/maxent_params.R +++ b/R/maxent_params.R @@ -34,7 +34,7 @@ regularization_multiplier <- function(range = c(0.5, 3), trans = NULL) { #' @rdname maxent_params #' @export -feature_classes <- function(values=c("l","lq","lqp","lqph","lqpht")){ +feature_classes <- function(values = c("l", "lq", "lqp", "lqph", "lqpht")) { dials::new_qual_param( type = c("character"), values = values, @@ -47,11 +47,12 @@ feature_classes <- function(values=c("l","lq","lqp","lqph","lqpht")){ tunable.maxent <- function(x, ...) { tibble::tibble( name = c("regularization_multiplier", "feature_classes"), - call_info = list(list(pkg = NULL, fun = "regularization_multiplier"), - list(pkg = NULL, fun = "feature_classes")), + call_info = list( + list(pkg = NULL, fun = "regularization_multiplier"), + list(pkg = NULL, fun = "feature_classes") + ), source = "model_spec", component = "maxent", component_id = "main" ) } - diff --git a/R/maxnet_fit.R b/R/maxnet_fit.R index 5638a3b2..fb676e97 100644 --- a/R/maxnet_fit.R +++ b/R/maxnet_fit.R @@ -6,7 +6,8 @@ #' `parsnip` model specification for MaxEnt, see [maxent()]. #' #' The response needs to be a factor with the class representing presences -#' as the reference level of the factor (as expected by other classification models). +#' as the reference level of the factor (as expected by other +#' classification models). #' A good guide to how options of a Maxent model work can be found in #' https://onlinelibrary.wiley.com/doi/full/10.1111/j.1600-0587.2013.07872.x #' @@ -21,9 +22,10 @@ #' @param ... currently not used. #' @returns Maxnet returns an object of class \code{maxnet}, which is a list #' consisting of a glmnet model with the following elements added: -#'\describe{ +#' \describe{ #' \item{betas}{ nonzero coefficients of the fitted model } -#' \item{alpha}{ constant offset making the exponential model sum to one over the background data } +#' \item{alpha}{ constant offset making the exponential model sum to one +#' over the background data } #' \item{entropy}{ entropy of the exponential model } #' \item{penalty.factor}{ the regularization constants used for each feature } #' \item{featuremins}{ minimum of each feature, to be used for clamping } @@ -32,40 +34,47 @@ #' \item{varmax}{ maximum of each predictor, to be used for clamping } #' \item{samplemeans}{ mean of each predictor over samples (majority for factors) } #' \item{levels}{ levels of each predictor that is a factor } -#'} +#' } #' @examples -#' \dontrun{ -#' # we repeat the example in the `maxnet` package -#' data("bradypus", package="maxnet") -#' bradypus_tb <- tibble::as_tibble(bradypus) %>% dplyr::mutate(presence = relevel(factor( -#' dplyr::case_match (presence, 1~"presence",0 ~"absence")), -#' ref="presence")) -#' mod3 <- maxnet_fit(presence~.,data=bradypus_tb, classes="lq") -#' plot(mod, "tmp6190_ann") +#' \donttest{ +#' # we repeat the example in the `maxnet` package +#' data("bradypus", package = "maxnet") +#' bradypus_tb <- tibble::as_tibble(bradypus) %>% +#' dplyr::mutate(presence = relevel( +#' factor( +#' dplyr::case_match(presence, 1 ~ "presence", 0 ~ "absence") +#' ), +#' ref = "presence" +#' )) +#' mod <- maxnet_fit(presence ~ ., data = bradypus_tb, classes = "lq") +#' plot(mod, "tmp6190_ann") #' } #' @keywords internal #' @export -maxnet_fit <- function(formula, data, regmult=1.0, classes="default", - regfun=maxnet::maxnet.default.regularization, - addsamplestobackground=T, ...) { +maxnet_fit <- function(formula, data, regmult = 1.0, classes = "default", + regfun = maxnet::maxnet.default.regularization, + addsamplestobackground = TRUE, ...) { # extract the response and turn it into a numeric vector - response<- data[,form_resp(stats::terms(formula, data = data))] %>% + response <- data[, form_resp(stats::terms(formula, data = data))] %>% dplyr::pull(1) resp_levels <- levels(response) response <- dplyr::case_match(response, resp_levels[1] ~ 1, resp_levels[2] ~ 0) # extract the responses - predictors <- data[,rsample::form_pred(stats::terms(formula, data = data))] - + predictors <- data[, rsample::form_pred(stats::terms(formula, data = data))] - maxnet_obj<-maxnet::maxnet(p=response, - data=predictors, - f=maxnet::maxnet.formula(p = response, - data = predictors, - classes = classes), - regmult=regmult, - regfun=regfun, - addsamplestobackground=addsamplestobackground) + maxnet_obj <- maxnet::maxnet( + p = response, + data = predictors, + f = maxnet::maxnet.formula( + p = response, + data = predictors, + classes = classes + ), + regmult = regmult, + regfun = regfun, + addsamplestobackground = addsamplestobackground + ) return(maxnet_obj) } @@ -82,22 +91,29 @@ maxnet_fit <- function(formula, data, regmult=1.0, classes="default", #' @param newdata the dataframe of new data #' @param type either "prob" or "class" #' @param maxnet_type the transformation used for the prediction -#' @param clamp logical, defining whether clamping to observed ranges should be used +#' @param clamp logical, defining whether clamping to observed ranges should +#' be used #' @returns a tibble of predictions #' @export #' @keywords internal -maxnet_predict <- function(object, newdata, type=c("class", "prob"), - maxnet_type = c("cloglog","link","exponential","logistic"), - clamp=TRUE){ +maxnet_predict <- function(object, newdata, type = c("class", "prob"), + maxnet_type = c( + "cloglog", "link", "exponential", + "logistic" + ), + clamp = TRUE) { type <- match.arg(type) maxnet_type <- match.arg(maxnet_type) - prob_vect <- stats::predict(object,newdata=as.data.frame(newdata), type=maxnet_type, clamp=clamp) - if (type=="class"){ - class_vect <- rep(0,length(prob_vect)) - class_vect[prob_vect>=0.5]<-1 + prob_vect <- stats::predict(object, + newdata = as.data.frame(newdata), + type = maxnet_type, clamp = clamp + ) + if (type == "class") { + class_vect <- rep(0, length(prob_vect)) + class_vect[prob_vect >= 0.5] <- 1 return(class_vect) } else { - return (prob_vect) + return(prob_vect) } } diff --git a/R/optim_thresh.R b/R/optim_thresh.R index 31b9e8e0..e78e020a 100644 --- a/R/optim_thresh.R +++ b/R/optim_thresh.R @@ -3,53 +3,53 @@ #' This function returns the threshold to turn probabilities into binary classes #' whilst optimising a given metric. Currently available for [`tss_max`], [`kap_max`] and #' `sensitivity` (for which a target sensitivity is required). -#' @param truth The column identifier for the true class results (that is a +#' @param truth The column identifier for the true class results (that is a #' factor). This should be an unquoted column name although this argument is #' passed by expression and supports quasiquotation (you can unquote column -#' names). For ⁠_vec()⁠ functions, a factor vector. +#' names). For _vec() functions, a factor vector. #' @param estimate the predicted probability for the event -#' @param metric character of metric to be optimised. Currently only "tss_max", +#' @param metric character of metric to be optimised. Currently only "tss_max", #' "kap_max", and "sensitivity" with a given target #' (e.g. c("sensitivity",0.8)) -#' @param event_level A single string. Either "first" or "second" to specify -#' which level of truth to consider as the "event". This argument is only -#' applicable when estimator = "binary". The default uses an internal helper +#' @param event_level A single string. Either "first" or "second" to specify +#' which level of truth to consider as the "event". This argument is only +#' applicable when estimator = "binary". The default uses an internal helper #' that generally defaults to "first" #' @returns the probability threshold for the event #' @examples -#' optim_thresh(two_class_example$truth,two_class_example$Class1,metric=c("tss_max")) -#' optim_thresh(two_class_example$truth,two_class_example$Class1,metric=c("sens",0.9)) +#' optim_thresh(two_class_example$truth, two_class_example$Class1, metric = c("tss_max")) +#' optim_thresh(two_class_example$truth, two_class_example$Class1, metric = c("sens", 0.9)) #' @export -optim_thresh <- function(truth, estimate, metric, event_level="first"){ - if (!is.factor(truth)){ +optim_thresh <- function(truth, estimate, metric, event_level = "first") { + if (!is.factor(truth)) { stop("truth should be a factor!") } # separate estimates into presences and background if (identical(event_level, "first")) { pres_level <- levels(truth)[1] absence_level <- levels(truth)[2] - } else if (identical(event_level, "second")){ + } else if (identical(event_level, "second")) { pres_level <- levels(truth)[2] absence_level <- levels(truth)[1] } else { stop("event_level should be either 'first' or 'second'") } - presences <- estimate[truth==pres_level] - absences <- estimate[truth==absence_level] + presences <- estimate[truth == pres_level] + absences <- estimate[truth == absence_level] - if (length(metric)==2){ - if (metric[1] %in% c("sensitivity","sens")){ + if (length(metric) == 2) { + if (metric[1] %in% c("sensitivity", "sens")) { optim_thresh_sens(presences, absences, as.numeric(metric[2])) } else { "invalid metric" } - } else if (metric=="tss_max"){ - optim_thresh_tss_max (presences, absences) - } else if (metric=="kap_max"){ - optim_thresh_kap_max (presences, absences) - }else { + } else if (metric == "tss_max") { + optim_thresh_tss_max(presences, absences) + } else if (metric == "kap_max") { + optim_thresh_kap_max(presences, absences) + } else { "invalid metric" } } @@ -64,10 +64,10 @@ optim_thresh <- function(truth, estimate, metric, event_level="first"){ #' @param sens_target the target sensitivity #' @returns the probability threshold for the event #' @keywords internal -optim_thresh_sens <- function(presences, absences, sens_target){ +optim_thresh_sens <- function(presences, absences, sens_target) { conf_matrix_df <- conf_matrix_df(presences, absences) - sens = (conf_matrix_df$tp / (conf_matrix_df$tp + conf_matrix_df$fn)) - return(conf_matrix_df$thresh[which.min(sens>sens_target)]) + sens <- (conf_matrix_df$tp / (conf_matrix_df$tp + conf_matrix_df$fn)) + return(conf_matrix_df$thresh[which.min(sens > sens_target)]) } #' Find threshold that maximises TSS @@ -78,12 +78,12 @@ optim_thresh_sens <- function(presences, absences, sens_target){ #' @param absences Provabilities for absences #' @returns the probability threshold for the event #' @keywords internal -optim_thresh_tss_max <- function(presences, absences){ +optim_thresh_tss_max <- function(presences, absences) { conf_matrix_df <- conf_matrix_df(presences, absences) - sens = (conf_matrix_df$tp / (conf_matrix_df$tp + conf_matrix_df$fn)) - spec = (conf_matrix_df$tn / (conf_matrix_df$tn + conf_matrix_df$fp)) + sens <- (conf_matrix_df$tp / (conf_matrix_df$tp + conf_matrix_df$fn)) + spec <- (conf_matrix_df$tn / (conf_matrix_df$tn + conf_matrix_df$fp)) - tss = (sens + spec) - 1 + tss <- (sens + spec) - 1 return(conf_matrix_df$thresh[which.max(tss)]) } @@ -95,15 +95,14 @@ optim_thresh_tss_max <- function(presences, absences){ #' @param absences Provabilities for absences #' @returns the probability threshold for the event #' @keywords internal -optim_thresh_kap_max <- function(presences, absences){ +optim_thresh_kap_max <- function(presences, absences) { conf_matrix_df <- conf_matrix_df(presences, absences) - n <- rowSums(conf_matrix_df[,2:5]) + n <- rowSums(conf_matrix_df[, 2:5]) obs_accuracy <- (conf_matrix_df$tp + conf_matrix_df$tn) / n exp_accuracy <- (((conf_matrix_df$tn + conf_matrix_df$fp) * - (conf_matrix_df$tn + conf_matrix_df$fn) /n ) + - ((conf_matrix_df$tp + conf_matrix_df$fn) * - (conf_matrix_df$tp + conf_matrix_df$fp) /n ))/n - kap = (obs_accuracy - exp_accuracy)/(1 - exp_accuracy) + (conf_matrix_df$tn + conf_matrix_df$fn) / n) + + ((conf_matrix_df$tp + conf_matrix_df$fn) * + (conf_matrix_df$tp + conf_matrix_df$fp) / n)) / n + kap <- (obs_accuracy - exp_accuracy) / (1 - exp_accuracy) return(conf_matrix_df$thresh[which.max(kap)]) } - diff --git a/R/plot_pres_vs_abs.R b/R/plot_pres_vs_abs.R index 2e7ec122..5dda4af8 100644 --- a/R/plot_pres_vs_abs.R +++ b/R/plot_pres_vs_abs.R @@ -9,33 +9,42 @@ #' the first level of this factor #' @returns a `patchwork` composite plot #' @examples -#' data("bradypus", package="maxnet") -#' bradypus_tb <- tibble::as_tibble(bradypus) %>% dplyr::mutate(presence = relevel(factor( -#' dplyr::case_match (presence, 1~"presence",0 ~"absence")), -#' ref="presence")) %>% select(-ecoreg) +#' \donttest{ +#' data("bradypus", package = "maxnet") +#' bradypus_tb <- tibble::as_tibble(bradypus) %>% +#' dplyr::mutate(presence = relevel( +#' factor( +#' dplyr::case_match(presence, 1 ~ "presence", 0 ~ "absence") +#' ), +#' ref = "presence" +#' )) %>% +#' select(-ecoreg) #' #' bradypus_tb %>% plot_pres_vs_bg(presence) -#' +#' } #' @export plot_pres_vs_bg <- function( .data, - .col){ - .col = rlang::enquo(.col) %>% rlang::quo_get_expr() %>% rlang::as_string() - if (inherits(.data, "sf")){ + .col) { + .col <- rlang::enquo(.col) %>% + rlang::quo_get_expr() %>% + rlang::as_string() + if (inherits(.data, "sf")) { .data <- .data %>% sf::st_drop_geometry() } # subset to only columns which are numeric - num_vars <- names(.data)[!names(.data)%in%.col] + num_vars <- names(.data)[!names(.data) %in% .col] plot_list <- list() - for (i_var in num_vars){ - p <- ggplot2::ggplot(data=.data, ggplot2::aes(x="", y=.data[[i_var]],fill=.data[[.col]]))+ - geom_split_violin(nudge=0.01) + ggplot2::labs(x = "") + for (i_var in num_vars) { + p <- ggplot2::ggplot(data = .data, ggplot2::aes(x = "", y = .data[[i_var]], fill = .data[[.col]])) + + geom_split_violin(nudge = 0.01) + + ggplot2::labs(x = "") # vals_list <- list(.data[[i_var]][.data[[.col]]==levels(.data[[.col]])[1]], # .data[[i_var]][.data[[.col]]==levels(.data[[.col]])[2]]) # # p <- p+annotate("text",0.5,min(.data[[i_var]])*1.1,label=round(1-overlap(vals_list)$OV,2)) - plot_list[[i_var]]<-p + plot_list[[i_var]] <- p } plot_patch <- patchwork::wrap_plots(plot_list) + patchwork::plot_layout(guides = "collect") & diff --git a/R/predict_raster.R b/R/predict_raster.R index f3120fbd..3a0d5058 100644 --- a/R/predict_raster.R +++ b/R/predict_raster.R @@ -10,15 +10,15 @@ #' @returns a [`terra::SpatRaster`] with the predictions #' @export #' -predict_raster <- function (object, raster,...) { +predict_raster <- function(object, raster, ...) { UseMethod("predict_raster", object) } #' @rdname predict_raster #' @export -predict_raster.default <- function(object, raster, ...){ +predict_raster.default <- function(object, raster, ...) { # create a dataframe - raster_df <- terra::as.data.frame(raster, cell=TRUE, na.rm= TRUE) + raster_df <- terra::as.data.frame(raster, cell = TRUE, na.rm = TRUE) # create a vector of predictions by dispatching to the predict generics pred_df <- stats::predict(object, raster_df, ...) @@ -26,22 +26,22 @@ predict_raster.default <- function(object, raster, ...){ pred_raster <- terra::rast(raster[[1]]) # and now fill in the values, adding a layer for each aggregating function we used - pred_raster[raster_df$cell]<-pred_df %>% dplyr::pull(1) - if (is.factor(pred_df %>% dplyr::pull(1))){ - levels(pred_raster)<-data.frame(id=1:2, class=levels(pred_df %>% dplyr::pull(1))) + pred_raster[raster_df$cell] <- pred_df %>% dplyr::pull(1) + if (is.factor(pred_df %>% dplyr::pull(1))) { + levels(pred_raster) <- data.frame(id = 1:2, class = levels(pred_df %>% dplyr::pull(1))) } - if (ncol(pred_df)>1){ - for (i_col in 2:ncol(pred_df)){ + if (ncol(pred_df) > 1) { + for (i_col in 2:ncol(pred_df)) { pred_raster2 <- terra::rast(raster[[1]]) - pred_raster2[raster_df$cell]<-pred_df %>% dplyr::pull(i_col) - terra::add(pred_raster)<- pred_raster2 + pred_raster2[raster_df$cell] <- pred_df %>% dplyr::pull(i_col) + terra::add(pred_raster) <- pred_raster2 } } names(pred_raster) <- names(pred_df) - if (is.factor(pred_df %>% dplyr::pull(1))){ - names(pred_raster) <- paste0("binary_",names(pred_raster)) + if (is.factor(pred_df %>% dplyr::pull(1))) { + names(pred_raster) <- paste0("binary_", names(pred_raster)) } pred_raster } diff --git a/R/predict_repeat_ensemble.R b/R/predict_repeat_ensemble.R index a4fdd5a0..45f31e63 100644 --- a/R/predict_repeat_ensemble.R +++ b/R/predict_repeat_ensemble.R @@ -28,23 +28,25 @@ #' @method predict repeat_ensemble #' @export predict.repeat_ensemble <- - function (object, - new_data, - type = "prob", - fun = "mean", - metric_thresh = NULL, - class_thresh = NULL, - members = FALSE, - ...) { - # we change the names of the workflows to combine with the repeat ids - object$workflow_id <- paste(object$rep_id,object$wflow_id, sep=".") - class(object)[1] <- "simple_ensemble" - # now predict the object as if it was a simple ensemble - stats::predict(object = object, - new_data = new_data, - type = type, - fun = fun, - metric_thresh = metric_thresh, - class_thresh = class_thresh, - members = members) + function(object, + new_data, + type = "prob", + fun = "mean", + metric_thresh = NULL, + class_thresh = NULL, + members = FALSE, + ...) { + # we change the names of the workflows to combine with the repeat ids + object$workflow_id <- paste(object$rep_id, object$wflow_id, sep = ".") + class(object)[1] <- "simple_ensemble" + # now predict the object as if it was a simple ensemble + stats::predict( + object = object, + new_data = new_data, + type = type, + fun = fun, + metric_thresh = metric_thresh, + class_thresh = class_thresh, + members = members + ) } diff --git a/R/predict_simple_ensemble.R b/R/predict_simple_ensemble.R index 161d7406..06eceb28 100644 --- a/R/predict_simple_ensemble.R +++ b/R/predict_simple_ensemble.R @@ -28,52 +28,56 @@ #' @method predict simple_ensemble #' @export predict.simple_ensemble <- - function (object, - new_data, - type = "prob", - fun = "mean", - metric_thresh = NULL, - class_thresh = NULL, - members = FALSE, - ...) { + function(object, + new_data, + type = "prob", + fun = "mean", + metric_thresh = NULL, + class_thresh = NULL, + members = FALSE, + ...) { # type check if (!type %in% c("prob", "class")) { stop("'type' can only take values 'prob' or 'class'") } if (type == "class") { - if (fun[1]=="none"){ + if (fun[1] == "none") { stop("classes can be generated only if an aggregating function is given") } - if (members){ + if (members) { message("classes are only provided for aggregated ensemble predictions") members <- FALSE } - if (is.null(class_thresh)){ + if (is.null(class_thresh)) { # warning if we return class without calibration message("as no 'threshold' was defined, a default of 0.5 will be used") class_thresh <- 0.5 } # check that we have an entry for this calibration - ref_calib_tb <- attr(object,"class_thresholds") - # browser() + ref_calib_tb <- attr(object, "class_thresholds") + # give up immediately if ref_calib_tb is null if (is.null(ref_calib_tb)) { - stop("this model needs to be first calibrated before classes can be produced\n", - paste("use 'calib_class_thresh' first")) - # the next check fails if ref_calib_tb is null - } else if (!any(unlist(lapply(ref_calib_tb %>% dplyr::pull("metric_thresh"),identical, metric_thresh)) & - unlist(lapply(ref_calib_tb %>% dplyr::pull("class_thresh"),identical, class_thresh)))){ - stop("this model needs to be first calibrated before classes can be produced\n", - paste("use 'calib_class_thresh' first")) - } + stop( + "this model needs to be first calibrated before classes can be produced\n", + "use 'calib_class_thresh()' first" + ) + } else if (!any(unlist(lapply(ref_calib_tb %>% dplyr::pull("metric_thresh"), identical, metric_thresh)) & + unlist(lapply(ref_calib_tb %>% dplyr::pull("class_thresh"), identical, class_thresh)))) { + stop( + "this model needs to be first calibrated before classes can be produced\n", + "use 'calib_class_thresh()' first" + ) + } # subset the calibration thresholds ref_calib_tb <- ref_calib_tb[ - (unlist(lapply(ref_calib_tb %>% dplyr::pull("metric_thresh"),identical, metric_thresh)) & - unlist(lapply(ref_calib_tb %>% dplyr::pull("class_thresh"),identical, class_thresh))) & - ref_calib_tb$fun %in% fun,] + (unlist(lapply(ref_calib_tb %>% dplyr::pull("metric_thresh"), identical, metric_thresh)) & + unlist(lapply(ref_calib_tb %>% dplyr::pull("class_thresh"), identical, class_thresh))) & + ref_calib_tb$fun %in% fun, + ] class_levels <- levels(workflows::extract_mold((object$workflow[[1]]))$outcome %>% dplyr::pull(1)) } @@ -82,8 +86,8 @@ predict.simple_ensemble <- TRUE # boolean determining whether we have an aggregating function if (inherits(fun, "character")) { # check that we have valid values - if (!(((length(fun)==1 & fun[1]=="none")) | - all(fun %in% c('mean', 'median', 'weighted_mean', 'weighted_median')))){ + if (!(((length(fun) == 1 && fun[1] == "none")) | + all(fun %in% c("mean", "median", "weighted_mean", "weighted_median")))) { stop("fun should be either 'none', or a combination of 'mean', 'median', 'weighted_mean', and 'weighted_median'") } if (fun[1] == "none") { @@ -98,14 +102,15 @@ predict.simple_ensemble <- # create list of predictions pred_list <- lapply(object$workflow, - stats::predict, - new_data = new_data, - type = "prob") + stats::predict, + new_data = new_data, + type = "prob" + ) names(pred_list) <- object$wflow_id # turn it into a data.frame pred_list <- dplyr::bind_cols(data.frame(pred_list)) %>% tibble::as_tibble() # remove every other column (so that we the probability for presences) - pred_list <- pred_list[,seq(1,ncol(pred_list),by=2)] + pred_list <- pred_list[, seq(1, ncol(pred_list), by = 2)] # filter models if we have a metric_thresh (and create weights based on this metric) if (!is.null(metric_thresh)) { @@ -117,7 +122,7 @@ predict.simple_ensemble <- dplyr::bind_rows(object$metrics) %>% dplyr::filter(.data$.metric == metric_thresh[1]) # subset the data.frame pred_list <- - pred_list[,metric_ens$mean > as.numeric(metric_thresh[2])] + pred_list[, metric_ens$mean > as.numeric(metric_thresh[2])] metric_ens <- metric_ens$mean[metric_ens$mean > as.numeric(metric_thresh[2])] if (length(pred_list) == 0) { stop("the current metric_threshold excludes all models") @@ -131,14 +136,14 @@ predict.simple_ensemble <- } # define the weighted functions - weighted_mean <- function(x, w=metric_ens){ - stats::weighted.mean(x,weights = w) + weighted_mean <- function(x, w = metric_ens) { + stats::weighted.mean(x, weights = w) } - weighted_median <- function(x, w=metric_ens) { + weighted_median <- function(x, w = metric_ens) { w <- w[order(x)] x <- x[order(x)] - prob <- cumsum(w)/sum(w) + prob <- cumsum(w) / sum(w) ps <- which(abs(prob - .5) == min(abs(prob - .5))) return(x[ps]) } @@ -146,16 +151,17 @@ predict.simple_ensemble <- # if we have an aggregating function if (have_fun) { pred_ensemble <- list() - for (i_fun in fun){ - pred_ensemble[[i_fun]] <- apply(pred_list, 1, eval(parse(text=i_fun))) + for (i_fun in fun) { + pred_ensemble[[i_fun]] <- apply(pred_list, 1, eval(parse(text = i_fun))) # convert to classes - if (type=="class"){ + if (type == "class") { pred_ensemble[[i_fun]] <- prob_to_binary(pred_ensemble[[i_fun]], - thresh = ref_calib_tb %>% - dplyr::filter(fun==i_fun) %>% - dplyr::pull("optim_value"), - class_levels = class_levels) + thresh = ref_calib_tb %>% + dplyr::filter(fun == i_fun) %>% + dplyr::pull("optim_value"), + class_levels = class_levels + ) } } pred_ensemble <- data.frame(pred_ensemble) @@ -187,7 +193,7 @@ predict.simple_ensemble <- #' @keywords internal prob_to_binary <- function(x, thresh, class_levels) { - classes_bin <- rep(class_levels[2],length(x)) - classes_bin[x>=thresh] <- class_levels[1] - stats::relevel(factor(classes_bin), ref=class_levels[1]) + classes_bin <- rep(class_levels[2], length(x)) + classes_bin[x >= thresh] <- class_levels[1] + stats::relevel(factor(classes_bin), ref = class_levels[1]) } diff --git a/R/prob_metrics.R b/R/prob_metrics.R index 2bd81af1..6dc03ffb 100644 --- a/R/prob_metrics.R +++ b/R/prob_metrics.R @@ -8,69 +8,87 @@ #' @returns A tibble with columns `.metric`, `.estimator`, and `.estimate` #' and 1 row of values. #' @import yardstick -#' @name prob_metrics +#' @name prob_metrics_sf #' NULL #' @description [yardstick::average_precision()] #' @export -#' @rdname prob_metrics -average_precision.sf <- function(data,...){ - data %>% dplyr::as_tibble() %>% yardstick::average_precision(...) +#' @rdname prob_metrics_sf +average_precision.sf <- function(data, ...) { + data %>% + dplyr::as_tibble() %>% + yardstick::average_precision(...) } #' @description [yardstick::brier_class()] #' @export -#' @rdname prob_metrics -brier_class.sf <- function(data,...){ - data %>% dplyr::as_tibble() %>% yardstick::brier_class(...) +#' @rdname prob_metrics_sf +brier_class.sf <- function(data, ...) { + data %>% + dplyr::as_tibble() %>% + yardstick::brier_class(...) } #' @description [yardstick::classification_cost()] #' @export -#' @rdname prob_metrics -classification_cost.sf <- function(data,...){ - data %>% dplyr::as_tibble() %>% yardstick::classification_cost(...) +#' @rdname prob_metrics_sf +classification_cost.sf <- function(data, ...) { + data %>% + dplyr::as_tibble() %>% + yardstick::classification_cost(...) } #' @description [yardstick::gain_capture()] #' @export -#' @rdname prob_metrics -gain_capture.sf <- function(data,...){ - data %>% dplyr::as_tibble() %>% yardstick::gain_capture(...) +#' @rdname prob_metrics_sf +gain_capture.sf <- function(data, ...) { + data %>% + dplyr::as_tibble() %>% + yardstick::gain_capture(...) } #' @description [yardstick::mn_log_loss()] #' @export -#' @rdname prob_metrics -mn_log_loss.sf <- function(data,...){ - data %>% dplyr::as_tibble() %>% yardstick::mn_log_loss(...) +#' @rdname prob_metrics_sf +mn_log_loss.sf <- function(data, ...) { + data %>% + dplyr::as_tibble() %>% + yardstick::mn_log_loss(...) } #' @description [yardstick::pr_auc()] #' @export -#' @rdname prob_metrics -pr_auc.sf <- function(data,...){ - data %>% dplyr::as_tibble() %>% yardstick::pr_auc(...) +#' @rdname prob_metrics_sf +pr_auc.sf <- function(data, ...) { + data %>% + dplyr::as_tibble() %>% + yardstick::pr_auc(...) } #' @description [yardstick::roc_auc()] #' @export -#' @rdname prob_metrics -roc_auc.sf <- function(data,...){ - data %>% dplyr::as_tibble() %>% yardstick::roc_auc(...) +#' @rdname prob_metrics_sf +roc_auc.sf <- function(data, ...) { + data %>% + dplyr::as_tibble() %>% + yardstick::roc_auc(...) } #' @description [yardstick::roc_aunp()] #' @export -#' @rdname prob_metrics -roc_aunp.sf <- function(data,...){ - data %>% dplyr::as_tibble() %>% yardstick::roc_aunp(...) +#' @rdname prob_metrics_sf +roc_aunp.sf <- function(data, ...) { + data %>% + dplyr::as_tibble() %>% + yardstick::roc_aunp(...) } #' @description [yardstick::roc_aunu()] #' @export -#' @rdname prob_metrics -roc_aunu.sf <- function(data,...){ - data %>% dplyr::as_tibble() %>% yardstick::roc_aunu(...) +#' @rdname prob_metrics_sf +roc_aunu.sf <- function(data, ...) { + data %>% + dplyr::as_tibble() %>% + yardstick::roc_aunu(...) } diff --git a/R/recipe_sf.R b/R/recipe_sf.R index 24e525fd..9dd72e3d 100644 --- a/R/recipe_sf.R +++ b/R/recipe_sf.R @@ -10,8 +10,8 @@ #' column from the [data.frame] and replaces it with a simple `X` and `Y` columns #' before any further operations, thus allowing #' the usual processing by [recipe()] to succeed (`X` and `Y` are give the role -#' of coords ina spatial recipe). When prepping and baking a `spatial_recipe`, -#' if a data.frame or tibble without coordinates is used as `training` or +#' of coords in a spatial recipe). When prepping and baking a `spatial_recipe`, +#' if a data.frame or tibble without coordinates is used as `training` or #' `new_data`, dummy `X` and `Y` columns #' are generated and filled with NAs. #' NOTE that order matters! You need to use the syntax @@ -26,31 +26,33 @@ #' @export #' @import recipes -recipe.sf <- function (x, ...) { +recipe.sf <- function(x, ...) { # we should check that all coordinates are points -# browser() + # browser() if (all(c("X", "Y") %in% names(x))) { - if (all(sf::st_drop_geometry(x[, c("X", "Y")]) == sf::st_coordinates(x))) { - x<-x %>% sf::st_drop_geometry() + if (all(sf::st_drop_geometry(x[, c("X", "Y")]) == sf::st_coordinates(x))) { + x <- x %>% sf::st_drop_geometry() } else { stop("sf object `x` contains `X` and `Y` coordinates that do not match the sf point geometry") } } else { - x<-x %>% dplyr::bind_cols(sf::st_coordinates(x)) %>% sf::st_drop_geometry() + x <- x %>% + dplyr::bind_cols(sf::st_coordinates(x)) %>% + sf::st_drop_geometry() } - - - - rec <- recipe(x, ...) %>% - update_role(dplyr::any_of(c("X","Y")),new_role="coords") + + + + rec <- recipe(x, ...) %>% + update_role(dplyr::any_of(c("X", "Y")), new_role = "coords") class(rec) <- c("spatial_recipe", class(rec)) rec } #' @export #' @rdname recipe.sf -spatial_recipe <- function (x, ...){ - if (!inherits(x, "sf")){ +spatial_recipe <- function(x, ...) { + if (!inherits(x, "sf")) { stop("x should be an `sf` object") } recipe(x, ...) diff --git a/R/recipes_sf_methods.R b/R/recipes_sf_methods.R index 6ccc1085..2208dff0 100644 --- a/R/recipes_sf_methods.R +++ b/R/recipes_sf_methods.R @@ -1,49 +1,45 @@ - - #' @export -prep.spatial_recipe<-function (x, training = NULL, fresh = FALSE, verbose = FALSE, - retain = TRUE, log_changes = FALSE, strings_as_factors = TRUE, - ...) { - if (!is.null(training)){ +prep.spatial_recipe <- function(x, training = NULL, fresh = FALSE, verbose = FALSE, + retain = TRUE, log_changes = FALSE, strings_as_factors = TRUE, + ...) { + if (!is.null(training)) { # if we have a geometry - if ("geometry" %in% names(training)){ + if ("geometry" %in% names(training)) { ## convert_geometry_column training <- training %>% dplyr::bind_cols(sf::st_coordinates(training$geometry)) %>% sf::st_drop_geometry() } # Add dummy X and Y if they are not already present - if (!all(c("X","Y") %in% names(training))){ - training <- training %>% dplyr::mutate(X=NA, Y=NA) + if (!all(c("X", "Y") %in% names(training))) { + training <- training %>% dplyr::mutate(X = NA, Y = NA) } } - #recipes:::prep.recipe - utils::getFromNamespace("prep.recipe", "recipes") ( - x=x,training=sf::st_drop_geometry(training), - fresh=fresh, verbose=FALSE, - retain=retain, log_changes=log_changes, - strings_as_factors =strings_as_factors, ...) + # recipes:::prep.recipe + utils::getFromNamespace("prep.recipe", "recipes")( + x = x, training = sf::st_drop_geometry(training), + fresh = fresh, verbose = FALSE, + retain = retain, log_changes = log_changes, + strings_as_factors = strings_as_factors, ...) } #' @export -bake.spatial_recipe <- function (object, new_data, ..., composition = "tibble") { +bake.spatial_recipe <- function(object, new_data, ..., composition = "tibble") { ## convert_geometry_column - if (!is.null(new_data)){ - if ("geometry" %in% names(new_data)){ + if (!is.null(new_data)) { + if ("geometry" %in% names(new_data)) { ## convert_geometry_column new_data <- new_data %>% dplyr::bind_cols(sf::st_coordinates(new_data$geometry)) %>% sf::st_drop_geometry() } # Add dummy X and Y if they are not already present - if (!all(c("X","Y") %in% names(new_data))){ - new_data <- new_data %>% dplyr::mutate(X=NA, Y=NA) - } + if (!all(c("X", "Y") %in% names(new_data))) { + new_data <- new_data %>% dplyr::mutate(X = NA, Y = NA) + } } ## TODO the st_drop_geometry below should be redundant given line 43 - utils::getFromNamespace("bake.recipe", "recipes") (object=object, ..., - new_data = sf::st_drop_geometry(new_data), - composition=composition) + utils::getFromNamespace("bake.recipe", "recipes")(object = object, ..., + new_data = sf::st_drop_geometry(new_data), + composition = composition) } - - diff --git a/R/repeat_ensemble.R b/R/repeat_ensemble.R index 24f5145b..020033ce 100644 --- a/R/repeat_ensemble.R +++ b/R/repeat_ensemble.R @@ -23,32 +23,29 @@ repeat_ensemble <- function(...) { # tibble of metrics from the CV on the training dataset (coming from when # the workflow was originally fit, potentially as part of a workflow_set) metrics = list() - ) - base_ensemble <- structure(base_ensemble, class = c("repeat_ensemble", - class(base_ensemble))) + ) + base_ensemble <- structure(base_ensemble, class = c( + "repeat_ensemble", + class(base_ensemble) + )) } #' @export print.repeat_ensemble <- function(x, ...) { - rlang::inform("A repeat_ensemble of models") - if (nrow(x)>0) { - rlang::inform(c("\nNumber of repeats:",length(unique(x$rep_id)))) - rlang::inform(c("\nMembers:",unique(x$wflow_id))) + if (nrow(x) > 0) { + rlang::inform(c("\nNumber of repeats:", length(unique(x$rep_id)))) + rlang::inform(c("\nMembers:", unique(x$wflow_id))) # all simple_ensembles need to have the same metrics - rlang::inform(c("\nAvailable metrics:",attr(x,"metrics"))) - rlang::inform(c("\nMetric used to tune workflows:",attr(x,"best_metric"))) + rlang::inform(c("\nAvailable metrics:", attr(x, "metrics"))) + rlang::inform(c("\nMetric used to tune workflows:", attr(x, "best_metric"))) } else { rlang::inform("\nThis object is empty; add models with `add_repeats()`") } - } #' @export summary.repeat_ensemble <- function(object, ...) { - print(object) - } - diff --git a/R/sample_pseudoabs.R b/R/sample_pseudoabs.R index 3b55ec78..05f69c17 100644 --- a/R/sample_pseudoabs.R +++ b/R/sample_pseudoabs.R @@ -4,20 +4,18 @@ #' of semantics) points from a raster given a set of presences. #' The locations returned as the center points of the sampled cells, which can #' not overlap with the presences. The following methods are implemented: -#' {/itemize: -#' /item: 'random': pseudo-absences/background randomly sampled from the region covered by the +#' * 'random': pseudo-absences/background randomly sampled from the region covered by the #' raster (i.e. not NAs). -#' /item: 'dist_min': pseudo-absences/background randomly sampled from the region excluding a buffer +#' * 'dist_min': pseudo-absences/background randomly sampled from the region excluding a buffer #' of 'dist_min' from presences (distances in 'm' for lonlat rasters, and in map #' units for projected rasters). -#' /item: 'dist_max': pseudo-absences/background randomly sampled from the unioned buffers +#' * 'dist_max': pseudo-absences/background randomly sampled from the unioned buffers #' of 'dist_max' from presences (distances in 'm' for lonlat rasters, and in map #' units for projected rasters). Using the union of buffers means that areas that #' are in multiple buffers are not oversampled. This is also referred to as "thickening". -#' /item: 'dist_disc': pseudo-absences/background randomly sampled from the unioned discs around presences +#' * 'dist_disc': pseudo-absences/background randomly sampled from the unioned discs around presences #' with the two values of 'dist_disc' defining the minimum and maximum distance from #' presences. -#' } #' @param data An [`sf::sf`] data frame, or a data frame with coordinate variables. #' These can be defined in `coords`, unless they have standard names #' (see details below). @@ -39,17 +37,16 @@ #' @export -sample_pseudoabs <- function (data, raster, n, coords = NULL, - method="random", class_label = "pseudoabs", - return_pres = TRUE) -{ +sample_pseudoabs <- function(data, raster, n, coords = NULL, + method = "random", class_label = "pseudoabs", + return_pres = TRUE) { return_sf <- FALSE # flag whether we need to return an sf object - if (inherits(data,"sf")) { + if (inherits(data, "sf")) { bind_col <- TRUE if (all(c("X", "Y") %in% names(data))) { if (any(is.na(data[, c("X", "Y")]))) { stop("sf object contains NA values in the X and Y coordinates") - } else if (all(sf::st_drop_geometry(data[, c("X", "Y")]) == sf::st_coordinates(data))) { + } else if (all(sf::st_drop_geometry(data[, c("X", "Y")]) == sf::st_coordinates(data))) { bind_col <- FALSE } else { stop("sf object contains X and Y coordinates that do not match the sf point geometry") @@ -63,61 +60,66 @@ sample_pseudoabs <- function (data, raster, n, coords = NULL, } coords <- check_coords_names(data, coords) dist_min <- dist_max <- NULL - if(method[1]=="dist_disc"){ + if (method[1] == "dist_disc") { dist_min <- as.numeric(method[2]) dist_max <- as.numeric(method[3]) - } else if (method[1]=="dist_min"){ + } else if (method[1] == "dist_min") { dist_min <- as.numeric(method[2]) - } else if (method[1]=="dist_max"){ + } else if (method[1] == "dist_max") { dist_max <- as.numeric(method[2]) - } else if (!method[1] %in% "random"){ + } else if (!method[1] %in% "random") { stop("method has to be one of 'random', 'dist_min', 'dist_max', or 'dist_disc'") } - xy_pres<-as.matrix(as.data.frame(data)[,coords]) + xy_pres <- as.matrix(as.data.frame(data)[, coords]) # get a one layer raster sampling_raster <- raster[[1]] - names(sampling_raster)<-"class" + names(sampling_raster) <- "class" # turn presences into additional NAs sampling_raster[stats::na.omit(terra::cellFromXY(sampling_raster, xy_pres))] <- NA # remove buffer < dist_min (or first parameter for disc) - if (!is.null(dist_min)){ - min_buffer <- terra::buffer(terra::vect(xy_pres, - crs = terra::crs(sampling_raster)), - dist_min) - sampling_raster <- terra::mask(sampling_raster,min_buffer, inverse=TRUE, touches=FALSE) + if (!is.null(dist_min)) { + min_buffer <- terra::buffer( + terra::vect(xy_pres, + crs = terra::crs(sampling_raster) + ), + dist_min + ) + sampling_raster <- terra::mask(sampling_raster, min_buffer, inverse = TRUE, touches = FALSE) } # remove buffer >dist_max (or second parameter for disc) - if (!is.null(dist_max)){ - max_buffer <- terra::buffer(terra::vect(xy_pres, - crs = terra::crs(sampling_raster)), - dist_max) - sampling_raster <- terra::mask(sampling_raster,max_buffer, touches=FALSE) + if (!is.null(dist_max)) { + max_buffer <- terra::buffer( + terra::vect(xy_pres, + crs = terra::crs(sampling_raster) + ), + dist_max + ) + sampling_raster <- terra::mask(sampling_raster, max_buffer, touches = FALSE) } # now sample points # cell ids excluding NAs cell_id <- terra::cells(sampling_raster) - if (length(cell_id)>n){ - cell_id <- sample(x= cell_id, size = n) + if (length(cell_id) > n) { + cell_id <- sample(x = cell_id, size = n) } else { - warning("There are fewer available cells for raster '",time(sampling_raster),"' (",nrow(xy_pres)," presences) than the requested ", n, " pseudoabsences. Only ", length(cell_id), " will be returned.\n") + warning("There are fewer available cells for raster '", terra::time(sampling_raster), "' (", nrow(xy_pres), " presences) than the requested ", n, " pseudoabsences. Only ", length(cell_id), " will be returned.\n") } - pseudoabsences <- as.data.frame (terra::xyFromCell(sampling_raster, cell_id)) + pseudoabsences <- as.data.frame(terra::xyFromCell(sampling_raster, cell_id)) # fix the coordinate names to be the same we started with names(pseudoabsences) <- coords - pseudoabsences<- pseudoabsences %>% dplyr::mutate(class = class_label) - if (return_pres){ - presences<- dplyr::as_tibble (xy_pres) %>% - dplyr::mutate(class="presence") - pseudoabsences <- presences %>% dplyr::bind_rows(pseudoabsences) %>% - dplyr::mutate (class=stats::relevel(factor(class),ref="presence")) + pseudoabsences <- pseudoabsences %>% dplyr::mutate(class = class_label) + if (return_pres) { + presences <- dplyr::as_tibble(xy_pres) %>% + dplyr::mutate(class = "presence") + pseudoabsences <- presences %>% + dplyr::bind_rows(pseudoabsences) %>% + dplyr::mutate(class = stats::relevel(factor(class), ref = "presence")) } # remove X and Y that were added to the sf object - if (return_sf){ + if (return_sf) { pseudoabsences <- sf::st_as_sf(pseudoabsences, coords = coords) %>% sf::st_set_crs(crs_from_sf) } return(pseudoabsences) } - - diff --git a/R/sample_pseudoabs_time.R b/R/sample_pseudoabs_time.R index c52700cf..4fcdc131 100644 --- a/R/sample_pseudoabs_time.R +++ b/R/sample_pseudoabs_time.R @@ -4,24 +4,22 @@ #' of semantics) points from a raster given a set of presences. #' The locations returned as the center points of the sampled cells, which can #' not overlap with the presences. The following methods are implemented: -#' {/itemize: -#' /item: 'random': pseudo-absences/background randomly sampled from the region covered by the +#' * 'random': pseudo-absences/background randomly sampled from the region covered by the #' raster (i.e. not NAs). -#' /item: 'dist_min': pseudo-absences/background randomly sampled from the region excluding a buffer +#' * 'dist_min': pseudo-absences/background randomly sampled from the region excluding a buffer #' of 'dist_min' from presences (distances in 'm' for lonlat rasters, and in map #' units for projected rasters). -#' /item: 'dist_max': pseudo-absences/background randomly sampled from the unioned buffers +#' * 'dist_max': pseudo-absences/background randomly sampled from the unioned buffers #' of 'dist_max' from presences (distances in 'm' for lonlat rasters, and in map #' units for projected rasters). Using the union of buffers means that areas that #' are in multiple buffers are not oversampled. This is also referred to as "thickening". -#' /item: 'dist_disc': pseudo-absences/background randomly sampled from the unioned discs around presences +#' * 'dist_disc': pseudo-absences/background randomly sampled from the unioned discs around presences #' with the two values of 'dist_disc' defining the minimum and maximum distance from #' presences. -#' } #' @param data An [`sf::sf`] data frame, or a data frame with coordinate variables. #' These can be defined in `coords`, unless they have standard names #' (see details below). -#' @param raster the [terra::SpatRaster] from which cells will be sampled +#' @param raster the [terra::SpatRaster] or [terra::SpatRasterDataset] from which cells will be sampled #' @param n_per_presence number of pseudoabsence/background points to sample for #' each presence #' @param coords a vector of length two giving the names of the "x" and "y" @@ -42,20 +40,25 @@ #' @export -sample_pseudoabs_time <- function (data, raster, n_per_presence, coords = NULL,time_col="time", - lubridate_fun=c, - method="random", class_label = "pseudoabs", - return_pres=TRUE) -{ +sample_pseudoabs_time <- function(data, raster, n_per_presence, coords = NULL, time_col = "time", + lubridate_fun = c, + method = "random", class_label = "pseudoabs", + return_pres = TRUE) { # create a vector of times formatted as proper dates - time_lub <- data[,time_col] %>% as.data.frame() %>% dplyr::select(dplyr::all_of(time_col)) - time_lub <- lubridate_fun(time_lub[,time_col]) - if (!inherits(time_lub,"POSIXct")){ + time_lub <- data[, time_col] %>% + as.data.frame() %>% + dplyr::select(dplyr::all_of(time_col)) + time_lub <- lubridate_fun(time_lub[, time_col]) + if (!inherits(time_lub, "POSIXct")) { stop("time is not a date (or cannot be coerced to one)") } - # get the time steps from the SpatRasterDataset - time_steps <- time_steps_orig <- terra::time(raster)[[1]] - if ( terra::timeInfo(raster)[1,2]=="years"){ + # get the time steps + if (inherits(raster, "SpatRasterDataset")) { + time_steps <- terra::time(raster)[[1]] + } else { + time_steps <- terra::time(raster) + } + if (terra::timeInfo(raster)[1, 2] == "years") { time_steps <- lubridate::date_decimal(time_steps) } # convert time_lub dates into indices for the SpatRasterDatset @@ -63,25 +66,29 @@ sample_pseudoabs_time <- function (data, raster, n_per_presence, coords = NULL,t sapply(time_lub, function(a, b) { which.min(abs(a - b)) }, time_steps) - pseudoabsences<-NULL - for (i_index in unique(time_indices)){ - #browser() + pseudoabsences <- NULL + for (i_index in unique(time_indices)) { + # browser() # get data for this time_index, we remove coordinates as we don't need them - data_sub <- data %>% dplyr::filter(time_indices==i_index) + data_sub <- data %>% dplyr::filter(time_indices == i_index) # slice the region series based on the index; - raster_sub <- pastclim::slice_region_series(raster, time_bp=pastclim::time_bp(raster)[i_index]) - data_sub <- sample_pseudoabs (data= data_sub, - raster = raster_sub, - n = n_per_presence*nrow(data_sub), - coords = coords, - method=method, - class_label = class_label, - return_pres=return_pres) + if (inherits(raster, "SpatRasterDataset")) { + raster_sub <- pastclim::slice_region_series(raster, time_bp = pastclim::time_bp(raster[[1]])[i_index]) + } else { + raster_sub <- terra::subset(raster, i_index) + } + data_sub <- sample_pseudoabs( + data = data_sub, + raster = raster_sub, + n = n_per_presence * nrow(data_sub), + coords = coords, + method = method, + class_label = class_label, + return_pres = return_pres + ) # we need to reattach time data_sub <- data_sub %>% dplyr::mutate(time_step = time_steps[i_index]) pseudoabsences <- pseudoabsences %>% dplyr::bind_rows(data_sub) } return(pseudoabsences) } - - diff --git a/R/sdm_metric_set.R b/R/sdm_metric_set.R index 00dafb7b..3ba822d4 100644 --- a/R/sdm_metric_set.R +++ b/R/sdm_metric_set.R @@ -13,6 +13,6 @@ #' sdm_metric_set(accuracy) #' @export -sdm_metric_set <- function(...){ +sdm_metric_set <- function(...) { metric_set(boyce_cont, roc_auc, tss_max, ...) } diff --git a/R/sdm_spec_boost_tree.R b/R/sdm_spec_boost_tree.R index dd7de7b0..a5798016 100644 --- a/R/sdm_spec_boost_tree.R +++ b/R/sdm_spec_boost_tree.R @@ -6,16 +6,14 @@ #' @param ... parameters to be passed to [parsnip::boost_tree()] to #' customise the model. See the help of that function for details. #' @param tune character defining the tuning strategy. Valid strategies are: -#' {itemize: -#' /item: "sdm" chooses hyperparameters that are most important to tune for +#' * "sdm" chooses hyperparameters that are most important to tune for #' an sdm (for *boost_tree*: 'mtry', 'trees', 'tree_depth', 'learn_rate', #' 'loss_reduction', and 'stop_iter') -#' /item: "all" tunes all hyperparameters (for *boost_tree*: 'mtry', 'trees', +#' * "all" tunes all hyperparameters (for *boost_tree*: 'mtry', 'trees', #' 'tree_depth', 'learn_rate', #' 'loss_reduction', 'stop_iter','min_n' and 'sample_size') -#' /item: "custom" passes the options from '...' -#' /item: "none" does not tune any hyperparameter -#' } +#' * "custom" passes the options from '...' +#' * "none" does not tune any hyperparameter #' @returns a [parsnip::model_spec] of the model. #' @examples #' standard_bt_spec <- sdm_spec_boost_tree() @@ -23,29 +21,34 @@ #' custom_bt_spec <- sdm_spec_boost_tree(tune = "custom", mtry = tune()) #' @export -sdm_spec_boost_tree <- function(..., tune=c("sdm","all","custom","none")){ +sdm_spec_boost_tree <- function(..., tune = c("sdm", "all", "custom", "none")) { tune <- rlang::arg_match(tune) - if (tune=="sdm"){ - base_spec <- parsnip::boost_tree(mtry = tune(), # - trees = tune(), # - tree_depth = tune(), # - learn_rate = tune(), # - loss_reduction = tune(), # - stop_iter = tune(), # - ...) - } else if (tune=="all"){ - base_spec <- parsnip::boost_tree(mtry = tune(), - trees = tune(), - min_n = tune(), - tree_depth = tune(), - learn_rate = tune(), - loss_reduction = tune(), - sample_size = tune(), - stop_iter = tune(), - ...) - } else if ((tune=="custom") | (tune=="none")){ + if (tune == "sdm") { + base_spec <- parsnip::boost_tree( + mtry = tune(), # + trees = tune(), # + tree_depth = tune(), # + learn_rate = tune(), # + loss_reduction = tune(), # + stop_iter = tune(), # + ... + ) + } else if (tune == "all") { + base_spec <- parsnip::boost_tree( + mtry = tune(), + trees = tune(), + min_n = tune(), + tree_depth = tune(), + learn_rate = tune(), + loss_reduction = tune(), + sample_size = tune(), + stop_iter = tune(), + ... + ) + } else if ((tune == "custom") | (tune == "none")) { base_spec <- parsnip::boost_tree(...) } - base_spec %>% parsnip::set_engine("xgboost") %>% + base_spec %>% + parsnip::set_engine("xgboost") %>% parsnip::set_mode("classification") } diff --git a/R/sdm_spec_gam.R b/R/sdm_spec_gam.R index 1f64f81a..b28f2233 100644 --- a/R/sdm_spec_gam.R +++ b/R/sdm_spec_gam.R @@ -14,9 +14,9 @@ #' my_gam_spec <- sdm_spec_gam() #' @export -sdm_spec_gam <- function(..., tune="none"){ +sdm_spec_gam <- function(..., tune = "none") { tune <- rlang::arg_match(tune) - parsnip::gen_additive_mod(...) %>% # model type - parsnip::set_engine(engine = "mgcv") %>% # model engine + parsnip::gen_additive_mod(...) %>% # model type + parsnip::set_engine(engine = "mgcv") %>% # model engine parsnip::set_mode("classification") # model mode } diff --git a/R/sdm_spec_glm.R b/R/sdm_spec_glm.R index aa8178a5..8be7d0c8 100644 --- a/R/sdm_spec_glm.R +++ b/R/sdm_spec_glm.R @@ -14,10 +14,9 @@ #' my_spec_glm <- sdm_spec_glm() #' @export -sdm_spec_glm <- function(..., tune="none"){ +sdm_spec_glm <- function(..., tune = "none") { tune <- rlang::arg_match(tune) - parsnip::logistic_reg(...) %>% # model type - parsnip::set_engine(engine = "glm") %>% # model engine + parsnip::logistic_reg(...) %>% # model type + parsnip::set_engine(engine = "glm") %>% # model engine parsnip::set_mode("classification") # model mode } - diff --git a/R/sdm_spec_maxent.R b/R/sdm_spec_maxent.R index d434908f..5297080f 100644 --- a/R/sdm_spec_maxent.R +++ b/R/sdm_spec_maxent.R @@ -7,32 +7,34 @@ #' @param ... parameters to be passed to [maxent()] to #' customise the model. See the help of that function for details. #' @param tune character defining the tuning strategy. Valid strategies are: -#' {itemize: -#' /item: "sdm" chooses hyperparameters that are most important to tune for +#' * "sdm" chooses hyperparameters that are most important to tune for #' an sdm (for *maxent*, 'mtry') -#' /item: "all" tunes all hyperparameters (for *maxent*, 'mtry', 'trees' and 'min') -#' /item: "custom" passes the options from '...' -#' /item: "none" does not tune any hyperparameter -#' } +#' * "all" tunes all hyperparameters (for *maxent*, 'mtry', 'trees' and 'min') +#' * "custom" passes the options from '...' +#' * "none" does not tune any hyperparameter #' @returns a [parsnip::model_spec] of the model. #' @examples -#' test_maxent_spec <- sdm_spec_maxent(tune="sdm") +#' test_maxent_spec <- sdm_spec_maxent(tune = "sdm") #' test_maxent_spec #' # setting specific values -#' sdm_spec_maxent(tune="custom", feature_classes="lq") +#' sdm_spec_maxent(tune = "custom", feature_classes = "lq") #' @export -sdm_spec_maxent <- function(..., tune=c("sdm","all","custom","none")){ - tune <- rlang::arg_match(tune) - if (tune=="sdm"){ - base_spec <- maxent(feature_classes = tune(), - regularization_multiplier = tune(), - ...) - } else if (tune=="all"){ - base_spec <- maxent(feature_classes = tune(), - regularization_multiplier = tune(), - ...) - } else if ((tune=="custom") | (tune=="none")){ +sdm_spec_maxent <- function(..., tune = c("sdm", "all", "custom", "none")) { + tune <- rlang::arg_match(tune) + if (tune == "sdm") { + base_spec <- maxent( + feature_classes = tune(), + regularization_multiplier = tune(), + ... + ) + } else if (tune == "all") { + base_spec <- maxent( + feature_classes = tune(), + regularization_multiplier = tune(), + ... + ) + } else if ((tune == "custom") | (tune == "none")) { base_spec <- maxent(...) } base_spec diff --git a/R/sdm_spec_rand_forest.R b/R/sdm_spec_rand_forest.R index 90b03692..63d94df5 100644 --- a/R/sdm_spec_rand_forest.R +++ b/R/sdm_spec_rand_forest.R @@ -9,32 +9,34 @@ #' @param ... parameters to be passed to [parsnip::rand_forest()] to #' customise the model. See the help of that function for details. #' @param tune character defining the tuning strategy. Valid strategies are: -#' {itemize: -#' /item: "sdm" chooses hyperparameters that are most important to tune for +#' * "sdm" chooses hyperparameters that are most important to tune for #' an sdm (for *rf*, 'mtry') -#' /item: "all" tunes all hyperparameters (for *rf*, 'mtry', 'trees' and 'min') -#' /item: "custom" passes the options from '...' -#' /item: "none" does not tune any hyperparameter -#' } +#' * "all" tunes all hyperparameters (for *rf*, 'mtry', 'trees' and 'min') +#' * "custom" passes the options from '...' +#' * "none" does not tune any hyperparameter #' @returns a [parsnip::model_spec] of the model. #' @examples -#' test_rf_spec <- sdm_spec_rf(tune="sdm") +#' test_rf_spec <- sdm_spec_rf(tune = "sdm") #' test_rf_spec #' # combining tuning with specific values for other hyperparameters -#' sdm_spec_rf(tune="sdm", trees=100) +#' sdm_spec_rf(tune = "sdm", trees = 100) #' @export -sdm_spec_rand_forest <- function(..., tune=c("sdm","all","custom","none")){ - tune <- rlang::arg_match(tune) - if (tune=="sdm"){ - base_spec <- parsnip::rand_forest(mtry = tune(), - ...) - } else if (tune=="all"){ - base_spec <- parsnip::rand_forest(mtry = tune(), - min_n = tune(), - trees = tune(), - ...) - } else if ((tune=="custom") | (tune=="none")){ +sdm_spec_rand_forest <- function(..., tune = c("sdm", "all", "custom", "none")) { + tune <- rlang::arg_match(tune) + if (tune == "sdm") { + base_spec <- parsnip::rand_forest( + mtry = tune(), + ... + ) + } else if (tune == "all") { + base_spec <- parsnip::rand_forest( + mtry = tune(), + min_n = tune(), + trees = tune(), + ... + ) + } else if ((tune == "custom") | (tune == "none")) { base_spec <- parsnip::rand_forest(...) } base_spec %>% @@ -45,6 +47,6 @@ sdm_spec_rand_forest <- function(..., tune=c("sdm","all","custom","none")){ #' @rdname sdm_spec_rand_forest #' @export -sdm_spec_rf <- function(..., tune=c("sdm","all","custom","none")){ +sdm_spec_rf <- function(..., tune = c("sdm", "all", "custom", "none")) { sdm_spec_rand_forest(..., tune = tune) } diff --git a/R/simple_ensemble.R b/R/simple_ensemble.R index 85e43bdb..bff63007 100644 --- a/R/simple_ensemble.R +++ b/R/simple_ensemble.R @@ -9,13 +9,11 @@ #' @param ... not used, this function just creates an empty `simple_ensemble` #' object. Members are added with `add_best_candidates()` #' @returns an empty `simple_ensemble`. This is a tibble with columns: -#' {/itemize: -#' /item: `wflow_id`: the name of the workflows for which the best model was +#' * `wflow_id`: the name of the workflows for which the best model was #' chosen -#' /item: `workflow`: the trained workflow objects -#' /item: `metrics`: metrics based on the crossvalidation resampling used +#' * `workflow`: the trained workflow objects +#' * `metrics`: metrics based on the crossvalidation resampling used #' to tune the models -#' } #' @export simple_ensemble <- function(...) { @@ -29,17 +27,19 @@ simple_ensemble <- function(...) { metrics = list() ) - base_ensemble <- structure(base_ensemble, class = c("simple_ensemble", - class(base_ensemble))) + base_ensemble <- structure(base_ensemble, class = c( + "simple_ensemble", + class(base_ensemble) + )) } #' @export print.simple_ensemble <- function(x, ...) { rlang::inform("A simple_ensemble of models") - if (nrow(x)>0) { - rlang::inform(c("\nMembers:",x$wflow_id)) - rlang::inform(c("\nAvailable metrics:",attr(x,"metrics"))) - rlang::inform(c("\nMetric used to tune workflows:",attr(x,"best_metric"))) + if (nrow(x) > 0) { + rlang::inform(c("\nMembers:", x$wflow_id)) + rlang::inform(c("\nAvailable metrics:", attr(x, "metrics"))) + rlang::inform(c("\nMetric used to tune workflows:", attr(x, "best_metric"))) } else { rlang::inform("\nThis object is empty; add models with `add_members()`") } @@ -49,4 +49,3 @@ print.simple_ensemble <- function(x, ...) { summary.simple_ensemble <- function(object, ...) { print(object) } - diff --git a/R/spatial_initial_split.R b/R/spatial_initial_split.R index 95112f32..f448cc9a 100644 --- a/R/spatial_initial_split.R +++ b/R/spatial_initial_split.R @@ -11,36 +11,37 @@ #' functions to extract the data in each split. #' @examples #' set.seed(123) -#' block_initial <- spatial_initial_split(boston_canopy, prop = 1/5, spatial_block_cv) +#' block_initial <- spatial_initial_split(boston_canopy, prop = 1 / 5, spatial_block_cv) #' testing(block_initial) #' training(block_initial) #' @export -spatial_initial_split <- function (data, prop, strategy, ...){ +spatial_initial_split <- function(data, prop, strategy, ...) { # load spatialsample if we need it - if (!isNamespaceLoaded("spatialsample")){ + if (!isNamespaceLoaded("spatialsample")) { attachNamespace("spatialsample") } # check that strategy is a spatialsample function if (!exists(deparse(substitute(strategy)), - where='package:spatialsample', - mode='function')){ - stop (deparse(substitute(strategy))," is not a function in spatialsample") + where = "package:spatialsample", + mode = "function" + )) { + stop(deparse(substitute(strategy)), " is not a function in spatialsample") } - if (!is.numeric(prop) | prop >= 1 | prop <= 0) { + if (!is.numeric(prop) || prop >= 1 || prop <= 0) { rlang::abort("`prop` must be a number on (0, 1).") } else { - v <- round(1/prop, digits = 0) + v <- round(1 / prop, digits = 0) } # use the requested strategy to create a spatial rset - initial_rset <- strategy(data, v=v, ...) + initial_rset <- strategy(data, v = v, ...) ## create an initial split from the one of the splits in the spatial set - rsplit_initial <-rsample::get_rsplit(initial_rset, sample(nrow(initial_rset),1)) + rsplit_initial <- rsample::get_rsplit(initial_rset, sample(nrow(initial_rset), 1)) ## assign it the correct classes - class(rsplit_initial) <- c("spatial_initial_split","initial_split", class(rsplit_initial)) + class(rsplit_initial) <- c("spatial_initial_split", "initial_split", class(rsplit_initial)) return(rsplit_initial) } diff --git a/R/thin_by_cell.R b/R/thin_by_cell.R index bda4e76f..d5dedacb 100644 --- a/R/thin_by_cell.R +++ b/R/thin_by_cell.R @@ -24,38 +24,52 @@ #' @returns An object of class [`sf::sf`] or [`data.frame`], the same as "data". #' @export -thin_by_cell <- function(data, raster, coords=NULL, drop_na = TRUE, agg_fact=NULL){ - - if (inherits(raster, "SpatRasterDataset")){ - stop("This function works on a SpatRaster for a given time point.\n", - "For time series, which are represented by a SpatRasterDataset,\n", - "use `thin_by_cell_time()`") +thin_by_cell <- function(data, raster, coords = NULL, drop_na = TRUE, agg_fact = NULL) { + if (inherits(raster, "SpatRasterDataset")) { + stop( + "This function works on a SpatRaster for a given time point.\n", + "For time series, which are represented by a SpatRasterDataset,\n", + "use `thin_by_cell_time()`" + ) } - - # TODO add type checks for these parameters + # add type checks for these parameters return_sf <- FALSE # flag whether we need to return an sf object - if (inherits(data,"sf")){ - data <- data %>% dplyr::bind_cols(sf::st_coordinates(data)) + if (inherits(data, "sf")) { + if (all(c("X", "Y") %in% names(data))) { + if (!all(data[, c("X", "Y")] %>% sf::st_drop_geometry() %>% as.matrix() == sf::st_coordinates(data)) | + any(is.na(data[, c("X", "Y")]))) { + data <- data %>% + dplyr::rename("X_original" = "X", "Y_original" = "Y") %>% + dplyr::bind_cols(sf::st_coordinates(data)) + warning("sf object contained 'X' and 'Y' coordinates that did not match the sf point geometry. + These have been moved to columns 'X_original' and 'Y_original' and new X and Y columns + have been added that match the sf point geometry.") + } + } else { + data <- data %>% dplyr::bind_cols(sf::st_coordinates(data)) + } return_sf <- TRUE } coords <- check_coords_names(data, coords) # randomise the row order, so that when we get the first instance in a cell, # there should be no pattern - data <- data[sample(1:nrow(data)),] - cell_ids <- terra::cellFromXY(raster, - as.matrix(as.data.frame(data)[,coords])) + data <- data[sample(1:nrow(data)), ] + cell_ids <- terra::cellFromXY( + raster, + as.matrix(as.data.frame(data)[, coords]) + ) cells_to_keep <- !duplicated(cell_ids) - if (drop_na){ - cells_to_keep<-((cells_to_keep) & (cell_ids %in% terra::cells(raster))) + if (drop_na) { + cells_to_keep <- ((cells_to_keep) & (cell_ids %in% terra::cells(raster))) } - data_thin <- data[cells_to_keep,] - if (!is.null(agg_fact)){ - raster_agg<-terra::aggregate(terra::rast(raster[[1]]), fact=agg_fact) - data_thin <- thin_by_cell(data_thin, raster_agg, coords=coords, drop_na= FALSE) + data_thin <- data[cells_to_keep, ] + if (!is.null(agg_fact)) { + raster_agg <- terra::aggregate(terra::rast(raster[[1]]), fact = agg_fact) + data_thin <- thin_by_cell(data_thin, raster_agg, coords = coords, drop_na = FALSE) } # remove X and Y that were added to the sf object - if (return_sf){ + if (return_sf) { data_thin <- data_thin %>% dplyr::select(-dplyr::any_of(coords)) } return(data_thin) diff --git a/R/thin_by_cell_time.R b/R/thin_by_cell_time.R index c4839f2f..76ae7660 100644 --- a/R/thin_by_cell_time.R +++ b/R/thin_by_cell_time.R @@ -16,7 +16,7 @@ #' corresponding to the time slices (times should be set as either POSIXlt or #' "years", see [terra::time()] for details), or a [`terra::SpatRasterDataset`] #' where the first dataset will be -#' used (again, times for that dataset should be set as eitehr POSIXlt or +#' used (again, times for that dataset should be set as either POSIXlt or #' "years") #' `terra::time()` #' @param coords a vector of length two giving the names of the "x" and "y" @@ -35,26 +35,26 @@ #' @returns An object of class [`sf::sf`] or [`data.frame`], the same as "data". #' @export -thin_by_cell_time <- function(data, raster, coords=NULL, time_col="time", - lubridate_fun=c, drop_na = TRUE, agg_fact=NULL){ +thin_by_cell_time <- function(data, raster, coords = NULL, time_col = "time", + lubridate_fun = c, drop_na = TRUE, agg_fact = NULL) { # randomise the row order, so that when we get the first instance in a cell, # there should be no pattern - data <- data[sample(1:nrow(data)),] + data <- data[sample(1:nrow(data)), ] # create a vector of times formatted as proper dates time_lub <- lubridate_fun(data %>% dplyr::pull(dplyr::all_of(time_col))) - if (!inherits(time_lub,"POSIXct")){ + if (!inherits(time_lub, "POSIXct")) { stop("time is not a date (or cannot be coerced to one)") } # if we have a SpatRasterDataset, ge thte first dataset - if (inherits(raster, "SpatRasterDataset")){ - raster <- raster [[1]] + if (inherits(raster, "SpatRasterDataset")) { + raster <- raster[[1]] } time_steps <- terra::time(raster) - - if (any(is.na(time_steps))){ + + if (any(is.na(time_steps))) { stop("`raster` does not have a time dimension; use `terra::time()` to set it") } - if ( terra::timeInfo(raster)[1,2]=="years"){ + if (terra::timeInfo(raster)[1, 2] == "years") { time_steps <- lubridate::date_decimal(time_steps) } # convert time_lub dates into indices for the SpatRasterDataset @@ -62,14 +62,15 @@ thin_by_cell_time <- function(data, raster, coords=NULL, time_col="time", sapply(time_lub, function(a, b) { which.min(abs(a - b)) }, time_steps) - data_thin<-NULL - for (i_index in unique(time_indices)){ + data_thin <- NULL + for (i_index in unique(time_indices)) { # get data for this time_index, we remove coordinates as we don't need them - data_sub <- data %>% dplyr::filter(time_indices==i_index) + data_sub <- data %>% dplyr::filter(time_indices == i_index) raster_sub <- raster[[i_index]] data_sub <- thin_by_cell(data_sub, raster_sub, - drop_na = drop_na, agg_fact=agg_fact) - data_thin <- data_thin %>% dplyr::bind_rows(data_sub) + drop_na = drop_na, agg_fact = agg_fact + ) + data_thin <- data_thin %>% dplyr::bind_rows(data_sub) } return(data_thin) } diff --git a/R/thin_by_dist.R b/R/thin_by_dist.R index e04a9245..52a3d385 100644 --- a/R/thin_by_dist.R +++ b/R/thin_by_dist.R @@ -76,7 +76,7 @@ thin_by_dist <- function(data, dist_min, coords = NULL) { n_neighbours[points_to_remove] <- 0 ## Set the occ to be ignored in the next iteration of the while loop - dist_mat[points_to_remove,] <- FALSE + dist_mat[points_to_remove, ] <- FALSE dist_mat[, points_to_remove] <- FALSE ## Note the occurrence for removal from the thinned data set @@ -84,11 +84,11 @@ thin_by_dist <- function(data, dist_min, coords = NULL) { } ## Subset the original dataset - thinned_points <- data[points_to_keep,] + thinned_points <- data[points_to_keep, ] if (return_dataframe) { thinned_points <- thinned_points %>% dplyr::bind_cols(sf::st_coordinates(thinned_points)) %>% # re-add coordinates - as.data.frame() %>% #turn it into a data.frame + as.data.frame() %>% # turn it into a data.frame dplyr::select(-"geometry") %>% # remove the geometry column dplyr::rename("{coords[1]}" := "X", "{coords[2]}" := "Y") } diff --git a/R/thin_by_dist_time.R b/R/thin_by_dist_time.R index b585bf9e..306147f8 100644 --- a/R/thin_by_dist_time.R +++ b/R/thin_by_dist_time.R @@ -33,7 +33,7 @@ # This code is an adaptation of spThin to work on sf objects thin_by_dist_time <- function(data, dist_min, interval_min, coords = NULL, - time_col="time", lubridate_fun=c) { + time_col = "time", lubridate_fun = c) { return_dataframe <- FALSE # flag whether we need to return a data.frame # cast to sf if needed @@ -45,13 +45,15 @@ thin_by_dist_time <- function(data, dist_min, interval_min, coords = NULL, } # create a vector of times formatted as proper dates - time_lub <- data[,time_col] %>% as.data.frame() %>% dplyr::select(dplyr::all_of(time_col)) + time_lub <- data[, time_col] %>% + as.data.frame() %>% + dplyr::select(dplyr::all_of(time_col)) - time_lub <- lubridate_fun(time_lub[,time_col]) - if (!inherits(time_lub,"POSIXct")){ + time_lub <- lubridate_fun(time_lub[, time_col]) + if (!inherits(time_lub, "POSIXct")) { stop("time is not a date (or cannot be coerced to one)") } - time_in_days<- as.numeric(time_lub - lubridate::origin) + time_in_days <- as.numeric(time_lub - lubridate::origin) # compute an interval matrix (analogous to the dist_mat, but for time) interval_mat <- as.matrix(stats::dist(time_in_days, diag = TRUE, upper = TRUE)) < interval_min @@ -97,7 +99,7 @@ thin_by_dist_time <- function(data, dist_min, interval_min, coords = NULL, n_neighbours[points_to_remove] <- 0 ## Set the occ to be ignored in the next iteration of the while loop - dist_mat[points_to_remove,] <- FALSE + dist_mat[points_to_remove, ] <- FALSE dist_mat[, points_to_remove] <- FALSE ## Note the occurrence for removal from the thinned data set @@ -105,11 +107,11 @@ thin_by_dist_time <- function(data, dist_min, interval_min, coords = NULL, } ## Subset the original dataset - thinned_points <- data[points_to_keep,] + thinned_points <- data[points_to_keep, ] if (return_dataframe) { thinned_points <- thinned_points %>% dplyr::bind_cols(sf::st_coordinates(thinned_points)) %>% # re-add coordinates - as.data.frame() %>% #turn it into a data.frame + as.data.frame() %>% # turn it into a data.frame dplyr::select(-"geometry") %>% # remove the geometry column dplyr::rename("{coords[1]}" := "X", "{coords[2]}" := "Y") } diff --git a/R/tidysdm.R b/R/tidysdm.R index 634923ad..312ba0a7 100644 --- a/R/tidysdm.R +++ b/R/tidysdm.R @@ -1,7 +1,23 @@ #' tidysdm #' #' This `R` library facilitates the fitting of Species Distribution -#' Models with `tidymodels` +#' Models with `tidymodels`. +#' +#' The functionalities of `tidysdm` are described in +#' Leonardi et al. (2023) \doi{10.1101/2023.07.24.550358}. Please cite it if you +#' use `tidysdm` in your research. +#' +#' On its dedicated [website](https://evolecolgroup.github.io/tidysdm/), you can find +#' Articles giving you a step-by-step [overview of the package](https://evolecolgroup.github.io/tidysdm/articles/a0_tidysdm_overview.html), +#' how to use [`tidysdm` on palaeodata](https://evolecolgroup.github.io/tidysdm/articles/a1_palaeodata_application.html), +#' examples of [advanced modelling approaches using `tidymodels` features](https://evolecolgroup.github.io/tidysdm/articles/a2_tidymodels_additions.html), +#' and a [troubleshooting guide for when models fail](https://evolecolgroup.github.io/tidysdm/articles/a3_troubleshooting.html). +#' There is also a +#' [development version](https://evolecolgroup.github.io/tidysdm/dev/) of the site +#' updated for the `dev` version (on the top left, the version number is in +#' red, and will be in the format x.x.x.9xxx, indicating it is a +#' development version). +#' #' @docType package #' @name tidysdm #' @import tidymodels diff --git a/R/tss.R b/R/tss.R index 5a950329..3c671120 100644 --- a/R/tss.R +++ b/R/tss.R @@ -14,17 +14,17 @@ #' and estimate arguments, or a table/matrix where the true class #' results should be in the columns of the table. #' @param ... Not currently used. -#' @param truth The column identifier for the true class results (that is a factor). This should be an unquoted column name although this argument is passed by expression and supports quasiquotation (you can unquote column names). For ⁠_vec()⁠ functions, a factor vector. -#' @param estimate The column identifier for the predicted class results (that is also factor). As with truth this can be specified different ways but the primary method is to use an unquoted variable name. For ⁠_vec()⁠ functions, a factor vector. +#' @param truth The column identifier for the true class results (that is a factor). This should be an unquoted column name although this argument is passed by expression and supports quasiquotation (you can unquote column names). For _vec() functions, a factor vector. +#' @param estimate The column identifier for the predicted class results (that is also factor). As with truth this can be specified different ways but the primary method is to use an unquoted variable name. For _vec() functions, a factor vector. #' @param estimator One of: "binary", "macro", "macro_weighted", or "micro" to specify the type of averaging to be done. "binary" is only relevant for the two class case. The other three are general methods for calculating multiclass metrics. The default will automatically choose "binary" or "macro" based on estimate. #' @param na_rm A logical value indicating whether NA values should be stripped before the computation proceeds. -#' @param case_weights The optional column identifier for case weights. This should be an unquoted column name that evaluates to a numeric column in data. For ⁠_vec()⁠ functions, a numeric vector. +#' @param case_weights The optional column identifier for case weights. This should be an unquoted column name that evaluates to a numeric column in data. For _vec() functions, a numeric vector. #' @param event_level A single string. Either "first" or "second" to specify which level of truth to consider as the "event". This argument is only applicable when estimator = "binary". The default is "first". #' @returns A tibble with columns .metric, .estimator, and .estimate and 1 row of values. #' For grouped data frames, the number of rows returned will be the same as the #' number of groups. #' @examples -#' #Two class +#' # Two class #' data("two_class_example") #' tss(two_class_example, truth, predicted) #' # Multiclass @@ -32,8 +32,8 @@ #' data(hpc_cv) #' # Groups are respected #' hpc_cv %>% -#' group_by(Resample) %>% -#' tss(obs, pred) +#' group_by(Resample) %>% +#' tss(obs, pred) #' @export tss <- function(data, ...) { UseMethod("tss") @@ -46,13 +46,13 @@ tss <- new_class_metric( #' @rdname tss #' @export tss.data.frame <- function(data, - truth, - estimate, - estimator = NULL, - na_rm = TRUE, - case_weights = NULL, - event_level = "first", - ...) { + truth, + estimate, + estimator = NULL, + na_rm = TRUE, + case_weights = NULL, + event_level = "first", + ...) { class_metric_summarizer( name = "tss", fn = yardstick::j_index_vec, @@ -65,4 +65,3 @@ tss.data.frame <- function(data, event_level = event_level ) } - diff --git a/R/tss_max.R b/R/tss_max.R index 72f93a42..3aac0856 100644 --- a/R/tss_max.R +++ b/R/tss_max.R @@ -14,11 +14,11 @@ #' and estimate arguments, or a table/matrix where the true class #' results should be in the columns of the table. #' @param ... A set of unquoted column names or one or more dplyr selector functions to choose which variables contain the class probabilities. If truth is binary, only 1 column should be selected, and it should correspond to the value of event_level. Otherwise, there should be as many columns as factor levels of truth and the ordering of the columns should be the same as the factor levels of truth. -#' @param truth The column identifier for the true class results (that is a factor). This should be an unquoted column name although this argument is passed by expression and supports quasiquotation (you can unquote column names). For ⁠_vec()⁠ functions, a factor vector. +#' @param truth The column identifier for the true class results (that is a factor). This should be an unquoted column name although this argument is passed by expression and supports quasiquotation (you can unquote column names). For _vec() functions, a factor vector. #' @param estimator One of "binary", "hand_till", "macro", or "macro_weighted" to specify the type of averaging to be done. "binary" is only relevant for the two class case. The others are general methods for calculating multiclass metrics. The default will automatically choose "binary" if truth is binary, "hand_till" if truth has >2 levels and case_weights isn't specified, or "macro" if truth has >2 levels and case_weights is specified (in which case "hand_till" isn't well-defined). #' @param na_rm A logical value indicating whether NA values should be stripped before the computation proceeds. #' @param event_level A single string. Either "first" or "second" to specify which level of truth to consider as the "event". This argument is only applicable when estimator = "binary". The default uses an internal helper that generally defaults to "first" -#' @param case_weights The optional column identifier for case weights. This should be an unquoted column name that evaluates to a numeric column in data. For ⁠_vec()⁠ functions, a numeric vector. +#' @param case_weights The optional column identifier for case weights. This should be an unquoted column name that evaluates to a numeric column in data. For _vec() functions, a numeric vector. #' @param estimate If truth is binary, a numeric vector of class probabilities corresponding to the "relevant" class. Otherwise, a matrix with as many columns as factor levels of truth. It is assumed that these are in the same order as the levels of truth. #' @returns A tibble with columns .metric, .estimator, and .estimate and 1 row of values. #' For grouped data frames, the number of rows returned will be the same as the @@ -61,20 +61,22 @@ tss_max.data.frame <- function(data, #' @rdname tss_max #' @export -tss_max.sf <- function(data,...){ - data %>% dplyr::as_tibble() %>% tss_max(...) +tss_max.sf <- function(data, ...) { + data %>% + dplyr::as_tibble() %>% + tss_max(...) } #' @export #' @rdname tss_max tss_max_vec <- function(truth, - estimate, - estimator = NULL, - na_rm = TRUE, - event_level = "first", - case_weights = NULL, - ...) { + estimate, + estimator = NULL, + na_rm = TRUE, + event_level = "first", + case_weights = NULL, + ...) { utils::getFromNamespace("abort_if_class_pred", "yardstick")(truth) estimator <- yardstick::finalize_estimator(truth, estimator, "tss_max") @@ -100,10 +102,10 @@ tss_max_vec <- function(truth, } tss_max_estimator_impl <- function(truth, - estimate, - estimator, - event_level, - case_weights) { + estimate, + estimator, + event_level, + case_weights) { if (!utils::getFromNamespace("is_binary", "yardstick")(estimator)) { stop("tss_max is only available for binary classes; multiclass is not supported") } @@ -115,20 +117,18 @@ tss_max_estimator_impl <- function(truth, pres_level <- levels(truth)[2] absence_level <- levels(truth)[1] } - presences <- estimate[truth==pres_level] - absences <- estimate[truth==absence_level] + presences <- estimate[truth == pres_level] + absences <- estimate[truth == absence_level] # TODO we could implement case weights by properly fitting TSS from yardstick - if (!is.null(case_weights)){ + if (!is.null(case_weights)) { stop("tss_max with case_weights has not been implemented yet") } - + conf_matrix_df <- conf_matrix_df(presences, absences) - sens = (conf_matrix_df$tp / (conf_matrix_df$tp + conf_matrix_df$fn)) - spec = (conf_matrix_df$tn / (conf_matrix_df$tn + conf_matrix_df$fp)) + sens <- (conf_matrix_df$tp / (conf_matrix_df$tp + conf_matrix_df$fn)) + spec <- (conf_matrix_df$tn / (conf_matrix_df$tn + conf_matrix_df$fp)) - tss = (sens + spec) - 1 + tss <- (sens + spec) - 1 max(tss) ## return the maximum TSS } - - diff --git a/R/y2d.R b/R/y2d.R index bda53bc6..49ad43e3 100644 --- a/R/y2d.R +++ b/R/y2d.R @@ -12,6 +12,6 @@ #' #' @export -y2d <- function(x){ - lubridate::date_decimal(x+1950)-lubridate::date_decimal(1950) +y2d <- function(x) { + lubridate::date_decimal(x + 1950) - lubridate::date_decimal(1950) } diff --git a/R/ybp2date.R b/R/ybp2date.R deleted file mode 100644 index 142cfa66..00000000 --- a/R/ybp2date.R +++ /dev/null @@ -1,31 +0,0 @@ -#' Convert years BP from pastclim to lubridate date, or vice versa -#' -#' These functions convert between years BP as used by pastclim (negative numbers going into -#' the past, positive into the future) and standard -#' `POSIXct` date objects. -#' @param x a time in years BP using the `pastclim` convention of -#' negative numbers indicating years into the past, or a `POSIXct` date object -#' @returns a `POSIXct` date object, or a vector -#' @examples -#' ybp2date(-10000) -#' ybp2date(0) -#' # back and forth -#' date2ybp(ybp2date(-10000)) -#' -#' @export - -ybp2date <- function(x){ - if (!is.numeric(x)){ - stop("x should be numeric") - } - lubridate::date_decimal(x+1950) -} - -#' @rdname ybp2date -#' @export -date2ybp <- function(x){ - if(!inherits(x,"POSIXct")){ - stop("x should be a POSIXct object") - } - lubridate::year(x)-1950 -} diff --git a/R/zzz.R b/R/zzz.R index 089281da..bcc0765e 100644 --- a/R/zzz.R +++ b/R/zzz.R @@ -1,4 +1,10 @@ .onLoad <- function(libname, pkgname) { + # CRAN OMP THREAD LIMIT + # if OMP limit is unset, set it to 1 + # if the user has already set it to something else, leave it alone + if (Sys.getenv("OMP_THREAD_LIMIT")=="") { + Sys.setenv("OMP_THREAD_LIMIT" = 1) + } # This defines maxent in the model database current <- parsnip::get_model_env() # only set the model if it does not exist yet @@ -6,5 +12,4 @@ if (!any(current$models == "maxent")) { make_maxent() } - } diff --git a/README.md b/README.md index 74f516e7..0632b01e 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![R-CMD-check](https://github.com/EvolEcolGroup/tidysdm/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/EvolEcolGroup/tidysdm/actions/workflows/R-CMD-check.yaml) -[![codecov](https://codecov.io/gh/EvolEcolGroup/tidysdm/branch/main/graph/badge.svg?token=KLOzxJoLBO)](https://codecov.io/gh/EvolEcolGroup/tidysdm) +[![codecov](https://codecov.io/gh/EvolEcolGroup/tidysdm/branch/main/graph/badge.svg?token=KLOzxJoLBO)](https://app.codecov.io/gh/EvolEcolGroup/tidysdm) The goal of `tidysdm` is to implement Species Distribution Models using the @@ -21,7 +21,7 @@ with [`pastclim`](https://evolecolgroup.github.io/pastclim/dev/index.html), which helps downloading and manipulating present day data, future predictions, and palaeoclimate reconstructions. -An overviewof the capabilities of `tidysdm` is given in [Leonardi et al. +An overview of the capabilities of `tidysdm` is given in [Leonardi et al. (2023)](https://doi.org/10.1101/2023.07.24.550358). ## Installation @@ -42,16 +42,6 @@ that might not be mature yet, use: devtools::install_github("EvolEcolGroup/tidysdm", ref = "dev") ``` - -To take advantage of the integration with `pastclim` highlighted in the articles, you -will need the `dev` version (NOT the one on CRAN). You can obtain it with: -``` r -install.packages('terra', repos='https://rspatial.r-universe.dev') - -devtools::install_github("EvolEcolGroup/pastclim", ref="dev") -``` - - ## Overview of functionality On its dedicated [website](https://evolecolgroup.github.io/tidysdm/), @@ -65,7 +55,8 @@ There is also a [dev version](https://evolecolgroup.github.io/tidysdm/dev/) of the site updated for the `dev` branch of `tidysdm` (on the top left of the dev website, the version number is in red and in the format x.x.x.9xxx, -indicating it is a development version). +indicating it is a development version). If you want to contribute, make +sure to read our [contributing guide](https://evolecolgroup.github.io/tidysdm/CONTRIBUTING.html). ## When something does not work @@ -87,4 +78,5 @@ new issue. Please make sure you have updated to the latest version of `tidysdm`, as well as updating all other packages on your system, and provide [a reproducible example](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) -for the developers to investigate the problem. +for the developers to investigate the problem. If you think you can help +with fixing that bug, read our [contributing guide](https://evolecolgroup.github.io/tidysdm/CONTRIBUTING.html). diff --git a/cran-comments.md b/cran-comments.md new file mode 100644 index 00000000..1736e230 --- /dev/null +++ b/cran-comments.md @@ -0,0 +1,33 @@ +This is a new package not present on CRAN yet. + +On all testing environment (see below), we only get a note because of the +package being a new submission, and a false positive for mispelling +(author name in the reference, and tidymodels). + +## Test environments +- R-hub windows-x86_64-devel (r-devel) +- R-hub ubuntu-gcc-release (r-release) +- R-hub fedora-clang-devel (r-devel) +- devtools::check_mac_release +- devtools::check_win_devel() + +## R CMD check results +On all systems: + +* checking CRAN incoming feasibility ... NOTE +Maintainer: ‘Andrea Manica ’ + +New submission + +Possibly misspelled words in DESCRIPTION: + Leonardi (9:6) + Tidymodels (2:41) + al (9:18) + et (9:15) + tidymodels (8:56) + +0 errors ✔ | 0 warnings ✔ | 1 notes ✖ + +## Changes from previous submission +Description text: Fixed a typo, and changed to undirected quotation marks +for package names as requested. \ No newline at end of file diff --git a/data-raw/archive/check_sdm_output_as_recipe.R b/data-raw/archive/check_sdm_output_as_recipe.R deleted file mode 100644 index c5809b60..00000000 --- a/data-raw/archive/check_sdm_output_as_recipe.R +++ /dev/null @@ -1,71 +0,0 @@ -check_sdm_outcome <- function(recipe, - ..., - role = NA, - trained = FALSE, - ref_dist = NULL, - options = list(presence = "presence"), - skip = FALSE, - id = rand_id("sdm_outcome")) { - ## The variable selectors are not immediately evaluated by using - ## the `quos()` function in `rlang`. `ellipse_check()` captures - ## the values and also checks to make sure that they are not empty. - terms <- ellipse_check(...) - add_check( - recipe, - check_sdm_outcome_new( - terms = terms, - trained = trained, - role = role, - ref_dist = ref_dist, - options = options, - skip = skip, - id = id - ) - ) -} -check_sdm_outcome_new <- - function(terms, - role, - trained, - ref_dist, - options, - skip, - id) { - check( - subclass = "sdm_outcome", - terms = terms, - role = role, - trained = trained, - ref_dist = ref_dist, - options = options, - skip = skip, - id = id - ) - } -prep.check_sdm_outcome <- function(x, training, info = NULL, ...) { - browser() - col_names <- recipes_eval_select(x$terms, training, info) - ## Check that the level exists - #x$options$present %in% - - ## Use the constructor function to return the updated object. - ## Note that `trained` is now set to TRUE - check_sdm_outcome_new( - terms = x$terms, - trained = TRUE, - role = x$role, - ref_dist = ref_dist, - options = x$options, - skip = x$skip, - id = x$id - ) -} -bake.check_sdm_outcome <- function(object, new_data, ...) { - ## Check in case we do have the response variable in new_data (we shouldn't, really, or do we) - browser() - ## Always convert to tibbles on the way out - tibble::as_tibble(new_data) -} -bradypus_recipe <- recipe(presence ~ ., data = bradypus_tb) %>% - check_sdm_outcome(presence = "presence") -bradypus_recipe %>% prep(training = bradypus_tb) diff --git a/data-raw/archive/extract_spatraster_sf.R b/data-raw/archive/extract_spatraster_sf.R deleted file mode 100644 index 96c8a0c2..00000000 --- a/data-raw/archive/extract_spatraster_sf.R +++ /dev/null @@ -1,16 +0,0 @@ -#' Extract values of sf points from a SpatRaster -#' -#' Additional method for [terra::extract()] to use an sf point object instead of -#' a SpatVector when extracting. It simply casts the sf into a SpatVector in -#' the background. -#' @param x the SpatRaster -#' @param y the sf point object -#' @returns an sf object with the values from the SpatRaster -#' @export -#' @importMethodsFrom terra extract - -setMethod("extract", signature(x="SpatRaster", y="sf"), - function(x,y,...){ - # terra::extract(x,terra::vect(y),...) - rlang::inform("you are here") - }) diff --git a/data-raw/archive/finalize_workflow_set.R b/data-raw/archive/finalize_workflow_set.R deleted file mode 100644 index ae671256..00000000 --- a/data-raw/archive/finalize_workflow_set.R +++ /dev/null @@ -1,75 +0,0 @@ -#' Finalize a workflow set to create an ensemble set -#' -#' This function selects the best model within each workflow based on the -#' metric provided, and then creates an `ensemble_set`, which can be later used -#' to make ensemble predictions. The `ensemble set` needs then to be fitted to -#' the training data, and can be later used to make predictions on the testing -#' set. -#' @param x a [workflowsets::workflow_set] object, fully trained -#' @param metric a string with the name of the metric to be used -#' @export - -# TODO add a threshold used to select whether a workflow should be excluded -#finalise a workflowset, extracting the best fits for each workflow -finalize_workflow_set <- function(x, metric){ - wkflow_id <- x$wflow_id - # create a list of workflows - wkflow_list <- list() - for (i_wkflow in wkflow_id){ - wkflow_list[[i_wkflow]] <- finalize_workflow( - extract_workflow(x, i_wkflow), - select_best(extract_workflow_set_result(x, i_wkflow), metric) - ) - } - # rank results - ranked_results <- rank_results(x, rank_metric = metric, select_best = TRUE) - ranked_results <- ranked_results[match(names(wkflow_list), - ranked_results$wflow_id),] - # TODO special case for gam, bring over the formula - ensemble_set<-list(workflow = wkflow_list, - # we need to sort this in the same order as above - metrics_cv = ranked_results, - trained = FALSE) - class(ensemble_set)<-c("ensemble_set", class(ensemble_set)) - ensemble_set -} - -#' Fit an ensemble set -#' -#' Once an ensemble set has been created with [finalise()] applied to -#' a [workflowsets::workflow_set] object, the workflows should be fitted to the -#' full training dataset. -#' @param object an ensemble_set object -#' @param data the data to fit to (usually the full training dataset) -#' @export - -fit.ensemble_set <- function(object, data, ...) { - object$workflow <- lapply(object$workflow, fit, data=data, ...) - # TODO figure out how to set that worksets are fitted - object$trained = TRUE - object -} - -#' Predict for an ensemble set -#' -#' Predict to a new dataset for each workflow in the ensemble set. -#' @param object an ensemble_set object -#' @param new_data the data to fit to (usually the full training dataset) -#' @export -predict.ensemble_set <- function (object, new_data, type=NULL, fun = NULL, metric = NULL, ...){ - if (!object$trained) { - stop("the ensemble_set needs to train first. Use fit() with the training dataset") - } - predictions <- lapply(object$workflow, predict, new_data = new_data, type = type, ...) - predictions -} - -# ensemble_set <- function(model_list){ -# if (!all(unlist(lapply(model_list, inherits,"workflow")))){ -# stop("all models in model_lists should be workflows") -# } -# # TODO check that models are not trained (we will train them later) -# class(model_list)<-c("ensemble_set", class(model_list)) -# } - - diff --git a/data-raw/archive/note_on_optional_variables_in_recipes.R b/data-raw/archive/note_on_optional_variables_in_recipes.R deleted file mode 100644 index 1d349c9d..00000000 --- a/data-raw/archive/note_on_optional_variables_in_recipes.R +++ /dev/null @@ -1 +0,0 @@ -foo %>% add_role(any_of("time_steps"),new_role="time2") diff --git a/data-raw/archive/optim_thresh_workflow.R b/data-raw/archive/optim_thresh_workflow.R deleted file mode 100644 index a0fb11f3..00000000 --- a/data-raw/archive/optim_thresh_workflow.R +++ /dev/null @@ -1,64 +0,0 @@ -calib_class_thresh <- function(object, class_thresh, metric_thresh=NULL){ - # check that there is no entry for this calibration - if (!is.null(attr(object,"class_thresholds"))){ - - } - - browser() - fun_names <- c("mean", "median","weighted_mean","weighted_median") - # generate predictions from the training data - training_preds <-predict(object,new_data=extract_mold(object$workflow[[1]])$predictors, - type="prob", fun = fun_names, - class_thresh = class_thresh, metric_thresh= metric_thresh - ) - # extract the truth from the training data - training_outcomes <- extract_mold((object$workflow[[1]]))$outcome %>% dplyr::pull(1) - - # get the thresholds for each model - calib_tb <- tibble::tibble(class_thresh=list(), - metric_thresh=list(), - fun = character(), - optim_value=numeric() - ) - for (i_col in seq_along(ncol(training_preds))){ - calib_tb <- calib_tb %>% - dplyr::bind_rows(tibble::tibble(class_thresh=list(class_thresh), - metric_thresh=list(metric_thresh), - fun = fun_names[i_col], - optim_value = optim_thresh(training_outcomes, - training_preds[,i_col], - metric = class_thresh) - ) - ) - } - - # now store the new thresholds - if (!is.null(attr(object, "class_thresholds"))) { - attr(object, "class_thresholds") <- calib_tb - } else { - attr(object, "class_thresholds") <- - attr(object, "class_thresholds") %>% - bind_rows(calib_tb) - } - object -} - -calib_class_thresh(test_ens, class_thresh="tss_max") -calib_class_thresh(test_ens, class_thresh=c("sens",0.9)) - - -optim_thres_workflow <- function(object, metric, event_level="first"){ - outcomes_model <- extract_mold(object)$outcome %>% - bind_cols(predict(object,new_data=extract_mold(object)$predictors, type="prob")) - if (event_level=="first"){ - pred_col=2 - } else if (event_level=="second"){ - pred_col=3 - } - return(optim_thresh(outcomes_model %>% dplyr::pull(1), - outcomes_model %>% dplyr::pull(pred_col), - metric, event_level)) -} - -fitted_wflow <- fit_best(two_class_res) -optim_thres_workflow(fitted_wflow, metric="tss_max") diff --git a/data-raw/archive/plot_pres_vs_abs.R b/data-raw/archive/plot_pres_vs_abs.R deleted file mode 100644 index f134bdcf..00000000 --- a/data-raw/archive/plot_pres_vs_abs.R +++ /dev/null @@ -1,32 +0,0 @@ -#' Plot presences vs background -#' -#' Create a composite plots contrasting the distribution of multiple variables -#' for presences vs the background. -#' -#' @param .data either a `data.frame` (or derived object, such as `tibble`, or -#' `sf`) with values for the bioclimate variables for presences and background; -#' or an `sf` object with coordinates for presences and absences, which will be -#' extracted from -#' @param .col the column containing the presences; it assumes presences to be -#' the first level of this factor -#' @export - -plot_pres_vs_bg <- function( - .data, - .col, - raster=NULL){ - .col = rlang::enquo(.col) %>% rlang::quo_get_expr() %>% rlang::as_string() - # subset to only columns which are numeric - num_vars <- names(.data)[!names(.data)%in%.col] - .data$x<-rep("",nrow(.data)) - plot_list <- list() - for (i_var in num_vars){ - # remove legend and add it to the last panel - p <- ggplot(data=.data, aes(x=x, y=.data[[i_var]],fill=.data[[.col]]))+ - geom_split_violin(nudge=0.01) - browser() - } - - - -} diff --git a/data-raw/archive/predict_model_fit.R b/data-raw/archive/predict_model_fit.R deleted file mode 100644 index c0782689..00000000 --- a/data-raw/archive/predict_model_fit.R +++ /dev/null @@ -1,20 +0,0 @@ -#' Model specification for a Random Forest for SDM -#' -#' This function is wrapper to [parsnip::predict.model_fit] to deal with the -#' case when `new_data` is an [sf::sf] object, as it is the case for data -#' used for Species Distribution Model. -#' -#' @param object An object of class [parsnip::model_fit]. -#' @param new_data A rectangular data object, such as a data frame. -#' @param ... parameters to be passed to [parsnip::predict.model_fit] -#' customise the model. See the help of that function for details. -#' @returns an appropriate object depending on the type argument, see -#' [parsnip::predict.model_fit] for details. -#' @export - -predict.model_fit <- function(object, new_data, ...) { - if (inherits(new_data, "sf")){ - new_data<-new_data %>% dplyr::as_tibble() %>% dplyr::select(-geometry) - } - predict(object, new_data=new_data, ...) -} diff --git a/data-raw/archive/predict_workflow.R b/data-raw/archive/predict_workflow.R deleted file mode 100644 index a985364a..00000000 --- a/data-raw/archive/predict_workflow.R +++ /dev/null @@ -1,22 +0,0 @@ -#' Predict from a workflow -#' -#' This function is wrapper to [workflows::predict.workflow] to deal with the -#' case when `new_data` is an [sf::sf] object, as it is the case for data -#' used for Species Distribution Model. -#' -#' @param object A workflow that has been fit by [workflows::fit.workflow()] -#' @param new_data An [sf::sf] data frame. -#' @param ... parameters to be passed to [workflows::predict.workflow] -#' to define the type of predictions. See the help of that function for details. -#' @returns an appropriate object depending on the type argument, see -#' [workflows::predict.workflow] for details. -#' @export -#' @import workflows - -predict.workflow <- function(object, new_data, ...) { - if (inherits(new_data, "sf")){ - new_data<-new_data %>% dplyr::as_tibble() %>% dplyr::select(-geometry) - } - browser() - workflows:::predict.workflow(object, new_data=new_data, ...) -} diff --git a/data-raw/archive/probably_examples.R b/data-raw/archive/probably_examples.R deleted file mode 100644 index a97ebf57..00000000 --- a/data-raw/archive/probably_examples.R +++ /dev/null @@ -1,17 +0,0 @@ -fit_best(two_class_res)->foo -# from best fit model - - -outcomes_model <- extract_mold(foo)$outcome %>% - bind_cols(predict(foo,new_data=extract_mold(foo)$predictors, type="prob")) - -library(probably) -thresholds <- seq(0, 1, by = 0.001) -# thresholds perfomances -threshold_perf(outcomes_model, Class, .pred_Class1, thresholds = thresholds, - metrics=metric_set(j_index)) - -thresholds[ - which.max(threshold_perf(outcomes_model, Class, .pred_Class1, thresholds = thresholds, - metrics=metric_set(j_index))$.estimate)] - diff --git a/data-raw/archive/useful_bits_of_scripts.R b/data-raw/archive/useful_bits_of_scripts.R deleted file mode 100644 index 7a5c0a28..00000000 --- a/data-raw/archive/useful_bits_of_scripts.R +++ /dev/null @@ -1,17 +0,0 @@ -fit_best(two_class_res)->foo -# from best fit model - -outcomes_model <- extract_mold(foo)$outcome %>% - bind_cols(predict(foo,new_data=extract_mold(foo)$predictors, type="prob")) - -library(probably) -thresholds <- seq(0, 1, by = 0.001) -# thresholds perfomances -threshold_perf(outcomes_model, Class, .pred_Class1, thresholds = thresholds, - metrics=metric_set(j_index)) - -thresholds[ -which.max(threshold_perf(outcomes_model, Class, .pred_Class1, thresholds = thresholds, - metrics=metric_set(j_index))$.estimate)] - - diff --git a/data-raw/create_lacerta_data.R b/data-raw/create_lacerta_data.R deleted file mode 100644 index bbc19a8e..00000000 --- a/data-raw/create_lacerta_data.R +++ /dev/null @@ -1,73 +0,0 @@ -# download presences -library(rgbif) -# download file -occ_download_get(key = "0068808-230530130749713", path=tempdir()) -# unzip file -unzip(file.path(tempdir(),"0068808-230530130749713.zip"), overwrite=TRUE, - exdir=tempdir(), unzip="internal") -# read file -#distrib <- data.table::fread(file.path(tempdir(),"0068808-230530130749713.csv")) -distrib <- read.table(file.path(tempdir(),"0068808-230530130749713.csv"), - row.names = NULL) -distrib <- readr::read_delim(file.path(tempdir(),"0068808-230530130749713.csv")) - -# keep the necessary columns -lacerta <- distrib[,c("gbifID","decimalLatitude", "decimalLongitude")] -names(lacerta) <- c("ID","latitude", "longitude") - -usethis::use_data(lacerta, overwrite=TRUE) -#saveRDS(lacerta, file="./inst/extdata/lacerta_coords.RDS") - - -############################### -### landmask -############################### - -library(pastclim) -land_mask <- get_land_mask(time_ce=1985, dataset="WorldClim_2.1_10m") -# Iberia peninsula extension -iberia_poly <- terra::vect("POLYGON((-9.8 43.3,-7.8 44.1,-2.0 43.7,3.6 42.5,3.8 41.5,1.3 40.8,0.3 39.5,0.9 38.6,-0.4 37.5,-1.6 36.7,-2.3 36.3,-4.1 36.4,-4.5 36.4,-5.0 36.1,-5.6 36.0,-6.3 36.0,-7.1 36.9,-9.5 36.6,-9.4 38.0,-10.6 38.9,-9.5 40.8,-9.8 43.3))") - -crs(iberia_poly)<-"lonlat" -# crop the extent -land_mask <- crop(land_mask, iberia_poly) -# and mask to the polygon -land_mask <- mask(land_mask, iberia_poly) -gdal(warn=3) -writeCDF(land_mask, "./inst/extdata/lacerta_land_mask.nc", - compression=9,split=TRUE, overwrite=TRUE) -# fix time axis (this is a workaround if we open the file with sf) -nc_in <- ncdf4::nc_open("./inst/extdata/lacerta_land_mask.nc", write=TRUE) -ncdf4::ncatt_put(nc_in, varid="time", attname="axis", attval = "T") -ncdf4::nc_close(nc_in) - - -climate_vars <- get_vars_for_dataset("WorldClim_2.1_10m") -climate_present<-pastclim::region_slice(time_ce = 1985, - bio_variables = climate_vars, - data="WorldClim_2.1_10m", - crop=iberia_poly) - -writeCDF(climate_present,"./inst/extdata/lacerta_climate_present_10m.nc", - compression=9,split=TRUE, overwrite=TRUE) -# fix time axis (this is a workaround if we open the file with sf) -nc_in <- ncdf4::nc_open("./inst/extdata/lacerta_climate_present_10m.nc", write=TRUE) -ncdf4::ncatt_put(nc_in, varid="time", attname="axis", attval = "T") -ncdf4::nc_close(nc_in) - - -vars_uncor<-c("bio15", "bio05", "bio13", "bio06") - -climate_future<-pastclim::region_slice(time_ce = 2090, - bio_variables = vars_uncor, - data="WorldClim_2.1_HadGEM3-GC31-LL_ssp245_10m", - crop=iberia_poly) -writeCDF(climate_present,"./inst/extdata/lacerta_climate_future_10m.nc", - compression=9,split=TRUE, overwrite=TRUE) -# fix time axis (this is a workaround if we open the file with sf) -nc_in <- ncdf4::nc_open("./inst/extdata/lacerta_climate_future_10m.nc", write=TRUE) -ncdf4::ncatt_put(nc_in, varid="time", attname="axis", attval = "T") -ncdf4::nc_close(nc_in) - -##### - diff --git a/data-raw/helper_functions/check_returns_in_documentation.R b/data-raw/helper_functions/check_returns_in_documentation.R index c59b7f55..5e8fb2d2 100644 --- a/data-raw/helper_functions/check_returns_in_documentation.R +++ b/data-raw/helper_functions/check_returns_in_documentation.R @@ -4,51 +4,56 @@ ## running: grep -Ril -F "\value" ./man/ -check_returns_in_documentation <-function(){ +check_returns_in_documentation <- function() { # get a list of all files in the man directory - all_files<-dir ("./man") + all_files <- dir("./man") ## there are a number of files that we don't expect to have @returns: - + ## documentation of external dataset; these don't have a usage tag # functions and internal data have usage - files_with_usage <- basename(system2(command = "grep", - args=c("-Ril -F ", shQuote("\\usage"), " ./man/"), - stdout=TRUE) - ) - # but documentation of external datasets do not - external_data <-all_files[!all_files %in% files_with_usage] + files_with_usage <- basename(system2( + command = "grep", + args = c("-Ril -F ", shQuote("\\usage"), " ./man/"), + stdout = TRUE + )) + # but documentation of external datasets do not + external_data <- all_files[!all_files %in% files_with_usage] # the above also catches any subdirectories that are accidentally listed - + ## internal data are of Type data - internal_data <- basename(system2(command = "grep", - args=c("-Ril -F ", shQuote("\\docType{data}"), " ./man/"), - stdout=TRUE) - ) + internal_data <- basename(system2( + command = "grep", + args = c("-Ril -F ", shQuote("\\docType{data}"), " ./man/"), + stdout = TRUE + )) ## the package documentation - package_docs <- basename(system2(command = "grep", - args=c("-Ril -F ", shQuote("\\docType{package}"), " ./man/"), - stdout=TRUE) - ) - excluded_files <- c(internal_data, external_data, package_docs) + package_docs <- basename(system2( + command = "grep", + args = c("-Ril -F ", shQuote("\\docType{package}"), " ./man/"), + stdout = TRUE + )) + excluded_files <- c(internal_data, external_data, package_docs) ## now remove those files from our list all_files <- all_files[!all_files %in% excluded_files] - + # get a list of documentation Rd files with \value, as generated by @returns # note the additional \ to run through system 2 - files_with_value <- basename(system2(command = "grep", - args=c("-Ril -F ", shQuote("\\value"), " ./man/"), - stdout=TRUE) - ) + files_with_value <- basename(system2( + command = "grep", + args = c("-Ril -F ", shQuote("\\value"), " ./man/"), + stdout = TRUE + )) # and finally check if there is any stray file left files_missing_returns <- all_files[!all_files %in% files_with_value] - - if (length(files_missing_returns)!=0){ - stop(paste("There are some files that miss @return:\n", - paste(files_missing_returns, collapse = ", "))) + + if (length(files_missing_returns) != 0) { + stop(paste( + "There are some files that miss @return:\n", + paste(files_missing_returns, collapse = ", ") + )) } else { return("Success") } } check_returns_in_documentation() - diff --git a/data-raw/helper_functions/precompile.R b/data-raw/helper_functions/precompile.R new file mode 100644 index 00000000..3915d8e4 --- /dev/null +++ b/data-raw/helper_functions/precompile.R @@ -0,0 +1,42 @@ +vignette_names <- c("a0_tidysdm_overview", "a1_palaeodata_application", + "a2_tidymodels_additions","a3_troubleshooting") + +if (any(!file.exists(paste0("vignettes/",vignette_names,".Rmd.orig")))){ + file.rename(from = paste0("vignettes/",vignette_names,".Rmd"), + to = paste0("vignettes/",vignette_names,".Rmd.orig")) +} + +for (this_vignette_prefix in vignette_names){ + this_vignette <- paste0(this_vignette_prefix,".Rmd") + # Pre-compile vignette + knitr::knit(paste0("vignettes/",this_vignette,".orig"),paste0("vignettes/",this_vignette)) + + # remove file path such that vignettes will build with figures + replace <- readLines(paste0("vignettes/",this_vignette)) + replace <- gsub("!\\[([^]]+)\\]", "![]", replace) + replace <- gsub("](figure/", paste0("](figure_",this_vignette_prefix,"/"), + replace, fixed=TRUE) + fileConn <- file(paste0("vignettes/",this_vignette)) + writeLines(replace, fileConn) + close(fileConn) + + if (!dir.exists(paste0("vignettes/figure_",this_vignette_prefix))){ + dir.create(paste0("vignettes/figure_",this_vignette_prefix)) + } + # move resource figures to vignette + resources <- + list.files("figure/", pattern = ".png$", full.names = TRUE) + file.copy(from = resources, + to = paste0("vignettes/figure_",this_vignette_prefix), + overwrite = TRUE) + # delete the figure directory + unlink("figure/",recursive = TRUE) +} + + + + +#library("devtools") +#build_vignettes() + + diff --git a/data-raw/helper_functions/submitting_to_cran.R b/data-raw/helper_functions/submitting_to_cran.R new file mode 100644 index 00000000..c168421f --- /dev/null +++ b/data-raw/helper_functions/submitting_to_cran.R @@ -0,0 +1,30 @@ +# to this in the dev branch to make sure that all the fundamental issues have been resolved +# run the spell checking +usethis::use_spell_check(lang = "en-GB") + +# check the links +urlchecker::url_check() + +# enhanced local checks +devtools::check(remote = TRUE, manual = TRUE) +# if unicode characters present and crashing latex +# grep --color='auto' -P -n "[^\x00-\x7F]" -r * + + +source("./data-raw/helper_functions/check_returns_in_documentation.R") + +# now create a cran_submission branch for the final remote tests + +# TO DO MANUALLY: update cran-comments.md accordingly +# update version number +# update news + +# first check with rhub +tidysdm_checks <- rhub::check_for_cran() + +# check on macos and windows via devtools +devtools::check_mac_release() +devtools::check_win_devel() + +# TO DO MANUALLY: if everything passes, edit the cran-comments.md to explain any notes +devtools::release() diff --git a/data-raw/create_horses.R b/data-raw/make_data/create_horses.R similarity index 100% rename from data-raw/create_horses.R rename to data-raw/make_data/create_horses.R diff --git a/data-raw/make_data/create_lacerta_data.R b/data-raw/make_data/create_lacerta_data.R new file mode 100644 index 00000000..bc155c20 --- /dev/null +++ b/data-raw/make_data/create_lacerta_data.R @@ -0,0 +1,82 @@ +# download presences +library(rgbif) +# download file +occ_download_get(key = "0068808-230530130749713", path = tempdir()) +# unzip file +unzip(file.path(tempdir(), "0068808-230530130749713.zip"), + overwrite = TRUE, + exdir = tempdir(), unzip = "internal" +) +# read file +# distrib <- data.table::fread(file.path(tempdir(),"0068808-230530130749713.csv")) +distrib <- read.table(file.path(tempdir(), "0068808-230530130749713.csv"), + row.names = NULL +) +distrib <- readr::read_delim(file.path(tempdir(), "0068808-230530130749713.csv")) + +# keep the necessary columns +lacerta <- distrib[, c("gbifID", "decimalLatitude", "decimalLongitude")] +names(lacerta) <- c("ID", "latitude", "longitude") + +usethis::use_data(lacerta, overwrite = TRUE) +# saveRDS(lacerta, file="./inst/extdata/lacerta_coords.RDS") + + +############################### +### landmask +############################### + +library(pastclim) +land_mask <- get_land_mask(time_ce = 1985, dataset = "WorldClim_2.1_10m") +# Iberia peninsula extension +iberia_poly <- terra::vect("POLYGON((-9.8 43.3,-7.8 44.1,-2.0 43.7,3.6 42.5,3.8 41.5,1.3 40.8,0.3 39.5,0.9 38.6,-0.4 37.5,-1.6 36.7,-2.3 36.3,-4.1 36.4,-4.5 36.4,-5.0 36.1,-5.6 36.0,-6.3 36.0,-7.1 36.9,-9.5 36.6,-9.4 38.0,-10.6 38.9,-9.5 40.8,-9.8 43.3))") + +crs(iberia_poly) <- "lonlat" +# crop the extent +land_mask <- crop(land_mask, iberia_poly) +# and mask to the polygon +land_mask <- mask(land_mask, iberia_poly) +gdal(warn = 3) +writeCDF(land_mask, "./inst/extdata/lacerta_land_mask.nc", + compression = 9, split = TRUE, overwrite = TRUE +) +# fix time axis (this is a workaround if we open the file with sf) +nc_in <- ncdf4::nc_open("./inst/extdata/lacerta_land_mask.nc", write = TRUE) +ncdf4::ncatt_put(nc_in, varid = "time", attname = "axis", attval = "T") +ncdf4::nc_close(nc_in) + + +climate_vars <- get_vars_for_dataset("WorldClim_2.1_10m") +climate_present <- pastclim::region_slice( + time_ce = 1985, + bio_variables = climate_vars, + data = "WorldClim_2.1_10m", + crop = iberia_poly +) + +writeCDF(climate_present, "./inst/extdata/lacerta_climate_present_10m.nc", + compression = 9, split = TRUE, overwrite = TRUE +) +# fix time axis (this is a workaround if we open the file with sf) +nc_in <- ncdf4::nc_open("./inst/extdata/lacerta_climate_present_10m.nc", write = TRUE) +ncdf4::ncatt_put(nc_in, varid = "time", attname = "axis", attval = "T") +ncdf4::nc_close(nc_in) + + +vars_uncor <- c("bio15", "bio05", "bio13", "bio06") + +climate_future <- pastclim::region_slice( + time_ce = 2090, + bio_variables = vars_uncor, + data = "WorldClim_2.1_HadGEM3-GC31-LL_ssp245_10m", + crop = iberia_poly +) +writeCDF(climate_present, "./inst/extdata/lacerta_climate_future_10m.nc", + compression = 9, split = TRUE, overwrite = TRUE +) +# fix time axis (this is a workaround if we open the file with sf) +nc_in <- ncdf4::nc_open("./inst/extdata/lacerta_climate_future_10m.nc", write = TRUE) +ncdf4::ncatt_put(nc_in, varid = "time", attname = "axis", attval = "T") +ncdf4::nc_close(nc_in) + +##### diff --git a/data-raw/mars_deub/mars_debug.R b/data-raw/mars_deub/mars_debug.R deleted file mode 100644 index a54a8578..00000000 --- a/data-raw/mars_deub/mars_debug.R +++ /dev/null @@ -1,47 +0,0 @@ -library(tidymodels) -two_rec <- recipe(Class~.,data=two_class_dat) -mars_spec <- parsnip::mars() %>% - parsnip::set_engine("earth") %>% - parsnip::set_mode("classification") -mars_tune_spec <- parsnip::mars(num_terms=tune()) %>% - parsnip::set_engine("earth") %>% - parsnip::set_mode("classification") -two_tune_wkflow <-# new workflow object - workflow() %>% # use workflow function - add_recipe(two_rec) %>% # add the new recipe - add_model(mars_tune_spec) -two_cv <- vfold_cv(two_class_dat, v=3) - -two_bayer_res <- tune_bayes(two_tune_wkflow, - resamples = two_cv, initial=8) - - - -######################################## -> two_bayer_res <- tune_bayes(two_tune_wkflow, - + resamples = two_cv, initial=8) -→ A | error: `num_terms` should be >= 1. -! No improvement for 10 iterations; returning current results. -There were issues with some computations A: x30 -There were 20 warnings (use warnings() to see them) - -######## -two_rec <- recipe(Class~.,data=two_class_dat) - -svm_poly_tune <- tune_spec <- parsnip::svm_poly(cost=tune()) %>% - parsnip::set_engine("kernlab") %>% - parsnip::set_mode("classification") - -two_svm_wkflow <-# new workflow object - workflow() %>% # use workflow function - add_recipe(two_rec) %>% # add the new recipe - add_model(svm_poly_tune) - - -two_svm_bayes_res <- tune_bayes(two_svm_wkflow, - resamples = two_cv, initial=8) - - -two_svm_grid_res <- tune_grid(two_svm_wkflow, - resamples = two_cv, grid=5, metrics = metric_set(sensitivity)) - diff --git a/data-raw/notes/resp_curve.R b/data-raw/notes/resp_curve.R deleted file mode 100644 index f51d7ed0..00000000 --- a/data-raw/notes/resp_curve.R +++ /dev/null @@ -1,179 +0,0 @@ -library(tidysdm) -lacerta_thin <- readRDS(system.file("extdata/lacerta_climate_sf.RDS", - package="tidysdm")) -lacerta_thin <- lacerta_thin %>% select(-c("bio01", "bio02", "bio03", "bio04", "bio07", "bio08", - "bio09", "bio10", "bio11", "bio12", "bio14", "bio16", - "bio17", "bio18", "bio19", "altitude")) -lacerta_rec <- recipe(lacerta_thin, formula=class~.) - -lacerta_models <- - # create the workflow_set - workflow_set( - preproc = list(default = lacerta_rec), - models = list( - # the standard glm specs - glm = sdm_spec_glm(), - # rf specs with tuning - rf = sdm_spec_rf(), - - ), - # make all combinations of preproc and models, - cross = TRUE - ) %>% - # tweak controls to store information needed later to create the ensemble - option_add(control = control_ensemble_grid()) -set.seed(100) -lacerta_cv <- spatial_block_cv(lacerta_thin, v = 5) -lacerta_models <- - lacerta_models %>% - workflow_map("tune_grid", resamples = lacerta_cv, grid = 3, - metrics = sdm_metric_set(), verbose = TRUE) -lacerta_ensemble <- simple_ensemble() %>% - add_member(lacerta_models, metric="boyce_cont") -lacerta_ensemble - - -## simple profile with recipes -bio05_prof <- lacerta_rec %>% - step_profile(-bio05, profile=vars(bio05)) %>% - prep(training = lacerta_thin) - -bio05_data <- bake(bio05_prof, new_data = NULL) - -bio05_data <- bio05_data %>% - mutate( - pred = predict(lacerta_ensemble, bio05_data)$mean - ) - -ggplot(bio05_data, aes(x = bio05, y = pred)) + - geom_point(alpha = .5, cex = 1) - - -######## -# with DALEX -library(DALEXtra) -data_train <- extract_mold(lacerta_ensemble$workflow[[1]])$predictors -data_response <- as.numeric(extract_mold(lacerta_ensemble$workflow[[1]])$outcomes %>% pull())-1 - -explainer_wkflow <- - explain_tidymodels( - lacerta_ensemble$workflow[[1]], - data= data_train, - y=data_response, - label = lacerta_ensemble$wflow_id[[1]]) - -vip_wkflow <- model_parts(explainer = explainer_wkflow) -plot(vip_wkflow) - - - -## could create a plot function for a list of model parts with the function at -## https://www.tmwr.org/explain -explain_tidysdm <- function( - model, - data = NULL, - y = NULL, - predict_function = NULL, - predict_function_target_column = NULL, - residual_function = NULL, - label = NULL, - verbose = TRUE, - precalculate = TRUE, - colorize = !isTRUE(getOption("knitr.in.progress")), - model_info = NULL, - type = "classification", - by_workflow = FALSE -) { - if (!inherits(model,"simple_ensemble")){ - stop("this function currently only works with simple_ensembles from tidysdm") - } - if (is.null(data)){ - data = extract_mold(lacerta_ensemble$workflow[[1]])$predictors - } - if (is.null(y)){ - # note that we need presences to be 1 and absences to be zero - y <- (as.numeric(extract_mold(lacerta_ensemble$workflow[[1]])$outcomes %>% pull())-2)*-1 - } else { - if (!is.factor(y)){ - stop("y should be a factor with presences as reference levels") - } else { - y <- (as.numeric(y)-2)*-1 - } - } - if (type!="classification"){ - stop("type has to be classification for a tidysdm ensemble") - } - if (is.null(predict_function)){ - predict_function <- function(model, newdata) { - predict(model, newdata)$mean - } - } - - model_info <- list(package = "tidysdm", - ver = utils::packageVersion("tidysdm"), - type = "classification") - - DALEX::explain( - model = model, - data = data, - y = y, - predict_function = predict_function, - predict_function_target_column = predict_function_target_column, - residual_function = residual_function, - weights = NULL, - label = label, - verbose = verbose, - precalculate = precalculate, - colorize = colorize, - model_info = NULL, - type = type - ) -} - -# method for model info to work on simple ensemble -#' @rdname model_info -#' @export -model_info.simple_ensemble<- function(model, is_multiclass=FALSE,...){ - if (is_multiclass){ - stop("tidysdm simple_ensembles can not be multiclass") - } - package <- "tidysdm" - type <- "classification" - ver <- try(as.character(utils::packageVersion(package)), - silent = TRUE) - if (inherits(ver, "try-error")) { - ver <- "Unknown" - } - model_info <- list(package = package, ver = ver, type = type) - class(model_info) <- "model_info" - model_info -} - -# code examples -explainer_lacerta_ens <- explain_tidysdm(lacerta_ensemble) -vip_ensemble <- model_parts(explainer = explainer_lacerta_ens) -plot(vip_ensemble) - -pdp_bio05 <- model_profile(explainer_lacerta_ens, N = 500, variables = "bio05") -plot(pdp_bio05) - - - -######### -library(DALEXtra) -model <- lacerta_ensemble -explainer_list <- list() -for (i in 1:nrow(model)){ - data_train <- workflowsets::extract_mold(model$workflow[[i]])$predictors - data_response <- as.numeric(workflowsets::extract_mold(model$workflow[[i]])$outcomes %>% dplyr::pull())-1 - explainer_list[[i]] <- - DALEXtra::explain_tidymodels( - model$workflow[[i]], - data= data_train, - y=data_response, - label = model$wflow_id[[i]]) -} - - - - diff --git a/data-raw/notes_on_steps.R b/data-raw/notes_on_steps.R index a5551a3c..d5ef5b6c 100644 --- a/data-raw/notes_on_steps.R +++ b/data-raw/notes_on_steps.R @@ -1,13 +1,13 @@ # https://www.tidymodels.org/learn/develop/recipes/ step_dummy_coords <- function(recipe, ..., - role = "predictor", - trained = FALSE, - inputs = NULL, - skip = FALSE, - id = rand_id("coords")) { + role = "predictor", + trained = FALSE, + inputs = NULL, + skip = FALSE, + id = rand_id("coords")) { inputs <- enquos(..., .named = TRUE) - + add_step( recipe, step_dummy_coords_new( @@ -48,20 +48,19 @@ prep.step_dummy_coords <- function(x, training, info = NULL, ...) { #' @export bake.step_dummy_coords <- function(object, new_data, ...) { - if (!all(c("X","Y") %in% names(new_data))){ + if (!all(c("X", "Y") %in% names(new_data))) { new_data <- dplyr::add_column(new_data, X = NA, Y = NA) - } + } browser() return(new_data) - } -#' +#' #' print.step_rename <- #' function(x, width = max(20, options()$width - 35), ...) { #' title <- "Variable renaming for " #' trained_names <- names(x$inputs) -#' +#' #' untrained_terms <- rlang::parse_quos( #' trained_names %||% "", #' rlang::current_env() @@ -69,16 +68,16 @@ bake.step_dummy_coords <- function(object, new_data, ...) { #' print_step(trained_names, untrained_terms, x$trained, title, width) #' invisible(x) #' } -#' +#' #' #' @rdname tidy.recipe #' #' @export #' tidy.step_rename <- function(x, ...) { #' var_expr <- map(x$inputs, quo_get_expr) #' var_expr <- map_chr(var_expr, quo_text, width = options()$width, nlines = 1) -#' +#' #' tibble( #' terms = names(x$inputs) %||% character(), #' value = unname(var_expr) %||% character(), #' id = rep(x$id, length(x$inputs)) #' ) -#' } \ No newline at end of file +#' } diff --git a/data-raw/old_vignettes/advanced_example.Rmd b/data-raw/old_vignettes/advanced_example.Rmd deleted file mode 100644 index ab56d8c8..00000000 --- a/data-raw/old_vignettes/advanced_example.Rmd +++ /dev/null @@ -1,597 +0,0 @@ ---- -title: "Overview" -output: rmarkdown::html_vignette -vignette: > - %\VignetteIndexEntry{Overview} - %\VignetteEngine{knitr::rmarkdown} - %\VignetteEncoding{UTF-8} ---- - -```{r, include = FALSE} -knitr::opts_chunk$set( - collapse = TRUE, - comment = "#>" -) -``` - -# SDMs with tidymodels - -Species Distribution Modelling relies on a number of algorithms, many of which -have a number of hyperparameters that require turning. The `tidymodels` universe -includes a number of packages specifically design to fit, tune and validate -models. The advantage of `tidymodels` is that the models syntax and the results -returned to the users are standardised, thus providing a coherent interface to -modelling. Given the variety of models required for SDM, `tidymodels` provide an -ideal framework. `tidysdm` provides a number of wrappers and specialised -functions to facilitate the fitting of SDM with `tidymodels`. - -# Preparing your data - -We start by reading in a set of locations for leopards covering Africa and -Eurasia. - -```{r} -library(tidysdm) -library(stacks) -library(readr) # for importing data -leopards <- read_csv(system.file("extdata/leopard_coords.csv",package="tidysdm")) -``` - -Let us look at the data: -```{r} -leopards -``` - -We now need to extract climatic variables for this species. As we are working on a very large scale, -we will use reconstructions at 0.5 degree resolution from `pastclim` - -```{r} -library(pastclim) -# main area relevant -leopard_vec<- terra::vect("POLYGON ((0 70, 20.8 72.4,50 80,170 80,170 10,119 2.4,119.2 0.9, 116.1 -7.7,115.3 -9.9,114 -12,100 -40,-25 -40,-17.9 60.9, 0 70))") - -# climate variables to consider -climate_vars <- c("bio01","bio04", "bio05","bio06", "bio07", "bio08", "bio09", "bio10", "bio11", "bio12", "bio13", "bio14", "bio16", "bio18","bio17", "bio19","npp", "lai", "rugosity") - -climate_present<-pastclim::region_slice(time_bp = 0, - bio_variables = climate_vars, - data="Beyer2020", - crop=leopard_vec) -``` - -Environmental variables are often highly correlated, and collinearity is an issue -for several types of models. For many projects, we will want to subset our data -to a set of uncorrelated variables. There are a number of approaches to detect -and remove correlated variables. In `tidysdm`, you can use the function -`filter_high_cor` to return a set of variables all with correlations below a given cutoff. - -```{r choose_var_cor} -vars_to_keep <- filter_high_cor(climate_present, cutoff = 0.7) -vars_to_keep -``` - -It is often better to choose variables based on some biology... but for this -simple example, we will go with this approach: - -```{r} -climate_present<-climate_present[[vars_to_keep]] -``` - -Now thin the observations to have a one per cell in the raster (it would be better -if we had an equal area projection...): -```{r} -leopards<-thin_by_cell(leopards, raster = climate_present, - coords=c("Longitude", "Latitude")) -nrow(leopards) -``` - -Now sample background pseudoabsences, selecting as many points as presences -```{r} -set.seed(123) -leopards_all<-sample_pseudoabs(leopards, - n=nrow(leopards), - raster=climate_present, - coords=c("Longitude", "Latitude")) -``` - - -Now let's get the climate for these location -```{r climate_for_presences} -leopards_all <- leopards_all %>% - bind_cols(terra::extract(climate_present, - as.matrix(leopards_all[,c("Longitude","Latitude")])),) -``` - -# The initial split - -Now that we have presences and absences (background), we want to split our data into a -training set (on which the models will be fitted) and a testing set (which -will allows to quantify how good we are at predicting data that we haven't -used to parameterise the models). In `tidymodels`, we call this an `initial_split`. -For spatial data, we usually want to account for the spatial autocorrelation -of our data, and sample our data in a geographically structured way. The -pacakge `spatialsample` provides a number of sampling routines for spatial data. -We will use a block approach (splitting the data into grid cells, "blocks"). - -To get the most out of `spatialsamples`, we need to convert our data into an `sf` -object from the `sf` package: -```{r} -library("sf") -leopards_sf <- st_as_sf(leopards_all, coords = c("Longitude","Latitude")) -st_crs(leopards_sf) = 4326 -leopards_sf -``` - -Let's plot the points quickly: -```{r} -library(ggplot2) -ggplot() + geom_sf(data = leopards_sf, aes(col = class)) -``` -Ok, we are now ready to split our data. It is wise to set the seed of the random -number generator every time we do any sampling, so that our code is fully -repeatable. We will use retain 20% of the data (1/5) for the testing set, and -use the rest for training. - -```{r setup} -library(tidysdm) -set.seed(123) -leopards_initial <- spatial_initial_split(leopards_sf, prop = 1/5, spatial_block_cv) -# inspect it -print(leopards_initial) -``` - -Let's visualise the split -```{r} -autoplot(leopards_initial) -``` - -# Use the training data to fit a GLM - -We can now extract the training set from our `leopards_initial` split. We will -use the training set to parameterise our models: -```{r} -leopards_training <- training(leopards_initial) -leopards_training -``` - -Next, we need to set up a `recipe` to shape our data. Recipes define predictors -and outcomes, as well as transforming variables if necessary. In our case, -we can use a very simple recipe that only provides a formula (*class* is the outcome, -all other variables are predictors; note that, for `sf` objects, `geometry` is -automatically ignored as a predictor): -```{r} -leopards_rec <- recipe(leopards_training, formula=class~.) -leopards_rec -``` - -In principle, one could use `step_corr` to remove correlated variables, -instead of removing them earlier on as we did. However, -this can be lead to side effects that might be undesirable. `step_corr` will remove -variables based on the correlation within a given dataset. As we will use the recipe -later in multiple subsets of our leopard dataset, the variables selected by -`step_corr` might vary, and that is incompatible with certain types of models (such -as *gam*s. So, for many applications, removing variables before a `recipe` will -be the easier option, but it is not wrong to take the `step_corr` approach (just -make sure it does what you want, and avoid using it if you plan to fit *gam*s). - -Now that we have a recipe, we can start adding it to a workflow, which we will -be able to reuse for multiple analyses: - -```{r} -base_wkflow <-# new workflow object - workflow() %>% # use workflow function - add_recipe(leopards_rec) # add the new recipe -``` - -We will start by fitting a GLM. In `tidymodel`, we need to create a model -specification. This includes information about the type of model and the engine -(package) used to fit it. `tidysdm` has a number of model specifications -already tailored for SDM. They start with `sdm_spec_*` where "*" is -substituted for the kind of model that we want to run. So, for a glm, we can -use the function `sdm_spec_glm()` to fetch the desired model specification: -```{r} -sdm_spec_glm() -``` - -We can now expand our workflow add the model specification: - -```{r} -glm_wflow <- # new workflow object - base_wkflow %>% - add_model(sdm_spec_glm()) # add your model spec -``` - -The last step is to actually fit the workflow to the data. As glms do not have -hyperparameters to tune, we can simply run: - -```{r} -glm_res <- - glm_wflow %>% - fit(data=leopards_training) -``` - -Let's inspect the results of this model: -```{r} -glm_res -``` - -# Use the model on the testing dataset - -We can now assess how well our model fits by making predictions on the testing -dataset. We can do that simply by using our `initial_split` object and feeding -it to `last_fit`: - -```{r} -glm_test_res <- glm_res %>% - last_fit(leopards_initial) -``` - -And see how well we have done with: - -```{r} -glm_test_res %>% - collect_metrics() -``` -Accuracy is generally a bad measure to use in SDMs (EXPLAIN). The Area Under -the Curve (AUC) is arguably on the better measures, and it is provided -automatically by `tidymodels`. - -We can explore more metrics by making explicit predictions from the fitted glm. -we can do so with: -```{r} -glm_predictions <- glm_test_res %>% - collect_predictions() - -glm_predictions -``` - -In a glm (as well as in many other models used for SDMs), the -predictions are probabilities of belonging to one class or another (in our case, -being a `presence` or `background`). For any given point we are given the -probability for beloning to either class. We are also given the predicted -class, `.pred_class`, but this is simply based on a 0.5 threshold. In SDMs, -we often want to redefine that threshold (e.g. based on given sensitivity or -optimising other quantities). - -We can now estimate AUC directly with: -```{r} -roc_auc(glm_predictions, truth = class, - .pred_presence) -``` - -Whilst `last_fit` is very convenient, there might be cases when we want to get -predictions for other dataset. We can do so by using directly `predict` on -the fitted workflow. Let -us extract the testing dataset manually, and then use it as a new dataset -to predict directly form the fitted workflow: - -```{r} -leopards_testing <- testing(leopards_initial) - -glm_predictions <- leopards_testing %>% - select(class) %>% # we combine the class observations from the dataset - cbind(predict(glm_res, new_data=leopards_testing, type="prob")) # with predicted probabilities - -head(glm_predictions) -``` -Note that the object is an `sf::sf` object, allowing us to plot the predictions -if we want to. Whilst `metrics` from `yardstick` can not handle `sf::sf` objects natively, -`tidysdm` expands all probability and class metrics to take `sf::sf` objects, -as well as providing additional metrics that are useful for sdms (such as Boyce's -index). - -We can assess the goodness of fit using the Area Under the Curve (AUC). This -metric works on the predicted probabilities, and so obviates the need to -discretise the predictions with a threshold. - -```{r} -roc_auc(glm_predictions, truth = class, - .pred_presence) -``` - -# Fitting a gam - -Fitting a gam instead of a glm is trivial, and shows the advantages of the -standardised interfaces of `tidymodels`. We start by creating a workflow. -There is, unfortunately, an added twist specific to gams, we need to provide -the formula in the `fit` command -(there is an open issue in `parnsnip` that aims at solving this: -https://github.com/tidymodels/parsnip/issues/770). Unless something customised -is needed, we can use the `gam_formula()` to build it for us: -TODO we could avoid this by creating out own version of `add_model()` - -```{r} -gam_wflow <- - base_wkflow %>% - add_model(sdm_spec_gam(), formula = gam_formula(leopards_rec) ) # add your model spec -``` - - -```{r} -gam_res <- - gam_wflow %>% - fit(data=leopards_training) -``` - -Fitting a gam - -```{r} -gam_test_res <- - gam_res %>% - last_fit(leopards_initial) -``` - -We can assess the goodness of this model with: -```{r} -gam_test_res %>% - collect_metrics() -``` - -The added flexibility of the gam provides an AUC that is somehat higher than the -glm. - -# Fitting a Random Forest model - -In principle, we can fit a Random Forest with standard parameters following the -template above: - -```{r} -rf_wflow <- - base_wkflow %>% - add_model(sdm_spec_rf(tune="none")) -rf_res <- - rf_wflow %>% - fit(data=leopards_training) -``` - -Random Forest, like many other ML algorithms, has some hyperparameters; RF generally works -well using default values for hyperparameters, but we might want to do some -tuning to fully optimise the algorithm. In this instance, we decide that we want -to tune `mtry` and `min_n`. First, we need to modify our model specification. -We can achieve this by simply using: - -```{r} -rf_tuning_spec <- - sdm_spec_rf(mtry=tune(), min_n=tune(), tune="custom") -``` - -And then create a workflow with it: -```{r} -rf_tuning_wflow <- - base_wkflow %>% - add_model(rf_tuning_spec) -``` - -To tune the hyperparameters of a model, we have to split our dataset further. We -will set up block crossvalidation on our Training set, thus creating multiple -folds. We want to use the same grid that we used for our initial split, so we -will prescribe the `cellsize` and `offset` in `spatial_block_cv`; we can use -the helper functions `grid_cellsize()` and `grid_offset()` applied to the -original dataset: - -```{r} -set.seed(234) -leopards_cv <- spatial_block_cv(leopards_training, v = 5, - cellsize = grid_cellsize(leopards_sf), - offset = grid_offset(leopards_sf)) -autoplot(leopards_cv) -``` -We can clearly see the gaps left by the *testing* set being removed ealier. - -We can now tune the hyperparameters. We will chose a grid of 5 combinations of -parameters (in real life, you will want more than that!): -```{r} -doParallel::registerDoParallel(cores=2) - -set.seed(345) -tune_res <- tune_grid( - rf_tuning_wflow, - resamples = leopards_cv, - grid = 5 -) -tune_res -``` - -The message “Creating pre-processing data to finalize unknown parameter: mtry” -is due to the fact that the hyperparameters *mtry* depends on the number of -predictors in the dataset, so `tune_grid()` has to define its range once it -receives data to fit. - -We can now inspect the impact of the tuning paramters on AUC: -```{r} -autoplot(tune_res, metric="roc_auc") -``` - -We can see that the impacts are pretty minimal (<1% in AUC). This is not -surprising, RF are well known for doing well without tuning. Other ML algorithms -are much more demanding. We can generate specification for the best model by -combining our original specification with the best model based on AUC: - -```{r} -rf_best_spec <- finalize_model( - rf_tuning_spec, - select_best(tune_res, "roc_auc") -) - -rf_best_spec -``` - -We can now create a workflow with this model: -```{r} -rf_best_wflow <- - base_wkflow %>% - add_model(rf_best_spec) -``` - -Fit it to the training data: - -```{r} -rf_best_res <- - rf_best_wflow %>% - fit (data=leopards_training) -``` - -And then assess it against the testing data: - -```{r} -rf_test_res <- - rf_best_res %>% - last_fit (leopards_initial) - -rf_test_res %>% collect_metrics() -``` -The AUC has not dropped too much compared to the values we were seeing in the -training set, suggesting that the models are reasonably robust. - -# Ensemble modelling - -When making predictions with SDMs, we often use ensembles of models. By combining -models in an ensemble, we can avoid some of the extremes that any given model -might produce. There are multiple ways of combining models, from simply -averaging to more sophisticated -approaches that weight predictions based on some metric defining the goodness of -fit (such as AUC). To be able to generate ensembles, we need to process our -models in identical ways. A major difference between our approach for glm and -gam and that for random forests was to use a Cross Validation folds resampling in the latter. -We used that for hyperparameter tuning, but it also allowed us to assess the model -fit on the training dataset, before we came to the final assessment on the test dataset. -If we want to weigh our models according to their performance, we need to take a -similar approach for gam and glm, so that we have like for like metrics for all -models on the training set. - -`workflowsets` provide an elegant way to fit multiple models in a similar, -coherent way; `tidysdm` automatically loads this package. Let's build up a -`workflowset` using our data recipe we created -above: - -```{r} -leopards_models <- - workflow_set( - preproc = list(default = leopards_rec), - models = list(glm = sdm_spec_glm(), # the standard glm specs - gam = sdm_spec_gam(), # the standard sdm specs - rf = sdm_spec_rf()), # rf specs with default tuning - cross = TRUE # make all combinations of preproc and models - ) - - -leopards_models -``` - -Unfortunately, *gam*s are once again problematic, and we need to update the model -to include the formula: - -```{r} -leopards_models <- update_workflow_model(leopards_models, - "default_gam", - spec = sdm_spec_gam(), - formula=gam_formula(leopards_rec)) -``` - -Note that we only have one preprocessing recipe; in principle, we could -consider different ways to preprocess the data -(e.g. different transformations). You could create recipes that -select different predictors. However, that approach will be incompatible with -*gam*s, as they require a formula to describe the model. If you want to fit -*gam*s to recipes with different predictors, you will need to have multiple -`workflow_set`s, one per recipe. - -Before we tune the models, we need to edit some controls to store additional information -that we will use later: - -```{r} -leopards_models <- - leopards_models %>% - option_add(control = control_ensemble_grid()) - -``` - -We can now use the block CV folds we built earlier from the training dataset to -tune and assess the models: -```{r} -set.seed(345) -leopards_models <- - leopards_models %>% - workflow_map("tune_grid", resamples = leopards_cv, grid = 5, - metrics = metric_set(roc_auc), verbose = TRUE) -``` - -Note that `workflow_set` correctly detects that we have no tuning parameters for -*glm* and *gam*. We can have a look at the performance of our models with: - -```{r} -leopards_models %>% collect_metrics() - -``` -And plot it -```{r} -autoplot(leopards_models) -``` - -We are now ready to build an ensemble. In `tidymodels`, the standard way to -build ensembles is to use *stacking*. Stacking ensembles in an algorithm that -learns how to best combine the models to predict the data. We will create our -stack weights based on our CV resamples (with `blend_predictions`). For models -that have non-zero weights (and thus non-zero coefficients), we then fit them -to the full training dataset, so that we are then ready to make predictions -for other datasets (such as the testing set, and then eventually other time -periods or regions). - -```{r} -leopards_model_st <- - # initialize the stack - stacks() %>% - # add candidate members - add_candidates(leopards_models) %>% - # determine how to combine their predictions - blend_predictions() %>% - # fit the candidates with nonzero weights (i.e.nonzero stacking coefficients) - fit_members() - -leopards_model_st -``` -We can see that the ensemble include two version fo the *random forest*, and the -*glm* and *gam* models. We can plot the respective weights with: - -```{r} -autoplot(leopards_model_st, type = "weights") -``` - -Furthermore, we can visualise the trade-off between minimising the number -of members (models to be used) and performance with: -```{r} -autoplot(leopards_model_st) -``` - -And finally, we can make predictions on the testing data with: - -```{r} -leopards_test_pred <- - leopards_testing %>% - bind_cols(predict(leopards_model_st, ., type="prob")) -``` - -And look at the goodness of fit with AUC - -```{r} -roc_auc(data= leopards_test_pred,truth=class,.pred_presence) -``` - -# Projecting to other times - -We will project the leopard range to a different time. We will get the climate -for the Last Glacial Maximum, using the `pastclim` package. - -```{r} -pred_vars <- names(leopards_sf)[2:(length(names(leopards_sf))-1)] -climate_lgm<-pastclim::region_slice(time_bp = -21000, - bio_variables = pred_vars, - data="Beyer2020", - crop=leopard_vec) -``` - -And predict using the ensemble: -```{r} -lgm_prediction <- predict_raster(leopards_model_st, climate_lgm, type="prob") -plot(lgm_prediction) -``` diff --git a/data-raw/old_vignettes/arabiensis_coords.csv b/data-raw/old_vignettes/arabiensis_coords.csv deleted file mode 100644 index 46af9891..00000000 --- a/data-raw/old_vignettes/arabiensis_coords.csv +++ /dev/null @@ -1,1201 +0,0 @@ -"longitude","latitude","class" -13.3456,8.5419,"presence" -34.589,8.245,"presence" -8.3613,14.24817,"presence" -34.678,-14.2803,"presence" --3.4253,13.09583,"presence" -0.399,10.733,"presence" -23.7,-25.4501,"presence" -16.4,8.4,"presence" -36.83333,7.66667,"presence" --5.82692,12.93601,"presence" --16.034,13.412,"presence" --0.35167,12.17944,"presence" --4.55,11.5833,"presence" -5.6728,4.9874,"presence" --5.2667,13.1,"presence" --6.1202,14.7396,"presence" -47.2431,7.1745,"presence" -30.1118,-1.977,"presence" -30.21293,-15.13426,"presence" -33.3384,3.3519,"presence" --3.2631,11.679,"presence" -24.265,-17.509,"presence" --4.9166,10.2833,"presence" -36.1382,15.8126,"presence" -37.31667,-0.73333,"presence" -39.0853,-3.1099,"presence" --5.0962,7.683,"presence" -27.2998,-16.2183,"presence" -47.8333,7.5,"presence" --4.6537,13.912,"presence" -34.8314,-5.7435,"presence" --7.75,14.3333,"presence" --3.75,14.7667,"presence" --10.3766,14.4312,"presence" -33.3655,13.33,"presence" -1.7089,11.8789,"presence" -33.3327,19.5385,"presence" -31.6995,-15.14997,"presence" -35.1172,-14.3014,"presence" -38.5667,6.9667,"presence" --12.3983,17.0439,"presence" -48.4864,8.405,"presence" -30.099,-4.584,"presence" -38.047,-4.65,"presence" -35.8535,15.187,"presence" -34.27511,0.63526,"presence" -33.4462,-2.5908,"presence" -13.24148,8.47248,"presence" -34.62493,-19.53779,"presence" -28,7.7,"presence" -32.5428,2.1081,"presence" --11.67124,13.88405,"presence" --15.53669,13.45891,"presence" -36.6784,-8.38513,"presence" -32.8,15.38333,"presence" --6.684,12.6,"presence" -39.27245,-0.6433,"presence" --8.5,13.5667,"presence" -0.8549,19.4649,"presence" -33.61841,-16.14296,"presence" --13.653,16.0475,"presence" -30.1775,13.0457,"presence" -24.0904,13.6539,"presence" -4.83243,9.12795,"presence" -30.45,19.26667,"presence" -13.5,-14.91667,"presence" -28.2121,-17.9413,"presence" -38.03667,-1.59993,"presence" -38.8204,15.6429,"presence" -27.3433,-15.21751,"presence" -20.9274,-17.9714,"presence" -31.04574,-22.8884,"presence" -33.567,-13.433,"presence" -15.23333,11.71667,"presence" --5.0333,12.7167,"presence" -49.5685,8.4855,"presence" -49.0507,10.2717,"presence" -40,9.0167,"presence" --3.0925,14.4567,"presence" -30.5685,20.152,"presence" -3.38333,11.86667,"presence" --17.36203,14.75712,"presence" -44.122,3.351,"presence" -36.39301,-8.15443,"presence" -31.666,-21.065,"presence" -27.1238,-18.0397,"presence" -37.64592,6.98934,"presence" --15.8738,11.2232,"presence" --3.52191,11.48945,"presence" -40.69167,-2.26485,"presence" -36.825,-3.2923,"presence" -44.0825,2.7976,"presence" -14.5469,10.0853,"presence" -14.93321,10.85373,"presence" -22.45,-19.58333,"presence" -27.56666,-15.8499,"presence" -34.0523,-12.0377,"presence" -34.95,13.1,"presence" --5.5,6.935,"presence" -31.2299,11.4634,"presence" -18.45,-25.08333,"presence" -5.667,5.893,"presence" -33.55,13.85,"presence" --9.01667,9.26667,"presence" -27.22049,-20.8402,"presence" -39.08232,-3.74312,"presence" -35.6166,8.7,"presence" -36.3167,8.4833,"presence" -37.0667,8.35,"presence" --16.6,14.7167,"presence" -40.167,-2.4433,"presence" -6.786,6.13,"presence" -33.869,17.424,"presence" -27.35037,-14.05012,"presence" --15.59672,13.56996,"presence" -36.994,-16.8374,"presence" -37.09715,-0.48333,"presence" -39.68192,-0.51577,"presence" -7.72713,14.15939,"presence" --0.5216,13.5274,"presence" --15.905,15.29111,"presence" --6.9167,10.45,"presence" -28.752,-22.278,"presence" --12.621,15,"presence" --1.05,11.66,"presence" --2.98592,16.7087,"presence" -7.86,12.667,"presence" -44.8981,2.0483,"presence" -31.3107,-22.4503,"presence" -11.51667,3.86667,"presence" -50.4246,10.5752,"presence" --5.97,14.33,"presence" -24.1735,12.3326,"presence" -47.6063,9.1112,"presence" -39.38333,8.4,"presence" --1.2413,15.4418,"presence" -28.2004,11.4494,"presence" -3.6941,8.18227,"presence" -6.1924,5.1524,"presence" --5.6671,11.3173,"presence" -47.4308,6.7697,"presence" -15,10.56667,"presence" -11.4876,6.0828,"presence" -28.68333,-17.91667,"presence" -29.6137,-15.0735,"presence" -31.42492,-1.95906,"presence" -1.9667,7.9333,"presence" -45.4857,2.5085,"presence" -15.66667,-17.85,"presence" -45.1648,9.8881,"presence" -47.1667,8.4167,"presence" --9.4868,13.039,"presence" --13.70985,13.46552,"presence" -42.4687,1.1576,"presence" -26.016,-24.45,"presence" -37.8666,-4.25,"presence" -32.9133,14.8027,"presence" -33.87289,-24.72173,"presence" -41.0827,11.7344,"presence" -49.1833,11.2833,"presence" --9.3833,14.5833,"presence" --7.4667,14.5667,"presence" -28.28768,-15.40735,"presence" -4.32,7.29,"presence" -35.3888,14.0408,"presence" --2.23337,12.06664,"presence" -48.85,7.217,"presence" -7.167,10.433,"presence" -23.2597,12.483,"presence" -32.3108,-8.9662,"presence" -39.395,13.277,"presence" -30.5393,1.0507,"presence" -23.5409,-19.9114,"presence" -25.2836,14.8332,"presence" -38.1333,10.1667,"presence" -34.31789,-0.47647,"presence" -27.5563,-18.7184,"presence" --16.64508,13.26843,"presence" -35.94985,-0.05465,"presence" -33.2698,-9.6987,"presence" -6.81394,15.14868,"presence" --10.5015,14.2635,"presence" -28.41667,-14.41667,"presence" -36.2404,-1.1068,"presence" --14.606,17.375,"presence" -11.8104,6.7491,"presence" --15.04548,16.49952,"presence" --1.7362,15.2705,"presence" -29.0076,-2.5964,"presence" -37.3667,-8.5167,"presence" -34.6375,11.846,"presence" -27.5578,-4.0199,"presence" -30.5028,-1.7984,"presence" -42.8762,3.788,"presence" --15.894,14.868,"presence" -26.299,-10.616,"presence" -8.083,6.451,"presence" -37.343,-3.529,"presence" -15.2158,-4.3416,"presence" -13.5582,4.3418,"presence" -36.5359,-7.4584,"presence" --0.5117,14.1022,"presence" -35.5761,-16.0809,"presence" -38.02753,-1.40853,"presence" -35.0667,0.3167,"presence" -36.8828,9.1486,"presence" -39.18285,-6.84643,"presence" --2.19,12.68,"presence" -29.299,-3.182,"presence" -33.277,1.8606,"presence" -34.86194,-16.24694,"presence" -0.6167,18.0667,"presence" -38.82,-6.58,"presence" -40.5333,10.4667,"presence" -3.39627,6.53331,"presence" -36.00183,0.43733,"presence" -34.2936,-11.607,"presence" --14.88333,15.28333,"presence" -32.38333,15.56667,"presence" -13.38333,9.3,"presence" -41.6587,0.7842,"presence" -13.5291,8.6604,"presence" --9.618,16.661,"presence" -29.2392,12.3554,"presence" -32.7119,1.9929,"presence" -34.6855,-2.154,"presence" --0.86667,11.75,"presence" -31.8068,-26.0038,"presence" --10.8981,12.4329,"presence" -24.8571,13.7214,"presence" -35.8333,-3.5,"presence" --12.4629,14.8698,"presence" -21.802,-18.369,"presence" -33.4336,16.6838,"presence" -39.2709,8.542,"presence" --0.1362,10.8532,"presence" -35.1331,0.80487,"presence" -40.399,9.551,"presence" --3.3833,16.25,"presence" -0.0677,11.1443,"presence" -14.7,-17.5833,"presence" --15.9773,18.0836,"presence" -35.932,-18.282,"presence" -22.2819,-19.3524,"presence" -30,-3.38,"presence" -36.7173,-8.89667,"presence" --1.3333,15.8,"presence" -5.5068,13.1227,"presence" -20.0928,-22.2764,"presence" -26.7001,-12.646,"presence" -35.1962,-15.0824,"presence" -26.689,-13.935,"presence" -31.8487,18.5698,"presence" --10.8306,13.8083,"presence" --15.9019,16.2339,"presence" -13.1106,6.751,"presence" -39.1667,14.15,"presence" -30.79187,-23.2546,"presence" -22.6033,12.1278,"presence" -5.3763,15.0459,"presence" -10.7342,5.6246,"presence" -43.2245,2.8215,"presence" -9.483,14.134,"presence" -3.90231,6.79984,"presence" -34.3785,13.691,"presence" -5.625,6.338,"presence" --7.2,13.47,"presence" -35.966,-7.099,"presence" -30.6167,12.7,"presence" --9.6,13.08334,"presence" -12.6928,6.5699,"presence" -15.3755,10.27942,"presence" -45.2062,4.7367,"presence" -26.217,10.334,"presence" -34.45905,-1.08922,"presence" -37.949,-5.649,"presence" -45.4376,10.3498,"presence" --10.3167,13.6833,"presence" -3.4,14.39,"presence" -7.6001,10.7331,"presence" -29.8237,-18.9201,"presence" -35.16799,-23.92474,"presence" -3.7292,11.7058,"presence" -37.75,14.968,"presence" -37.51181,-17.31389,"presence" -35.7001,-6.5896,"presence" -9.98333,12.35,"presence" --4.413,12.5,"presence" -14.2816,10.5651,"presence" --14.936,13.5,"presence" -31.6,-24.989,"presence" --3.6605,10.3122,"presence" -34.5,-2.75,"presence" -34.93333,-0.76667,"presence" -38.7246,7.8922,"presence" -32.66775,-26.342,"presence" -25.1461,11.2775,"presence" -25.9936,-15.0667,"presence" --2.3638,13.4269,"presence" -15.53333,10.93333,"presence" -38.2173,15.015,"presence" -12.05,4.5,"presence" -16.7761,8.5179,"presence" --0.238,11.056,"presence" -29.7166,11.0167,"presence" -27.85684,-12.54133,"presence" -29.6505,12.0463,"presence" -35.2494,-16.9135,"presence" -36.9761,8.9744,"presence" -32.8008,12.5904,"presence" -23.248,-20.201,"presence" -1.2667,10.5667,"presence" -37.285,7.606,"presence" -34.085,11.34,"presence" -39.8592,14.9555,"presence" -37.2667,12.2,"presence" -21.433,-18.017,"presence" -43.6978,10.2748,"presence" -17.83333,-25.16667,"presence" --8,12.4667,"presence" -30.30278,19.92528,"presence" --7.56019,12.86406,"presence" -32.93333,-18.3667,"presence" --4.8969,13.2974,"presence" -33.0311,-25.0584,"presence" -33.1277,15.1607,"presence" --13.7847,13.57833,"presence" -8.5341,8.734,"presence" -26.8811,-15.3475,"presence" -36.98919,13.04269,"presence" -34.282,10.55,"presence" -13.0401,4.9739,"presence" -33.478,-2.4768,"presence" -30.194,-5.2,"presence" -39.99992,-1.50513,"presence" -2.71667,9.85,"presence" -37.35,-3.35,"presence" --15.95,14.25,"presence" -3.9602,14.24817,"presence" -29.9887,-1.2633,"presence" -9.195,12.43,"presence" -33.89441,0.72317,"presence" -7.877,8.842,"presence" --6.0751,13.6739,"presence" -40,7.1155,"presence" --0.6014,12.4899,"presence" -32.7667,13.1333,"presence" -2.48333,8.33333,"presence" -49.816,7.9826,"presence" -11.08,4.36,"presence" -14.5519,12.7688,"presence" -32.44902,15.38724,"presence" -43.916,9.917,"presence" -32.5971,0.4384,"presence" -44.6704,10.1779,"presence" -21.933,-21.534,"presence" -25.2987,13.4821,"presence" -26.73333,-16.2167,"presence" --1.40027,12.18887,"presence" --12.4297,16.3333,"presence" --0.4735,13.169,"presence" -49.6862,10.132,"presence" -14.6167,11.8245,"presence" -40.0459,11.2116,"presence" -9.175,9.343,"presence" -37.26045,11.48652,"presence" --14.947,12.901,"presence" -7.19,13.59,"presence" -34.125,0.453,"presence" -15.367,7.783,"presence" -31.2273,0.3754,"presence" -13.6412,8.1992,"presence" -42.1,9.3,"presence" -9.672,4.078,"presence" -5.244,13.058,"presence" -34.999,1.025,"presence" -38.847,14.7062,"presence" --13.256,15.68,"presence" --11.434,14.457,"presence" --5.16591,10.65437,"presence" -19.497,-22.408,"presence" -30.6328,0.6173,"presence" -43.6498,3.1138,"presence" --3.567,10.9,"presence" -33.13333,14.18333,"presence" -13.832,4.784,"presence" -30.9499,18.0525,"presence" -21.323,-17.9798,"presence" --14.434,16.516,"presence" -42.1833,7.3333,"presence" -47.8298,7.6431,"presence" -35.09173,-0.68673,"presence" -28.3374,-21.6456,"presence" -11.22722,5.96944,"presence" --8.3912,8.661,"presence" --15.12074,16.51938,"presence" --1.13456,11.16667,"presence" -6.231,7.56,"presence" -36.2036,16.156,"presence" -28.8509,-16.0271,"presence" -14.5676,11.4063,"presence" -6.2618,14.0188,"presence" -30.2573,-1.4586,"presence" -32.982,14.252,"presence" -13.5336,7.7328,"presence" --4.2577,13.9516,"presence" --3.06255,11.14607,"presence" --14.621,16.517,"presence" -35,-15.7667,"presence" -6.54114,5.2434,"presence" -32.5853,16.1137,"presence" -33.9742,12.9896,"presence" -19.7,-17.91667,"presence" --15.583,16.516,"presence" -35.55,4.35,"presence" -36.3134,18.3028,"presence" -35.6522,-7.92817,"presence" --3.1322,12.657,"presence" -33.51667,14.4,"presence" -38.4908,16.779,"presence" -39.25374,-6.08173,"presence" --14.151,12.951,"presence" -32.342,-0.223,"presence" --12.2333,12.637,"presence" -6.36704,4.55891,"presence" --15.1254,17.001,"presence" -4.331,12.518,"presence" -37.17869,-16.54057,"presence" -12.4779,6.5098,"presence" -0.399,10.183,"presence" -9.50279,14.13402,"presence" -35.985,-6.442,"presence" -33.9484,-1.6039,"presence" -12.035,4.51,"presence" -34.349,11.768,"presence" --16.4,13.71667,"presence" --14.80128,16.44604,"presence" -35.11155,-0.11086,"presence" --1.9143,13.5122,"presence" -35.7857,-15.6427,"presence" -31.2224,-20.6699,"presence" -35.75,-4.2167,"presence" -35.95,14.96667,"presence" --6.5447,14.0049,"presence" -11.5717,6.207,"presence" -39.35215,-15.1247,"presence" -31.299,-20.4346,"presence" -0.5998,11.034,"presence" -36.43333,15.38333,"presence" -11.45338,3.870892,"presence" -32.8333,-4.9167,"presence" -14,8.4997,"presence" --1.2892,14.0908,"presence" -2.06917,7.18333,"presence" -44.691,9.7664,"presence" -2.399,11.2935,"presence" -46.4038,8.2871,"presence" -33.36667,14.78333,"presence" --16.426,14.34,"presence" -37.591,15.111,"presence" --4.61417,10.83325,"presence" -38.7667,14.05,"presence" -32.826,-5.0187,"presence" -32.7584,-16.7105,"presence" -28.65865,-12.93999,"presence" --9.9137,15.0697,"presence" -30.1127,-2.2315,"presence" -34.8105,-12.6933,"presence" -31.54556,-2.07898,"presence" -29.9,-3.09,"presence" -36.69257,-1.32638,"presence" -39.4844,5.3754,"presence" --13.4526,13.47341,"presence" -26.8562,-24.1855,"presence" --0.05,14.05,"presence" -31.4593,-23.9752,"presence" -42.9667,10.5667,"presence" -32.453,-23.469,"presence" --9.3653,15.8172,"presence" -4.26667,7.9,"presence" -37.58333,8.23333,"presence" -1.52,12.48,"presence" -36.7372,14.8326,"presence" --10.5833,15.0667,"presence" --13.9086,17.0582,"presence" -45.42,9.272,"presence" --0.191,5.565,"presence" -36.85167,-2.39592,"presence" -6.59821,4.71071,"presence" -42.3886,3.3181,"presence" -38.48472,-3.4554,"presence" --11.6844,14.2245,"presence" --8.246,12.165,"presence" -8.315,4.956,"presence" -45.5381,9.5247,"presence" -31.0333,3.2,"presence" --14.0267,13.551,"presence" -31.9935,-25.4438,"presence" -27.94943,-14.73853,"presence" -32.53732,-25.99175,"presence" -38.9877,-8.0087,"presence" -33.6367,13.5704,"presence" -4.25717,8.16492,"presence" -31.0333,3.2,"presence" -34.1649,-0.4302,"presence" -39.8333,-3.7833,"presence" --0.8505,10.8663,"presence" -34.9566,-0.2812,"presence" -14.1278,10.0736,"presence" -34.62493,-19.53779,"presence" -13.5598,9.4243,"presence" -34.24448,0.51899,"presence" -0.2809,12.1086,"presence" -13.5651,7.9962,"presence" -34.903,-16.1699,"presence" -32.61314,-25.9284,"presence" -37.333,-0.683,"presence" -37.44362,-1.17823,"presence" -39.9544,-3.4014,"presence" -34.59985,-0.13304,"presence" -30.1127,-2.2315,"presence" -35.3206,-14.4484,"presence" -34.69815,0.62063,"presence" --13.4526,13.47341,"presence" --4.621,10.825,"presence" -30.19,-3,"presence" -37.829,-1.05565,"presence" -34.92298,-0.17228,"presence" -38.6596,14.1231,"presence" -38.92753,-3.66307,"presence" -37.3577,6.6666,"presence" -39.2847,-4.1235,"presence" -39.2709,8.542,"presence" -39.85,-3.683,"presence" -35.0329,-0.1753,"presence" -39.9477,-3.3343,"presence" -49.471,10.6893,"presence" --10.8306,13.8083,"presence" -30.3837,19.6917,"presence" -37.31667,-0.73333,"presence" --14.951,13.533,"presence" -34.2437,-0.8113,"presence" -32.5423,15.4301,"presence" --14.85163,16.58237,"presence" --16.3437,13.2078,"presence" -30.3333,-23.8333,"presence" -33.5283,14.4296,"presence" -23.2597,12.483,"presence" --14.75461,16.54632,"presence" --4.4136,11.4063,"presence" -32.5514,15.623,"presence" -32.453,-23.469,"presence" -37.27103,-3.43086,"presence" -12.4779,6.5098,"presence" -26.9396,-16.4687,"presence" --5.16591,10.65437,"presence" -35.7789,-4,"presence" -32.9133,14.8027,"presence" -38.89736,-6.45335,"presence" --13.64408,13.36585,"presence" -11.5744,6.5542,"presence" -32.6131,-25.9341,"presence" -5.87413,5.06493,"presence" -37.4842,14.9224,"presence" --15.9333,13.7667,"presence" -34.1518,-0.6893,"presence" -35.153,-23.881,"presence" -37.01993,-1.10108,"presence" -34.30898,-0.50095,"presence" --0.4482,12.219,"presence" -31.6995,-15.14997,"presence" -15.86,-17.436,"presence" -34.05148,0.7473,"presence" -33.18,14.91,"presence" --0.35,12.16667,"presence" -11.45338,3.870892,"presence" --17.4494,14.685,"presence" -27.1121,-15.0329,"presence" -34.38123,0.70195,"presence" --2.5274,12.3848,"presence" -15.3333,10.65,"presence" -18.1258,-19.5333,"presence" -36.4856,8.587,"presence" -34.0665,-0.7215,"presence" --1.0694,12.8224,"presence" -23.248,-20.201,"presence" --1.08333,13.61667,"presence" -39.7783,-3.552,"presence" -34.82381,-16.2342,"presence" -37.279,7.683,"presence" -34.916,-0.182,"presence" -34.6375,11.846,"presence" -33.36667,14.78333,"presence" -34.75,0.1667,"presence" -9.98333,12.35,"presence" --15.5417,13.5744,"presence" -34.7519,0.28285,"presence" --17.4662,14.7041,"presence" --16.2852,16.4016,"presence" --17.4901,14.7449,"presence" -36.2503,-8.2089,"presence" -37.1361,-6.7869,"presence" -34.9111,-16.2467,"presence" -34.53023,-0.49092,"presence" --10.1637,16.3979,"presence" -41.0805,11.7374,"presence" -33.4336,16.6838,"presence" --0.2974,12.1467,"presence" -13.5404,8.7225,"presence" -34.739,-0.44,"presence" -34.86194,-16.24694,"presence" -39.25,-6.15,"presence" -33.55,13.85,"presence" -34.2079,-0.07943,"presence" -37.549,-6.2536,"presence" -35.0354,-0.72797,"presence" --17.4532,14.7145,"presence" -32.659,13.1748,"presence" -37.3971,-3.433,"presence" --1.5,12.35,"presence" -34.8,-0.1833,"presence" -38.708,7.932,"presence" -39.4541,-4.1553,"presence" --13.51353,13.52563,"presence" --0.267,12.001,"presence" -27.3433,-15.21751,"presence" -34.0357,-0.0329,"presence" -34.25207,-0.23878,"presence" --15.5766,13.586,"presence" --4.35,11.03333,"presence" -30.30278,19.92528,"presence" -34.1068,-0.0469,"presence" --1.08333,13.61667,"presence" -45.1648,9.8881,"presence" -35.04673,-0.07505,"presence" -37.87798,-1.03255,"presence" -37.2967,-0.7403,"presence" -34.348,-0.015,"presence" -34.216,-0.798,"presence" -47.1667,8.4167,"presence" --9.015,9.264,"presence" -36.9117,-1.2101,"presence" -30.02,-3.42,"presence" -43.429,9.9646,"presence" -36.78002,-1.23033,"presence" --15.7731,13.3624,"presence" -39.8124,-3.5888,"presence" --17.4614,14.6817,"presence" -33.55,13.85,"presence" --6.64525,13.05859,"presence" -36.85167,-2.39592,"presence" -34.1635,-0.5454,"presence" -34.4099,-0.1752,"presence" -34.4782,-0.621,"presence" -36.9345,7.7049,"presence" -37.4833,5.8833,"presence" -33.48333,14.1,"presence" -28.7943,-14.6558,"presence" -6.54114,5.2434,"presence" -35.6376,13.5195,"presence" -32.5126,15.5889,"presence" -34.81917,-0.33955,"presence" -34.5167,0.55,"presence" -32.5971,0.4384,"presence" --15.9189,16.4967,"presence" --1.7212,12.3417,"presence" -2.66667,9.36667,"presence" -33.4692,13.8703,"presence" -24.265,-17.509,"presence" -38.7,7.868,"presence" -33.4954,13.8232,"presence" -5.2329,7.6746,"presence" --7.4325,14.1766,"presence" -3.9602,14.24817,"presence" --2.2492,12.8964,"presence" --15.59672,13.56996,"presence" --13.77452,13.54588,"presence" -0.0873,12.2565,"presence" --17.4359,14.6972,"presence" --14.435,16.5,"presence" --4.04583,11.02944,"presence" -37.285,7.606,"presence" -12.8809,6.5973,"presence" -24.6526,-17.9822,"presence" -15.45,10.3667,"presence" -35.645,-15.801,"presence" -3.9023,6.7999,"presence" --3.784,12.617,"presence" --14.9167,13.5667,"presence" --14.93472,15.31472,"presence" --17.456,14.7326,"presence" --2.3274,12.8776,"presence" -34.2,-0.55,"presence" -27.91332,-15.78627,"presence" -35.8612,-6.105,"presence" -34.46602,-0.35951,"presence" --2.2845,12.032,"presence" -33.0833,14.6667,"presence" -34.4266,-0.1652,"presence" -15.61667,10.46667,"presence" -17.25,-25.25,"pseudoabs" -11.75,11.75,"pseudoabs" -21.25,7.75,"pseudoabs" -31.25,-2.25,"pseudoabs" --13.75,15.75,"pseudoabs" -42.75,11.75,"pseudoabs" -2.25,16.25,"pseudoabs" -32.25,-4.25,"pseudoabs" --1.75,19.75,"pseudoabs" -18.25,-23.75,"pseudoabs" -9.25,8.25,"pseudoabs" -20.25,-10.75,"pseudoabs" -12.75,-13.25,"pseudoabs" -40.25,8.25,"pseudoabs" --1.75,21.25,"pseudoabs" -6.75,13.25,"pseudoabs" -9.25,19.75,"pseudoabs" -34.25,18.25,"pseudoabs" --12.75,12.75,"pseudoabs" -33.75,-0.25,"pseudoabs" -37.75,3.75,"pseudoabs" -30.25,-13.25,"pseudoabs" -25.25,-21.25,"pseudoabs" -25.75,-3.75,"pseudoabs" -36.25,14.25,"pseudoabs" -39.25,0.25,"pseudoabs" -17.25,-8.75,"pseudoabs" -15.75,16.75,"pseudoabs" --4.75,16.75,"pseudoabs" -23.25,-11.75,"pseudoabs" -21.25,-30.75,"pseudoabs" -27.25,14.75,"pseudoabs" -12.25,-17.75,"pseudoabs" -11.75,10.75,"pseudoabs" -20.25,-25.25,"pseudoabs" -32.75,-20.25,"pseudoabs" -20.25,-24.75,"pseudoabs" -29.25,14.75,"pseudoabs" --2.25,7.75,"pseudoabs" -11.25,-0.25,"pseudoabs" -41.25,0.25,"pseudoabs" -26.25,-13.25,"pseudoabs" -19.25,-15.75,"pseudoabs" -30.25,2.75,"pseudoabs" -25.75,-33.75,"pseudoabs" -34.25,16.25,"pseudoabs" -20.25,-33.25,"pseudoabs" -14.75,2.75,"pseudoabs" --6.25,16.75,"pseudoabs" -23.75,-17.25,"pseudoabs" -25.25,12.75,"pseudoabs" -23.25,-12.75,"pseudoabs" -26.75,8.75,"pseudoabs" -28.75,-12.25,"pseudoabs" --0.75,15.75,"pseudoabs" -31.25,2.25,"pseudoabs" -17.75,-1.75,"pseudoabs" -25.25,-9.75,"pseudoabs" -20.25,-9.25,"pseudoabs" -21.25,16.25,"pseudoabs" -11.75,4.75,"pseudoabs" -25.75,-27.75,"pseudoabs" -45.25,8.75,"pseudoabs" -13.25,-4.25,"pseudoabs" --4.75,20.25,"pseudoabs" -27.75,7.25,"pseudoabs" -0.25,14.25,"pseudoabs" -10.75,2.75,"pseudoabs" -48.25,6.25,"pseudoabs" -19.25,-4.25,"pseudoabs" -34.25,-10.75,"pseudoabs" -15.25,-18.25,"pseudoabs" -14.25,-10.25,"pseudoabs" --3.75,15.25,"pseudoabs" -18.75,-6.25,"pseudoabs" --12.25,16.75,"pseudoabs" --10.75,17.75,"pseudoabs" -26.25,-11.25,"pseudoabs" -21.75,-6.75,"pseudoabs" -8.75,16.75,"pseudoabs" -34.75,9.75,"pseudoabs" -17.75,4.75,"pseudoabs" -30.25,13.75,"pseudoabs" -35.25,11.25,"pseudoabs" --3.25,9.75,"pseudoabs" -14.25,-15.75,"pseudoabs" -29.75,-24.25,"pseudoabs" -29.25,7.25,"pseudoabs" -13.25,4.25,"pseudoabs" -30.25,-7.25,"pseudoabs" -33.75,-13.75,"pseudoabs" -16.75,6.25,"pseudoabs" -20.75,18.75,"pseudoabs" -17.25,-21.75,"pseudoabs" -19.75,1.75,"pseudoabs" -1.75,9.75,"pseudoabs" -29.75,-21.25,"pseudoabs" -28.75,21.25,"pseudoabs" --3.25,6.25,"pseudoabs" -3.25,17.25,"pseudoabs" -4.25,20.75,"pseudoabs" -2.25,15.25,"pseudoabs" --8.75,12.25,"pseudoabs" -40.75,8.25,"pseudoabs" -16.75,-27.25,"pseudoabs" -22.75,16.75,"pseudoabs" --7.75,7.25,"pseudoabs" -24.25,-2.25,"pseudoabs" -6.75,9.75,"pseudoabs" -22.75,19.25,"pseudoabs" -18.75,15.25,"pseudoabs" -28.75,12.75,"pseudoabs" -31.75,4.25,"pseudoabs" -24.25,-26.75,"pseudoabs" -10.25,4.25,"pseudoabs" -21.25,-8.25,"pseudoabs" -20.25,20.75,"pseudoabs" -1.75,19.75,"pseudoabs" -11.25,9.75,"pseudoabs" -13.25,-5.75,"pseudoabs" -16.25,6.25,"pseudoabs" -16.25,-24.75,"pseudoabs" -30.25,-16.25,"pseudoabs" -31.75,12.75,"pseudoabs" -20.75,-21.25,"pseudoabs" -42.75,1.75,"pseudoabs" -14.25,-6.25,"pseudoabs" -25.25,10.75,"pseudoabs" -30.25,-3.75,"pseudoabs" -34.25,-6.25,"pseudoabs" -22.25,-26.25,"pseudoabs" --16.25,16.75,"pseudoabs" -7.75,6.75,"pseudoabs" -49.25,7.75,"pseudoabs" -11.75,1.25,"pseudoabs" -34.25,17.75,"pseudoabs" -21.25,-32.75,"pseudoabs" -38.25,-6.75,"pseudoabs" -21.75,-1.25,"pseudoabs" -29.25,-17.25,"pseudoabs" -37.25,1.25,"pseudoabs" --1.75,17.75,"pseudoabs" -32.75,3.75,"pseudoabs" -43.25,4.75,"pseudoabs" -10.25,-1.75,"pseudoabs" -14.25,0.25,"pseudoabs" -1.75,9.25,"pseudoabs" -25.25,-2.25,"pseudoabs" -13.25,-7.75,"pseudoabs" -19.75,-1.25,"pseudoabs" -27.25,-19.25,"pseudoabs" -9.25,21.25,"pseudoabs" -32.75,20.25,"pseudoabs" --11.25,9.75,"pseudoabs" -0.75,11.75,"pseudoabs" -33.75,19.25,"pseudoabs" -37.25,-9.75,"pseudoabs" -11.25,12.25,"pseudoabs" -16.25,-4.25,"pseudoabs" -39.25,-7.75,"pseudoabs" -36.25,-16.25,"pseudoabs" -20.25,12.25,"pseudoabs" -4.75,21.75,"pseudoabs" --12.75,20.75,"pseudoabs" -21.75,-7.75,"pseudoabs" -15.25,17.75,"pseudoabs" -44.25,9.75,"pseudoabs" -15.75,-21.75,"pseudoabs" -6.25,8.25,"pseudoabs" -9.75,12.75,"pseudoabs" -16.75,-0.25,"pseudoabs" -16.25,-26.25,"pseudoabs" -5.75,18.75,"pseudoabs" -37.25,-11.75,"pseudoabs" -10.75,21.75,"pseudoabs" -29.75,-10.25,"pseudoabs" -38.75,-11.25,"pseudoabs" -36.75,-3.75,"pseudoabs" -22.75,-0.25,"pseudoabs" -12.75,10.25,"pseudoabs" -7.25,14.25,"pseudoabs" -21.75,-20.25,"pseudoabs" -24.75,10.75,"pseudoabs" --10.75,13.25,"pseudoabs" -24.25,14.75,"pseudoabs" -39.25,9.25,"pseudoabs" -16.25,-16.25,"pseudoabs" -27.75,-32.25,"pseudoabs" -32.25,-18.25,"pseudoabs" -30.25,15.25,"pseudoabs" -17.75,-17.75,"pseudoabs" --11.25,18.75,"pseudoabs" -10.25,21.25,"pseudoabs" -27.25,-12.25,"pseudoabs" -16.25,5.25,"pseudoabs" -28.25,6.75,"pseudoabs" --7.75,18.75,"pseudoabs" -22.25,18.25,"pseudoabs" -4.25,9.75,"pseudoabs" -25.25,-1.25,"pseudoabs" -30.25,-17.75,"pseudoabs" -7.75,4.75,"pseudoabs" -23.25,-5.25,"pseudoabs" -37.25,17.25,"pseudoabs" -18.25,13.75,"pseudoabs" -13.75,-2.75,"pseudoabs" -26.25,20.25,"pseudoabs" -27.25,-17.25,"pseudoabs" --1.25,18.75,"pseudoabs" -18.25,18.25,"pseudoabs" -11.75,-17.25,"pseudoabs" -12.75,0.25,"pseudoabs" -36.25,11.75,"pseudoabs" -19.25,10.75,"pseudoabs" -6.25,8.75,"pseudoabs" -48.75,9.25,"pseudoabs" -7.75,20.25,"pseudoabs" -27.25,19.75,"pseudoabs" -20.25,-8.25,"pseudoabs" -42.75,1.25,"pseudoabs" -4.25,19.75,"pseudoabs" --1.25,5.75,"pseudoabs" -25.75,-4.25,"pseudoabs" -26.25,-3.25,"pseudoabs" -29.25,-18.75,"pseudoabs" -24.25,15.25,"pseudoabs" -24.25,18.75,"pseudoabs" -29.75,-8.25,"pseudoabs" -6.75,9.25,"pseudoabs" -20.25,-23.25,"pseudoabs" -32.75,12.25,"pseudoabs" -27.25,20.75,"pseudoabs" -19.25,13.25,"pseudoabs" -22.75,-5.75,"pseudoabs" -23.75,-14.25,"pseudoabs" -41.25,8.75,"pseudoabs" -29.75,-30.25,"pseudoabs" -19.75,0.75,"pseudoabs" -28.75,2.25,"pseudoabs" -30.25,-7.75,"pseudoabs" -12.25,-3.75,"pseudoabs" -28.75,0.25,"pseudoabs" -30.25,6.25,"pseudoabs" -27.25,12.75,"pseudoabs" -32.25,-2.75,"pseudoabs" -4.25,8.75,"pseudoabs" -13.75,-0.25,"pseudoabs" -34.75,-23.75,"pseudoabs" -20.75,-6.75,"pseudoabs" -15.75,18.75,"pseudoabs" -19.25,-1.25,"pseudoabs" -20.75,21.75,"pseudoabs" -20.25,16.25,"pseudoabs" -36.25,-10.25,"pseudoabs" -19.75,-28.25,"pseudoabs" -25.75,-7.25,"pseudoabs" -4.75,11.75,"pseudoabs" -2.75,15.25,"pseudoabs" -16.25,-7.75,"pseudoabs" -42.25,0.25,"pseudoabs" -31.75,1.75,"pseudoabs" -24.75,-13.75,"pseudoabs" -13.75,-20.75,"pseudoabs" -15.25,13.75,"pseudoabs" -34.25,-22.25,"pseudoabs" -37.75,-7.75,"pseudoabs" -29.25,-0.25,"pseudoabs" -33.75,5.25,"pseudoabs" -24.25,2.25,"pseudoabs" -18.25,16.75,"pseudoabs" -34.25,-6.75,"pseudoabs" -16.75,-24.75,"pseudoabs" -29.25,-28.25,"pseudoabs" -21.75,20.25,"pseudoabs" -39.25,1.75,"pseudoabs" -11.75,13.75,"pseudoabs" -14.75,6.75,"pseudoabs" -20.75,-19.25,"pseudoabs" --2.75,17.25,"pseudoabs" -15.75,-0.25,"pseudoabs" -23.75,13.75,"pseudoabs" -15.25,-7.75,"pseudoabs" -23.75,-20.75,"pseudoabs" -43.75,5.75,"pseudoabs" -26.75,15.75,"pseudoabs" -31.25,-14.25,"pseudoabs" -35.75,-1.75,"pseudoabs" -25.25,13.75,"pseudoabs" -25.25,8.75,"pseudoabs" -39.75,-12.75,"pseudoabs" -28.25,-25.25,"pseudoabs" -9.25,4.75,"pseudoabs" -16.25,-4.75,"pseudoabs" --11.25,18.25,"pseudoabs" -12.75,2.75,"pseudoabs" -33.25,-21.75,"pseudoabs" -14.25,-8.25,"pseudoabs" -23.75,-19.25,"pseudoabs" -25.25,-8.75,"pseudoabs" -20.25,12.75,"pseudoabs" --10.75,20.25,"pseudoabs" -27.75,-31.75,"pseudoabs" -22.75,11.25,"pseudoabs" -43.75,4.75,"pseudoabs" -19.75,-13.75,"pseudoabs" -38.25,9.25,"pseudoabs" -17.75,-22.75,"pseudoabs" -24.25,19.25,"pseudoabs" -14.25,18.25,"pseudoabs" --5.75,16.75,"pseudoabs" -24.75,18.25,"pseudoabs" -19.75,-2.75,"pseudoabs" -24.75,-9.75,"pseudoabs" -28.25,1.25,"pseudoabs" --3.25,7.75,"pseudoabs" -15.25,-15.25,"pseudoabs" -13.75,-17.75,"pseudoabs" --6.25,10.75,"pseudoabs" -6.75,5.75,"pseudoabs" -27.75,-9.75,"pseudoabs" -23.25,19.25,"pseudoabs" -39.75,12.75,"pseudoabs" -15.25,-9.25,"pseudoabs" -31.25,9.25,"pseudoabs" -36.75,14.25,"pseudoabs" --9.75,10.25,"pseudoabs" -22.25,-20.25,"pseudoabs" -25.25,14.25,"pseudoabs" -34.25,20.75,"pseudoabs" -31.75,20.25,"pseudoabs" -22.75,14.25,"pseudoabs" -32.75,-16.25,"pseudoabs" -24.25,-22.75,"pseudoabs" -36.25,-3.25,"pseudoabs" -10.25,0.25,"pseudoabs" -39.25,14.75,"pseudoabs" -16.75,11.25,"pseudoabs" -22.25,-13.25,"pseudoabs" -43.25,2.25,"pseudoabs" --2.25,6.75,"pseudoabs" -43.25,11.25,"pseudoabs" -22.75,-32.75,"pseudoabs" -32.25,14.75,"pseudoabs" -17.25,5.25,"pseudoabs" -15.25,-14.75,"pseudoabs" -24.25,3.25,"pseudoabs" -17.25,12.25,"pseudoabs" -12.75,2.25,"pseudoabs" -19.75,-4.75,"pseudoabs" -34.25,-7.25,"pseudoabs" -22.25,16.25,"pseudoabs" -19.25,-14.25,"pseudoabs" -28.25,-26.25,"pseudoabs" -12.25,19.75,"pseudoabs" -16.75,-6.25,"pseudoabs" --11.75,19.25,"pseudoabs" -26.75,1.25,"pseudoabs" -14.75,-15.25,"pseudoabs" -18.25,2.25,"pseudoabs" -39.75,5.75,"pseudoabs" -41.75,2.75,"pseudoabs" -4.75,21.25,"pseudoabs" -22.25,-12.75,"pseudoabs" -47.25,6.25,"pseudoabs" --12.75,9.75,"pseudoabs" -21.75,-15.75,"pseudoabs" -41.75,5.75,"pseudoabs" -12.25,1.75,"pseudoabs" --15.25,19.25,"pseudoabs" -5.25,7.25,"pseudoabs" -30.75,-4.25,"pseudoabs" -21.75,-12.75,"pseudoabs" -24.25,-4.25,"pseudoabs" -20.75,-20.25,"pseudoabs" --5.75,7.25,"pseudoabs" -40.25,10.75,"pseudoabs" -29.75,3.75,"pseudoabs" -26.25,-26.75,"pseudoabs" -25.25,-14.75,"pseudoabs" -37.75,1.75,"pseudoabs" --0.75,14.75,"pseudoabs" -25.75,-12.75,"pseudoabs" -21.75,-9.25,"pseudoabs" -19.25,9.25,"pseudoabs" -17.75,3.75,"pseudoabs" -18.25,-13.75,"pseudoabs" -23.75,-21.75,"pseudoabs" -29.25,-15.25,"pseudoabs" --10.25,6.25,"pseudoabs" -38.75,2.75,"pseudoabs" --7.25,6.25,"pseudoabs" -26.75,7.25,"pseudoabs" --2.25,6.25,"pseudoabs" -3.25,18.25,"pseudoabs" --15.25,19.75,"pseudoabs" -24.25,15.75,"pseudoabs" --1.75,11.75,"pseudoabs" --11.25,16.75,"pseudoabs" -31.25,-27.25,"pseudoabs" --0.75,8.75,"pseudoabs" -3.25,20.75,"pseudoabs" -22.25,1.25,"pseudoabs" -11.25,-1.25,"pseudoabs" -5.25,21.75,"pseudoabs" -15.25,15.75,"pseudoabs" -26.25,-21.25,"pseudoabs" -19.75,-14.25,"pseudoabs" -20.25,-5.75,"pseudoabs" -32.25,7.25,"pseudoabs" -21.25,-22.25,"pseudoabs" -29.25,-13.75,"pseudoabs" -29.25,-11.25,"pseudoabs" -19.75,2.25,"pseudoabs" -18.25,0.25,"pseudoabs" -13.75,13.75,"pseudoabs" -15.25,8.25,"pseudoabs" -26.25,18.25,"pseudoabs" -33.75,-24.25,"pseudoabs" -27.25,-13.75,"pseudoabs" -21.75,-5.75,"pseudoabs" -42.75,0.25,"pseudoabs" --16.75,15.25,"pseudoabs" -33.75,-12.75,"pseudoabs" -15.75,-22.75,"pseudoabs" -30.75,-18.25,"pseudoabs" -14.75,-19.25,"pseudoabs" -20.75,-7.75,"pseudoabs" --6.25,18.25,"pseudoabs" -33.75,-14.25,"pseudoabs" -14.25,0.75,"pseudoabs" -38.25,7.25,"pseudoabs" -20.25,8.25,"pseudoabs" -22.75,-10.25,"pseudoabs" -28.25,-9.25,"pseudoabs" -2.75,17.75,"pseudoabs" --10.25,18.25,"pseudoabs" -21.25,17.25,"pseudoabs" -9.75,0.25,"pseudoabs" -21.75,1.75,"pseudoabs" -15.25,-6.25,"pseudoabs" --12.25,15.25,"pseudoabs" -40.25,1.75,"pseudoabs" -20.25,1.25,"pseudoabs" -21.25,-9.75,"pseudoabs" -24.25,-2.75,"pseudoabs" -24.25,4.25,"pseudoabs" -27.25,-11.75,"pseudoabs" -15.25,3.25,"pseudoabs" -24.75,6.25,"pseudoabs" -24.25,-19.75,"pseudoabs" -33.75,-6.75,"pseudoabs" -30.75,-9.75,"pseudoabs" -35.25,-17.75,"pseudoabs" -33.75,-20.25,"pseudoabs" --10.25,7.75,"pseudoabs" -44.75,8.25,"pseudoabs" -34.25,15.75,"pseudoabs" -0.75,20.25,"pseudoabs" -6.75,7.25,"pseudoabs" -40.25,-0.25,"pseudoabs" -24.25,-27.75,"pseudoabs" -19.75,-26.25,"pseudoabs" -22.75,3.75,"pseudoabs" -16.25,17.75,"pseudoabs" --5.75,7.75,"pseudoabs" --12.75,8.25,"pseudoabs" -27.25,-27.25,"pseudoabs" -23.25,-18.25,"pseudoabs" -39.25,-10.75,"pseudoabs" -28.25,-2.25,"pseudoabs" --5.25,14.25,"pseudoabs" -29.25,9.75,"pseudoabs" -41.25,10.75,"pseudoabs" --16.75,21.75,"pseudoabs" -23.25,4.25,"pseudoabs" -29.25,-23.25,"pseudoabs" -16.75,7.25,"pseudoabs" -23.75,14.75,"pseudoabs" -14.75,-9.75,"pseudoabs" -28.75,5.75,"pseudoabs" -29.75,6.25,"pseudoabs" -11.75,13.25,"pseudoabs" -27.75,5.75,"pseudoabs" -10.25,6.25,"pseudoabs" -19.75,-23.25,"pseudoabs" -20.75,-25.75,"pseudoabs" -16.25,-14.25,"pseudoabs" -29.75,15.75,"pseudoabs" -9.25,17.25,"pseudoabs" -15.75,-1.75,"pseudoabs" -27.75,-26.75,"pseudoabs" --10.75,10.75,"pseudoabs" -1.75,17.25,"pseudoabs" -0.25,8.75,"pseudoabs" -35.25,1.75,"pseudoabs" -29.25,-0.75,"pseudoabs" -13.75,-19.25,"pseudoabs" -18.25,21.75,"pseudoabs" -20.25,-26.75,"pseudoabs" --8.25,14.75,"pseudoabs" diff --git a/data-raw/old_vignettes/arabiensis_pres.csv b/data-raw/old_vignettes/arabiensis_pres.csv deleted file mode 100644 index 1ccb5e66..00000000 --- a/data-raw/old_vignettes/arabiensis_pres.csv +++ /dev/null @@ -1,701 +0,0 @@ -longitude,latitude,class -13.3456,8.5419,presence -34.589,8.245,presence -8.3613,14.24817,presence -34.678,-14.2803,presence --3.4253,13.09583,presence -0.399,10.733,presence -23.7,-25.4501,presence -16.4,8.4,presence -36.83333,7.66667,presence --5.82692,12.93601,presence --16.034,13.412,presence --0.35167,12.17944,presence --4.55,11.5833,presence -5.6728,4.9874,presence --5.2667,13.1,presence --6.1202,14.7396,presence -47.2431,7.1745,presence -30.1118,-1.977,presence -30.21293,-15.13426,presence -33.3384,3.3519,presence --3.2631,11.679,presence -24.265,-17.509,presence --4.9166,10.2833,presence -36.1382,15.8126,presence -37.31667,-0.73333,presence -39.0853,-3.1099,presence --5.0962,7.683,presence -27.2998,-16.2183,presence -47.8333,7.5,presence --4.6537,13.912,presence -34.8314,-5.7435,presence --7.75,14.3333,presence --3.75,14.7667,presence --10.3766,14.4312,presence -33.3655,13.33,presence -1.7089,11.8789,presence -33.3327,19.5385,presence -31.6995,-15.14997,presence -35.1172,-14.3014,presence -38.5667,6.9667,presence --12.3983,17.0439,presence -48.4864,8.405,presence -30.099,-4.584,presence -38.047,-4.65,presence -35.8535,15.187,presence -34.27511,0.63526,presence -33.4462,-2.5908,presence -13.24148,8.47248,presence -34.62493,-19.53779,presence -28,7.7,presence -32.5428,2.1081,presence --11.67124,13.88405,presence --15.53669,13.45891,presence -36.6784,-8.38513,presence -32.8,15.38333,presence --6.684,12.6,presence -39.27245,-0.6433,presence --8.5,13.5667,presence -0.8549,19.4649,presence -33.61841,-16.14296,presence --13.653,16.0475,presence -30.1775,13.0457,presence -24.0904,13.6539,presence -4.83243,9.12795,presence -30.45,19.26667,presence -13.5,-14.91667,presence -28.2121,-17.9413,presence -38.03667,-1.59993,presence -38.8204,15.6429,presence -27.3433,-15.21751,presence -20.9274,-17.9714,presence -31.04574,-22.8884,presence -33.567,-13.433,presence -15.23333,11.71667,presence --5.0333,12.7167,presence -49.5685,8.4855,presence -49.0507,10.2717,presence -40,9.0167,presence --3.0925,14.4567,presence -30.5685,20.152,presence -3.38333,11.86667,presence --17.36203,14.75712,presence -44.122,3.351,presence -36.39301,-8.15443,presence -31.666,-21.065,presence -27.1238,-18.0397,presence -37.64592,6.98934,presence --15.8738,11.2232,presence --3.52191,11.48945,presence -40.69167,-2.26485,presence -36.825,-3.2923,presence -44.0825,2.7976,presence -14.5469,10.0853,presence -14.93321,10.85373,presence -22.45,-19.58333,presence -27.56666,-15.8499,presence -34.0523,-12.0377,presence -34.95,13.1,presence --5.5,6.935,presence -31.2299,11.4634,presence -18.45,-25.08333,presence -5.667,5.893,presence -33.55,13.85,presence --9.01667,9.26667,presence -27.22049,-20.8402,presence -39.08232,-3.74312,presence -35.6166,8.7,presence -36.3167,8.4833,presence -37.0667,8.35,presence --16.6,14.7167,presence -40.167,-2.4433,presence -6.786,6.13,presence -33.869,17.424,presence -27.35037,-14.05012,presence --15.59672,13.56996,presence -36.994,-16.8374,presence -37.09715,-0.48333,presence -39.68192,-0.51577,presence -7.72713,14.15939,presence --0.5216,13.5274,presence --15.905,15.29111,presence --6.9167,10.45,presence -28.752,-22.278,presence --12.621,15,presence --1.05,11.66,presence --2.98592,16.7087,presence -7.86,12.667,presence -44.8981,2.0483,presence -31.3107,-22.4503,presence -11.51667,3.86667,presence -50.4246,10.5752,presence --5.97,14.33,presence -24.1735,12.3326,presence -47.6063,9.1112,presence -39.38333,8.4,presence --1.2413,15.4418,presence -28.2004,11.4494,presence -3.6941,8.18227,presence -6.1924,5.1524,presence --5.6671,11.3173,presence -47.4308,6.7697,presence -15,10.56667,presence -11.4876,6.0828,presence -28.68333,-17.91667,presence -29.6137,-15.0735,presence -31.42492,-1.95906,presence -1.9667,7.9333,presence -45.4857,2.5085,presence -15.66667,-17.85,presence -45.1648,9.8881,presence -47.1667,8.4167,presence --9.4868,13.039,presence --13.70985,13.46552,presence -42.4687,1.1576,presence -26.016,-24.45,presence -37.8666,-4.25,presence -32.9133,14.8027,presence -33.87289,-24.72173,presence -41.0827,11.7344,presence -49.1833,11.2833,presence --9.3833,14.5833,presence --7.4667,14.5667,presence -28.28768,-15.40735,presence -4.32,7.29,presence -35.3888,14.0408,presence --2.23337,12.06664,presence -48.85,7.217,presence -7.167,10.433,presence -23.2597,12.483,presence -32.3108,-8.9662,presence -39.395,13.277,presence -30.5393,1.0507,presence -23.5409,-19.9114,presence -25.2836,14.8332,presence -38.1333,10.1667,presence -34.31789,-0.47647,presence -27.5563,-18.7184,presence --16.64508,13.26843,presence -35.94985,-0.05465,presence -33.2698,-9.6987,presence -6.81394,15.14868,presence --10.5015,14.2635,presence -28.41667,-14.41667,presence -36.2404,-1.1068,presence --14.606,17.375,presence -11.8104,6.7491,presence --15.04548,16.49952,presence --1.7362,15.2705,presence -29.0076,-2.5964,presence -37.3667,-8.5167,presence -34.6375,11.846,presence -27.5578,-4.0199,presence -30.5028,-1.7984,presence -42.8762,3.788,presence --15.894,14.868,presence -26.299,-10.616,presence -8.083,6.451,presence -37.343,-3.529,presence -15.2158,-4.3416,presence -13.5582,4.3418,presence -36.5359,-7.4584,presence --0.5117,14.1022,presence -35.5761,-16.0809,presence -38.02753,-1.40853,presence -35.0667,0.3167,presence -36.8828,9.1486,presence -39.18285,-6.84643,presence --2.19,12.68,presence -29.299,-3.182,presence -33.277,1.8606,presence -34.86194,-16.24694,presence -0.6167,18.0667,presence -38.82,-6.58,presence -40.5333,10.4667,presence -3.39627,6.53331,presence -36.00183,0.43733,presence -34.2936,-11.607,presence --14.88333,15.28333,presence -32.38333,15.56667,presence -13.38333,9.3,presence -41.6587,0.7842,presence -13.5291,8.6604,presence --9.618,16.661,presence -29.2392,12.3554,presence -32.7119,1.9929,presence -34.6855,-2.154,presence --0.86667,11.75,presence -31.8068,-26.0038,presence --10.8981,12.4329,presence -24.8571,13.7214,presence -35.8333,-3.5,presence --12.4629,14.8698,presence -21.802,-18.369,presence -33.4336,16.6838,presence -39.2709,8.542,presence --0.1362,10.8532,presence -35.1331,0.80487,presence -40.399,9.551,presence --3.3833,16.25,presence -0.0677,11.1443,presence -14.7,-17.5833,presence --15.9773,18.0836,presence -35.932,-18.282,presence -22.2819,-19.3524,presence -30,-3.38,presence -36.7173,-8.89667,presence --1.3333,15.8,presence -5.5068,13.1227,presence -20.0928,-22.2764,presence -26.7001,-12.646,presence -35.1962,-15.0824,presence -26.689,-13.935,presence -31.8487,18.5698,presence --10.8306,13.8083,presence --15.9019,16.2339,presence -13.1106,6.751,presence -39.1667,14.15,presence -30.79187,-23.2546,presence -22.6033,12.1278,presence -5.3763,15.0459,presence -10.7342,5.6246,presence -43.2245,2.8215,presence -9.483,14.134,presence -3.90231,6.79984,presence -34.3785,13.691,presence -5.625,6.338,presence --7.2,13.47,presence -35.966,-7.099,presence -30.6167,12.7,presence --9.6,13.08334,presence -12.6928,6.5699,presence -15.3755,10.27942,presence -45.2062,4.7367,presence -26.217,10.334,presence -34.45905,-1.08922,presence -37.949,-5.649,presence -45.4376,10.3498,presence --10.3167,13.6833,presence -3.4,14.39,presence -7.6001,10.7331,presence -29.8237,-18.9201,presence -35.16799,-23.92474,presence -3.7292,11.7058,presence -37.75,14.968,presence -37.51181,-17.31389,presence -35.7001,-6.5896,presence -9.98333,12.35,presence --4.413,12.5,presence -14.2816,10.5651,presence --14.936,13.5,presence -31.6,-24.989,presence --3.6605,10.3122,presence -34.5,-2.75,presence -34.93333,-0.76667,presence -38.7246,7.8922,presence -32.66775,-26.342,presence -25.1461,11.2775,presence -25.9936,-15.0667,presence --2.3638,13.4269,presence -15.53333,10.93333,presence -38.2173,15.015,presence -12.05,4.5,presence -16.7761,8.5179,presence --0.238,11.056,presence -29.7166,11.0167,presence -27.85684,-12.54133,presence -29.6505,12.0463,presence -35.2494,-16.9135,presence -36.9761,8.9744,presence -32.8008,12.5904,presence -23.248,-20.201,presence -1.2667,10.5667,presence -37.285,7.606,presence -34.085,11.34,presence -39.8592,14.9555,presence -37.2667,12.2,presence -21.433,-18.017,presence -43.6978,10.2748,presence -17.83333,-25.16667,presence --8,12.4667,presence -30.30278,19.92528,presence --7.56019,12.86406,presence -32.93333,-18.3667,presence --4.8969,13.2974,presence -33.0311,-25.0584,presence -33.1277,15.1607,presence --13.7847,13.57833,presence -8.5341,8.734,presence -26.8811,-15.3475,presence -36.98919,13.04269,presence -34.282,10.55,presence -13.0401,4.9739,presence -33.478,-2.4768,presence -30.194,-5.2,presence -39.99992,-1.50513,presence -2.71667,9.85,presence -37.35,-3.35,presence --15.95,14.25,presence -3.9602,14.24817,presence -29.9887,-1.2633,presence -9.195,12.43,presence -33.89441,0.72317,presence -7.877,8.842,presence --6.0751,13.6739,presence -40,7.1155,presence --0.6014,12.4899,presence -32.7667,13.1333,presence -2.48333,8.33333,presence -49.816,7.9826,presence -11.08,4.36,presence -14.5519,12.7688,presence -32.44902,15.38724,presence -43.916,9.917,presence -32.5971,0.4384,presence -44.6704,10.1779,presence -21.933,-21.534,presence -25.2987,13.4821,presence -26.73333,-16.2167,presence --1.40027,12.18887,presence --12.4297,16.3333,presence --0.4735,13.169,presence -49.6862,10.132,presence -14.6167,11.8245,presence -40.0459,11.2116,presence -9.175,9.343,presence -37.26045,11.48652,presence --14.947,12.901,presence -7.19,13.59,presence -34.125,0.453,presence -15.367,7.783,presence -31.2273,0.3754,presence -13.6412,8.1992,presence -42.1,9.3,presence -9.672,4.078,presence -5.244,13.058,presence -34.999,1.025,presence -38.847,14.7062,presence --13.256,15.68,presence --11.434,14.457,presence --5.16591,10.65437,presence -19.497,-22.408,presence -30.6328,0.6173,presence -43.6498,3.1138,presence --3.567,10.9,presence -33.13333,14.18333,presence -13.832,4.784,presence -30.9499,18.0525,presence -21.323,-17.9798,presence --14.434,16.516,presence -42.1833,7.3333,presence -47.8298,7.6431,presence -35.09173,-0.68673,presence -28.3374,-21.6456,presence -11.22722,5.96944,presence --8.3912,8.661,presence --15.12074,16.51938,presence --1.13456,11.16667,presence -6.231,7.56,presence -36.2036,16.156,presence -28.8509,-16.0271,presence -14.5676,11.4063,presence -6.2618,14.0188,presence -30.2573,-1.4586,presence -32.982,14.252,presence -13.5336,7.7328,presence --4.2577,13.9516,presence --3.06255,11.14607,presence --14.621,16.517,presence -35,-15.7667,presence -6.54114,5.2434,presence -32.5853,16.1137,presence -33.9742,12.9896,presence -19.7,-17.91667,presence --15.583,16.516,presence -35.55,4.35,presence -36.3134,18.3028,presence -35.6522,-7.92817,presence --3.1322,12.657,presence -33.51667,14.4,presence -38.4908,16.779,presence -39.25374,-6.08173,presence --14.151,12.951,presence -32.342,-0.223,presence --12.2333,12.637,presence -6.36704,4.55891,presence --15.1254,17.001,presence -4.331,12.518,presence -37.17869,-16.54057,presence -12.4779,6.5098,presence -0.399,10.183,presence -9.50279,14.13402,presence -35.985,-6.442,presence -33.9484,-1.6039,presence -12.035,4.51,presence -34.349,11.768,presence --16.4,13.71667,presence --14.80128,16.44604,presence -35.11155,-0.11086,presence --1.9143,13.5122,presence -35.7857,-15.6427,presence -31.2224,-20.6699,presence -35.75,-4.2167,presence -35.95,14.96667,presence --6.5447,14.0049,presence -11.5717,6.207,presence -39.35215,-15.1247,presence -31.299,-20.4346,presence -0.5998,11.034,presence -36.43333,15.38333,presence -11.45338,3.870892,presence -32.8333,-4.9167,presence -14,8.4997,presence --1.2892,14.0908,presence -2.06917,7.18333,presence -44.691,9.7664,presence -2.399,11.2935,presence -46.4038,8.2871,presence -33.36667,14.78333,presence --16.426,14.34,presence -37.591,15.111,presence --4.61417,10.83325,presence -38.7667,14.05,presence -32.826,-5.0187,presence -32.7584,-16.7105,presence -28.65865,-12.93999,presence --9.9137,15.0697,presence -30.1127,-2.2315,presence -34.8105,-12.6933,presence -31.54556,-2.07898,presence -29.9,-3.09,presence -36.69257,-1.32638,presence -39.4844,5.3754,presence --13.4526,13.47341,presence -26.8562,-24.1855,presence --0.05,14.05,presence -31.4593,-23.9752,presence -42.9667,10.5667,presence -32.453,-23.469,presence --9.3653,15.8172,presence -4.26667,7.9,presence -37.58333,8.23333,presence -1.52,12.48,presence -36.7372,14.8326,presence --10.5833,15.0667,presence --13.9086,17.0582,presence -45.42,9.272,presence --0.191,5.565,presence -36.85167,-2.39592,presence -6.59821,4.71071,presence -42.3886,3.3181,presence -38.48472,-3.4554,presence --11.6844,14.2245,presence --8.246,12.165,presence -8.315,4.956,presence -45.5381,9.5247,presence -31.0333,3.2,presence --14.0267,13.551,presence -31.9935,-25.4438,presence -27.94943,-14.73853,presence -32.53732,-25.99175,presence -38.9877,-8.0087,presence -33.6367,13.5704,presence -4.25717,8.16492,presence -31.0333,3.2,presence -34.1649,-0.4302,presence -39.8333,-3.7833,presence --0.8505,10.8663,presence -34.9566,-0.2812,presence -14.1278,10.0736,presence -34.62493,-19.53779,presence -13.5598,9.4243,presence -34.24448,0.51899,presence -0.2809,12.1086,presence -13.5651,7.9962,presence -34.903,-16.1699,presence -32.61314,-25.9284,presence -37.333,-0.683,presence -37.44362,-1.17823,presence -39.9544,-3.4014,presence -34.59985,-0.13304,presence -30.1127,-2.2315,presence -35.3206,-14.4484,presence -34.69815,0.62063,presence --13.4526,13.47341,presence --4.621,10.825,presence -30.19,-3,presence -37.829,-1.05565,presence -34.92298,-0.17228,presence -38.6596,14.1231,presence -38.92753,-3.66307,presence -37.3577,6.6666,presence -39.2847,-4.1235,presence -39.2709,8.542,presence -39.85,-3.683,presence -35.0329,-0.1753,presence -39.9477,-3.3343,presence -49.471,10.6893,presence --10.8306,13.8083,presence -30.3837,19.6917,presence -37.31667,-0.73333,presence --14.951,13.533,presence -34.2437,-0.8113,presence -32.5423,15.4301,presence --14.85163,16.58237,presence --16.3437,13.2078,presence -30.3333,-23.8333,presence -33.5283,14.4296,presence -23.2597,12.483,presence --14.75461,16.54632,presence --4.4136,11.4063,presence -32.5514,15.623,presence -32.453,-23.469,presence -37.27103,-3.43086,presence -12.4779,6.5098,presence -26.9396,-16.4687,presence --5.16591,10.65437,presence -35.7789,-4,presence -32.9133,14.8027,presence -38.89736,-6.45335,presence --13.64408,13.36585,presence -11.5744,6.5542,presence -32.6131,-25.9341,presence -5.87413,5.06493,presence -37.4842,14.9224,presence --15.9333,13.7667,presence -34.1518,-0.6893,presence -35.153,-23.881,presence -37.01993,-1.10108,presence -34.30898,-0.50095,presence --0.4482,12.219,presence -31.6995,-15.14997,presence -15.86,-17.436,presence -34.05148,0.7473,presence -33.18,14.91,presence --0.35,12.16667,presence -11.45338,3.870892,presence --17.4494,14.685,presence -27.1121,-15.0329,presence -34.38123,0.70195,presence --2.5274,12.3848,presence -15.3333,10.65,presence -18.1258,-19.5333,presence -36.4856,8.587,presence -34.0665,-0.7215,presence --1.0694,12.8224,presence -23.248,-20.201,presence --1.08333,13.61667,presence -39.7783,-3.552,presence -34.82381,-16.2342,presence -37.279,7.683,presence -34.916,-0.182,presence -34.6375,11.846,presence -33.36667,14.78333,presence -34.75,0.1667,presence -9.98333,12.35,presence --15.5417,13.5744,presence -34.7519,0.28285,presence --17.4662,14.7041,presence --16.2852,16.4016,presence --17.4901,14.7449,presence -36.2503,-8.2089,presence -37.1361,-6.7869,presence -34.9111,-16.2467,presence -34.53023,-0.49092,presence --10.1637,16.3979,presence -41.0805,11.7374,presence -33.4336,16.6838,presence --0.2974,12.1467,presence -13.5404,8.7225,presence -34.739,-0.44,presence -34.86194,-16.24694,presence -39.25,-6.15,presence -33.55,13.85,presence -34.2079,-0.07943,presence -37.549,-6.2536,presence -35.0354,-0.72797,presence --17.4532,14.7145,presence -32.659,13.1748,presence -37.3971,-3.433,presence --1.5,12.35,presence -34.8,-0.1833,presence -38.708,7.932,presence -39.4541,-4.1553,presence --13.51353,13.52563,presence --0.267,12.001,presence -27.3433,-15.21751,presence -34.0357,-0.0329,presence -34.25207,-0.23878,presence --15.5766,13.586,presence --4.35,11.03333,presence -30.30278,19.92528,presence -34.1068,-0.0469,presence --1.08333,13.61667,presence -45.1648,9.8881,presence -35.04673,-0.07505,presence -37.87798,-1.03255,presence -37.2967,-0.7403,presence -34.348,-0.015,presence -34.216,-0.798,presence -47.1667,8.4167,presence --9.015,9.264,presence -36.9117,-1.2101,presence -30.02,-3.42,presence -43.429,9.9646,presence -36.78002,-1.23033,presence --15.7731,13.3624,presence -39.8124,-3.5888,presence --17.4614,14.6817,presence -33.55,13.85,presence --6.64525,13.05859,presence -36.85167,-2.39592,presence -34.1635,-0.5454,presence -34.4099,-0.1752,presence -34.4782,-0.621,presence -36.9345,7.7049,presence -37.4833,5.8833,presence -33.48333,14.1,presence -28.7943,-14.6558,presence -6.54114,5.2434,presence -35.6376,13.5195,presence -32.5126,15.5889,presence -34.81917,-0.33955,presence -34.5167,0.55,presence -32.5971,0.4384,presence --15.9189,16.4967,presence --1.7212,12.3417,presence -2.66667,9.36667,presence -33.4692,13.8703,presence -24.265,-17.509,presence -38.7,7.868,presence -33.4954,13.8232,presence -5.2329,7.6746,presence --7.4325,14.1766,presence -3.9602,14.24817,presence --2.2492,12.8964,presence --15.59672,13.56996,presence --13.77452,13.54588,presence -0.0873,12.2565,presence --17.4359,14.6972,presence --14.435,16.5,presence --4.04583,11.02944,presence -37.285,7.606,presence -12.8809,6.5973,presence -24.6526,-17.9822,presence -15.45,10.3667,presence -35.645,-15.801,presence -3.9023,6.7999,presence --3.784,12.617,presence --14.9167,13.5667,presence --14.93472,15.31472,presence --17.456,14.7326,presence --2.3274,12.8776,presence -34.2,-0.55,presence -27.91332,-15.78627,presence -35.8612,-6.105,presence -34.46602,-0.35951,presence --2.2845,12.032,presence -33.0833,14.6667,presence -34.4266,-0.1652,presence -15.61667,10.46667,presence diff --git a/data-raw/old_vignettes/arabiensis_wk_coordinates.csv b/data-raw/old_vignettes/arabiensis_wk_coordinates.csv deleted file mode 100644 index ef654e6d..00000000 --- a/data-raw/old_vignettes/arabiensis_wk_coordinates.csv +++ /dev/null @@ -1,5741 +0,0 @@ -ID,latitude,longitude -51,12.11305,15.04923 -52,-24.56336,33.01595 -53,6.1111,37.59625 -59,9.39194,13.5025 -61,-1.95906,31.42492 -62,-2.07898,31.54556 -63,-1.86769,31.40493 -68,-2.05186,31.44633 -76,11.14607,-3.06255 -77,10.96667,-3.25 -82,11.16667,-1.13456 -83,12.18887,-1.40027 -94,12.46667,-3.45 -95,11.48945,-3.52191 -96,12.17944,-0.35167 -109,11.17833,-4.29306 -110,11.17833,-4.29306 -111,0.453,34.125 -112,0.54057,34.5641 -114,-0.03572,34.62196 -115,-0.17259,34.91983 -116,-0.11086,35.11155 -117,-0.47647,34.31789 -118,-0.48805,34.31314 -119,-0.48805,34.31314 -120,-0.47647,34.31789 -121,-0.45618,34.3716 -122,-0.48538,34.37702 -123,-0.45775,34.40257 -124,-0.47189,34.09073 -125,-0.53034,34.09456 -127,-0.47647,34.31789 -128,-0.48805,34.31314 -129,-0.47439,34.33037 -130,-0.48568,34.33364 -131,-0.45618,34.3716 -132,-0.48538,34.37702 -133,-0.45775,34.40257 -134,-0.4426,34.25045 -135,-0.4524,34.2714 -136,-0.47855,34.28581 -137,-0.46102,34.05882 -138,-0.47189,34.09073 -139,-0.46066,34.32133 -140,-0.46898,34.30921 -141,-0.49322,34.3388 -142,-0.49726,34.34273 -143,-0.48799,34.35734 -144,-0.50475,34.35841 -145,-0.49394,34.31575 -146,-0.49465,34.30315 -147,-0.50095,34.30898 -148,-0.51378,34.31456 -149,-0.51972,34.30505 -150,-0.49845,34.31789 -151,-0.51081,34.32122 -152,-0.50427,34.3602 -153,-0.48776,34.37362 -154,-0.46019,34.37838 -155,-0.52757,34.31968 -156,-0.50261,34.38718 -161,0.57068,34.5616 -162,0.45459,34.12806 -163,0.28285,34.7519 -164,0.63526,34.27511 -165,-0.07433,34.66568 -166,-0.18303,34.38381 -167,-0.16196,34.47333 -168,0.45459,34.12806 -169,0.57068,34.5616 -170,0.28285,34.7519 -171,-0.18303,34.38381 -172,-0.16196,34.47333 -173,-0.07433,34.66568 -195,-0.13304,34.59985 -196,-0.16667,34.91983 -197,-0.76667,34.93333 -198,-4.18333,39.43333 -199,-0.73333,37.31667 -200,-0.76667,34.93333 -201,-4.18333,39.43333 -202,-0.73333,37.31667 -203,-0.76667,34.93333 -204,-4.18333,39.43333 -205,-0.73333,37.31667 -206,-1.11667,37.58333 -211,-0.15212,34.38037 -212,-0.17514,34.48024 -213,-0.17009,34.44518 -214,-0.16563,34.47127 -215,-0.14656,34.44494 -216,-0.1372,34.43669 -217,-0.12997,34.44887 -227,-0.07433,34.66568 -228,-0.13304,34.59985 -229,-0.06017,34.97681 -230,-0.17259,34.91983 -232,-0.14931,34.40642 -233,-0.14931,34.40642 -234,-0.1478,34.46341 -241,15.98333,32.75 -242,15.7949,32.89846 -243,15.50267,32.64506 -244,15.65,32.65 -245,15.99,32.56 -246,15.6,32.75 -247,6.38333,2.41667 -248,6.39791,2.40162 -249,6.45367,2.35279 -261,12.5,-1.33333 -262,12.5,-1.33333 -263,12.16667,-0.35 -264,12.16667,-0.35 -265,11.15,-4.28333 -266,11.15,-4.28333 -267,11,-4.04583 -268,11,-4.04583 -278,11.16672,-4.24997 -279,11.16672,-4.24997 -280,11.17833,-4.29306 -281,11.17833,-4.29306 -297,11.02944,-4.04583 -298,-3.35,37.35 -320,11.48652,37.26045 -321,10.67275,37.21762 -322,13.04269,36.98919 -323,6.98934,37.64592 -324,6.23624,37.67448 -325,6.74783,37.68043 -346,-5.22132,39.74296 -347,-5.16421,39.80387 -348,-5.1033,39.80197 -349,-5.06142,39.78674 -350,-6.08173,39.25374 -351,-6.14645,39.24993 -352,-6.16549,39.21567 -353,-6.20356,39.25183 -354,13.71667,-16.4 -355,13.71667,-16.4 -356,13.71667,-16.4 -357,13.71667,-16.4 -375,7.18333,2.06917 -376,7.18333,2.06917 -379,11.86667,3.38333 -380,11.86667,3.38333 -381,11.86667,3.38333 -382,11.86667,3.38333 -383,-1.41073,37.67658 -384,-1.39932,37.80553 -385,-1.40853,38.02753 -386,-1.59993,38.03667 -387,-1.75062,38.09778 -388,-1.76555,38.11177 -389,-2.20205,38.05798 -390,-2.28457,38.03717 -391,-2.33267,38.01263 -392,-2.38295,37.98477 -393,-2.6154,38.07473 -394,-3.40762,38.56088 -395,-4.28342,39.56623 -396,-3.07033,40.14402 -397,-4.00415,39.56927 -398,-2.20783,37.69837 -399,0.57138,34.80738 -400,0.3204,34.78445 -401,-0.00215,34.73997 -402,-0.05015,34.14522 -403,-0.05487,34.11595 -404,-0.03815,34.62388 -405,0.039,34.58037 -406,0.08592,34.54227 -407,0.1543,34.38213 -408,0.458,34.11907 -409,0.49508,34.13348 -410,0.61267,34.24293 -411,0.63133,34.26607 -412,0.61853,34.70338 -413,-0.15453,35.06047 -414,-0.47763,34.8371 -415,-0.44357,34.91833 -416,-0.28613,34.98152 -417,-0.35572,34.68473 -418,-0.41002,34.6101 -419,-0.42563,34.5956 -420,-0.45203,34.57212 -421,-0.53732,34.16397 -422,-0.72512,34.05963 -423,-0.78992,34.2368 -424,-0.7855,34.24375 -425,-0.76022,34.2803 -426,-0.73328,34.36188 -427,-0.65605,34.43682 -428,-0.67283,34.53502 -429,-0.68743,34.53907 -430,-0.81425,37.25345 -431,0.32585,37.55612 -432,0.63633,37.67193 -433,-0.73918,37.27645 -434,-0.68673,35.09173 -435,-0.76583,34.5981 -436,-1.32638,36.69257 -437,-1.21135,36.90587 -438,-1.21007,36.91172 -439,-1.20872,36.91202 -440,-1.16852,36.9529 -441,-1.15258,36.9609 -442,-1.10108,37.01993 -443,-1.0453,37.0743 -444,-1.0544,37.11138 -445,-0.9453,37.1197 -446,-0.81428,37.25347 -447,-0.54617,37.4223 -448,-0.55045,37.38763 -449,-0.64815,37.362 -450,0.46898,37.62078 -451,0.48172,37.63077 -452,0.50138,37.64115 -453,0.51348,37.6486 -454,0.53142,37.65997 -455,0.54777,37.66962 -456,0.59417,37.67315 -457,0.6363,37.67213 -458,-0.48333,37.09715 -459,-0.65013,37.19792 -460,-0.66217,37.2036 -461,-0.67495,37.24565 -462,-0.69462,37.24907 -463,-0.71967,37.26557 -464,-0.75563,37.21012 -465,-0.72343,37.15557 -466,-0.70105,37.13955 -467,-0.65812,37.1077 -468,-0.05465,35.94985 -469,-0.01348,35.96502 -470,-0.00135,35.9641 -471,-0.00733,35.95385 -472,0.71023,36.03047 -473,0.43733,36.00183 -474,-0.48723,34.7683 -475,-0.48472,34.78527 -476,-0.48415,34.79687 -477,-0.44413,34.9021 -478,-0.12568,34.79337 -479,-0.13832,34.79667 -480,-0.15205,34.81372 -481,-0.1543,34.83913 -482,-0.16893,34.87347 -483,-0.17228,34.92298 -484,-0.17922,34.93995 -485,-0.21893,34.95703 -486,-0.23917,34.95752 -487,-0.25897,34.96575 -488,-0.28223,34.97947 -489,-0.2862,34.98157 -490,-0.30283,34.99675 -491,-0.32755,35.00632 -492,-0.2812,34.9566 -493,-0.2878,34.94888 -494,-0.31185,34.91963 -495,-0.31617,34.89033 -496,-0.3199,34.86833 -497,-0.33955,34.81917 -498,-0.34798,34.79342 -499,-0.35295,34.76232 -500,-0.35907,34.72957 -501,-0.35718,34.70705 -502,-0.35585,34.68275 -503,-0.38717,34.63008 -504,-0.40978,34.61047 -505,-0.42568,34.59567 -506,-0.45188,34.57233 -507,-0.47445,34.54647 -508,-0.52237,34.47475 -509,-0.51282,34.48853 -510,-0.49757,34.50535 -511,-0.49092,34.53023 -512,-0.55485,34.44662 -513,-0.59962,34.41937 -514,-0.5731,34.36153 -515,-0.48447,34.2977 -516,-0.47815,34.29027 -517,-0.46498,34.27793 -518,-0.45168,34.2533 -519,-0.44177,34.22515 -520,-0.47073,34.1806 -521,-0.53758,34.1641 -522,-0.53773,34.16445 -523,-0.55435,34.25305 -524,-0.57398,34.26432 -525,-0.63622,34.24143 -526,-0.67587,34.21093 -527,-0.72898,34.07062 -528,-0.72507,34.05972 -529,-0.81432,34.12788 -530,-0.83802,34.15318 -531,-0.9662,35.47135 -532,-0.72797,35.0354 -533,-0.69818,34.66728 -534,-0.72247,34.6442 -535,-0.75808,34.60188 -536,-0.76597,34.59805 -537,-0.81333,34.59268 -538,-0.83923,34.58158 -539,-0.89728,34.5403 -540,-0.98057,34.50128 -541,-1.08922,34.45905 -542,-1.13023,34.44997 -543,-0.7432,34.59505 -544,-0.72162,34.57562 -545,-0.7029,34.55353 -546,-0.68757,34.53923 -547,-0.6531,34.52247 -548,-0.62895,34.5063 -549,-0.60507,34.48732 -550,-0.56478,34.46193 -551,-0.62657,34.49945 -552,-0.6408,34.47465 -553,-0.6567,34.43727 -554,-0.66853,34.41797 -555,-0.72063,34.37662 -556,-0.73355,34.36162 -557,-0.74503,34.33412 -558,-0.75367,34.28902 -559,-0.7693,34.26395 -560,-0.78613,34.24343 -561,-0.81162,34.21697 -562,-0.82827,34.17835 -563,-0.08385,34.75172 -564,-0.07427,34.66272 -565,-0.10432,34.61313 -566,-0.10378,34.58275 -567,-0.11075,34.51028 -568,-0.08275,34.4529 -569,-0.08508,34.3546 -570,-0.09942,34.28423 -571,-0.08555,34.23882 -572,-0.07943,34.2079 -573,-0.06305,34.16162 -574,-0.0518,34.133 -575,-0.0554,34.11557 -576,-0.07313,34.05967 -577,-0.10947,34.38123 -578,-0.12863,34.38547 -579,-0.16655,34.378 -580,-0.19278,34.34517 -581,-0.25127,34.35333 -582,-0.28808,34.3574 -583,-0.32008,34.33232 -584,-0.34942,34.31287 -585,-0.38442,34.28282 -586,-0.18752,34.38833 -587,-0.15413,34.98523 -588,-0.17927,35.09545 -589,-0.19525,35.13842 -590,-0.23655,35.15522 -591,-0.64552,36.38675 -592,0.80487,35.1331 -593,0.85423,34.86798 -594,0.72758,34.76315 -595,0.70143,34.752 -596,0.59518,34.76818 -597,0.57162,34.8069 -598,0.52953,34.81358 -599,0.48448,34.84075 -600,0.345,34.83098 -601,0.22838,34.75598 -602,0.16303,34.7438 -603,-0.08262,34.77468 -604,0.03913,34.58018 -605,0.08562,34.55363 -606,0.12582,34.43458 -607,0.15517,34.32713 -608,0.22153,34.25597 -609,0.29307,34.21272 -610,0.34008,34.18675 -611,0.44638,34.14182 -612,0.59887,34.22798 -613,0.6331,34.29153 -614,0.62018,34.34152 -615,0.60605,34.39998 -616,0.59687,34.44313 -617,0.59102,34.50098 -618,0.57807,34.56365 -619,0.59707,34.61798 -620,0.62063,34.69815 -621,0.37977,34.49062 -622,0.33893,34.49425 -623,-1.32877,36.87553 -624,-1.38773,36.9356 -625,-1.49567,36.9546 -626,-1.54093,36.9408 -627,-1.68368,36.84742 -628,-2.39592,36.85167 -629,-1.71865,36.84013 -630,-1.4461,36.9964 -631,-1.49705,37.07622 -632,-1.52038,37.24683 -633,-1.53768,37.18248 -634,-1.53438,37.16852 -635,-1.50365,37.3743 -636,-1.41395,37.64643 -637,-1.39925,37.80537 -638,-1.51122,38.01522 -639,-2.0788,38.16512 -640,-2.2009,38.05742 -641,-2.61545,38.07468 -642,-2.9948,38.46088 -643,-3.4554,38.48472 -644,-3.38965,37.70548 -645,-3.456,37.60888 -646,-3.26605,37.74662 -647,-3.40782,38.56085 -648,-3.66307,38.92753 -649,-3.74312,39.08232 -650,-3.88912,39.49877 -651,-3.93595,39.5368 -652,-4.51835,39.29263 -653,-4.51802,39.19067 -654,-4.55245,39.12538 -655,-4.50305,39.26323 -656,-3.9326,39.7466 -657,-3.36253,39.93483 -658,-3.1478,40.1234 -659,-2.97188,40.14268 -660,-2.79558,40.14737 -661,-2.4433,40.167 -662,-2.40968,40.20353 -663,-2.33363,40.11907 -664,-1.98633,40.0988 -665,-1.84273,40.10122 -666,-1.79177,40.11213 -667,-1.68732,40.16153 -668,-2.26908,40.12128 -669,-2.33938,40.3398 -670,-2.3642,40.3633 -671,-2.26485,40.69167 -672,-2.40595,40.67583 -673,-2.35822,40.57033 -674,-2.38693,40.41618 -675,-2.64302,40.19115 -676,-3.21453,40.09575 -677,-3.32553,39.95412 -678,-3.69938,39.81415 -679,-3.79245,39.3811 -680,-2.208,37.6986 -681,-1.28988,36.8165 -682,-1.25515,36.90163 -683,-1.25358,36.9028 -684,-1.27208,36.9546 -685,-1.4295,36.68967 -686,-1.23033,36.78002 -687,0.32533,37.57385 -688,-0.24147,37.01415 -689,-0.37198,36.93253 -690,-0.31558,36.89913 -691,-1.06072,37.15368 -692,-1.06085,37.24553 -693,-1.06327,37.29327 -694,-1.10217,37.34042 -695,-1.17823,37.44362 -696,-1.14597,37.50365 -697,-1.1349,37.57118 -698,-1.05565,37.829 -699,-1.03255,37.87798 -700,-0.88898,38.16093 -701,-0.88002,38.17442 -702,-0.76705,38.40297 -703,-0.6433,39.27245 -704,-0.47412,39.59837 -705,-0.51577,39.68192 -706,-0.6139,39.77633 -707,-1.08288,39.93152 -708,-1.50323,40.02038 -709,-1.50513,39.99992 -710,-1.18875,39.8284 -711,-1.15677,39.865 -712,-1.33445,40.00435 -713,-1.39787,36.72587 -714,-1.41382,36.71148 -715,-1.42942,36.68935 -716,-1.23035,36.78 -717,-1.23318,36.74598 -718,-1.23292,36.74602 -719,-1.19385,36.7283 -720,-1.36298,36.90822 -721,-1.33757,36.89165 -722,-1.29165,36.81687 -723,-1.29333,36.84535 -724,-1.31055,36.89135 -725,-1.29007,36.86805 -726,-1.25503,36.90027 -727,-1.25517,36.90158 -728,-1.2568,36.90028 -729,-1.25722,36.92127 -730,-1.25168,36.93478 -731,-1.25168,36.9556 -732,-1.25133,36.95565 -733,-1.26517,36.96552 -734,-1.27053,36.96208 -735,-1.24583,36.86553 -736,-1.19443,36.90163 -737,-1.19472,36.90222 -738,-1.18187,36.72333 -739,-1.20143,36.78555 -740,-3.45167,37.6132 -741,-3.49672,38.31258 -752,0.43095,33.22898 -755,-14.658,28.07345 -756,-12.54133,27.85684 -757,-12.93999,28.65865 -758,-17.85411,25.86093 -759,-15.40735,28.28768 -760,-14.41667,28.41667 -761,-14.05012,27.35037 -762,-11.36191,29.55158 -763,-15.89076,29.04483 -764,-14.73853,27.94943 -765,-15.8499,27.56666 -766,-15.21751,27.3433 -767,-15.78627,27.91332 -768,-15.13426,30.21293 -769,-15.77507,28.17939 -770,-14.658,28.07345 -771,-12.54133,27.85684 -772,-12.93999,28.65865 -773,-17.85411,25.86093 -774,-15.40735,28.28768 -775,-14.41667,28.41667 -776,-14.05012,27.35037 -777,-11.36191,29.55158 -778,-15.89076,29.04483 -779,-14.73853,27.94943 -780,-15.8499,27.56666 -781,-15.21751,27.3433 -782,-15.78627,27.91332 -783,-15.13426,30.21293 -784,-15.77507,28.17939 -785,-14.658,28.07345 -786,-12.54133,27.85684 -787,-12.93999,28.65865 -788,-17.85411,25.86093 -789,-15.40735,28.28768 -790,-14.41667,28.41667 -791,-14.05012,27.35037 -792,-11.36191,29.55158 -793,-15.89076,29.04483 -794,-14.73853,27.94943 -795,-15.8499,27.56666 -796,-15.21751,27.3433 -797,-15.78627,27.91332 -798,-15.13426,30.21293 -799,-15.77507,28.17939 -800,11.86667,3.4 -801,11.13023,2.9357 -803,9.85,2.71667 -804,9.35,2.61667 -806,8.33333,2.48333 -807,7.78333,2.18333 -808,7.66667,2.21667 -810,7.18333,2.06917 -814,6.6641,2.15741 -822,7.02583,-2.34083 -823,7.02583,-2.34083 -824,7.02583,-2.34083 -842,5.96944,11.22722 -843,6.47,12.62222 -844,7.31778,13.59389 -845,9.39194,13.5025 -846,-17.86355,36.89125 -847,-17.86355,36.89125 -848,-17.78265,37.00498 -849,-17.78265,37.00498 -850,-17.31389,37.51181 -851,-17.31389,37.51181 -852,-17.51734,37.5475 -853,-17.51734,37.5475 -854,-16.54057,37.17869 -855,-16.54057,37.17869 -856,-3.35,37.35 -857,-16.2167,26.73333 -858,-15.75042,26.43839 -861,8.661,-8.3912 -862,8.6697,-8.91211 -863,9.26667,-9.01667 -870,12.2,37.2667 -871,8.23333,37.58333 -872,8.4,39.38333 -873,12.2,37.2667 -874,8.23333,37.58333 -875,8.4,39.38333 -876,12.2,37.2667 -877,8.23333,37.58333 -878,8.4,39.38333 -883,0.443,33.24213 -884,0.56475,33.23674 -892,0.7473,34.05148 -893,0.7473,34.05148 -894,0.7473,34.05148 -895,0.77025,34.01995 -896,0.72317,33.89441 -897,0.86268,34.10709 -898,0.62695,34.20763 -959,9.36667,2.66667 -961,9.36667,2.66667 -963,9.36667,2.66667 -964,11.86667,3.38333 -965,9.35,13.51667 -967,11.15,-4.28333 -968,12.5,-1.33333 -969,12.16667,-0.35 -970,11,-4.04583 -971,12.1,15.03333 -972,11.71667,15.23333 -973,10.27942,15.3755 -974,8.4,16.4 -975,14.4,33.51667 -976,14.4,33.51667 -977,14.78333,33.36667 -978,14.78333,33.36667 -979,13.85,33.55 -980,13.85,33.55 -981,14.18333,33.13333 -982,14.18333,33.13333 -994,12.35,-1.5 -995,13.61667,-1.08333 -996,12.46667,-3.45 -997,12.06022,0.36056 -999,12.68,-2.19 -1000,12.26667,-1.65 -1001,12.06667,-1.35 -1002,11.66,-1.05 -1005,10.95,-3.24 -1009,11.86667,3.38333 -1011,9.35,2.61667 -1012,-3.09,29.9 -1013,-3.38,30 -1014,-3.42,30.02 -1015,-3.01,30.16 -1016,-3,30.19 -1017,-26.342,32.66775 -1018,-26.04127,32.32548 -1019,-25.99175,32.53732 -1020,-26.76938,32.37545 -1021,-24.66713,33.08215 -1022,-23.92474,35.16799 -1023,-19.53779,34.62493 -1024,-25.47348,32.75463 -1025,-24.72173,33.87289 -1026,-25.73589,32.6753 -1027,-25.60583,32.25767 -1029,-15.1247,39.35215 -1030,-25.9284,32.61314 -1031,-17.86355,36.89125 -1032,-25.45229,32.02987 -1033,-16.14296,33.61841 -1034,-26.342,32.66775 -1035,-26.04127,32.32548 -1036,-25.99175,32.53732 -1037,-26.76938,32.37545 -1038,-24.66713,33.08215 -1039,-23.92474,35.16799 -1040,-19.53779,34.62493 -1041,-25.47348,32.75463 -1042,-24.72173,33.87289 -1043,-25.73589,32.6753 -1044,-25.60583,32.25767 -1046,-15.1247,39.35215 -1047,-25.9284,32.61314 -1048,-17.86355,36.89125 -1049,-25.45229,32.02987 -1050,-16.14296,33.61841 -1051,-26.342,32.66775 -1052,-26.04127,32.32548 -1053,-25.99175,32.53732 -1054,-26.76938,32.37545 -1055,-24.66713,33.08215 -1056,-23.92474,35.16799 -1057,-19.53779,34.62493 -1058,-25.47348,32.75463 -1059,-24.72173,33.87289 -1060,-25.73589,32.6753 -1061,-25.60583,32.25767 -1063,-15.1247,39.35215 -1064,-25.9284,32.61314 -1065,-17.86355,36.89125 -1066,-25.45229,32.02987 -1067,-16.14296,33.61841 -1068,-25.88051,32.56441 -1069,-25.99175,32.53732 -1070,-26.76938,32.37545 -1071,-23.36972,35.31333 -1072,-25.88847,32.64401 -1073,-25.90294,32.61144 -1074,-25.91307,32.53763 -1075,-25.93333,32.53691 -1076,-19.53779,34.62493 -1077,-19.53779,34.62493 -1078,-25.88806,32.43306 -1079,-15.14997,31.6995 -1080,-25.96156,32.4233 -1081,-24.80633,32.85729 -1082,-25.9284,32.61314 -1083,-25.07045,32.81446 -1084,-17.86355,36.89125 -1085,-17.78265,37.00498 -1099,10.96667,-3.25 -1102,12.46667,-3.45 -1104,12.68364,-2.19245 -1105,11.66667,-1.08333 -1106,12.06667,-1.35 -1107,12.27667,-1.51139 -1108,12.18887,-1.40027 -1109,13.1,-1.08333 -1114,7.15634,3.36945 -1115,7.17841,3.39469 -1116,7.18333,3.01667 -1117,7.03333,3.45 -1118,7.21667,3.61667 -1119,12.41667,-1.35 -1132,15.51764,32.63743 -1133,15.57346,32.50445 -1134,15.62047,32.50575 -1135,15.96236,32.58116 -1136,15.38724,32.44902 -1137,15.77824,32.61312 -1138,0.85707,33.9208 -1139,0.61646,34.1453 -1140,7.41763,3.94213 -1141,7.54863,3.44398 -1142,7.98018,3.59425 -1143,7.48432,3.8175 -1144,8.18227,3.6941 -1145,7.52838,3.45685 -1147,6.46667,3.3 -1151,6.53331,3.39627 -1153,6.53332,3.38332 -1156,9.12795,4.83243 -1158,7.41763,3.94213 -1159,7.54863,3.44398 -1160,7.98018,3.59425 -1161,7.48432,3.8175 -1162,8.18227,3.6941 -1163,7.52838,3.45685 -1165,6.46667,3.3 -1169,6.53331,3.39627 -1171,6.53332,3.38332 -1174,9.12795,4.83243 -1176,7.41763,3.94213 -1177,7.54863,3.44398 -1178,7.98018,3.59425 -1179,7.48432,3.8175 -1180,8.18227,3.6941 -1181,7.52838,3.45685 -1183,6.46667,3.3 -1187,6.53331,3.39627 -1189,6.53332,3.38332 -1192,9.12795,4.83243 -1194,11.54727,-9.30688 -1197,-17.91667,28.68333 -1198,-17.91667,28.68333 -1210,14.56667,33.33333 -1211,14.65,33.08333 -1212,14.4,33.51667 -1213,14.4,33.5 -1214,14.1,33.48333 -1215,14.08333,33.61667 -1216,14.78333,33.36667 -1217,14.25,33.98333 -1218,14.18333,33.13333 -1219,13.58333,33.61667 -1220,13.33333,33.88333 -1221,13.53333,33.6 -1222,13.16667,33.91667 -1225,-27.38333,32.2 -1226,-27.25,32.16667 -1239,-20.8402,27.22049 -1244,14.75712,-17.36203 -1274,12.06667,15.03333 -1275,10.56667,15 -1276,9.11667,13.91667 -1286,8.16492,4.25717 -1289,7.26986,5.16536 -1290,7.40244,5.01083 -1291,6.79984,3.90231 -1292,-27.38333,32.2 -1312,-5.03673,39.78519 -1313,-5.10218,39.82076 -1314,-5.22026,39.82574 -1315,-6.1681,39.19467 -1316,-5.03673,39.78519 -1317,-5.30136,39.79942 -1318,-5.22026,39.82574 -1319,-4.94363,39.78107 -1320,-6.13131,39.27029 -1321,-6.08407,39.22312 -1322,-6.1681,39.19467 -1323,-6.17832,39.36839 -1324,-6.13131,39.27029 -1325,-6.08498,39.22328 -1326,-4.94363,39.78107 -1327,-4.96569,39.7074 -1394,13.26843,-16.64508 -1395,13.48238,-16.52637 -1396,13.56996,-15.59672 -1397,13.45891,-15.53669 -1398,13.67096,-14.88968 -1399,13.30884,-14.21738 -1400,11.17833,-4.29306 -1401,11.14768,-4.28331 -1402,11.45,-4.45 -1403,11.5,-4.4 -1405,11.03333,-4.35 -1406,11.15,-4.16667 -1408,7.18333,2.06917 -1440,10.46667,15.61667 -1441,10.65,15.33333 -1442,10.36667,15.45 -1443,10.93333,15.53333 -1444,10.78333,15.76667 -1445,10.95,15.53333 -1446,9.31667,15.8 -1447,9.13333,15.8 -1448,9.4,15.98333 -1455,14.9838,1.06842 -1456,14.79355,1.04305 -1457,13.80425,3.02164 -1458,13.63937,3.18652 -1459,14.59062,4.17582 -1460,14.24817,3.9602 -1461,14.74282,6.10368 -1462,15.14868,6.81394 -1463,14.15939,7.72713 -1464,14.24817,8.3613 -1465,14.13402,9.50279 -1466,13.86767,9.74377 -1467,14.9838,1.06842 -1468,14.79355,1.04305 -1469,13.80425,3.02164 -1470,13.63937,3.18652 -1471,14.59062,4.17582 -1472,14.24817,3.9602 -1473,14.74282,6.10368 -1474,15.14868,6.81394 -1475,14.15939,7.72713 -1476,14.13402,9.50279 -1477,13.86767,9.74377 -1478,14.9838,1.06842 -1479,13.80425,3.02164 -1480,13.63937,3.18652 -1481,14.24817,3.9602 -1482,14.74282,6.10368 -1483,13.86767,9.74377 -1484,13.53741,2.28693 -1485,13.53741,2.28693 -1486,13.69959,11.16557 -1487,13.69959,11.16557 -1488,13.69773,13.31581 -1489,13.69773,13.31581 -1515,9.3,13.38333 -1516,9.43189,13.36493 -1517,9.39194,13.5025 -1518,-16.24694,34.86194 -1519,-16.29278,34.91194 -1520,-16.24667,34.91111 -1521,-16.2342,34.82381 -1522,14.70289,-17.42568 -1523,14.72198,-17.48958 -1524,9.11667,13.91667 -1530,5.69324,0.05124 -1531,9.35,13.51667 -1532,15.56667,35.33333 -1533,14.96667,35.95 -1534,15.38333,36.43333 -1558,7.9,4.26667 -1573,12.48,1.52 -1574,12.06022,0.36056 -1575,11.4824,-0.51695 -1576,12.17944,-0.35167 -1578,14.05,-0.05 -1579,13.57101,-2.41684 -1580,13.09583,-3.4253 -1581,13.61667,-1.08333 -1582,12.06664,-2.23337 -1583,12.25108,-2.36113 -1584,11.75,-2.92 -1586,11.38722,-4.41167 -1587,11.23334,-4.16668 -1589,11.3,-3.88333 -1591,10.33333,-3.18333 -1594,10.83325,-4.61417 -1596,13.16592,-3.41711 -1597,12.35,-1.5 -1598,11.4,-4.41 -1599,11.86667,3.38333 -1600,9.35,2.61667 -1603,-6.84643,39.18285 -1604,-6.87877,39.24557 -1605,-6.71377,39.21003 -1606,-5.21931,38.65845 -1607,-5.13266,38.39519 -1608,-5.10242,38.4755 -1609,-3.35043,37.15805 -1610,-3.43737,37.29678 -1611,-3.43086,37.27103 -1651,10.86667,15 -1652,10.86667,15 -1653,10.86667,15 -1654,10.86667,15 -1655,10.86667,15 -1656,10.85,15.06667 -1657,10.85,15.06667 -1658,10.85,15.06667 -1659,10.85,15.06667 -1660,10.85,15.06667 -1661,9.4,13.51667 -1662,9.4,13.51667 -1663,9.4,13.51667 -1664,9.4,13.51667 -1665,9.4,13.51667 -1666,10.08333,14.45 -1667,10.08333,14.45 -1668,10.08333,14.45 -1669,10.08333,14.45 -1670,10.08333,14.45 -1676,9.3,13.38333 -1677,9.3,13.38333 -1678,9.3,13.38333 -1679,9.3,13.38333 -1680,9.3,13.38333 -1698,-4.94769,39.78805 -1699,10.33333,-3.18333 -1701,10.65437,-5.16591 -1702,10.97,-4.91 -1703,11.18333,-4.28333 -1704,11.02944,-4.04583 -1705,11.75,-0.86667 -1706,12.46667,-3.45 -1707,12.25108,-2.36113 -1708,12.68364,-2.19245 -1709,12.06022,0.36056 -1710,13.1,-1.08333 -1711,13.57101,-2.41684 -1712,14.05,-0.05 -1713,11.78231,-0.36456 -1715,12.06022,0.36056 -1716,10.97,-4.91 -1718,12.35,-1.5 -1719,14.05,-0.05 -1721,11.48333,-3.51667 -1722,11.66667,-4.4 -1723,11.16454,-4.25303 -1725,12.61667,-3.91667 -1727,-5.95,39.3 -1728,-6.16673,39.22439 -1729,-27.35639,32.22644 -1730,-27.35639,32.22644 -1731,-27.35639,32.22644 -1732,-19.24306,46.27278 -1733,-19.24306,46.27278 -1734,-19.24306,46.27278 -1735,-19.00944,46.4225 -1736,-18.95,47.56667 -1737,11.02944,-4.04583 -1738,-8.15443,36.39301 -1739,12.35,9.98333 -1743,14.4,33.51667 -1744,14.4,33.51667 -1745,14.4,33.51667 -1746,14.78333,33.36667 -1747,14.78333,33.36667 -1748,14.78333,33.36667 -1749,13.85,33.55 -1750,13.85,33.55 -1751,13.85,33.55 -1752,14.18333,33.13333 -1753,14.18333,33.13333 -1754,14.18333,33.13333 -1815,-0.06115,34.33485 -1816,0.01118,34.11065 -1817,-0.08432,34.33528 -1818,-0.02994,34.01295 -1819,-0.23878,34.25207 -1820,-0.10549,34.16853 -1821,-0.28012,34.299 -1822,-0.17426,34.34519 -1823,-0.17955,34.36904 -1824,-0.3945,34.29017 -1825,-0.34709,34.29524 -1826,-0.32816,34.26666 -1827,-0.1956,34.17509 -1828,-0.16501,34.42804 -1829,-0.08225,34.38567 -1830,-0.05977,34.09323 -1831,-0.08155,34.17182 -1832,-0.16892,34.1437 -1833,-0.14719,35.20698 -1834,-0.21776,35.27142 -1835,-0.15629,35.1875 -1836,-0.17983,35.26651 -1837,-0.20466,34.91093 -1838,-0.14686,35.04393 -1839,-0.22737,34.89606 -1840,-0.08595,35.0032 -1841,-0.32034,34.9063 -1842,-0.0775,35.19345 -1843,-0.12807,35.0951 -1844,-0.18744,35.02239 -1845,-0.16478,35.06343 -1846,-0.28638,35.03972 -1847,-0.38281,34.64838 -1848,-0.43839,34.50693 -1849,-0.44192,34.61899 -1850,-0.44448,34.64009 -1851,-0.35597,34.70235 -1852,-0.3563,34.75265 -1853,-0.35951,34.46602 -1854,-0.42227,34.56537 -1855,-0.34835,34.79009 -1856,-0.43178,34.4816 -1857,-0.39202,34.62611 -1858,-0.35434,34.54621 -1859,-0.44317,34.58158 -1860,-0.40492,34.54733 -1861,0.51899,34.24448 -1862,0.6308,34.37555 -1863,0.61036,34.32393 -1864,0.70583,34.39733 -1865,0.5871,34.23404 -1866,0.68334,34.38842 -1867,-0.33661,34.35198 -1868,-0.21855,34.30245 -1869,-0.35686,34.68321 -1870,-0.3521,34.77418 -1871,0.7052,34.3354 -1872,0.62048,34.24144 -1873,0.61396,34.22643 -1874,0.5525,34.24512 -1875,0.73106,34.3539 -1876,0.66748,34.34085 -1877,0.70195,34.38123 -1878,0.61084,34.37232 -1887,13.912,-4.6537 -1888,16.7087,-2.98592 -1891,12.5,-1.33333 -1892,12.16667,-0.35 -1893,11.15,-4.28333 -1894,11,-4.04583 -1895,12.5,-1.33333 -1896,12.16667,-0.35 -1897,11.15,-4.28333 -1898,11,-4.04583 -1899,12.5,-1.33333 -1900,12.16667,-0.35 -1901,11.15,-4.28333 -1902,11,-4.04583 -1906,-0.06115,34.33485 -1907,0.01118,34.11065 -1908,-0.08432,34.33528 -1909,-0.02994,34.01295 -1910,-0.23878,34.25207 -1911,-0.10549,34.16853 -1912,-0.28012,34.299 -1913,-0.17426,34.34519 -1914,-0.17955,34.36904 -1915,-0.3945,34.29017 -1916,-0.34709,34.29524 -1917,-0.32816,34.26666 -1918,-0.1956,34.17509 -1919,-0.16501,34.42804 -1920,-0.08225,34.38567 -1921,-0.05977,34.09323 -1922,-0.08155,34.17182 -1923,-0.16892,34.1437 -1924,-0.33661,34.35198 -1925,-0.21855,34.30245 -1926,-0.06115,34.33485 -1927,0.01118,34.11065 -1928,-0.08432,34.33528 -1929,-0.02994,34.01295 -1930,-0.23878,34.25207 -1931,-0.10549,34.16853 -1932,-0.28012,34.299 -1933,-0.17426,34.34519 -1934,-0.17955,34.36904 -1935,-0.3945,34.29017 -1936,-0.34709,34.29524 -1937,-0.32816,34.26666 -1938,-0.1956,34.17509 -1939,-0.16501,34.42804 -1940,-0.08225,34.38567 -1941,-0.05977,34.09323 -1942,-0.08155,34.17182 -1943,-0.16892,34.1437 -1944,-0.33661,34.35198 -1945,-0.21855,34.30245 -1946,-0.06115,34.33485 -1947,0.01118,34.11065 -1948,-0.08432,34.33528 -1949,-0.02994,34.01295 -1950,-0.23878,34.25207 -1951,-0.10549,34.16853 -1952,-0.28012,34.299 -1953,-0.17426,34.34519 -1954,-0.17955,34.36904 -1955,-0.3945,34.29017 -1956,-0.34709,34.29524 -1957,-0.32816,34.26666 -1958,-0.1956,34.17509 -1959,-0.16501,34.42804 -1960,-0.08225,34.38567 -1961,-0.05977,34.09323 -1962,-0.08155,34.17182 -1963,-0.16892,34.1437 -1964,-0.33661,34.35198 -1965,-0.21855,34.30245 -1966,-0.14719,35.20698 -1967,-0.21776,35.27142 -1968,-0.15629,35.1875 -1969,-0.17983,35.26651 -1970,-0.20466,34.91093 -1971,-0.14686,35.04393 -1972,-0.22737,34.89606 -1973,-0.08595,35.0032 -1974,-0.32034,34.9063 -1975,-0.0775,35.19345 -1976,-0.12807,35.0951 -1977,-0.18744,35.02239 -1978,-0.16478,35.06343 -1979,-0.28638,35.03972 -1980,-0.07505,35.04673 -1981,-0.362,34.93649 -1982,-0.16297,34.9574 -1983,-0.32326,34.96579 -1984,-0.35957,34.93643 -1985,-0.37386,34.90442 -1986,-0.14719,35.20698 -1987,-0.21776,35.27142 -1988,-0.15629,35.1875 -1989,-0.17983,35.26651 -1990,-0.20466,34.91093 -1991,-0.14686,35.04393 -1992,-0.22737,34.89606 -1993,-0.08595,35.0032 -1994,-0.32034,34.9063 -1995,-0.0775,35.19345 -1996,-0.12807,35.0951 -1997,-0.18744,35.02239 -1998,-0.16478,35.06343 -1999,-0.28638,35.03972 -2000,-0.07505,35.04673 -2001,-0.362,34.93649 -2002,-0.16297,34.9574 -2003,-0.32326,34.96579 -2004,-0.35957,34.93643 -2005,-0.37386,34.90442 -2006,-0.14719,35.20698 -2007,-0.21776,35.27142 -2008,-0.15629,35.1875 -2009,-0.17983,35.26651 -2010,-0.20466,34.91093 -2011,-0.14686,35.04393 -2012,-0.22737,34.89606 -2013,-0.08595,35.0032 -2014,-0.32034,34.9063 -2015,-0.0775,35.19345 -2016,-0.12807,35.0951 -2017,-0.18744,35.02239 -2018,-0.16478,35.06343 -2019,-0.28638,35.03972 -2020,-0.07505,35.04673 -2021,-0.362,34.93649 -2022,-0.16297,34.9574 -2023,-0.32326,34.96579 -2024,-0.35957,34.93643 -2025,-0.37386,34.90442 -2026,-0.38281,34.64838 -2027,-0.43839,34.50693 -2028,-0.44192,34.61899 -2029,-0.44448,34.64009 -2030,-0.35597,34.70235 -2031,-0.3563,34.75265 -2032,-0.35951,34.46602 -2033,-0.42227,34.56537 -2034,-0.34835,34.79009 -2035,-0.43178,34.4816 -2036,-0.39202,34.62611 -2037,-0.35434,34.54621 -2038,-0.44317,34.58158 -2039,-0.40492,34.54733 -2040,-0.35686,34.68321 -2041,-0.3521,34.77418 -2042,-0.43913,34.62197 -2043,-0.42184,34.60148 -2044,-0.3501,34.57422 -2045,-0.38281,34.64838 -2046,-0.43839,34.50693 -2047,-0.44192,34.61899 -2048,-0.44448,34.64009 -2049,-0.35597,34.70235 -2050,-0.3563,34.75265 -2051,-0.35951,34.46602 -2052,-0.42227,34.56537 -2053,-0.34835,34.79009 -2054,-0.43178,34.4816 -2055,-0.39202,34.62611 -2056,-0.35434,34.54621 -2057,-0.44317,34.58158 -2058,-0.40492,34.54733 -2059,-0.35686,34.68321 -2060,-0.3521,34.77418 -2061,-0.43913,34.62197 -2062,-0.42184,34.60148 -2063,-0.3501,34.57422 -2064,-0.38281,34.64838 -2065,-0.43839,34.50693 -2066,-0.44192,34.61899 -2067,-0.44448,34.64009 -2068,-0.35597,34.70235 -2069,-0.3563,34.75265 -2070,-0.35951,34.46602 -2071,-0.42227,34.56537 -2072,-0.34835,34.79009 -2073,-0.43178,34.4816 -2074,-0.39202,34.62611 -2075,-0.35434,34.54621 -2076,-0.44317,34.58158 -2077,-0.40492,34.54733 -2078,-0.35686,34.68321 -2079,-0.3521,34.77418 -2080,-0.43913,34.62197 -2081,-0.42184,34.60148 -2082,-0.3501,34.57422 -2083,0.51899,34.24448 -2084,0.6308,34.37555 -2085,0.61036,34.32393 -2086,0.70583,34.39733 -2087,0.5871,34.23404 -2088,0.68334,34.38842 -2089,0.7052,34.3354 -2090,0.62048,34.24144 -2091,0.61396,34.22643 -2092,0.5525,34.24512 -2093,0.73106,34.3539 -2094,0.66748,34.34085 -2095,0.70195,34.38123 -2096,0.61084,34.37232 -2097,0.75199,34.32478 -2098,0.72686,34.41601 -2099,0.76549,34.38183 -2100,0.69147,34.34333 -2101,0.75321,34.34778 -2102,0.51899,34.24448 -2103,0.6308,34.37555 -2104,0.61036,34.32393 -2105,0.70583,34.39733 -2106,0.5871,34.23404 -2107,0.68334,34.38842 -2108,0.7052,34.3354 -2109,0.62048,34.24144 -2110,0.61396,34.22643 -2111,0.5525,34.24512 -2112,0.73106,34.3539 -2113,0.66748,34.34085 -2114,0.70195,34.38123 -2115,0.61084,34.37232 -2116,0.75199,34.32478 -2117,0.72686,34.41601 -2118,0.76549,34.38183 -2119,0.69147,34.34333 -2120,0.75321,34.34778 -2121,0.51899,34.24448 -2122,0.6308,34.37555 -2123,0.61036,34.32393 -2124,0.70583,34.39733 -2125,0.5871,34.23404 -2126,0.68334,34.38842 -2127,0.7052,34.3354 -2128,0.62048,34.24144 -2129,0.61396,34.22643 -2130,0.5525,34.24512 -2131,0.73106,34.3539 -2132,0.66748,34.34085 -2133,0.70195,34.38123 -2134,0.61084,34.37232 -2135,0.75199,34.32478 -2136,0.72686,34.41601 -2137,0.76549,34.38183 -2138,0.69147,34.34333 -2139,0.75321,34.34778 -2143,-6.45335,38.89736 -2144,-5.94958,35.31196 -2145,-8.29192,35.59633 -2146,-6.84127,39.2865 -2147,-8.09906,36.48356 -2148,-8.09906,36.48356 -2149,-8.09906,36.48356 -2150,-8.22995,36.18992 -2157,-7.88333,36.86667 -2159,-8.38513,36.6784 -2160,-8.38513,36.6784 -2161,-8.38513,36.6784 -2162,-8.89667,36.7173 -2163,-7.92817,35.6522 -2164,-8.9427,36.13895 -2165,-6.25359,37.54895 -2166,-8.15663,36.57818 -2167,-8.15663,36.57818 -2168,-8.15663,36.57818 -2169,-8.22995,36.18992 -2170,-5.17914,39.7634 -2171,-8.0667,36.8 -2172,-8.00324,36.83699 -2174,-6.17131,39.31355 -2175,-6.17131,39.31355 -2184,12.06664,-2.23337 -2185,11.75,-2.92 -2186,11.48333,-3.51667 -2187,11.38147,-4.42149 -2188,11.37571,-4.41467 -2189,11.3712,-4.40372 -2190,11.37475,-4.38391 -2191,11.38804,-4.41056 -2192,11.39423,-4.42728 -2193,11.40145,-4.41939 -2195,12.35,-1.5 -2204,-23.2546,30.79187 -2205,-27.3564,32.22644 -2206,-22.8884,31.04574 -2207,-0.17259,34.91983 -2208,-0.03572,34.62196 -2209,-0.07433,34.66568 -2210,0.10147,34.65165 -2211,0.02635,34.63316 -2212,0.16264,34.74501 -2213,0.54057,34.5641 -2214,13.88405,-11.67124 -2215,13.88405,-11.67124 -2216,13.88405,-11.67124 -2218,14.74493,-17.52431 -2219,14.74493,-17.52431 -2220,14.74493,-17.52431 -2221,14.75508,-17.39727 -2222,14.75508,-17.39727 -2223,14.75508,-17.39727 -2224,14.72111,-17.43694 -2225,14.72111,-17.43694 -2226,14.72111,-17.43694 -2227,13.08334,-9.6 -2228,12.86406,-7.56019 -2230,14.06667,-6.18334 -2231,13.11312,-5.83229 -2232,12.93601,-5.82692 -2233,13.05859,-6.64525 -2236,10.54978,-5.75649 -2237,14.34871,-3.61016 -2238,14.07813,-3.51795 -2239,13.912,-4.6537 -2240,13.9059,-4.55564 -2241,12.61661,-8.03198 -2242,-25.3683,32.83528 -2266,10.56667,15 -2267,10.08333,14.45 -2268,9.4,13.5 -2269,9.3,13.38333 -2271,6.46667,12.61667 -2276,4.5,12.05 -2277,4.5,12.05 -2278,4.5,12.05 -2297,-4.94363,39.78107 -2298,-5.30136,39.79942 -2299,-5.14642,39.81531 -2300,-6.17832,39.36839 -2301,-6.08407,39.22312 -2302,-6.02652,39.21022 -2320,-18.39033,47.01667 -2321,-18.40361,47.05083 -2322,-18.43472,47.00056 -2323,-18.53056,47.02833 -2324,-18.55833,47.03028 -2325,-17.95722,47.05 -2326,-17.97361,47.03889 -2327,-17.98306,47.05722 -2328,-17.99083,47.03528 -2329,-16.04528,47.64556 -2330,-16.10667,47.49389 -2331,-16.08389,47.64028 -2332,-22.13611,44.27139 -2334,-22.71778,43.62444 -2335,15.28333,-14.88333 -2336,15.28444,-14.88267 -2337,15.31472,-14.93472 -2338,15.29222,-14.87861 -2339,15.29111,-15.905 -2340,15.26556,-14.83833 -2341,15.245,-14.86 -2342,15.29194,-14.86 -2343,15.26433,-14.84167 -2344,15.27306,-14.85167 -2345,15.27361,-14.85028 -2346,15.32611,-14.87222 -2347,15.29194,-14.87139 -2348,15.31944,-14.84 -2349,13.57833,-13.7847 -2350,13.54588,-13.77452 -2351,13.46552,-13.70985 -2352,13.428,-13.76972 -2353,13.44722,-13.68532 -2354,13.4225,-13.67952 -2355,13.38617,-13.743 -2356,13.36585,-13.64408 -2357,13.35303,-13.66785 -2358,13.33653,-13.61714 -2359,13.27232,-13.6135 -2360,13.7725,-13.67713 -2361,13.69558,-13.64623 -2362,13.56607,-13.56193 -2363,13.52563,-13.51353 -2364,13.47341,-13.4526 -2365,13.4363,-13.42557 -2366,13.40099,-13.46667 -2367,13.37755,-13.37555 -2368,13.35513,-13.34902 -2374,0.16667,34.75 -2375,0.10147,34.65165 -2376,-0.11667,35.08333 -2377,-0.11667,34.5 -2378,-0.25,34.95 -2379,-0.58333,34.8 -2380,0.16667,34.75 -2381,0.10147,34.65165 -2382,-0.11667,35.08333 -2383,-0.11667,34.5 -2384,-0.25,34.95 -2385,-0.58333,34.8 -2386,0.16667,34.75 -2387,0.10147,34.65165 -2388,-0.11667,35.08333 -2389,-0.11667,34.5 -2390,-0.25,34.95 -2391,-0.58333,34.8 -2394,0.02076,34.6035 -2408,-13.37,49.98 -2409,-14.26,50.16 -2410,-14.65,49.65 -2411,-17.08,49.52 -2412,-16.88,49.52 -2413,-17.27,49.38 -2414,-18.07,49.38 -2415,-18.78,49 -2416,-18.58,48.15 -2417,-21.25,48.3 -2421,-25.04,46.96 -2422,-25.15962,46.21811 -2423,-25.32,45.5 -2424,-25.32,45.5 -2425,-25.37,45.48 -2426,-25.2,45.35 -2427,-25.13,45.35 -2428,-24.77,45.58 -2429,-22.2,46.35 -2430,-21.59,46.27 -2431,-21.71,46.7 -2432,-20.18,46.9 -2433,-19.92,46.82 -2434,-19.4,46.46 -2435,-19.58,46.37 -2436,-20.20406,44.37687 -2437,-19.58,45.47 -2438,-19.23,46.27 -2439,-18.95,47.56 -2440,-18.32,47.12 -2441,-18.32,47.12 -2442,-18.82,48.1 -2443,-17.73,47.02 -2444,-17.43,46.85 -2445,-17.65,46.97 -2446,-16.17,46.67 -2447,-15.66667,46.6 -2460,12.637,-12.2333 -2461,15.279,-14.867 -2462,12.6333,-12.2333 -2463,4.51,12.035 -2469,11.4,-4.4 -2471,9.31,2.63 -2475,-15.185,12.156 -2478,14.33,-5.97 -2479,14.33,-5.97 -2480,14.33,-5.97 -2481,14.33,-5.97 -2482,14.34,-5.94 -2483,14.34,-5.94 -2484,14.34,-5.94 -2485,14.34,-5.94 -2486,14.36,-5.91 -2487,14.36,-5.91 -2488,14.36,-5.91 -2489,14.36,-5.91 -2490,14.167,-6.134 -2491,14.167,-6.134 -2492,14.167,-6.134 -2493,14.167,-6.134 -2494,14.15,-5.868 -2495,14.15,-5.868 -2496,14.15,-5.868 -2497,14.15,-5.868 -2498,14.052,-6.182 -2499,14.052,-6.182 -2500,14.052,-6.182 -2501,14.052,-6.182 -2502,13.716,-16.418 -2504,13.283,-16.584 -2506,13.412,-16.034 -2514,13.5333,-15.6167 -2515,13.5333,-15.6167 -2519,13.55,-14.935 -2521,13.55,-14.917 -2522,14.001,-14.767 -2523,13.3,-14.168 -2525,13.2833,-14.15 -2526,13.4123,-14.119 -2528,13.5833,-13.55 -2531,12.5333,-12.2667 -2532,12.616,-12.134 -2533,12.616,-12.134 -2534,16.3979,-10.1637 -2566,4.452,11.898 -2567,4.51,12.034 -2577,12.801,-7.984 -2590,13.534,2.666 -2591,13.534,2.666 -2592,13.534,2.666 -2593,13.434,2.916 -2594,13.434,2.916 -2595,13.434,2.916 -2596,13.434,2.916 -2623,-3.529,37.343 -2624,-3.503,37.409 -2625,-3.536,37.48 -2630,-8.224,36.311 -2633,-17.3667,49.4 -2634,-16.18,46.67 -2635,-22.21,46.369 -2636,-0.037,34.634 -2637,-0.05,34.95 -2638,-0.0667,34.6667 -2639,-2.9966,40.1953 -2640,-3.5385,39.6096 -2641,-3.1403,40.1405 -2642,-3.1281,40.109 -2643,-3.2167,40.0833 -2644,-3.294,40.0843 -2645,-3.0833,40.1333 -2646,-3.25,39.9833 -2647,-3.5881,39.5266 -2648,-3.924,39.7675 -2649,-3.734,39.799 -2650,-3.633,39.733 -2651,-3.7,39.7167 -2652,-3.5269,39.778 -2653,-3.6667,39.75 -2654,-3.9,39.7167 -2655,-3.7833,39.8333 -2656,-3.683,39.85 -2657,-4.1235,39.2847 -2658,-4.1,39.35 -2659,-4.427,39.503 -2660,-4.3833,39.4667 -2661,-4.1424,39.3906 -2662,-4.2668,39.5762 -2663,-4.601,39.1668 -2664,-4.183,39.533 -2665,-4.183,39.499 -2666,-4.1553,39.4541 -2670,13.55,-14.917 -2671,15.1166,36.65 -2672,-3.4109,37.1949 -2673,-3.283,37.1493 -2674,-3.2324,37.1946 -2675,-3.1974,37.2333 -2676,12.801,-8.072 -2677,12.801,-8.1 -2678,14.914,-17.069 -2679,14.914,-17.069 -2680,14.914,-17.069 -2681,14.967,-17.05 -2682,14.967,-17.05 -2683,14.967,-17.05 -2684,-3.3397,40.0007 -2685,-2.9966,40.1953 -2686,-3.5385,39.6096 -2687,-3.1403,40.1405 -2688,-3.1281,40.109 -2689,-3.2085,40.0699 -2690,-3.294,40.0843 -2691,-3.068,40.1405 -2692,-3.5881,39.5266 -2693,-3.2599,40.0122 -2694,-3.924,39.7675 -2695,-3.7291,39.7012 -2696,-3.734,39.799 -2697,-3.633,39.733 -2698,-3.7034,39.7322 -2699,-3.5269,39.778 -2700,-3.6667,39.75 -2701,-3.9001,39.7315 -2702,-3.7897,39.8211 -2703,-3.683,39.85 -2704,-4.1235,39.2847 -2705,-4.1164,39.3695 -2706,-4.427,39.503 -2707,-4.38,39.4724 -2708,-4.1424,39.3906 -2709,-4.2668,39.5762 -2710,-4.601,39.1668 -2711,-4.183,39.533 -2712,-4.183,39.499 -2713,-4.1553,39.4541 -2720,-6.58,38.82 -2721,-6.565,39.031 -2722,-6.53,38.83 -2723,-6.598,39.066 -2724,-6.499,38.865 -2725,-6.585,38.846 -2726,-6.516,38.982 -2727,14.283,38.195 -2728,14.233,38.25 -2729,-25.966,32.465 -2730,-25.966,32.465 -2731,-25.966,32.465 -2732,-0.05,34.9667 -2733,-0.683,37.333 -2734,15.279,-14.867 -2735,15.279,-14.867 -2736,15.279,-14.867 -2737,12.7,-16.334 -2739,14.496,-16.506 -2740,14.467,-16.534 -2741,14.534,-16.435 -2742,-19.3833,46.2167 -2743,-19.3833,46.2167 -2744,-19.3833,46.2167 -2745,13.667,-15.084 -2746,13.65,-15.101 -2747,13.55,-14.968 -2748,13.55,-14.917 -2749,13.661,-15.057 -2750,13.664,-15.001 -2751,13.533,-14.951 -2752,13.5,-14.936 -2753,13.6,-15.167 -2754,13.699,-15.168 -2755,13.533,-14.933 -2756,13.533,-14.818 -2757,13.617,-15.101 -2758,13.601,-15.117 -2759,13.617,-15.067 -2760,13.59,-15.133 -2761,13.484,-14.884 -2762,13.5,-14.834 -2763,13.4667,-14.9167 -2764,13.505,-14.894 -2765,-27.332,32.316 -2766,13.301,-14.201 -2767,-0.798,34.216 -2769,-18.948,47.565 -2770,13.716,-16.418 -2771,13.716,-16.418 -2772,13.716,-16.418 -2773,13.716,-16.418 -2774,16.516,-14.434 -2775,16.5,-14.435 -2776,16.517,-14.621 -2778,4.35,35.55 -2779,-0.183,34.383 -2783,-3.633,39.733 -2784,-3.9001,39.7315 -2785,-3.6667,39.75 -2786,-0.183,34.917 -2787,-0.183,34.972 -2788,8.5,39.2 -2789,13.716,-16.418 -2790,-15.8333,48.8167 -2791,-15.749,48.732 -2792,11.38,-4.43 -2793,-19.583,46.3 -2794,-19.583,46.3 -2795,-19.583,46.3 -2796,14.05,-16.685 -2797,14.1,-16.667 -2798,14.15,-16.65 -2799,13.9319,-16.7631 -2800,13.983,-16.767 -2801,14.05,-16.685 -2802,14.1,-16.667 -2803,14.15,-16.65 -2804,13.9319,-16.7631 -2805,13.983,-16.767 -2806,14.05,-16.685 -2807,14.1,-16.667 -2808,14.15,-16.65 -2809,13.9319,-16.7631 -2810,13.983,-16.767 -2811,-20.948,55.652 -2812,-21.275,55.415 -2813,-20.999,55.274 -2814,14.9167,-17.0667 -2815,13.351,-13.334 -2816,13.716,-16.418 -2817,13.716,-16.418 -2818,13.716,-16.418 -2819,16.516,-14.434 -2820,16.5,-14.435 -2821,16.517,-14.621 -2822,-19,47.4167 -2823,-19,47.393 -2824,-19,47.4167 -2825,-19,47.393 -2826,-19,47.4167 -2827,-19,47.393 -2834,5.515,37.445 -2835,5.313,37.628 -2836,-3.55,37.2833 -2837,13.434,2.916 -2838,14.4571,-5.8968 -2839,-16.217,26.733 -2840,-16.366,26.75 -2841,-3.182,29.299 -2842,-3.166,29.382 -2843,15.9667,-15.9167 -2844,16.516,-15.583 -2845,15.667,-15.434 -2846,13.683,-16.383 -2847,12.6122,-12.2461 -2850,-0.183,34.917 -2851,12.801,-8.034 -2852,12.801,-8.034 -2854,-16.1333,29.4 -2861,13.55,-14.935 -2864,13.3,-14.201 -2865,13.3,-14.168 -2868,13.6833,-13.65 -2870,13.3833,-13.3833 -2871,13.35,-13.335 -2874,12.633,-12.117 -2880,-0.424,34.1357 -2881,-0.3911,34.1861 -2882,-0.3858,34.1939 -2883,-0.429,34.1623 -2884,-0.3764,34.2163 -2885,-0.4303,34.2131 -2886,-0.4731,34.2888 -2887,-0.5185,34.2592 -2888,-0.5183,34.3006 -2889,-0.4601,34.3754 -2890,-0.4974,34.3306 -2891,-0.558,34.3199 -2892,-0.559,34.3927 -2893,-0.5381,34.3422 -2894,-0.5812,34.3512 -2895,-0.7164,34.0652 -2896,-0.7574,34.0852 -2897,-0.6703,34.2038 -2898,-0.7131,34.111 -2899,-0.683,34.149 -2900,-0.6614,34.11 -2901,-0.5522,34.2462 -2902,-0.5357,34.1679 -2903,-0.4898,34.1718 -2904,-0.6317,34.0657 -2905,-0.5995,34.2521 -2906,-0.5693,34.102 -2907,-0.6793,34.0952 -2908,-0.5833,34.1867 -2909,-0.553,34.2708 -2910,18.0836,-15.9773 -2911,10.334,15.332 -2912,14.6841,-17.4447 -2913,14.76,-17.4802 -2914,14.7451,-17.5106 -2915,14.7583,-17.3988 -2916,14.6894,-17.4636 -2917,14.7316,-17.4325 -2918,14.7447,-17.4713 -2919,14.7155,-17.4352 -2920,14.723,-17.46 -2921,14.7578,-17.4452 -2922,-8.383,36.666 -2923,-1.3146,36.7908 -2924,-1.3146,36.7908 -2925,-1.3146,36.7908 -2934,-3.4337,37.6877 -2935,-3.4103,37.6936 -2936,-6.821,39.2615 -2937,12.8433,35.2036 -2938,12.7341,35.6383 -2939,0.0285,34.64 -2940,0.1667,34.75 -2941,-0.199,35.349 -2942,-0.5794,34.7991 -2943,-8.383,36.666 -2944,-4.9575,39.1348 -2945,-5.2494,39.0288 -2946,-5.2494,39.0288 -2947,-5.2494,39.0288 -2948,-2.9966,40.1953 -2949,-15.9925,34.7561 -2950,-15.9925,34.7561 -2951,-16.0477,34.8477 -2957,6.6106,3.2954 -2958,6.45,3.2662 -2960,6.445,3.3347 -2963,-26.033,32.315 -2964,-17.818,28.6002 -2965,-25.8958,32.6121 -2966,-25.966,32.465 -2967,-26.033,32.315 -2968,-25.9372,32.495 -2969,-25.9772,32.5901 -2970,-25.8958,32.6121 -2971,14.7451,-17.5106 -2972,14.7583,-17.3988 -2973,14.6894,-17.4636 -2974,14.7316,-17.4325 -2975,14.7447,-17.4713 -2976,14.7155,-17.4352 -2977,14.6841,-17.4447 -2978,14.723,-17.46 -2979,14.7494,-17.445 -2980,14.76,-17.4802 -2981,14.7451,-17.5106 -2982,14.7451,-17.5106 -2983,14.7583,-17.3988 -2984,14.6894,-17.4636 -2985,14.7316,-17.4325 -2986,14.7447,-17.4713 -2987,14.7155,-17.4352 -2988,14.723,-17.46 -2989,14.7494,-17.445 -2990,14.76,-17.4802 -2991,14.7735,-17.384 -2992,14.6764,-17.4548 -2993,14.7385,-17.4558 -2994,14.7578,-17.4452 -2995,14.7672,-17.4259 -2996,14.7187,-17.4504 -2997,14.7132,-17.4847 -2998,14.6588,-17.4399 -2999,14.7038,-17.4666 -3000,14.7028,-17.4212 -3001,14.757,-17.3872 -3002,14.7289,-17.4845 -3003,14.6972,-17.4359 -3004,14.7386,-17.5115 -3005,14.7315,-17.4207 -3006,14.757,-17.3872 -3007,14.7289,-17.4845 -3008,14.6972,-17.4359 -3009,14.7386,-17.5115 -3010,14.7315,-17.4207 -3011,14.7526,-17.4602 -3012,14.754,-17.4923 -3013,14.7133,-17.4454 -3014,14.7295,-17.4695 -3015,14.7416,-17.4265 -3016,14.7432,-17.5252 -3017,14.762,-17.3742 -3018,14.6963,-17.4611 -3019,14.7406,-17.4117 -3020,8.0167,38.4836 -3021,8.1666,38.4167 -3022,8.067,38.2836 -3023,8.0167,38.4836 -3024,8.1666,38.4167 -3025,8.067,38.2836 -3026,8.0167,38.4836 -3027,8.1666,38.4167 -3028,8.067,38.2836 -3029,3.7372,34.838 -3030,-16.2159,26.7329 -3031,-18.93,47.54 -3032,-18.93,47.54 -3033,-18.93,47.54 -3034,-8.099,36.482 -3035,-8.099,36.482 -3036,-8.151,36.387 -3037,9.115,13.675 -3038,9.115,13.675 -3039,13.351,-13.334 -3040,-25.427,32.758 -3041,-19,46.416 -3042,-19,46.416 -3043,-19,46.416 -3044,-19,46.416 -3045,-19.132,46.349 -3046,-19.132,46.349 -3047,-19.132,46.349 -3048,-19.132,46.349 -3049,-19.2431,46.2728 -3050,-19.2431,46.2728 -3051,-19.2431,46.2728 -3052,-19.2431,46.2728 -3053,10.334,15.332 -3065,-12.06667,15.8 -3066,-14.91667,13.5 -3067,-19.58333,22.45 -3068,-19.58333,22.45 -3069,-19.58333,22.45 -3070,-17.5833,14.7 -3071,-17.85,15.66667 -3072,-17.5,16.33333 -3073,-17.91667,19.7 -3074,-17.7,23.61667 -3075,-18.08333,13.83333 -3076,-19.58333,18.11667 -3077,-25.08333,18.45 -3078,-25.16667,17.83333 -3079,-17.25,14.56667 -3080,-17.5833,14.7 -3081,-17.85,15.66667 -3082,-17.5,16.33333 -3083,-17.91667,19.7 -3084,-17.7,23.61667 -3085,-18.08333,13.83333 -3086,-19.58333,18.11667 -3087,-25.08333,18.45 -3088,-25.16667,17.83333 -3089,-17.25,14.56667 -3090,-17.5833,14.7 -3091,-17.85,15.66667 -3092,-17.5,16.33333 -3093,-17.91667,19.7 -3094,-17.7,23.61667 -3095,-18.08333,13.83333 -3096,-19.58333,18.11667 -3097,-25.08333,18.45 -3098,-25.16667,17.83333 -3099,-17.25,14.56667 -3258,15.56667,32.38333 -3259,15.56667,32.38333 -3260,15.56667,32.38333 -3261,15.56667,32.38333 -3262,15.56667,32.38333 -3263,15.5,32.25 -3264,15.5,32.25 -3265,15.5,32.25 -3266,15.5,32.25 -3267,15.5,32.25 -3268,15.38333,32.8 -3269,15.38333,32.8 -3270,15.38333,32.8 -3271,15.38333,32.8 -3272,15.38333,32.8 -3273,12.88333,35.11667 -3274,12.88333,35.11667 -3275,12.88333,35.11667 -3276,13.1,34.95 -3277,13.1,34.95 -3278,13.1,34.95 -3279,12.88333,35.15 -3280,12.88333,35.15 -3281,12.88333,35.15 -3282,15.36667,36.45 -3283,19.92528,30.30278 -3284,19.19284,30.51419 -3285,19.26667,30.45 -3286,-22.88961,31.03958 -3289,-22.94658,31.22182 -3290,-23.11108,31.45692 -3315,19.16667,30.46667 -3316,19.2,30.45 -3317,19.2,30.45 -3318,19.2,30.45 -3319,19.2,30.45 -3320,13.6536,43.87342 -3321,13.51958,43.93633 -3322,13.5084,43.92797 -3335,-19.1833,32.8 -3336,-18.3667,32.93333 -3359,-25.45,32.76667 -3378,0.86633,30.17344 -3379,7.66667,36.83333 -3381,7.7125,36.96667 -3382,-16.15,29.43333 -3383,-15.7,30.38333 -3384,16.52972,-14.80363 -3385,16.63259,-14.91618 -3386,16.51938,-15.12074 -3387,16.50438,-15.04367 -3388,16.52679,-15.22295 -3390,16.54632,-14.75461 -3391,16.54128,-14.80289 -3392,16.59889,-14.93515 -3393,16.59259,-14.94533 -3394,16.54928,-14.83743 -3395,16.58791,-14.84997 -3396,16.49952,-15.04548 -3397,16.51652,-15.31658 -3398,16.44604,-14.80128 -3399,16.59534,-14.98979 -3400,16.66421,-14.99429 -3401,16.58237,-14.85163 -3402,16.66392,-14.96044 -3403,16.59872,-14.93095 -3412,13.52899,2.06161 -3413,13.52899,2.06161 -3414,6.93167,3.72583 -3415,6.9625,3.72 -3416,6.91194,3.77056 -3417,6.92028,3.79139 -3421,13.71667,-16.4 -3422,13.71667,-16.4 -3423,13.71667,-16.4 -3424,14.67222,-17.42278 -3425,14.67222,-17.42278 -3426,14.67222,-17.42278 -3427,6.03333,37.6 -3428,5.28333,37.51667 -3429,4.37134,6.65956 -3430,4.37134,6.65956 -3431,4.37134,6.65956 -3432,4.55891,6.36704 -3433,4.55891,6.36704 -3434,4.55891,6.36704 -3435,4.71071,6.59821 -3436,4.71071,6.59821 -3437,4.71071,6.59821 -3438,4.77852,6.30702 -3439,4.77852,6.30702 -3440,4.77852,6.30702 -3441,5.2434,6.54114 -3442,5.2434,6.54114 -3443,5.2434,6.54114 -3444,4.8364,6.30128 -3445,4.8364,6.30128 -3446,4.8364,6.30128 -3447,5.06493,5.87413 -3448,5.06493,5.87413 -3449,5.06493,5.87413 -3450,5.05314,5.7839 -3451,5.05314,5.7839 -3452,5.05314,5.7839 -3453,10.08374,15.4923 -3454,10.08374,15.4923 -3455,10.08374,15.4923 -3456,10.08374,15.4923 -3457,10.08374,15.4923 -3458,10.08374,15.4923 -3459,10.85373,14.93321 -3460,10.85373,14.93321 -3461,10.85373,14.93321 -3462,10.85373,14.93321 -3463,10.85373,14.93321 -3464,10.85373,14.93321 -3465,8.47248,13.24148 -3466,8.47248,13.24148 -3467,8.47248,13.24148 -3468,8.47248,13.24148 -3469,8.47248,13.24148 -3470,8.47248,13.24148 -3471,9.325466,13.39229 -3472,9.325466,13.39229 -3473,9.325466,13.39229 -3474,9.325466,13.39229 -3475,9.325466,13.39229 -3476,9.325466,13.39229 -3477,9.058999,13.66566 -3478,9.058999,13.66566 -3479,9.058999,13.66566 -3480,9.058999,13.66566 -3481,9.058999,13.66566 -3482,9.058999,13.66566 -3483,7.328124,13.57539 -3484,7.328124,13.57539 -3485,7.328124,13.57539 -3486,7.328124,13.57539 -3487,7.328124,13.57539 -3488,7.328124,13.57539 -3489,6.466658,12.61982 -3490,6.466658,12.61982 -3491,6.466658,12.61982 -3492,6.466658,12.61982 -3493,6.466658,12.61982 -3494,6.466658,12.61982 -3531,4.451798,11.90313 -3532,4.451798,11.90313 -3533,4.451798,11.90313 -3534,4.451798,11.90313 -3535,4.451798,11.90313 -3536,4.451798,11.90313 -3537,3.86667,11.51667 -3538,3.86667,11.51667 -3539,3.86667,11.51667 -3540,3.86667,11.51667 -3541,3.86667,11.51667 -3542,3.870892,11.45338 -3543,3.870892,11.45338 -3544,3.870892,11.45338 -3545,3.870892,11.45338 -3546,3.870892,11.45338 -3547,3.870892,11.45338 -3548,3.389027,11.4716 -3549,3.389027,11.4716 -3550,3.389027,11.4716 -3551,3.389027,11.4716 -3552,3.389027,11.4716 -3553,3.389027,11.4716 -1,-12.574,13.403 -2,-17.65,18.649 -3,-17.9798,21.323 -4,-17.9435,21.2491 -5,-17.9714,20.9274 -6,-17.947,21.247 -7,-17.9411,21.2394 -8,-18.017,21.433 -9,-18.0212,21.4281 -10,-17.9937,21.3771 -11,-17.9254,21.2175 -12,-17.95,21.033 -13,-17.259,14.56 -14,-12.0667,15.8 -15,-14.916,13.492 -16,-8.8804,13.1965 -17,-15.1764,12.194 -18,-15.1876,12.1574 -19,-15.186,12.156 -20,11.2935,2.399 -21,11.2972,2.4741 -22,11.3076,2.4509 -23,11.13,2.94 -24,11.1248,2.936 -25,11.0817,2.7699 -26,12.1,3.05 -27,11.8514,3.3959 -28,11.8002,3.4367 -29,11.8683,3.3897 -30,11.85,3.3833 -31,11.2667,3.5833 -32,10.8305,2.1142 -33,10.5667,1.2667 -34,6.45,2.35 -35,6.6645,2.1598 -36,6.6708,2.1508 -37,6.7333,2.1333 -38,6.4153,2.0555 -39,6.5,2.2167 -40,6.55,2.2167 -41,9.85,2.7167 -42,9.3667,2.6667 -43,9.2893,2.7308 -44,9.35,2.6168 -45,9.3611,2.6282 -46,10.401,2.483 -47,8.8167,2.6 -48,7.7755,2.1953 -49,7.78,2.18 -50,7.7667,2.2333 -51,7.6775,2.2248 -52,7.9667,2.2333 -53,7.9333,1.9667 -54,8.028,2.489 -55,6.3708,2.4541 -56,6.3765,2.4045 -57,6.38,2.43 -58,7.1667,2.0833 -59,-20.206,25.259 -60,-20.4707,24.5094 -61,-20.1027,26.2667 -62,-22.278,28.752 -63,-21.6456,28.3374 -64,-20.2156,24.1309 -65,-20.2166,26.1833 -66,-17.9888,24.6477 -67,-17.9058,25.2375 -68,-17.9822,24.6526 -69,-18.5353,25.6607 -70,-18.0103,24.4061 -71,-22.2764,20.0928 -72,-21.534,21.933 -73,-22.3892,20.1216 -74,-24.45,26.016 -75,-24.1855,26.8562 -76,-23.882,24.75 -77,-19.7667,23.4167 -78,-20.201,23.248 -79,-19.9114,23.5409 -80,-19.2167,23.95 -81,-18.369,21.802 -82,-18.2833,21.7833 -83,-20.0363,23.3749 -84,-19.9504,23.4704 -85,-18.4701,21.7551 -86,-19.7644,23.6714 -87,-19.3524,22.2819 -88,-20.839,27.2218 -89,11.679,-3.2631 -90,11.75,-2.9333 -91,12.5,-4.413 -92,12.117,-4.333 -93,12.6337,-3.7125 -94,12.8203,-3.7285 -95,12.516,-3.601 -96,12.8102,-3.606 -97,12.8666,-3.6499 -98,12.617,-3.784 -99,12.0239,-3.7505 -100,11.8537,-3.7496 -101,12.463,-3.466 -102,11.843,-3.8264 -103,12.2138,-3.7469 -104,12.0828,-3.6099 -105,11.9104,-3.6415 -106,12.657,-3.1322 -107,12.8037,-2.8193 -108,12.8872,-3.1482 -109,12.7927,-2.9764 -110,12.8754,-3.0937 -111,12.6298,-2.8823 -112,12.7016,-2.9563 -113,12.7659,-3.2104 -114,13.2236,-3.4167 -115,12.9829,-3.1146 -116,13.1,-3.435 -117,13.0667,-3.0667 -118,10.7273,-4.8905 -119,10.4667,-5.0833 -120,10.7473,-4.5784 -121,10.2833,-4.9166 -122,10.6667,-4.8167 -123,10.632,-4.5576 -124,10.3167,-5.4167 -125,12.4704,-1.299 -126,12.4331,-1.4394 -127,12.3824,-1.5493 -128,12.3176,-1.7101 -129,12.3225,-1.4533 -130,12.3276,-1.555 -131,12.3792,-1.5436 -132,12.1398,-1.3842 -133,12.3417,-1.7212 -134,12.3579,-1.5501 -135,12.3836,-1.5439 -136,12.2512,-1.7586 -137,12.2979,-1.4153 -138,12.1997,-1.4057 -139,12.1978,-1.4078 -140,12.15,-1.383 -141,12.4477,-1.3092 -142,12.2928,-1.4678 -143,12.42,-1.47 -144,12.4161,-1.4915 -145,12.363,-1.532 -146,12.5,-1.584 -147,12.3327,-1.4444 -148,12.596,-1.667 -149,12.3941,-1.5793 -150,12.3096,-1.4198 -151,12.36,-1.52 -152,12.3608,-1.5245 -153,12.4022,-1.5411 -154,12.2992,-1.3856 -155,12.333,-1.451 -156,12.317,-1.634 -157,12.35,-1.6 -158,11.7259,-0.6616 -159,11.8079,-0.7539 -160,11.8087,-0.4169 -161,11.8263,-0.7291 -162,11.7613,-0.3204 -163,11.868,-0.564 -164,11.7254,-0.2012 -165,11.7318,-0.5617 -166,11.8137,-0.8121 -167,11.7713,-0.4199 -168,11.5878,-0.0116 -169,11.1443,0.0677 -170,11.4156,0.0854 -171,11.6221,-0.0693 -172,11.1384,0.3961 -173,11.1651,0.1599 -174,11.2916,0.1182 -175,12.1676,-0.2368 -176,12.1608,-0.4129 -177,12.1693,-0.0573 -178,11.8835,-0.2664 -179,12.2146,-0.3813 -180,12.1315,-0.1267 -181,12.054,-0.357 -182,12.1429,-0.0651 -183,12.4899,-0.6014 -184,12.176,-0.357 -185,12.2111,-0.1346 -186,12.1467,-0.2974 -187,12.3345,-0.2798 -188,12.159,-0.0951 -189,12.219,-0.4482 -190,12.0033,-0.2593 -191,12.001,-0.267 -192,11.8171,-0.2839 -193,12.2003,-0.1263 -194,13.2781,-1.7515 -195,13.3758,-1.5424 -196,13.4023,-1.6218 -197,13.1937,-1.6264 -198,13.3105,-1.3753 -199,12.7177,-0.3975 -200,12.6684,-0.5725 -201,13.5274,-0.5216 -202,13.4171,-0.6545 -203,13.169,-0.4735 -204,13.3794,-0.5429 -205,13.3083,-0.5266 -206,13.5895,-0.2667 -207,12.8814,-0.8388 -208,13.2536,-1.2564 -209,13.1933,-1.1732 -210,12.95,-0.8934 -211,12.8351,-1.0612 -212,13.0833,-1.0833 -213,12.8224,-1.0694 -214,12.8495,-1.0161 -215,12.733,-1.0505 -216,13.0351,-0.8215 -217,12.8252,-1.1411 -218,13.1205,-0.8265 -219,13.2732,-1.0845 -220,12.7205,-1.0167 -221,13.2447,-0.7311 -222,12.6023,-1.9794 -223,12.3695,-2.4033 -224,11.9702,-2.3722 -225,12.3734,-2.3038 -226,12.1739,-2.2868 -227,12.1152,-2.1152 -228,12.2244,-1.9498 -229,12.25,-2.3667 -230,12.1374,-1.9606 -231,12.2329,-2.0749 -232,12.682,-2.191 -233,12.3485,-2.1238 -234,12.032,-2.2845 -235,12.118,-2.3068 -236,12.3074,-2.4011 -237,12.055,-2.221 -238,12.1577,-2.3715 -239,12.1953,-2.0086 -240,12.2631,-2.2728 -241,12.3103,-2.2223 -242,11.6973,-2.6093 -243,12.5196,-2.6119 -244,11.9908,-2.5433 -245,11.9464,-2.4745 -246,12.3848,-2.5274 -247,12.4495,-2.6059 -248,12.6473,-2.733 -249,11.799,-2.7128 -250,12.6383,-2.5338 -251,12.2167,-2.45 -252,12.3167,-2.4667 -253,11.9208,-2.5248 -254,12.2927,-2.5437 -255,12.5799,-2.6119 -256,11.8208,-2.3567 -257,11.9,-2.3333 -258,11.8662,-2.2807 -259,11.8578,-1.3338 -260,11.9932,-1.4543 -261,12.1192,-1.3644 -262,11.8057,-1.2929 -263,11.9918,-1.3436 -264,12.0966,-1.8557 -265,12.0834,-1.2653 -266,12.117,-1.301 -267,12.084,-1.483 -268,11.9408,-1.1967 -269,12.1359,-1.4818 -270,12.0814,-1.2404 -271,12.0959,-1.4384 -272,11.9157,-1.3188 -273,11.169,-1.136 -274,11.778,-1.1064 -275,11.6552,-1.2343 -276,11.583,-1.201 -277,11.6636,-1.0731 -278,11.6964,-1.1137 -279,11.6475,-1.1792 -280,11.7197,-1.1872 -281,11.7792,-1.2169 -282,12.2565,0.0873 -283,12.1315,0.3274 -284,12.1086,0.2809 -285,12.0548,0.3609 -286,12.1087,0.2528 -287,12.0123,-0.0959 -288,12.3534,1.0299 -289,12.1345,0.0284 -290,12.1284,0.5042 -291,12.0993,0.1589 -292,12.157,0.93 -293,12.0912,0.1956 -294,12.2368,0.2998 -295,12.048,0.7732 -296,12.1686,0.0594 -297,12.1191,0.1039 -298,12.0539,-0.0487 -299,11.034,0.5998 -300,11.0363,0.9385 -301,11.1124,0.705 -302,10.9875,0.5229 -303,12.3857,1.6384 -304,12.0768,1.796 -305,12.4573,1.4958 -306,12.4428,1.371 -307,12.479,1.522 -308,11.8789,1.7089 -309,12.4699,1.566 -310,11.7951,1.7419 -311,12.1246,1.7673 -312,11.7413,1.6494 -313,11.7832,1.6908 -314,11.374,-4.414 -315,11.084,-4.101 -316,11.1781,-4.2917 -317,11.2271,-4.2973 -318,11.5833,-4.55 -319,11.051,-4.368 -320,11.3499,-4.2833 -321,11.177,-4.291 -322,11.1799,-4.2907 -323,11.0038,-4.4036 -324,11.183,-4.45 -325,11.334,-4.117 -326,11.403,-4.372 -327,11.3713,-4.4037 -328,11.3882,-4.4109 -329,11.3963,-4.4227 -330,11.4042,-4.4179 -331,11.4063,-4.4136 -332,11.1731,-4.2892 -333,11.0871,-4.3708 -334,11.234,-4.167 -335,11.3003,-3.883 -336,11.468,-4.467 -337,11.3139,-4.404 -338,11.1569,-4.2769 -339,11.533,-4.401 -340,11.2667,-4.4667 -341,11.0167,-4.05 -342,11.2922,-3.9468 -343,10.825,-4.621 -344,11.149,-4.151 -345,10.9927,-5.015 -346,10.9315,-5.1133 -347,11.0823,-4.9543 -348,10.9827,-4.8409 -349,11.0963,-5.1514 -350,11.4234,-3.2191 -351,11.5099,-3.3951 -352,11.489,-3.519 -353,11.2466,-3.6877 -354,11.458,-3.1645 -355,11.719,-3.8355 -356,11.6793,-3.6447 -357,13.7023,-2.1427 -358,12.9351,-1.9608 -359,12.6989,-2.096 -360,12.886,-2.1461 -361,12.8998,-1.9157 -362,12.7317,-2.0596 -363,12.9936,-2.284 -364,12.8964,-2.2492 -365,12.8776,-2.3274 -366,12.9521,-2.3746 -367,12.7961,-1.9792 -368,13.321,-1.935 -369,13.4269,-2.3638 -370,13.3866,-1.8989 -371,13.3924,-2.1635 -372,13.5692,-2.4171 -373,13.592,-2.3974 -374,13.483,-2.3653 -375,13.5122,-1.9143 -376,13.3739,-2.4052 -377,13.3311,-2.3799 -378,13.1457,-2.3183 -379,13.2715,-2.2798 -380,13.131,-2.4602 -381,13.2851,-2.3677 -382,13.0853,-2.3698 -383,12.271,-0.5574 -384,12.6558,-0.6699 -385,12.5257,-1.7353 -386,12.5262,-1.7726 -387,12.366,-1.951 -388,12.7208,-1.81 -389,12.534,-1.366 -390,12.5981,-1.2596 -391,12.668,-1.233 -392,12.6098,-1.1626 -393,12.3166,-1.15 -394,12.6286,-1.2446 -395,12.4691,-1.42 -396,12.5178,-1.3403 -397,12.65,-1.336 -398,12.6834,-1.3173 -399,12.668,-1.051 -400,12.586,-1.466 -401,12.5929,-1.3131 -402,14.2958,-0.0344 -403,14.6424,0.0375 -404,14.6572,0.0794 -405,14.5875,0.0149 -406,14.4931,-0.3133 -407,13.697,-0.0116 -408,14.034,-0.029 -409,14.0443,0.1069 -410,14.0789,0.11 -411,14.1022,-0.5117 -412,13.9645,-0.0801 -413,14.0212,-0.3124 -414,13.933,-0.0608 -415,13.7454,-0.2247 -416,14.1712,0.0227 -417,13.778,-0.0335 -418,14.0361,-0.462 -419,14.0746,-0.1379 -420,14.2302,-0.8668 -421,14.0908,-1.2892 -422,14.0993,-1.6268 -423,14.0706,-1.5186 -424,14.217,-1.5529 -425,13.9935,-1.1007 -426,14.0126,-1.5616 -427,14.0955,-1.4886 -428,13.9515,-1.6855 -429,14.1191,-1.5089 -430,14.0995,-1.722 -431,11.0256,-3.233 -432,10.9,-3.567 -433,10.9665,-3.2499 -434,10.9454,-3.2877 -435,10.766,-3.133 -436,10.833,-3.266 -437,10.9163,-3.2451 -438,10.6643,-3.2511 -439,11.079,-3.1263 -440,11.1422,-3.059 -441,11.2268,-3.224 -442,11.3058,-3.2226 -443,11.1206,-3.1048 -444,11.3003,-3.1828 -445,11.1347,-3.1794 -446,9.7724,-2.8762 -447,9.868,-2.915 -448,10.1841,-3.4046 -449,10.5807,-3.5052 -450,10.0711,-3.441 -451,10.3245,-3.1737 -452,10.1831,-3.4771 -453,10.5833,-3.5667 -454,10.6329,-3.1703 -455,10.3059,-3.4585 -456,10.4839,-3.2099 -457,10.3764,-3.307 -458,10.3122,-3.6605 -459,10.2313,-3.3166 -460,10.421,-3.5726 -461,-3.2068,29.3175 -462,-3.166,29.306 -463,-3.2391,29.3139 -464,-3.2056,29.3194 -465,-3.1443,29.4441 -466,-3.3424,29.3547 -467,-3.3692,29.3584 -468,-3.466,29.366 -469,-3.328,29.374 -470,-3.586,29.368 -471,-3.341,29.301 -472,-3.3167,29.2372 -473,-3.2684,29.2409 -474,-3.428,29.93 -475,-3.083,30.049 -476,-3.101,30.164 -477,-3.017,30.149 -478,-3.25,30.1 -479,-3.266,30.032 -480,6.5098,12.4779 -481,6.5699,12.6928 -482,6.751,13.1106 -483,6.6134,12.0997 -484,6.6702,12.0519 -485,6.5908,12.2076 -486,6.605,12.9417 -487,6.5973,12.8809 -488,6.5481,12.3259 -489,6.5489,12.6394 -490,6.5994,12.1529 -491,6.5952,13.0715 -492,6.6018,13.0112 -493,6.6085,12.9829 -494,6.6825,13.0974 -495,6.505,12.5986 -496,6.5045,12.5114 -497,6.5737,12.8013 -498,6.5282,12.39 -499,6.4651,12.6236 -500,6.5896,12.2485 -501,6.0828,11.4876 -502,6.7491,11.8104 -503,6.207,11.5717 -504,6.7174,11.8915 -505,6.4218,11.5721 -506,6.6799,11.7406 -507,6.0487,11.406 -508,6.0574,11.4535 -509,6.0428,11.3664 -510,6.1757,11.5647 -511,6.5854,11.6265 -512,6.7195,11.7401 -513,6.6988,11.7595 -514,6.1225,11.544 -515,6.6471,11.6823 -516,6.3279,11.5982 -517,6.4598,11.5742 -518,6.5542,11.5744 -519,7.129,13.245 -520,7.4993,13.5568 -521,7.2595,13.3306 -522,7.3985,13.5507 -523,6.9973,13.1329 -524,7.7328,13.5336 -525,7.0781,13.1856 -526,7.8198,13.5812 -527,7.3535,13.5781 -528,6.8666,13.1404 -529,7.7831,13.5471 -530,7.7937,13.5564 -531,7.289,13.2761 -532,7.2592,13.262 -533,7.2223,13.2511 -534,7.1071,13.209 -535,6.9151,13.1319 -536,7.441,13.5551 -537,7.7198,13.5389 -538,7.5485,13.5307 -539,7.3352,13.4619 -540,7.2997,13.5542 -541,7.8639,13.5973 -542,7.549,13.5603 -543,7.1703,13.2545 -544,7.3169,13.5833 -545,7.0553,13.1593 -546,7.5673,13.557 -547,6.8058,13.1737 -548,7.3235,13.3995 -549,7.8333,13.7167 -550,7.684,13.5489 -551,4.4394,11.8988 -552,4.4439,11.8828 -553,4.4493,11.9049 -554,4.4566,11.9056 -555,4.5196,12.0521 -556,4.4423,11.9135 -557,4.9739,13.0401 -558,4.36,11.08 -559,3.8881,11.5307 -560,3.5164,11.4996 -561,4.3418,13.5582 -562,4.3596,13.6399 -563,4.784,13.832 -564,5.7485,14.4417 -565,10.5651,14.2816 -566,10.4255,14.242 -567,10.5221,14.2646 -568,10.7,14.25 -569,10.4955,14.2551 -570,10.5743,14.2851 -571,10.8609,14.229 -572,10.6582,14.2896 -573,10.594,14.327 -574,10.5964,14.3411 -575,10.5549,14.2529 -576,10.6097,14.3023 -577,10.8086,14.2553 -578,10.5309,14.2433 -579,10.462,14.2285 -580,10.5667,14.5 -581,10.7085,14.2122 -582,11.4063,14.5676 -583,11.8245,14.6167 -584,12.7688,14.5519 -585,12.3588,14.46 -586,11.9193,14.6445 -587,12.2916,14.5955 -588,11.9843,14.642 -589,12.076,15.031 -590,11.8962,14.6316 -591,12.6357,14.4731 -592,12.5804,14.4565 -593,11.4842,14.6708 -594,11.5997,14.6526 -595,11.5448,14.6403 -596,11.8554,14.6176 -597,11.3281,14.4534 -598,12.1204,14.7347 -599,11.734,14.6485 -600,11.6845,14.6492 -601,11.7896,14.6313 -602,10.9412,14.8487 -603,10.85,15.0667 -604,10.8667,15 -605,10.3427,15.2405 -606,10.211,14.1885 -607,10.0853,14.5469 -608,10.0623,14.1865 -609,10.2564,14.2169 -610,10.1427,14.1723 -611,10.1882,14.1426 -612,10.1023,14.193 -613,10.3546,14.1962 -614,10.3005,14.2545 -615,10.368,14.2277 -616,10.3416,14.2364 -617,10.9728,14.199 -618,11.1115,14.1795 -619,11.1742,14.2355 -620,11.2209,14.2939 -621,10.762,14.2475 -622,11.053,14.1496 -623,10.9306,14.2037 -624,11.0077,14.1938 -625,10.9081,14.2261 -626,11.2731,14.3562 -627,10.74,13.8 -628,10.7781,13.7923 -629,4.718,9.73 -630,4.078,9.672 -631,4.0394,9.687 -632,4.0286,9.7317 -633,8.6604,13.5291 -634,9.3966,13.6569 -635,9.5189,13.6816 -636,9.5642,13.7656 -637,8.8014,13.5202 -638,8.5336,13.5295 -639,9.3,13.3833 -640,8.5794,13.5157 -641,9.0361,13.6415 -642,9.4377,13.5943 -643,9.3081,13.4064 -644,9.433,13.367 -645,9.1581,13.5073 -646,8.5247,13.564 -647,9.4249,13.3867 -648,9.4812,13.6608 -649,9.0833,13.6667 -650,9.3596,13.4278 -651,9.1192,13.5064 -652,8.9807,13.5329 -653,8.7225,13.5404 -654,9.5134,13.823 -655,8.7167,13.55 -656,9.3596,13.439 -657,9.0812,13.5087 -658,9.0114,13.5084 -659,9.3813,13.4514 -660,9.1261,13.6222 -661,9.0996,13.7229 -662,9.6423,13.8966 -663,9.3861,13.5013 -664,9.112,13.716 -665,9.2625,13.4603 -666,9.2085,13.4946 -667,9.4243,13.5598 -668,9.5301,13.8287 -669,8.5984,13.5198 -670,8.9188,13.5106 -671,8.8878,13.5032 -672,8.8323,13.5016 -673,8.5419,13.3456 -674,8.4668,13.2999 -675,9.6922,13.8398 -676,9.9439,14.1581 -677,9.8954,14.114 -678,9.9846,14.1665 -679,9.7779,13.8819 -680,10.0495,14.1487 -681,9.8203,13.9967 -682,10.0736,14.1278 -683,9.7636,13.9052 -684,9.7651,13.9496 -685,9.7031,13.8588 -686,9.7845,13.8641 -687,8.5127,13.6029 -688,8.1992,13.6412 -689,8.3014,13.6732 -690,8.505,13.6541 -691,8.4997,14 -692,7.9652,13.5714 -693,8.394,13.7138 -694,8.3354,13.6787 -695,8.0978,13.599 -696,8.5001,14.1666 -697,8.476,13.6436 -698,7.9962,13.5651 -699,8.2657,13.6536 -700,7.783,15.367 -701,8.0287,13.5912 -702,8.4806,13.7167 -703,5.9658,11.2253 -704,5.88,11.1136 -705,5.6246,10.7342 -706,5.943,11.2044 -707,16.135,-22.885 -708,15.028,-24.332 -709,16.7543,-22.9762 -710,14.9213,-23.5022 -711,14.922,-23.523 -712,14.9548,-23.4761 -713,15.0958,-23.6685 -714,15.0853,-23.6205 -715,15.133,-23.567 -716,15.192,-23.6443 -717,15.273,-23.763 -718,16.8782,-24.9748 -719,11.7167,15.2333 -720,12.1055,15.045 -721,8.5179,16.7761 -722,8.4,16.4 -723,8.6062,16.4359 -724,10.2741,15.373 -725,10.3667,15.45 -726,10.65,15.3333 -727,10.7833,15.7667 -728,10.9333,15.5333 -729,10.95,15.5333 -730,9.3167,15.8 -731,9.4,15.9833 -732,9.1333,15.8 -734,4.9499,-6.0816 -735,6.935,-5.5 -736,5.884,-4.817 -737,7.683,-5.0962 -738,-10.33,28.26 -739,-10.616,26.299 -740,-10.6015,26.1202 -741,-4.3416,15.2158 -742,-4.3509,15.2116 -743,-4.3473,15.2087 -744,-4.3512,15.199 -745,-4.0199,27.5578 -746,-3.3953,29.1378 -747,15.6429,38.8204 -748,15.6881,38.7811 -749,16.3722,38.0411 -750,16.2508,37.9697 -751,15.6954,38.6493 -752,15.667,38.616 -753,15.8534,38.5836 -754,16.3008,38.3267 -755,16.139,38.429 -756,16.2175,38.3885 -757,15.7,38.266 -758,15.8058,38.2672 -759,15.8749,38.517 -760,16.929,37.7532 -761,14.979,39.3058 -762,14.7062,38.847 -763,15.0991,38.6848 -764,15.049,38.966 -765,15.1539,38.9477 -766,14.783,39.099 -767,14.6492,38.5058 -768,14.6373,38.4612 -769,14.8731,38.8299 -770,15.0718,39.2404 -771,15.111,37.591 -772,15.4918,37.0883 -773,15.5608,36.692 -774,15.8487,36.968 -775,14.9224,37.4842 -776,15.1967,37.4011 -777,15.343,38.7347 -778,15.6678,38.034 -779,15.5286,38.5111 -780,15.015,38.2173 -781,14.8326,36.7372 -782,14.968,37.75 -783,14.9192,37.8356 -784,15.1333,36.65 -785,15.117,36.482 -786,15.1166,36.65 -787,15.0361,36.4869 -788,15.1568,36.5359 -789,15.2443,36.5778 -790,15.109,36.652 -791,15.3551,38.8624 -792,15.2619,38.9044 -793,15.3002,39.0274 -794,15.3645,38.9227 -795,16.3103,38.6955 -796,16.0129,38.5289 -797,15.4017,39.5587 -798,14.8395,40.0822 -799,14.9555,39.8592 -800,15.517,39.149 -801,15.4388,39.1018 -802,15.6452,39.1369 -803,15.7166,39.395 -804,16.779,38.4908 -805,17.3668,38.5836 -806,11.5,41.25 -807,11.7344,41.0827 -808,11.7297,41.0848 -809,11.7395,41.0884 -810,11.7374,41.0805 -811,9.0167,40 -812,9.2,40.2 -813,9.2942,40.0658 -814,9.551,40.399 -815,10.4667,40.5333 -816,9.2305,40.1218 -817,10.1667,38.1333 -818,10.3087,38.3529 -819,12.202,37.267 -820,12.2368,37.2942 -821,13.0338,37.0736 -822,11.2116,40.0459 -823,11.5436,37.1536 -824,11.5313,37.3707 -825,11.4484,37.1416 -826,10.6593,37.4022 -827,11.6129,37.3522 -828,11.3755,37.1562 -829,8.245,34.589 -830,8.246,34.588 -831,9.3,42.1 -832,7.1155,40 -833,9.4904,42.2288 -834,7.8922,38.7246 -835,8.0051,38.7145 -836,8.542,39.2709 -837,7.868,38.7 -838,7.843,38.6771 -839,8.4167,39.25 -840,7.8904,38.7421 -841,8.65,38.7833 -842,8.744,38.989 -843,8.5534,39.0854 -844,7.984,38.716 -845,8.0166,38.6787 -846,9.05,39.9167 -847,7.9935,38.6542 -848,8.053,38.727 -849,8.5,39.2 -850,8.7833,39.4667 -851,7.7668,38.6881 -852,7.926,38.6098 -853,8.45,39.1 -854,8.4269,39.151 -855,8.4167,39.0167 -856,7.9834,38.7167 -857,8.541,39.0995 -858,7.6167,38.6667 -859,8.9,39.916 -860,8.9,39.9167 -861,8.4333,39.3333 -862,7.8618,38.736 -863,7.8943,38.7241 -864,8.4333,39.2 -865,7.9686,38.7017 -866,7.932,38.708 -867,9.55,37.3833 -868,9.1486,36.8828 -869,9.1,37 -870,9.6167,37.3833 -871,8.9744,36.9761 -872,9.1597,36.955 -873,5.3754,39.4844 -874,8.5772,36.5206 -875,8.4833,36.3167 -876,8.5803,36.4299 -877,8.587,36.4856 -878,7.606,37.285 -879,7.7737,37.2276 -880,7.75,37.2167 -881,7.7049,36.9345 -882,7.634,37.322 -883,7.629,36.8423 -884,7.683,37.279 -885,7.655,37.33 -886,8.35,37.0667 -887,7.67,37.27 -888,7.663,37.257 -889,8.4759,39.0643 -890,7.697,37.32 -891,7.6667,36.8333 -892,7.45,36.4167 -893,7.699,37.339 -894,7.717,36.983 -895,7.621,37.329 -896,7.714,36.988 -897,7.692,37.362 -898,7.672,37.343 -899,7.7008,36.9796 -900,7.6333,37.25 -901,8.2167,37.5833 -902,7.651,37.284 -903,7.722,36.984 -904,7.9167,37.3333 -905,7.663,37.343 -906,7.63,37.297 -907,8.6,36.8833 -908,7.626,37.311 -909,7.629,37.318 -910,9.2833,38.8 -911,9.3352,38.6943 -912,9.335,38.934 -913,8.7772,38.6546 -914,9.0167,37.45 -915,8.7,35.6166 -916,9.8146,35.0925 -917,7.2852,38.217 -918,5.65,37.3667 -919,5.688,37.5105 -920,5.965,37.535 -921,6.0055,37.5969 -922,6.6666,37.3577 -923,6.6677,37.3608 -924,6.0833,37.0333 -925,6.0907,37.5673 -926,6.1356,37.6457 -927,6.3096,37.7345 -928,6.0333,37.55 -929,5.8833,37.4833 -930,8.1006,38.2514 -931,8.2333,37.5833 -932,8.0487,38.1799 -933,5.2407,37.4963 -934,5.2352,37.5138 -935,5.3659,37.4552 -936,6.9667,38.5667 -937,6.5,38.4 -938,8.0191,38.2917 -939,4.9897,36.8587 -940,7.0653,37.7137 -941,6.667,37.793 -942,6.65,37.7833 -943,7.1497,37.6617 -944,6.89,37.8008 -945,7.3333,42.1833 -946,5.467,44.416 -947,9.5619,41.3823 -948,13.6233,39.004 -949,14.15,39.1667 -950,14.05,38.7667 -951,14.1231,38.6596 -952,14.0791,39.0322 -953,14.073,38.849 -954,14.283,38.195 -955,14.1,38.283 -956,14.24,38.257 -957,13.277,39.395 -958,13.2974,39.4715 -959,12.317,39.649 -960,13.238,39.495 -961,13.426,-14.661 -962,13.4993,-14.9254 -963,13.533,-14.933 -964,13.499,-14.835 -965,13.566,-14.964 -966,13.534,-14.951 -967,13.48,-14.82 -968,13.549,-14.916 -969,13.45,-14.67 -970,13.5011,-14.8823 -971,13.5667,-14.9167 -972,13.55,-14.935 -973,13.5381,-14.7665 -974,13.5341,-14.7662 -975,13.668,-15.367 -976,13.6587,-15.4104 -977,13.7011,-15.3333 -978,13.6416,-15.3124 -979,13.651,-15.316 -980,13.65,-15.32 -981,13.5901,-15.1324 -982,13.6749,-15.0893 -983,13.661,-15.057 -984,13.601,-15.117 -985,13.6,-15.167 -986,13.617,-15.067 -987,13.6231,-15.0243 -988,13.6085,-15.25 -989,13.55,-15.28 -990,13.55,-15.3 -991,13.5465,-15.3065 -992,13.6875,-14.843 -993,13.72,-15.1 -994,13.59,-14.7667 -995,13.6833,-15.25 -996,13.8191,-15.0612 -997,13.4048,-15.3877 -998,13.4132,-15.3969 -999,13.4887,-15.2676 -1000,13.381,-15.2956 -1001,13.4903,-15.2406 -1002,13.4532,-15.2233 -1003,13.518,-15.235 -1004,13.4195,-15.232 -1005,13.4745,-15.2712 -1006,13.3986,-15.2692 -1007,13.4593,-15.5387 -1008,13.483,-15.517 -1009,13.3602,-15.5921 -1010,13.4402,-15.5799 -1011,13.3936,-15.7984 -1012,13.3559,-15.761 -1013,13.3624,-15.7731 -1014,13.4,-15.618 -1015,13.422,-16.152 -1016,13.3315,-16.0096 -1017,13.412,-16.034 -1018,13.493,-16.096 -1019,13.51,-16.07 -1020,13.478,-16.531 -1021,13.539,-15.733 -1022,13.5709,-15.5597 -1023,13.586,-15.5766 -1024,13.5457,-15.8234 -1025,13.5691,-15.5572 -1026,13.5645,-15.6211 -1027,13.567,-15.607 -1028,13.575,-15.7475 -1029,13.545,-15.6816 -1030,13.5461,-15.6189 -1031,13.5,-15.751 -1032,13.5561,-15.6013 -1033,13.5821,-15.5538 -1034,13.5385,-15.6346 -1035,13.5704,-15.5766 -1036,13.5224,-15.6263 -1037,13.5188,-15.633 -1038,13.5773,-15.5552 -1039,13.5744,-15.5417 -1040,13.5684,-15.5457 -1041,13.5558,-15.6211 -1042,13.601,-15.401 -1043,13.53,-15.52 -1044,13.551,-15.701 -1045,13.32,-14.22 -1046,13.311,-14.233 -1047,13.352,-14.534 -1048,13.3272,-14.1948 -1049,13.3,-14.2 -1050,13.4,-14.084 -1051,13.3081,-14.0117 -1052,13.335,-14.017 -1053,13.3058,-14.1948 -1054,13.355,-13.9831 -1055,13.3256,-14.06 -1056,13.299,-14.167 -1057,13.2876,-14.1534 -1058,13.4,-13.88 -1059,13.434,-13.868 -1060,13.384,-13.934 -1061,13.551,-14.0267 -1062,13.4127,-14.1202 -1063,13.5432,-14.0564 -1064,13.197,-16.3632 -1065,13.2431,-16.3799 -1066,13.2078,-16.3437 -1067,13.2668,-16.6586 -1068,13.2796,-16.5895 -1069,13.1933,-16.5804 -1070,13.235,-16.502 -1071,13.383,-16.751 -1072,13.4038,-16.6752 -1073,13.0902,-16.7544 -1074,7.0258,-2.3408 -1075,5.0734,-1.4009 -1076,5.565,-0.191 -1077,5.7847,0.6271 -1078,5.6935,0.0517 -1079,5.635,0.007 -1080,9.451,-0.733 -1081,9.1531,-1.8526 -1082,11.056,-0.238 -1083,11.0833,-0.25 -1084,10.8532,-0.1362 -1085,10.7167,-0.8 -1086,10.8596,-0.8393 -1087,10.8663,-0.8505 -1088,10.7333,-1.2833 -1089,10.8925,-1.1435 -1090,10.883,-1.084 -1091,10.8957,-1.1421 -1092,10.8728,-1.9789 -1093,9.264,-9.015 -1094,11.4166,-9.1668 -1095,11.4332,-12.1222 -1096,8.6609,-8.3912 -1097,8.4201,-8.663 -1098,11.2232,-15.8738 -1099,12.401,-14.454 -1100,11.897,-15.5914 -1101,-1.2065,36.7146 -1102,-0.7497,37.3939 -1103,-0.617,37.249 -1104,-0.617,37.3 -1105,-0.6502,37.3014 -1106,-0.683,37.333 -1107,-0.7,37.3667 -1108,-0.6245,37.2668 -1109,-0.6221,37.3983 -1110,-0.6665,37.2673 -1111,-0.5,37.3333 -1112,-0.7403,37.2967 -1113,-0.7174,37.4653 -1114,-0.667,37.317 -1115,-0.6026,37.2876 -1116,-0.634,37.366 -1117,-0.6981,37.3446 -1118,-0.5667,37.45 -1119,-0.6895,37.3407 -1120,-0.716,37.432 -1121,-0.6667,37.3167 -1122,-0.6651,37.3398 -1123,-0.7244,37.2611 -1124,-0.6937,37.3561 -1125,-0.833,36.966 -1126,-0.6618,37.2004 -1127,-0.4833,37.1333 -1128,-0.2499,37.0074 -1129,-1.183,37.115 -1130,-1.1685,36.9529 -1131,-1.1605,36.9585 -1132,-1.1526,36.9609 -1133,-1.049,37.092 -1134,-3.912,39.773 -1135,-3.3843,39.9295 -1136,-3.4014,39.9544 -1137,-3.418,39.9379 -1138,-3.4076,39.9155 -1139,-3.3795,39.9091 -1140,-3.4785,39.9064 -1141,-3.5859,39.8048 -1142,-3.5888,39.8124 -1143,-3.5498,39.8362 -1144,-3.5842,39.8532 -1145,-3.603,39.848 -1146,-3.6109,39.838 -1147,-3.5373,39.8573 -1148,-3.5426,39.8827 -1149,-3.5823,39.8625 -1150,-3.3623,39.9248 -1151,-3.3617,39.9339 -1152,-3.4014,39.9363 -1153,-3.4252,39.7979 -1154,-3.7351,39.7965 -1155,-3.4545,39.6374 -1156,-3.6216,39.7434 -1157,-3.85,39.733 -1158,-3.8511,39.7463 -1159,-3.8538,39.7455 -1160,-3.853,39.7469 -1161,-3.4557,39.8072 -1162,-3.7788,39.7911 -1163,-3.615,39.855 -1164,-3.8293,39.7455 -1165,-3.4018,39.7435 -1166,-3.66,39.7841 -1167,-3.716,39.7793 -1168,-3.9001,39.7315 -1169,-3.8512,39.7571 -1170,-3.5308,39.6293 -1171,-3.7747,39.7762 -1172,-3.4669,39.783 -1173,-3.552,39.7783 -1174,-3.533,39.815 -1175,-3.3538,39.7445 -1176,-3.682,39.85 -1177,-4.1235,39.2847 -1178,-4.1164,39.3695 -1179,-4.427,39.503 -1180,-4.649,39.183 -1181,-4.6,39.2167 -1182,-4.583,39.166 -1183,-4.1833,39.45 -1184,-4.38,39.4724 -1185,-4.449,39.467 -1186,-4.1424,39.3906 -1187,-4.53,39.28 -1188,-4.2668,39.5762 -1189,-4.601,39.1668 -1190,-4.633,39.167 -1191,-4.183,39.533 -1192,-4.1845,39.5065 -1193,-2.289,40.911 -1194,-2.2933,40.9133 -1195,-3.1821,39.9367 -1196,-3.1578,40.0806 -1197,-3.1051,39.6119 -1198,-3.3436,39.9202 -1199,-3.3343,39.9477 -1200,-3.3397,40.0007 -1201,-3.1277,39.889 -1202,-3.0242,40.1683 -1203,-3.2054,40.0178 -1204,-3.182,39.899 -1205,-3.1065,40.1486 -1206,-3.1793,39.9994 -1207,-3.173,40.1191 -1208,-3.1043,40.0917 -1209,-3.198,40.118 -1210,-3.1491,40.1292 -1211,-3.215,40.107 -1212,-3.132,40.149 -1213,-3.166,39.9154 -1214,-3.1681,40.0094 -1215,-3.0894,40.1033 -1216,-3.1281,40.109 -1217,-3.1697,39.9817 -1218,-3.1864,39.9523 -1219,-3.2085,40.0699 -1220,-3.294,40.0843 -1221,-3.187,40.027 -1222,-3.1868,40.0309 -1223,-3.1909,40.0007 -1224,-3.1742,39.9562 -1225,-3.2599,40.0122 -1226,-3.1702,40.0084 -1227,-3.18,40.0017 -1228,-3.068,40.1405 -1229,-3.1319,39.576 -1230,-3.1961,40.0173 -1231,-3.1046,39.5741 -1232,-3.153,40.1074 -1233,-3.1732,40.0263 -1234,-3.1421,40.0828 -1235,-3.175,40.1094 -1236,-3.1559,40.1014 -1237,-3.1132,39.5513 -1238,-3.171,40.0834 -1239,-3.1617,39.8997 -1240,-3.1366,39.8995 -1241,-3.4955,37.6826 -1242,-3.4167,37.6822 -1243,-3.4334,37.6867 -1244,-3.1099,39.0853 -1245,-3.1106,39.0178 -1246,-3.4411,37.7046 -1247,-3.4118,37.6921 -1248,-3.403,37.679 -1249,-1.25,39.6333 -1250,-2.5,40.283 -1251,-1.2,39.9833 -1252,-1.5,39.5 -1253,-0.5,37.6833 -1254,-1.4403,36.9817 -1255,-1.457,36.9661 -1256,-1.4461,36.9964 -1257,-1.534,37.239 -1258,-1.5336,37.2186 -1259,-1.3877,36.9356 -1260,-2.582,38.142 -1261,-1.2536,36.9028 -1262,-1.2101,36.9117 -1263,-1.2087,36.912 -1264,-1.3264,36.6926 -1265,-1.3145,36.7909 -1266,-1.2721,36.9546 -1267,-1.2921,36.8219 -1268,-1.2303,36.78 -1269,-1.2899,36.8165 -1270,-1.2114,36.9059 -1271,-0.1592,34.4103 -1272,-0.0467,34.3455 -1273,-0.1239,34.3999 -1274,-0.1752,34.4099 -1275,-0.1833,34.3833 -1276,-0.1547,34.4365 -1277,-0.1632,34.4043 -1278,-0.0698,34.3504 -1279,0.0054,34.1001 -1280,-0.1506,34.4257 -1281,-0.1,34.2667 -1282,-0.0329,34.0357 -1283,-0.2316,34.2686 -1284,-0.1439,34.3632 -1285,-0.1815,34.3548 -1286,-0.1527,34.3832 -1287,-0.1034,34.1684 -1288,-0.1343,34.3957 -1289,-0.151,34.3825 -1290,-0.3174,34.3432 -1291,-0.329,34.32 -1292,-0.1818,34.3692 -1293,-0.1667,34.3333 -1294,-0.2138,34.3127 -1295,-0.1466,34.3722 -1296,-0.15,34.3667 -1297,-0.1617,34.3974 -1298,-0.3706,34.3081 -1299,-0.1652,34.4266 -1300,-0.3257,34.3156 -1301,-0.1798,34.3564 -1302,-0.1595,34.3944 -1303,-0.307,34.2839 -1304,-0.1377,34.1642 -1305,-0.1772,34.4049 -1306,-0.1649,34.4199 -1307,-0.1721,34.3775 -1308,-0.2427,34.2949 -1309,-0.1868,34.327 -1310,-0.1783,34.3866 -1311,-0.0722,34.3796 -1312,-0.1953,34.3398 -1313,-0.1283,34.3784 -1314,-0.005,34.1417 -1315,-0.172,34.3481 -1316,-0.0674,34.0556 -1317,-0.0469,34.1068 -1318,-0.08,34.178 -1319,-0.1531,34.409 -1320,-0.5893,34.7488 -1321,-0.6717,34.7718 -1322,-0.67,34.769 -1323,-0.5794,34.7991 -1324,-0.8667,34.7167 -1325,-0.4755,34.5859 -1326,-0.621,34.4782 -1327,-0.6402,34.4792 -1328,-0.5308,34.5197 -1329,-0.1165,34.5131 -1330,-0.1107,34.6182 -1331,-0.0667,34.5167 -1332,-0.0992,34.8459 -1333,-0.0397,34.6337 -1334,-0.1069,34.5148 -1335,-0.1001,34.5659 -1336,-0.1524,34.4538 -1337,-0.0718,34.7435 -1338,-0.1054,34.6372 -1339,-0.1052,34.544 -1340,-0.168,34.4809 -1341,-0.0798,34.678 -1342,-0.095,34.752 -1343,-0.1178,34.5406 -1344,-0.1509,34.5504 -1345,-0.1091,34.5258 -1346,-0.1302,34.7466 -1347,-0.15,34.45 -1348,-0.1375,34.4493 -1349,-0.147,34.743 -1350,-0.1602,34.5125 -1351,-0.0447,34.7151 -1352,-0.1267,34.7575 -1353,-0.1172,34.802 -1354,-0.1561,34.7617 -1355,-0.1048,34.6292 -1356,-0.0833,34.65 -1357,-0.0882,34.5857 -1358,-0.0997,34.5275 -1359,-0.1436,34.4614 -1360,-0.05,34.5333 -1361,-0.1204,34.7473 -1362,-0.0893,34.6721 -1363,-0.1388,34.5518 -1364,-0.1639,34.4448 -1365,-0.0833,34.5167 -1366,-0.0499,34.7059 -1367,-0.0765,34.6761 -1368,-0.0484,34.8046 -1369,-0.675,34.6064 -1370,-0.8113,34.2437 -1371,-0.154,35.158 -1372,-0.2941,35.0364 -1373,-0.182,34.916 -1374,-0.1331,34.9556 -1375,-0.1833,34.8 -1376,-0.1605,35.0732 -1377,-0.1753,35.0329 -1378,-0.2622,34.9763 -1379,-0.0824,35.108 -1380,-0.0268,34.8146 -1381,-0.0251,34.8211 -1382,-0.2267,34.9469 -1383,-0.3265,34.8968 -1384,-0.0787,35.0012 -1385,-0.2485,34.8835 -1386,-0.2705,34.977 -1387,-0.067,35.05 -1388,-0.1396,34.9331 -1389,-0.1886,34.9279 -1390,-0.1736,34.7781 -1391,-0.1424,34.9267 -1392,-0.1716,35.2748 -1393,-0.1656,34.8708 -1394,-0.05,34.9667 -1395,-0.1685,34.8487 -1396,-0.149,35.2 -1397,-0.1489,35.2038 -1398,-0.3815,34.9796 -1399,-0.3072,34.9278 -1400,-0.159,34.981 -1401,-0.2214,35.3029 -1402,-0.0798,35.0489 -1403,-0.152,35.2264 -1404,-0.3147,34.9349 -1405,-0.1498,34.8253 -1406,-0.1871,34.9483 -1407,-0.3148,34.8036 -1408,-0.1278,35.2024 -1409,-0.15,34.9833 -1410,-0.1151,35.0175 -1411,-0.3788,34.6942 -1412,-0.4012,34.6682 -1413,-0.4462,34.5096 -1414,-0.4532,34.6332 -1415,-0.3711,34.7019 -1416,-0.3599,34.7543 -1417,-0.4303,34.549 -1418,-0.409,34.5639 -1419,-0.4417,34.5603 -1420,-0.3725,34.6441 -1421,-0.3519,34.7653 -1422,-0.3588,34.7905 -1423,-0.3733,34.7741 -1424,-0.4181,34.4833 -1425,-0.4005,34.6092 -1426,-0.422,34.5717 -1427,-0.4142,34.55 -1428,-0.44,34.739 -1429,-0.3621,34.7539 -1430,-0.43,34.9116 -1431,0.1,34.48 -1432,-0.0036,34.4831 -1433,0.0333,34.2 -1434,0.0401,34.3221 -1435,-0.015,34.348 -1436,0.078,34.5514 -1437,-0.0342,34.277 -1438,-0.0236,34.2755 -1439,0.214,34.38 -1440,0.2348,34.3393 -1441,0.063,34.161 -1442,-0.4626,34.3744 -1443,-0.4746,34.3295 -1444,-0.5015,34.1983 -1445,-0.5003,34.2165 -1446,-0.4385,34.2332 -1447,-0.4949,34.171 -1448,-0.5667,34.3167 -1449,-0.4946,34.3274 -1450,-0.4085,34.1556 -1451,-0.4777,34.3843 -1452,-0.4302,34.1649 -1453,-0.4235,34.1343 -1454,-0.5001,34.2691 -1455,-0.4974,34.2297 -1456,-0.4657,34.3161 -1457,-0.425,34.134 -1458,-0.4447,34.2219 -1459,-0.4,34.1667 -1460,-0.4524,34.2715 -1461,-0.5066,34.3427 -1462,-0.5279,34.0963 -1463,-0.6523,34.2258 -1464,-0.4494,34.2493 -1465,-0.5009,34.3454 -1466,-0.6783,34.0898 -1467,-0.5761,34.3695 -1468,-0.4748,34.2901 -1469,-0.5454,34.1635 -1470,-0.6893,34.1518 -1471,-0.55,34.2 -1472,-0.4369,34.2065 -1473,-0.431,34.209 -1474,-0.437,34.2095 -1475,-0.4598,34.0097 -1476,-0.4569,34.3212 -1477,-0.4769,34.2917 -1478,-0.4712,34.279 -1479,-0.3549,34.194 -1480,-0.4868,34.3287 -1481,-0.4605,34.1934 -1482,-0.4949,34.1703 -1483,-0.5702,34.1031 -1484,-0.7176,34.1256 -1485,-0.4779,34.3191 -1486,-0.4769,34.3053 -1487,-0.7215,34.0665 -1488,-0.7166,34.0681 -1489,-0.4874,34.313 -1490,-0.5401,34.2574 -1491,-0.495,34.3032 -1492,-0.6224,34.3456 -1493,-0.4655,34.281 -1494,-0.7716,34.1046 -1495,-0.5724,34.084 -1496,-0.5115,34.4093 -1497,-0.55,34.12 -1498,-0.5725,34.2649 -1499,-0.5848,34.1638 -1500,-0.587,34.3638 -1501,-0.5838,34.3356 -1502,-0.3899,34.1793 -1503,-0.5399,34.1677 -1504,-0.5686,34.1988 -1505,-0.4716,34.0942 -1506,-0.494,34.2833 -1507,-0.4777,34.3843 -1508,-0.3817,34.2157 -1509,-0.6329,34.0776 -1510,-0.4594,34.4008 -1511,-0.5267,34.2855 -1512,-0.6443,34.2373 -1513,-0.3864,34.1779 -1514,-0.5308,34.3793 -1515,-0.405,34.1933 -1516,0.468,35.967 -1517,0.4392,36.0035 -1518,0.395,36.0167 -1519,0.3874,36.0254 -1520,-1.4295,36.6897 -1521,-1.4952,36.9546 -1522,-1.4957,36.9546 -1523,-0.199,35.349 -1524,-0.3,35.05 -1525,-0.3923,35.0636 -1526,-0.1846,35.1149 -1527,-0.2117,35.3544 -1528,0,35.9682 -1529,0.2,35.7667 -1530,0.1069,35.8811 -1531,0.267,36.049 -1532,-0.1469,35.9379 -1533,-0.71,36.438 -1534,0.3167,35.0667 -1535,0.2167,35.2333 -1536,0.3289,34.9963 -1537,-0.0338,35.0498 -1538,-1.1068,36.2404 -1539,1.025,34.999 -1540,3.7528,34.8204 -1541,3.7567,34.8325 -1542,3.751,34.8276 -1543,3.7569,34.8275 -1544,3.726,34.8408 -1545,3.7426,34.8368 -1546,3.7489,34.8415 -1547,3.7508,34.8359 -1548,3.7222,34.848 -1549,3.7687,34.8235 -1550,3.7639,34.8213 -1551,4.3762,35.5516 -1552,3.1,35.6333 -1553,0.5709,34.5614 -1554,0.7359,34.5778 -1555,0.55,34.5167 -1556,0.7562,34.5058 -1557,0.1456,34.0272 -1558,0.1,34.05 -1559,0.467,34.101 -1560,0.2927,34.1367 -1561,0.3053,34.6056 -1562,0.148,34.589 -1563,0.167,34.7483 -1564,0.28,34.742 -1565,0.1712,34.7606 -1566,0.177,34.7853 -1567,0.702,34.3467 -1568,0.6158,34.224 -1569,0.6265,34.2441 -1570,0.7223,34.3806 -1571,0.5405,34.2372 -1572,0.6731,34.3472 -1573,0.514,34.251 -1574,0.6973,34.3821 -1575,0.6311,34.373 -1576,0.6328,34.2694 -1577,0.5924,34.2272 -1578,0.69,34.3997 -1579,0.1,34.7667 -1580,0.0094,34.6077 -1581,0.1166,34.6333 -1582,0.1142,34.6182 -1583,0.026,34.6358 -1584,0.008,34.6716 -1585,0.0368,34.6726 -1586,0.1,34.7167 -1587,0.0833,34.7167 -1588,0.0371,34.5808 -1589,0.0208,34.6035 -1590,0.1,34.7667 -1591,0.1,34.8167 -1592,0.139,34.849 -1593,-17.833,48.43 -1594,-18.243,48.37 -1595,-19.417,48.167 -1596,-19.0833,48.1 -1597,-18.866,48.066 -1598,-18.751,48.033 -1599,-18.833,48.183 -1600,-18.8491,48.24 -1601,-18.684,48.012 -1602,-19.0833,47.9833 -1603,-18.95,48.4667 -1604,-18.895,47.972 -1605,-19.0333,48.1167 -1606,-18.968,48.584 -1607,-18.916,48.567 -1608,-19.1791,48.4414 -1609,-19.117,48.05 -1610,-18.786,48.241 -1611,-18.9667,48.35 -1612,-18.9472,48.2334 -1613,-18.36,48.06 -1614,-18.82,48.1 -1615,-18.984,48.349 -1616,-18.834,47.433 -1617,-18.749,47.341 -1618,-18.75,47.515 -1619,-19.299,47.831 -1620,-19.2275,47.6003 -1621,-18.418,47.699 -1622,-18.3053,48.0058 -1623,-18.3178,47.9756 -1624,-18.184,47.783 -1625,-18.5667,47.8667 -1626,-17.9908,47.0353 -1627,-17.9831,47.0572 -1628,-18.3903,47.0167 -1629,-18.5833,47.15 -1630,-18.3167,47.1167 -1631,-17.9572,47.05 -1632,-17.972,47.026 -1633,-17.9736,47.0389 -1634,-18.715,47.15 -1635,-18.4347,47.0006 -1636,-18.4036,47.0508 -1637,-18.48,47.26 -1638,-18.2,47.1 -1639,-18.5306,47.0283 -1640,-18.8754,47.5582 -1641,-18.8974,47.5282 -1642,-18.9,47.599 -1643,-18.917,47.533 -1644,-18.9216,47.56 -1645,-18.871,47.5233 -1646,-18.9156,47.5309 -1647,-18.9117,47.5159 -1648,-18.8678,47.6271 -1649,-18.914,47.526 -1650,-18.8703,47.4934 -1651,-18.8671,47.4334 -1652,-18.9272,47.4991 -1653,-18.95,47.56 -1654,-18.9598,47.5983 -1655,-18.9816,47.6024 -1656,-18.933,47.5368 -1657,-18.9401,47.5367 -1658,-18.933,47.9 -1659,-18.701,47.683 -1660,-18.934,47.666 -1661,-19.082,47.766 -1662,-19.167,47.866 -1663,-17.27,49.38 -1664,-17.3167,49.4 -1665,-17.3809,49.4101 -1666,-17.3667,49.4 -1667,-16.991,49.868 -1668,-16.999,49.852 -1669,-16.951,49.882 -1670,-17.0145,49.8615 -1671,-17.0806,49.5143 -1672,-16.88,49.52 -1673,-16.924,49.568 -1674,-17.686,49.507 -1675,-17.585,48.96 -1676,-17.4663,49.1991 -1677,-24.77,45.58 -1678,-24.2228,45.3146 -1679,-24.5453,45.2558 -1680,-25.13,45.35 -1681,-25.32,45.5 -1682,-25.37,45.48 -1683,-25.2,45.35 -1684,-25.0411,46.3853 -1685,-24.9563,46.3777 -1686,-25.145,46.38 -1687,-24.9167,46.4167 -1688,-23.2632,46.1002 -1689,-23.733,45.766 -1690,-25.02,46.987 -1691,-25.04,46.96 -1692,-24.782,46.998 -1693,-24.6924,44.746 -1694,-23.7207,44.3836 -1695,-23.502,44.497 -1696,-23.532,44.323 -1697,-21.354,43.511 -1698,-22.0798,44.1623 -1699,-21.6819,43.5198 -1700,-21.715,43.75 -1701,-22.9,44.333 -1702,-22.917,44.529 -1703,-23.351,43.667 -1704,-22.769,43.6168 -1705,-23.4142,43.7556 -1706,-22.8166,47.8179 -1707,-23.595,47.022 -1708,-23.3503,47.6043 -1709,-22.822,47.317 -1710,-18.07,49.38 -1711,-18.1066,49.3972 -1712,-18.1667,49.3833 -1713,-19.4282,48.9125 -1714,-18.266,48.582 -1715,-18.7741,49.0067 -1716,-18.9667,48.7667 -1717,-18.9,48.85 -1718,-18.9167,48.85 -1719,-17.43,46.85 -1720,-17.594,46.926 -1721,-17.307,46.951 -1722,-16.9502,46.8331 -1723,-17.73,47.02 -1724,-17.65,46.97 -1725,-16.4756,46.7243 -1726,-16.366,47.044 -1727,-15.617,46.382 -1728,-15.562,46.487 -1729,-15.721,46.306 -1730,-15.7167,46.3167 -1731,-16.1119,46.6405 -1732,-16.1833,46.6667 -1733,-19.2333,46.2667 -1734,-19,46.4167 -1735,-18.915,46.183 -1736,-19.125,46.362 -1737,-19.006,46.456 -1738,-18.7694,46.049 -1739,-13.672,48.4358 -1740,-14.017,48.616 -1741,-13.714,48.356 -1742,-13.1963,49.0502 -1743,-13.8081,49.1792 -1744,-12.2809,49.2906 -1745,-12.7442,49.236 -1746,-13.3516,48.1976 -1747,-21.8311,46.9388 -1748,-21.71,46.7 -1749,-21.1062,47.2168 -1750,-21.459,47.078 -1751,-22.402,46.122 -1752,-22.18,46.08 -1753,-22.5588,45.4167 -1754,-22.2,46.36 -1755,-18.967,47.265 -1756,-19.0833,47.3333 -1757,-18.932,46.85 -1758,-18.8833,46.7 -1759,-19.3551,46.4428 -1760,-19.145,46.4239 -1761,-19.1217,46.4239 -1762,-19.4,46.46 -1763,-17.749,45.772 -1764,-18.6773,44.6231 -1765,-19.147,44.792 -1766,-16.748,44.4839 -1767,-17.5738,44.0462 -1768,-18.064,44.026 -1769,-17.82,44.917 -1770,-19.7,44.543 -1771,-19.732,44.967 -1772,-20.2833,44.6333 -1773,-20.35,45.593 -1774,-21.0514,44.935 -1775,-21.4318,44.3315 -1776,-18.64,44.992 -1777,-19.53,45.455 -1778,-19.58,45.47 -1779,-20.238,44.311 -1780,-20.299,44.284 -1781,-14.65,49.65 -1782,-14.9,50.2718 -1783,-14.26,50.16 -1784,-13.37,49.98 -1785,-14.6377,47.7505 -1786,-14.2,48.082 -1787,-14.8735,47.9876 -1788,-15.2575,48.5414 -1789,-15.25,48.6667 -1790,-15.5645,47.6685 -1791,-16.0202,47.3805 -1792,-16.1073,47.4907 -1793,-16.0963,47.644 -1794,-15.5833,48.8167 -1795,-19.5677,47.3537 -1796,-19.617,47.133 -1797,-19.58,46.37 -1798,-19.84,46.855 -1799,-20.18,46.9 -1800,-19.4297,46.5461 -1801,-19.564,46.3809 -1802,-19.5807,46.2883 -1803,-19.636,46.33 -1804,-21.305,47.633 -1805,-21.25,47.45 -1806,-21.8841,47.4418 -1807,-21.55,47.517 -1808,-21.25,48.3 -1809,-14.2803,34.678 -1810,-14.379,34.333 -1811,-14.2489,34.6067 -1812,-14.2999,34.7229 -1813,-13.433,33.567 -1814,-13.466,33.583 -1815,-13.434,33.565 -1816,-13.4667,33.5833 -1817,-12.9846,33.3857 -1818,-13.6917,33.0512 -1819,-12.9842,34.3036 -1820,-12.9304,34.2941 -1821,-13.5333,34.3666 -1822,-13.769,34.5871 -1823,-13.8106,34.5223 -1824,-13.7707,34.6012 -1825,-13.7879,34.4579 -1826,-9.6987,33.2698 -1827,-10.4167,34.1833 -1828,-10.2289,34.0445 -1829,-9.8038,33.8388 -1830,-9.933,33.936 -1831,-10.353,34.1044 -1832,-10.2289,34.0445 -1833,-10.3142,34.1381 -1834,-12.0377,34.0523 -1835,-11.607,34.2936 -1836,-15.0824,35.1962 -1837,-15.0589,35.1907 -1838,-15.0788,35.1881 -1839,-14.9762,35.2257 -1840,-15.0632,35.1917 -1841,-15.072,35.1712 -1842,-15.0019,35.2047 -1843,-14.9978,35.1888 -1844,-14.9741,35.2131 -1845,-15.0982,35.1788 -1846,-15.0465,35.1938 -1847,-15.005,35.1943 -1848,-15.0425,35.1831 -1849,-14.9557,35.214 -1850,-15.0499,35.2005 -1851,-15.0511,35.2062 -1852,-15.1103,35.1926 -1853,-15.0609,35.1781 -1854,-14.9948,35.2171 -1855,-15.7667,35 -1856,-16.02,34.8178 -1857,-16.0353,34.8011 -1858,-15.9904,34.7805 -1859,-16.2467,34.9111 -1860,-16.0833,34.8 -1861,-15.926,34.6069 -1862,-16.0326,34.8361 -1863,-16.3925,34.7828 -1864,-16.1699,34.903 -1865,-16.019,34.8178 -1866,-16.0853,34.7449 -1867,-16.078,34.82 -1868,-16.0241,34.8235 -1869,-16.2469,34.8592 -1870,-14.9427,35.4413 -1871,-15.1973,35.3715 -1872,-15.0439,35.2313 -1873,-14.966,35.516 -1874,-15.1447,35.1924 -1875,-14.701,35.567 -1876,-15.0751,35.5182 -1877,-14.583,35.35 -1878,-14.5,35.249 -1879,-14.514,35.267 -1880,-14.508,35.242 -1881,-14.1567,34.9382 -1882,-14.3014,35.1172 -1883,-14.308,35.139 -1884,-14.382,35.198 -1885,-14.2108,35.0544 -1886,-14.4484,35.3206 -1887,-16.0809,35.5761 -1888,-15.7006,34.4014 -1889,-15.6967,34.4154 -1890,-16.385,35.134 -1891,-16.9135,35.2494 -1892,-15.6427,35.7857 -1893,-15.801,35.645 -1894,-16.1276,35.2926 -1895,-16.0515,35.1655 -1896,-16.07,35.148 -1897,-15.25,35.45 -1898,12.6614,-7.9444 -1899,12.652,-7.989 -1900,12.6093,-8.0379 -1901,12.5738,-8.0062 -1902,12.516,-7.934 -1903,16.9167,-0.3333 -1904,17.9893,0.3619 -1905,16.291,-0.08 -1906,13.8083,-10.8306 -1907,14.2635,-10.5015 -1908,14.4312,-10.3766 -1909,13.25,-10.5 -1910,13.6833,-10.3167 -1911,13.5,-10.75 -1912,14.55,-9.75 -1913,14.5833,-9.3833 -1914,14.3192,-9.4135 -1915,14.3667,-9.1 -1916,14.4667,-10.9167 -1917,14.457,-11.434 -1918,14.2245,-11.6844 -1919,12.4329,-10.8981 -1920,13.439,-11.2725 -1921,13.3333,-11.4333 -1922,12.9167,-9.5 -1923,13.075,-9.6049 -1924,13.039,-9.4868 -1925,15.0697,-9.9137 -1926,15.0095,-10.2517 -1927,15.0667,-9.1333 -1928,15.283,-9.634 -1929,15.0667,-10.5833 -1930,14.8,-10.75 -1931,18.0667,0.6167 -1932,18.444,1.402 -1933,19.4649,0.8549 -1934,14.1766,-7.4325 -1935,13.8667,-7.3 -1936,13.47,-7.2 -1937,13.7833,-7.1333 -1938,13.8667,-7.2833 -1939,13.7833,-7.25 -1940,14.134,-7.017 -1941,14,-7.3167 -1942,13.55,-7.4333 -1943,13.6667,-7.2167 -1944,12.4822,-6.7911 -1945,12.7167,-7.0167 -1946,12.6,-6.684 -1947,12.15,-8.5667 -1948,12.1833,-8.55 -1949,11.7,-8.2833 -1950,12.8,-8.034 -1951,12.165,-8.246 -1952,12.801,-7.984 -1953,12.8,-8.2667 -1954,12.434,-8.2 -1955,12.4667,-8 -1956,12.801,-8.1 -1957,12.748,-8.077 -1958,12.6935,-7.8498 -1959,12.6916,-7.8642 -1960,12.8406,-8.1126 -1961,12.6833,-7.8333 -1962,12.7591,-8.0563 -1963,12.7716,-7.9168 -1964,12.8,-8.05 -1965,12.2983,-8.355 -1966,12.4167,-8.2667 -1967,13.3667,-8.3333 -1968,11.9865,-7.6977 -1969,12.801,-8.072 -1970,13.5,-8.0667 -1971,13.2302,-8.1794 -1972,13.5667,-8.5 -1973,13.9167,-8.0833 -1974,13.3212,-8.1652 -1975,13.45,-7.04 -1976,13.51,-7.06 -1977,12.9167,-7.6333 -1978,12.865,-7.571 -1979,13.168,-7.251 -1980,13.33,-7.1 -1981,14.5667,-7.4667 -1982,14.3333,-7.75 -1983,15.1685,-7.2901 -1984,14.9963,-7.6202 -1985,14.3211,-7.2217 -1986,14.5833,-7.4167 -1987,14.4167,-3.6167 -1988,14.4167,-3.7833 -1989,14.7667,-3.75 -1990,14.4,-3.5667 -1991,13.433,-3.751 -1992,13.9054,-4.556 -1993,13.8892,-4.5392 -1994,13.9516,-4.2577 -1995,15,-2.9667 -1996,15.2705,-1.7362 -1997,14.9849,-2.5833 -1998,14.4567,-3.0925 -1999,14.214,-3.3637 -2000,14.5435,-4.1932 -2001,14.8618,-4.3184 -2002,14.8667,-4.3333 -2003,14.483,-4.184 -2004,14.7889,-3.8939 -2005,14.7775,-3.9203 -2006,14.7955,-3.9357 -2007,14.7684,-3.9053 -2008,14.865,-3.8392 -2009,14.533,-4.101 -2010,14.6166,-4.5 -2011,13.2111,-6.1378 -2012,13.1814,-6.2603 -2013,13.0208,-6.3876 -2014,13.0119,-6.6125 -2015,13.0167,-6.6333 -2016,12.946,-5.758 -2017,13.1,-5.2667 -2018,13.1167,-5.3 -2019,13.1136,-5.8324 -2020,12.8,-5.7833 -2021,14.118,-5.769 -2022,14.3645,-6.002 -2023,14.3359,-6.0224 -2024,14.34,-5.94 -2025,14.3909,-6.0013 -2026,14.36,-5.91 -2027,14.136,-5.985 -2028,14.2766,-5.9641 -2029,14.2816,-6.0345 -2030,14.158,-6.0316 -2031,14.2915,-5.985 -2032,14.167,-6.134 -2033,14.2264,-5.9846 -2034,14.3056,-6.0335 -2035,14.3985,-5.9753 -2036,14.7396,-6.1202 -2037,14.0621,-6.1822 -2038,14.4541,-5.8792 -2039,14.15,-5.868 -2040,14.502,-5.985 -2041,14.33,-5.97 -2042,14.3273,-5.9653 -2043,14.052,-6.182 -2044,13.2974,-4.8969 -2045,13.4,-4.5833 -2046,12.7167,-5.0333 -2047,13.35,-6.384 -2048,13.234,-5.919 -2049,13.368,-6.151 -2050,14.0049,-6.5447 -2051,13.6739,-6.0751 -2052,14.107,-6.7254 -2053,13.4406,-6.2653 -2054,13.5049,-4.1918 -2055,11.416,-7.486 -2056,11.784,-7.768 -2057,10.556,-5.768 -2058,10.45,-6.9167 -2059,12.3453,-5.5659 -2060,12.4437,-5.0532 -2061,12.4865,-5.4957 -2062,12.2167,-5.5833 -2063,12.102,-5.468 -2064,11.1333,-5.4333 -2065,11.217,-6.268 -2066,11.3173,-5.6671 -2067,11.5833,-8.2833 -2068,11.6667,-8.1833 -2069,11.4167,-8.3167 -2070,11.5,-8.3 -2071,11.171,-8.161 -2072,12.7954,-4.7202 -2073,16.25,-3.3833 -2074,15.8,-1.3333 -2075,15.4418,-1.2413 -2076,16.775,-3.008 -2077,17.0439,-12.3983 -2078,17.1505,-12.1267 -2079,16.611,-11.4 -2080,17.0582,-13.9086 -2081,17.05,-13.917 -2082,17.181,-13.2369 -2083,17.0701,-13.9355 -2084,16.423,-14.082 -2085,16.6683,-14.4301 -2086,16.591,-14.264 -2087,16.6221,-14.2224 -2088,16.6171,-14.2688 -2089,17.4667,-13.2333 -2090,16.3333,-12.4297 -2091,15.7166,-11.7561 -2092,16.661,-9.618 -2093,16.666,-9.617 -2094,15.8172,-9.3653 -2095,17.251,-10.673 -2096,16.4,-10.1667 -2097,18.1048,-15.9289 -2098,18.1278,-15.9392 -2099,18.0839,-15.9377 -2100,17.7303,-12.5063 -2101,17.881,-12.33 -2102,17.9808,-12.2542 -2103,18.551,-11.416 -2104,18.558,-11.432 -2105,17.375,-14.606 -2106,16.5578,-16.3287 -2107,16.551,-16.234 -2108,17.1614,-15.7135 -2109,17.001,-15.1254 -2110,-25.0584,33.0311 -2111,-24.534,32.983 -2112,-24.7228,32.8906 -2113,-24.6871,33.173 -2114,-24.6231,33.1122 -2115,-23.469,32.453 -2116,-24.701,33.883 -2117,-23.829,32.074 -2118,-20.9978,35.0166 -2119,-23.9422,35.0289 -2120,-23.881,35.153 -2121,-23.3697,35.3133 -2122,-23.716,35.3 -2123,-19.4131,33.4514 -2124,-25.9108,32.4064 -2125,-26.033,32.315 -2126,-26.067,32.332 -2127,-25.802,32.565 -2128,-25.898,32.483 -2129,-25.8881,32.4331 -2130,-25.966,32.465 -2131,-25.8667,32.5 -2132,-25.021,32.642 -2133,-25.1419,32.5423 -2134,-24.8,32.865 -2135,-25.4486,32.7811 -2136,-25.4,32.802 -2137,-25.2638,32.8705 -2138,-25.3683,32.8353 -2139,-25.033,32.782 -2140,-25.5362,32.7715 -2141,-25.733,32.683 -2142,-26.342,32.667 -2143,-26.833,32.282 -2144,-26.42,32.37 -2145,-26.484,32.65 -2146,-26.4883,32.5747 -2147,-25.586,32.235 -2148,-25.4438,31.9935 -2149,-26.0073,32.5594 -2150,-25.962,32.573 -2151,-25.9658,32.5778 -2152,-25.928,32.6183 -2153,-25.9341,32.6131 -2154,-25.9169,32.6336 -2155,-25.8958,32.6125 -2156,-25.8953,32.5653 -2157,-25.9262,32.5472 -2158,-25.9381,32.5415 -2159,-15.118,39.257 -2160,-13.301,35.239 -2161,-12.6933,34.8105 -2162,-13.414,34.873 -2163,-12.875,35.405 -2164,-19.5364,34.6249 -2165,-18.282,35.932 -2166,-16.2728,33.5456 -2167,-16.164,33.586 -2168,-15.983,30.549 -2169,-15.85,30.566 -2170,-16.167,33.766 -2171,-17.8578,36.8948 -2172,-17.3081,37.5146 -2173,-17.5089,37.5439 -2174,-16.8374,36.994 -2175,-16.5354,37.1799 -2176,-17.718,37.193 -2177,-17.5904,36.8285 -2178,-17.55,24.5 -2179,-17.716,24.516 -2180,-17.509,24.265 -2181,-25.121,17.768 -2182,-18.0667,21.4339 -2183,-17.9939,21.3189 -2184,-17.9508,21.1712 -2185,-17.966,21.233 -2186,-18.0833,21.75 -2187,-17.95,21.233 -2188,-17.999,21.367 -2189,-17.934,21.216 -2190,-17.9608,21.0354 -2191,-17.983,20.933 -2192,-17.982,21 -2193,-17.925,19.753 -2194,-18.06,13.824 -2195,-17.436,15.86 -2196,-22.408,19.497 -2197,-17.4385,14.7842 -2198,-17.5094,14.9885 -2199,-17.782,15.695 -2200,-19.5333,18.1258 -2201,16.992,7.979 -2202,13.6987,13.3095 -2203,13.4348,2.9205 -2204,14.6742,6.6842 -2205,13.59,7.19 -2206,14.1589,7.6115 -2207,13.511,2.102 -2208,13.521,2.09 -2209,13.5561,2.1292 -2210,13.5307,2.0947 -2211,13.5465,2.096 -2212,13.4765,2.1772 -2213,13.493,2.139 -2214,13.505,2.117 -2215,13.515,2.12 -2216,13.511,2.137 -2217,13.4926,2.1536 -2218,13.457,2.117 -2219,14.0188,6.2618 -2220,15.0459,5.3763 -2221,13.9997,2.6581 -2222,14.42,3.92 -2223,14.39,3.4 -2224,14.735,0.92 -2225,14.81,0.892 -2226,14.6601,0.9405 -2227,14.134,9.483 -2228,13.692,9.513 -2229,14.267,8.534 -2230,4.6894,7.7665 -2231,6.13,6.786 -2232,9.9749,9.5058 -2233,4.5346,6.4048 -2234,4.6901,6.3206 -2235,4.9874,5.6728 -2236,5.0695,5.8986 -2237,4.8749,5.7751 -2238,4.9212,6.2748 -2239,5.1524,6.1924 -2240,4.8809,6.1253 -2241,7.73,8.532 -2242,11.517,13.684 -2243,4.956,8.315 -2244,6.818,8.667 -2245,5.054,5.7805 -2246,5.893,5.667 -2247,5.58,5.85 -2248,6.451,8.083 -2249,6.338,5.625 -2250,7.617,5.22 -2251,7.5935,5.2169 -2252,7.6746,5.2329 -2253,5.45,7.15 -2254,12.567,8.917 -2255,12.3167,8.8667 -2256,12.43,9.195 -2257,12.318,8.882 -2258,12.3601,9.9856 -2259,10.614,7.23 -2260,10.433,7.167 -2261,10.366,7.1261 -2262,10.4001,7.4958 -2263,10.38,7.29 -2264,10.5414,7.1386 -2265,10.52,7.441 -2266,11.18,7.27 -2267,10.668,7.382 -2268,10.4998,7.388 -2269,10.7331,7.6001 -2270,10.6955,7.5112 -2271,10.668,7.484 -2272,11.2,7.75 -2273,11.083,7.716 -2274,10.5358,7.457 -2275,11.664,8.266 -2276,11.6961,8.5419 -2277,12.101,8.75 -2278,11.997,8.507 -2279,12.667,7.86 -2280,12.544,7.827 -2281,12.518,4.331 -2282,11.7058,3.7292 -2283,7.8088,6.7374 -2284,7.56,6.231 -2285,9.112,4.833 -2286,9.05,4.63 -2287,6.422,2.892 -2288,6.61,3.3 -2289,6.461,3.38 -2290,6.47,3.37 -2291,6.492,3.372 -2292,6.507,3.381 -2293,6.5338,3.3834 -2294,6.47,3.3 -2295,8.842,7.877 -2296,8.486,8.521 -2297,8.734,8.5341 -2298,8.717,8.533 -2299,9.872,4.578 -2300,9.881,4.518 -2301,9.174,7.173 -2302,7.1627,3.3605 -2303,7.15,3.35 -2304,7.43,3.08 -2305,6.94,3.92 -2306,6.807,3.919 -2307,6.911,3.7693 -2308,6.8429,3.9188 -2309,6.7999,3.9023 -2310,7.034,3.45 -2311,7.217,3.615 -2312,6.96,3.72 -2313,6.93,3.73 -2314,6.901,3.749 -2315,6.936,3.632 -2316,6.93,3.75 -2317,6.843,3.645 -2318,7.244,5.195 -2319,7.2701,5.1638 -2320,7.21,5.38 -2321,7.2,5.015 -2322,7.29,4.32 -2323,7.563,3.8799 -2324,7.364,3.894 -2325,7.71,3.56 -2326,7.518,3.784 -2327,7.46,3.34 -2328,7.425,3.288 -2329,7.78,3.61 -2330,8.168,3.665 -2331,7.7667,3.7333 -2332,8.124,4.246 -2333,7.19,3.76 -2334,8.033,4.133 -2335,9.343,9.175 -2336,4.433,7.166 -2337,13.1227,5.5068 -2338,13.058,5.244 -2339,12.1439,4.7486 -2340,12.27,6.56 -2341,-2.653,29.8352 -2342,-2.2897,29.9304 -2343,-1.4586,30.2573 -2344,-2.3264,29.1357 -2345,-2.5964,29.0076 -2346,-2.6864,29.5642 -2347,-2.3088,30.7862 -2348,-2.0539,29.6018 -2349,-2.2315,30.1127 -2350,-2.2477,30.0703 -2351,-1.977,30.1118 -2352,-1.3,30.3333 -2353,-1.7984,30.5028 -2354,14.7443,-17.5167 -2355,14.7277,-17.4906 -2356,14.7133,-17.4828 -2357,14.7103,-17.435 -2358,14.7028,-17.4212 -2359,14.71,-17.4497 -2360,14.6992,-17.4498 -2361,14.7145,-17.4532 -2362,14.7336,-17.4177 -2363,14.77,-17.4307 -2364,14.6887,-17.4379 -2365,14.6587,-17.4371 -2366,14.6816,-17.4381 -2367,14.6947,-17.4346 -2368,14.6992,-17.4493 -2369,14.7307,-17.4919 -2370,14.7246,-17.4431 -2371,14.6746,-17.4387 -2372,14.7495,-17.4386 -2373,14.6945,-17.4455 -2374,14.671,-17.436 -2375,14.7326,-17.456 -2376,14.7449,-17.4901 -2377,14.7252,-17.4581 -2378,14.7292,-17.4692 -2379,14.6976,-17.4558 -2380,14.6956,-17.4544 -2381,14.6875,-17.4633 -2382,14.7043,-17.4526 -2383,14.7144,-17.4385 -2384,14.6995,-17.4352 -2385,14.723,-17.468 -2386,14.675,-17.4368 -2387,14.725,-17.4514 -2388,14.675,-17.4509 -2389,14.7386,-17.5113 -2390,14.6817,-17.4614 -2391,14.69,-17.4663 -2392,14.6869,-17.4433 -2393,14.7042,-17.4533 -2394,14.7484,-17.4477 -2395,14.7457,-17.5152 -2396,14.7336,-17.4494 -2397,14.6802,-17.4572 -2398,14.7177,-17.4365 -2399,14.7382,-17.4335 -2400,14.7195,-17.4338 -2401,14.7314,-17.4251 -2402,14.7,-17.4456 -2403,14.7639,-17.4346 -2404,14.7041,-17.4662 -2405,14.7466,-17.5228 -2406,14.7391,-17.4323 -2407,14.6701,-17.4357 -2408,14.685,-17.4494 -2409,14.6832,-17.453 -2410,14.7111,-17.4527 -2411,14.6716,-17.4413 -2412,14.7524,-17.4603 -2413,14.7239,-17.4892 -2414,14.7459,-17.4721 -2415,14.7569,-17.4347 -2416,14.7507,-17.4436 -2417,14.745,-17.4341 -2418,14.725,-17.4971 -2419,14.6972,-17.436 -2420,14.7279,-17.5003 -2421,14.7147,-17.4651 -2422,14.7083,-17.4605 -2423,14.7244,-17.463 -2424,14.7499,-17.4905 -2425,14.7154,-17.4359 -2426,14.7434,-17.4854 -2427,14.7554,-17.469 -2428,14.7767,-17.3834 -2429,14.784,-17.3816 -2430,14.7726,-17.3972 -2431,14.7869,-17.3765 -2432,14.7727,-17.4063 -2433,14.7708,-17.4137 -2434,14.7651,-17.4218 -2435,14.7737,-17.3843 -2436,14.7894,-17.3663 -2437,14.7932,-17.3353 -2438,14.7455,-17.32 -2439,14.76,-17.3885 -2440,14.756,-17.3934 -2441,14.7407,-17.4115 -2442,14.7637,-17.3966 -2443,14.7722,-17.3217 -2444,14.7819,-17.3643 -2445,14.7877,-17.3437 -2446,14.7629,-17.4148 -2447,14.7758,-17.3461 -2448,14.7578,-17.3718 -2449,14.7343,-17.4153 -2450,14.7542,-17.4037 -2451,14.7437,-17.3777 -2452,14.76,-17.3509 -2453,14.75,-17.4 -2454,14.7607,-17.362 -2455,14.7635,-17.354 -2456,14.7701,-17.366 -2457,14.7485,-17.3713 -2458,14.7708,-17.3746 -2459,14.7454,-17.365 -2460,14.7432,-17.2886 -2461,14.7196,-17.2846 -2462,14.7252,-17.273 -2463,14.7062,-17.2546 -2464,14.8538,-17.1621 -2465,14.699,-16.458 -2466,14.7167,-16.6 -2467,14.656,-16.235 -2468,14.868,-15.894 -2469,13.9763,-16.7625 -2470,14.496,-16.506 -2471,14.34,-16.426 -2472,13.937,-16.7625 -2473,14.1617,-16.7243 -2474,14.4757,-16.537 -2475,14.05,-16.685 -2476,14.534,-16.435 -2477,14.483,-16.4 -2478,14.018,-16.766 -2479,14.1499,-16.6379 -2480,14.0094,-16.7519 -2481,14.471,-16.361 -2482,13.716,-16.418 -2483,13.934,-16.752 -2484,14.067,-16.334 -2485,13.6502,-16.3611 -2486,13.683,-16.383 -2487,13.7377,-16.4773 -2488,13.881,-16.38 -2489,14.25,-15.95 -2490,14.496,-16.08 -2491,14.275,-15.96 -2492,14.1317,-15.8815 -2493,14.106,-15.553 -2494,13.977,-14.819 -2495,14.0166,-15.5666 -2496,14.2356,-16.2704 -2497,14.0333,-15.9833 -2498,14.142,-16.101 -2499,13.9192,-15.9259 -2500,14.167,-16.05 -2501,13.8,-16.0833 -2502,13.749,-15.783 -2503,13.6301,-16.0179 -2504,13.7667,-15.9333 -2505,12.951,-14.151 -2506,12.901,-14.947 -2507,12.9891,-14.8682 -2508,12.6719,-15.5644 -2509,12.85,-15.234 -2510,12.633,-15.5 -2511,13.4356,-13.7718 -2512,13.024,-13.9255 -2513,13.2035,-13.9832 -2514,13.0909,-14.0084 -2515,13.217,-14.084 -2516,13.2588,-13.9062 -2517,13.1475,-14.1148 -2518,15.5014,-16.414 -2519,15.463,-16.6851 -2520,15.2833,-14.8833 -2521,15.2708,-14.9013 -2522,15.3169,-14.9334 -2523,15.25,-14.8333 -2524,15.2333,-14.7833 -2525,15.3167,-14.8667 -2526,15.2922,-14.8786 -2527,15.2361,-14.8245 -2528,15.2919,-14.8714 -2529,15.3167,-14.8333 -2530,15.2667,-14.85 -2531,15.55,-15.551 -2532,15.0697,-15.6111 -2533,15.2951,-14.9073 -2534,15.2888,-14.9244 -2535,15.2919,-14.86 -2536,15.983,-15.934 -2537,15.611,-16.247 -2538,15.8655,-16.1991 -2539,15.716,-16.5 -2540,15.267,-13.133 -2541,16.0475,-13.653 -2542,15.68,-13.256 -2543,16.2339,-15.9019 -2544,16.4016,-16.2852 -2545,16.074,-16.4615 -2546,16.1728,-15.9147 -2547,16.5,-15.618 -2548,16.4669,-16.2528 -2549,16.401,-16.015 -2550,16.483,-15.599 -2551,16.4967,-15.9189 -2552,16.247,-16.353 -2553,16.0869,-15.7239 -2554,16.4855,-15.778 -2555,16.266,-15.801 -2556,16.516,-15.583 -2557,16.389,-16.08 -2558,16.266,-15.884 -2559,16.2288,-16.3595 -2560,16.151,-15.717 -2561,16.5381,-16.105 -2562,16.548,-15.436 -2563,16.2,-16.4288 -2564,16.2762,-16.1519 -2565,16.4613,-15.6876 -2566,16.4887,-15.9848 -2567,16.2756,-16.1362 -2568,16.4438,-16.28 -2569,16.333,-16 -2570,16.1556,-16.4117 -2571,16.451,-14.319 -2572,16.532,-14.801 -2573,16.5123,-14.769 -2574,16.066,-14.001 -2575,16.6253,-14.8599 -2576,16.6333,-14.9167 -2577,16.5221,-15.1086 -2578,16.5139,-14.4318 -2579,16.5,-14.435 -2580,16.5428,-14.7142 -2581,16.4917,-14.9948 -2582,16.5259,-15.2225 -2583,16.5186,-14.7126 -2584,16.532,-14.793 -2585,16.5443,-14.8025 -2586,16.5982,-14.9362 -2587,16.5809,-14.7305 -2588,16.5919,-14.9489 -2589,16.5483,-14.8375 -2590,16.191,-14.014 -2591,16.5659,-14.8438 -2592,16.5002,-15.0455 -2593,16.5264,-15.3173 -2594,16.45,-14.801 -2595,16.584,-14.984 -2596,16.666,-14.984 -2597,16.5882,-14.8496 -2598,16.653,-14.972 -2599,16.666,-14.968 -2600,16.5183,-14.4016 -2601,16.6,-14.9 -2602,16.05,-14.551 -2603,16.0164,-16.4967 -2604,16.0521,-16.4795 -2605,15.9667,-16.3833 -2606,16.0246,-16.4865 -2607,15,-12.621 -2608,14.8698,-12.4629 -2609,14.134,-12.434 -2610,12.534,-12.317 -2611,12.52,-12.3376 -2612,12.5068,-12.4125 -2613,12.5167,-12.3833 -2614,12.555,-12.174 -2615,12.633,-12.117 -2616,12.4666,-12.35 -2617,12.5167,-12.4333 -2618,12.6013,-12.2597 -2619,12.616,-12.134 -2620,12.5333,-12.2667 -2621,13.55,-13.5833 -2622,13.3848,-13.3815 -2623,13.4779,-13.4543 -2624,13.4016,-13.4678 -2625,13.817,-13.583 -2626,13.3764,-13.6513 -2627,13.7025,-13.6604 -2628,13.7038,-13.6548 -2629,13.4759,-13.7164 -2630,13.4383,-13.4315 -2631,13.6833,-13.65 -2632,13.6873,-13.6418 -2633,13.3387,-13.6175 -2634,13.3,-13.35 -2635,13.2873,-13.2645 -2636,13.5768,-13.5699 -2637,13.5316,-13.5226 -2638,13.5861,-13.7856 -2639,13.3551,-13.6686 -2640,13.2761,-13.6225 -2641,13.3881,-13.7494 -2642,13.4264,-13.6881 -2643,13.7764,-13.6841 -2644,13.4565,-13.6866 -2645,13.3833,-13.3833 -2646,13.5543,-13.7798 -2647,13.3586,-13.3595 -2648,14.5403,-16.6714 -2649,14.418,-16.703 -2650,14.7128,-17.0844 -2651,14.7771,-17.0882 -2652,14.7593,-17.0967 -2653,14.7555,-17.0407 -2654,14.765,-17.069 -2655,14.7047,-17.0482 -2656,14.801,-16.926 -2657,15.067,-16.917 -2658,15.0151,-16.9714 -2659,14.967,-17.05 -2660,14.914,-17.069 -2661,15.1062,-16.784 -2662,15.2378,-16.8139 -2663,12.652,-16.363 -2664,12.699,-16.334 -2665,12.7167,-16.5524 -2666,12.833,-16.284 -2667,12.4355,-16.6055 -2668,12.5665,-16.1832 -2669,10.2736,43.4838 -2670,10.2748,43.6978 -2671,9.9646,43.429 -2672,9.9255,43.1826 -2673,10.6099,43.4294 -2674,10.4316,42.815 -2675,10.5667,42.9667 -2676,2.0263,45.3015 -2677,2.046,45.3393 -2678,2.178,45.5917 -2679,2.0535,45.3295 -2680,2.0492,45.33 -2681,11.2833,49.1833 -2682,11.0412,49.1934 -2683,10.6893,49.471 -2684,10.65,49.75 -2685,10.6561,49.4987 -2686,10.6517,49.7539 -2687,11.0279,50.4414 -2688,11.2926,50.3946 -2689,10.132,49.6862 -2690,10.28,50.233 -2691,10.5752,50.4246 -2692,10.4258,50.1527 -2693,11.1764,50.4329 -2694,11.4738,49.9489 -2695,11.4453,50.0906 -2696,11.266,49.799 -2697,9.6653,49.1636 -2698,9.5316,49.2287 -2699,10.2717,49.0507 -2700,8.7261,49.3393 -2701,9.5051,49.0849 -2702,8.9941,49.2664 -2703,9.5,49.4011 -2704,9.4861,49.3994 -2705,9.6206,49.1731 -2706,3.1129,43.3971 -2707,3.1138,43.6498 -2708,3.12,43.644 -2709,3.351,44.122 -2710,2.8215,43.2245 -2711,3.052,43.815 -2712,2.9578,43.5066 -2713,3.1974,43.586 -2714,3.168,43.617 -2715,2.7976,44.0825 -2716,2.4053,42.9768 -2717,2.0139,42.3148 -2718,3.6739,41.8306 -2719,2.7899,41.0102 -2720,3.3181,42.3886 -2721,3.788,42.8762 -2722,4.7367,45.2062 -2723,0.5167,42.9 -2724,1.1576,42.4687 -2725,0.7842,41.6587 -2726,-0.015,42.682 -2727,7.5,47.8333 -2728,6.7697,47.4308 -2729,7.3486,47.6208 -2730,7.1745,47.2431 -2731,7.2086,47.4407 -2732,7.217,48.85 -2733,7.9153,48.6492 -2734,7.6431,47.8298 -2735,7.9608,49.1606 -2736,7.9826,49.816 -2737,8.5164,49.4203 -2738,8.4855,49.5685 -2739,8.405,48.4864 -2740,8.4128,48.4864 -2741,8.5361,48.9869 -2742,9.9276,47.2154 -2743,9.4667,46.8333 -2744,10.0679,47.2052 -2745,10.7652,48.1064 -2746,10.7818,48.0869 -2747,10.214,48.773 -2748,10.6699,48.6267 -2749,10.7265,48.5888 -2750,2.6128,45.5035 -2751,2.5085,45.4857 -2752,2.967,46.55 -2753,2.7667,45.5167 -2754,2.7793,45.5009 -2755,2.751,45.5 -2756,2.8103,45.4808 -2757,2.9137,45.5614 -2758,2.8582,45.4109 -2759,2.1424,45.1167 -2760,2.2794,45.1888 -2761,2.1618,45.3506 -2762,2.3248,45.2993 -2763,2.0483,44.8981 -2764,2.1466,45.1189 -2765,2.1985,45.0558 -2766,2.251,45.134 -2767,2.1437,45.1163 -2768,2.1466,45.0744 -2769,2.1371,45.1203 -2770,2.183,45.15 -2771,2.2509,45.0591 -2772,2.2383,45.1397 -2773,2.133,45.067 -2774,2.1234,45.0241 -2775,2.1296,45.0359 -2776,2.1333,45.1 -2777,1.7493,44.7437 -2778,1.7704,44.7215 -2779,1.751,44.749 -2780,1.694,44.747 -2781,1.72,44.7 -2782,1.8933,44.819 -2783,1.658,44.576 -2784,1.7506,44.6301 -2785,1.8064,44.6987 -2786,1.7893,44.6744 -2787,1.7785,44.6585 -2788,1.71,44.704 -2789,1.8079,44.6935 -2790,1.7546,44.6418 -2791,1.767,44.516 -2792,1.7881,44.5395 -2793,1.7784,44.5365 -2794,1.772,44.5241 -2795,1.7728,44.6286 -2796,1.8541,44.7079 -2797,1.7342,44.4507 -2798,1.4004,43.9978 -2799,2.7988,45.0926 -2800,2.3981,44.8229 -2801,9.0012,46.6569 -2802,8.4167,47.1667 -2803,8.2414,47.2261 -2804,8.12,47.766 -2805,9.4979,49.0523 -2806,9.4571,48.1115 -2807,9.1481,48.4214 -2808,9.1112,47.6063 -2809,9.3651,45.5081 -2810,9.4436,45.6715 -2811,8.9348,45.5787 -2812,9.4016,45.5102 -2813,9.5247,45.5381 -2814,9.272,45.42 -2815,8.6927,45.8158 -2816,8.4164,45.7655 -2817,8.396,45.828 -2818,8.5144,45.7188 -2819,8.7833,45.4667 -2820,8.7155,45.7351 -2821,8.66,45.8542 -2822,8.4322,45.7208 -2823,8.964,45.7216 -2824,8.5682,45.7128 -2825,9.0924,45.5785 -2826,8.6867,45.6694 -2827,8.6272,45.8935 -2828,8.75,45.6359 -2829,9.4118,45.5116 -2830,9.3779,45.63 -2831,9.0062,45.5847 -2832,8.6555,45.9337 -2833,8.4407,45.6932 -2834,9.4572,45.5273 -2835,8.5951,45.9128 -2836,8.8004,45.8925 -2837,8.8762,45.5767 -2838,8.4662,45.651 -2839,9.332,45.5026 -2840,8.2871,46.4038 -2841,9.8881,45.1648 -2842,9.7159,45.266 -2843,8.6,45.2537 -2844,9.9294,45.1925 -2845,10.1779,44.6704 -2846,10.1849,44.82 -2847,10.3498,45.4376 -2848,10.1825,45.5591 -2849,9.917,43.916 -2850,9.3897,43.5208 -2851,10.045,43.7853 -2852,9.683,43.768 -2853,9.6848,43.6852 -2854,9.7545,43.4626 -2855,9.674,43.476 -2856,9.5614,44.0658 -2857,9.7664,44.691 -2858,9.5742,44.0458 -2859,9.7667,44.2833 -2860,9.8602,44.5288 -2861,9.7059,44.2147 -2862,9.6926,44.3535 -2863,9.5656,44.0686 -2864,9.581,44.1793 -2865,9.5437,43.9909 -2866,9.542,44.0761 -2867,9.9516,44.6931 -2868,-27.332,32.217 -2869,-27.25,32.1667 -2870,-26.916,32.25 -2871,-28.5667,31.9667 -2872,-26.9655,32.328 -2873,-27.0833,32.55 -2874,-27.032,32.416 -2875,-27.3074,32.3271 -2876,-28.0356,32.5302 -2877,-25.1228,31.916 -2878,-25.235,31.873 -2879,-25.249,31.938 -2880,-24.989,31.6 -2881,-26.6609,30.7857 -2882,-25.6599,31.9559 -2883,-25.5691,31.798 -2884,-25.6998,31.5501 -2885,-25.4333,31.9333 -2886,-25.9333,31.8333 -2887,-25.7465,31.8144 -2888,-25.633,31.716 -2889,-23.3089,30.716 -2890,-23.233,30.784 -2891,-23.8333,30.3333 -2892,-23.0833,31.3667 -2893,-23.1857,31.5192 -2894,-23.0117,31.25 -2895,-23.4,31.4333 -2896,-22.4503,31.3107 -2897,-22.8833,31.0333 -2898,-23.1089,31.4356 -2899,-23.2006,31.4092 -2900,-23.9752,31.4593 -2901,-23.8175,29.6419 -2902,-25.5001,23.7002 -2903,-25.4501,23.7 -2904,-25.4167,23.5833 -2905,-25.6643,24.0161 -2906,4.85,31.604 -2907,4.8141,31.6251 -2908,4.753,31.605 -2909,4.7906,31.5939 -2910,4.8366,31.613 -2911,4.8513,31.6181 -2912,4.8703,31.5859 -2913,4.8279,31.5926 -2914,4.8562,31.5891 -2915,4.8897,31.5751 -2916,7.7,28 -2917,14.6223,33.355 -2918,14.8348,33.1693 -2919,14.8027,32.9133 -2920,14.5159,33.2055 -2921,14.7436,33.3 -2922,14.7371,33.2961 -2923,14.566,33.349 -2924,14.833,33.017 -2925,14.6667,33.0833 -2926,14.91,33.18 -2927,14.252,32.982 -2928,14.5003,32.9067 -2929,14.35,33.417 -2930,14.317,33.532 -2931,13.8627,33.4202 -2932,13.8703,33.4692 -2933,14.2431,33.262 -2934,14.0848,33.4916 -2935,14.103,33.6191 -2936,14.4696,33.1262 -2937,14.3815,33.4446 -2938,14.3063,33.2014 -2939,14.2942,33.2167 -2940,14.4112,33.4612 -2941,14.4179,33.5585 -2942,14.3647,33.3141 -2943,14.35,33.5333 -2944,14.35,33.45 -2945,14.317,33.499 -2946,14.249,33.567 -2947,14.1326,33.661 -2948,14.3409,33.4313 -2949,14.4001,33.5168 -2950,14.8841,33.4453 -2951,14.9407,33.241 -2952,14.8824,33.4378 -2953,14.8,33.3167 -2954,14.7685,33.3751 -2955,15.1607,33.1277 -2956,14.267,33.216 -2957,14.265,33.2279 -2958,14.2964,33.1634 -2959,14.0826,33.1988 -2960,14.3436,33.987 -2961,14.428,33.532 -2962,14.4296,33.5283 -2963,14.4514,33.6834 -2964,11.768,34.349 -2965,10.55,34.282 -2966,11.859,34.378 -2967,11.8075,34.3909 -2968,11.846,34.6375 -2969,11.8659,34.3869 -2970,11.34,34.085 -2971,11.006,34.4201 -2972,14.2085,35.5422 -2973,14.821,35.355 -2974,14.416,34.698 -2975,14.5061,35.63 -2976,14.1527,36.2778 -2977,14.12,36.08 -2978,14.22,36.22 -2979,14.0408,35.3888 -2980,13.919,35.316 -2981,13.861,35.3731 -2982,13.9011,35.2602 -2983,14.039,35.378 -2984,13.8638,35.3484 -2985,14.0506,35.4831 -2986,14.0859,35.3429 -2987,14.052,35.293 -2988,13.5249,35.7622 -2989,13.5294,35.7602 -2990,13.5667,35.95 -2991,13.8444,35.391 -2992,13.5195,35.6376 -2993,13.691,34.3785 -2994,14.15,34.332 -2995,13.2741,34.6066 -2996,13.6,34.55 -2997,12.8854,35.1536 -2998,13.2147,34.6656 -2999,13.6233,34.4006 -3000,15.8126,36.1382 -3001,16.156,36.2036 -3002,15.187,35.8535 -3003,15.2329,35.828 -3004,14.96,35.8989 -3005,15.0136,35.8123 -3006,14.9725,35.8943 -3007,14.969,35.8641 -3008,14.9592,35.8996 -3009,15.2014,35.8425 -3010,15.45,36.4 -3011,15.377,36.401 -3012,15.3649,36.4526 -3013,15.2246,35.8324 -3014,15.3763,35.5819 -3015,15.2802,35.627 -3016,15.404,35.572 -3017,15.3288,35.5986 -3018,15.301,35.6227 -3019,14.4002,35.8662 -3020,14.3557,35.8913 -3021,14.98,35.9057 -3022,14.9529,35.8796 -3023,14.943,35.8876 -3024,14.9676,35.9098 -3025,14.9822,35.9068 -3026,14.7411,35.9745 -3027,14.396,35.87 -3028,14.2233,36.0287 -3029,15.3035,32.5955 -3030,15.3439,32.6167 -3031,15.2453,32.4969 -3032,15.5176,32.6374 -3033,15.5724,32.5091 -3034,15.567,32.516 -3035,15.5735,32.5045 -3036,15.5481,32.5684 -3037,15.6021,32.5784 -3038,15.6023,32.5755 -3039,15.4412,32.4898 -3040,15.6052,32.5041 -3041,15.54,32.4928 -3042,15.6175,32.541 -3043,15.5738,32.5783 -3044,15.4885,32.4979 -3045,15.579,32.524 -3046,15.5968,32.5287 -3047,15.5845,32.5464 -3048,15.4301,32.5423 -3049,15.5423,32.5754 -3050,15.5938,32.575 -3051,15.4894,32.61 -3052,15.579,32.5684 -3053,15.5348,32.5376 -3054,15.5149,32.61 -3055,15.5889,32.5126 -3056,15.5947,32.5288 -3057,15.7782,32.6131 -3058,15.9624,32.5812 -3059,15.6415,32.5531 -3060,15.6309,32.5345 -3061,15.6379,32.5161 -3062,15.6527,32.5353 -3063,15.6484,32.6314 -3064,15.6554,32.6487 -3065,15.9621,32.5811 -3066,15.6176,32.5908 -3067,15.6212,32.5576 -3068,15.623,32.5514 -3069,15.6586,32.5302 -3070,15.6628,32.5286 -3071,15.6205,32.5057 -3072,16.1137,32.5853 -3073,15.3833,32.8 -3074,15.599,32.478 -3075,15.3872,32.449 -3076,15.3035,32.4704 -3077,15.5667,32.3833 -3078,15.6164,32.4626 -3079,15.3676,32.426 -3080,15.6502,32.4639 -3081,15.6217,32.472 -3082,15.8842,32.5351 -3083,15.6527,32.3753 -3084,15.6615,32.4643 -3085,15.6562,32.4871 -3086,15.6555,32.4705 -3087,15.6402,32.4708 -3088,15.6664,32.5042 -3089,15.645,32.476 -3090,15.6397,32.3753 -3091,15.8328,32.5227 -3092,19.5385,33.3327 -3093,18.821,33.523 -3094,17.5893,33.9604 -3095,17.424,33.869 -3096,17.6972,33.9783 -3097,16.6838,33.4336 -3098,18.0525,30.9499 -3099,19.6291,30.416 -3100,19.55,30.432 -3101,19.169,30.474 -3102,19.2306,30.4504 -3103,19.2,30.45 -3104,19.6285,30.3881 -3105,18.2636,31.6867 -3106,18.5698,31.8487 -3107,18.4833,31.8167 -3108,18.4836,31.827 -3109,18.5549,31.8816 -3110,18.6603,32.0421 -3111,19.9167,30.3667 -3112,21.7981,31.3339 -3113,20.152,30.5685 -3114,19.7986,30.321 -3115,21.4665,31.0167 -3116,19.7118,30.3992 -3117,19.6917,30.3837 -3118,13.6306,25.35 -3119,13.7214,24.8571 -3120,13.4821,25.2987 -3121,13.6539,24.0904 -3122,14.8332,25.2836 -3123,14.1333,25.55 -3124,12.3554,29.2392 -3125,12.7,28.4334 -3126,12.6021,30.3523 -3127,13.0457,30.1775 -3128,13.189,30.218 -3129,13.4458,30.2038 -3130,12.8628,30.2172 -3131,12.6208,31.0891 -3132,12.7,30.6167 -3133,12.7178,30.6499 -3134,12.733,31.4147 -3135,19.616,37.218 -3136,18.3028,36.3134 -3137,18.425,37.726 -3138,12.8985,35.1292 -3139,13.3274,33.8885 -3140,12.962,34.0262 -3141,13.516,33.6889 -3142,13.33,33.3655 -3143,13.5167,33.6333 -3144,13.5045,33.6111 -3145,13.7452,33.4642 -3146,13.6844,33.864 -3147,13.7932,33.4811 -3148,13.7422,33.4844 -3149,13.5333,33.6 -3150,13.6009,33.5419 -3151,13.739,33.4831 -3152,13.8248,33.4581 -3153,13.7597,33.4626 -3154,13.5873,33.5585 -3155,13.8232,33.4954 -3156,13.3203,33.3655 -3157,13.6434,33.9054 -3158,13.5,33.7 -3159,13.6262,33.4615 -3160,13.5992,33.9198 -3161,13.6153,33.483 -3162,13.6659,33.4792 -3163,13.418,33.66 -3164,13.5144,33.5934 -3165,13.3951,33.2419 -3166,13.8782,33.444 -3167,13.5717,33.5335 -3168,13.5704,33.6367 -3169,13.542,33.605 -3170,13.756,33.4765 -3171,13.571,33.5459 -3172,13.5798,33.5644 -3173,13.5459,33.6002 -3174,13.5673,33.5648 -3175,13.7141,34.2841 -3176,13.7063,33.4964 -3177,13.816,33.532 -3178,12.9896,33.9742 -3179,13.01,33.9847 -3180,13.1667,33.9167 -3181,13.15,33.927 -3182,13.1106,33.6772 -3183,11.4461,26.136 -3184,10.334,26.217 -3185,11.2775,25.1461 -3186,11.484,24.35 -3187,12.3326,24.1735 -3188,11.4174,25.7186 -3189,12.017,24.6024 -3190,11.4634,31.2299 -3191,11.7291,28.3558 -3192,11.4494,28.2004 -3193,12.0463,29.6505 -3194,11.0167,29.7166 -3195,10.6364,30.3797 -3196,13.45,22.45 -3197,12.4329,22.442 -3198,12.1278,22.6033 -3199,12.1,22.549 -3200,12.483,23.2597 -3201,12.3826,23.136 -3202,14,32.3167 -3203,13.1333,32.7667 -3204,13.26,32.74 -3205,13.2601,32.74 -3206,12.5904,32.8008 -3207,13.0601,33.0373 -3208,13.1809,32.74 -3209,13.065,32.9328 -3210,13.1167,32.8167 -3211,13.1419,32.6245 -3212,13.1833,32.6497 -3213,13.1748,32.659 -3214,13.1711,32.6671 -3215,13.1636,32.6573 -3216,-26.0038,31.8068 -3217,-26.6667,31.9333 -3218,-26.8167,31.9333 -3219,-26.8714,31.9881 -3220,-3.2923,36.825 -3221,-3.464,35.919 -3222,-3.5,35.8333 -3223,-6.823,39.2697 -3224,-6.8034,39.2725 -3225,-6.8167,39.2667 -3226,-6.818,39.279 -3227,-6.8159,39.2656 -3228,-6.8514,39.2298 -3229,-6.8208,39.2616 -3230,-6.8394,39.2194 -3231,-6.8365,39.2389 -3232,-6.7167,39.2167 -3233,-6.8212,39.2414 -3234,-6.7138,39.21 -3235,-6.8108,39.2596 -3236,-6.7637,39.2453 -3237,-6.7886,39.2557 -3238,-6.8113,39.2562 -3239,-6.7922,39.2545 -3240,-6.8397,39.2609 -3241,-6.839,39.259 -3242,-6.8382,39.2765 -3243,-6.919,39.249 -3244,-6.84,39.28 -3245,-6.8771,39.2531 -3246,-6.8754,39.2496 -3247,-6.837,39.2697 -3248,-6.8737,39.2661 -3249,-6.8622,39.2505 -3250,-6.8788,39.2456 -3251,-5.9833,35.3167 -3252,-6.5896,35.7001 -3253,-6.442,35.985 -3254,-6.3147,35.8854 -3255,-6.3526,35.8413 -3256,-6.3732,35.9561 -3257,-6.176,35.735 -3258,-5.943,35.976 -3259,-5.9072,35.9546 -3260,-6.216,35.983 -3261,-6.2155,35.6827 -3262,-6.1506,35.9182 -3263,-6.105,35.8612 -3264,-5.949,35.916 -3265,-4.9068,35.7898 -3266,-7.099,35.966 -3267,-7.9282,35.6522 -3268,-8.2919,35.5963 -3269,-1.682,31.5609 -3270,-1.8281,31.4751 -3271,-1.7531,31.7048 -3272,-1.894,31.343 -3273,-1.6747,31.699 -3274,-1.8449,31.3647 -3275,-2.0361,31.3575 -3276,-2.1042,31.5854 -3277,-1.8397,31.6544 -3278,-1.7757,31.385 -3279,-1.6324,31.5554 -3280,-1.7073,31.4312 -3281,-2.5122,30.6558 -3282,-4.584,30.099 -3283,-5.2,30.194 -3284,-3.1974,37.2333 -3285,-3.4309,37.271 -3286,-3.4374,37.2968 -3287,-3.283,37.1493 -3288,-3.4202,37.2997 -3289,-3.3504,37.1581 -3290,-3.2324,37.1946 -3291,-3.503,37.409 -3292,-3.536,37.48 -3293,-3.4004,37.3146 -3294,-3.39,37.36 -3295,-3.3833,37.3667 -3296,-3.4167,37.3667 -3297,-3.4866,37.3574 -3298,-3.529,37.343 -3299,-3.433,37.3971 -3300,-3.4175,37.5121 -3301,-3.3667,37.3167 -3302,-3.3209,37.3295 -3303,-3.3385,37.343 -3304,-3.37,37.3387 -3305,-3.75,37.6 -3306,-3.8,37.4667 -3307,-4.267,38.049 -3308,-4.2667,38.0667 -3309,-4.27,38.0486 -3310,-4.366,38.05 -3311,-4.25,37.8666 -3312,-8.5167,37.3667 -3313,-4.2167,35.75 -3314,-4.1723,35.7523 -3315,-4.2334,35.415 -3316,-3.841,35.7 -3317,-3.834,35.7 -3318,-4,35.7789 -3319,-4.2833,35.6167 -3320,-3.9958,35.7623 -3321,-4.0333,35.7 -3322,-4.216,35.749 -3323,-4.116,35.7218 -3324,-4.2717,35.7602 -3325,-4.4166,35.516 -3326,-4.4587,35.4785 -3327,-3.6506,37.3561 -3328,-3.6889,37.3009 -3329,-1.6039,33.9484 -3330,-2.154,34.6855 -3331,-1.3333,34.1667 -3332,-9.555,33.944 -3333,-8.9662,32.3108 -3334,-8.1627,36.6906 -3335,-8.098,36.482 -3336,-8.141,36.681 -3337,-8.088,36.683 -3338,-8.1462,36.6829 -3339,-8.435,36.017 -3340,-8.224,36.311 -3341,-8.0677,37.1259 -3342,-8.1086,36.669 -3343,-7.8833,36.8667 -3344,-8.393,36.248 -3345,-8.2515,36.2137 -3346,-8.2089,36.2503 -3347,-8.3933,36.1614 -3348,-8.1167,36.65 -3349,-7.9784,36.9808 -3350,-7.8723,36.8741 -3351,-8.3768,36.092 -3352,-8.151,36.922 -3353,-8.282,36.332 -3354,-8.199,36.299 -3355,-8.1544,36.393 -3356,-8.1509,36.4035 -3357,-8.233,36.166 -3358,-8.21,36.35 -3359,-8.1402,36.6812 -3360,-8.243,36.495 -3361,-8.0032,36.837 -3362,-8.2833,36.2833 -3363,-8.1353,36.429 -3364,-7.4584,36.5359 -3365,-6.844,36.989 -3366,-6.7869,37.1361 -3367,-6.8407,37.1505 -3368,-6.76,37.1846 -3369,-6.8591,37.217 -3370,-6.6651,37.3868 -3371,-6.2536,37.549 -3372,-6.3,37.45 -3373,-8.383,36.666 -3374,-8.2164,36.6913 -3375,-8.168,36.809 -3376,-8.2265,36.6864 -3377,-8.483,36.699 -3378,-8.5253,36.5179 -3379,-9.034,36.845 -3380,-8.615,36.332 -3381,-8.5229,36.5162 -3382,-8.5096,36.5237 -3383,-8.2684,36.6828 -3384,-8.202,36.695 -3385,-8.3876,36.6617 -3386,-8.283,36.672 -3387,-8.3861,36.6744 -3388,-8.39,36.6685 -3389,-8.8967,36.7173 -3390,-8.2597,36.55 -3391,-8.9427,36.139 -3392,-8.3076,36.6783 -3393,-8.203,36.713 -3394,-8.2832,36.6771 -3395,-8.9,36.8833 -3396,-8.153,36.835 -3397,-8.2692,36.6813 -3398,-8.3851,36.6716 -3399,-8.76,36.4 -3400,-8.2097,36.6934 -3401,-8.274,36.595 -3402,-2.9582,32.3416 -3403,-2.865,32.165 -3404,-2.5908,33.4462 -3405,-2.4768,33.478 -3406,-2.8333,33 -3407,-2.5798,32.6296 -3408,-2.659,32.639 -3409,-2.0299,33.0339 -3410,-6.4533,38.8974 -3411,-6.58,38.82 -3412,-6.462,38.951 -3413,-6.565,39.031 -3414,-6.5456,38.8342 -3415,-6.598,39.066 -3416,-6.501,38.866 -3417,-6.585,38.846 -3418,-6.516,38.982 -3419,-7.35,38.899 -3420,-8.0087,38.9877 -3421,-7.116,31.132 -3422,-7.9511,31.6154 -3423,-2.75,34.5 -3424,-3.826,32.587 -3425,-5.7435,34.8314 -3426,-5.0187,32.826 -3427,-4.9167,32.8333 -3428,-5.051,31.791 -3429,-5.649,37.949 -3430,-5.294,38.622 -3431,-5.4333,38.0167 -3432,-5.3,38.55 -3433,-4.65,38.047 -3434,-5.1445,38.4562 -3435,-4.8167,38.232 -3436,-4.883,38.233 -3437,-5.1327,38.3952 -3438,-5.1558,38.4503 -3439,-4.642,38.082 -3440,-4.847,38.184 -3441,-4.8833,38.2833 -3442,-5.1024,38.4755 -3443,-4.4292,38.3054 -3444,-4.6667,38.3333 -3445,-5.1759,38.7918 -3446,-5.0986,38.6316 -3447,-4.649,39.181 -3448,-5.2738,38.6752 -3449,-4.967,39.132 -3450,-5.2833,38.8333 -3451,-5.1666,38.7833 -3452,-4.865,39.148 -3453,-5.198,38.746 -3454,-4.95,39.1333 -3455,-5.2193,38.6585 -3456,-5.4167,38.7167 -3457,-5.069,39.094 -3458,10.733,0.399 -3459,10.183,0.399 -3460,10.5,0.5 -3461,10.651,0.182 -3462,10.842,0.042 -3463,2.235,33.532 -3464,1.9929,32.7119 -3465,1.9926,32.7195 -3466,2.1081,32.5428 -3467,1.8927,32.5428 -3468,3.2,31.0333 -3469,0.807,30.113 -3470,0.8,30.097 -3471,0.775,30.062 -3472,0.727,30.056 -3473,0.883,30.17 -3474,0.8,30.1833 -3475,0.8064,30.1247 -3476,0.907,30.182 -3477,0.9,30.2333 -3478,1.0507,30.5393 -3479,0.95,30.2667 -3480,0.855,33.917 -3481,0.462,33.236 -3482,0.563,33.237 -3483,0.5256,33.3064 -3484,0.438,33.203 -3485,0.4273,33.2031 -3486,0.4376,33.2218 -3487,3.6877,33.5879 -3488,-1.2633,29.9887 -3489,-1.284,29.866 -3490,-1.1667,29.8167 -3491,0.6667,30.1333 -3492,0.716,30.199 -3493,0.549,30.299 -3494,1.8606,33.277 -3495,-0.427,32.505 -3496,-0.223,32.342 -3497,-0.749,29.699 -3498,1.1427,31.6024 -3499,3.3519,33.3384 -3500,0.6173,30.6328 -3501,2.253,32.899 -3502,0.3754,31.2273 -3503,-0.0833,32.6 -3504,-0.6333,31.5667 -3505,-0.85,29.999 -3506,0.7775,34.0165 -3507,0.7696,34.0261 -3508,0.773,34.018 -3509,0.867,34.103 -3510,0.632,34.199 -3511,0.706,34.171 -3512,0.4384,32.5971 -3513,-14.6581,28.0723 -3514,-14.9883,28.3757 -3515,-14.9833,28.4833 -3516,-14.6558,28.7943 -3517,-14.4167,28.4167 -3518,-14.1092,28.0985 -3519,-15.0329,27.1121 -3520,-15.0667,25.9936 -3521,-15.2282,27.3485 -3522,-13.6324,32.6455 -3523,-12.366,33.183 -3524,-15.3833,28.6959 -3525,-15.2895,28.5138 -3526,-15.406,28.718 -3527,-15.4336,28.7987 -3528,-15.0735,29.6137 -3529,-15.8889,29.0443 -3530,-15.2008,30.1904 -3531,-15.2018,30.1612 -3532,-15.3498,28.3188 -3533,-15.43,28.311 -3534,-13.935,26.689 -3535,-12.646,26.7001 -3536,-16.435,26.807 -3537,-16.35,26.8833 -3538,-16.366,26.75 -3539,-16.434,26.783 -3540,-16.4687,26.9396 -3541,-16.3469,26.8887 -3542,-15.3475,26.8811 -3543,-16.1893,28.1826 -3544,-15.7622,28.1436 -3545,-15.9091,27.5656 -3546,-15.8812,27.5839 -3547,-16.2183,27.2998 -3548,-16.0271,28.8509 -3549,-16.1612,28.7464 -3550,-16.1674,28.7525 -3551,-5.0088,39.7709 -3552,-4.947,39.747 -3553,-4.9622,39.6974 -3554,-4.9742,39.7785 -3555,-4.95,39.783 -3556,-5.0955,39.8083 -3557,-5.1467,39.8155 -3558,-5.0972,39.7745 -3559,-5.246,39.772 -3560,-5.302,39.799 -3561,-5.2481,39.7707 -3562,-5.1791,39.7634 -3563,-5.4209,39.6895 -3564,-5.4016,39.6918 -3565,-5.949,39.299 -3566,-5.87,39.28 -3567,-5.879,39.258 -3568,-5.9231,39.3566 -3569,-5.9337,39.2945 -3570,-6.0255,39.2141 -3571,-6.233,39.35 -3572,-6.0987,39.2972 -3573,-6.1713,39.3136 -3574,-6.366,39.466 -3575,-6.3424,39.4938 -3576,-6.1659,39.2247 -3577,-6.1667,39.1986 -3578,-6.164,39.201 -3579,-6.0904,39.2246 -3580,-6.2667,39.2667 -3581,-6.049,39.216 -3582,-6.1238,39.2541 -3583,-6.133,39.249 -3584,-6.2036,39.2519 -3585,-6.22,39.28 -3586,-6.2034,39.2077 -3587,-6.253,39.259 -3588,-6.1938,39.2636 -3589,-6.1071,39.2632 -3590,-6.1919,39.2298 -3591,-6.15,39.265 -3592,-6.267,39.249 -3593,-6.066,39.266 -3594,-6.1,39.266 -3595,-6.15,39.25 -3596,-6.0437,39.2499 -3597,-6.2298,39.2583 -3598,-6.18,39.2344 -3599,-21.248,32.348 -3600,-19.194,32.838 -3601,-18.3667,32.9333 -3602,-18.2606,32.5726 -3603,-16.3382,30.9601 -3604,-15.6274,30.4192 -3605,-16.0439,30.3713 -3606,-17.2364,31.6843 -3607,-17.5833,31.1833 -3608,-16.7105,32.7584 -3609,-16.9151,32.6276 -3610,-17.2201,31.9329 -3611,-17.0721,31.9489 -3612,-16.0501,28.8794 -3613,-16.15,29.4333 -3614,-16.5218,28.8509 -3615,-21.065,31.666 -3616,-21.1,32.2333 -3617,-21.164,31.547 -3618,-21.0333,32.15 -3619,-20.8506,32.1022 -3620,-20.6699,31.2224 -3621,-20.3643,31.555 -3622,-20.4346,31.299 -3623,-17.6247,27.342 -3624,-18.0397,27.1238 -3625,-18.4,27.1667 -3626,-18.0828,26.7178 -3627,-18.0667,26.7167 -3628,-17.8672,25.5025 -3629,-18.7184,27.5563 -3630,-22.0765,30.6492 -3631,-18.2167,28.9338 -3632,-17.9,28.7 -3633,-18.2189,28.9406 -3634,-17.9413,28.2121 -3635,-18.9201,29.8237 \ No newline at end of file diff --git a/data-raw/old_vignettes/create_mosquito_data.R b/data-raw/old_vignettes/create_mosquito_data.R deleted file mode 100644 index c801a472..00000000 --- a/data-raw/old_vignettes/create_mosquito_data.R +++ /dev/null @@ -1,33 +0,0 @@ -library(tidysdm) -set.seed(123) -## Raster of climate -library(pastclim) -# SubSaharan Africa -species_vec<- terra::vect("POLYGON((-19.36 22.12,38.17 22.10,38.96 19.53, - 40.76 16.98,43.71 12.12,52.36 13.59,54.30 7.03, - 30.39 -34.59,15.28 -36.31,-19.18 13.59,-19.36 22.12))") -# climate variables to consider -climate_vars <- c("bio01","bio04", "bio06","bio12", "bio13","bio18", "lai") -climate_present<-pastclim::region_slice(time_bp = 0, - bio_variables = climate_vars, - data="Beyer2020", - crop=species_vec) -terra::writeCDF(climate_present,"./inst/extdata/ssafrica.nc", overwrite=TRUE) -## Locations -library(readr) # for importing data -aarab <- read_csv(system.file("extdata/arabiensis_wk_coordinates.csv",package="tidysdm")) %>% - select(-ID) %>% relocate(latitude, .after=longitude) -aarab <- aarab[(cellFromXY(object = climate_present, xy = as.matrix(aarab[,1:2]))) %in% - cells(climate_present),] -# thin to one per cell -aarab_thin <- thin_by_cell(aarab, climate_present) - -base_presences <- aarab_thin[sample(1:nrow(aarab_thin),500),] %>% - bind_rows(aarab[sample(1:nrow(aarab),200),]) %>% mutate(class="presence") - -all_locations<-sample_pseudoabs(base_presences,n=500, raster=climate_present) - -plot(climate_present[[1]]) -points(vect(all_locations[,1:2], geom=c("longitude","latitude"))) -write.csv(all_locations, - "./inst/extdata/arabiensis_coords.csv",row.names = FALSE) diff --git a/data-raw/old_vignettes/example_using_additional_tidymodels_features.Rmd b/data-raw/old_vignettes/example_using_additional_tidymodels_features.Rmd deleted file mode 100644 index c73f1390..00000000 --- a/data-raw/old_vignettes/example_using_additional_tidymodels_features.Rmd +++ /dev/null @@ -1,282 +0,0 @@ ---- -title: "Example of additional tidymodels features" -output: rmarkdown::html_vignette -#output: rmarkdown::pdf_document -vignette: > - %\VignetteIndexEntry{Example of additional tidymodels features} - %\VignetteEngine{knitr::rmarkdown} - %\VignetteEncoding{UTF-8} ---- - -```{r, include = FALSE} -knitr::opts_chunk$set( - collapse = TRUE, - comment = "#>" -) -``` - -# Additional features of `tidymodels` - -In this vignette, we illustrate how a number of features from tidymodels can -be used to enhance SDMs. - -# Preparing your data - -We start by reading in a set of presences for a mosquito, *Anopheles arabiensis* in Africa. - -```{r load_presences} -library(tidysdm) -library(stacks) -library(readr) # for importing data -arabiensis <- read_csv(system.file("extdata/arabiensis_wk_coordinates.csv",package="tidysdm")) -``` - -We remove the ID column, as it is not relevant: -```{r clean_data} -arabiensis <- arabiensis %>% dplyr::select(-ID) -``` - -We now need to extract climatic variables for this species. We use the -present reconstructions from `pastclim`, subsetted to the region of interest -(Sub Saharan Africa). - -```{r load_climate} -library(pastclim) - -# climate variables to consider -climate_vars <- c("bio01","bio04", "bio05","bio06", "bio07", "bio08", "bio09", "bio10", "bio11", "bio12", "bio13", "bio14", "bio16", "bio18","bio17", "bio19","npp", "lai", "rugosity") - -# SubSaharan Africa -sub_s_africa <- terra::vect("POLYGON((-19.36 22.12,38.17 22.10,38.96 19.53, - 40.76 16.98,43.71 12.12,52.36 13.59,54.30 7.03, - 30.39 -34.59,15.28 -36.31,-19.18 13.59,-19.36 22.12))") - -climate_present<-pastclim::region_slice(time_bp = 0, - bio_variables = climate_vars, - data="Beyer2020", - crop=sub_s_africa) -``` - -Environmental variables are often highly correlated, and collinearity is an issue -for several types of models. Subset to variables with less than 0.7 correlation - -```{r choose_var_cor} -vars_to_keep <- filter_high_cor(climate_present, cutoff = 0.7) -vars_to_keep -``` - -Subset the raster to only include these variables (it would be better to use a bit of biology): - -```{r} -climate_present<-climate_present[[vars_to_keep]] -``` -Note that we could do the above in a `tidy` way using `tidyterra`. However, -using native `terra` commands tends to be more efficient, which can be important -when using large rasters. - -Convert our dataset into an `sf` data.frame so that we can easily plot it -(here `tidyterra` shines): -```{r cast to sf} -library(sf) -arabiensis <- st_as_sf(arabiensis, coords = c("longitude","latitude")) -st_crs(arabiensis) = 4326 -library(tidyterra) -ggplot() + - geom_spatraster(data=climate_present, aes(fill=bio01))+ - scale_fill_terrain_c() + - geom_sf(data = arabiensis) - - -``` - -Now thin the observations to have a one per cell in the raster (it would be better -if we had an equal area projection...), and remove locations outside the -desired area (e.g. Madagascar): -```{r thin_by_cell} -set.seed(123) -arabiensis<-thin_by_cell(arabiensis, raster = climate_present) -nrow(arabiensis) -``` - -Now thin further to remove points that are closer than 70km (note that -the standard map units for a lonlat projection are m!): -```{r thin_by_dist} -set.seed(123) -arabiensis<-thin_by_dist(arabiensis, dist_min = 70000) -nrow(arabiensis) -``` - -Let's see what we have left of our points: -```{r} -ggplot() + - geom_spatraster(data=climate_present, aes(fill=bio01))+ - scale_fill_terrain_c() + - geom_sf(data = arabiensis) -``` - -Now sample pseudoabsences (we will constraint them to be at least 70km away -from any presences), selecting as many points as presences: -```{r} -set.seed(123) -arabiensis <- sample_pseudoabs(arabiensis, - n=nrow(arabiensis), - raster=climate_present, - method=c("dist_min", 70000)) -``` - -Let's see our presences and absences: -```{r} -ggplot() + - geom_spatraster(data=climate_present, aes(fill=bio01))+ - scale_fill_terrain_c() + - geom_sf(data = arabiensis, aes(col = class)) -``` - -Now let's get the climate for these location -```{r climate_for_locations} -arabiensis <- arabiensis %>% - bind_cols(extract(climate_present, arabiensis, ID=FALSE)) -``` - -# The initial split - -Ok, we are now ready to split our data. It is wise to set the seed of the random -number generator every time we do any sampling, so that our code is fully -repeatable. We will use retain 20% of the data (1/5) for the testing set, and -use the rest for training. - -```{r initial_split} -library(tidysdm) -set.seed(1005) -arabiensis_initial <- spatial_initial_split(arabiensis, prop = 1/5, spatial_block_cv) -autoplot(arabiensis_initial) -``` - -# Fit the model to the training set - -We can now extract the training set from our `arabiensis_initial` split, and sample -folds to set up crossvalidation (we use the same grid we used on the full -dataset `arabiensis` for the `initial_split`) -```{r training_cv} -set.seed(1005) -arabiensis_training <- training(arabiensis_initial) -arabiensis_cv <- spatial_block_cv(arabiensis_training, v = 5, - cellsize = grid_cellsize(arabiensis), - offset = grid_offset(arabiensis)) -autoplot(arabiensis_cv) -``` - -Next, we need to set up a `recipe` (*class* is the outcome, -all other variables are predictors; note that, for `sf` objects, `geometry` is -automatically ignored as a predictor): -```{r recipe} -arabiensis_rec <- recipe(arabiensis_training, formula=class~.) -arabiensis_rec -``` - -Build a `workflow_set` with our models, defining which hyperparameters we want to -tune. - -```{r workflow_set} -arabiensis_models <- - # create the workflow_set - workflow_set( - preproc = list(default = arabiensis_rec), - models = list( - # the standard glm specs - glm = sdm_spec_glm(), - # the standard sdm specs - gam = sdm_spec_gam(), - # rf specs with tuning - rf = sdm_spec_rf() - ), - # make all combinations of preproc and models, - cross = TRUE - ) %>% - # set formula for gams - update_workflow_model("default_gam", - spec = sdm_spec_gam(), - formula = gam_formula(arabiensis_rec)) %>% - # tweak controls to store information needed later for stacking - option_add(control = control_ensemble_grid()) -``` - - -We can now use the block CV folds we built earlier from the training dataset to -tune and assess the models: -```{r tune_grid} -set.seed(1005) -arabiensis_models <- - arabiensis_models %>% - workflow_map("tune_grid", resamples = arabiensis_cv, grid = 5, - metrics = metric_set(roc_auc), verbose = TRUE) -``` - -Note that `workflow_set` correctly detects that we have no tuning parameters for -*glm* and *gam*. We can have a look at the performance of our models with: - -```{r} -autoplot(arabiensis_models) -``` - -Not let's stack the models to build an ensemble - -```{r build_stack} -set.seed(1005) -arabiensis_stack <- - # initialize the stack - stacks() %>% - # add candidate members - add_candidates(arabiensis_models) %>% - # determine how to combine their predictions - blend_predictions() %>% - # fit the candidates with nonzero weights (i.e.nonzero stacking coefficients) - fit_members() - -autoplot(arabiensis_stack, type = "weights") -``` - -And finally, we can make predictions on the testing data with: - -```{r predict_test} -arabiensis_testing <- testing(arabiensis_initial) -arabiensis_test_pred <- - arabiensis_testing %>% - bind_cols(predict(arabiensis_stack, ., type="prob")) -``` - -And look at the goodness of fit with AUC - -```{r assess_test} -roc_auc(data= arabiensis_test_pred,truth=class,.pred_presence) -``` - -# Projecting to the present -```{r plot_present} -prediction_present <- predict_raster(arabiensis_stack, climate_present, type="prob") -ggplot() + - geom_spatraster(data=prediction_present, aes(fill=.pred_presence))+ - scale_fill_terrain_c() + - geom_sf(data = arabiensis %>% filter(class=="presence")) -``` - - -# Projecting to other times - -We will project the leopard range to a different time. We will get the climate -for the Last Glacial Maximum, using the `pastclim` package. - -```{r get_lgm} -climate_lgm<-pastclim::region_slice(time_bp = -21000, - bio_variables = vars_to_keep, - data="Beyer2020", - crop=region_outline$Africa) -``` - -And predict using the ensemble: -```{r plot_lgm} -prediction_lgm <- predict_raster(arabiensis_stack, climate_lgm, type="prob") -ggplot() + - geom_spatraster(data=prediction_lgm, aes(fill=.pred_presence))+ - scale_fill_terrain_c() -``` diff --git a/data-raw/old_vignettes/leopard_coords.csv b/data-raw/old_vignettes/leopard_coords.csv deleted file mode 100644 index 83e151d1..00000000 --- a/data-raw/old_vignettes/leopard_coords.csv +++ /dev/null @@ -1,9042 +0,0 @@ -ID,Latitude,Longitude -3457197781,29.420513,79.777341 -3457188262,-25.345096,31.848709 -3457180557,-2.291742,34.795187 -3457151189,12.038577,76.113951 -3457146004,-1.473459,35.356953 -3457087960,-24.414767,31.232768 -3457082297,-3.132618,35.388422 -3457071881,-23.758426,31.460971 -3457070028,12.897311,99.375695 -3456998586,-2.295744,34.954356 -3456994369,-2.595131,34.961712 -3456971193,-23.801261,28.355023 -3456927418,29.487922,79.696685 -3456834218,-26.314446,20.599918 -3456655719,-26.29784,20.505169 -3456518459,-2.310705,34.950237 -3456480045,-1.933027,34.65481 -3456462731,-0.176635,30.147279 -3456431671,-1.866809,29.808768 -3456402804,-18.713893,21.786514 -3456350582,-1.98595,34.789089 -3456347943,-2.355008,34.845942 -3456252419,-12.189622,38.185535 -3456236097,-2.226091,34.836632 -3456085920,-17.995288,25.025137 -3456060386,7.836714,80.749407 -3455993643,-24.426727,31.589933 -3455926441,-18.372674,25.85985 -3455741347,-1.249267,35.157351 -3455695926,-1.41103,35.022063 -3455668520,-25.345947,27.126889 -3455656198,-1.826574,36.0416 -3455632385,11.729622,76.496173 -3455629811,-1.929373,40.188711 -3455602135,-1.656128,35.198242 -3455592478,-1.290261,35.235623 -3455506339,-17.814636,25.062159 -3455480465,-2.218028,34.937031 -3455458369,-1.618017,12.88799 -3455398973,-2.633803,34.617103 -3455383423,-34.088932,18.847019 -3455376203,-2.93746,34.943262 -3455350663,25.893615,76.526761 -3455239417,-17.778765,28.050207 -3448525409,2.401869,31.503983 -3447324881,6.427213,81.572113 -3423962741,14.3534,75.7407 -3416085638,-18.654219,24.005182 -3416078324,-0.192041,30.180302 -3416039862,-25.477398,31.558285 -3416038660,-24.756993,31.975907 -3416010479,-27.865637,29.760852 -3415989705,-19.154105,23.753105 -3415848389,-1.210218,36.680595 -3415784426,-1.359035,36.788535 -3415754712,-2.302956,34.934137 -3415740948,-33.055748,19.105791 -3415708724,-19.133395,23.481227 -3415702544,-18.585673,24.116348 -3415692557,-1.646931,34.848627 -3415691402,-1.240164,36.682691 -3415689705,-2.336322,34.932958 -3415636518,-33.1946,19.010417 -3415555205,-22.135881,26.601718 -3415555007,2.363871,31.495072 -3415523747,-23.523777,30.948552 -3415392194,-21.154124,31.868722 -3415363050,-18.374619,35.229209 -3408237809,-33.762329,21.482955 -3408222079,0.330489,36.801065 -3407999957,-34.72341,19.55186 -3407945224,-32.606645,19.208011 -3399485880,-2.538724,34.892581 -3399418749,-18.951918,23.4453 -3399394407,-24.239707,31.770586 -3399318231,0.66301,36.815728 -3399314008,-2.422487,34.650411 -3399229581,-34.313023,19.465313 -3399027831,-2.300858,34.941146 -3398900398,-18.614357,16.81576 -3398898301,-1.525886,35.002023 -3398879361,-15.677231,29.364957 -3398848548,-1.594402,35.146244 -3398836185,-12.995043,31.724869 -3398769369,0.571623,37.65283 -3398693952,-3.513139,35.711376 -3391828302,-2.257723,34.932756 -3391675288,-2.219112,34.859517 -3391665731,-19.009379,23.860764 -3391599152,-19.171798,23.984114 -3391542176,-19.129021,23.880185 -3391527227,-17.954963,24.858379 -3391373956,-24.147376,31.652719 -3391339182,-33.11893,19.260248 -3391315708,2.257736,31.550055 -3391311113,-23.055482,31.202697 -3391299109,-24.00019,31.394626 -3391290132,-23.835737,31.651845 -3389651926,6.45396,81.204636 -3389603005,-0.214233,29.910965 -3389599792,-27.687176,32.281952 -3389279294,12.909202,99.628914 -3389267769,-25.325407,31.69693 -3389105318,-25.162979,31.617205 -3389050156,3.7156,33.678097 -3389025523,-0.044289,30.067863 -3388985762,-7.672205,38.085823 -3388916169,-20.823332,16.646803 -3388853913,-20.504522,14.421712 -3388839651,-25.162979,31.617205 -3388828807,2.416888,31.770405 -3388721750,2.416888,31.770405 -3388228196,-25.162979,31.617205 -3388219391,-7.708951,34.874725 -3388018159,-7.708951,34.874725 -3387994224,-24.517139,31.245804 -3387961366,-24.995159,31.592989 -3387690851,2.416888,31.770405 -3385142488,12.124831,76.048339 -3385077087,34.141746,73.582732 -3384992301,-33.769035,19.084216 -3384984652,-33.811282,22.890466 -3384972302,-25.072917,31.461751 -3384964134,10.286389,18.068846 -3384923395,-1.760873,12.850505 -3384873749,33.642872,73.062434 -3384846753,-24.764204,31.644192 -3384742782,-25.252667,27.002585 -3384739562,-0.389102,36.081897 -3384734322,33.646969,73.126525 -3384715742,33.752191,73.187724 -3384674490,-32.702952,19.309284 -3384633535,-23.992277,31.598976 -3384527431,-1.226177,36.707685 -3384496482,-25.228981,27.169747 -3384459255,-1.411152,35.096648 -3384420354,-1.446615,35.059488 -3384410854,34.040683,73.422378 -3384407810,32.845086,74.246124 -3384395600,-24.567505,31.50664 -3384386180,33.859976,73.37566 -3384352187,-13.174637,31.989723 -3384344055,34.910884,45.620407 -3384238003,12.169398,76.536449 -3384234763,33.741461,73.068095 -3384183709,-24.283669,31.485939 -3384172471,-1.610875,12.802738 -3384097169,33.846638,73.211923 -3384080658,-24.007736,30.693567 -3384046744,32.812385,74.298513 -3384036437,-17.930304,25.314172 -3384007014,33.708608,73.032983 -3383893835,-32.00632,18.903193 -3383875184,-33.930233,22.975588 -3383869295,25.464946,73.294855 -3383856639,-22.916635,29.43063 -3356347068,-6.368216,34.885195 -3355798491,-25.299841,31.760536 -3355795640,-25.315535,31.644678 -3355739095,-2.359133,34.804935 -3355556518,-25.201212,31.770172 -3355414830,-1.294682,35.087638 -3355327082,-2.242521,34.900364 -3355262423,-2.24461,34.671267 -3355258020,-3.130606,34.654866 -3355230114,6.297386,81.580734 -3355221236,2.228969,31.479487 -3355201252,-24.712595,31.506122 -3355180850,-3.088214,34.792725 -3355169584,-19.187146,16.107733 -3355128526,-18.944786,16.299759 -3355101948,7.895111,80.54879 -3355093132,6.370897,81.531466 -3355083093,-3.87746,38.219781 -3355076964,-23.969085,31.139958 -3355051147,6.227657,81.588955 -3355049881,-1.462487,35.074074 -3349643210,28,79 -3344144910,-18.723545,23.592796 -3344131956,-18.735789,23.468722 -3344085774,-24.09356,31.529314 -3343960169,-19.097457,29.151409 -3343937669,-24.110664,30.614956 -3343927881,-12.985448,31.868363 -3343892611,-12.968613,31.826232 -3343889986,-18.94849,22.781313 -3343880377,-24.4369,31.324749 -3343874304,-24.787794,31.519566 -3343769694,-18.876433,22.648573 -3343745500,-32.997183,19.542788 -3338099522,-19.380369,22.527846 -3338095476,-24.6727,31.877836 -3338090948,-19.258534,22.563535 -3338042510,-1.34336,34.843515 -3338035547,-18.360215,23.935584 -3337933461,-19.004651,23.864189 -3337910811,-28.207257,32.534426 -3337872167,-25.07477,31.460281 -3337860989,-19.266999,22.476652 -3337749036,-18.28302,20.899027 -3337743728,-25.103586,31.3958 -3337689482,-32.566905,19.019486 -3337679131,-18.312194,23.83582 -3337553176,-2.316883,34.98388 -3337529600,-23.846628,31.561885 -3337524600,-25.067047,31.919902 -3337399236,-25.704393,20.526586 -3337374027,-26.143385,20.499348 -3335542500,-19.519998,22.886085 -3335498551,-19.208274,22.918973 -3335415762,34.102844,77.533093 -3335406021,-2.606478,34.663546 -3335336685,-34.040067,23.056732 -3335227573,-18.879746,23.795889 -3334781707,27.002382,91.346924 -3334781695,27.44725,90.82106 -3333914797,30.61,34.8 -3333908397,30.87,34.79 -3333110553,-8.123452,112.97376 -3330729179,-21.530415,15.763895 -3330584341,-24.765816,31.592138 -3330548367,-24.755737,31.206393 -3330510109,33.669835,73.124948 -3330430502,-33.4377,23.542147 -3330411071,-24.688992,31.277894 -3328079571,26.97529,75.839861 -3327991846,34.158482,73.308499 -3327970763,-25.293601,31.40925 -3327835083,-20.922638,16.798181 -3327815609,-24.840218,31.368558 -3327797642,-24.944672,31.752867 -3327699768,33.613591,73.112772 -3325775739,34.058809,73.449064 -3325757366,-20.83748,16.641209 -3325708821,-0.974053,36.501069 -3325688230,-22.381918,28.838918 -3325650079,-25.221214,31.861276 -3325620515,11.7879,-11.245882 -3325584188,-25.323269,31.488856 -3325567209,-24.667734,31.683947 -3325564687,-24.938633,31.571575 -3325562902,-13.190831,31.629177 -3325550034,33.656608,73.05745 -3323284516,11.375619,76.752711 -3321264571,33.740643,73.079204 -3321115764,30.067221,80.232825 -3320949007,-29.822452,17.409158 -3314633344,33.650817,73.101219 -3314619373,-23.933843,31.434581 -3314456415,-18.963675,17.181423 -3314383225,33.624866,73.069975 -3314306478,-32.502223,19.321306 -3314295460,-33.805452,18.950461 -3314242585,33.620523,73.004414 -3307491913,35.896172,71.75568 -3307334433,-32.591222,19.270055 -3307302162,-1.800444,34.681865 -3307210018,-25.010351,31.964714 -3307210014,-25.106155,31.91852 -3307171289,-25.151056,30.18642 -3307132916,-27.673711,32.239155 -3302488282,-24.620195,31.563709 -3302426693,25.123421,73.01354 -3302422817,-24.635163,31.50118 -3302410511,10.80497,19.829961 -3302396573,-28.279689,32.279791 -3302391434,-28.306957,32.241032 -3302381985,-23.906378,31.442925 -3302371116,33.626333,73.096084 -3302196338,-24.088221,31.650309 -3302107913,33.696482,73.019501 -3302031239,-13.194107,31.761419 -3301980423,-24.396844,31.979704 -3301930329,-25.112228,31.429155 -3301912194,-23.848249,31.485294 -3301910881,-2.311532,34.609473 -3301869433,-13.00292,31.680524 -3301857967,-2.733343,34.96222 -3301848657,-2.40756,34.991599 -3301840414,-7.728027,110.028546 -3301839508,25.024121,73.028896 -3301834894,-25.201794,31.598509 -3301824515,-24.127915,31.685146 -3124865823,-2.277669,34.859175 -3124799319,-23.843093,31.53755 -3124702435,-32.566345,19.152615 -3124648028,-23.830282,31.4178 -3118494576,30.255981,66.617894 -3118490665,34.152498,73.477928 -3118466510,-2.244356,34.966619 -3118419645,35.957074,71.610234 -3118358372,33.656595,73.194856 -3118327631,-0.015677,30.182383 -3118319499,-24.678016,31.544019 -3118308385,-1.628842,12.939321 -3118287167,33.63762,73.185312 -3118259278,33.712606,73.037828 -3118254205,10.204489,76.820966 -3117869849,-18.847961,16.529559 -3117858301,35.287781,45.323579 -3113679354,-23.80399,31.59342 -3113678446,-24.986679,31.494854 -3113657343,35.046536,45.761624 -3113628318,12.535632,77.787328 -3113592707,-32.481179,19.309051 -3113489440,-24.894769,31.481278 -3113437268,-23.986032,31.719843 -3113345922,-22.349413,15.177251 -3112918618,-34.152102,18.870816 -3112840476,-1.688631,12.907654 -3112703325,-1.677303,12.923416 -3112677981,-1.530801,35.14698 -3112656515,-19.277094,23.556039 -3112535657,-34.617457,19.544657 -3112399488,-1.715442,12.967864 -3112382652,-32.538658,19.147035 -3112327798,-30.396448,30.441205 -3109315869,21.154098,70.442951 -3109305042,-24.681942,31.728949 -3109228317,-22.92582,31.175724 -3109004221,-24.89188,31.690599 -3097353721,-25.463609,31.525745 -3097338673,-23.959495,31.583645 -3097312376,-20.456696,25.03809 -3097279783,-23.590225,31.499426 -3097277962,0.447872,37.413381 -3097271440,-18.978939,29.142442 -3097271369,-20.518534,25.09037 -3097251423,-20.437214,25.167438 -3097173360,-20.422148,25.127745 -3097144372,-20.573446,25.063583 -3097068384,-20.46759,25.002926 -3097051373,-20.555954,25.070191 -3097037360,-20.491818,25.127085 -3096990404,-20.537353,25.130454 -3090950548,-1.58261,35.09569 -3090923427,-2.571833,34.963453 -3090864473,-2.559751,34.865029 -3090860577,-24.824948,31.640517 -3090859414,-1.508573,34.975176 -3090812504,-3.152056,35.145631 -3090804500,-0.194422,30.008754 -3090783653,-23.940423,31.528886 -3090767090,-24.958963,31.631468 -3090766493,-3.18506,35.086915 -3090748127,-24.999882,31.644089 -3090736605,-0.544236,29.697138 -3090690442,-2.69573,34.6424 -3090688414,-1.448734,34.884126 -3090668108,-24.821047,31.475472 -3090632437,-2.56037,34.966886 -3090628709,-24.873158,31.725755 -3090626479,-2.774599,34.763396 -3090618560,-2.7799,34.718061 -3090610631,-2.42948,34.862893 -3090599427,-1.595055,34.951146 -3090598745,15.41666,99.324587 -3090566671,-23.991712,31.535491 -3090564484,-1.414599,34.825204 -3090544458,-1.695828,34.928296 -3090531933,-33.882563,23.510661 -3090531417,-1.441722,34.83009 -3090524635,-3.073543,34.817257 -3079894348,-23.17833,31.330746 -3079871737,-33.486589,23.583255 -3079695396,-23.168038,31.385601 -3079686742,-25.066721,31.527911 -3079637666,-25.022713,31.707845 -3079595774,-33.465678,23.588535 -3079575580,-1.297645,34.87151 -3079536699,-25.161858,31.586589 -3070736396,-18.10004,24.911391 -3070629556,-24.358927,31.651057 -3070587758,2.358585,31.503407 -3070572835,-23.374489,31.249149 -3070572710,-4.184923,36.011059 -3070563954,-15.81175,34.71272 -3070522780,-23.828969,31.536825 -3070432768,-23.905757,31.456913 -3070403818,-23.835037,31.444318 -3070377548,-24.777528,16.946587 -3070373980,-15.849241,34.692617 -3070305379,-33.661561,18.882526 -3070282708,-18.60748,24.071071 -3070281429,-33.669681,18.572002 -3068128469,-33.912413,19.005235 -3068123995,-23.9298,31.524438 -3068119459,-24.525698,31.552139 -3068106428,-24.587483,31.418705 -3068068645,-18.88177,16.746538 -3067990553,-34.251885,19.090602 -3067871400,-22.657924,31.143168 -3067867178,-18.876944,15.690421 -3067714071,29.754187,79.154892 -3067668825,-24.902,31.413486 -3067660530,-33.786698,26.203218 -3067610629,-22.706747,31.194135 -3067606602,-25.088128,31.42564 -3067589563,-25.110346,31.735776 -3061762879,-25.347459,31.85747 -3061744852,-2.226887,36.304317 -3061695582,-24.909855,31.760797 -3061651822,-25.361244,31.778057 -3061575530,-23.873131,31.244186 -3059133354,-24.331893,16.115433 -3059131385,-2.411817,34.922243 -3059127510,0.575052,37.442709 -3059116569,-27.748294,32.221261 -3059110713,-3.946878,35.893667 -3059095424,0.18791,37.558873 -3059020045,-23.945854,31.5549 -3059017919,-25.3467,27.027854 -3059017913,-24.918818,31.655298 -3058996661,-24.816019,31.472454 -3058988926,-27.08948,32.485891 -3058974996,-8.696361,34.500511 -3058947360,-18.835731,16.249098 -3058852960,-24.932804,31.48385 -3058848305,-27.405242,31.398316 -3058808960,-23.916089,31.446927 -3058751964,-2.431706,34.991281 -3058748072,0.675328,37.589873 -3058712917,-19.577133,23.793244 -3058711858,-19.011352,16.722926 -3044948549,-32.245079,19.081019 -3044912431,-2.392284,34.8926 -3044906930,-13.361534,31.929353 -3044896906,-28.39145,31.864605 -3044808929,-1.370116,34.906075 -3044808235,6.229288,81.498326 -3044802637,-24.635553,31.49597 -3044732480,-24.518779,31.339664 -3044717948,-1.296283,34.908905 -3044691603,-33.875859,19.375094 -3044632989,-2.276262,34.876688 -3044623445,-24.578877,31.350146 -3044579164,6.23203,81.528846 -3039497674,-25.357178,31.59863 -3039496926,-24.100042,30.863055 -3039492547,-24.56802,31.491237 -3039470592,-24.410302,31.101668 -3039467720,-24.933754,31.851092 -3039458655,-24.570942,31.537601 -3039445508,-24.025154,30.407849 -3039434749,23.703174,81.176878 -3039379187,0.53224,37.562742 -3039366124,-24.861151,31.72336 -3039363882,-1.817538,34.661846 -3039320432,-19.215969,16.137887 -3039320115,-24.902014,31.543377 -3039307767,-18.975475,16.687669 -3039307375,-23.952303,31.55502 -3039234699,-20.755875,32.133715 -3039213808,-24.566575,31.14383 -3039185193,-3.097491,35.514433 -3039184186,-0.120347,30.081118 -3034592121,12.046612,76.626831 -3034583818,27.3587,94.8999 -3034580356,19.150966,72.883129 -3034569853,27.3561,94.899 -3034563658,21.1706,70.5964 -3032166648,-28.350752,32.542407 -3032162609,-27.916219,32.303495 -3032150359,-18.70938,24.434166 -3032131348,-2.271097,34.81247 -3032111561,-25.082618,31.239713 -3032064526,-25.103043,31.337505 -3032027473,-24.84613,31.534931 -3031992976,-1.582733,35.055904 -3031936630,-24.107073,31.430775 -3031933601,29.52971,78.867265 -3031918049,-1.43834,35.399978 -3031902329,-23.585291,24.152466 -3031889610,-25.053174,31.237227 -3031876498,-19.236864,23.155421 -3031787729,-24.052809,31.594023 -3031766682,-24.052237,31.483128 -3031750230,-25.325493,31.61835 -3031717479,-25.069161,31.381822 -3031713372,-18.736489,24.483226 -3031645183,-2.337196,34.944572 -3031637287,-18.652086,24.559983 -3031625239,-2.200934,34.87676 -3026472435,-12.9736,31.537001 -3026106885,-8.933333,27.2 -3026060009,-8.933333,27.2 -3026043024,0.666667,29.733333 -3026042008,2.866667,30.85 -3026036452,2.866667,30.85 -3026028497,1.233333,30.466667 -3025850501,0.46667,25.55 -3025827095,0.46667,25.55 -3025820388,-1.383333,29.033333 -3025798737,2.7,30.55 -3025755108,9,39.5 -3025735304,-8.933333,27.2 -3025695998,-8.933333,27.2 -3024404061,-8.933333,27.2 -3024400381,0.46667,25.55 -3024396442,2.7,30.55 -3024395983,-8.933333,27.2 -3024395173,0.666667,29.733333 -3024393225,0.46667,25.55 -3024388143,-8.933333,27.2 -3024386398,1.233333,30.466667 -3024381844,2.866667,30.85 -3024377223,9,39.5 -3024373196,-8.933333,27.2 -3024370705,2.866667,30.85 -3024357955,-1.383333,29.033333 -3018140825,-25.428252,31.561446 -3018127572,-32.571828,19.123998 -3018109616,12.181483,76.120732 -3018063568,-32.551974,19.014053 -3018051591,-32.409471,19.162853 -3018020201,-2.841407,35.022085 -3018009572,-32.404232,19.097574 -3018003605,-32.474941,19.138994 -3017999254,-3.863286,35.974093 -3017964743,-2.949291,38.177078 -3017948589,-32.482409,19.004589 -3017941628,-25.054099,30.808246 -3014053280,11.824211,76.120149 -3014044607,-1.248164,35.413381 -3014029730,8.531391,79.918343 -3014004782,24.541517,79.889466 -3013950211,-25.097863,31.876888 -3013864881,-24.997088,31.449887 -3008564591,-24.948421,31.523803 -3008561584,-18.422145,24.150323 -3008556942,-25.356427,31.499384 -3008554134,-32.40911,19.031949 -3008552922,-24.815425,31.624725 -3008540123,-32.562885,19.177699 -3008531107,12.199781,76.662795 -3008522744,-1.411837,34.998743 -3008513028,8.436621,80.07414 -3008510592,-25.020826,31.440101 -3008473128,-34.184387,18.824078 -3008468944,-25.061534,31.473481 -3008466864,-24.711165,31.653472 -3008446950,8.457456,80.194153 -3008444871,6.21631,81.489911 -3008420870,-24.117617,31.752296 -3005198755,0.584168,37.579707 -3005168796,-25.041175,31.749142 -3005103876,-24.944784,31.426713 -2999164081,-0.177413,30.061208 -2999153217,11.866492,76.159039 -2999082188,-25.036206,31.292884 -2999070627,25.11523,73.158602 -2992872108,-18.674732,24.486999 -2992821113,-18.637212,24.551206 -2992814951,-33.669764,24.593662 -2992765063,-14.548588,26.14966 -2992671833,-25.25202,31.313759 -2992665650,-3.14675,38.361709 -2988699341,-15.851701,34.674806 -2988654832,-26.365685,20.412056 -2988556010,-15.172862,25.957809 -2988497155,13.689801,79.571411 -2988392742,-20.745194,16.752164 -2988331137,-24.901088,31.652125 -2988268912,-1.7023,35.338599 -2984567951,-23.147453,31.488714 -2984536913,-24.900363,31.723805 -2984528806,-24.539073,31.963339 -2984512958,26.834065,75.723504 -2984441992,6.56387,81.57963 -2984437519,26.070641,76.458144 -2984424901,6.38727,81.265641 -2984409472,0.533118,37.451598 -2984393555,-33.480075,23.446078 -2981187343,-19.130275,27.34843 -2981073740,-24.321658,31.679497 -2980973793,-24.287937,31.641885 -2980869100,-23.129309,31.397473 -2980825272,-1.988247,30.770633 -2980784032,6.20358,81.475983 -2980776889,-15.904099,34.67871 -2963954144,-24.869348,31.411134 -2963949120,-1.341469,34.981665 -2963900128,-25.159997,31.401732 -2963885638,-15.987559,34.798092 -2963862834,-19.278958,16.158688 -2963860713,6.220334,81.387884 -2963860666,6.286385,81.47213 -2963837130,11.96532,76.219135 -2963837025,-1.388321,34.9415 -2963805021,-25.323647,31.803039 -2901878302,-17.930849,25.188747 -2901861302,-21.443035,23.649611 -2901850363,-22.299336,16.824306 -2901836332,6.217508,81.56389 -2901741312,-25.452114,31.475145 -2901718789,34.050541,75.172121 -2901690119,-24.673555,31.241789 -2901632305,-19.192851,23.538636 -2901605294,-24.52115,31.620554 -2901584644,-21.370476,31.922792 -2901581850,-22.719944,31.191393 -2901566459,3.777061,29.137691 -2901559268,-23.982018,31.571214 -2898527637,-0.38288,36.012186 -2898518770,6.462333,81.244558 -2883243693,26.010945,91.632087 -2883174750,-1.320885,35.109571 -2883101831,-1.244847,35.09629 -2883076806,-1.287114,35.071654 -2883032439,-0.394742,36.919998 -2882985896,6.599062,81.341042 -2874046334,-23.57923,31.551362 -2873947670,-1.611903,35.314272 -2873750688,-2.489581,34.92875 -2868356903,-24.107854,31.559325 -2868242079,-24.561875,31.504717 -2868228476,-25.287831,27.693303 -2868221103,-24.082194,31.189328 -2868196690,-25.034239,31.220466 -2868093769,-0.204447,36.175634 -2864805735,-2.222674,34.964728 -2864735665,-24.9986,31.765233 -2864562653,-24.125223,31.195543 -2862608376,-2.566551,34.838048 -2862568814,-24.389393,31.71747 -2862523122,-18.691765,24.453625 -2862418342,21.10113,70.968384 -2862359204,-2.832774,38.136159 -2862328568,21.78963,79.362613 -2862301279,12.29372,76.415924 -2862287586,21.76927,79.210195 -2860240502,11.605778,76.789137 -2860181130,6.465021,81.733048 -2860176075,6.323987,81.460813 -2860173758,-2.638378,34.823243 -2860140838,-20.923907,16.627764 -2860134945,-1.451635,35.078532 -2860124720,-2.561661,34.857098 -2860036450,-25.299967,31.440732 -2859962719,-24.28469,31.57708 -2856851461,-2.203977,34.864017 -2856765663,2.387293,31.51649 -2856716945,-15.779213,29.32629 -2856675534,-18.266658,24.008361 -2856625750,-25.042988,31.70137 -2856619035,12.210831,77.674534 -2856615506,20.54984,75.644082 -2856570730,-25.851234,20.759356 -2856553585,-2.629201,34.976819 -2856488923,-2.388702,34.963772 -2851301467,-25.191423,31.873893 -2851300472,-24.733715,31.570841 -2851298519,-25.114639,31.846242 -2851296507,-24.773451,31.567931 -2851287500,-24.995377,28.105998 -2851285602,-24.963341,28.048913 -2851285480,6.41552,81.311929 -2851283652,-24.922604,28.162941 -2851283651,-25.402983,31.529034 -2851280524,-25.035922,31.881583 -2851278820,-22.866938,29.770937 -2851276549,20.36076,79.276693 -2851272952,29.519851,78.756343 -2851265506,-25.28238,27.119483 -2851259586,-24.486436,31.634637 -2851257593,-24.643747,31.556219 -2851251888,-22.940113,29.630676 -2851248677,-25.547333,31.57776 -2851243541,-24.706759,31.995865 -2851241529,-23.13213,31.398448 -2851239688,29.439178,78.646523 -2851238505,-24.988423,28.149511 -2851235541,-24.843524,28.163853 -2851235540,-24.603295,31.564733 -2851210004,0.418549,37.449133 -2851207253,-24.976051,28.276904 -2851197048,26.160759,76.494395 -2851196170,26.084061,76.457579 -2851194305,-0.61933,35.573844 -2851185477,-24.954913,28.183423 -2851182548,-24.840621,28.079594 -2851175640,-24.871507,28.050657 -2851171550,-24.969497,28.153563 -2851159595,-24.908636,28.091119 -2851155558,-24.829363,28.089554 -2851126083,0.57887,37.538575 -2851116555,-24.913947,28.124949 -2851112779,-23.611485,30.524216 -2851108752,-1.588672,35.057074 -2851100555,22.281307,80.692076 -2851094011,0.52214,37.430197 -2851086576,-24.817967,28.128224 -2851084423,21.690685,79.375769 -2851083433,22.516363,78.430567 -2851081422,22.525077,78.482669 -2851076831,-22.976856,29.677967 -2851074030,0.517935,37.479907 -2851073252,-24.997633,28.270568 -2851053416,21.782794,79.207811 -2851046450,26.939074,75.809065 -2851043806,26.862862,75.987867 -2851018674,-22.554765,17.492513 -2851018283,24.808479,73.048365 -2850964276,24.925164,73.172 -2850960517,-25.026403,31.436592 -2850929586,-24.685345,31.774653 -2850925508,-24.867027,28.150932 -2850920563,-24.89495,28.068292 -2850918583,-24.657322,31.402973 -2850915589,-24.959512,31.69578 -2850898518,-23.936742,31.553809 -2850887597,-24.498795,31.776245 -2850885442,-24.816319,28.157548 -2850876549,-24.252459,31.617474 -2850874544,26.85082,75.882165 -2850865513,-2.143444,35.138728 -2850858525,-24.606982,31.549355 -2850856615,-24.42628,31.950701 -2850852564,-25.134408,31.251097 -2850821402,6.547687,81.346499 -2850812619,-10.630067,33.992449 -2850808584,-24.82721,28.336911 -2850798383,22.446165,78.555625 -2850794762,13.807788,75.502362 -2850790509,-24.66844,31.72103 -2850786067,0.581392,37.527836 -2850784629,-24.982675,28.23959 -2850776040,0.49026,37.403048 -2850765128,26.100744,76.444974 -2850758440,21.797562,79.384503 -2850733507,26.947924,75.963213 -2850723418,-1.497199,35.049683 -2850721531,-24.963356,28.17878 -2850712852,12.016133,76.094983 -2850710471,21.764444,79.355763 -2850706424,22.580066,78.412904 -2850701713,-2.546371,34.914981 -2850655538,26.829806,75.803987 -2850637493,-24.847815,28.107729 -2850637378,-1.414559,35.170409 -2826505597,-25.352129,31.857131 -2826505306,35.573284,45.449244 -2826474870,0.538413,37.501157 -2826432572,-25.28997,31.843398 -2826430861,-1.240339,34.829421 -2826429864,-23.863154,31.013716 -2826428786,26.812375,75.840654 -2826392842,-18.972003,22.508326 -2826369790,-18.940626,22.460811 -2826334320,35.32293,45.21719 -2826310760,26.967806,75.921171 -2826298334,-2.222209,34.975002 -2826289567,6.459891,81.217524 -2826229569,-24.522807,31.595138 -2826219181,-24.392229,31.208267 -2826193123,6.582143,81.347086 -2826168041,-2.286246,34.963885 -2826167777,-20.858105,16.42163 -2826166309,-25.44621,31.474932 -2826138173,6.501972,81.346444 -2823431578,26.018772,76.579806 -2823398667,6.499225,81.311898 -2823397649,22.542146,78.441705 -2823394589,-24.671488,31.536663 -2823347317,3.698193,29.450242 -2823337222,30.435492,78.146875 -2823239390,-20.718725,23.503689 -2823202638,22.515405,78.411073 -2823202432,0.436745,37.583558 -2823137960,-20.278918,17.326195 -2823136636,-24.261808,30.815128 -2823123127,-33.711152,21.473891 -2823117379,-34.501943,19.275294 -2823065797,-1.437346,35.187411 -2818868345,-15.861844,34.782797 -2818732147,-1.401501,35.146898 -2818707603,12.177566,76.126204 -2818700723,-3.859846,35.982883 -2818619427,21.759157,79.317959 -2818606655,-15.880258,34.723592 -2818578083,21.763269,79.340745 -2818521593,12.009444,76.075822 -2818503287,20.578352,75.712228 -2814454915,-25.106543,31.484319 -2814436325,-0.969188,36.532475 -2814422921,-21.541197,16.338381 -2814410032,-28.332595,32.252514 -2814354022,43.058814,131.514897 -2814330760,-24.983896,31.733124 -2814250622,-28.035475,32.490969 -2814152932,6.463578,81.505237 -2814115855,-7.206911,108.254043 -2814098760,-2.240289,34.930128 -2814075248,-1.212754,34.946889 -2814064509,15.28191,73.862072 -2814027537,-24.436354,31.138194 -2813956431,-23.821953,31.485161 -2813953873,-23.806985,31.510414 -2813953508,-24.095643,31.047159 -2813902823,6.118067,81.06272 -2803167924,-13.004949,31.64136 -2803077162,-2.298944,34.64324 -2803064938,0.563264,36.952902 -2803062090,12.111024,76.189708 -2803044333,-25.130265,31.570922 -2802994311,-2.393143,34.822223 -2802990122,-2.39566,34.957743 -2802976511,-28.399882,32.567004 -2802935812,-2.913103,37.843342 -2802929539,-21.459763,27.003658 -2802904639,-24.581382,31.703849 -2802875434,0.579148,14.853462 -2802874496,-28.056241,32.515781 -2802847506,-2.309213,34.802039 -2802820768,29.919049,78.385987 -2802796411,-28.034211,32.582299 -2802765481,-33.632358,19.041137 -2802723559,-24.232214,31.716806 -2802720081,0.54783,36.863119 -2802694908,-13.123608,31.688773 -2802643716,-22.663402,31.037517 -2802625928,-13.140421,31.723663 -2802618234,-33.990921,22.535899 -2802604114,-22.674556,31.086128 -2802560542,6.585645,80.855012 -2802559568,-24.448107,31.763123 -2641621601,-1.389278,34.817477 -2641609350,-24.35332,31.602777 -2641559732,-25.52457,31.48236 -2641534686,37.45552,56.094123 -2641500845,-1.585447,35.03238 -2641496968,0.445137,36.658662 -2641444652,-1.56823,35.130403 -2641423708,-25.52242,26.907501 -2641393656,-1.549767,35.062114 -2641368849,-24.045286,30.59503 -2641359980,-1.134518,35.288612 -2641309046,-19.230051,22.652386 -2641304978,0.430877,36.864164 -2641303769,-0.36108,36.117385 -2634607485,-24.645761,31.965805 -2634571025,-19.335671,23.201325 -2634514879,-23.806178,31.596433 -2634507435,-1.123864,35.207807 -2634450659,21.080853,70.548307 -2634402605,-1.156643,35.293095 -2634301560,-19.035489,16.292113 -2634220859,-4.106736,36.061037 -2634220108,-14.652108,26.086756 -2634157612,-26.250537,20.408993 -2634154813,27.435073,85.21514 -2634149566,-15.515509,29.607697 -2634146052,-33.52104,19.035864 -2634056516,-14.778012,26.112814 -2634038167,-2.648819,34.93576 -2633976135,-14.415136,26.264094 -2626669250,-33.431495,19.067416 -2626662960,-17.848059,25.001021 -2626651838,-19.053635,27.173305 -2626642500,-1.49387,35.170823 -2626641895,-3.431766,35.658626 -2626609555,-24.686385,31.584755 -2626587710,-13.014624,31.721134 -2626549343,-22.648394,32.463317 -2626544278,-24.702403,31.489449 -2626516545,-23.955497,31.518794 -2626510228,-25.335826,31.447921 -2626451824,-2.562911,34.614955 -2626429808,-24.981116,31.744631 -2626410011,-18.718435,24.045953 -2626408868,11.543538,76.859004 -2626393252,1.710899,35.001934 -2626364638,-23.843991,31.569636 -2626318866,-1.53115,35.162558 -2626297637,-23.867755,31.547209 -2626265972,10.910471,19.761143 -2626236643,-1.59806,35.134091 -2626226999,-18.90493,22.647802 -2626208969,11.47365,76.80923 -2626202905,-15.972378,29.44561 -2620199456,-23.807727,31.470072 -2620104858,-13.069586,31.607868 -2620033551,-21.027805,31.80165 -2620009925,-24.203702,30.28734 -2619991682,-2.536186,34.994169 -2619872478,8.23801,80.171032 -2611427522,-3.011682,35.535687 -2611406997,-1.907634,34.644937 -2611367512,-24.92291,31.595773 -2611330306,26.128579,76.458199 -2611242208,-17.83849,25.169287 -2611217837,-24.497653,31.613055 -2611214130,6.56074,81.21932 -2611190874,-2.288249,34.79916 -2611179039,26.181734,76.557638 -2611134454,-24.372835,31.741563 -2611071709,0.445626,37.554097 -2611015737,-24.356747,31.780281 -2609293944,-23.96811,31.27986 -2609265964,-24.945744,31.649446 -2609205336,-24.469462,31.625455 -2609190954,0.547974,37.522801 -2609126153,-24.917544,31.605907 -2609125488,0.248631,37.590037 -2609097176,7.212801,35.554647 -2609096391,6.239206,81.541073 -2609078590,-23.682915,31.529855 -2603489568,-22.636864,31.10992 -2603401673,-24.380278,31.776384 -2603386127,-33.434566,23.556779 -2603385202,-25.189704,31.294652 -2603382364,-22.774887,31.019087 -2603360210,-25.193225,31.357142 -2603351160,-25.478976,31.483415 -2603347155,-32.57209,18.85802 -2603309171,-1.316319,35.399117 -2598683853,19.14975,72.872734 -2598682247,21.124305,70.824151 -2598682088,22.283037,80.618118 -2598681690,22.334513,80.611511 -2598681564,19.158371,72.873745 -2598677556,14.27879,75.691353 -2598674602,12.031422,76.120682 -2598673153,26.659422,91.001129 -2598671455,11.71426,76.109184 -2598671216,12.20669,77.625031 -2598670714,21.762953,79.339111 -2598668501,21.124306,70.82415 -2598668059,10.357455,76.883507 -2598666105,21.766171,79.328804 -2598663709,11.999634,77.139568 -2598663358,11.579799,76.582779 -2598662253,22.465134,78.012886 -2598661597,12.202858,77.555923 -2598661593,26.74599,91.020324 -2598659915,27.32849,76.43317 -2598658168,12.031422,76.120682 -2597959759,-2.37688,34.264892 -2597890504,21.636387,79.248333 -2597855505,21.611504,79.298017 -2597838991,-19.02298,16.374249 -2597777912,6.541768,81.573414 -2597744547,6.21849,81.474438 -2597703558,-28.735522,30.004854 -2596419175,8.312422,79.868693 -2596391190,8.212504,80.146798 -2596379142,6.594646,81.204209 -2596366180,6.229662,81.560741 -2596355075,12.082087,76.07824 -2596338040,-21.39728,23.914511 -2596335072,-8.690791,34.464799 -2596317308,-2.402816,34.828348 -2596301113,6.280859,81.407091 -2596279318,6.247184,81.53455 -2596277030,-20.228416,23.539138 -2596267282,-13.068694,31.911552 -2596179267,22.538978,78.239194 -2596161702,24.796228,79.928946 -2596147765,7.632425,80.901431 -2596110022,-24.861468,31.625884 -2596077659,-13.077483,31.956935 -2596073239,-13.014747,31.812473 -2580256638,-2.577155,34.621129 -2580215650,6.344053,81.569956 -2580128224,0.507285,37.580081 -2580102143,-6.789187,106.504527 -2579375507,-23.89953,31.520564 -2579366074,-24.255706,31.241275 -2579359830,-2.600506,34.902249 -2579321346,13.102534,-13.214342 -2579315492,-18.707387,24.54569 -2579266881,-25.114423,31.53673 -2579259864,-28.328863,32.535686 -2579244416,26.039298,76.562833 -2576441813,6.398128,81.572392 -2576441810,6.2147,81.441087 -2576348412,-27.775118,32.546687 -2576307439,2.29565,31.523359 -2576301540,-24.871524,31.557375 -2576265380,-1.915892,30.797061 -2574292575,6.214607,81.418725 -2574266052,-24.177745,31.017452 -2574217389,-23.635892,31.30409 -2574181746,-2.569205,34.869367 -2574142079,5.126744,102.782621 -2574139535,-24.045513,30.4342 -2574116451,-24.431632,31.93175 -2574071410,-2.470837,34.888302 -2574024994,-2.273689,34.529586 -2574020585,-24.581527,31.186928 -2574007399,-2.290005,34.810855 -2574004484,-28.333492,31.968502 -2573998044,-25.074848,31.867926 -2573955110,-1.383873,35.119805 -2573953782,-1.465708,35.060464 -2573865586,-0.081285,30.169187 -2573844394,-18.903473,22.695235 -2573824563,-28.368091,32.471946 -2573817557,-27.909844,32.085636 -2572268323,6.427213,81.572113 -2563657381,6.565526,81.43826 -2563651588,-1.495424,35.082477 -2563631836,-19.160913,15.827022 -2563588133,-20.893325,16.632051 -2563586494,-2.291895,34.932479 -2563570831,-22.62611,31.085791 -2563565208,-25.337167,31.925762 -2563554379,6.233169,81.52807 -2563553387,6.360694,81.407856 -2563525773,-1.210921,34.900847 -2563501470,-13.109634,31.815871 -2563497735,6.403982,81.542541 -2563492369,-19.406653,23.807646 -2562099996,6.427213,81.572113 -2557820518,-26.575022,20.65383 -2557820483,25.462894,72.293238 -2557792900,-21.052245,25.001418 -2557775744,-0.113861,30.192011 -2557759140,-23.835088,31.419355 -2557758477,-23.832532,31.493771 -2557743324,-22.037585,17.376077 -2550163293,-24.804755,31.4956 -2550143848,13.165572,-13.135952 -2550125041,6.343307,81.571619 -2550117713,-0.078596,30.194462 -2550066868,-24.926052,31.510843 -2550061561,-25.151409,31.976067 -2550059968,-24.18435,31.719537 -2543080986,-1.577469,35.025884 -2543075534,-28.196806,32.38319 -2543068934,-23.109172,31.341521 -2543068782,-23.150963,31.228689 -2543056057,-24.226973,31.746675 -2543055370,-22.910424,31.327847 -2543036928,-0.054223,30.039167 -2543028316,-28.320283,32.032899 -2542919948,-22.648112,31.101393 -2540882664,-24.894035,31.425099 -2540854414,-24.837788,31.643913 -2540852174,6.387111,81.201108 -2540809883,6.360863,81.3128 -2540807886,-24.771622,31.438239 -2540797417,6.572201,81.380563 -2540792015,-24.606576,31.577502 -2540789585,-19.116474,16.576749 -2540788865,-24.999911,31.515453 -2540778268,-2.670916,34.631362 -2540773850,-1.179501,35.337223 -2540757700,-24.847519,31.484998 -2540752723,-24.869643,31.44974 -2529402366,-19.046632,23.860119 -2529366282,6.481962,81.455857 -2529335171,-22.737542,31.10608 -2529308704,-2.47552,34.954777 -2529297371,-25.147168,31.774553 -2529290780,0.530673,37.495618 -2529279633,1.564337,34.851825 -2529252382,8.332885,80.025032 -2518145740,-24.800014,31.428058 -2518091713,6.690052,80.998583 -2518070229,36.645431,46.143723 -2518034565,7.594807,80.952355 -2518011607,-24.098254,31.619735 -2517988927,6.950886,80.966635 -2517986487,-2.544895,34.949099 -2517982928,37.340719,58.859196 -2465341981,-32.18744,18.909891 -2465340709,37.378894,56.113307 -2465205541,-25.116726,31.585037 -2465204509,-25.035614,31.541182 -2465204306,-25.30456,27.132271 -2465186732,-33.687033,20.221147 -2465148149,-23.905523,31.569604 -2465146339,-2.409399,34.87976 -2465039985,8.4,1.766667 -2465039219,8.4,1.766667 -2465039216,8.4,1.766667 -2460163603,-25.329691,31.284293 -2460149565,-23.847569,31.68812 -2460137848,-24.00848,31.796022 -2460126950,-23.809813,31.521117 -2460118580,-23.925247,31.252495 -2460061424,-25.227334,31.699514 -2460056129,-22.669831,31.029235 -2460046718,8.216266,80.010922 -2460041362,-24.127358,31.725813 -2460022701,-23.904632,31.043508 -2460017055,6.477159,81.459812 -2460013149,-24.763626,31.658508 -2456592143,-17.908678,25.062511 -2456585414,-24.17138,31.49772 -2456583320,-2.229568,34.981136 -2456581621,-28.286326,31.969371 -2456578205,-1.589284,34.856911 -2456574087,-24.848636,31.481517 -2456572889,-2.416142,34.911606 -2456570794,-24.289201,30.819613 -2456567952,-13.046582,31.621152 -2456567623,-13.108862,31.608758 -2456567234,-12.999137,31.874648 -2456566723,-7.607474,34.942937 -2456547627,0.724675,15.246859 -2456538558,-0.12113,30.056678 -2456535457,6.344505,81.426253 -2456535133,-28.392014,32.523951 -2456525920,-23.832791,31.517942 -2452372862,-18.766426,26.7628 -2451697062,-22.22879,29.349428 -2451690536,-21.918459,24.198984 -2449347112,-2.619326,34.747009 -2449346219,-1.508832,35.117188 -2447978060,-24.317015,31.694908 -2447976397,-24.226807,31.710142 -2447953305,15.714708,99.225931 -2447945952,-2.887024,34.987028 -2447941355,-25.964066,20.363708 -2447941284,-25.974123,20.292583 -2445142414,-33.548635,19.628397 -2445141508,-24.006617,31.682786 -2445136505,12.168593,76.13712 -2445128868,-0.122944,30.14067 -2445110866,-18.97016,16.9802 -2445103521,-24.265273,30.693883 -2445094558,19.214707,72.886893 -2445067221,-2.541628,34.766611 -2445060077,-25.328749,31.851946 -2445040456,10.583206,76.931985 -2445025389,-7.807923,35.151847 -2444991393,15.247746,74.34278 -2444989394,11.556358,76.637514 -2429613131,21.084831,70.828768 -2429610062,-33.34035,25.877297 -2429603590,-19.127685,23.608539 -2429602311,-19.178379,23.665905 -2429595185,-0.411085,36.071147 -2429592325,-24.497061,31.891824 -2429590814,-24.487862,31.612 -2429582107,6.20261,81.593711 -2429572664,11.313657,1.880764 -2429571742,11.373153,1.865217 -2429559504,-24.014094,31.351388 -2429546457,0.56194,37.459089 -2429536404,0.781204,36.943587 -2429531495,-23.889071,31.754423 -2429516620,-23.808776,31.675395 -2429438174,-23.853085,31.435797 -2429413916,6.553694,81.546347 -2429403160,0.414282,37.400585 -2429389290,0.335241,36.816332 -2429369706,0.533084,36.951218 -2429357396,-3.216457,38.738948 -2429354503,-20.988825,16.645004 -2429352852,-18.470283,23.490051 -2429349409,-19.187333,23.30014 -2429319256,-0.123043,29.961479 -2429314076,-20.935284,16.694594 -2429291392,-19.131181,23.26623 -2429291206,-19.136311,23.49035 -2429266388,-2.579831,34.87673 -2423262130,-20.168892,21.28089 -2423261637,-20.240028,32.342128 -2423259765,-20.980506,16.714039 -2423259755,-25.264074,27.152555 -2423259746,-19.449977,23.338035 -2423250446,-1.622523,34.844613 -2423250385,-1.74773,34.8543 -2423248164,-1.741012,34.932434 -2423245003,-3.891045,35.895604 -2423234808,-22.904178,31.39074 -2423231755,-24.299433,30.986495 -2423225694,-23.894028,31.536235 -2423106026,23.119362,78.251788 -2423105862,23.189637,78.369847 -2423094344,6.507882,81.379422 -2423090309,6.307924,81.443685 -2423065570,-28.223581,32.528284 -2423058440,-3.336261,35.568554 -2422990650,-1.998613,34.903923 -2422986384,-24.25488,31.961988 -2422985237,-1.471512,35.164537 -2422972079,-25.235609,31.778288 -2422964775,-25.908093,27.961952 -2422936346,-2.632543,34.922178 -2422928728,-1.552244,35.064173 -2422920994,-2.255516,34.830214 -2422901624,-21.413736,15.657118 -2422886880,-28.144784,32.472203 -2422886842,-18.758574,24.123484 -2422874953,-24.171218,31.082763 -2422865315,-2.60119,34.836061 -2422845203,-20.86242,16.789269 -2422821441,-33.047609,19.189312 -2422813588,-24.574799,31.903183 -2422757756,-32.590709,19.308828 -2422757602,-32.505061,19.121339 -2422757582,-32.461219,19.070414 -2422757571,-32.590208,19.001248 -2422757451,-32.425399,19.083855 -2422757401,-33.990851,20.603402 -2397704332,-1.726809,34.969084 -2397704258,-4.126092,36.100914 -2397704153,-1.944461,35.062508 -2397674603,-25.025776,31.860665 -2397638325,-18.6219,24.584016 -2397634979,-13.196871,31.629783 -2397590343,-2.266937,34.809942 -2397584199,25.130271,73.048898 -2397556765,-15.811298,34.607459 -2382318413,-0.5579,37.73 -2382317399,0.3305,38.0168 -2382317389,0.3235,38.0185 -2366114216,-2.471788,34.907281 -2366108752,-2.491474,34.90566 -2366062833,-3.382485,35.484791 -2366056670,-27.92888,32.254043 -2366050123,-25.203264,22.05185 -2366047793,6.325547,81.594687 -2366047249,-1.557454,35.009491 -2350445926,-18.797332,24.484455 -2350413927,-25.268115,31.846243 -2350394919,-24.853202,31.639933 -2331931279,21.313483,79.947463 -2331929350,-24.802976,31.412661 -2331929104,-25.159177,31.622743 -2331918961,-2.501474,34.880399 -2331903005,-23.98922,31.25161 -2331861796,26.142994,76.476862 -2331856628,-19.406805,23.767242 -2331855558,-14.339753,25.943823 -2331855108,-14.250712,25.844995 -2331854933,-19.451627,23.655601 -2331854357,-14.357489,26.033373 -2311419306,26.19692,76.558075 -2311398681,-23.88643,31.599923 -2311388971,-24.773012,31.540864 -2302332137,-28.309938,31.901592 -2294678377,-19.079531,23.431564 -2294673582,-24.089229,31.639714 -2294605494,-2.290294,34.894931 -2294583774,-3.290061,35.437575 -2294579163,-1.449967,35.167349 -2294558786,-1.590503,35.096084 -2294558087,-1.562472,35.162433 -2294557997,-1.422287,35.08686 -2294504442,-1.550421,35.202894 -2294485935,-23.870975,31.406125 -2294479351,-33.632358,19.118549 -2294440647,0.59023,36.996562 -2294406786,11.850555,76.033538 -2283281425,-2.479556,34.704252 -2283274082,-33.255344,25.642886 -2283256230,-32.548045,19.238631 -2283255770,-2.683919,34.765301 -2283249257,23.630061,81.14225 -2283245144,-25.256207,27.026711 -2283244607,-24.583059,31.774741 -2283218940,-3.587659,35.956768 -2283183333,-24.436911,31.463978 -2283159317,-1.581732,34.943576 -2283155003,-1.476763,34.881442 -2283107385,-24.07147,31.799568 -2283106548,-24.646972,31.579513 -2283105859,-24.963493,31.754103 -2283103404,-17.999536,25.07818 -2283060042,-17.942191,25.099637 -2273914973,14.09,105.34 -2273914220,14.03,105.29 -2273913788,14.03,105.29 -2273913619,14.02,105.32 -2273913519,14.03,105.29 -2273913517,14.02,105.32 -2273913467,14.02,105.32 -2273913321,14.02,105.32 -2273913232,14.02,105.32 -2273913190,14.02,105.32 -2273913187,14.02,105.32 -2273913086,14.02,105.32 -2273913071,14.02,105.32 -2273913011,14.02,105.31 -2273912915,14.02,105.31 -2273912881,14.02,105.32 -2273912877,14.02,105.32 -2273912855,14.03,105.29 -2273912729,14.02,105.32 -2273912679,14.04,105.31 -2273912635,14.02,105.32 -2273912624,14.02,105.31 -2273912609,14.03,105.29 -2273912575,14.02,105.32 -2273912499,14.04,105.31 -2273912386,14.04,105.31 -2273912309,14.02,105.32 -2273912266,14.03,105.29 -2273911784,14.01,105.3 -2273324584,-25.527546,31.570348 -2273324140,-25.486062,31.459586 -2273284980,-3.883685,36.12209 -2273281875,-24.103095,31.651836 -2273279645,-25.380024,31.478921 -2273271706,-12.161377,38.072543 -2273250280,-18.504785,22.266671 -2273242365,-24.805478,31.625944 -2273238866,-24.80282,31.67145 -2273228083,-23.953063,31.581841 -2273227192,-22.321467,28.903219 -2273225802,-22.321733,28.930853 -2273225474,-23.924455,31.415722 -2273224164,-19.046842,23.614142 -2269316619,-19.360884,23.756803 -2269311598,-24.113154,31.675177 -2269309076,-25.298563,27.074976 -2269290603,-2.529555,34.86877 -2269272903,-19.188354,23.727822 -2269248040,-13.13506,31.999584 -2269224554,-22.501106,28.920452 -2265884099,-13.07053,31.985801 -2265813611,-19.088451,16.304136 -2265812306,-23.841582,31.258651 -2265795123,-33.589253,23.683147 -2252064971,-33.857585,18.962337 -2252063937,-33.832508,18.991058 -2252063251,-33.913799,18.823316 -2252063186,-33.943408,18.982997 -2252063172,-33.868223,18.936181 -2252062252,-33.81428,18.847195 -2252048610,-25.499932,31.438996 -2252042130,-25.075315,31.543731 -2251938424,-0.175111,30.171199 -2251880323,-1.807508,37.297955 -2248833046,12.961,107.181 -2248832483,12.99,107.376 -2248832289,12.891,107.372 -2248832222,12.931,107.366 -2248832152,13.02,107.449 -2248832089,12.913,107.399 -2248832085,12.912,107.241 -2248831959,12.914,107.362 -2248831698,13.004,107.22 -2248830151,12.908,107.449 -2248830043,12.936,107.369 -2248829990,12.737,107.046 -2244283950,-24.431501,31.66776 -2244254626,23.769292,81.151806 -2244226431,-0.548124,36.182355 -2242951871,-25.110291,31.87634 -2239046861,-34.043743,18.956804 -2238943538,-28.081504,32.558716 -2238892497,6.587544,81.499117 -2238847108,6.358965,81.5462 -2238802164,6.336638,81.529367 -2237537677,-21.192143,14.781761 -2237501769,-0.401769,36.01595 -2237444708,8.316806,80.003825 -2237422461,2.119597,31.834673 -2236880722,6.509409,81.345926 -2236855986,-29.93367,17.585964 -2236841915,-23.079614,16.731897 -2236839269,-2.028603,34.697479 -2236292410,-3.039163,35.473094 -2236289385,-2.492483,34.954749 -2236287792,-24.450641,31.644986 -2236260039,-24.024039,31.733136 -2236244847,2.279321,31.585623 -2236236477,-0.119079,30.180417 -2235543261,6.769857,81.514557 -2235507494,-17.808725,25.172799 -2235502115,-19.258927,22.995164 -2235498494,-22.160446,29.123724 -2235027278,-1.573594,35.202942 -2235027042,-1.573594,35.202942 -2234763035,-2.216137,34.955563 -2028470142,-7.566481,35.28241 -2013005171,-19.250669,22.750193 -2012971926,-24.035068,31.721597 -2006093089,-2.471748,34.981278 -2006088373,10.846935,19.622794 -2006087768,-7.680977,34.902917 -2006061547,-1.51487,34.882508 -2006051544,6.207786,81.499515 -2005389789,-11.995481,32.333307 -2005388715,-27.638066,32.052376 -2005353968,-29.829535,17.541493 -2005344881,-29.839593,17.590139 -2005314894,-1.816549,30.607062 -2005314845,-1.909558,30.798699 -2005290988,6.493688,81.400801 -1993773865,-2.454857,34.921245 -1993771081,6.757637,81.613015 -1993763148,-24.107337,19.863359 -1993729290,-1.293361,34.99375 -1993721009,-2.213152,34.801391 -1990623261,-24.70981,31.449174 -1990623248,-32.44788,19.126246 -1990605815,-2.414185,34.864083 -1990604047,-2.652104,34.679109 -1990591569,27.482166,84.262253 -1990590491,-24.678616,31.912094 -1990581998,-11.876026,32.201273 -1990580040,6.509832,81.468595 -1990562401,-1.463283,34.856432 -1990510426,-2.68578,34.741783 -1990510201,-2.410461,34.981341 -1990509214,-2.390342,34.833731 -1987356929,28.7666,32.15 -1987354178,28.7666,32.15 -1987352414,28.7666,32.15 -1987350668,28.7666,32.15 -1987348609,28.7666,32.15 -1987348432,28.7666,32.15 -1987346775,28.7666,32.15 -1987344227,28.7666,32.15 -1987340158,28.7666,32.15 -1987339587,28.7666,32.15 -1987337868,28.7666,32.15 -1987337486,28.7666,32.15 -1987335763,28.7666,32.15 -1987335350,28.7666,32.15 -1987333874,28.7666,32.15 -1987330801,28.7666,32.15 -1987323480,28.7666,32.15 -1987323163,28.7666,32.15 -1987322948,28.7666,32.15 -1987321306,28.7666,32.15 -1987319769,28.7666,32.15 -1987313001,28.7666,32.15 -1987310489,28.7666,32.15 -1987308515,28.7666,32.15 -1987307199,28.7666,32.15 -1987306682,28.7666,32.15 -1987301800,28.7666,32.15 -1987301272,28.7666,32.15 -1987300422,28.7666,32.15 -1987299663,28.7666,32.15 -1987297795,28.7666,32.15 -1987296207,28.7666,32.15 -1987290246,28.7666,32.15 -1987283048,28.7666,32.15 -1987280249,28.7666,32.15 -1987277277,28.7666,32.15 -1987275696,28.7666,32.15 -1987275435,28.7666,32.15 -1987271248,28.7666,32.15 -1987270236,28.7666,32.15 -1987268339,1.90874,37.06667 -1987266303,28.7666,32.15 -1987262924,28.7666,32.15 -1987260675,28.7666,32.15 -1987257175,28.7666,32.15 -1987256662,28.7666,32.15 -1987255127,28.7666,32.15 -1987252832,28.7666,32.15 -1987252266,28.7666,32.15 -1987252174,28.7666,32.15 -1987251946,-12.2,15.86667 -1987248669,28.7666,32.15 -1987248278,28.7666,32.15 -1987247855,28.7666,32.15 -1987245651,28.7666,32.15 -1987245579,28.7666,32.15 -1987244188,28.7666,32.15 -1987243237,28.7666,32.15 -1987232975,28.7666,32.15 -1987232427,28.7666,32.15 -1987230829,28.7666,32.15 -1987230452,28.7666,32.15 -1986625965,-2.396515,34.85183 -1986625077,-2.564669,34.863905 -1986610819,-24.770564,31.876194 -1986597146,-3.92003,36.163329 -1986593430,-3.923754,36.138555 -1986580218,-18.140855,21.762399 -1986571745,12.052363,76.309652 -1986567501,-26.478671,20.62409 -1986559009,-2.695559,34.890098 -1986558085,-2.269739,34.822815 -1986557180,-2.553721,34.814543 -1986537911,-1.499494,35.002633 -1986534473,-1.53817,35.06741 -1986519218,-24.572718,16.164641 -1986496757,-32.50325,19.079548 -1986468678,-2.486436,35.023487 -1978865329,-2.46484,34.935237 -1978863090,-3.005155,38.311513 -1978855225,0.468728,37.596457 -1978853263,-19.393334,23.001079 -1978838451,-2.602113,34.793525 -1978818800,-33.090295,19.115497 -1978460629,-24.742649,31.873945 -1978454076,-3.196964,38.359883 -1978450474,-24.798198,31.801217 -1950021891,-24.373203,31.65617 -1950017294,-24.059919,31.764661 -1950017069,-24.556453,31.740037 -1950014957,-25.033667,31.526492 -1950010559,-17.972542,25.072955 -1948781419,-24.280773,31.206237 -1948776405,-17.898913,25.036998 -1948759234,-3.142411,38.256618 -1948759090,-3.100729,38.327687 -1948746843,-19.006643,23.988642 -1948745819,-19.164388,23.890193 -1946197509,-1.246552,34.967612 -1945464083,-24.801345,31.597762 -1945463705,-25.255891,27.060558 -1944388323,-3.428236,35.907724 -1944387715,-24.539426,31.853799 -1944384971,-3.976134,36.081867 -1935608434,-3.442056,38.010221 -1935608428,-3.472421,38.126473 -1935608424,-3.419705,38.118868 -1935608054,-24.943562,31.575353 -1935598280,11.854682,0.900604 -1935591334,-1.480368,34.802056 -1934837599,-18.573036,24.071732 -1934836357,-19.116625,23.827286 -1934836075,-19.116625,23.827286 -1933601877,-1.988049,37.364704 -1933601360,0.999192,37.329741 -1933599197,-2.769698,34.760323 -1933599178,-2.698883,34.627473 -1933598871,11.688059,76.470981 -1933597702,-2.442905,34.821326 -1933574503,8.434826,14.454144 -1933573412,-2.028213,34.894817 -1933567317,-1.515895,35.173932 -1933554170,-18.436846,24.143404 -1932317313,-18.185203,28.230577 -1932292398,-1.367,38.866 -1932292028,-1.367,38.866 -1932291847,-0.431207,36.08457 -1932291813,-0.431207,36.08457 -1932291613,-0.454957,36.112226 -1932291542,-0.431207,36.08457 -1932291397,-0.300719,36.102139 -1932291209,-0.47657,36.091374 -1932291204,-0.372414,36.053223 -1932291173,-0.419013,36.104646 -1932290993,-0.47657,36.091374 -1932290991,-0.372414,36.053223 -1932290974,-0.431207,36.08457 -1932290730,-0.35432,36.13606 -1932290690,-0.300719,36.102139 -1932290581,-0.35432,36.13606 -1932290195,-0.423507,36.068596 -1931527685,-18.710994,26.328896 -1931508095,-4.15161,36.129579 -1931423143,1.263,42.572 -1931422989,1.263,42.572 -1920841719,-25.042786,31.652909 -1914342310,-24.816276,31.556681 -1914243120,-23.944031,31.21934 -1913706765,-2.350431,34.972626 -1913696731,-24.404275,31.388429 -1913675692,-19.140632,23.872745 -1913675467,-19.070297,23.862484 -1913675110,-19.325036,23.02115 -1913220286,-1.573594,35.202942 -1913183542,-24.471894,31.709592 -1901053782,-0.620608,30.862177 -1901044407,11.828401,0.951388 -1901037867,11.762898,1.240195 -1899879341,0.57128,37.608948 -1899878904,-3.840019,36.074047 -1899878686,0.57128,37.608948 -1899878622,6.427213,81.572113 -1899878381,0.57128,37.608948 -1899805920,11.857638,0.801641 -1899805863,11.833354,0.86507 -1899805801,11.869257,0.983772 -1899799187,-6.918725,31.321712 -1891348090,11.842179,76.307258 -1891331861,-23.078107,29.048453 -1890720334,-19.006508,16.267926 -1890715002,-2.486106,34.905855 -1890714607,-2.473112,34.881552 -1890695540,-24.809923,31.629559 -1890682400,-18.804325,16.965495 -1890648763,5.533383,-8.516067 -1890648573,5.490012,-8.468184 -1890648431,5.458293,-8.47482 -1890648411,5.431936,-8.640077 -1890648334,5.423259,-8.704732 -1890648201,5.384451,-8.747652 -1890648176,5.408694,-8.581184 -1890647171,5.494328,-8.51219 -1890647093,5.488568,-8.504593 -1890647048,5.466459,-8.600932 -1890646848,5.402182,-8.688621 -1890646746,5.315902,-8.75768 -1890646729,5.306326,-8.705627 -1890646611,5.293239,-8.732537 -1890088938,-25.047009,31.414221 -1890088880,-25.045549,31.509627 -1883958206,3.722369,29.523836 -1883838892,8.304509,80.149467 -1883837709,8.304509,80.149467 -1883836547,-24.046465,31.420898 -1883836098,8.304509,80.149467 -1883569774,-24.058419,31.188482 -1883567762,0.888188,37.382286 -1883566304,-6.853963,31.312023 -1883565195,-17.9054,25.175696 -1883565192,-19.274839,23.29784 -1883549431,-0.0626,30.03701 -1883538339,-23.953554,31.545732 -1883524370,-1.39984,34.854041 -1883515188,-19.44247,15.933977 -1883474894,-32.317548,18.984674 -1883472924,-18.981319,16.770495 -1880661683,-19.359325,22.870093 -1880636879,-2.59762,34.819122 -1880616431,-2.574036,34.956114 -1880533396,-34.561996,19.402327 -1880525059,-1.104607,35.259117 -1880469408,-24.504716,31.405517 -1880463824,-3.080208,38.288268 -1880457016,-21.549476,15.540071 -1850983710,-19.223302,22.668984 -1850974939,-17.942763,24.971227 -1850950016,-1.243232,35.311403 -1850910441,-19.762938,23.351973 -1850897169,-33.987914,20.33574 -1850895926,-25.20435,27.081884 -1850892960,-34.039459,18.867918 -1848790495,-2.46742,34.837166 -1848769855,-28.242794,31.935547 -1847580858,-24.492918,31.607491 -1847508035,-24.242234,31.002927 -1847497519,3.653429,29.514076 -1847488548,-19.250186,23.896292 -1847466526,1.742924,35.1234 -1847454835,25.981494,76.291868 -1847436431,-19.53921,22.77611 -1847416732,6.874602,80.947942 -1844873004,1.263,42.572 -1841276081,-2.761314,34.848729 -1839243208,-33.291889,19.67191 -1839241987,-23.846824,31.382649 -1839237180,-25.026488,31.483546 -1839236419,-24.750557,31.690243 -1839226141,-22.857546,29.718708 -1839225708,-34.013647,18.829027 -1839225046,-32.506765,19.3609 -1839225038,-27.569618,31.231585 -1839223883,-28.025282,32.573737 -1839223865,-25.297656,27.074537 -1839222755,-13.096866,31.762462 -1839218527,-34.705235,19.54708 -1839215879,-21.440811,15.423257 -1839211848,-28.016073,32.446985 -1839211377,-28.066809,32.572628 -1839209288,-34.00639,18.991043 -1838415923,-25.011659,31.331664 -1838415810,-34.096074,18.953429 -1838414816,-24.55631,31.778677 -1838414814,-28.310712,32.588919 -1838409308,-24.573996,31.760538 -1838409291,-25.344355,31.731699 -1838404519,-24.884349,31.759684 -1838403467,-22.826172,29.783743 -1838400379,-34.593944,19.532447 -1838400373,-22.522325,28.448932 -1838398419,-34.014979,18.939593 -1838396353,-22.825676,29.786695 -1838395714,-32.48378,19.057285 -1838391859,-33.827122,18.978881 -1838378632,-24.505676,16.119019 -1838377872,-32.461263,19.175448 -1838377536,-22.962664,29.755735 -1838376961,-32.51578,19.016735 -1838375872,-24.51445,16.337759 -1838373918,-24.325049,31.713263 -1838372901,-32.190647,19.001188 -1838372096,-3.840958,35.709497 -1838371161,-18.986157,16.998472 -1838371141,-18.887587,16.857227 -1838371098,-18.942348,16.935717 -1838370885,-28.386462,31.917108 -1838370722,-33.92998,22.002446 -1838369530,-28.253598,31.919402 -1838369442,-28.306513,31.837772 -1838363850,-24.38606,31.772708 -1838363313,-21.578862,15.86121 -1838360622,-22.956893,29.630757 -1838360567,-22.898754,29.674189 -1838360279,-33.419022,19.093261 -1838360231,-22.861762,29.627683 -1838360188,-22.819586,29.777055 -1838351397,-24.48692,16.36834 -1838351378,-24.421565,16.305101 -1838351106,-24.551051,16.389413 -1838348688,-24.140967,31.679061 -1838348635,-24.298682,31.347318 -1838341294,-24.465136,16.202138 -1838341100,-23.865677,31.437112 -1838340786,-28.456067,17.152413 -1838340285,-34.191743,18.814228 -1838339351,-28.270639,16.994114 -1838335493,-34.196552,18.986983 -1838335141,-24.432814,16.35756 -1838325717,-24.525965,16.214585 -1838325642,-24.587535,16.330272 -1838321772,-34.293519,18.845376 -1838319530,-24.479808,16.247067 -1838317691,-34.10457,18.832355 -1838317560,-34.093243,18.992926 -1838315550,-34.052951,18.923289 -1838309850,-33.403113,19.49844 -1838309610,-24.588569,16.344444 -1838309570,-24.454646,16.235172 -1838308682,-24.211666,31.361314 -1838308125,-24.967094,31.696774 -1838308110,-25.448794,31.493659 -1838308070,-24.529011,30.812308 -1838066900,-33.489038,20.756497 -1838065567,-33.922072,23.583543 -1838059848,-24.541094,31.299127 -1838058924,-24.361878,31.21046 -1838055850,-32.254053,19.030105 -1838054802,-25.464522,31.575701 -1838053008,-33.717209,21.518823 -1838052380,-24.475727,16.30276 -1838037098,6.225815,81.568113 -1838022221,12.933855,99.534316 -1837777365,-22.589415,31.23195 -1837777332,-22.657244,30.990549 -1837750850,-2.677877,34.973779 -1837085157,-25.15238,31.911866 -1836661045,6.229435,81.490336 -1836596136,-24.30231,31.790536 -1836590979,3.673144,29.444167 -1836585249,-22.93991,31.345633 -1836577324,-0.37975,36.953591 -1836577285,-0.380978,36.175336 -1836575677,-24.052458,31.405334 -1831222714,7.807378,80.754055 -1831215158,-27.521998,31.223357 -1831190101,-2.576896,34.748422 -1831189610,-23.803328,31.546164 -1831186274,6.363616,81.498604 -1831172315,6.286951,81.469209 -1831017628,-1.598081,35.155478 -1831017620,-2.9964,37.984 -1808097536,-2.619326,34.747009 -1808082455,-26.467808,20.612453 -1808080627,27.57646,84.359894 -1808079973,-2.619326,34.747009 -1808063581,-2.000822,35.164318 -1808039004,-3.565506,35.748138 -1808033950,27.57646,84.359894 -1808029939,-7.708951,34.874725 -1808021256,-18.754915,17.088352 -1808014853,-7.708951,34.874725 -1808014842,6.427213,81.572113 -1807999094,-25.162979,31.617205 -1807981890,-2.977327,38.831177 -1807972656,-18.754915,17.088352 -1807964401,-3.264262,36.852951 -1807332704,-25.500967,31.448294 -1807330499,-34.279582,19.594561 -1807329725,-24.259176,31.684158 -1807329137,-0.286123,36.199856 -1807322253,-23.969154,31.499041 -1807321027,0.129764,37.025446 -1807320315,-1.566542,34.987947 -1807320197,-19.334387,22.622087 -1807302330,-24.951937,22.139193 -1807298678,-24.12812,31.723803 -1807293039,-25.20784,31.719353 -1807281096,-0.309425,37.072004 -1805419419,-15.484382,28.353218 -1805416080,-2.412461,34.676885 -1805379876,-19.098016,16.279766 -1805367194,3.609021,29.425665 -1802788136,-7.489325,34.991038 -1802788122,-7.497374,34.843464 -1802788094,-7.897097,37.884811 -1802785316,-23.097492,31.484159 -1802780234,-24.345788,31.692598 -1802772619,-25.209295,31.583439 -1802769317,-19.044952,27.288056 -1802758424,-34.213727,22.0265 -1802754403,-22.778039,31.025986 -1802754158,-22.368531,28.977614 -1802749902,-17.807604,25.042497 -1802740882,20.376673,79.290758 -1802740630,6.215363,81.427645 -1802740571,6.373638,81.542474 -1802728967,-19.284086,23.25166 -1802713534,3.786145,29.527965 -1802699210,6.496415,81.473696 -1802659942,-25.327648,27.008183 -1703225608,-26.3786,28.773279 -1703223863,-27.088092,32.445715 -1703205482,-24.225643,30.828135 -1703204628,-25.176349,31.519898 -1703189526,-24.197667,30.897317 -1703178939,-24.08007,30.8303 -1703178875,-24.057593,30.813841 -1703171551,-0.235845,36.822849 -1703166086,-27.13844,32.498806 -1703166056,-27.08703,32.591335 -1703155730,6.478424,81.586916 -1703140952,-1.714054,35.392986 -1702720473,-21.6,30.4 -1702720335,-22.9,32 -1702720221,-18.1206,30.5221 -1702488896,-27.003998,32.555892 -1702488813,-27.076942,32.511718 -1702488808,-27.075348,32.427244 -1702487670,-12.953995,31.931896 -1702487616,-12.914242,31.926739 -1702487457,-12.974996,31.819443 -1702487350,-12.938978,31.957927 -1702487336,-12.862086,31.96901 -1702487249,-12.963982,31.933308 -1702480723,-12.976857,31.820606 -1702479503,0.721926,37.422958 -1702479475,0.687379,37.569734 -1702467092,-25.081373,31.564624 -1702463572,-25.086767,31.542987 -1702453604,-12.566522,18.422469 -1699392713,-24.841825,31.761077 -1699388820,-27.061889,32.449898 -1677349825,-13.011415,31.774631 -1677345899,-3.185896,38.276736 -1677343439,6.35531,81.518806 -1677328987,11.56488,1.564261 -1677328986,11.444263,1.537137 -1677290500,-1.576537,35.081278 -1671734428,-1.586123,35.140765 -1671725648,-17.981181,24.826928 -1671724770,-19.461144,23.289156 -1668882484,0.237254,10.712727 -1668872893,-27.883384,32.295614 -1668871554,-24.008943,30.986512 -1668842544,-23.982674,31.584654 -1668842303,-27.038068,32.448679 -1668833327,-24.22821,30.855868 -1668831055,-27.888331,32.3905 -1668781299,-18.573036,24.071732 -1668780158,-25.080635,31.264812 -1668779236,-19.316328,23.851318 -1640133230,21.396048,70.482695 -1640121511,-25.417809,31.471899 -1640117842,-18.871151,16.719808 -1640115989,-18.658859,24.154181 -1640107751,-7.460326,34.932118 -1640103112,-7.230636,34.871291 -1640103023,-2.072038,34.64642 -1640101842,-3.918777,35.946331 -1640098173,-1.457882,36.901371 -1621790560,-19.079908,16.588555 -1621781764,-24.607242,31.703421 -1586955398,-19.009846,16.44231 -1586941506,-25.299246,27.101647 -1586936366,11.163862,1.786526 -1586936346,11.068698,1.673037 -1586936234,11.026507,1.648206 -1586931856,-25.225404,27.198404 -1586197818,0.57128,37.608948 -1586197639,0.57128,37.608948 -1586197063,-1.573594,35.202942 -1586154845,-26.164751,20.609116 -1586113588,-19.313563,22.784795 -1586110879,-1.52408,35.12441 -1586105562,6.280502,81.373864 -1584425831,6.334565,81.303748 -1584425806,6.25528,81.307683 -1580507869,11.129877,1.626862 -1580507833,11.025967,1.663288 -1580507815,11.065881,1.791315 -1580504947,-18.784157,24.502246 -1580494934,-1.494343,35.165933 -1580244836,-2.034361,35.022861 -1580244036,-0.341947,36.103821 -1580242593,-28.589346,20.269775 -1580238899,21.168085,70.637543 -1580232466,-25.412113,20.590696 -1580232151,-2.619326,34.747009 -1580231706,-4.077973,36.044769 -1580230209,-24.417767,31.514282 -1580227319,-4.077973,36.044769 -1580227151,6.791954,80.795433 -1580220992,-2.619326,34.747009 -1580217164,-24.375362,31.119375 -1580212521,6.925937,80.82206 -1580209184,-2.937597,35.473816 -1572380012,-1.288592,34.938001 -1572362654,12.13326,35.721389 -1572351685,-2.361779,34.72936 -1572345997,-13.04979,31.636814 -1572345944,-7.767424,34.8747 -1572345914,-19.36783,23.342475 -1572342066,-18.628365,24.110886 -1572342031,-18.935225,24.067553 -1572341697,-10.547197,33.721634 -1571201260,-18.767367,24.153279 -1571201248,-2.179962,35.107936 -1571201199,-24.094182,31.660247 -1571201198,-13.174391,31.618906 -1571201174,-13.116059,31.705652 -1571201164,-19.220636,23.263195 -1571201157,-18.714256,24.113059 -1571201129,-13.149747,31.710739 -1571198710,-7.761453,34.901424 -1571198695,-7.580063,34.853517 -1571190843,0.295219,38.03293 -1571188033,0.151258,36.981299 -1571187993,0.121927,36.873992 -1571132091,19.020915,72.825718 -1571132018,19.04695,72.906647 -1571131949,19.168127,72.94758 -1571121517,8.141268,79.994919 -1571081692,12.267125,2.404046 -1571081666,12.173716,2.360068 -1571081562,12.295506,2.277255 -1571081546,12.101484,2.270324 -1571081306,-19.55237,23.529512 -1571059847,-28.305132,31.925697 -1563446594,12.379421,2.441579 -1563443539,-18.58708,23.489277 -1562969982,-2.577766,34.811602 -1562956436,-19.319234,23.234808 -1562948414,-22.37981,23.474564 -1562940325,-20.166315,21.947493 -1562929057,11.75217,1.579128 -1562926731,11.359578,1.670309 -1562926718,11.303946,1.617941 -1562926631,11.133395,1.704793 -1562926606,11.062648,1.755349 -1562912642,0.49938,37.553863 -1562911254,12.040852,2.204211 -1562882238,-25.237895,27.146862 -1562881830,-7.507974,34.89559 -1562874388,-18.644027,24.192382 -1562874386,-17.989,24.95266 -1562871459,-13.040032,31.760043 -1500313052,26.685594,91.044776 -1500304193,-2.531828,35.07444 -1500236161,11.466392,1.837012 -1500236155,11.098493,1.648128 -1500236075,11.000913,1.659209 -1500236066,11.088362,1.620821 -1500236047,11.406218,1.980096 -1500236043,11.0767,1.71418 -1500236032,11.065253,1.681549 -1500235972,11.104912,1.77196 -1500235949,11.456778,1.856994 -1457642530,-2.417405,34.938632 -1457611371,11.425621,1.896623 -1457611360,11.165132,1.744396 -1457611318,11.010904,1.725038 -1457611252,11.514635,1.85877 -1457611190,11.112398,1.616827 -1457610935,-24.693959,31.524217 -1453517310,-24.035207,31.612659 -1453498111,-7.606977,34.942314 -1453489601,26.770538,57.635747 -1453482817,-3.892564,36.116797 -1453463448,-0.171046,30.174129 -1453450492,-3.405329,37.971591 -1453447685,-3.960266,36.167038 -1453444931,36.653535,49.319317 -1453429797,22.670723,78.175454 -1453419284,12.20819,2.338202 -1453329363,-19.366961,20.65387 -1453320360,-23.970493,31.592506 -1453283156,-2.480452,34.959664 -1453279053,-3.118895,38.335255 -1453262717,29.852479,78.278498 -1453243732,0.892379,37.312917 -1453243729,11.072232,1.706375 -1453243694,11.011979,1.714772 -1453230162,11.342818,1.985902 -1453230153,11.390114,1.743818 -1453230147,11.005345,1.691163 -1453230144,11.088018,1.729524 -1453230108,11.303315,1.695264 -1453230096,11.061491,1.661354 -1453230080,11.342954,1.770176 -1453209538,-24.286632,31.678812 -1453209529,-23.192136,31.403457 -1453209515,-24.217812,31.77946 -1453208038,-19.070775,16.530719 -1453178944,-3.195747,35.585426 -1453170612,-24.912995,31.444066 -1453161106,-19.229338,23.143923 -1453155742,-2.125197,35.143249 -1453118837,-18.741942,24.062722 -1453101061,11.511503,1.41248 -1453072509,-1.988716,35.0047 -1453061509,11.142344,1.773326 -1453061508,11.01936,1.606951 -1438005260,11.342954,1.770176 -1438005244,11.072232,1.706375 -1438005242,9.6431,1.7356 -1438005241,11.088018,1.729524 -1438005238,11.142344,1.773326 -1438005237,11.01936,1.606951 -1438005228,11.303315,1.695264 -1438005226,11.390114,1.743818 -1438005220,11.342818,1.985902 -1438005218,11.011979,1.714772 -1438005212,11.005345,1.691163 -1438005204,11.061491,1.661354 -1425142310,11.8734,2.4074 -1339525424,-3.020098,34.996861 -1339511861,-22.269505,16.900808 -1339479233,-3.54242,38.234138 -1339466271,-2.619326,34.747009 -1339432900,-7.708951,34.874725 -1339428736,-2.619326,34.747009 -1339424928,-18.689993,13.742266 -1339384716,-22.269505,16.900808 -1339378947,-19.035515,16.471014 -1339375608,6.427213,81.572113 -1339373648,-2.619326,34.747009 -1339372041,27.329075,76.432571 -1339362989,-2.619326,34.747009 -1339336785,-7.672205,38.085823 -1339324845,-3.225529,37.987289 -1339323471,-1.573594,35.202942 -1339320971,-24.155525,30.537872 -1339299109,-7.708951,34.874725 -1339225879,-19.177792,15.918136 -1339221309,6.427213,81.572113 -1339214458,-17.792498,25.21431 -1322945320,13.98,108 -1322528386,34.5648,74.2551 -1321875172,-19.23,20.23 -1320990445,-19.23,20.23 -1319741209,34.5648,74.2551 -1318568290,33.5624,76.9885 -1315067239,0.765708,37.529562 -1305180083,-2.119764,34.656549 -1305165961,-24.177565,31.518021 -1305164756,-19.315059,23.101148 -1305160638,-19.352506,23.024015 -1305159015,-24.245155,31.658734 -1305152331,-18.744016,24.405577 -1305149753,-13.165703,31.692482 -1305148448,-24.062884,30.793361 -1305123190,6.215005,81.439588 -1291851994,12.076329,3.191864 -1291851970,11.243179,1.603764 -1291851958,7.203593,2.345948 -1291679334,-19.362585,23.949827 -1291156289,-24.171994,31.624369 -1291144842,-19.06796,23.802714 -1270054202,-24.761787,31.413565 -1269583887,-24.912181,31.467642 -1269583652,-24.741206,31.519537 -1269553480,-2.493826,34.638544 -1265905636,-22.919854,31.346972 -1265895392,-25.083774,31.600718 -1265592155,22.370417,80.651878 -1265560005,-25.42982,31.421702 -1265554395,8.113854,13.834475 -1265545868,-2.59115,34.859127 -1265536730,-25.207627,31.346109 -1257411990,-2.48173,34.867588 -1257408520,-24.781224,31.842141 -1257408519,-24.833649,31.603918 -1211789013,1.15,34.866667 -1147195285,-7.333333,37.25 -1145843676,23.133333,97.216667 -1145843672,23.133333,97.216667 -1145843645,23.133333,97.216667 -1145843604,23.133333,97.216667 -1145843581,23.133333,97.216667 -1145758801,1.05,30.266667 -1145695149,-0.7,10.216667 -1145692357,1.05,30.266667 -1145685254,-24.983333,31.6 -1145666553,15.609722,39.45 -1145666505,15.609722,39.45 -1145105026,-18.743813,22.179737 -1145105008,-17.816667,25.15 -1144279445,-7.628413,34.626239 -1144279431,-7.660616,34.609587 -1144278942,-7.798793,34.715074 -1143554141,7.476947,80.742912 -1143542016,-24.89547,31.564867 -1135440843,-1.432193,34.921074 -1134963606,21.523292,92.442918 -1132390823,-2.491447,34.903153 -1132390815,-3.948372,36.139475 -1132390814,-3.948889,36.139167 -1098922541,-24.806935,31.593401 -1098921337,-24.493929,31.411245 -1098921286,-24.509848,31.479332 -1098920017,-24.281173,30.797897 -1098909573,26.138469,76.357193 -1098906422,-0.381019,36.017726 -1098895139,-25.004136,31.46284 -1098627629,1.7611,32.0253 -1098627610,2.2633,32.2512 -1098627607,2.2633,32.2512 -1098627581,1.7611,32.0253 -1094484678,31.46,35.38 -1094484561,31.54,35.38 -1094484556,31.47,35.39 -1094484545,31.46,35.38 -1094484429,31.33,35.27 -1094484187,31.45,35.38 -1094484184,31.45,35.36 -1094484181,31.45,35.38 -1094484177,31.47,35.39 -1094484170,31.19,35.35 -1094484164,31.47,35.39 -1094484163,31.41,35.34 -1094484159,31.46,35.35 -1094483629,31.47,35.39 -1094483617,31.55,35.4 -1094483606,31.46,35.38 -1094483602,31.47,35.39 -1094483601,31.46,35.35 -1094483600,31.55,35.4 -1094483599,31.45,35.37 -1094483590,31.46,35.35 -1094483587,31.47,35.39 -1094483584,31.19,35.36 -1094483580,31.47,35.39 -1094483563,31.46,35.38 -1094483468,31.51,35.37 -1094483451,31.46,35.36 -1094483447,31.46,35.36 -1094483408,31.46,35.38 -1094483382,31.46,35.38 -1094483379,31.46,35.38 -1094483377,31.45,35.37 -1094483325,31.46,35.38 -1094483320,30.59,34.92 -1094482973,31.47,35.37 -1094482955,31.47,35.38 -1094482313,31.46,35.38 -1094482297,31.47,35.38 -1094482288,31.46,35.38 -1094482287,31.46,35.39 -1094482286,31.46,35.38 -1094482283,31.48,35.39 -1094482281,31.47,35.37 -1094482279,31.45,35.37 -1094482276,31.47,35.37 -1094482274,30.45,34.55 -1094482273,31.47,35.38 -1094482269,31.46,35.38 -1094482267,31.46,35.38 -1094482190,31.51,35.38 -1094482177,31.47,35.38 -1094482170,31.51,35.38 -1094482081,31.47,35.39 -1094482068,31.46,35.38 -1094482063,31.45,35.37 -1094482058,31.47,35.37 -1094482053,31.47,35.39 -1094482051,31.45,35.36 -1094482022,31.46,35.38 -1094482018,31.49,34.94 -1094482009,31.47,35.39 -1094482001,31.46,35.38 -1094481994,31.51,35.39 -1094481919,30.78,34.97 -1094481693,31.46,35.38 -1094481679,30.73,34.91 -1094481579,31.47,35.38 -1094481574,31.47,35.38 -1094481572,31.47,35.39 -1094481565,31.46,35.38 -1094481547,31.46,35.38 -1094481475,31.46,35.38 -1094481473,31.57,35.39 -1094481443,31.46,35.38 -1094481435,31.53,35.39 -1094481433,31.46,35.39 -1094481424,31.55,35.4 -1094481268,31.68,35.43 -1094481255,31.58,35.38 -1094481249,31.51,35.38 -1094481242,30.61,35.02 -1094481236,31.46,35.35 -1094481229,31.46,35.38 -1094481223,31.45,35.37 -1094481222,31.45,35.36 -1094481217,31.7,35.44 -1094481194,31.58,35.37 -1094481111,31.45,35.37 -1094481110,31.47,35.32 -1094481027,31.46,35.38 -1094481016,31.48,35.39 -1094481013,31.46,35.38 -1094480996,31.45,35.37 -1094480984,31.46,35.35 -1094480970,31.45,35.38 -1094480950,31.46,35.36 -1094480946,31.45,35.38 -1094480942,31.46,35.38 -1094480929,31.46,35.36 -1094480924,31.46,35.36 -1094480919,31.47,35.37 -1094480703,31.4,35.33 -1094480424,31.54,35.39 -1094480422,31.47,35.39 -1094480415,31.47,35.39 -1094480405,31.47,35.38 -1094480256,31.45,35.37 -1094478828,30.35,35.07 -1094478796,31.56,35.39 -1094478763,32.22,35.56 -1094478686,31.46,35.38 -1094478491,30.61,35.17 -1094478483,30.99,35.22 -1094478460,30.95,35.14 -1094478274,31.47,35.39 -1094478247,31.47,35.39 -1094478218,31.28,35.36 -1094478206,31.46,35.36 -1094478182,31.46,35.36 -1094478175,31.46,35.35 -1094478082,31.46,35.38 -1094478075,31.47,35.39 -1094478062,31.47,35.39 -1094478046,31.47,35.39 -1094477842,31.33,35.28 -1094477839,31.19,35.34 -1094477833,31.19,35.34 -1094477824,31.23,35.34 -1094477766,31.35,35.31 -1094477740,31.46,35.39 -1094477738,32.38,35.55 -1094477727,31.19,35.35 -1094477714,31.15,35.35 -1094477707,31.25,35.35 -1094477702,31.25,35.35 -1094477690,31.44,35.37 -1094477689,31.47,35.38 -1094477687,30.57,35.08 -1094477678,31.47,35.39 -1094477574,31.47,35.38 -1094477486,31.4,35.36 -1094477481,31.44,35.37 -1094477473,31.44,35.37 -1094477472,31.45,35.36 -1094477470,31.44,35.37 -1094477467,31.45,35.36 -1094477466,31.44,35.37 -1094477465,31.44,35.37 -1094477464,31.44,35.37 -1094477460,31.44,35.37 -1094477458,31.44,35.37 -1094477454,31.44,35.37 -1094477449,31.44,35.37 -1094477448,31.44,35.37 -1094477427,31.44,35.37 -1094476970,31.46,35.39 -1094476963,31.45,35.38 -1094476952,31.46,35.39 -1094476934,31.45,35.38 -1094476933,31.45,35.38 -1094476529,31.47,35.38 -1094476509,33.1,35.56 -1094476375,31.71,35.44 -1094476298,31.44,35.37 -1094476296,31.45,35.36 -1094476278,31.45,35.38 -1094476270,31.45,35.36 -1094476268,31.44,35.37 -1094476210,31.43,35.36 -1094476151,31.45,35.36 -1094476137,31.15,35.35 -1094476131,31.05,35.34 -1094476128,31.19,35.34 -1094476124,31.3,35.34 -1094476121,31.46,35.38 -1094476117,31.47,35.38 -1094476110,31.45,35.38 -1094476108,31.45,35.38 -1094476107,31.35,34.47 -1094476106,31.45,35.38 -1094476100,31.47,35.39 -1094476098,31.46,35.39 -1094476097,31.5,35.38 -1094476093,31.46,35.39 -1094476092,31.47,35.38 -1094476055,31.47,35.39 -1094476024,30.41,35.07 -1094475863,31.94,35.31 -1094475853,31.44,35.37 -1094475849,31.46,35.38 -1094475815,30.6,34.8 -1094475720,30.88,35.15 -1094475669,31.45,35.37 -1094475662,31.07,35.3 -1094475656,31.45,35.37 -1094475646,31.47,35.36 -1094475642,31.46,35.34 -1094475630,31.45,35.37 -1094475623,31.45,35.37 -1094475617,31.46,35.39 -1094475614,31.71,35.45 -1094475579,31.46,35.37 -1094475574,31.47,35.39 -1094475551,31.46,35.38 -1094475547,31.47,35.39 -1094475541,31.45,35.36 -1094475540,31.46,35.35 -1094475533,31.35,35.31 -1094475529,31.46,35.36 -1094475528,31.46,35.36 -1094475527,31.41,35.33 -1094475524,31.38,35.34 -1094475522,31.21,35.35 -1094475519,31.56,35.39 -1094475516,31.61,35.4 -1094475513,31.35,35.32 -1094475510,31.45,35.37 -1094475507,31.56,35.39 -1094475500,31.35,35.31 -1094475497,31.47,35.39 -1094475496,31.19,35.34 -1094475495,31.19,35.34 -1094475493,31.47,35.38 -1094475491,31.47,35.39 -1094475486,31.46,35.39 -1094475485,31.46,35.38 -1094475484,31.47,35.39 -1094475482,31.47,35.38 -1094475481,31.46,35.39 -1094475478,31.47,35.39 -1094475477,31.47,35.39 -1094475475,31.47,35.38 -1094475471,31.45,35.38 -1094475467,31.46,35.39 -1094475465,31.46,35.39 -1094475463,31.46,35.39 -1094475456,31.46,35.39 -1094475455,31.45,35.38 -1094475452,31.47,35.38 -1094475450,31.47,35.38 -1094475448,31.47,35.38 -1094475445,31.46,35.39 -1094475443,31.46,35.39 -1094475439,31.47,35.38 -1094475437,31.47,35.38 -1094475051,32.84,35.83 -1094475046,31.46,35.37 -1094475044,31.46,35.37 -1094475040,31.45,35.38 -1094475038,31.46,35.37 -1094475032,31.45,35.38 -1094475031,31.46,35.39 -1094475028,31.46,35.37 -1094475027,31.47,35.39 -1094475017,31.46,35.39 -1094474892,31.47,35.39 -1094474890,31.47,35.39 -1094474868,31.47,35.39 -1094474863,31.47,35.39 -1094474747,31.46,35.38 -1094474710,31.46,35.39 -1094474703,31.46,35.39 -1094474700,31.46,35.39 -1094474693,31.47,35.38 -1094474684,31.45,35.38 -1094474646,31.46,35.37 -1094474634,31.47,35.38 -1094474605,31.47,35.38 -1094474599,31.47,35.38 -1094474528,31.35,35.32 -1094474526,31.15,35.35 -1094474510,31.34,35.32 -1094474479,31.46,35.34 -1094474469,31.61,35.34 -1094474463,31.46,35.34 -1094474422,32.84,35.83 -1094474409,29.86,35.04 -1094474269,31.47,35.38 -1094474259,31.47,35.38 -1094474258,31.59,35.39 -1094474254,31.47,35.39 -1094474253,31.45,35.38 -1094474096,31.47,35.39 -1094474073,31.57,35.38 -1094474067,31.48,35.38 -1094474066,31.46,35.38 -1094474046,31.42,35.34 -1094474044,31.47,35.39 -1094474002,30.7,35.07 -1094473942,31.95,35.36 -1094473929,32.19,35.54 -1094473887,31.44,35.38 -1094473884,31.45,35.38 -1094473835,30.57,35 -1094473834,31.46,35.39 -1094473739,30.63,35.02 -1094473638,31.47,35.39 -1094473188,31.46,35.39 -1094473158,31.47,35.39 -1094473157,31.47,35.37 -1094473152,31.45,35.37 -1094473151,31.35,35.32 -1094473150,31.52,35.38 -1094473149,31.45,35.37 -1094473145,31.39,35.36 -1094473142,31.35,35.32 -1094473140,31.71,35.44 -1094473137,31.71,35.44 -1094473136,31.47,35.39 -1094473134,31.69,35.44 -1094473125,31.45,35.37 -1094473123,31.02,35.34 -1094473122,31.47,35.38 -1094473120,31.71,35.44 -1094472987,31.35,35.33 -1094472986,31.35,35.33 -1094472981,31.35,35.32 -1094472968,31.35,35.33 -1094472695,30.63,35.03 -1094472674,31.35,35.32 -1094472670,30.63,35.03 -1094472666,31.46,35.34 -1094472659,30.63,35.03 -1094472658,31.71,35.44 -1094472657,30.63,35.03 -1094472654,31.42,35.34 -1094472643,31.62,35.19 -1094472557,31.45,35.36 -1094472547,31.45,35.36 -1094472541,31.45,35.36 -1094472539,31.47,35.39 -1094472534,31.19,35.34 -1094472532,31.12,35.32 -1094472529,31.46,35.34 -1094472524,31.45,35.38 -1094472522,31.47,35.39 -1094472521,31.47,35.32 -1094472515,31.06,35.3 -1094472511,31.67,35.43 -1094472510,31.45,35.32 -1094472504,31.51,35.32 -1094472226,30.63,35.03 -1094472219,30.96,35.18 -1094472146,30.68,34.97 -1094471713,31.44,35.37 -1094471710,31.45,35.37 -1094471699,31.44,35.37 -1094471679,31.45,35.36 -1094471133,31.2,35.36 -1094471124,31.44,35.37 -1094471118,31.46,35.34 -1094471105,31.44,35.37 -1094471097,31.44,35.37 -1094471041,31.68,35.44 -1094470430,31.54,34.55 -1094468989,31.15,35.34 -1094468243,31.98,35.31 -1094468224,31.98,35.31 -1094468221,31.98,35.31 -1094467098,31.45,35.39 -1094467083,31.45,35.38 -1094467074,31.13,35.37 -1094467067,31.56,35.38 -1094467065,31.45,35.36 -1094467053,31.44,35.38 -1094467044,31.44,35.38 -1094466987,31.41,35.27 -1094466953,30.72,34.89 -1094466708,31.4,35.39 -1094466670,31.45,35.38 -1094466666,31.46,35.38 -1094466495,30.61,35.18 -1094466426,31.46,35.38 -1094466230,30.82,34.76 -1094466228,30.75,35 -1094466218,30.7,34.76 -1094466204,30.83,34.77 -1094466201,30.59,34.75 -1094466188,30.7,34.76 -1094466185,33.23,35.79 -1094466173,33.23,35.81 -1094466097,30.65,35.06 -1094466059,31.57,35.39 -1094465997,31.46,35.39 -1094465976,31.47,35.39 -1094465880,31.7,35.45 -1094465546,31.46,35.38 -1094465520,31.44,35.36 -1094465497,31.47,35.38 -1094465491,31.46,35.38 -1094465409,31.69,35.44 -1094465398,31.47,35.39 -1094465384,31.47,35.36 -1094465381,31.46,35.38 -1094465147,31.73,35.42 -1094465034,30.72,34.9 -1094465004,31.47,35.38 -1094464976,31.46,35.38 -1094464950,31.47,35.39 -1094464949,31.47,35.39 -1094464940,31.57,35.38 -1094464936,31.47,35.39 -1094464933,31.47,35.38 -1094464923,30.79,34.84 -1094464905,30.89,35.16 -1094464896,31.44,35.38 -1094464862,30.82,34.76 -1094464781,31.51,35.33 -1094464689,31.45,35.37 -1094464660,30.73,34.92 -1094464646,30.6,34.94 -1094464641,30.73,34.92 -1094464633,30.58,34.94 -1094464624,30.6,34.79 -1094464616,30.78,34.84 -1094464609,30.82,34.76 -1094464604,30.86,34.83 -1094464599,30.82,34.76 -1094464512,30.81,34.8 -1094464475,30.7,34.76 -1094464474,30.7,34.76 -1094464465,30.85,34.77 -1094464450,30.7,34.76 -1094464399,30.72,34.9 -1094464385,31.45,35.36 -1094464376,30.66,34.84 -1094464369,30.74,34.93 -1094464368,30.51,34.73 -1094464365,30.82,34.76 -1094464352,30.73,35.04 -1094464351,30.53,34.73 -1094464297,30.61,34.95 -1094464293,30.5,34.61 -1094464292,30.79,34.84 -1094464279,30.58,34.68 -1094464227,30.6,34.93 -1094464213,30.82,34.76 -1094464211,30.85,34.79 -1094464209,30.79,34.85 -1094464199,30.6,34.79 -1094464185,30.6,34.93 -1094464174,30.68,34.89 -1094464167,29.72,34.95 -1094464166,30.79,34.84 -1094464162,30.7,35.04 -1094464153,30.6,34.9 -1094464150,30.66,34.84 -1094464148,30.79,34.85 -1094464147,30.82,34.76 -1094464143,30.84,34.77 -1094464139,31.28,35.36 -1094464138,30.82,34.76 -1094464136,30.5,34.64 -1094464135,30.79,34.85 -1094464129,30.82,34.76 -1094464103,30.82,34.69 -1094464086,30.93,35.03 -1094464080,30.72,34.9 -1094464077,30.73,34.9 -1094464070,30.79,34.79 -1094464069,30.84,34.78 -1094464067,30.7,34.76 -1094464064,30.83,34.77 -1094464061,30.84,34.78 -1094464057,30.85,34.77 -1094464053,30.84,34.76 -1094464051,30.79,34.84 -1094464049,30.73,34.91 -1094464041,30.63,35.06 -1094464036,30.58,35 -1094464034,30.58,34.7 -1094464026,30.63,35.04 -1094464021,30.63,35.06 -1094463988,30.59,34.92 -1094463983,31.07,35.31 -1094463958,30.6,34.65 -1094463949,30.65,34.94 -1092891495,-21.987293,27.838885 -1088973155,25.128274,73.036642 -1088916390,-25.108799,31.472568 -1088896004,-13.61482,32.893249 -1065594848,-24.299065,31.338114 -1065427504,21.76667,82.9 -1065425724,-1.1,39.95 -1065418777,12.3,76.65 -1065407786,22.2,80.93333 -1065400653,12.3,76.65 -1065398387,1.1,36.7 -1065395162,21.76667,82.9 -1065393525,25.462075,97.442331 -1065381848,21.76667,82.9 -1065380847,1.1,36.7 -1065363974,21.76667,82.9 -1065359184,2.13333,36.85 -1065351782,-1.28333,36.81667 -1065350742,0.88168,36.7 -1065339027,-1.28333,36.81667 -1059618258,-1.497773,35.191262 -1052779422,-1.382322,35.021178 -1052603990,-28.34789,32.416713 -1052579745,27.273802,95.496957 -1045090921,-11.926477,32.25174 -1045085816,0.57128,37.608948 -1042783377,10.9333,1.1166 -1042783368,12,2.5833 -1039529275,-20,30 -1039526262,-20,30 -1039520581,-14.079442,28.587061 -1038333613,-15.991962,29.155135 -1038288935,-23.840765,31.587182 -1038025607,-1.999983,35.183106 -1024222201,-4.181317,36.121798 -1024220551,-1.440795,35.336245 -1024210136,-16.89938,28.314506 -922789745,6.427213,81.572113 -922780577,-24.770725,31.387171 -922777082,-1.092859,35.20612 -922766747,-4.077973,36.044769 -922756791,-20.478481,25.675049 -922754820,-18.988741,16.556911 -922739822,-22.269505,16.900808 -922737189,-25.325407,31.69693 -922720289,-18.573036,24.071732 -922719835,-2.977327,38.831177 -922718865,8.767315,-3.810001 -922717217,0.57128,37.608948 -922715068,-22.269505,16.900808 -922713656,-24.046465,31.420898 -922710293,-25.085604,31.760471 -922709515,-2.436428,34.820568 -922701676,-2.436428,34.820568 -922700573,-2.181632,34.208679 -922700524,-24.770725,31.387171 -922694637,-4.077973,36.044769 -922693105,8.767315,-3.810001 -922682103,-2.619326,34.747009 -922677410,-22.269505,16.900808 -922671780,0.105743,38.189163 -922666867,-18.505737,20.761328 -922654806,-19.116625,23.827286 -922639501,-1.227628,35.027161 -922636375,-19.04001,16.470434 -922635648,-2.619326,34.747009 -922632833,8.211491,13.870239 -922623403,-22.988739,29.551163 -922618309,-4.077973,36.044769 -922612813,-18.573036,24.071732 -922606558,-25.162979,31.617205 -922590673,8.767315,-3.810001 -922585611,-24.981091,31.573156 -922583881,-3.01599,38.21067 -922572894,6.427213,81.572113 -922522250,-2.436428,34.820568 -922503569,-1.227628,35.027161 -922499785,-21.518061,15.58277 -922498766,-25.120459,31.91687 -922497081,-2.436428,34.820568 -911491850,-2.475424,34.964466 -911491657,-2.520544,34.899282 -899969584,-2.286454,34.780589 -899966505,0.282168,37.147263 -891763867,6.420186,81.547103 -891752207,-4.201817,39.25562 -891744412,-23.130563,30.934566 -891737821,-24.910184,31.548689 -891727903,-18.522971,23.740266 -891727866,-18.403264,23.755997 -891148554,6.594673,81.578659 -891142770,-22.721175,31.113177 -891119030,6.517952,81.558582 -891072769,-0.082653,30.194371 -891061069,-25.023374,31.433757 -891039451,26.175881,76.452689 -865739450,9,18 -865739446,9,18 -865739445,-7.5,111 -865739403,-7.5,111 -865739401,6.62,34.39 -865739396,-15.8,29.55 -865739375,-1.4044,35.1009 -865739368,18.975,72.8258 -865739354,20.66,78.92 -865739312,-18.36025,25.9076 -865739298,5.60133,-7.18077 -865739289,9,18 -865739288,9,18 -865739287,9,18 -865739285,14.49,-14.45 -865739277,9,18 -859427907,3.733333,29.716694 -859426538,3.733333,29.716694 -859426534,3.733333,29.716694 -859426527,3.733333,29.716694 -859426523,3.733333,29.716694 -859426518,3.733333,29.716694 -859426513,3.733333,29.716694 -859426508,3.733333,29.716694 -859426502,3.733333,29.716694 -859426497,3.733333,29.716694 -859426479,3.733333,29.716694 -859426474,3.733333,29.716694 -859426469,3.733333,29.716694 -859426464,3.733333,29.716694 -859426438,3.733333,29.716694 -859426433,3.733333,29.716694 -859426428,3.733333,29.716694 -859426423,3.733333,29.716694 -859426418,3.733333,29.716694 -859426413,3.733333,29.716694 -859426408,3.733333,29.716694 -859426256,3.733333,29.716694 -859426251,3.733333,29.716694 -859426246,3.733333,29.716694 -841589312,-25.357563,31.8695 -735700376,-6.9525,33.501944 -686467008,-2.903414,36.049939 -686466982,17.38333,78.46667 -686454056,14.38916,101.170483 -686434074,-4.075044,24.26646 -686370592,-18.36667,21.85 -673100825,1.681398,31.294735 -665916048,7.3,80.76667 -665915623,15.383333,44.200001 -665915622,14.81667,44.299999 -665914878,27.9,80.800003 -665914781,28.450001,80.583328 -665914026,27.377501,60.739719 -665899091,6.71667,80.76667 -665892731,28.896669,51.293331 -665888931,7.3,80.76667 -665888684,-1.15,36.349998 -665888683,-1.15,36.349998 -665881240,-1.15,36.349998 -665878958,32.358799,51.997299 -665865122,12.66666,108.050003 -665845294,-15.06667,13.55 -665822428,32.443501,51.897202 -665813899,21.76667,82.900002 -665804105,19.41667,80.066673 -665803885,-20.578819,25.799681 -665803868,-17.83333,24.966669 -665803671,10.75,106.666657 -665802772,5.16359,37.933331 -665802765,31.683331,99.666672 -665802253,5.16359,37.933331 -665801065,21.683331,102.099999 -665801064,21.683331,102.099999 -665800824,12.75,37.700001 -665800060,12.739758,35.434817 -665796660,-2.51667,32.666672 -665791368,-1.45,36.983334 -665791366,-0.41667,36.633331 -665770007,9.166667,44.799999 -665768920,-7.5,110 -665740988,-2.444182,34.825779 -665739414,37.370701,56.766701 -665739060,-1.15,36.349998 -665738938,33.349998,44.416668 -665730746,6.6,81.133331 -665730301,7.83333,80.98333 -665718386,27.377501,60.739719 -583517437,13.75,100.51667 -583517433,13.75,100.51667 -583517430,13.75,100.51667 -583515307,-3.58333,35.83333 -583515304,-3.58333,35.83333 -583515300,-3.58333,35.83333 -583478052,44.58333,129.6 -583478048,44.58333,129.6 -476874499,15.836675,107.472656 -476870156,0.472702,37.736328 -476869165,0.441816,39.915231 -476869162,-6.452849,36.411257 -476867061,3.442929,11.762703 -476863943,31,112.25 -476863942,18.494089,98.486306 -476863941,30.37836,76.774811 -476863940,-6.306122,39.126675 -476858930,-24.16182,29.512337 -476858837,15.836675,107.472656 -476857323,22.522236,77.738283 -476857322,30.37836,76.774811 -476857321,-6.316667,39.283333 -476856875,-24.16182,29.512337 -476856874,30.77135,111.321458 -476855131,-2.5,36.166667 -476851542,30.04952,101.96231 -476847870,30.04952,101.96231 -476847869,26.25,118 -476847868,30.840183,102.490886 -476847867,13.51329,105.373535 -476847249,37.493004,103.601562 -476847248,22.591158,88.365791 -476847246,26,63 -476847245,3.442929,11.762703 -476847244,3.442929,11.762703 -476847243,3.442929,11.762703 -476847207,4.033333,10.566667 -476847205,2.235879,11.37216 -476847183,2.235879,11.37216 -476847182,2.235879,11.37216 -476847181,2.235879,11.37216 -476847179,-15.695388,35.168909 -476847178,-6.83326,36.982933 -476847177,-6.83326,36.982933 -476847176,1.627507,36.816667 -476847154,1.627507,36.816667 -476844257,2.235879,11.37216 -476836303,0.441816,39.915231 -476832282,18.494089,98.486306 -476814173,-0.912494,35.477458 -476812641,-24.16182,29.512337 -476812301,22.522236,77.738283 -476812193,2.466667,12.25 -476810651,-24.16182,29.512337 -476810630,37.493004,103.601562 -476810621,2.9434,11.055412 -476810559,7.083333,13.283333 -197163332,5.403,-7.732 -85088420,32.924487,35.722729 -85088412,32.595137,35.521633 -85088406,31.716951,35.452139 -85088402,31.716951,35.452139 -85088396,31.716951,35.452139 -85088392,31.716951,35.452139 -85088388,31.716951,35.452139 -85088385,31.716951,35.452139 -85088380,31.716951,35.452139 -85087517,33.07614,35.220265 -85087465,32.872912,35.501248 -85087148,30.576093,35.006137 -85087136,31.492355,34.941078 -85086045,31.473569,35.377835 -85085252,31.454636,35.37254 -85085244,31.454627,35.379905 -85085224,31.469942,35.391508 -85085211,31.469045,35.38835 -85085194,31.709747,35.446846 -85085182,31.709747,35.446846 -85085166,33.10898,35.565249 -85085097,31.455548,35.365177 -85085094,31.455548,35.365177 -85085068,30.616832,35.178135 -85085067,30.995666,35.219912 -85085054,31.455548,35.365177 -85085034,31.47085,35.387301 -85085009,31.709747,35.446846 -85084992,31.469939,35.393613 -85084972,31.471752,35.387303 -85084965,31.469947,35.388351 -85084962,31.469039,35.392559 -85084950,31.472654,35.387304 -85084914,31.471752,35.387303 -85084898,30.639275,35.035216 -85084858,30.614905,35.023787 -85084857,31.469039,35.392559 -85084856,31.401468,35.335643 -85084855,31.437507,35.36725 -85084854,31.461875,35.353614 -85084853,31.460064,35.359924 -85084852,31.460064,35.359924 -85084851,31.469941,35.39256 -85084850,31.466341,35.387292 -85084849,31.471752,35.387303 -85084848,31.455548,35.365177 -85084847,31.460028,35.38728 -85084846,31.709747,35.446846 -85084844,31.709747,35.446846 -85084814,31.469046,35.387297 -85084786,31.558311,35.402217 -85084767,31.558311,35.402217 -85084742,31.590791,35.393856 -85084716,31.716955,35.450029 -85084713,31.470839,35.394667 -85084712,31.451015,35.383054 -85084697,31.441997,35.381985 -85084694,31.469941,35.39256 -85084692,31.430265,35.387222 -85084676,31.469941,35.39256 -85084656,31.470839,35.394667 -85084653,31.451015,35.383054 -85084631,31.572768,35.383286 -85084613,31.470839,35.394667 -85084608,31.451015,35.383054 -85084574,31.427613,35.345145 -85084537,31.451015,35.383054 -85084535,31.451015,35.383054 -85084500,31.614303,35.344372 -85084446,31.709747,35.446846 -85084252,31.455538,35.372542 -85084204,31.476276,35.376788 -85084201,31.698914,35.452092 -85084189,31.518648,35.388447 -85084158,31.471771,35.373623 -85084138,31.455548,35.365177 -85084132,31.470839,35.394667 -85084092,31.470843,35.392562 -85084085,31.469942,35.391508 -85084081,31.454622,35.383061 -85084065,31.454622,35.383061 -85084010,31.466329,35.39571 -85083986,31.470839,35.394667 -85083983,31.471771,35.373623 -85083970,31.518648,35.388447 -85083948,31.471754,35.38625 -85083920,31.455524,35.383063 -85083894,31.470853,35.385196 -85083880,31.467292,35.348361 -85083860,31.455524,35.383063 -85083851,31.467292,35.348361 -85083818,31.471755,35.385198 -85083813,31.469942,35.391508 -85083796,31.471752,35.387303 -85083772,31.467292,35.348361 -85083757,31.518653,35.385288 -85083744,31.455552,35.362021 -85083724,31.525868,35.385302 -85083713,31.471758,35.383094 -85083693,31.471758,35.383094 -85083680,31.471758,35.383094 -85083654,31.471758,35.383094 -85083627,31.472655,35.386252 -85083611,31.471758,35.383094 -85083600,31.469942,35.391508 -85083591,31.469942,35.391508 -85083560,31.455552,35.362021 -85083542,31.471758,35.383094 -85083522,31.471754,35.38625 -85083493,31.471758,35.383094 -85083458,31.471757,35.384146 -85083397,31.471746,35.391512 -85083210,31.479878,35.381004 -85083193,31.462777,35.353615 -85083133,30.458285,34.558655 -85083115,31.451015,35.383054 -85083066,31.462777,35.353615 -85083022,30.950556,35.146648 -85082947,31.987694,35.315307 -85082887,31.466341,35.387292 -85082831,31.20031,35.363695 -85082782,31.466341,35.387292 -85082750,31.473592,35.359946 -85082700,31.467292,35.348361 -85082661,31.470839,35.394667 -85082627,31.455524,35.383063 -85082603,31.466341,35.387292 -85082571,31.707933,35.452116 -85082541,31.462777,35.353615 -85082540,31.987694,35.315307 -85082530,31.987694,35.315307 -85082493,31.951564,35.36815 -85082473,31.47174,35.395721 -85082440,31.451015,35.383054 -85082417,31.451015,35.383054 -85082399,31.455524,35.383063 -85082386,31.466341,35.387292 -85082367,31.47174,35.395721 -85082348,31.509644,35.377902 -85082327,31.466341,35.387292 -85082291,31.302247,35.346009 -85082259,31.455597,35.319937 -85082221,31.347364,35.325059 -85082174,31.455524,35.383063 -85082126,31.502419,35.385257 -85082104,31.467292,35.348361 -85082089,31.478065,35.387315 -85082087,31.469942,35.391508 -85082063,31.459162,35.359923 -85082048,31.455524,35.383063 -85082036,31.455548,35.365177 -85082016,31.470839,35.394667 -85081993,31.455548,35.365177 -85081979,31.459162,35.359923 -85081971,31.469942,35.391508 -85081944,31.459162,35.359923 -85081937,31.513315,35.322113 -85081924,31.671885,35.438311 -85081909,31.33748,35.275659 -85081900,31.455524,35.383063 -85081887,31.150719,35.351027 -85081869,31.194017,35.345848 -85081840,31.120085,35.319529 -85081818,31.545705,35.3885 -85081811,31.200314,35.360547 -85081793,31.356393,35.314561 -85081779,31.451015,35.383054 -85081766,31.466341,35.387292 -85081734,31.455548,35.365177 -85081721,31.419506,35.335668 -85081711,31.427613,35.345145 -85081704,31.239113,35.345915 -85081694,31.354359,34.473789 -85081683,31.359086,35.328227 -85081662,31.380719,35.340871 -85081645,31.214733,35.370016 -85081628,31.197606,35.361592 -85081607,31.356393,35.314561 -85081587,31.396027,35.361921 -85081577,31.196722,35.346901 -85081571,31.068684,35.307941 -85081551,31.049707,35.345634 -85081527,31.682709,35.437283 -85081517,31.71065,35.445793 -85081504,31.699828,35.445765 -85081498,31.212044,35.356369 -85081488,31.194005,35.35634 -85081470,31.466341,35.387292 -85081456,31.151621,35.351029 -85081439,31.25714,35.356441 -85081436,31.149815,35.352075 -85081433,31.467234,35.393607 -85081431,31.356383,35.32507 -85081428,31.336572,35.286167 -85081425,31.452849,35.359912 -85081422,31.358182,35.330328 -85081419,31.194017,35.345848 -85081404,31.35819,35.32192 -85081390,31.464536,35.388341 -85081377,31.285993,35.362788 -85081362,31.451924,35.377796 -85081348,31.199412,35.360546 -85081339,31.194017,35.345848 -85081322,31.356393,35.314561 -85081310,31.35729,35.319817 -85081300,31.356383,35.32507 -85081283,31.356383,35.32507 -85081264,31.617832,35.403396 -85081253,31.25714,35.356441 -85081246,31.712454,35.445798 -85081220,31.461875,35.353614 -85081202,31.150723,35.346833 -85081190,31.461862,35.364136 -85081178,31.194017,35.345848 -85081157,31.471748,35.390459 -85081141,31.461862,35.364136 -85081134,31.350958,35.338726 -85081110,31.464536,35.388341 -85081107,30.788014,34.97645 -85081089,31.470872,35.371517 -85081080,31.470839,35.394667 -85081063,31.470839,35.394667 -85081039,31.027163,35.341412 -85081029,31.401432,35.367188 -85081009,31.350958,35.338726 -85080996,31.451029,35.372534 -85080978,31.469039,35.392559 -85080963,31.464536,35.388341 -85080938,31.194017,35.345848 -85080924,31.454629,35.377801 -85080915,31.452828,35.375693 -85080889,31.45373,35.375695 -85080878,31.455538,35.372542 -85080858,31.45643,35.379908 -85080842,31.455531,35.377802 -85080838,31.453735,35.372539 -85080803,31.469037,35.393611 -85080774,31.467229,35.396764 -85080744,31.470844,35.39151 -85080728,31.441108,35.372516 -85080708,31.466341,35.387292 -85080683,31.471755,35.385198 -85080657,31.470844,35.39151 -85080625,31.452827,35.376745 -85080608,31.452828,35.375693 -85080603,31.466342,35.38624 -85080572,31.451015,35.383054 -85080543,31.455524,35.383063 -85080521,31.469942,35.391508 -85080508,31.459144,35.3736 -85080473,31.469951,35.385195 -85080453,31.469939,35.393613 -85080410,31.470838,35.395719 -85080383,31.485271,35.393644 -85080334,31.45914,35.376757 -85080284,31.470025,35.322059 -85080264,31.458256,35.363077 -85080250,31.460962,35.363082 -85080221,31.460962,35.363082 -85080197,31.466341,35.387292 -85080178,31.462776,35.354668 -85080137,31.194005,35.35634 -85080057,30.454221,34.949119 -85080017,31.076801,35.308998 -85079973,30.5985,34.927887 -85079955,31.451015,35.383054 -85079928,30.639275,35.035216 -85079910,30.639275,35.035216 -85079883,30.639275,35.035216 -85079836,31.460026,35.388332 -85079780,31.419494,35.346185 -85079689,31.446512,35.377786 -85079666,31.446512,35.377786 -85079620,31.446512,35.377786 -85079443,30.418325,35.074109 -85079343,30.634746,35.021664 -85079316,30.679762,34.9694 -85079297,31.627006,35.198935 -85079288,31.470847,35.389405 -85079248,31.392459,35.325117 -85079153,30.887423,35.157145 -85079131,31.707933,35.452116 -85079125,31.466341,35.387292 -85079108,31.446512,35.377786 -85079106,31.446512,35.377786 -85079103,31.446512,35.377786 -85079102,31.446512,35.377786 -85079098,31.446512,35.377786 -85079093,31.446512,35.377786 -85079078,30.350672,35.074199 -85079074,30.706969,35.073722 -85079068,31.471765,35.377832 -85079063,31.455545,35.367281 -85079057,32.842824,35.834408 -85079055,32.842824,35.834408 -85079051,31.446512,35.377786 -85079048,31.446512,35.377786 -85079044,31.446512,35.377786 -85079040,31.446512,35.377786 -85079027,31.446512,35.377786 -85079013,31.446512,35.377786 -85078999,30.968608,35.188506 -85078974,31.446512,35.377786 -85078949,31.446512,35.377786 -85078924,31.446512,35.377786 -85078893,31.446512,35.377786 -85078846,33.018264,35.410762 -85078769,31.460935,35.383073 -85078733,31.469039,35.392559 -85078681,31.454602,35.396738 -85078665,31.454602,35.396738 -85078655,31.470839,35.394667 -85078631,31.466341,35.387292 -85078615,31.460064,35.359924 -85078606,31.46633,35.394658 -85078595,31.464557,35.372558 -85078578,31.451917,35.383056 -85078546,31.451917,35.383056 -85078480,30.631152,35.032101 -85078450,30.731977,34.919154 -85078413,31.712442,35.452127 -85078402,30.571589,35.010316 -85078393,31.46455,35.377819 -85078386,31.56553,35.399072 -85078383,31.56553,35.399072 -85078374,31.716051,35.451082 -85078367,31.56553,35.399072 -85078357,30.573483,35.084326 -85078349,31.568229,35.403291 -85078340,31.707935,35.451061 -85078333,31.748491,35.464888 -85078313,31.471755,35.385198 -85078304,31.469941,35.39256 -85078303,31.469942,35.391508 -85078301,31.466341,35.387292 -85078299,31.466341,35.387292 -85078297,31.738581,35.459584 -85078294,31.513231,35.392647 -85078292,31.471749,35.389407 -85078291,31.466341,35.387292 -85078289,31.45645,35.365179 -85078286,31.451015,35.383054 -85078284,31.462777,35.353615 -85078282,31.466341,35.387292 -85078281,31.45645,35.365179 -85078278,31.45645,35.365179 -85078275,31.471755,35.385198 -85078273,31.471749,35.389407 -85078270,31.451029,35.372534 -85078268,31.461825,35.391492 -85078266,31.45645,35.365179 -85078264,31.469939,35.393613 -85078259,31.466341,35.387292 -85078257,30.609008,34.805847 -85078254,31.666491,35.428807 -85078252,31.581794,35.378035 -85078249,31.709747,35.446846 -85078247,31.69892,35.448927 -85078246,31.712434,35.456347 -85078244,31.639455,35.417147 -85078241,31.469938,35.394665 -85078237,31.469938,35.394665 -85078236,31.568238,35.398024 -85078235,31.568238,35.398024 -85078232,31.583595,35.380146 -85078231,31.709747,35.446846 -85078228,32.194688,35.548871 -85078225,31.466332,35.393605 -85078224,31.469052,35.383088 -85078222,31.466341,35.387292 -85078220,31.469039,35.392559 -85078218,31.470839,35.394667 -85078216,31.469947,35.388351 -85078214,31.469039,35.392559 -85078213,31.460064,35.359924 -85078211,31.464557,35.372558 -85078209,31.559212,35.402219 -85078208,31.459126,35.387278 -85078205,31.204823,35.360555 -85078203,31.469052,35.383088 -85078201,31.466341,35.387292 -85078198,31.469039,35.392559 -85078196,31.469039,35.392559 -85078195,31.469039,35.392559 -85078187,31.466327,35.396762 -85078173,31.466341,35.387292 -85078164,31.466341,35.387292 -85078146,31.460064,35.359924 -85078125,31.469039,35.392559 -85078105,31.470849,35.388353 -85078077,31.459126,35.387278 -85078058,31.572745,35.399087 -85078052,31.464557,35.372558 -85078047,31.464556,35.37361 -85078042,31.469039,35.392559 -85078038,31.459126,35.387278 -85078035,31.469039,35.392559 -85078034,31.471774,35.371518 -85078030,31.680897,35.441497 -85078022,31.455524,35.383063 -85078016,31.469039,35.392559 -85078010,31.464557,35.372558 -85078004,31.467229,35.396764 -85077996,31.470839,35.394667 -85077993,31.704227,35.498521 -85077990,31.468201,35.342049 -85077983,31.942603,35.315253 -85077971,31.446512,35.377786 -85077967,32.384057,35.549587 -85077965,32.221712,35.559581 -85077964,31.547781,34.552321 -85077959,31.549303,35.394826 -85077952,31.469039,35.392559 -85077950,31.534876,35.39269 -85077943,31.456452,35.363074 -85077937,31.470839,35.394667 -85077912,31.488874,35.396808 -49926842,-24.36363,31.26482 -48640882,31.457346,35.369389 -48640880,31.477242,35.319963 -48640876,31.459158,35.363079 -48640869,29.868026,35.043779 -48640858,30.733842,34.948385 -48640849,31.466341,35.387292 -48640528,31.469942,35.391508 -48640526,31.455548,35.365177 -48640517,31.459162,35.359923 -48640515,31.455517,35.388323 -48640479,31.452828,35.375693 -48640477,31.466341,35.387292 -1,24.25,7.25 -2,24.25,7.25 -3,24.25,7.25 -4,24.25,7.25 -5,36.76,7.46 -6,32.65,-0.56 -7,32.91,-0.47 -8,36.7,4.47 -9,36.7,4.47 -10,36.88,7.66 -11,36.5,5.5 -12,36.68,4.5 -13,36.3,4.35 -14,36.46,2.2 -15,36.44,2.84 -16,36.52,1.7 -17,36.46,4.07 -18,36.69,8.32 -19,36.69,8.32 -20,36.69,8.32 -21,36.69,8.32 -22,36.4,7.43 -23,36.64,5.85 -24,36.52,5.28 -25,35.92,2.74 -26,32.03,-1.27 -27,36.42,2.38 -28,36.76,3.34 -29,36.14,6.61 -30,36.5,1.33 -31,36.85,4.13 -32,-12.59,13.41 -33,-15.33,14.83 -34,-12.77,13.78 -35,-13.74,15.05 -36,-15.68,17 -37,-11.42,17.15 -38,-16.74,12.26 -39,-11.76,21.67 -40,-11.76,21.67 -41,-9.89,16.68 -42,-9.8,13.73 -43,-10.6,17 -44,-16.52,21.48 -45,-16.15,19.76 -46,-15.76,12.4 -47,-15.88,15.5 -48,-11.1,20.65 -49,-15.18,16.77 -50,-14.08,14.08 -51,-12.72,15.87 -52,-14.42,16.25 -53,-14.66,17.69 -54,-12.9522,22.6538 -55,-12.7876,22.662 -56,-12.59,13.41 -57,-15.33,14.83 -58,-12.30,14.20 -59,-15.10,13.20 -60,-13.74,15.05 -62,-15.80,13.30 -63,-8.50,20.60 -64,-9.20,13.40 -66,-11.90,21.70 -67,-15.90,12.80 -68,-15.00,14.00 -69,-15.00,12.70 -72,-9.10,13.70 -73,-8.40,19.20 -76,-11.40,17.20 -80,-12.20,18.10 -88,-12.80,14.70 -89,-15.90,14.10 -92,-16.74,12.26 -93,-8.90,13.30 -94,-10.60,17.00 -95,-7.90,21.30 -97,-16.52,21.48 -100,-8.00,21.30 -101,-6.10,15.10 -102,-16.15,19.76 -103,-8.90,17.10 -105,-17.50,20.10 -106,-16.50,14.60 -107,-13.60,18.50 -109,-10.00,16.00 -111,-15.18,16.77 -112,-9.00,21.50 -114,-9.80,13.60 -115,-9.70,13.20 -116,-14.08,14.08 -117,-15.90,15.20 -121,-12.40,16.90 -124,-14.42,16.25 -125,-9.30,14.20 -126,9,2.25 -127,8.7,2.08 -128,11.03,1.35 -129,11.03,1.35 -130,11.03,1.35 -131,11.03,1.35 -132,11.03,1.35 -133,11.03,1.35 -134,11.03,1.35 -135,11.03,1.35 -136,10.55,3.24 -137,10.55,3.24 -138,11.85,2.69 -139,11.85,2.69 -140,11.85,2.69 -141,11.85,2.69 -142,11.85,2.69 -143,11.85,2.69 -144,11.85,2.69 -145,11.85,2.69 -146,-21.96,23.76 -147,-21.96,23.76 -148,-21.96,23.76 -149,-21.96,23.76 -150,-21.33,24.3 -151,-21.33,24.3 -152,-18.78,24.71 -153,-18.78,24.71 -154,-18.78,24.71 -155,-18.78,24.71 -156,-18.78,24.71 -157,-18.43,25.03 -158,-18.59,23.99 -159,-19.31,25.39 -160,-23.82,24.25 -161,-23.98,23.9 -162,-24.68,22.28 -163,-18.07,25.22 -164,-18.44,25.46 -165,-25.18,21.19 -166,-25.18,21.19 -167,-25.18,21.19 -168,-25.18,21.19 -169,-25.18,21.19 -170,-23.57,24.24 -171,-23.57,24.24 -172,-23.57,24.24 -173,-23.57,24.24 -174,-23.57,24.24 -175,-24,25 -176,-18.54,25.08 -177,-20.63,24.81 -178,-20.63,24.81 -179,-24.41,25.52 -180,-19.22,23.03 -181,-19.22,23.03 -182,-19.3,23.57 -183,-19.3,23.57 -184,-19.3,23.57 -185,-19.3,23.57 -186,-19.57,23.59 -187,-19.65,23.38 -188,-19.65,23.38 -189,-19.358,22.831 -190,-19.65,23.38 -191,-22.16,29.15 -192,-22.16,29.15 -193,-22.16,29.15 -194,-21.36,21.84 -195,-23.47,20.48 -196,-20.1,24.81 -197,-20.1,24.81 -198,-20.1,24.81 -199,-19.75,24.37 -200,-19.45,22.46 -201,-18.87,22.39 -202,-19.42,23.85 -203,-23.24,27.5 -204,-24.67,25.76 -205,-23.78,22.4 -206,-22.23,28.64 -207,-19.74,23.1 -208,-20.01,23.18 -209,-18.589,24.111 -210,-25.146,22.005 -211,-25.146,22.005 -212,-25.23,22.05 -213,-21.17,27.5 -214,-18.57,24.067 -215,-18.57,24.067 -216,-19.025,25.9 -217,-20.08,24.65 -218,-26.66,21.83 -219,-20.33,23.83 -220,-19.33,22.87 -221,-18.6,25.6 -222,-21.26,26.18 -223,-24.017,21.87 -224,-24.545,20.818 -225,-25.129,21.41 -226,-19.40,23.00 -227,-21.70,21.70 -228,-23.1392,24.178 -229,-23.1096,24.0939 -230,-22.1384,23.7266 -231,-21.7793,23.2238 -232,-21.527,24.1481 -233,-21.2204,23.3095 -234,-18.834,24.1883 -235,-18.5234,24.4231 -236,-18.2749,24.4725 -237,-21.5383,21.5976 -238,-25.5575,20.7679 -239,-24.9999,21.1966 -240,-24.5926,20.3313 -241,-24.5773,20.3227 -242,-18.3912,23.2474 -243,-20.4123,21.4723 -244,-21.9139,28.9188 -245,-25,20.5 -246,11.61,1.29 -247,11.61,1.29 -248,11.61,1.29 -249,11.66,-1.48 -250,11.09,-1.46 -251,11.85,2.16 -252,11.85,2.16 -253,11.85,2.16 -254,12.14,0.95 -255,11.794,0.982 -256,-2.93,29.49 -257,-4.13,29.59 -258,5.43,9.66 -259,5.43,9.66 -260,8.23,13.81 -261,8.23,13.81 -262,8.23,13.81 -263,8.23,13.81 -264,8.23,13.81 -265,8.23,13.81 -266,8.64,14.57 -267,8.64,14.57 -268,2.91,14.75 -269,2.34,9.99 -270,3.17,12.99 -271,3.17,12.99 -272,3.17,12.99 -273,3.17,12.99 -274,8.19,12.71 -275,8.19,12.71 -276,8.19,12.71 -277,12.13,14.9 -278,12.13,14.9 -279,6.19,10.48 -280,6.19,10.48 -281,6.19,10.48 -282,5.27,8.95 -283,5.27,8.95 -284,2.29,15.69 -285,2.29,15.69 -286,2.29,15.69 -287,5.83,13.27 -288,2.46,14.57 -289,11.2,14.61 -290,11.2,14.61 -291,11.2,14.61 -292,5.545,12.316 -293,5.75,9.315 -294,8.417,13.25 -295,5.862,9.768 -296,4.219,9.173 -297,6.158,9.349 -298,4.353,10.36 -299,8.19,12.71 -300,8.23,13.81 -301,8.64,14.57 -302,2.4069,12.6924 -303,3.9,15.1 -304,2.855,16.47 -305,2.791,16.422 -306,8.16,19.76 -307,3.15,16.19 -308,3.15,16.19 -309,9,21 -310,9,21 -311,5.32,25.96 -312,2.35,16.18 -313,3.93,17.24 -314,3.93,17.24 -315,5.02,19.236 -316,7.766,20.217 -317,6.59,25.09 -318,5.65,22.3 -319,8.12,21.06 -320,4.377,18.586 -321,4.32,21.18 -322,5.03,23.04 -323,6.30,24.10 -324,17.2,22.3 -325,17.2,22.3 -326,10.85,19.65 -327,10.85,19.65 -328,10.85,19.65 -329,10.85,19.65 -330,4.19,29.51 -331,4.19,29.51 -332,1.5,28.5 -333,1.5,28.5 -334,1.5,28.5 -335,1.5,28.5 -336,2,28.5 -337,-2.11,28.02 -338,-2.11,28.02 -339,-10.632,27.83 -340,0.45,28.5 -341,0.98,21.39 -342,-0.4,27.36 -343,-0.4,27.36 -344,-2.45,20.9 -345,-2.45,20.9 -346,-2.45,20.9 -347,-2.45,20.9 -348,-2.45,20.9 -349,-1.28,20.98 -350,-9.12,26.51 -351,-9.12,26.51 -352,-9.12,26.51 -353,-9.12,26.51 -354,-9.12,26.51 -355,-0.99,29.29 -356,-0.99,29.29 -357,-0.99,29.29 -358,-0.99,29.29 -359,-0.99,29.29 -360,2.139,27.993 -361,-1.5,29.4 -362,-1.45,29.42 -363,2.92,26.84 -364,3.736,29.714 -365,2.28,27.52 -366,1.44,29.84 -367,0.38,29.38 -368,-6.12,19.433 -369,-3.7,18.933 -370,-2.1,18.417 -371,-1.34,29.36 -372,-1.183,29.45 -373,-0.784,29.293 -374,-6.8,22.766 -375,-0.733,29.233 -376,-3.41,29.135 -377,-1.41,29.2 -378,-1.65,29.2 -379,-0.15,29.55 -380,0.68,29.6 -381,-3.64,28.73 -382,-2.99,28.46 -385,-0.93,29.33 -386,-1.39,29.563 -387,0.617,29.883 -388,0.41,29.56 -389,-0.69,29.38 -390,3.88,18.68 -391,4.32,25.18 -392,-2.05,25 -393,-2.05,25 -394,2.8334,27.1776 -395,2.8724,27.221 -396,-4.8484,21.9107 -397,-4.6869,21.9299 -398,3.7467,28.6836 -399,3.7467,28.6836 -400,3.7022,29.7332 -401,3.9682,29.6295 -402,3.822,29.509 -403,3.8032,29.9086 -404,3.7623,29.9336 -405,3.6523,29.8528 -406,3.8,29.6956 -407,3.679,29.6251 -408,3.6271,29.6647 -409,3.6631,27.3678 -410,3.5396,27.0286 -411,2.4361,26.4438 -412,2.3027,26.4826 -413,2.3001,26.2433 -414,2.4914,26.349 -415,3.1303,26.9121 -416,3.0746,30.3358 -417,-1.5,29.4 -418,-2.609,14.053 -419,-3.912,11.432 -420,-2.646,15.361 -421,3.53,17.36 -422,2.49,16.72 -423,2.49,16.72 -424,2.49,16.72 -425,0.95,14.95 -426,0.95,14.95 -427,0.95,14.95 -428,0.95,14.95 -429,0.95,14.95 -430,0.95,14.95 -431,1.616,16.05 -432,0.80,15.00 -433,-3.0253,16.1324 -434,2.4665,16.5519 -435,9.33,-3.71 -436,9.33,-3.71 -437,9.33,-3.71 -438,8.737,-3.74 -439,8.737,-3.74 -440,9.33,-3.71 -441,5.253,-4.853 -442,7.096,-6.026 -443,7.096,-6.026 -444,7.096,-6.026 -445,7.563,-8.465 -446,5.602,-7.179 -447,5.602,-7.179 -448,5.602,-7.179 -449,5.602,-7.179 -450,5.602,-7.179 -451,5.602,-7.179 -452,5.602,-7.179 -453,5.602,-7.179 -454,5.602,-7.179 -455,5.602,-7.179 -456,5.602,-7.179 -457,5.602,-7.179 -458,7.903,-4.774 -459,11.744,42.688 -460,11.744,42.688 -461,11.744,42.688 -462,11.744,42.688 -463,11.744,42.688 -464,12.465,42.402 -466,28.503,33.83 -467,29.5,34.8 -468,29.5,34.8 -471,30.247,28.913 -472,30.247,28.913 -473,30.247,28.913 -474,29.205,25.519 -475,22.191,36.352 -476,22.191,36.352 -477,22.191,36.352 -478,22.191,36.352 -479,28.711,33.615 -480,28.496,34.306 -481,28.651,33.644 -482,28.651,33.644 -483,28.651,33.644 -484,28.651,33.644 -485,28.651,33.644 -486,28.361,33.917 -487,28.361,33.917 -488,28.25,34.028 -489,22.04,36.58 -490,22.15,36.44 -491,22.73,34.70 -492,1.519,10.108 -493,1.519,10.108 -494,15.47,37.1 -495,16.63,38.33 -496,16.47,37.8 -497,15.82,38.43 -498,15.6,39.3 -499,15.6,39.3 -500,15.6,39.3 -501,15.79,38.8 -502,15.79,38.8 -503,7.54,38.48 -504,7.54,38.48 -505,9.09,38.74 -506,9.09,38.74 -507,9.09,38.74 -508,13.52,38.4 -509,8.96,39.9 -510,8.96,39.9 -511,8.65,42.61 -512,8.65,42.61 -513,6.749,39.735 -514,6.749,39.735 -515,6.749,39.735 -516,6.749,39.735 -517,8,34.07 -518,12.6,37.47 -519,12.6,37.47 -520,9,40.82 -521,9,40.82 -522,5.51,36.35 -523,5.51,36.35 -524,5.99,37.85 -525,5.99,37.85 -526,5.99,37.85 -527,5.99,37.85 -528,5.82,35.83 -529,5.82,35.83 -530,5.82,35.83 -531,7.18,38.34 -532,7.18,38.34 -533,13.31,38.27 -534,13.31,38.27 -535,13.31,38.27 -536,13.31,38.27 -537,13.31,38.27 -538,5.22,38.57 -539,5.22,38.57 -540,10.53,40.88 -541,10.53,40.88 -542,10.53,40.88 -543,10.53,40.88 -544,9.305,42.133 -545,6.62,43.55 -546,6.62,43.55 -547,7.00,39.70 -548,9.0445,38.6967 -549,9.0639,38.547 -550,9.0104,34.7012 -551,-2.34,14.05 -552,-1.83,12.37 -553,0,12.7 -554,0,12.7 -555,-2.045,9.6 -556,-0.37,11.62 -557,-0.37,11.62 -558,-0.37,11.62 -559,-0.37,11.62 -560,1.91,13.05 -561,0.79,10.1 -562,0.79,10.1 -563,-2.32,10.31 -564,0.07,9.92 -565,-1.17,11.1 -566,0.974,13.38 -567,-2.333,11.183 -568,-1.5,13.16 -569,0,12.7 -570,0,12.7 -571,-1.20,11.90 -572,-1.20,11.90 -573,0.1768,12.9879 -574,-0.2699,12.7138 -575,-0.9773,12.3016 -576,-0.2151,11.5191 -577,-0.5203,11.4897 -578,-0.6079,11.6042 -579,-0.6606,11.5551 -580,-0.1773,11.4754 -581,-0.3088,11.6332 -582,-0.0333,12.3136 -583,1.3084,11.6978 -584,-2.2737,14.0952 -585,13.39,-16.651 -586,13.5,-16.53 -587,13.4,-15.84 -588,13.43,-15.8 -589,13.53,-14.03 -590,6.926,-0.148 -591,5.262,-2.579 -592,10.887,-1.267 -593,7.333,-1.367 -594,9.62,-1.75 -595,9.62,-1.75 -596,9.62,-1.75 -597,9.62,-1.75 -598,9.62,-1.75 -599,9.62,-1.75 -600,9.62,-1.75 -601,5.454,-0.613 -602,5.9,0.066 -603,6.582,-1.121 -604,6.8,-2.517 -605,5.7,-1.284 -606,9.60,-1.80 -607,9.4323,-1.7133 -608,9.3845,-2.0271 -609,11.338,-14.218 -610,11.362,-14.702 -611,7.35,-8.95 -612,8.345,-9.348 -613,10.26,-10.08 -614,10.26,-10.08 -615,10.26,-10.08 -616,10.87,-14.67 -617,10.189,-13.024 -618,7.633,-8.434 -619,7.633,-8.434 -620,11.24,-15.06 -621,11.24,-15.06 -622,11.9,-14.03 -623,11.9,-14.03 -624,11.75,-14.46 -625,11.75,-14.46 -626,11.75,-14.46 -627,11.75,-14.46 -628,11.586,-14.746 -629,-0.455,36.739 -630,-0.455,36.739 -631,-0.455,36.739 -632,-0.455,36.739 -633,-0.455,36.739 -634,-0.455,36.739 -635,-0.455,36.739 -636,-0.455,36.739 -637,2.95,39.7 -638,-1,36.367 -639,2.579,39.983 -640,1.272,35.471 -641,1.272,35.471 -642,1.272,35.471 -643,-2.627,37.254 -644,-2.627,37.254 -645,-2.627,37.254 -646,-2.627,37.254 -647,-2.627,37.254 -648,-2.627,37.254 -649,-2.627,37.254 -650,-3.332,39.878 -651,-1.45,40.227 -652,3.5,41.1 -653,1.783,36.783 -654,0.16,38.35 -655,-1.552,41.361 -656,2.838,39.847 -657,3.283,40.983 -658,-4.294,39.578 -659,-1.858,41.117 -660,1.283,36.716 -661,0.515,35.266 -662,0.515,35.266 -663,-0.487,36.154 -664,-0.533,37.45 -665,-0.238,36.07 -666,3.4,41.4 -667,-3.284,39.167 -668,-0.492,36.319 -669,0.52,37.07 -670,0.45,37.37 -671,-3.93,38.96 -672,-3.63,38.74 -673,-3.5,38.44 -674,-3.26,38.47 -675,1.22,36.39 -676,-1.81,35.66 -677,-1.24,35.69 -678,-1.04,36.02 -679,-1.07,34.83 -680,-1.42,35.46 -681,-1.96,35.95 -682,-2.15,36.6 -683,-2.05,36.86 -684,-2.11,37.34 -685,-2.8,37.7 -686,0.43,37.1 -687,3.5,37.78 -688,0.35,37.58 -689,0.35,37.58 -690,-1.84,36.79 -691,-1.84,36.79 -692,0.498,35.732 -693,1.05,35.43 -694,0.259,34.884 -695,1.25,35.5 -696,1.254,35.09 -697,2.07,35.453 -698,-1.237,36.83 -699,-1.167,36.5 -700,-1.167,36.5 -701,2.237,40.726 -702,-1.103,36.632 -703,-2.417,37.967 -704,-2.49,40.61 -705,-0.68,34.77 -706,-0.68,34.77 -707,-0.06,34.75 -708,1.017,35 -709,-1.481,36.958 -710,-1.23,38.08 -711,-0.3,38.74 -712,3,39.33 -713,0.36,36.78 -714,0.36,36.78 -715,0.36,36.78 -716,1.6,37.81 -717,0.635,36.121 -718,0.256,36.127 -719,-0.41,36.11 -720,-0.41,36.11 -721,-0.41,36.11 -722,-0.41,36.11 -723,-0.41,36.11 -724,-0.667,34.283 -725,-0.667,34.283 -726,-0.667,34.283 -727,4.414,35.813 -728,-1.174,36.683 -729,-1.174,36.683 -730,-1.66,35.83 -731,-1.66,35.83 -732,-1.66,35.83 -733,-2.925,37.51 -734,-1.23,34.81 -735,0.3,37.075 -736,0.3,37.075 -737,0.3,37.075 -738,0.3,37.075 -739,-2.022,36.045 -740,1.514,37.554 -741,-1.482,37.289 -742,-1.482,37.289 -743,-1.482,37.289 -744,-2.278,37.825 -745,3.92,41.85 -746,1.11,36.717 -747,1.11,36.717 -748,0.087,37.446 -749,-1.53,35.17 -750,-1.53,35.17 -751,-1.53,35.17 -752,-1.53,35.17 -753,-1.53,35.17 -754,-1.53,35.17 -755,-1.53,35.17 -756,-1.53,35.17 -757,-1.53,35.17 -758,-0.007,34.599 -759,1.25,37.25 -760,1.25,37.25 -761,1.25,37.25 -762,-0.667,36.033 -763,-0.614,35.742 -764,-1.363,36.739 -765,3.95,41.28 -766,0.1,38.2 -767,0.1,38.2 -768,0.1,38.2 -769,0.1,38.2 -770,1.103,34.6 -771,1.103,34.6 -772,-0.18,37.38 -773,-0.18,37.38 -774,-0.18,37.38 -775,-0.18,37.38 -776,-0.18,37.38 -777,-0.18,37.38 -778,-0.18,37.38 -779,-0.18,37.38 -780,2.689,36.943 -781,-0.929,36.458 -782,2.273,37.964 -783,2.273,37.964 -784,2.133,36.85 -785,-1.181,36.377 -786,-1.181,36.377 -787,3.518,39.04 -788,0.513,37.252 -789,0.333,34.483 -790,-1.844,38.213 -791,-0.939,38.06 -792,-1.37,36.84 -793,-1.37,36.84 -794,-1.37,36.84 -795,-1.37,36.84 -796,-1.37,36.84 -797,-1.37,36.84 -798,-1.37,36.84 -799,-1.37,36.84 -800,-1.37,36.84 -801,-1.267,36.879 -802,-0.718,36.4 -803,-0.718,36.4 -804,-0.718,36.4 -805,-0.718,36.4 -806,0.109,35.173 -807,0.017,37.07 -808,0.017,37.07 -809,-1.085,35.867 -810,-1.085,35.867 -811,-1.085,35.867 -812,-1.085,35.867 -813,-1.416,36.642 -814,-1.797,36 -815,-1.797,36 -816,0.15,36.43 -817,0.208,37.878 -818,0.208,37.878 -819,-1.141,37.265 -820,0.052,39 -821,0.169,36.425 -822,0.58,37.575 -823,0.58,37.575 -824,0.58,37.575 -825,0.58,37.575 -826,0.58,37.575 -827,0.67,37.873 -828,-4.255,39.383 -829,-4.628,39.363 -830,0.067,34.28 -831,4.01,36.35 -832,1.4,35.4 -833,3.355,40.22 -834,-1.815,40.124 -835,-1.815,40.124 -836,2.21,40.12 -837,-3.4,37.683 -838,-3.4,37.683 -839,-0.667,35.533 -840,-2.985,38.458 -841,-2.985,38.458 -842,-2.985,38.458 -843,-2.985,38.458 -844,-2.985,38.458 -845,-2.985,38.458 -846,-2.985,38.458 -847,-2.41,38.64 -848,-3.27,38.06 -849,-3.27,38.06 -850,1.92,35.33 -851,1.75,40.07 -852,0.66,37.46 -853,-1.467,37.183 -854,0.82,35.52 -855,0.82,35.52 -856,-1.15,35.77 -857,0.88,35.11 -858,-1.18,37.12 -859,0.68,35.1 -860,-0.124,35.943 -861,-1.63,37 -862,-1.9,36.3 -863,-2.48,36.77 -864,0.85,35.05 -865,0.85,35.05 -866,-0.69,35.11 -867,-1.82,37.15 -868,-3.4,38.56 -869,0.80,37.50 -870,0.10,38.20 -871,-1.50,35.10 -872,-1.40,36.90 -873,-3.00,38.00 -874,-3.00,39.00 -875,-1.4972,36.6726 -876,-1.6135,36.7174 -877,-2.8161,38.1473 -878,1.073,35.2871 -879,-1.3345,38.6644 -880,-1.4226,36.8473 -881,-1.1088,36.5234 -882,-0.4294,36.102 -883,-0.6986,36.3578 -884,-0.8683,36.2074 -885,-1.7446,36.3396 -886,-1.7837,36.3508 -887,-1.4803,35.1052 -888,-1.2992,34.8167 -889,-1.6613,35.3135 -890,-1.401,34.8578 -891,-0.3062,37.1866 -892,-0.3075,37.5967 -893,0.003,37.6178 -894,0.1262,36.8511 -895,1.0857,38.2465 -896,-0.4115,36.0993 -897,0.5476,37.2778 -898,-3.6851,39.2473 -899,0.1099,36.7982 -900,0.1601,36.689 -901,0.1252,36.8827 -902,0.1113,36.8903 -903,-0.0001,36.8788 -904,-3.3767,38.5138 -905,-1.7,35 -906,-1.7,35 -907,1.103,34.6 -908,-29.33,27.53 -909,5.399,-7.719 -910,5.479,-8.55 -911,5.479,-8.55 -912,5.479,-8.55 -913,6.3,-10.8 -914,6.617,-8.55 -915,6.3,-9.01 -916,6.49,-8.862 -917,6.3345,-10.6443 -918,-15.74,34.97 -919,-16.25,34.75 -920,-16.25,34.75 -921,-13.98,33.79 -922,-10.61,33.89 -923,-10.61,33.89 -924,-10.61,33.89 -925,-10.61,33.89 -926,-15.37,35.31 -927,-12.78,33.4 -928,-10.75,33.93 -929,-13.78,34.46 -930,-12.9,34.1 -931,-14.06,34.9 -932,-15.95,34.58 -933,-13.0872,33.1512 -934,-13.1053,33.1605 -935,-13.0286,33.9612 -936,12.88,-8.62 -937,13.84,-8.92 -938,12.6,-8.7 -939,12.65,-10.3 -6174,19.558323,-16.401927 -6175,21.526448,-12.864365 -941,31.956,-6.336 -942,31.956,-6.336 -943,32.36,-5.875 -944,32.36,-5.875 -945,32.36,-5.875 -946,32.36,-5.875 -947,32.36,-5.875 -948,32.36,-5.875 -949,32.36,-5.875 -950,32.477,-4.927 -951,32.477,-4.927 -952,32.68,-6.8 -953,28.382,-10.687 -954,33.712,-4.975 -955,32.91,-5.12 -956,32.477,-4.927 -957,33.64,-4.05 -958,32.29,-5.49 -959,32.928,-5.59 -960,34.17,-3.98 -961,34.17,-3.98 -962,33.48,-6.07 -963,33.56,-5.24 -964,32.11,-6.305 -965,32.331,-5.937 -966,29.82,-9.12 -967,31.12,-7.87 -968,-22.75,32.81 -969,-11.61,36.9 -970,-19.77,33.05 -971,-16.56,38.42 -972,-18.72,34.42 -973,-18.72,34.42 -974,-18.72,34.42 -975,-18.72,34.42 -976,-18.412,35.026 -977,-18.219,35.16 -978,-23.656,32.175 -979,-12,37.8 -980,-26.434,32.81 -981,-26.434,32.81 -982,-18.82,35.94 -983,-11.735,36.287 -984,-12.579,36.532 -985,-11.716,39.65 -986,-12.457,37.639 -987,-12.19,38.03 -988,-12.04,37.21 -989,-12.04,37.21 -990,-12.11,40.43 -991,-18.65,36.12 -992,-18.65,36.12 -993,-21.64,33.62 -994,-11.01,39.62 -995,-12.00,37.00 -996,-12.00,37.00 -997,-12.00,37.00 -998,-12.00,37.00 -999,-12.40,37.60 -1001,-12.20,38.00 -1003,-14.8612,32.2915 -1004,-12.5962,34.9996 -1005,-12.1415,36.1377 -1006,-17.096,12.98 -1007,-22.53,16.97 -1008,-22.53,16.97 -1009,-22.53,16.97 -1010,-22.53,16.97 -1011,-22.53,16.97 -1012,-19.02,16.35 -1013,-19.02,16.35 -1014,-19.02,16.35 -1015,-19.02,16.35 -1016,-19.02,16.35 -1017,-28.06,17.33 -1018,-28.06,17.33 -1019,-24.52,17.79 -1020,-24.52,17.79 -1021,-25.544,19.745 -1022,-19.318,14.428 -1023,-19.318,14.428 -1024,-18.77,13.6 -1025,-19.01,20.67 -1026,-19.01,20.67 -1027,-19.01,20.67 -1028,-19.01,20.67 -1029,-19.01,20.67 -1030,-19.01,20.67 -1031,-19.01,20.67 -1032,-19.01,20.67 -1033,-19.01,20.67 -1034,-19.01,20.67 -1035,-18.48,20.74 -1036,-23.7,15.5 -1037,-23.61,15.09 -1038,-23.61,15.09 -1039,-18.39,23.63 -1040,-18.39,23.63 -1041,-18.39,23.63 -1042,-18.21,21.674 -1043,-18.21,21.674 -1044,-22.743,15.633 -1045,-18.1,23.52 -1046,-18.1,23.52 -1047,-25.215,16.02 -1048,-25.215,16.02 -1049,-25.215,16.02 -1050,-19.76,20.62 -1051,-19.76,20.62 -1052,-19.76,20.62 -1053,-19.76,20.62 -1054,-19.76,20.62 -1055,-19.76,20.62 -1056,-20.847,16.682 -1057,-19.373,15.783 -1058,-22.7,15.42 -1059,-22.009,16.959 -1060,-22.009,16.959 -1061,-22.009,16.959 -1062,-20.432,17.258 -1063,-20.432,17.258 -1064,-20.432,17.258 -1065,-20.432,17.258 -1066,-20.432,17.258 -1067,-20.432,17.258 -1068,-20.432,17.258 -1069,-18.014,22.363 -1070,-18.014,22.363 -1071,-17.94,21.23 -1072,-17.94,21.23 -1073,-22.45,18.96 -1074,-24.86,18.81 -1075,-17.78,23.85 -1076,-17.78,23.85 -1077,-18.17,13.8 -1078,-18.17,13.8 -1079,-19.63,17.43 -1080,-28.7,18.55 -1081,-22.90,17.70 -1082,-22.30,16.90 -1083,-22.20,17.60 -1084,-21.60,16.40 -1085,-22.60,16.70 -1090,-22.50,17.00 -1094,-19.14,20.14 -1095,-21.6196,20 -1096,-21.479,16.4574 -1097,-21.6078,16.4067 -1098,-20.7896,19.9967 -1099,-19.914,16.1918 -1100,-24.1521,16.2544 -1101,-24.1954,16.1514 -1102,-20.0934,17.5168 -1103,-20.8011,20.1926 -1104,-20.5101,16.7498 -1105,-20.4627,17.171 -1106,-20.463,17.1714 -1107,-20.4364,17.1139 -1108,-20.3995,17.0962 -1109,-20.4582,17.0907 -1110,-20.389,17.0827 -1111,-20.4587,17.1401 -1112,-20.4674,16.9741 -1113,-20.4788,17.1425 -1114,-20.4331,17.0815 -1115,-20.8792,20.8462 -1116,-21.4373,20.6209 -1117,-19.7844,20.543 -1118,-20.4613,17.2081 -1119,-20.66634,16.92056 -1120,-21.5093,16.80766 -1121,-22.26758,17.46948 -1122,-22.35345,17.45896 -1123,-19.63946,17.57379 -1124,-18.82943,17.19769 -1125,-25.26818,16.36474 -1126,-19.69266,15.48128 -1127,-22.51033,17.52138 -1128,-25.51738,16.17366 -1129,-25.67156,16.18363 -1130,-21.01747,16.54908 -1131,-22.45307,17.43135 -1132,-22.4752,17.33537 -1133,-25.28032,16.15274 -1134,-24.71136,15.96781 -1135,-24.81274,16.14094 -1136,-22.40022,17.53767 -1137,-22.51507,17.28279 -1138,-24.16225,16.34949 -1139,-21.92215,17.30766 -1140,-24.70415,15.82466 -1141,-25.50518,15.98153 -1142,-24.97068,16.02452 -1143,-19.67053,16.84149 -1144,-20.80165,16.99902 -1145,-21.98524,17.48256 -1146,-23.54597,16.79061 -1147,-21.86273,15.70514 -1148,-20.97864,16.44291 -1149,-22.8329,17.41343 -1150,-19.63722,17.46236 -1151,-24.88835,16.15257 -1152,-24.88341,16.19184 -1153,-22.60093,17.29999 -1154,-25.0047,16.20307 -1155,-25.01991,16.30298 -1156,-22.17482,16.3187 -1157,-18.66803,18.6503 -1158,-22.35626,17.40204 -1159,-24.3489,16.2284 -1160,-24.29271,16.29091 -1161,-22.22135,16.91315 -1162,-25.84155,16.12503 -1163,-22.87457,16.97894 -1164,-22.87849,16.57504 -1165,-20.49323,17.45312 -1166,-22.19932,17.00923 -1167,-22.37213,17.34612 -1168,-22.56606,16.8417 -1169,-23.88794,16.01535 -1170,-22.41434,19.63359 -1171,-18.94894,18.51763 -1172,-28.57604,18.43745 -1173,-22.4429,16.96228 -1174,-22.40366,17.42077 -1175,-22.0805,17.61863 -1176,-22.2786,17.51875 -1177,-22.48236,17.16893 -1178,-22.3233,17.28317 -1179,-24.69157,16.16429 -1180,-25.69306,19.96237 -1181,-25.67014,19.8199 -1182,-19.3116,17.72762 -1183,-23.02928,16.96388 -1184,-22.39177,17.27939 -1185,-22.35727,17.18884 -1186,-25.13301,16.49937 -1187,-23.65148,16.03004 -1188,-23.85362,16.39001 -1189,-22.07715,16.55057 -1190,-21.89686,17.46809 -1191,-21.70101,15.07487 -1192,-22.78792,15.79391 -1193,-24.60529,16.50538 -1194,-22.5748,17.34819 -1195,-25.88909,16.25821 -1196,-22.07924,15.58833 -1197,-21.60679,17.80866 -1198,-22.81579,15.93276 -1199,-24.47428,16.15087 -1200,-21.73061,17.89358 -1201,-22.98901,17.05678 -1202,-24.55369,16.17436 -1203,-24.55567,15.91568 -1204,-24.01387,15.80791 -1205,-24.46174,16.24874 -1206,-21.95274,16.32619 -1207,-22.78208,16.89351 -1208,-24.52756,16.0687 -1209,-24.89183,16.27226 -1210,-25.51181,16.99956 -1211,-22.10552,16.46305 -1212,-23.13065,15.64886 -1213,-24.12535,16.264 -1214,-22.55594,16.4085 -1215,-22.70894,17.96466 -1216,-22.1699,17.34605 -1217,-22.45266,17.24693 -1218,-22.25281,17.28456 -1219,-21.88746,16.17054 -1220,-23.95702,16.57749 -1221,-22.88287,17.85464 -1222,-21.28656,18.07478 -1223,-23.26882,17.51859 -1224,-20.48224,15.97942 -1225,-20.84317,16.15199 -1226,-20.88298,16.48648 -1227,-20.43953,15.6662 -1228,-23.06927,17.38185 -1229,-24.36984,16.28714 -1230,-22.01686,17.58633 -1231,-22.83548,17.99219 -1232,-23.39011,16.38779 -1233,-21.91979,16.61733 -1234,-22.46133,16.20418 -1235,-21.73261,15.60982 -1236,-21.99211,16.49679 -1237,-21.82673,16.99622 -1238,-25.00207,16.38653 -1239,-21.35698,17.42047 -1240,-22.24757,17.21027 -1241,-20.90018,17.51203 -1242,-22.27593,15.77316 -1243,-23.03549,16.23022 -1244,-22.15331,16.49733 -1245,-22.56761,17.7826 -1246,-19.34527,17.13282 -1247,-22.78704,16.11177 -1248,-22.69482,16.99946 -1249,-21.59152,19.888 -1250,-20.92258,17.07799 -1251,-18.81901,18.73853 -1252,-21.03186,16.81838 -1253,-21.31978,17.93148 -1254,-24.63866,16.61818 -1255,-22.86967,17.19108 -1256,-19.37277,17.99841 -1257,-21.36501,17.72851 -1258,-20.06772,15.78045 -1259,-21.54847,17.90042 -1260,-22.76331,17.07965 -1261,-22.78128,17.045 -1262,-22.82952,16.52368 -1263,-22.94841,15.94339 -1264,-19.20637,17.49349 -1265,-22.62864,17.5032 -1266,-22.29034,16.93594 -1267,-22.82103,16.8039 -1268,-22.76607,16.50948 -1269,-23.61403,16.59207 -1270,-22.63104,19.52229 -1271,-21.77188,16.30742 -1272,-22.44567,16.86565 -1273,-23.36344,17.46731 -1274,-21.82445,16.67787 -1275,-22.68616,18.12692 -1276,18.7,8.5 -1277,19.3,8.5 -1278,19.3,8.5 -1279,15.24,5.2 -1280,12.378,2.5 -1281,12.378,2.5 -1282,12.378,2.5 -1283,12.378,2.5 -1284,10.389,9.42 -1285,5.557,7.63 -1286,11.93,10.18 -1287,10.65,6.58 -1288,5.59,8.54 -1289,5.59,8.54 -1290,5.25,8.7 -1291,5.25,8.7 -1292,7.072,11.706 -1293,7.542,11.614 -1294,7.542,11.614 -1295,7.542,11.614 -1296,7.542,11.614 -1297,7.542,11.614 -1298,12.64,10.71 -1299,12.64,10.71 -1300,11.092,13.746 -1301,5.064,8.318 -1302,5.064,8.318 -1303,9.95,9.05 -1304,10.05,4.21 -1305,10.05,4.21 -1306,10.05,4.21 -1307,10.05,4.21 -1308,10.05,4.21 -1309,10.05,4.21 -1310,8.8,10.63 -1311,8.8,10.63 -1312,8.8,10.63 -1313,8.8,10.63 -1314,10.8,6.3 -1315,8.8,11.05 -1316,11.351,6.834 -1317,6.89,11.14 -1318,8.721,12.516 -1319,10.618,13.389 -1320,10.267,13.267 -1321,6.6,9.31 -1322,6.866,5.35 -1323,5.817,7.35 -1324,6.313,5.234 -1325,6.313,5.234 -1326,7.917,4.398 -1327,11.25,13.417 -1328,7.067,6.648 -1329,9.825,10.53 -1330,9.825,10.53 -1331,9.825,10.53 -1332,5.48,7.033 -1333,6.66,8.8 -1334,7.6133,10.0462 -1335,5.198,6.3856 -1336,4.8771,6.088 -1337,-1.549,30.649 -1338,-1.549,30.649 -1339,-1.549,30.649 -1340,-1.38,29.8 -1341,-1.98,30.00 -1342,-1.385,29.6 -1343,-1.385,29.6 -1344,15.5,-14.1 -1345,15.5,-14.1 -1346,13.03,-12.99 -1347,13.03,-12.99 -1348,13.03,-12.99 -1349,13.03,-12.99 -1350,13.03,-12.99 -1351,15.619,-14.4 -1352,13.93,-16.66 -1353,7.96,-11.8 -1354,8.57,-13.16 -1355,8.55,-13.07 -1356,9.674,-12.223 -1357,8.33,-13.16 -1358,8.449,-13.21 -1359,8.33,-13.16 -1360,8.33,-13.16 -1361,8.33,-13.16 -1362,9.752,-11.192 -1363,9.752,-11.192 -1364,7.36,-11.18 -1365,7.36,-11.18 -1366,7.36,-11.18 -1367,7.699,-12.287 -1368,8.277,-10.574 -1369,8.277,-10.574 -1370,9.173,-11.138 -1371,9.173,-11.138 -1372,9.173,-11.138 -1373,9.173,-11.138 -1374,8.623,-11.659 -1375,8.882,-12.044 -1376,8.635,-11.471 -1377,9.102,-12.356 -1378,9.812,-11.568 -1379,9.732,-12.026 -1380,9.732,-12.026 -1381,9.732,-12.026 -1382,9.414,-12.23 -1383,7.505,-11.478 -1384,8.735,-11.355 -1385,8.921,-10.778 -1386,8.921,-10.778 -1387,7.544,-11.349 -1388,9.569,-11.57 -1389,9.569,-11.57 -1390,8.52,-10.66 -1391,1.10,43.90 -1393,9.996,45.246 -1394,1.10,44.00 -1395,9.996,45.246 -1396,9.996,45.246 -1397,9.996,45.246 -1398,10.77,47.273 -1399,10.77,47.273 -1400,9.5,44.06 -1401,3.628,44.171 -1402,-1.314,41.521 -1403,10.37,46 -1404,8.226,49.441 -1406,1.40,43.70 -1408,1.40,44.30 -1409,8.226,49.441 -1410,9.555,50.511 -1411,-33.5,25.75 -1412,-33.5,25.75 -1413,-33.5,25.75 -1414,-33.5,25.75 -1415,-33.5,25.75 -1416,-27.85,32.35 -1417,-33.63,24.116 -1418,-33.63,24.116 -1419,-33.63,24.116 -1420,-33.63,24.116 -1421,-33.63,24.116 -1422,-33.63,24.116 -1423,-33.63,24.116 -1424,-33.63,24.116 -1425,-33.63,24.116 -1426,-33.335,26.457 -1427,-33.335,26.457 -1428,-33.335,26.457 -1429,-33.335,26.457 -1430,-33.376,26.395 -1431,-33.066,26.82 -1432,-33.66,26.656 -1433,-32.88,27.4 -1434,-33.48,26.05 -1435,-33.48,26.05 -1436,-33.48,26.05 -1437,-33.975,25.387 -1438,-33.945,23.682 -1439,-33.945,23.682 -1440,-33.945,23.682 -1441,-25.907,27.763 -1442,-26.085,27.71 -1443,-26.085,27.71 -1444,-25.86,27.56 -1445,-25.86,27.56 -1446,-25.86,27.56 -1447,-27.78,30.1 -1448,-29.409,29.567 -1449,-29.409,29.567 -1450,-28.259,31.906 -1451,-28.259,31.906 -1452,-28.259,31.906 -1453,-28.259,31.906 -1454,-28.259,31.906 -1455,-28.259,31.906 -1456,-28.259,31.906 -1457,-27.5,31.29 -1458,-27.5,31.29 -1459,-28.236,32.359 -1460,-27.647,32.251 -1461,-27.647,32.251 -1462,-27.647,32.251 -1463,-27.647,32.251 -1464,-27.647,32.251 -1465,-27.647,32.251 -1466,-27.85,32.35 -1467,-27.85,32.35 -1468,-27.85,32.35 -1469,-27.85,32.35 -1470,-27.85,32.35 -1471,-27.85,32.35 -1472,-27.85,32.35 -1473,-27.85,32.35 -1474,-27.791,32.363 -1475,-27.76,30.861 -1476,-27.76,30.861 -1477,-24.45,31.06 -1478,-24.65,31.50 -1479,-24.163,30.539 -1480,-24.163,30.539 -1481,-24.208,31.175 -1482,-24.208,31.175 -1483,-24.208,31.175 -1484,-23.74,31.09 -1485,-23.74,31.09 -1486,-23.74,31.09 -1487,-23.117,31.433 -1488,-22.996,29.561 -1489,-22.996,29.561 -1490,-22.996,29.561 -1491,-22.533,29.95 -1492,-22.533,29.95 -1493,-23.862,28.273 -1494,-23.862,28.273 -1495,-23.862,28.273 -1496,-23.862,28.273 -1497,-23.862,28.273 -1498,-23.862,28.273 -1499,-23.862,28.273 -1500,-24.197,28.952 -1501,-24.197,28.952 -1502,-22.917,30.167 -1503,-23,30 -1504,-23,30 -1505,-23,30 -1506,-23,30 -1507,-23,30 -1508,-24.391,31.3 -1509,-24.391,31.3 -1510,-24.391,31.3 -1511,-24.391,31.3 -1512,-24.391,31.3 -1513,-24.391,31.3 -1514,-24.292,27.823 -1515,-24.292,27.823 -1516,-23,31.25 -1517,-23,31.25 -1518,-23,31.25 -1519,-23,31.25 -1520,-23,31.25 -1521,-23,31.25 -1522,-23,31.25 -1523,-23,31.25 -1524,-23,31.25 -1525,-23,31.25 -1526,-23,31.25 -1527,-23,31.25 -1528,-23,31.25 -1529,-23,31.25 -1530,-24.862,31.189 -1531,-24.96,31.312 -1532,-25.07,31.44 -1533,-25.07,31.44 -1534,-25.07,31.44 -1535,-25.07,31.44 -1536,-25.07,31.44 -1537,-25.07,31.44 -1538,-25.07,31.44 -1539,-25.07,31.44 -1540,-24.393,31.778 -1541,-24.393,31.778 -1542,-24.82,31.5 -1543,-24.82,31.5 -1544,-24.82,31.5 -1545,-24.82,31.5 -1546,-24.82,31.5 -1547,-24.82,31.5 -1548,-24.82,31.5 -1549,-24.82,31.5 -1550,-24.82,31.5 -1551,-24.82,31.5 -1552,-24.82,31.5 -1553,-24.82,31.5 -1554,-24.82,31.5 -1555,-24.82,31.5 -1556,-24.82,31.5 -1557,-24.82,31.5 -1558,-24.82,31.5 -1559,-25.942,31.05 -1560,-24.75,26.3 -1561,-24.75,26.3 -1562,-25.25,27.1 -1563,-25.25,27.1 -1564,-28.833,23.167 -1565,-28.473,20.188 -1566,-28.473,20.188 -1567,-28.473,20.188 -1568,-28.473,20.188 -1569,-28.473,20.188 -1570,-28.473,20.188 -1571,-25.5,20.5 -1572,-25.5,20.5 -1573,-25.5,20.5 -1574,-25.5,20.5 -1575,-25.5,20.5 -1576,-25.5,20.5 -1577,-25.5,20.5 -1578,-25.5,20.5 -1579,-25.5,20.5 -1580,-25.5,20.5 -1581,-25.5,20.5 -1582,-25.5,20.5 -1583,-25.5,20.5 -1584,-25.5,20.5 -1585,-25.788,20.032 -1586,-26.205,20.685 -1587,-30.208,17.931 -1588,-27.587,23.412 -1589,-28.373,17.1 -1590,-28.373,17.1 -1591,-28.373,17.1 -1592,-28.373,17.1 -1593,-28.373,17.1 -1594,-29.682,17.82 -1595,-33.806,19.094 -1596,-33.347,19.745 -1597,-33.347,19.745 -1598,-34,19.022 -1599,-34,19.022 -1600,-34,19.022 -1601,-34,19.022 -1602,-34,19.022 -1603,-34,19.022 -1604,-34,19.022 -1605,-34,19.022 -1606,-32.5,19.1 -1607,-32.5,19.1 -1608,-32.355,19.1 -1609,-32.355,19.1 -1610,-32.355,19.1 -1611,-32.355,19.1 -1612,-32.355,19.1 -1613,-32.355,19.1 -1614,-32.355,19.1 -1615,-33.164,19.206 -1616,-32.355,19.1 -1617,-33.164,19.206 -1618,-33.915,19.223 -1619,-33.718,21.9 -1620,-33.718,21.9 -1621,-33.718,21.9 -1622,-33.718,21.9 -1623,-33.718,21.9 -1624,-33.718,21.9 -1625,-33.887,22.452 -1626,-33.887,22.452 -1627,-32.649,19.409 -1628,-33.989,24.727 -1629,-33.989,24.727 -1630,-32.50,19.80 -1631,-34,19.022 -1632,-33.984,23.366 -1633,-34.032,23.035 -1634,-34.032,23.035 -1635,-34.032,23.035 -1636,-34.032,23.035 -1637,-33.956,20.376 -1638,-32.497,18.93 -1639,-34.192,19.183 -1640,-34.192,19.183 -1641,-32.89,18.715 -1642,-32.905,19.253 -1643,-32.817,19.383 -1644,-34.362,18.848 -1645,-34.362,18.848 -1646,-33.336,22.095 -1647,-33.336,22.095 -1648,-33.758,25.363 -1649,-33.886,19.133 -1650,-33.886,19.133 -1651,-33.872,18.913 -1652,-32.238,19.193 -1653,-22.474,31.233 -1654,-22.474,31.233 -1655,-22.224,29.319 -1656,-22.224,29.319 -1657,-22.655,28.371 -1658,-22.655,28.371 -1659,-25.454,29.259 -1660,-25.454,29.259 -1661,-25.382,26.044 -1662,-25.382,26.044 -1663,-28.703,28.963 -1664,-25.807,22.886 -1665,-25.807,22.886 -1666,-25.807,22.886 -1667,-25.807,22.886 -1668,-26.728,21.866 -1669,-26.728,21.866 -1670,-26.728,21.866 -1671,-27.757,21.665 -1672,-27.757,21.665 -1673,-27.757,21.665 -1674,-28.857,19.368 -1675,-28.857,19.368 -1676,-28.857,19.368 -1677,-28.928,18.145 -1678,-28.928,18.145 -1679,-28.928,18.145 -1680,-30.5,18.563 -1681,-30.5,18.563 -1682,-30.5,18.563 -1683,-34.521,19.884 -1684,-34.521,19.884 -1685,-34.521,19.884 -1686,-32.335,25.128 -1687,-32.335,25.128 -1688,-32.335,25.128 -1689,-32.584,26.15 -1690,-32.584,26.15 -1691,-32.584,26.15 -1692,-31.34,29.792 -1693,-31.842,29.245 -1694,-31.51,28.635 -1695,-28.65,16.6 -1696,-30.32,18.18 -1697,-30.77,18.51 -1698,-31.371,19.746 -1699,-31.662,19.106 -1700,-29.722,22.694 -1701,-28.629,22.74 -1702,-33.19,18.328 -1703,-33.432,18.546 -1704,-34.051,18.383 -1705,-34.184,19.513 -1706,-34.055,19.771 -1707,-33.948,20.835 -1708,-33.787,20.729 -1709,-34.138,22.036 -1710,-33.981,22.725 -1711,-33.876,22.932 -1712,-33.647,22.67 -1713,-32.969,22.092 -1714,-33.788,25.093 -1715,-33.913,23.862 -1716,-33.469,23.795 -1717,-32.382,23.11 -1718,-31.09,23.6 -1719,-31.7,24 -1720,-32.429,24.387 -1721,-31.755,25.038 -1722,-30.584,25.429 -1723,-31.81,26.31 -1724,-31.49,27.034 -1725,-33.5,25.75 -1726,-33.107,25.845 -1727,-32.474,25.93 -1728,-32.294,26.005 -1729,-32.31,25.434 -1730,-32.31,25.434 -1731,-33.456,27.06 -1732,-33.344,27.242 -1733,-33.039,27.749 -1734,-33.275,26.658 -1735,-33.2,26.72 -1736,-32.8,26.64 -1737,-32.662,27.514 -1738,-32.617,28.371 -1739,-32.458,27.86 -1740,-32.4,27.305 -1741,-32.145,28.444 -1742,-32.023,27.695 -1743,-31.98,26.962 -1744,-32.265,28.858 -1745,-33.13,26.55 -1746,-27.223,22.479 -1747,-30.69,30.291 -1748,-28.162,32.517 -1749,-26.888,32.251 -1750,-23.684,30.674 -1751,-22.842,29.245 -1752,-24.034,29.148 -1753,-24.289,28.787 -1754,-24,27.767 -1755,-24.426,27.6 -1756,-22.917,30.167 -1757,-25.141,27.808 -1758,-27.78,30.1 -1759,-25.714,27.186 -1760,-29.41,30.28 -1761,-29.41,30.28 -1762,-26.517,28.217 -1763,-29.79,30.83 -1764,-33.57,26.87 -1765,-33.57,26.87 -1766,-23.99,30.52 -1767,-28.28,32.24 -1768,-23.89,29.45 -1769,-25.66,27.24 -1770,-23.117,31.433 -1771,-25.633,27.782 -1772,-33.37,25.95 -1773,-24.82,31.5 -1774,-24.82,31.5 -1775,-24.82,31.5 -1776,-24.82,31.5 -1777,-33.90,22.70 -1778,-27.85,32.35 -1779,-22.917,30.167 -1780,-24.45,31.95 -1781,-23,29.7 -1782,-27.85,32.35 -1783,-27.85,32.35 -1784,-32.5,19.1 -1785,-32.5,19.1 -1786,-27.85,32.35 -1787,-24.75,26.3 -1788,-24.52,30.87 -1789,-27.52,31.66 -1790,-24.35,31.00 -1791,-23,30 -1792,-25.50,26.40 -1793,-25.42,29.30 -1794,-33.13,26.55 -1795,-27.40,32.00 -1796,-23,31.25 -1797,-33.65,24.35 -1798,-33.60,26.60 -1799,-33.5,25.75 -1800,-24.65,31.50 -1801,-25.63,26.90 -1802,-27.61,32.05 -1803,-25.10,30.40 -1804,-22.70,29.10 -1805,-33.48,26.05 -1806,-27.90,32.10 -1807,-22.80,28.45 -1808,-23,29.7 -1809,-24.20,30.55 -1810,-23,31.25 -1811,-33.65,24.35 -1812,-32.5,19.1 -1813,-24.82,31.5 -1814,-25.5,20.5 -1815,-27.65,32.25 -1816,-25.25,27.1 -1817,-34.6572,19.7481 -1818,-34.6418,19.7119 -1819,-32.5,19.1 -1820,-32.5,19.1 -1821,-33.9428,19.1925 -1822,-33.9687,19.2022 -1823,-24.1221,31.1049 -1824,-33.9502,22.338 -1825,-33.857,22.212 -1826,-24.20,30.55 -1827,-23,31.25 -1828,-23,31.25 -1829,-23,31.25 -1830,-24.7933,30.5083 -1831,-28.4606,30.6808 -1832,-28.4766,30.7523 -1833,-33.9187,19.6263 -1834,-33.9525,19.6478 -1835,-23.626,31.5994 -1836,-22.5536,30.9343 -1837,-25.4369,29.263 -1838,-24.9668,30.3398 -1839,-25,30.7428 -1840,-24.9221,30.6565 -1841,-24.8234,30.8106 -1842,-24.6917,30.7609 -1843,-24.8012,30.7291 -1844,-24.8079,30.6673 -1845,-24.6807,30.8312 -1846,-27.81,32.003 -1847,-27.7886,31.8152 -1848,-25.7211,31.6606 -1849,-27.7829,32.06 -1850,-27.85,32.35 -1851,-34.2139,21.1682 -1852,-24.9919,31.6263 -1853,-27.7108,31.9462 -1854,-27.7063,31.9791 -1855,-27.7361,31.965 -1856,-27.8122,31.9274 -1857,-25.2164,30.5472 -1858,-30.161,29.2539 -1859,-28.4257,30.6239 -1860,-24.9169,30.4675 -1861,-24.8565,30.5184 -1862,-24.8855,30.5195 -1863,-24.87,30.4386 -1864,-24.6122,30.4586 -1865,-24.6237,30.3404 -1866,-22.1575,29.6163 -1867,-24.3418,28.021 -1868,-33.7523,19.2081 -1869,-33.7537,19.2903 -1870,-33.7895,19.2485 -1871,-33.7281,19.3583 -1872,8.93,26.158 -1873,5.354,31.878 -1874,4.99,27.5 -1875,4.6,27.9 -1876,6.721,33.528 -1877,6.721,33.528 -1878,8.627,24.975 -1879,8.424,26.32 -1880,9.554,31.186 -1881,3.865,33.5 -1882,4.46,29.9 -1883,4.403,28.276 -1884,8.417,29.33 -1885,3.65,32.03 -1886,3.65,32.03 -1887,6.767,27.218 -1888,7.034,30.483 -1889,6.25,28.4 -1890,6.25,28.4 -1891,6.25,28.4 -1892,8.73,30.47 -1893,4.822,31.567 -1894,4.9,31.66 -1895,4.9,31.66 -1896,3.6133,32.1361 -1897,15.7,34 -1898,12.813,35.4 -1899,12.813,35.4 -1900,16.33,35 -1901,13.583,33.161 -1902,12.938,24.235 -1903,17.25,32 -1904,13.6,35 -1905,9.522,24.334 -1906,19.961,36.925 -1907,19.169,30.474 -1908,18.5,31.83 -1909,13.45,22.45 -1910,15.55,32.53 -1911,14.2,24.66 -1912,16.66,33.57 -1913,13.33,27.23 -1914,15.8,25.95 -1915,12.813,35.4 -1916,14.0298,32.2618 -1917,-26.467,31.166 -1918,-26.25,32.00 -1919,-3.292,36.825 -1920,-3.292,36.825 -1921,-3.292,36.825 -1922,-3.292,36.825 -1923,-3.292,36.825 -1924,-2.36,31.4 -1925,-2.36,31.4 -1926,-8.88,34 -1927,-4.71,29.67 -1928,-4.71,29.67 -1929,-4.71,29.67 -1930,-1.2,30.6 -1931,-7.471,35.297 -1932,-7.471,35.297 -1933,-5.338,29.922 -1934,-6.902,31.17 -1935,-6.902,31.17 -1936,-4.167,31.75 -1937,-3.047,37.383 -1938,-3.047,37.383 -1939,-3.047,37.383 -1940,-3.047,37.383 -1941,-3.047,37.383 -1942,-3.047,37.383 -1943,-3.047,37.383 -1944,-3.047,37.383 -1945,-3.047,37.383 -1946,-6.433,34.733 -1947,-6.433,34.733 -1948,-3.607,35.721 -1949,-3.607,35.721 -1950,-3.607,35.721 -1951,-3.607,35.721 -1952,-3.607,35.721 -1953,-3.607,35.721 -1954,-3.607,35.721 -1955,-1.966,35.217 -1956,-1.966,35.217 -1957,-1.966,35.217 -1958,-1.966,35.217 -1959,-3.869,36.434 -1960,-3.97,36.7 -1961,-3.97,36.7 -1962,-6.234,29.87 -1963,-6.234,29.87 -1964,-6.234,29.87 -1965,-6.234,29.87 -1966,-6.234,29.87 -1967,-3.385,34.849 -1968,-3.3,34.5 -1969,-3.3,34.5 -1970,-3.3,34.5 -1971,-8.84,33.318 -1972,-7.176,37.468 -1973,-4.18,38.23 -1974,-4.18,38.23 -1975,-4.314,30.98 -1976,-2.52,32.9 -1977,-2.9,36.9 -1978,-2.9,36.9 -1979,-3.152,35.514 -1980,-3.152,35.514 -1981,-3.152,35.514 -1982,-3.152,35.514 -1983,-3.152,35.514 -1984,-3.152,35.514 -1985,-3.152,35.514 -1986,-9.304,34.78 -1987,-7.436,34.7 -1988,-7.436,34.7 -1989,-7.436,34.7 -1990,-2.362,31.869 -1991,-1.251,30.755 -1992,-6.914,34.185 -1993,-6.914,34.185 -1994,-6.914,34.185 -1995,-8.74,37.64 -1996,-8.74,37.64 -1997,-8.74,37.64 -1998,-8.74,37.64 -1999,-8.74,37.64 -2000,-8.74,37.64 -2001,-8.74,37.64 -2002,-2.426,34.687 -2003,-2.426,34.687 -2004,-2.426,34.687 -2005,-2.426,34.687 -2006,-2.426,34.687 -2007,-2.426,34.687 -2008,-2.426,34.687 -2009,-2.426,34.687 -2010,-2.426,34.687 -2011,-2.426,34.687 -2012,-2.426,34.687 -2013,-2.426,34.687 -2014,-2.426,34.687 -2015,-2.426,34.687 -2016,-2.426,34.687 -2017,-2.426,34.687 -2018,-2.149,34.62 -2019,-2.426,34.687 -2020,-2.426,34.687 -2021,-2.426,34.687 -2022,-2.426,34.687 -2023,-2.426,34.687 -2024,-2.426,34.687 -2025,-2.426,34.687 -2026,-2.436,34.822 -2027,-2.436,34.822 -2028,-2.436,34.822 -2029,-2.993,35.351 -2030,-2.993,35.351 -2031,-2.14,34.9 -2032,-2.14,34.9 -2033,-3.764,36.032 -2034,-3.764,36.032 -2035,-3.764,36.032 -2036,-3.764,36.032 -2037,-4.158,36.176 -2038,-4.158,36.176 -2039,-4.158,36.176 -2040,-5.018,32.826 -2041,-6.65,38.045 -2042,-7.752,36.696 -2043,-7.752,36.696 -2044,-5.972,32 -2045,-5.972,32 -2046,-5.972,32 -2047,-7.729,32.163 -2048,-7.917,36.5 -2049,-6.134,39.358 -2050,-6.134,39.358 -2051,-6.134,39.358 -2052,-6.134,39.358 -2053,-6.134,39.358 -2054,-6.134,39.358 -2055,-6.134,39.358 -2056,-6.134,39.358 -2057,-6.134,39.358 -2058,-6.134,39.358 -2059,-6.32,39.5 -2060,-6.32,39.5 -2061,-6.32,39.5 -2062,-7.746,38.197 -2063,-4.066,31.335 -2064,-4.64,31.388 -2065,-4.657,30.864 -2066,-5.693,32.131 -2067,-6.162,32.334 -2068,-6.512,31.169 -2069,-7.159,31.8 -2070,-6.665,31.875 -2071,-6.174,34.112 -2072,-6.914,34.185 -2073,-7.398,34.064 -2074,-6.199,36.248 -2075,-6.137,35.748 -2076,-4.167,31.75 -2077,-7.389,35.313 -2078,-7.685,34.764 -2079,-7.726,36.753 -2080,-8.167,36.334 -2081,-8.242,36.706 -2082,-7.297,37.244 -2083,-7.667,37.765 -2084,-8.116,39.042 -2085,-8.033,38.722 -2086,-8.259,38.226 -2087,-8.397,38.541 -2088,-8.786,38.551 -2089,-11.234,35.743 -2090,-10.04,36.425 -2091,-9.981,37.498 -2092,-10.534,37.666 -2093,-11.176,38.763 -2094,-1.601,34.957 -2095,-2.588,35.044 -2096,-8.84,33.318 -2097,-3.789,34.289 -2098,-2.275,35.353 -2099,-2.338,35.588 -2100,-2.049,35.579 -2101,-2.049,35.579 -2102,-2.426,34.687 -2103,-2.723,35.346 -2104,-2.632,36.29 -2105,-2.854,35.941 -2106,-3.329,35.917 -2107,-3.607,35.721 -2108,-4.259,35.856 -2109,-4.236,36.373 -2110,-4.75,36.745 -2111,-4.257,36.722 -2112,-4.08,34.63 -2113,-7.45,37.27 -2114,-7.2,37.78 -2115,-4.82,34.74 -2116,-5.069,39.1 -2117,-2.00,34.70 -2118,-2.05,34.20 -2119,-7.5826,34.3244 -2120,-2.5763,34.3123 -2121,-2.4335,34.5247 -2122,-2.1623,34.4294 -2123,-5.4804,29.9287 -2124,-5.7615,30.3734 -2125,-6.1077,30.4335 -2126,-7.7762,36.6822 -2127,-6.0133,39.2655 -2128,-5.9007,39.3223 -2129,-5.9603,39.3396 -2130,8.182,0.653 -2131,8.988,0.963 -2132,36.753,8.644 -2133,36.753,8.644 -2134,36.591,8.411 -2135,3.013,30.92 -2136,-1.07,29.674 -2137,-1.07,29.674 -2138,0.053,32.465 -2139,2.779,32.285 -2140,-0.837,30.832 -2141,-0.837,30.832 -2142,0.604,33.98 -2143,2.218,31.815 -2144,2.218,31.815 -2145,0.331,32.617 -2146,0.331,32.617 -2147,0.331,32.617 -2148,0.331,32.617 -2149,-0.526,30.825 -2150,-0.283,30.647 -2151,1.1,32.65 -2152,0.353,32.756 -2153,1.25,31.55 -2154,1.009,31.754 -2155,3.895,33.841 -2156,0.267,31.617 -2157,-0.196,30.844 -2158,-0.196,30.844 -2159,0.067,31.6 -2160,1.629,32.988 -2161,-0.615,30.943 -2162,-0.615,30.943 -2163,-0.615,30.943 -2164,-0.615,30.943 -2165,-0.615,30.943 -2166,0.833,32.5 -2167,-0.335,31.734 -2168,-0.65,30.8 -2169,1.681,31.71 -2170,0.223,32.324 -2171,0.542,31.614 -2172,1.303,32.45 -2173,-0.163,30.021 -2174,-0.163,30.021 -2175,-0.789,31.453 -2176,-0.651,31.162 -2177,0.353,29.928 -2178,0.353,29.928 -2179,0.353,29.928 -2180,0.353,29.928 -2181,-0.551,29.883 -2182,-0.517,30 -2183,1.622,33.437 -2184,-0.048,31.398 -2185,-1.374,29.646 -2186,0.878,32.205 -2187,0.485,30.39 -2188,0.485,30.39 -2189,-1.28,29.68 -2190,-1.28,29.68 -2191,1.7148,31.6919 -2192,2.1606,31.5837 -2193,-0.288,29.9489 -2194,-12.183,29.934 -2195,-14.968,25.751 -2196,-14.968,25.751 -2197,-14.968,25.751 -2198,-14.968,25.751 -2199,-14.968,25.751 -2200,-14.968,25.751 -2201,-14.968,25.751 -2202,-14.968,25.751 -2203,-14.968,25.751 -2204,-14.968,25.751 -2205,-11.169,24.189 -2206,-15.319,29.608 -2207,-12.523,32.22 -2208,-12.523,32.22 -2209,-13.05,31.567 -2210,-13.05,31.567 -2211,-13.05,31.567 -2212,-13.05,31.567 -2213,-11.914,32.266 -2214,-11.914,32.266 -2215,-16.281,27.486 -2216,-12.967,28.634 -2217,-12.967,28.634 -2218,-12.967,28.634 -2219,-12.976,31.972 -2220,-13.159,32.05 -2221,-14.06,32.44 -2222,-13.14,32.74 -2223,-13.631,32.645 -2224,-13.55,32.4 -2225,-14.02,32.1 -2226,-14.02,32.1 -2227,-12.825,32.627 -2228,-12.295,33.17 -2229,-13.61,31.9 -2230,-14.98,27.06 -2231,-10.616,33.628 -2232,-14.24,31.32 -2233,-17.48,24.306 -2234,-17.6599,25.2459 -2235,-15.6191,30.2616 -2236,-15.5797,30.3073 -2237,-15.4602,30.2923 -2238,-15.4425,30.17 -2239,-12.5524,31.7476 -2240,-12.6344,31.7317 -2241,-21.017,31.533 -2242,-21.017,31.533 -2243,-16.05,28.883 -2244,-18.178,28.241 -2245,-18.178,28.241 -2246,-18.178,28.241 -2247,-18.178,28.241 -2248,-18.178,28.241 -2249,-21.615,31.9 -2250,-21.615,31.9 -2251,-19.246,27.935 -2252,-19.246,27.935 -2253,-19.246,27.935 -2254,-21.012,29.184 -2255,-21.012,29.184 -2256,-21.012,29.184 -2257,-16.325,29.606 -2258,-19.217,26.628 -2259,-19.217,26.628 -2260,-19.217,26.628 -2261,-19.217,26.628 -2262,-19.217,26.628 -2263,-19.217,26.628 -2264,-19.217,26.628 -2265,-19.217,26.628 -2266,-19.217,26.628 -2267,-19.217,26.628 -2268,-19.217,26.628 -2269,-19.217,26.628 -2270,-19.217,26.628 -2271,-18.781,26.39 -2272,-19.217,26.628 -2273,-18.388,32.775 -2274,-18.388,32.775 -2275,-18.464,29.871 -2276,-21.08,31.9 -2277,-15.97,29.466 -2278,-15.97,29.466 -2279,-15.97,29.466 -2280,-15.97,29.466 -2281,-18.36,25.908 -2282,-18.36,25.908 -2283,-18.36,25.908 -2284,-18.36,25.908 -2285,-18.36,25.908 -2286,-20.498,28.533 -2287,-20.498,28.533 -2288,-20.498,28.533 -2289,-20.498,28.533 -2290,-20.498,28.533 -2291,-20.498,28.533 -2292,-20.498,28.533 -2293,-20.498,28.533 -2294,-20.498,28.533 -2295,-20.498,28.533 -2296,-20.498,28.533 -2297,-16.952,28.61 -2298,-16.952,28.61 -2299,-16.952,28.61 -2300,-17.562,31.199 -2301,-17.155,28.344 -2302,-15.888,29.697 -2303,-17.981,25.71 -2304,-17.981,25.71 -2305,-17.793,27.906 -2306,-17.38,30.4 -2307,-19.819,28.846 -2308,-16.522,28.851 -2309,-20.745,31.648 -2310,-19.14,30.7 -2311,-19.717,28.8 -2312,-18.975,32.66 -2313,-21.70,29.90 -2314,-21.70,30.20 -2315,-20.50,28.15 -2316,-20.55,28.40 -2317,-16.5912,31.0548 -2318,35.36,67.50 -2319,35.36,67.50 -2320,34.13,71.10 -2321,36.73,70.81 -2322,35.12,63.77 -2323,36.76,66.96 -2324,34.78,67.82 -2326,37.92,71.14 -2327,37.92,71.14 -2328,37.92,71.14 -2329,35.30,69.04 -2330,35.99,64.90 -2331,34.02,64.90 -2332,34.34,62.19 -2333,35.00,71.00 -2334,35.00,71.00 -2335,31.63,65.72 -2336,35.87,68.65 -2337,35.87,68.65 -2338,34.59,67.82 -2339,34.59,67.82 -2340,34.64,68.87 -2341,34.64,68.87 -2342,34.68,70.15 -2343,34.32,69.60 -2344,34.32,69.60 -2345,34.32,69.60 -2346,34.32,69.60 -2347,34.02,69.19 -2349,35.32,70.91 -2350,33.36,67.06 -2351,37.20,72.91 -2352,35.30,70.20 -2353,34.96,70.98 -2354,34.96,70.98 -2355,33.98,70.37 -2356,35.28,69.02 -2357,35.28,69.02 -2358,36.00,68.10 -2359,34.66,69.13 -2360,34.10,71.00 -2361,32.94,69.17 -2362,36.85,72.28 -2363,36.85,72.28 -2364,36.85,72.28 -2365,35.32,70.91 -2366,34.98,66.95 -2367,35.25,70.93 -2368,38.15,70.91 -2371,39.20,46.00 -2372,40.67,44.29 -2373,39.95,44.63 -2374,39.66,45.61 -2375,40.22,44.22 -2376,40.22,44.22 -2377,39.32,46.16 -2378,39.32,46.16 -2379,39.32,46.16 -2381,39.88,44.75 -2382,39.86,44.95 -2383,40.04,44.92 -2384,39.86,44.95 -2385,39.65,45.25 -2386,39.83,44.95 -2387,38.95,46.32 -2388,39.25,46.17 -2389,39.33,46.02 -2390,39.82,45.82 -2391,40.78,44.91 -2392,40.1,43.9 -2393,39.76,45.33 -2394,39.76,45.33 -2395,39.80,45.10 -2396,39.80,45.10 -2397,39.80,45.10 -2398,40.11,45.05 -2399,38.90,46.25 -2400,40.10,44.80 -2401,40.10,44.80 -2402,40.27,44.77 -2403,40.00,44.70 -2404,40.00,44.70 -2405,39.67,45.23 -2406,39.65,45.30 -2407,39.65,45.30 -2408,39.49,46.34 -2412,40.08,44.87 -2413,40.08,44.87 -2414,40.08,44.87 -2415,39.21,46.41 -2416,39.21,46.41 -2417,39.21,46.41 -2418,39.21,46.41 -2419,39.15,46.06 -2420,39.15,46.06 -2421,39.15,46.06 -2423,39.92,45.00 -2424,40.04,44.92 -2425,40.04,44.92 -2426,40.04,44.92 -2427,40.04,44.92 -2428,40.04,44.92 -2429,40.04,44.92 -2430,40.04,44.92 -2431,40.04,44.92 -2432,40.04,44.92 -2433,40.04,44.92 -2434,40.04,44.92 -2435,40.04,44.92 -2436,40.04,44.92 -2437,40.04,44.92 -2438,40.04,44.92 -2440,40.04,44.92 -2441,40.04,44.92 -2442,39.13,46.32 -2444,38.90,46.25 -2445,38.90,46.25 -2446,38.90,46.25 -2447,38.90,46.25 -2448,38.90,46.25 -2449,38.90,46.25 -2450,38.90,46.25 -2451,38.90,46.25 -2452,38.90,46.25 -2453,38.95,46.45 -2454,39.70,45.29 -2455,40.10,44.75 -2456,39.95,44.55 -2457,39.76,45.33 -2458,39.81,45.67 -2459,39.21,46.41 -2460,39.21,46.41 -2461,41.17,45.00 -2462,39.52,46.05 -2463,39.64,45.51 -2464,40.18,45.73 -2465,39.68,45.23 -2466,39.68,45.23 -2467,39.68,45.23 -2468,41.10,44.65 -2469,40.00,44.80 -2470,39.76,45.33 -2471,39.21,46.41 -2472,38.90,46.25 -2473,40.56,44.96 -2474,40.89,45.17 -2475,39.68,45.23 -2476,38.91,46.44 -2477,38.95,46.43 -2478,38.95,46.43 -2479,38.95,46.43 -2480,39.76,45.18 -2481,39.47,45.92 -2482,40.56,45.01 -2483,40.89,45.28 -2484,39.01,46.46 -2485,39.01,46.46 -2486,39.01,46.46 -2487,39.01,46.46 -2488,39.51,46.01 -2489,40.87,45.39 -2490,40.87,45.14 -2491,39.21,46.41 -2492,39.91,44.72 -2493,40.17,44.49 -2494,40.29,44.60 -2495,39.98,45.00 -2496,39.76,45.33 -2497,39.50,46.33 -2498,40.82,43.95 -2499,40.1,43.8 -2500,39.83,45.36 -2501,40.10,44.95 -2502,40.10,44.95 -2503,39.05,46.46 -2504,39.05,46.46 -2505,39.05,46.46 -2506,39.81,45.49 -2507,39.83,44.86 -2508,40.04,44.92 -2509,38.91,46.44 -2510,40.29,44.59 -2511,38.90,46.25 -2512,40.53,44.76 -2513,40.17,44.48 -2514,39.15,46.00 -2515,39.15,46.00 -2516,38.90,46.15 -2517,39.0436,46.4373 -2518,38.883,46.15 -2520,38.75,48.84 -2521,40.95,46.90 -2523,39.08,48.34 -2524,40.46,49.95 -2525,39.20,45.44 -2526,40.16,46.63 -2528,40.58,50.04 -2533,38.90,46.03 -2534,39.58,46.96 -2535,39.19,45.95 -2536,38.61,48.74 -2538,39.51,47.03 -2539,39.20,45.46 -2540,41.49,47.02 -2541,38.69,48.31 -2542,39.30,46.00 -2543,41.78,46.55 -2544,41.19,47.15 -2545,40.10,46.03 -2546,39.45,48.60 -2547,39.45,48.61 -2548,39.20,45.44 -2549,40.68,46.37 -2550,38.75,48.84 -2551,38.70,48.78 -2552,39.45,48.70 -2553,40.16,46.63 -2554,39.00,46.05 -2555,39.19,45.99 -2556,39.19,45.99 -2557,39.20,45.44 -2558,38.75,48.84 -2559,39.45,48.61 -2560,40.53,50.00 -2561,39.20,45.44 -2563,38.75,48.84 -2564,38.90,46.03 -2565,38.90,46.03 -2566,38.69,48.31 -2567,39.57,48.97 -2568,39.10,45.90 -2569,39.75,46.74 -2570,39.75,46.74 -2572,41.65,46.90 -2573,38.69,48.31 -2574,38.69,48.31 -2575,38.69,48.31 -2576,38.69,48.31 -2577,38.69,48.31 -2578,38.69,48.31 -2579,38.69,48.31 -2580,38.69,48.31 -2581,39.58,46.96 -2582,41.80,46.60 -2584,39.88,46.13 -2585,40.10,46.03 -2586,41.80,46.60 -2587,41.80,46.60 -2588,41.80,46.60 -2589,41.80,46.60 -2590,41.90,46.63 -2591,41.63,46.63 -2592,41.63,46.63 -2593,39.30,46.00 -2594,39.30,46.00 -2595,39.30,46.00 -2596,39.30,46.00 -2597,38.69,48.31 -2598,38.87,46.10 -2599,38.43,48.62 -2600,24.40,91.90 -2601,24.40,91.90 -2603,24.70,92.19 -2604,24.70,92.19 -2605,22.35,92.40 -2606,21.42,91.98 -2607,21.42,91.98 -2608,26.51,88.43 -2609,26.51,88.43 -2610,25.74,89.27 -2611,25.74,89.27 -2612,23.19,92.28 -2613,23.19,92.28 -2614,21.34,92.04 -2615,24.58,92.16 -2616,24.58,92.16 -2617,25.00,92.25 -2618,25.00,92.25 -2619,23.13,91.94 -2620,23.13,91.94 -2621,25.00,89.78 -2622,25.00,89.78 -2623,24.34,91.79 -2624,24.34,91.79 -2625,24.69,90.11 -2626,24.69,90.11 -2627,24.69,90.11 -2628,24.74,90.39 -2629,23.19,92.28 -2630,23.19,92.28 -2631,24.40,91.39 -2632,24.12,91.44 -2633,24.12,91.44 -2634,24.40,91.90 -2635,22.65,92.17 -2636,22.65,92.17 -2637,24.11,91.63 -2638,24.11,91.63 -2639,24.11,91.63 -2640,24.30,91.72 -2641,24.30,91.72 -2642,21.94,89.18 -2643,21.94,89.18 -2644,21.1,92.2 -2645,21.1,92.2 -2649,27.83,89.77 -2650,27.47,90.16 -2651,27.83,89.77 -2652,27.83,89.77 -2653,27.83,89.77 -2654,27.83,89.77 -2655,27.83,89.77 -2656,27.68,91.23 -2657,27.03,90.72 -2658,27.03,90.72 -2659,26.92,92.03 -2660,26.82,90.02 -2661,27.41,90.22 -2662,27.41,90.22 -2663,27.03,90.72 -2664,27.03,90.72 -2665,26.8923,91.0124 -2666,26.848,91.1996 -2667,26.827,91.1957 -2668,26.8011,91.033 -2669,27.5048,91.1057 -2670,22.32,94.44 -2671,22.32,94.44 -2672,22.49,93.50 -2673,10.83,98.60 -2674,16.55,98.24 -2675,24.99,96.51 -2676,26.50,96.58 -2677,16.91,97.96 -2678,17.48,97.09 -2680,15.96,95.29 -2681,25.97,96.93 -2682,20.92,95.25 -2683,20.92,95.25 -2684,10.00,98.55 -2685,19.23,97.26 -2688,18.94,96.43 -2689,18.94,96.43 -2690,20.0657,98.4779 -2691,11.56,103.35 -2692,12.77,107.10 -2693,13.67,107.27 -2694,13.85,107.10 -2695,14.06,107.26 -2696,12.78,107.10 -2697,12.78,107.10 -2698,11.70,103.30 -2699,12.5022,107.5279 -2700,12.7827,106.9304 -2701,12.4594,107.3662 -2702,13.0865,107.3496 -2703,26.64,106.63 -2704,43.89,125.32 -2705,31.86,117.28 -2706,43.11,128.89 -2707,43.30,129.10 -2708,24.91,113.08 -2709,27.91,112.79 -2710,27.91,112.79 -2711,29.84,109.68 -2712,24.72,112.29 -2713,24.72,112.29 -2714,41.42,128.19 -2715,42.10,127.52 -2716,41.74,127.96 -2717,41.74,127.96 -2718,42.09,127.51 -2719,42.09,127.51 -2720,42.09,127.51 -2721,33.60,107.60 -2722,24.91,113.08 -2723,30.26,120.13 -2724,34.79,108.58 -2725,44.46,128.92 -2726,43.88,125.33 -2727,43.88,125.33 -2728,43.88,125.33 -2729,43.85,125.61 -2730,43.35,128.2 -2732,39.90,115.55 -2734,42.23,127.45 -2735,26.44,99.21 -2737,37.05,121.12 -2738,43.25,128.65 -2739,43.25,128.65 -2740,42.54,129.00 -2743,37.96,114.49 -2744,40.63,116.58 -2747,42.95,130.55 -2748,43.00,130.00 -2749,42.95,130.55 -2750,42.95,130.55 -2751,42.95,130.55 -2752,42.95,130.55 -2753,42.95,130.55 -2754,41.95,126.41 -2755,30.54,114.34 -2756,30.68,111.28 -2757,30.68,111.28 -2762,28.79,115.72 -2765,26.15,108.35 -2766,27.77,106.15 -2767,42.01,127.53 -2768,43.49,129.51 -2769,41.10,124.70 -2770,41.10,124.70 -2771,41.73,121.32 -2772,21.83,110.37 -2773,36.61,112.08 -2774,36.61,112.08 -2775,45.37,129.19 -2776,41.81,126.91 -2777,36.50,108.14 -2779,35.77,106.18 -2780,35.77,106.18 -2782,32.14,104.92 -2783,32.14,104.92 -2784,29.65,116.01 -2785,38.70,111.83 -2787,31.32,115.62 -2788,29.32,95.34 -2789,25.22,116.83 -2790,39.95,116.05 -2791,36.80,111.40 -2792,40.49,116.87 -2793,42.56,129.36 -2794,27.89,108.73 -2795,28.00,109.46 -2796,44.57,129.62 -2797,39.90,115.40 -2798,44.52,129.65 -2799,40.45,123.35 -2800,29.63,95.05 -2801,29.63,95.05 -2802,25.00,112.00 -2803,43.68,129.29 -2804,23.49,99.24 -2805,42.93,130.82 -2806,36.08,103.81 -2807,32.58,110.74 -2808,32.06,117.05 -2809,32.81,106.25 -2810,42.07,127.97 -2811,43.10,130.01 -2815,41.83,126.80 -2819,45.83,129.96 -2820,45.83,129.96 -2822,22.52,114.20 -2823,22.99,114.99 -2824,31.73,110.68 -2825,34.26,108.95 -2826,29.27,88.87 -2828,37.79,112.27 -2830,52.26,124.72 -2831,33.05,109.45 -2832,36.01,103.85 -2833,28.24,107.19 -2835,41.7,127.9 -2836,32.65,103.62 -2837,37.87,112.65 -2840,29.59,114.49 -2841,41.73,125.93 -2842,41.73,125.93 -2843,33.76,102.91 -2845,45.91,132.31 -2846,43.33,129.77 -2847,31.18,103.18 -2848,31.18,103.18 -2849,31.80,103.18 -2850,27.75,108.64 -2851,40.52,116.91 -2853,27.73,117.86 -2854,27.73,117.86 -2855,48.79,127.20 -2857,22.01,100.83 -2858,42.91,129.47 -2859,42.91,129.47 -2860,25.50,99.55 -2862,44.54,126.95 -2863,24.96,102.91 -2864,44.38,126.94 -2865,22.43,114.11 -2866,22.49,114.21 -2867,28.10,97.00 -2868,28.67,85.07 -2869,29.19,95.34 -2870,30.15,90.00 -2871,29.27,88.87 -2872,29.27,88.87 -2873,28.96,89.65 -2874,28.02,85.98 -2875,43.3754,130.8418 -2876,31.1713,103.6034 -2877,26.1299,119.3211 -2878,25.7475,119.3734 -2879,26.4773,119.2144 -2880,43.1131,130.5932 -2881,43.1737,130.6676 -2882,28.585,111.8209 -2883,31.0137,93.1163 -2884,30.7464,93.1432 -2885,43.1356,130.2399 -2886,26.2164,119.0907 -2887,26.6246,118.1872 -2888,23.9024,111.7892 -2889,37.8071,114.2488 -2890,37.5338,114.0875 -2891,33.2854,98.7018 -2892,28.2364,92.7316 -2893,28.7546,104.7215 -2894,28.6382,104.7183 -2895,28.7636,104.7596 -2896,38.0998,113.3001 -2897,29.5977,111.9222 -2898,29.1496,112.2255 -2899,43.014,130.3603 -2900,31.4709,103.5986 -2901,26.5698,118.5703 -2902,28.1421,112.803 -2903,22.1923,101.3011 -2904,37.55,112.97 -2905,41.47,118.40 -2906,43.74,131.17 -2907,43.01,130.74 -2908,33.67,106.39 -2909,34.71,105.95 -2910,35.43,111.71 -2911,36.96,113.55 -2912,38.25,110.82 -2913,35.88,108.59 -2914,29.76,100.84 -2915,32.13,96.24 -2916,31.30,96.63 -2917,27.58,119.73 -2918,27.76,119.09 -2919,26.54,117.28 -2920,25.20,116.22 -2921,25.42,116.86 -2922,28.22,107.14 -2923,35.27,113.25 -2924,33.54,107.92 -2925,35.62,108.94 -2926,37.64,112.83 -2927,33.12,98.21 -2928,29.45,95.37 -2929,29.78,94.38 -2930,35.10,112.39 -2931,34.41,105.93 -2932,34.99,106.27 -2933,33.90,106.40 -2934,33.29,105.13 -2935,35.20,106.60 -2936,34.57,107.42 -2937,31.49,100.67 -2938,30.95,100.27 -2939,39.95,115.03 -2940,35.62,106.27 -2941,35.39,111.98 -2942,33.79,108.07 -2943,33.64,107.80 -2944,28.85,107.12 -2945,28.34,118.88 -2946,25.97,117.53 -2947,23.35,99.17 -2948,21.63,101.64 -2949,33.62,107.62 -2950,32.80,104.84 -2951,29.83,116.60 -2952,35.27,112.44 -2953,28.59,86.33 -2954,37.40,113.24 -2955,43.25,130.67 -2956,34.87,106.76 -2957,44.06,130.85 -2958,28.39,85.77 -2959,36.55,111.20 -2960,36.87,112.24 -2961,35.06,111.47 -2962,37.04,112.36 -2963,36.20,110.97 -2964,36.47,111.85 -2965,37.85,111.45 -2966,37.21,112.67 -2967,41.64,42.99 -2968,41.64,42.99 -2969,41.64,42.99 -2970,41.69,44.28 -2971,41.81,44.75 -2972,42.16,44.79 -2973,42.33,43.32 -2974,43.42,40.35 -2975,41.84,43.39 -2976,43.46,40.54 -2977,43.30,41.18 -2978,43.30,41.18 -2979,43.30,41.18 -2980,42.48,45.66 -2981,42.48,45.66 -2982,42.71,44.66 -2983,42.59,44.99 -2984,42.64,44.90 -2985,41.86,46.23 -2986,41.86,46.23 -2987,42.73,44.62 -2988,42.21,43.96 -2989,41.59,41.75 -2990,43.4,40.9 -2991,41.86,44.95 -2992,41.86,44.95 -2993,41.86,44.95 -2994,41.35,46.45 -2995,41.84,46.24 -2996,41.71,44.82 -2997,41.71,44.82 -2998,41.71,44.82 -2999,42.38,45.61 -3000,42.38,45.61 -3001,42.22,43.95 -3002,42.40,45.12 -3003,42.40,45.12 -3004,43.46,40.54 -3005,43.46,40.54 -3006,42.95,43.09 -3007,42.86,43.34 -3008,42.74,44.62 -3010,41.20,46.45 -3011,41.20,46.45 -3012,41.20,46.45 -3013,41.20,46.45 -3014,41.20,46.45 -3015,41.20,46.45 -3016,41.20,46.45 -3017,41.20,46.45 -3018,41.87,44.76 -3019,41.2115,46.4417 -3020,42.90,43.30 -3021,22.50,81.78 -3022,30.16,79.23 -3023,11.10,76.66 -3024,19.10,74.76 -3025,23.02,72.57 -3026,23.02,72.57 -3027,19.10,74.76 -3028,19.10,74.76 -3029,19.10,74.76 -3030,19.10,74.76 -3031,19.58,74.21 -3032,24.89,80.26 -3033,23.20,86.60 -3034,19.54,74.01 -3035,19.11,73.73 -3036,19.12,72.84 -3037,21.60,71.22 -3038,10.42,77.17 -3039,10.42,77.17 -3040,10.42,77.17 -3041,10.42,77.17 -3042,10.42,77.17 -3043,28.32,81.14 -3044,33.73,75.14 -3046,22.30,73.40 -3047,24.89,80.25 -3048,30.20,77.96 -3049,34.45,73.85 -3050,34.45,73.85 -3051,23.02,76.72 -3052,19.52,74.37 -3053,25.54,80.70 -3054,28.19,80.36 -3055,13.44,75.57 -3056,30.26,77.88 -3057,30.26,77.88 -3058,24.30,82.52 -3059,32.06,76.65 -3060,25.25,90.82 -3061,25.25,90.82 -3062,30.27,79.17 -3063,25.46,80.34 -3064,22.95,83.62 -3065,23.61,80.43 -3066,23.61,80.43 -3067,23.61,80.43 -3068,23.61,80.43 -3069,34.50,74.69 -3070,11.67,76.63 -3071,11.67,76.63 -3072,11.67,76.63 -3073,11.67,76.63 -3074,11.67,76.63 -3075,11.67,76.63 -3076,11.67,76.63 -3077,11.67,76.63 -3078,11.67,76.63 -3079,11.67,76.63 -3080,11.67,76.63 -3081,11.67,76.63 -3082,30.70,77.71 -3083,30.08,78.05 -3084,12.77,77.57 -3085,20.69,73.54 -3086,33.10,74.65 -3087,34.19,74.35 -3088,21.85,69.70 -3089,21.85,69.70 -3090,21.85,69.70 -3091,21.85,69.70 -3092,21.85,69.70 -3093,29.81,78.61 -3094,22.70,73.90 -3095,22.70,73.90 -3096,22.52,73.94 -3097,22.70,73.90 -3098,30.81,78.21 -3099,26.71,91.68 -3100,26.71,91.68 -3101,26.71,91.68 -3102,21.45,82.52 -3103,22.31,73.18 -3104,27.20,88.10 -3105,25.46,85.79 -3106,21.96,77.75 -3107,28.39,77.16 -3108,13.45,75.57 -3109,13.45,75.57 -3110,13.45,75.57 -3111,25.24,86.99 -3112,25.24,86.99 -3113,19.53,73.75 -3114,23.38,80.26 -3115,21.74,72.13 -3116,24.96,75.55 -3117,26.55,93.98 -3118,25.23,86.28 -3119,19.17,73.58 -3120,19.17,73.58 -3121,19.17,73.58 -3122,19.17,73.58 -3123,19.17,73.58 -3124,20.72,86.87 -3125,19.28,72.80 -3126,23.26,77.41 -3127,28.32,79.97 -3128,28.87,79.30 -3129,28.87,79.30 -3130,12.00,77.14 -3131,12.00,77.14 -3132,12.00,77.14 -3133,30.77,76.98 -3134,21.81,80.18 -3135,20.96,78.70 -3136,20.96,78.70 -3137,20.96,78.70 -3138,22.45,78.12 -3139,22.45,78.12 -3140,19.21,72.91 -3141,19.21,72.91 -3142,19.21,72.91 -3143,19.21,72.91 -3144,19.21,72.91 -3145,19.80,85.60 -3146,12.17,75.64 -3147,33.93,74.64 -3148,20.46,76.36 -3149,20.46,76.36 -3150,30.35,77.92 -3151,24.96,93.50 -3152,26.62,89.53 -3153,26.62,89.53 -3154,26.62,89.53 -3155,26.62,89.53 -3156,26.62,89.53 -3157,26.62,89.53 -3158,14.68,75.49 -3159,24.78,92.86 -3160,14.96,74.13 -3161,11.88,75.36 -3162,31.75,76.08 -3163,32.62,76.01 -3164,31.23,77.16 -3165,31.00,77.20 -3166,31.00,77.20 -3167,25.20,83.32 -3168,18.76,73.86 -3169,26.34,90.33 -3170,11.88,75.36 -3171,20.46,75.00 -3172,20.46,75.00 -3173,30.29,79.56 -3174,30.28,78.98 -3175,29.32,80.01 -3176,29.32,80.01 -3177,29.32,80.01 -3178,30.76,76.84 -3179,20.35,85.66 -3180,17.17,73.77 -3181,19.74,79.80 -3182,19.74,79.80 -3183,26.87,88.86 -3184,26.87,88.86 -3185,26.87,88.86 -3186,26.87,88.86 -3187,28.76,77.20 -3188,30.28,78.98 -3189,29.16,79.32 -3190,23.29,73.84 -3191,22.06,78.94 -3192,21.40,77.33 -3193,29.94,78.23 -3194,10.31,77.21 -3195,10.31,77.21 -3196,17.53,73.52 -3198,25.12,80.88 -3199,23.19,73.89 -3200,20.92,70.35 -3201,11.02,76.96 -3202,11.02,76.96 -3203,25.27,87.24 -3204,11.35,76.80 -3205,29.53,78.77 -3206,29.53,78.77 -3207,29.53,78.77 -3208,29.53,78.77 -3209,29.53,78.77 -3210,29.53,78.77 -3211,29.53,78.77 -3212,29.53,78.77 -3213,9.73,77.21 -3214,34.14,75.04 -3215,34.14,75.04 -3216,34.14,75.04 -3217,34.14,75.04 -3218,34.14,75.04 -3219,34.14,75.04 -3220,22.84,74.25 -3221,22.90,86.21 -3222,24.04,84.09 -3223,24.04,84.09 -3224,23.60,92.42 -3225,23.60,92.42 -3226,15.25,74.63 -3227,15.25,74.63 -3228,33.37,74.31 -3229,20.82,73.70 -3230,24.84,75.96 -3231,24.84,75.96 -3233,29.19,95.98 -3234,21.56,83.65 -3235,30.81,78.21 -3236,30.31,78.03 -3237,30.31,78.03 -3238,26.92,80.98 -3239,22.70,73.91 -3240,23.85,72.99 -3241,22.63,74.10 -3242,26.58,89.01 -3243,19.63,78.19 -3244,19.63,78.19 -3245,22.84,74.25 -3246,22.84,74.25 -3247,22.84,74.25 -3248,20.55,83.14 -3249,31.45,77.74 -3250,21.60,71.22 -3251,15.53,74.13 -3252,26.70,77.89 -3253,29.19,95.98 -3254,29.19,95.98 -3255,27.67,95.36 -3256,19.84,77.93 -3257,29.19,95.98 -3258,19.09,74.75 -3259,33.93,74.64 -3260,20.00,73.79 -3261,23.60,92.42 -3262,26.84,89.07 -3263,28.47,80.70 -3264,28.47,80.70 -3265,28.47,80.70 -3266,28.47,80.70 -3267,28.47,80.70 -3268,28.47,80.70 -3269,28.47,80.70 -3270,28.47,80.70 -3271,29.81,78.61 -3272,24.55,84.14 -3273,24.55,84.14 -3274,29.93,78.64 -3275,27.10,92.40 -3276,26.18,93.58 -3277,13.14,78.13 -3278,21.88,76.64 -3279,26.82,88.81 -3280,17.02,73.39 -3281,10.14,77.06 -3282,10.14,77.06 -3283,10.14,77.06 -3284,10.14,77.06 -3285,10.14,77.06 -3286,10.14,77.06 -3287,18.38,80.38 -3288,18.38,80.38 -3289,25.82,94.95 -3290,27.31,88.53 -3291,30.26,78.08 -3292,28.83,77.01 -3293,30.47,78.07 -3294,19.50,80.28 -3295,16.23,77.81 -3296,33.22,74.42 -3297,32.86,76.00 -3298,26.42,93.73 -3299,26.42,93.73 -3300,26.12,83.23 -3301,29.89,78.84 -3302,24.13,85.39 -3303,30.38,78.03 -3304,18.50,73.47 -3305,19.03,73.56 -3306,19.03,73.56 -3307,26.69,94.34 -3308,21.12,70.82 -3309,21.12,70.82 -3310,21.12,70.82 -3311,21.12,70.82 -3312,21.12,70.82 -3313,21.12,70.82 -3314,21.12,70.82 -3315,21.12,70.82 -3316,21.12,70.82 -3317,21.12,70.82 -3318,21.12,70.82 -3319,21.12,70.82 -3320,21.12,70.82 -3321,21.12,70.82 -3322,21.12,70.82 -3323,21.12,70.82 -3324,21.12,70.82 -3325,21.12,70.82 -3326,21.12,70.82 -3327,21.12,70.82 -3328,21.52,70.55 -3329,19.91,73.52 -3330,21.64,69.63 -3331,21.64,69.63 -3332,21.41,83.19 -3333,21.46,80.22 -3334,26.78,83.31 -3335,26.76,88.80 -3336,26.76,88.80 -3337,26.76,88.80 -3338,26.76,88.80 -3339,31.14,78.34 -3340,31.14,78.34 -3341,31.80,77.70 -3342,31.73,77.55 -3343,31.80,77.70 -3344,11.50,76.49 -3345,21.40,77.15 -3346,34.08,74.35 -3347,24.29,92.16 -3348,24.29,92.16 -3349,11.81,76.69 -3350,26.14,91.74 -3351,26.14,91.74 -3352,26.14,91.74 -3353,22.54,73.46 -3354,31.69,76.52 -3355,31.69,76.52 -3356,31.69,76.52 -3357,31.69,76.52 -3358,34.39,74.26 -3359,21.28,86.29 -3360,19.84,74.81 -3361,22.35,77.09 -3362,28.26,80.31 -3363,21.53,77.12 -3364,24.02,85.41 -3365,24.02,85.41 -3366,24.02,85.41 -3367,24.02,85.41 -3368,29.30,79.01 -3369,22.15,71.32 -3370,19.58,77.10 -3371,19.58,77.10 -3372,12.12,77.78 -3373,22.74,77.74 -3374,17.40,78.66 -3375,9.78,76.96 -3376,9.78,76.96 -3377,19.70,73.56 -3378,19.70,73.56 -3379,33.09,74.24 -3380,34.22,74.77 -3381,10.42,77.13 -3382,19.21,81.03 -3383,19.21,81.03 -3384,26.63,93.56 -3385,25.55,93.52 -3386,25.55,93.52 -3387,27.17,93.70 -3388,27.17,93.70 -3389,27.08,93.60 -3390,27.10,93.30 -3391,22.95,79.90 -3392,22.95,79.90 -3393,29.86,78.68 -3394,24.26,73.97 -3395,31.12,77.18 -3396,26.87,88.86 -3397,26.87,88.86 -3398,26.87,88.86 -3399,26.87,88.86 -3400,26.87,88.86 -3401,26.87,88.86 -3402,26.87,88.86 -3403,21.01,75.50 -3404,21.01,75.50 -3405,26.70,89.02 -3406,22.36,73.66 -3407,27.33,76.43 -3408,32.50,75.40 -3409,19.91,73.23 -3410,19.91,73.23 -3411,19.91,73.23 -3412,24.42,72.51 -3413,24.42,72.51 -3414,24.42,72.51 -3415,26.74,94.97 -3416,26.85,75.83 -3417,23.20,69.64 -3418,24.41,81.23 -3419,29.37,79.45 -3420,29.53,78.77 -3421,29.30,76.30 -3422,24.79,93.15 -3423,26.79,94.20 -3424,21.52,70.46 -3425,19.20,73.87 -3426,19.20,73.87 -3427,19.20,73.87 -3428,19.20,73.87 -3429,19.20,73.87 -3430,19.20,73.87 -3431,19.20,73.87 -3432,19.20,73.87 -3433,19.20,73.87 -3434,19.20,73.87 -3435,19.20,73.87 -3436,19.20,73.87 -3437,19.20,73.87 -3438,32.09,76.27 -3439,23.73,69.85 -3440,24.58,73.71 -3441,13.55,76.01 -3442,22.61,79.81 -3443,26.17,76.89 -3444,24.97,83.54 -3445,24.97,83.54 -3446,28.08,81.20 -3447,8.51,77.55 -3448,8.51,77.55 -3449,8.69,77.31 -3450,8.69,77.31 -3451,8.69,77.31 -3452,8.69,77.31 -3453,8.69,77.31 -3454,32.54,76.01 -3455,30.05,78.73 -3456,19.22,72.98 -3457,31.04,74.80 -3458,30.53,77.85 -3459,30.53,77.85 -3460,19.60,73.71 -3461,19.60,73.71 -3462,20.48,74.03 -3463,20.48,74.03 -3464,27.74,96.34 -3465,15.46,75.00 -3466,15.46,75.00 -3467,31.98,76.98 -3468,29.59,79.65 -3469,28.14,94.76 -3470,27.61,88.19 -3471,27.61,88.19 -3472,32.10,76.27 -3473,32.10,76.27 -3474,32.10,76.27 -3475,22.33,80.61 -3476,22.33,80.61 -3477,22.33,80.61 -3478,22.33,80.61 -3479,22.33,80.61 -3480,22.33,80.61 -3481,22.33,80.61 -3482,22.33,80.61 -3483,22.33,80.61 -3484,22.33,80.61 -3485,32.45,75.27 -3486,11.88,75.36 -3487,19.10,74.75 -3488,32.22,76.32 -3489,22.31,73.18 -3490,18.80,73.11 -3491,28.30,81.15 -3492,28.30,81.15 -3493,28.30,81.15 -3494,28.30,81.15 -3495,28.30,81.15 -3496,28.30,81.15 -3497,28.30,81.15 -3498,21.12,70.82 -3499,19.12,78.99 -3500,19.12,78.99 -3501,26.58,93.17 -3502,26.58,93.17 -3503,26.58,93.17 -3504,26.58,93.17 -3505,26.58,93.17 -3506,26.58,93.17 -3507,26.58,93.17 -3508,26.58,93.17 -3509,26.58,93.17 -3510,26.58,93.17 -3511,30.75,79.06 -3512,30.75,79.06 -3513,30.75,79.06 -3514,30.75,79.06 -3515,30.75,79.06 -3516,24.55,93.85 -3517,24.59,79.94 -3518,24.65,85.04 -3519,21.34,84.45 -3520,17.26,74.70 -3521,19.80,85.80 -3523,19.20,73.87 -3524,22.87,77.00 -3525,30.17,78.87 -3526,31.43,77.18 -3527,15.49,73.83 -3528,34.02,74.99 -3529,23.11,92.88 -3530,17.92,80.46 -3531,17.92,80.46 -3532,19.60,78.20 -3533,30.30,78.57 -3534,30.30,78.57 -3535,28.70,80.03 -3536,33.62,75.99 -3537,33.62,75.99 -3538,33.62,75.99 -3539,13.14,78.13 -3540,16.68,74.17 -3541,16.68,74.17 -3542,12.15,77.11 -3543,24.60,73.63 -3544,19.89,74.47 -3545,19.89,74.47 -3546,20.54,84.83 -3547,17.78,73.70 -3548,34.42,74.33 -3549,13.34,75.02 -3550,13.34,75.02 -3551,32.46,76.70 -3552,21.40,86.70 -3553,21.40,86.70 -3554,31.95,77.11 -3555,31.95,77.11 -3556,29.41,79.55 -3557,25.15,73.59 -3558,25.15,73.59 -3559,25.15,73.59 -3560,25.15,73.59 -3561,29.41,79.55 -3562,34.52,74.25 -3563,33.30,74.40 -3564,19.85,73.81 -3565,27.44,96.54 -3566,26.52,92.71 -3567,26.48,93.01 -3568,34.02,75.31 -3569,22.84,74.25 -3570,31.66,78.38 -3571,25.45,77.72 -3572,25.45,77.72 -3573,27.11,88.40 -3574,19.99,74.12 -3575,26.90,88.51 -3576,26.90,88.51 -3577,24.03,72.37 -3578,27.38,84.14 -3579,31.26,76.97 -3580,31.26,76.97 -3581,20.55,74.51 -3582,20.09,74.04 -3583,19.34,73.77 -3584,19.34,73.77 -3585,19.34,73.77 -3586,19.34,73.77 -3587,30.39,78.08 -3588,30.39,78.08 -3589,32.24,77.20 -3590,26.75,91.02 -3591,26.75,91.02 -3592,26.75,91.02 -3593,26.75,91.02 -3594,26.75,91.02 -3595,26.75,91.02 -3596,26.75,91.02 -3597,26.75,91.02 -3598,31.71,76.93 -3599,31.71,76.93 -3600,31.71,76.93 -3601,21.17,72.84 -3602,21.17,72.84 -3603,28.35,76.94 -3604,25.07,81.10 -3605,26.52,92.71 -3606,9.98,77.25 -3607,29.19,95.98 -3608,29.19,95.98 -3609,29.19,95.98 -3610,23.59,72.37 -3611,21.41,77.15 -3612,21.41,77.15 -3613,21.41,77.15 -3614,21.41,77.15 -3615,21.41,77.15 -3616,21.41,77.15 -3617,12.66,76.65 -3618,28.47,94.75 -3619,28.47,94.75 -3620,13.83,74.89 -3621,20.78,73.37 -3622,28.47,94.75 -3623,24.62,72.73 -3624,24.62,72.73 -3625,24.62,72.73 -3626,8.64,77.42 -3627,11.56,76.53 -3628,11.56,76.53 -3629,11.56,76.53 -3630,11.56,76.53 -3631,11.56,76.53 -3632,11.56,76.53 -3633,11.56,76.53 -3634,11.56,76.53 -3635,11.56,76.53 -3636,11.43,76.56 -3637,8.64,77.42 -3638,8.64,77.42 -3639,8.64,77.42 -3640,8.64,77.42 -3641,8.64,77.42 -3642,31.10,77.17 -3643,29.69,78.77 -3644,29.69,78.77 -3646,23.66,93.28 -3647,34.09,74.33 -3648,15.67,73.86 -3649,12.04,76.13 -3650,12.04,76.13 -3651,12.04,76.13 -3652,12.04,76.13 -3653,12.04,76.13 -3654,12.04,76.13 -3655,12.04,76.13 -3656,12.04,76.13 -3657,12.04,76.13 -3658,12.04,76.13 -3659,12.04,76.13 -3660,12.04,76.13 -3661,12.04,76.13 -3662,12.04,76.13 -3663,12.04,76.13 -3664,12.04,76.13 -3665,16.57,79.31 -3666,16.07,78.87 -3667,16.07,78.87 -3668,19.32,72.89 -3669,19.32,72.89 -3670,27.63,91.70 -3671,21.25,79.99 -3672,26.90,75.80 -3673,26.21,93.88 -3674,31.31,76.53 -3675,26.39,93.87 -3676,27.44,96.53 -3677,27.44,96.53 -3678,27.44,96.53 -3679,27.44,96.53 -3680,27.44,96.53 -3681,27.44,96.53 -3682,27.44,96.53 -3683,27.44,96.53 -3684,26.93,92.88 -3685,30.56,79.56 -3686,30.56,79.56 -3687,20.40,85.20 -3688,32.81,75.32 -3689,19.72,74.13 -3690,19.12,73.98 -3691,31.71,76.93 -3692,23.70,77.10 -3693,23.70,77.10 -3694,23.70,77.10 -3697,19.99,73.77 -3698,19.99,73.77 -3699,19.99,73.77 -3700,19.99,73.77 -3701,19.99,73.77 -3702,19.99,73.77 -3703,19.99,73.77 -3704,23.37,79.17 -3705,20.98,80.17 -3706,31.71,76.91 -3707,21.53,70.49 -3708,29.68,76.90 -3709,19.44,74.20 -3710,11.58,76.58 -3711,12.01,76.39 -3712,18.96,72.80 -3713,18.96,72.80 -3714,27.09,88.69 -3715,27.09,88.69 -3716,27.09,88.69 -3717,19.55,74.93 -3718,19.55,74.93 -3719,8.55,77.23 -3720,8.55,77.23 -3721,22.44,92.79 -3722,11.28,76.24 -3723,11.10,76.75 -3724,17.16,74.90 -3725,25.44,90.45 -3726,25.44,90.45 -3727,25.92,91.82 -3728,25.92,91.82 -3729,23.00,82.00 -3730,26.19,93.58 -3731,19.16,72.90 -3732,21.52,70.46 -3733,21.75,86.33 -3734,26.16,91.78 -3735,26.55,92.33 -3736,26.55,92.33 -3737,18.20,76.17 -3738,19.26,73.90 -3739,28.25,80.31 -3740,19.16,72.90 -3741,19.58,74.21 -3742,19.16,72.90 -3743,30.12,78.74 -3744,26.23,92.05 -3745,22.47,78.43 -3746,22.47,78.43 -3747,19.36,73.18 -3748,20.39,73.57 -3749,19.97,80.02 -3750,27.10,92.82 -3751,27.10,92.82 -3752,27.10,92.82 -3753,22.90,85.00 -3754,22.90,85.00 -3755,25.75,77.10 -3756,18.19,80.98 -3757,22.78,73.50 -3758,22.78,73.50 -3759,24.32,80.54 -3760,24.32,80.54 -3761,24.32,80.54 -3762,24.32,80.54 -3763,23.86,81.01 -3764,17.35,81.47 -3765,17.35,81.47 -3766,10.39,76.78 -3767,10.39,76.78 -3768,10.39,76.78 -3769,10.40,76.80 -3770,10.39,76.78 -3771,10.39,76.78 -3772,29.87,78.84 -3773,20.32,74.98 -3774,29.87,78.84 -3775,10.48,76.43 -3776,10.48,76.43 -3777,22.01,79.83 -3778,22.01,79.83 -3779,22.01,79.83 -3780,22.01,79.83 -3781,22.01,79.83 -3782,22.01,79.83 -3783,22.01,79.83 -3784,22.78,81.96 -3785,8.63,77.18 -3786,8.63,77.18 -3787,9.46,77.24 -3788,9.46,77.24 -3789,9.46,77.24 -3790,24.58,73.70 -3791,22.65,93.03 -3792,22.60,80.35 -3793,31.02,75.79 -3794,18.10,73.42 -3795,24.24,73.27 -3796,18.63,73.80 -3797,19.18,72.87 -3798,31.99,77.88 -3799,19.20,73.87 -3800,32.05,76.02 -3801,15.49,74.52 -3802,19.60,78.50 -3803,19.60,73.71 -3804,30.33,77.96 -3805,33.88,74.91 -3806,33.98,75.01 -3807,33.98,75.01 -3808,18.52,73.86 -3809,18.52,73.86 -3810,20.92,73.70 -3811,20.92,73.70 -3812,14.47,78.82 -3813,14.47,78.82 -3814,14.47,78.82 -3815,16.42,73.99 -3816,16.42,73.99 -3817,16.42,73.99 -3818,16.42,73.99 -3819,23.22,78.2 -3820,30.1,78.2 -3821,29.79,78.22 -3822,29.79,78.22 -3823,29.79,78.22 -3824,29.79,78.22 -3825,29.79,78.22 -3826,29.79,78.22 -3827,29.79,78.22 -3828,29.79,78.22 -3829,25.00,85.45 -3830,18.86,73.89 -3831,18.86,73.89 -3832,33.37,74.32 -3833,21.87,73.5 -3834,31.14,78.34 -3835,27.34,76.43 -3836,29.39,79.13 -3837,23.34,85.31 -3838,13.47,74.75 -3839,30.37,78.04 -3840,25.06,80.83 -3841,26.01,76.5 -3842,26.01,76.5 -3843,26.01,76.5 -3844,26.01,76.5 -3845,30.28,77.98 -3846,25.85,83.85 -3847,24.42,72.51 -3848,24.42,72.51 -3849,24.42,72.51 -3850,24.42,72.51 -3851,22.94,77.71 -3852,16.99,73.31 -3853,17.00,73.32 -3854,17.00,73.32 -3855,21.11,71.1 -3856,19.21,72.87 -3857,30.07,78.27 -3858,30.07,78.27 -3859,25.60,86.15 -3860,30.07,78.27 -3861,30.07,78.27 -3862,29.77,78.87 -3863,30.35,78.23 -3864,30.28,78.98 -3865,30.28,78.98 -3866,31.65,78.48 -3867,17.49,73.81 -3868,33.08,74.84 -3870,10.39,76.77 -3871,10.39,76.77 -3872,19.58,74.21 -3873,19.58,74.21 -3874,19.58,74.21 -3875,19.58,74.21 -3876,16.85,74.57 -3877,26.75,94.2 -3878,19.21,72.91 -3879,19.21,72.91 -3880,18.9,75.9 -3881,19.21,72.91 -3882,19.21,72.91 -3883,19.21,72.91 -3884,19.21,72.91 -3885,19.21,72.91 -3886,19.21,72.91 -3887,19.21,72.91 -3888,19.21,72.91 -3889,19.21,72.91 -3890,19.21,72.91 -3891,19.21,72.91 -3892,23.87,82.06 -3893,23.87,82.06 -3894,23.87,82.06 -3895,34.4,74.28 -3896,31.69,76.52 -3897,25.55,84.15 -3898,27.33,76.43 -3899,27.33,76.43 -3900,27.33,76.43 -3901,27.33,76.43 -3902,27.33,76.43 -3903,27.33,76.43 -3904,27.33,76.00 -3906,27.33,76.43 -3907,17.67,74.02 -3908,17.68,74.01 -3909,20.54,84.83 -3910,20.54,84.83 -3911,22.45,78.12 -3912,22.45,78.12 -3913,22.45,78.12 -3914,22.45,78.10 -3915,22.31,70.85 -3916,15.90,73.81 -3920,26.73,93.45 -3921,29.77,78.50 -3923,27.31,95.60 -3924,22.95,77.10 -3925,27.00,88.26 -3926,26.15,94.56 -3927,22.09,79.53 -3928,22.09,79.53 -3929,22.09,79.53 -3930,23.70,91.30 -3931,27.17,92.48 -3932,33.70,75.28 -3933,14.04,74.92 -3934,14.04,74.92 -3935,22.95,73.63 -3936,26.30,72.30 -3937,13.89,75.39 -3938,31.43,77.18 -3939,26.63,88.56 -3940,31.11,77.17 -3941,31.11,77.17 -3942,31.11,77.22 -3943,31.11,77.17 -3944,31.11,77.17 -3945,29.80,78.22 -3946,21.76,73.79 -3947,21.76,73.79 -3948,19.86,74.23 -3949,11.60,76.71 -3950,25.44,90.45 -3951,25.44,90.45 -3952,11.07,76.52 -3953,11.07,76.52 -3954,11.07,76.52 -3955,30.43,77.50 -3956,31.11,77.22 -3957,21.75,86.33 -3958,21.75,86.33 -3959,16.35,73.56 -3961,27.09,88.07 -3962,23.29,78.27 -3963,19.86,74.00 -3964,19.86,74.00 -3965,19.86,74.00 -3966,30.56,77.47 -3967,25.13,94.42 -3968,18.87,79.97 -3969,18.87,79.97 -3970,24.38,74.66 -3971,20.46,81.98 -3972,26.99,94.65 -3974,18.64,79.74 -3975,27.30,81.10 -3976,31.05,76.92 -3977,31.05,76.92 -3978,13.44,75.08 -3979,26.92,92.34 -3980,12.32,75.81 -3981,14.68,75.50 -3982,12.11,75.85 -3983,12.11,75.85 -3984,13.73,79.43 -3985,19.20,77.30 -3986,20.54,84.83 -3987,22.00,88.90 -3988,22.00,88.90 -3989,32.73,75.10 -3990,20.25,79.43 -3991,20.25,79.43 -3992,20.25,79.43 -3993,21.06,70.55 -3994,21.06,70.55 -3995,27.57,93.98 -3996,31.03,77.80 -3997,23.23,82.90 -3998,29.06,80.10 -3999,19.19,72.97 -4000,19.19,72.97 -4001,19.19,72.97 -4002,19.99,74.15 -4003,33.58,75.30 -4004,27.62,91.75 -4005,26.30,90.60 -4006,26.50,88.70 -4007,11.58,77.00 -4008,30.02,79.05 -4009,19.21,72.94 -4010,10.08,76.80 -4011,10.08,76.80 -4012,28.47,80.62 -4013,13.66,79.41 -4014,24.90,74.60 -4015,26.20,75.70 -4016,24.90,85.30 -4017,19.90,73.50 -4018,23.28,91.40 -4019,32.44,76.54 -4020,24.50,73.70 -4021,20.46,81.98 -4022,28.90,79.50 -4023,22.66,74.15 -4024,31.45,76.29 -4025,34.26,74.81 -4026,21.49,84.29 -4027,30.72,78.43 -4028,22.29,73.19 -4029,22.29,73.19 -4030,22.29,73.19 -4031,30.73,79.61 -4032,27.38,84.14 -4033,27.38,84.14 -4034,27.38,84.14 -4035,23.22,77.36 -4036,23.22,77.36 -4037,20.69,73.54 -4038,20.69,73.54 -4040,9.65,77.63 -4041,20.69,73.54 -4042,24.36,71.52 -4043,10.30,76.59 -4044,12.92,79.15 -4045,20.92,70.35 -4046,20.92,70.35 -4047,20.92,70.35 -4048,10.48,76.43 -4049,20.94,79.23 -4050,30.47,77.84 -4051,13.14,79.09 -4052,17.10,74.30 -4053,33.58,75.16 -4054,17.68,83.23 -4055,21.11,73.39 -4056,20.00,73.68 -4057,26.86,88.84 -4058,27.34,92.30 -4059,12.32,75.81 -4060,34.03,74.96 -4061,11.67,76.37 -4062,11.67,76.37 -4063,30.13,77.27 -4064,30.72,76.82 -4065,21.38,75.86 -4066,21.38,75.86 -4067,21.38,75.86 -4068,19.23,72.94 -4069,34.15,74.85 -4070,22.4528,81.5555 -4071,22.598,81.8327 -4072,22.3421,81.8245 -4073,22.4232,81.7286 -4074,19.5507,73.9639 -4075,19.3109,73.402 -4076,19.3258,73.3799 -4077,12.1058,78.9328 -4078,26.7458,88.2892 -4079,11.6407,76.4442 -4080,13.6071,75.591 -4081,13.538,75.5222 -4085,23.86,82.06 -4086,30.3872,78.1732 -4087,13.1213,75.0433 -4088,26.4451,93.5389 -4089,27.4848,95.0622 -4090,27.4659,79.7461 -4091,27.2008,79.8949 -4092,27.9333,81.351 -4093,30.5542,79.3165 -4094,21.2057,71.1518 -4095,21.2721,71.1679 -4096,26.1208,91.7107 -4097,30.7922,76.1306 -4098,30.0489,78.3142 -4099,33.9766,77.4887 -4100,33.6569,77.7122 -4101,27.137,95.386 -4102,27.0584,95.5366 -4103,27.2488,95.5193 -4104,27.6499,95.4474 -4105,27.1285,95.8475 -4106,27.2331,95.6986 -4107,27.3618,95.752 -4108,27.4243,95.7601 -4109,27.5402,95.7905 -4110,34.1378,75.0364 -4111,19.5468,74.0299 -4112,23.2809,80.4837 -4113,23.0263,80.7801 -4114,12.81,76.02 -4115,26.6911,93.4945 -4116,19.5177,74.0293 -4117,22.9019,81.1676 -4118,23.4147,80.7939 -4119,34.5811,74.3511 -4120,31.419,76.5938 -4121,27.5008,94.9323 -4122,11.5087,76.5651 -4123,8.7603,77.2816 -4124,8.7252,77.2885 -4125,16.409,79.2564 -4126,26.9456,92.7525 -4127,20.40,80.98 -4128,28.5669,95.9691 -4129,28.6604,95.6358 -4130,29.8702,78.9477 -4131,9.2756,76.9211 -4132,28.6421,79.9662 -4133,28.6355,79.848 -4134,30.0183,77.5406 -4135,29.9502,77.5913 -4136,19.2325,72.9024 -4137,19.2141,72.9253 -4138,19.1726,72.8914 -4139,27.4076,76.7404 -4140,27.3019,76.7276 -4141,27.2146,76.4171 -4142,27.2426,76.3155 -4143,27.1166,76.2561 -4144,27.3059,76.4886 -4145,19.5854,73.9862 -4146,26.8001,88.4827 -4147,20.2085,79.5276 -4148,19.5107,73.9672 -4149,30.0002,80.2295 -4150,29.9234,79.653 -4151,30.3109,79.6338 -4152,30.4446,79.6386 -4153,30.3076,80.1796 -4154,19.5298,74.0396 -4155,-6.87,115.37 -4157,-8.67,114.45 -4158,-8.67,114.45 -4159,-8.67,114.45 -4160,-7.83,114.39 -4161,-7.83,114.39 -4162,-7.83,114.39 -4163,-7.83,114.39 -4164,-7.83,114.39 -4165,-7.83,114.39 -4166,-8.11,112.14 -4167,-6.74,107.01 -4168,-6.74,107.01 -4169,-6.74,107.01 -4170,-6.75,106.54 -4171,-6.70,110.85 -4172,-7.23,110.90 -4173,-7.22,110.90 -4174,-6.56,106.78 -4175,-6.72,106.46 -4176,-6.72,106.46 -4177,-6.72,105.57 -4178,-6.72,105.57 -4179,-7.26,107.41 -4180,-7.26,107.41 -4181,-7.26,107.41 -4183,-6.34,108.33 -4185,-6.87,115.36 -4186,-6.87,115.36 -4187,-6.87,115.36 -4188,-7.03,110.19 -4189,-6.31,107.29 -4190,-8,114.2 -4191,-8,114.2 -4192,-8,114.2 -4193,-8,114.2 -4194,-7.5,110.2 -4195,-7.48,110.22 -4196,-7.97,112.63 -4197,-8.46,113.82 -4198,-8.46,113.82 -4199,-8.46,113.82 -4200,-8.46,113.82 -4201,-8.46,113.82 -4202,-6.79,106.98 -4203,-6.72,106.46 -4204,-6.77,106.96 -4205,-7.19,111.6 -4206,-7.25,109.58 -4207,-7.25,109.58 -4208,-7.55,108.48 -4209,-6.62,110.89 -4210,-6.92,106.74 -4211,-7.23,108.83 -4212,-7.23,108.83 -4213,-7.23,108.83 -4214,-6.75,111.04 -4216,-8.06,112.81 -4217,-7.87,111.46 -4218,-6.90,115.37 -4219,-6.87,115.36 -4224,-7.33,110.51 -4225,-6.31,106.06 -4226,-7.50,111.74 -4227,-7.01,110.44 -4228,-6.77,108.55 -4229,-7.19,111.40 -4230,-6.82,107.14 -4231,-8.09,111.96 -4232,-6.93,106.93 -4233,-7.35,108.22 -4234,-7.19,110.75 -4235,-6.44,107.08 -4236,-6.18,106.82 -4239,-6.90,112.04 -4240,-6.79,105.38 -4241,-6.79,105.38 -4242,-6.79,105.38 -4243,-6.79,105.38 -4244,-6.79,105.38 -4245,-6.79,105.38 -4246,-6.79,105.38 -4247,-6.79,105.38 -4248,-8.02,112.95 -4251,-7.8044,114.3797 -4252,-7.8878,114.3786 -4253,-7.8531,114.4085 -4254,-6.7706,106.4565 -4255,-6.8038,106.931 -4256,-7.2547,107.4355 -4257,-7.1238,107.3197 -4258,-6.7847,106.578 -4259,-6.7671,106.5601 -4260,-6.7832,106.6828 -4261,-7.1029,107.3755 -4262,-6.9882,106.5549 -4263,-6.7339,105.3438 -4264,-6.7524,105.329 -4265,-6.628,105.9386 -4266,35.07,57.94 -4267,35.43,51.57 -4269,28.89,51.27 -4270,38.91,46.87 -4271,38.40,46.39 -4272,38.40,46.39 -4273,38.40,46.39 -4274,38.40,46.39 -4275,31.62,55.43 -4276,28.42,51.30 -4277,36.84,54.44 -4278,36.84,54.44 -4279,36.84,54.44 -4280,31.62,55.43 -4281,29.71,52.79 -4282,29.21,54.51 -4283,29.21,54.51 -4284,29.21,54.51 -4285,29.56,53.87 -4286,29.56,53.87 -4287,29.71,52.79 -4288,29.71,52.79 -4289,27.20,60.46 -4290,29.71,52.79 -4291,29.71,52.79 -4292,29.71,52.79 -4293,29.71,52.79 -4294,29.71,52.79 -4295,29.71,52.79 -4296,29.71,52.79 -4297,29.71,52.79 -4298,29.71,52.79 -4300,37.57,56.22 -4303,36.27,51.22 -4304,36.27,51.22 -4305,36.27,51.22 -4306,36.27,51.22 -4307,36.27,51.22 -4308,36.27,51.22 -4312,30.28,57.08 -4314,36.81,49.42 -4315,36.81,49.42 -4316,36.81,49.42 -4317,35.96,52.11 -4318,30.96,51.39 -4319,30.96,51.39 -4320,37.25,56.24 -4321,37.25,56.24 -4322,37.25,56.24 -4323,37.25,56.24 -4324,37.25,56.24 -4325,37.25,56.24 -4326,37.55,56.38 -4327,37.55,56.38 -4328,36.85,54.44 -4329,36.85,54.44 -4330,36.85,54.44 -4331,30.82,61.23 -4334,36.62,54.33 -4336,34.61,52.45 -4337,38.73,45.81 -4342,35.67,51.73 -4343,35.67,51.73 -4344,35.67,51.73 -4346,38.73,45.81 -4347,38.73,45.81 -4348,38.73,45.81 -4349,38.73,45.81 -4350,38.73,45.81 -4351,38.73,45.81 -4352,30.28,57.08 -4353,38.79,45.86 -4354,38.79,45.86 -4356,32.33,51.92 -4357,32.33,51.92 -4358,32.33,51.92 -4359,37.78,45.49 -4363,38.93,45.33 -4364,38.93,45.33 -4365,38.93,45.33 -4366,38.93,45.33 -4370,36.56,53.06 -4371,36.26,59.62 -4372,36.26,59.62 -4373,29.10,53.05 -4377,36.62,48.45 -4378,33.69,50.76 -4379,33.69,50.76 -4381,32.78,57.01 -4382,32.78,57.01 -4383,34.61,57.44 -4385,27.61,56.67 -4386,33.61,49.97 -4388,36.93,50.64 -4389,36.93,50.64 -4390,29.02,51.25 -4391,29.02,51.25 -4394,37.03,57.71 -4395,37.03,57.71 -4396,37.03,57.71 -4397,37.03,57.71 -4398,37.03,57.71 -4399,37.03,57.71 -4401,34.59,48.44 -4402,36.85,54.44 -4403,37.58,58.67 -4404,37.58,58.67 -4405,37.58,58.67 -4406,37.58,58.67 -4407,38.23,48.19 -4408,36.71,55.67 -4409,34.61,52.45 -4412,35.94,51.62 -4413,35.94,51.62 -4414,36.97,55.27 -4416,36.4611,51.4824 -4417,31.815,55.2717 -4418,31.7713,55.3136 -4419,32.2349,55.4353 -4420,31.6719,55.0649 -4421,29.6579,53.1614 -4422,29.8867,52.9034 -4423,29.8339,52.9008 -4424,29.8853,52.9552 -4425,29.815,52.975 -4426,26.6795,55.0549 -4427,29.6558,58.3126 -4428,29.5872,58.3913 -4429,36.9854,58.6955 -4430,37.6015,56.529 -4431,38.0852,56.4868 -4432,37.2019,54.6584 -4433,37.2709,54.3942 -4434,37.4797,57.2698 -4435,30.3739,57.3553 -4436,28.7051,51.5107 -4437,35.5963,51.8186 -4438,35.8595,60.1116 -4439,33.2073,60.3131 -4440,35.5268,59.2535 -4441,34.2792,58.7812 -4442,33.1146,59.2725 -4443,35.612,58.3048 -4444,35.555,55.3459 -4445,38.7594,45.8547 -4446,33.5913,49.1922 -4447,33.3084,49.242 -4448,36.3078,52.1673 -4449,36.3296,53.0279 -4450,36.2544,58.8633 -4451,35.8884,58.6493 -4452,37.5376,56.4123 -4453,37.5425,56.1588 -4454,37.8396,57.0308 -4455,37.8784,56.6037 -4456,38.8721,46.3442 -4457,37.277,58.4683 -4458,37.3762,58.5006 -4459,31.81,47.15 -4460,31.81,47.15 -4461,31.81,47.15 -4462,31.04,46.26 -4463,36.74,43.88 -4464,36.38,44.30 -4465,36.38,44.30 -4466,36.20,44.00 -4467,36.20,44.00 -4468,32.53,45.84 -4469,32.51,45.83 -4470,32.51,45.84 -4471,32.51,45.84 -4472,32.52,45.84 -4474,34.46,41.91 -4475,36.61,44.52 -4476,36.61,44.52 -4477,36.61,44.52 -4478,36.61,44.52 -4481,32.99,35.52 -4482,31.45,35.38 -4483,31.19,35.34 -4484,31.31,35.27 -4485,30.87,34.79 -4486,31.20,35.30 -4488,32.94,35.49 -4489,30.75,34.95 -4491,32.32,34.92 -4492,32.32,34.92 -4493,32.32,34.92 -4494,32.73,35.00 -4495,32.73,35.00 -4496,30.87,34.79 -4497,31.45,35.38 -4498,31.45,35.38 -4499,31.45,35.38 -4500,31.45,35.38 -4501,31.45,35.38 -4502,32.99,35.52 -4504,29.67,34.91 -4505,31.45,35.38 -4506,31.45,35.38 -4507,31.45,35.38 -4508,31.71,35.45 -4509,31.79,35.24 -4510,31.79,35.24 -4511,31.45,35.38 -4512,33.08,35.17 -4513,33.08,35.17 -4514,33.18,35.54 -4515,31.76,35.21 -4516,31.81,35.33 -4517,31.81,35.33 -4518,31.81,35.33 -4520,31.66,35.16 -4522,31.45,35.38 -4523,30.61,34.88 -4524,30.62,34.88 -4525,31.31,35.35 -4526,31.31,35.35 -4527,32.74,35.04 -4528,32.74,35.04 -4529,32.74,35.04 -4530,32.74,35.04 -4531,33.42,35.85 -4532,32.68,35.39 -4533,32.68,35.39 -4534,31.59,35.26 -4535,31.59,35.26 -4536,31.44,35.37 -4537,31.59,35.26 -4538,31.50,35.10 -4539,31.65,35.32 -4540,31.48,35.37 -4541,31.44,35.38 -4542,32.59,35.13 -4543,32.66,34.96 -4544,31.02,35.29 -4545,30.00,35.05 -4546,31.31,35.24 -4547,31.31,35.24 -4548,30.79,34.77 -4549,31.16,35.01 -4551,30.94,35.36 -4552,30.94,35.36 -4553,32.18,34.90 -4554,33.19,35.54 -4555,32.98,35.34 -4556,32.96,35.49 -4557,31.74,35.45 -4558,30.71,34.88 -4559,30.91,34.74 -4560,30.91,34.74 -4562,30.93,35.37 -4563,31.45,35.37 -4564,32.97,35.33 -4565,32.96,35.49 -4566,32.96,35.49 -4567,32.96,35.49 -4568,32.96,35.49 -4569,32.48,35.18 -4570,30.87,34.79 -4571,30.87,34.79 -4572,32.98,35.74 -4574,30.46,35.17 -4575,30.46,35.17 -4576,31.59,35.37 -4577,31.59,35.37 -4578,33.07,35.21 -4579,31.77,35.30 -4580,31.77,35.24 -4582,31.30,35.20 -4583,30.46,35.17 -4584,33.01,35.78 -4585,31.23,35.58 -4588,32.01,35.92 -4589,31.23,35.58 -4590,31.23,35.58 -4591,31.86,36.79 -4592,29.96,36.90 -4593,31.55,35.47 -4594,29.80,35.05 -4595,31.91,35.98 -4596,32.09,35.55 -4598,32.5,35.6 -4600,30.19,35.75 -4601,30.19,35.75 -4602,30.71,35.65 -4603,29.59,34.98 -4604,29.59,34.98 -4605,30.32,35.44 -4606,30.32,35.44 -4607,30.32,35.44 -4610,30.32,35.44 -4611,30.32,35.44 -4612,30.72,35.64 -4613,32.65,35.68 -4614,29.57,34.98 -4615,29.57,34.98 -4616,29.57,34.98 -4617,31.61,35.56 -4618,31.61,35.56 -4619,31.61,35.56 -4620,31.61,35.56 -4624,30.19,35.74 -4625,30.72,35.64 -4629,30.20,35.50 -4630,43.90,70.40 -4631,15.34,107.34 -4632,15.10,107.44 -4633,20.10,103.40 -4634,17.64,105.22 -4635,17.90,105.31 -4636,20.45,103.63 -4637,18.45,104.25 -4638,19.89,102.14 -4639,15.63,105.80 -4640,15.00,106.35 -4641,21.60,102.24 -4642,22.15,102.37 -4643,17.98,102.61 -4644,17.89,102.61 -4645,16.82,105.73 -4648,15.40,106.50 -4649,15.84,106.30 -4650,15.84,106.30 -4651,15.59,107.01 -4652,20.6599,103.2908 -4653,15.3908,106.3461 -4654,33.42,35.85 -4656,3.02,101.65 -4657,2.42,103.26 -4658,5.07,103.01 -4659,4.90,103.10 -4660,2.98,101.38 -4661,4.39,102.40 -4662,4.39,102.40 -4663,4.39,102.40 -4664,4.39,102.40 -4665,4.39,102.40 -4666,1.47,104.08 -4667,2.4,103.2 -4668,2.4,103.2 -4669,5.2801,102.6407 -4670,5.1205,102.9918 -4671,5.239,102.7215 -4672,4.7589,102.8283 -4673,3.3657,102.193 -4674,4.4303,103.1427 -4675,4.4536,102.516 -4676,4.2904,102.3561 -4677,4.0748,102.8376 -4678,4.1564,102.5324 -4679,4.2963,102.7504 -4680,5.4888,102.114 -4681,5.7067,101.9804 -4682,5.4091,101.6545 -4683,5.624,101.789 -4684,5.7618,101.5769 -4685,3.25,102.4 -4686,6.1,100.86 -4687,5.279,102.4918 -4689,28.82,84.02 -4690,28.82,84.02 -4691,27.73,85.30 -4692,28.36,81.56 -4693,28.36,81.56 -4694,28.36,81.56 -4695,28.36,81.56 -4696,27.27,86.62 -4697,27.50,84.67 -4698,27.50,84.67 -4699,27.50,84.67 -4700,27.50,84.67 -4701,27.50,84.67 -4702,27.50,84.67 -4703,26.90,85.36 -4704,28.28,83.85 -4705,28.27,83.90 -4706,28.82,84.02 -4707,28.69,80.95 -4708,28.28,83.93 -4709,27.70,85.33 -4710,27.83,85.25 -4711,28.26,84.02 -4712,28.25,83.91 -4713,27.53,85.56 -4714,26.65,87.00 -4715,29.52,82.08 -4716,29.50,82.82 -4717,28.24,84.00 -4718,27.50,84.67 -4719,23.80,83.00 -4720,28.24,84.00 -4721,27.50,84.67 -4722,27.50,84.67 -4723,27.50,84.67 -4724,27.50,84.67 -4725,27.50,84.67 -4726,27.50,84.67 -4727,27.50,84.67 -4728,28.24,83.95 -4729,29.50,82.82 -4730,28.36,81.56 -4731,28.36,81.56 -4732,28.86,80.25 -4733,28.25,83.85 -4734,28.28,83.93 -4735,27.66,85.28 -4736,28.7941,81.1997 -4737,27.4529,84.4404 -4738,27.4979,84.0197 -4739,28.7834,83.756 -4740,27.63,87.93 -4741,39.92,127.53 -4742,41.99,128.08 -4743,41.81,129.46 -4744,41.99,128.08 -4746,23.62,58.59 -4747,23.16,57.10 -4748,26.01,56.20 -4749,26.00,56.26 -4750,26.00,56.27 -4751,17.30,53.70 -4753,18.30,54.44 -4754,18.30,54.44 -4756,23.24,56.49 -4757,16.83,53.31 -4758,16.83,53.31 -4759,17.25,54.18 -4760,17.25,54.18 -4761,17.25,54.18 -4762,17.25,54.18 -4763,17.52,54.94 -4764,17.52,54.94 -4765,17.52,54.94 -4766,17.52,54.94 -4767,17.52,54.94 -4768,17.52,54.94 -4769,17.52,54.94 -4771,17.25,54.18 -4772,23.21,58.58 -4773,23.13,58.67 -4774,25.97,56.23 -4775,26.07,56.36 -4776,17.11,54.27 -4777,17.00,75.80 -4778,17.20,54.90 -4779,17.52,54.94 -4780,17.52,54.94 -4781,17.52,54.94 -4782,25.94,56.23 -4783,17.52,54.94 -4784,17.24,54.51 -4785,17.04,54.14 -4786,26.18,56.25 -4787,26.18,56.25 -4788,26.11,56.22 -4789,25.99,56.25 -4790,25.99,56.25 -4791,25.99,56.25 -4792,25.99,56.25 -4793,23.39,57.82 -4794,23.39,57.82 -4795,25.93,56.44 -4796,25.93,56.44 -4797,25.50,56.10 -4799,26.09,56.17 -4800,23.44,57.43 -4807,23.23,56.49 -4808,23.23,56.49 -4809,26.09,56.29 -4810,23.20,57.41 -4811,23.30,57.70 -4812,18.13,53.13 -4814,25.94,56.41 -4815,17.57,54.90 -4816,17.52,54.94 -4817,24.00,57.03 -4820,25.90,56.30 -4821,17.52,54.94 -4823,25.80,56.10 -4824,25.94,56.42 -4826,17.2705,53.6453 -4827,17.2712,54.8702 -4828,17.2246,55.11 -4829,17.0013,54.8161 -4830,17.0792,54.8472 -4831,25.75,56.15 -4833,25.9,63.9 -4834,34.17,73.22 -4835,34.17,73.22 -4836,34.17,73.22 -4837,34.17,73.22 -4838,34.05,73.41 -4839,35.10,75.20 -4840,34.06,73.24 -4841,34.06,73.24 -4842,34.06,73.24 -4843,34.06,73.24 -4844,34.06,73.24 -4845,34.00,73.40 -4846,34.06,73.24 -4847,34.06,73.24 -4848,34.06,73.24 -4849,34.17,73.22 -4850,31.62,71.06 -4851,34.17,73.22 -4852,34.54,73.35 -4853,34.54,73.35 -4854,34.18,73.21 -4855,35.26,73.27 -4856,33.79,73.20 -4857,34.33,73.20 -4858,34.33,73.20 -4859,34.19,73.38 -4860,32.89,70.63 -4861,34.33,73.20 -4862,34.19,73.38 -4863,34.17,73.22 -4864,29.33,66.92 -4865,29.41,67.06 -4866,35.43,74.09 -4867,30.22,66.74 -4868,30.22,66.74 -4869,33.69,71.50 -4870,34.43,73.69 -4871,35.20,71.88 -4873,34.05,73.41 -4874,33.74,73.08 -4875,33.74,73.08 -4876,33.74,73.08 -4877,33.74,73.08 -4878,33.73,73.07 -4879,33.73,73.07 -4880,34.05,72.83 -4881,27.11,67.71 -4882,29.03,66.63 -4892,32.10,74.28 -4893,25.50,64.00 -4894,34.36,73.46 -4895,34.50,73.75 -4897,24.94,67.11 -4898,33.73,73.09 -4899,33.73,73.09 -4900,33.96,73.06 -4901,35.07,72.87 -4902,34.15,74.19 -4903,34.91,73.65 -4904,33.75,73.01 -4905,33.71,72.17 -4906,32.96,71.55 -4907,32.91,71.53 -4908,35.48,72.59 -4909,28.88,66.11 -4910,35.28,71.91 -4911,35.41,73.20 -4912,26.79,67.45 -4913,26.79,67.45 -4914,26.79,67.45 -4915,33.91,73.41 -4916,33.79,72.90 -4917,27.15,66.76 -4918,27.15,66.76 -4919,27.15,66.76 -4920,27.15,66.76 -4921,27.15,66.76 -4922,27.15,66.76 -4923,27.15,66.76 -4924,27.15,66.76 -4925,27.15,66.76 -4926,27.15,66.76 -4927,27.15,66.76 -4928,27.15,66.76 -4929,33.85,72.97 -4930,32.47,74.25 -4931,34.17,73.21 -4932,32.30,72.34 -4933,30.37,67.71 -4934,27.76,65.73 -4935,33.84,72.44 -4936,27.91,65.55 -4937,32.33,73.22 -4938,35.92,74.31 -4939,34.04,73.05 -4940,33.65,71.64 -4941,35.25,74.84 -4942,34.39,72.85 -4943,27.79,65.68 -4944,33.82,73.01 -4945,33.82,73.01 -4946,33.82,73.01 -4947,33.82,73.01 -4948,33.82,73.01 -4949,33.82,73.01 -4950,33.82,73.01 -4951,33.73,73.05 -4953,33.92,73.21 -4954,33.92,73.21 -4955,34.31,73.13 -4956,27.55,64.34 -4957,27.55,64.34 -4958,27.55,64.34 -4959,32.54,71.93 -4960,32.54,71.93 -4961,26.21,63.04 -4962,25.9,63.9 -4963,26.21,66.03 -4964,28.43,66.06 -4965,28.43,66.06 -4966,28.43,66.06 -4967,33.90,73.38 -4968,33.90,73.38 -4969,33.90,73.38 -4970,33.90,73.38 -4971,33.90,73.38 -4972,33.90,73.38 -4973,27.40,65.15 -4974,34.32,73.17 -4975,34.07,73.37 -4976,34.16,73.20 -4977,34.08,73.37 -4980,34.37,72.43 -4981,34.07,73.38 -4982,34.07,73.37 -4983,25.56,69.89 -4984,28.28,68.43 -4985,34.36,73.36 -4987,33.63,70.52 -4988,25.84,66.35 -4989,25.84,66.35 -4990,34.58,71.96 -4992,35.10,73.00 -4993,34.30,73.20 -4995,34.33,73.21 -4997,33.41,73.00 -4998,24.82,67.23 -4999,31.10,69.38 -5000,31.10,69.38 -5001,31.10,69.38 -5002,33.21,71.63 -5003,33.21,71.63 -5004,28.45,65.03 -5005,28.45,65.03 -5006,32.80,72.83 -5007,32.80,72.83 -5008,34.55,73.58 -5011,34.65,73.45 -5012,34.07,73.36 -5013,32.79,74.27 -5015,30.55,70.11 -5016,34.79,72.56 -5017,34.79,72.56 -5019,34.45,72.97 -5020,34.23,73.35 -5021,34.23,73.35 -5022,31.25,68.00 -5023,28.49,66.28 -5024,32.54,71.93 -5025,32.33,71.87 -5026,34.16,73.15 -5029,32.45,71.50 -5031,35.6015,74.2158 -5032,33.4133,74.0126 -5033,33.3329,74.0563 -5034,31.88,35.15 -5035,42.93,131.31 -5036,43.43,39.93 -5037,41.81,46.14 -5040,42.96,131.48 -5041,43.56,41.28 -5042,44.92,131.81 -5044,43.10,131.63 -5045,43.18,131.62 -5046,43.18,131.62 -5047,43.18,131.62 -5048,43.18,131.62 -5049,46.5,133.9 -5055,43.7,40.5 -5056,42.7,44 -5057,43.50,134.00 -5058,43.8,40.1 -5059,43.32,45.69 -5061,43.79,39.46 -5062,43.39,43.56 -5063,43.22,131.98 -5064,43.22,131.98 -5065,43.22,131.98 -5066,43.22,131.98 -5067,43.22,131.98 -5068,43.22,131.98 -5069,43.22,131.98 -5070,43.22,131.98 -5071,43.22,131.98 -5072,43.22,131.98 -5073,43.22,131.98 -5074,43.22,131.98 -5075,43.22,131.98 -5076,42.43,130.64 -5077,42.43,130.64 -5078,42.43,130.64 -5079,42.43,130.64 -5080,43.00,131.25 -5081,43.00,131.25 -5082,43.00,131.25 -5084,43.51,39.87 -5086,44.98,131.78 -5087,47.52,137.90 -5088,43.10,133.95 -5090,42.96,47.51 -5091,42.96,47.51 -5093,43.40,131.80 -5098,43.18,133.18 -5099,43.97,40.14 -5100,43.20,131.60 -5102,42.75,130.90 -5104,41.84,48.49 -5107,48.75,129 -5108,43.59,39.73 -5109,43.14,131.89 -5112,44.00,133.00 -5113,44.00,134.50 -5114,44.00,134.50 -5115,44.00,133.00 -5116,44.00,132.00 -5117,44.00,132.00 -5118,43.35,132.55 -5119,43.15,133.05 -5120,42.70,131.10 -5121,43.6,132.5 -5122,44.10,39.08 -5124,43.7,40.3 -5125,44.1,39.7 -5126,44.03,133.12 -5127,43.65,39.72 -5131,44.41,131.29 -5132,43.45,131.40 -5133,43.60,131.30 -5134,41.80,46.60 -5135,41.80,46.60 -5136,43.68,41.56 -5137,44,40 -5138,44,40 -5139,42.00,46.39 -5140,42.95,47.45 -5141,43.65,40.5 -5142,44.60,38.57 -5143,42.00,46.39 -5144,42.48,44.42 -5145,42.48,44.42 -5146,43.40,44.81 -5147,43.61,39.83 -5148,43.59,39.88 -5149,43.72,40.12 -5150,44.17,40.53 -5151,43.65,40.1 -5153,43.99,40.02 -5154,43.54,40.04 -5155,43.47,39.98 -5157,43.21,43.47 -5158,41.50,43.22 -5159,43.19,43.07 -5160,43.48,40.12 -5161,43.48,40.12 -5162,43.50,40.05 -5165,43.75,40.15 -5169,43.15,45.24 -5170,43.25,45.37 -5173,43.11,45.48 -5174,43.11,45.48 -5175,43.48,40.12 -5176,43.23,43.34 -5177,43.23,43.34 -5180,43.65,40.2 -5183,45,39 -5184,45.08,39.49 -5185,44.35,39.04 -5189,44.35,38.70 -5190,44.28,39.84 -5191,43.23,43.34 -5193,43.60,39.80 -5194,43.60,39.80 -5195,44.10,39.10 -5196,44.10,39.10 -5202,43.45,41.00 -5204,43.7,40.3 -5205,44.45,46.59 -5206,45.08,39.49 -5210,43.45,41.00 -5215,42.83,46.76 -5216,42.90,46.50 -5217,42.90,46.50 -5218,42.00,47.15 -5220,42.21,46.06 -5221,42.00,47.15 -5222,41.33,47.50 -5223,41.35,47.47 -5224,43.01,46.41 -5225,43.13,46.69 -5226,43.04,46.33 -5228,42.03,46.97 -5230,42.02,46.58 -5231,42.02,46.58 -5232,42.02,46.58 -5233,41.90,46.98 -5234,42.60,46.38 -5235,42.06,46.11 -5236,42.67,46.01 -5238,42.40,46.01 -5239,42.04,46.28 -5240,42.28,46.03 -5241,42.04,46.28 -5242,42.04,46.28 -5243,42.25,46.29 -5244,41.77,47.20 -5246,42.06,46.38 -5247,57.00,118.00 -5250,43.07,131.54 -5251,43.07,131.54 -5255,43.02,131.31 -5256,43.02,131.31 -5257,43.02,131.31 -5258,43.02,131.31 -5260,45.00,133.17 -5261,55.00,123.00 -5262,43.07,131.53 -5263,43.15,132.00 -5264,43.53,131.92 -5265,43.09,131.54 -5268,43.4387,131.3109 -5269,43.8189,131.5116 -5270,43.5906,131.5544 -5271,43.7012,131.7596 -5272,43.3135,131.2976 -5273,43.0242,131.1564 -5274,42.8721,131.1602 -5275,42.8094,130.7478 -5276,43.5209,131.7363 -5277,43.4308,131.5017 -5278,43.4968,131.6842 -5279,43.4772,131.6761 -5280,43.4405,131.4546 -5281,43.3997,131.6481 -5282,43.5018,131.5278 -5283,43.4375,131.7086 -5284,43.4765,131.6034 -5285,43.5164,131.6544 -5286,43.4693,131.5529 -5287,43.4821,131.5401 -5288,43.4511,131.5435 -5289,43.4189,131.5842 -5290,43.4096,131.4165 -5291,43.3791,131.5503 -5292,43.506,131.6388 -5293,43.5333,131.7144 -5294,43.3238,131.5431 -5295,43.3506,131.4963 -5296,43.4439,131.5999 -5297,43.823,132.0324 -5298,43.8283,131.8699 -5299,43.02,131.31 -5302,42.00,46.39 -5303,44.5,40.75 -5304,43.95,40.09 -5305,42.70,47.55 -5306,44.51,39.30 -5308,43.42,39.93 -5310,24.28,39.33 -5311,24.28,39.33 -5312,24.17,38.75 -5313,24.50,38.63 -5316,19.12,41.20 -5317,19.12,41.20 -5318,26.52,37.95 -5319,26.52,37.95 -5321,25.73,38.08 -5322,19.22,42.16 -5323,18.03,42.82 -5324,24.50,38.82 -5325,24.52,38.83 -5326,19.00,42.86 -5327,19.00,42.86 -5328,19.28,42.35 -5329,24.13,38.70 -5330,18.96,42.25 -5332,24.32,38.83 -5333,24.38,38.87 -5334,24.22,38.87 -5335,24.58,39.02 -5336,25.82,38.10 -5337,26.08,37.85 -5338,26.63,37.65 -5339,24.27,39.12 -5340,21.41,39.78 -5341,21.47,39.80 -5344,26.13,37.53 -5345,26.27,37.15 -5346,20.97,40.22 -5347,19.75,41.63 -5348,22.70,39.78 -5349,24.08,38.83 -5350,24.22,38.85 -5351,24.53,38.85 -5352,17.47,43.05 -5353,20.93,40.37 -5354,26.50,37.55 -5355,26.40,37.22 -5356,17.25,43.12 -5357,20.45,41.15 -5358,21,40.6 -5359,24.18,38.95 -5360,26.17,38.25 -5361,20.08,41.27 -5362,23.46,40.84 -5363,24.52,38.17 -5364,24.42,38.33 -5365,24.50,38.08 -5366,24.32,38.05 -5367,26.25,38.92 -5368,19.73,41.38 -5369,23.52,39.03 -5370,19.18,41.67 -5371,23.98,39.25 -5372,24.00,38.23 -5374,25.25,37.33 -5376,19.16,41.63 -5377,18.21,42.65 -5378,19.10,42.16 -5379,24.23,38.88 -5380,24.08,38.83 -5381,26.93,37.97 -5382,24.17,38.93 -5383,19.12,41.08 -5384,24.13,38.68 -5385,18.20,42.30 -5391,24.25,38.97 -5392,18.50,42.23 -5393,18.77,42.22 -5394,18.63,42.23 -5395,19.13,42.25 -5396,26.30,38.17 -5397,25.83,37.80 -5398,18.20,42.50 -5399,24.50,38.08 -5400,18.20,42.50 -5401,25.67,38.12 -5402,18.20,42.50 -5403,26.25,38.08 -5404,18.30,42.50 -5405,18.24,42.50 -5406,17.90,42.38 -5407,25.50,37.33 -5408,24.50,38.63 -5409,18.87,42.12 -5410,24.38,38.98 -5411,19.31,42.03 -5412,20.02,41.47 -5413,19.11,42.16 -5414,19.11,42.16 -5415,19.60,41.50 -5416,29.40,36.50 -5417,19.80,41.33 -5418,24.82,55.16 -5420,16.59,42.94 -5421,19.09,42.83 -5422,19.71,41.67 -5423,19.80,41.50 -5424,1.41,103.95 -5428,35.33,127.73 -5429,37.37,127.50 -5430,37.36,127.51 -5431,35.67,128.07 -5432,35.99,127.66 -5433,35.99,127.66 -5434,36.48,128.88 -5435,35.54,128.16 -5436,35.54,128.16 -5437,38.11,128.46 -5438,37.82,128.15 -5439,6.80,80.60 -5440,6.80,80.60 -5441,6.30,80.59 -5442,6.88,80.81 -5444,6.84,81.83 -5445,6.84,81.83 -5446,6.95,80.19 -5447,6.95,80.19 -5448,6.99,81.05 -5449,6.37,81.42 -5450,6.37,81.42 -5451,6.37,81.42 -5452,6.37,81.42 -5453,6.37,81.42 -5454,6.80,80.67 -5455,6.80,80.67 -5456,6.68,81.07 -5457,6.68,81.07 -5458,6.19,81.19 -5459,6.19,81.19 -5460,6.30,80.59 -5461,7.28,80.62 -5462,7.28,80.62 -5463,7.28,80.62 -5464,7.28,80.62 -5465,7.91,81.08 -5466,7.23,81.47 -5467,7.23,81.47 -5468,7.23,81.47 -5469,7.23,81.47 -5470,7.23,81.47 -5471,7.23,81.47 -5472,7.23,81.47 -5473,7.23,81.47 -5474,7.19,80.67 -5475,7.19,80.67 -5476,7.75,80.57 -5477,7.75,80.57 -5478,7.57,80.69 -5479,8.83,80.25 -5480,8.83,80.25 -5481,6.92,80.80 -5482,6.92,80.82 -5483,6.92,80.80 -5484,6.92,80.80 -5485,6.92,80.80 -5486,6.13,81.10 -5487,6.13,81.10 -5488,6.13,81.10 -5489,7.28,80.63 -5490,7.28,80.63 -5491,7.27,80.64 -5492,6.33,80.30 -5493,7.70,80.91 -5494,8.04,80.94 -5495,8.04,80.94 -5496,6.31,80.32 -5497,6.31,80.32 -5498,6.81,80.78 -5499,6.81,80.78 -5500,6.81,80.78 -5501,6.81,80.78 -5502,6.81,80.78 -5503,6.81,80.78 -5504,6.81,80.78 -5505,6.81,80.78 -5506,6.81,80.78 -5507,8.20,80.84 -5508,8.20,80.84 -5509,8.20,80.84 -5510,8.03,79.83 -5511,8.03,79.83 -5512,7.21,81.54 -5513,8.28,79.84 -5514,8.28,79.84 -5515,7.88,80.70 -5516,7.88,80.70 -5517,7.72,80.16 -5518,7.72,80.16 -5519,8.15,80.91 -5520,8.15,80.91 -5521,6.20,81.13 -5522,7.40,80.79 -5523,7.40,80.79 -5524,7.40,80.79 -5525,6.70,80.37 -5526,6.53,81.12 -5527,6.91,81.75 -5528,6.91,81.75 -5529,6.91,81.75 -5530,6.91,81.75 -5531,6.91,81.75 -5532,6.46,81.20 -5533,6.46,81.20 -5534,8.77,80.15 -5535,8.77,80.15 -5536,7.57,81.14 -5537,7.57,81.14 -5538,7.57,81.14 -5539,7.57,81.14 -5540,7.57,81.14 -5541,6.37,81.42 -5542,6.34,80.55 -5544,6.93,80.77 -5545,6.93,80.77 -5546,7.99,80.92 -5547,7.99,80.92 -5548,7.99,80.92 -5549,7.99,80.92 -5550,7.33,81.53 -5551,6.94,80.74 -5552,8.53,81.04 -5553,8.53,81.04 -5554,7.96,81.36 -5555,8.69,81.18 -5556,8.69,81.18 -5557,6.70,81.27 -5558,6.95,80.78 -5559,6.89,80.46 -5560,6.89,80.46 -5561,6.89,80.46 -5562,6.89,80.46 -5563,6.76,80.53 -5564,6.76,80.53 -5565,7.93,81.00 -5566,7.14,80.67 -5567,7.14,80.67 -5568,6.46,80.61 -5569,6.46,80.61 -5570,8.11,80.65 -5571,8.11,80.65 -5572,8.11,80.65 -5573,6.27,81.38 -5574,6.27,81.38 -5575,6.27,81.38 -5576,6.57,81.67 -5577,6.57,81.67 -5578,6.57,81.67 -5579,6.57,81.67 -5580,6.57,81.67 -5581,6.57,81.67 -5582,6.57,81.67 -5583,7.95,80.75 -5584,7.95,80.75 -5585,7.95,80.75 -5586,7.95,80.75 -5587,6.39,80.50 -5588,6.39,80.50 -5589,6.39,80.50 -5590,6.39,80.50 -5591,6.39,80.50 -5592,6.39,80.50 -5593,6.39,80.50 -5594,6.94,80.21 -5595,8.17,81.21 -5596,8.17,81.21 -5597,8.17,81.21 -5598,8.17,81.21 -5599,8.15,81.27 -5600,8.15,81.27 -5601,6.30,80.59 -5602,6.47,80.89 -5603,6.47,80.89 -5604,6.47,80.89 -5605,6.47,80.89 -5606,6.47,80.89 -5607,6.47,80.89 -5608,7.19,80.92 -5609,7.19,80.92 -5610,7.19,80.92 -5611,7.75,80.92 -5612,7.75,80.92 -5613,7.75,80.92 -5614,7.75,80.92 -5615,7.75,80.92 -5616,8.41,80.05 -5617,8.41,80.05 -5618,8.41,80.05 -5619,8.41,80.05 -5620,8.41,80.05 -5621,8.41,80.05 -5622,8.41,80.05 -5623,8.41,80.05 -5624,8.41,80.05 -5625,8.41,80.05 -5626,8.41,80.05 -5627,8.41,80.05 -5628,8.41,80.05 -5629,8.41,80.05 -5630,8.41,80.05 -5631,8.41,80.05 -5632,8.41,80.05 -5633,8.41,80.05 -5634,8.41,80.05 -5635,6.37,81.42 -5636,6.37,81.42 -5637,6.58,81.66 -5638,6.58,81.66 -5639,6.58,81.66 -5640,6.58,81.66 -5641,6.37,81.42 -5642,6.58,81.66 -5643,6.58,81.66 -5644,6.37,81.42 -5645,6.8015,80.6216 -5646,6.9373,79.8917 -5647,6.7561,80.6977 -5648,7.2034,80.6151 -5649,7.2709,80.6422 -5650,7.2553,80.6325 -5651,8.3076,80.8441 -5652,7.026,80.7864 -5653,8.8836,80.3568 -5654,7.6389,80.9393 -5655,6.4632,81.3839 -5656,6.4644,81.3266 -5657,6.5198,81.4115 -5658,6.5303,81.422 -5659,6.5079,81.4753 -5660,6.4714,81.4582 -5661,6.4813,81.5338 -5662,6.4686,81.5292 -5663,6.4785,81.5206 -5664,6.4112,81.4706 -5665,6.4077,81.4818 -5666,6.4231,81.4825 -5667,6.4239,81.4812 -5668,6.4364,81.5556 -5669,6.4077,81.553 -5670,35.25,36.10 -5671,35.85,36.00 -5672,35.85,36.00 -5673,35.19,37.21 -5674,35.19,37.21 -5675,35.58,36.18 -5676,35.65,36.20 -5677,35.90,36.00 -5678,35.90,36.00 -5679,35.25,36.10 -5680,35.35,36.26 -5681,35.35,36.26 -5682,35.64,36.20 -5683,36.38,36.62 -5684,34.58,38.26 -5685,34.58,38.26 -5686,35.59,36.06 -5687,35.53,36.22 -5689,38.3,69.7 -5690,38.09,69.34 -5691,37.7,70 -5692,37.22,68.23 -5694,37.48,69.37 -5695,37.26,68.13 -5697,38.00,68.50 -5698,38.00,68.50 -5699,37.33,69.25 -5700,38.00,68.50 -5701,38.4,68.8 -5702,37.58,71.50 -5703,15.58,98.66 -5704,12.86,99.40 -5705,13.75,100.50 -5706,15.79,102.03 -5707,15.58,98.66 -5708,15.58,98.66 -5709,15.58,98.66 -5710,15.58,98.66 -5711,15.58,98.66 -5712,15.58,98.66 -5713,15.58,98.66 -5714,15.58,98.66 -5715,15.58,98.66 -5716,15.58,98.66 -5717,15.58,98.66 -5718,15.58,98.66 -5719,15.58,98.66 -5720,15.58,98.66 -5721,15.58,98.66 -5722,12.86,99.40 -5723,12.86,99.40 -5724,12.86,99.40 -5725,12.86,99.40 -5726,12.86,99.40 -5727,14.02,99.52 -5728,7.58,99.85 -5729,12.84,102.17 -5730,12.84,102.17 -5731,12.84,102.17 -5732,12.84,102.17 -5733,12.84,102.17 -5734,12.84,102.17 -5735,9.43,98.58 -5736,8.42,98.96 -5737,8.91,98.53 -5738,8.91,98.53 -5739,8.91,98.53 -5740,19.13,98.13 -5741,8.91,98.53 -5742,18.73,97.87 -5743,17.71,98.15 -5744,12.98,99.64 -5745,16.20,101.37 -5746,17.55,100.70 -5747,11.81,99.77 -5748,18.20,97.73 -5749,9.13,99.32 -5750,16.89,99.13 -5751,15.58,98.66 -5752,6.93,100.25 -5753,15.24,104.84 -5754,15.38,100.02 -5755,6.54,101.27 -5756,16.7477,100.2027 -5757,12.9953,99.3327 -5758,18.7627,98.8565 -5759,15.6539,99.5247 -5760,15.1661,99.2784 -5761,15.6986,98.7621 -5762,15.5612,98.9229 -5763,15.0417,98.3983 -5764,14.4518,98.8936 -5765,15.3042,99.282 -5766,15.1038,99.1074 -5767,15.1941,98.9874 -5768,15.8022,99.7023 -5769,15.4968,99.6261 -5770,15.2545,98.7483 -5771,14.785,99.2517 -5772,15.537,99.1422 -5773,16.0221,98.6581 -5774,15.5751,99.1429 -5775,15.0925,98.9792 -5776,14.799,98.9247 -5777,14.8046,98.532 -5778,14.3872,99.2542 -5779,13.075,99.5457 -5780,13.1241,99.4217 -5781,13.0125,99.2634 -5782,12.8847,99.6302 -5783,12.0023,99.6938 -5784,12.95,99.2334 -5785,13.0527,99.1907 -5786,13.3983,99.5686 -5787,14.0507,99.5436 -5788,8.9317,98.511 -5789,12.3004,99.5971 -5791,40.44,31.57 -5792,40.60,31.27 -5793,40.65,31.3 -5794,36.99,35.33 -5795,36.99,35.33 -5796,37.76,38.27 -5797,37.76,38.27 -5798,39.70,44.29 -5799,39.70,44.29 -5800,37.8,27.8 -5801,37.8,27.8 -5802,36.89,30.71 -5803,36.89,30.71 -5804,36.89,30.71 -5805,39.70,44.29 -5806,39.70,44.29 -5807,40.48,41.00 -5808,41.21,41.89 -5809,38.39,27.33 -5810,37.83,27.84 -5811,37.83,27.84 -5812,38.06,27.72 -5813,37.8,35.2 -5814,40.18,31.85 -5815,40.18,31.85 -5816,40.17,31.89 -5817,37.88,41.12 -5818,37.88,41.12 -5819,37.48,27.52 -5820,38.01,28.35 -5821,40.16,31.92 -5822,40.16,31.92 -5823,40.16,31.91 -5824,40.16,31.93 -5825,40.16,31.91 -5826,38.64,42.42 -5827,38.05,27.73 -5828,40.71,31.59 -5829,40.71,31.59 -5830,36.98,32.96 -5831,40.41,31.00 -5833,37.60,28.06 -5834,37.37,42.34 -5835,37.78,29.09 -5836,37.78,29.09 -5837,37.68,27.19 -5838,37.89,40.24 -5839,37.89,40.24 -5840,36.98,30.57 -5841,37.92,27.32 -5842,36.67,37.46 -5843,37.75,42.18 -5844,39.72,39.46 -5845,39.90,41.24 -5846,39.90,41.24 -5847,36.92,30.87 -5848,37.08,37.38 -5849,37.08,37.38 -5850,40.43,29.16 -5851,37.04,36.30 -5852,37.04,36.30 -5853,37.04,36.30 -5854,39.10,39.56 -5855,36.95,33.54 -5856,36.42,36.36 -5857,36.42,36.36 -5858,40.85,41.1 -5859,36.98,32.96 -5860,38.42,27.14 -5861,38.42,27.14 -5863,40.42,29.72 -5864,39.81,27.21 -5865,37.37,36.09 -5866,37.96,38.73 -5867,40.22,28.35 -5868,39.91,27.74 -5869,39.91,27.74 -5870,41.16,43.28 -5871,41.16,43.28 -5872,41.42,41.97 -5873,40.62,43.06 -5874,40.62,43.06 -5875,36.63,32.18 -5876,36.20,29.64 -5877,39.60,39.03 -5878,39.31,40.34 -5879,37.85,27.26 -5880,38.67,29.40 -5882,38.36,38.33 -5883,36.84,34.64 -5884,36.84,34.64 -5885,40.9,41.1 -5886,37.30,27.77 -5887,39.70,44.29 -5888,37.22,28.36 -5889,37.22,28.36 -5890,37.22,28.36 -5891,36.60,32.00 -5892,36.60,32.00 -5893,37.46,27.99 -5894,36.20,29.64 -5895,36.20,29.64 -5896,37.85,27.33 -5897,37.30,27.75 -5899,37.46,27.99 -5900,38.40,42.10 -5901,36.20,29.64 -5902,36.34,29.38 -5903,36.59,30.51 -5905,38.66,43.99 -5906,38.66,43.99 -5909,37.86,27.26 -5910,37.86,27.26 -5911,37.86,27.26 -5912,37.86,27.26 -5913,37.17,38.10 -5914,37.17,38.10 -5916,37.30,44.58 -5917,37.30,44.47 -5918,37.93,41.94 -5919,37.93,41.94 -5920,37.50,42.46 -5921,37.50,42.46 -5922,36.98,32.97 -5924,36.99,30.47 -5925,36.99,30.47 -5926,36.99,30.47 -5927,36.99,30.47 -5928,36.99,30.47 -5929,36.99,30.47 -5935,36.56,32.00 -5936,39.69,44.30 -5937,39.69,44.30 -5938,37.92,27.37 -5941,41.3611,42.1203 -5942,37.83,58.00 -5943,35.67,62.93 -5945,37.81,58.10 -5946,37.99,57.95 -5947,37.90,58.06 -5948,37.95,58.31 -5949,37.62,54.10 -5951,37.7,58.3 -5952,35.85,61.90 -5953,35.85,61.90 -5954,35.85,61.90 -5955,35.85,61.90 -5956,35.85,61.90 -5957,35.85,61.90 -5958,35.85,61.90 -5959,35.85,61.90 -5960,35.85,61.90 -5962,39.6,54.7 -5963,37.9,57.9 -5964,37.9,57.9 -5965,37.9,57.9 -5966,37.9,57.9 -5967,35.67,62.93 -5968,35.85,61.57 -5969,38,58.1 -5970,37.69,58.35 -5971,37.69,58.35 -5972,37.9,58.1 -5973,37.9,58.1 -5975,37.90,57.82 -5976,35.81,61.43 -5977,37.81,58.09 -5978,37.81,58.09 -5979,39.6,54.7 -5980,39.6,54.7 -5981,35.84,61.51 -5982,35.88,61.64 -5983,38.2,55.7 -5984,37.81,58.10 -5985,37.79,58.51 -5986,37.79,58.51 -5987,37.79,58.51 -5988,38.91,55.42 -5989,38.91,55.42 -5990,37.68,58.40 -5991,35.88,61.79 -5992,37.93,57.99 -5993,37.80,58.09 -5994,37.80,58.09 -5995,37.84,57.99 -5996,37.84,57.99 -5997,37.84,57.99 -5998,37.84,57.99 -5999,37.84,57.99 -6000,37.80,58.09 -6001,39.81,52.99 -6002,39.81,52.99 -6003,37.77,66.50 -6004,38.48,56.68 -6005,39,55.5 -6006,39,55.5 -6007,39,55.5 -6008,38.34,57.37 -6009,39,55.5 -6010,37.64,54.73 -6012,39.8,54.5 -6013,39.8,54.5 -6014,39.8,54.5 -6015,39.8,54.5 -6020,38.14,57.77 -6021,37.17,60.00 -6022,38.53,56.42 -6023,39.62,54.60 -6024,38.2,55.5 -6025,38.48,57.01 -6026,38.24,56.96 -6027,38.30,57.27 -6028,37.77,58.39 -6029,38.35,56.71 -6030,37.72,58.68 -6032,38.2,55.5 -6033,38.2,55.5 -6034,38.36,56.75 -6035,38.51,56.39 -6036,38.51,56.39 -6037,38.51,56.39 -6038,38.51,56.39 -6039,38.51,56.39 -6040,38.51,56.39 -6041,38.51,56.39 -6042,36.14,61.40 -6043,39.65,54.60 -6044,39.65,54.60 -6046,38.29,57.07 -6047,41.10,55.20 -6048,38.25,56.15 -6049,38.25,56.15 -6051,37.73,58.34 -6052,24.05,55.77 -6053,24.05,55.77 -6055,25.32,55.99 -6056,25.31,56.16 -6057,25.31,56.16 -6058,25.63,56.12 -6059,25.99,56.10 -6060,25.75,56.15 -6061,25.75,56.15 -6062,25.75,56.15 -6063,25.31,56.16 -6064,25.31,56.16 -6065,25.53,56.12 -6066,25.53,56.12 -6067,25.80,55.97 -6068,25.80,55.97 -6069,25.80,55.97 -6070,25.79,56.05 -6071,25.46,56.09 -6072,25.46,56.09 -6075,37.68,66.55 -6076,22.35,105.73 -6077,21.09,105.40 -6078,21.09,105.40 -6079,22.28,105.87 -6080,16.17,107.90 -6081,16.17,107.90 -6082,15.87,108.33 -6083,19.61,105.53 -6084,19.61,105.53 -6085,12.14,107.17 -6086,12.14,107.17 -6087,11.42,107.43 -6088,20.25,105.73 -6089,20.25,105.73 -6090,20.25,105.73 -6091,20.67,105.31 -6092,20.67,105.31 -6093,21.01,105.85 -6094,21.01,105.85 -6095,21.01,105.85 -6096,21.68,106.38 -6097,21.68,106.38 -6098,13.82,108.31 -6099,13.82,108.31 -6100,13.12,108.87 -6101,13.13,108.90 -6102,22.37,103.04 -6103,22.56,102.75 -6104,21.82,106.63 -6105,14.46,107.63 -6106,14.46,107.63 -6107,22.40,102.72 -6108,22.40,102.72 -6109,11.37,107.43 -6110,11.37,107.43 -6111,11.37,107.43 -6112,17.54,106.14 -6113,17.54,106.14 -6114,19.05,104.75 -6115,19.05,104.75 -6116,16.67,107.02 -6117,21.45,105.68 -6119,18.33,105.43 -6120,18.33,105.43 -6122,12.70,107.71 -6123,13.9174,108.1171 -6124,16.03,44.29 -6125,16.03,44.29 -6126,13.47,46.02 -6127,12.87,45.03 -6128,12.87,45.03 -6129,14.79,45.71 -6130,14.79,45.71 -6132,13.87,45.84 -6133,14.65,43.68 -6134,13.69,44.50 -6135,13.69,44.50 -6136,13.71,44.71 -6137,13.70,44.50 -6138,14.00,46.90 -6139,14.06,46.91 -6140,13.5,45.8 -6141,14.76,44.28 -6142,14.06,46.91 -6143,14.06,46.91 -6144,14.06,46.91 -6145,15.07,43.74 -6146,15.28,44.17 -6153,13.55,44.01 -6154,13.55,44.01 -6155,13.55,44.01 -6156,15.50,44.21 -6157,16.13,43.68 -6158,14.47,48.24 -6159,14.47,48.24 -6160,14.26,46.28 -6161,14.26,46.28 -6162,14.26,46.28 -6163,16.43,48.40 -6164,15.33,43.35 -6165,14.90,45.80 -6166,14.61,45.35 -6167,14.61,45.35 -6168,16.67,44.44 -6169,16.27,43.24 -6170,16.76,44.19 -6171,16.02,43.89 -6172,15.88,43.66 -6173,37.75,26.98 \ No newline at end of file diff --git a/data-raw/old_vignettes/tidysdm_overview.Rmd b/data-raw/old_vignettes/tidysdm_overview.Rmd deleted file mode 100644 index f579b335..00000000 --- a/data-raw/old_vignettes/tidysdm_overview.Rmd +++ /dev/null @@ -1,468 +0,0 @@ ---- -title: "tidysdm overview" -output: rmarkdown::html_vignette -#output: rmarkdown::pdf_document -vignette: > - %\VignetteIndexEntry{tidysdm overview} - %\VignetteEngine{knitr::rmarkdown} - %\VignetteEncoding{UTF-8} ---- - -```{r, include = FALSE} -knitr::opts_chunk$set( - collapse = TRUE, - comment = "#>" -) -``` - -# SDMs with `tidymodels` - -Species Distribution Modelling relies on a number of algorithms, many of which -have a number of hyperparameters that require turning. The `tidymodels` universe -includes a number of packages specifically design to fit, tune and validate -models. The advantage of `tidymodels` is that the models syntax and the results -returned to the users are standardised, thus providing a coherent interface to -modelling. Given the variety of models required for SDM, `tidymodels` is an -ideal framework. `tidysdm` provides a number of wrappers and specialised -functions to facilitate the fitting of SDM with `tidymodels`. - -When we load `tidysdm`, it automatically loads `tidymodels` and all associated -packages necessary to fit models: -```{r} -library(tidysdm) -``` - - -# Preparing your data - -We start by reading in a set of presences for a mosquito, *Anopheles arabiensis* in Africa. - -```{r load_presences} -library(readr) # for importing data -arabiensis <- read_csv(system.file("extdata/arabiensis_wk_coordinates.csv",package="tidysdm")) -``` - -First, let us visualise our presences by plotting on a map. `tidysdm` works -with `sf` objects to represent locations, so we will cast our coordinates -into an `sf` object, and set its projections to standard lonlat (crs = 4326). - -```{r cast_to_sf} -library(sf) -arabiensis <- st_as_sf(arabiensis, coords = c("longitude","latitude")) -st_crs(arabiensis) = 4326 -``` - -It is usually -advisable to plot the locations directly on the raster that will be used to -extract climatic variables, to see how the locations fall within the discretised -space of the raster. For this vignette, we will use WorldClim as our source of -climatic information. We will access the WorldClim data via the library `pastclim`; -even though this library, as the name suggests, is mostly designed to handle palaeoclimatic -reconstructions, it also provides convenient functions to access present day -reconstructions and future projections. `pastclim` has a handy function to get -the land mask for the available datasets, which we can use as background for our -locations. For -plotting, we will take advantage of `tidyterra`, which makes handling of `terra` -rasters with `ggplot` a breeze: - -```{r plot_locations} -library(pastclim) -land_mask <- get_land_mask(time_ce=1985, dataset="WorldClim_2.1_10m") -library(tidyterra) -ggplot() + - geom_spatraster(data=land_mask, aes(fill=land_mask_1985))+ - geom_sf(data = arabiensis) -``` - -As all our data are in Sub-Saharan Africa, it makes sense to cut down our raster -just to that region. We will exclude remote oceanic islands, for which climate reconstructions are often problematic): -```{r} -# SubSaharan Africa -sub_s_africa <- terra::vect("POLYGON((-19.36 22.12,38.17 22.1,38.96 19.53,40.76 - 16.98,43.71 12.12,52.36 13.59,54.3 7.03,54.65 -24.68, - 30.39 -34.59,15.28 -36.31,-19.18 13.59,-19.36 22.12))") -crs(sub_s_africa)<-"lonlat" -# crop the extent -land_mask <- crop(land_mask, sub_s_africa) -# and mask to the polygon -land_mask <- mask(land_mask, sub_s_africa) -ggplot() + - geom_spatraster(data=land_mask, aes(fill=land_mask_1985))+ - geom_sf(data = arabiensis) - -``` - -Now thin the observations to have a one per cell in the raster (it would be better -if we had an equal area projection...), and simultaneously remove locations outside the -desired area (e.g. remote oceanic islands): -```{r thin_by_cell} -set.seed(123) -arabiensis<-thin_by_cell(arabiensis, raster = land_mask) -nrow(arabiensis) -``` - -Now thin further to remove points that are closer than 70km. However, note that -the standard map units for a 'lonlat' projection are meters. 'tidysdm' provides -a convening conversion function to avoid having to write lots of zeroes): -```{r thin_by_dist} -set.seed(123) -arabiensis<-thin_by_dist(arabiensis, dist_min = km2m(70)) -nrow(arabiensis) -``` - -Let's see what we have left of our points: -```{r} -ggplot() + - geom_spatraster(data=land_mask, aes(fill=land_mask_1985))+ - geom_sf(data = arabiensis) -``` - -Now sample pseudoabsences (we will constrain them to be at least 70km away -from any presences), selecting as 3 times as many points as presences -```{r} -set.seed(123) -arabiensis <- sample_pseudoabs(arabiensis, - n= 3 * nrow(arabiensis), - raster=land_mask, - method=c("dist_min", km2m(70))) -``` - -Let's see our presences and absences: -```{r} -ggplot() + - geom_spatraster(data=land_mask, aes(fill=land_mask_1985))+ - geom_sf(data = arabiensis, aes(col = class)) -``` - -We now need to extract climatic variables for this species. We can use -`pastclim` to check what variables are available for the WorldClim dataset: - -```{r load_climate} -climate_vars <- get_vars_for_dataset("WorldClim_2.1_10m") -climate_vars -``` - -We first download them: -```{r eval=FALSE} -download_dataset("WorldClim_2.1_10m") -``` - -And then create a `terra` SpatRaster object. The dataset covers teh period 1970-2000, -so `pastclim` dates it as 1985 (the midpoint). We can directly crop to Sub-Saharan -Africa: -```{r} -climate_present<-pastclim::region_slice(time_ce = 1985, - bio_variables = climate_vars, - data="WorldClim_2.1_10m", - crop=sub_s_africa) -``` - -We start by selecting variables for which presences are markedly different from -the underlying background. First, let's extact climate for all presences and -pseudoabsences -```{r} -arabiensis <- arabiensis %>% - bind_cols(terra::extract(climate_present, arabiensis, ID=FALSE)) -``` - -We can use violin plots to contrast the values for presences and pseudoabsences: - -```{r fig.height=11, fig.width=8} -arabiensis %>% plot_pres_vs_bg(class) - -``` - -We want to choose variables for which presences use a values different from the bakground (pseudoabsences). -We can qualitatively look at the plots, or use a quantitative approach that ranks them based on the -overlap of the respective density plots: -```{r} -arabiensis %>% dist_pres_vs_bg(class) -``` - -We could select variables that have at least 20% of non-overlapping distribution -between presences and pseuodabsences: - -```{r} -vars_to_keep <- arabiensis %>% dist_pres_vs_bg(class) -vars_to_keep <-names(vars_to_keep[vars_to_keep>0.20]) -arabiensis <-arabiensis %>% select(all_of(c(vars_to_keep, "class"))) -``` - -Environmental variables are often highly correlated, and collinearity is an issue -for several types of models. Subset to variables with less than 0.7 correlation - -```{r choose_var_cor} -climate_present<-climate_present[[vars_to_keep]] -vars_uncor <- filter_high_cor(climate_present, cutoff = 0.7) -vars_uncor -``` - -Subset the dataframe and raster to only include these variables: - -```{r} -arabiensis <-arabiensis %>% select(all_of(c(vars_uncor, "class"))) -climate_present<-climate_present[[vars_uncor]] -``` - - -# Fit the model by crossvalidation - -Next, we need to set up a `recipe` to define how to handle our dataset. We don't -want to do anything to our data in terms of transformations, so we just -need to define the formula (*class* is the outcome, -all other variables are predictors; note that, for `sf` objects, `geometry` is -automatically ignored as a predictor): -```{r recipe} -arabiensis_rec <- recipe(arabiensis, formula=class~.) -arabiensis_rec -``` - -We now build a `workflow_set` of different models, defining which -hyperparameters we want to tune. We will use *glm*, *gam*, *random forest*, -*boosted_trees* and *maxent* as -our models. The latter three have tunable hyperparameters. For the most -commonly used models, `tidysdm` automatically chooses the most important -parameters, but it is possible to fully customise model specifications. - -```{r workflow_set} -arabiensis_models <- - # create the workflow_set - workflow_set( - preproc = list(default = arabiensis_rec), - models = list( - # the standard glm specs - glm = sdm_spec_glm(), - # the standard sdm specs - gam = sdm_spec_gam(), - # rf specs with tuning - rf = sdm_spec_rf(), - # boosted tree model (gbm) specs with tuning - gbm = sdm_spec_boost_tree(), - # maxent specs with tuning - maxent =sdm_spec_maxent() - ), - # make all combinations of preproc and models, - cross = TRUE - ) %>% - # set formula for gams - update_workflow_model("default_gam", - spec = sdm_spec_gam(), - formula = gam_formula(arabiensis_rec)) %>% - # tweak controls to store information needed later to create the ensemble - option_add(control = control_ensemble_grid()) -``` - -Note that *gams* are unusual, as need to specify a formula to define to which -variables we will fit smooths. By default, `gam_formula()` fits a smooth to every -continuous predictor, but a custom formula can be provided instead. - -We now want to set up a spatial block cross-validation scheme to tune and assess -our models. We will do an 80:20 split, i.e. create 5 folds. - -```{r training_cv} -library(tidysdm) -set.seed(1005) -arabiensis_cv <- spatial_block_cv(arabiensis, v = 5) -autoplot(arabiensis_cv) -``` - -We can now use the block CV folds to -tune and assess the models (to keep computations fast, we will only explore 3 -combination of hyperparameters per model; that far too little in real life!): -```{r tune_grid} -set.seed(123) -arabiensis_models <- - arabiensis_models %>% - workflow_map("tune_grid", resamples = arabiensis_cv, grid = 3, - metrics = sdm_metric_set(), verbose = TRUE) -``` - -Note that `workflow_set` correctly detects that we have no tuning parameters for -*glm* and *gam*. We can have a look at the performance of our models with: - -```{r} -autoplot(arabiensis_models) -``` - -Now let's create an ensemble, selecting the best set of parameters for each model -(this is really only relevant for the random forest, as there were not hype-parameters -to tune for the glm and gam). We will use the Boyce continuous index as our metric -to choose the best random forest and boosted tree. When adding members to an ensemble, they are -automatically fitted to the full training dataset, and so ready to make predictions. - -```{r} -arabiensis_ensemble <- simple_ensemble() %>% - add_member(arabiensis_models, metric="boyce_cont") -arabiensis_ensemble -``` - -And visualise it -```{r} -autoplot(arabiensis_ensemble) -``` - -# Projecting to the present -We can now make predictions with this ensemble (using the default option of taking -the mean of the predictions from each model). - -```{r plot_present} -prediction_present <- predict_raster(arabiensis_ensemble, climate_present) -ggplot() + - geom_spatraster(data=prediction_present, aes(fill=mean))+ - scale_fill_terrain_c() + - # plot presences used in the model - geom_sf(data = arabiensis %>% filter(class=="presence")) -``` - -We can subset the ensemble to only use the best models, based on the Boyce continuous index, -by setting a minimum threshold of 0.7 for that metric. We will also take the -median of the available model predictions (instead of the mean, which is the default). -The plot does not change much (the models are -quite consistent). - -```{r} -prediction_present_boyce <- predict_raster(arabiensis_ensemble, climate_present, - metric_thresh = c("boyce_cont", 0.7), - fun="median") -ggplot() + - geom_spatraster(data=prediction_present_boyce, aes(fill=median))+ - scale_fill_terrain_c() + - geom_sf(data = arabiensis %>% filter(class=="presence")) -``` - -Sometimes, it is desirable to have binary predictions (presence vs absence), rather -than the probability of occurrence. To do so, we first need to calibrate the threshold -used to convert probabilities into classes (in this case, we optimise the TSS): -```{r} -arabiensis_ensemble<-calib_class_thresh(arabiensis_ensemble, - class_thresh = "tss_max") -``` - -And now we can predict for the whole continent: -```{r} -prediction_present_binary <- predict_raster(arabiensis_ensemble, - climate_present, - type="class", - class_thresh = c("tss_max")) -ggplot() + - geom_spatraster(data=prediction_present_binary, aes(fill=binary_mean))+ - geom_sf(data = arabiensis %>% filter(class=="presence")) -``` - - -# Projecting to the future - -WorldClim has a wide selection of projections for the future based on different -models and Shared Socio-economic Pathways (SSP). Type `help("WorldClim_2.1")` -for a full list. We will use predictions based on "HadGEM3-GC31-LL" model for SSP 245 (intermediate green -house gas emissions) at the same resolution as the present day data (10 arc-minutes). We first download the data: -```{r eval=FALSE} -download_dataset("WorldClim_2.1_HadGEM3-GC31-LL_ssp245_10m") -``` -Let's see what times are available: -```{r} -get_time_ce_steps("WorldClim_2.1_HadGEM3-GC31-LL_ssp245_10m") -``` - -We will predict for 2090, the further prediction in the future that is available. - -Let's now check the available variables: -```{r} -get_vars_for_dataset("WorldClim_2.1_HadGEM3-GC31-LL_ssp245_10m") -``` - -Note that future predictions do not include *altitude* (as that does not change with time), so if we needed it, we would have to copy it -over from the present. However, it is not in our set of uncorrelated variables that -we used earlier, so we don't need to worry about it. -```{r} -climate_future<-pastclim::region_slice(time_ce = 2030, - bio_variables = vars_to_keep, - data="WorldClim_2.1_HadGEM3-GC31-LL_ssp245_10m", - crop=sub_s_africa) -``` - -And predict using the ensemble: -```{r plot_future} -prediction_future <- predict_raster(arabiensis_ensemble, climate_future) -ggplot() + - geom_spatraster(data=prediction_future, aes(fill=mean))+ - scale_fill_terrain_c() -``` - -# Repeated ensembles - -The steps of thinning and sampling pseudo-absences can have a bit impact on the -performance of SDMs. As these steps are stochastic, it is good practice to -explore their effect by repeating them, and then creating ensembles of models -over these repeats. In `tidysdm`, it is possible to create `repeat_ensembles`. -We start by creating a list of `simple_ensembles`, by looping through the -SDM pipeline. We will just use two fast models to speed up the process. - - -```{r} -# emtpy object to store the simple ensembles that we will create -ensemble_list <- list() -for (i_repeat in 1:3){ - # thin the data - arabiensis_rep<-thin_by_cell(arabiensis, raster = climate_present) - arabiensis_rep<-thin_by_dist(arabiensis_rep, dist_min = 70000) - # sample pseudoabsences - arabiensis_rep <- sample_pseudoabs(arabiensis_rep, - n=nrow(arabiensis_rep), - raster=climate_present, - method=c("dist_min", 70000)) - # get climate - arabiensis_rep <- arabiensis_rep %>% - bind_cols(extract(climate_present, arabiensis_rep, ID=FALSE)) - # create folds - arabiensis_rep_cv <- spatial_block_cv(arabiensis_rep, v = 5) - # create a recipe - arabiensis_rep_rec <- recipe(arabiensis_rep, formula=class~.) - # create a workflow_set - arabiensis_rep_models <- - # create the workflow_set - workflow_set( - preproc = list(default = arabiensis_rep_rec), - models = list( - # the standard glm specs - glm = sdm_spec_glm(), - # the standard sdm specs - gam = sdm_spec_gam() - ), - # make all combinations of preproc and models, - cross = TRUE - ) %>% - # set formula for gams - update_workflow_model("default_gam", - spec = sdm_spec_gam(), - formula = gam_formula(arabiensis_rep_rec)) %>% - # tweak controls to store information needed later to create the ensemble - option_add(control = control_ensemble_grid()) - -# train the model - arabiensis_rep_models <- - arabiensis_rep_models %>% - workflow_map("tune_grid", resamples = arabiensis_rep_cv, grid = 5, - metrics = sdm_metric_set(), verbose = TRUE) - # make an simple ensemble and add it to the list -ensemble_list[[i_repeat]] <- simple_ensemble() %>% - add_member(arabiensis_rep_models, metric="boyce_cont") -} -``` - -Now we can create a `repeat_ensemble` from the list -```{r} -arabiensis_rep_ens <- repeat_ensemble() %>% add_repeat(ensemble_list) -arabiensis_rep_ens -``` - -We can then predict in the usual way (we will take the mean and median of all models): -```{r} -prediction_repeat_ensemble <- predict_raster(arabiensis_ensemble, climate_present, - fun=c("mean","median")) -ggplot() + - geom_spatraster(data=prediction_repeat_ensemble, aes(fill=median))+ - scale_fill_terrain_c() - -``` - diff --git a/inst/WORDLIST b/inst/WORDLIST index 4ccf07c6..3f739322 100644 --- a/inst/WORDLIST +++ b/inst/WORDLIST @@ -1,5 +1,6 @@ BCI CMD +DALEX Ecol GAMs GBIF @@ -13,6 +14,7 @@ Lacerta MaxEnt Maxent Maxnet +POSIXlt Prepping Randin SDM @@ -22,6 +24,7 @@ Schmiegelow SpatRaster StackOverflow TSS +Tidymodels Trang WGS WorldClim @@ -32,10 +35,10 @@ cellsize center codecov color +colorized colors com coords -crossvalidating crossvalidation crs cutoff @@ -47,7 +50,6 @@ fn fp gam gams -gbm ggplot ggplots glm @@ -55,13 +57,14 @@ glmnet iter jan jlx +kap +lacerta lh lonlat lqpht lubridate magrittr manpage -mars maxent maxnet mtry @@ -72,7 +75,6 @@ palaeo palaeoclimate palaeoclimatic palaeodata -pastclim pred prepping prob @@ -85,8 +87,10 @@ rsplit schreiberi sdm spatialsample +stackexchange stackoverflow stat +svm thres tibble tibbles diff --git a/inst/notes/ensemble_draft.Rmd b/inst/notes/ensemble_draft.Rmd index 9e267808..88523621 100644 --- a/inst/notes/ensemble_draft.Rmd +++ b/inst/notes/ensemble_draft.Rmd @@ -17,20 +17,19 @@ can get those with: ```{r} rank_results(leopards_models, rank_metric = "roc_auc", select_best = TRUE) - ``` And plot them with: ```{r} -autoplot(leopards_models, select_best=TRUE) +autoplot(leopards_models, select_best = TRUE) ``` We are now ready to finalize the workflow_set, choosing the metric that we want to use: ```{r} leopards_ensemble <- finalize_worflow_set(leopards_models, metric = "roc_auc") -leopards_ensemble <- fit(leopards_ensemble, data=leopards_training) +leopards_ensemble <- fit(leopards_ensemble, data = leopards_training) -leopards_testing_preds <-predict(leopards_ensemble, new_data = leopards_testing, type="prob") +leopards_testing_preds <- predict(leopards_ensemble, new_data = leopards_testing, type = "prob") # we want to add a last_fit option for ensemble objects ``` diff --git a/inst/notes/reprex.R b/inst/notes/reprex.R index 19e06be8..b73c8780 100644 --- a/inst/notes/reprex.R +++ b/inst/notes/reprex.R @@ -1,12 +1,12 @@ library(tidymodels) test_dataset <- bivariate_train test_dataset$Class <- as.character(test_dataset$Class) -test_dataset$another_factor <- sample(c("a","b"),nrow(test_dataset),replace=TRUE) -test_rec <- recipe(test_dataset, formula=Class~.) %>% +test_dataset$another_factor <- sample(c("a", "b"), nrow(test_dataset), replace = TRUE) +test_rec <- recipe(test_dataset, formula = Class ~ .) %>% step_string2factor(Class) %>% step_string2factor(another_factor) %>% step_corr(all_numeric_predictors(), threshold = 0.65, method = "spearman") -test_glm_spec <- logistic_reg() %>% +test_glm_spec <- logistic_reg() %>% set_engine(engine = "glm") %>% set_mode("classification") @@ -17,23 +17,22 @@ glm_wflow <- glm_res <- glm_wflow %>% - fit(data=test_dataset) + fit(data = test_dataset) -predict(glm_res, new_data=test_dataset, type="class") +predict(glm_res, new_data = test_dataset, type = "class") head(test_dataset) ################################################################################ -leopards_rec <- recipe(foo, formula=class~.) %>% +leopards_rec <- recipe(foo, formula = class ~ .) %>% update_role(geometry, new_role = "geometry") - step_string2factor(class) %>% +step_string2factor(class) %>% step_corr(all_predictors(), threshold = 0.65, method = "spearman") leopards_rec <- recipe(leopards_training) %>% - update_role(geometry, new_role = "geometry") - step_string2factor(class) %>% - step_corr(all_predictors(), threshold = 0.65, method = "spearman") + update_role(geometry, new_role = "geometry") +step_string2factor(class) %>% + step_corr(all_predictors(), threshold = 0.65, method = "spearman") -foo<-as_tibble(boston_canopy) +foo <- as_tibble(boston_canopy) spatial_block_cv(foo, v = 3) - diff --git a/man/add_member.Rd b/man/add_member.Rd index d2a33371..0595d4e0 100644 --- a/man/add_member.Rd +++ b/man/add_member.Rd @@ -33,5 +33,6 @@ a \link{simple_ensemble} with additional member(s) \description{ This function adds member(s) to a \code{\link[=simple_ensemble]{simple_ensemble()}} object, taking the best member from each workflow provided. It is possible to pass individual -\code{tune_results} objects from a tuned \code{workflow}, or a \code{\link[workflowsets:workflow_set]{workflowsets::workflow_set()}}. +\code{tune_results} objects from a tuned \code{workflow}, or a +\code{\link[workflowsets:workflow_set]{workflowsets::workflow_set()}}. } diff --git a/man/autoplot.simple_ensemble.Rd b/man/autoplot.simple_ensemble.Rd index 03e44eba..c5254276 100644 --- a/man/autoplot.simple_ensemble.Rd +++ b/man/autoplot.simple_ensemble.Rd @@ -31,13 +31,14 @@ exists).} A ggplot object. } \description{ -This \code{autoplot()} method plots performance metrics that have been ranked using -a metric. +This \code{autoplot()} method plots performance metrics that have been +ranked using a metric. } \details{ This function is intended to produce a default plot to visualize helpful information across all possible applications of a \code{\link{simple_ensemble}}. More -sophisticated plots can be produced using standard \code{ggplot2} code for plotting. +sophisticated plots can be produced using standard \code{ggplot2} code for +plotting. The x-axis is the workflow rank in the set (a value of one being the best) versus the performance metric(s) on the y-axis. With multiple metrics, there @@ -49,9 +50,9 @@ If multiple resamples are used, confidence bounds are shown for each result (95\% confidence, by default). } \examples{ - # we use the two_class_example from `workflowsets` - two_class_ens <- simple_ensemble() \%>\% - add_member(two_class_res, metric = "roc_auc") - autoplot(two_class_ens) +# we use the two_class_example from `workflowsets` +two_class_ens <- simple_ensemble() \%>\% + add_member(two_class_res, metric = "roc_auc") +autoplot(two_class_ens) } diff --git a/man/autoplot.spatial_initial_split.Rd b/man/autoplot.spatial_initial_split.Rd index 7e3ad1f5..b663ed65 100644 --- a/man/autoplot.spatial_initial_split.Rd +++ b/man/autoplot.spatial_initial_split.Rd @@ -24,16 +24,19 @@ A ggplot object with each fold assigned a color, made using \code{\link[ggplot2:ggsf]{ggplot2::geom_sf()}}. } \description{ -This method provides a good visualization method for a spatial initial rsplit. +This method provides a good visualization method for a spatial +initial rsplit. } \details{ This plot method is a wrapper around the standard \code{spatial_rsplit} method, -but it re-labels the folds as \emph{Testing} and \emph{Training} following the convention -for a standard \code{initial_split} object +but it re-labels the folds as \emph{Testing} and \emph{Training} following the +convention for a standard \code{initial_split} object } \examples{ set.seed(123) -block_initial <- spatial_initial_split(boston_canopy, prop = 1/5, spatial_block_cv) +block_initial <- spatial_initial_split(boston_canopy, + prop = 1 / 5, spatial_block_cv +) autoplot(block_initial) } diff --git a/man/blockcv2rsample.Rd b/man/blockcv2rsample.Rd index d11ae2bb..9285c477 100644 --- a/man/blockcv2rsample.Rd +++ b/man/blockcv2rsample.Rd @@ -19,15 +19,19 @@ This function creates objects created with \code{blockCV} to \code{rsample} obje that can be used by \code{tidysdm} } \examples{ +\donttest{ library(blockCV) points <- read.csv(system.file("extdata/", "species.csv", package = "blockCV")) pa_data <- sf::st_as_sf(points, coords = c("x", "y"), crs = 7845) -sb1 <- cv_spatial(x = pa_data, - column = "occ", # the response column (binary or multi-class) - k = 5, # number of folds - size = 350000, # size of the blocks in metres - selection = "random", # random blocks-to-fold - iteration = 50) # find evenly dispersed folds +sb1 <- cv_spatial( + x = pa_data, + column = "occ", # the response column (binary or multi-class) + k = 5, # number of folds + size = 350000, # size of the blocks in metres + selection = "random", # random blocks-to-fold + iteration = 10 +) # find evenly dispersed folds sb1_rsample <- blockcv2rsample(sb1, pa_data) class(sb1_rsample) } +} diff --git a/man/boyce_cont.Rd b/man/boyce_cont.Rd index 29744b16..e3c5ccfa 100644 --- a/man/boyce_cont.Rd +++ b/man/boyce_cont.Rd @@ -38,7 +38,7 @@ results should be in the columns of the table.} \item{...}{A set of unquoted column names or one or more dplyr selector functions to choose which variables contain the class probabilities. If truth is binary, only 1 column should be selected, and it should correspond to the value of event_level. Otherwise, there should be as many columns as factor levels of truth and the ordering of the columns should be the same as the factor levels of truth.} -\item{truth}{The column identifier for the true class results (that is a factor). This should be an unquoted column name although this argument is passed by expression and supports quasiquotation (you can unquote column names). For ⁠_vec()⁠ functions, a factor vector.} +\item{truth}{The column identifier for the true class results (that is a factor). This should be an unquoted column name although this argument is passed by expression and supports quasiquotation (you can unquote column names). For _vec() functions, a factor vector.} \item{estimator}{One of "binary", "hand_till", "macro", or "macro_weighted" to specify the type of averaging to be done. "binary" is only relevant for the two class case. The others are general methods for calculating multiclass metrics. The default will automatically choose "binary" if truth is binary, "hand_till" if truth has >2 levels and case_weights isn't specified, or "macro" if truth has >2 levels and case_weights is specified (in which case "hand_till" isn't well-defined).} @@ -46,7 +46,7 @@ results should be in the columns of the table.} \item{event_level}{A single string. Either "first" or "second" to specify which level of truth to consider as the "event". This argument is only applicable when estimator = "binary". The default uses an internal helper that generally defaults to "first"} -\item{case_weights}{The optional column identifier for case weights. This should be an unquoted column name that evaluates to a numeric column in data. For ⁠_vec()⁠ functions, a numeric vector.} +\item{case_weights}{The optional column identifier for case weights. This should be an unquoted column name that evaluates to a numeric column in data. For _vec() functions, a numeric vector.} \item{estimate}{If truth is binary, a numeric vector of class probabilities corresponding to the "relevant" class. Otherwise, a matrix with as many columns as factor levels of truth. It is assumed that these are in the same order as the levels of truth.} } diff --git a/man/calib_class_thresh.Rd b/man/calib_class_thresh.Rd index fed7035c..8a3a9f60 100644 --- a/man/calib_class_thresh.Rd +++ b/man/calib_class_thresh.Rd @@ -28,8 +28,9 @@ Predict for a new dataset by using a simple ensemble. Predictions from individua models are combined according to \code{fun} } \examples{ -test_ens <- simple_ensemble() \%>\% add_member(two_class_res[1:3, ], metric="roc_auc") -test_ens <- calib_class_thresh(test_ens, class_thresh="tss_max") -test_ens <- calib_class_thresh(test_ens, class_thresh="kap_max") -test_ens <- calib_class_thresh(test_ens, class_thresh=c("sens",0.9)) +test_ens <- simple_ensemble() \%>\% + add_member(two_class_res[1:3, ], metric = "roc_auc") +test_ens <- calib_class_thresh(test_ens, class_thresh = "tss_max") +test_ens <- calib_class_thresh(test_ens, class_thresh = "kap_max") +test_ens <- calib_class_thresh(test_ens, class_thresh = c("sens", 0.9)) } diff --git a/man/check_splits_balance.Rd b/man/check_splits_balance.Rd index 23df736e..d5036a27 100644 --- a/man/check_splits_balance.Rd +++ b/man/check_splits_balance.Rd @@ -20,7 +20,8 @@ Check the balance of presences vs pseudoabsences among splits } \examples{ lacerta_thin <- readRDS(system.file("extdata/lacerta_climate_sf.RDS", - package="tidysdm")) + package = "tidysdm" +)) lacerta_cv <- spatial_block_cv(lacerta_thin, v = 5) check_splits_balance(lacerta_cv, class) diff --git a/man/dist_pres_vs_bg.Rd b/man/dist_pres_vs_bg.Rd index 9e50c604..40ac24ae 100644 --- a/man/dist_pres_vs_bg.Rd +++ b/man/dist_pres_vs_bg.Rd @@ -25,10 +25,15 @@ of the available background. } \examples{ # This should be updated to use a dataset from tidysdm -data("bradypus", package="maxnet") -bradypus_tb <- tibble::as_tibble(bradypus) \%>\% dplyr::mutate(presence = relevel(factor( - dplyr::case_match (presence, 1~"presence",0 ~"absence")), - ref="presence")) \%>\% select(-ecoreg) +data("bradypus", package = "maxnet") +bradypus_tb <- tibble::as_tibble(bradypus) \%>\% + dplyr::mutate(presence = relevel( + factor( + dplyr::case_match(presence, 1 ~ "presence", 0 ~ "absence") + ), + ref = "presence" + )) \%>\% + select(-ecoreg) bradypus_tb \%>\% dist_pres_vs_bg(presence) diff --git a/man/explain_tidysdm.Rd b/man/explain_tidysdm.Rd index 612beebd..91198a01 100644 --- a/man/explain_tidysdm.Rd +++ b/man/explain_tidysdm.Rd @@ -103,7 +103,7 @@ This will happen also if \code{verbose} is TRUE. Set both \code{verbose} and \co \item{type}{type of a model, either \code{classification} or \code{regression}. If not specified then \code{type} will be extracted from \code{model_info}.} -\item{by_workflow}{boolean determing whether a list of explainer, one per model, +\item{by_workflow}{boolean determining whether a list of explainer, one per model, should be returned instead of a single explainer for the ensemble} } \value{ @@ -115,10 +115,12 @@ methods. This function creates a DALEX explainer (see \code{\link[DALEX:explain] by multiple function to create explanations of the model. } \examples{ +\donttest{ # using the whole ensemble lacerta_explainer <- explain_tidysdm(tidysdm::lacerta_ensemble) # by workflow -explainer_list <- explain_tidysdm(tidysdm::lacerta_ensemble, - by_workflow = TRUE) - +explainer_list <- explain_tidysdm(tidysdm::lacerta_ensemble, + by_workflow = TRUE +) +} } diff --git a/man/filter_high_cor.Rd b/man/filter_high_cor.Rd index 4cb9db89..9c4a6fa3 100644 --- a/man/filter_high_cor.Rd +++ b/man/filter_high_cor.Rd @@ -34,12 +34,12 @@ the column index \code{FALSE})?} \item{to_keep}{A vector of variable names that we want to force in the set (note that the function will return an error if the correlation among any of -those varialbes is higher thna the cutoff).} +those variables is higher than the cutoff).} } \value{ A vector of names of columns that are below the correlation threshold -(when \code{names = TRUE}), otherwise a vector of indices. Note that the indeces -are only for numeric variables (i.e. if factors are present, the indeces do +(when \code{names = TRUE}), otherwise a vector of indices. Note that the indices +are only for numeric variables (i.e. if factors are present, the indices do not take them into account). } \description{ diff --git a/man/geom_split_violin.Rd b/man/geom_split_violin.Rd index 201490d8..7f8f870d 100644 --- a/man/geom_split_violin.Rd +++ b/man/geom_split_violin.Rd @@ -94,14 +94,19 @@ Credit goes to @jan-jlx for providing a complete implementation on StackOverflow Trang Q. Nguyen for adding the nudge parameter. } \examples{ -data("bradypus", package="maxnet") -bradypus_tb <- tibble::as_tibble(bradypus) \%>\% dplyr::mutate(presence = relevel(factor( -dplyr::case_match (presence, 1~"presence",0 ~"absence")), -ref="presence")) - -ggplot(bradypus_tb, aes(x = "", - y= cld6190_ann, - fill = presence)) + - geom_split_violin(nudge=0.01) +data("bradypus", package = "maxnet") +bradypus_tb <- tibble::as_tibble(bradypus) \%>\% dplyr::mutate(presence = relevel( + factor( + dplyr::case_match(presence, 1 ~ "presence", 0 ~ "absence") + ), + ref = "presence" +)) + +ggplot(bradypus_tb, aes( + x = "", + y = cld6190_ann, + fill = presence +)) + + geom_split_violin(nudge = 0.01) } diff --git a/man/kap_max.Rd b/man/kap_max.Rd index 013621b6..a6ea50f9 100644 --- a/man/kap_max.Rd +++ b/man/kap_max.Rd @@ -38,7 +38,7 @@ results should be in the columns of the table.} \item{...}{A set of unquoted column names or one or more dplyr selector functions to choose which variables contain the class probabilities. If truth is binary, only 1 column should be selected, and it should correspond to the value of event_level. Otherwise, there should be as many columns as factor levels of truth and the ordering of the columns should be the same as the factor levels of truth.} -\item{truth}{The column identifier for the true class results (that is a factor). This should be an unquoted column name although this argument is passed by expression and supports quasiquotation (you can unquote column names). For ⁠_vec()⁠ functions, a factor vector.} +\item{truth}{The column identifier for the true class results (that is a factor). This should be an unquoted column name although this argument is passed by expression and supports quasiquotation (you can unquote column names). For _vec() functions, a factor vector.} \item{estimator}{One of "binary", "hand_till", "macro", or "macro_weighted" to specify the type of averaging to be done. "binary" is only relevant for the two class case. The others are general methods for calculating multiclass metrics. The default will automatically choose "binary" if truth is binary, "hand_till" if truth has >2 levels and case_weights isn't specified, or "macro" if truth has >2 levels and case_weights is specified (in which case "hand_till" isn't well-defined).} @@ -46,7 +46,7 @@ results should be in the columns of the table.} \item{event_level}{A single string. Either "first" or "second" to specify which level of truth to consider as the "event". This argument is only applicable when estimator = "binary". The default uses an internal helper that generally defaults to "first"} -\item{case_weights}{The optional column identifier for case weights. This should be an unquoted column name that evaluates to a numeric column in data. For ⁠_vec()⁠ functions, a numeric vector.} +\item{case_weights}{The optional column identifier for case weights. This should be an unquoted column name that evaluates to a numeric column in data. For _vec() functions, a numeric vector.} \item{estimate}{If truth is binary, a numeric vector of class probabilities corresponding to the "relevant" class. Otherwise, a matrix with as many columns as factor levels of truth. It is assumed that these are in the same order as the levels of truth.} } diff --git a/man/maxent.Rd b/man/maxent.Rd index 8ed5129a..b548784e 100644 --- a/man/maxent.Rd +++ b/man/maxent.Rd @@ -33,26 +33,34 @@ A good guide to how options of a Maxent model work can be found in https://onlinelibrary.wiley.com/doi/full/10.1111/j.1600-0587.2013.07872.x } \examples{ +\donttest{ # format the data -data("bradypus", package="maxnet") -bradypus_tb <- tibble::as_tibble(bradypus) \%>\% dplyr::mutate(presence = relevel(factor( - dplyr::case_match (presence, 1~"presence",0 ~"absence")), - ref="presence")) \%>\% select(-ecoreg) +data("bradypus", package = "maxnet") +bradypus_tb <- tibble::as_tibble(bradypus) \%>\% + dplyr::mutate(presence = relevel( + factor( + dplyr::case_match(presence, 1 ~ "presence", 0 ~ "absence") + ), + ref = "presence" + )) \%>\% + select(-ecoreg) # fit the model, and make some predictions maxent_spec <- maxent(feature_classes = "lq") maxent_fitted <- maxent_spec \%>\% fit(presence ~ ., data = bradypus_tb) -pred_prob <-predict(maxent_fitted,new_data = bradypus[,-1], type="prob") -pred_class <- predict(maxent_fitted,new_data = bradypus[,-1], type="class") +pred_prob <- predict(maxent_fitted, new_data = bradypus[, -1], type = "prob") +pred_class <- predict(maxent_fitted, new_data = bradypus[, -1], type = "class") # Now with tuning -maxent_spec <- maxent(regularization_multiplier = tune(), - feature_classes = tune()) +maxent_spec <- maxent( + regularization_multiplier = tune(), + feature_classes = tune() +) set.seed(452) -cv <- vfold_cv(bradypus_tb, v=2) +cv <- vfold_cv(bradypus_tb, v = 2) maxent_tune_res <- maxent_spec \%>\% tune_grid(presence ~ ., cv, grid = 3) show_best(maxent_tune_res, metric = "roc_auc") - +} } diff --git a/man/maxnet_fit.Rd b/man/maxnet_fit.Rd index a5b70798..c0315e51 100644 --- a/man/maxnet_fit.Rd +++ b/man/maxnet_fit.Rd @@ -10,7 +10,7 @@ maxnet_fit( regmult = 1, classes = "default", regfun = maxnet::maxnet.default.regularization, - addsamplestobackground = T, + addsamplestobackground = TRUE, ... ) } @@ -36,7 +36,8 @@ Maxnet returns an object of class \code{maxnet}, which is a list consisting of a glmnet model with the following elements added: \describe{ \item{betas}{ nonzero coefficients of the fitted model } -\item{alpha}{ constant offset making the exponential model sum to one over the background data } +\item{alpha}{ constant offset making the exponential model sum to one +over the background data } \item{entropy}{ entropy of the exponential model } \item{penalty.factor}{ the regularization constants used for each feature } \item{featuremins}{ minimum of each feature, to be used for clamping } @@ -55,19 +56,24 @@ as well exposing parameters for normalisation in a manner compatible with } \details{ The response needs to be a factor with the class representing presences -as the reference level of the factor (as expected by other classification models). +as the reference level of the factor (as expected by other +classification models). A good guide to how options of a Maxent model work can be found in https://onlinelibrary.wiley.com/doi/full/10.1111/j.1600-0587.2013.07872.x } \examples{ -\dontrun{ - # we repeat the example in the `maxnet` package - data("bradypus", package="maxnet") - bradypus_tb <- tibble::as_tibble(bradypus) \%>\% dplyr::mutate(presence = relevel(factor( - dplyr::case_match (presence, 1~"presence",0 ~"absence")), - ref="presence")) - mod3 <- maxnet_fit(presence~.,data=bradypus_tb, classes="lq") - plot(mod, "tmp6190_ann") +\donttest{ +# we repeat the example in the `maxnet` package +data("bradypus", package = "maxnet") +bradypus_tb <- tibble::as_tibble(bradypus) \%>\% + dplyr::mutate(presence = relevel( + factor( + dplyr::case_match(presence, 1 ~ "presence", 0 ~ "absence") + ), + ref = "presence" + )) +mod <- maxnet_fit(presence ~ ., data = bradypus_tb, classes = "lq") +plot(mod, "tmp6190_ann") } } \keyword{internal} diff --git a/man/maxnet_predict.Rd b/man/maxnet_predict.Rd index a1625f51..2b8fd375 100644 --- a/man/maxnet_predict.Rd +++ b/man/maxnet_predict.Rd @@ -21,7 +21,8 @@ maxnet_predict( \item{maxnet_type}{the transformation used for the prediction} -\item{clamp}{logical, defining whether clamping to observed ranges should be used} +\item{clamp}{logical, defining whether clamping to observed ranges should +be used} } \value{ a tibble of predictions diff --git a/man/optim_thresh.Rd b/man/optim_thresh.Rd index 449f6bb4..dd09a0f8 100644 --- a/man/optim_thresh.Rd +++ b/man/optim_thresh.Rd @@ -10,7 +10,7 @@ optim_thresh(truth, estimate, metric, event_level = "first") \item{truth}{The column identifier for the true class results (that is a factor). This should be an unquoted column name although this argument is passed by expression and supports quasiquotation (you can unquote column -names). For ⁠_vec()⁠ functions, a factor vector.} +names). For _vec() functions, a factor vector.} \item{estimate}{the predicted probability for the event} @@ -28,10 +28,10 @@ the probability threshold for the event } \description{ This function returns the threshold to turn probabilities into binary classes -whilst optimising a given metric. Currently available for tss_max and -sensitivity (for which a target sensitivity is required). +whilst optimising a given metric. Currently available for \code{\link{tss_max}}, \code{\link{kap_max}} and +\code{sensitivity} (for which a target sensitivity is required). } \examples{ -optim_thresh(two_class_example$truth,two_class_example$Class1,metric=c("tss_max")) -optim_thresh(two_class_example$truth,two_class_example$Class1,metric=c("sens",0.9)) +optim_thresh(two_class_example$truth, two_class_example$Class1, metric = c("tss_max")) +optim_thresh(two_class_example$truth, two_class_example$Class1, metric = c("sens", 0.9)) } diff --git a/man/plot_pres_vs_bg.Rd b/man/plot_pres_vs_bg.Rd index 3c3b9c0c..38fb2499 100644 --- a/man/plot_pres_vs_bg.Rd +++ b/man/plot_pres_vs_bg.Rd @@ -21,11 +21,17 @@ Create a composite plots contrasting the distribution of multiple variables for presences vs the background. } \examples{ -data("bradypus", package="maxnet") -bradypus_tb <- tibble::as_tibble(bradypus) \%>\% dplyr::mutate(presence = relevel(factor( - dplyr::case_match (presence, 1~"presence",0 ~"absence")), - ref="presence")) \%>\% select(-ecoreg) +\donttest{ +data("bradypus", package = "maxnet") +bradypus_tb <- tibble::as_tibble(bradypus) \%>\% + dplyr::mutate(presence = relevel( + factor( + dplyr::case_match(presence, 1 ~ "presence", 0 ~ "absence") + ), + ref = "presence" + )) \%>\% + select(-ecoreg) bradypus_tb \%>\% plot_pres_vs_bg(presence) - +} } diff --git a/man/prob_metrics.Rd b/man/prob_metrics_sf.Rd similarity index 97% rename from man/prob_metrics.Rd rename to man/prob_metrics_sf.Rd index 6876b308..32455160 100644 --- a/man/prob_metrics.Rd +++ b/man/prob_metrics_sf.Rd @@ -1,7 +1,7 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/prob_metrics.R -\name{prob_metrics} -\alias{prob_metrics} +\name{prob_metrics_sf} +\alias{prob_metrics_sf} \alias{average_precision.sf} \alias{brier_class.sf} \alias{classification_cost.sf} diff --git a/man/recipe.sf.Rd b/man/recipe.sf.Rd index 5b1f0c1b..35beb6e4 100644 --- a/man/recipe.sf.Rd +++ b/man/recipe.sf.Rd @@ -31,7 +31,7 @@ the translation of formulae in \link{recipe}. This method strips the \code{geome column from the \link{data.frame} and replaces it with a simple \code{X} and \code{Y} columns before any further operations, thus allowing the usual processing by \code{\link[=recipe]{recipe()}} to succeed (\code{X} and \code{Y} are give the role -of coords ina spatial recipe). When prepping and baking a \code{spatial_recipe}, +of coords in a spatial recipe). When prepping and baking a \code{spatial_recipe}, if a data.frame or tibble without coordinates is used as \code{training} or \code{new_data}, dummy \code{X} and \code{Y} columns are generated and filled with NAs. diff --git a/man/sample_pseudoabs.Rd b/man/sample_pseudoabs.Rd index 679b0c1e..9935c978 100644 --- a/man/sample_pseudoabs.Rd +++ b/man/sample_pseudoabs.Rd @@ -47,17 +47,17 @@ This function samples pseudo-absence (or background, the naming is a matter of semantics) points from a raster given a set of presences. The locations returned as the center points of the sampled cells, which can not overlap with the presences. The following methods are implemented: -{/itemize: -/item: 'random': pseudo-absences/background randomly sampled from the region covered by the +\itemize{ +\item 'random': pseudo-absences/background randomly sampled from the region covered by the raster (i.e. not NAs). -/item: 'dist_min': pseudo-absences/background randomly sampled from the region excluding a buffer +\item 'dist_min': pseudo-absences/background randomly sampled from the region excluding a buffer of 'dist_min' from presences (distances in 'm' for lonlat rasters, and in map units for projected rasters). -/item: 'dist_max': pseudo-absences/background randomly sampled from the unioned buffers +\item 'dist_max': pseudo-absences/background randomly sampled from the unioned buffers of 'dist_max' from presences (distances in 'm' for lonlat rasters, and in map units for projected rasters). Using the union of buffers means that areas that are in multiple buffers are not oversampled. This is also referred to as "thickening". -/item: 'dist_disc': pseudo-absences/background randomly sampled from the unioned discs around presences +\item 'dist_disc': pseudo-absences/background randomly sampled from the unioned discs around presences with the two values of 'dist_disc' defining the minimum and maximum distance from presences. } diff --git a/man/sample_pseudoabs_time.Rd b/man/sample_pseudoabs_time.Rd index e9ed5e12..b0cf3ac9 100644 --- a/man/sample_pseudoabs_time.Rd +++ b/man/sample_pseudoabs_time.Rd @@ -21,7 +21,7 @@ sample_pseudoabs_time( These can be defined in \code{coords}, unless they have standard names (see details below).} -\item{raster}{the \link[terra:SpatRaster-class]{terra::SpatRaster} from which cells will be sampled} +\item{raster}{the \link[terra:SpatRaster-class]{terra::SpatRaster} or \link[terra:SpatRaster-class]{terra::SpatRasterDataset} from which cells will be sampled} \item{n_per_presence}{number of pseudoabsence/background points to sample for each presence} @@ -54,17 +54,17 @@ This function samples pseudo-absence (or background, the naming is a matter of semantics) points from a raster given a set of presences. The locations returned as the center points of the sampled cells, which can not overlap with the presences. The following methods are implemented: -{/itemize: -/item: 'random': pseudo-absences/background randomly sampled from the region covered by the +\itemize{ +\item 'random': pseudo-absences/background randomly sampled from the region covered by the raster (i.e. not NAs). -/item: 'dist_min': pseudo-absences/background randomly sampled from the region excluding a buffer +\item 'dist_min': pseudo-absences/background randomly sampled from the region excluding a buffer of 'dist_min' from presences (distances in 'm' for lonlat rasters, and in map units for projected rasters). -/item: 'dist_max': pseudo-absences/background randomly sampled from the unioned buffers +\item 'dist_max': pseudo-absences/background randomly sampled from the unioned buffers of 'dist_max' from presences (distances in 'm' for lonlat rasters, and in map units for projected rasters). Using the union of buffers means that areas that are in multiple buffers are not oversampled. This is also referred to as "thickening". -/item: 'dist_disc': pseudo-absences/background randomly sampled from the unioned discs around presences +\item 'dist_disc': pseudo-absences/background randomly sampled from the unioned discs around presences with the two values of 'dist_disc' defining the minimum and maximum distance from presences. } diff --git a/man/sdm_spec_boost_tree.Rd b/man/sdm_spec_boost_tree.Rd index c08eeb4f..f71ba131 100644 --- a/man/sdm_spec_boost_tree.Rd +++ b/man/sdm_spec_boost_tree.Rd @@ -11,15 +11,15 @@ sdm_spec_boost_tree(..., tune = c("sdm", "all", "custom", "none")) customise the model. See the help of that function for details.} \item{tune}{character defining the tuning strategy. Valid strategies are: -{itemize: -/item: "sdm" chooses hyperparameters that are most important to tune for +\itemize{ +\item "sdm" chooses hyperparameters that are most important to tune for an sdm (for \emph{boost_tree}: 'mtry', 'trees', 'tree_depth', 'learn_rate', 'loss_reduction', and 'stop_iter') -/item: "all" tunes all hyperparameters (for \emph{boost_tree}: 'mtry', 'trees', +\item "all" tunes all hyperparameters (for \emph{boost_tree}: 'mtry', 'trees', 'tree_depth', 'learn_rate', 'loss_reduction', 'stop_iter','min_n' and 'sample_size') -/item: "custom" passes the options from '...' -/item: "none" does not tune any hyperparameter +\item "custom" passes the options from '...' +\item "none" does not tune any hyperparameter }} } \value{ diff --git a/man/sdm_spec_maxent.Rd b/man/sdm_spec_maxent.Rd index 8c513eac..8cf38341 100644 --- a/man/sdm_spec_maxent.Rd +++ b/man/sdm_spec_maxent.Rd @@ -11,12 +11,12 @@ sdm_spec_maxent(..., tune = c("sdm", "all", "custom", "none")) customise the model. See the help of that function for details.} \item{tune}{character defining the tuning strategy. Valid strategies are: -{itemize: -/item: "sdm" chooses hyperparameters that are most important to tune for +\itemize{ +\item "sdm" chooses hyperparameters that are most important to tune for an sdm (for \emph{maxent}, 'mtry') -/item: "all" tunes all hyperparameters (for \emph{maxent}, 'mtry', 'trees' and 'min') -/item: "custom" passes the options from '...' -/item: "none" does not tune any hyperparameter +\item "all" tunes all hyperparameters (for \emph{maxent}, 'mtry', 'trees' and 'min') +\item "custom" passes the options from '...' +\item "none" does not tune any hyperparameter }} } \value{ @@ -28,8 +28,8 @@ be used as a classifier of presences and absences in Species Distribution Models. } \examples{ -test_maxent_spec <- sdm_spec_maxent(tune="sdm") +test_maxent_spec <- sdm_spec_maxent(tune = "sdm") test_maxent_spec # setting specific values -sdm_spec_maxent(tune="custom", feature_classes="lq") +sdm_spec_maxent(tune = "custom", feature_classes = "lq") } diff --git a/man/sdm_spec_rand_forest.Rd b/man/sdm_spec_rand_forest.Rd index 96b0ec16..ad3c218f 100644 --- a/man/sdm_spec_rand_forest.Rd +++ b/man/sdm_spec_rand_forest.Rd @@ -14,12 +14,12 @@ sdm_spec_rf(..., tune = c("sdm", "all", "custom", "none")) customise the model. See the help of that function for details.} \item{tune}{character defining the tuning strategy. Valid strategies are: -{itemize: -/item: "sdm" chooses hyperparameters that are most important to tune for +\itemize{ +\item "sdm" chooses hyperparameters that are most important to tune for an sdm (for \emph{rf}, 'mtry') -/item: "all" tunes all hyperparameters (for \emph{rf}, 'mtry', 'trees' and 'min') -/item: "custom" passes the options from '...' -/item: "none" does not tune any hyperparameter +\item "all" tunes all hyperparameters (for \emph{rf}, 'mtry', 'trees' and 'min') +\item "custom" passes the options from '...' +\item "none" does not tune any hyperparameter }} } \value{ @@ -34,8 +34,8 @@ Models. \code{sdm_spec_rf()} is simply a short form for \code{sm_spec_rand_forest()}. } \examples{ -test_rf_spec <- sdm_spec_rf(tune="sdm") +test_rf_spec <- sdm_spec_rf(tune = "sdm") test_rf_spec # combining tuning with specific values for other hyperparameters -sdm_spec_rf(tune="sdm", trees=100) +sdm_spec_rf(tune = "sdm", trees = 100) } diff --git a/man/simple_ensemble.Rd b/man/simple_ensemble.Rd index 46b32a6c..40056888 100644 --- a/man/simple_ensemble.Rd +++ b/man/simple_ensemble.Rd @@ -12,11 +12,11 @@ object. Members are added with \code{add_best_candidates()}} } \value{ an empty \code{simple_ensemble}. This is a tibble with columns: -{/itemize: -/item: \code{wflow_id}: the name of the workflows for which the best model was +\itemize{ +\item \code{wflow_id}: the name of the workflows for which the best model was chosen -/item: \code{workflow}: the trained workflow objects -/item: \code{metrics}: metrics based on the crossvalidation resampling used +\item \code{workflow}: the trained workflow objects +\item \code{metrics}: metrics based on the crossvalidation resampling used to tune the models } } diff --git a/man/spatial_initial_split.Rd b/man/spatial_initial_split.Rd index 53f66a87..03bdf38c 100644 --- a/man/spatial_initial_split.Rd +++ b/man/spatial_initial_split.Rd @@ -26,7 +26,7 @@ a random split from that strategy will be used to generate the initial split. } \examples{ set.seed(123) -block_initial <- spatial_initial_split(boston_canopy, prop = 1/5, spatial_block_cv) +block_initial <- spatial_initial_split(boston_canopy, prop = 1 / 5, spatial_block_cv) testing(block_initial) training(block_initial) } diff --git a/man/thin_by_cell_time.Rd b/man/thin_by_cell_time.Rd index dda45670..df695b43 100644 --- a/man/thin_by_cell_time.Rd +++ b/man/thin_by_cell_time.Rd @@ -23,7 +23,7 @@ These can be defined in \code{coords}, unless they have standard names corresponding to the time slices (times should be set as either POSIXlt or "years", see \code{\link[terra:time]{terra::time()}} for details), or a \code{\link[terra:SpatRaster-class]{terra::SpatRasterDataset}} where the first dataset will be -used (again, times for that dataset should be set as eitehr POSIXlt or +used (again, times for that dataset should be set as either POSIXlt or "years") \code{terra::time()}} diff --git a/man/tidysdm.Rd b/man/tidysdm.Rd index 3a6f2d23..537aa578 100644 --- a/man/tidysdm.Rd +++ b/man/tidysdm.Rd @@ -6,5 +6,21 @@ \title{tidysdm} \description{ This \code{R} library facilitates the fitting of Species Distribution -Models with \code{tidymodels} +Models with \code{tidymodels}. +} +\details{ +The functionalities of \code{tidysdm} are described in +Leonardi et al. (2023) \doi{10.1101/2023.07.24.550358}. Please cite it if you +use \code{tidysdm} in your research. + +On its dedicated \href{https://evolecolgroup.github.io/tidysdm/}{website}, you can find +Articles giving you a step-by-step \href{https://evolecolgroup.github.io/tidysdm/articles/a0_tidysdm_overview.html}{overview of the package}, +how to use \href{https://evolecolgroup.github.io/tidysdm/articles/a1_palaeodata_application.html}{\code{tidysdm} on palaeodata}, +examples of \href{https://evolecolgroup.github.io/tidysdm/articles/a2_tidymodels_additions.html}{advanced modelling approaches using \code{tidymodels} features}, +and a \href{https://evolecolgroup.github.io/tidysdm/articles/a3_troubleshooting.html}{troubleshooting guide for when models fail}. +There is also a +\href{https://evolecolgroup.github.io/tidysdm/dev/}{development version} of the site +updated for the \code{dev} version (on the top left, the version number is in +red, and will be in the format x.x.x.9xxx, indicating it is a +development version). } diff --git a/man/tss.Rd b/man/tss.Rd index 9e38727e..e8572d1c 100644 --- a/man/tss.Rd +++ b/man/tss.Rd @@ -25,15 +25,15 @@ results should be in the columns of the table.} \item{...}{Not currently used.} -\item{truth}{The column identifier for the true class results (that is a factor). This should be an unquoted column name although this argument is passed by expression and supports quasiquotation (you can unquote column names). For ⁠_vec()⁠ functions, a factor vector.} +\item{truth}{The column identifier for the true class results (that is a factor). This should be an unquoted column name although this argument is passed by expression and supports quasiquotation (you can unquote column names). For _vec() functions, a factor vector.} -\item{estimate}{The column identifier for the predicted class results (that is also factor). As with truth this can be specified different ways but the primary method is to use an unquoted variable name. For ⁠_vec()⁠ functions, a factor vector.} +\item{estimate}{The column identifier for the predicted class results (that is also factor). As with truth this can be specified different ways but the primary method is to use an unquoted variable name. For _vec() functions, a factor vector.} \item{estimator}{One of: "binary", "macro", "macro_weighted", or "micro" to specify the type of averaging to be done. "binary" is only relevant for the two class case. The other three are general methods for calculating multiclass metrics. The default will automatically choose "binary" or "macro" based on estimate.} \item{na_rm}{A logical value indicating whether NA values should be stripped before the computation proceeds.} -\item{case_weights}{The optional column identifier for case weights. This should be an unquoted column name that evaluates to a numeric column in data. For ⁠_vec()⁠ functions, a numeric vector.} +\item{case_weights}{The optional column identifier for case weights. This should be an unquoted column name that evaluates to a numeric column in data. For _vec() functions, a numeric vector.} \item{event_level}{A single string. Either "first" or "second" to specify which level of truth to consider as the "event". This argument is only applicable when estimator = "binary". The default is "first".} } @@ -55,7 +55,7 @@ is usually not the metric used for Species Distribution Models, where the threshold is recalibrated to maximise TSS; for that purpose, use \code{\link[=tss_max]{tss_max()}}. } \examples{ -#Two class +# Two class data("two_class_example") tss(two_class_example, truth, predicted) # Multiclass @@ -63,6 +63,6 @@ library(dplyr) data(hpc_cv) # Groups are respected hpc_cv \%>\% - group_by(Resample) \%>\% - tss(obs, pred) + group_by(Resample) \%>\% + tss(obs, pred) } diff --git a/man/tss_max.Rd b/man/tss_max.Rd index 993d19f4..5da9e9ca 100644 --- a/man/tss_max.Rd +++ b/man/tss_max.Rd @@ -38,7 +38,7 @@ results should be in the columns of the table.} \item{...}{A set of unquoted column names or one or more dplyr selector functions to choose which variables contain the class probabilities. If truth is binary, only 1 column should be selected, and it should correspond to the value of event_level. Otherwise, there should be as many columns as factor levels of truth and the ordering of the columns should be the same as the factor levels of truth.} -\item{truth}{The column identifier for the true class results (that is a factor). This should be an unquoted column name although this argument is passed by expression and supports quasiquotation (you can unquote column names). For ⁠_vec()⁠ functions, a factor vector.} +\item{truth}{The column identifier for the true class results (that is a factor). This should be an unquoted column name although this argument is passed by expression and supports quasiquotation (you can unquote column names). For _vec() functions, a factor vector.} \item{estimator}{One of "binary", "hand_till", "macro", or "macro_weighted" to specify the type of averaging to be done. "binary" is only relevant for the two class case. The others are general methods for calculating multiclass metrics. The default will automatically choose "binary" if truth is binary, "hand_till" if truth has >2 levels and case_weights isn't specified, or "macro" if truth has >2 levels and case_weights is specified (in which case "hand_till" isn't well-defined).} @@ -46,7 +46,7 @@ results should be in the columns of the table.} \item{event_level}{A single string. Either "first" or "second" to specify which level of truth to consider as the "event". This argument is only applicable when estimator = "binary". The default uses an internal helper that generally defaults to "first"} -\item{case_weights}{The optional column identifier for case weights. This should be an unquoted column name that evaluates to a numeric column in data. For ⁠_vec()⁠ functions, a numeric vector.} +\item{case_weights}{The optional column identifier for case weights. This should be an unquoted column name that evaluates to a numeric column in data. For _vec() functions, a numeric vector.} \item{estimate}{If truth is binary, a numeric vector of class probabilities corresponding to the "relevant" class. Otherwise, a matrix with as many columns as factor levels of truth. It is assumed that these are in the same order as the levels of truth.} } diff --git a/man/ybp2date.Rd b/man/ybp2date.Rd deleted file mode 100644 index 916144a6..00000000 --- a/man/ybp2date.Rd +++ /dev/null @@ -1,30 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/ybp2date.R -\name{ybp2date} -\alias{ybp2date} -\alias{date2ybp} -\title{Convert years BP from pastclim to lubridate date, or vice versa} -\usage{ -ybp2date(x) - -date2ybp(x) -} -\arguments{ -\item{x}{a time in years BP using the \code{pastclim} convention of -negative numbers indicating years into the past, or a \code{POSIXct} date object} -} -\value{ -a \code{POSIXct} date object, or a vector -} -\description{ -These functions convert between years BP as used by pastclim (negative numbers going into -the past, positive into the future) and standard -\code{POSIXct} date objects. -} -\examples{ -ybp2date(-10000) -ybp2date(0) -# back and forth -date2ybp(ybp2date(-10000)) - -} diff --git a/tests/spelling.R b/tests/spelling.R new file mode 100644 index 00000000..6713838f --- /dev/null +++ b/tests/spelling.R @@ -0,0 +1,3 @@ +if(requireNamespace('spelling', quietly = TRUE)) + spelling::spell_check_test(vignettes = TRUE, error = FALSE, + skip_on_cran = TRUE) diff --git a/tests/testthat/test_calib_class_thresh.R b/tests/testthat/test_calib_class_thresh.R index caa33e98..a5ba0cff 100644 --- a/tests/testthat/test_calib_class_thresh.R +++ b/tests/testthat/test_calib_class_thresh.R @@ -1,13 +1,17 @@ test_that("simple_ensemble predictions", { # class predictions ## now add some models (the first 3) using default metric - test_ens <- simple_ensemble() %>% add_member(two_class_res[1:3, ], metric="roc_auc") + test_ens <- simple_ensemble() %>% add_member(two_class_res[1:3, ], + metric = "roc_auc" + ) # first we calibrate the model - test_ens<-calib_class_thresh(test_ens,class_thresh = "tss_max") - expect_true(nrow(attr(test_ens,"class_thresholds"))==4) - expect_message(test_ens<-calib_class_thresh(test_ens,class_thresh = "tss_max"), - "this ensemble is already calibrated") + test_ens <- calib_class_thresh(test_ens, class_thresh = "tss_max") + expect_true(nrow(attr(test_ens, "class_thresholds")) == 4) + expect_message( + test_ens <- calib_class_thresh(test_ens, class_thresh = "tss_max"), + "this ensemble is already calibrated" + ) # now add another calibration - test_ens <- calib_class_thresh(test_ens, class_thresh=c("sens",0.9)) - expect_true(nrow(attr(test_ens,"class_thresholds"))==8) + test_ens <- calib_class_thresh(test_ens, class_thresh = c("sens", 0.9)) + expect_true(nrow(attr(test_ens, "class_thresholds")) == 8) }) diff --git a/tests/testthat/test_check_sdm_presence.R b/tests/testthat/test_check_sdm_presence.R index 61f92931..fae0f23f 100644 --- a/tests/testthat/test_check_sdm_presence.R +++ b/tests/testthat/test_check_sdm_presence.R @@ -1,11 +1,19 @@ test_that("check_sdm_presence gives correct errors", { expect_true(two_class_dat %>% check_sdm_presence(Class, presence_level = "Class1")) - expect_error(two_class_dat %>% check_sdm_presence(Class, presence_level = "Class2"), - "level Class2 is not the first") - expect_error(two_class_dat %>% check_sdm_presence(Class, presence_level = "Class3"), - "level Class3 is not used in Class") - expect_error(two_class_dat %>% check_sdm_presence(blah, presence_level = "Class1"), - "Can't extract") - expect_error(two_class_dat %>% check_sdm_presence(A, presence_level = "Class1"), - "A should be") + expect_error( + two_class_dat %>% check_sdm_presence(Class, presence_level = "Class2"), + "level Class2 is not the first" + ) + expect_error( + two_class_dat %>% check_sdm_presence(Class, presence_level = "Class3"), + "level Class3 is not used in Class" + ) + expect_error( + two_class_dat %>% check_sdm_presence(blah, presence_level = "Class1"), + "Can't extract" + ) + expect_error( + two_class_dat %>% check_sdm_presence(A, presence_level = "Class1"), + "A should be" + ) }) diff --git a/tests/testthat/test_explain_tidysdm.R b/tests/testthat/test_explain_tidysdm.R index f0e150d2..6e11f673 100644 --- a/tests/testthat/test_explain_tidysdm.R +++ b/tests/testthat/test_explain_tidysdm.R @@ -1,20 +1,31 @@ test_that("we can explain tidysdm objects", { # simple ensemble - expect_true(inherits(explain_tidysdm(tidysdm::lacerta_ensemble), "explainer")) + expect_true(inherits(explain_tidysdm(tidysdm::lacerta_ensemble, + verbose=FALSE), "explainer")) # repeated ensemble lacerta_rep <- repeat_ensemble() %>% add_repeat(list(tidysdm::lacerta_ensemble, tidysdm::lacerta_ensemble)) - expect_true(inherits(explain_tidysdm(lacerta_rep), "explainer")) - expect_identical(DALEX::model_info(lacerta_rep), - DALEX::model_info(tidysdm::lacerta_ensemble)) + expect_true(inherits(explain_tidysdm(lacerta_rep, + verbose=FALSE), "explainer")) + expect_identical( + DALEX::model_info(lacerta_rep), + DALEX::model_info(tidysdm::lacerta_ensemble) + ) # errors - expect_error(explain_tidysdm("blah"), - "no method defined for this object type") - expect_error(explain_tidysdm(tidysdm::lacerta_ensemble, type = "regression"), - "type has to be classification for a tidysdm ensemble") - expect_error(DALEX::model_info(lacerta_rep, is_multiclass = TRUE), - "tidysdm repeat_ensembles can not be multiclass") - expect_error(DALEX::model_info(tidysdm::lacerta_ensemble, is_multiclass = TRUE), - "tidysdm simple_ensembles can not be multiclass") - + expect_error( + explain_tidysdm("blah"), + "no method defined for this object type" + ) + expect_error( + explain_tidysdm(tidysdm::lacerta_ensemble, type = "regression"), + "type has to be classification for a tidysdm ensemble" + ) + expect_error( + DALEX::model_info(lacerta_rep, is_multiclass = TRUE), + "tidysdm repeat_ensembles can not be multiclass" + ) + expect_error( + DALEX::model_info(tidysdm::lacerta_ensemble, is_multiclass = TRUE), + "tidysdm simple_ensembles can not be multiclass" + ) }) diff --git a/tests/testthat/test_filter_high_cor.R b/tests/testthat/test_filter_high_cor.R index 5ccb256a..75d4e3ba 100644 --- a/tests/testthat/test_filter_high_cor.R +++ b/tests/testthat/test_filter_high_cor.R @@ -1,35 +1,42 @@ test_that("filter correlated variables", { lacerta_thin <- readRDS(system.file("extdata/lacerta_climate_sf.RDS", - package="tidysdm")) + package = "tidysdm" + )) set.seed(123) to_keep <- filter_high_cor(lacerta_thin) - expect_true(all(c("bio02","bio19","altitude","bio15","bio08","bio09","bio03") - %in% to_keep)) - expect_true(all(is.numeric(filter_high_cor(lacerta_thin, names=FALSE)))) - verbose_test <- suppressMessages(filter_high_cor(lacerta_thin, verbose=TRUE)) - expect_error(filter_high_cor(lacerta_thin, to_keep="blah"), - "to_keep should only include numeric") + expect_true(all(c("bio02", "bio19", "altitude", "bio15", "bio08", "bio09", "bio03") + %in% to_keep)) + expect_true(all(is.numeric(filter_high_cor(lacerta_thin, names = FALSE)))) + verbose_test <- suppressMessages(filter_high_cor(lacerta_thin, verbose = TRUE)) + expect_error( + filter_high_cor(lacerta_thin, to_keep = "blah"), + "to_keep should only include numeric" + ) # error if forced variables are too correlated - expect_error(filter_high_cor(lacerta_thin, to_keep=c("bio01","bio06")), - "some variables in") + expect_error( + filter_high_cor(lacerta_thin, to_keep = c("bio01", "bio06")), + "some variables in" + ) # keep variables in if they are reasonable set.seed(123) - vars_kept <- filter_high_cor(lacerta_thin, to_keep=c("bio01","bio09")) - expect_true(all(c("bio01","bio09") %in% - vars_kept)) - vars_kept_cor <- cor(lacerta_thin[,vars_kept] %>% sf::st_drop_geometry()) - diag(vars_kept_cor)<-NA - expect_true(max(abs(vars_kept_cor),na.rm=TRUE)<0.7) + vars_kept <- filter_high_cor(lacerta_thin, to_keep = c("bio01", "bio09")) + expect_true(all(c("bio01", "bio09") %in% + vars_kept)) + vars_kept_cor <- cor(lacerta_thin[, vars_kept] %>% sf::st_drop_geometry()) + diag(vars_kept_cor) <- NA + expect_true(max(abs(vars_kept_cor), na.rm = TRUE) < 0.7) # keep variables in if they are reasonable - expect_true(all(c("bio01") %in% - filter_high_cor(lacerta_thin, to_keep=c("bio01")))) + expect_true(all(c("bio01") %in% + filter_high_cor(lacerta_thin, to_keep = c("bio01")))) # make sure the matrix is correct - foo <- matrix(c(1,0.1,0.3,1),nrow=2, dimnames=list(c("a","b"), c("a","b"))) - expect_error( filter_high_cor(foo), "correlation matrix is not symmetric") + foo <- matrix(c(1, 0.1, 0.3, 1), nrow = 2, dimnames = list(c("a", "b"), c("a", "b"))) + expect_error(filter_high_cor(foo), "correlation matrix is not symmetric") # one dimensional matrix - foo <- matrix(c(1),nrow=1, dimnames=list(c("a"), c("a"))) - expect_error( filter_high_cor(foo), "only one variable given") + foo <- matrix(c(1), nrow = 1, dimnames = list(c("a"), c("a"))) + expect_error(filter_high_cor(foo), "only one variable given") # error for defautl object - expect_error( filter_high_cor("blah"), - "no method available for this object type") + expect_error( + filter_high_cor("blah"), + "no method available for this object type" + ) }) diff --git a/tests/testthat/test_form_resp.R b/tests/testthat/test_form_resp.R index 91b8f2cf..5aaf35f8 100644 --- a/tests/testthat/test_form_resp.R +++ b/tests/testthat/test_form_resp.R @@ -1,6 +1,6 @@ test_that("form_resp returns correct response", { my_formula <- formula("x~y+1") - expect_equal(form_resp(my_formula),"x") + expect_equal(form_resp(my_formula), "x") my_formula <- formula("~y+1") expect_null(form_resp(my_formula)) }) diff --git a/tests/testthat/test_km2d.R b/tests/testthat/test_km2d.R index 8cf83a63..7814464e 100644 --- a/tests/testthat/test_km2d.R +++ b/tests/testthat/test_km2d.R @@ -1,3 +1,3 @@ test_that("km2m converts correctly", { - expect_true(km2m(1)==1000) + expect_true(km2m(1) == 1000) }) diff --git a/tests/testthat/test_maxnet_fit.R b/tests/testthat/test_maxnet_fit.R index 20f1dd8d..704795c7 100644 --- a/tests/testthat/test_maxnet_fit.R +++ b/tests/testthat/test_maxnet_fit.R @@ -1,12 +1,15 @@ test_that("maxnet_fit is equivalent to maxnet", { - data("bradypus", package="maxnet") + data("bradypus", package = "maxnet") brad_p <- bradypus$presence - brad_data <- bradypus[,-1] - mod <- maxnet::maxnet(brad_p, brad_data, maxnet::maxnet.formula(brad_p, brad_data, classes="lq")) - bradypus_tb <- tibble::as_tibble(bradypus) %>% dplyr::mutate(presence = relevel(factor( - dplyr::case_match (presence, 1~"presence",0 ~"absence")), - ref="presence")) + brad_data <- bradypus[, -1] + mod <- maxnet::maxnet(brad_p, brad_data, maxnet::maxnet.formula(brad_p, brad_data, classes = "lq")) + bradypus_tb <- tibble::as_tibble(bradypus) %>% dplyr::mutate(presence = relevel( + factor( + dplyr::case_match(presence, 1 ~ "presence", 0 ~ "absence") + ), + ref = "presence" + )) - mod2 <- maxnet_fit(presence~.,data=bradypus_tb, classes="lq") + mod2 <- maxnet_fit(presence ~ ., data = bradypus_tb, classes = "lq") expect_true(identical(mod, mod2)) }) diff --git a/tests/testthat/test_predict_repeat_ensemble.R b/tests/testthat/test_predict_repeat_ensemble.R index 96e5ca4c..5538d2c9 100644 --- a/tests/testthat/test_predict_repeat_ensemble.R +++ b/tests/testthat/test_predict_repeat_ensemble.R @@ -1,42 +1,44 @@ test_that("repeat_ensemble predictions", { skip_if(FALSE) ## now add some models (the first 2) using default metric - test_ens_2 <- simple_ensemble() %>% add_member(two_class_res[1:3, ], metric="roc_auc") + test_ens_2 <- simple_ensemble() %>% add_member(two_class_res[1:3, ], metric = "roc_auc") ens_list <- list(test_ens_2, test_ens_2, test_ens_2) test_rep_ens <- repeat_ensemble() %>% add_repeat(ens_list) # default mean prediction across the 3 repeates and two models - mean_pred<-predict(test_rep_ens, new_data = two_class_dat) + mean_pred <- predict(test_rep_ens, new_data = two_class_dat) # now test the median - median_pred <- predict(test_rep_ens, new_data = two_class_dat, fun="median") + median_pred <- predict(test_rep_ens, new_data = two_class_dat, fun = "median") # mean and median should differ! expect_false(identical(mean_pred, median_pred)) # but the mean requested with a string should be the same as the default - mean_pred_string<-predict(test_rep_ens, new_data = two_class_dat, fun="mean") + mean_pred_string <- predict(test_rep_ens, new_data = two_class_dat, fun = "mean") expect_true(identical(mean_pred, mean_pred_string)) # now extract individual member predictions - mean_pred_members <- predict(test_rep_ens, new_data = two_class_dat, members=TRUE) + mean_pred_members <- predict(test_rep_ens, new_data = two_class_dat, members = TRUE) # this should have 4 times the columns of a mean prediction (it has the mean as well as the three models) - expect_true(ncol(mean_pred_members)==(ncol(mean_pred)*3*3+1)) + expect_true(ncol(mean_pred_members) == (ncol(mean_pred) * 3 * 3 + 1)) # now get predictions just for the individual members - pred_members <- predict(test_rep_ens, new_data = two_class_dat, fun="none") + pred_members <- predict(test_rep_ens, new_data = two_class_dat, fun = "none") # this should have 3 times the columns of a mean prediction (from the three member models) - expect_true(ncol(pred_members)==(ncol(mean_pred)*3*3)) + expect_true(ncol(pred_members) == (ncol(mean_pred) * 3 * 3)) # predict with threshold (should only contain 2 models) - pred_thresh <- predict(test_rep_ens, new_data = two_class_dat, fun="none", metric_thresh = c("roc_auc",0.88)) - expect_true(ncol(pred_thresh)==(ncol(mean_pred)*2*3)) - pred_thresh_m <- predict(test_rep_ens, new_data = two_class_dat, fun="mean", metric_thresh = c("roc_auc",0.88)) + pred_thresh <- predict(test_rep_ens, new_data = two_class_dat, fun = "none", metric_thresh = c("roc_auc", 0.88)) + expect_true(ncol(pred_thresh) == (ncol(mean_pred) * 2 * 3)) + pred_thresh_m <- predict(test_rep_ens, new_data = two_class_dat, fun = "mean", metric_thresh = c("roc_auc", 0.88)) # check that the mean is indeed from the two models - expect_true(all(apply(pred_thresh,1,mean)==pred_thresh_m[,1])) + expect_true(all(apply(pred_thresh, 1, mean) == pred_thresh_m[, 1])) # and it is not the same as the mean from all models expect_false(identical(mean_pred, pred_thresh)) # now filter so that we only have one model - pred_thresh_1 <- predict(test_rep_ens, new_data = two_class_dat, fun="none", metric_thresh = c("accuracy",0.815)) - expect_true(ncol(pred_thresh_1)==(ncol(mean_pred)*3)) - pred_thresh_1m <- predict(test_rep_ens, new_data = two_class_dat, fun="mean", metric_thresh = c("accuracy",0.815)) + pred_thresh_1 <- predict(test_rep_ens, new_data = two_class_dat, fun = "none", metric_thresh = c("accuracy", 0.815)) + expect_true(ncol(pred_thresh_1) == (ncol(mean_pred) * 3)) + pred_thresh_1m <- predict(test_rep_ens, new_data = two_class_dat, fun = "mean", metric_thresh = c("accuracy", 0.815)) # and throw and error if we end up without any model! - expect_error(predict(test_rep_ens, new_data = two_class_dat, fun="mean", metric_thresh = c("accuracy",0.83)), - "the current metric_threshold excludes all models") + expect_error( + predict(test_rep_ens, new_data = two_class_dat, fun = "mean", metric_thresh = c("accuracy", 0.83)), + "the current metric_threshold excludes all models" + ) }) diff --git a/tests/testthat/test_predict_simple_ensemble.R b/tests/testthat/test_predict_simple_ensemble.R index 909bd36c..4a88f95d 100644 --- a/tests/testthat/test_predict_simple_ensemble.R +++ b/tests/testthat/test_predict_simple_ensemble.R @@ -1,66 +1,73 @@ test_that("simple_ensemble predictions", { - ## now add some models (the first 3) using default metric - test_ens <- simple_ensemble() %>% add_member(two_class_res[1:3, ], metric="roc_auc") + test_ens <- simple_ensemble() %>% add_member(two_class_res[1:3, ], metric = "roc_auc") # default mean prediction across the 3 models - mean_pred<-predict(test_ens, new_data = two_class_dat) + mean_pred <- predict(test_ens, new_data = two_class_dat) # now test the median - median_pred <- predict(test_ens, new_data = two_class_dat, fun="median") + median_pred <- predict(test_ens, new_data = two_class_dat, fun = "median") # mean and median should differ! expect_false(identical(mean_pred, median_pred)) # but the mean requested with a string should be the same as the default - mean_pred_string<-predict(test_ens, new_data = two_class_dat, fun="mean") + mean_pred_string <- predict(test_ens, new_data = two_class_dat, fun = "mean") expect_true(identical(mean_pred, mean_pred_string)) # now extract individual member predictions - mean_pred_members <- predict(test_ens, new_data = two_class_dat, members=TRUE) + mean_pred_members <- predict(test_ens, new_data = two_class_dat, members = TRUE) # this should have 4 times the columns of a mean prediction (it has the mean as well as the three models) - expect_true(ncol(mean_pred_members)==(ncol(mean_pred)*4)) + expect_true(ncol(mean_pred_members) == (ncol(mean_pred) * 4)) # now get predictions just for the individual members - pred_members <- predict(test_ens, new_data = two_class_dat, fun="none") + pred_members <- predict(test_ens, new_data = two_class_dat, fun = "none") # this should have 3 times the columns of a mean prediction (from the three member models) - expect_true(ncol(pred_members)==(ncol(mean_pred)*3)) + expect_true(ncol(pred_members) == (ncol(mean_pred) * 3)) # now create weighted predictions weighted_preds <- predict(test_ens, - new_data = two_class_dat, - fun=c("mean", "median", "weighted_mean", "weighted_median")) + new_data = two_class_dat, + fun = c("mean", "median", "weighted_mean", "weighted_median") + ) # check that we have 4 columns - expect_true(ncol(weighted_preds)==(ncol(mean_pred)*4)) + expect_true(ncol(weighted_preds) == (ncol(mean_pred) * 4)) # predict with threshold (should only contain 2 models) - pred_thresh <- predict(test_ens, new_data = two_class_dat, fun="none", metric_thresh = c("roc_auc",0.88)) - expect_true(ncol(pred_thresh)==(ncol(mean_pred)*2)) - pred_thresh_m <- predict(test_ens, new_data = two_class_dat, fun="mean", metric_thresh = c("roc_auc",0.88)) + pred_thresh <- predict(test_ens, new_data = two_class_dat, fun = "none", metric_thresh = c("roc_auc", 0.88)) + expect_true(ncol(pred_thresh) == (ncol(mean_pred) * 2)) + pred_thresh_m <- predict(test_ens, new_data = two_class_dat, fun = "mean", metric_thresh = c("roc_auc", 0.88)) # check that the mean is indeed from the two models - expect_true(all(apply(pred_thresh,1,mean)==pred_thresh_m)) + expect_true(all(apply(pred_thresh, 1, mean) == pred_thresh_m)) # and it is not the same as the mean from all models expect_false(identical(mean_pred, pred_thresh)) # now filter so that we only have one model - pred_thresh_1 <- predict(test_ens, new_data = two_class_dat, fun="none", metric_thresh = c("accuracy",0.815)) - expect_true(ncol(pred_thresh_1)==(ncol(mean_pred))) - pred_thresh_1m <- predict(test_ens, new_data = two_class_dat, fun="mean", metric_thresh = c("accuracy",0.815)) - expect_true(ncol(pred_thresh_1m)==(ncol(mean_pred))) + pred_thresh_1 <- predict(test_ens, new_data = two_class_dat, fun = "none", metric_thresh = c("accuracy", 0.815)) + expect_true(ncol(pred_thresh_1) == (ncol(mean_pred))) + pred_thresh_1m <- predict(test_ens, new_data = two_class_dat, fun = "mean", metric_thresh = c("accuracy", 0.815)) + expect_true(ncol(pred_thresh_1m) == (ncol(mean_pred))) # and throw and error if we end up without any model! - expect_error(predict(test_ens, new_data = two_class_dat, fun="mean", metric_thresh = c("accuracy",0.83)), - "the current metric_threshold excludes all models") + expect_error( + predict(test_ens, new_data = two_class_dat, fun = "mean", metric_thresh = c("accuracy", 0.83)), + "the current metric_threshold excludes all models" + ) # class predictions ## now add some models (the first 3) using default metric - test_ens <- simple_ensemble() %>% add_member(two_class_res[1:3, ], metric="roc_auc") + test_ens <- simple_ensemble() %>% add_member(two_class_res[1:3, ], metric = "roc_auc") # first we calibrate the model - test_ens<-calib_class_thresh(test_ens, class_thresh = "tss_max") - pred_class <- predict(test_ens, new_data = two_class_dat, type="class", class_thresh = c("tss_max"), - fun=c("mean", "median")) - expect_true(inherits(pred_class[,1], "factor")) + test_ens <- calib_class_thresh(test_ens, class_thresh = "tss_max") + pred_class <- predict(test_ens, + new_data = two_class_dat, type = "class", class_thresh = c("tss_max"), + fun = c("mean", "median") + ) + expect_true(inherits(pred_class[, 1], "factor")) }) test_that("simple_ensemble prediction errors", { ## now add some models (the first 3) using default metric - test_ens <- simple_ensemble() %>% add_member(two_class_res[1:3, ], metric="roc_auc") + test_ens <- simple_ensemble() %>% add_member(two_class_res[1:3, ], metric = "roc_auc") # default mean prediction across the 3 models - expect_error(predict(test_ens, new_data = two_class_dat,type="blah"), - "'type' can only take") - expect_error(predict(test_ens, new_data = two_class_dat,type="class", fun="none"), - "classes can be generated only if") + expect_error( + predict(test_ens, new_data = two_class_dat, type = "blah"), + "'type' can only take" + ) + expect_error( + predict(test_ens, new_data = two_class_dat, type = "class", fun = "none"), + "classes can be generated only if" + ) }) - \ No newline at end of file diff --git a/tests/testthat/test_prob_metrics_sf.R b/tests/testthat/test_prob_metrics_sf.R new file mode 100644 index 00000000..50bfce4b --- /dev/null +++ b/tests/testthat/test_prob_metrics_sf.R @@ -0,0 +1,36 @@ +test_that("prob_metrics for sf objects", { + # class predictions + two_class_example_sf <- two_class_example + two_class_example_sf$X <- sample(1:5, nrow(two_class_example_sf), replace = T) + two_class_example_sf$Y <- sample(1:5, nrow(two_class_example_sf), replace = T) + two_class_example_sf <- sf::st_as_sf(two_class_example_sf, coords = c("X", "Y")) + + expect_identical( + average_precision(two_class_example, truth, Class1), + average_precision(two_class_example_sf, truth, Class1) + ) + expect_identical( + brier_class(two_class_example, truth, Class1), + brier_class(two_class_example_sf, truth, Class1) + ) + expect_identical( + classification_cost(two_class_example, truth, Class1), + classification_cost(two_class_example_sf, truth, Class1) + ) + expect_identical( + gain_capture(two_class_example, truth, Class1), + gain_capture(two_class_example_sf, truth, Class1) + ) + expect_identical( + mn_log_loss(two_class_example, truth, Class1), + mn_log_loss(two_class_example_sf, truth, Class1) + ) + expect_identical( + pr_auc(two_class_example, truth, Class1), + pr_auc(two_class_example_sf, truth, Class1) + ) + expect_identical( + roc_auc(two_class_example, truth, Class1), + roc_auc(two_class_example_sf, truth, Class1) + ) +}) diff --git a/tests/testthat/test_recipe_sf.R b/tests/testthat/test_recipe_sf.R index 7e0f19cf..8fa0c954 100644 --- a/tests/testthat/test_recipe_sf.R +++ b/tests/testthat/test_recipe_sf.R @@ -1,43 +1,49 @@ library(sf) test_that("sdm_recipe_sf", { lacerta_thin <- readRDS(system.file("extdata/lacerta_climate_sf.RDS", - package="tidysdm")) - lacerta_rec <- recipe(lacerta_thin, formula=class~.) - expect_true(inherits(lacerta_rec,"spatial_recipe")) - lacerta_spatial_rec <- spatial_recipe(lacerta_thin, formula=class~.) + package = "tidysdm" + )) + lacerta_rec <- recipe(lacerta_thin, formula = class ~ .) + expect_true(inherits(lacerta_rec, "spatial_recipe")) + lacerta_spatial_rec <- spatial_recipe(lacerta_thin, formula = class ~ .) expect_true(identical(lacerta_rec, lacerta_spatial_rec)) - expect_error(spatial_recipe(lacerta_thin %>% sf::st_drop_geometry(), - formula=class~.), - "x should be an `sf` object") - lacerta_xy <- lacerta_thin %>% dplyr::mutate(X=1,Y=2) + expect_error( + spatial_recipe(lacerta_thin %>% sf::st_drop_geometry(), + formula = class ~ . + ), + "x should be an `sf` object" + ) + lacerta_xy <- lacerta_thin %>% dplyr::mutate(X = 1, Y = 2) # deal with X and Y coordinates - expect_error(recipe(lacerta_xy, formula=class~.), - "sf object") - lacerta_xy <- lacerta_thin %>% dplyr::bind_cols(sf::st_coordinates(lacerta_thin)) - lacerta_xy_rec <- recipe(lacerta_xy, formula=class~.) - expect_true(identical(lacerta_xy_rec,lacerta_rec)) - lacerta_xy$X[3]<-190 - expect_error(recipe(lacerta_xy, formula=class~.), - "sf object") - #check prep methods + expect_error( + recipe(lacerta_xy, formula = class ~ .), + "sf object" + ) + lacerta_xy <- lacerta_thin %>% dplyr::bind_cols(sf::st_coordinates(lacerta_thin)) + lacerta_xy_rec <- recipe(lacerta_xy, formula = class ~ .) + expect_true(identical(lacerta_xy_rec, lacerta_rec)) + lacerta_xy$X[3] <- 190 + expect_error( + recipe(lacerta_xy, formula = class ~ .), + "sf object" + ) + # check prep methods lacerta_rec_prep <- prep(lacerta_rec) - expect_true (recipes::fully_trained(lacerta_rec_prep)) - expect_false (recipes::fully_trained(lacerta_rec)) + expect_true(recipes::fully_trained(lacerta_rec_prep)) + expect_false(recipes::fully_trained(lacerta_rec)) # work if we pass an sf object lacerta_rec_prep <- prep(lacerta_rec, training = lacerta_thin) - expect_true (recipes::fully_trained(lacerta_rec_prep)) + expect_true(recipes::fully_trained(lacerta_rec_prep)) # pass a dataframe without X and Y (it's fine as we add dummy X and Y) lacerta_rec_prep <- prep(lacerta_rec, training = lacerta_thin %>% sf::st_drop_geometry()) - expect_true (recipes::fully_trained(lacerta_rec_prep)) - + expect_true(recipes::fully_trained(lacerta_rec_prep)) + ## now bake - expect_true(all(c("X","Y") %in% names(bake(lacerta_rec_prep, new_data = lacerta_thin)))) - baked_no_xy <- bake(lacerta_rec_prep, - new_data = lacerta_thin %>% sf::st_drop_geometry()) - expect_true(all(c("X","Y") %in% names(baked_no_xy))) + expect_true(all(c("X", "Y") %in% names(bake(lacerta_rec_prep, new_data = lacerta_thin)))) + baked_no_xy <- bake(lacerta_rec_prep, + new_data = lacerta_thin %>% sf::st_drop_geometry() + ) + expect_true(all(c("X", "Y") %in% names(baked_no_xy))) # X should just be a dummy variable expect_true(all(is.na(baked_no_xy$X))) -} -) - - \ No newline at end of file +}) diff --git a/tests/testthat/test_repeat_ensemble.R b/tests/testthat/test_repeat_ensemble.R index e7d32513..09e67345 100644 --- a/tests/testthat/test_repeat_ensemble.R +++ b/tests/testthat/test_repeat_ensemble.R @@ -2,9 +2,9 @@ test_that("repeat_ensemble constructor", { # an empty workflow test_rep_ens <- repeat_ensemble() # has all the slots - expect_true (all(names(test_rep_ens) == c("rep_id","wflow_id", "workflow", "metrics"))) + expect_true(all(names(test_rep_ens) == c("rep_id", "wflow_id", "workflow", "metrics"))) # but they are empty - expect_true (nrow(test_rep_ens)==0) + expect_true(nrow(test_rep_ens) == 0) }) test_that("add_repeat to empty repeat ensemble", { @@ -12,29 +12,35 @@ test_that("add_repeat to empty repeat ensemble", { expect_warning(test_ens_1 <- simple_ensemble() %>% add_member(two_class_res[c(1:3), ])) test_rep_ens <- repeat_ensemble() %>% add_repeat(test_ens_1) - expect_true(nrow(test_rep_ens)==3) - expect_true(inherits(test_rep_ens,"repeat_ensemble")) - #now add another one (simply use another copy of the simple ens) + expect_true(nrow(test_rep_ens) == 3) + expect_true(inherits(test_rep_ens, "repeat_ensemble")) + # now add another one (simply use another copy of the simple ens) test_rep_ens <- test_rep_ens %>% add_repeat(test_ens_1) - expect_true(nrow(test_rep_ens)==6) + expect_true(nrow(test_rep_ens) == 6) # now change the name of one of the models in the repeat being added test_ens_2 <- test_ens_1 - test_ens_2$wflow_id[1]<-"blah" - expect_error(test_rep_ens %>% add_repeat(test_ens_2), - "the models ") + test_ens_2$wflow_id[1] <- "blah" + expect_error( + test_rep_ens %>% add_repeat(test_ens_2), + "the models " + ) # now change the best model test_ens_2 <- test_ens_1 attr(test_ens_2, "best_metric") <- "blah" - expect_error(test_rep_ens %>% add_repeat(test_ens_2), - "the best metric ") + expect_error( + test_rep_ens %>% add_repeat(test_ens_2), + "the best metric " + ) # and finally the metric test_ens_2 <- test_ens_1 attr(test_ens_2, "metrics") <- "blah" - expect_error(test_rep_ens %>% add_repeat(test_ens_2), - "the metrics ") + expect_error( + test_rep_ens %>% add_repeat(test_ens_2), + "the metrics " + ) # now make a list ens_list <- list(test_ens_1, test_ens_1, test_ens_1) test_rep_ens <- repeat_ensemble() %>% add_repeat(ens_list) - expect_true(nrow(test_rep_ens)==9) - expect_true(setequal(unique(test_rep_ens$rep_id),c("rep_01","rep_02","rep_03"))) + expect_true(nrow(test_rep_ens) == 9) + expect_true(setequal(unique(test_rep_ens$rep_id), c("rep_01", "rep_02", "rep_03"))) }) diff --git a/tests/testthat/test_sample_pseudoabs.R b/tests/testthat/test_sample_pseudoabs.R index 9f2d03bd..992075d1 100644 --- a/tests/testthat/test_sample_pseudoabs.R +++ b/tests/testthat/test_sample_pseudoabs.R @@ -1,97 +1,120 @@ # set up a small world # small grid library(terra) -grid_raster <- terra::rast(matrix(1:64, ncol=8,byrow=TRUE), - extent=terra::ext(c(-2,2,-2,2)), - crs="lonlat") - # crs="epsg:4326") -grid_raster[c(1:5,15,16,23,24)]<-NA +grid_raster <- terra::rast(matrix(1:64, ncol = 8, byrow = TRUE), + extent = terra::ext(c(-2, 2, -2, 2)), + crs = "lonlat" +) +# crs="epsg:4326") +grid_raster[c(1:5, 15, 16, 23, 24)] <- NA # locations (first isolated, two closer to each other) -locations <- data.frame(lon=c( 0.8, 1.9, 0.7), - lat=c(1.3, -1.8, -0.9), - id = 1:3) -min_buffer <- terra::buffer(terra::vect(locations, crs="lonlat"),60000) -max_buffer <- terra::buffer(terra::vect(locations, crs="lonlat"),90000) +locations <- data.frame( + lon = c(0.8, 1.9, 0.7), + lat = c(1.3, -1.8, -0.9), + id = 1:3 +) +min_buffer <- terra::buffer(terra::vect(locations, crs = "lonlat"), 60000) +max_buffer <- terra::buffer(terra::vect(locations, crs = "lonlat"), 90000) # points in poygons function -#(from https://stackoverflow.com/questions/72384038/point-in-polygon-using-terra-package-in-r) -pts_in_polys <- function(pts, polys){ +# (from https://stackoverflow.com/questions/72384038/point-in-polygon-using-terra-package-in-r) +pts_in_polys <- function(pts, polys) { e <- terra::extract(polys, pts) - e[!is.na(e[,2]), 1] + e[!is.na(e[, 2]), 1] } test_that("sample_pseudoabs samples in the right places", { set.seed(123) - pa_random <- sample_pseudoabs(locations, n=25, raster=grid_raster, - return_pres = FALSE) + pa_random <- sample_pseudoabs(locations, + n = 25, raster = grid_raster, + return_pres = FALSE + ) # we should now check that some points are in the buffers - expect_true(length(pts_in_polys(terra::vect(pa_random), min_buffer))>0) - expect_true(length(pts_in_polys(terra::vect(pa_random), max_buffer))>0) + expect_true(length(pts_in_polys(terra::vect(pa_random), min_buffer)) > 0) + expect_true(length(pts_in_polys(terra::vect(pa_random), max_buffer)) > 0) # there should be no presences - expect_true(unique(pa_random$class)=="pseudoabs") + expect_true(unique(pa_random$class) == "pseudoabs") # now use a minimum buffer set.seed(123) - pa_min <- sample_pseudoabs(locations, n=15, raster=grid_raster, - method=c("dist_min",60000), - return_pres = FALSE) + pa_min <- sample_pseudoabs(locations, + n = 15, raster = grid_raster, + method = c("dist_min", 60000), + return_pres = FALSE + ) # none should be within the minimum buffer - expect_true(length(pts_in_polys(terra::vect(pa_min), min_buffer))==0) + expect_true(length(pts_in_polys(terra::vect(pa_min), min_buffer)) == 0) # now use a maximum buffer set.seed(123) - pa_max <- sample_pseudoabs(locations, n=5, raster=grid_raster, - method=c("dist_max",90000), - return_pres = FALSE) + pa_max <- sample_pseudoabs(locations, + n = 5, raster = grid_raster, + method = c("dist_max", 90000), + return_pres = FALSE + ) # all are within the max buffer - expect_true(length(pts_in_polys(terra::vect(pa_max), max_buffer))==nrow(pa_max)) + expect_true(length(pts_in_polys(terra::vect(pa_max), max_buffer)) == nrow(pa_max)) # and now use a disc set.seed(123) - pa_disc <- sample_pseudoabs(locations, n=5, raster=grid_raster, - method=c("dist_disc",60000, 90000), - return_pres = FALSE) + pa_disc <- sample_pseudoabs(locations, + n = 5, raster = grid_raster, + method = c("dist_disc", 60000, 90000), + return_pres = FALSE + ) # all are within the max buffer - expect_true(length(pts_in_polys(terra::vect(pa_disc), max_buffer))==nrow(pa_disc)) + expect_true(length(pts_in_polys(terra::vect(pa_disc), max_buffer)) == nrow(pa_disc)) # none should be within the minimum buffer - expect_true(length(pts_in_polys(terra::vect(pa_disc), min_buffer))==0) + expect_true(length(pts_in_polys(terra::vect(pa_disc), min_buffer)) == 0) - pa_pres <- sample_pseudoabs(locations, n=25, raster=grid_raster) - expect_true(all(levels(pa_pres$class)==c("presence","pseudoabs"))) + pa_pres <- sample_pseudoabs(locations, n = 25, raster = grid_raster) + expect_true(all(levels(pa_pres$class) == c("presence", "pseudoabs"))) # now confirm that it all works if we use an sf object set.seed(123) - locations_sf <- sf::st_as_sf(locations, coords=c("lon","lat")) %>% sf::st_set_crs(4326) - pa_random_sf <- sample_pseudoabs(locations_sf, n=25, raster=grid_raster, - return_pres = FALSE) - expect_true(inherits(pa_random_sf,"sf")) - expect_true(inherits(pa_random_sf,"data.frame")) # it is also a df! - expect_true(all(pa_random$id ==pa_random_sf$id)) + locations_sf <- sf::st_as_sf(locations, coords = c("lon", "lat")) %>% sf::st_set_crs(4326) + pa_random_sf <- sample_pseudoabs(locations_sf, + n = 25, raster = grid_raster, + return_pres = FALSE + ) + expect_true(inherits(pa_random_sf, "sf")) + expect_true(inherits(pa_random_sf, "data.frame")) # it is also a df! + expect_true(all(pa_random$id == pa_random_sf$id)) # test error messages - expect_error(sample_pseudoabs(locations_sf, n=25, raster=grid_raster,method="blah"), - "method has to be") - expect_error(sample_pseudoabs(locations_sf, n=25, raster=grid_raster,method=c("blah",25)), - "method has to be") + expect_error( + sample_pseudoabs(locations_sf, n = 25, raster = grid_raster, method = "blah"), + "method has to be" + ) + expect_error( + sample_pseudoabs(locations_sf, n = 25, raster = grid_raster, method = c("blah", 25)), + "method has to be" + ) }) test_that("handling of data frames and sf objects", { - locations_sf <- sf::st_as_sf(locations, coords=c("lon","lat")) %>% sf::st_set_crs(4326) - expect_error(sample_pseudoabs(locations_sf, coords = c("x", "y"), raster = grid_raster), - "There are no recognised coordinate columns") - expect_warning(sample_pseudoabs(locations_sf, raster = grid_raster, n = 100), "There are fewer available cells for raster 'NA' (3 presences) than the requested 100 pseudoabsences. Only 52 will be returned.", fixed=TRUE) + locations_sf <- sf::st_as_sf(locations, coords = c("lon", "lat")) %>% sf::st_set_crs(4326) + expect_error( + sample_pseudoabs(locations_sf, coords = c("x", "y"), raster = grid_raster), + "There are no recognised coordinate columns" + ) + expect_warning(sample_pseudoabs(locations_sf, raster = grid_raster, n = 100), "There are fewer available cells for raster 'NA' (3 presences) than the requested 100 pseudoabsences. Only 52 will be returned.", fixed = TRUE) locations_sf <- locations_sf %>% dplyr::bind_cols(sf::st_coordinates(.)) expect_no_error(sample_pseudoabs(locations_sf, coords = c("X", "Y"), raster = grid_raster, n = 25)) locations_sf$X <- rep(0, 3) locations_sf$Y <- rep(0, 3) - expect_error(sample_pseudoabs(locations_sf, coords = c("X", "Y"), raster = grid_raster, n = 25), - "sf object contains X and Y coordinates that do not match the sf point geometry") + expect_error( + sample_pseudoabs(locations_sf, coords = c("X", "Y"), raster = grid_raster, n = 25), + "sf object contains X and Y coordinates that do not match the sf point geometry" + ) locations_sf$X <- rep(NA, 3) locations_sf$Y <- rep(NA, 3) - expect_error(sample_pseudoabs(locations_sf, coords = c("X", "Y"), raster = grid_raster, n = 25), - "sf object contains NA values in the X and Y coordinates") + expect_error( + sample_pseudoabs(locations_sf, coords = c("X", "Y"), raster = grid_raster, n = 25), + "sf object contains NA values in the X and Y coordinates" + ) }) # sample code to plot points in and buffers diff --git a/tests/testthat/test_sdm_spec_gam.R b/tests/testthat/test_sdm_spec_gam.R index 7a81af47..c49fa708 100644 --- a/tests/testthat/test_sdm_spec_gam.R +++ b/tests/testthat/test_sdm_spec_gam.R @@ -1,13 +1,13 @@ test_that("sdm_spec_gam", { # error for invalid tuning method - expect_error(sdm_spec_gam(tune="blah")) # automatic error from rlang - this_spec_gam <- sdm_spec_gam() - expect_true(inherits(this_spec_gam,"model_spec")) - expect_true(inherits(this_spec_gam,"gen_additive_mod")) + expect_error(sdm_spec_gam(tune = "blah")) # automatic error from rlang + this_spec_gam <- sdm_spec_gam() + expect_true(inherits(this_spec_gam, "model_spec")) + expect_true(inherits(this_spec_gam, "gen_additive_mod")) # for the default, which is none, there is nothing to tune - this_spec_gam <- sdm_spec_gam(tune="none") + this_spec_gam <- sdm_spec_gam(tune = "none") # get errors if we try the tuning options used in other sdm_spec_* - expect_error(sdm_spec_gam(tune="sdm")) - expect_error(sdm_spec_gam(tune="all")) - expect_error(sdm_spec_gam(tune="custom")) + expect_error(sdm_spec_gam(tune = "sdm")) + expect_error(sdm_spec_gam(tune = "all")) + expect_error(sdm_spec_gam(tune = "custom")) }) diff --git a/tests/testthat/test_sdm_spec_glm.R b/tests/testthat/test_sdm_spec_glm.R index 6d026ed4..d2585b7f 100644 --- a/tests/testthat/test_sdm_spec_glm.R +++ b/tests/testthat/test_sdm_spec_glm.R @@ -1,12 +1,12 @@ test_that("sdm_spec_glm", { # error for invalid tuning method - expect_error(sdm_spec_glm(tune="blah")) # automatic error from rlang - this_spec_glm <- sdm_spec_glm() - expect_true(inherits(this_spec_glm,"model_spec")) - expect_true(inherits(this_spec_glm,"logistic_reg")) + expect_error(sdm_spec_glm(tune = "blah")) # automatic error from rlang + this_spec_glm <- sdm_spec_glm() + expect_true(inherits(this_spec_glm, "model_spec")) + expect_true(inherits(this_spec_glm, "logistic_reg")) # for the default, which is none, there is nothing to tune # get errors if we try the tuning options used in other sdm_spec_* - expect_error(sdm_spec_glm(tune="sdm")) - expect_error(sdm_spec_glm(tune="all")) - expect_error(sdm_spec_glm(tune="custom")) + expect_error(sdm_spec_glm(tune = "sdm")) + expect_error(sdm_spec_glm(tune = "all")) + expect_error(sdm_spec_glm(tune = "custom")) }) diff --git a/tests/testthat/test_sdm_spec_rand_forest.R b/tests/testthat/test_sdm_spec_rand_forest.R index 64de885f..5bdddd0f 100644 --- a/tests/testthat/test_sdm_spec_rand_forest.R +++ b/tests/testthat/test_sdm_spec_rand_forest.R @@ -1,30 +1,30 @@ test_that("sdm_spec_rand_forest", { # error for invalid tuning method - expect_error(sdm_spec_rand_forest(tune="blah")) # automatic errof from rlang - this_spec_rf <- sdm_spec_rand_forest() - expect_true(inherits(this_spec_rf,"model_spec")) - expect_true(inherits(this_spec_rf,"rand_forest")) + expect_error(sdm_spec_rand_forest(tune = "blah")) # automatic errof from rlang + this_spec_rf <- sdm_spec_rand_forest() + expect_true(inherits(this_spec_rf, "model_spec")) + expect_true(inherits(this_spec_rf, "rand_forest")) # for the default, which is sdm, we only tune mtry expect_false(rlang::quo_is_null(this_spec_rf$args$mtry)) expect_true(rlang::quo_is_null(this_spec_rf$args$trees)) expect_true(rlang::quo_is_null(this_spec_rf$args$min)) # if we now set to all, they should all be formulae for set to tune - this_spec_rf <- sdm_spec_rand_forest(tune="all") + this_spec_rf <- sdm_spec_rand_forest(tune = "all") expect_false(rlang::quo_is_null(this_spec_rf$args$mtry)) expect_false(rlang::quo_is_null(this_spec_rf$args$trees)) expect_false(rlang::quo_is_null(this_spec_rf$args$min)) # and if we set to none, they are all null - this_spec_rf <- sdm_spec_rand_forest(tune="none") + this_spec_rf <- sdm_spec_rand_forest(tune = "none") expect_true(rlang::quo_is_null(this_spec_rf$args$mtry)) expect_true(rlang::quo_is_null(this_spec_rf$args$trees)) expect_true(rlang::quo_is_null(this_spec_rf$args$min)) # the same for custom - this_spec_rf <- sdm_spec_rand_forest(tune="custom") + this_spec_rf <- sdm_spec_rand_forest(tune = "custom") expect_true(rlang::quo_is_null(this_spec_rf$args$mtry)) expect_true(rlang::quo_is_null(this_spec_rf$args$trees)) expect_true(rlang::quo_is_null(this_spec_rf$args$min)) # check the short form this_spec_rf <- sdm_spec_rf() - expect_true(inherits(this_spec_rf,"model_spec")) - expect_true(inherits(this_spec_rf,"rand_forest")) + expect_true(inherits(this_spec_rf, "model_spec")) + expect_true(inherits(this_spec_rf, "rand_forest")) }) diff --git a/tests/testthat/test_simple_ensemble.R b/tests/testthat/test_simple_ensemble.R index f06aee6f..00bd4161 100644 --- a/tests/testthat/test_simple_ensemble.R +++ b/tests/testthat/test_simple_ensemble.R @@ -2,9 +2,9 @@ test_that("simple_ensemble constructor", { # an empty workflow test_ens <- simple_ensemble() # has all the slots - expect_true (all(names(test_ens) == c("wflow_id", "workflow", "metrics"))) + expect_true(all(names(test_ens) == c("wflow_id", "workflow", "metrics"))) # but they are empty - expect_true (nrow(test_ens)==0) + expect_true(nrow(test_ens) == 0) }) test_that("add_member to empty simple ensemble", { @@ -12,22 +12,22 @@ test_that("add_member to empty simple ensemble", { none_mars <- workflowsets::extract_workflow_set_result(two_class_res, id = "none_mars") ## now add some models (the first 3) using default metric (which leads to a warning) expect_warning(test_ens <- simple_ensemble() %>% add_member(none_mars)) - expect_true (all(names(test_ens) == c("wflow_id", "workflow", "metrics"))) + expect_true(all(names(test_ens) == c("wflow_id", "workflow", "metrics"))) expect_true(nrow(test_ens) == 1) # check that we fetched the name correctly from the object - expect_true(test_ens$wflow_id=="none_mars") - expect_true(attr(test_ens,"best_metric") == "roc_auc") - expect_true(setequal(attr(test_ens,"metrics"), c("roc_auc","accuracy"))) + expect_true(test_ens$wflow_id == "none_mars") + expect_true(attr(test_ens, "best_metric") == "roc_auc") + expect_true(setequal(attr(test_ens, "metrics"), c("roc_auc", "accuracy"))) # now add another model none_glm <- workflowsets::extract_workflow_set_result(two_class_res, id = "none_glm") test_ens <- test_ens %>% add_member(none_glm) expect_true(nrow(test_ens) == 2) - expect_true(all(test_ens$wflow_id==c("none_mars","none_glm"))) + expect_true(all(test_ens$wflow_id == c("none_mars", "none_glm"))) # fail to readd the same workflow (same name) - expect_error(test_ens %>% add_member(none_glm),"x already has a member with the same name") + expect_error(test_ens %>% add_member(none_glm), "x already has a member with the same name") # error on using a different metric to choose the best model yj_trans_glm <- workflowsets::extract_workflow_set_result(two_class_res, id = "yj_trans_glm") - expect_error(test_ens %>% add_member(yj_trans_glm, metric="accuracy"),"the requested metric is not the same as the one previously used in x") + expect_error(test_ens %>% add_member(yj_trans_glm, metric = "accuracy"), "the requested metric is not the same as the one previously used in x") test_ens <- test_ens %>% add_member(yj_trans_glm, metric = "roc_auc") # check that autoplot successfully builds a plot @@ -36,17 +36,17 @@ test_that("add_member to empty simple ensemble", { # add a workflow expect_warning(test_ens_set <- - simple_ensemble() %>% add_member(two_class_res[c(3,2,5), ])) + simple_ensemble() %>% add_member(two_class_res[c(3, 2, 5), ])) expect_true(nrow(test_ens_set) == 3) - identical(test_ens$wflow_id, test_ens_set$wflow_id) + identical(test_ens$wflow_id, test_ens_set$wflow_id) # now create an ensemble not with the default metric test_ens <- simple_ensemble() %>% add_member(two_class_res[1:3, ], metric = "accuracy") - expect_true(attr(test_ens,"best_metric") == "accuracy") + expect_true(attr(test_ens, "best_metric") == "accuracy") p <- autoplot(test_ens) expect_true(inherits(p, "gg")) # give error if we request metric that does not exist expect_error(simple_ensemble() %>% - add_member(two_class_res[1:3, ], metric = "boyce_cont")) + add_member(two_class_res[1:3, ], metric = "boyce_cont")) }) diff --git a/tests/testthat/test_thin_by_cell_time.R b/tests/testthat/test_thin_by_cell_time.R index ad659ca1..0830a018 100644 --- a/tests/testthat/test_thin_by_cell_time.R +++ b/tests/testthat/test_thin_by_cell_time.R @@ -1,71 +1,95 @@ # set up a small world # small grid library(terra) -grid_raster <- terra::rast(matrix(1:16, ncol=4,byrow=TRUE), - extent=terra::ext(c(-2,2,-2,2)), - crs="epsg:4326") +grid_raster <- terra::rast(matrix(1:16, ncol = 4, byrow = TRUE), + extent = terra::ext(c(-2, 2, -2, 2)), + crs = "epsg:4326" +) -terra::add(grid_raster)<- grid_raster +terra::add(grid_raster) <- grid_raster # locations (first is off to the side, then two pairs to each other -locations <- data.frame(lon=c(-1.5, -0.3, -0.6, 1.9, 1.4), - lat=c(-1.8, 0.2, 0.8, -1.8, -1.5), - time_bp=c(0,0,0,-10,-10), - id = 1:5) +locations <- data.frame( + lon = c(-1.5, -0.3, -0.6, 1.9, 1.4), + lat = c(-1.8, 0.2, 0.8, -1.8, -1.5), + time_bp = c(0, 0, 0, -10, -10), + id = 1:5 +) -test_that("thin_by_dist_time removes the correct points", { +test_that("thin_by_cell_time removes the correct points", { # with a data.frame that does not really involve time - expect_error(thin_by_cell_time(locations, - raster = grid_raster, - time_col="time_bp", - lubridate_fun = ybp2date), - "`raster` does not have a time dimension") - pastclim::time_bp(grid_raster)<-c(0,-10) + expect_error( + thin_by_cell_time(locations, + raster = grid_raster, + time_col = "time_bp", + lubridate_fun = pastclim::ybp2date + ), + "`raster` does not have a time dimension" + ) + pastclim::time_bp(grid_raster) <- c(0, -10) set.seed(123) thin_100k <- thin_by_cell_time(locations, - raster = grid_raster, - time_col="time_bp", - lubridate_fun = ybp2date) - expect_true(inherits(thin_100k,"data.frame")) - expect_false(inherits(thin_100k,"sf")) + raster = grid_raster, + time_col = "time_bp", + lubridate_fun = pastclim::ybp2date + ) + expect_true(inherits(thin_100k, "data.frame")) + expect_false(inherits(thin_100k, "sf")) # we lose onepoint in each pair - expect_true(setequal(thin_100k$id,c(1,2,4))) + expect_true(setequal(thin_100k$id, c(1, 2, 4))) # now set the times to prevent points 2 and 3 to overlap - locations$time_bp=c(0,0,-10,-10,-10) + locations$time_bp <- c(0, 0, -10, -10, -10) set.seed(123) thin_100k_t <- thin_by_cell_time(locations, - raster = grid_raster, - time_col="time_bp", - lubridate_fun = ybp2date) + raster = grid_raster, + time_col = "time_bp", + lubridate_fun = pastclim::ybp2date + ) # we should now have the first pair, but lose one of the last two - expect_true(setequal(thin_100k_t$id,c(1,2,3,5))) + expect_true(setequal(thin_100k_t$id, c(1, 2, 3, 5))) # repeat with an sf object set.seed(123) - locations_sf <- sf::st_as_sf(locations, coords=c("lon","lat")) %>% sf::st_set_crs(4326) + locations_sf <- sf::st_as_sf(locations, coords = c("lon", "lat")) %>% sf::st_set_crs(4326) thin_100k_t_sf <- thin_by_cell_time(locations_sf, - raster = grid_raster, - time_col="time_bp", - lubridate_fun = ybp2date) - expect_true(inherits(thin_100k_t_sf,"sf")) - expect_true(inherits(thin_100k_t_sf,"data.frame")) # it is also a df! - expect_true(all(thin_100k_t$id ==thin_100k_t_sf$id)) - + raster = grid_raster, + time_col = "time_bp", + lubridate_fun = pastclim::ybp2date + ) + expect_true(inherits(thin_100k_t_sf, "sf")) + expect_true(inherits(thin_100k_t_sf, "data.frame")) # it is also a df! + expect_true(all(thin_100k_t$id == thin_100k_t_sf$id)) + + # check that the function can handle a sf object with X, Y columns + locations_xy <- locations_sf %>% dplyr::bind_cols(sf::st_coordinates(.)) + expect_no_error(thin_by_cell_time(locations_xy, + raster = grid_raster, + time_col = "time_bp", + lubridate_fun = pastclim::ybp2date + )) + locations_xy$X <- rep(NA) + expect_warning( + thin_by_cell(locations_xy, + raster = grid_raster + ), + "sf object contained 'X' and 'Y' coordinates that did not match the sf point geometry" + ) + # now use a SpatRasterDataset raster_list <- list(bio01 = grid_raster, bio10 = grid_raster) grid_sds <- terra::sds(raster_list) set.seed(123) thin_100k_sd <- thin_by_cell_time(locations_sf, - raster = grid_sds, - time_col="time_bp", - lubridate_fun = ybp2date) - expect_true(inherits(thin_100k_sd,"sf")) - expect_true(all(thin_100k_t$id ==thin_100k_sd$id)) - + raster = grid_sds, + time_col = "time_bp", + lubridate_fun = pastclim::ybp2date + ) + expect_true(inherits(thin_100k_sd, "sf")) + expect_true(all(thin_100k_t$id == thin_100k_sd$id)) }) # sample code to plot the small world to inspect what is going on -#plot(grid_raster,colNA="darkgray") -#polys(terra::as.polygons(grid_raster)) -#points(vect(locations), col="red", cex=2) +# plot(grid_raster,colNA="darkgray") +# polys(terra::as.polygons(grid_raster)) +# points(vect(locations), col="red", cex=2) diff --git a/tests/testthat/test_thin_by_dist.R b/tests/testthat/test_thin_by_dist.R index 501594e4..d9c7c5cf 100644 --- a/tests/testthat/test_thin_by_dist.R +++ b/tests/testthat/test_thin_by_dist.R @@ -1,35 +1,37 @@ # set up a small world # small grid -#grid_raster <- terra::rast(matrix(1:16, ncol=4,byrow=TRUE), +# grid_raster <- terra::rast(matrix(1:16, ncol=4,byrow=TRUE), # extent=terra::ext(c(-2,2,-2,2)), # crs="epsg:4326") # locations (first is off to the side, then two close to each other, and # then two points in unique but closeby cells) -locations <- data.frame(lon=c(-1.5, -0.3, -0.6, 1.9, 1.4), - lat=c(-1.8, 0.2, 0.8, -1.8, -0.5), - id = 1:5) +locations <- data.frame( + lon = c(-1.5, -0.3, -0.6, 1.9, 1.4), + lat = c(-1.8, 0.2, 0.8, -1.8, -0.5), + id = 1:5 +) test_that("thin_by_dist removes the correct points", { # with a data.frame set.seed(123) thin_100k <- thin_by_dist(locations, dist_min = 100000) - expect_true(inherits(thin_100k,"data.frame")) - expect_false(inherits(thin_100k,"sf")) + expect_true(inherits(thin_100k, "data.frame")) + expect_false(inherits(thin_100k, "sf")) # we lose one of the points close to each other - expect_true(setequal(thin_100k$id,c(1,3,4,5))) + expect_true(setequal(thin_100k$id, c(1, 3, 4, 5))) # now keep NA thin_200k <- thin_by_dist(locations, dist_min = 200000) # we now also lose one of the points in adjacent cells - expect_true(setequal(thin_200k$id,c(1,3,5))) + expect_true(setequal(thin_200k$id, c(1, 3, 5))) # repeat with an sf object set.seed(123) - locations_sf <- sf::st_as_sf(locations, coords=c("lon","lat")) %>% sf::st_set_crs(4326) + locations_sf <- sf::st_as_sf(locations, coords = c("lon", "lat")) %>% sf::st_set_crs(4326) thin_100k_sf <- thin_by_dist(locations_sf, dist_min = 100000) - expect_true(inherits(thin_100k_sf,"sf")) - expect_true(inherits(thin_100k_sf,"data.frame")) # it is also a df! - expect_true(all(thin_100k$id ==thin_100k_sf$id)) + expect_true(inherits(thin_100k_sf, "sf")) + expect_true(inherits(thin_100k_sf, "data.frame")) # it is also a df! + expect_true(all(thin_100k$id == thin_100k_sf$id)) }) # sample code to plot the small world to inspect what is going on diff --git a/tests/testthat/test_thin_by_dist_time.R b/tests/testthat/test_thin_by_dist_time.R index 522f8b8a..2897033c 100644 --- a/tests/testthat/test_thin_by_dist_time.R +++ b/tests/testthat/test_thin_by_dist_time.R @@ -1,49 +1,57 @@ # set up a small world # small grid -#library(terra) -#grid_raster <- terra::rast(matrix(1:16, ncol=4,byrow=TRUE), +# library(terra) +# grid_raster <- terra::rast(matrix(1:16, ncol=4,byrow=TRUE), # extent=terra::ext(c(-2,2,-2,2)), # crs="epsg:4326") # locations (first is off to the side, then two close to each other, and # then two points in unique but closeby cells) -locations <- data.frame(lon=c(-1.5, -0.3, -0.6, 1.9, 1.4), - lat=c(-1.8, 0.2, 0.8, -1.8, -0.5), - time_bp=c(0,0,0,0,0), - id = 1:5) +locations <- data.frame( + lon = c(-1.5, -0.3, -0.6, 1.9, 1.4), + lat = c(-1.8, 0.2, 0.8, -1.8, -0.5), + time_bp = c(0, 0, 0, 0, 0), + id = 1:5 +) test_that("thin_by_dist_time removes the correct points", { # with a data.frame that does not really involve time set.seed(123) - thin_100k <- thin_by_dist_time(locations, dist_min = 100000, - interval_min = 365*2000, - time_col="time_bp", - lubridate_fun = ybp2date) - expect_true(inherits(thin_100k,"data.frame")) - expect_false(inherits(thin_100k,"sf")) + thin_100k <- thin_by_dist_time(locations, + dist_min = 100000, + interval_min = 365 * 2000, + time_col = "time_bp", + lubridate_fun = pastclim::ybp2date + ) + expect_true(inherits(thin_100k, "data.frame")) + expect_false(inherits(thin_100k, "sf")) # we lose one of the points close to each other - expect_true(setequal(thin_100k$id,c(1,3,4,5))) + expect_true(setequal(thin_100k$id, c(1, 3, 4, 5))) # now set the times to prevent points 2 and 3 to overlap - locations$time_bp=c(0,-10000,-15000,-10000,-5000) + locations$time_bp <- c(0, -10000, -15000, -10000, -5000) set.seed(123) - thin_100k_t <- thin_by_dist_time(locations, dist_min = 100000, - interval_min = 365*2000, - time_col="time_bp", - lubridate_fun = ybp2date) + thin_100k_t <- thin_by_dist_time(locations, + dist_min = 100000, + interval_min = 365 * 2000, + time_col = "time_bp", + lubridate_fun = pastclim::ybp2date + ) # we should now get everything back - expect_true(setequal(thin_100k_t$id,c(1,2,3,4,5))) + expect_true(setequal(thin_100k_t$id, c(1, 2, 3, 4, 5))) # repeat with an sf object set.seed(123) - locations_sf <- sf::st_as_sf(locations, coords=c("lon","lat")) %>% sf::st_set_crs(4326) - thin_100k_t_sf <- thin_by_dist_time(locations_sf, dist_min = 100000, - interval_min = 365*2000, - time_col="time_bp", - lubridate_fun = ybp2date) - expect_true(inherits(thin_100k_t_sf,"sf")) - expect_true(inherits(thin_100k_t_sf,"data.frame")) # it is also a df! - expect_true(all(thin_100k_t$id ==thin_100k_t_sf$id)) + locations_sf <- sf::st_as_sf(locations, coords = c("lon", "lat")) %>% sf::st_set_crs(4326) + thin_100k_t_sf <- thin_by_dist_time(locations_sf, + dist_min = 100000, + interval_min = 365 * 2000, + time_col = "time_bp", + lubridate_fun = pastclim::ybp2date + ) + expect_true(inherits(thin_100k_t_sf, "sf")) + expect_true(inherits(thin_100k_t_sf, "data.frame")) # it is also a df! + expect_true(all(thin_100k_t$id == thin_100k_t_sf$id)) }) # sample code to plot the small world to inspect what is going on diff --git a/tests/testthat/test_tss.R b/tests/testthat/test_tss.R index 5ddb52b9..e44f3dd3 100644 --- a/tests/testthat/test_tss.R +++ b/tests/testthat/test_tss.R @@ -1,6 +1,8 @@ test_that("tss returns correct value", { - # tss is really a wrapper around the j_index, so we expect them to be identical - expect_identical(tss(two_class_example, truth, predicted)$.estimate, - yardstick::j_index(two_class_example, truth, predicted)$.estimate) - + # tss is really a wrapper around the j_index, + # so we expect them to be identical + expect_identical( + tss(two_class_example, truth, predicted)$.estimate, + yardstick::j_index(two_class_example, truth, predicted)$.estimate + ) }) diff --git a/tests/testthat/test_y2d.R b/tests/testthat/test_y2d.R index bd1a4c24..75e75fe2 100644 --- a/tests/testthat/test_y2d.R +++ b/tests/testthat/test_y2d.R @@ -1,5 +1,5 @@ test_that("y2d converts correctly", { - expect_true(y2d(1)==365) + expect_true(y2d(1) == 365) # we should have a number of leap years in a 1000 years - expect_true(y2d(1000)>365*1000) + expect_true(y2d(1000) > 365 * 1000) }) diff --git a/tests/testthat/test_ybp2date.R b/tests/testthat/test_ybp2date.R deleted file mode 100644 index cbf3dd06..00000000 --- a/tests/testthat/test_ybp2date.R +++ /dev/null @@ -1,8 +0,0 @@ -test_that("ybp2date converts correctly", { - # the reference year is 1950 - expect_true(lubridate::year(ybp2date(0))==1950) - expect_true(lubridate::year(ybp2date(-10000))==-8050) - # check correct back and forth - converted_date <- ybp2date(-10000) - expect_true(date2ybp(converted_date)==-10000) -}) diff --git a/tidysdm.Rproj b/tidysdm.Rproj deleted file mode 100644 index 21a4da08..00000000 --- a/tidysdm.Rproj +++ /dev/null @@ -1,17 +0,0 @@ -Version: 1.0 - -RestoreWorkspace: Default -SaveWorkspace: Default -AlwaysSaveHistory: Default - -EnableCodeIndexing: Yes -UseSpacesForTab: Yes -NumSpacesForTab: 2 -Encoding: UTF-8 - -RnwWeave: Sweave -LaTeX: pdfLaTeX - -BuildType: Package -PackageUseDevtools: Yes -PackageInstallArgs: --no-multiarch --with-keep.source diff --git a/vignettes/a0_tidysdm_overview.Rmd b/vignettes/a0_tidysdm_overview.Rmd index fa93e898..9692ddc8 100644 --- a/vignettes/a0_tidysdm_overview.Rmd +++ b/vignettes/a0_tidysdm_overview.Rmd @@ -13,6 +13,8 @@ knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) +options(cores=2) +options(mc.cores=2) ``` # SDMs with `tidymodels` @@ -26,7 +28,10 @@ ideal framework. `tidysdm` provides a number of wrappers and specialised functions to facilitate the fitting of SDM with `tidymodels`. This article provides an overview of the how `tidysdm` facilitates fitting -SDMs. As `tidysdm` relies on `tidymodels`, users are advised to familiarise +SDMs. Further articles, detailing how to use the package for palaeodata, +fitting more complex models and how to troubleshoot models can be found +on the [`tidisdm` website](https://evolecolgroup.github.io/tidysdm/). +As `tidysdm` relies on `tidymodels`, users are advised to familiarise themselves with the introductory tutorials on the [`tidymodels` website](https://www.tidymodels.org/start/). @@ -51,8 +56,8 @@ into an `sf` object, and set its projections to standard lonlat (crs = 4326). ```{r cast_to_sf} library(sf) -lacerta <- st_as_sf(lacerta, coords = c("longitude","latitude")) -st_crs(lacerta) = 4326 +lacerta <- st_as_sf(lacerta, coords = c("longitude", "latitude")) +st_crs(lacerta) <- 4326 ``` It is usually @@ -95,9 +100,11 @@ set_data_path(on_CRAN = TRUE) # Iberia peninsula extension iberia_poly <- terra::vect("POLYGON((-9.8 43.3,-7.8 44.1,-2.0 43.7,3.6 42.5,3.8 41.5,1.3 40.8,0.3 39.5,0.9 38.6,-0.4 37.5,-1.6 36.7,-2.3 36.3,-4.1 36.4,-4.5 36.4,-5.0 36.1,-5.6 36.0,-6.3 36.0,-7.1 36.9,-9.5 36.6,-9.4 38.0,-10.6 38.9,-9.5 40.8,-9.8 43.3))") -crs(iberia_poly)<-"lonlat" -gdal(warn=3) -land_mask<-rast(system.file("extdata/lacerta_land_mask.nc", package="tidysdm")) +crs(iberia_poly) <- "lonlat" +gdal(warn = 3) +land_mask <- rast(system.file("extdata/lacerta_land_mask.nc", + package = "tidysdm" +)) ``` For @@ -108,9 +115,8 @@ rasters with `ggplot` a breeze. library(tidyterra) library(ggplot2) ggplot() + - geom_spatraster(data=land_mask, aes(fill=land_mask_1985))+ + geom_spatraster(data = land_mask, aes(fill = land_mask_1985)) + geom_sf(data = lacerta) - ``` # Thinning step @@ -119,13 +125,13 @@ Now, we thin the observations to have one per cell in the raster (it would be be if we had an equal area projection...): ```{r thin_by_cell} set.seed(1234567) -lacerta<-thin_by_cell(lacerta, raster = land_mask) +lacerta <- thin_by_cell(lacerta, raster = land_mask) nrow(lacerta) ``` ```{r plot_thin_by_cell, fig.width=6, fig.height=4} ggplot() + - geom_spatraster(data=land_mask, aes(fill=land_mask_1985))+ + geom_spatraster(data = land_mask, aes(fill = land_mask_1985)) + geom_sf(data = lacerta) ``` @@ -134,14 +140,14 @@ the standard map units for a 'lonlat' projection are meters. `tidysdm` provides a convening conversion function, `km2m()`, to avoid having to write lots of zeroes): ```{r thin_by_dist} set.seed(1234567) -lacerta_thin<-thin_by_dist(lacerta, dist_min = km2m(20)) +lacerta_thin <- thin_by_dist(lacerta, dist_min = km2m(20)) nrow(lacerta_thin) ``` Let's see what we have left of our points: ```{r plot_thin_by_dist, fig.width=6, fig.height=4} ggplot() + - geom_spatraster(data=land_mask, aes(fill=land_mask_1985))+ + geom_spatraster(data = land_mask, aes(fill = land_mask_1985)) + geom_sf(data = lacerta_thin) ``` @@ -149,18 +155,18 @@ Now we sample pseudo-absences (we will constrain them to be at least 50km away from any presences), selecting as 3 times as many points as presences: ```{r sample_pseudoabs} set.seed(1234567) -lacerta_thin <- sample_pseudoabs(lacerta_thin, - n = 3 * nrow(lacerta_thin), - raster = land_mask, - method = c("dist_min", km2m(50))) +lacerta_thin <- sample_pseudoabs(lacerta_thin, + n = 3 * nrow(lacerta_thin), + raster = land_mask, + method = c("dist_min", km2m(50)) +) ``` Let's see our presences and absences: ```{r plot_sample_pseudoabs, fig.width=6, fig.height=4} ggplot() + - geom_spatraster(data=land_mask, aes(fill=land_mask_1985))+ + geom_spatraster(data = land_mask, aes(fill = land_mask_1985)) + geom_sf(data = lacerta_thin, aes(col = class)) - ``` Generally, we can use `pastclim` to check what variables are @@ -170,8 +176,10 @@ climate_vars <- get_vars_for_dataset("WorldClim_2.1_10m") ``` ```{r echo=FALSE, results='hide'} -gdal(warn=3) -climate_present<-rast(system.file("extdata/lacerta_climate_present_10m.nc", package="tidysdm")) +gdal(warn = 3) +climate_present <- rast(system.file("extdata/lacerta_climate_present_10m.nc", + package = "tidysdm" +)) climate_vars <- names(climate_present) ``` @@ -185,25 +193,26 @@ And then create a `terra` SpatRaster object. The dataset covers the period 1970- so `pastclim` dates it as 1985 (the midpoint). We can directly crop to the Iberian peninsula: ```{r climate_worldclim, eval=FALSE} -climate_present<-pastclim::region_slice(time_ce = 1985, - bio_variables = climate_vars, - data="WorldClim_2.1_10m", - crop=iberia_poly) +climate_present <- pastclim::region_slice( + time_ce = 1985, + bio_variables = climate_vars, + data = "WorldClim_2.1_10m", + crop = iberia_poly +) ``` We start by selecting variables for which presences are markedly different from the underlying background. First, let's extract climate for all presences and pseudo-absences: ```{r} -lacerta_thin <- lacerta_thin %>% - bind_cols(terra::extract(climate_present, lacerta_thin, ID=FALSE)) +lacerta_thin <- lacerta_thin %>% + bind_cols(terra::extract(climate_present, lacerta_thin, ID = FALSE)) ``` We can use violin plots to compare the distribution of the climatic variables for presences and pseudo-absences: ```{r fig.height=11, fig.width=7} lacerta_thin %>% plot_pres_vs_bg(class) - ``` We want to choose variables for which presences use values different from the background (pseudo-absences). We can qualitatively look at the plots, or use a quantitative approach that ranks them based on the @@ -217,8 +226,8 @@ between presences and pseudo-absences: ```{r} vars_to_keep <- lacerta_thin %>% dist_pres_vs_bg(class) -vars_to_keep <-names(vars_to_keep[vars_to_keep>0.30]) -lacerta_thin <-lacerta_thin %>% select(all_of(c(vars_to_keep, "class"))) +vars_to_keep <- names(vars_to_keep[vars_to_keep > 0.30]) +lacerta_thin <- lacerta_thin %>% select(all_of(c(vars_to_keep, "class"))) vars_to_keep ``` @@ -227,7 +236,7 @@ to be important for the distribution of the species of interest. Based on this paper (https://doi.org/10.1007/s10531-010-9865-2), we are interested in: ```{r climate_variables} -suggested_vars <- c("bio05","bio06", "bio13", "bio14", "bio15") +suggested_vars <- c("bio05", "bio06", "bio13", "bio14", "bio15") ``` Environmental variables are often highly correlated, and collinearity is an issue @@ -240,7 +249,7 @@ We can see that some variables have rather high correlation (e.g. bio05 vs bio14 We can subset to variables below a certain threshold correlation (e.g. 0.7) with: ```{r choose_var_cor_keep} -climate_present<-climate_present[[suggested_vars]] +climate_present <- climate_present[[suggested_vars]] vars_uncor <- filter_high_cor(climate_present, cutoff = 0.7) vars_uncor ``` @@ -248,8 +257,8 @@ vars_uncor So, removing bio14 leaves us with a set of uncorrelated variables. ```{r} -lacerta_thin <-lacerta_thin %>% select(all_of(c(vars_uncor, "class"))) -climate_present<-climate_present[[vars_uncor]] +lacerta_thin <- lacerta_thin %>% select(all_of(c(vars_uncor, "class"))) +climate_present <- climate_present[[vars_uncor]] ``` @@ -262,7 +271,7 @@ all other variables are `predictor`s; note that, for `sf` objects, `geometry` is automatically replaced by `X` and `Y` columns which are assigned a role of `coords`, and thus not used as predictors): ```{r recipe} -lacerta_rec <- recipe(lacerta_thin, formula=class~.) +lacerta_rec <- recipe(lacerta_thin, formula = class ~ .) lacerta_rec ``` @@ -295,7 +304,7 @@ lacerta_models <- # boosted tree model (gbm) specs with tuning gbm = sdm_spec_boost_tree(), # maxent specs with tuning - maxent =sdm_spec_maxent() + maxent = sdm_spec_maxent() ), # make all combinations of preproc and models, cross = TRUE @@ -324,18 +333,21 @@ tune and assess the models (to keep computations fast, we will only explore 3 combination of hyperparameters per model; this is far too little in real life!): ```{r tune_grid} set.seed(1234567) -lacerta_models <- - lacerta_models %>% - workflow_map("tune_grid", resamples = lacerta_cv, grid = 3, - metrics = sdm_metric_set(), verbose = TRUE) +lacerta_models <- + lacerta_models %>% + workflow_map("tune_grid", + resamples = lacerta_cv, grid = 3, + metrics = sdm_metric_set(), verbose = TRUE + ) ``` Note that `workflow_set` correctly detects that we have no tuning parameters for *glm*. We can have a look at the performance of our models with: -```{r autoplot_models, fig.width=6, fig.height=4} +```{r autoplot_models, fig.width=7, fig.height=4} autoplot(lacerta_models) ``` + Now let's create an ensemble, selecting the best set of parameters for each model (this is really only relevant for the random forest, as there were not hype-parameters to tune for the glm and gam). We will use the Boyce continuous index as our metric @@ -344,12 +356,12 @@ automatically fitted to the full training dataset, and so ready to make predicti ```{r} lacerta_ensemble <- simple_ensemble() %>% - add_member(lacerta_models, metric="boyce_cont") + add_member(lacerta_models, metric = "boyce_cont") lacerta_ensemble ``` And visualise it -```{r autoplot_ens, fig.width=6, fig.height=4} +```{r autoplot_ens, fig.width=7, fig.height=4} autoplot(lacerta_ensemble) ``` @@ -360,10 +372,10 @@ the mean of the predictions from each model). ```{r plot_present, fig.width=6, fig.height=4} prediction_present <- predict_raster(lacerta_ensemble, climate_present) ggplot() + - geom_spatraster(data=prediction_present, aes(fill=mean))+ + geom_spatraster(data = prediction_present, aes(fill = mean)) + scale_fill_terrain_c() + # plot presences used in the model - geom_sf(data = lacerta_thin %>% filter(class=="presence")) + geom_sf(data = lacerta_thin %>% filter(class == "presence")) ``` We can subset the ensemble to only use the best models, based on the Boyce continuous index, @@ -374,32 +386,33 @@ quite consistent). ```{r plot_present_best, fig.width=6, fig.height=4} prediction_present_boyce <- predict_raster(lacerta_ensemble, climate_present, - metric_thresh = c("boyce_cont", 0.8), - fun="median") + metric_thresh = c("boyce_cont", 0.8), + fun = "median" +) ggplot() + - geom_spatraster(data=prediction_present_boyce, aes(fill=median))+ + geom_spatraster(data = prediction_present_boyce, aes(fill = median)) + scale_fill_terrain_c() + - geom_sf(data = lacerta_thin %>% filter(class=="presence")) - + geom_sf(data = lacerta_thin %>% filter(class == "presence")) ``` Sometimes, it is desirable to have binary predictions (presence vs absence), rather than the probability of occurrence. To do so, we first need to calibrate the threshold used to convert probabilities into classes (in this case, we optimise the TSS): ```{r} -lacerta_ensemble<-calib_class_thresh(lacerta_ensemble, - class_thresh = "tss_max") +lacerta_ensemble <- calib_class_thresh(lacerta_ensemble, + class_thresh = "tss_max" +) ``` And now we can predict for the whole continent: ```{r, fig.width=6, fig.height=4} -prediction_present_binary <- predict_raster(lacerta_ensemble, - climate_present, - type="class", - class_thresh = c("tss_max")) +prediction_present_binary <- predict_raster(lacerta_ensemble, + climate_present, + type = "class", + class_thresh = c("tss_max") +) ggplot() + - geom_spatraster(data=prediction_present_binary, aes(fill=binary_mean))+ - geom_sf(data = lacerta_thin %>% filter(class=="presence")) - + geom_spatraster(data = prediction_present_binary, aes(fill = binary_mean)) + + geom_sf(data = lacerta_thin %>% filter(class == "presence")) ``` # Projecting to the future @@ -428,7 +441,6 @@ get_vars_for_dataset("WorldClim_2.1_HadGEM3-GC31-LL_ssp245_10m") ```{r echo=FALSE} climate_vars[-length(climate_vars)] - ``` Note that future predictions do not include *altitude* (as that does not change with time), @@ -436,16 +448,19 @@ so if we needed it, we would have to copy it over from the present. However, it is not in our set of uncorrelated variables that we used earlier, so we don't need to worry about it. ```{r eval=FALSE} -climate_future<-pastclim::region_slice(time_ce = 2090, - bio_variables = vars_uncor, - data="WorldClim_2.1_HadGEM3-GC31-LL_ssp245_10m", - crop=iberia_poly) +climate_future <- pastclim::region_slice( + time_ce = 2090, + bio_variables = vars_uncor, + data = "WorldClim_2.1_HadGEM3-GC31-LL_ssp245_10m", + crop = iberia_poly +) ``` ```{r echo=FALSE, results='asis'} -gdal(warn=3) +gdal(warn = 3) climate_future <- rast(system.file("extdata/lacerta_climate_future_10m.nc", - package="tidysdm")) + package = "tidysdm" +)) ``` @@ -454,9 +469,8 @@ And predict using the ensemble: prediction_future <- predict_raster(lacerta_ensemble, climate_future) ggplot() + - geom_spatraster(data=prediction_future, aes(fill=mean))+ + geom_spatraster(data = prediction_future, aes(fill = mean)) + scale_fill_terrain_c() - ``` # Visualising the contribution of individual variables @@ -473,8 +487,8 @@ against the values of the variable of interest. For example, to investigate the contribution of `bio05`, we would: ```{r} -bio05_prof <- lacerta_rec %>% - step_profile(-bio05, profile=vars(bio05)) %>% +bio05_prof <- lacerta_rec %>% + step_profile(-bio05, profile = vars(bio05)) %>% prep(training = lacerta_thin) bio05_data <- bake(bio05_prof, new_data = NULL) @@ -506,47 +520,50 @@ SDM pipeline. We will just use two fast models to speed up the process. # empty object to store the simple ensembles that we will create ensemble_list <- list() set.seed(123) # make sure you set the seed OUTSIDE the loop -for (i_repeat in 1:3){ +for (i_repeat in 1:3) { # thin the data - lacerta_thin_rep<-thin_by_cell(lacerta, raster = climate_present) - lacerta_thin_rep<-thin_by_dist(lacerta_thin_rep, dist_min = 20000) - # sample pseudo-absences + lacerta_thin_rep <- thin_by_cell(lacerta, raster = climate_present) + lacerta_thin_rep <- thin_by_dist(lacerta_thin_rep, dist_min = 20000) + # sample pseudo-absences lacerta_thin_rep <- sample_pseudoabs(lacerta_thin_rep, - n=3*nrow(lacerta_thin_rep), - raster=climate_present, - method=c("dist_min", 50000)) + n = 3 * nrow(lacerta_thin_rep), + raster = climate_present, + method = c("dist_min", 50000) + ) # get climate lacerta_thin_rep <- lacerta_thin_rep %>% - bind_cols(terra::extract(climate_present, lacerta_thin_rep, ID=FALSE)) - # create folds + bind_cols(terra::extract(climate_present, lacerta_thin_rep, ID = FALSE)) + # create folds lacerta_thin_rep_cv <- spatial_block_cv(lacerta_thin_rep, v = 5) # create a recipe - lacerta_thin_rep_rec <- recipe(lacerta_thin_rep, formula=class~.) + lacerta_thin_rep_rec <- recipe(lacerta_thin_rep, formula = class ~ .) # create a workflow_set lacerta_thin_rep_models <- - # create the workflow_set - workflow_set( - preproc = list(default = lacerta_thin_rep_rec), - models = list( - # the standard glm specs - glm = sdm_spec_glm(), - # maxent specs with tuning - maxent =sdm_spec_maxent() - ), - # make all combinations of preproc and models, - cross = TRUE - ) %>% - # tweak controls to store information needed later to create the ensemble - option_add(control = control_ensemble_grid()) - -# train the model + # create the workflow_set + workflow_set( + preproc = list(default = lacerta_thin_rep_rec), + models = list( + # the standard glm specs + glm = sdm_spec_glm(), + # maxent specs with tuning + maxent = sdm_spec_maxent() + ), + # make all combinations of preproc and models, + cross = TRUE + ) %>% + # tweak controls to store information needed later to create the ensemble + option_add(control = control_ensemble_grid()) + + # train the model lacerta_thin_rep_models <- - lacerta_thin_rep_models %>% - workflow_map("tune_grid", resamples = lacerta_thin_rep_cv, grid = 10, - metrics = sdm_metric_set(), verbose = TRUE) + lacerta_thin_rep_models %>% + workflow_map("tune_grid", + resamples = lacerta_thin_rep_cv, grid = 10, + metrics = sdm_metric_set(), verbose = TRUE + ) # make an simple ensemble and add it to the list -ensemble_list[[i_repeat]] <- simple_ensemble() %>% - add_member(lacerta_thin_rep_models, metric="boyce_cont") + ensemble_list[[i_repeat]] <- simple_ensemble() %>% + add_member(lacerta_thin_rep_models, metric = "boyce_cont") } ``` @@ -559,9 +576,9 @@ lacerta_thin_rep_ens We can then predict in the usual way (we will take the mean and median of all models): ```{r, fig.width=6, fig.height=4} lacerta_thin_rep_ens <- predict_raster(lacerta_thin_rep_ens, climate_present, - fun=c("mean","median")) + fun = c("mean", "median") +) ggplot() + - geom_spatraster(data=lacerta_thin_rep_ens, aes(fill=median))+ + geom_spatraster(data = lacerta_thin_rep_ens, aes(fill = median)) + scale_fill_terrain_c() - ``` diff --git a/vignettes/a1_palaeodata_application.Rmd b/vignettes/a1_palaeodata_application.Rmd index bafc6661..da10aa4f 100644 --- a/vignettes/a1_palaeodata_application.Rmd +++ b/vignettes/a1_palaeodata_application.Rmd @@ -13,6 +13,8 @@ knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) +options(cores=2) +options(mc.cores=2) ``` # SDMs with tidymodels for palaeo data @@ -41,8 +43,8 @@ We convert our dataset into an `sf` data.frame so that we can easily plot it (here `tidyterra` shines): ```{r} library(sf) -horses <- st_as_sf(horses, coords = c("longitude","latitude")) -st_crs(horses) = 4326 +horses <- st_as_sf(horses, coords = c("longitude", "latitude")) +st_crs(horses) <- 4326 ``` As a background to our presences, we will use the land mask for the present, @@ -54,7 +56,7 @@ set_data_path(on_CRAN = TRUE) ```{r} library(pastclim) -land_mask <- pastclim::get_land_mask(time_bp=0,dataset="Example") +land_mask <- pastclim::get_land_mask(time_bp = 0, dataset = "Example") europe_poly <- vect(region_outline$Europe) crs(europe_poly) <- "lonlat" land_mask <- crop(land_mask, europe_poly) @@ -62,12 +64,12 @@ land_mask <- mask(land_mask, europe_poly) ``` And use `tidyterra` to plot: -```{r cast to sf, fig.width=6, fig.height=4} +```{r cast_to_sf, fig.width=6, fig.height=4} library(tidyterra) ggplot() + - geom_spatraster(data=land_mask, aes(fill=land_mask_0))+ + geom_spatraster(data = land_mask, aes(fill = land_mask_0)) + scale_fill_terrain_c() + - geom_sf(data = horses, aes(col=time_bp)) + geom_sf(data = horses, aes(col = time_bp)) ``` We now thin our presences, so that locations are further than 100km and @@ -75,19 +77,21 @@ We now thin our presences, so that locations are further than 100km and ```{r thin_by_dist} set.seed(123) -horses<-thin_by_dist_time(horses, dist_min = km2m(100), - interval_min = y2d(2000), - time_col="time_bp", - lubridate_fun = ybp2date) +horses <- thin_by_dist_time(horses, + dist_min = km2m(100), + interval_min = y2d(2000), + time_col = "time_bp", + lubridate_fun = pastclim::ybp2date +) nrow(horses) ``` And see what we have left: ```{r plot_thinned, fig.width=6, fig.height=4} ggplot() + - geom_spatraster(data=land_mask, aes(fill=land_mask_0))+ + geom_spatraster(data = land_mask, aes(fill = land_mask_0)) + scale_fill_terrain_c() + - geom_sf(data = horses, aes(col=time_bp)) + geom_sf(data = horses, aes(col = time_bp)) ``` We now need a time series of palaeoclimate reconstructions. In this vignette, @@ -100,10 +104,12 @@ Europe only: ```{r load_climate} library(pastclim) -climate_vars <-c("bio01", "bio10", "bio12") -climate_full<-pastclim::region_series(bio_variables = climate_vars, - data="Example", - crop= region_outline$Europe) +climate_vars <- c("bio01", "bio10", "bio12") +climate_full <- pastclim::region_series( + bio_variables = climate_vars, + data = "Example", + crop = region_outline$Europe +) ``` Now we thin the observations to only keep one per cell in the raster (it would be better @@ -111,37 +117,39 @@ if we had an equal area projection...), and remove locations outside the desired area (if there was any): ```{r thin_by_cell} set.seed(123) -horses<-thin_by_cell_time(horses, raster = climate_full, - time_col="time_bp", - lubridate_fun = ybp2date) +horses <- thin_by_cell_time(horses, + raster = climate_full, + time_col = "time_bp", + lubridate_fun = pastclim::ybp2date +) nrow(horses) ``` Let's see what we have left of our points: ```{r, fig.width=6, fig.height=4} ggplot() + - geom_spatraster(data=land_mask, aes(fill=land_mask_0))+ + geom_spatraster(data = land_mask, aes(fill = land_mask_0)) + scale_fill_terrain_c() + - geom_sf(data = horses, aes(col=time_bp)) + geom_sf(data = horses, aes(col = time_bp)) ``` Now we sample pseudo-absences (we will constraint them to be at least 70km away from any presences), selecting three times the number of presences ```{r} set.seed(123) -horses <- sample_pseudoabs_time(horses, - n_per_presence=3, - raster=climate_full, - time_col="time_bp", - lubridate_fun = ybp2date, - method=c("dist_min", km2m(70)) +horses <- sample_pseudoabs_time(horses, + n_per_presence = 3, + raster = climate_full, + time_col = "time_bp", + lubridate_fun = pastclim::ybp2date, + method = c("dist_min", km2m(70)) ) ``` Let's see our presences and absences: ```{r, fig.width=6, fig.height=4} ggplot() + - geom_spatraster(data=land_mask, aes(fill=land_mask_0))+ + geom_spatraster(data = land_mask, aes(fill = land_mask_0)) + scale_fill_terrain_c() + geom_sf(data = horses, aes(col = class)) ``` @@ -153,17 +161,18 @@ values represent time in the past). We manipulate the `sf` object accordingly: ```{r climate_for_locations} horses_df <- horses %>% dplyr::bind_cols(sf::st_coordinates(horses)) %>% - mutate (time_bp=date2ybp(time_step)) %>% + mutate(time_bp = date2ybp(time_step)) %>% as.data.frame() %>% - select(-geometry) + select(-geometry) # get climate -horses_df <- location_slice_from_region_series(horses_df, - region_series = climate_full) +horses_df <- location_slice_from_region_series(horses_df, + region_series = climate_full +) # add the climate reconstructions to the sf object, and remove the time_step # as we don't need it for modelling horses <- horses %>% - bind_cols(horses_df[,climate_vars]) %>% + bind_cols(horses_df[, climate_vars]) %>% select(-time_step) ``` @@ -175,7 +184,7 @@ need to define the formula (*class* is the outcome, all other variables are predictors; note that, for `sf` objects, `geometry` is automatically ignored as a predictor): ```{r recipe} -horses_rec <- recipe(horses, formula=class~.) +horses_rec <- recipe(horses, formula = class ~ .) horses_rec ``` @@ -211,8 +220,9 @@ horses_models <- ) %>% # set formula for gams update_workflow_model("default_gam", - spec = sdm_spec_gam(), - formula = gam_formula(horses_rec)) %>% + spec = sdm_spec_gam(), + formula = gam_formula(horses_rec) + ) %>% # tweak controls to store information needed later to create the ensemble option_add(control = control_ensemble_grid()) ``` @@ -235,10 +245,12 @@ We can now use the block CV folds to tune and assess the models: ```{r tune_grid} set.seed(123) -horses_models <- - horses_models %>% - workflow_map("tune_grid", resamples = horses_cv, grid = 5, - metrics = sdm_metric_set(), verbose = TRUE) +horses_models <- + horses_models %>% + workflow_map("tune_grid", + resamples = horses_cv, grid = 5, + metrics = sdm_metric_set(), verbose = TRUE + ) ``` Note that `workflow_set` correctly detects that we have no tuning parameters for @@ -255,7 +267,7 @@ to choose the best random forest and boosted tree. When adding members to an ens automatically fitted to the full training dataset, and so ready to make predictions. ```{r} horses_ensemble <- simple_ensemble() %>% - add_member(horses_models, metric="boyce_cont") + add_member(horses_models, metric = "boyce_cont") ``` And visualise it diff --git a/vignettes/a2_tidymodels_additions.Rmd b/vignettes/a2_tidymodels_additions.Rmd index 3e852826..a9d53b93 100644 --- a/vignettes/a2_tidymodels_additions.Rmd +++ b/vignettes/a2_tidymodels_additions.Rmd @@ -13,6 +13,8 @@ knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) +options(cores=2) +options(mc.cores=2) ``` # Additional features of `tidymodels` @@ -76,7 +78,10 @@ The resulting list can be then used to build lists of explanations, which can then be plotted. ```{r profile, fig.width=6, fig.height=4} -profile_list <- lapply(explainer_list,model_profile, N = 500, variables = "bio05") +profile_list <- lapply(explainer_list, model_profile, + N = 500, + variables = "bio05" +) plot(profile_list) ``` @@ -95,7 +100,8 @@ analogous to the one that we generated in the [`tidysdm` overview](https://evole library(tidysdm) library(sf) lacerta_thin <- readRDS(system.file("extdata/lacerta_climate_sf.RDS", - package="tidysdm")) + package = "tidysdm" +)) ``` We then use `spatial_initial_split` to do the split, using a `spatial_block_cv` @@ -103,7 +109,9 @@ scheme to partition the data: ```{r initial_split, fig.width=6, fig.height=4} set.seed(1005) -lacerta_initial <- spatial_initial_split(lacerta_thin, prop = 1/5, spatial_block_cv) +lacerta_initial <- spatial_initial_split(lacerta_thin, + prop = 1 / 5, spatial_block_cv +) autoplot(lacerta_initial) ``` @@ -115,9 +123,11 @@ we used for the `initial_split`). set.seed(1005) library(sf) lacerta_training <- training(lacerta_initial) -lacerta_cv <- spatial_block_cv(lacerta_training, v = 5, - cellsize = grid_cellsize(lacerta_thin), - offset = grid_offset(lacerta_thin)) +lacerta_cv <- spatial_block_cv(lacerta_training, + v = 5, + cellsize = grid_cellsize(lacerta_thin), + offset = grid_offset(lacerta_thin) +) autoplot(lacerta_cv) ``` @@ -129,8 +139,13 @@ we will create two recipes, one with all variables, and one only with the variables that are uncorrelated: ```{r recipe} -lacerta_rec_all <- recipe(lacerta_thin, formula=class~.) -lacerta_rec_uncor <- lacerta_rec_all %>% step_rm(all_of( c("bio01", "bio02", "bio03", "bio04", "bio07", "bio08", "bio09", "bio10", "bio11", "bio12", "bio14", "bio16", "bio17", "bio18", "bio19", "altitude"))) +lacerta_rec_all <- recipe(lacerta_thin, formula = class ~ .) +lacerta_rec_uncor <- lacerta_rec_all %>% + step_rm(all_of(c( + "bio01", "bio02", "bio03", "bio04", "bio07", "bio08", + "bio09", "bio10", "bio11", "bio12", "bio14", "bio16", + "bio17", "bio18", "bio19", "altitude" + ))) lacerta_rec_uncor ``` @@ -145,9 +160,10 @@ for creating a model specification. However, we can use a standard model spec fr lacerta_models <- # create the workflow_set workflow_set( - preproc = list(uncor = lacerta_rec_uncor, # recipe for the glm - all = lacerta_rec_all, # recipe for the random forest - all = lacerta_rec_uncor # recipe for svm + preproc = list( + uncor = lacerta_rec_uncor, # recipe for the glm + all = lacerta_rec_all, # recipe for the random forest + all = lacerta_rec_uncor # recipe for svm ), models = list( # the standard glm specs @@ -155,8 +171,10 @@ lacerta_models <- # rf specs with tuning rf = sdm_spec_rf(), # svm specs with tuning - svm = parsnip::svm_poly(cost = tune(), - degree = tune()) %>% + svm = parsnip::svm_poly( + cost = tune(), + degree = tune() + ) %>% parsnip::set_engine("kernlab") %>% parsnip::set_mode("classification") ), @@ -186,26 +204,27 @@ informing the set dials with the actual data: ```{r} rf_param <- lacerta_models %>% # extract the rf workflow - extract_workflow ("all_rf") %>% + extract_workflow("all_rf") %>% # extract its parameters dials (used to tune) extract_parameter_set_dials() %>% # give it the predictors to finalize mtry - finalize(x=st_drop_geometry(lacerta_thin) %>% select(-class)) + finalize(x = st_drop_geometry(lacerta_thin) %>% select(-class)) # now update the workflowset with the new parameter info lacerta_models <- lacerta_models %>% - option_add(param_info=rf_param,id="all_rf") - + option_add(param_info = rf_param, id = "all_rf") ``` And now we can tune the models: ```{r tune_grid} set.seed(1234567) -lacerta_models <- - lacerta_models %>% - workflow_map("tune_bayes", resamples = lacerta_cv, initial=8, - metrics = sdm_metric_set(), verbose = TRUE) +lacerta_models <- + lacerta_models %>% + workflow_map("tune_bayes", + resamples = lacerta_cv, initial = 8, + metrics = sdm_metric_set(), verbose = TRUE + ) ``` We can have a look at the performance of our models with: @@ -224,7 +243,7 @@ multiple versions of the same algorithm with different hyper-parameters. ```{r build_stack, fig.width=6, fig.height=4} library(stacks) set.seed(1005) -lacerta_stack <- +lacerta_stack <- # initialize the stack stacks() %>% # add candidate members @@ -245,9 +264,9 @@ testing data: ```{r predict_test} lacerta_testing <- testing(lacerta_initial) -lacerta_test_pred <- +lacerta_test_pred <- lacerta_testing %>% - bind_cols(predict(lacerta_stack, ., type="prob")) + bind_cols(predict(lacerta_stack, ., type = "prob")) ``` And look at the goodness of fit using some commonly used sdm metrics. Note that @@ -255,39 +274,49 @@ And look at the goodness of fit using some commonly used sdm metrics. Note that on the data. ```{r assess_test} -sdm_metric_set()(data= lacerta_test_pred,truth=class,.pred_presence) +sdm_metric_set()(data = lacerta_test_pred, truth = class, .pred_presence) ``` We can now make predictions with this stacked ensemble. We start by extracting the climate for the variables of interest ```{r eval=FALSE} download_dataset("WorldClim_2.1_10m") -climate_vars <-lacerta_rec_all$var_info %>% filter(role=="predictor") %>% pull(variable) - -climate_present<-pastclim::region_slice(time_ce = 1985, - bio_variables = climate_vars, - data="WorldClim_2.1_10m", - crop=iberia_poly) +climate_vars <- lacerta_rec_all$var_info %>% + filter(role == "predictor") %>% + pull(variable) + +climate_present <- pastclim::region_slice( + time_ce = 1985, + bio_variables = climate_vars, + data = "WorldClim_2.1_10m", + crop = iberia_poly +) ``` ```{r echo=FALSE, results='hide'} -terra::gdal(warn=3) -climate_present<-terra::rast(system.file("extdata/lacerta_climate_present_10m.nc", package="tidysdm")) -climate_vars <- lacerta_rec_all$var_info %>% filter(role=="predictor") %>% pull(variable) -if (!all(climate_vars %in% names(climate_present))){ +terra::gdal(warn = 3) +climate_present <- terra::rast( + system.file("extdata/lacerta_climate_present_10m.nc", package = "tidysdm") +) +climate_vars <- lacerta_rec_all$var_info %>% + filter(role == "predictor") %>% + pull(variable) +if (!all(climate_vars %in% names(climate_present))) { stop("mismatched variables in the raster") } ``` ```{r plot_present, fig.width=6, fig.height=4} -prediction_present <- predict_raster(lacerta_stack, climate_present, type="prob") +prediction_present <- predict_raster(lacerta_stack, climate_present, + type = "prob" +) library(tidyterra) ggplot() + - geom_spatraster(data=prediction_present, aes(fill=.pred_presence))+ + geom_spatraster(data = prediction_present, aes(fill = .pred_presence)) + scale_fill_terrain_c() + # plot presences used in the model - geom_sf(data = lacerta_thin %>% filter(class=="presence")) + geom_sf(data = lacerta_thin %>% filter(class == "presence")) ``` diff --git a/vignettes/a3_troubleshooting.Rmd b/vignettes/a3_troubleshooting.Rmd index d7aa929e..2ddce3ec 100644 --- a/vignettes/a3_troubleshooting.Rmd +++ b/vignettes/a3_troubleshooting.Rmd @@ -13,6 +13,8 @@ knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) +options(cores=2) +options(mc.cores=2) ``` In this vignette, we illustrate how to troubleshoot tuning errors. This is not a @@ -26,13 +28,19 @@ loading the *Lacerta* dataset, and manually add an NA: ```{r} library(tidysdm) lacerta_thin <- readRDS(system.file("extdata/lacerta_climate_sf.RDS", - package="tidysdm")) -lacerta_thin$bio05[37]<-NA + package = "tidysdm" +)) +lacerta_thin$bio05[37] <- NA ``` Let us set up a recipe and fit workflow_set ```{r} -lacerta_rec <- recipe(lacerta_thin, formula=class~.) %>% step_rm(all_of( c("bio01", "bio02", "bio03", "bio04", "bio07", "bio08", "bio09", "bio10", "bio11", "bio12", "bio14", "bio16", "bio17", "bio18", "bio19", "altitude"))) +lacerta_rec <- recipe(lacerta_thin, formula = class ~ .) %>% + step_rm(all_of(c( + "bio01", "bio02", "bio03", "bio04", "bio07", "bio08", + "bio09", "bio10", "bio11", "bio12", "bio14", "bio16", + "bio17", "bio18", "bio19", "altitude" + ))) lacerta_models <- # create the workflow_set @@ -54,10 +62,12 @@ lacerta_models <- ```{r error=TRUE} set.seed(100) lacerta_cv <- spatial_block_cv(lacerta_thin, v = 5) -lacerta_models <- - lacerta_models %>% - workflow_map("tune_grid", resamples = lacerta_cv, grid = 3, - metrics = sdm_metric_set(), verbose = TRUE) +lacerta_models <- + lacerta_models %>% + workflow_map("tune_grid", + resamples = lacerta_cv, grid = 3, + metrics = sdm_metric_set(), verbose = TRUE + ) ``` We can see that the error is self-explanatory. Also, note that the error impacts @@ -92,9 +102,11 @@ variables of interest, and the error is less than clear: Let's load the data and create a recipe with `step_select`: ```{r} lacerta_thin <- readRDS(system.file("extdata/lacerta_climate_sf.RDS", - package="tidysdm")) -suggested_vars <- c("bio05","bio06", "bio13", "bio14", "bio15") -lacerta_rec_sel <- recipe(lacerta_thin, formula=class~.) %>% step_select(all_of( suggested_vars)) + package = "tidysdm" +)) +suggested_vars <- c("bio05", "bio06", "bio13", "bio14", "bio15") +lacerta_rec_sel <- recipe(lacerta_thin, formula = class ~ .) %>% + step_select(all_of(suggested_vars)) ``` Now we create the workflow set and fit it: @@ -117,10 +129,12 @@ lacerta_models <- set.seed(100) lacerta_cv <- spatial_block_cv(lacerta_thin, v = 5) -lacerta_models <- - lacerta_models %>% - workflow_map("tune_grid", resamples = lacerta_cv, grid = 3, - metrics = sdm_metric_set(), verbose = TRUE) +lacerta_models <- + lacerta_models %>% + workflow_map("tune_grid", + resamples = lacerta_cv, grid = 3, + metrics = sdm_metric_set(), verbose = TRUE + ) ``` The errors are not very intuitive. However, all models have failed for all algorithms, which suggests that the problem lies with the data preparation side (either the data @@ -150,9 +164,15 @@ to every continuous predictor. ```{r} lacerta_thin <- readRDS(system.file("extdata/lacerta_climate_sf.RDS", - package="tidysdm")) + package = "tidysdm" +)) -lacerta_rec <- recipe(lacerta_thin, formula=class~.) %>% step_rm(all_of( c("bio01", "bio02", "bio03", "bio04", "bio07", "bio08", "bio09", "bio10", "bio11", "bio12", "bio14", "bio16", "bio17", "bio18", "bio19", "altitude"))) +lacerta_rec <- recipe(lacerta_thin, formula = class ~ .) %>% + step_rm(all_of(c( + "bio01", "bio02", "bio03", "bio04", "bio07", "bio08", + "bio09", "bio10", "bio11", "bio12", "bio14", "bio16", + "bio17", "bio18", "bio19", "altitude" + ))) lacerta_models <- # create the workflow_set @@ -169,8 +189,9 @@ lacerta_models <- ) %>% # set formula for gams update_workflow_model("default_gam", - spec = sdm_spec_gam(), - formula = gam_formula(lacerta_rec)) %>% + spec = sdm_spec_gam(), + formula = gam_formula(lacerta_rec) + ) %>% # tweak controls to store information needed later to create the ensemble option_add(control = control_ensemble_grid()) ``` @@ -179,10 +200,12 @@ lacerta_models <- ```{r} set.seed(100) lacerta_cv <- spatial_block_cv(lacerta_thin, v = 5) -lacerta_models <- - lacerta_models %>% - workflow_map("tune_grid", resamples = lacerta_cv, grid = 3, - metrics = sdm_metric_set(), verbose = TRUE) +lacerta_models <- + lacerta_models %>% + workflow_map("tune_grid", + resamples = lacerta_cv, grid = 3, + metrics = sdm_metric_set(), verbose = TRUE + ) ``` Note that the step of defining a formula is incompatible with using `step_cor` @@ -205,14 +228,20 @@ We generate a problematic dataset by subsampling the lacerta dataset: ```{r} lacerta_thin <- readRDS(system.file("extdata/lacerta_climate_sf.RDS", - package="tidysdm")) + package = "tidysdm" +)) set.seed(123) -lacerta_thin <- lacerta_thin[sample(1:nrow(lacerta_thin),nrow(lacerta_thin)/5),] - -lacerta_rec <- recipe(lacerta_thin, formula=class~.) %>% - step_rm(all_of( c("bio01", "bio02", "bio03", "bio04", "bio07", "bio08", - "bio09", "bio10", "bio11", "bio12", "bio14", "bio16", - "bio17", "bio18", "bio19", "altitude"))) +lacerta_thin <- lacerta_thin[sample( + 1:nrow(lacerta_thin), + nrow(lacerta_thin) / 5 +), ] + +lacerta_rec <- recipe(lacerta_thin, formula = class ~ .) %>% + step_rm(all_of(c( + "bio01", "bio02", "bio03", "bio04", "bio07", "bio08", + "bio09", "bio10", "bio11", "bio12", "bio14", "bio16", + "bio17", "bio18", "bio19", "altitude" + ))) lacerta_models <- # create the workflow_set @@ -231,8 +260,9 @@ lacerta_models <- ) %>% # set formula for gams update_workflow_model("default_gam", - spec = sdm_spec_gam(), - formula = gam_formula(lacerta_rec)) %>% + spec = sdm_spec_gam(), + formula = gam_formula(lacerta_rec) + ) %>% # tweak controls to store information needed later to create the ensemble option_add(control = control_ensemble_grid()) ``` @@ -242,10 +272,12 @@ We then create 3 folds and attempt to fit the models: ```{r} set.seed(100) lacerta_cv <- spatial_block_cv(lacerta_thin, v = 3) -lacerta_models <- - lacerta_models %>% - workflow_map("tune_grid", resamples = lacerta_cv, grid = 3, - metrics = sdm_metric_set(), verbose = TRUE) +lacerta_models <- + lacerta_models %>% + workflow_map("tune_grid", + resamples = lacerta_cv, grid = 3, + metrics = sdm_metric_set(), verbose = TRUE + ) ``` We see that one of the folds gives us an error when using GAMs. The error @@ -256,7 +288,7 @@ an idea of where this error comes from. We start by extracting the results of the gam fits: ```{r} -gam_results <- extract_workflow_set_result(lacerta_models,id = "default_gam") +gam_results <- extract_workflow_set_result(lacerta_models, id = "default_gam") gam_results ``` @@ -267,7 +299,7 @@ have zero rows). We can check that it indeed contains the error that we wanted: gam_results$.notes[2] ``` -We can now get the problmatic data split, and extract the training data: +We can now get the problematic data split, and extract the training data: ```{r} problem_split <- gam_results$splits[2][[1]] @@ -282,8 +314,8 @@ We can now extract the workflow and refit it to the split to confirm that we have isolated the problem: ```{r} -gam_workflow <- extract_workflow(lacerta_models,id = "default_gam") -faulty_gam <- fit(gam_workflow,training(problem_split)) +gam_workflow <- extract_workflow(lacerta_models, id = "default_gam") +faulty_gam <- fit(gam_workflow, training(problem_split)) ``` The next step would be to dig deeper into the data, trying to understand whether