Nothing
## ----setup, include = FALSE---------------------------------------------------
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>"
)
library(admiraldev)
## ----message=FALSE------------------------------------------------------------
library(admiral)
library(dplyr)
library(lubridate)
library(stringr)
library(pharmaversesdtm) # Contains example datasets from the CDISC pilot project or simulated
# ---- Load source datasets ----
# Use e.g. haven::read_sas to read in .sas7bdat, or other suitable functions
# as needed and assign to the variables below.
# For illustration purposes read in admiral test data
# Load IS, EX and ADSL from pharmaversesdtm and admiral
is <- pharmaversesdtm::is_ada
ex <- pharmaversesdtm::ex
adsl <- admiral::admiral_adsl
# When SAS datasets are imported into R using haven::read_sas(), missing
# character values from SAS appear as "" characters in R, instead of appearing
# as NA values. Further details can be obtained via the following link:
# https://pharmaverse.github.io/admiral/cran-release/articles/admiral.html#handling-of-missing-values # nolint
ex <- convert_blanks_to_na(ex)
is <- convert_blanks_to_na(is)
adsl <- convert_blanks_to_na(adsl)
# Define values for records with overall values
# Suggested are AVISIT=Overall, AVISITN=11111
overall_avisit <- "OVERALL"
overall_avisitn <- 11111
## ----echo=FALSE---------------------------------------------------------------
ex <- filter(ex, USUBJID %in% c(
"01-701-1015", "01-701-1023", "01-701-1442", "01-701-1034", "01-701-1133", "01-701-1028",
"01-704-1008", "01-704-1017", "01-704-1093", "01-710-1249"
))
is <- filter(is, USUBJID %in% c(
"01-701-1015", "01-701-1023", "01-701-1442", "01-701-1034", "01-701-1133", "01-701-1028",
"01-704-1008", "01-704-1017", "01-704-1093", "01-710-1249"
))
## ----message=FALSE------------------------------------------------------------
# Derivations ----
is_dates <- is %>%
# Filter as needed (i.e. exclude ISSTAT has "NOT DONE")
filter(!(ISSTAT %in% c("NOT DONE")) & toupper(ISBDAGNT) == "XANOMELINE") %>%
# Initial preparation and core variables
mutate(
# ADATYPE and ADAPARM are assigned values to serve BY analyte processing
# Uncomment if Setting ADATYPE based on SDTM V1.x ISTESTCD
# ADATYPE = case_when(
# toupper(ISTESTCD) == "ADATEST1" ~ "ADA_BAB",
# toupper(ISTESTCD) == "NABTEST1" ~ "ADA_NAB",
# TRUE ~ NA_character_
# ),
# Uncomment if Setting ADAPARM based on SDTM V1.x ISTESTCD
# ADAPARM = ISTESTCD,
# Setting ADATYPE based on SDTM V2.x ISTESTCD (assumed to have ADA_BAB, ADA_NAB)
# Remove or comment out if not >= SDTM V2.x
ADATYPE = ISTESTCD,
# Setting ADAPARM based on SDTM V2.x ISBDAGNT
# Remove or comment out if not >= SDTM V2.x
ADAPARM = ISBDAGNT,
# When SDTM V1.x, Setting ISBDAGNT from ISTESTCD to work with template
# ISBDAGNT = ISTESTCD,
# Map the analyte test to corresponding DRUG in on EX.EXTRT
# This is especially critical when multiple analytes and EX.EXTRT instances
DRUG = case_when(
toupper(ADAPARM) == "XANOMELINE" ~ "XANOMELINE",
toupper(ADAPARM) == "OTHER_DRUG" ~ "OTHER_DRUG",
TRUE ~ NA_character_
),
# Set AVISIT and AVISITN based on VISIT and VISITNUM
AVISIT = VISIT,
AVISITN = VISITNUM
) %>%
# Assign nominal time to NFRLT in DAYS
# Special visits can be set to NA then can add more code to assign custom values
# (i.e. UNSCHEDULED to 99999, etc.)
derive_var_nfrlt(
new_var = NFRLT,
new_var_unit = FRLTU,
out_unit = "DAYS",
tpt_var = ISTPT,
visit_day = VISITDY,
treatment_duration = 0,
set_values_to_na = str_detect(toupper(VISIT), "UNSCHED") | str_detect(toupper(VISIT), "TREATMENT DISC")
) %>%
mutate(
NFRLT = case_when(
str_detect(toupper(VISIT), "TREATMENT DISC") ~ 99997,
str_detect(toupper(VISIT), "UNSCHED") ~ 99999,
TRUE ~ NFRLT
)
) %>%
# Join ADSL with is (need TRTSDT for ADY derivation)
derive_vars_merged(
dataset_add = adsl,
new_vars = exprs(TRTSDT),
by_vars = exprs(STUDYID, USUBJID)
) %>%
# Derive analysis date/time then compute ADY
# Impute missing time to 00:00:00 or as desired.
# Could replace this code with custom imputation code or function
derive_vars_dtm(
new_vars_prefix = "A",
highest_imputation = "s",
dtc = ISDTC,
ignore_seconds_flag = FALSE,
time_imputation = "00:00:00"
) %>%
# Derive dates and times from date/times
derive_vars_dtm_to_dt(exprs(ADTM)) %>%
derive_vars_dtm_to_tm(exprs(ADTM)) %>%
derive_vars_dy(reference_date = TRTSDT, source_vars = exprs(ADT))
## ----eval=TRUE, echo=FALSE----------------------------------------------------
dataset_vignette(
is_dates,
display_vars = exprs(
USUBJID, ISBDAGNT, ADATYPE, ADAPARM, DRUG, VISIT, ADTM, NFRLT
)
)
## ----message=FALSE------------------------------------------------------------
# ---- Get dosing information ----
ex_dates <- ex %>%
# Keep applicable desired records based on EXTRT and/or dose values (>=0, >0, etc.)
filter(
str_detect(toupper(EXTRT), "XANOMELINE") | str_detect(toupper(EXTRT), "PLACEBO"),
EXDOSE >= 0
) %>%
mutate(
# DRUG is a merge variable to map and merge ADA data with EX.EXTRT
# This will be used to merge first dose into IS working data.
# PLACEBO example is for if/when ADA was also collected on Placebo subjects
# or treatments are scrambled prior to database lock.
DRUG = case_when(
str_detect(toupper(EXTRT), "XANOMELINE") ~ "XANOMELINE",
str_detect(toupper(EXTRT), "PLACEBO") ~ "XANOMELINE",
str_detect(toupper(EXTRT), "OTHER_DRUG") ~ "OTHER_DRUG",
TRUE ~ NA_character_
)
) %>%
# Assign nominal time to NFRLT in DAYS
derive_var_nfrlt(
new_var = NFRLT,
new_var_unit = FRLTU,
out_unit = "DAYS",
visit_day = VISITDY,
treatment_duration = 0
) %>%
# Add analysis datetime variables and set missing end date to start date
# Impute missing time to 00:00:00 or as desired.
derive_vars_dtm(
new_vars_prefix = "AST",
dtc = EXSTDTC,
time_imputation = "00:00:00"
) %>%
derive_vars_dtm(
new_vars_prefix = "AEN",
dtc = EXENDTC,
time_imputation = "00:00:00"
) %>%
# Set missing end dates to start date or as desired
mutate(
AENDTM = if_else(is.na(AENDTM), ASTDTM, AENDTM)
) %>%
# Derive dates from date/times
derive_vars_dtm_to_dt(exprs(ASTDTM)) %>%
derive_vars_dtm_to_dt(exprs(AENDTM))
## ----eval=TRUE, echo=FALSE----------------------------------------------------
dataset_vignette(
ex_dates,
display_vars = exprs(
USUBJID, EXTRT, DRUG, VISIT, ASTDTM, NFRLT
)
)
## ----message=FALSE------------------------------------------------------------
# Note: This template computes only AFRLT, see ADPC template if need EX dose expansion example.
# Derive AFRLT in IS data
is_afrlt <- is_dates %>%
derive_vars_merged(
dataset_add = ex_dates,
filter_add = (EXDOSE >= 0 & !is.na(ASTDTM)),
new_vars = exprs(FANLDTM = ASTDTM, FANLTMF = ASTTMF),
order = exprs(ASTDTM, EXSEQ),
mode = "first",
by_vars = exprs(STUDYID, USUBJID, DRUG)
) %>%
derive_vars_dtm_to_dt(exprs(FANLDTM)) %>%
derive_vars_dtm_to_tm(exprs(FANLDTM)) %>%
derive_vars_duration(
new_var = AFRLT,
start_date = FANLDTM,
end_date = ADTM,
out_unit = "DAYS",
floor_in = FALSE,
add_one = FALSE
)
## ----eval=TRUE, echo=FALSE----------------------------------------------------
dataset_vignette(
is_afrlt,
display_vars = exprs(
USUBJID, ISBDAGNT, ADATYPE, ADAPARM, DRUG, VISIT, ADTM, FANLDTM, NFRLT, AFRLT
)
)
## ----message=FALSE------------------------------------------------------------
# Compute or assign BASETYPE, APERIOD and APHASE ----------------------------------
# Add study specific code as applicable using ADEX or ADSL APxx / PHw variables
is_basetype <- is_afrlt %>%
mutate(
APERIOD = 1,
APERIODC = "Period 01",
APHASE = NA_character_,
APHASEN = NA_integer_,
BASETYPE = "DOUBLE_BLINDED"
)
## ----eval=TRUE, echo=FALSE----------------------------------------------------
dataset_vignette(
is_basetype,
display_vars = exprs(
USUBJID, BASETYPE, ADATYPE, ADAPARM, DRUG, VISIT, NFRLT, AFRLT
)
)
## ----message=FALSE------------------------------------------------------------
# Assign AVAL, AVALC, AVALU and DTYPE for each ISTESTCD and ISBDAGNT
is_aval <- is_basetype %>%
mutate(
MRT = case_when(
ADATYPE == "ADA_BAB" & ADAPARM == "XANOMELINE" ~ 1.4,
ADATYPE == "ADA_BAB" & ADAPARM == "OTHER_DRUG" ~ 9.9,
TRUE ~ NA_real_
),
DTL = case_when(
ADATYPE == "ADA_BAB" & ADAPARM == "XANOMELINE" ~ 999,
ADATYPE == "ADA_BAB" & ADAPARM == "OTHER_DRUG" ~ 888,
TRUE ~ NA_real_
),
RESULTC = case_when(
toupper(ISSTRESC) %in% c(
"NEGATIVE", "NEGATIVE SCREEN", "NEGATIVE IMMUNODEPLETION",
"NEGATIVE CONFIRMATION"
) ~ "NEGATIVE",
toupper(ISSTRESC) %in% c(
"NEGATIVE TITER", "<1.70", "< 1.70", "<1.30", "< 1.30", "<1.40",
"POSITIVE IMMUNODEPLETION", "POSITIVE CONFIRMATION", "POSITIVE"
) ~ "POSITIVE",
ISSTRESN > 0 ~ "POSITIVE",
TRUE ~ NA_character_
),
RESULTN = case_when(
toupper(RESULTC) == "POSITIVE" ~ 1,
toupper(RESULTC) == "NEGATIVE" ~ 0,
TRUE ~ NA_integer_
),
AVAL = case_when(
ADATYPE == "ADA_BAB" & toupper(RESULTC) == "POSITIVE" & !is.na(ISSTRESN) ~ ISSTRESN,
ADATYPE == "ADA_BAB" & toupper(RESULTC) == "POSITIVE" & is.na(ISSTRESN) & !is.na(MRT) ~ MRT,
TRUE ~ NA_real_
),
AVALC = case_when(
# NABSTAT gets ISSTRESC, Standard ADA is set to NA as AVAL are numeric original results
ADATYPE == "ADA_NAB" ~ ISSTRESC,
TRUE ~ NA_character_
),
AVALU = case_when(
ADATYPE == "ADA_NAB" ~ ISSTRESU,
ADATYPE == "ADA_BAB" & toupper(RESULTC) == "POSITIVE" & !is.na(ISSTRESN) ~ ISSTRESU,
ADATYPE == "ADA_BAB" & toupper(RESULTC) == "POSITIVE" & is.na(ISSTRESN) & !is.na(MRT)
~ "titer",
TRUE ~ NA_character_
),
DTYPE = case_when(
ADATYPE == "ADA_BAB" & toupper(RESULTC) == "POSITIVE" & is.na(ISSTRESN) & !is.na(MRT) ~ "MRT",
TRUE ~ NA_character_
)
)
## ----eval=TRUE, echo=FALSE----------------------------------------------------
dataset_vignette(
is_aval,
display_vars = exprs(
USUBJID, ADATYPE, ADAPARM, VISIT, NFRLT, RESULTN, RESULTC, AVAL, AVALC, AVALU, MRT, DTL, DTYPE
)
)
## ----message=FALSE------------------------------------------------------------
# Begin computation of parameters -----------------------------------------
# Identify Best Baseline for each analyte and parameter type
# Baseline is NFRLT <= 0 or Unscheduled AND the ADA Date is on or before the date of first dose.
is_baseline <- is_aval %>%
# Calculate ABLFL. If more than one record for the 'order' and 'filter' will throw a duplicate
# record warning, user can decide how to adjust the mode, order, filter or adjust in prior step.
restrict_derivation(
derivation = derive_var_extreme_flag,
args = params(
by_vars = exprs(STUDYID, USUBJID, BASETYPE, ADATYPE, ADAPARM),
order = exprs(ADT, NFRLT),
new_var = ABLFL,
mode = "last"
),
# flag baseline based on time not values due to ADA parameters can in some cases permit missing.
# If special visits (i.e. > 60000) are eligible as baselines, include those
filter = ((NFRLT <= 0 | NFRLT > 60000) & (ADT <= FANLDT) & !is.na(BASETYPE))
) %>%
mutate(
# VALID flags for use later as applicable:
# VALIDBASE flags non-missing values on baseline (by each ADATYPE and ADAPARM)
# Note: VALIDBASE is not used as this template allows a baseline to be valid as
# as long as its present (can be missing), adapt as needed.
# VALIDPOST flags non-missing values on post-baseline (by each ADATYPE and ADAPARM)
VALIDBASE = case_when(
ABLFL == "Y" & (!is.na(AVALC) | !is.na(RESULTC) | !is.na(AVAL)) ~ "Y",
ABLFL == "Y" & (is.na(AVALC) & is.na(RESULTC) & is.na(AVAL)) ~ "N",
TRUE ~ NA_character_
),
VALIDPOST = case_when(
ADTM > FANLDTM & is.na(ABLFL) & (!is.na(RESULTC) | !is.na(AVAL)) ~ "Y",
ADTM > FANLDTM & is.na(ABLFL) & (is.na(RESULTC) & is.na(AVAL)) ~ "N",
TRUE ~ NA_character_
)
)
# Compute BASE and CHG
is_aval_change <- is_baseline %>%
derive_var_base(
by_vars = exprs(STUDYID, USUBJID, BASETYPE, ADATYPE, ADAPARM),
source_var = AVAL,
new_var = BASE,
filter = ABLFL == "Y"
) %>%
restrict_derivation(
derivation = derive_var_chg,
filter = is.na(ABLFL)
)
# Interpreted Result Baseline
is_result_change <- is_aval_change %>%
derive_var_base(
by_vars = exprs(STUDYID, USUBJID, BASETYPE, ADATYPE, ADAPARM),
source_var = RESULTN,
new_var = BASE_RESULT,
filter = ABLFL == "Y"
)
# Get base only data for use later
base_data <- is_result_change %>%
filter(ABLFL == "Y") %>%
select(
STUDYID, USUBJID, DRUG, BASETYPE, ADATYPE, ADAPARM, BASE_RESULT, BASE,
ABLFL
)
## ----eval=TRUE, echo=FALSE----------------------------------------------------
dataset_vignette(
is_result_change,
display_vars = exprs(
USUBJID, ADATYPE, ADAPARM, VISIT, NFRLT, RESULTN, RESULTC, AVAL, AVALC, ABLFL,
BASE, CHG, BASE_RESULT
)
)
## ----message=FALSE------------------------------------------------------------
# Assign and save ADABLPFL for later use
adablpfl <- is_result_change %>%
filter(ABLFL == "Y") %>%
distinct(STUDYID, USUBJID, DRUG, BASETYPE,
ADATYPE, ADAPARM,
.keep_all = TRUE
) %>%
select(STUDYID, USUBJID, DRUG, BASETYPE, ADATYPE, ADAPARM, ABLFL) %>%
rename(ADABLPFL = ABLFL)
# Calculate the By Visit parameters
is_visit_flags <- is_result_change %>%
mutate(
TFLAGV = case_when(
VALIDPOST == "Y" & is.na(ABLFL) & ADATYPE == "ADA_BAB" & (BASE_RESULT == 1 & (CHG >= 0.6))
~ 2,
VALIDPOST == "Y" & is.na(ABLFL) & ADATYPE == "ADA_BAB" & BASE_RESULT == 1 &
(((CHG < 0.6) & !is.na(AVAL)) | (RESULTN == 0)) ~ 3,
VALIDPOST == "Y" & is.na(ABLFL) & ADATYPE == "ADA_BAB" & ((BASE_RESULT == 0 |
is.na(BASE_RESULT)) & RESULTN == 0) ~ 0,
VALIDPOST == "Y" & is.na(ABLFL) & ADATYPE == "ADA_BAB" & ((BASE_RESULT == 0 |
is.na(BASE_RESULT)) & RESULTN == 1) ~ 1,
TRUE ~ NA_integer_
),
PBFLAGV = case_when(
!is.na(TFLAGV) & TFLAGV %in% c(1, 2) ~ 1,
!is.na(TFLAGV) & TFLAGV %in% c(0, 3) ~ 0,
TRUE ~ NA_integer_
),
ADASTATV = case_when(
!is.na(PBFLAGV) & PBFLAGV == 1 ~ "ADA+",
!is.na(PBFLAGV) & PBFLAGV == 0 ~ "ADA-",
VALIDPOST == "Y" & is.na(ABLFL) & ADATYPE == "ADA_BAB" & is.na(PBFLAGV) ~ "MISSING",
TRUE ~ "MISSING"
),
)
# These next code segments create utility datasets that will
# then get merged back into the main dataset (is_visit_flags)
# Post baseline must be valid post data (result not missing)
post_data <- is_visit_flags %>%
filter(VALIDPOST == "Y") %>%
select(
STUDYID, USUBJID, DRUG, BASETYPE, ADATYPE, ADAPARM, RESULTN,
AVAL, ADTM, CHG
) %>%
rename(AVAL_P = AVAL) %>%
rename(RESULT_P = RESULTN)
# Use "post_data" to make a ADPBLPFL flag data set to merge back later in the program
# Note: "post_data" is if VALIDPOST="Y" (has a non missing post baseline result)
adpblpfl <- post_data %>%
distinct(STUDYID, USUBJID, DRUG, BASETYPE, ADATYPE,
ADAPARM,
.keep_all = TRUE
) %>%
select(STUDYID, USUBJID, DRUG, BASETYPE, ADATYPE, ADAPARM) %>%
mutate(
ADPBLPFL = "Y"
)
# Compute BFLAG, TFLAG, PBFLAG ----
most_post_result <- post_data %>%
group_by(STUDYID, USUBJID, DRUG, BASETYPE, ADATYPE, ADAPARM) %>%
summarize(RESULT_P = max(RESULT_P)) %>%
ungroup()
most_post_aval <- post_data %>%
filter(!is.na(AVAL_P)) %>%
group_by(STUDYID, USUBJID, BASETYPE, ADATYPE, ADAPARM) %>%
summarize(AVAL_P = max(AVAL_P)) %>%
ungroup()
most_post_chg <- post_data %>%
filter(!is.na(AVAL_P)) %>%
group_by(STUDYID, USUBJID, BASETYPE, ADATYPE, ADAPARM) %>%
summarize(MAXCHG = max(CHG)) %>%
ungroup()
# Merge the most_post_result, most_post_aval and most_post_chg into one utility data set
most_post <- most_post_result %>%
derive_vars_merged(
dataset_add = most_post_aval,
by_vars = exprs(STUDYID, USUBJID, BASETYPE, ADATYPE, ADAPARM)
) %>%
derive_vars_merged(
dataset_add = most_post_chg,
by_vars = exprs(STUDYID, USUBJID, BASETYPE, ADATYPE, ADAPARM)
)
# Use an outer Join to combine baseline with most post results create utility dataset with flag data
flagdata_init <- full_join(base_data, most_post, by = c(
"DRUG", "STUDYID", "USUBJID", "BASETYPE",
"ADATYPE", "ADAPARM"
)) %>%
mutate(
BFLAG =
case_when(
BASE_RESULT == 0 ~ 0,
BASE_RESULT == 1 ~ 1,
TRUE ~ NA_integer_
),
TFLAG =
case_when(
(BFLAG == 0 | is.na(BFLAG)) & RESULT_P == 0 ~ 0,
(BFLAG == 0 | is.na(BFLAG)) & RESULT_P == 1 ~ 1,
BFLAG == 1 & (MAXCHG >= 0.6) ~ 2,
BFLAG == 1 & !is.na(MAXCHG) & (MAXCHG < 0.6) ~ 3,
BFLAG == 1 & is.na(MAXCHG) & RESULT_P == 0 ~ 3,
TRUE ~ NA_integer_
),
PBFLAG =
case_when(
ADATYPE == "ADA_BAB" & (TFLAG == 1 | TFLAG == 2) ~ 1,
ADATYPE == "ADA_BAB" & (TFLAG == 0 | TFLAG == 3) ~ 0,
ADATYPE == "ADA_NAB" & RESULT_P == 0 ~ 0,
ADATYPE == "ADA_NAB" & RESULT_P == 1 ~ 1,
TRUE ~ NA_integer_
),
ADASTAT = case_when(
ADATYPE == "ADA_BAB" & PBFLAG == 1 ~ 1,
ADATYPE == "ADA_BAB" & PBFLAG == 0 ~ 0,
TRUE ~ NA_integer_
)
)
## ----eval=TRUE, echo=FALSE----------------------------------------------------
dataset_vignette(
flagdata_init
)
## ----message=FALSE------------------------------------------------------------
# Get overall ADASTAT status for computing NABSTAT
flagdata_adastat <- flagdata_init %>%
derive_vars_merged(
dataset_add = flagdata_init,
filter_add = ADATYPE == "ADA_BAB",
new_vars = exprs(ADASTAT_MAIN = ADASTAT),
by_vars = exprs(STUDYID, USUBJID, DRUG)
)
# Compute NABPOSTMISS onto flag_data for NABSTAT
flagdata_nab <- flagdata_adastat %>%
derive_var_merged_exist_flag(
dataset_add = is_visit_flags,
new_var = NABPOSTMISS,
condition = is.na(ABLFL) & VALIDPOST == "N" & ADATYPE == "ADA_NAB",
by_vars = exprs(STUDYID, USUBJID, BASETYPE, ADATYPE, ADAPARM)
)
# Compute NAB Stat using both methods
# Note: Option 2 added as a placekeeper starter method, adjust as needed for
# study specific specs.
flagdata_final <- flagdata_nab %>%
mutate(
# For Option 1, if any post baseline NAB were blank without a Positive (NABPOSTMISS = Y),
# NABSTAT = missing
nabstat_opt1 = case_when(
# Based on ADASTAT (EMERNEG/EMERPOS) and NAB results
ADATYPE == "ADA_NAB" & ADASTAT_MAIN == 1 & RESULT_P == 1 ~ 1,
ADATYPE == "ADA_NAB" & ADASTAT_MAIN == 1 & RESULT_P == 0 &
(is.na(NABPOSTMISS) | NABPOSTMISS == "N") ~ 0,
TRUE ~ NA_integer_
),
nabstat_opt2 = case_when(
# Based on ADASTAT (EMERNEG/EMERPOS) Only.
ADATYPE == "ADA_NAB" & ADASTAT_MAIN == 1 ~ 1,
ADATYPE == "ADA_NAB" & ADASTAT_MAIN == 0 ~ 0,
TRUE ~ NA_integer_
),
) %>%
# Drop variables no longer needed from flag_data before merging with main ADAB
select(-BASE, -BASE_RESULT, -AVAL_P, -RESULT_P, -DRUG, -ABLFL)
## ----eval=TRUE, echo=FALSE----------------------------------------------------
dataset_vignette(
flagdata_final
)
## ----message=FALSE------------------------------------------------------------
# Put TFLAG, BFLAG and PBFLAG and the nabstat_ variables onto the main
# dataset (is_flagdata from is_visit_flags)
is_flagdata <- is_visit_flags %>%
# main_aab_flagdata
derive_vars_merged(
dataset_add = flagdata_final,
by_vars = exprs(STUDYID, USUBJID, BASETYPE, ADATYPE, ADAPARM)
)
# Create a utility data set to compute PERSADA, TRANADA, INDUCED, ENHANCED related parameters
per_tran_pre <- is_flagdata %>%
filter(VALIDPOST == "Y") %>%
select(
STUDYID, USUBJID, BASETYPE, ADATYPE, ADAPARM, ADTM, FANLDTM, FANLDT,
TFLAGV, ISSEQ
) %>%
group_by(STUDYID, USUBJID, BASETYPE, ADATYPE, ADAPARM) %>%
mutate(
MaxADTM = max(ADTM)
) %>%
ungroup() %>%
mutate(
LFLAGPOS = case_when(
ADTM == MaxADTM & (TFLAGV == 1) ~ 1,
ADTM == MaxADTM & (TFLAGV == 2) ~ 1,
TRUE ~ NA_integer_
)
)
# Keep TFLAGV = 1 or TFLAGV = 2 (Any Treatment Emergent)
# Regular Induced PERSADA and TRANADA will later be based on TFLAGV = 1
# TFLAGV = 2 can use for separate PERSADA/TRANADA based on Enhanced
per_tran_all <- per_tran_pre %>%
filter(TFLAGV == 1 | TFLAGV == 2) %>%
select(-MaxADTM, -ISSEQ) %>%
group_by(STUDYID, USUBJID, BASETYPE, ADATYPE, ADAPARM) %>%
mutate(
FPPDTM = min(ADTM),
LPPDTM = max(ADTM)
) %>%
ungroup()
per_tran_inc_last <- per_tran_all %>%
group_by(STUDYID, USUBJID, BASETYPE, ADATYPE, ADAPARM) %>%
summarize(COUNT_INC_LAST = n()) %>%
ungroup()
per_tran_exc_last <- per_tran_all %>%
filter(is.na(LFLAGPOS)) %>%
group_by(STUDYID, USUBJID, BASETYPE, ADATYPE, ADAPARM) %>%
summarize(COUNT_EXC_LAST = n()) %>%
ungroup()
# Reduce "per_tran_all" to one record per by_vars using ADTM = LPPDTM to get best last records
# Then Merge in the Include Last and Exclude Last Flags
per_tran_last <- per_tran_all %>%
filter(ADTM == LPPDTM) %>%
derive_vars_merged(
dataset_add = per_tran_inc_last,
by_vars = exprs(STUDYID, USUBJID, BASETYPE, ADATYPE, ADAPARM)
) %>%
derive_vars_merged(
dataset_add = per_tran_exc_last,
by_vars = exprs(STUDYID, USUBJID, BASETYPE, ADATYPE, ADAPARM)
)
# Compute final parameters
per_tran_final <- per_tran_last %>%
mutate(
FPPDT = as_date(FPPDTM),
LPPDT = as_date(LPPDTM),
ADADUR = case_when(
LPPDTM - FPPDTM == 0 & (!is.na(LPPDTM) & !is.na(FPPDTM)) ~ 1 / 7,
!is.na(LPPDTM) & !is.na(FPPDTM)
~ ((as.numeric(difftime(LPPDTM, FPPDTM, units = "secs")) / (60 * 60 * 24)) + 1) / 7,
!is.na(LPPDT) & !is.na(FPPDT)
~ (as.numeric(LPPDT - FPPDT) + 1) / 7,
TRUE ~ NA_real_
),
TIMADA = case_when(
!is.na(FPPDTM) & !is.na(FANLDTM) ~ as.numeric(difftime(FPPDTM, FANLDTM, units = "weeks")),
!is.na(FPPDT) & !is.na(FANLDT) ~ (as.numeric(FPPDT - FANLDT) + 1) / 7,
TRUE ~ NA_real_
),
tdur = case_when(
!is.na(LPPDTM) & !is.na(FPPDTM) ~
as.numeric(difftime(LPPDTM, FPPDTM, units = "secs")) / (7 * 3600 * 24),
!is.na(LPPDT) & !is.na(FPPDT) ~ as.numeric(LPPDT - FPPDT + 1) / 7,
TRUE ~ NA_real_
),
# Standard TRANADA and PERSADA based on TFLAGV = 1 (Induced)
TRANADA = case_when(
TFLAGV == 1 & ((COUNT_EXC_LAST == 1 | (COUNT_INC_LAST >= 2 & tdur < 16)) & is.na(LFLAGPOS)) ~ 1,
TRUE ~ NA_integer_
),
PERSADA = case_when(
TFLAGV == 1 & (COUNT_INC_LAST == 1 & (COUNT_EXC_LAST <= 0 | is.na(COUNT_EXC_LAST)) |
(COUNT_INC_LAST >= 2 & tdur >= 16) | LFLAGPOS == 1) ~ 1,
TRUE ~ NA_integer_
),
# These TRANADAE and PERSADAE based on TFLAGV = 1 or TFLAGV=2 (Induced or Enhanced)
TRANADAE = case_when(
TFLAGV >= 1 & ((COUNT_EXC_LAST == 1 | (COUNT_INC_LAST >= 2 & tdur < 16)) & is.na(LFLAGPOS)) ~ 1,
TRUE ~ NA_integer_
),
PERSADAE = case_when(
TFLAGV >= 1 & (COUNT_INC_LAST == 1 & (COUNT_EXC_LAST <= 0 | is.na(COUNT_EXC_LAST)) |
(COUNT_INC_LAST >= 2 & tdur >= 16) | LFLAGPOS == 1) ~ 1,
TRUE ~ NA_integer_
),
INDUCED = case_when(
TFLAGV == 1 ~ "Y",
TRUE ~ "N"
),
ENHANCED = case_when(
TFLAGV == 2 ~ "Y",
TRUE ~ "N"
)
) %>%
# Drop temporary variables that do not need to be merged into main ADAB
select(-ADTM, -TFLAGV, -FANLDTM, -FANLDT, -LFLAGPOS, -FPPDT, -LPPDT)
# Put PERSADA, TRANADA, INDUCED, ENHANCED, TDUR, ADADUR onto "is_flagdata" as "main_aab_pertran"
# Note: signal_duplicate_records() error usually occurs when a subject has duplicate
# records for a given BASETYPE, ADATYPE, ADAPARM and ISDTC. Investigate then add code
# to filter it down to best one record per USUBJID, BASETYPE, ADATYPE and ADAPARM
main_aab_pertran <- is_flagdata %>%
derive_vars_merged(
dataset_add = per_tran_final,
by_vars = exprs(STUDYID, USUBJID, BASETYPE, ADATYPE, ADAPARM)
)
main_aab_rtimes <- main_aab_pertran %>%
mutate(
ATPT = ISTPT,
ADADUR = round(ADADUR, digits = 4),
TIMADA = round(TIMADA, digits = 4),
PERSADA = case_when(
is.na(PERSADA) ~ 0,
TRUE ~ PERSADA
),
PERSADAE = case_when(
is.na(PERSADAE) ~ 0,
TRUE ~ PERSADAE
),
TRANADA = case_when(
is.na(TRANADA) ~ 0,
TRUE ~ TRANADA
),
TRANADAE = case_when(
is.na(TRANADAE) ~ 0,
TRUE ~ TRANADAE
),
NABSTAT = nabstat_opt1
)
# Merge ADABLPFL and ADPBLPFL onto main dataset.
main_aab <- main_aab_rtimes %>%
derive_vars_merged(
dataset_add = adablpfl,
new_vars = exprs(ADABLPFL),
by_vars = exprs(STUDYID, USUBJID, BASETYPE, ADATYPE, ADAPARM)
) %>%
derive_vars_merged(
dataset_add = adpblpfl,
new_vars = exprs(ADPBLPFL),
by_vars = exprs(STUDYID, USUBJID, BASETYPE, ADATYPE, ADAPARM)
)
## ----eval=TRUE, echo=FALSE----------------------------------------------------
dataset_vignette(
main_aab,
display_vars = exprs(
USUBJID, VISIT, ADATYPE, ADAPARM, MRT, DTL, ABLFL, ADABLPFL, ADPBLPFL,
NFRLT, AFRLT, RESULTC, RESULTN, ISSTRESC, ISSTRESN, AVALC, AVAL, AVALU, BASE, BFLAG, TFLAG,
PBFLAG, ADASTAT, ADASTAT_MAIN, NABSTAT, ADADUR, TIMADA, TRANADA, PERSADA
)
)
## ----message=FALSE------------------------------------------------------------
# Begin Creation of each PARAM for the final ADAB format using main_aab --------
# First create "core_aab" with PARCAT1 to be the input for all the parameter sub-assemblies
core_aab <- main_aab %>%
mutate(
# SDTM V1.x: Assign PARAM from ISTEST or customize
PARCAT1 = ISTEST,
# SDTM V2.x: Assign PARAM using text values plus ADAPARM
PARCAT1 = case_when(
ADATYPE == "ADA_BAB" ~ paste("Anti-", ADAPARM, " Antibody", sep = ""),
ADATYPE == "ADA_NAB" ~ paste("Anti-", ADAPARM, " Neutralizing Antibody", sep = ""),
TRUE ~ NA_character_
),
# Initialize PARAMCD and PARAM
PARAMCD = ADAPARM,
PARAM = PARCAT1
)
# By Visit Primary ADA ISTESTCD Titer Results
adab_titer <- core_aab %>%
filter(ADATYPE == "ADA_BAB") %>%
mutate(
# For ADASTAT, append "Titer Units" to PARAM
PARAM = paste(PARCAT1, ", Titer Units", sep = ""),
)
# By Visit NAB ISTESTCD Results
adab_nabvis <- core_aab %>%
filter(ADATYPE == "ADA_NAB") %>%
# These two flags, BASE and CHG are only kept on the primary ADA ISTESTCD test
select(-BASE, -CHG, -ADABLPFL, -ADPBLPFL)
# By Visit Main ADA Titer Interpreted RESULT data
adab_result <- core_aab %>%
filter(ADATYPE == "ADA_BAB") %>%
mutate(
PARAMCD = "RESULTy",
PARAM = paste("ADA interpreted per sample result,", PARCAT1, sep = " "),
AVALC = toupper(RESULTC),
AVAL = case_when(
AVALC == "NEGATIVE" ~ 0,
AVALC == "POSITIVE" ~ 1,
TRUE ~ NA_integer_
),
AVALU = NA_character_
) %>%
# DTYPE is only kept on the primary ISTESTCD parameter, drop then recompute final BASE and CHG
select(-DTYPE, -BASE, -CHG)
# Derive BASE and Calculate Change from Baseline on BAB RESULT records
adab_result <- adab_result %>%
derive_var_base(
by_vars = exprs(STUDYID, USUBJID, BASETYPE, ADATYPE, ADAPARM),
source_var = AVAL,
new_var = BASE,
filter = ABLFL == "Y"
) %>%
restrict_derivation(
derivation = derive_var_chg,
filter = is.na(ABLFL)
)
# By Visit NAB Interpreted RESULT data
adab_nabres <- core_aab %>%
filter(ADATYPE == "ADA_NAB") %>%
mutate(
PARAMCD = "RESULTy",
PARAM = paste("Nab interpreted per sample result,", PARCAT1, sep = " "),
AVALC = toupper(RESULTC),
AVAL = case_when(
AVALC == "NEGATIVE" ~ 0,
AVALC == "POSITIVE" ~ 1,
TRUE ~ NA_integer_
),
AVALU = NA_character_
) %>%
# These two flags are only kept on the primary ADA test, drop then recompute final BASE and CHG
select(-ADABLPFL, -ADPBLPFL, -BASE, -CHG)
# Derive BASE and Calculate Change from Baseline on NAB RESULT records
adab_nabres <- adab_nabres %>%
derive_var_base(
by_vars = exprs(STUDYID, USUBJID, BASETYPE, ADATYPE, ADAPARM),
source_var = AVAL,
new_var = BASE,
filter = ABLFL == "Y"
) %>%
restrict_derivation(
derivation = derive_var_chg,
filter = is.na(ABLFL)
)
# By Visit Titer TFLAGV data -----------------------
# Note: By Visit parameters do not keep CHG, MRT and DTL variables
adab_tflagv <- core_aab %>%
filter(ADATYPE == "ADA_BAB") %>%
mutate(
PARAMCD = "TFLAGV",
PARAM = paste("Treatment related ADA by Visit,", PARCAT1, sep = " "),
AVAL = TFLAGV,
AVALC = as.character(AVAL),
AVALU = NA_character_
) %>%
# Drop BASE, CHG, MRT and DTL and the two --FL flags (are only kept on the primary ADA test)
select(-BASE, -CHG, -MRT, -DTL, -ADABLPFL, -ADPBLPFL)
# By Visit Titer PBFLAGV data ---------------------
# Note: By Visit parameters do not keep CHG, MRT and DTL variables
adab_pbflagv <- core_aab %>%
filter(ADATYPE == "ADA_BAB") %>%
mutate(
PARAMCD = "PBFLAGV",
PARAM = paste("Post Baseline Pos/Neg by Visit,", PARCAT1, sep = " "),
AVALC = case_when(
PBFLAGV == 1 | PBFLAGV == 2 ~ "POSITIVE",
PBFLAGV == 0 | PBFLAGV == 3 ~ "NEGATIVE",
TRUE ~ "MISSING"
),
AVAL = case_when(
AVALC == "POSITIVE" ~ 1,
AVALC == "NEGATIVE" ~ 0,
TRUE ~ NA_integer_
),
AVALU = NA_character_
) %>%
# Drop BASE, CHG, MRT and DTL and the two --FL flags (are only kept on the primary ADA test)
select(-BASE, -CHG, -MRT, -DTL, -ADABLPFL, -ADPBLPFL)
# By Visit Titer ADASTATV data
# Note: By Visit parameters do not keep CHG, MRT and DTL variables
adab_adastatv <- core_aab %>%
filter(ADATYPE == "ADA_BAB") %>%
mutate(
PARAMCD = "ADASTATV",
PARAM = paste("ADA Status of a patient by Visit,", PARCAT1, sep = " "),
AVALC = ADASTATV,
AVAL = case_when(
AVALC == "ADA+" ~ 1,
AVALC == "ADA-" ~ 0,
TRUE ~ NA_integer_
),
AVALU = NA_character_
) %>%
# Drop BASE, CHG, MRT and DTL and the two --FL flags (are only kept on the primary ADA test)
select(-BASE, -CHG, -MRT, -DTL, -ADABLPFL, -ADPBLPFL)
# Next below are the individual params
# assign the AVISIT and AVISITN for individual params
core_aab <- core_aab %>%
mutate(
AVISIT = overall_avisit,
AVISITN = overall_avisitn
)
# Get Patient flag BFLAG
adab_bflag <- core_aab %>%
filter(ADATYPE == "ADA_BAB") %>%
distinct(
STUDYID, USUBJID, PARCAT1, BASETYPE, PARAM, ADATYPE, ADAPARM,
ISTESTCD, ISTEST, ISCAT, ISBDAGNT, AVISITN, AVISIT, ISSPEC, BFLAG
) %>%
mutate(
PARAMCD = "BFLAGy",
PARAM = paste("Baseline Pos/Neg,", PARCAT1, sep = " "),
AVAL = BFLAG,
AVALC = case_when(
AVAL == 1 ~ "Y",
AVAL == 0 ~ "N",
TRUE ~ NA_character_
),
AVALU = NA_character_
)
# Get Patient flag INDUCD
adab_incucd <- core_aab %>%
filter(ADATYPE == "ADA_BAB") %>%
distinct(
STUDYID, USUBJID, PARCAT1, BASETYPE, PARAM, ADATYPE, ADAPARM,
ISTESTCD, ISTEST, ISCAT, ISBDAGNT, AVISITN, AVISIT, ISSPEC, TFLAG
) %>%
mutate(
PARAMCD = "INDUCDy",
PARAM = paste("Treatment induced ADA,", PARCAT1, sep = " "),
AVAL = case_when(
TFLAG == 1 ~ 1,
TRUE ~ 0
),
AVALC = case_when(
AVAL == 1 ~ "Y",
AVAL == 0 ~ "N",
TRUE ~ NA_character_
),
AVALU = NA_character_
)
# Get Patient flag ENHANC
adab_enhanc <- core_aab %>%
filter(ADATYPE == "ADA_BAB") %>%
distinct(
STUDYID, USUBJID, PARCAT1, BASETYPE, PARAM, ADATYPE, ADAPARM,
ISTESTCD, ISTEST, ISCAT, ISBDAGNT, AVISITN, AVISIT, ISSPEC, TFLAG
) %>%
mutate(
PARAMCD = "ENHANCy",
PARAM = paste("Treatment enhanced ADA,", PARCAT1, sep = " "),
AVAL = case_when(
TFLAG == 2 ~ 1,
TRUE ~ 0
),
AVALC = case_when(
AVAL == 1 ~ "Y",
AVAL == 0 ~ "N",
TRUE ~ NA_character_
),
AVALU = NA_character_
)
# Get Patient flag EMERPOS
adab_emerpos <- core_aab %>%
filter(ADATYPE == "ADA_BAB") %>%
distinct(
STUDYID, USUBJID, PARCAT1, BASETYPE, PARAM, ADATYPE, ADAPARM,
ISTESTCD, ISTEST, ISCAT, ISBDAGNT, AVISITN, AVISIT, ISSPEC, PBFLAG
) %>%
mutate(
PARAMCD = "EMERPOSy",
PARAM = paste("Treatment Emergent - Positive,", PARCAT1, sep = " "),
AVAL = case_when(
PBFLAG == 1 ~ 1,
TRUE ~ 0
),
AVALC = case_when(
AVAL == 1 ~ "Y",
AVAL == 0 ~ "N",
TRUE ~ NA_character_
),
AVALU = NA_character_
)
# Get Patient flag TRUNAFF
adab_trunaff <- core_aab %>%
filter(ADATYPE == "ADA_BAB") %>%
distinct(
STUDYID, USUBJID, PARCAT1, BASETYPE, PARAM, ADATYPE, ADAPARM,
ISTESTCD, ISTEST, ISCAT, ISBDAGNT, AVISITN, AVISIT, ISSPEC, TFLAG
) %>%
mutate(
PARAMCD = "TRUNAFFy",
PARAM = paste("Treatment unaffected,", PARCAT1, sep = " "),
AVAL = case_when(
TFLAG == 3 ~ 1,
TRUE ~ 0
),
AVALC = case_when(
AVAL == 1 ~ "Y",
AVAL == 0 ~ "N",
TRUE ~ NA_character_
),
AVALU = NA_character_
)
# Get Patient flag EMERNEG
adab_emerneg <- core_aab %>%
filter(ADATYPE == "ADA_BAB") %>%
distinct(
STUDYID, USUBJID, PARCAT1, BASETYPE, PARAM, ADATYPE, ADAPARM,
ISTESTCD, ISTEST, ISCAT, ISBDAGNT, AVISITN, AVISIT, ISSPEC, PBFLAG
) %>%
mutate(
PARAMCD = "EMERNEGy",
PARAM = paste("Treatment Emergent - Negative,", PARCAT1, sep = " "),
AVAL = case_when(
PBFLAG == 0 ~ 1,
TRUE ~ 0
),
AVALC = case_when(
AVAL == 1 ~ "Y",
AVAL == 0 ~ "N",
TRUE ~ NA_character_
),
AVALU = NA_character_
)
# Get Patient flag NOTRREL
adab_notrrel <- core_aab %>%
filter(ADATYPE == "ADA_BAB") %>%
distinct(
STUDYID, USUBJID, PARCAT1, BASETYPE, PARAM, ADATYPE, ADAPARM,
ISTESTCD, ISTEST, ISCAT, ISBDAGNT, AVISITN, AVISIT, ISSPEC, PBFLAG
) %>%
mutate(
PARAMCD = "NOTRRELy",
PARAM = paste("No treatment related ADA,", PARCAT1, sep = " "),
AVAL = case_when(
is.na(PBFLAG) ~ 1,
TRUE ~ 0
),
AVALC = case_when(
AVAL == 1 ~ "Y",
AVAL == 0 ~ "N",
TRUE ~ NA_character_
),
AVALU = NA_character_
)
# Get Patient flag ADASTAT
adab_adastat <- core_aab %>%
filter(ADATYPE == "ADA_BAB") %>%
distinct(
STUDYID, USUBJID, PARCAT1, BASETYPE, PARAM, ADATYPE, ADAPARM,
ISTESTCD, ISTEST, ISCAT, ISBDAGNT, AVISITN, AVISIT, ISSPEC, ADASTAT
) %>%
mutate(
PARAMCD = "ADASTATy",
PARAM = paste("ADA Status of a patient,", PARCAT1, sep = " "),
AVAL = ADASTAT,
AVALC = case_when(
AVAL == 1 ~ "POSITIVE",
AVAL == 0 ~ "NEGATIVE",
TRUE ~ "MISSING"
),
AVALU = NA_character_
)
# Get Patient flag TIMADA
adab_timada <- core_aab %>%
filter(ADATYPE == "ADA_BAB") %>%
distinct(
STUDYID, USUBJID, PARCAT1, BASETYPE, PARAM, ADATYPE, ADAPARM,
ISTESTCD, ISTEST, ISCAT, ISBDAGNT, AVISITN, AVISIT, ISSPEC, TIMADA
) %>%
mutate(
PARAMCD = "TIMADAy",
PARAM = paste("Time to onset of ADA (Weeks),", PARCAT1, sep = " "),
AVAL = TIMADA,
AVALC = NA_character_,
AVALU = if_else(!is.na(AVAL), "WEEKS", NA_character_)
)
# Get Patient flag PERSADA
adab_persada <- core_aab %>%
filter(ADATYPE == "ADA_BAB") %>%
distinct(
STUDYID, USUBJID, PARCAT1, BASETYPE, PARAM, ADATYPE, ADAPARM,
ISTESTCD, ISTEST, ISCAT, ISBDAGNT, AVISITN, AVISIT, ISSPEC, PERSADA
) %>%
mutate(
PARAMCD = "PERSADAy",
PARAM = paste("Persistent ADA,", PARCAT1, sep = " "),
AVAL = PERSADA,
AVALC = case_when(
AVAL == 1 ~ "Y",
AVAL == 0 ~ "N",
TRUE ~ NA_character_
),
AVALU = NA_character_
)
# Get Patient flag TRANADA
adab_tranada <- core_aab %>%
filter(ADATYPE == "ADA_BAB") %>%
distinct(
STUDYID, USUBJID, PARCAT1, BASETYPE, PARAM, ADATYPE, ADAPARM,
ISTESTCD, ISTEST, ISCAT, ISBDAGNT, AVISITN, AVISIT, ISSPEC, TRANADA
) %>%
mutate(
PARAMCD = "TRANADAy",
PARAM = paste("Transient ADA,", PARCAT1, sep = " "),
AVAL = TRANADA,
AVALC = case_when(
AVAL == 1 ~ "Y",
AVAL == 0 ~ "N",
TRUE ~ NA_character_
),
AVALU = NA_character_
)
# Get Patient flag NABSTAT
adab_nabstat <- core_aab %>%
filter(ADATYPE == "ADA_NAB") %>%
distinct(
STUDYID, USUBJID, PARCAT1, BASETYPE, PARAM, ADATYPE, ADAPARM,
ISTESTCD, ISTEST, ISCAT, ISBDAGNT, AVISITN, AVISIT, ISSPEC, NABSTAT
) %>%
mutate(
PARAMCD = "NABSTATy",
PARAM = paste("Nab Status,", PARCAT1, sep = " "),
AVAL = NABSTAT,
AVALC = case_when(
AVAL == 1 ~ "POSITIVE",
AVAL == 0 ~ "NEGATIVE",
TRUE ~ "MISSING"
),
AVALU = NA_character_
)
# Get Patient flag ADADUR
adab_adadur <- core_aab %>%
filter(ADATYPE == "ADA_BAB") %>%
distinct(
STUDYID, USUBJID, PARCAT1, BASETYPE, PARAM, ADATYPE, ADAPARM,
ISTESTCD, ISTEST, ISCAT, ISBDAGNT, AVISITN, AVISIT, ISSPEC, ADADUR
) %>%
mutate(
PARAMCD = "ADADURy",
PARAM = paste("ADA Duration (Weeks),", PARCAT1, sep = " "),
AVAL = ADADUR,
AVALC = NA_character_,
AVALU = if_else(!is.na(AVAL), "WEEKS", NA_character_)
)
# Get Patient flag FPPDTM
adab_fppdtm <- core_aab %>%
filter(ADATYPE == "ADA_BAB") %>%
distinct(
STUDYID, USUBJID, PARCAT1, BASETYPE, PARAM, ADATYPE, ADAPARM,
ISTESTCD, ISTEST, ISCAT, ISBDAGNT, AVISITN, AVISIT, ISSPEC, FPPDTM
) %>%
mutate(
PARAMCD = "FPPDTMy",
PARAM = paste("First Post Dose Positive Datetime,", PARCAT1, sep = " "),
AVAL = (as.numeric(FPPDTM)),
AVALC = if_else(is.na(FPPDTM), NA_character_,
toupper(as.character(format(FPPDTM, "%d%b%Y:%H:%M:%S")))
),
AVALU = NA_character_
)
# Get Patient flag LPPDTM
adab_lppdtm <- core_aab %>%
filter(ADATYPE == "ADA_BAB") %>%
distinct(
STUDYID, USUBJID, PARCAT1, BASETYPE, PARAM, ADATYPE, ADAPARM,
ISTESTCD, ISTEST, ISCAT, ISBDAGNT, AVISITN, AVISIT, ISSPEC, LPPDTM
) %>%
mutate(
PARAMCD = "LPPDTMy",
PARAM = paste("Last Post Dose Positive Datetime,", PARCAT1, sep = " "),
AVAL = as.numeric(LPPDTM),
AVALC = if_else(is.na(LPPDTM), NA_character_,
toupper(as.character(format(LPPDTM, "%d%b%Y:%H:%M:%S")))
),
AVALU = NA_character_
)
## ----message=FALSE------------------------------------------------------------
# Set all the standard PARAM components together -----------------------------------
adab_paramcds <- bind_rows(
adab_titer, adab_nabvis, adab_result, adab_nabres, adab_bflag,
adab_incucd, adab_enhanc, adab_emerpos, adab_trunaff, adab_emerneg, adab_notrrel,
adab_adastat, adab_timada, adab_persada, adab_tranada, adab_nabstat
)
# In this sample, also have BY VISIT parameters,
adab_visits <- bind_rows(adab_tflagv, adab_pbflagv, adab_adastatv)
# Create the final parameterized dataset --------------------------------------------
# To keep only standard parameters:
# adab_study <- adab_paramcds
# To include BY VISIT parameters and/or others:
adab_study <- bind_rows(adab_paramcds, adab_visits, adab_adadur, adab_fppdtm, adab_lppdtm)
# Drop temporary variables and ADA Flag variables that are now parameterized, further below is a
# final `select` statement to to customize the final select.
adab_study <- adab_study %>%
select(
-TIMADA, -ADADUR, -TRANADA, -PERSADA, -TRANADAE, -PERSADAE, -INDUCED, -ENHANCED,
-RESULTC, -RESULTN, -ADASTAT, -BFLAG, -TFLAG, -PBFLAG, -FPPDTM, -LPPDTM, -TFLAGV, -PBFLAGV,
-ADASTATV, -nabstat_opt1, -nabstat_opt2, -NABSTAT, -MAXCHG, -VALIDBASE, -VALIDPOST,
-tdur, -ADASTAT_MAIN, -NABPOSTMISS, -TRTSDT
)
## ----eval=TRUE, echo=FALSE----------------------------------------------------
dataset_vignette(
adab_study,
display_vars = exprs(USUBJID, VISIT, ADATYPE, ADAPARM, ABLFL, PARAMCD, PARAM, AVAL, AVALC, AVALU)
)
## ----message=FALSE------------------------------------------------------------
# Merge in ADSL Values --------------------------------
adab_adsl <- adab_study %>%
derive_vars_merged(
dataset_add = adsl,
by_vars = exprs(STUDYID, USUBJID)
)
# Compute COHORT From ADSL, other source could be ADSUB
adab_cohort <- adab_adsl %>%
derive_vars_merged(
dataset_add = adsl,
new_vars = exprs(COHORT = ARMCD),
by_vars = exprs(STUDYID, USUBJID)
)
# Compute optional ADAFL
# Method could be ADSL.SAFFL, ADAB.ADPBLPFL by ISTESTCD, etc.
adab_adafl <- adab_cohort %>%
derive_vars_merged(
dataset_add = adsl,
new_vars = exprs(ADAFL = SAFFL),
by_vars = exprs(STUDYID, USUBJID)
)
## ----message=FALSE------------------------------------------------------------
# Study Specific Specs Post-Processing ------------------------------------
# Create a Tibble to map above PARAMCD and PARAM to final study spec values
# Multiple NAB and ADA analytes example usage:
# If ISTESTCD is 'ADA_BAB' and ISBDAGNT is 'XANOMELINE', RESULT1, ADASTAT1, etc. PARAM_SUFFIX = '(1)'
# If ISTESTCD is 'ADA_BAB' and ISBDAGNT is 'Y012345678', RESULT2, ADASTAT2, etc. PARAM_SUFFIX = '(2)'
# If ISTESTCD is 'ADA_NAB' and ISBDAGNT is 'XANOMELINE', RESULT3, etc. PARAM_SUFFIX = '(3)'
# If ISTESTCD is 'ADA_NAB' and ISBDAGNT is 'Y012345678', RESULT4, etc. PARAM_SUFFIX = '(4)'
adab_param_data <- tribble(
~PARAMCD, ~ADATYPE, ~ADAPARM, ~PARAMCD_NEW, ~PARAM_SUFFIX,
"XANOMELINE", "ADA_BAB", "XANOMELINE", "XANOMELINE", "(1)",
"XANOMELINE", "ADA_NAB", "XANOMELINE", "XANOMELINE", "(1)",
"RESULTy", "ADA_BAB", "XANOMELINE", "RESULT1", "(1)",
"RESULTy", "ADA_NAB", "XANOMELINE", "RESULT2", "(2)",
"BFLAGy", "ADA_BAB", "XANOMELINE", "BFLAG1", "(1)",
"INDUCDy", "ADA_BAB", "XANOMELINE", "INDUCD1", "(1)",
"ENHANCy", "ADA_BAB", "XANOMELINE", "ENHANC1", "(1)",
"EMERPOSy", "ADA_BAB", "XANOMELINE", "EMERPOS1", "(1)",
"TRUNAFFy", "ADA_BAB", "XANOMELINE", "TRUNAFF1", "(1)",
"EMERNEGy", "ADA_BAB", "XANOMELINE", "EMERNEG1", "(1)",
"NOTRRELy", "ADA_BAB", "XANOMELINE", "NOTRREL1", "(1)",
"ADASTATy", "ADA_BAB", "XANOMELINE", "ADASTAT1", "(1)",
"TIMADAy", "ADA_BAB", "XANOMELINE", "TIMADA1", "(1)",
"PERSADAy", "ADA_BAB", "XANOMELINE", "PERSADA1", "(1)",
"TRANADAy", "ADA_BAB", "XANOMELINE", "TRANADA1", "(1)",
"NABSTATy", "ADA_NAB", "XANOMELINE", "NABSTAT1", "(1)",
"ADASTATV", "ADA_BAB", "XANOMELINE", "ADASTTV1", "(1)",
"TFLAGV", "ADA_BAB", "XANOMELINE", "TFLAGV1", "(1)",
"PBFLAGV", "ADA_BAB", "XANOMELINE", "PBFLAGV1", "(1)",
"LPPDTMy", "ADA_BAB", "XANOMELINE", "LPPDTM1", "(1)",
"FPPDTMy", "ADA_BAB", "XANOMELINE", "FPPDTM1", "(1)",
"ADADURy", "ADA_BAB", "XANOMELINE", "ADADUR1", "(1)",
)
# Merge the Parameter dataset into the main data
adab_params <- adab_adafl %>%
derive_vars_merged(
dataset_add = adab_param_data,
by_vars = exprs(PARAMCD, ADAPARM, ADATYPE)
) %>%
# for the original data, assign PARAM
mutate(
PARAM = case_when(
!is.na(PARAM_SUFFIX) ~ paste(PARAM, PARAM_SUFFIX, sep = " "),
TRUE ~ PARAM
),
# Example to assign PARAMCD based on ADAPARM assigned at program start (SDTM.IS < v2.0)
PARAMCD = case_when(
PARAMCD == ADAPARM ~ PARAMCD,
TRUE ~ PARAMCD_NEW
),
# Example to assign PARAMCD based ISTESTCD type and last 5 chars of ISBDAGNT (SDTM.IS >= v2.0)
PARAMCD = case_when(
ISTESTCD == "ADA_BAB" & PARAMCD == "XANOMELINE" ~
paste("BAB", substr(ISBDAGNT, 1, 5), sep = ""),
ISTESTCD == "ADA_NAB" & PARAMCD == "XANOMELINE" ~
paste("NAB", substr(ISBDAGNT, 1, 5), sep = ""),
TRUE ~ PARAMCD
)
)
# Sort by the key variables then compute ASEQ
adab_prefinal <- adab_params %>%
# Calculate ASEQ
derive_var_obs_number(
new_var = ASEQ,
by_vars = exprs(STUDYID, USUBJID),
order = exprs(PARCAT1, PARAMCD, BASETYPE, NFRLT, AFRLT, ISSEQ),
check_type = "error"
)
## ----eval=TRUE, echo=FALSE----------------------------------------------------
dataset_vignette(
adab_prefinal,
display_vars = exprs(USUBJID, VISIT, ABLFL, PARCAT1, PARAMCD, PARAM, AVAL, AVALC, AVALU)
)
## ----message=FALSE------------------------------------------------------------
# Choose final variables to keep
# When SDTM V1.x, suggest remove ISBDAGNT
adab <- adab_prefinal %>%
select(
STUDYID, USUBJID, SUBJID, SITEID, ASEQ,
REGION1, COUNTRY, ETHNIC,
AGE, AGEU, SEX, RACE,
SAFFL, TRT01P, TRT01A,
TRTSDTM, TRTSDT, TRTEDTM, TRTEDT,
ISSEQ, ISTESTCD, ISTEST, ISCAT, ISBDAGNT,
ISSTRESC, ISSTRESN, ISSTRESU,
ISSTAT, ISREASND, ISSPEC,
DTL, MRT,
VISITNUM, VISIT, VISITDY,
EPOCH, ISDTC, ISDY, ISTPT, ISTPTNUM,
PARAM, PARAMCD, PARCAT1,
AVAL, AVALC, AVALU,
BASETYPE, BASE, CHG, DTYPE,
ADTM, ADT, ADY, ATMF,
AVISIT, AVISITN, ATPT,
APHASE, APHASEN, APERIOD, APERIODC,
FANLDTM, FANLDT, FANLTM, FANLTMF,
NFRLT, AFRLT, FRLTU,
ABLFL, ADABLPFL, ADPBLPFL, ADAFL
)
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.