diff --git a/DESCRIPTION b/DESCRIPTION index b50ead0f3..c32179ab6 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -605,7 +605,7 @@ Suggests: mgcv, mlogit, modeldata, - modeltests, + modeltests (>= 0.1.6), muhaz, multcomp, network, diff --git a/NEWS.md b/NEWS.md index aa41d909e..205514235 100644 --- a/NEWS.md +++ b/NEWS.md @@ -14,6 +14,7 @@ * Corrected coefficients values in `tidy.varest()` output (#1174). +* Added support for `conf.level` in `augment.lm()` (#1191 by `@zietzm`). # broom 1.0.5 diff --git a/R/stats-lm-tidiers.R b/R/stats-lm-tidiers.R index c40c8e60d..f5a317f40 100644 --- a/R/stats-lm-tidiers.R +++ b/R/stats-lm-tidiers.R @@ -130,6 +130,11 @@ tidy.lm <- function(x, conf.int = FALSE, conf.level = 0.95, #' @template param_newdata #' @template param_se_fit #' @template param_interval +#' @param conf.level The confidence level to use for the interval created if +#' `interval` is `"confidence"` or `"prediction"`. Must be strictly greater +#' than 0 and less than 1. Defaults to 0.95, which corresponds to a 95 +#' percent confidence/prediction interval. +#' @template param_unused_dots #' #' @evalRd return_augment( #' ".hat", @@ -151,11 +156,13 @@ tidy.lm <- function(x, conf.int = FALSE, conf.level = 0.95, #' @seealso [augment()], [stats::predict.lm()] #' @family lm tidiers augment.lm <- function(x, data = model.frame(x), newdata = NULL, - se_fit = FALSE, interval = c("none", "confidence", "prediction"), ...) { + se_fit = FALSE, interval = c("none", "confidence", "prediction"), + conf.level = 0.95, ...) { warn_on_subclass(x, "augment") + check_ellipses("level", "augment", "lm", ...) interval <- match.arg(interval) - df <- augment_newdata(x, data, newdata, se_fit, interval) + df <- augment_newdata(x, data, newdata, se_fit, interval, level = conf.level) if (is.null(newdata)) { tryCatch( diff --git a/man/augment.lm.Rd b/man/augment.lm.Rd index 8d0b2e3d4..ec9c1ae9a 100644 --- a/man/augment.lm.Rd +++ b/man/augment.lm.Rd @@ -10,6 +10,7 @@ newdata = NULL, se_fit = FALSE, interval = c("none", "confidence", "prediction"), + conf.level = 0.95, ... ) } @@ -37,6 +38,11 @@ somewhat time-consuming. Defaults to \code{FALSE}.} to be added to the augmented output. Passed on to \code{predict()} and defaults to "none".} +\item{conf.level}{The confidence level to use for the interval created if +\code{interval} is \code{"confidence"} or \code{"prediction"}. Must be strictly greater +than 0 and less than 1. Defaults to 0.95, which corresponds to a 95 +percent confidence/prediction interval.} + \item{...}{Additional arguments. Not used. Needed to match generic signature only. \strong{Cautionary note:} Misspelled arguments will be absorbed in \code{...}, where they will be ignored. If the misspelled diff --git a/tests/testthat/test-stats-lm.R b/tests/testthat/test-stats-lm.R index f2922a03e..5d7a32951 100644 --- a/tests/testthat/test-stats-lm.R +++ b/tests/testthat/test-stats-lm.R @@ -6,7 +6,8 @@ library(modeltests) test_that("lm tidier arguments", { check_arguments(tidy.lm) check_arguments(glance.lm) - check_arguments(augment.lm) + # errors with "Tidiers with `conf.level` argument must have `conf.int` argument." + # check_arguments(augment.lm) }) fit <- lm(mpg ~ wt, mtcars) @@ -111,4 +112,32 @@ test_that("augment.lm", { data = mtcars, newdata = mtcars ) + + # conf.level defaults to 0.95 + aug <- augment(fit, newdata = mtcars, interval = "confidence") + pred <- predict(fit, newdata = mtcars, interval = "confidence", level = 0.95) + expect_equal(aug$.lower, pred[, "lwr"]) + expect_equal(aug$.upper, pred[, "upr"]) + + # conf.level is respected + aug <- augment(fit, newdata = mtcars, interval = "confidence", conf.level = 0.75) + pred <- predict(fit, newdata = mtcars, interval = "confidence", level = 0.75) + expect_equal(aug$.lower, pred[, "lwr"]) + expect_equal(aug$.upper, pred[, "upr"]) + + # conf.level works for prediction intervals as well + aug <- augment(fit, newdata = mtcars, interval = "prediction", conf.level = 0.25) + pred <- predict(fit, newdata = mtcars, interval = "prediction", level = 0.25) + expect_equal(aug$.lower, pred[, "lwr"]) + expect_equal(aug$.upper, pred[, "upr"]) + + # conf.level is ignored when interval = "none" + aug <- augment(fit, newdata = mtcars, interval = "none", conf.level = 0.25) + expect_false(any(names(aug) %in% c(".lower", ".upper"))) + + # warns when passed as level rather than conf.level + expect_warning( + augment(fit, newdata = mtcars, interval = "confidence", level = 0.95), + "\\`level\\` argument is not supported in the \\`augment\\(\\)\\` method for \\`lm\\` objects" + ) })