Skip to contents

Introduction

This package adds resampling methods for the {mlr3} package framework suited for spatial, temporal and spatiotemporal data. These methods can help to reduce the influence of autocorrelation on performance estimates when performing cross-validation. While this article gives a rather technical introduction to the package, a more applied approach can be found in the mlr3book section on “Spatiotemporal Analysis”.

After loading the package via library("mlr3spatiotempcv"), the spatiotemporal resampling methods and example tasks provided by {mlr3spatiotempcv} are available to the user alongside the default {mlr3} resampling methods and tasks.

Creating a spatial Task

To make use of spatial resampling methods, a {mlr3} task that is aware of its spatial characteristic needs to be created. Two Task child classes exist in {mlr3spatiotempcv} for this purpose:

  • TaskClassifST
  • TaskRegrST

To create one of these, you have multiple options:

  1. Use the constructor of the Task directly via $new() - this only works for data.table backends (!)
  2. Use the as_task_* converters (e.g. if your data is stored in an sf object)

We recommend the latter, as the as_task_* converters aim to make task construction easier, e.g., by creating the DataBackend (which is required to create a Task in {mlr3}) automatically and setting the crs and coordinate_names fields. Let’s assume your (point) data is stored in with an sf object, which is a common scenario for spatial analysis in R.

# create 'sf' object
data_sf = sf::st_as_sf(ecuador, coords = c("x", "y"), crs = 32717)

# create `TaskClassifST` from `sf` object
task = as_task_classif_st(data_sf, id = "ecuador_task", target = "slides", positive = "TRUE")

You can also use a plain data.frame. In this case, crs and coordinate_names need to be passed along explicitly as they cannot be inferred directly from the sf object:

task = as_task_classif_st(ecuador, id = "ecuador_task", target = "slides",
  positive = "TRUE", coordinate_names = c("x", "y"), crs = 32717)

The *ST task family prints a subset of the coordinates by default:

print(task)
#> <TaskClassifST:ecuador_task> (751 x 11)
#> * Target: slides
#> * Properties: twoclass
#> * Features (10):
#>   - dbl (10): carea, cslope, dem, distdeforest, distroad,
#>     distslidespast, hcurv, log.carea, slope, vcurv
#> * Coordinates:
#>             x       y
#>         <num>   <num>
#>   1: 712882.5 9560002
#>   2: 715232.5 9559582
#>   3: 715392.5 9560172
#>   4: 715042.5 9559312
#>   5: 715382.5 9560142
#>  ---                 
#> 747: 714472.5 9558482
#> 748: 713142.5 9560992
#> 749: 713322.5 9560562
#> 750: 715392.5 9557932
#> 751: 713802.5 9560862

All *ST tasks can be treated as their super class equivalents TaskClassif or TaskRegr in subsequent {mlr3} modeling steps.

Contributed reflections by {mlr3spatiotempcv}

In {mlr3}, dictionaries are used for overview purposes of available methods. The following sections show which dictionaries get appended with new entries when loading {mlr3spatiotempcv}.

Task Type

  • TaskClassifST

  • TaskRegrST

mlr_reflections$task_types
#> Key: <type>
#>            type          package             task        learner
#>          <char>           <char>           <char>         <char>
#> 1:      classif             mlr3      TaskClassif LearnerClassif
#> 2:   classif_st mlr3spatiotempcv    TaskClassifST LearnerClassif
#> 3:         regr             mlr3         TaskRegr    LearnerRegr
#> 4:      regr_st mlr3spatiotempcv       TaskRegrST    LearnerRegr
#> 5: unsupervised             mlr3 TaskUnsupervised        Learner
#>           prediction       prediction_data        measure
#>               <char>                <char>         <char>
#> 1: PredictionClassif PredictionDataClassif MeasureClassif
#> 2: PredictionClassif PredictionDataClassif MeasureClassif
#> 3:    PredictionRegr    PredictionDataRegr    MeasureRegr
#> 4:    PredictionRegr    PredictionDataRegr    MeasureRegr
#> 5:              <NA>                  <NA>           <NA>

Task Column Roles

  • coordinate

  • space

  • time

mlr_reflections$task_col_roles
#> $regr
#> [1] "feature" "target"  "name"    "order"   "stratum" "group"   "weight" 
#> 
#> $classif
#> [1] "feature" "target"  "name"    "order"   "stratum" "group"   "weight" 
#> 
#> $unsupervised
#> [1] "feature" "name"    "order"  
#> 
#> $classif_st
#>  [1] "feature"    "target"     "name"       "order"      "stratum"   
#>  [6] "group"      "weight"     "coordinate" "space"      "time"      
#> 
#> $regr_st
#>  [1] "feature"    "target"     "name"       "order"      "stratum"   
#>  [6] "group"      "weight"     "coordinate" "space"      "time"

Resampling Methods

  • mlr_resampling_spcv_block

  • mlr_resampling_spcv_buffer

  • mlr_resampling_spcv_coords

  • mlr_resampling_spcv_knndm

  • mlr_resampling_spcv_disc

  • mlr_resampling_spcv_tiles

  • mlr_resampling_spcv_env

  • mlr_resampling_sptcv_cstf

and their respective repeated versions. See as.data.table(mlr_resamplings) for the full dictionary.

Examples Tasks

  • tsk("ecuador") (spatial, classif)

  • tsk("cookfarm_mlr3") (spatiotemp, regr)

Upstream Packages and Scientific References

The following table lists all spatiotemporal methods implemented in {mlr3spatiotempcv} (or {mlr3}), their upstream R package and scientific references. All methods besides "spcv_buffer" also have a corresponding “repeated” method.

Category (Package) Method Name Reference mlr3 Notation
Buffering, spatial (blockCV) Spatial Buffering Valavi et al. (2018) mlr_resamplings_spcv_buffer
Buffering, spatial (sperrorest) Spatial Disc Brenning (2012) mlr_resamplings_spcv_disc
Blocking, spatial (blockCV) Spatial Blocking Valavi et al. (2018) mlr_resamplings_spcv_block
Blocking, spatial (sperrorest) Spatial Tiles Valavi et al. (2018) mlr_resamplings_spcv_tiles
Clustering, spatial (sperrorest) Spatial CV Brenning (2012) mlr_resamplings_spcv_coords
Clustering, spatial (CAST) KNNDM Linnenbrink et al. (2023) mlr_resamplings_spcv_knndm
Clustering, feature-space (blockCV) Environmental Blocking Valavi et al. (2018) mlr_resamplings_spcv_env




Grouping, predefined inds (mlr3) Predefined partitions mlr_resamplings_custom_cv
Grouping, spatiotemporal (mlr3) via col_roles "group" mlr_resamplings_cv, Task$set_col_roles(<variable>, "group")
Grouping, spatiotemporal (CAST) Leave-Location-and-Time-Out Meyer et al. (2018) mlr_resamplings_sptcv_cstf, Task$set_col_roles(<variable>, "space|time")

References

Brenning, Alexander. 2012. Spatial cross-validation and bootstrap for the assessment of prediction rules in remote sensing: The R package sperrorest.” In 2012 IEEE International Geoscience and Remote Sensing Symposium. IEEE. https://doi.org/10.1109/igarss.2012.6352393.
Linnenbrink, Jan, Carles Milà, Marvin Ludwig, and Hanna Meyer. 2023. kNNDM: K-Fold Nearest Neighbour Distance Matching Cross-Validation for Map Accuracy Estimation.” EGUsphere, July, 1–16. https://doi.org/10.5194/egusphere-2023-1308.
Meyer, Hanna, Christoph Reudenbach, Tomislav Hengl, Marwan Katurji, and Thomas Nauss. 2018. “Improving Performance of Spatio-Temporal Machine Learning Models Using Forward Feature Selection and Target-Oriented Validation.” Environmental Modelling & Software 101 (March): 1–9. https://doi.org/10.1016/j.envsoft.2017.12.001.
Valavi, Roozbeh, Jane Elith, Jose J. Lahoz-Monfort, and Gurutzeta Guillera-Arroita. 2018. blockCV: an R package for generating spatially or environmentally separated folds for k-fold cross-validation of species distribution models.” bioRxiv, June. https://doi.org/10.1101/357798.