#' @templateVar class ridgelm
#' @template title_desc_tidy
#'
#' @param x A `ridgelm` object returned from [MASS::lm.ridge()].
#' @template param_unused_dots
#'
#' @evalRd return_tidy("lambda", "GCV", "term",
#' estimate = "estimate of scaled coefficient using this lambda",
#' scale = "Scaling factor of estimated coefficient"
#' )
#'
#' @examplesIf rlang::is_installed(c("MASS", "ggplot2"))
#'
#' # load libraries for models and data
#' library(MASS)
#'
#' names(longley)[1] <- "y"
#'
#' # fit model and summarizd results
#' fit1 <- lm.ridge(y ~ ., longley)
#' tidy(fit1)
#'
#' fit2 <- lm.ridge(y ~ ., longley, lambda = seq(0.001, .05, .001))
#' td2 <- tidy(fit2)
#' g2 <- glance(fit2)
#'
#' # coefficient plot
#' library(ggplot2)
#' ggplot(td2, aes(lambda, estimate, color = term)) +
#' geom_line()
#'
#' # GCV plot
#' ggplot(td2, aes(lambda, GCV)) +
#' geom_line()
#'
#' # add line for the GCV minimizing estimate
#' ggplot(td2, aes(lambda, GCV)) +
#' geom_line() +
#' geom_vline(xintercept = g2$lambdaGCV, col = "red", lty = 2)
#'
#' @export
#' @aliases ridgelm_tidiers
#' @family ridgelm tidiers
#' @seealso [tidy()], [MASS::lm.ridge()]
tidy.ridgelm <- function(x, ...) {
if (length(x$lambda) == 1) {
# only one choice of lambda
ret <- tibble(
lambda = x$lambda,
GCV = unname(x$GCV),
term = names(x$coef),
estimate = x$coef,
scale = x$scales
)
return(ret)
}
# otherwise, multiple lambdas/coefs/etc, have to tidy
cotidy <- data.frame(unrowname(t(x$coef)),
lambda = x$lambda,
GCV = unname(x$GCV)
) %>%
pivot_longer(
cols = c(dplyr::everything(), -lambda, -GCV),
names_to = "term",
values_to = "estimate"
) %>%
as.data.frame() %>%
mutate(term = as.character(term)) %>%
mutate(scale = x$scales[term])
as_tibble(cotidy)
}
#' @templateVar class ridgelm
#' @template title_desc_glance
#'
#' @inherit tidy.ridgelm params examples
#'
#' @evalRd return_glance(
#' kHKB = "modified HKB estimate of the ridge constant",
#' kLW = "modified L-W estimate of the ridge constant",
#' lambdaGCV = "choice of lambda that minimizes GCV"
#' )
#'
#' @details This is similar to the output of `select.ridgelm`, but it is
#' returned rather than printed.
#'
#' @export
#' @family ridgelm tidiers
#' @seealso [glance()], [MASS::select.ridgelm()], [MASS::lm.ridge()]
glance.ridgelm <- function(x, ...) {
as_glance_tibble(
kHKB = x$kHKB,
kLW = x$kLW,
lambdaGCV = x$lambda[which.min(x$GCV)],
na_types = "rrr"
)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.