Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
89d5e9a
refactor: update loo_compare to work with loo_pred_measure
Jul 7, 2026
7ce2d50
refactor: update pred_measure API for integration with loo_compare()
Jul 7, 2026
7394ba3
tests: new tests for loo_compare with loo_pred_measure
Jul 7, 2026
494d24f
docs: update documentation and glossary
Jul 7, 2026
9611656
docs: update documentation
Jul 7, 2026
a3019e3
chore: update developer-notes
Jul 7, 2026
3e1bf93
Merge branch 'pred_measure' into integrate-loo_compare
florence-bockting Jul 8, 2026
06d6281
refactor: clean-up refactoring and adjust for renamed arg
Jul 8, 2026
b46ff58
fix: update missing argument and corresponding docs
Jul 8, 2026
f1fcaf0
chore: update NEWS.md
Jul 8, 2026
e17e46d
Merge branch 'pred_measure' into integrate-loo_compare
florence-bockting Jul 16, 2026
abc74b5
refactor: update computation of SE for loo_compare with pred_measure_loo
Aug 12, 2026
faa27c5
refactor: create model_compare and workout design
Aug 25, 2026
3e078aa
update model_compare() functionality
Aug 27, 2026
8897e1f
Merge branch 'pred_measure' into integrate-loo_compare
florence-bockting Aug 28, 2026
1eb66de
refactor: split model_compare.R and drop duplicated loo_compare inter…
Aug 28, 2026
166dab6
fix: restore the simplify argument to print.compare.loo
Aug 28, 2026
c0c1fc0
review: update the model_compare function
Aug 28, 2026
c594818
update: deprecate loo_compare but maintain backwards comptability
Aug 28, 2026
aa30e54
review: code refactoring review
Aug 28, 2026
b1f0b32
docs: update function documentation to roxygen2 8.0.0
Aug 29, 2026
63c16a8
docs: update glossary to match loo_compare and model_compare
Aug 29, 2026
d874044
fix: throw deprecation warning for loo_compare only once per session.
Aug 29, 2026
9e930e3
fix: remove old 'estimates_only' label
Aug 29, 2026
4fe4b0d
refactor: avoid duplicate computation
Aug 29, 2026
88890b6
docs: add loo_compare and model_compare to seealso statement
Aug 29, 2026
51b3c9c
refactor: add warning for disagreeing measure name in attribute and list
Aug 29, 2026
81ae8eb
review: minor style corrections and doc adjustment
Aug 29, 2026
fed3433
review: removed dead code
Aug 29, 2026
585b77c
vignette: update tutorial on model comparison
Aug 29, 2026
3f63357
chore: update warning messages
Aug 29, 2026
5307f23
review: update function docs and inline small helper
Aug 29, 2026
795cd4e
Merge branch 'pred_measure' into integrate-loo_compare
Aug 31, 2026
69346f3
tests: shrink the model-comparison fixture
Aug 31, 2026
e52ab8e
print: accept simplify on the pred_measure path
Aug 31, 2026
d55d9bf
model_compare: accept named models in dots
Aug 31, 2026
0f830e3
internal: share the k-fold K-mismatch warning
Aug 31, 2026
769b37a
internal: drop model_compare_checks.psis_loo_ss_list()
Aug 31, 2026
b80c946
internal: drop model_compare_matrix.psis_loo_ss_list()
Aug 31, 2026
ca8da41
docs: correct the Sivula et al. year in the glossary
Aug 31, 2026
47af38e
pred_measure: keep a renamed measure's own orientation
Aug 31, 2026
99d71a2
docs: remove draft scaffolding from the comparison article
Aug 31, 2026
0e07f63
docs: let the comparison article fit its own models
Aug 31, 2026
4317ce7
docs: point the custom-measure chunks at the new fits
Aug 31, 2026
0c1de0c
docs: rename the comparison article to model-comparison
Aug 31, 2026
c66e1e2
docs: correct the article path in the model_compare links
Aug 31, 2026
5f6bcb9
internal: drop the vignette fits from the data generator
Aug 31, 2026
6dbd05d
docs: give the two remaining articles their real vignette title
Aug 31, 2026
91bfdba
model_compare: return the default object for subsampled loo
Sep 1, 2026
6621d2d
model_compare: let simplify = FALSE follow measures
Sep 1, 2026
0944a95
model_compare: name the fold count and the test size
Sep 1, 2026
0140dc1
vignettes: update model-comparison tutorial with other pred_measure f…
Sep 1, 2026
67f4d12
refactor: allow attribute measure_se_diff for custom measures
Sep 9, 2026
e339f48
docs: update developer-notes with review comments from Jonah
Sep 9, 2026
4c5a1a8
refactor: add user facade custom_measure() and remove custom_se_fn pa…
Sep 16, 2026
aa7f286
Merge remote-tracking branch 'origin/pred_measure' into integrate-loo…
Sep 19, 2026
6971e13
docs: update developer-notes wrt custom_measure
Sep 21, 2026
8815998
fix: model_compare throws warning when kfold_pred_measure use differe…
Sep 21, 2026
eec2140
fix: pass moment_match loss into pred_measure
Sep 21, 2026
dcf5fde
fix: use separate digits for measures in print method
Sep 21, 2026
ba29be1
fix: update snapshots
Sep 21, 2026
c5af96b
refactor: remove the 'rank_by' argument for model_compare
Sep 25, 2026
9ffff9c
fix: check whether pothoc measures have been used and warn for measur…
Sep 25, 2026
dd2ac81
fix: remove diagnostic flags for measures other than elpd
Sep 28, 2026
e372858
docs: rebuild loo_pred_measure.Rd for the post-hoc correction note
Sep 28, 2026
36795c2
feat: mark and explain flipped measure signs in print
Sep 28, 2026
999cfa7
docs: move model_compare design notes to design-discussions
Sep 28, 2026
de54993
docs: shorten NEWS entries for model_compare
Sep 28, 2026
cd1085d
docs: update model_compare vignette
Sep 28, 2026
954bdb1
Merge remote-tracking branch 'origin/pred_measure' into integrate-loo…
Sep 28, 2026
390eeb1
Merge branch 'pred_measure' into integrate-loo_compare
florence-bockting Sep 29, 2026
fbe6e88
Merge branch 'pred_measure' into integrate-loo_compare
florence-bockting Sep 29, 2026
ee7b99b
tests: make the test fixtures smaller for CRAN
Sep 29, 2026
fd427d9
model_compare: rank by elpd, else by the first shared measure in alph…
Sep 29, 2026
f7a7b4d
model_compare: drop complexity columns by exact name, keep custom p_ …
Sep 29, 2026
a509447
fix: define missing fold in example of model_compare
Sep 29, 2026
102a76b
docs: remove measure-ordering code comment from example
Sep 29, 2026
d03261f
chore: update deprecation warning to not print internal function and …
Sep 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,6 @@ release-prep.R

# personal maintainer scratch (not shared)
internal-notes/
notes/loo_se.pdf
notes/loo-compare-se-diff.md
CRAN-SUBMISSION
5 changes: 4 additions & 1 deletion NAMESPACE
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,14 @@ S3method(loo_moment_match,default)
S3method(loo_predictive_metric,matrix)
S3method(loo_scrps,matrix)
S3method(loo_subsample,"function")
S3method(model_compare,default)
S3method(model_compare,psis_loo_ss_list)
S3method(nobs,psis_loo_ss)
S3method(plot,loo)
S3method(plot,psis)
S3method(plot,psis_loo)
S3method(pointwise,loo)
S3method(print,compare.loo)
S3method(print,compare.loo_ss)
S3method(print,importance_sampling)
S3method(print,importance_sampling_loo)
S3method(print,kfold)
Expand Down Expand Up @@ -106,6 +107,7 @@ export(.thin_draws)
export(E_loo)
export(compare)
export(crps)
export(custom_measure)
export(elpd)
export(example_loglik_array)
export(example_loglik_matrix)
Expand Down Expand Up @@ -158,6 +160,7 @@ export(measure_r2)
export(measure_rmse)
export(measure_rps)
export(measure_srps)
export(model_compare)
export(nlist)
export(obs_idx)
export(pareto_k_ids)
Expand Down
14 changes: 14 additions & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,20 @@
* New predictive performance API: `insample_pred_measure()`, `loo_pred_measure()`,
`kfold_pred_measure()`, `test_pred_measure()`, and `pred_measure()` with
built-in measures via `measure_*()` and [supported_measures_list()].
* New `model_compare()` compares models on all measures of a `*_pred_measure()`
result by @florence-bockting in #380.
* `loo_compare()` is deprecated. Use `model_compare()`. Methods in other
packages (e.g. **brms**) still dispatch.
* `model_compare()` compares each measure against its own best model. It shows
loss measures on the utility scale.
* `model_compare()` ranks models by `elpd` when all models share it. Otherwise,
it ranks them by the first shared measure in alphabetical order.
* New `custom_measure()` sets the name, the loss flag, and the SE of the
difference for a custom measure.
* `print()` on a comparison has the new argument `measures`. It marks each
loss measure with a flipped sign.
* `loo_pred_measure()` warns when `loo_moment_match()` or `reloo()` corrected
the `loo` object and the measure is not `elpd`, `mlpd`, or `ic`.
* Improve numerical stability in `loo()`, `psis()`, model weighting, subsampling,
and moment matching in #395
* Fix `loo_compare()` when used with subsampling: compute model comparison by
Expand Down
4 changes: 2 additions & 2 deletions R/compare.R
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#' Model comparison (deprecated, old version)
#'
#' **This function is deprecated**. Please use the new [loo_compare()] function
#' **This function is deprecated**. Please use the new [model_compare()] function
#' instead. See `vignette("migration-guide", package = "loo")` for details.
#' `compare()` and `R/compare.R` are scheduled for removal in a future release.
#'
Expand Down Expand Up @@ -60,7 +60,7 @@
#' }
#'
compare <- function(..., x = list()) {
.Deprecated("loo_compare")
.Deprecated("model_compare")
dots <- list(...)
if (length(dots)) {
if (length(x)) {
Expand Down
40 changes: 28 additions & 12 deletions R/helpers.R
Original file line number Diff line number Diff line change
Expand Up @@ -265,18 +265,34 @@ loo_cores <- function(cores) {
return(cores)
}


# nocov start
# release reminders (for devtools)
release_questions <- function() {
c(
"Have you updated references?",
"Have you updated inst/CITATION?",
"Have you updated the vignettes?"
)
}
# nocov end

is_constant <- function(x, tol = .Machine$double.eps) {
abs(max(x) - min(x)) < tol
}

#' Issue a deprecation warning the first time it is triggered in a session
#'
#' Repeated calls with the same `id` are silent, so a script calling a
#' deprecated function in a loop is not flooded with warnings. `old` is passed
#' on explicitly so the message does not depend on which method called this.
#' Which `id`s have already warned is kept in `state`, an environment created
#' once when the package is built and private to this function.
#'
#' @noRd
#' @param id Identifier for the deprecation; one warning per `id` per session.
#' @param new,old Name of the replacement and deprecated function.
#' @return `TRUE` if a warning was issued, `FALSE` otherwise, invisibly.
#'
.deprecate_once <- local({
state <- new.env(parent = emptyenv())
function(id, new, old = id) {
if (isTRUE(state[[id]])) {
return(invisible(FALSE))
}
state[[id]] <- TRUE
warning(
"'", old, "' is deprecated. Use '", new, "' instead.\n",
call. = FALSE, immediate. = TRUE
)
invisible(TRUE)
}
})
4 changes: 2 additions & 2 deletions R/kfold-generic.R
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
#'
#' The **Value** section below describes the objects that `kfold()`
#' methods should return in order to be compatible with
#' [loo_compare()] and the **loo** package print methods.
#' [model_compare()] and the **loo** package print methods.
#'
#'
#' @name kfold-generic
Expand All @@ -25,7 +25,7 @@
#'
#' It is important for the object to have at least these classes and
#' components so that it is compatible with other functions like
#' [loo_compare()] and `print()` methods.
#' [model_compare()] and `print()` methods.
#'
NULL

Expand Down
177 changes: 159 additions & 18 deletions R/loo-glossary.R
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
#' Note: VGG2017 refers to Vehtari, Gelman, and Gabry (2017). See
#' **References**, below.
#'
#' @seealso [model_compare()], [loo_compare()]
#'
#' @section ELPD and `elpd_loo`:
#'
#' The ELPD is the theoretical expected log pointwise predictive density for a new
Expand All @@ -39,7 +41,7 @@
#' estimate is an accurate estimate for the scale, it ignores the skewness. When
#' making model comparisons, the SE of the component-wise (pairwise) differences
#' should be used instead (see the `se_diff` section below and Eq 24 in
#' VGG2017). Sivula et al. (2022) discuss the conditions when the normal
#' VGG2017). Sivula et al. (2025) discuss the conditions when the normal
#' approximation used for SE and `se_diff` is good.
#'
#' @section Monte Carlo SE of elpd_loo:
Expand Down Expand Up @@ -141,10 +143,39 @@
#' detect the problem.
#' }
#'
#' @section Model comparison with `model_compare()` and `loo_compare()`:
#'
#' Two functions perform model comparison, and both are available to users:
#'
#' * [model_compare()] is the current interface. It compares `"loo"`, `"waic"`,
#' and `"kfold"` objects on ELPD, and [`pred_measure`][pred_measure] results
#' on every predictive measure the models share.
#'
#' * [loo_compare()] is **deprecated** in favor of `model_compare()`, but it
#' still works and is still an exported generic, so `loo_compare` methods
#' registered by other packages keep dispatching. It keeps its previous
#' behavior: it accepts only `"loo"`, `"waic"`, and `"kfold"` objects and
#' compares them on ELPD. Passing [`pred_measure`][pred_measure] results
#' produces an error. The deprecation warning is issued once per session.
#'
#' `loo_compare()` and `model_compare()` return the same object: a data frame
#' including the `p_worse`, `diag_diff`, and `diag_elpd` columns. The terms
#' `elpd_diff`, `se_diff`, `p_worse`, `diag_diff`, and `diag_elpd` are defined
#' below. The remaining sections, on comparisons of several predictive
#' measures at once, apply to `model_compare()` only, since `loo_compare()`
#' cannot produce such a comparison. See
#' `vignette("migration-guide", package = "loo")` for the migration path.
#'
#' Below, "the comparison output" refers to the object returned by either
#' function, and "the reference model" to the model each difference is computed
#' against, which is the best model on the measure.
#'
#' @section elpd_diff:
#' `elpd_diff` is the difference in `elpd_loo` for two models. If more
#' than two models are compared, the difference is computed relative to the
#' model with highest `elpd_loo`.
#' reference model, which is the model with the highest `elpd_loo` in
#' `loo_compare()` and in `model_compare()` the model with the best
#' performance on each measure.
#'
#' @section se_diff:
#'
Expand All @@ -161,7 +192,7 @@
#'
#' p_worse = pnorm(0, elpd_diff, se_diff).
#'
#' The best-ranked model (the first row in the `loo_compare()` output, where
#' The reference model (the row of the comparison output where
#' `elpd_diff = 0`) always receives `NA`, since the comparison is defined
#' relative to that model.
#'
Expand All @@ -176,19 +207,18 @@
#' appear more clearly worse than the data actually support. Conversely, when
#' `elpd_diff` is biased due to an unreliable LOO approximation, `p_worse` can
#' point in the wrong direction entirely. When any of these conditions are
#' present, `diag_diff` or `diag_elpd` will be flagged in the `loo_compare()`
#' output.
#' For further guidance, see the sections below and the case study on
#' present, `diag_diff` or `diag_elpd` will be flagged in the comparison
#' output. For further guidance, see the sections below and the case study on
#' [Uncertainty in Bayesian LOO-CV Model Comparison](
#' https://users.aalto.fi/~ave/casestudies/LOO_uncertainty/loo_uncertainty.html).
#'
#' @section `diag_diff` (pairwise comparison diagnostics):
#'
#' `diag_diff` is a diagnostic column in the `loo_compare()` output for each
#' model comparison against the current reference model. It flags conditions
#' under which the normal approximation behind `se_diff` and `p_worse` is likely
#' to be poorly calibrated. The column contains a short label when a condition
#' is detected, and is empty otherwise.
#' `diag_diff` is a diagnostic column in the `model_compare()` and
#' `loo_compare()` output for each model comparison against the current
#' reference model. It flags conditions under which the normal approximation
#' behind `se_diff` and `p_worse` is likely to be poorly calibrated. The column
#' contains a short label when a condition is detected, and is empty otherwise.
#'
#' The column `diag_diff` currently flags two problems:
#'
Expand All @@ -210,7 +240,7 @@
#'
#' The conditions flagged by `diag_diff` are not independent: they tend to
#' co-occur, and when they do, some flags carry more information than others.
#' `loo_compare()` therefore follows a priority hierarchy and shows only the
#' Both functions therefore follow a priority hierarchy and show only the
#' most critical flag in the table output.
#'
#' The hierarchy is as follows:
Expand All @@ -233,12 +263,12 @@
#'
#' @section `diag_elpd`:
#'
#' `diag_elpd` is a diagnostic column in the `loo_compare()` output that flags
#' when the PSIS-LOO approximation for an individual model is unreliable. Unlike
#' `diag_diff`, which concerns the *comparison* between models, `diag_elpd`
#' concerns the quality of the `elpd_loo` estimate for each model individually.
#' It contains a short text label when a problem is detected, and is empty
#' otherwise.
#' `diag_elpd` is a diagnostic column in the `model_compare()` and
#' `loo_compare()` output that flags when the PSIS-LOO approximation for an
#' individual model is unreliable. Unlike `diag_diff`, which concerns the
#' *comparison* between models, `diag_elpd` concerns the quality of the
#' `elpd_loo` estimate for each model individually. It contains a short text
#' label when a problem is detected, and is empty otherwise.
#'
#' ### `K k_psis > t` (K observations with Pareto-k values > t)
#'
Expand All @@ -252,6 +282,117 @@
#' This is qualitatively different from the calibration issues flagged by
#' `diag_diff`: here the estimate itself may be wrong, not just uncertain.
#'
#' The flag is not specific to ELPD: `mae_loo`, `mse_loo`, `r2_loo` and the
#' rest are biased by unreliable importance sampling for the same reason. It is
#' a property of one model's approximation, and does not depend on which model
#' is used as the comparison reference. In an ELPD-only comparison (i.e., all
#' `loo_compare()` output, and `model_compare()` on `"loo"`, `"waic"`, or
#' `"kfold"` objects) `print()` shows it as a column of the single difference
#' table. In a multi-measure `model_compare()` comparison it is instead reported
#' once per model above the per-measure difference tables, rather than inside
#' any one of them.
#'
#' See for further information on Pareto-k values the "Pareto k estimates"
#' section.
#'
#' @section Multi-measure model comparisons:
#'
#' The remaining sections describe comparisons that only [model_compare()] can
#' produce; the deprecated `loo_compare()` rejects
#' [`pred_measure`][pred_measure] inputs.
#'
#' When comparing [`loo_pred_measure()`][loo_pred_measure] objects with
#' `model_compare()`, paired differences are computed for every predictive
#' measure common to all models. Rows are ordered by `"elpd"` when all models
#' share it, and otherwise by the first shared measure in alphabetical order. Each measure is compared against the
#' model that is best on that measure, so different difference columns may use
#' different reference models.
#'
#' ### `{measure}_diff` and `{measure}_se_diff`
#'
#' For each non-ELPD measure `m`, `model_compare()` adds columns `m_diff` and
#' `m_se_diff`. In all cases `m_diff` is the difference between the two overall
#' estimates on a utility scale (higher is better; loss measures such as MSE,
#' Brier score, and SRPS have their sign flipped from the raw loss orientation).
#' Measures already returned on a utility scale (e.g. ELPD, CRPS/RPS) are not
#' sign-flipped. Negative `m_diff` values then indicate worse performance than
#' the reference model, which has `m_diff = 0`.
#'
#' How `m_se_diff` is obtained depends on the measure:
#'
#' * When the overall estimate is a sum or mean of pointwise contributions, it
#' is computed from paired pointwise differences using the same approach as
#' `elpd_diff` and `se_diff` (Eq 24 in VGG2017 for sums; the mean analogue for
#' means). This covers ELPD, `mlpd`, `ic`, `mae`, `mse`, `acc`, `brier`, and
#' the ranked probability scores.
#' * When a built-in measure is a transformation of such quantities, it supplies
#' its own delta-method standard error (`se_diff_fun`). For `rmse` this is the
#' first-order bivariate Taylor approximation propagated from the MSE scale,
#' which requires the covariance between the two models' pointwise squared
#' errors and is therefore not a paired pointwise standard deviation. For
#' `r2` it is the trivariate analogue, which additionally propagates the
#' uncertainty in the baseline `MSE(y)` shared by both models.
#' * For custom measures it comes from the measure's own
#' `attr(my_fun, "measure_se_diff")` declaration, set with
#' [custom_measure()]. It is `NA` when the measure declares nothing.
#'
#' The reference model has `m_se_diff = 0` whenever an `m_se_diff` is available.
#' Which measures are losses is recorded in the `loss` element of the
#' `measure_info` attribute on each `*_pred_measure()` result. `print()` marks
#' each flipped loss with "sign flipped" (see [model_compare()]).
#'
#' ELPD-family measures use the column names `elpd_diff` and `se_diff` rather
#' than a prefixed form. Only ELPD comparisons include `p_worse` and `diag_diff`;
#' these diagnostics do not apply to other predictive measures.
#'
#' ### `measure_info`
#'
#' Attribute on all `*_pred_measure()` and [pred_measure()] results: a named
#' list of per-measure information used by [model_compare()]. Each entry
#' is a list with:
#'
#' * `loss`: whether lower values of the measure are better. Measure values are
#' always stored on the measure's own scale, so this describes both the
#' measure and the values recorded for it
#' * `diff_method`: how the standard error of the difference is obtained:
#' `"sum"` or `"mean"` (paired pointwise differences),
#' `"measure_specific"` (the built-in measure's own `se_diff_fun`), or
#' `"custom"`. Nothing is inferred from a measure's values. Under `"custom"`
#' the standard error comes from the measure's `se_diff_fun` declaration:
#' a function, the `"sum"`/`"mean"` pointwise formulas, or nothing for an
#' `NA` standard error. A missing standard error is not an
#' error state as the difference itself is still reported.
#' * `se_diff_fun`: for built-in measures with
#' `diff_method = "measure_specific"`, the name of the built-in implementation
#' used. For custom measures, whatever the measure declared in
#' `attr(my_fun, "measure_se_diff")`; absent when it declared nothing.
#' * `extra`: optional list of auxiliary data the measure stored for the
#' standard error of its difference, present only for measures that need it
#' (`r2` stores the pointwise baseline `(y_i - mean(y))^2`, which `y` no
#' longer supplies by the time [model_compare()] runs; `bacc` stores the class
#' index of each observation, which its pointwise values do not determine).
#' Custom measures return it as an `extra` element, and it is passed on to
#' their `se_diff_fun`. It is excluded from the consistency check below, since it
#' varies with the data rather than with the measure itself.
#'
#' Built-in measures take `loss`, `diff_method`, and `se_diff_fun` from the
#' package measure registry. Custom measures always get `diff_method = "custom"`
#' and take `loss` from `attr(my_fun, "measure_loss") <- TRUE`, which declares
#' that lower values are better; without it they are treated as utilities (see
#' [insample_pred_measure()]). They take `se_diff_fun` from
#' `attr(my_fun, "measure_se_diff")`.
#' [model_compare()] requires all models to provide matching `measure_info` for
#' each shared measure; a mismatched `measure_loss` or `measure_se_diff`
#' declaration, or missing `measure_info` on some models, produces an error.
#'
#' ### `compare_measures` and related attributes
#'
#' Attribute `compare_reference` is a named character vector recording the
#' reference model used for each measure. Attribute `compare_measures` lists all
#' measures that were compared, and `sign_converted_measures` lists loss
#' measures whose sign was flipped onto the utility scale. The print method
#' shows the ranking measure by default (the first compared measure); use
#' `print(x, measures = "all")` or `print(x, measures = c("rmse", "r2"))` to
#' display additional measure tables. Each printed table is sorted by its own
#' measure, best model first, so the same model need not lead every table.
NULL
Loading
Loading