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-12-21 17:36:32 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-12-21
pandoc 3.4 @ /usr/bin/ (via rmarkdown)
─ Packages ───────────────────────────────────────────────────────────────────
package * version date (UTC) lib source
backports 1.5.0 2024-05-23 [1] RSPM
brio 1.1.5 2024-04-24 [1] RSPM
broom 1.0.7 2024-09-26 [1] RSPM
checkmate 2.3.2 2024-07-29 [1] RSPM
cli 3.6.3 2024-06-21 [1] RSPM
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] RSPM
cowplot 1.1.3 2024-01-22 [1] RSPM
curl 6.0.1 2024-11-14 [1] RSPM
digest 0.6.37 2024-08-19 [1] RSPM
dplyr * 1.1.4 2023-11-17 [1] RSPM
emmeans 1.10.6 2024-12-12 [1] RSPM
estimability 1.5.1 2024-05-12 [1] RSPM
evaluate 1.0.1 2024-10-10 [1] RSPM
farver 2.1.2 2024-05-13 [1] RSPM
fastmap 1.2.0 2024-05-15 [1] RSPM
formatters * 0.5.9.9008 2024-12-21 [1] https://p~
generics 0.1.3 2022-07-05 [1] RSPM
ggplot2 3.5.1 2024-04-23 [1] RSPM
glue 1.8.0 2024-09-30 [1] RSPM
gtable 0.3.6 2024-10-25 [1] RSPM
htmltools 0.5.8.1 2024-04-04 [1] RSPM
htmlwidgets 1.6.4 2023-12-06 [1] RSPM
jsonlite 1.8.9 2024-09-20 [1] RSPM
knitr 1.49 2024-11-08 [1] RSPM
labeling 0.4.3 2023-08-29 [1] RSPM
lattice 0.22-6 2024-03-20 [2] CRAN (R 4.4.1)
lifecycle 1.0.4 2023-11-07 [1] RSPM
magrittr * 2.0.3 2022-03-30 [1] RSPM
MASS 7.3-61 2024-06-13 [2] CRAN (R 4.4.1)
Matrix 1.7-1 2024-10-18 [1] RSPM
mmrm 0.3.14.9001 2024-12-21 [1] https://p~
multcomp 1.4-26 2024-07-18 [1] CRAN (R 4.4.1)
munsell 0.5.1 2024-04-01 [1] RSPM
mvtnorm 1.3-2 2024-11-04 [1] RSPM
nestcolor * 0.1.2.9017 2024-12-21 [1] https://p~
nlme 3.1-166 2024-08-14 [2] CRAN (R 4.4.1)
parallelly 1.41.0 2024-12-18 [1] RSPM
pillar 1.10.0 2024-12-17 [1] RSPM
pkgcache 2.2.3 2024-09-12 [1] RSPM
pkgconfig 2.0.3 2019-09-22 [1] RSPM
processx 3.8.4 2024-03-16 [1] RSPM
ps 1.8.1 2024-10-28 [1] RSPM
purrr 1.0.2 2023-08-10 [1] RSPM
R6 2.5.1 2021-08-19 [1] RSPM
random.cdisc.data 0.3.16.9001 2024-12-21 [1] https://p~
rbibutils 2.3 2024-10-04 [1] RSPM
Rcpp 1.0.13-1 2024-11-02 [1] RSPM
Rdpack 2.6.2 2024-11-15 [1] RSPM
rlang 1.1.4 2024-06-04 [1] RSPM
rmarkdown 2.29 2024-11-04 [1] RSPM
rtables * 0.6.10.9014 2024-12-21 [1] https://p~
sandwich 3.1-1 2024-09-15 [1] CRAN (R 4.4.1)
scales 1.3.0 2023-11-28 [1] RSPM
sessioninfo 1.2.2 2021-12-06 [1] any (@1.2.2)
stringi 1.8.4 2024-05-06 [1] RSPM
stringr 1.5.1 2023-11-14 [1] RSPM
survival 3.8-3 2024-12-17 [1] RSPM
tern * 0.9.6.9017 2024-12-21 [1] https://p~
tern.mmrm * 0.3.2.9002 2024-12-21 [1] https://p~
testthat 3.2.2 2024-12-10 [1] RSPM
TH.data 1.1-2 2023-04-17 [1] CRAN (R 4.4.1)
tibble 3.2.1 2023-03-20 [1] RSPM
tidyr 1.3.1 2024-01-24 [1] RSPM
tidyselect 1.2.1 2024-03-11 [1] RSPM
TMB 1.9.15 2024-09-09 [1] RSPM
vctrs 0.6.5 2023-12-01 [1] RSPM
withr 3.0.2 2024-10-28 [1] RSPM
xfun 0.49 2024-10-31 [1] RSPM
xtable 1.8-4 2019-04-21 [1] RSPM
yaml 2.3.10 2024-07-26 [1] RSPM
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 >}}
```{r setup, echo = FALSE, warning = FALSE, message = 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)
```
::: panel-tabset
## 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 >}}