RBMIT01
Tables for RBMI
Set the imputation strategy to "MAR"
for each patient with at least one missing observation.
Draws
The rbmi::draws()
function fits the imputation models and stores the corresponding parameter estimates or Bayesian posterior parameter draws. The three main inputs to the rbmi::draws()
function are:
-
data
- The primary longitudinal data.frame containing the outcome variable and all covariates. -
data_ice
- A data.frame which specifies the first visit affected by an intercurrent event (ICE) and the imputation strategy for handling missing outcome data after the ICE. At most one ICE which is to be imputed by a non-MAR strategy is allowed per subject. -
method
- The statistical method used to fit the imputation models and to create imputed datasets.
Define the names of key variables in our dataset and the covariates included in the imputation model using rbmi::set_vars()
. Note that the covariates
argument can also include interaction terms.
Define which imputation method to use, then create samples for the imputation parameters by running the draws()
function.
Code
Compiling Stan model please wait...
SAMPLING FOR MODEL 'rbmi_mmrm' NOW (CHAIN 1).
Chain 1:
Chain 1: Gradient evaluation took 0.000262 seconds
Chain 1: 1000 transitions using 10 leapfrog steps per transition would take 2.62 seconds.
Chain 1: Adjust your expectations accordingly!
Chain 1:
Chain 1:
Chain 1: Iteration: 1 / 1200 [ 0%] (Warmup)
Chain 1: Iteration: 120 / 1200 [ 10%] (Warmup)
Chain 1: Iteration: 201 / 1200 [ 16%] (Sampling)
Chain 1: Iteration: 320 / 1200 [ 26%] (Sampling)
Chain 1: Iteration: 440 / 1200 [ 36%] (Sampling)
Chain 1: Iteration: 560 / 1200 [ 46%] (Sampling)
Chain 1: Iteration: 680 / 1200 [ 56%] (Sampling)
Chain 1: Iteration: 800 / 1200 [ 66%] (Sampling)
Chain 1: Iteration: 920 / 1200 [ 76%] (Sampling)
Chain 1: Iteration: 1040 / 1200 [ 86%] (Sampling)
Chain 1: Iteration: 1160 / 1200 [ 96%] (Sampling)
Chain 1: Iteration: 1200 / 1200 [100%] (Sampling)
Chain 1:
Chain 1: Elapsed Time: 0.511 seconds (Warm-up)
Chain 1: 1.645 seconds (Sampling)
Chain 1: 2.156 seconds (Total)
Chain 1:
Impute
The next step is to use the parameters from the imputation model to generate the imputed datasets. This is done via the rbmi::impute()
function. The function only has two key inputs: the imputation model output from rbmi::draws()
and the reference groups relevant to reference-based imputation methods. It’s usage is thus:
Analyze
The next step is to run the analysis model on each imputed dataset. This is done by defining an analysis function and then calling rbmi::analyse()
to apply this function to each imputed dataset.
Code
# Define analysis model
analyse_fun <- ancova
ref_levels <- levels(impute_obj$data$group[[1]])
names(ref_levels) <- c("ref", "alt")
analyse_obj <- rbmi::analyse(
imputations = impute_obj,
fun = analyse_fun,
vars = rbmi::set_vars(
subjid = "TMP_ID",
outcome = missing_var,
visit = vars$visit,
group = vars$group,
covariates = covariates$analyse
)
)
Pool
The rbmi::pool()
function can be used to summarize the analysis results across multiple imputed datasets to provide an overall statistic with a standard error, confidence intervals and a p-value for the hypothesis test of the null hypothesis that the effect is equal to 0. Using the broom::tidy()
function the rbmi
final results are reshaped.
Code
group est se_est lower_cl_est upper_cl_est est_contr se_contr
1 ref -1.615820 0.4862316 -2.575771 -0.6558685 NA NA
2 alt -1.707626 0.4749573 -2.645319 -0.7699335 -0.09180645 0.6826279
3 ref -4.218952 0.6505048 -5.503615 -2.9342892 NA NA
4 alt -2.815275 0.6364376 -4.072204 -1.5583461 1.40367691 0.9149382
5 ref -6.330717 0.7020406 -7.717703 -4.9437297 NA NA
6 alt -4.177543 0.6863985 -5.533665 -2.8214218 2.15317319 0.9854002
7 ref -7.540923 0.8133804 -9.152471 -5.9293739 NA NA
8 alt -4.824323 0.7521449 -6.310829 -3.3378160 2.71660019 1.1225222
lower_cl_contr upper_cl_contr p_value relative_reduc visit conf_level
1 NA NA NA NA 4 0.95
2 -1.4394968 1.255884 0.89317724 0.05681725 4 0.95
3 NA NA NA NA 5 0.95
4 -0.4032862 3.210640 0.12696838 -0.33270747 5 0.95
5 NA NA NA NA 6 0.95
6 0.2063790 4.099967 0.03040925 -0.34011524 6 0.95
7 NA NA NA NA 7 0.95
8 0.4945431 4.938657 0.01698541 -0.36024772 7 0.95
Create Output
Finally, use functions from the rtables
and tern
packages to generate a nicely formatted rtable
object.
Code
Visit ref alt
—————————————————————————————————————————————————————————————————————————
4
Adjusted Mean (SE) -1.616 (0.486) -1.708 (0.475)
95% CI (-2.576, -0.656) (-2.645, -0.770)
Difference in Adjusted Means (SE) -0.092 (0.683)
95% CI (-1.439, 1.256)
Relative Reduction (%) 5.7%
p-value (RBMI) 0.8932
5
Adjusted Mean (SE) -4.219 (0.651) -2.815 (0.636)
95% CI (-5.504, -2.934) (-4.072, -1.558)
Difference in Adjusted Means (SE) 1.404 (0.915)
95% CI (-0.403, 3.211)
Relative Reduction (%) -33.3%
p-value (RBMI) 0.1270
6
Adjusted Mean (SE) -6.331 (0.702) -4.178 (0.686)
95% CI (-7.718, -4.944) (-5.534, -2.821)
Difference in Adjusted Means (SE) 2.153 (0.985)
95% CI (0.206, 4.100)
Relative Reduction (%) -34.0%
p-value (RBMI) 0.0304
7
Adjusted Mean (SE) -7.541 (0.813) -4.824 (0.752)
95% CI (-9.152, -5.929) (-6.311, -3.338)
Difference in Adjusted Means (SE) 2.717 (1.123)
95% CI (0.495, 4.939)
Relative Reduction (%) -36.0%
p-value (RBMI) 0.0170
Data Setup
We use a publicly available example dataset from an antidepressant clinical trial of an active drug versus placebo from the rbmi
package. The relevant endpoint is the Hamilton 17-item depression rating scale (HAMD17
) which was assessed at baseline and at weeks 1, 2, 4, and 6. Study drug discontinuation occurred in 24% of subjects from the active drug and 26% of subjects from placebo. All data after study drug discontinuation are missing and there is a single additional intermittent missing observation.
Code
library(tern.rbmi)
library(dplyr)
set.seed(123)
data <- antidepressant_data
levels(data$THERAPY) <- c("PLACEBO", "DRUG") # This is important! The order defines the computation order later
missing_var <- "CHANGE"
vars <- list(
id = "PATIENT",
visit = "VISIT",
expand_vars = c("BASVAL", "THERAPY"),
group = "THERAPY"
)
covariates <- list(
draws = c("BASVAL*VISIT", "THERAPY*VISIT"),
analyse = c("BASVAL")
)
data <- data %>%
dplyr::select(PATIENT, THERAPY, VISIT, BASVAL, THERAPY, CHANGE) %>%
dplyr::mutate(dplyr::across(.cols = vars$id, ~ as.factor(.x))) %>%
dplyr::arrange(dplyr::across(.cols = c(vars$id, vars$visit)))
# Use expand_locf to add rows corresponding to visits with missing outcomes to the dataset
data_full <- do.call(
expand_locf,
args = list(
data = data,
vars = c(vars$expand_vars, vars$group),
group = vars$id,
order = c(vars$id, vars$visit)
) %>%
append(lapply(data[c(vars$id, vars$visit)], levels))
)
data_full <- data_full %>%
dplyr::group_by(dplyr::across(vars$id)) %>%
dplyr::mutate(!!vars$group := Filter(Negate(is.na), .data[[vars$group]])[1])
# there are duplicates - use first value
data_full <- data_full %>%
dplyr::group_by(dplyr::across(c(vars$id, vars$group, vars$visit))) %>%
dplyr::slice(1) %>%
dplyr::ungroup()
# need to have a single ID column
data_full <- data_full %>%
tidyr::unite("TMP_ID", dplyr::all_of(vars$id), sep = "_#_", remove = FALSE) %>%
dplyr::mutate(TMP_ID = as.factor(TMP_ID))
Reproducibility
Timestamp
[1] "2024-11-02 18:03:20 UTC"
Session Info
─ Session info ───────────────────────────────────────────────────────────────
setting value
version R version 4.4.1 (2024-06-14)
os Ubuntu 22.04.5 LTS
system x86_64, linux-gnu
ui X11
language (EN)
collate en_US.UTF-8
ctype en_US.UTF-8
tz Etc/UTC
date 2024-11-02
pandoc 3.4 @ /usr/bin/ (via rmarkdown)
─ Packages ───────────────────────────────────────────────────────────────────
package * version date (UTC) lib source
assertthat 0.2.1 2019-03-21 [1] CRAN (R 4.4.1)
backports 1.5.0 2024-05-23 [1] CRAN (R 4.4.1)
brio 1.1.5 2024-04-24 [1] CRAN (R 4.4.1)
broom * 1.0.7 2024-09-26 [1] CRAN (R 4.4.1)
callr 3.7.6 2024-03-25 [1] CRAN (R 4.4.1)
checkmate 2.3.2 2024-07-29 [1] CRAN (R 4.4.1)
cli 3.6.3 2024-06-21 [1] CRAN (R 4.4.1)
codetools 0.2-20 2024-03-31 [2] CRAN (R 4.4.1)
colorspace 2.1-1 2024-07-26 [1] CRAN (R 4.4.1)
curl 5.2.3 2024-09-20 [1] CRAN (R 4.4.1)
digest 0.6.37 2024-08-19 [1] CRAN (R 4.4.1)
dplyr * 1.1.4 2023-11-17 [1] CRAN (R 4.4.1)
evaluate 1.0.1 2024-10-10 [1] CRAN (R 4.4.1)
fansi 1.0.6 2023-12-08 [1] CRAN (R 4.4.1)
fastmap 1.2.0 2024-05-15 [1] CRAN (R 4.4.1)
formatters * 0.5.9 2024-09-12 [1] CRAN (R 4.4.1)
generics 0.1.3 2022-07-05 [1] CRAN (R 4.4.1)
ggplot2 3.5.1 2024-04-23 [1] CRAN (R 4.4.1)
glue 1.8.0 2024-09-30 [1] CRAN (R 4.4.1)
gridExtra 2.3 2017-09-09 [1] CRAN (R 4.4.1)
gtable 0.3.6 2024-10-25 [1] CRAN (R 4.4.1)
htmltools 0.5.8.1 2024-04-04 [1] CRAN (R 4.4.1)
htmlwidgets 1.6.4 2023-12-06 [1] CRAN (R 4.4.1)
inline 0.3.19 2021-05-31 [1] CRAN (R 4.4.1)
jsonlite 1.8.9 2024-09-20 [1] CRAN (R 4.4.1)
knitr 1.48 2024-07-07 [1] CRAN (R 4.4.1)
lattice 0.22-6 2024-03-20 [2] CRAN (R 4.4.1)
lifecycle 1.0.4 2023-11-07 [1] CRAN (R 4.4.1)
loo 2.8.0 2024-07-03 [1] CRAN (R 4.4.1)
magrittr * 2.0.3 2022-03-30 [1] CRAN (R 4.4.1)
Matrix 1.7-0 2024-04-26 [1] CRAN (R 4.4.1)
matrixStats 1.4.1 2024-09-08 [1] CRAN (R 4.4.1)
mmrm 0.3.14 2024-09-27 [1] CRAN (R 4.4.1)
munsell 0.5.1 2024-04-01 [1] CRAN (R 4.4.1)
nlme 3.1-166 2024-08-14 [2] CRAN (R 4.4.1)
pillar 1.9.0 2023-03-22 [1] CRAN (R 4.4.1)
pkgbuild 1.4.5 2024-10-28 [1] CRAN (R 4.4.1)
pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.4.1)
processx 3.8.4 2024-03-16 [1] CRAN (R 4.4.1)
ps 1.8.1 2024-10-28 [1] CRAN (R 4.4.1)
purrr 1.0.2 2023-08-10 [1] CRAN (R 4.4.1)
QuickJSR 1.4.0 2024-10-01 [1] CRAN (R 4.4.1)
R6 2.5.1 2021-08-19 [1] CRAN (R 4.4.1)
rbibutils 2.3 2024-10-04 [1] CRAN (R 4.4.1)
rbmi * 1.3.0 2024-11-02 [1] https://insightsengineering.r-universe.dev (R 4.4.1)
Rcpp 1.0.13 2024-07-17 [1] CRAN (R 4.4.1)
RcppParallel 5.1.9 2024-08-19 [1] CRAN (R 4.4.1)
Rdpack 2.6.1 2024-08-06 [1] CRAN (R 4.4.1)
rlang 1.1.4 2024-06-04 [1] CRAN (R 4.4.1)
rmarkdown 2.28 2024-08-17 [1] CRAN (R 4.4.1)
rstan 2.32.6 2024-03-05 [1] CRAN (R 4.4.1)
rtables * 0.6.10 2024-09-20 [1] CRAN (R 4.4.1)
scales 1.3.0 2023-11-28 [1] CRAN (R 4.4.1)
sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.4.1)
StanHeaders 2.32.10 2024-07-15 [1] CRAN (R 4.4.1)
stringi 1.8.4 2024-05-06 [1] CRAN (R 4.4.1)
stringr 1.5.1 2023-11-14 [1] CRAN (R 4.4.1)
survival 3.7-0 2024-06-05 [2] CRAN (R 4.4.1)
tern * 0.9.6 2024-09-24 [1] CRAN (R 4.4.1)
tern.rbmi * 0.1.3 2024-11-02 [1] https://insightsengineering.r-universe.dev (R 4.4.1)
testthat 3.2.1.1 2024-04-14 [1] CRAN (R 4.4.1)
tibble 3.2.1 2023-03-20 [1] CRAN (R 4.4.1)
tidyr 1.3.1 2024-01-24 [1] CRAN (R 4.4.1)
tidyselect 1.2.1 2024-03-11 [1] CRAN (R 4.4.1)
TMB 1.9.15 2024-09-09 [1] CRAN (R 4.4.1)
utf8 1.2.4 2023-10-22 [1] CRAN (R 4.4.1)
V8 6.0.0 2024-10-12 [1] CRAN (R 4.4.1)
vctrs 0.6.5 2023-12-01 [1] CRAN (R 4.4.1)
withr 3.0.2 2024-10-28 [1] CRAN (R 4.4.1)
xfun 0.49 2024-10-31 [1] CRAN (R 4.4.1)
yaml 2.3.10 2024-07-26 [1] CRAN (R 4.4.1)
[1] /usr/local/lib/R/site-library
[2] /usr/local/lib/R/library
──────────────────────────────────────────────────────────────────────────────
.lock
file
Download the .lock
file and use renv::restore()
on it to recreate environment used to generate this website.