Code
mmrm() registered as emmeans extension
Forest Plot for Mixed-Effect Model Repeated Measures
For the following part, an MMRM model is fitted for the dataset and from this result forest plots are constructed for each set of subgroups, treatment arm, and visit that is of interest.
First an MMRM model is fitted for the whole dataset.
mmrm() registered as emmeans extension
Applying the tern.mmrm::extract_mmrm_subgroups
function prepares the obtained mmrm_results
for a specific visit - in this case we use the SCREENING
visit - and treatment arm relative to the reference arm. From these results a table is obtained using the tern.mmrm::tabulate_mmrm_subgroups
function from which the graphic can be directly obtained with tern::g_forest
.
Here we compare ARM A
with the reference arm, ARM B
.
df_a <- extract_mmrm_subgroups(
fit = mmrm_results,
visit = "SCREENING",
subgroups = c("group", "SEX"),
treatment_arm = "ARM A"
)
tab_a <- basic_table() %>%
tabulate_mmrm_subgroups(
df = df_a,
vars = c("n_tot", "diff", "ci", "pval")
)
plot <- g_forest(
tab_a,
logx = FALSE,
xlim = c(-5, 2.5),
x_at = c(-5, -2.5, 0, 2.5),
vline = 0
)
plot
Then we compare ARM C
with ARM B
.
df_c <- extract_mmrm_subgroups(
fit = mmrm_results,
visit = "SCREENING",
subgroups = c("group", "SEX"),
treatment_arm = "ARM C"
)
tab_c <- basic_table() %>%
tabulate_mmrm_subgroups(
df = df_c,
vars = c("n_tot", "diff", "ci", "pval")
)
plot <- g_forest(
tab_c,
logx = FALSE,
xlim = c(-5, 2.5),
x_at = c(-5, -2.5, 0, 2.5),
vline = 0
)
plot
library(dplyr)
library(tern.mmrm)
library(nestcolor)
adsl <- random.cdisc.data::cadsl
adqs <- random.cdisc.data::cadqs
adqs_f <- adqs %>%
dplyr::filter(PARAMCD == "FKSI-FWB" & !AVISIT %in% c("BASELINE")) %>%
droplevels() %>%
dplyr::mutate(ARMCD = factor(ARMCD, levels = c("ARM B", "ARM A", "ARM C"))) %>%
dplyr::mutate(
AVISITN = rank(AVISITN) %>%
as.factor() %>%
as.numeric() %>%
as.factor()
)
# Simulation of groups.
set.seed(2)
adqs_f_with_groups <- rbind(
within(
adqs_f[sample(seq_len(nrow(adqs_f)), size = 1 / 2 * nrow(adqs_f)), ],
group <- "subpopulation 1"
),
within(
adqs_f,
{
group <- "subpopulation 2"
AVAL <- AVAL + rnorm(length(AVAL), mean = 10, sd = 2)
USUBJID <- paste0(USUBJID, "-S2")
}
)
)
adqs_f_with_groups$group <- factor(adqs_f_with_groups$group)
[1] "2024-11-02 17:52:48 UTC"
─ 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
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)
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)
coda 0.19-4.1 2024-01-31 [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)
cowplot 1.1.3 2024-01-22 [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)
emmeans 1.10.5 2024-10-14 [1] CRAN (R 4.4.1)
estimability 1.5.1 2024-05-12 [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)
farver 2.1.2 2024-05-13 [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)
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)
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)
labeling 0.4.3 2023-08-29 [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)
magrittr * 2.0.3 2022-03-30 [1] CRAN (R 4.4.1)
MASS 7.3-61 2024-06-13 [2] CRAN (R 4.4.1)
Matrix 1.7-0 2024-04-26 [1] CRAN (R 4.4.1)
mmrm 0.3.14 2024-09-27 [1] CRAN (R 4.4.1)
multcomp 1.4-26 2024-07-18 [1] CRAN (R 4.4.1)
munsell 0.5.1 2024-04-01 [1] CRAN (R 4.4.1)
mvtnorm 1.3-1 2024-09-03 [1] CRAN (R 4.4.1)
nestcolor * 0.1.2 2023-06-09 [1] CRAN (R 4.4.1)
nlme 3.1-166 2024-08-14 [2] CRAN (R 4.4.1)
parallelly 1.38.0 2024-07-27 [1] CRAN (R 4.4.1)
pillar 1.9.0 2023-03-22 [1] CRAN (R 4.4.1)
pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.4.1)
purrr 1.0.2 2023-08-10 [1] CRAN (R 4.4.1)
R6 2.5.1 2021-08-19 [1] CRAN (R 4.4.1)
random.cdisc.data 0.3.16 2024-11-02 [1] https://insightsengineering.r-universe.dev (R 4.4.1)
rbibutils 2.3 2024-10-04 [1] CRAN (R 4.4.1)
Rcpp 1.0.13 2024-07-17 [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)
rtables * 0.6.10 2024-09-20 [1] CRAN (R 4.4.1)
sandwich 3.1-1 2024-09-15 [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)
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.mmrm * 0.3.2 2024-09-23 [1] CRAN (R 4.4.1)
testthat 3.2.1.1 2024-04-14 [1] CRAN (R 4.4.1)
TH.data 1.1-2 2023-04-17 [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)
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)
xtable 1.8-4 2019-04-21 [1] CRAN (R 4.4.1)
yaml 2.3.10 2024-07-26 [1] CRAN (R 4.4.1)
zoo 1.8-12 2023-04-13 [1] CRAN (R 4.4.1)
[1] /usr/local/lib/R/site-library
[2] /usr/local/lib/R/library
──────────────────────────────────────────────────────────────────────────────
.lock
fileDownload the .lock
file and use renv::restore()
on it to recreate environment used to generate this website.
---
title: MMRMG02
subtitle: Forest Plot for Mixed-Effect Model Repeated Measures
---
------------------------------------------------------------------------
{{< include ../../_utils/envir_hook.qmd >}}
:::: {.panel-tabset}
```{r setup, echo = FALSE}
library(dplyr)
library(tern.mmrm)
library(nestcolor)
adsl <- random.cdisc.data::cadsl
adqs <- random.cdisc.data::cadqs
adqs_f <- adqs %>%
dplyr::filter(PARAMCD == "FKSI-FWB" & !AVISIT %in% c("BASELINE")) %>%
droplevels() %>%
dplyr::mutate(ARMCD = factor(ARMCD, levels = c("ARM B", "ARM A", "ARM C"))) %>%
dplyr::mutate(
AVISITN = rank(AVISITN) %>%
as.factor() %>%
as.numeric() %>%
as.factor()
)
# Simulation of groups.
set.seed(2)
adqs_f_with_groups <- rbind(
within(
adqs_f[sample(seq_len(nrow(adqs_f)), size = 1 / 2 * nrow(adqs_f)), ],
group <- "subpopulation 1"
),
within(
adqs_f,
{
group <- "subpopulation 2"
AVAL <- AVAL + rnorm(length(AVAL), mean = 10, sd = 2)
USUBJID <- paste0(USUBJID, "-S2")
}
)
)
adqs_f_with_groups$group <- factor(adqs_f_with_groups$group)
```
## Comparing Multiple Populations
For the following part, an MMRM model is fitted for the dataset and from this result forest plots are constructed for each set of subgroups, treatment arm, and visit that is of interest.
First an MMRM model is fitted for the whole dataset.
```{r mmrm_results}
#| code-fold: show
mmrm_results <- fit_mmrm(
data = adqs_f_with_groups,
vars = list(
response = "AVAL",
covariates = c(),
id = "USUBJID",
arm = "ARMCD",
visit = "AVISIT"
),
cor_struct = "unstructured",
weights_emmeans = "equal",
parallel = TRUE
)
```
Applying the `tern.mmrm::extract_mmrm_subgroups` function prepares the obtained `mmrm_results` for a specific visit - in this case we use the `SCREENING` visit - and treatment arm relative to the reference arm.
From these results a table is obtained using the `tern.mmrm::tabulate_mmrm_subgroups` function from which the graphic can be directly obtained with `tern::g_forest`.
Here we compare `ARM A` with the reference arm, `ARM B`.
```{r plot1, test = list(plot_v1 = "plot"), fig.width = 15, fig.height = 4}
df_a <- extract_mmrm_subgroups(
fit = mmrm_results,
visit = "SCREENING",
subgroups = c("group", "SEX"),
treatment_arm = "ARM A"
)
tab_a <- basic_table() %>%
tabulate_mmrm_subgroups(
df = df_a,
vars = c("n_tot", "diff", "ci", "pval")
)
plot <- g_forest(
tab_a,
logx = FALSE,
xlim = c(-5, 2.5),
x_at = c(-5, -2.5, 0, 2.5),
vline = 0
)
plot
```
Then we compare `ARM C` with `ARM B`.
```{r plot2, test = list(plot_v2 = "plot"), fig.width = 15, fig.height = 4}
df_c <- extract_mmrm_subgroups(
fit = mmrm_results,
visit = "SCREENING",
subgroups = c("group", "SEX"),
treatment_arm = "ARM C"
)
tab_c <- basic_table() %>%
tabulate_mmrm_subgroups(
df = df_c,
vars = c("n_tot", "diff", "ci", "pval")
)
plot <- g_forest(
tab_c,
logx = FALSE,
xlim = c(-5, 2.5),
x_at = c(-5, -2.5, 0, 2.5),
vline = 0
)
plot
```
```{r test parameters, test = list(width = "width", width = "width"), echo = FALSE}
width <- 15
height <- 4
```
## Data Setup
```{r setup}
#| code-fold: show
```
::::
{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}