Title: | Cumulative Odds Ratio Plot |
Version: | 1.0.2 |
Description: | Create cumulative odds ratio plot to visually inspect the proportional odds assumption from the proportional odds model. |
License: | MIT + file LICENSE |
Encoding: | UTF-8 |
RoxygenNote: | 7.3.2 |
URL: | https://github.com/Yongxi-Long/CORPlot |
BugReports: | https://github.com/Yongxi-Long/CORPlot/issues |
Suggests: | testthat (≥ 3.0.0) |
Config/testthat/edition: | 3 |
Depends: | R (≥ 3.5) |
LazyData: | true |
Imports: | ggplot2, knitr, stats, VGAM |
NeedsCompilation: | no |
Packaged: | 2025-09-26 14:25:18 UTC; ylong |
Author: | Yongxi Long [aut, cre, cph] |
Maintainer: | Yongxi Long <y.long@lumc.nl> |
Repository: | CRAN |
Date/Publication: | 2025-10-03 12:50:02 UTC |
Create Cumulative Odds Ratio Plot
Description
This function produces a cumulative odds ratio (COR) plot for an ordinal outcome. Users can either provide a dataset with a formula and grouping variable so that odds ratios are estimated internally, or supply a pre-computed data frame of odds ratios directly.
Usage
CORPlot(
data = NULL,
formula = NULL,
GroupName = NULL,
upper = FALSE,
confLevel = 0.95,
OR_df = NULL
)
Arguments
data |
A data frame containing the outcome and covariate(s).
Required if |
formula |
A model formula specifying the ordinal outcome on the left-hand side
and the grouping variable (or covariates) on the right-hand side
(e.g., |
GroupName |
Optional character string specifying the name
of the grouping (exposure) variable for which odds ratios are
to be extracted. If |
upper |
Logical; if |
confLevel |
Confidence level; default is 0.95 |
OR_df |
Optional data frame of externally computed odds ratios. Must contain at least the following columns:
If supplied, the arguments |
Details
If OR_df
is not supplied, the function internally fits two models:
a multinomial regression via PerformLogReg
to estimate binary odds ratios for each cutpoint,
and a proportional odds model via PerformPO
to estimate the common odds ratio.
These are combined into a single data frame and visualized.
Value
A list with two elements:
-
ORs
: A data frame of odds ratios used for plotting. -
plot
: Aggplot2
object displaying the cumulative odds ratio plot.
Examples
# Use internal model fitting
data(df_MR_CLEAN)
res <- CORPlot(
data = df_MR_CLEAN,
formula = mRS ~ group,
GroupName = "group",
confLevel = 0.90
)
res[["Cumulative Odds Ratio Plot"]] # show the plot
# Use external OR data.frame
OR_df <- data.frame(
Label = c("score<=1", "score<=2", "common OR"),
OR = c(1.2, 1.5, 1.3),
lowerCI = c(0.9, 1.1, 1.0),
upperCI = c(1.6, 2.0, 1.7)
)
res2 <- CORPlot(OR_df = OR_df)
res2[["Cumulative Odds Ratio Plot"]]
Perform Cumulative Logistic Regression and Extract Binary Odds Ratios
Description
Fits a cumulative logistic regression model for an ordinal outcome using VGAM, and extracts the estimated binary odds ratios and 95% confidence intervals for the specified grouping variable across all possible cutpoints
Usage
PerformLogReg(data, formula, GroupName = NULL, upper = FALSE, confLevel = 0.95)
Arguments
data |
A data frame containing variables in the model |
formula |
A formula specifying the model, with an ordinal
outcome on the left-hand side and one or more predictors
on the right-hand side (e.g. |
GroupName |
Optional character string specifying the name
of the grouping (exposure) variable for which odds ratios are
to be extracted. If |
upper |
Logical; if |
confLevel |
Confidence level; default is 0.95 |
Details
The function uses vglm
with
cumulative
family to fit an ordinal
regression model without the proportional odds assumption
(parallel = FALSE
). Confidence intervals are computed
using confint
; if this fails, confidence
intervals are returned as NA
.
Value
A data frame with one row per binary cut-point. Columns are:
- Label
Text label of the cut-point (e.g.
"mRS <= 2"
).- OR
Estimated odds ratio for
GroupName
.- lower95CI
Lower bound of the 95% confidence interval.
- upper95CI
Upper bound of the 95% confidence interval.
Examples
if (requireNamespace("VGAM", quietly = TRUE)) {
# Simulated data
set.seed(123)
dat <- data.frame(
mRS = factor(sample(0:3, 100, replace = TRUE), ordered = TRUE),
group = sample(c("A", "B"), 100, replace = TRUE)
)
# Fit and extract odds ratios
PerformLogReg(dat, mRS ~ group, GroupName = "group")
}
Perform Proportional Odds Model and Extract the Common Odds Ratio
Description
Fits a proportional odds model for an ordinal outcome using VGAM, and extracts the estimated common odds ratio and its 95% confidence intervals for the specified grouping variable
Usage
PerformPO(data, formula, GroupName = NULL, upper = FALSE, confLevel = 0.95)
Arguments
data |
A data frame containing variables in the model |
formula |
A formula specifying the model, with an ordinal
outcome on the left-hand side and one or more predictors
on the right-hand side (e.g. |
GroupName |
Optional character string specifying the name
of the grouping (exposure) variable for which odds ratios are
to be extracted. If |
upper |
Logical; if |
confLevel |
Confidence level; default is 0.95 |
Details
The function uses vglm
with
cumulative
family to fit an ordinal
regression model with the proportional odds assumption
(parallel = TRUE
). Confidence intervals are computed
using confint
; if this fails, confidence
intervals are returned as NA
.
Value
A data frame with one row. Columns are:
- Label
common OR
- OR
Estimated common odds ratio for
GroupName
.- lower95CI
Lower bound of the 95% confidence interval.
- upper95CI
Upper bound of the 95% confidence interval.
Examples
if (requireNamespace("VGAM", quietly = TRUE)) {
# Simulated data
set.seed(123)
dat <- data.frame(
mRS = factor(sample(0:3, 100, replace = TRUE), ordered = TRUE),
group = sample(c("A", "B"), 100, replace = TRUE)
)
# Fit and extract the common odds ratio
PerformPO(dat, mRS ~ group, GroupName = "group")
}
MR CLEAN trial data
Description
Patient outcome data from the MR CLEAN trial
Usage
df_MR_CLEAN
Format
df_MR_CLEAN
A data frame with 500 rows and 2 columns:
- mRS
Modified Rankin Scale
- group
Treatment group assignment; 1 = Intervention; 0 = Control
- sex
Sex indicator; 1 = women; 0 = men
Source
DOI: 10.1056/NEJMoa1411587