Conversation
bms63
left a comment
There was a problem hiding this comment.
I'm not very savvy with oncology stuff - but looks really nice from a quick glance.
maybe some folks from admiral onco team would be able to help with review - @bundfussr @pharmaverse/admiralonco any interest?
tlg/oncology_survival.qmd
Outdated
|
|
||
| This guide demonstrates how pharmaverse packages, along with tools from the | ||
| tidyverse, can be used to create standard oncology survival Tables, Listings, | ||
| and Graphs (TLGs) using the `{pharmaverseadam}` `ADTTE_ONCO` dataset as input. |
There was a problem hiding this comment.
I'm not sure if the adtte_onco dataset is well suited for creating summaries. It is based on adrs_onco, which is based on rs_onco_recist. rs_onco_recist contains only eight subjects. Unfortunately, we used the complete adsl dataset when creating adrs_onco and adtte_onco. Therefore almost all patients are censored at day one, which leads to strange and highly unlikely results:
PARAMCD PARAM N N_events Pct_events Median_AVAL
<chr> <chr> <int> <int> <dbl> <dbl>
1 OS Overall Survival 254 3 1.2 140
2 PFS Progression Free Survival 254 6 2.4 1
3 RSD Duration of Response 4 1 25 32.5
There was a problem hiding this comment.
Not sure we have any other options available? Maybe this could be explained with a short note in the article?
There was a problem hiding this comment.
I think for the short term we don't have other options (except maybe generating an ADTTE dataset specifically for this vignette).
In the long term we may need to revise our test data strategy. It seems that the time to load pharmaverseadam is increasing. We have observed this already in the Roche-internal syntheticadam package. Do we really need more than 300 subjects? For the ADaM websites it results in long loading times but who want to scroll through hundred of subjects in the examples? A few subjects (like in the admiralonco vignettes) to show the interesting scenarios should be sufficient. However, for TLGs it's different. Summaries with eight subjects doesn't make sense and give strange looking results.
@bms63 , @manciniedoardo , what do you think?
There was a problem hiding this comment.
I'm not sure on the pharmaverseadam side - is there a better way to store the data? like a different format?
shall we put this in - pharmaverse/admiral#2971 ?
There was a problem hiding this comment.
Tagging @Fanny-Gautier as the maintainer
| ``` | ||
|
|
||
| > **Note on CNSR coding:** In CDISC ADTTE, `CNSR = 0` indicates an **event** | ||
| > and `CNSR = 1` indicates **censoring**. `Surv_CNSR(AVAL, CNSR)` handles this |
There was a problem hiding this comment.
CDISC recommends using values >= 1 for censoring. Currently this is not covered by Surv_CNSR() (I've created an issue suggesting to enhance it).
tlg/oncology_survival.qmd
Outdated
| scale_ggsurvfit() + | ||
| labs( | ||
| title = paste0(unique(adtte_pfs$PARAM), "\nKaplan-Meier Estimate"), | ||
| x = paste0("Time (", unique(adtte_pfs$AVALU), ")"), |
| mutate(label = recode(label, | ||
| "0.25" = "3 months", | ||
| "0.5" = "6 months", | ||
| "0.75" = "9 months", | ||
| "1" = "12 months" | ||
| )) |
tlg/oncology_survival.qmd
Outdated
| This table shows estimated PFS probabilities at clinically meaningful time | ||
| points. For PFS these are typically shorter intervals than OS — 3, 6, 9, and | ||
| 12 months are standard in many oncology trials. Adjust `times` to match the | ||
| `AVALU` units in your dataset. |
There was a problem hiding this comment.
I would remove AVALU because it not a CDISC variable.
| adtte_pfs |> | ||
| cardx::ard_survival_survfit( | ||
| y = "Surv_CNSR(AVAL, CNSR)", | ||
| probs = 0.5 | ||
| ) | ||
|
|
||
| # Time-point survival probability ARD | ||
| adtte_pfs |> | ||
| cardx::ard_survival_survfit( | ||
| y = "Surv_CNSR(AVAL, CNSR)", | ||
| times = c(0.25, 0.5, 0.75, 1) | ||
| ) |
There was a problem hiding this comment.
Is it possible to display the result of these calls?
| survfit2(Surv_CNSR(AVAL, CNSR) ~ ARM, data = adtte_pfs) |> | ||
| ggsurvfit(linewidth = 1) + | ||
| scale_color_brewer(palette = "Dark2") + | ||
| scale_fill_brewer(palette = "Dark2") + | ||
| add_confidence_interval() + | ||
| add_risktable( | ||
| theme = theme_risktable_default(axis.text.y.size = 9, plot.title.size = 9) | ||
| ) + | ||
| add_pvalue(location = "annotation") + | ||
| scale_ggsurvfit() |
| add_risktable( | ||
| theme = theme_risktable_default(axis.text.y.size = 9, plot.title.size = 9) | ||
| ) + | ||
| add_pvalue(location = "annotation") + |
There was a problem hiding this comment.
What p-value is displayed here?
In the Roche standard output for each active treatment group the p-value for the comparison with placebo is displayed.



Pull Request
DESCRIPTION GOES HERE
Before you submit your pull request, take a look at the following checklist. Many thanks for your contribution!
Closes #<insert_issue_number>at the beginning of your PR title. Use the Edit button in the top-right if you need to update.DESCRIPTIONfile.DESCRIPTIONfile'sImportssection.