| name | resampling-strategies |
| description | Resampling strategies in tidymodels, including validation splits, cross-validation, bootstrap, nested resampling, and grouped data. |
Resampling Strategies
Overview
Comprehensive guide to resampling methods for model validation using the rsample package. Covers cross-validation, bootstrapping, and specialized resampling for time series and grouped data.
Data Splitting
Basic Train/Test Split
library(rsample)
set.seed(123)
split <- initial_split(data, prop = 0.75)
split <- initial_split(data, prop = 0.75, strata = outcome)
split <- initial_split(data, prop = 0.75, strata = outcome, breaks = 4)
train <- training(split)
test <- testing(split)
Three-Way Split (Train/Validation/Test)
split <- initial_validation_split(data, prop = c(0.6, 0.2))
train <- training(split)
val <- validation(split)
test <- testing(split)
val_set <- validation_set(split)
Cross-Validation
V-Fold Cross-Validation
folds <- vfold_cv(train_data, v = 10)
folds <- vfold_cv(train_data, v = 10, strata = outcome)
folds <- vfold_cv(train_data, v = 10, repeats = 5, strata = outcome)
folds$splits[[1]]
analysis(folds$splits[[1]])
assessment(folds$splits[[1]])
Leave-One-Out CV
loo_folds <- loo_cv(train_data)
Monte Carlo Cross-Validation
mc_folds <- mc_cv(train_data, prop = 0.75, times = 25)
Bootstrapping
Basic Bootstrap
boot <- bootstraps(train_data, times = 100)
boot <- bootstraps(train_data, times = 100, strata = outcome)
apparent <- apparent(train_data)
Bootstrap for Confidence Intervals
boot_models <- boot |>
mutate(
model = map(splits, ~ lm(y ~ x, data = analysis(.x))),
coefs = map(model, tidy)
) |>
unnest(coefs)
boot_ci <- int_pctl(boot_models, statistic = estimate)
Grouped Resampling
Group V-Fold CV
group_folds <- group_vfold_cv(
data,
group = patient_id,
v = 10
)
Nested Resampling
outer_folds <- vfold_cv(train_data, v = 5)
tune_results <- workflow |>
tune_grid(
resamples = outer_folds,
grid = 20
)
Time Series Resampling
Rolling Origin
ts_folds <- rolling_origin(
ts_data,
initial = 365,
assess = 30,
skip = 29,
cumulative = TRUE
)
ts_folds <- rolling_origin(
ts_data,
initial = 365,
assess = 30,
cumulative = FALSE
)
Sliding Window
ts_folds <- sliding_window(
ts_data,
lookback = 365,
assess_start = 1,
assess_stop = 30
)
ts_folds <- sliding_period(
ts_data,
index = date,
period = "month",
lookback = 12,
assess_stop = 1
)
Spatial Resampling (spatialsample)
library(spatialsample)
spatial_folds <- spatial_block_cv(
sf_data,
v = 10,
buffer = 1000
)
spatial_folds <- spatial_clustering_cv(
sf_data,
v = 10,
cluster_function = "kmeans"
)
spatial_folds <- spatial_leave_location_out_cv(
sf_data,
group = location_id
)
Working with Resamples
Fitting Models to Resamples
results <- workflow |>
fit_resamples(
resamples = folds,
metrics = metric_set(rmse, rsq, mae),
control = control_resamples(save_pred = TRUE)
)
collect_metrics(results)
collect_predictions(results)
Custom Resampling
custom_splits <- list(
make_splits(
list(analysis = 1:100, assessment = 101:130),
data = my_data
),
make_splits(
list(analysis = 1:120, assessment = 121:150),
data = my_data
)
)
custom_rset <- manual_rset(
splits = custom_splits,
ids = c("Split1", "Split2")
)
Resampling Comparison
| Method | Use Case | Variance | Bias |
|---|
| V-fold CV | General purpose | Medium | Low |
| Repeated CV | More stable estimates | Low | Low |
| LOOCV | Small datasets | High | Very Low |
| Bootstrap | Confidence intervals | Low | Medium |
| Monte Carlo CV | Large datasets | Medium | Low |
| Rolling Origin | Time series | - | Low |
| Group CV | Clustered data | Medium | Low |
Best Practices
Choosing Resampling Method
folds <- vfold_cv(data, v = 10, strata = outcome)
folds <- vfold_cv(data, v = 5, repeats = 10, strata = outcome)
folds <- loo_cv(data)
folds <- vfold_cv(data, v = 10)
folds <- rolling_origin(data, initial = n_train, assess = n_test)
folds <- group_vfold_cv(data, group = cluster_id, v = 10)
Stratification Guidelines
folds <- vfold_cv(data, strata = continuous_outcome, breaks = 4)
Number of Folds/Resamples
- V-fold CV: v = 10 is standard; v = 5 for large datasets; v = n (LOOCV) for small
- Bootstrap: 100-1000 resamples for stable estimates
- Monte Carlo CV: 25-100 iterations depending on dataset size
- Time series: Enough folds to cover seasonal patterns
Integration with tune
tune_results <- workflow |>
tune_grid(
resamples = vfold_cv(train, v = 10, strata = outcome),
grid = 20,
metrics = metric_set(roc_auc, accuracy)
)
tune_results <- workflow |>
tune_bayes(
resamples = bootstraps(train, times = 25),
iter = 50
)