|
21 | 21 | # These functions are used to create dummy datasets to illustrate package use
|
22 | 22 | # create_dummydata
|
23 | 23 | # create_dummydata_survcan
|
| 24 | +# create_dummydata_pharmaonc |
24 | 25 | # create_dummydata_flexbosms
|
25 | 26 | #
|
26 | 27 | # ======================================
|
27 | 28 |
|
28 | 29 | #' Create dummy dataset for illustration
|
29 | 30 | #' @description Create dummy dataset to illustrate [psm3mkv]
|
30 | 31 | #' @param dsname Dataset name, as follows:
|
31 |
| -#' * 'flexbosms' provides a dataset based on [flexsurv::bosms3()]. This contains all the fields necessary for [psm3mkv]. Durations have been converted from months in the original dataset to weeks. |
32 |
| -#' * 'survcan' provides a dataset based on [survival::cancer()]. This contains the necessary ID and overall survival fields only. Durations have been converted from days in the original dataset to weeks. You will additionally need to supply PFS and TTP data (fields pfs.durn, pfs.flag, ttp.durn and ttp.flag) to use [psm3mkv]. |
| 32 | +#' * `flexbosms` provides a dataset based on [flexsurv::bosms3()]. This contains all the fields necessary for [psm3mkv]. Durations have been converted from months in the original dataset to weeks. |
| 33 | +#' * `pharmaonc` provides a dataset based on [pharmaverseadam::adsl] and [pharmaverseadam::adrs_onco] to demonstrate how this package can be used with ADaM ADTTE datasets. |
| 34 | +#' * `survcan` provides a dataset based on [survival::cancer()]. This contains the necessary ID and overall survival fields only. Durations have been converted from days in the original dataset to weeks. You will additionally need to supply PFS and TTP data (fields pfs.durn, pfs.flag, ttp.durn and ttp.flag) to use [psm3mkv]. |
33 | 35 | #' @return Tibble dataset, for use with [psm3mkv] functions
|
34 | 36 | #' @export
|
35 | 37 | #' @examples
|
36 | 38 | #' create_dummydata("survcan") |> head()
|
37 | 39 | #' create_dummydata("flexbosms") |> head()
|
| 40 | +#' create_dummydata("pharmaonc") |> head() |
38 | 41 | create_dummydata <- function(dsname) {
|
| 42 | + dsname <- stringr::str_to_lower(dsname) |
39 | 43 | if (dsname=="survcan") {create_dummydata_survcan()}
|
40 | 44 | else if (dsname=="flexbosms") {create_dummydata_flexbosms()}
|
41 |
| - else {stop("Incorrect dataset specified. Must be survcan or flexbosms.")} |
| 45 | + else if (dsname=="pharmaonc") {create_dummydata_pharmaonc()} |
| 46 | + else {stop("Incorrect dataset specified. Must be survcan, flexbosms or pharmaonc.")} |
42 | 47 | }
|
43 | 48 |
|
44 | 49 | #' Create survcan dummy dataset for illustration
|
@@ -103,3 +108,126 @@ create_dummydata_flexbosms <- function() {
|
103 | 108 | attr(ds$ttp.flag, "label") <- "Event flag for TTP (1=event, 0=censor)"
|
104 | 109 | return(ds)
|
105 | 110 | }
|
| 111 | + |
| 112 | +#' Create pharmaonc dataset for illustration |
| 113 | +#' @description Create 'pharmaonc' dummy dataset to illustrate [psm3mkv]. This dataset is derived from `pharmaverse::adsl` and `pharmaverse::adrs_onco`. Overall Survival and Time To Progression are derived using `admiral::derive_param_tte()`, then durations are calculated in weeks. |
| 114 | +#' @return Tibble dataset, for use with [psm3mkv] functions |
| 115 | +#' @seealso [create_dummydata()] |
| 116 | +#' @importFrom rlang .data |
| 117 | +#' @noRd |
| 118 | +create_dummydata_pharmaonc <- function() { |
| 119 | + # Create local variables |
| 120 | + DTHFL <- DTHDT <- LSTALVDT <- AVALC <- ADT <- ASEQ <- RANDDT <- STARTDT <- NULL |
| 121 | + CNSR <- USUBJID <- PARAMCD <- DURN <- EVFLAG <- DURN_OS <- EVFLAG_OS <- DURN_TTP <- EVFLAG_TTP <- NULL |
| 122 | + ttp.durn <- os.durn <- ttp.flag <- os.flag <- ptid <- pfs.durn <- pfs.flag <- NULL |
| 123 | + # Obtain ADSL and ADRS datsets from pharmaverseadam |
| 124 | + adsl <- pharmaverseadam::adsl |
| 125 | + adrs <- pharmaverseadam::adrs_onco |
| 126 | + # Define event: death |
| 127 | + death <- admiral::event_source( |
| 128 | + dataset_name = "adsl", |
| 129 | + filter = DTHFL == "Y", |
| 130 | + date = DTHDT, |
| 131 | + set_values_to = admiral::exprs( |
| 132 | + EVNTDESC = "DEATH", |
| 133 | + SRCDOM = "ADSL", |
| 134 | + SRCVAR = "DTHDT" |
| 135 | + ) |
| 136 | + ) |
| 137 | + # Define event: last date alive |
| 138 | + last_alive_dt <- admiral::censor_source( |
| 139 | + dataset_name = "adsl", |
| 140 | + date = LSTALVDT, |
| 141 | + set_values_to = admiral::exprs( |
| 142 | + EVNTDESC = "LAST DATE KNOWN ALIVE", |
| 143 | + SRCDOM = "ADSL", |
| 144 | + SRCVAR = "LSTALVDT" |
| 145 | + ) |
| 146 | + ) |
| 147 | + # Define event: progression |
| 148 | + pd <- admiral::event_source( |
| 149 | + dataset_name = "adrs", |
| 150 | + filter = AVALC == "PD", |
| 151 | + date = ADT, |
| 152 | + set_values_to = admiral::exprs( |
| 153 | + EVENTDESC = "PD", |
| 154 | + SRCDOM = "ADRS", |
| 155 | + SRCVAR = "ADTM", |
| 156 | + SRCSEQ = ASEQ |
| 157 | + ) |
| 158 | + ) |
| 159 | + # Start creating dataset |
| 160 | + # Derive OS date |
| 161 | + admiral::derive_param_tte( |
| 162 | + dataset_adsl = adsl, |
| 163 | + start_date = RANDDT, |
| 164 | + event_conditions = list(death), |
| 165 | + censor_conditions = list(last_alive_dt), |
| 166 | + source_datasets = list(adsl = adsl, adrs = adrs), |
| 167 | + set_values_to = admiral::exprs(PARAMCD = "OS", PARAM = "Overall Survival") |
| 168 | + ) |> |
| 169 | + # Derive TTP date |
| 170 | + admiral::derive_param_tte( |
| 171 | + dataset_adsl = adsl, |
| 172 | + start_date = RANDDT, |
| 173 | + event_conditions = list(pd), |
| 174 | + censor_conditions = list(last_alive_dt), |
| 175 | + source_datasets = list(adsl = adsl, adrs = adrs), |
| 176 | + set_values_to = admiral::exprs(PARAMCD = "TTP", PARAM = "Time to Progression") |
| 177 | + ) |> |
| 178 | + # Derive durations of TTP and PFS |
| 179 | + dplyr::mutate( |
| 180 | + DURN = admiral::compute_duration( |
| 181 | + start_date = STARTDT, |
| 182 | + end_date = ADT, |
| 183 | + trunc_out = FALSE, |
| 184 | + out_unit = "weeks", |
| 185 | + add_one = FALSE |
| 186 | + ), |
| 187 | + EVFLAG = 1-CNSR |
| 188 | + ) |> |
| 189 | + # Keep only necessary fields |
| 190 | + dplyr::select(USUBJID, PARAMCD, DURN, EVFLAG) |> |
| 191 | + # Pivot wide the duration and event flag fields |
| 192 | + tidyr::pivot_wider( |
| 193 | + id_cols = "USUBJID", |
| 194 | + names_from = "PARAMCD", |
| 195 | + values_from = c("DURN", "EVFLAG") |
| 196 | + ) |> |
| 197 | + # Rename to required field names |
| 198 | + dplyr::rename( |
| 199 | + ptid = USUBJID, |
| 200 | + os.durn = DURN_OS, |
| 201 | + os.flag = EVFLAG_OS, |
| 202 | + ttp.durn = DURN_TTP, |
| 203 | + ttp.flag = EVFLAG_TTP |
| 204 | + ) |> |
| 205 | + # Add a PFS field |
| 206 | + dplyr::mutate( |
| 207 | + pfs.durn = pmin(ttp.durn, os.durn), |
| 208 | + pfs.flag = 1-(1-ttp.flag)*(1-os.flag) |
| 209 | + ) |> |
| 210 | + dplyr::select(ptid, ttp.durn, ttp.flag, pfs.durn, pfs.flag, os.durn, os.flag) |
| 211 | +} |
| 212 | + |
| 213 | +#' Check consistency of PFS definition |
| 214 | +#' Check that PFS is defined consistently with TTP and OS in a dataset. This convenience function compares `pfs.durn` with the lower of `ttp.durn` and `os.durn`, and checks that the event field `pfs.flag` is consistent with `ttp.flag` and `os.flag` (is 1 when either `ttp.flag` or `os.flag` is one). |
| 215 | +#' @param ds Tibble of complete patient-level dataset |
| 216 | +#' - `ttp.durn`, `pfs.durn`, and `os.durn` are the durations of TTP (time to progression), PFS (progression-free survival), and OS (overall survival). |
| 217 | +#' - `ttp.flag`, `pfs.flag`, and `os.flag`, and `pps.flag` are event flag indicators for TTP, PFS, and OS respectively (1=event, 0=censoring). |
| 218 | +#' @export |
| 219 | +#' @return List containing: |
| 220 | +#' - `durn`: Logical vector comparing expected and actual PFS durations |
| 221 | +#' - `flag`: Logical vector comparing expected and actual PFS event flags |
| 222 | +#' - `all`: Single logical value of TRUE if all durations and flags match as expected, FALSE otherwise |
| 223 | +#' @export |
| 224 | +#' @examples |
| 225 | +#' ponc <- create_dummydata("pharmaonc") |
| 226 | +#' check_consistent_pfs(ponc) |
| 227 | +check_consistent_pfs <- function(ds) { |
| 228 | + durn <- flag <- NULL |
| 229 | + durn <- ds$pfs.durn==pmin(ds$ttp.durn, ds$os.durn) |
| 230 | + flag <- ds$pfs.flag==1-(1-ds$ttp.flag)*(1-ds$os.flag) |
| 231 | + list(durn=durn, flag=flag, all=all(c(durn,flag))) |
| 232 | +} |
| 233 | + |
0 commit comments