From b38b3669c087772bdde4627934978aa6ce5f4939 Mon Sep 17 00:00:00 2001 From: Nan Xiao Date: Tue, 30 May 2023 13:25:39 -0400 Subject: [PATCH] Add workflow vignette --- _pkgdown.yml | 1 + vignettes/workflow.Rmd | 109 +++++++++++++++++++++++++++++++++++++++++ vignettes/workflow.png | Bin 0 -> 16836 bytes 3 files changed, 110 insertions(+) create mode 100644 vignettes/workflow.Rmd create mode 100644 vignettes/workflow.png diff --git a/_pkgdown.yml b/_pkgdown.yml index 7c47307e..b14a22f5 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -68,3 +68,4 @@ articles: - modestWLRTVignette - pvalue_maxcomboVignette - simtrialroutines + - workflow diff --git a/vignettes/workflow.Rmd b/vignettes/workflow.Rmd new file mode 100644 index 00000000..df61cfdd --- /dev/null +++ b/vignettes/workflow.Rmd @@ -0,0 +1,109 @@ +--- +title: "TTE simulation data manipulations" +author: "Keaven Anderson" +output: rmarkdown::html_vignette +bibliography: simtrial.bib +vignette: > + %\VignetteIndexEntry{TTE simulation data manipulations} + %\VignetteEngine{knitr::rmarkdown} +--- + +```{r, include=FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) +``` + +## Overview + +We attempt to provide a big picture view of what is involved in a clinical trial +simulation with individual time-to-event data generated for each patient. +Primary interest is in group sequential trials, usually with a single endpoint. +However extensions could be made. + +## Results data table + +At the time of simulation planning an analysis plan for the trial is needed. +For a group sequential design, a data table to store results is generated. +Generally, the dimensions and variables planned for storage would be +planned up front. As a simple example, if there is a group sequential design +with 3 analyses planned, 15 data items for each analysis and 10,000 simulations +planned, a data table with 30,000 rows and 15 columns has been used to store +summary results. As each trial simulation proceeds, a row is updated with +results for each analysis. + +## Simulated trial dataset generation + +For each simulated trial, an initial table is generated with information at a +patient level. If trials are generated sequentially, the space needed for this +data table could be re-used, never requiring allocation of more space. +Each row contains data for a single patient. As an example, we could simulate +a trial with 500 patients and 10 data items per patients. +The data items would be in columns, the patients in rows. + +## Dataset manipulations for analysis + +Simulated trial data need to be manipulated to do any individual analysis +(interim or final) for a clinical trial. The following operations are needed: + +1. Ordering data +1. Selecting a subset for analysis +1. Calculating individual patient results for the subset at the time of analysis. +1. Performing statistical tests and computing treatment effect estimates + as well as other summaries that will included in the results summary dataset + described above. Types of computations needed are + 1. Number of subjects by treatment group + 1. Number of events by treatment group + 1. Kaplan-Meier estimation of survival curves + 1. Observed minus expected computations as well as weighting for logrank, weighted logrank calculations. + 1. Using the survival package to compute hazard ratio estimates. + +## Flow for simulating group sequential: one scenario algorithm + +Group sequential design simulation flow: + +- Generate a trial. +- Analyze repeatedly. +- Summarize across simulated trials. + +```{r, echo=FALSE, fig.align="center", out.width="85%"} +knitr::include_graphics("workflow.png") +``` + +```{r, echo=FALSE, eval=FALSE} +g <- DiagrammeR::grViz(" +digraph boxes_and_diamonds { + + # a 'graph' statement + graph [ordering = 'in'] + + # several 'node' statements + node [fontsize = '14', fontname = 'Arial'] + + node [shape = box, style = filled, fillcolor = '#d9d2e9'] 'Save analysis\n summary'; 'Cut data\n for analysis'; 'Analyze data'; + + node [shape = diamond, style = filled, fillcolor = '#fff2cc'] 'Final analysis?' + node [shape = diamond, style = filled, fillcolor = '#fff2cc'] 'Finished with\n all trials?' + + node [shape = box, style = filled, fillcolor = '#e6b8af', label = 'Summarize across\n trials'] summarize + + node [shape = box, style = filled, fillcolor = '#d9ead3', label = 'Scenario'] scenario + node [shape = box, style = filled, fillcolor = '#cfe2f3', label = 'Generate enrollment\n times'] enrollment + node [shape = box, style = filled, fillcolor = '#cfe2f3', label = 'Generate strata'] strata + node [shape = box, style = filled, fillcolor = '#cfe2f3', label = 'Randomize patients'] randomize + node [shape = box, style = filled, fillcolor = '#cfe2f3', label = 'Generate outcomes'] outcomes + node [shape = box, style = filled, fillcolor = '#cfe2f3', label = 'Generate next\n trial'] next + + scenario -> enrollment -> strata -> randomize -> outcomes + outcomes -> 'Cut data\n for analysis' -> 'Analyze data'->'Save analysis\n summary' + 'Save analysis\n summary' -> 'Final analysis?' + 'Final analysis?' -> 'Cut data\n for analysis' [label = 'No', fontname = 'Arial'] + 'Final analysis?' -> 'Finished with\n all trials?' [label = 'Yes', fontname = 'Arial'] + 'Finished with\n all trials?' -> summarize [label = 'Yes', fontname = 'Arial'] + 'Finished with\n all trials?' -> next [label = 'No', fontname = 'Arial'] +} +") + +rsvg::rsvg_png(charToRaw(DiagrammeRsvg::export_svg(g)), file = "vignettes/workflow.png") +``` diff --git a/vignettes/workflow.png b/vignettes/workflow.png new file mode 100644 index 0000000000000000000000000000000000000000..028e5076e332914061477a1cf7c3526efdb4d02c GIT binary patch literal 16836 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 literal 0 HcmV?d00001