## ----include = FALSE---------------------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, comment = "#>", rows.print = 25 ) # one of the functions below needs emmeans, so dont evaluate code check in vignette # on old R versions where emmeans is not available if (!rlang::is_installed("emmeans")) { knitr::opts_chunk$set(eval = FALSE) } ## ----setup, warning=FALSE, message=FALSE-------------------------------------- library(broom.helpers) library(gtsummary) library(ggplot2) library(dplyr) # paged_table() was introduced only in rmarkdwon v1.2 print_table <- function(tab) { if (packageVersion("rmarkdown") >= "1.2") { rmarkdown::paged_table(tab) } else { knitr::kable(tab) } } ## ----------------------------------------------------------------------------- model_logit <- glm(response ~ trt + grade, trial, family = binomial) broom::tidy(model_logit) ## ----------------------------------------------------------------------------- tidy_forest <- model_logit |> # perform initial tidying of the model tidy_and_attach(exponentiate = TRUE, conf.int = TRUE) |> # adding in the reference row for categorical variables tidy_add_reference_rows() |> # adding a reference value to appear in plot tidy_add_estimate_to_reference_rows() |> # adding the variable labels tidy_add_term_labels() |> # removing intercept estimate from model tidy_remove_intercept() tidy_forest ## ----warning=FALSE------------------------------------------------------------ tidy_forest |> mutate( plot_label = paste(var_label, label, sep = ":") |> forcats::fct_inorder() |> forcats::fct_rev() ) |> ggplot(aes(x = plot_label, y = estimate, ymin = conf.low, ymax = conf.high, color = variable)) + geom_hline(yintercept = 1, linetype = 2) + geom_pointrange() + coord_flip() + theme(legend.position = "none") + labs( y = "Odds Ratio", x = " ", title = "Forest Plot using broom.helpers" ) ## ----------------------------------------------------------------------------- tidy_table <- model_logit |> # perform initial tidying of the model tidy_and_attach(exponentiate = TRUE, conf.int = TRUE) |> # adding in the reference row for categorical variables tidy_add_reference_rows() |> # adding the variable labels tidy_add_term_labels() |> # add header row tidy_add_header_rows() |> # removing intercept estimate from model tidy_remove_intercept() # print summary table options(knitr.kable.NA = "") tidy_table |> # format model estimates select(label, estimate, conf.low, conf.high, p.value) |> mutate(across(all_of(c("estimate", "conf.low", "conf.high")), style_ratio)) |> mutate(across(p.value, style_pvalue)) |> print_table() ## ----------------------------------------------------------------------------- model_logit |> tidy_plus_plus(exponentiate = TRUE) ## ----------------------------------------------------------------------------- model_logit |> tidy_plus_plus(exponentiate = TRUE) |> print_table() ## ----------------------------------------------------------------------------- model_poly <- glm(response ~ poly(age, 3) + ttdeath, na.omit(trial), family = binomial) model_poly |> tidy_plus_plus( exponentiate = TRUE, add_header_rows = TRUE, variable_labels = c(age = "Age in years") ) |> print_table() ## ----------------------------------------------------------------------------- model_1 <- glm( response ~ stage + grade * trt, gtsummary::trial, family = binomial ) model_1 |> tidy_and_attach(exponentiate = TRUE) |> tidy_add_reference_rows() |> tidy_add_estimate_to_reference_rows(exponentiate = TRUE) |> tidy_add_term_labels() |> print_table() ## ----------------------------------------------------------------------------- model_2 <- glm( response ~ stage + grade * trt, gtsummary::trial, family = binomial, contrasts = list( stage = contr.treatment(4, base = 3), grade = contr.treatment(3, base = 2), trt = contr.treatment(2, base = 2) ) ) model_2 |> tidy_and_attach(exponentiate = TRUE) |> tidy_add_reference_rows() |> tidy_add_estimate_to_reference_rows(exponentiate = TRUE) |> tidy_add_term_labels() |> print_table() ## ----------------------------------------------------------------------------- model_3 <- glm( response ~ stage + grade * trt, gtsummary::trial, family = binomial, contrasts = list( stage = contr.sum, grade = contr.sum, trt = contr.sum ) ) model_3 |> tidy_and_attach(exponentiate = TRUE) |> tidy_add_reference_rows() |> tidy_add_estimate_to_reference_rows(exponentiate = TRUE) |> tidy_add_term_labels() |> print_table() ## ----------------------------------------------------------------------------- model_4 <- glm( response ~ stage + grade * trt, gtsummary::trial, family = binomial, contrasts = list( stage = contr.poly, grade = contr.helmert, trt = contr.poly ) ) model_4 |> tidy_and_attach(exponentiate = TRUE) |> tidy_add_reference_rows() |> tidy_add_estimate_to_reference_rows(exponentiate = TRUE) |> tidy_add_term_labels() |> print_table() ## ----------------------------------------------------------------------------- model_logit <- glm(response ~ age + trt + grade, trial, family = binomial) model_logit |> tidy_and_attach() |> tidy_add_pairwise_contrasts() |> print_table() model_logit |> tidy_and_attach(exponentiate = TRUE) |> tidy_add_pairwise_contrasts() |> print_table() model_logit |> tidy_and_attach(exponentiate = TRUE) |> tidy_add_pairwise_contrasts(pairwise_reverse = FALSE) |> print_table() model_logit |> tidy_and_attach(exponentiate = TRUE) |> tidy_add_pairwise_contrasts(keep_model_terms = TRUE) |> print_table() ## ----echo=FALSE--------------------------------------------------------------- # nolint start tibble::tribble( ~Column, ~Function, ~Description, "original_term", "`tidy_disambiguate_terms()`, `tidy_multgee()` or `tidy_zeroinfl()`", "Original term before disambiguation. This columns is added only when disambiguation is needed (i.e. for mixed models). Also used for \"multgee\", \"zeroinfl\" and \"hurdle\" models.", "variable", "`tidy_identify_variables()`", "String of variable names from the model. For categorical variables and polynomial terms defined with `stats::poly()`, terms belonging to the variable are identified.", "var_class", "`tidy_identify_variables()`", "Class of the variable.", "var_type", "`tidy_identify_variables()`", "One of \"intercept\", \"continuous\", \"dichotomous\", \"categorical\", \"interaction\", \"ran_pars\" or \"ran_vals\"", "var_nlevels", "`tidy_identify_variables()`", "Number of original levels for categorical variables", "contrasts", "`tidy_add_contrasts()`", "Contrasts used for categorical variables.
Require \"variable\" column. If needed, will automatically apply `tidy_identify_variables()`.", "contrasts_type", "`tidy_add_contrasts()`", "Type of contrasts (\"treatment\", \"sum\", \"poly\", \"helmert\", \"sdif\", \"other\" or \"no.contrast\"). \"pairwise\ is used for pairwise contrasts computed with `tidy_add_pairwise_contrasts()`.", "reference_row", "`tidy_add_reference_rows()`", "Logical indicating if a row is a reference row for categorical variables using a treatment or a sum contrast. Is equal to `NA` for variables who do not have a reference row.
Require \"contrasts\" column. If needed, will automatically apply `tidy_add_contrasts()`.
`tidy_add_reference_rows()` will not populate the label of the reference term. It is therefore better to apply `tidy_add_term_labels()` after `tidy_add_reference_rows()` rather than before.
", "var_label", "`tidy_add_variable_labels()`", "String of variable labels from the model. Columns labelled with the `labelled` package are retained. It is possible to pass a custom label for an interaction term with the `labels` argument.
Require \"variable\" column. If needed, will automatically apply `tidy_identify_variables()`.", "label", "`tidy_add_term_labels()`", "String of term labels based on (1) labels provided in `labels` argument if provided; (2) factor levels for categorical variables coded with treatment, SAS or sum contrasts; (3) variable labels when there is only one term per variable; and (4) term name otherwise.
Require \"variable_label\" column. If needed, will automatically apply `tidy_add_variable_labels()`.
Require \"contrasts\" column. If needed, will automatically apply `tidy_add_contrasts()`.
", "header_row", "`tidy_add_header_rows()`", "Logical indicating if a row is a header row for variables with several terms. Is equal to `NA` for variables who do not have an header row.
Require \"label\" column. If needed, will automatically apply `tidy_add_term_labels()`.
It is better to apply `tidy_add_header_rows()` after other `tidy_*` functions
", "n_obs", "`tidy_add_n()`", "Number of observations", "n_ind", "`tidy_add_n()`", "Number of individuals (for Cox models)", "n_event", "`tidy_add_n()`", "Number of events (for binomial and multinomial logistic models, Poisson and Cox models)", "exposure", "`tidy_add_n()`", "Exposure time (for Poisson and Cox models)" ) |> gt::gt() |> gt::fmt_markdown(columns = everything()) |> gt::tab_options( column_labels.font.weight = "bold" ) |> gt::opt_row_striping() |> gt::tab_style("vertical-align:top; font-size: 12px;", gt::cells_body()) # nolint end ## ----echo=FALSE--------------------------------------------------------------- tibble::tribble( ~Attribute, ~Function, ~Description, "exponentiate", "`tidy_and_attach()`", "Indicates if estimates were exponentiated", "conf.level", "`tidy_and_attach()`", "Level of confidence used for confidence intervals", "coefficients_type", "`tidy_add_coefficients_type()`", "Type of coefficients", "coefficients_label", "`tidy_add_coefficients_type()`", "Coefficients label", "variable_labels", "`tidy_add_variable_labels()`", "Custom variable labels passed to `tidy_add_variable_labels()`", "term_labels", "`tidy_add_term_labels()`", "Custom term labels passed to `tidy_add_term_labels()`", "N_obs", "`tidy_add_n()`", "Total number of observations", "N_event", "`tidy_add_n()`", "Total number of events", "N_ind", "`tidy_add_n()`", "Total number of individuals (for Cox models)", "Exposure", "`tidy_add_n()`", "Total of exposure time", "component", "`tidy_zeroinfl()`", "`component` argument passed to `tidy_zeroinfl()`" ) |> gt::gt() |> gt::fmt_markdown(columns = everything()) |> gt::tab_options(column_labels.font.weight = "bold") |> gt::opt_row_striping() |> gt::tab_style("vertical-align:top; font-size: 12px;", gt::cells_body()) ## ----echo=FALSE--------------------------------------------------------------- supported_models |> dplyr::rename_with(stringr::str_to_title) |> gt::gt() |> gt::fmt_markdown(columns = everything()) |> gt::tab_options(column_labels.font.weight = "bold") |> gt::opt_row_striping() |> gt::tab_style("vertical-align:top; font-size: 12px;", gt::cells_body())