For this post, we need to load the following library:
The gtsummary
uses the tbl_regression()
function to automatically
generate results of the model in a table.
In this case, we use the Titanic dataset, with the
Survived
variable as the target.
# create dataset
data("Titanic")
df = as.data.frame(Titanic)
# create the model
model = glm(Survived ~ Age + Class + Sex + Freq,
family=binomial, data=df)
# generate table
model %>%
tbl_regression()
Characteristic  log(OR)^{1}  95% CI^{1}  pvalue 

Age  
Child  —  —  
Adult  0.62  1.0, 2.4  0.5 
Class  
1st  —  —  
2nd  0.03  2.0, 2.0  >0.9 
3rd  0.25  1.8, 2.4  0.8 
Crew  0.27  1.8, 2.4  0.8 
Sex  
Male  —  —  
Female  0.37  1.9, 1.1  0.6 
Freq  0.01  0.02, 0.00  0.3 
^{1} OR = Odds Ratio, CI = Confidence Interval 
If we take the code from above, we can add other
elements to the table that will make the table much more
informative and detailed:  add_glance_source_note()
: Adds
a footnote to the table with information from the glance()
function, like the number of observations, Rsquared for regression
models, etc  add_global_p()
: Appends a global pvalue to
the table which assesses the overall significance of
categorical variables.  add_q()
: Incorporates
qvalues in the table, which are adjusted pvalues used
in multiple testing to control the false discovery rate.
# create dataset
data("Titanic")
df = as.data.frame(Titanic)
# create the model
model = glm(Survived ~ Age + Class + Sex + Freq,
family=binomial, data=df)
# generate table
model %>%
tbl_regression(intercept=TRUE, conf.level=0.9) %>%
add_glance_source_note() %>%
add_global_p() %>%
add_q()
Characteristic  log(OR)^{1}  90% CI^{1}  pvalue  qvalue^{2} 

(Intercept)  0.10  1.4, 1.6  >0.9  >0.9 
Age  0.5  >0.9  
Child  —  —  
Adult  0.62  0.78, 2.1  
Class  >0.9  >0.9  
1st  —  —  
2nd  0.03  1.7, 1.7  
3rd  0.25  1.5, 2.0  
Crew  0.27  1.5, 2.0  
Sex  0.6  >0.9  
Male  —  —  
Female  0.37  1.7, 0.89  
Freq  0.01  0.02, 0.00  0.2  0.9 
Null deviance = 44.4; Null df = 31.0; Loglikelihood = 21.3; AIC = 56.5; BIC = 66.8; Deviance = 42.5; Residual df = 25; No. Obs. = 32  
^{1} OR = Odds Ratio, CI = Confidence Interval  
^{2} False discovery rate correction for multiple testing 
One easy way to show the results of 2 different models into a single
table is to:  create a first table with the first
model (logistic regression)  create a second table
with the second model (Cox proportional hazards regression) 
merge these tables with tbl_merge()

add a spanner for each model with the
tab_spanner
argument
In this case we use the trial
dataset:
library(survival)
library(gtsummary)
data(trial)
model_reglog = glm(response ~ trt + grade, data=trial, family = binomial) %>% tbl_regression()
model_cox = coxph(Surv(ttdeath, death) ~ trt + grade, data=trial) %>% tbl_regression()
tbl_merge(
list(model_reglog, model_cox),
tab_spanner = c("**Tumor Response**", "**Time to Death**")
)
Characteristic  Tumor Response  Time to Death  

log(OR)^{1}  95% CI^{1}  pvalue  log(HR)^{1}  95% CI^{1}  pvalue  
Chemotherapy Treatment  
Drug A  —  —  —  —  
Drug B  0.19  0.41, 0.81  0.5  0.22  0.15, 0.59  0.2 
Grade  
I  —  —  —  —  
II  0.06  0.82, 0.68  0.9  0.25  0.22, 0.72  0.3 
III  0.08  0.66, 0.82  0.8  0.52  0.07, 0.98  0.024 
^{1} OR = Odds Ratio, CI = Confidence Interval, HR = Hazard Ratio 
This post explained how to display the results of a regression model in a table using the gtsummary library. For more of this package, see the dedicated section or the table section.
👋 After crafting hundreds of R charts over 12 years, I've distilled my top 10 tips and tricks. Receive them via email! One insight per day for the next 10 days! 🔥