# Program Name: tsfvit03# Prep Environmentlibrary(envsetup)library(tern)library(dplyr)library(rtables)library(junco)# Define script level parameters:tblid <-"TSFVIT03"fileid <- tblidtitles <-get_titles_from_file(input_path ='../../_data/', tblid)string_map <- default_str_mappopfl <-"SAFFL"trtvar <-"TRT01A"ctrl_grp <-"Placebo"selparamcd <-c("SYSBP", "DIABP")### tsfvit02# selparamcd <- c("SYSBP")### tsfvit03 : no code updates neededselparamcd <-c("DIABP")### as in dataset, order is important for later processing### not automated, hard coded approach for ease of reading### ideally the datasets already contain the appropriate case, to ensure units are in proper casesel_param <-c("Diastolic Blood Pressure (mmHg)")sel_param_case <-c("Diastolic blood pressure (mmHg)")# Process Data:adsl <- pharmaverseadamjnj::adsl %>%filter(.data[[popfl]] =="Y") %>%select( USUBJID,all_of(c(popfl, trtvar)), SEX_DECODE, AGEGR1, RACE_DECODE, ETHNIC_DECODE )adsl$colspan_trt <-factor(ifelse(adsl[[trtvar]] == ctrl_grp, " ", "Active Study Agent"),levels =c("Active Study Agent", " "))adsl$rrisk_header <-"Risk Difference (%) (95% CI)"adsl$rrisk_label <-paste(adsl[[trtvar]], paste("vs", ctrl_grp))colspan_trt_map <-create_colspan_map( adsl,non_active_grp = ctrl_grp,non_active_grp_span_lbl =" ",active_grp_span_lbl ="Active Study Agent",colspan_var ="colspan_trt",trt_var = trtvar)ref_path <-c("colspan_trt", " ", trtvar, ctrl_grp)### note: by filter ANL06FL, this table is restricted to On-treatment values, per definition of ANL06FL### therefor, no need to add ONTRTFL in filter### if derivation of ANL06FL is not restricted to ONTRTFL records, adding ONTRTFL here will not give the correct answer either### as mixing worst with other period is not giving the proper selection !!!filtered_advs <- pharmaverseadamjnj::advs %>%filter(PARAMCD %in% selparamcd) %>%filter(ANL06FL =="Y") %>%select( STUDYID, USUBJID, PARAMCD, PARAM, AVALCAT1, AVALCA1N, AVISIT, ANL06FL, APOBLFL, ONTRTFL ) %>%inner_join(adsl)filtered_advs$PARAM <-factor(as.character(filtered_advs$PARAM),levels = sel_param,labels = sel_param_case)# Process markedly abnormal values from spreadsheet:### Markedly Abnormal spreadsheetmarkedlyabnormal_file <-file.path('../../_data', "markedlyabnormal.xlsx")markedlyabnormal_sheets <- readxl::excel_sheets(markedlyabnormal_file)lbmarkedlyabnormal_defs <- readxl::read_excel( markedlyabnormal_file,sheet ="ADVS") %>%filter(PARAMCD !="Parameter Code") %>%arrange(PARAMCD, VARNAME, ORDER) %>%filter(VARNAME =="AVALCAT1") %>%filter(PARAMCD %in% selparamcd) %>%left_join(., unique(filtered_advs %>%select(PARAMCD, PARAM)))# code_decode <- getcodelistinfo(df=filtered_advs,# domain="advs",# vars = c("AVALCAT1"),# APT= apt,# adam_meta_loc=am_in,# sdtm_meta_loc=dm_in)### code_decode <- code_decode %>%# filter(PARAMCD %in% selparamcd) %>%# left_join(.,unique(filtered_advs %>% select(PARAMCD,PARAM)))### create a mapping table for usage in split_fun trim_levels_to_map,### to ensure only the levels appropriate for the selected parameters are coveredparam_map <- lbmarkedlyabnormal_defs %>%rename(AVALCAT1 = CRIT) %>%### no factors are allowed in this split_fun map definitionmutate(PARAM =as.character(PARAM)) %>%select(PARAM, AVALCAT1)# if no code list was defined, not all defined categories might be present on data# sas2rds conversion might not have added all categories as factor levels - need to do this hereif (class(filtered_advs$AVALCAT1) =="character"||!all(unique(param_map$AVALCAT1) %in%levels(filtered_advs$AVALCAT1))) { filtered_advs$AVALCAT1 <-factor(as.character(filtered_advs$AVALCAT1),levels =unique(param_map$AVALCAT1) )}# filtered_advs$PARAM <- droplevels(filtered_advs$PARAM)filtered_advs <-var_relabel(filtered_advs, PARAM ="Blood Pressure")# Define layout and build table:extra_args_rr <-list(method ="wald",denom ="n_df",ref_path = ref_path,.stats =c("denom", "count_unique_fraction"))lyt0 <-basic_table(show_colcounts =TRUE,colcount_format ="N=xx") %>%split_cols_by("colspan_trt",split_fun =trim_levels_to_map(map = colspan_trt_map) ) %>%split_cols_by(trtvar) %>%split_cols_by("rrisk_header", nested =FALSE) %>%split_cols_by( trtvar,labels_var ="rrisk_label",split_fun =remove_split_levels(ctrl_grp) ) %>%split_rows_by("PARAM",label_pos ="topleft",child_labels ="hidden",split_label ="Diastolic Blood Pressure (mmHg), n (%)",section_div =" ",## ensure only the appropriate levels inside PARAM-AVALCAT1 will be includedsplit_fun =trim_levels_to_map(param_map) )# version without explicit denominator (as in shell)lyt <- lyt0 %>%# for testing, it is sometimes convenient to explicitely show the used denominatoranalyze("AVALCAT1", a_freq_j,extra_args = extra_args_rr,show_labels ="hidden",indent_mod =0L )result <-build_table(lyt, filtered_advs, alt_counts_df = adsl)# Post-Processing:result <-remove_col_count(result)# Add titles and footnotes:result <-set_titles(result, titles)# Convert to tbl file and output tablett_to_tlgrtf(string_map = string_map, tt = result, file = fileid, orientation ="landscape")
TSFVIT03:Subjects With Maximum On-treatment Diastolic Blood Pressure by Category of Blood Pressure; Safety Analysis Set (Study jjcs - core)
Active Study Agent
Risk Difference (%) (95% CI)
Xanomeline High Dose
Xanomeline Low Dose
Placebo
Xanomeline High Dose vs Placebo
Xanomeline Low Dose vs Placebo
Diastolic Blood Pressure (mmHg), n (%)
N=53
N=73
N=59
N
53
70
58
<60
6 (11.3%)
8 (11.4%)
9 (15.5%)
-4.2 (-16.8, 8.4)
-4.1 (-16.0, 7.8)
≥60 to 89
47 (88.7%)
61 (87.1%)
48 (82.8%)
5.9 (-7.0, 18.9)
4.4 (-8.1, 16.9)
≥90 to 109
0
1 (1.4%)
1 (1.7%)
-1.7 (-5.1, 1.6)
-0.3 (-4.6, 4.1)
≥110 to 119
0
0
0
0.0 (0.0, 0.0)
0.0 (0.0, 0.0)
≥120
0
0
0
0.0 (0.0, 0.0)
0.0 (0.0, 0.0)
Note: On-treatment is defined as blood pressure values obtained after the first dose and within [30 days] following treatment discontinuation.