Derive treatment emergent analysis flag (e.g., TRTEMFL
).
derive_var_trtemfl(
dataset,
new_var = TRTEMFL,
start_date = ASTDTM,
end_date = AENDTM,
trt_start_date = TRTSDTM,
trt_end_date = NULL,
end_window = NULL,
ignore_time_for_trt_end = TRUE,
initial_intensity = NULL,
intensity = NULL,
group_var = NULL,
subject_keys = get_admiral_option("subject_keys")
)
The input dataset with the variable specified by new_var
added
Input dataset
The variables specified by start_date
, end_date
, trt_start_date
,
trt_end_date
, initial_intensity
, and intensity
are expected.
a dataset, i.e., a data.frame
or tibble
none
New variable
an unquoted symbol, e.g., AVAL
TRTEMFL
Event start date
a date or datetime variable
ASTDTM
Event end date
a date or datetime variable
AENDTM
Treatment start date
a date or datetime variable
TRTSDTM
Treatment end date
a date or datetime variable
NULL
If the argument is specified (in 'days'), events starting more than the specified number of days after end of treatment, are not flagged.
a positive integer, e.g. 2
or 5
NULL
If the argument is set to TRUE
, the time part is ignored for checking if
the event occurred more than end_window
days after end of treatment.
"TRUE"
, "FALSE"
TRUE
Initial severity/intensity or toxicity
initial_intensity
is ignored when group_var
is specified.
If this argument is specified and group_var
is NULL
, events which start
before treatment start and end after treatment start (or are ongoing) and
worsened (i.e., the intensity is greater than the initial intensity), are
flagged.
The values of the specified variable must be comparable with the usual
comparison operators. I.e., if the intensity is greater than the initial
intensity initial_intensity < intensity
must evaluate to TRUE
.
an unquoted symbol, e.g., AVAL
NULL
Severity/intensity or toxicity
If the argument is specified, events which start before treatment start and end after treatment start (or are ongoing) and worsened (i.e., the intensity is greater than the initial intensity), are flagged.
The values of the specified variable must be comparable with the usual
comparison operators. I.e., if the intensity is greater than the initial
intensity initial_intensity < intensity
must evaluate to TRUE
.
an unquoted symbol, e.g., AVAL
NULL
Grouping variable
If the argument is specified, it assumes that AEs are recorded as one episode of AE with multiple lines using a grouping variable.
Events starting during treatment or before treatment and worsening afterward are flagged. Once an AE record in a group is flagged, all subsequent records in the treatment window are flagged regardless of severity.
an unquoted symbol, e.g., AVAL
NULL
Variables to uniquely identify a subject.
This argument is only used when group_var
is specified.
list of variables created by exprs()
, e.g., exprs(USUBJID, VISIT)
get_admiral_option("subject_keys")
Derive TRTEMFL
without considering treatment end and worsening
For this basic example, all we are using are AE start/end dates and comparing those against treatment start date.
If the AE started on or after treatment then we flag as treatment-emergent (e.g. records 5-7).
If missing AE start date then we flag as treatment-emergent as worst case (e.g. records 8, 11 and 13), unless we know that the AE end date was before treatment so we can rule out this being treatment-emergent (e.g. record 12).
Any not treated subject would not get their AEs flagged as treatment-emergent (e.g. records 14-16).
library(tibble)
library(dplyr, warn.conflicts = FALSE)
library(lubridate)adae <- tribble(
~USUBJID, ~ASTDT, ~AENDT, ~AEITOXGR, ~AETOXGR,
# before treatment
"1", ymd("2021-12-13"), ymd("2021-12-15"), "1", "1",
"1", ymd("2021-12-14"), ymd("2021-12-14"), "1", "3",
# starting before treatment and ending during treatment
"1", ymd("2021-12-30"), ymd("2022-01-14"), "1", "3",
"1", ymd("2021-12-31"), ymd("2022-01-01"), "1", "1",
# starting during treatment
"1", ymd("2022-01-01"), ymd("2022-01-02"), "3", "4",
# after treatment
"1", ymd("2022-05-10"), ymd("2022-05-10"), "2", "2",
"1", ymd("2022-05-11"), ymd("2022-05-11"), "2", "2",
# missing dates
"1", NA, NA, "3", "4",
"1", ymd("2021-12-30"), NA, "3", "4",
"1", ymd("2021-12-31"), NA, "3", "3",
"1", NA, ymd("2022-01-04"), "3", "4",
"1", NA, ymd("2021-12-24"), "3", "4",
"1", NA, ymd("2022-06-04"), "3", "4",
# without treatment
"2", NA, ymd("2021-12-03"), "1", "2",
"2", ymd("2021-12-01"), ymd("2021-12-03"), "1", "2",
"2", ymd("2021-12-06"), NA, "1", "2"
) %>%
mutate(
STUDYID = "AB42",
TRTSDT = if_else(USUBJID == "1", ymd("2022-01-01"), NA),
TRTEDT = if_else(USUBJID == "1", ymd("2022-04-30"), NA)
)
derive_var_trtemfl(
adae,
start_date = ASTDT,
end_date = AENDT,
trt_start_date = TRTSDT
) %>% select(USUBJID, TRTSDT, ASTDT, AENDT, TRTEMFL)
#> # A tibble: 16 × 5
#> USUBJID TRTSDT ASTDT AENDT TRTEMFL
#> <chr> <date> <date> <date> <chr>
#> 1 1 2022-01-01 2021-12-13 2021-12-15 <NA>
#> 2 1 2022-01-01 2021-12-14 2021-12-14 <NA>
#> 3 1 2022-01-01 2021-12-30 2022-01-14 <NA>
#> 4 1 2022-01-01 2021-12-31 2022-01-01 <NA>
#> 5 1 2022-01-01 2022-01-01 2022-01-02 Y
#> 6 1 2022-01-01 2022-05-10 2022-05-10 Y
#> 7 1 2022-01-01 2022-05-11 2022-05-11 Y
#> 8 1 2022-01-01 NA NA Y
#> 9 1 2022-01-01 2021-12-30 NA <NA>
#> 10 1 2022-01-01 2021-12-31 NA <NA>
#> 11 1 2022-01-01 NA 2022-01-04 Y
#> 12 1 2022-01-01 NA 2021-12-24 <NA>
#> 13 1 2022-01-01 NA 2022-06-04 Y
#> 14 2 NA NA 2021-12-03 <NA>
#> 15 2 NA 2021-12-01 2021-12-03 <NA>
#> 16 2 NA 2021-12-06 NA <NA>
trt_end_date
and end_window
)
Derive TRTEMFL
taking a treatment end window into account
In addition to the treatment-emergent checks explained in the above
example, we now supply a treatment end date, trt_end_date = TRTEDT
and
an end window, end_window = 10
. With these, any AE which started on or
before treatment end date + 10 days is considered as treatment-emergent.
Otherwise, those starting after the treatment end window are no longer
flagged as treatment-emergent (e.g. record 7).
derive_var_trtemfl(
adae,
start_date = ASTDT,
end_date = AENDT,
trt_start_date = TRTSDT,
trt_end_date = TRTEDT,
end_window = 10
) %>% select(USUBJID, TRTSDT, TRTEDT, ASTDT, AENDT, TRTEMFL)
#> # A tibble: 16 × 6
#> USUBJID TRTSDT TRTEDT ASTDT AENDT TRTEMFL
#> <chr> <date> <date> <date> <date> <chr>
#> 1 1 2022-01-01 2022-04-30 2021-12-13 2021-12-15 <NA>
#> 2 1 2022-01-01 2022-04-30 2021-12-14 2021-12-14 <NA>
#> 3 1 2022-01-01 2022-04-30 2021-12-30 2022-01-14 <NA>
#> 4 1 2022-01-01 2022-04-30 2021-12-31 2022-01-01 <NA>
#> 5 1 2022-01-01 2022-04-30 2022-01-01 2022-01-02 Y
#> 6 1 2022-01-01 2022-04-30 2022-05-10 2022-05-10 Y
#> 7 1 2022-01-01 2022-04-30 2022-05-11 2022-05-11 <NA>
#> 8 1 2022-01-01 2022-04-30 NA NA Y
#> 9 1 2022-01-01 2022-04-30 2021-12-30 NA <NA>
#> 10 1 2022-01-01 2022-04-30 2021-12-31 NA <NA>
#> 11 1 2022-01-01 2022-04-30 NA 2022-01-04 Y
#> 12 1 2022-01-01 2022-04-30 NA 2021-12-24 <NA>
#> 13 1 2022-01-01 2022-04-30 NA 2022-06-04 Y
#> 14 2 NA NA NA 2021-12-03 <NA>
#> 15 2 NA NA 2021-12-01 2021-12-03 <NA>
#> 16 2 NA NA 2021-12-06 NA <NA>
initial_intensity
and intensity
)
Derive a new variable named TRTEM2FL
taking worsening after treatment
start into account
We also now start look at changes in intensity following treatment start using
the initial_intensity
and intensity
arguments. This only impacts AEs
starting before treatment, and ending on or after treatment (or with missing
AE end date). We can additionally consider treatment-emergence for an
AE that was ongoing at the start of treatment which may have worsened
as a result of treatment, i.e. the most extreme intensity is greater than
the initial intensity (e.g. records 3 and 9).
derive_var_trtemfl(
adae,
new_var = TRTEM2FL,
start_date = ASTDT,
end_date = AENDT,
trt_start_date = TRTSDT,
trt_end_date = TRTEDT,
end_window = 10,
initial_intensity = AEITOXGR,
intensity = AETOXGR
) %>% select(USUBJID, TRTSDT, ASTDT, AENDT, AEITOXGR, AETOXGR, TRTEM2FL)
#> # A tibble: 16 × 7
#> USUBJID TRTSDT ASTDT AENDT AEITOXGR AETOXGR TRTEM2FL
#> <chr> <date> <date> <date> <chr> <chr> <chr>
#> 1 1 2022-01-01 2021-12-13 2021-12-15 1 1 <NA>
#> 2 1 2022-01-01 2021-12-14 2021-12-14 1 3 <NA>
#> 3 1 2022-01-01 2021-12-30 2022-01-14 1 3 Y
#> 4 1 2022-01-01 2021-12-31 2022-01-01 1 1 <NA>
#> 5 1 2022-01-01 2022-01-01 2022-01-02 3 4 Y
#> 6 1 2022-01-01 2022-05-10 2022-05-10 2 2 Y
#> 7 1 2022-01-01 2022-05-11 2022-05-11 2 2 <NA>
#> 8 1 2022-01-01 NA NA 3 4 Y
#> 9 1 2022-01-01 2021-12-30 NA 3 4 Y
#> 10 1 2022-01-01 2021-12-31 NA 3 3 <NA>
#> 11 1 2022-01-01 NA 2022-01-04 3 4 Y
#> 12 1 2022-01-01 NA 2021-12-24 3 4 <NA>
#> 13 1 2022-01-01 NA 2022-06-04 3 4 Y
#> 14 2 NA NA 2021-12-03 1 2 <NA>
#> 15 2 NA 2021-12-01 2021-12-03 1 2 <NA>
#> 16 2 NA 2021-12-06 NA 1 2 <NA>
intensity
and group_var
)
Derive TRTEMFL
taking worsening after treatment into account within a
grouping variable
Firstly, to understand which records correspond to the same AE, we need
to supply a grouping variable (group_var
). Then this example works in a
similar way to the above one, but here we don't have an initial intensity
so we have to use the intensity of the AE at the time of treatment start.
If an ongoing AE increases intensity after treatment start (i.e. worsens),
then from that point on the records are considered treatment-emergent,
unless after the treatment end window (e.g. records 4, 6 and 7).
adae2 <- tribble(
~USUBJID, ~ASTDT, ~AENDT, ~AETOXGR, ~AEGRPID,
# ongoing AE where intensity drops after treatment start
"1", ymd("2021-12-31"), ymd("2022-01-01"), "3", "1",
"1", ymd("2022-01-02"), ymd("2022-01-11"), "2", "1",
# ongoing AE where intensity increases after treatment start
"1", ymd("2021-12-31"), ymd("2022-01-01"), "1", "2",
"1", ymd("2022-01-02"), ymd("2022-01-11"), "2", "2",
# ongoing AE where intensity increases after treatment start and then drops
"1", ymd("2021-12-31"), ymd("2022-01-01"), "1", "3",
"1", ymd("2022-01-02"), ymd("2022-01-11"), "2", "3",
"1", ymd("2022-01-12"), ymd("2022-01-15"), "1", "3"
) %>%
mutate(
STUDYID = "AB42",
TRTSDT = if_else(USUBJID == "1", ymd("2022-01-01"), NA),
TRTEDT = if_else(USUBJID == "1", ymd("2022-04-30"), NA)
)derive_var_trtemfl(
adae2,
start_date = ASTDT,
end_date = AENDT,
trt_start_date = TRTSDT,
trt_end_date = TRTEDT,
end_window = 10,
intensity = AETOXGR,
group_var = AEGRPID
) %>% select(USUBJID, TRTSDT, ASTDT, AENDT, AETOXGR, AEGRPID, TRTEMFL)
#> # A tibble: 7 × 7
#> USUBJID TRTSDT ASTDT AENDT AETOXGR AEGRPID TRTEMFL
#> <chr> <date> <date> <date> <chr> <chr> <chr>
#> 1 1 2022-01-01 2021-12-31 2022-01-01 3 1 <NA>
#> 2 1 2022-01-01 2022-01-02 2022-01-11 2 1 <NA>
#> 3 1 2022-01-01 2021-12-31 2022-01-01 1 2 <NA>
#> 4 1 2022-01-01 2022-01-02 2022-01-11 2 2 Y
#> 5 1 2022-01-01 2021-12-31 2022-01-01 1 3 <NA>
#> 6 1 2022-01-01 2022-01-02 2022-01-11 2 3 Y
#> 7 1 2022-01-01 2022-01-12 2022-01-15 1 3 Y
Here we present more cases (some new, some similar to the examples above) which are aligned one-to-one with the scenarios in the PHUSE White Paper
adae3 <- tribble(
~USUBJID, ~TRTSDTM, ~TRTEDTM, ~ASTDTM, ~AENDTM, ~AEITOXGR, ~AETOXGR,
# Patient 1: Pre-treatment AE
"1", "2021-01-01", "2021-12-31", "2020-12-20", "2020-12-21", "2", "2",
# Patient 2: On-treatment AE
"2", "2021-01-01", "2021-12-31", "2021-12-20", "2021-12-21", "2", "2",
# Patient 3: Pre-treatment AE, then on-treatment AE at same intensity
"3", "2021-01-01", "2021-12-31", "2020-12-20", "2020-12-21", "2", "2",
"3", "2021-01-01", "2021-12-31", "2021-12-20", "2021-12-21", "2", "2",
# Patient 4: Pre-treatment AE, then on-treatment AE at wors. intensity
"4", "2021-01-01", "2021-12-31", "2020-12-20", "2020-12-21", "2", "2",
"4", "2021-01-01", "2021-12-31", "2021-12-20", "2021-12-21", "2", "3",
# Patient 5: Pre-treatment AE, then on-treatment AE at impr. intensity
"5", "2021-01-01", "2021-12-31", "2020-12-20", "2020-12-21", "2", "2",
"5", "2021-01-01", "2021-12-31", "2021-12-20", "2021-12-21", "2", "1",
# Patient 6: AE starting pre-treatment, continuing on-treatment, then 2nd AE at same intensity
"6", "2021-01-01", "2021-12-31", "2020-12-23", "2021-01-21", "2", "2",
"6", "2021-01-01", "2021-12-31", "2021-12-20", "2021-12-21", "2", "2",
# Patient 7: AE starting pre-treatment, continuing on-treatment, then 2nd AE at wors. intensity
"7", "2021-01-01", "2021-12-31", "2020-12-23", "2021-01-21", "2", "2",
"7", "2021-01-01", "2021-12-31", "2021-12-20", "2021-12-21", "2", "3",
# Patient 8: AE starting pre-treatment, continuing on-treatment, then 2nd AE at impr. intensity
"8", "2021-01-01", "2021-12-31", "2020-12-23", "2021-01-21", "2", "2",
"8", "2021-01-01", "2021-12-31", "2021-12-20", "2021-12-21", "2", "1",
# Patient 9: AE starting pre-treatment, continuing on-treatment, and no change in intensity
"9", "2021-01-01", "2021-12-31", "2020-12-23", "2021-01-21", "2", "2",
# Patient 10: AE starting pre-treatment, continuing on-treatment, and wors. intensity
"10", "2021-01-01", "2021-12-31", "2020-12-23", "2021-01-21", "2", "4",
# Patient 11: AE starting pre-treatment, continuing on-treatment, and impr. intensity
"11", "2021-01-01", "2021-12-31", "2020-12-23", "2021-01-21", "2", "1",
# Patient 12: AE starting pre-treatment, worsening, then improving
"12", "2021-01-01", "2021-12-31", "2020-12-23", "2021-01-21", "3", "2",
# Patient 13: AE starting pre-treatment, improving, then worsening
"13", "2021-01-01", "2021-12-31", "2020-12-23", "2021-01-21", "1", "2",
) %>%
mutate(
ASTDTM = ymd(ASTDTM),
AENDTM = ymd(AENDTM),
TRTSDTM = ymd(TRTSDTM),
TRTEDTM = ymd(TRTEDTM),
)derive_var_trtemfl(
adae3,
new_var = TRTEMFL,
trt_end_date = TRTEDTM,
end_window = 0,
initial_intensity = AEITOXGR,
intensity = AETOXGR,
subject_keys = exprs(USUBJID)
) %>%
select(USUBJID, TRTSDTM, TRTEDTM, ASTDTM, AENDTM, AEITOXGR, AETOXGR, TRTEMFL)
#> # A tibble: 19 × 8
#> USUBJID TRTSDTM TRTEDTM ASTDTM AENDTM AEITOXGR AETOXGR TRTEMFL
#> <chr> <date> <date> <date> <date> <chr> <chr> <chr>
#> 1 1 2021-01-01 2021-12-31 2020-12-20 2020-12-21 2 2 <NA>
#> 2 2 2021-01-01 2021-12-31 2021-12-20 2021-12-21 2 2 Y
#> 3 3 2021-01-01 2021-12-31 2020-12-20 2020-12-21 2 2 <NA>
#> 4 3 2021-01-01 2021-12-31 2021-12-20 2021-12-21 2 2 Y
#> 5 4 2021-01-01 2021-12-31 2020-12-20 2020-12-21 2 2 <NA>
#> 6 4 2021-01-01 2021-12-31 2021-12-20 2021-12-21 2 3 Y
#> 7 5 2021-01-01 2021-12-31 2020-12-20 2020-12-21 2 2 <NA>
#> 8 5 2021-01-01 2021-12-31 2021-12-20 2021-12-21 2 1 Y
#> 9 6 2021-01-01 2021-12-31 2020-12-23 2021-01-21 2 2 <NA>
#> 10 6 2021-01-01 2021-12-31 2021-12-20 2021-12-21 2 2 Y
#> 11 7 2021-01-01 2021-12-31 2020-12-23 2021-01-21 2 2 <NA>
#> 12 7 2021-01-01 2021-12-31 2021-12-20 2021-12-21 2 3 Y
#> 13 8 2021-01-01 2021-12-31 2020-12-23 2021-01-21 2 2 <NA>
#> 14 8 2021-01-01 2021-12-31 2021-12-20 2021-12-21 2 1 Y
#> 15 9 2021-01-01 2021-12-31 2020-12-23 2021-01-21 2 2 <NA>
#> 16 10 2021-01-01 2021-12-31 2020-12-23 2021-01-21 2 4 Y
#> 17 11 2021-01-01 2021-12-31 2020-12-23 2021-01-21 2 1 <NA>
#> 18 12 2021-01-01 2021-12-31 2020-12-23 2021-01-21 3 2 <NA>
#> 19 13 2021-01-01 2021-12-31 2020-12-23 2021-01-21 1 2 Y
For the derivation of the new variable the following cases are considered in this order. The first case which applies, defines the value of the variable.
not treated: If trt_start_date
is NA
, it is set to NA_character_
.
event before treatment: If end_date
is before trt_start_date
(and
end_date
is not NA
), it is set to NA_character_
.
no event date: If start_date
is NA
, it is set to "Y"
as in such
cases it is usually considered more conservative to assume the event was
treatment-emergent.
event started during treatment:
if end_window
is not specified:
if start_date
is on or after trt_start_date
, it is set to "Y"
,
if end_window
is specified:
if start_date
is on or after trt_start_date
and start_date
is on
or before trt_end_date
+ end_window
days, it is set to "Y"
,
event started before treatment and (possibly) worsened on treatment:
if initial_intensity
, intensity
is specified and group_var
is not specified:
if initial_intensity < intensity
and start_date
is before trt_start_date
and end_date
is on or after trt_start_date
or end_date
is NA
, it
is set to "Y"
;
if group_var
is specified:
if intensity
at treatment start < intensity
and start_date
is after
trt_start_date
and end_date
is on or after trt_start_date
or
end_date
is NA
, it is set to "Y"
;
Otherwise it is set to NA_character_
.
The behavior of derive_var_trtemfl()
is aligned with the proposed
treatment-emergent AE assignment in the following
PHUSE White Paper.
See the final example in the examples section below.
OCCDS Functions:
derive_vars_atc()
,
derive_vars_query()
,
get_terms_from_db()