2024-11-08 15:13:33 +01:00
|
|
|
#' Print a flexible baseline characteristics table
|
|
|
|
#'
|
|
|
|
#' @param data data set
|
|
|
|
#' @param fun Name of function as character vector or function to use for model creation.
|
|
|
|
#' @param vars character vector of variables to include
|
|
|
|
#' @param outcome.str Name of outcome variable. Character vector.
|
2024-11-21 12:34:27 +01:00
|
|
|
#' @param auto.mode Make assumptions on function dependent on outcome data format. Overwrites other arguments.
|
2024-11-08 15:13:33 +01:00
|
|
|
#' @param formula.str Formula as string. Passed through 'glue::glue'. If given, 'outcome.str' and 'vars' are ignored. Optional.
|
|
|
|
#' @param args.list List of arguments passed to 'fun' with 'do.call'.
|
|
|
|
#'
|
|
|
|
#' @importFrom stats as.formula
|
|
|
|
#'
|
|
|
|
#' @return object of standard class for fun
|
|
|
|
#' @export
|
|
|
|
#'
|
|
|
|
#' @examples
|
|
|
|
#' gtsummary::trial |>
|
2024-11-21 12:34:27 +01:00
|
|
|
#' regression_model(outcome.str = "age")
|
2024-11-08 15:13:33 +01:00
|
|
|
#' gtsummary::trial |>
|
|
|
|
#' regression_model(
|
|
|
|
#' outcome.str = "age",
|
2024-11-21 12:34:27 +01:00
|
|
|
#' auto.mode = FALSE,
|
2024-11-08 15:13:33 +01:00
|
|
|
#' fun = "stats::lm",
|
|
|
|
#' formula.str = "{outcome.str}~.",
|
|
|
|
#' args.list = NULL
|
|
|
|
#' )
|
|
|
|
#' gtsummary::trial |> regression_model(
|
|
|
|
#' outcome.str = "trt",
|
2024-11-21 12:34:27 +01:00
|
|
|
#' auto.mode = FALSE,
|
2024-11-08 15:13:33 +01:00
|
|
|
#' fun = "stats::glm",
|
|
|
|
#' args.list = list(family = binomial(link = "logit"))
|
|
|
|
#' )
|
|
|
|
regression_model <- function(data,
|
|
|
|
outcome.str,
|
|
|
|
auto.mode = TRUE,
|
|
|
|
formula.str = NULL,
|
|
|
|
args.list = NULL,
|
|
|
|
fun = NULL,
|
|
|
|
vars = NULL) {
|
2024-11-21 12:34:27 +01:00
|
|
|
if (!is.null(formula.str)) {
|
|
|
|
if (formula.str == "") {
|
|
|
|
formula.str <- NULL
|
|
|
|
}
|
2024-11-15 22:22:17 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!is.null(formula.str)) {
|
2024-11-08 15:13:33 +01:00
|
|
|
formula.str <- glue::glue(formula.str)
|
|
|
|
} else {
|
|
|
|
assertthat::assert_that(outcome.str %in% names(data),
|
|
|
|
msg = "Outcome variable is not present in the provided dataset"
|
|
|
|
)
|
|
|
|
formula.str <- glue::glue("{outcome.str}~.")
|
|
|
|
|
|
|
|
if (!is.null(vars)) {
|
2024-11-15 21:57:38 +01:00
|
|
|
if (outcome.str %in% vars) {
|
2024-11-08 15:13:33 +01:00
|
|
|
vars <- vars[vars %in% outcome.str]
|
|
|
|
}
|
2024-11-15 21:57:38 +01:00
|
|
|
data <- data |> dplyr::select(dplyr::all_of(c(vars, outcome.str)))
|
2024-11-08 15:13:33 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
# Formatting character variables as factor
|
|
|
|
# Improvement should add a missing vector to format as NA
|
|
|
|
data <- data |> dplyr::mutate(dplyr::across(dplyr::where(is.character), as.factor))
|
|
|
|
|
|
|
|
# browser()
|
|
|
|
if (auto.mode) {
|
2024-11-15 21:57:38 +01:00
|
|
|
if (is.numeric(data[[outcome.str]])) {
|
2024-11-08 15:13:33 +01:00
|
|
|
fun <- "stats::lm"
|
2024-11-15 21:57:38 +01:00
|
|
|
} else if (is.factor(data[[outcome.str]])) {
|
|
|
|
if (length(levels(data[[outcome.str]])) == 2) {
|
2024-11-08 15:13:33 +01:00
|
|
|
fun <- "stats::glm"
|
2024-11-21 12:34:27 +01:00
|
|
|
args.list <- list(family = stats::binomial(link = "logit"))
|
2024-11-15 21:57:38 +01:00
|
|
|
} else if (length(levels(data[[outcome.str]])) > 2) {
|
2024-11-08 15:13:33 +01:00
|
|
|
fun <- "MASS::polr"
|
2024-11-15 21:57:38 +01:00
|
|
|
args.list <- list(
|
2024-11-08 15:13:33 +01:00
|
|
|
Hess = TRUE,
|
|
|
|
method = "logistic"
|
|
|
|
)
|
|
|
|
} else {
|
|
|
|
stop("The provided output variable only has one level")
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
stop("Output variable should be either numeric or factor for auto.mode")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
assertthat::assert_that("character" %in% class(fun),
|
|
|
|
msg = "Please provide the function as a character vector."
|
|
|
|
)
|
|
|
|
|
|
|
|
out <- do.call(
|
|
|
|
getfun(fun),
|
|
|
|
c(
|
|
|
|
list(data = data),
|
|
|
|
list(formula = as.formula(formula.str)),
|
|
|
|
args.list
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
# Recreating the call
|
|
|
|
# out$call <- match.call(definition=eval(parse(text=fun)), call(fun, data = 'data',formula = as.formula(formula.str),args.list))
|
|
|
|
|
|
|
|
return(out)
|
|
|
|
}
|