TL Catalog
  1. Tables
  2. Clinical Laboratory Evaluation
  3. TSFLAB07
  • Introduction

  • Index

  • Tables
    • Adverse Events
      • TSFAE01A
      • TSFAE01B
      • TSFAE02
      • TSFAE02A
      • TSFAE03
      • TSFAE03A
      • TSFAE04
      • TSFAE04A
      • TSFAE05
      • TSFAE05A
      • TSFAE06A
      • TSFAE06B
      • TSFAE07A
      • TSFAE07B
      • TSFAE08
      • TSFAE09
      • TSFAE10
      • TSFAE11
      • TSFAE12
      • TSFAE13
      • TSFAE14
      • TSFAE15
      • TSFAE16
      • TSFAE17A
      • TSFAE17B
      • TSFAE17C
      • TSFAE17D
      • TSFAE19A
      • TSFAE19B
      • TSFAE19C
      • TSFAE19D
      • TSFAE20A
      • TSFAE20B
      • TSFAE20C
      • TSFAE21A
      • TSFAE21B
      • TSFAE21C
      • TSFAE21D
      • TSFAE22A
      • TSFAE22B
      • TSFAE22C
      • TSFAE23A
      • TSFAE23B
      • TSFAE23C
      • TSFAE23D
      • TSFAE24A
      • TSFAE24B
      • TSFAE24C
      • TSFAE24D
      • TSFAE24F
      • TSFDTH01
    • Clinical Laboratory Evaluation
      • TSFLAB01
      • TSFLAB01A
      • TSFLAB02
      • TSFLAB02A
      • TSFLAB02B
      • TSFLAB03
      • TSFLAB03A
      • TSFLAB04A
      • TSFLAB04B
      • TSFLAB05
      • TSFLAB06
      • TSFLAB07
    • Demographic
      • TSIDEM01
      • TSIDEM02
      • TSIMH01
    • Disposition of Subjects
      • TSIDS01
      • TSIDS02
      • TSIDS02A
    • Electrocardiograms
      • TSFECG01
      • TSFECG01A
      • TSFECG02
      • TSFECG03
      • TSFECG04
      • TSFECG05
    • Exposure
      • TSIEX01
      • TSIEX02
      • TSIEX03
      • TSIEX04
      • TSIEX06
      • TSIEX07
      • TSIEX08
      • TSIEX09
      • TSIEX10
      • TSIEX11
    • Pharmacokinetics
      • TPK01A
      • TPK01B
      • TPK02
      • TPK03
    • Prior and Concomitant Therapies
      • TSICM01
      • TSICM02
      • TSICM03
      • TSICM04
      • TSICM05
      • TSICM06
      • TSICM07
      • TSICM08
    • Vital Signs and Physical Findings
      • TSFVIT01
      • TSFVIT01A
      • TSFVIT02
      • TSFVIT03
      • TSFVIT04
      • TSFVIT05
      • TSFVIT06
  • Listings
    • Adverse Events
      • LSFAE01
      • LSFAE02
      • LSFAE03
      • LSFAE04
      • LSFAE05
      • LSFAE06A
      • LSFAE06B
      • LSFDTH01
    • Clinical Laboratory Evaluation
      • LSFLAB01
    • Demographic
      • LSIDEM01
      • LSIDEM02
      • LSIMH01
    • Disposition of Subjects
      • LSIDS01
      • LSIDS02
      • LSIDS03
      • LSIDS04
      • LSIDS05
    • Electrocardiograms
      • LSFECG01
      • LSFECG02
    • Exposure
      • LSIEX01
      • LSIEX02
      • LSIEX03
    • Prior and Concomitant Therapies
      • LSICM01
    • Vital Signs and Physical Findings
      • LSFVIT01
      • LSFVIT02

  • Reproducibility

  • Changelog

On this page

  • Output
  • Edit this page
  • Report an issue
  1. Tables
  2. Clinical Laboratory Evaluation
  3. TSFLAB07

TSFLAB07

Shift in Laboratory Values From Baseline to Worst Grade During Time Period Based on NCI-CTCAE Criteria


Output

  • Preview
Code
# Program Name:              tsflab07

# Prep Environment

library(envsetup)
library(tern)
library(dplyr)
library(rtables)
library(junco)

# Define script level parameters:

tblid <- "TSFLAB07"
fileid <- tblid
titles <- get_titles_from_file(input_path = '../../_data/', tblid)
string_map <- default_str_map


ad_domain <- "ADLB"

popfl <- "SAFFL"
trtvar <- "TRT01A"
ctrl_grp <- "Placebo"

# Initial processing of data

adlb_complete <- pharmaverseadamjnj::adlb

# Process Data:

adsl <- pharmaverseadamjnj::adsl %>%
  filter(.data[[popfl]] == "Y") %>%
  select(STUDYID, USUBJID, all_of(c(popfl, trtvar)))

adsl <- adsl %>%
  mutate(
    colspan_trt = factor(
      ifelse(.data[[trtvar]] == ctrl_grp, " ", "Active Study Agent"),
      levels = c("Active Study Agent", " ")
    )
  )

## to ensure the same order as on other outputs
trt_order <- as.character((unique(
  adsl %>% select("colspan_trt", all_of(trtvar))
) %>%
  arrange(colspan_trt, .data[[trtvar]]))[[trtvar]])
adsl[[trtvar]] <- factor(as.character(adsl[[trtvar]]), levels = trt_order)


availparcat56 <- c(
  "Blood and lymphatic system disorders",
  "Investigations",
  "Metabolism and nutritional disorders",
  "Renal and urinary disorders"
)

flagvars <- c("ONTRTFL", "TRTEMFL", "LVOTFL", "ABLFL")
adlb00 <- adlb_complete %>%
  filter(!is.na(ATOXGR)) %>%
  filter(!is.na(BTOXGR)) %>%
  select(
    USUBJID,
    AVISITN,
    AVISIT,
    PARAMCD,
    PARAM,
    PARAMN,
    PARCAT1,
    PARCAT3,
    PARCAT5,
    PARCAT6,
    starts_with("ATOX"),
    starts_with("BTOX"),
    starts_with("ANL"),
    all_of(flagvars),
    LBSEQ,
    AVAL,
    AVALC
  ) %>%
  inner_join(adsl) %>%
  relocate(
    .,
    USUBJID,
    ANL04FL,
    ANL05FL,
    ONTRTFL,
    TRTEMFL,
    AVISIT,
    ATOXGRL,
    ATOXGRH,
    ATOXDSCL,
    ATOXDSCH,
    ABLFL,
    BTOXGRL,
    BTOXGRH,
    PARAMCD,
    PARCAT3,
    AVISIT,
    AVAL
  )


adlb00 <- var_relabel_list(adlb00, var_labels(adlb_complete, fill = T))

filtered_adlb <- adlb00

## similar to LAB03: separate low and high and then combine
## esp as for 2 tests PARCAT5/6 is not the same for low/high direction

filtered_adlb_low <- filtered_adlb %>%
  filter(!is.na(ATOXDSCL) & !is.na(ATOXGRL)) %>%
  mutate(
    ATOXDSCLH = ATOXDSCL,
    ATOXGRLH = ATOXGRL,
    BTOXGRLH = BTOXGRL,
    ATOXDIR = "LOW",
    ANL045FL = ANL04FL
  ) %>%
  select(-c(ATOXGRL, ATOXGRH, ATOXDSCL, ATOXDSCH, BTOXGRL, BTOXGRH))

### high grades: ATOXDSCH ATOXGRH ANL05FL
filtered_adlb_high <- filtered_adlb %>%
  filter(!is.na(ATOXDSCH) & !is.na(ATOXGRH)) %>%
  mutate(
    ATOXDSCLH = ATOXDSCH,
    ATOXGRLH = ATOXGRH,
    BTOXGRLH = BTOXGRH,
    ATOXDIR = "HIGH",
    ANL045FL = ANL05FL
  ) %>%
  select(-c(ATOXGRL, ATOXGRH, ATOXDSCL, ATOXDSCH, BTOXGRL, BTOXGRH))


## combine Low and high into adlb_tox
filtered_adlb_tox <-
  bind_rows(
    filtered_adlb_low,
    filtered_adlb_high
  ) %>%
  select(-c(ATOXGR, ATOXGRN)) %>%
  inner_join(adsl)


### correction of proper category (PARCAT56) for HGB (LOW) and WBC (HIGH)
filtered_adlb_tox <-
  filtered_adlb_tox %>%
  mutate(
    PARCAT56 = case_when(
      PARAMCD == "HGB" & ATOXDIR == "LOW" ~ PARCAT6,
      PARAMCD == "WBC" & ATOXDIR == "HIGH" ~ PARCAT6,
      TRUE ~ PARCAT5
    )
  ) %>%
  mutate(
    PARCAT56 = factor(
      PARCAT56,
      levels = unique(c(
        "Blood and lymphatic system disorders",
        levels(adlb_complete$PARCAT5)
      ))
    )
  )


### filter for timepoints (either per visit or worst over a time period (overall,period,phase,...))

## here: use worst overall: ANL04FL/ANL05FL --- ANL045FL
## if worst per period/phase:use ANL07/8 and ANL9/10 --- and ensure to create a combined version ANL078FL, ANL0910FL in the above code
filtered_adlb_tox <-
  filtered_adlb_tox %>%
  filter(ANL045FL == "Y")

## add the word Grade to ATOXGRLH,BTOXGRLH, For BTOXGRLH add an extra level (for display purpose)
filtered_adlb_tox <-
  filtered_adlb_tox %>%
  mutate(
    ATOXGRLH = factor(paste("Grade", ATOXGRLH), levels = paste("Grade", 0:4)),
    BTOXGRLH = factor(
      paste("Grade", BTOXGRLH),
      levels = c("N", paste("Grade", 0:4))
    )
  )

## trick for alt_counts_df to work with col splitting
# add BNRIND to adsl, all assign to extra level N (column will be used for N counts)
adsl <- adsl %>%
  mutate(BTOXGRLH = "N") %>%
  mutate(BTOXGRLH = factor(BTOXGRLH, levels = c("N", paste("Grade", 0:4))))

## add variable for column split header
filtered_adlb_tox$BTOXGRLH_header <- "Baseline Toxicity Grade"
adsl$BTOXGRLH_header <- "Baseline Toxicity Grade"

filtered_adlb_tox$BTOXGRLH_header2 <- " " ## first column N should not appear under Baseline column span
adsl$BTOXGRLH_header2 <- " " ## first column N should not appear under Baseline column span


### Alphabetical sorting of toxicity terms
atoxdsclh_levels <- sort(as.character(unique(filtered_adlb_tox$ATOXDSCLH)))

filtered_adlb_tox <- filtered_adlb_tox %>%
  mutate(ATOXDSCLH = factor(as.character(ATOXDSCLH), levels = atoxdsclh_levels))


check_categories <- unique(
  filtered_adlb_tox %>% select(PARCAT3, PARCAT56, ATOXDSCLH)
) %>%
  arrange(PARCAT3, PARCAT56, ATOXDSCLH)

# Define layout and build table:

lyt <- basic_table(show_colcounts = FALSE) %>%
  ## to ensure N column is not under the Baseline column span header
  split_cols_by("BTOXGRLH_header2") %>%
  split_cols_by("BTOXGRLH", split_fun = keep_split_levels("N")) %>%
  split_cols_by("BTOXGRLH_header", nested = FALSE) %>%
  split_cols_by(
    "BTOXGRLH",
    split_fun = make_split_fun(
      pre = list(rm_levels(excl = "N")),
      post = list(add_overall_facet("TOTAL", "Total"))
    )
  ) %>%
  #### replace split_rows and summarize by single analyze call
  ### a_freq_j only works due to
  ### special arguments can do the trick : denomf = adslx & .stats = count_unique
  ### we want counts of treatment group coming from adsl, not from input dataset, therefor, countsource = altdf
  analyze(
    vars = trtvar,
    afun = a_freq_j,
    extra_args = list(
      restr_columns = "N",
      .stats = "count_unique",
      countsource = "altdf",
      extrablankline = TRUE
    ),
    indent_mod = -1L
  ) %>%
  ## main part of table, restart row-split so nested = FALSE

  split_rows_by(
    "PARCAT56",
    nested = FALSE,
    label_pos = "topleft",
    child_labels = "visible",
    split_label = "NCI-CTCAE Category",
    split_fun = drop_split_levels,
    section_div = " "
  ) %>%
  split_rows_by(
    "ATOXDSCLH",
    label_pos = "topleft",
    child_labels = "visible",
    split_label = "Laboratory Test",
    split_fun = drop_split_levels,
    section_div = " "
  ) %>%
  split_rows_by(
    trtvar,
    label_pos = "hidden",
    split_label = "Treatment Group",
    section_div = " "
  ) %>%
  ### a_freq_j
  ### the special statistic "n_rowdf" option does the trick here of getting the proper value for the N column
  summarize_row_groups(
    trtvar,
    cfun = a_freq_j,
    extra_args = list(
      .stats = "n_rowdf",
      restr_columns = c("N")
    ),
  ) %>%
  ## add extra level TOTAL using new_levels, rather than earlier technique
  ## advantage for denominator derivation -- n_rowdf can be used, if we'd like to present fraction as well
  ## switch .stats to count_unique_denom_fraction or count_unique_fraction
  analyze(
    "ATOXGRLH",
    var_labels = "Worst toxicity grade, n",
    show_labels = "visible",
    indent_mod = 1L,
    afun = a_freq_j,
    extra_args = list(
      .stats = "count_unique",
      denom = "n_rowdf",
      new_levels = list(
        c("Total"),
        list(c("Grade 0", "Grade 1", "Grade 2", "Grade 3", "Grade 4"))
      ),
      new_levels_after = TRUE,
      .indent_mods = 1L,
      restr_columns = c(
        c("GRADE 0", "GRADE 1", "GRADE 2", "GRADE 3", "GRADE 4", "TOTAL")
      )
    )
  )


if (nrow(filtered_adlb_tox) > 0) {
  result <- build_table(lyt, filtered_adlb_tox, alt_counts_df = adsl)
} else {
  result <- NULL
}

# Set title

result <- set_titles(result, titles)

# Convert to tbl file and output table

tt_to_tlgrtf(string_map = string_map, tt = result, file = fileid, orientation = "landscape")

TSFLAB07: Shift in Laboratory Values From Baseline to Worst Grade [During Time Period] Based on NCI-CTCAE Criteria; Safety Analysis Set (Study jjcs - core)

NCI-CTCAE Category

Baseline Toxicity Grade

Laboratory Test

N

Grade 0

Grade 1

Grade 2

Grade 3

Grade 4

Total

Xanomeline High Dose

53

Xanomeline Low Dose

73

Placebo

59

Blood and lymphatic system
 disorders

Leukocytosis

Xanomeline High Dose

53

Worst toxicity grade, n

Grade 0

53

0

0

0

0

53

Grade 1

0

0

0

0

0

0

Grade 2

0

0

0

0

0

0

Grade 3

0

0

0

0

0

0

Grade 4

0

0

0

0

0

0

Total

53

0

0

0

0

53

Xanomeline Low Dose

73

Worst toxicity grade, n

Grade 0

73

0

0

0

0

73

Grade 1

0

0

0

0

0

0

Grade 2

0

0

0

0

0

0

Grade 3

0

0

0

0

0

0

Grade 4

0

0

0

0

0

0

Total

73

0

0

0

0

73

Placebo

59

Worst toxicity grade, n

Grade 0

59

0

0

0

0

59

Grade 1

0

0

0

0

0

0

Grade 2

0

0

0

0

0

0

Grade 3

0

0

0

0

0

0

Grade 4

0

0

0

0

0

0

Total

59

0

0

0

0

59

Investigations

Alanine aminotransferase
 increased

Xanomeline High Dose

53

Worst toxicity grade, n

Grade 0

49

4

0

0

0

53

Grade 1

5

4

0

0

0

9

Grade 2

1

0

0

0

0

1

Grade 3

0

0

0

0

0

0

Grade 4

0

0

0

0

0

0

Total

49

4

0

0

0

53

Xanomeline Low Dose

73

Worst toxicity grade, n

Grade 0

70

1

0

0

0

71

Grade 1

7

3

0

0

0

10

Grade 2

0

0

0

0

0

0

Grade 3

0

0

0

0

0

0

Grade 4

0

0

0

0

0

0

Total

70

3

0

0

0

73

Placebo

59

Worst toxicity grade, n

Grade 0

57

2

0

0

0

59

Grade 1

0

2

0

0

0

2

Grade 2

1

0

0

0

0

1

Grade 3

0

0

0

0

0

0

Grade 4

0

0

0

0

0

0

Total

57

2

0

0

0

59

Alkaline phosphatase
 increased

Xanomeline High Dose

53

Worst toxicity grade, n

Grade 0

53

0

0

0

0

53

Grade 1

4

0

0

0

0

4

Grade 2

0

0

0

0

0

0

Grade 3

0

0

0

0

0

0

Grade 4

0

0

0

0

0

0

Total

53

0

0

0

0

53

Xanomeline Low Dose

73

Worst toxicity grade, n

Grade 0

70

1

0

0

0

71

Grade 1

3

3

0

0

0

6

Grade 2

0

0

0

0

0

0

Grade 3

0

0

0

0

0

0

Grade 4

0

0

0

0

0

0

Total

70

3

0

0

0

73

Placebo

59

Worst toxicity grade, n

Grade 0

59

0

0

0

0

59

Grade 1

4

0

0

0

0

4

Grade 2

1

0

0

0

0

1

Grade 3

1

0

0

0

0

1

Grade 4

0

0

0

0

0

0

Total

59

0

0

0

0

59

Aspartate aminotransferase
 increased

Xanomeline High Dose

53

Worst toxicity grade, n

Grade 0

50

3

0

0

0

53

Grade 1

4

3

0

0

0

7

Grade 2

1

0

0

0

0

1

Grade 3

0

0

0

0

0

0

Grade 4

0

0

0

0

0

0

Total

50

3

0

0

0

53

Xanomeline Low Dose

73

Worst toxicity grade, n

Grade 0

66

4

0

0

0

70

Grade 1

6

7

0

0

0

13

Grade 2

0

1

0

0

0

1

Grade 3

0

0

0

0

0

0

Grade 4

0

0

0

0

0

0

Total

66

7

0

0

0

73

Placebo

59

Worst toxicity grade, n

Grade 0

57

2

0

0

0

59

Grade 1

4

2

0

0

0

6

Grade 2

1

0

0

0

0

1

Grade 3

0

0

0

0

0

0

Grade 4

0

0

0

0

0

0

Total

57

2

0

0

0

59

Blood bilirubin increased

Xanomeline High Dose

53

Worst toxicity grade, n

Grade 0

51

1

1

0

0

53

Grade 1

1

1

1

0

0

3

Grade 2

0

1

1

0

0

2

Grade 3

0

0

0

0

0

0

Grade 4

0

0

0

0

0

0

Total

51

1

1

0

0

53

Xanomeline Low Dose

73

Worst toxicity grade, n

Grade 0

70

3

0

0

0

73

Grade 1

1

3

0

0

0

4

Grade 2

0

1

0

0

0

1

Grade 3

0

0

0

0

0

0

Grade 4

0

0

0

0

0

0

Total

70

3

0

0

0

73

Placebo

59

Worst toxicity grade, n

Grade 0

59

0

0

0

0

59

Grade 1

3

0

0

0

0

3

Grade 2

0

0

0

0

0

0

Grade 3

0

0

0

0

0

0

Grade 4

0

0

0

0

0

0

Total

59

0

0

0

0

59

Cholesterol high

Xanomeline High Dose

53

Worst toxicity grade, n

Grade 0

51

0

2

0

0

53

Grade 1

3

0

0

0

0

3

Grade 2

0

0

2

0

0

2

Grade 3

0

0

0

0

0

0

Grade 4

0

0

0

0

0

0

Total

51

0

2

0

0

53

Xanomeline Low Dose

73

Worst toxicity grade, n

Grade 0

73

0

0

0

0

73

Grade 1

1

0

0

0

0

1

Grade 2

2

0

0

0

0

2

Grade 3

0

0

0

0

0

0

Grade 4

0

0

0

0

0

0

Total

73

0

0

0

0

73

Placebo

59

Worst toxicity grade, n

Grade 0

57

0

1

0

0

58

Grade 1

1

0

0

0

0

1

Grade 2

1

0

2

0

0

3

Grade 3

0

0

0

0

0

0

Grade 4

0

0

0

0

0

0

Total

57

0

2

0

0

59

Creatinine increased

Xanomeline High Dose

53

Worst toxicity grade, n

Grade 0

49

1

0

0

0

50

Grade 1

42

4

0

0

0

46

Grade 2

0

0

0

0

0

0

Grade 3

0

0

0

0

0

0

Grade 4

0

0

0

0

0

0

Total

49

4

0

0

0

53

Xanomeline Low Dose

73

Worst toxicity grade, n

Grade 0

68

2

0

0

0

70

Grade 1

41

5

0

0

0

46

Grade 2

0

0

0

0

0

0

Grade 3

0

0

0

0

0

0

Grade 4

0

0

0

0

0

0

Total

68

5

0

0

0

73

Placebo

59

Worst toxicity grade, n

Grade 0

58

1

0

0

0

59

Grade 1

40

1

0

0

0

41

Grade 2

0

0

0

0

0

0

Grade 3

0

0

0

0

0

0

Grade 4

0

0

0

0

0

0

Total

58

1

0

0

0

59

Platelet count decreased

Xanomeline High Dose

53

Worst toxicity grade, n

Grade 0

52

1

0

0

0

53

Grade 1

43

1

0

0

0

44

Grade 2

38

0

0

0

0

38

Grade 3

10

0

0

0

0

10

Grade 4

3

0

0

0

0

3

Total

52

1

0

0

0

53

Xanomeline Low Dose

72

Worst toxicity grade, n

Grade 0

67

2

0

0

0

69

Grade 1

48

1

0

0

0

49

Grade 2

35

1

0

0

0

36

Grade 3

25

0

0

0

0

25

Grade 4

1

0

0

0

0

1

Total

70

2

0

0

0

72

Placebo

59

Worst toxicity grade, n

Grade 0

59

0

0

0

0

59

Grade 1

52

0

0

0

0

52

Grade 2

37

0

0

0

0

37

Grade 3

22

0

0

0

0

22

Grade 4

1

0

0

0

0

1

Total

59

0

0

0

0

59

White blood cell decreased

Xanomeline High Dose

53

Worst toxicity grade, n

Grade 0

53

0

0

0

0

53

Grade 1

45

0

0

0

0

45

Grade 2

33

0

0

0

0

33

Grade 3

18

0

0

0

0

18

Grade 4

1

0

0

0

0

1

Total

53

0

0

0

0

53

Xanomeline Low Dose

73

Worst toxicity grade, n

Grade 0

67

3

0

0

0

70

Grade 1

50

3

0

0

0

53

Grade 2

32

1

0

0

0

33

Grade 3

21

0

0

0

0

21

Grade 4

1

0

0

0

0

1

Total

70

3

0

0

0

73

Placebo

59

Worst toxicity grade, n

Grade 0

59

0

0

0

0

59

Grade 1

52

0

0

0

0

52

Grade 2

42

0

0

0

0

42

Grade 3

21

0

0

0

0

21

Grade 4

4

0

0

0

0

4

Total

59

0

0

0

0

59

Metabolism and nutritional
 disorders

CD4 lymphocytes decreased

Xanomeline High Dose

51

Worst toxicity grade, n

Grade 0

51

0

0

0

0

51

Grade 1

47

0

0

0

0

47

Grade 2

28

0

0

0

0

28

Grade 3

15

0

0

0

0

15

Grade 4

6

0

0

0

0

6

Total

51

0

0

0

0

51

Xanomeline Low Dose

72

Worst toxicity grade, n

Grade 0

66

2

0

0

0

68

Grade 1

46

1

0

0

0

47

Grade 2

37

0

0

0

0

37

Grade 3

18

0

0

0

0

18

Grade 4

3

1

0

0

0

4

Total

70

2

0

0

0

72

Placebo

57

Worst toxicity grade, n

Grade 0

56

1

0

0

0

57

Grade 1

48

1

0

0

0

49

Grade 2

43

1

0

0

0

44

Grade 3

27

0

0

0

0

27

Grade 4

3

0

0

0

0

3

Total

56

1

0

0

0

57

Hyperglycemia

Xanomeline High Dose

53

Worst toxicity grade, n

Grade 0

53

0

0

0

0

53

Grade 1

0

0

0

0

0

0

Grade 2

0

0

0

0

0

0

Grade 3

6

0

0

0

0

6

Grade 4

0

0

0

0

0

0

Total

53

0

0

0

0

53

Xanomeline Low Dose

73

Worst toxicity grade, n

Grade 0

73

0

0

0

0

73

Grade 1

0

0

0

0

0

0

Grade 2

0

0

0

0

0

0

Grade 3

1

0

0

0

0

1

Grade 4

0

0

0

0

0

0

Total

73

0

0

0

0

73

Placebo

59

Worst toxicity grade, n

Grade 0

59

0

0

0

0

59

Grade 1

0

0

0

0

0

0

Grade 2

0

0

0

0

0

0

Grade 3

1

0

0

0

0

1

Grade 4

0

0

0

0

0

0

Total

59

0

0

0

0

59

Hyperkalemia

Xanomeline High Dose

53

Worst toxicity grade, n

Grade 0

53

0

0

0

0

53

Grade 1

1

0

0

0

0

1

Grade 2

1

0

0

0

0

1

Grade 3

0

0

0

0

0

0

Grade 4

0

0

0

0

0

0

Total

53

0

0

0

0

53

Xanomeline Low Dose

73

Worst toxicity grade, n

Grade 0

73

0

0

0

0

73

Grade 1

0

0

0

0

0

0

Grade 2

0

0

0

0

0

0

Grade 3

0

0

0

0

0

0

Grade 4

0

0

0

0

0

0

Total

73

0

0

0

0

73

Placebo

59

Worst toxicity grade, n

Grade 0

58

0

1

0

0

59

Grade 1

0

0

1

0

0

1

Grade 2

0

0

1

0

0

1

Grade 3

0

0

0

0

0

0

Grade 4

0

0

0

0

0

0

Total

58

0

1

0

0

59

Hypernatremia

Xanomeline High Dose

53

Worst toxicity grade, n

Grade 0

51

2

0

0

0

53

Grade 1

5

2

0

0

0

7

Grade 2

2

0

0

0

0

2

Grade 3

0

0

0

0

0

0

Grade 4

0

0

0

0

0

0

Total

51

2

0

0

0

53

Xanomeline Low Dose

73

Worst toxicity grade, n

Grade 0

73

0

0

0

0

73

Grade 1

6

0

0

0

0

6

Grade 2

0

0

0

0

0

0

Grade 3

0

0

0

0

0

0

Grade 4

0

0

0

0

0

0

Total

73

0

0

0

0

73

Placebo

59

Worst toxicity grade, n

Grade 0

56

3

0

0

0

59

Grade 1

7

3

0

0

0

10

Grade 2

0

0

0

0

0

0

Grade 3

0

0

0

0

0

0

Grade 4

0

0

0

0

0

0

Total

56

3

0

0

0

59

Hypoalbuminemia

Xanomeline High Dose

53

Worst toxicity grade, n

Grade 0

53

0

0

0

0

53

Grade 1

48

0

0

0

0

48

Grade 2

34

0

0

0

0

34

Grade 3

23

0

0

0

0

23

Grade 4

2

0

0

0

0

2

Total

53

0

0

0

0

53

Xanomeline Low Dose

73

Worst toxicity grade, n

Grade 0

69

2

0

0

0

71

Grade 1

50

2

0

0

0

52

Grade 2

41

0

0

0

0

41

Grade 3

19

0

0

0

0

19

Grade 4

2

0

0

0

0

2

Total

71

2

0

0

0

73

Placebo

59

Worst toxicity grade, n

Grade 0

59

0

0

0

0

59

Grade 1

49

0

0

0

0

49

Grade 2

40

0

0

0

0

40

Grade 3

21

0

0

0

0

21

Grade 4

3

0

0

0

0

3

Total

59

0

0

0

0

59

Hypoglycemia

Xanomeline High Dose

53

Worst toxicity grade, n

Grade 0

53

0

0

0

0

53

Grade 1

41

0

0

0

0

41

Grade 2

38

0

0

0

0

38

Grade 3

21

0

0

0

0

21

Grade 4

5

0

0

0

0

5

Total

53

0

0

0

0

53

Xanomeline Low Dose

73

Worst toxicity grade, n

Grade 0

69

0

1

0

0

70

Grade 1

50

0

0

0

0

50

Grade 2

35

0

0

0

0

35

Grade 3

25

0

0

0

0

25

Grade 4

2

0

0

0

0

2

Total

71

0

1

0

0

72

Placebo

59

Worst toxicity grade, n

Grade 0

58

0

0

0

0

58

Grade 1

55

0

0

0

0

55

Grade 2

37

0

0

0

0

37

Grade 3

23

0

0

0

0

23

Grade 4

3

0

0

0

0

3

Total

59

0

0

0

0

59

Hypokalemia

Xanomeline High Dose

53

Worst toxicity grade, n

Grade 0

53

0

0

0

0

53

Grade 1

45

0

0

0

0

45

Grade 2

38

0

0

0

0

38

Grade 3

25

0

0

0

0

25

Grade 4

5

0

0

0

0

5

Total

53

0

0

0

0

53

Xanomeline Low Dose

73

Worst toxicity grade, n

Grade 0

71

0

0

0

0

71

Grade 1

49

0

0

0

0

49

Grade 2

38

0

0

0

0

38

Grade 3

23

0

0

0

0

23

Grade 4

6

0

0

0

0

6

Total

73

0

0

0

0

73

Placebo

59

Worst toxicity grade, n

Grade 0

57

0

0

0

0

57

Grade 1

51

0

0

0

0

51

Grade 2

38

0

0

0

0

38

Grade 3

28

0

0

0

0

28

Grade 4

4

0

0

0

0

4

Total

59

0

0

0

0

59

Hyponatremia

Xanomeline High Dose

53

Worst toxicity grade, n

Grade 0

53

0

0

0

0

53

Grade 1

47

0

0

0

0

47

Grade 2

36

0

0

0

0

36

Grade 3

21

0

0

0

0

21

Grade 4

5

0

0

0

0

5

Total

53

0

0

0

0

53

Xanomeline Low Dose

73

Worst toxicity grade, n

Grade 0

64

2

0

0

0

66

Grade 1

52

1

0

0

0

53

Grade 2

36

1

0

0

0

37

Grade 3

28

0

0

0

0

28

Grade 4

1

0

0

0

0

1

Total

71

2

0

0

0

73

Placebo

59

Worst toxicity grade, n

Grade 0

58

1

0

0

0

59

Grade 1

50

1

0

0

0

51

Grade 2

39

1

0

0

0

40

Grade 3

25

0

0

0

0

25

Grade 4

0

0

0

0

0

0

Total

58

1

0

0

0

59

Note: N is the number of subjects with non-missing values for the specific lab test at baseline and at least 1 postbaseline visit within the time period.

Note: NCI-CTCAE grades (version 5.0.) are based on the laboratory result and do not take into account the clinical component, if applicable.

Download RTF file

TSFLAB06
TSIDEM01
Source Code
---
title: TSFLAB07
subtitle: Shift in Laboratory Values From Baseline to Worst Grade During Time Period Based on NCI-CTCAE Criteria
---

------------------------------------------------------------------------

{{< include ../../_utils/envir_hook.qmd >}}

```{r setup, echo = FALSE, warning = FALSE, message = FALSE}
options(docx.add_datetime = FALSE, tidytlg.add_datetime = FALSE)
envsetup_config_name <- "default"

# Path to the combined config file
envsetup_file_path <- file.path("../..", "envsetup.yml")

Sys.setenv(ENVSETUP_ENVIRON = '')
library(envsetup)
loaded_config <- config::get(config = envsetup_config_name, file = envsetup_file_path)
envsetup::rprofile(loaded_config)


dpscomp <- compound
dpspdr <- paste(protocol,dbrelease,rpteff,sep="__")

aptcomp <- compound
aptpdr <- paste(protocol,dbrelease,rpteff,sep="__")

###### Study specific updates (formerly in envre)

dpscomp <- "standards"
dpspdr <- "jjcs__NULL__jjcs - core"

apt <- FALSE
library(junco)
default_str_map <- rbind(default_str_map, c("&ctcae", "5.0"))

```

## Output

:::: panel-tabset
## {{< fa regular file-lines sm fw >}} Preview

```{r variant1, results='hide', warning = FALSE, message = FALSE}

# Program Name:              tsflab07

# Prep Environment

library(envsetup)
library(tern)
library(dplyr)
library(rtables)
library(junco)

# Define script level parameters:

tblid <- "TSFLAB07"
fileid <- tblid
titles <- get_titles_from_file(input_path = '../../_data/', tblid)
string_map <- default_str_map


ad_domain <- "ADLB"

popfl <- "SAFFL"
trtvar <- "TRT01A"
ctrl_grp <- "Placebo"

# Initial processing of data

adlb_complete <- pharmaverseadamjnj::adlb

# Process Data:

adsl <- pharmaverseadamjnj::adsl %>%
  filter(.data[[popfl]] == "Y") %>%
  select(STUDYID, USUBJID, all_of(c(popfl, trtvar)))

adsl <- adsl %>%
  mutate(
    colspan_trt = factor(
      ifelse(.data[[trtvar]] == ctrl_grp, " ", "Active Study Agent"),
      levels = c("Active Study Agent", " ")
    )
  )

## to ensure the same order as on other outputs
trt_order <- as.character((unique(
  adsl %>% select("colspan_trt", all_of(trtvar))
) %>%
  arrange(colspan_trt, .data[[trtvar]]))[[trtvar]])
adsl[[trtvar]] <- factor(as.character(adsl[[trtvar]]), levels = trt_order)


availparcat56 <- c(
  "Blood and lymphatic system disorders",
  "Investigations",
  "Metabolism and nutritional disorders",
  "Renal and urinary disorders"
)

flagvars <- c("ONTRTFL", "TRTEMFL", "LVOTFL", "ABLFL")
adlb00 <- adlb_complete %>%
  filter(!is.na(ATOXGR)) %>%
  filter(!is.na(BTOXGR)) %>%
  select(
    USUBJID,
    AVISITN,
    AVISIT,
    PARAMCD,
    PARAM,
    PARAMN,
    PARCAT1,
    PARCAT3,
    PARCAT5,
    PARCAT6,
    starts_with("ATOX"),
    starts_with("BTOX"),
    starts_with("ANL"),
    all_of(flagvars),
    LBSEQ,
    AVAL,
    AVALC
  ) %>%
  inner_join(adsl) %>%
  relocate(
    .,
    USUBJID,
    ANL04FL,
    ANL05FL,
    ONTRTFL,
    TRTEMFL,
    AVISIT,
    ATOXGRL,
    ATOXGRH,
    ATOXDSCL,
    ATOXDSCH,
    ABLFL,
    BTOXGRL,
    BTOXGRH,
    PARAMCD,
    PARCAT3,
    AVISIT,
    AVAL
  )


adlb00 <- var_relabel_list(adlb00, var_labels(adlb_complete, fill = T))

filtered_adlb <- adlb00

## similar to LAB03: separate low and high and then combine
## esp as for 2 tests PARCAT5/6 is not the same for low/high direction

filtered_adlb_low <- filtered_adlb %>%
  filter(!is.na(ATOXDSCL) & !is.na(ATOXGRL)) %>%
  mutate(
    ATOXDSCLH = ATOXDSCL,
    ATOXGRLH = ATOXGRL,
    BTOXGRLH = BTOXGRL,
    ATOXDIR = "LOW",
    ANL045FL = ANL04FL
  ) %>%
  select(-c(ATOXGRL, ATOXGRH, ATOXDSCL, ATOXDSCH, BTOXGRL, BTOXGRH))

### high grades: ATOXDSCH ATOXGRH ANL05FL
filtered_adlb_high <- filtered_adlb %>%
  filter(!is.na(ATOXDSCH) & !is.na(ATOXGRH)) %>%
  mutate(
    ATOXDSCLH = ATOXDSCH,
    ATOXGRLH = ATOXGRH,
    BTOXGRLH = BTOXGRH,
    ATOXDIR = "HIGH",
    ANL045FL = ANL05FL
  ) %>%
  select(-c(ATOXGRL, ATOXGRH, ATOXDSCL, ATOXDSCH, BTOXGRL, BTOXGRH))


## combine Low and high into adlb_tox
filtered_adlb_tox <-
  bind_rows(
    filtered_adlb_low,
    filtered_adlb_high
  ) %>%
  select(-c(ATOXGR, ATOXGRN)) %>%
  inner_join(adsl)


### correction of proper category (PARCAT56) for HGB (LOW) and WBC (HIGH)
filtered_adlb_tox <-
  filtered_adlb_tox %>%
  mutate(
    PARCAT56 = case_when(
      PARAMCD == "HGB" & ATOXDIR == "LOW" ~ PARCAT6,
      PARAMCD == "WBC" & ATOXDIR == "HIGH" ~ PARCAT6,
      TRUE ~ PARCAT5
    )
  ) %>%
  mutate(
    PARCAT56 = factor(
      PARCAT56,
      levels = unique(c(
        "Blood and lymphatic system disorders",
        levels(adlb_complete$PARCAT5)
      ))
    )
  )


### filter for timepoints (either per visit or worst over a time period (overall,period,phase,...))

## here: use worst overall: ANL04FL/ANL05FL --- ANL045FL
## if worst per period/phase:use ANL07/8 and ANL9/10 --- and ensure to create a combined version ANL078FL, ANL0910FL in the above code
filtered_adlb_tox <-
  filtered_adlb_tox %>%
  filter(ANL045FL == "Y")

## add the word Grade to ATOXGRLH,BTOXGRLH, For BTOXGRLH add an extra level (for display purpose)
filtered_adlb_tox <-
  filtered_adlb_tox %>%
  mutate(
    ATOXGRLH = factor(paste("Grade", ATOXGRLH), levels = paste("Grade", 0:4)),
    BTOXGRLH = factor(
      paste("Grade", BTOXGRLH),
      levels = c("N", paste("Grade", 0:4))
    )
  )

## trick for alt_counts_df to work with col splitting
# add BNRIND to adsl, all assign to extra level N (column will be used for N counts)
adsl <- adsl %>%
  mutate(BTOXGRLH = "N") %>%
  mutate(BTOXGRLH = factor(BTOXGRLH, levels = c("N", paste("Grade", 0:4))))

## add variable for column split header
filtered_adlb_tox$BTOXGRLH_header <- "Baseline Toxicity Grade"
adsl$BTOXGRLH_header <- "Baseline Toxicity Grade"

filtered_adlb_tox$BTOXGRLH_header2 <- " " ## first column N should not appear under Baseline column span
adsl$BTOXGRLH_header2 <- " " ## first column N should not appear under Baseline column span


### Alphabetical sorting of toxicity terms
atoxdsclh_levels <- sort(as.character(unique(filtered_adlb_tox$ATOXDSCLH)))

filtered_adlb_tox <- filtered_adlb_tox %>%
  mutate(ATOXDSCLH = factor(as.character(ATOXDSCLH), levels = atoxdsclh_levels))


check_categories <- unique(
  filtered_adlb_tox %>% select(PARCAT3, PARCAT56, ATOXDSCLH)
) %>%
  arrange(PARCAT3, PARCAT56, ATOXDSCLH)

# Define layout and build table:

lyt <- basic_table(show_colcounts = FALSE) %>%
  ## to ensure N column is not under the Baseline column span header
  split_cols_by("BTOXGRLH_header2") %>%
  split_cols_by("BTOXGRLH", split_fun = keep_split_levels("N")) %>%
  split_cols_by("BTOXGRLH_header", nested = FALSE) %>%
  split_cols_by(
    "BTOXGRLH",
    split_fun = make_split_fun(
      pre = list(rm_levels(excl = "N")),
      post = list(add_overall_facet("TOTAL", "Total"))
    )
  ) %>%
  #### replace split_rows and summarize by single analyze call
  ### a_freq_j only works due to
  ### special arguments can do the trick : denomf = adslx & .stats = count_unique
  ### we want counts of treatment group coming from adsl, not from input dataset, therefor, countsource = altdf
  analyze(
    vars = trtvar,
    afun = a_freq_j,
    extra_args = list(
      restr_columns = "N",
      .stats = "count_unique",
      countsource = "altdf",
      extrablankline = TRUE
    ),
    indent_mod = -1L
  ) %>%
  ## main part of table, restart row-split so nested = FALSE

  split_rows_by(
    "PARCAT56",
    nested = FALSE,
    label_pos = "topleft",
    child_labels = "visible",
    split_label = "NCI-CTCAE Category",
    split_fun = drop_split_levels,
    section_div = " "
  ) %>%
  split_rows_by(
    "ATOXDSCLH",
    label_pos = "topleft",
    child_labels = "visible",
    split_label = "Laboratory Test",
    split_fun = drop_split_levels,
    section_div = " "
  ) %>%
  split_rows_by(
    trtvar,
    label_pos = "hidden",
    split_label = "Treatment Group",
    section_div = " "
  ) %>%
  ### a_freq_j
  ### the special statistic "n_rowdf" option does the trick here of getting the proper value for the N column
  summarize_row_groups(
    trtvar,
    cfun = a_freq_j,
    extra_args = list(
      .stats = "n_rowdf",
      restr_columns = c("N")
    ),
  ) %>%
  ## add extra level TOTAL using new_levels, rather than earlier technique
  ## advantage for denominator derivation -- n_rowdf can be used, if we'd like to present fraction as well
  ## switch .stats to count_unique_denom_fraction or count_unique_fraction
  analyze(
    "ATOXGRLH",
    var_labels = "Worst toxicity grade, n",
    show_labels = "visible",
    indent_mod = 1L,
    afun = a_freq_j,
    extra_args = list(
      .stats = "count_unique",
      denom = "n_rowdf",
      new_levels = list(
        c("Total"),
        list(c("Grade 0", "Grade 1", "Grade 2", "Grade 3", "Grade 4"))
      ),
      new_levels_after = TRUE,
      .indent_mods = 1L,
      restr_columns = c(
        c("GRADE 0", "GRADE 1", "GRADE 2", "GRADE 3", "GRADE 4", "TOTAL")
      )
    )
  )


if (nrow(filtered_adlb_tox) > 0) {
  result <- build_table(lyt, filtered_adlb_tox, alt_counts_df = adsl)
} else {
  result <- NULL
}

# Set title

result <- set_titles(result, titles)

# Convert to tbl file and output table

tt_to_tlgrtf(string_map = string_map, tt = result, file = fileid, orientation = "landscape")
```
```{r result1, echo=FALSE, message=FALSE, warning=FALSE, test = list(result_v1 = "result")}
tt_to_flextable_j(result, tblid, string_map = string_map) 
```

[Download RTF file](`r paste0(tolower(tblid), '.rtf')`)
::::

Made with ❤️ by the J&J Team

  • Edit this page
  • Report an issue
Cookie Preferences