insightsengineering / teal.goshawk

Modules that produce web interfaces through which longitudinal visualizations can be dynamically
https://insightsengineering.github.io/teal.goshawk/
Other
3 stars 2 forks source link

Correlation #138

Closed npaszty closed 2 years ago

npaszty commented 2 years ago

when adding LLOQ vertical line, the legend doesn't update. same with SRC. when adding LLOQ horizontal line, the legend updates and the vertical line also appears now. see app.R here: /home/bceuser/npaszty/lupus_data_mart/sandbox

nikolas-burkoff commented 2 years ago

Reprex below @gogonzo

Separately @npaszty https://github.com/insightsengineering/coredev-tasks/issues/285

library(scda)
library(teal.goshawk)

# original ARM value = dose value
arm_mapping <- list(
  "A: Drug X" = "150mg QD",
  "B: Placebo" = "Placebo",
  "C: Combination" = "Combination"
)
color_manual <- c("150mg QD" = "#000000", "Placebo" = "#3498DB", "Combination" = "#E74C3C")
# assign LOQ flag symbols: circles for "N" and triangles for "Y", squares for "NA"
shape_manual <- c("N" = 1, "Y" = 2, "NA" = 0)

ADSL <- synthetic_cdisc_data("latest")$adsl

set.seed(1)
ADLB <- synthetic_cdisc_data("latest")$adlb
var_labels <- lapply(ADLB, function(x) attributes(x)$label)
ADLB <- ADLB %>%
  dplyr::mutate(AVISITCD = dplyr::case_when(
    AVISIT == "SCREENING" ~ "SCR",
    AVISIT == "BASELINE" ~ "BL",
    grepl("WEEK", AVISIT) ~
      paste(
        "W",
        trimws(
          substr(
            AVISIT,
            start = 6,
            stop = stringr::str_locate(AVISIT, "DAY") - 1
          )
        )
      ),
    TRUE ~ NA_character_
  )) %>%
  dplyr::mutate(AVISITCDN = dplyr::case_when(
    AVISITCD == "SCR" ~ -2,
    AVISITCD == "BL" ~ 0,
    grepl("W", AVISITCD) ~ as.numeric(gsub("[^0-9]*", "", AVISITCD)),
    TRUE ~ NA_real_
  )) %>%
  # use ARMCD values to order treatment in visualization legend
  dplyr::mutate(TRTORD = ifelse(grepl("C", ARMCD), 1,
                                ifelse(grepl("B", ARMCD), 2,
                                       ifelse(grepl("A", ARMCD), 3, NA)
                                )
  )) %>%
  dplyr::mutate(ARM = as.character(arm_mapping[match(ARM, names(arm_mapping))])) %>%
  dplyr::mutate(ARM = factor(ARM) %>%
                  reorder(TRTORD)) %>%
  dplyr::mutate(
    ANRHI = dplyr::case_when(
      PARAMCD == "ALT" ~ 60,
      PARAMCD == "CRP" ~ 70,
      PARAMCD == "IGA" ~ 80,
      TRUE ~ NA_real_
    ),
    ANRLO = dplyr::case_when(
      PARAMCD == "ALT" ~ 20,
      PARAMCD == "CRP" ~ 30,
      PARAMCD == "IGA" ~ 40,
      TRUE ~ NA_real_
    )
  ) %>%
  dplyr::rowwise() %>%
  dplyr::group_by(PARAMCD) %>%
  dplyr::mutate(LBSTRESC = ifelse(
    USUBJID %in% sample(USUBJID, 1, replace = TRUE),
    paste("<", round(runif(1, min = 25, max = 30))), LBSTRESC
  )) %>%
  dplyr::mutate(LBSTRESC = ifelse(
    USUBJID %in% sample(USUBJID, 1, replace = TRUE),
    paste(">", round(runif(1, min = 70, max = 75))), LBSTRESC
  )) %>%
  ungroup()
attr(ADLB[["ARM"]], "label") <- var_labels[["ARM"]]
attr(ADLB[["ANRHI"]], "label") <- "Analysis Normal Range Upper Limit"
attr(ADLB[["ANRLO"]], "label") <- "Analysis Normal Range Lower Limit"

# add LLOQ and ULOQ variables
ADLB_LOQS <- goshawk:::h_identify_loq_values(ADLB)
ADLB <- left_join(ADLB, ADLB_LOQS, by = "PARAM")

app <- init(
  data = cdisc_data(
    cdisc_dataset("ADSL", ADSL, code = "ADSL <- synthetic_cdisc_data(\"latest\")$adsl"),
    cdisc_dataset(
      "ADLB",
      ADLB,
      code = "set.seed(1)
              ADLB <- synthetic_cdisc_data('latest')$adlb
              var_labels <- lapply(ADLB, function(x) attributes(x)$label)
              ADLB <- ADLB %>%
                dplyr::mutate(AVISITCD = dplyr::case_when(
                  AVISIT == 'SCREENING' ~ 'SCR',
                  AVISIT == 'BASELINE' ~ 'BL',
                  grepl('WEEK', AVISIT) ~
                    paste(
                      'W',
                      trimws(
                        substr(
                          AVISIT,
                          start = 6,
                          stop = stringr::str_locate(AVISIT, 'DAY') - 1
                        )
                      )
                    ),
                  TRUE ~ NA_character_)) %>%
                dplyr::mutate(AVISITCDN = dplyr::case_when(
                  AVISITCD == 'SCR' ~ -2,
                  AVISITCD == 'BL' ~ 0,
                  grepl('W', AVISITCD) ~ as.numeric(gsub('[^0-9]*', '', AVISITCD)),
                  TRUE ~ NA_real_)) %>%
                # use ARMCD values to order treatment in visualization legend
                dplyr::mutate(TRTORD = ifelse(grepl('C', ARMCD), 1,
                                       ifelse(grepl('B', ARMCD), 2,
                                              ifelse(grepl('A', ARMCD), 3, NA)))) %>%
                dplyr::mutate(ARM = as.character(arm_mapping[match(ARM, names(arm_mapping))])) %>%
                dplyr::mutate(ARM = factor(ARM) %>%
                         reorder(TRTORD)) %>%
                dplyr::mutate(
                  ANRHI = dplyr::case_when(
                    PARAMCD == 'ALT' ~ 60,
                    PARAMCD == 'CRP' ~ 70,
                    PARAMCD == 'IGA' ~ 80,
                    TRUE ~ NA_real_
                  ),
                  ANRLO = dplyr::case_when(
                    PARAMCD == 'ALT' ~ 20,
                    PARAMCD == 'CRP' ~ 30,
                    PARAMCD == 'IGA' ~ 40,
                    TRUE ~ NA_real_
                  )) %>%
                dplyr::rowwise() %>%
                dplyr::group_by(PARAMCD) %>%
                dplyr::mutate(LBSTRESC = ifelse(
                  USUBJID %in% sample(USUBJID, 1, replace = TRUE),
                  paste('<', round(runif(1, min = 25, max = 30))), LBSTRESC)) %>%
                dplyr::mutate(LBSTRESC = ifelse(
                  USUBJID %in% sample(USUBJID, 1, replace = TRUE),
                  paste( '>', round(runif(1, min = 70, max = 75))), LBSTRESC)) %>%
                ungroup()
              attr(ADLB[['ARM']], 'label') <- var_labels[['ARM']]
              attr(ADLB[['ANRHI']], 'label') <- 'Analysis Normal Range Upper Limit'
              attr(ADLB[['ANRLO']], 'label') <- 'Analysis Normal Range Lower Limit'
              # add LLOQ and ULOQ variables
              ADLB_LOQS <- goshawk:::h_identify_loq_values(ADLB)
          ADLB <- left_join(ADLB, ADLB_LOQS, by = 'PARAM')",
      vars = list(arm_mapping = arm_mapping)
    ),
    check = TRUE
  ),
  modules = modules(
    tm_g_gh_correlationplot(
      label = "Correlation Plot",
      dataname = "ADLB",
      param_var = "PARAMCD",
      xaxis_param = choices_selected(c("ALT", "CRP", "IGA"), "ALT"),
      yaxis_param = choices_selected(c("ALT", "CRP", "IGA"), "CRP"),
      xaxis_var = choices_selected(c("AVAL", "BASE", "CHG", "PCHG"), "BASE"),
      yaxis_var = choices_selected(c("AVAL", "BASE", "CHG", "PCHG"), "AVAL"),
      trt_group = choices_selected(c("ARM", "ACTARM"), "ARM"),
      color_manual = c(
        "Drug X 100mg" = "#000000",
        "Placebo" = "#3498DB",
        "Combination 100mg" = "#E74C3C"
      ),
      shape_manual = c("N" = 1, "Y" = 2, "NA" = 0),
      plot_height = c(500, 200, 2000),
      facet_ncol = 2,
      visit_facet = TRUE,
      reg_line = FALSE,
      loq_legend = TRUE,
      font_size = c(12, 8, 20),
      dot_size = c(1, 1, 12),
      reg_text_size = c(3, 3, 10),
      hline_vars = c("ULOQN", "LLOQN"),
      hline_vars_colors = c("purple", "gray"),
      hline_vars_labels =  c("Upper Limit of Quantitation", "Lower Limit of Quantitation"),
      vline_vars = c("ULOQN", "LLOQN"),
      vline_vars_colors = c("brown", "gold"),
      vline_vars_labels =  c("Upper Limit of Quantitation", "Lower Limit of Quantitation")
    )
  )
)

shinyApp(app$ui, app$server)
gogonzo commented 2 years ago

@nikolas-burkoff @npaszty h_identify_loq_values hasn't changed since last release , so I assume problem occurred also before. I will move this to backlog to refine

nikolas-burkoff commented 2 years ago

After discussions we'll keep this in the release sprint but I'll move my additional comments above into a new goshawk issue for the backlog

kpagacz commented 2 years ago

@nikolas-burkoff @gogonzo The release sprint ended, and this issue was left out. I guess some of its substance got moved to the new issue. What shall we do with this one then?

Is this being actively worked on?

gogonzo commented 2 years ago

@kpagacz thanks, you are right I'm closing this one if favour of these two

https://github.com/insightsengineering/teal.goshawk/issues/139

https://github.com/insightsengineering/coredev-tasks/issues/285