---
title: "Comprehensive Individual Patient Profile"
number-sections: true
format:
html:
self-contained: true
code-fold: true
code-tools: true
coddelink: true
comments:
hypothesis: true
html-math-method: katex
pdf: default
docx: default
jats: default
# acs-pdf: default
ipynb: default
format-links: [ipynb]
execute:
echo: false
toc: true
toc-depth: 5
editor: visual
---
```{r}
#| label: load library
#| warning: false
rm(list=ls(all=TRUE))
library(tinytex)
library(ggplot2)
library(plotly)
library(dplyr)
library(haven)
library(labelled)
library(bslib)
library(DT)
library(r2rtf)
library(metalite)
library(metalite.table1)
library(haven)
library(tidyr)
library(tools)
library(gtsummary)
library(stringr)
library(RColorBrewer)
library(flextable)
library(stringr)
library(tern)
library(tidyverse)
library(vistime)
library(readxl)
library(hrbrthemes)
library(rlang)
library(lubridate)
library(fuzzyjoin)
library(pharmaverseadam)
library(tidyverse)
library(knitr)
library(kableExtra)
library(Hmisc)
```
```{r setup, include=FALSE}
knitr::opts_chunk$set(warning = FALSE)
```
```{r}
adsl<-pharmaverseadam::adsl
admh<-pharmaverseadam::admh
adcm<-pharmaverseadam::adcm
adex<-pharmaverseadam::adex
adae<-pharmaverseadam::adae
adlb<-pharmaverseadam::adlb
```
## Subject : `r adsl$USUBJID[1]`
### Demographic
```{r,echo=FALSE,results='asis' }
#| column: page
# Define a mapping from variable names to descriptive labels
variable_labels <- c(
SEX = "Gender",
RACE = "Race",
ETHNIC = "Ethnicity",
ARM = "Treatment Arm",
COUNTRY = "Country",
SITEID = "Site ID",
TRTSDT = "Treatment Start Date",
TRTEDT = "Treatment End Date"
)
subject_id <- adsl$USUBJID[1]
subject_data <- adsl %>%
filter(USUBJID == subject_id) %>%
select(SEX, RACE, ETHNIC, ARM, COUNTRY, SITEID, TRTSDT, TRTEDT) %>%
mutate(across(everything(), as.character)) # Convert all values to character
#Convert from wide to long format
subject_data_long <- subject_data %>%
pivot_longer(cols = everything(), names_to = "Label", values_to = "Value") %>%
mutate(Label = variable_labels[Label])
# Create flextable
flextable_object <- flextable(subject_data_long) %>%
set_header_labels(Label = "Demographic", Value = " ") %>%
autofit() %>%
fontsize(size = 14, part = "all")
flextable_object<-flextable_object%>%width( j = c("Label", "Value"), width = c(5, 10), unit = "in")
flextable_object<-flextable_object%>%delete_part( part = "header")
flextable_object<-flextable_object%>%hline_top(part = "all")
flextable_object<-flextable_object%>%fix_border_issues(part = "all")
flextable_object
```
### Medical History (Start - End)
```{r}
#| column: page
MH <- admh %>%
filter(USUBJID == subject_id) %>%
select(MHBODSYS, MHDECOD,MHSTDTC, MHENDTC) # Convert all values to character
# Function to get labels from a dataframe (assuming Hmisc or similar label structure)
get_labels <- function(df) {
sapply(names(df), function(x) label(df[[x]]))
}
# Extract labels for the selected columns
variable_labels <- get_labels(MH)
# Create the flextable with custom headers extracted from variable labels
flextable_MH <- flextable(MH) %>%
set_header_labels(
MHBODSYS = variable_labels["MHBODSYS"],
MHDECOD = variable_labels["MHDECOD"],
MHSTDTC = variable_labels["MHSTDTC"],
MHENDTC = variable_labels["MHENDTC"]
) %>%
autofit() %>%
fontsize(size = 12, part = "all")
flextable_MH
```
### Concomitant Medications
```{r}
#| column: page
adcm.sub <- adcm %>%
filter(USUBJID == subject_id) %>%
select(USUBJID,CMTRT, CMCLAS, CMSTDTC, CMENDTC, CMSTDY, CMENDY) %>%
mutate( eventstatus = case_when(
is.na(CMSTDY) & !is.na(CMENDY) ~ "◀", # Unicode for left-pointing triangle (Missing start)
!is.na(CMSTDY) & is.na(CMENDY) ~ "▶",
is.na(CMSTDY) & is.na(CMENDY) ~ "", # Unicode for right-pointing triangle (Missing end)
TRUE ~ "Complete"
))
MH <- adcm %>%
filter(SUBJID == subject_id) %>%
select(CMTRT, CMCLAS,CMSTDTC,CMENDTC,CMSTDY,CMENDY) # Convert all values to character
```
```{r,results='asis' }
#| column: page
# Create a list of plotly objects for a subset of subject IDs
font_size=10
CMplot <- function(subject_id) {
subject_data <- adcm.sub%>% filter(USUBJID == subject_id)%>%
select(CMTRT, CMCLAS,CMSTDTC,CMENDTC,CMSTDY,CMENDY,eventstatus)
# Create the ggplot
p <- ggplot(subject_data) +
geom_segment(aes(x = CMSTDY, y = CMTRT,xend = CMENDY, yend = CMTRT,color = CMCLAS), size = 2, lineend = "round") +
geom_text(data = filter(subject_data, eventstatus %in% c("▶")),
aes(x = CMSTDY, y = CMTRT,color = CMCLAS, label = "S"), size = 4, fontface = "bold") +
geom_text(data = filter(subject_data, eventstatus %in% c( "◀")),
aes(x = CMENDY, y = CMTRT,color = CMCLAS, label = "E"), size = 4, fontface = "bold") +
labs( x = "Study Day", y = "Concomitant Medication", color = "Medication Class") +
theme_minimal() +
theme(panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
panel.grid.major.y = element_line(color = "grey80"),
axis.text.y = element_text(hjust = 0, size = font_size),
axis.text.x = element_text(size = font_size),
axis.title.x = element_text(size = font_size),
axis.title.y = element_text(size = font_size),
plot.title = element_text(size = font_size, hjust = 0.5),
legend.text = element_text(size = font_size),
legend.title = element_text(size = font_size)
)
# Try converting this simple plot to plotly
# Convert to plotly
ggplotly(p)
}
htmltools::tagList(CMplot(subject_id))
```
### Treatment Exposure
```{r}
#| column: page
font_size=10
# Create a named vector for severity colors
severity_colors <- c("MILD" ="black" , "MODERATE" = "brown", "SEVERE" = "red")
adex.sub <- adex %>%
filter(USUBJID == subject_id) %>%
select(USUBJID, EXTRT, EXSTDTC, EXENDTC, EXSTDY, EXENDY, EXDOSE, EXDOSU, VISIT) %>%
mutate( eventstatus = case_when(
is.na(EXSTDY) & !is.na(EXENDY) ~ "◀", # Unicode for left-pointing triangle (Missing start)
!is.na(EXSTDY) & is.na(EXENDY) ~ "▶",
is.na(EXSTDY) & is.na(EXENDY) ~ "", # Unicode for right-pointing triangle (Missing end)
TRUE ~ "Complete"
))
adex.sub$EXSTDT <- as.Date(adex.sub$EXSTDTC)
adex.sub$EXENDT <- as.Date(adex.sub$EXENDTC)
EXplot <- function(subject_id) {
subject_data <- adex.sub %>% filter(USUBJID == subject_id)
# Create the ggplot
p <- ggplot(subject_data) +
geom_segment(size = 2,aes(x = EXSTDT, xend = EXENDT, y = EXDOSE, yend = EXDOSE, group=VISIT, color = EXTRT,
text = paste("Start Date:", EXSTDT, "\nEnd Date:", EXENDT, "\nTreatment:",EXTRT, "\nDose:", EXDOSE, EXDOSU)),alpha=0.7, lineend = "round") +
geom_point(data = filter(subject_data, eventstatus %in% c("▶")),
aes(x = EXSTDT, y = EXDOSE,color = EXTRT,group=VISIT), size = 2, alpha=0.7, fontface = "bold") +
geom_point(data = filter(subject_data, eventstatus %in% c( "◀")),
aes(x = EXENDT, y = EXDOSE,color = EXTRT,group=VISIT), size = 2, alpha=0.7, fontface = "bold") +
labs( x = "Study Day", y = "Exposure", color = "Treatment") +
theme_minimal() +
theme(panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
panel.grid.major.y = element_line(color = "grey80"),
axis.text.y = element_text(hjust = 0, size = font_size),
axis.text.x = element_text(size = font_size),
axis.title.x = element_text(size = font_size),
axis.title.y = element_text(size = font_size),
plot.title = element_text(size = font_size, hjust = 0.5),
legend.text = element_text(size = font_size),
legend.title = element_text(size = font_size))
# ggplotly(p, width = 1800, height = 500)
ggplotly(p,tooltip = "text", height=500)
}
htmltools::tagList(EXplot(subject_id))
```
### Adverse Events
```{r}
#| column: page
font_size=10
# Create a named vector for severity colors
severity_colors <- c("MILD" ="black" , "MODERATE" = "brown", "SEVERE" = "red")
adae.sub <- adae %>%
filter(USUBJID == subject_id) %>%
select(USUBJID, AETERM, AESTDTC, AEENDTC, AESTDY, AEENDY, AESEV) %>%
mutate( eventstatus = case_when(
is.na(AESTDY) & !is.na(AEENDY) ~ "◀", # Unicode for left-pointing triangle (Missing start)
!is.na(AESTDY) & is.na(AEENDY) ~ "▶",
is.na(AESTDY) & is.na(AEENDY) ~ "", # Unicode for right-pointing triangle (Missing end)
TRUE ~ "Complete"
))
adae.sub$AESEV <- toupper(adae.sub$AESEV)
adae.sub$AESEV <- factor(adae.sub$AESEV, levels = c("MILD", "MODERATE", "SEVERE"))
AEplot <- function(subject_id) {
subject_data <- adae.sub %>% filter(USUBJID == subject_id)
# Create the ggplot
p <- ggplot(subject_data, aes(x = AESTDY, xend = AEENDY, y = AETERM, yend = AETERM, color = AESEV)) +
geom_segment(size = 2, lineend = "round") +
geom_text(data = filter(subject_data, eventstatus %in% c("▶")),
aes(x = AESTDY, y = AETERM,color = AESEV, label = "S"), size = 4, fontface = "bold") +
geom_text(data = filter(subject_data, eventstatus %in% c( "◀")),
aes(x = AEENDY, y = AETERM,color = AESEV, label = "E"), size = 4, fontface = "bold") +
scale_color_manual(values = severity_colors) +
labs( x = "Study Day", y = "Lab value", color = "Status") +
theme_minimal() +
theme(panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
panel.grid.major.y = element_line(color = "grey80"),
axis.text.y = element_text(hjust = 0, size = font_size),
axis.text.x = element_text(size = font_size),
axis.title.x = element_text(size = font_size),
axis.title.y = element_text(size = font_size),
plot.title = element_text(size = font_size, hjust = 0.5),
legend.text = element_text(size = font_size),
legend.title = element_text(size = font_size))
# ggplotly(p, width = 1800, height = 500)
ggplotly(p, height=500)
}
htmltools::tagList(AEplot(subject_id))
```
### Laboratory Test Measurements
```{r}
#| column: page
font_size=10
severity_colors <- c("NORMAL" ="black" , "LOW" = "brown", "HIGH" = "red")
severity_shapes <- c("NORMAL" =16 , "LOW" = 25, "HIGH" = 24)
adlb.sub <- adlb %>%
filter(USUBJID == subject_id) %>%
select(USUBJID,LBTEST, AVAL, LBSTRESU,LBDTC, ANRIND)
adlb.sub$LBDT<-as.Date(adlb.sub$LBDTC)
adlb.sub<-adlb.sub[complete.cases(adlb.sub),]
subject_data <- adlb.sub %>% filter(USUBJID == subject_id)
lbtype<-unique(subject_data$LBTEST)
LBplot <-lapply(lbtype[1:length(lbtype)], function(lbtype) {
# subject_data <- adlb.sub %>% filter(USUBJID == subject_id)%>%filter(LBTEST !="Leukocytes")
if (lbtype %in% c(unique(subject_data$LBTEST))) {
lb_data <- subject_data %>% filter(LBTEST == lbtype)
p <- ggplot(lb_data) +
geom_point(aes(x=LBDT,y =AVAL,text = paste("Date:", LBDT, "\n Value:", AVAL, LBSTRESU), color=ANRIND, shape=ANRIND),size = 2, alpha=0.7)+
scale_color_manual(values = severity_colors) +
scale_shape_manual(values = severity_shapes)+
geom_line(aes(x=LBDT,y =AVAL))+
labs(title=lbtype, x = "Analysis Date", y = "Value", color = "Type") +
theme_minimal() +
theme(panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
panel.grid.major.y = element_line(color = "grey80"),
axis.text.y = element_text(hjust = 0, size = font_size),
axis.text.x = element_text(size = font_size),
axis.title.x = element_text(size = font_size),
axis.title.y = element_text(size = font_size),
plot.title = element_text(size = font_size, face="bold"),
legend.text = element_text(size = font_size),
legend.title = element_text(size = font_size))
}
ggplotly(p, height=250, tooltip="text")
}
)
# Use htmltools to render the plots
htmltools::tagList(LBplot)
```