--- title: 'Visualize the impact of changing definitions of HiSCR response on the results' author: Agustin Calatroni date: "`r format(Sys.Date(), format='%a %d %b %Y')`" output: flexdashboard::flex_dashboard: orientation: columns self_contained: true source_code: "https://github.com/agstn/WW/tree/main/2022-04-13" --- ```{=html} ``` ```{r knitr-defaults} knitr::opts_chunk$set(warning = FALSE, message = FALSE, comment = NA) knitr::opts_chunk$set(cache = FALSE) options(width=170) ``` ```{r load-packages} pacman::p_load(tidyverse, rio) pacman::p_load(reactable, reactablefmtr, plotly) pacman::p_load(htmltools, htmlwidgets, crosstalk) ``` ```{r import-data} #https://themockup.blog/posts/2020-05-29-client-side-interactivity-do-more-with-crosstalk/ #https://github.com/kcuilla/2020-RStudio-Table-Contest-Entry2 dd_mod <- rio::import('dat/HiSCR_dat_mod.rds') %>% select(an.count, abscesses, drain.fist, n_y, p_a:p_l10) dd_cross <- SharedData$new(dd_mod) ``` # Definitions Inputs {.sidebar data-width=250} -------------------------------------------------- A patient reaches a **HiSCR response**, if all of the following three conditions are met, when the baseline data are compared to the follow-up data (at week 16): **at least a XX% decrease in (AN) count**
AN count is defined as the sum of the number of abscess and the number of inflammatory nodules ```{r input-filters-1} filter_slider( id = "an.count", #label = "% (AN) count decrease", label = NULL, sharedData = dd_cross, column = ~ an.count, ticks = TRUE, post = '%', step = 25, width = "75%") ``` **XX decrease in the number of abscesses** ```{r input-filters-2} filter_slider( id = "abscesses", #label = "decrease # abscesses", label = NULL, sharedData = dd_cross, pre = '#', column = ~abscesses, step = 1, width = "75%") ``` **XX decrease in the number of draining fistulae** ```{r input-filters-3} filter_slider( id = "drain.fist", #label = "decrease # daining fistulae", label = NULL, sharedData = dd_cross, pre = '#', column = ~drain.fist, step = 1, width = "75%") ``` Column -------------------------------------------------- ### VOLCANO PLOT {data-height=825} ```{r figure-plotly} g1 <- ggplot(data = dd_cross, aes(x = d_n, y = p_l10, size = n_y, alpha = 0.5, text = paste('Difference (95%CI)', d_e, d_c, '
-log10(p)=', round(p_l10,2), '& p:', d_f, '
HiSCR (Yes):', n_y))) + geom_vline(xintercept = 0, col = 'gray50') + geom_hline(yintercept = -log10(0.05), col = 'gray50') + geom_point() + scale_alpha_identity() + scale_x_continuous(name = 'Difference
(Active-Placebo)', limits = c(-15, 40), breaks = c(-10, -5, 0, 5, 10, 20, 30, 40)) + scale_y_continuous(name = '-log10(p-value)', expand = c(0.02, 0.02), limits = c(0, 15), breaks = c(0, 1.3, 4.6, 5, 6.9, 10, 15), labels = c('0', '1.3\n(p=0.05)', '\n 4.6\n(p=0.01)', '5\n','6.9\n(p=0.001)', '10', '15'), sec.axis = sec_axis( trans=~ 1/(10^(.)), breaks = c(0.99, 0.5, 0.05, 0.01, 0.001, 0.0001), labels = c('>0.99', '0.5', '0.05', '0.01', '0.001', '0.0001'), name="p-value") ) + theme_bw() ggplotly(g1, tooltip = c("text"), width = 685, height = 650) %>% add_text( x = ~32, y = ~14.34, text = ~"HiSCR-Original Def.", showlegend = FALSE, hoverinfo = "none", color = I("black"), size = I(9) ) %>% layout( xaxis = list(fixedrange = TRUE), yaxis = list(fixedrange = TRUE) ) ``` ### ORIGINAL DEFINITION RESULTS {data-height=175} ```{r table-gtsummary} pacman::p_load(gtsummary) dd_w <- rio::import('dat/HiSCR_dat_w.rds') theme_gtsummary_compact() dd_w %>% tbl_summary(by = TRT, include = HiSCR , label = list(HiSCR ~ "<=50% (AN) count + #0 abscesses + #0 draining fistulae"), statistic = all_categorical(dichotomous = TRUE) ~ "{p}% ({n})") %>% add_difference(pvalue_fun = ~style_ratio(-log10(.x), digits = 3)) %>% modify_cols_merge(pattern = "{estimate}
({ci})") %>% modify_header(estimate = "Difference
(95% CI)", label = "HiSCR-Original (Yes)", p.value = "-log10(p-value)", all_stat_cols() ~ "{level}
N = {n}", text_interpret = 'html') %>% modify_footnote(update = everything() ~ NA) ``` Column -------------------------------------------------- ### RESULTS TABLE ```{r table-reactable} reactable( dd_cross, theme = fivethirtyeight(centered = TRUE, header_font_size = 12), pagination = FALSE, showSortIcon = FALSE, highlight = TRUE, # compact = TRUE, # height = 800, selection = "multiple", onClick = "select", defaultSorted = list(p_l10 = "desc"), columnGroups = list( colGroup(name = "definition of HiSCR response", columns = c("an.count", "abscesses","drain.fist")), colGroup(name = "Two-Sample Proportions Test", columns = c("p_a","n_a","p_p","n_p","d_e","d_f","p_l10")) ), defaultColDef = colDef(align = 'right', sortable = FALSE), columns = list( d_l = colDef(show = F), d_u = colDef(show = F), an.count = colDef(show = T, sortable = TRUE, name = 'AN Count', maxWidth = 65), abscesses = colDef(show = T, sortable = TRUE, name = 'draining fistulae', maxWidth = 65), drain.fist = colDef(show = T, sortable = TRUE, name = 'abscesses', maxWidth = 75), p_a = colDef(name = 'Active
N = 200', html = TRUE, maxWidth = 70, format = colFormat(suffix = '%', digits = 1), cell = merge_column(dd_mod, "n_a") ), n_a = colDef(show = F), p_p = colDef(name = 'Placebo
N = 200', html = TRUE, maxWidth = 70, format = colFormat(suffix = '%', digits = 1), cell = merge_column(dd_mod, "n_p")), n_p = colDef(show = F), d_e = colDef(name = 'Difference (95%CI)
(Active-Placebo)', html = TRUE, align = 'right', cell = merge_column(dd_mod, "d_c"), width = 125), n_y = colDef(show = F), d_n = colDef(show = F), d_c = colDef(show = F), d_l = colDef(show = F), d_u = colDef(show = F), p_l10 = colDef(name = "UNADJ
-log10(p-value)", sortable = TRUE, maxWidth = 65, html = TRUE, format = colFormat(digits = 2)), p_n = colDef(show = F, name = "UNADJ
p-value", html = TRUE, format = colFormat(digits = 3)), d_f = colDef(name = "UNADJ
p-value", maxWidth = 65, html = TRUE, align = 'right') ) ) ```