Further details ggrmsMD

library(rms)
library(rmsMD)

Introduction and setup

This vignette goes into further details for the ggrmsMD function. For further package information and basic use please refer to the vignette Standard_workflow_with_restricted_cubic_splines.

For these vignettes we will use a simulated dataset to predict the impact of age, BMI, Sex and Smoking status on outcome after surgery. The models are for illustration purposes only.

# Load in the simulated data
data <- simulated_rmsMD_data()

# Set the datadist which is required for rms modelling 
# (these two lines are standard)
dd <- datadist(data)    
options(datadist='dd') 
# Fit an OLS model including a restricted cubic spline 
# for Age and BMI (with 4 knots)
fit_lrm <- lrm(
        majorcomplication ~ 
                rcs(age, 4) +     # Age modelled using RCS with 4 knots
                rcs(bmi, 4) +     # BMI also modelled with RCS with 4 knots
                sex +             # Binary variable for sex
                smoking,          # Categorical variable for smoking status
        data = data                  
)

Plotting with ggrmsMD

Now that the model and overall p values have been assessed, the ggrmsMD function from rmsMD can be used to assess the relationship between variables modelled with restricted cubic splines, and the outcome.

As a minimum, the model fit and data should be passed into the function. ggrmsMD will then generate plots for all variables which were modelled with restricted cubic splines. By default: for linear regression models predicted outcome is plotted, for logistic regression OR is plotted and for Cox regression HR is plotted. All of these plots are adjusted for all other variables in the model.

All of the outputted plots are ggplots, and therefore can be further adapted using that framework.

Here is the most basic use case with the logistic regression model for post-operative complications above:

# most basic output
ggrmsMD(fit_lrm, data)

ggrmsMD has several additional options to improve these plot outputs for publications. Some of these options are shown below. For the examples below, this is done iteratively for demonstration purposes.

Arguments which alter the y axis are applied to all plots. This is standardised as all plots have originated from the same regression model:

ggrmsMD(fit_lrm, data,
        # custom y axis label 
        ylab = "Complications (adjusted OR)", 
        # set y axis limits so variables can be compared more easily
        ylim = c(0,3) 
        )

Shading can be applied to these plots to make it clear which side of the no-effect line represents inferior/superior clinical outcome. This is achieved by setting shade_inferior to “higher” or “lower”:

ggrmsMD(fit_lrm, data,
        ylab = "Complications (adjusted OR)", 
        ylim = c(0,3), 
        # specifies that OR > 1 reflects poorer outcomes 
        # (e.g. higher OR complications) these will be highlighted in red
        shade_inferior = "higher" 
        )

It may be preferable to have the y-axis on a log-scale rather than a linear scale.

# to have the y axis on a log-scale:
ggrmsMD(fit_lrm, data,
        ylab = "Complications (adjusted OR)", 
        ylim = c(0.25,4), 
        shade_inferior = "higher",
        log_y = TRUE, # have the y-axis on a log scale
        log_y_breaks = c(0.25, 0.5 , 1, 2, 4) # optionally set the y-axis breaks
        )

For logistic regression models like this one, predicted probability can be plotted instead of adjusted OR. For example:

# to plot predicted probability rather than adjusted OR. 
# This is adjusted to mode/mean of the other variables
ggrmsMD(fit_lrm, data,
        ylim = c(0,0.4), 
        lrm_prob = TRUE # set this to plot predicted probability
        )

Changes to x-axis settings and titles are applied individually to each plot, unlike y-axis settings which apply globally across all plots. To customise individual x-axes, pass a named list. For example, to change the x-axis labels for both variables and set x-axis limits only for age:

xlabels <- list ("age" = "Age (years)",
                 "bmi" = "Body Mass Index")

xlimits <- list("age" = c(35,65))

ggrmsMD(fit_lrm, data,
        ylab = "Complications (adjusted OR)", 
        ylim = c(0,3), 
        shade_inferior = "higher",
        xlabs = xlabels,
        xlims = xlimits
        )

The same approach is used if titles are required:

xlabels <- list ("age" = "Age (years)",
                 "bmi" = "Body Mass Index")

titles <- list ("age" = "Impact of Age on Complications",
                 "bmi" = "Impact of BMI on Complications")

ggrmsMD(fit_lrm, data,
        ylab = "Complications (adjusted OR)", 
        ylim = c(0,3), 
        shade_inferior = "higher",
        xlabs = xlabels,
        titles = titles
        )

The x-axis can also be displayed on a log-scale, rather than a linear scale. This is done using log_x_vars to specify which variables to have log-scaled x-axes:

ggrmsMD(fit_lrm, data,
        ylab = "Complications (adjusted OR)", 
        ylim = c(0,3), 
        shade_inferior = "higher",
        xlabs = xlabels,
        titles = titles,
        log_x_vars = c("age", "bmi")
        )

combined is set to TRUE by default to output a single combined plot, as shown above. combined = FALSE can be used to output a list of plots. If a single plot is required, this can be achieved with the var argument:

ggrmsMD(fit_lrm, data,
        ylab = "Complications (adjusted OR)", 
        ylim = c(0,3), 
        shade_inferior = "higher",
        var = "age"
        )

For linear regression models the output is the predicted outcome. For example, here are the plots for length of stay linear model:

fit_ols <- ols(
        lengthstay ~ 
                rcs(age, 4) +
                rcs(bmi, 4) +
                sex +
                smoking,
        data = data
)

ggrmsMD(fit_ols, data,
        ylim = c(20,50),
        ylab = "Predicted length of stay"
        )