Code
[[1]]
[[2]]
Individual Patient Plot Over Time
For illustration purposes, we will subset the adlb
dataset for safety population in treatment arm A and a specific lab parameter (ALT
).
The user can select different plotting_choices
depending on their preference. To demonstrate, separate plots are produced with a maximum of 3 observations each.
Here, patients’ individual baseline values will be shown for reference. Note that users can provide their own custom theme to the function via the ggtheme
argument.
plots <- g_ipp(
df = adlb_f,
xvar = "AVISIT",
yvar = "AVAL",
xlab = "Visit",
ylab = "SGOT/ALT (U/L)",
id_var = "Patient_ID",
title = "Individual Patient Plots",
subtitle = "Treatment Arm A",
add_baseline_hline = TRUE,
yvar_baseline = "BASE",
ggtheme = theme_minimal(),
plotting_choices = "split_by_max_obs",
max_obs_per_plot = 3
)
plots
[[1]]
[[2]]
library(tern)
library(dplyr)
library(ggplot2)
library(nestcolor)
# use small sample size
adsl <- random.cdisc.data::cadsl %>% slice(1:15)
adlb <- random.cdisc.data::cadlb %>% filter(USUBJID %in% adsl$USUBJID)
# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.
adlb <- df_explicit_na(adlb)
adlb_f <- adlb %>%
filter(
SAFFL == "Y",
PARAMCD == "ALT",
AVISIT != "SCREENING",
ARMCD == "ARM A"
) %>%
mutate(Patient_ID = sub(".*id-", "", USUBJID))
teal
Applibrary(teal.modules.clinical)
## Data reproducible code
data <- teal_data()
data <- within(data, {
library(dplyr)
# use small sample size
ADSL <- random.cdisc.data::cadsl %>% slice(1:15)
ADLB <- random.cdisc.data::cadlb %>% filter(USUBJID %in% ADSL$USUBJID)
# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.
ADSL <- df_explicit_na(ADSL)
ADLB <- df_explicit_na(ADLB) %>%
filter(AVISIT != "SCREENING")
})
datanames <- c("ADSL", "ADLB")
datanames(data) <- datanames
join_keys(data) <- default_cdisc_join_keys[datanames]
## Reusable Configuration For Modules
ADLB <- data[["ADLB"]]
## Setup App
app <- init(
data = data,
modules = modules(
tm_g_ipp(
label = "Individual Patient Plot",
dataname = "ADLB",
arm_var = choices_selected(
value_choices(ADLB, c("ARMCD")),
"ARM A"
),
paramcd = choices_selected(
value_choices(ADLB, "PARAMCD"),
"ALT"
),
aval_var = choices_selected(
variable_choices(ADLB, c("AVAL")),
"AVAL"
),
avalu_var = choices_selected(
variable_choices(ADLB, c("AVALU")),
"AVALU",
fixed = TRUE
),
id_var = choices_selected(
variable_choices(ADLB, c("USUBJID")),
"USUBJID",
fixed = TRUE
),
visit_var = choices_selected(
variable_choices(ADLB, c("AVISIT")),
"AVISIT"
),
baseline_var = choices_selected(
variable_choices(ADLB, c("BASE")),
"BASE",
fixed = TRUE
),
add_baseline_hline = FALSE,
separate_by_obs = FALSE
)
)
)
shinyApp(app$ui, app$server)
shinylive
allow you to modify to run shiny
application entirely in the web browser. Modify the code below and click re-run the app to see the results. The performance is slighly worse and some of the features (e.g. downloading) might not work at all.
#| standalone: true
#| viewerHeight: 800
#| editorHeight: 200
#| components: [viewer, editor]
#| layout: vertical
# -- WEBR HELPERS --
options(webr_pkg_repos = c("r-universe" = "https://insightsengineering.r-universe.dev", getOption("webr_pkg_repos")))
# -- APP CODE --
library(teal.modules.clinical)
## Data reproducible code
data <- teal_data()
data <- within(data, {
library(dplyr)
# use small sample size
ADSL <- random.cdisc.data::cadsl %>% slice(1:15)
ADLB <- random.cdisc.data::cadlb %>% filter(USUBJID %in% ADSL$USUBJID)
# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.
ADSL <- df_explicit_na(ADSL)
ADLB <- df_explicit_na(ADLB) %>%
filter(AVISIT != "SCREENING")
})
datanames <- c("ADSL", "ADLB")
datanames(data) <- datanames
join_keys(data) <- default_cdisc_join_keys[datanames]
## Reusable Configuration For Modules
ADLB <- data[["ADLB"]]
## Setup App
app <- init(
data = data,
modules = modules(
tm_g_ipp(
label = "Individual Patient Plot",
dataname = "ADLB",
arm_var = choices_selected(
value_choices(ADLB, c("ARMCD")),
"ARM A"
),
paramcd = choices_selected(
value_choices(ADLB, "PARAMCD"),
"ALT"
),
aval_var = choices_selected(
variable_choices(ADLB, c("AVAL")),
"AVAL"
),
avalu_var = choices_selected(
variable_choices(ADLB, c("AVALU")),
"AVALU",
fixed = TRUE
),
id_var = choices_selected(
variable_choices(ADLB, c("USUBJID")),
"USUBJID",
fixed = TRUE
),
visit_var = choices_selected(
variable_choices(ADLB, c("AVISIT")),
"AVISIT"
),
baseline_var = choices_selected(
variable_choices(ADLB, c("BASE")),
"BASE",
fixed = TRUE
),
add_baseline_hline = FALSE,
separate_by_obs = FALSE
)
)
)
shinyApp(app$ui, app$server)
[1] "2024-11-02 17:54:49 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)
bslib 0.8.0 2024-07-29 [1] CRAN (R 4.4.1)
cachem 1.1.0 2024-05-16 [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)
chromote 0.3.1 2024-08-30 [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)
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)
fontawesome 0.5.2 2023-08-19 [1] CRAN (R 4.4.1)
forcats 1.0.0 2023-01-29 [1] CRAN (R 4.4.1)
formatR 1.14 2023-01-17 [1] CRAN (R 4.4.1)
formatters * 0.5.9 2024-09-12 [1] CRAN (R 4.4.1)
geepack 1.3.12 2024-09-23 [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)
httpuv 1.6.15 2024-03-26 [1] CRAN (R 4.4.1)
jquerylib 0.1.4 2021-04-26 [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)
later 1.3.2 2023-12-06 [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)
logger 0.4.0 2024-10-22 [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)
memoise 2.0.1 2021-11-26 [1] CRAN (R 4.4.1)
mime 0.12 2021-09-28 [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)
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)
processx 3.8.4 2024-03-16 [1] CRAN (R 4.4.1)
promises 1.3.0 2024-04-05 [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)
R6 2.5.1 2021-08-19 [1] CRAN (R 4.4.1)
ragg 1.3.3 2024-09-11 [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)
sass 0.4.9 2024-03-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)
shiny * 1.9.1 2024-08-01 [1] CRAN (R 4.4.1)
shinycssloaders 1.1.0 2024-07-30 [1] CRAN (R 4.4.1)
shinyjs 2.1.0 2021-12-23 [1] CRAN (R 4.4.1)
shinyvalidate 0.1.3 2023-10-04 [1] CRAN (R 4.4.1)
shinyWidgets 0.8.7 2024-09-23 [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)
systemfonts 1.1.0 2024-05-15 [1] CRAN (R 4.4.1)
teal * 0.15.2 2024-03-07 [1] CRAN (R 4.4.1)
teal.code * 0.5.0 2024-01-11 [1] CRAN (R 4.4.1)
teal.data * 0.6.0 2024-04-30 [1] CRAN (R 4.4.1)
teal.logger 0.3.0 2024-11-02 [1] https://insightsengineering.r-universe.dev (R 4.4.1)
teal.modules.clinical * 0.9.1 2024-04-27 [1] CRAN (R 4.4.1)
teal.reporter 0.3.1 2024-03-15 [1] CRAN (R 4.4.1)
teal.slice * 0.5.1 2024-04-30 [1] CRAN (R 4.4.1)
teal.transform * 0.5.0 2024-02-17 [1] CRAN (R 4.4.1)
teal.widgets 0.4.2 2023-12-14 [1] CRAN (R 4.4.1)
tern * 0.9.6 2024-09-24 [1] CRAN (R 4.4.1)
tern.gee 0.1.5 2024-08-23 [1] CRAN (R 4.4.1)
testthat 3.2.1.1 2024-04-14 [1] CRAN (R 4.4.1)
textshaping 0.4.0 2024-05-24 [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)
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)
webshot 0.5.5 2023-06-26 [1] CRAN (R 4.4.1)
webshot2 0.1.1 2023-08-11 [1] CRAN (R 4.4.1)
websocket 1.4.2 2024-07-22 [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: IPPG01
subtitle: Individual Patient Plot Over Time
---
------------------------------------------------------------------------
{{< include ../../_utils/envir_hook.qmd >}}
For illustration purposes, we will subset the `adlb` dataset for safety population in treatment arm A and a specific lab parameter (`ALT`).
:::: {.panel-tabset}
```{r setup, echo = FALSE}
library(tern)
library(dplyr)
library(ggplot2)
library(nestcolor)
# use small sample size
adsl <- random.cdisc.data::cadsl %>% slice(1:15)
adlb <- random.cdisc.data::cadlb %>% filter(USUBJID %in% adsl$USUBJID)
# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.
adlb <- df_explicit_na(adlb)
adlb_f <- adlb %>%
filter(
SAFFL == "Y",
PARAMCD == "ALT",
AVISIT != "SCREENING",
ARMCD == "ARM A"
) %>%
mutate(Patient_ID = sub(".*id-", "", USUBJID))
```
## Standard Plot
::: {.panel-tabset .nav-justified group="webr"}
## {{< fa regular file-lines sm fw >}} Preview
The user can select different `plotting_choices` depending on their preference.
To demonstrate, separate plots are produced with a maximum of 3 observations each.
<!-- skip strict because of https://github.com/r-lib/gtable/pull/94 -->
```{r plots1, test = list(plots_v1 = "plots"), opts.label = "skip_test_strict"}
plots <- g_ipp(
df = adlb_f,
xvar = "AVISIT",
yvar = "AVAL",
xlab = "Visit",
ylab = "SGOT/ALT (U/L)",
id_var = "Patient_ID",
title = "Individual Patient Plots",
subtitle = "Treatment Arm A",
plotting_choices = "split_by_max_obs",
max_obs_per_plot = 3
)
plots
```
`r webr_code_labels <- c("setup", "plots1")`
{{< include ../../_utils/webr.qmd >}}
:::
## Plot with Patient Baselines as Reference
::: {.panel-tabset .nav-justified group="webr"}
## {{< fa regular file-lines sm fw >}} Preview
Here, patients' individual baseline values will be shown for reference.
Note that users can provide their own custom theme to the function via the `ggtheme` argument.
<!-- skip strict because of https://github.com/r-lib/gtable/pull/94 -->
```{r plots2, test = list(plots_v2 = "plots"), opts.label = "skip_test_strict"}
plots <- g_ipp(
df = adlb_f,
xvar = "AVISIT",
yvar = "AVAL",
xlab = "Visit",
ylab = "SGOT/ALT (U/L)",
id_var = "Patient_ID",
title = "Individual Patient Plots",
subtitle = "Treatment Arm A",
add_baseline_hline = TRUE,
yvar_baseline = "BASE",
ggtheme = theme_minimal(),
plotting_choices = "split_by_max_obs",
max_obs_per_plot = 3
)
plots
```
`r webr_code_labels <- c("setup", "plots2")`
{{< include ../../_utils/webr.qmd >}}
:::
## Data Setup
```{r setup}
#| code-fold: show
```
::::
{{< include ../../_utils/save_results.qmd >}}
## `teal` App
::: {.panel-tabset .nav-justified}
## {{< fa regular file-lines fa-sm fa-fw >}} Preview
```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)
## Data reproducible code
data <- teal_data()
data <- within(data, {
library(dplyr)
# use small sample size
ADSL <- random.cdisc.data::cadsl %>% slice(1:15)
ADLB <- random.cdisc.data::cadlb %>% filter(USUBJID %in% ADSL$USUBJID)
# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.
ADSL <- df_explicit_na(ADSL)
ADLB <- df_explicit_na(ADLB) %>%
filter(AVISIT != "SCREENING")
})
datanames <- c("ADSL", "ADLB")
datanames(data) <- datanames
join_keys(data) <- default_cdisc_join_keys[datanames]
## Reusable Configuration For Modules
ADLB <- data[["ADLB"]]
## Setup App
app <- init(
data = data,
modules = modules(
tm_g_ipp(
label = "Individual Patient Plot",
dataname = "ADLB",
arm_var = choices_selected(
value_choices(ADLB, c("ARMCD")),
"ARM A"
),
paramcd = choices_selected(
value_choices(ADLB, "PARAMCD"),
"ALT"
),
aval_var = choices_selected(
variable_choices(ADLB, c("AVAL")),
"AVAL"
),
avalu_var = choices_selected(
variable_choices(ADLB, c("AVALU")),
"AVALU",
fixed = TRUE
),
id_var = choices_selected(
variable_choices(ADLB, c("USUBJID")),
"USUBJID",
fixed = TRUE
),
visit_var = choices_selected(
variable_choices(ADLB, c("AVISIT")),
"AVISIT"
),
baseline_var = choices_selected(
variable_choices(ADLB, c("BASE")),
"BASE",
fixed = TRUE
),
add_baseline_hline = FALSE,
separate_by_obs = FALSE
)
)
)
shinyApp(app$ui, app$server)
```
{{< include ../../_utils/shinylive.qmd >}}
:::
{{< include ../../repro.qmd >}}