generated from pharmaverse/admiraltemplate
-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
* #41 : Add ADCOEQ for review * adcoeq (#41) : Addressed comments * adcoeq (#41) : Added PARAMN * adcoeq (#41) : Minor updates * adcoeq (#41) : Updated AVISIT logic for Baseline * Minor update Co-authored-by: Anders Askeland <[email protected]> --------- Co-authored-by: SPUJ (Siddhesh Pujari) <[email protected]> Co-authored-by: Anders Askeland <[email protected]>
- Loading branch information
1 parent
659186b
commit f94f7c9
Showing
1 changed file
with
267 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,267 @@ | ||
# Name: ADCOEQ | ||
# | ||
# Label: Control of Eating Questionnaires Analysis dataset | ||
# | ||
# Input: adsl, qs | ||
|
||
# License ---- | ||
|
||
# Note that University of Leeds are the copyright holders of the Control of Eating | ||
# Questionnaire (CoEQ) and the test data included within `{admiralmetabolic}` as | ||
# well as the ADCOEQ code are for not-for-profit use only within `{admiralmetabolic}` | ||
# and pharmaverse-related examples/documentation. Any persons or companies wanting | ||
# to use the CoEQ should request a license to do so from the following | ||
# [link](https://licensing.leeds.ac.uk/product/control-of-eating-questionnaire-coeq). | ||
|
||
# Attach/load required packages ---- | ||
library(admiral) | ||
library(admiralmetabolic) | ||
library(tibble) | ||
library(dplyr) | ||
library(stringr) | ||
|
||
# Define project options/variables ---- | ||
# Use the admiral option functionality to store subject key variables in one | ||
# place (note: `subject_keys` defaults to STUDYID and USUBJID) | ||
set_admiral_options(subject_keys = exprs(STUDYID, USUBJID)) | ||
|
||
# Store ADSL variables required for derivations as an R object, enabling | ||
# simplified usage throughout the program | ||
adsl_vars <- exprs(TRTSDT, TRTEDT, TRT01P, TRT01A) | ||
|
||
# Read in data ---- | ||
# See the "Read in Data" vignette section for more information: | ||
# (https://pharmaverse.github.io/admiral/articles/bds_finding.html#readdata) | ||
|
||
# Read data | ||
qs_metabolic <- admiralmetabolic::qs_metabolic | ||
adsl <- admiral::admiral_adsl | ||
|
||
# Convert SAS missing character values to NA | ||
adcoeq <- qs_metabolic %>% | ||
convert_blanks_to_na() | ||
adsl <- adsl %>% | ||
convert_blanks_to_na() | ||
|
||
# Merge ADSL variables (stored in `adsl_vars`) needed for ADQS | ||
adcoeq <- adcoeq %>% | ||
derive_vars_merged( | ||
dataset_add = adsl, | ||
new_vars = adsl_vars, | ||
by_vars = get_admiral_option("subject_keys") | ||
) | ||
|
||
# Add analysis parameter variables | ||
adcoeq <- adcoeq %>% | ||
mutate( | ||
PARAMCD = QSTESTCD, | ||
PARAM = QSTEST, | ||
PARAMN = as.numeric(str_extract(QSTESTCD, "\\d+")), | ||
PARCAT1 = QSCAT | ||
) | ||
|
||
# Derive Date/Time and Analysis Day ---- | ||
# See the "Derive/Impute Numeric Date/Time and Analysis Day" vignette section | ||
# for more information: | ||
# (https://pharmaverse.github.io/admiral/articles/bds_finding.html#datetime) | ||
|
||
# Add questionnaire analysis date (ADT) and treatment start date (TRTSDT) | ||
adcoeq <- adcoeq %>% | ||
derive_vars_dt( | ||
new_vars_prefix = "A", | ||
dtc = QSDTC | ||
) %>% | ||
derive_vars_dy( | ||
reference_date = TRTSDT, | ||
source_vars = exprs(ADT) | ||
) | ||
|
||
# Derive visit info ---- | ||
# See the "Visit and Period Variables" vignette for more information: | ||
# (https://pharmaverse.github.io/admiral/articles/visits_periods.html) | ||
|
||
# Derive analysis visit (AVISIT, AVISITN) | ||
adcoeq <- adcoeq %>% | ||
mutate( | ||
AVISIT = case_when( | ||
is.na(VISIT) ~ NA_character_, | ||
str_detect(VISIT, "UNSCHED|RETRIEVAL|AMBUL") ~ NA_character_, | ||
TRUE ~ str_to_title(VISIT) | ||
), | ||
AVISITN = case_when( | ||
AVISIT == "Baseline" ~ 0, | ||
str_detect(AVISIT, "Screen") ~ -1, | ||
str_detect(VISIT, "WEEK") ~ as.integer(str_extract(VISIT, "\\d+")), | ||
TRUE ~ NA_integer_ | ||
) | ||
) | ||
|
||
# Derive results ---- | ||
# See the "Derive Results (AVAL, AVALC)" vignette section for more information: | ||
# (https://pharmaverse.github.io/admiral/articles/bds_finding.html#aval) | ||
|
||
# Derive analysis result (AVAL, AVALC) | ||
adcoeq <- adcoeq %>% | ||
mutate( | ||
# Invert the original scores for COEQ item 6 as they indicate anxiety and | ||
# is used in calculating the subscale for "Positive Mood" | ||
AVAL = if_else(PARAMCD == "COEQ06", 100 - QSSTRESN, QSSTRESN), | ||
AVALC = if_else(PARAMCD == "COEQ20", QSORRES, NA_character_) | ||
) | ||
|
||
|
||
# Derive summary records ---- | ||
|
||
# See the "Example 2 (Deriving a Summary Record)" vignette section for more | ||
# information: | ||
# (https://pharmaverse.github.io/admiral/articles/bds_finding.html#example-2-deriving-a-summary-record) | ||
|
||
# For the Control of Eating Questionnaire, four subscales are derived. | ||
# These subscales are derived as the mean across a subset of the | ||
# various items/questions. | ||
|
||
# The subscales are defined as follows: | ||
|
||
# 1) Craving Control: Calculate mean of items 9, 10, 11, 12 and 19. | ||
|
||
# 2) Craving for Sweet: Calculate mean of items 3, 13, 14 and 15. | ||
|
||
# 3) Craving for Savoury: Calculate mean of items 4, 16, 17 and 18. | ||
|
||
# 4) Positive Mood: Calculate mean of items 5, 7, 8 and 6 (reversed). | ||
|
||
# Derive four subscales | ||
adcoeq <- adcoeq %>% | ||
call_derivation( | ||
derivation = derive_summary_records, | ||
variable_params = list( | ||
params( | ||
filter_add = PARAMCD %in% c( | ||
"COEQ09", "COEQ10", "COEQ11", "COEQ12", "COEQ19" | ||
) & AVISITN >= 0, | ||
set_values_to = exprs( | ||
AVAL = mean(AVAL, na.rm = TRUE), | ||
PARAMCD = "COEQCRCO", | ||
PARAM = "COEQ - Craving Control", | ||
PARAMN = 22 | ||
) | ||
), | ||
params( | ||
filter_add = PARAMCD %in% c("COEQ03", "COEQ13", "COEQ14", "COEQ15") & | ||
AVISITN >= 0, | ||
set_values_to = exprs( | ||
AVAL = mean(AVAL, na.rm = TRUE), | ||
PARAMCD = "COEQCRSW", | ||
PARAM = "COEQ - Craving for Sweet", | ||
PARAMN = 23 | ||
) | ||
), | ||
params( | ||
filter_add = PARAMCD %in% c("COEQ04", "COEQ16", "COEQ17", "COEQ18") & | ||
AVISITN >= 0, | ||
set_values_to = exprs( | ||
AVAL = mean(AVAL, na.rm = TRUE), | ||
PARAMCD = "COEQCRSA", | ||
PARAM = "COEQ - Craving for Savoury", | ||
PARAMN = 24 | ||
) | ||
), | ||
params( | ||
filter_add = PARAMCD %in% c("COEQ05", "COEQ07", "COEQ08", "COEQ06") & | ||
AVISITN >= 0, | ||
set_values_to = exprs( | ||
AVAL = mean(AVAL, na.rm = TRUE), | ||
PARAMCD = "COEQPOMO", | ||
PARAM = "COEQ - Positive Mood", | ||
PARAMN = 25 | ||
) | ||
) | ||
), | ||
dataset_add = adcoeq, | ||
by_vars = exprs( | ||
STUDYID, USUBJID, AVISIT, AVISITN, ADT, ADY, PARCAT1, | ||
TRTSDT, TRTEDT, TRT01P, TRT01A | ||
) | ||
) | ||
|
||
|
||
# Derive Baseline variables ---- | ||
# See the "Derive Baseline" and "Derive Change from Baseline " vignette sections | ||
# for more information: | ||
# (https://pharmaverse.github.io/admiral/articles/bds_finding.html#baseline) | ||
# (https://pharmaverse.github.io/admiral/articles/bds_finding.html#bchange) | ||
|
||
# Add baseline flag (ABLFL) | ||
adcoeq <- adcoeq %>% | ||
restrict_derivation( | ||
derivation = derive_var_extreme_flag, | ||
args = params( | ||
by_vars = exprs(!!!get_admiral_option("subject_keys"), PARAMCD), | ||
order = exprs(ADT, AVISITN), | ||
new_var = ABLFL, | ||
mode = "last" | ||
), | ||
filter = (!is.na(AVAL) & ADT <= TRTSDT) | ||
) | ||
|
||
# Derive baseline analysis value (BASE) | ||
adcoeq <- adcoeq %>% | ||
derive_var_base( | ||
by_vars = exprs(!!!get_admiral_option("subject_keys"), PARAMCD), | ||
source_var = AVAL, | ||
new_var = BASE | ||
) | ||
|
||
# Derive absolute (CHG) and relative (PCHG) change from baseline | ||
adcoeq <- adcoeq %>% | ||
restrict_derivation( | ||
derivation = derive_var_chg, | ||
filter = AVISITN > 0 | ||
) %>% | ||
restrict_derivation( | ||
derivation = derive_var_pchg, | ||
filter = AVISITN > 0 | ||
) | ||
|
||
# Assign ASEQ ---- | ||
# See the "Assign ASEQ" vignette section for more information: | ||
# https://pharmaverse.github.io/admiral/articles/bds_finding.html#aseq | ||
|
||
# Calculate ASEQ | ||
adcoeq <- adcoeq %>% | ||
derive_var_obs_number( | ||
new_var = ASEQ, | ||
by_vars = exprs(STUDYID, USUBJID), | ||
order = exprs(PARAMCD, ADT, AVISITN), | ||
check_type = "error" | ||
) | ||
|
||
# Add ADSL variables ---- | ||
# See the "Add ADSL variables" vignette section for more information: | ||
# (https://pharmaverse.github.io/admiral/articles/bds_finding.html#adsl_vars) | ||
|
||
# Add all ADSL variables besides TRTSDT, TRTEDT, TRT01P, TRT01A (stored in | ||
# `adsl_vars`) | ||
adcoeq <- adcoeq %>% | ||
derive_vars_merged( | ||
dataset_add = select(adsl, !!!negate_vars(adsl_vars)), | ||
by_vars = get_admiral_option("subject_keys") | ||
) | ||
|
||
# Add Labels and Attributes ---- | ||
# This process is usually based on one's metadata. As such, no specific example | ||
# will be given. See the "Add Labels and Attributes" vignette section for | ||
# description of several open source R packages which can be used to handle | ||
# metadata. | ||
# (https://pharmaverse.github.io/admiral/articles/bds_finding.html#attributes) | ||
|
||
|
||
# Save output ---- | ||
|
||
# Change to whichever directory you want to save the dataset in | ||
dir <- tools::R_user_dir("admiral_templates_data", which = "cache") # Cache | ||
if (!file.exists(dir)) { | ||
# Create the folder | ||
dir.create(dir, recursive = TRUE, showWarnings = FALSE) | ||
} | ||
save(adcoeq, file = file.path(dir, "adcoeq.rda"), compress = "bzip2") |