The kfold
method performs exact K-fold cross-validation. First
the data are randomly partitioned into K subsets of equal size (or as close
to equal as possible), or the user can specify the folds
argument
to determine the partitioning. Then the model is refit K times, each time
leaving out one of the K subsets. If K is equal to the total
number of observations in the data then K-fold cross-validation is
equivalent to exact leave-one-out cross-validation (to which
loo
is an efficient approximation).
# S3 method for stanreg kfold( x, K = 10, ..., folds = NULL, save_fits = FALSE, cores = getOption("mc.cores", 1) )
x | A fitted model object returned by one of the rstanarm modeling functions. See stanreg-objects. |
---|---|
K | For |
... | Currently ignored. |
folds | For |
save_fits | For |
cores | The number of cores to use for parallelization. Instead fitting
separate Markov chains for the same model on different cores, by default
|
An object with classes 'kfold' and 'loo' that has a similar structure
as the objects returned by the loo
and waic
methods and is compatible with the loo_compare
function for
comparing models.
Vehtari, A., Gelman, A., and Gabry, J. (2017). Practical Bayesian model evaluation using leave-one-out cross-validation and WAIC. Statistics and Computing. 27(5), 1413--1432. doi:10.1007/s11222-016-9696-4. arXiv preprint: http://arxiv.org/abs/1507.04544/
Yao, Y., Vehtari, A., Simpson, D., and Gelman, A. (2018) Using stacking to average Bayesian predictive distributions. Bayesian Analysis, advance publication, doi:10.1214/17-BA1091. (online).
# \donttest{ fit1 <- stan_glm(mpg ~ wt, data = mtcars, refresh = 0) fit2 <- stan_glm(mpg ~ wt + cyl, data = mtcars, refresh = 0) fit3 <- stan_glm(mpg ~ disp * as.factor(cyl), data = mtcars, refresh = 0) # 10-fold cross-validation # (if possible also specify the 'cores' argument to use multiple cores) (kfold1 <- kfold(fit1, K = 10))#>#>#>#>#>#>#>#>#>#>#> #> Based on 10-fold cross-validation #> #> Estimate SE #> elpd_kfold -83.6 4.2 #> p_kfold NA NA #> kfoldic 167.2 8.5kfold2 <- kfold(fit2, K = 10)#>#>#>#>#>#>#>#>#>#>kfold3 <- kfold(fit3, K = 10)#>#>#>#>#>#>#>#>#>#>#> elpd_diff se_diff #> fit3 0.0 0.0 #> fit2 -4.6 6.1 #> fit1 -6.0 5.0# stratifying by a grouping variable # (note: might get some divergences warnings with this model but # this is just intended as a quick example of how to code this) fit4 <- stan_lmer(mpg ~ disp + (1|cyl), data = mtcars, refresh = 0)#> Warning: There were 5 divergent transitions after warmup. Increasing adapt_delta above 0.95 may help. See #> http://mc-stan.org/misc/warnings.html#divergent-transitions-after-warmup#> Warning: Examine the pairs() plot to diagnose sampling problems#> #> 4 6 8 #> 11 7 14folds_cyl <- loo::kfold_split_stratified(K = 3, x = mtcars$cyl) table(cyl = mtcars$cyl, fold = folds_cyl)#> fold #> cyl 1 2 3 #> 4 4 4 3 #> 6 2 2 3 #> 8 5 5 4kfold4 <- kfold(fit4, folds = folds_cyl, cores = 2)#>print(kfold4)#> #> Based on 3-fold cross-validation #> #> Estimate SE #> elpd_kfold -86.4 4.2 #> p_kfold NA NA #> kfoldic 172.7 8.5# } # Example code demonstrating the different ways to specify the number # of cores and how the cores are used # # options(mc.cores = NULL) # # # spread the K models over N_CORES cores (method 1) # kfold(fit, K, cores = N_CORES) # # # spread the K models over N_CORES cores (method 2) # options(mc.cores = N_CORES) # kfold(fit, K) # # # fit K models sequentially using N_CORES cores for the Markov chains each time # options(mc.cores = N_CORES) # kfold(fit, K, cores = 1)