diff --git a/.gitignore b/.gitignore index 32d5558..1babcb0 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,4 @@ videos *.mp4 /.quarto/ +**/.DS_Store \ No newline at end of file diff --git a/index.qmd b/index.qmd index ae6617e..73a4e20 100644 --- a/index.qmd +++ b/index.qmd @@ -15,11 +15,14 @@ clinical questions that were addressed via Bayesian modelling with the `brms` pa ::: {.content-visible when-profile="public"} ::: {.callout-tip} -## Short course at JSM -- Portland, OR -- August 5th 2024 +## Courses in Göttingen (Germany), Dec 5/6th and at JSM (Portland, OR), Aug 5th 2024 -We will offer a short course based on this material at the 2024 Joint Statistical Meetings in Portland on August 5. The materials are available here: +We offered two courses based on this material in 2024: -- [Slides](workshops/jsm2024/slides/bamdd_jsm2024.pdf) & [additional material (see readme)](https://github.com/Novartis/bamdd/tree/main/workshops/jsm2024) +1. A course at the workshop ["Hierarchical models in preclinical research"](https://www.biometrische-gesellschaft.de/arbeitsgruppen/bayes-methodik/workshops/2024-goettingen.html) of the IBS-DR working groups Non-clinical statistics and Bayes Methods on December 5/6th. The materials are available here: + [Slides](workshops/goettingen2024/slides/bamdd_goettingen2024.html) & [additional material (see readme)](https://github.com/Novartis/bamdd/tree/main/workshops/goettingen2024) +2. A short course at the 2024 Joint Statistical Meetings in Portland on August 5th. The materials are available here: + [Slides](workshops/jsm2024/slides/bamdd_jsm2024.pdf) & [additional material (see readme)](https://github.com/Novartis/bamdd/tree/main/workshops/jsm2024) ::: ::: @@ -46,6 +49,8 @@ appropiate. Key changes to the web-site are tracked here: ::: {.content-visible when-profile="public"} +- 13th January 2025: Linked materials from the course in Göttingen + in December 2024. - 31st July 2024: Linked materials from JSM Portland 2024 short course - 5th June 2024: Added @sec-pos on assessing probability of success of in Phase-III based on a single-arm trial in Phase-II diff --git a/resources/6xK3dSBYKcSV-LCoeQqfX1RYOo3qN67lqDY.woff2 b/resources/6xK3dSBYKcSV-LCoeQqfX1RYOo3qN67lqDY.woff2 old mode 100644 new mode 100755 diff --git a/resources/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNK7lqDY.woff2 b/resources/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNK7lqDY.woff2 old mode 100644 new mode 100755 diff --git a/resources/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNa7lqDY.woff2 b/resources/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNa7lqDY.woff2 old mode 100644 new mode 100755 diff --git a/resources/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNq7lqDY.woff2 b/resources/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNq7lqDY.woff2 old mode 100644 new mode 100755 diff --git a/resources/6xK3dSBYKcSV-LCoeQqfX1RYOo3qO67lqDY.woff2 b/resources/6xK3dSBYKcSV-LCoeQqfX1RYOo3qO67lqDY.woff2 old mode 100644 new mode 100755 diff --git a/resources/6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7l.woff2 b/resources/6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7l.woff2 old mode 100644 new mode 100755 diff --git a/resources/6xK3dSBYKcSV-LCoeQqfX1RYOo3qPK7lqDY.woff2 b/resources/6xK3dSBYKcSV-LCoeQqfX1RYOo3qPK7lqDY.woff2 old mode 100644 new mode 100755 diff --git a/resources/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwkxduz8A.woff2 b/resources/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwkxduz8A.woff2 old mode 100644 new mode 100755 diff --git a/resources/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2 b/resources/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2 old mode 100644 new mode 100755 diff --git a/resources/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2 b/resources/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2 old mode 100644 new mode 100755 diff --git a/resources/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2 b/resources/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2 old mode 100644 new mode 100755 diff --git a/resources/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2 b/resources/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2 old mode 100644 new mode 100755 diff --git a/resources/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmhduz8A.woff2 b/resources/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmhduz8A.woff2 old mode 100644 new mode 100755 diff --git a/resources/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmxduz8A.woff2 b/resources/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmxduz8A.woff2 old mode 100644 new mode 100755 diff --git a/resources/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwkxduz8A.woff2 b/resources/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwkxduz8A.woff2 old mode 100644 new mode 100755 diff --git a/resources/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlBduz8A.woff2 b/resources/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlBduz8A.woff2 old mode 100644 new mode 100755 diff --git a/resources/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdu.woff2 b/resources/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdu.woff2 old mode 100644 new mode 100755 diff --git a/resources/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmBduz8A.woff2 b/resources/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmBduz8A.woff2 old mode 100644 new mode 100755 diff --git a/resources/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmRduz8A.woff2 b/resources/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmRduz8A.woff2 old mode 100644 new mode 100755 diff --git a/resources/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmhduz8A.woff2 b/resources/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmhduz8A.woff2 old mode 100644 new mode 100755 diff --git a/resources/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmxduz8A.woff2 b/resources/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmxduz8A.woff2 old mode 100644 new mode 100755 diff --git a/src/longitudinal/fit_models.R b/src/longitudinal/fit_models.R index 05d269d..2ddb51d 100644 --- a/src/longitudinal/fit_models.R +++ b/src/longitudinal/fit_models.R @@ -126,7 +126,7 @@ emm <- clustermq::Q_rows( walltime = 120, job_name = "longitudinal_child", log_file = here("reports", "longitudinal_child_%I.log"), - memory = 3000, + memory = 8000, cores = 4 ), job_size = 1 diff --git a/src/move_videos.R b/src/move_videos.R deleted file mode 100644 index 34b1ffd..0000000 --- a/src/move_videos.R +++ /dev/null @@ -1,41 +0,0 @@ -profile <- Sys.getenv("QUARTO_PROFILE") - -if(profile == "public"){ - -# cp -r videos $(QUARTO_PROJECT_OUTPUT_DIR)/src/ -# -# This is intended as a Quarto post-render script to move local -# video files into the correct website directory. -# -# This is a workaround to an apparent Quarto bug and should not be -# necessary when Quarto > 1.4 is available to us. -# -# see https://github.com/quarto-dev/quarto-cli/issues/3892 - -here::i_am("src/move_videos.R") -library(here) - -# this is supposed to work, but doesn't seem to do -# output_dir <- Sys.getenv("QUARTO_PROJECT_OUTPUT_DIR") - -# maybe needs a newer Quarto version?? -# https://quarto.org/docs/projects/scripts.html#pre-and-post-render - -# that environment variable is not set here: -# envvars <- Sys.getenv() -# print(envvars[grepl("QUARTO", names(envvars))]) - -# instead: -output_dir <- file.path("docs", profile) - -source_dir <- here("videos") -target_dir <- file.path(output_dir, "src/") - -cat("Copying from", here("videos"), "to", here(target_dir), "...") - -stopifnot(dir.exists(output_dir)) -if(!dir.exists(target_dir)) dir.create(target_dir) - -file.copy(here("videos"), target_dir, recursive = TRUE) - -} diff --git a/src/plot_distributions.R b/src/plot_distributions.R deleted file mode 100644 index b8448dd..0000000 --- a/src/plot_distributions.R +++ /dev/null @@ -1,110 +0,0 @@ -library(dplyr) -library(tidyr) -library(ggplot2) -# library(patchwork) -# library(latex2exp) -theme_set(bayesplot::theme_default()) - -# additional distributions -dbeta2 <- function(x, mu, nu, ...) { - shape1 <- mu * nu - shape2 <- (1-mu) * nu - dbeta(x, shape1, shape2, ...) -} - -dbeta2_prime <- function(x, mu, nu) { - shape1 <- mu * nu - shape2 <- (1-mu) * nu - x^(shape1-1) * (1 + x)^(-shape1 - shape2) / beta(shape1, shape2) -} - -dbernoulli <- function(x, prob, log = FALSE) { - dbinom(x, 1, prob, log = log) -} - -dcategorical <- function(x, ...) { - probs <- c(...) - probs[x] -} - -dhyper2 <- function(x, size, k, prob, log = FALSE) { - dhyper(x, m = size * prob, n = size * (1 - prob), k = k, log = log) -} - -plot_dist <- function(dist, bounds, pars, xtype = c("c", "d"), - prefix = c("d", "p", "q"), parnames = NULL, - package = NULL, ...) { - xtype <- match.arg(xtype) - prefix <- match.arg(prefix) - pos <- -1 - if (!is.null(package)) { - pos <- asNamespace(package) - } - dist_fun <- get(paste0(prefix, dist), pos = pos, mode = "function") - if (xtype == "c") { - # continuous - df <- data.frame(x = seq(bounds[1], bounds[2], 0.001)) - } else if (xtype == "d") { - # discrete - df <- data.frame(x = bounds[1]:bounds[2]) - } - if (!is.null(parnames)) { - parnames <- paste0(parnames, " = ") - } - cnames <- rep(NA, length(pars)) - for (i in seq_along(pars)) { - tmp <- do.call(dist_fun, c(list(df$x), pars[[i]], list(...))) - cnames[i] <- paste0("$", parnames, pars[[i]], "$", collapse = ", ") - df[paste0(parnames, pars[[i]], collapse = ", ")] <- tmp - } - df <- df %>% - gather("pars", "dens", -x) %>% - mutate(pars = factor(pars, unique(pars))) - - gg <- ggplot(df, aes(x, dens, color = pars)) - if (xtype == "c") { - gg <- gg + geom_line(size = 1) - } else if (xtype == "d") { - gg <- gg + - geom_linerange(aes(ymin=0, ymax=dens), size = 1) + - geom_line(size = 0.8, linetype = "dotted", alpha = 0.8) - } - gg <- gg + - scale_color_viridis_d(labels = unname(latex2exp::TeX(cnames))) + - labs(x = "x", y = "", color = "") + - theme( - axis.text.y = element_blank(), - axis.ticks.y = element_blank(), - axis.line.y = element_blank(), - legend.position = "bottom", - legend.text = element_text(size = 10) - ) - if (prefix == "p") { - gg <- gg + - scale_y_continuous(breaks = c(0, 0.5, 1)) + - theme(axis.ticks.y = element_line(), - axis.text.y = element_text(), - axis.line.y = element_line()) - } else if (prefix == "q") { - gg <- gg + - scale_y_continuous() + - theme(axis.ticks.y = element_line(), - axis.text.y = element_text(), - axis.line.y = element_line()) - } - gg -} - -histogram <- function(x, bins = 30) { - xname <- deparse(substitute(x)) - xexpr <- eval(parse(text = paste0("expression(", xname, ")"))) - ggplot(data.frame(x), aes(x, y = ..density..)) + - geom_histogram(fill = "lightgrey", color = "black", bins = bins) + - xlab(xexpr) + - theme( - axis.text.y = element_blank(), - axis.ticks.y = element_blank(), - axis.line.y = element_blank(), - axis.title.y = element_blank() - ) -} diff --git a/src/preamble.tex b/src/preamble.tex deleted file mode 100644 index dfd2e14..0000000 --- a/src/preamble.tex +++ /dev/null @@ -1 +0,0 @@ -\usepackage{booktabs} diff --git a/workshops/goettingen2024/README.md b/workshops/goettingen2024/README.md new file mode 100644 index 0000000..a430e16 --- /dev/null +++ b/workshops/goettingen2024/README.md @@ -0,0 +1,24 @@ +# Course materials + +These are the materials accompanying the tutorial for the Workshop of the IBS-DR working groups "Non-clinical statistics" and "Bayes Methods" on "Hierarchical models in preclinical research" in Göttingen, Germany, on December 5th and 6th, 2024. + +Instructors: +- Sebastian Weber +- Lukas Widmer + +Additional contributors: +- Andrew Bean +- Paul Buerkner +- Bjoern Holzhauer +- David Ohlssen +- Cong Zhang + + +## Folder structure + +- `slides/bamdd_goettingen2024.html` is the main slide deck for the course +- `slides/R/` is a directory containing the R code from the case studies presented in the course +- `exercises/` contains two sets of hands-on exercises and solutions in the form of Quarto and corresponding R code files + + + diff --git a/workshops/goettingen2024/brms_course.Rproj b/workshops/goettingen2024/brms_course.Rproj new file mode 100644 index 0000000..8e3c2eb --- /dev/null +++ b/workshops/goettingen2024/brms_course.Rproj @@ -0,0 +1,13 @@ +Version: 1.0 + +RestoreWorkspace: Default +SaveWorkspace: Default +AlwaysSaveHistory: Default + +EnableCodeIndexing: Yes +UseSpacesForTab: Yes +NumSpacesForTab: 2 +Encoding: UTF-8 + +RnwWeave: Sweave +LaTeX: pdfLaTeX diff --git a/workshops/goettingen2024/data/longitudinal.csv b/workshops/goettingen2024/data/longitudinal.csv new file mode 100644 index 0000000..4f3d195 --- /dev/null +++ b/workshops/goettingen2024/data/longitudinal.csv @@ -0,0 +1,1476 @@ +SUBJID,TRT01P,AVISIT,AVISITN,PARAMCD,AVAL,BASE,CHG,PCHG,MISSFL,IMPUTE,DROPFL,NRFL,LOCFFL +1,PBO,Week 1,1,PASITSCO,13.8,16,-2.1999999999999993,-0.13749999999999996,FALSE,NA,TRUE,TRUE,TRUE +1,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +1,PBO,Week 2,2,PASITSCO,15.5,16,-0.5,-0.03125,FALSE,NA,TRUE,TRUE,TRUE +1,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +1,PBO,Week 4,4,PASITSCO,20.7,16,4.699999999999999,0.29374999999999996,FALSE,NA,TRUE,TRUE,TRUE +1,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +1,PBO,Week 6,6,PASITSCO,23.3,16,7.300000000000001,0.45625000000000004,FALSE,NA,TRUE,TRUE,TRUE +1,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +1,PBO,Week 8,8,PASITSCO,48.1,16,32.1,2.00625,FALSE,NA,TRUE,TRUE,TRUE +1,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +1,PBO,Week 10,10,PASITSCO,26,16,10,0.625,FALSE,NA,TRUE,TRUE,TRUE +1,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +1,PBO,Week 12,12,PASITSCO,36.7,16,20.700000000000003,1.2937500000000002,FALSE,NA,TRUE,TRUE,TRUE +1,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +2,TRT,Week 1,1,PASITSCO,23.7,20.3,3.3999999999999986,0.16748768472906397,FALSE,NA,TRUE,TRUE,TRUE +2,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +2,TRT,Week 2,2,PASITSCO,21.5,20.3,1.1999999999999993,0.0591133004926108,FALSE,NA,TRUE,TRUE,TRUE +2,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +2,TRT,Week 4,4,PASITSCO,20.9,20.3,0.5999999999999979,0.029556650246305313,FALSE,NA,TRUE,TRUE,TRUE +2,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +2,TRT,Week 6,6,PASITSCO,6.7,20.3,-13.600000000000001,-0.6699507389162562,FALSE,NA,TRUE,TRUE,TRUE +2,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +2,TRT,Week 8,8,PASITSCO,8.5,20.3,-11.8,-0.58128078817734,FALSE,NA,TRUE,TRUE,TRUE +2,TRT,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +2,TRT,Week 10,10,PASITSCO,3.6,20.3,-16.7,-0.8226600985221674,FALSE,NA,TRUE,TRUE,TRUE +2,TRT,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +2,TRT,Week 12,12,PASITSCO,2,20.3,-18.3,-0.9014778325123153,FALSE,NA,TRUE,TRUE,TRUE +2,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +3,TRT,Week 1,1,PASITSCO,18.8,28.8,-10,-0.3472222222222222,FALSE,NA,TRUE,TRUE,TRUE +3,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +3,TRT,Week 2,2,PASITSCO,18.2,28.8,-10.600000000000001,-0.3680555555555556,FALSE,NA,TRUE,TRUE,TRUE +3,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +3,TRT,Week 4,4,PASITSCO,10.6,28.8,-18.200000000000003,-0.6319444444444445,FALSE,NA,TRUE,TRUE,TRUE +3,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +3,TRT,Week 6,6,PASITSCO,15.7,28.8,-13.100000000000001,-0.45486111111111116,FALSE,NA,TRUE,TRUE,TRUE +3,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +3,TRT,Week 8,8,PASITSCO,3.1,28.8,-25.7,-0.892361111111111,FALSE,NA,TRUE,TRUE,TRUE +3,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +3,TRT,Week 10,10,PASITSCO,2,28.8,-26.8,-0.9305555555555556,FALSE,NA,TRUE,TRUE,TRUE +3,TRT,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +3,TRT,Week 12,12,PASITSCO,5.9,28.8,-22.9,-0.7951388888888888,FALSE,NA,TRUE,TRUE,TRUE +3,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +4,TRT,Week 1,1,PASITSCO,48.4,47.5,0.8999999999999986,0.0189473684210526,FALSE,NA,TRUE,TRUE,TRUE +4,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +4,TRT,Week 2,2,PASITSCO,30.2,47.5,-17.3,-0.3642105263157895,FALSE,NA,TRUE,TRUE,TRUE +4,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +4,TRT,Week 4,4,PASITSCO,19.5,47.5,-28,-0.5894736842105263,FALSE,NA,TRUE,TRUE,TRUE +4,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +4,TRT,Week 6,6,PASITSCO,9.7,47.5,-37.8,-0.7957894736842105,FALSE,NA,TRUE,TRUE,TRUE +4,TRT,Week 6,6,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +4,TRT,Week 8,8,PASITSCO,4.7,47.5,-42.8,-0.9010526315789473,FALSE,NA,TRUE,TRUE,TRUE +4,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +4,TRT,Week 10,10,PASITSCO,3.8,47.5,-43.7,-0.92,FALSE,NA,TRUE,TRUE,TRUE +4,TRT,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +4,TRT,Week 12,12,PASITSCO,3.8,47.5,-43.7,-0.92,FALSE,NA,TRUE,TRUE,TRUE +4,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +5,TRT,Week 1,1,PASITSCO,15.7,29.8,-14.100000000000001,-0.4731543624161074,FALSE,NA,TRUE,TRUE,TRUE +5,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +5,TRT,Week 2,2,PASITSCO,10.9,29.8,-18.9,-0.634228187919463,FALSE,NA,TRUE,TRUE,TRUE +5,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +5,TRT,Week 4,4,PASITSCO,4.1,29.8,-25.700000000000003,-0.8624161073825504,FALSE,NA,TRUE,TRUE,TRUE +5,TRT,Week 4,4,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +5,TRT,Week 6,6,PASITSCO,3.4,29.8,-26.400000000000002,-0.8859060402684564,FALSE,NA,TRUE,TRUE,TRUE +5,TRT,Week 6,6,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +5,TRT,Week 8,8,PASITSCO,1.6,29.8,-28.2,-0.9463087248322147,FALSE,NA,TRUE,TRUE,TRUE +5,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +5,TRT,Week 10,10,PASITSCO,0.4,29.8,-29.400000000000002,-0.9865771812080537,FALSE,NA,TRUE,TRUE,TRUE +5,TRT,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +5,TRT,Week 12,12,PASITSCO,0.5,29.8,-29.3,-0.9832214765100671,FALSE,NA,TRUE,TRUE,TRUE +5,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +6,PBO,Week 1,1,PASITSCO,22.6,26.4,-3.799999999999997,-0.14393939393939384,FALSE,NA,TRUE,TRUE,TRUE +6,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +6,PBO,Week 2,2,PASITSCO,23.1,26.4,-3.299999999999997,-0.1249999999999999,FALSE,NA,TRUE,TRUE,TRUE +6,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +6,PBO,Week 4,4,PASITSCO,15,26.4,-11.399999999999999,-0.43181818181818177,FALSE,NA,TRUE,TRUE,TRUE +6,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +6,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +6,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +6,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +6,PBO,Week 12,12,PASITSCO,3.9,26.4,-22.5,-0.8522727272727273,FALSE,NA,TRUE,TRUE,TRUE +6,PBO,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +7,PBO,Week 1,1,PASITSCO,15.5,15.4,0.09999999999999964,0.0064935064935064705,FALSE,NA,TRUE,TRUE,TRUE +7,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +7,PBO,Week 2,2,PASITSCO,19.4,15.4,3.9999999999999982,0.2597402597402596,FALSE,NA,TRUE,TRUE,TRUE +7,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +7,PBO,Week 4,4,PASITSCO,9.8,15.4,-5.6,-0.3636363636363636,FALSE,NA,TRUE,TRUE,TRUE +7,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +7,PBO,Week 6,6,PASITSCO,16.5,15.4,1.0999999999999996,0.07142857142857141,FALSE,NA,TRUE,TRUE,TRUE +7,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +7,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +7,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +7,PBO,Week 12,12,PASITSCO,7.7,15.4,-7.7,-0.5,FALSE,NA,TRUE,TRUE,TRUE +7,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +8,PBO,Week 1,1,PASITSCO,9.8,14.1,-4.299999999999999,-0.30496453900709214,FALSE,NA,TRUE,TRUE,TRUE +8,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +8,PBO,Week 2,2,PASITSCO,6.3,14.1,-7.8,-0.5531914893617021,FALSE,NA,TRUE,TRUE,TRUE +8,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +8,PBO,Week 4,4,PASITSCO,7.3,14.1,-6.8,-0.48226950354609927,FALSE,NA,TRUE,TRUE,TRUE +8,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +8,PBO,Week 6,6,PASITSCO,5.4,14.1,-8.7,-0.6170212765957447,FALSE,NA,TRUE,TRUE,TRUE +8,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +8,PBO,Week 8,8,PASITSCO,8.9,14.1,-5.199999999999999,-0.36879432624113473,FALSE,NA,TRUE,TRUE,TRUE +8,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +8,PBO,Week 10,10,PASITSCO,5.8,14.1,-8.3,-0.5886524822695036,FALSE,NA,TRUE,TRUE,TRUE +8,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +8,PBO,Week 12,12,PASITSCO,6.4,14.1,-7.699999999999999,-0.5460992907801419,FALSE,NA,TRUE,TRUE,TRUE +8,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +9,PBO,Week 1,1,PASITSCO,15.2,9.8,5.399999999999999,0.5510204081632651,FALSE,NA,TRUE,TRUE,TRUE +9,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +9,PBO,Week 2,2,PASITSCO,16.5,9.8,6.699999999999999,0.683673469387755,FALSE,NA,TRUE,TRUE,TRUE +9,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +9,PBO,Week 4,4,PASITSCO,13.3,9.8,3.5,0.3571428571428571,FALSE,NA,TRUE,TRUE,TRUE +9,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +9,PBO,Week 6,6,PASITSCO,10.8,9.8,1,0.1020408163265306,FALSE,NA,TRUE,TRUE,TRUE +9,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +9,PBO,Week 8,8,PASITSCO,14.5,9.8,4.699999999999999,0.47959183673469374,FALSE,NA,TRUE,TRUE,TRUE +9,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +9,PBO,Week 10,10,PASITSCO,24.8,9.8,15,1.530612244897959,FALSE,NA,TRUE,TRUE,TRUE +9,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +9,PBO,Week 12,12,PASITSCO,4.4,9.8,-5.4,-0.5510204081632653,FALSE,NA,TRUE,TRUE,TRUE +9,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +10,PBO,Week 1,1,PASITSCO,20.9,15.1,5.799999999999999,0.3841059602649006,FALSE,NA,TRUE,TRUE,TRUE +10,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +10,PBO,Week 2,2,PASITSCO,26.6,15.1,11.500000000000002,0.76158940397351,FALSE,NA,TRUE,TRUE,TRUE +10,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +10,PBO,Week 4,4,PASITSCO,28.9,15.1,13.799999999999999,0.9139072847682119,FALSE,NA,TRUE,TRUE,TRUE +10,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +10,PBO,Week 6,6,PASITSCO,24.2,15.1,9.1,0.6026490066225165,FALSE,NA,TRUE,TRUE,TRUE +10,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +10,PBO,Week 8,8,PASITSCO,45.7,15.1,30.6,2.0264900662251657,FALSE,NA,TRUE,TRUE,TRUE +10,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +10,PBO,Week 10,10,PASITSCO,65,15.1,49.9,3.3046357615894038,FALSE,NA,TRUE,TRUE,TRUE +10,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +10,PBO,Week 12,12,PASITSCO,42.6,15.1,27.5,1.8211920529801324,FALSE,NA,TRUE,TRUE,TRUE +10,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +11,TRT,Week 1,1,PASITSCO,15.6,33.5,-17.9,-0.5343283582089552,FALSE,NA,TRUE,TRUE,TRUE +11,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +11,TRT,Week 2,2,PASITSCO,9.1,33.5,-24.4,-0.7283582089552239,FALSE,NA,TRUE,TRUE,TRUE +11,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +11,TRT,Week 4,4,PASITSCO,5.2,33.5,-28.3,-0.8447761194029851,FALSE,NA,TRUE,TRUE,TRUE +11,TRT,Week 4,4,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +11,TRT,Week 6,6,PASITSCO,10,33.5,-23.5,-0.7014925373134329,FALSE,NA,TRUE,TRUE,TRUE +11,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +11,TRT,Week 8,8,PASITSCO,2.3,33.5,-31.2,-0.9313432835820895,FALSE,NA,TRUE,TRUE,TRUE +11,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +11,TRT,Week 10,10,PASITSCO,2.3,33.5,-31.2,-0.9313432835820895,FALSE,NA,TRUE,TRUE,TRUE +11,TRT,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +11,TRT,Week 12,12,PASITSCO,10.8,33.5,-22.7,-0.6776119402985075,FALSE,NA,TRUE,TRUE,TRUE +11,TRT,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +12,TRT,Week 1,1,PASITSCO,16.9,15.2,1.6999999999999993,0.11184210526315785,FALSE,NA,TRUE,TRUE,TRUE +12,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +12,TRT,Week 2,2,PASITSCO,17.4,15.2,2.1999999999999993,0.1447368421052631,FALSE,NA,TRUE,TRUE,TRUE +12,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +12,TRT,Week 4,4,PASITSCO,12,15.2,-3.1999999999999993,-0.21052631578947364,FALSE,NA,TRUE,TRUE,TRUE +12,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +12,TRT,Week 6,6,PASITSCO,23,15.2,7.800000000000001,0.5131578947368421,FALSE,NA,TRUE,TRUE,TRUE +12,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +12,TRT,Week 8,8,PASITSCO,7.1,15.2,-8.1,-0.5328947368421053,FALSE,NA,TRUE,TRUE,TRUE +12,TRT,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +12,TRT,Week 10,10,PASITSCO,10.6,15.2,-4.6,-0.3026315789473684,FALSE,NA,TRUE,TRUE,TRUE +12,TRT,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +12,TRT,Week 12,12,PASITSCO,10.9,15.2,-4.299999999999999,-0.2828947368421052,FALSE,NA,TRUE,TRUE,TRUE +12,TRT,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +13,PBO,Week 1,1,PASITSCO,15.8,13.8,2,0.14492753623188406,FALSE,NA,TRUE,TRUE,TRUE +13,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +13,PBO,Week 2,2,PASITSCO,15.8,13.8,2,0.14492753623188406,FALSE,NA,TRUE,TRUE,TRUE +13,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +13,PBO,Week 4,4,PASITSCO,7.3,13.8,-6.500000000000001,-0.4710144927536232,FALSE,NA,TRUE,TRUE,TRUE +13,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +13,PBO,Week 6,6,PASITSCO,12.2,13.8,-1.6000000000000014,-0.11594202898550734,FALSE,NA,TRUE,TRUE,TRUE +13,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +13,PBO,Week 8,8,PASITSCO,11.3,13.8,-2.5,-0.18115942028985507,FALSE,NA,TRUE,TRUE,TRUE +13,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +13,PBO,Week 10,10,PASITSCO,10.1,13.8,-3.700000000000001,-0.2681159420289856,FALSE,NA,TRUE,TRUE,TRUE +13,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +13,PBO,Week 12,12,PASITSCO,7.8,13.8,-6.000000000000001,-0.4347826086956522,FALSE,NA,TRUE,TRUE,TRUE +13,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +14,TRT,Week 1,1,PASITSCO,18.4,23.6,-5.200000000000003,-0.22033898305084756,FALSE,NA,TRUE,TRUE,TRUE +14,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +14,TRT,Week 2,2,PASITSCO,9,23.6,-14.600000000000001,-0.6186440677966102,FALSE,NA,TRUE,TRUE,TRUE +14,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +14,TRT,Week 4,4,PASITSCO,7.9,23.6,-15.700000000000001,-0.6652542372881356,FALSE,NA,TRUE,TRUE,TRUE +14,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +14,TRT,Week 6,6,PASITSCO,4.1,23.6,-19.5,-0.8262711864406779,FALSE,NA,TRUE,TRUE,TRUE +14,TRT,Week 6,6,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +14,TRT,Week 8,8,PASITSCO,1.2,23.6,-22.400000000000002,-0.9491525423728814,FALSE,NA,TRUE,TRUE,TRUE +14,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +14,TRT,Week 10,10,PASITSCO,0.2,23.6,-23.400000000000002,-0.9915254237288136,FALSE,NA,TRUE,TRUE,TRUE +14,TRT,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +14,TRT,Week 12,12,PASITSCO,0.7,23.6,-22.900000000000002,-0.9703389830508475,FALSE,NA,TRUE,TRUE,TRUE +14,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +15,PBO,Week 1,1,PASITSCO,11.4,12.6,-1.1999999999999993,-0.09523809523809519,FALSE,NA,TRUE,TRUE,TRUE +15,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +15,PBO,Week 2,2,PASITSCO,15.3,12.6,2.700000000000001,0.21428571428571438,FALSE,NA,TRUE,TRUE,TRUE +15,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +15,PBO,Week 4,4,PASITSCO,13.6,12.6,1,0.07936507936507936,FALSE,NA,TRUE,TRUE,TRUE +15,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +15,PBO,Week 6,6,PASITSCO,11.8,12.6,-0.7999999999999989,-0.0634920634920634,FALSE,NA,TRUE,TRUE,TRUE +15,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +15,PBO,Week 8,8,PASITSCO,11.2,12.6,-1.4000000000000004,-0.11111111111111115,FALSE,NA,TRUE,TRUE,TRUE +15,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +15,PBO,Week 10,10,PASITSCO,6.2,12.6,-6.3999999999999995,-0.5079365079365079,FALSE,NA,TRUE,TRUE,TRUE +15,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +15,PBO,Week 12,12,PASITSCO,5.5,12.6,-7.1,-0.5634920634920635,FALSE,NA,TRUE,TRUE,TRUE +15,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +16,PBO,Week 1,1,PASITSCO,20.7,15.7,5,0.3184713375796179,FALSE,NA,TRUE,TRUE,TRUE +16,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +16,PBO,Week 2,2,PASITSCO,20.6,15.7,4.900000000000002,0.31210191082802563,FALSE,NA,TRUE,TRUE,TRUE +16,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +16,PBO,Week 4,4,PASITSCO,12.9,15.7,-2.799999999999999,-0.17834394904458592,FALSE,NA,TRUE,TRUE,TRUE +16,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +16,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +16,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +16,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +16,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +17,PBO,Week 1,1,PASITSCO,20,25.9,-5.899999999999999,-0.22779922779922776,FALSE,NA,TRUE,TRUE,TRUE +17,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +17,PBO,Week 2,2,PASITSCO,14.1,25.9,-11.799999999999999,-0.4555984555984556,FALSE,NA,TRUE,TRUE,TRUE +17,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +17,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +17,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +17,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +17,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +17,PBO,Week 12,12,PASITSCO,10.8,25.9,-15.099999999999998,-0.583011583011583,FALSE,NA,TRUE,TRUE,TRUE +17,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +18,PBO,Week 1,1,PASITSCO,13.3,19.2,-5.899999999999999,-0.30729166666666663,FALSE,NA,TRUE,TRUE,TRUE +18,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +18,PBO,Week 2,2,PASITSCO,13.7,19.2,-5.5,-0.28645833333333337,FALSE,NA,TRUE,TRUE,TRUE +18,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +18,PBO,Week 4,4,PASITSCO,10.6,19.2,-8.6,-0.4479166666666667,FALSE,NA,TRUE,TRUE,TRUE +18,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +18,PBO,Week 6,6,PASITSCO,10.4,19.2,-8.799999999999999,-0.4583333333333333,FALSE,NA,TRUE,TRUE,TRUE +18,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +18,PBO,Week 8,8,PASITSCO,5.9,19.2,-13.299999999999999,-0.6927083333333333,FALSE,NA,TRUE,TRUE,TRUE +18,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +18,PBO,Week 10,10,PASITSCO,9.2,19.2,-10,-0.5208333333333334,FALSE,NA,TRUE,TRUE,TRUE +18,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +18,PBO,Week 12,12,PASITSCO,5.8,19.2,-13.399999999999999,-0.6979166666666666,FALSE,NA,TRUE,TRUE,TRUE +18,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +19,TRT,Week 1,1,PASITSCO,6.1,12.6,-6.5,-0.5158730158730159,FALSE,NA,TRUE,TRUE,TRUE +19,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +19,TRT,Week 2,2,PASITSCO,5.6,12.6,-7,-0.5555555555555556,FALSE,NA,TRUE,TRUE,TRUE +19,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +19,TRT,Week 4,4,PASITSCO,3.5,12.6,-9.1,-0.7222222222222222,FALSE,NA,TRUE,TRUE,TRUE +19,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +19,TRT,Week 6,6,PASITSCO,4.3,12.6,-8.3,-0.6587301587301588,FALSE,NA,TRUE,TRUE,TRUE +19,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +19,TRT,Week 8,8,PASITSCO,13.2,12.6,0.5999999999999996,0.047619047619047596,FALSE,NA,TRUE,TRUE,TRUE +19,TRT,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +19,TRT,Week 10,10,PASITSCO,9.2,12.6,-3.4000000000000004,-0.2698412698412699,FALSE,NA,TRUE,TRUE,TRUE +19,TRT,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +19,TRT,Week 12,12,PASITSCO,9.5,12.6,-3.0999999999999996,-0.24603174603174602,FALSE,NA,TRUE,TRUE,TRUE +19,TRT,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +20,TRT,Week 1,1,PASITSCO,20.7,19.4,1.3000000000000007,0.06701030927835055,FALSE,NA,TRUE,TRUE,TRUE +20,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +20,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +20,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +20,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +20,TRT,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +20,TRT,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +20,TRT,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +21,PBO,Week 1,1,PASITSCO,22.1,21.2,0.9000000000000021,0.04245283018867935,FALSE,NA,TRUE,TRUE,TRUE +21,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +21,PBO,Week 2,2,PASITSCO,30.5,21.2,9.3,0.43867924528301894,FALSE,NA,TRUE,TRUE,TRUE +21,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +21,PBO,Week 4,4,PASITSCO,18.6,21.2,-2.599999999999998,-0.12264150943396217,FALSE,NA,TRUE,TRUE,TRUE +21,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +21,PBO,Week 6,6,PASITSCO,14.1,21.2,-7.1,-0.33490566037735847,FALSE,NA,TRUE,TRUE,TRUE +21,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +21,PBO,Week 8,8,PASITSCO,9.6,21.2,-11.6,-0.5471698113207547,FALSE,NA,TRUE,TRUE,TRUE +21,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +21,PBO,Week 10,10,PASITSCO,9.9,21.2,-11.299999999999999,-0.5330188679245282,FALSE,NA,TRUE,TRUE,TRUE +21,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +21,PBO,Week 12,12,PASITSCO,6.2,21.2,-15,-0.7075471698113208,FALSE,NA,TRUE,TRUE,TRUE +21,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +22,TRT,Week 1,1,PASITSCO,19.6,22.5,-2.8999999999999986,-0.12888888888888883,FALSE,NA,TRUE,TRUE,TRUE +22,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +22,TRT,Week 2,2,PASITSCO,19.8,22.5,-2.6999999999999993,-0.11999999999999997,FALSE,NA,TRUE,TRUE,TRUE +22,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +22,TRT,Week 4,4,PASITSCO,9.8,22.5,-12.7,-0.5644444444444444,FALSE,NA,TRUE,TRUE,TRUE +22,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +22,TRT,Week 6,6,PASITSCO,3.2,22.5,-19.3,-0.8577777777777779,FALSE,NA,TRUE,TRUE,TRUE +22,TRT,Week 6,6,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +22,TRT,Week 8,8,PASITSCO,0.7,22.5,-21.8,-0.9688888888888889,FALSE,NA,TRUE,TRUE,TRUE +22,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +22,TRT,Week 10,10,PASITSCO,0.7,22.5,-21.8,-0.9688888888888889,FALSE,NA,TRUE,TRUE,TRUE +22,TRT,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +22,TRT,Week 12,12,PASITSCO,0.5,22.5,-22,-0.9777777777777777,FALSE,NA,TRUE,TRUE,TRUE +22,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +23,PBO,Week 1,1,PASITSCO,30.9,26.1,4.799999999999997,0.18390804597701138,FALSE,NA,TRUE,TRUE,TRUE +23,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +23,PBO,Week 2,2,PASITSCO,32.2,26.1,6.100000000000001,0.23371647509578547,FALSE,NA,TRUE,TRUE,TRUE +23,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +23,PBO,Week 4,4,PASITSCO,39,26.1,12.899999999999999,0.4942528735632183,FALSE,NA,TRUE,TRUE,TRUE +23,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +23,PBO,Week 6,6,PASITSCO,46.9,26.1,20.799999999999997,0.796934865900383,FALSE,NA,TRUE,TRUE,TRUE +23,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +23,PBO,Week 8,8,PASITSCO,51,26.1,24.9,0.9540229885057471,FALSE,NA,TRUE,TRUE,TRUE +23,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +23,PBO,Week 10,10,PASITSCO,47.2,26.1,21.1,0.8084291187739464,FALSE,NA,TRUE,TRUE,TRUE +23,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +23,PBO,Week 12,12,PASITSCO,41.6,26.1,15.5,0.5938697318007663,FALSE,NA,TRUE,TRUE,TRUE +23,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +24,PBO,Week 1,1,PASITSCO,19.5,22.3,-2.8000000000000007,-0.12556053811659196,FALSE,NA,TRUE,TRUE,TRUE +24,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +24,PBO,Week 2,2,PASITSCO,19.3,22.3,-3,-0.13452914798206278,FALSE,NA,TRUE,TRUE,TRUE +24,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +24,PBO,Week 4,4,PASITSCO,29,22.3,6.699999999999999,0.3004484304932735,FALSE,NA,TRUE,TRUE,TRUE +24,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +24,PBO,Week 6,6,PASITSCO,9.1,22.3,-13.200000000000001,-0.5919282511210763,FALSE,NA,TRUE,TRUE,TRUE +24,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +24,PBO,Week 8,8,PASITSCO,11.1,22.3,-11.200000000000001,-0.5022421524663677,FALSE,NA,TRUE,TRUE,TRUE +24,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +24,PBO,Week 10,10,PASITSCO,9.5,22.3,-12.8,-0.5739910313901345,FALSE,NA,TRUE,TRUE,TRUE +24,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +24,PBO,Week 12,12,PASITSCO,9.9,22.3,-12.4,-0.5560538116591929,FALSE,NA,TRUE,TRUE,TRUE +24,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +25,PBO,Week 1,1,PASITSCO,9.5,20.2,-10.7,-0.5297029702970297,FALSE,NA,TRUE,TRUE,TRUE +25,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +25,PBO,Week 2,2,PASITSCO,5.1,20.2,-15.1,-0.7475247524752475,FALSE,NA,TRUE,TRUE,TRUE +25,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +25,PBO,Week 4,4,PASITSCO,6.4,20.2,-13.799999999999999,-0.6831683168316831,FALSE,NA,TRUE,TRUE,TRUE +25,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +25,PBO,Week 6,6,PASITSCO,16.8,20.2,-3.3999999999999986,-0.16831683168316824,FALSE,NA,TRUE,TRUE,TRUE +25,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +25,PBO,Week 8,8,PASITSCO,14.1,20.2,-6.1,-0.30198019801980197,FALSE,NA,TRUE,TRUE,TRUE +25,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +25,PBO,Week 10,10,PASITSCO,6.8,20.2,-13.399999999999999,-0.6633663366336633,FALSE,NA,TRUE,TRUE,TRUE +25,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +25,PBO,Week 12,12,PASITSCO,17.7,20.2,-2.5,-0.12376237623762376,FALSE,NA,TRUE,TRUE,TRUE +25,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +26,PBO,Week 1,1,PASITSCO,25.4,30.7,-5.300000000000001,-0.1726384364820847,FALSE,NA,TRUE,TRUE,TRUE +26,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +26,PBO,Week 2,2,PASITSCO,27.2,30.7,-3.5,-0.11400651465798047,FALSE,NA,TRUE,TRUE,TRUE +26,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +26,PBO,Week 4,4,PASITSCO,23.9,30.7,-6.800000000000001,-0.2214983713355049,FALSE,NA,TRUE,TRUE,TRUE +26,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +26,PBO,Week 6,6,PASITSCO,19.4,30.7,-11.3,-0.3680781758957655,FALSE,NA,TRUE,TRUE,TRUE +26,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +26,PBO,Week 8,8,PASITSCO,28.4,30.7,-2.3000000000000007,-0.07491856677524432,FALSE,NA,TRUE,TRUE,TRUE +26,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +26,PBO,Week 10,10,PASITSCO,12.1,30.7,-18.6,-0.6058631921824105,FALSE,NA,TRUE,TRUE,TRUE +26,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +26,PBO,Week 12,12,PASITSCO,32.4,30.7,1.6999999999999993,0.0553745928338762,FALSE,NA,TRUE,TRUE,TRUE +26,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +27,TRT,Week 1,1,PASITSCO,14.6,18.5,-3.9000000000000004,-0.21081081081081082,FALSE,NA,TRUE,TRUE,TRUE +27,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +27,TRT,Week 2,2,PASITSCO,11,18.5,-7.5,-0.40540540540540543,FALSE,NA,TRUE,TRUE,TRUE +27,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +27,TRT,Week 4,4,PASITSCO,5.1,18.5,-13.4,-0.7243243243243244,FALSE,NA,TRUE,TRUE,TRUE +27,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +27,TRT,Week 6,6,PASITSCO,9.1,18.5,-9.4,-0.5081081081081081,FALSE,NA,TRUE,TRUE,TRUE +27,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +27,TRT,Week 8,8,PASITSCO,6.7,18.5,-11.8,-0.6378378378378379,FALSE,NA,TRUE,TRUE,TRUE +27,TRT,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +27,TRT,Week 10,10,PASITSCO,6.6,18.5,-11.9,-0.6432432432432432,FALSE,NA,TRUE,TRUE,TRUE +27,TRT,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +27,TRT,Week 12,12,PASITSCO,9.1,18.5,-9.4,-0.5081081081081081,FALSE,NA,TRUE,TRUE,TRUE +27,TRT,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +28,TRT,Week 1,1,PASITSCO,21.7,36.1,-14.400000000000002,-0.3988919667590028,FALSE,NA,TRUE,TRUE,TRUE +28,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +28,TRT,Week 2,2,PASITSCO,14.3,36.1,-21.8,-0.6038781163434903,FALSE,NA,TRUE,TRUE,TRUE +28,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +28,TRT,Week 4,4,PASITSCO,8.4,36.1,-27.700000000000003,-0.7673130193905817,FALSE,NA,TRUE,TRUE,TRUE +28,TRT,Week 4,4,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +28,TRT,Week 6,6,PASITSCO,1.7,36.1,-34.4,-0.9529085872576176,FALSE,NA,TRUE,TRUE,TRUE +28,TRT,Week 6,6,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +28,TRT,Week 8,8,PASITSCO,0.8,36.1,-35.300000000000004,-0.9778393351800555,FALSE,NA,TRUE,TRUE,TRUE +28,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +28,TRT,Week 10,10,PASITSCO,-0,36.1,-36.1,-1,FALSE,NA,TRUE,TRUE,TRUE +28,TRT,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +28,TRT,Week 12,12,PASITSCO,0.4,36.1,-35.7,-0.9889196675900277,FALSE,NA,TRUE,TRUE,TRUE +28,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +29,PBO,Week 1,1,PASITSCO,14.3,14.1,0.20000000000000107,0.014184397163120643,FALSE,NA,TRUE,TRUE,TRUE +29,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +29,PBO,Week 2,2,PASITSCO,11.2,14.1,-2.9000000000000004,-0.20567375886524825,FALSE,NA,TRUE,TRUE,TRUE +29,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +29,PBO,Week 4,4,PASITSCO,12.3,14.1,-1.799999999999999,-0.12765957446808504,FALSE,NA,TRUE,TRUE,TRUE +29,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +29,PBO,Week 6,6,PASITSCO,35.2,14.1,21.1,1.49645390070922,FALSE,NA,TRUE,TRUE,TRUE +29,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +29,PBO,Week 8,8,PASITSCO,58.9,14.1,44.8,3.177304964539007,FALSE,NA,TRUE,TRUE,TRUE +29,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +29,PBO,Week 10,10,PASITSCO,48.6,14.1,34.5,2.4468085106382977,FALSE,NA,TRUE,TRUE,TRUE +29,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +29,PBO,Week 12,12,PASITSCO,32.9,14.1,18.799999999999997,1.3333333333333333,FALSE,NA,TRUE,TRUE,TRUE +29,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +30,PBO,Week 1,1,PASITSCO,27.6,16.5,11.100000000000001,0.6727272727272728,FALSE,NA,TRUE,TRUE,TRUE +30,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +30,PBO,Week 2,2,PASITSCO,37.4,16.5,20.9,1.2666666666666666,FALSE,NA,TRUE,TRUE,TRUE +30,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +30,PBO,Week 4,4,PASITSCO,36.2,16.5,19.700000000000003,1.193939393939394,FALSE,NA,TRUE,TRUE,TRUE +30,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +30,PBO,Week 6,6,PASITSCO,18.4,16.5,1.8999999999999986,0.11515151515151506,FALSE,NA,TRUE,TRUE,TRUE +30,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +30,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +30,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +30,PBO,Week 12,12,PASITSCO,11.4,16.5,-5.1,-0.3090909090909091,FALSE,NA,TRUE,TRUE,TRUE +30,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +31,TRT,Week 1,1,PASITSCO,10.3,17.5,-7.199999999999999,-0.41142857142857137,FALSE,NA,TRUE,TRUE,TRUE +31,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +31,TRT,Week 2,2,PASITSCO,5.2,17.5,-12.3,-0.7028571428571428,FALSE,NA,TRUE,TRUE,TRUE +31,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +31,TRT,Week 4,4,PASITSCO,3.5,17.5,-14,-0.8,FALSE,NA,TRUE,TRUE,TRUE +31,TRT,Week 4,4,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +31,TRT,Week 6,6,PASITSCO,8.5,17.5,-9,-0.5142857142857142,FALSE,NA,TRUE,TRUE,TRUE +31,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +31,TRT,Week 8,8,PASITSCO,3.6,17.5,-13.9,-0.7942857142857143,FALSE,NA,TRUE,TRUE,TRUE +31,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +31,TRT,Week 10,10,PASITSCO,1.9,17.5,-15.6,-0.8914285714285715,FALSE,NA,TRUE,TRUE,TRUE +31,TRT,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +31,TRT,Week 12,12,PASITSCO,4.5,17.5,-13,-0.7428571428571429,FALSE,NA,TRUE,TRUE,TRUE +31,TRT,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +32,TRT,Week 1,1,PASITSCO,24.8,30.2,-5.399999999999999,-0.17880794701986752,FALSE,NA,TRUE,TRUE,TRUE +32,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +32,TRT,Week 2,2,PASITSCO,21.3,30.2,-8.899999999999999,-0.29470198675496684,FALSE,NA,TRUE,TRUE,TRUE +32,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +32,TRT,Week 4,4,PASITSCO,9,30.2,-21.2,-0.7019867549668874,FALSE,NA,TRUE,TRUE,TRUE +32,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +32,TRT,Week 6,6,PASITSCO,7.6,30.2,-22.6,-0.7483443708609272,FALSE,NA,TRUE,TRUE,TRUE +32,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +32,TRT,Week 8,8,PASITSCO,4.9,30.2,-25.299999999999997,-0.8377483443708609,FALSE,NA,TRUE,TRUE,TRUE +32,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +32,TRT,Week 10,10,PASITSCO,3.9,30.2,-26.3,-0.8708609271523179,FALSE,NA,TRUE,TRUE,TRUE +32,TRT,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +32,TRT,Week 12,12,PASITSCO,7.7,30.2,-22.5,-0.7450331125827815,FALSE,NA,TRUE,TRUE,TRUE +32,TRT,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +33,PBO,Week 1,1,PASITSCO,8.7,15.5,-6.800000000000001,-0.4387096774193549,FALSE,NA,TRUE,TRUE,TRUE +33,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +33,PBO,Week 2,2,PASITSCO,9.5,15.5,-6,-0.3870967741935484,FALSE,NA,TRUE,TRUE,TRUE +33,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +33,PBO,Week 4,4,PASITSCO,5.2,15.5,-10.3,-0.6645161290322581,FALSE,NA,TRUE,TRUE,TRUE +33,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +33,PBO,Week 6,6,PASITSCO,8.2,15.5,-7.300000000000001,-0.4709677419354839,FALSE,NA,TRUE,TRUE,TRUE +33,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +33,PBO,Week 8,8,PASITSCO,7.2,15.5,-8.3,-0.535483870967742,FALSE,NA,TRUE,TRUE,TRUE +33,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +33,PBO,Week 10,10,PASITSCO,8,15.5,-7.5,-0.4838709677419355,FALSE,NA,TRUE,TRUE,TRUE +33,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +33,PBO,Week 12,12,PASITSCO,4.2,15.5,-11.3,-0.7290322580645162,FALSE,NA,TRUE,TRUE,TRUE +33,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +34,TRT,Week 1,1,PASITSCO,18.8,20.1,-1.3000000000000007,-0.06467661691542291,FALSE,NA,TRUE,TRUE,TRUE +34,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +34,TRT,Week 2,2,PASITSCO,14.5,20.1,-5.600000000000001,-0.2786069651741294,FALSE,NA,TRUE,TRUE,TRUE +34,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +34,TRT,Week 4,4,PASITSCO,9.3,20.1,-10.8,-0.5373134328358209,FALSE,NA,TRUE,TRUE,TRUE +34,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +34,TRT,Week 6,6,PASITSCO,8.8,20.1,-11.3,-0.5621890547263682,FALSE,NA,TRUE,TRUE,TRUE +34,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +34,TRT,Week 8,8,PASITSCO,4,20.1,-16.1,-0.8009950248756219,FALSE,NA,TRUE,TRUE,TRUE +34,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +34,TRT,Week 10,10,PASITSCO,3.2,20.1,-16.900000000000002,-0.8407960199004976,FALSE,NA,TRUE,TRUE,TRUE +34,TRT,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +34,TRT,Week 12,12,PASITSCO,2.6,20.1,-17.5,-0.8706467661691542,FALSE,NA,TRUE,TRUE,TRUE +34,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +35,TRT,Week 1,1,PASITSCO,13.6,19.3,-5.700000000000001,-0.2953367875647669,FALSE,NA,TRUE,TRUE,TRUE +35,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +35,TRT,Week 2,2,PASITSCO,11.8,19.3,-7.5,-0.38860103626943004,FALSE,NA,TRUE,TRUE,TRUE +35,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +35,TRT,Week 4,4,PASITSCO,5.5,19.3,-13.8,-0.7150259067357513,FALSE,NA,TRUE,TRUE,TRUE +35,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +35,TRT,Week 6,6,PASITSCO,2.1,19.3,-17.2,-0.8911917098445595,FALSE,NA,TRUE,TRUE,TRUE +35,TRT,Week 6,6,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +35,TRT,Week 8,8,PASITSCO,1.4,19.3,-17.900000000000002,-0.9274611398963731,FALSE,NA,TRUE,TRUE,TRUE +35,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +35,TRT,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +35,TRT,Week 12,12,PASITSCO,2.6,19.3,-16.7,-0.8652849740932642,FALSE,NA,TRUE,TRUE,TRUE +35,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +36,TRT,Week 1,1,PASITSCO,8.5,17.5,-9,-0.5142857142857142,FALSE,NA,TRUE,TRUE,TRUE +36,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +36,TRT,Week 2,2,PASITSCO,7,17.5,-10.5,-0.6,FALSE,NA,TRUE,TRUE,TRUE +36,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +36,TRT,Week 4,4,PASITSCO,7.5,17.5,-10,-0.5714285714285714,FALSE,NA,TRUE,TRUE,TRUE +36,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +36,TRT,Week 6,6,PASITSCO,4.4,17.5,-13.1,-0.7485714285714286,FALSE,NA,TRUE,TRUE,TRUE +36,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +36,TRT,Week 8,8,PASITSCO,4.7,17.5,-12.8,-0.7314285714285714,FALSE,NA,TRUE,TRUE,TRUE +36,TRT,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +36,TRT,Week 10,10,PASITSCO,2.8,17.5,-14.7,-0.84,FALSE,NA,TRUE,TRUE,TRUE +36,TRT,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +36,TRT,Week 12,12,PASITSCO,4.5,17.5,-13,-0.7428571428571429,FALSE,NA,TRUE,TRUE,TRUE +36,TRT,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +37,PBO,Week 1,1,PASITSCO,14.2,15.2,-1,-0.06578947368421052,FALSE,NA,TRUE,TRUE,TRUE +37,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +37,PBO,Week 2,2,PASITSCO,9.6,15.2,-5.6,-0.3684210526315789,FALSE,NA,TRUE,TRUE,TRUE +37,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +37,PBO,Week 4,4,PASITSCO,15.7,15.2,0.5,0.03289473684210526,FALSE,NA,TRUE,TRUE,TRUE +37,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +37,PBO,Week 6,6,PASITSCO,11,15.2,-4.199999999999999,-0.2763157894736842,FALSE,NA,TRUE,TRUE,TRUE +37,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +37,PBO,Week 8,8,PASITSCO,7.6,15.2,-7.6,-0.5,FALSE,NA,TRUE,TRUE,TRUE +37,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +37,PBO,Week 10,10,PASITSCO,5.2,15.2,-10,-0.6578947368421053,FALSE,NA,TRUE,TRUE,TRUE +37,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +37,PBO,Week 12,12,PASITSCO,7,15.2,-8.2,-0.5394736842105263,FALSE,NA,TRUE,TRUE,TRUE +37,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +38,TRT,Week 1,1,PASITSCO,17.5,23.3,-5.800000000000001,-0.24892703862660948,FALSE,NA,TRUE,TRUE,TRUE +38,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +38,TRT,Week 2,2,PASITSCO,11.3,23.3,-12,-0.5150214592274678,FALSE,NA,TRUE,TRUE,TRUE +38,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +38,TRT,Week 4,4,PASITSCO,7.4,23.3,-15.9,-0.6824034334763949,FALSE,NA,TRUE,TRUE,TRUE +38,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +38,TRT,Week 6,6,PASITSCO,3.1,23.3,-20.2,-0.8669527896995708,FALSE,NA,TRUE,TRUE,TRUE +38,TRT,Week 6,6,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +38,TRT,Week 8,8,PASITSCO,0.8,23.3,-22.5,-0.9656652360515021,FALSE,NA,TRUE,TRUE,TRUE +38,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +38,TRT,Week 10,10,PASITSCO,0.3,23.3,-23,-0.9871244635193133,FALSE,NA,TRUE,TRUE,TRUE +38,TRT,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +38,TRT,Week 12,12,PASITSCO,0.4,23.3,-22.900000000000002,-0.9828326180257512,FALSE,NA,TRUE,TRUE,TRUE +38,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +39,PBO,Week 1,1,PASITSCO,15.3,22.1,-6.800000000000001,-0.3076923076923077,FALSE,NA,TRUE,TRUE,TRUE +39,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +39,PBO,Week 2,2,PASITSCO,11.9,22.1,-10.200000000000001,-0.46153846153846156,FALSE,NA,TRUE,TRUE,TRUE +39,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +39,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +39,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +39,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +39,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +39,PBO,Week 12,12,PASITSCO,1.2,22.1,-20.900000000000002,-0.9457013574660634,FALSE,NA,TRUE,TRUE,TRUE +39,PBO,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +40,PBO,Week 1,1,PASITSCO,26.3,36.6,-10.3,-0.28142076502732244,FALSE,NA,TRUE,TRUE,TRUE +40,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +40,PBO,Week 2,2,PASITSCO,27.1,36.6,-9.5,-0.25956284153005466,FALSE,NA,TRUE,TRUE,TRUE +40,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +40,PBO,Week 4,4,PASITSCO,21.8,36.6,-14.8,-0.40437158469945356,FALSE,NA,TRUE,TRUE,TRUE +40,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +40,PBO,Week 6,6,PASITSCO,46.4,36.6,9.799999999999997,0.26775956284152996,FALSE,NA,TRUE,TRUE,TRUE +40,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +40,PBO,Week 8,8,PASITSCO,38.8,36.6,2.1999999999999957,0.06010928961748622,FALSE,NA,TRUE,TRUE,TRUE +40,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +40,PBO,Week 10,10,PASITSCO,33.3,36.6,-3.3000000000000043,-0.09016393442622962,FALSE,NA,TRUE,TRUE,TRUE +40,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +40,PBO,Week 12,12,PASITSCO,37.8,36.6,1.1999999999999957,0.03278688524590152,FALSE,NA,TRUE,TRUE,TRUE +40,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +41,TRT,Week 1,1,PASITSCO,16.3,17.9,-1.5999999999999979,-0.08938547486033509,FALSE,NA,TRUE,TRUE,TRUE +41,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +41,TRT,Week 2,2,PASITSCO,11.7,17.9,-6.199999999999999,-0.34636871508379885,FALSE,NA,TRUE,TRUE,TRUE +41,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +41,TRT,Week 4,4,PASITSCO,6.3,17.9,-11.599999999999998,-0.6480446927374302,FALSE,NA,TRUE,TRUE,TRUE +41,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +41,TRT,Week 6,6,PASITSCO,5.2,17.9,-12.7,-0.7094972067039106,FALSE,NA,TRUE,TRUE,TRUE +41,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +41,TRT,Week 8,8,PASITSCO,2.6,17.9,-15.299999999999999,-0.8547486033519553,FALSE,NA,TRUE,TRUE,TRUE +41,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +41,TRT,Week 10,10,PASITSCO,4.7,17.9,-13.2,-0.7374301675977654,FALSE,NA,TRUE,TRUE,TRUE +41,TRT,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +41,TRT,Week 12,12,PASITSCO,3.7,17.9,-14.2,-0.7932960893854749,FALSE,NA,TRUE,TRUE,TRUE +41,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +42,TRT,Week 1,1,PASITSCO,25.6,32.7,-7.100000000000001,-0.21712538226299696,FALSE,NA,TRUE,TRUE,TRUE +42,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +42,TRT,Week 2,2,PASITSCO,16.6,32.7,-16.1,-0.4923547400611621,FALSE,NA,TRUE,TRUE,TRUE +42,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +42,TRT,Week 4,4,PASITSCO,7.8,32.7,-24.900000000000002,-0.7614678899082569,FALSE,NA,TRUE,TRUE,TRUE +42,TRT,Week 4,4,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +42,TRT,Week 6,6,PASITSCO,14.4,32.7,-18.300000000000004,-0.5596330275229359,FALSE,NA,TRUE,TRUE,TRUE +42,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +42,TRT,Week 8,8,PASITSCO,6.4,32.7,-26.300000000000004,-0.8042813455657493,FALSE,NA,TRUE,TRUE,TRUE +42,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +42,TRT,Week 10,10,PASITSCO,4.7,32.7,-28.000000000000004,-0.8562691131498471,FALSE,NA,TRUE,TRUE,TRUE +42,TRT,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +42,TRT,Week 12,12,PASITSCO,7.3,32.7,-25.400000000000002,-0.7767584097859327,FALSE,NA,TRUE,TRUE,TRUE +42,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +43,TRT,Week 1,1,PASITSCO,9.2,16.6,-7.400000000000002,-0.4457831325301206,FALSE,NA,TRUE,TRUE,TRUE +43,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +43,TRT,Week 2,2,PASITSCO,5.2,16.6,-11.400000000000002,-0.6867469879518073,FALSE,NA,TRUE,TRUE,TRUE +43,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +43,TRT,Week 4,4,PASITSCO,2.8,16.6,-13.8,-0.8313253012048193,FALSE,NA,TRUE,TRUE,TRUE +43,TRT,Week 4,4,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +43,TRT,Week 6,6,PASITSCO,1.8,16.6,-14.8,-0.891566265060241,FALSE,NA,TRUE,TRUE,TRUE +43,TRT,Week 6,6,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +43,TRT,Week 8,8,PASITSCO,1.3,16.6,-15.3,-0.9216867469879517,FALSE,NA,TRUE,TRUE,TRUE +43,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +43,TRT,Week 10,10,PASITSCO,0.9,16.6,-15.700000000000001,-0.9457831325301205,FALSE,NA,TRUE,TRUE,TRUE +43,TRT,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +43,TRT,Week 12,12,PASITSCO,3.5,16.6,-13.100000000000001,-0.7891566265060241,FALSE,NA,TRUE,TRUE,TRUE +43,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +44,PBO,Week 1,1,PASITSCO,11.1,12.5,-1.4000000000000004,-0.11200000000000003,FALSE,NA,TRUE,TRUE,TRUE +44,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +44,PBO,Week 2,2,PASITSCO,8.1,12.5,-4.4,-0.35200000000000004,FALSE,NA,TRUE,TRUE,TRUE +44,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +44,PBO,Week 4,4,PASITSCO,6.4,12.5,-6.1,-0.488,FALSE,NA,TRUE,TRUE,TRUE +44,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +44,PBO,Week 6,6,PASITSCO,7.1,12.5,-5.4,-0.43200000000000005,FALSE,NA,TRUE,TRUE,TRUE +44,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +44,PBO,Week 8,8,PASITSCO,8,12.5,-4.5,-0.36,FALSE,NA,TRUE,TRUE,TRUE +44,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +44,PBO,Week 10,10,PASITSCO,7.3,12.5,-5.2,-0.41600000000000004,FALSE,NA,TRUE,TRUE,TRUE +44,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +44,PBO,Week 12,12,PASITSCO,5.5,12.5,-7,-0.56,FALSE,NA,TRUE,TRUE,TRUE +44,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +45,TRT,Week 1,1,PASITSCO,22.7,37,-14.3,-0.3864864864864865,FALSE,NA,TRUE,TRUE,TRUE +45,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +45,TRT,Week 2,2,PASITSCO,9.2,37,-27.8,-0.7513513513513513,FALSE,NA,TRUE,TRUE,TRUE +45,TRT,Week 2,2,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +45,TRT,Week 4,4,PASITSCO,5.9,37,-31.1,-0.8405405405405406,FALSE,NA,TRUE,TRUE,TRUE +45,TRT,Week 4,4,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +45,TRT,Week 6,6,PASITSCO,4.1,37,-32.9,-0.8891891891891891,FALSE,NA,TRUE,TRUE,TRUE +45,TRT,Week 6,6,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +45,TRT,Week 8,8,PASITSCO,5.8,37,-31.2,-0.8432432432432432,FALSE,NA,TRUE,TRUE,TRUE +45,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +45,TRT,Week 10,10,PASITSCO,3.4,37,-33.6,-0.9081081081081082,FALSE,NA,TRUE,TRUE,TRUE +45,TRT,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +45,TRT,Week 12,12,PASITSCO,9.5,37,-27.5,-0.7432432432432432,FALSE,NA,TRUE,TRUE,TRUE +45,TRT,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +46,PBO,Week 1,1,PASITSCO,30.8,19,11.8,0.6210526315789474,FALSE,NA,TRUE,TRUE,TRUE +46,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +46,PBO,Week 2,2,PASITSCO,34.1,19,15.100000000000001,0.7947368421052632,FALSE,NA,TRUE,TRUE,TRUE +46,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +46,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +46,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +46,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +46,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +46,PBO,Week 12,12,PASITSCO,5.2,19,-13.8,-0.7263157894736842,FALSE,NA,TRUE,TRUE,TRUE +46,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +47,TRT,Week 1,1,PASITSCO,12.1,18.5,-6.4,-0.34594594594594597,FALSE,NA,TRUE,TRUE,TRUE +47,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +47,TRT,Week 2,2,PASITSCO,6.5,18.5,-12,-0.6486486486486487,FALSE,NA,TRUE,TRUE,TRUE +47,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +47,TRT,Week 4,4,PASITSCO,2.8,18.5,-15.7,-0.8486486486486486,FALSE,NA,TRUE,TRUE,TRUE +47,TRT,Week 4,4,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +47,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +47,TRT,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +47,TRT,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +47,TRT,Week 12,12,PASITSCO,-0.2,18.5,-18.7,-1.0108108108108107,FALSE,NA,TRUE,TRUE,TRUE +47,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +48,TRT,Week 1,1,PASITSCO,7.2,10.3,-3.1000000000000005,-0.3009708737864078,FALSE,NA,TRUE,TRUE,TRUE +48,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +48,TRT,Week 2,2,PASITSCO,4.6,10.3,-5.700000000000001,-0.5533980582524273,FALSE,NA,TRUE,TRUE,TRUE +48,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +48,TRT,Week 4,4,PASITSCO,5,10.3,-5.300000000000001,-0.5145631067961165,FALSE,NA,TRUE,TRUE,TRUE +48,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +48,TRT,Week 6,6,PASITSCO,4.4,10.3,-5.9,-0.5728155339805825,FALSE,NA,TRUE,TRUE,TRUE +48,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +48,TRT,Week 8,8,PASITSCO,7,10.3,-3.3000000000000007,-0.32038834951456313,FALSE,NA,TRUE,TRUE,TRUE +48,TRT,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +48,TRT,Week 10,10,PASITSCO,2.6,10.3,-7.700000000000001,-0.7475728155339806,FALSE,NA,TRUE,TRUE,TRUE +48,TRT,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +48,TRT,Week 12,12,PASITSCO,3.1,10.3,-7.200000000000001,-0.6990291262135923,FALSE,NA,TRUE,TRUE,TRUE +48,TRT,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +49,PBO,Week 1,1,PASITSCO,16.7,14.3,2.3999999999999986,0.16783216783216773,FALSE,NA,TRUE,TRUE,TRUE +49,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +49,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +49,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +49,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +49,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +49,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +49,PBO,Week 12,12,PASITSCO,7.5,14.3,-6.800000000000001,-0.4755244755244756,FALSE,NA,TRUE,TRUE,TRUE +49,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +50,TRT,Week 1,1,PASITSCO,11.7,23.2,-11.5,-0.4956896551724138,FALSE,NA,TRUE,TRUE,TRUE +50,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +50,TRT,Week 2,2,PASITSCO,6.1,23.2,-17.1,-0.7370689655172414,FALSE,NA,TRUE,TRUE,TRUE +50,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +50,TRT,Week 4,4,PASITSCO,7.1,23.2,-16.1,-0.6939655172413794,FALSE,NA,TRUE,TRUE,TRUE +50,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +50,TRT,Week 6,6,PASITSCO,1.8,23.2,-21.4,-0.9224137931034483,FALSE,NA,TRUE,TRUE,TRUE +50,TRT,Week 6,6,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +50,TRT,Week 8,8,PASITSCO,5.7,23.2,-17.5,-0.7543103448275862,FALSE,NA,TRUE,TRUE,TRUE +50,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +50,TRT,Week 10,10,PASITSCO,3.9,23.2,-19.3,-0.831896551724138,FALSE,NA,TRUE,TRUE,TRUE +50,TRT,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +50,TRT,Week 12,12,PASITSCO,5.2,23.2,-18,-0.7758620689655172,FALSE,NA,TRUE,TRUE,TRUE +50,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +51,TRT,Week 1,1,PASITSCO,11.7,18.1,-6.400000000000002,-0.35359116022099457,FALSE,NA,TRUE,TRUE,TRUE +51,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +51,TRT,Week 2,2,PASITSCO,8.8,18.1,-9.3,-0.5138121546961326,FALSE,NA,TRUE,TRUE,TRUE +51,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +51,TRT,Week 4,4,PASITSCO,6.3,18.1,-11.8,-0.6519337016574586,FALSE,NA,TRUE,TRUE,TRUE +51,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +51,TRT,Week 6,6,PASITSCO,6.4,18.1,-11.700000000000001,-0.6464088397790055,FALSE,NA,TRUE,TRUE,TRUE +51,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +51,TRT,Week 8,8,PASITSCO,4.8,18.1,-13.3,-0.7348066298342542,FALSE,NA,TRUE,TRUE,TRUE +51,TRT,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +51,TRT,Week 10,10,PASITSCO,2.6,18.1,-15.500000000000002,-0.856353591160221,FALSE,NA,TRUE,TRUE,TRUE +51,TRT,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +51,TRT,Week 12,12,PASITSCO,4.8,18.1,-13.3,-0.7348066298342542,FALSE,NA,TRUE,TRUE,TRUE +51,TRT,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +52,PBO,Week 1,1,PASITSCO,11.4,14.2,-2.799999999999999,-0.19718309859154923,FALSE,NA,TRUE,TRUE,TRUE +52,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +52,PBO,Week 2,2,PASITSCO,12.1,14.2,-2.0999999999999996,-0.14788732394366194,FALSE,NA,TRUE,TRUE,TRUE +52,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +52,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +52,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +52,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +52,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +52,PBO,Week 12,12,PASITSCO,10.9,14.2,-3.299999999999999,-0.23239436619718304,FALSE,NA,TRUE,TRUE,TRUE +52,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +53,TRT,Week 1,1,PASITSCO,14.6,15.9,-1.3000000000000007,-0.08176100628930821,FALSE,NA,TRUE,TRUE,TRUE +53,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +53,TRT,Week 2,2,PASITSCO,12.7,15.9,-3.200000000000001,-0.2012578616352202,FALSE,NA,TRUE,TRUE,TRUE +53,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +53,TRT,Week 4,4,PASITSCO,5.2,15.9,-10.7,-0.6729559748427673,FALSE,NA,TRUE,TRUE,TRUE +53,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +53,TRT,Week 6,6,PASITSCO,2.1,15.9,-13.8,-0.8679245283018868,FALSE,NA,TRUE,TRUE,TRUE +53,TRT,Week 6,6,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +53,TRT,Week 8,8,PASITSCO,-0.2,15.9,-16.1,-1.0125786163522013,FALSE,NA,TRUE,TRUE,TRUE +53,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +53,TRT,Week 10,10,PASITSCO,-0.6,15.9,-16.5,-1.0377358490566038,FALSE,NA,TRUE,TRUE,TRUE +53,TRT,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +53,TRT,Week 12,12,PASITSCO,-0.4,15.9,-16.3,-1.0251572327044025,FALSE,NA,TRUE,TRUE,TRUE +53,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +54,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +54,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +54,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +54,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +54,TRT,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +54,TRT,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +54,TRT,Week 12,12,PASITSCO,1,27.2,-26.2,-0.9632352941176471,FALSE,NA,TRUE,TRUE,TRUE +54,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +55,PBO,Week 1,1,PASITSCO,15.3,15.8,-0.5,-0.03164556962025316,FALSE,NA,TRUE,TRUE,TRUE +55,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +55,PBO,Week 2,2,PASITSCO,17.5,15.8,1.6999999999999993,0.10759493670886071,FALSE,NA,TRUE,TRUE,TRUE +55,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +55,PBO,Week 4,4,PASITSCO,7.7,15.8,-8.100000000000001,-0.5126582278481013,FALSE,NA,TRUE,TRUE,TRUE +55,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +55,PBO,Week 6,6,PASITSCO,11.6,15.8,-4.200000000000001,-0.2658227848101266,FALSE,NA,TRUE,TRUE,TRUE +55,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +55,PBO,Week 8,8,PASITSCO,7.9,15.8,-7.9,-0.5,FALSE,NA,TRUE,TRUE,TRUE +55,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +55,PBO,Week 10,10,PASITSCO,10.1,15.8,-5.700000000000001,-0.3607594936708861,FALSE,NA,TRUE,TRUE,TRUE +55,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +55,PBO,Week 12,12,PASITSCO,4.3,15.8,-11.5,-0.7278481012658228,FALSE,NA,TRUE,TRUE,TRUE +55,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +56,PBO,Week 1,1,PASITSCO,40.6,39.8,0.8000000000000043,0.020100502512562922,FALSE,NA,TRUE,TRUE,TRUE +56,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +56,PBO,Week 2,2,PASITSCO,40.9,39.8,1.1000000000000014,0.027638190954773906,FALSE,NA,TRUE,TRUE,TRUE +56,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +56,PBO,Week 4,4,PASITSCO,24.5,39.8,-15.299999999999997,-0.38442211055276376,FALSE,NA,TRUE,TRUE,TRUE +56,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +56,PBO,Week 6,6,PASITSCO,15.9,39.8,-23.9,-0.6005025125628141,FALSE,NA,TRUE,TRUE,TRUE +56,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +56,PBO,Week 8,8,PASITSCO,7.1,39.8,-32.699999999999996,-0.821608040201005,FALSE,NA,TRUE,TRUE,TRUE +56,PBO,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +56,PBO,Week 10,10,PASITSCO,3.3,39.8,-36.5,-0.9170854271356784,FALSE,NA,TRUE,TRUE,TRUE +56,PBO,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +56,PBO,Week 12,12,PASITSCO,4.6,39.8,-35.199999999999996,-0.8844221105527638,FALSE,NA,TRUE,TRUE,TRUE +56,PBO,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +57,TRT,Week 1,1,PASITSCO,15.3,17.5,-2.1999999999999993,-0.12571428571428567,FALSE,NA,TRUE,TRUE,TRUE +57,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +57,TRT,Week 2,2,PASITSCO,9.6,17.5,-7.9,-0.45142857142857146,FALSE,NA,TRUE,TRUE,TRUE +57,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +57,TRT,Week 4,4,PASITSCO,3.2,17.5,-14.3,-0.8171428571428572,FALSE,NA,TRUE,TRUE,TRUE +57,TRT,Week 4,4,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +57,TRT,Week 6,6,PASITSCO,5.1,17.5,-12.4,-0.7085714285714286,FALSE,NA,TRUE,TRUE,TRUE +57,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +57,TRT,Week 8,8,PASITSCO,2.8,17.5,-14.7,-0.84,FALSE,NA,TRUE,TRUE,TRUE +57,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +57,TRT,Week 10,10,PASITSCO,4.7,17.5,-12.8,-0.7314285714285714,FALSE,NA,TRUE,TRUE,TRUE +57,TRT,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +57,TRT,Week 12,12,PASITSCO,4.5,17.5,-13,-0.7428571428571429,FALSE,NA,TRUE,TRUE,TRUE +57,TRT,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +58,TRT,Week 1,1,PASITSCO,9.4,23.7,-14.299999999999999,-0.6033755274261603,FALSE,NA,TRUE,TRUE,TRUE +58,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +58,TRT,Week 2,2,PASITSCO,4.1,23.7,-19.6,-0.8270042194092828,FALSE,NA,TRUE,TRUE,TRUE +58,TRT,Week 2,2,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +58,TRT,Week 4,4,PASITSCO,2.4,23.7,-21.3,-0.8987341772151899,FALSE,NA,TRUE,TRUE,TRUE +58,TRT,Week 4,4,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +58,TRT,Week 6,6,PASITSCO,-0,23.7,-23.7,-1,FALSE,NA,TRUE,TRUE,TRUE +58,TRT,Week 6,6,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +58,TRT,Week 8,8,PASITSCO,0.3,23.7,-23.4,-0.9873417721518987,FALSE,NA,TRUE,TRUE,TRUE +58,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +58,TRT,Week 10,10,PASITSCO,-0.1,23.7,-23.8,-1.0042194092827006,FALSE,NA,TRUE,TRUE,TRUE +58,TRT,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +58,TRT,Week 12,12,PASITSCO,0.3,23.7,-23.4,-0.9873417721518987,FALSE,NA,TRUE,TRUE,TRUE +58,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +59,PBO,Week 1,1,PASITSCO,29.7,28.1,1.5999999999999979,0.05693950177935935,FALSE,NA,TRUE,TRUE,TRUE +59,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +59,PBO,Week 2,2,PASITSCO,32.5,28.1,4.399999999999999,0.15658362989323837,FALSE,NA,TRUE,TRUE,TRUE +59,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +59,PBO,Week 4,4,PASITSCO,26.4,28.1,-1.7000000000000028,-0.06049822064056949,FALSE,NA,TRUE,TRUE,TRUE +59,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +59,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +59,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +59,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +59,PBO,Week 12,12,PASITSCO,37.7,28.1,9.600000000000001,0.3416370106761566,FALSE,NA,TRUE,TRUE,TRUE +59,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +60,TRT,Week 1,1,PASITSCO,15.2,20.6,-5.400000000000002,-0.2621359223300972,FALSE,NA,TRUE,TRUE,TRUE +60,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +60,TRT,Week 2,2,PASITSCO,17.5,20.6,-3.1000000000000014,-0.15048543689320396,FALSE,NA,TRUE,TRUE,TRUE +60,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +60,TRT,Week 4,4,PASITSCO,8.7,20.6,-11.900000000000002,-0.5776699029126214,FALSE,NA,TRUE,TRUE,TRUE +60,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +60,TRT,Week 6,6,PASITSCO,8.9,20.6,-11.700000000000001,-0.5679611650485437,FALSE,NA,TRUE,TRUE,TRUE +60,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +60,TRT,Week 8,8,PASITSCO,6.5,20.6,-14.100000000000001,-0.6844660194174758,FALSE,NA,TRUE,TRUE,TRUE +60,TRT,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +60,TRT,Week 10,10,PASITSCO,8.1,20.6,-12.500000000000002,-0.6067961165048544,FALSE,NA,TRUE,TRUE,TRUE +60,TRT,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +60,TRT,Week 12,12,PASITSCO,12.3,20.6,-8.3,-0.4029126213592233,FALSE,NA,TRUE,TRUE,TRUE +60,TRT,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +61,TRT,Week 1,1,PASITSCO,19.2,24.2,-5,-0.2066115702479339,FALSE,NA,TRUE,TRUE,TRUE +61,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +61,TRT,Week 2,2,PASITSCO,11.1,24.2,-13.1,-0.5413223140495868,FALSE,NA,TRUE,TRUE,TRUE +61,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +61,TRT,Week 4,4,PASITSCO,13.8,24.2,-10.399999999999999,-0.42975206611570244,FALSE,NA,TRUE,TRUE,TRUE +61,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +61,TRT,Week 6,6,PASITSCO,10.1,24.2,-14.1,-0.5826446280991736,FALSE,NA,TRUE,TRUE,TRUE +61,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +61,TRT,Week 8,8,PASITSCO,4.4,24.2,-19.799999999999997,-0.8181818181818181,FALSE,NA,TRUE,TRUE,TRUE +61,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +61,TRT,Week 10,10,PASITSCO,4.8,24.2,-19.4,-0.8016528925619835,FALSE,NA,TRUE,TRUE,TRUE +61,TRT,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +61,TRT,Week 12,12,PASITSCO,3,24.2,-21.2,-0.8760330578512396,FALSE,NA,TRUE,TRUE,TRUE +61,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +62,TRT,Week 1,1,PASITSCO,16.3,12.5,3.8000000000000007,0.30400000000000005,FALSE,NA,TRUE,TRUE,TRUE +62,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +62,TRT,Week 2,2,PASITSCO,14.3,12.5,1.8000000000000007,0.14400000000000004,FALSE,NA,TRUE,TRUE,TRUE +62,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +62,TRT,Week 4,4,PASITSCO,4.7,12.5,-7.8,-0.624,FALSE,NA,TRUE,TRUE,TRUE +62,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +62,TRT,Week 6,6,PASITSCO,1.5,12.5,-11,-0.88,FALSE,NA,TRUE,TRUE,TRUE +62,TRT,Week 6,6,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +62,TRT,Week 8,8,PASITSCO,1.2,12.5,-11.3,-0.904,FALSE,NA,TRUE,TRUE,TRUE +62,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +62,TRT,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +62,TRT,Week 12,12,PASITSCO,2,12.5,-10.5,-0.84,FALSE,NA,TRUE,TRUE,TRUE +62,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +63,PBO,Week 1,1,PASITSCO,21.3,26,-4.699999999999999,-0.18076923076923074,FALSE,NA,TRUE,TRUE,TRUE +63,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +63,PBO,Week 2,2,PASITSCO,19.2,26,-6.800000000000001,-0.26153846153846155,FALSE,NA,TRUE,TRUE,TRUE +63,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +63,PBO,Week 4,4,PASITSCO,14.2,26,-11.8,-0.4538461538461539,FALSE,NA,TRUE,TRUE,TRUE +63,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +63,PBO,Week 6,6,PASITSCO,13.4,26,-12.6,-0.4846153846153846,FALSE,NA,TRUE,TRUE,TRUE +63,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +63,PBO,Week 8,8,PASITSCO,23.8,26,-2.1999999999999993,-0.08461538461538459,FALSE,NA,TRUE,TRUE,TRUE +63,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +63,PBO,Week 10,10,PASITSCO,10.5,26,-15.5,-0.5961538461538461,FALSE,NA,TRUE,TRUE,TRUE +63,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +63,PBO,Week 12,12,PASITSCO,11.5,26,-14.5,-0.5576923076923077,FALSE,NA,TRUE,TRUE,TRUE +63,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +64,TRT,Week 1,1,PASITSCO,15,23.9,-8.899999999999999,-0.3723849372384937,FALSE,NA,TRUE,TRUE,TRUE +64,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +64,TRT,Week 2,2,PASITSCO,12.5,23.9,-11.399999999999999,-0.47698744769874474,FALSE,NA,TRUE,TRUE,TRUE +64,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +64,TRT,Week 4,4,PASITSCO,7.9,23.9,-15.999999999999998,-0.6694560669456067,FALSE,NA,TRUE,TRUE,TRUE +64,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +64,TRT,Week 6,6,PASITSCO,7,23.9,-16.9,-0.7071129707112971,FALSE,NA,TRUE,TRUE,TRUE +64,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +64,TRT,Week 8,8,PASITSCO,6.8,23.9,-17.099999999999998,-0.7154811715481171,FALSE,NA,TRUE,TRUE,TRUE +64,TRT,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +64,TRT,Week 10,10,PASITSCO,7.5,23.9,-16.4,-0.6861924686192469,FALSE,NA,TRUE,TRUE,TRUE +64,TRT,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +64,TRT,Week 12,12,PASITSCO,8.4,23.9,-15.499999999999998,-0.6485355648535565,FALSE,NA,TRUE,TRUE,TRUE +64,TRT,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +65,TRT,Week 1,1,PASITSCO,17.4,21.6,-4.200000000000003,-0.19444444444444456,FALSE,NA,TRUE,TRUE,TRUE +65,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +65,TRT,Week 2,2,PASITSCO,11.8,21.6,-9.8,-0.4537037037037037,FALSE,NA,TRUE,TRUE,TRUE +65,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +65,TRT,Week 4,4,PASITSCO,9.6,21.6,-12.000000000000002,-0.5555555555555556,FALSE,NA,TRUE,TRUE,TRUE +65,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +65,TRT,Week 6,6,PASITSCO,6.5,21.6,-15.100000000000001,-0.6990740740740741,FALSE,NA,TRUE,TRUE,TRUE +65,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +65,TRT,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +65,TRT,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +65,TRT,Week 12,12,PASITSCO,4,21.6,-17.6,-0.8148148148148149,FALSE,NA,TRUE,TRUE,TRUE +65,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +66,PBO,Week 1,1,PASITSCO,14.4,15.6,-1.1999999999999993,-0.07692307692307689,FALSE,NA,TRUE,TRUE,TRUE +66,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +66,PBO,Week 2,2,PASITSCO,18.9,15.6,3.299999999999999,0.21153846153846148,FALSE,NA,TRUE,TRUE,TRUE +66,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +66,PBO,Week 4,4,PASITSCO,16.5,15.6,0.9000000000000004,0.057692307692307716,FALSE,NA,TRUE,TRUE,TRUE +66,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +66,PBO,Week 6,6,PASITSCO,21.2,15.6,5.6,0.358974358974359,FALSE,NA,TRUE,TRUE,TRUE +66,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +66,PBO,Week 8,8,PASITSCO,16.3,15.6,0.7000000000000011,0.04487179487179494,FALSE,NA,TRUE,TRUE,TRUE +66,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +66,PBO,Week 10,10,PASITSCO,16.1,15.6,0.5000000000000018,0.032051282051282166,FALSE,NA,TRUE,TRUE,TRUE +66,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +66,PBO,Week 12,12,PASITSCO,7.7,15.6,-7.8999999999999995,-0.5064102564102564,FALSE,NA,TRUE,TRUE,TRUE +66,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +67,TRT,Week 1,1,PASITSCO,21.1,26.6,-5.5,-0.20676691729323307,FALSE,NA,TRUE,TRUE,TRUE +67,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +67,TRT,Week 2,2,PASITSCO,13.4,26.6,-13.200000000000001,-0.4962406015037594,FALSE,NA,TRUE,TRUE,TRUE +67,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +67,TRT,Week 4,4,PASITSCO,10.9,26.6,-15.700000000000001,-0.5902255639097744,FALSE,NA,TRUE,TRUE,TRUE +67,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +67,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +67,TRT,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +67,TRT,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +67,TRT,Week 12,12,PASITSCO,4.3,26.6,-22.3,-0.8383458646616542,FALSE,NA,TRUE,TRUE,TRUE +67,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +68,PBO,Week 1,1,PASITSCO,23.5,25.1,-1.6000000000000014,-0.06374501992031878,FALSE,NA,TRUE,TRUE,TRUE +68,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +68,PBO,Week 2,2,PASITSCO,20.8,25.1,-4.300000000000001,-0.1713147410358566,FALSE,NA,TRUE,TRUE,TRUE +68,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +68,PBO,Week 4,4,PASITSCO,8.5,25.1,-16.6,-0.6613545816733067,FALSE,NA,TRUE,TRUE,TRUE +68,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +68,PBO,Week 6,6,PASITSCO,12.3,25.1,-12.8,-0.5099601593625498,FALSE,NA,TRUE,TRUE,TRUE +68,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +68,PBO,Week 8,8,PASITSCO,8.8,25.1,-16.3,-0.649402390438247,FALSE,NA,TRUE,TRUE,TRUE +68,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +68,PBO,Week 10,10,PASITSCO,8.7,25.1,-16.400000000000002,-0.653386454183267,FALSE,NA,TRUE,TRUE,TRUE +68,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +68,PBO,Week 12,12,PASITSCO,4.2,25.1,-20.900000000000002,-0.8326693227091634,FALSE,NA,TRUE,TRUE,TRUE +68,PBO,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +69,TRT,Week 1,1,PASITSCO,15.2,29.1,-13.900000000000002,-0.47766323024054985,FALSE,NA,TRUE,TRUE,TRUE +69,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +69,TRT,Week 2,2,PASITSCO,13.6,29.1,-15.500000000000002,-0.5326460481099656,FALSE,NA,TRUE,TRUE,TRUE +69,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +69,TRT,Week 4,4,PASITSCO,6.5,29.1,-22.6,-0.7766323024054983,FALSE,NA,TRUE,TRUE,TRUE +69,TRT,Week 4,4,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +69,TRT,Week 6,6,PASITSCO,5.9,29.1,-23.200000000000003,-0.7972508591065293,FALSE,NA,TRUE,TRUE,TRUE +69,TRT,Week 6,6,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +69,TRT,Week 8,8,PASITSCO,5.7,29.1,-23.400000000000002,-0.8041237113402062,FALSE,NA,TRUE,TRUE,TRUE +69,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +69,TRT,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +69,TRT,Week 12,12,PASITSCO,3.8,29.1,-25.3,-0.8694158075601375,FALSE,NA,TRUE,TRUE,TRUE +69,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +70,TRT,Week 1,1,PASITSCO,17.4,19.8,-2.400000000000002,-0.12121212121212131,FALSE,NA,TRUE,TRUE,TRUE +70,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +70,TRT,Week 2,2,PASITSCO,11.9,19.8,-7.9,-0.398989898989899,FALSE,NA,TRUE,TRUE,TRUE +70,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +70,TRT,Week 4,4,PASITSCO,10.8,19.8,-9,-0.45454545454545453,FALSE,NA,TRUE,TRUE,TRUE +70,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +70,TRT,Week 6,6,PASITSCO,4,19.8,-15.8,-0.797979797979798,FALSE,NA,TRUE,TRUE,TRUE +70,TRT,Week 6,6,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +70,TRT,Week 8,8,PASITSCO,4.9,19.8,-14.9,-0.7525252525252525,FALSE,NA,TRUE,TRUE,TRUE +70,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +70,TRT,Week 10,10,PASITSCO,4.3,19.8,-15.5,-0.7828282828282828,FALSE,NA,TRUE,TRUE,TRUE +70,TRT,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +70,TRT,Week 12,12,PASITSCO,2.9,19.8,-16.900000000000002,-0.8535353535353536,FALSE,NA,TRUE,TRUE,TRUE +70,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +71,TRT,Week 1,1,PASITSCO,7.3,11.2,-3.8999999999999995,-0.3482142857142857,FALSE,NA,TRUE,TRUE,TRUE +71,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +71,TRT,Week 2,2,PASITSCO,3.9,11.2,-7.299999999999999,-0.6517857142857142,FALSE,NA,TRUE,TRUE,TRUE +71,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +71,TRT,Week 4,4,PASITSCO,2.4,11.2,-8.799999999999999,-0.7857142857142857,FALSE,NA,TRUE,TRUE,TRUE +71,TRT,Week 4,4,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +71,TRT,Week 6,6,PASITSCO,2.8,11.2,-8.399999999999999,-0.7499999999999999,FALSE,NA,TRUE,TRUE,TRUE +71,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +71,TRT,Week 8,8,PASITSCO,6.5,11.2,-4.699999999999999,-0.4196428571428571,FALSE,NA,TRUE,TRUE,TRUE +71,TRT,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +71,TRT,Week 10,10,PASITSCO,4.5,11.2,-6.699999999999999,-0.5982142857142857,FALSE,NA,TRUE,TRUE,TRUE +71,TRT,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +71,TRT,Week 12,12,PASITSCO,9.6,11.2,-1.5999999999999996,-0.14285714285714282,FALSE,NA,TRUE,TRUE,TRUE +71,TRT,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +72,PBO,Week 1,1,PASITSCO,13.3,14.7,-1.3999999999999986,-0.09523809523809515,FALSE,NA,TRUE,TRUE,TRUE +72,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +72,PBO,Week 2,2,PASITSCO,11.7,14.7,-3,-0.20408163265306123,FALSE,NA,TRUE,TRUE,TRUE +72,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +72,PBO,Week 4,4,PASITSCO,7.6,14.7,-7.1,-0.48299319727891155,FALSE,NA,TRUE,TRUE,TRUE +72,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +72,PBO,Week 6,6,PASITSCO,24,14.7,9.3,0.6326530612244898,FALSE,NA,TRUE,TRUE,TRUE +72,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +72,PBO,Week 8,8,PASITSCO,20.6,14.7,5.900000000000002,0.40136054421768724,FALSE,NA,TRUE,TRUE,TRUE +72,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +72,PBO,Week 10,10,PASITSCO,26.3,14.7,11.600000000000001,0.7891156462585035,FALSE,NA,TRUE,TRUE,TRUE +72,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +72,PBO,Week 12,12,PASITSCO,29.6,14.7,14.900000000000002,1.013605442176871,FALSE,NA,TRUE,TRUE,TRUE +72,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +73,PBO,Week 1,1,PASITSCO,26.3,24.4,1.9000000000000021,0.07786885245901648,FALSE,NA,TRUE,TRUE,TRUE +73,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +73,PBO,Week 2,2,PASITSCO,16.8,24.4,-7.599999999999998,-0.31147540983606553,FALSE,NA,TRUE,TRUE,TRUE +73,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +73,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +73,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +73,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +73,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +73,PBO,Week 12,12,PASITSCO,5.2,24.4,-19.2,-0.7868852459016393,FALSE,NA,TRUE,TRUE,TRUE +73,PBO,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +74,TRT,Week 1,1,PASITSCO,16.3,20,-3.6999999999999993,-0.18499999999999997,FALSE,NA,TRUE,TRUE,TRUE +74,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +74,TRT,Week 2,2,PASITSCO,15.6,20,-4.4,-0.22000000000000003,FALSE,NA,TRUE,TRUE,TRUE +74,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +74,TRT,Week 4,4,PASITSCO,4.2,20,-15.8,-0.79,FALSE,NA,TRUE,TRUE,TRUE +74,TRT,Week 4,4,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +74,TRT,Week 6,6,PASITSCO,0.8,20,-19.2,-0.96,FALSE,NA,TRUE,TRUE,TRUE +74,TRT,Week 6,6,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +74,TRT,Week 8,8,PASITSCO,1,20,-19,-0.95,FALSE,NA,TRUE,TRUE,TRUE +74,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +74,TRT,Week 10,10,PASITSCO,1.8,20,-18.2,-0.9099999999999999,FALSE,NA,TRUE,TRUE,TRUE +74,TRT,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +74,TRT,Week 12,12,PASITSCO,1.9,20,-18.1,-0.905,FALSE,NA,TRUE,TRUE,TRUE +74,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +75,TRT,Week 1,1,PASITSCO,7.8,16.9,-9.099999999999998,-0.5384615384615384,FALSE,NA,TRUE,TRUE,TRUE +75,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +75,TRT,Week 2,2,PASITSCO,6.7,16.9,-10.2,-0.6035502958579881,FALSE,NA,TRUE,TRUE,TRUE +75,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +75,TRT,Week 4,4,PASITSCO,5.3,16.9,-11.599999999999998,-0.6863905325443787,FALSE,NA,TRUE,TRUE,TRUE +75,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +75,TRT,Week 6,6,PASITSCO,4.4,16.9,-12.499999999999998,-0.7396449704142012,FALSE,NA,TRUE,TRUE,TRUE +75,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +75,TRT,Week 8,8,PASITSCO,5.8,16.9,-11.099999999999998,-0.6568047337278106,FALSE,NA,TRUE,TRUE,TRUE +75,TRT,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +75,TRT,Week 10,10,PASITSCO,2.5,16.9,-14.399999999999999,-0.8520710059171598,FALSE,NA,TRUE,TRUE,TRUE +75,TRT,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +75,TRT,Week 12,12,PASITSCO,5.1,16.9,-11.799999999999999,-0.6982248520710059,FALSE,NA,TRUE,TRUE,TRUE +75,TRT,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +76,PBO,Week 1,1,PASITSCO,23.7,19.2,4.5,0.234375,FALSE,NA,TRUE,TRUE,TRUE +76,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +76,PBO,Week 2,2,PASITSCO,22.6,19.2,3.400000000000002,0.17708333333333345,FALSE,NA,TRUE,TRUE,TRUE +76,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +76,PBO,Week 4,4,PASITSCO,16.5,19.2,-2.6999999999999993,-0.14062499999999997,FALSE,NA,TRUE,TRUE,TRUE +76,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +76,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +76,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +76,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +76,PBO,Week 12,12,PASITSCO,12.6,19.2,-6.6,-0.34375,FALSE,NA,TRUE,TRUE,TRUE +76,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +77,TRT,Week 1,1,PASITSCO,24.7,26.1,-1.4000000000000021,-0.0536398467432951,FALSE,NA,TRUE,TRUE,TRUE +77,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +77,TRT,Week 2,2,PASITSCO,21.5,26.1,-4.600000000000001,-0.1762452107279694,FALSE,NA,TRUE,TRUE,TRUE +77,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +77,TRT,Week 4,4,PASITSCO,12.5,26.1,-13.600000000000001,-0.521072796934866,FALSE,NA,TRUE,TRUE,TRUE +77,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +77,TRT,Week 6,6,PASITSCO,6.4,26.1,-19.700000000000003,-0.7547892720306514,FALSE,NA,TRUE,TRUE,TRUE +77,TRT,Week 6,6,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +77,TRT,Week 8,8,PASITSCO,8.9,26.1,-17.200000000000003,-0.6590038314176246,FALSE,NA,TRUE,TRUE,TRUE +77,TRT,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +77,TRT,Week 10,10,PASITSCO,14.9,26.1,-11.200000000000001,-0.42911877394636017,FALSE,NA,TRUE,TRUE,TRUE +77,TRT,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +77,TRT,Week 12,12,PASITSCO,27.8,26.1,1.6999999999999993,0.0651340996168582,FALSE,NA,TRUE,TRUE,TRUE +77,TRT,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +78,PBO,Week 1,1,PASITSCO,12.3,14.3,-2,-0.13986013986013984,FALSE,NA,TRUE,TRUE,TRUE +78,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +78,PBO,Week 2,2,PASITSCO,15.4,14.3,1.0999999999999996,0.0769230769230769,FALSE,NA,TRUE,TRUE,TRUE +78,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +78,PBO,Week 4,4,PASITSCO,11.4,14.3,-2.9000000000000004,-0.2027972027972028,FALSE,NA,TRUE,TRUE,TRUE +78,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +78,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +78,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +78,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +78,PBO,Week 12,12,PASITSCO,44.1,14.3,29.8,2.0839160839160837,FALSE,NA,TRUE,TRUE,TRUE +78,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +79,PBO,Week 1,1,PASITSCO,18.4,28.9,-10.5,-0.3633217993079585,FALSE,NA,TRUE,TRUE,TRUE +79,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +79,PBO,Week 2,2,PASITSCO,13.2,28.9,-15.7,-0.5432525951557093,FALSE,NA,TRUE,TRUE,TRUE +79,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +79,PBO,Week 4,4,PASITSCO,8.7,28.9,-20.2,-0.698961937716263,FALSE,NA,TRUE,TRUE,TRUE +79,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +79,PBO,Week 6,6,PASITSCO,6.5,28.9,-22.4,-0.7750865051903114,FALSE,NA,TRUE,TRUE,TRUE +79,PBO,Week 6,6,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +79,PBO,Week 8,8,PASITSCO,5.3,28.9,-23.599999999999998,-0.8166089965397924,FALSE,NA,TRUE,TRUE,TRUE +79,PBO,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +79,PBO,Week 10,10,PASITSCO,3.9,28.9,-25,-0.8650519031141869,FALSE,NA,TRUE,TRUE,TRUE +79,PBO,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +79,PBO,Week 12,12,PASITSCO,5,28.9,-23.9,-0.8269896193771626,FALSE,NA,TRUE,TRUE,TRUE +79,PBO,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +80,PBO,Week 1,1,PASITSCO,19.1,19.5,-0.3999999999999986,-0.02051282051282044,FALSE,NA,TRUE,TRUE,TRUE +80,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +80,PBO,Week 2,2,PASITSCO,16.9,19.5,-2.6000000000000014,-0.13333333333333341,FALSE,NA,TRUE,TRUE,TRUE +80,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +80,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +80,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +80,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +80,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +80,PBO,Week 12,12,PASITSCO,40.5,19.5,21,1.0769230769230769,FALSE,NA,TRUE,TRUE,TRUE +80,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +81,PBO,Week 1,1,PASITSCO,12.1,14.5,-2.4000000000000004,-0.16551724137931037,FALSE,NA,TRUE,TRUE,TRUE +81,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +81,PBO,Week 2,2,PASITSCO,9.5,14.5,-5,-0.3448275862068966,FALSE,NA,TRUE,TRUE,TRUE +81,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +81,PBO,Week 4,4,PASITSCO,10.9,14.5,-3.5999999999999996,-0.24827586206896549,FALSE,NA,TRUE,TRUE,TRUE +81,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +81,PBO,Week 6,6,PASITSCO,14.9,14.5,0.40000000000000036,0.027586206896551748,FALSE,NA,TRUE,TRUE,TRUE +81,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +81,PBO,Week 8,8,PASITSCO,10.5,14.5,-4,-0.27586206896551724,FALSE,NA,TRUE,TRUE,TRUE +81,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +81,PBO,Week 10,10,PASITSCO,10.8,14.5,-3.6999999999999993,-0.2551724137931034,FALSE,NA,TRUE,TRUE,TRUE +81,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +81,PBO,Week 12,12,PASITSCO,8.4,14.5,-6.1,-0.42068965517241375,FALSE,NA,TRUE,TRUE,TRUE +81,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +82,PBO,Week 1,1,PASITSCO,17.9,20.5,-2.6000000000000014,-0.12682926829268298,FALSE,NA,TRUE,TRUE,TRUE +82,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +82,PBO,Week 2,2,PASITSCO,20.3,20.5,-0.1999999999999993,-0.009756097560975575,FALSE,NA,TRUE,TRUE,TRUE +82,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +82,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +82,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +82,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +82,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +82,PBO,Week 12,12,PASITSCO,14.5,20.5,-6,-0.2926829268292683,FALSE,NA,TRUE,TRUE,TRUE +82,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +83,TRT,Week 1,1,PASITSCO,14.8,20,-5.199999999999999,-0.25999999999999995,FALSE,NA,TRUE,TRUE,TRUE +83,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +83,TRT,Week 2,2,PASITSCO,10.4,20,-9.6,-0.48,FALSE,NA,TRUE,TRUE,TRUE +83,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +83,TRT,Week 4,4,PASITSCO,6.7,20,-13.3,-0.665,FALSE,NA,TRUE,TRUE,TRUE +83,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +83,TRT,Week 6,6,PASITSCO,2.7,20,-17.3,-0.865,FALSE,NA,TRUE,TRUE,TRUE +83,TRT,Week 6,6,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +83,TRT,Week 8,8,PASITSCO,2.3,20,-17.7,-0.885,FALSE,NA,TRUE,TRUE,TRUE +83,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +83,TRT,Week 10,10,PASITSCO,4.3,20,-15.7,-0.7849999999999999,FALSE,NA,TRUE,TRUE,TRUE +83,TRT,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +83,TRT,Week 12,12,PASITSCO,3.5,20,-16.5,-0.825,FALSE,NA,TRUE,TRUE,TRUE +83,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +84,PBO,Week 1,1,PASITSCO,21.4,27.4,-6,-0.21897810218978103,FALSE,NA,TRUE,TRUE,TRUE +84,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +84,PBO,Week 2,2,PASITSCO,19,27.4,-8.399999999999999,-0.3065693430656934,FALSE,NA,TRUE,TRUE,TRUE +84,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +84,PBO,Week 4,4,PASITSCO,12.9,27.4,-14.499999999999998,-0.5291970802919708,FALSE,NA,TRUE,TRUE,TRUE +84,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +84,PBO,Week 6,6,PASITSCO,10.6,27.4,-16.799999999999997,-0.6131386861313868,FALSE,NA,TRUE,TRUE,TRUE +84,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +84,PBO,Week 8,8,PASITSCO,9.2,27.4,-18.2,-0.6642335766423357,FALSE,NA,TRUE,TRUE,TRUE +84,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +84,PBO,Week 10,10,PASITSCO,6.4,27.4,-21,-0.7664233576642336,FALSE,NA,TRUE,TRUE,TRUE +84,PBO,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +84,PBO,Week 12,12,PASITSCO,7.8,27.4,-19.599999999999998,-0.7153284671532847,FALSE,NA,TRUE,TRUE,TRUE +84,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +85,PBO,Week 1,1,PASITSCO,22.5,17.7,4.800000000000001,0.27118644067796616,FALSE,NA,TRUE,TRUE,TRUE +85,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +85,PBO,Week 2,2,PASITSCO,25.5,17.7,7.800000000000001,0.44067796610169496,FALSE,NA,TRUE,TRUE,TRUE +85,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +85,PBO,Week 4,4,PASITSCO,21.8,17.7,4.100000000000001,0.23163841807909613,FALSE,NA,TRUE,TRUE,TRUE +85,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +85,PBO,Week 6,6,PASITSCO,24.9,17.7,7.199999999999999,0.4067796610169491,FALSE,NA,TRUE,TRUE,TRUE +85,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +85,PBO,Week 8,8,PASITSCO,23.4,17.7,5.699999999999999,0.3220338983050847,FALSE,NA,TRUE,TRUE,TRUE +85,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +85,PBO,Week 10,10,PASITSCO,22.6,17.7,4.900000000000002,0.2768361581920905,FALSE,NA,TRUE,TRUE,TRUE +85,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +85,PBO,Week 12,12,PASITSCO,23.5,17.7,5.800000000000001,0.3276836158192091,FALSE,NA,TRUE,TRUE,TRUE +85,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +86,PBO,Week 1,1,PASITSCO,43.3,29.5,13.799999999999997,0.4677966101694914,FALSE,NA,TRUE,TRUE,TRUE +86,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +86,PBO,Week 2,2,PASITSCO,48.5,29.5,19,0.6440677966101694,FALSE,NA,TRUE,TRUE,TRUE +86,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +86,PBO,Week 4,4,PASITSCO,24.2,29.5,-5.300000000000001,-0.17966101694915257,FALSE,NA,TRUE,TRUE,TRUE +86,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +86,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +86,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +86,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +86,PBO,Week 12,12,PASITSCO,17.6,29.5,-11.899999999999999,-0.40338983050847455,FALSE,NA,TRUE,TRUE,TRUE +86,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +87,PBO,Week 1,1,PASITSCO,20,13.5,6.5,0.48148148148148145,FALSE,NA,TRUE,TRUE,TRUE +87,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +87,PBO,Week 2,2,PASITSCO,14.6,13.5,1.0999999999999996,0.08148148148148146,FALSE,NA,TRUE,TRUE,TRUE +87,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +87,PBO,Week 4,4,PASITSCO,16.1,13.5,2.6000000000000014,0.1925925925925927,FALSE,NA,TRUE,TRUE,TRUE +87,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +87,PBO,Week 6,6,PASITSCO,18.5,13.5,5,0.37037037037037035,FALSE,NA,TRUE,TRUE,TRUE +87,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +87,PBO,Week 8,8,PASITSCO,12.2,13.5,-1.3000000000000007,-0.09629629629629635,FALSE,NA,TRUE,TRUE,TRUE +87,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +87,PBO,Week 10,10,PASITSCO,14.8,13.5,1.3000000000000007,0.09629629629629635,FALSE,NA,TRUE,TRUE,TRUE +87,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +87,PBO,Week 12,12,PASITSCO,5.7,13.5,-7.8,-0.5777777777777777,FALSE,NA,TRUE,TRUE,TRUE +87,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +88,PBO,Week 1,1,PASITSCO,22.4,23.7,-1.3000000000000007,-0.054852320675105516,FALSE,NA,TRUE,TRUE,TRUE +88,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +88,PBO,Week 2,2,PASITSCO,19.7,23.7,-4,-0.16877637130801687,FALSE,NA,TRUE,TRUE,TRUE +88,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +88,PBO,Week 4,4,PASITSCO,40.6,23.7,16.900000000000002,0.7130801687763714,FALSE,NA,TRUE,TRUE,TRUE +88,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +88,PBO,Week 6,6,PASITSCO,32.4,23.7,8.7,0.36708860759493667,FALSE,NA,TRUE,TRUE,TRUE +88,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +88,PBO,Week 8,8,PASITSCO,37.8,23.7,14.099999999999998,0.5949367088607594,FALSE,NA,TRUE,TRUE,TRUE +88,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +88,PBO,Week 10,10,PASITSCO,18.9,23.7,-4.800000000000001,-0.20253164556962028,FALSE,NA,TRUE,TRUE,TRUE +88,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +88,PBO,Week 12,12,PASITSCO,27.1,23.7,3.400000000000002,0.14345991561181445,FALSE,NA,TRUE,TRUE,TRUE +88,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +89,TRT,Week 1,1,PASITSCO,23.6,26.8,-3.1999999999999993,-0.11940298507462684,FALSE,NA,TRUE,TRUE,TRUE +89,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +89,TRT,Week 2,2,PASITSCO,17.3,26.8,-9.5,-0.3544776119402985,FALSE,NA,TRUE,TRUE,TRUE +89,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +89,TRT,Week 4,4,PASITSCO,6.7,26.8,-20.1,-0.75,FALSE,NA,TRUE,TRUE,TRUE +89,TRT,Week 4,4,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +89,TRT,Week 6,6,PASITSCO,2.5,26.8,-24.3,-0.9067164179104478,FALSE,NA,TRUE,TRUE,TRUE +89,TRT,Week 6,6,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +89,TRT,Week 8,8,PASITSCO,2.2,26.8,-24.6,-0.917910447761194,FALSE,NA,TRUE,TRUE,TRUE +89,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +89,TRT,Week 10,10,PASITSCO,1.1,26.8,-25.7,-0.958955223880597,FALSE,NA,TRUE,TRUE,TRUE +89,TRT,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +89,TRT,Week 12,12,PASITSCO,0.5,26.8,-26.3,-0.9813432835820896,FALSE,NA,TRUE,TRUE,TRUE +89,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +90,TRT,Week 1,1,PASITSCO,14.7,19.2,-4.5,-0.234375,FALSE,NA,TRUE,TRUE,TRUE +90,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +90,TRT,Week 2,2,PASITSCO,10,19.2,-9.2,-0.47916666666666663,FALSE,NA,TRUE,TRUE,TRUE +90,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +90,TRT,Week 4,4,PASITSCO,5.8,19.2,-13.399999999999999,-0.6979166666666666,FALSE,NA,TRUE,TRUE,TRUE +90,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +90,TRT,Week 6,6,PASITSCO,6.3,19.2,-12.899999999999999,-0.671875,FALSE,NA,TRUE,TRUE,TRUE +90,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +90,TRT,Week 8,8,PASITSCO,3.1,19.2,-16.099999999999998,-0.8385416666666666,FALSE,NA,TRUE,TRUE,TRUE +90,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +90,TRT,Week 10,10,PASITSCO,3,19.2,-16.2,-0.84375,FALSE,NA,TRUE,TRUE,TRUE +90,TRT,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +90,TRT,Week 12,12,PASITSCO,5.6,19.2,-13.6,-0.7083333333333334,FALSE,NA,TRUE,TRUE,TRUE +90,TRT,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +91,PBO,Week 1,1,PASITSCO,13.9,16.8,-2.9000000000000004,-0.17261904761904764,FALSE,NA,TRUE,TRUE,TRUE +91,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +91,PBO,Week 2,2,PASITSCO,10.9,16.8,-5.9,-0.3511904761904762,FALSE,NA,TRUE,TRUE,TRUE +91,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +91,PBO,Week 4,4,PASITSCO,8.2,16.8,-8.600000000000001,-0.511904761904762,FALSE,NA,TRUE,TRUE,TRUE +91,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +91,PBO,Week 6,6,PASITSCO,6.6,16.8,-10.200000000000001,-0.6071428571428572,FALSE,NA,TRUE,TRUE,TRUE +91,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +91,PBO,Week 8,8,PASITSCO,8.8,16.8,-8,-0.47619047619047616,FALSE,NA,TRUE,TRUE,TRUE +91,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +91,PBO,Week 10,10,PASITSCO,4.3,16.8,-12.5,-0.7440476190476191,FALSE,NA,TRUE,TRUE,TRUE +91,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +91,PBO,Week 12,12,PASITSCO,4.2,16.8,-12.600000000000001,-0.75,FALSE,NA,TRUE,TRUE,TRUE +91,PBO,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +92,PBO,Week 1,1,PASITSCO,24.5,16.4,8.100000000000001,0.49390243902439035,FALSE,NA,TRUE,TRUE,TRUE +92,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +92,PBO,Week 2,2,PASITSCO,35.3,16.4,18.9,1.1524390243902438,FALSE,NA,TRUE,TRUE,TRUE +92,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +92,PBO,Week 4,4,PASITSCO,23,16.4,6.600000000000001,0.40243902439024404,FALSE,NA,TRUE,TRUE,TRUE +92,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +92,PBO,Week 6,6,PASITSCO,43.5,16.4,27.1,1.652439024390244,FALSE,NA,TRUE,TRUE,TRUE +92,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +92,PBO,Week 8,8,PASITSCO,20.8,16.4,4.400000000000002,0.2682926829268294,FALSE,NA,TRUE,TRUE,TRUE +92,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +92,PBO,Week 10,10,PASITSCO,13.4,16.4,-2.9999999999999982,-0.1829268292682926,FALSE,NA,TRUE,TRUE,TRUE +92,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +92,PBO,Week 12,12,PASITSCO,17,16.4,0.6000000000000014,0.036585365853658625,FALSE,NA,TRUE,TRUE,TRUE +92,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +93,PBO,Week 1,1,PASITSCO,21.6,16,5.600000000000001,0.3500000000000001,FALSE,NA,TRUE,TRUE,TRUE +93,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +93,PBO,Week 2,2,PASITSCO,16.2,16,0.1999999999999993,0.012499999999999956,FALSE,NA,TRUE,TRUE,TRUE +93,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +93,PBO,Week 4,4,PASITSCO,14.7,16,-1.3000000000000007,-0.08125000000000004,FALSE,NA,TRUE,TRUE,TRUE +93,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +93,PBO,Week 6,6,PASITSCO,6.1,16,-9.9,-0.61875,FALSE,NA,TRUE,TRUE,TRUE +93,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +93,PBO,Week 8,8,PASITSCO,2.7,16,-13.3,-0.83125,FALSE,NA,TRUE,TRUE,TRUE +93,PBO,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +93,PBO,Week 10,10,PASITSCO,1.8,16,-14.2,-0.8875,FALSE,NA,TRUE,TRUE,TRUE +93,PBO,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +93,PBO,Week 12,12,PASITSCO,1.6,16,-14.4,-0.9,FALSE,NA,TRUE,TRUE,TRUE +93,PBO,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +94,PBO,Week 1,1,PASITSCO,16.2,15.7,0.5,0.03184713375796178,FALSE,NA,TRUE,TRUE,TRUE +94,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +94,PBO,Week 2,2,PASITSCO,11.5,15.7,-4.199999999999999,-0.2675159235668789,FALSE,NA,TRUE,TRUE,TRUE +94,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +94,PBO,Week 4,4,PASITSCO,22.6,15.7,6.900000000000002,0.4394904458598728,FALSE,NA,TRUE,TRUE,TRUE +94,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +94,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +94,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +94,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +94,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +95,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +95,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +95,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +95,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +95,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +95,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +95,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +96,PBO,Week 1,1,PASITSCO,28.2,29.6,-1.4000000000000021,-0.04729729729729737,FALSE,NA,TRUE,TRUE,TRUE +96,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +96,PBO,Week 2,2,PASITSCO,31.3,29.6,1.6999999999999993,0.05743243243243241,FALSE,NA,TRUE,TRUE,TRUE +96,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +96,PBO,Week 4,4,PASITSCO,23,29.6,-6.600000000000001,-0.222972972972973,FALSE,NA,TRUE,TRUE,TRUE +96,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +96,PBO,Week 6,6,PASITSCO,21.6,29.6,-8,-0.27027027027027023,FALSE,NA,TRUE,TRUE,TRUE +96,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +96,PBO,Week 8,8,PASITSCO,16.1,29.6,-13.5,-0.4560810810810811,FALSE,NA,TRUE,TRUE,TRUE +96,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +96,PBO,Week 10,10,PASITSCO,10.1,29.6,-19.5,-0.6587837837837838,FALSE,NA,TRUE,TRUE,TRUE +96,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +96,PBO,Week 12,12,PASITSCO,18.2,29.6,-11.400000000000002,-0.3851351351351352,FALSE,NA,TRUE,TRUE,TRUE +96,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +97,TRT,Week 1,1,PASITSCO,6.2,11.9,-5.7,-0.4789915966386555,FALSE,NA,TRUE,TRUE,TRUE +97,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +97,TRT,Week 2,2,PASITSCO,2.8,11.9,-9.100000000000001,-0.7647058823529412,FALSE,NA,TRUE,TRUE,TRUE +97,TRT,Week 2,2,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +97,TRT,Week 4,4,PASITSCO,2,11.9,-9.9,-0.8319327731092437,FALSE,NA,TRUE,TRUE,TRUE +97,TRT,Week 4,4,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +97,TRT,Week 6,6,PASITSCO,0.7,11.9,-11.200000000000001,-0.9411764705882354,FALSE,NA,TRUE,TRUE,TRUE +97,TRT,Week 6,6,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +97,TRT,Week 8,8,PASITSCO,2.3,11.9,-9.600000000000001,-0.8067226890756304,FALSE,NA,TRUE,TRUE,TRUE +97,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +97,TRT,Week 10,10,PASITSCO,1.6,11.9,-10.3,-0.865546218487395,FALSE,NA,TRUE,TRUE,TRUE +97,TRT,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +97,TRT,Week 12,12,PASITSCO,1.1,11.9,-10.8,-0.907563025210084,FALSE,NA,TRUE,TRUE,TRUE +97,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +98,PBO,Week 1,1,PASITSCO,5.8,8.5,-2.7,-0.31764705882352945,FALSE,NA,TRUE,TRUE,TRUE +98,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +98,PBO,Week 2,2,PASITSCO,5.6,8.5,-2.9000000000000004,-0.34117647058823536,FALSE,NA,TRUE,TRUE,TRUE +98,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +98,PBO,Week 4,4,PASITSCO,7.8,8.5,-0.7000000000000002,-0.08235294117647061,FALSE,NA,TRUE,TRUE,TRUE +98,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +98,PBO,Week 6,6,PASITSCO,10.2,8.5,1.6999999999999993,0.19999999999999993,FALSE,NA,TRUE,TRUE,TRUE +98,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +98,PBO,Week 8,8,PASITSCO,21,8.5,12.5,1.4705882352941178,FALSE,NA,TRUE,TRUE,TRUE +98,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +98,PBO,Week 10,10,PASITSCO,31.7,8.5,23.2,2.7294117647058824,FALSE,NA,TRUE,TRUE,TRUE +98,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +98,PBO,Week 12,12,PASITSCO,28,8.5,19.5,2.2941176470588234,FALSE,NA,TRUE,TRUE,TRUE +98,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +99,TRT,Week 1,1,PASITSCO,11,15.7,-4.699999999999999,-0.29936305732484075,FALSE,NA,TRUE,TRUE,TRUE +99,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +99,TRT,Week 2,2,PASITSCO,7.4,15.7,-8.299999999999999,-0.5286624203821656,FALSE,NA,TRUE,TRUE,TRUE +99,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +99,TRT,Week 4,4,PASITSCO,5.1,15.7,-10.6,-0.6751592356687898,FALSE,NA,TRUE,TRUE,TRUE +99,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +99,TRT,Week 6,6,PASITSCO,3.9,15.7,-11.799999999999999,-0.751592356687898,FALSE,NA,TRUE,TRUE,TRUE +99,TRT,Week 6,6,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +99,TRT,Week 8,8,PASITSCO,7.7,15.7,-7.999999999999999,-0.5095541401273885,FALSE,NA,TRUE,TRUE,TRUE +99,TRT,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +99,TRT,Week 10,10,PASITSCO,4.2,15.7,-11.5,-0.7324840764331211,FALSE,NA,TRUE,TRUE,TRUE +99,TRT,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +99,TRT,Week 12,12,PASITSCO,4.8,15.7,-10.899999999999999,-0.6942675159235668,FALSE,NA,TRUE,TRUE,TRUE +99,TRT,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +100,PBO,Week 1,1,PASITSCO,16.8,22.2,-5.399999999999999,-0.24324324324324317,FALSE,NA,TRUE,TRUE,TRUE +100,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +100,PBO,Week 2,2,PASITSCO,17.1,22.2,-5.099999999999998,-0.22972972972972963,FALSE,NA,TRUE,TRUE,TRUE +100,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +100,PBO,Week 4,4,PASITSCO,11.1,22.2,-11.1,-0.5,FALSE,NA,TRUE,TRUE,TRUE +100,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +100,PBO,Week 6,6,PASITSCO,17.8,22.2,-4.399999999999999,-0.19819819819819814,FALSE,NA,TRUE,TRUE,TRUE +100,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +100,PBO,Week 8,8,PASITSCO,31.2,22.2,9,0.40540540540540543,FALSE,NA,TRUE,TRUE,TRUE +100,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +100,PBO,Week 10,10,PASITSCO,40.6,22.2,18.400000000000002,0.8288288288288289,FALSE,NA,TRUE,TRUE,TRUE +100,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +100,PBO,Week 12,12,PASITSCO,27,22.2,4.800000000000001,0.21621621621621626,FALSE,NA,TRUE,TRUE,TRUE +100,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +101,PBO,Week 1,1,PASITSCO,10.3,12.3,-2,-0.16260162601626016,FALSE,NA,TRUE,TRUE,TRUE +101,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +101,PBO,Week 2,2,PASITSCO,7.5,12.3,-4.800000000000001,-0.3902439024390244,FALSE,NA,TRUE,TRUE,TRUE +101,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +101,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +101,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +101,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +101,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +101,PBO,Week 12,12,PASITSCO,-0.2,12.3,-12.5,-1.0162601626016259,FALSE,NA,TRUE,TRUE,TRUE +101,PBO,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +102,PBO,Week 1,1,PASITSCO,19.7,22.8,-3.1000000000000014,-0.13596491228070182,FALSE,NA,TRUE,TRUE,TRUE +102,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +102,PBO,Week 2,2,PASITSCO,17.2,22.8,-5.600000000000001,-0.24561403508771934,FALSE,NA,TRUE,TRUE,TRUE +102,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +102,PBO,Week 4,4,PASITSCO,14.7,22.8,-8.100000000000001,-0.3552631578947369,FALSE,NA,TRUE,TRUE,TRUE +102,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +102,PBO,Week 6,6,PASITSCO,20.5,22.8,-2.3000000000000007,-0.10087719298245616,FALSE,NA,TRUE,TRUE,TRUE +102,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +102,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +102,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +102,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +103,PBO,Week 1,1,PASITSCO,14.1,16.8,-2.700000000000001,-0.16071428571428578,FALSE,NA,TRUE,TRUE,TRUE +103,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +103,PBO,Week 2,2,PASITSCO,12.3,16.8,-4.5,-0.26785714285714285,FALSE,NA,TRUE,TRUE,TRUE +103,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +103,PBO,Week 4,4,PASITSCO,16.8,16.8,0,0,FALSE,NA,TRUE,TRUE,TRUE +103,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +103,PBO,Week 6,6,PASITSCO,18.3,16.8,1.5,0.08928571428571429,FALSE,NA,TRUE,TRUE,TRUE +103,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +103,PBO,Week 8,8,PASITSCO,35.9,16.8,19.099999999999998,1.1369047619047616,FALSE,NA,TRUE,TRUE,TRUE +103,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +103,PBO,Week 10,10,PASITSCO,20.6,16.8,3.8000000000000007,0.22619047619047622,FALSE,NA,TRUE,TRUE,TRUE +103,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +103,PBO,Week 12,12,PASITSCO,16.7,16.8,-0.10000000000000142,-0.005952380952381037,FALSE,NA,TRUE,TRUE,TRUE +103,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +104,PBO,Week 1,1,PASITSCO,16.9,14.3,2.599999999999998,0.18181818181818166,FALSE,NA,TRUE,TRUE,TRUE +104,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +104,PBO,Week 2,2,PASITSCO,15.3,14.3,1,0.06993006993006992,FALSE,NA,TRUE,TRUE,TRUE +104,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +104,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +104,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +104,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +104,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +104,PBO,Week 12,12,PASITSCO,33.7,14.3,19.400000000000002,1.3566433566433567,FALSE,NA,TRUE,TRUE,TRUE +104,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +105,PBO,Week 1,1,PASITSCO,12.4,11.6,0.8000000000000007,0.06896551724137938,FALSE,NA,TRUE,TRUE,TRUE +105,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +105,PBO,Week 2,2,PASITSCO,11.4,11.6,-0.1999999999999993,-0.01724137931034477,FALSE,NA,TRUE,TRUE,TRUE +105,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +105,PBO,Week 4,4,PASITSCO,14.2,11.6,2.5999999999999996,0.22413793103448273,FALSE,NA,TRUE,TRUE,TRUE +105,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +105,PBO,Week 6,6,PASITSCO,14,11.6,2.4000000000000004,0.20689655172413796,FALSE,NA,TRUE,TRUE,TRUE +105,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +105,PBO,Week 8,8,PASITSCO,26.5,11.6,14.9,1.2844827586206897,FALSE,NA,TRUE,TRUE,TRUE +105,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +105,PBO,Week 10,10,PASITSCO,31.3,11.6,19.700000000000003,1.6982758620689657,FALSE,NA,TRUE,TRUE,TRUE +105,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +105,PBO,Week 12,12,PASITSCO,20.4,11.6,8.799999999999999,0.7586206896551724,FALSE,NA,TRUE,TRUE,TRUE +105,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +106,TRT,Week 1,1,PASITSCO,8.3,13.3,-5,-0.37593984962406013,FALSE,NA,TRUE,TRUE,TRUE +106,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +106,TRT,Week 2,2,PASITSCO,7.5,13.3,-5.800000000000001,-0.4360902255639098,FALSE,NA,TRUE,TRUE,TRUE +106,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +106,TRT,Week 4,4,PASITSCO,3.6,13.3,-9.700000000000001,-0.7293233082706767,FALSE,NA,TRUE,TRUE,TRUE +106,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +106,TRT,Week 6,6,PASITSCO,1.7,13.3,-11.600000000000001,-0.8721804511278196,FALSE,NA,TRUE,TRUE,TRUE +106,TRT,Week 6,6,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +106,TRT,Week 8,8,PASITSCO,1.4,13.3,-11.9,-0.8947368421052632,FALSE,NA,TRUE,TRUE,TRUE +106,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +106,TRT,Week 10,10,PASITSCO,1.3,13.3,-12,-0.9022556390977443,FALSE,NA,TRUE,TRUE,TRUE +106,TRT,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +106,TRT,Week 12,12,PASITSCO,0.3,13.3,-13,-0.9774436090225563,FALSE,NA,TRUE,TRUE,TRUE +106,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +107,TRT,Week 1,1,PASITSCO,11.2,17.2,-6,-0.3488372093023256,FALSE,NA,TRUE,TRUE,TRUE +107,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +107,TRT,Week 2,2,PASITSCO,5.4,17.2,-11.799999999999999,-0.686046511627907,FALSE,NA,TRUE,TRUE,TRUE +107,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +107,TRT,Week 4,4,PASITSCO,5.2,17.2,-12,-0.6976744186046512,FALSE,NA,TRUE,TRUE,TRUE +107,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +107,TRT,Week 6,6,PASITSCO,4.6,17.2,-12.6,-0.7325581395348837,FALSE,NA,TRUE,TRUE,TRUE +107,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +107,TRT,Week 8,8,PASITSCO,8.3,17.2,-8.899999999999999,-0.5174418604651162,FALSE,NA,TRUE,TRUE,TRUE +107,TRT,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +107,TRT,Week 10,10,PASITSCO,12.8,17.2,-4.399999999999999,-0.25581395348837205,FALSE,NA,TRUE,TRUE,TRUE +107,TRT,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +107,TRT,Week 12,12,PASITSCO,13.2,17.2,-4,-0.23255813953488372,FALSE,NA,TRUE,TRUE,TRUE +107,TRT,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +108,PBO,Week 1,1,PASITSCO,17.6,17.5,0.10000000000000142,0.005714285714285796,FALSE,NA,TRUE,TRUE,TRUE +108,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +108,PBO,Week 2,2,PASITSCO,18.3,17.5,0.8000000000000007,0.045714285714285756,FALSE,NA,TRUE,TRUE,TRUE +108,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +108,PBO,Week 4,4,PASITSCO,16.6,17.5,-0.8999999999999986,-0.051428571428571344,FALSE,NA,TRUE,TRUE,TRUE +108,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +108,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +108,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +108,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +108,PBO,Week 12,12,PASITSCO,4.9,17.5,-12.6,-0.72,FALSE,NA,TRUE,TRUE,TRUE +108,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +109,TRT,Week 1,1,PASITSCO,6.9,8.4,-1.5,-0.17857142857142858,FALSE,NA,TRUE,TRUE,TRUE +109,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +109,TRT,Week 2,2,PASITSCO,4.4,8.4,-4,-0.47619047619047616,FALSE,NA,TRUE,TRUE,TRUE +109,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +109,TRT,Week 4,4,PASITSCO,4.1,8.4,-4.300000000000001,-0.511904761904762,FALSE,NA,TRUE,TRUE,TRUE +109,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +109,TRT,Week 6,6,PASITSCO,5.9,8.4,-2.5,-0.2976190476190476,FALSE,NA,TRUE,TRUE,TRUE +109,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +109,TRT,Week 8,8,PASITSCO,3.9,8.4,-4.5,-0.5357142857142857,FALSE,NA,TRUE,TRUE,TRUE +109,TRT,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +109,TRT,Week 10,10,PASITSCO,6.4,8.4,-2,-0.23809523809523808,FALSE,NA,TRUE,TRUE,TRUE +109,TRT,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +109,TRT,Week 12,12,PASITSCO,5.1,8.4,-3.3000000000000007,-0.3928571428571429,FALSE,NA,TRUE,TRUE,TRUE +109,TRT,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +110,PBO,Week 1,1,PASITSCO,14,16.2,-2.1999999999999993,-0.13580246913580243,FALSE,NA,TRUE,TRUE,TRUE +110,PBO,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +110,PBO,Week 2,2,PASITSCO,12,16.2,-4.199999999999999,-0.25925925925925924,FALSE,NA,TRUE,TRUE,TRUE +110,PBO,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +110,PBO,Week 4,4,PASITSCO,18,16.2,1.8000000000000007,0.11111111111111116,FALSE,NA,TRUE,TRUE,TRUE +110,PBO,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +110,PBO,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +110,PBO,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +110,PBO,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,FALSE,TRUE,FALSE +110,PBO,Week 12,12,PASITSCO,5.4,16.2,-10.799999999999999,-0.6666666666666666,FALSE,NA,TRUE,TRUE,TRUE +110,PBO,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +111,TRT,Week 1,1,PASITSCO,12.7,14.9,-2.200000000000001,-0.14765100671140946,FALSE,NA,TRUE,TRUE,TRUE +111,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +111,TRT,Week 2,2,PASITSCO,11.3,14.9,-3.5999999999999996,-0.2416107382550335,FALSE,NA,TRUE,TRUE,TRUE +111,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +111,TRT,Week 4,4,PASITSCO,14.9,14.9,0,0,FALSE,NA,TRUE,TRUE,TRUE +111,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +111,TRT,Week 6,6,PASITSCO,7.4,14.9,-7.5,-0.5033557046979865,FALSE,NA,TRUE,TRUE,TRUE +111,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +111,TRT,Week 8,8,PASITSCO,7.6,14.9,-7.300000000000001,-0.4899328859060403,FALSE,NA,TRUE,TRUE,TRUE +111,TRT,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +111,TRT,Week 10,10,PASITSCO,6.4,14.9,-8.5,-0.5704697986577181,FALSE,NA,TRUE,TRUE,TRUE +111,TRT,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +111,TRT,Week 12,12,PASITSCO,2.7,14.9,-12.2,-0.8187919463087248,FALSE,NA,TRUE,TRUE,TRUE +111,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +112,TRT,Week 1,1,PASITSCO,20.4,21.8,-1.4000000000000021,-0.06422018348623863,FALSE,NA,TRUE,TRUE,TRUE +112,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +112,TRT,Week 2,2,PASITSCO,17.2,21.8,-4.600000000000001,-0.21100917431192667,FALSE,NA,TRUE,TRUE,TRUE +112,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +112,TRT,Week 4,4,PASITSCO,9.4,21.8,-12.4,-0.5688073394495413,FALSE,NA,TRUE,TRUE,TRUE +112,TRT,Week 4,4,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +112,TRT,Week 6,6,PASITSCO,10,21.8,-11.8,-0.5412844036697247,FALSE,NA,TRUE,TRUE,TRUE +112,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +112,TRT,Week 8,8,PASITSCO,6,21.8,-15.8,-0.7247706422018348,FALSE,NA,TRUE,TRUE,TRUE +112,TRT,Week 8,8,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +112,TRT,Week 10,10,PASITSCO,5.4,21.8,-16.4,-0.7522935779816513,FALSE,NA,TRUE,TRUE,TRUE +112,TRT,Week 10,10,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +112,TRT,Week 12,12,PASITSCO,3.8,21.8,-18,-0.8256880733944953,FALSE,NA,TRUE,TRUE,TRUE +112,TRT,Week 12,12,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +113,TRT,Week 1,1,PASITSCO,15.5,19.1,-3.6000000000000014,-0.18848167539267022,FALSE,NA,TRUE,TRUE,TRUE +113,TRT,Week 1,1,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +113,TRT,Week 2,2,PASITSCO,10.2,19.1,-8.900000000000002,-0.46596858638743466,FALSE,NA,TRUE,TRUE,TRUE +113,TRT,Week 2,2,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +113,TRT,Week 4,4,PASITSCO,4.7,19.1,-14.400000000000002,-0.7539267015706806,FALSE,NA,TRUE,TRUE,TRUE +113,TRT,Week 4,4,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +113,TRT,Week 6,6,PASITSCO,7.9,19.1,-11.200000000000001,-0.5863874345549739,FALSE,NA,TRUE,TRUE,TRUE +113,TRT,Week 6,6,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +113,TRT,Week 8,8,PASITSCO,4.1,19.1,-15.000000000000002,-0.7853403141361257,FALSE,NA,TRUE,TRUE,TRUE +113,TRT,Week 8,8,PSRS75,1,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +113,TRT,Week 10,10,PASITSCO,5.8,19.1,-13.3,-0.6963350785340314,FALSE,NA,TRUE,TRUE,TRUE +113,TRT,Week 10,10,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE +113,TRT,Week 12,12,PASITSCO,6.7,19.1,-12.400000000000002,-0.6492146596858639,FALSE,NA,TRUE,TRUE,TRUE +113,TRT,Week 12,12,PSRS75,0,NA,NA,NA,FALSE,NA,TRUE,TRUE,TRUE diff --git a/workshops/goettingen2024/exercises/bamdd_goettingen2024_exercises.R b/workshops/goettingen2024/exercises/bamdd_goettingen2024_exercises.R new file mode 100644 index 0000000..e51e6bf --- /dev/null +++ b/workshops/goettingen2024/exercises/bamdd_goettingen2024_exercises.R @@ -0,0 +1,547 @@ +here::i_am("exercises/bamdd_goettingen2024_exercises.R") + + + +## ----------------------------------------------------------------------------- +#| eval: false +# cmdstanr::check_cmdstan_toolchain(fix=T) + + +## ----------------------------------------------------------------------------- +#| eval: false +# # install.packages("remotes") +# remotes::install_github("coatless-mac/macrtools") +# macrtools::macos_rtools_install() + + +## ----------------------------------------------------------------------------- +#| eval: false +# # in case packages are missing, please run: +# install.packages(c("here", "ggplot2", "dplyr", "knitr", "brms", "posterior", "tidybayes", "RBesT", "ggrepel", "patchwork", "ggdist", "withr")) + + +## ----------------------------------------------------------------------------- +#| eval: false +# bamdd_zip <- tempfile(fileext=".zip") +# download.file("https://github.com/Novartis/bamdd/archive/refs/heads/main.zip", bamdd_zip) +# ## extracts web-site into the users home +# unzip(bamdd_zip, exdir=normalizePath("~")) +# browseURL(normalizePath(file.path("~", "bamdd-main"))) +# # to install all dependencies needed to build the web-site, please run +# source(file.path("~", "bamdd-main", "src", "install_dependencies.R")) + + +## ----include=FALSE------------------------------------------------------------ +here::i_am("exercises/bamdd_goettingen2024_exercises.qmd") + + +## ----warning = FALSE, message = FALSE----------------------------------------- +#| cache: false +# uncomment below and set to the filename of you R file for the +# exercises +# here::i_am("your-exercise-file.R") +library(here) +library(ggplot2) +library(dplyr) +library(knitr) +library(brms) +library(posterior) +library(tidybayes) +library(bayesplot) +library(RBesT) +library(ggrepel) +library(patchwork) +library(ggdist) + +options( + # how many processor cores would you like to use? + mc.cores = 4, + # how would you like to access Stan? + brms.backend = "cmdstanr", + # cache model binaries + cmdstanr_write_stan_file_dir=here::here("_brms-cache"), + # no need to normalize likelihoods + brms.normalize = FALSE +) + +dir.create(here::here("_brms-cache"), FALSE) +set.seed(254335) + +# in case rstan is used as backend, consider to enable model caching +# by enabling the following line +# rstan_options(auto_write = TRUE) + +# Set defaults for ggplot2 ---- +theme_set(theme_bw(base_size=18)) + +scale_colour_discrete <- function(...) { + # Alternative: ggsci::scale_color_nejm(...) + # scale_colour_brewer(..., palette="Set1") + ggthemes::scale_colour_colorblind(...) +} +scale_fill_discrete <- function(...) { + # Alternative: ggsci::scale_fill_nejm(...) + #scale_fill_brewer(..., palette="Set1") + ggthemes::scale_fill_colorblind(...) +} +scale_colour_continuous <- function(...) { + scale_colour_viridis_c(..., option="turbo") +} +update_geom_defaults("point", list(size=2)) +update_geom_defaults("line", list(size=1.5)) + + + +## ----------------------------------------------------------------------------- +withr::with_seed(654873, + AS_region <- bind_cols(RBesT::AS, region=sample(c("asia", "europe", "north_america"), 8, TRUE))) +kable(AS_region) + + +## ----------------------------------------------------------------------------- +model <- bf(r | trials(n) ~ 1 + (1 | study), family=binomial) + +model_prior <- prior(normal(0, 2), class=Intercept) + + prior(normal(0, 1), class=sd, coef=Intercept, group=study) + +map_mc_brms <- brm(model, AS_region, prior = model_prior, + seed = 4767, control=list(adapt_delta=0.99), + silent = 2, refresh = 0) +map_mc_brms + + +## ----------------------------------------------------------------------------- +#| eval: false +# region_model_fixed <- bf(r | trials(n) ~ 1 + region + (1 | study), family=binomial) + + +## ----------------------------------------------------------------------------- + +AS_region_all <- data.frame(region=c("asia", "europe", "north_america", "other")) |> + mutate(study=paste("new_study", region, sep="_"), r=0, n=6) + + + +## ----------------------------------------------------------------------------- +pp_count_AS_region <- posterior_predict(map_mc_brms) + +pp_rate_AS_region <- sweep(pp_count_AS_region, 2, AS_region$n, "/") + +head(pp_rate_AS_region) + +with(AS_region, ppc_intervals(r / n, pp_rate_AS_region)) + + scale_x_continuous("Study", breaks=1:nrow(AS_region), labels=AS_region$study) + + ylab("Responder Rate") + + coord_flip() + + theme(legend.position="right", + # suppress vertical grid lines for better readability of intervals + panel.grid.major.y = element_blank()) + +pp_AS_region <- AS_region |> + add_predicted_rvars(map_mc_brms, value="pp_r") |> + mutate(pp_rate=pp_r/n) + +pp_AS_region + +with(pp_AS_region, ppc_intervals(r / n, as_draws_matrix(pp_rate))) + + scale_x_continuous("Study", breaks=1:nrow(AS_region), labels=AS_region$study) + + ylab("Responder Rate") + + coord_flip() + + theme(legend.position="right", + # suppress vertical grid lines for better readability of intervals + panel.grid.major.y = element_blank()) + + + +## ----------------------------------------------------------------------------- + +AS_region_all <- data.frame(region=c("asia", "europe", "north_america", "other")) |> + mutate(study=paste("new_study", region, sep="_"), r=0, n=6) + +## to get brms to include the other factor level in the model, we have +## to add a fake row with region "other" and n=0 +AS_region_2 <- mutate(bind_rows(AS_region, mutate(AS_region_all, n=0)[4,]), + region=factor(region, levels=c("asia", "europe", "north_america", "other"))) + +str(AS_region_2) + +model_fixed <- bf(r | trials(n) ~ 1 + region + (1|study), family=binomial) + +get_prior(model_fixed, AS_region_2) + +model_fixed_prior <- prior(normal(0, 2), class=Intercept) + + prior(normal(0, 1), class=sd, coef=Intercept, group=study) + + prior(normal(0, log(2)/1.96), class=b) + +fixed_mc_brms <- brm(model_fixed, AS_region_2, prior=model_fixed_prior, + seed=4767, + silent = 2, refresh = 0, control=list(adapt_delta=0.99)) + +fixed_mc_brms + +post_regions <- posterior_linpred(fixed_mc_brms, + newdata=AS_region_all, + transform=TRUE, + allow_new_levels=TRUE, + sample_new_levels="gaussian") + +head(post_regions) + +colnames(post_regions) <- AS_region_all$region +map_region <- list() +for(r in AS_region_all$region) { + map_region[[r]] <- mixfit(post_regions[,r], type="beta", Nc=3, constrain_gt1=TRUE) +} + +kable(bind_rows(lapply(map_region, summary), .id="MAP"), digits=3) + +sapply(map_region, ess) + + + +## ----------------------------------------------------------------------------- +crohn <- RBesT::crohn + +crohn_sigma <- 88 +crohn$y.se <- crohn_sigma/sqrt(crohn$n) + +library(RBesT) +set.seed(1234) +rbest_normal_map_mcmc <- gMAP(cbind(y, y.se) ~ 1 | study, + weights=n, data=crohn, + family=gaussian, + beta.prior=cbind(0, crohn_sigma), + tau.dist="HalfNormal",tau.prior=cbind(0,crohn_sigma/2)) + +model_normal <- bf(y | se(y.se) ~ 1 + (1 | study), family=gaussian()) + +prior_normal <- prior(normal(0, 88), class=Intercept) + + prior(normal(0, 88/2), class=sd, coef=Intercept, group=study) + +brms_normal_map_mcmc <- brm(model_normal, crohn, prior=prior_normal, + seed=4767, + silent = 2, refresh = 0, control=list(adapt_delta=0.99)) + +## comparing the outputs we see that the random effect posterior +## matches... +rbest_normal_map_mcmc +brms_normal_map_mcmc + +brms_normal_map <- posterior_epred(brms_normal_map_mcmc, + newdata=data.frame(study="new", n=1, y=0, y.se=88), + allow_new_levels=TRUE, + sample_new_levels="gaussian") + +## ... and the MAP prior is also the same +summarise_draws(brms_normal_map, mean, sd, ~quantile2(., probs = c(0.025, 0.5, 0.975))) + + + +## ----peanutdata--------------------------------------------------------------- +#| code-fold: true +#| code-summary: "Show data setup code" +peanut <- tibble( + TRT01P = structure(c( + 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, + 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 5L, 5L, 5L, 5L, 5L, 5L, + 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, + 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, + 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, + 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, + 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, + 3L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, + 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L + ),levels = c("PBO", "5 mg", "15 mg", "50 mg", "150 mg", "300 mg"), class = "factor"), + dose = c( + 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, + 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, + 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, + 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, + 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, + 150L, 150L, 150L, 150L, 150L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, + 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, + 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, + 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, + 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, + 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, + 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, + 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, + 0L, 0L), + AVAL = c( + 1000L, 100L, 0L, 600L, 600L, 300L, 300L, 10L, 10L, 100L, 1000L, 300L, 10L, 1000L, 1000L, 1000L, 3L, 3L, 600L, 300L, + 1000L, 1000L, 100L, 1000L, 600L, 600L, 1000L, 1000L, 1000L, 300L, 600L, 1000L, 1000L, 1000L, 1000L, 1000L, 300L, + 1000L, 600L, 1000L, 300L, 1000L, 600L, 600L, 1000L, 1000L, 600L, 1000L, 1000L, 1000L, 1000L, 600L, 1000L, 1000L, + 1000L, 0L, 600L, 300L, 1000L, 1000L, 1000L, 100L, 1000L, 1000L, 600L, 1000L, 1000L, 1000L, 600L, 300L, 600L, 600L, + 100L, 600L, 1000L, 300L, 10L, 3L, 1000L, 300L, 300L, 1000L, 300L, 300L, 10L, 1000L, 1000L, 10L, 10L, 600L, 3L, 10L, + 600L, 600L, 600L, 1000L, 100L, 1000L, 1000L, 10L, 1000L, 3L, 10L, 1000L, 100L, 1000L, 100L, 10L, 300L, 10L, 100L, + 1000L, 0L, 1000L, 100L, 3L, 10L, 100L, 100L, 300L, 1000L, 1000L, 1000L, 10L, 1000L, 3L, 3L, 600L, 600L, 10L, 3L, + 600L, 600L, 300L, 300L, 1000L, 3L, 3L, 1000L, 10L, 1000L, 1000L, 600L, 100L, 300L, 600L, 10L, 100L, 0L, 100L, 3L, + 0L, 10L, 3L, 600L, 300L, 300L, 300L, 600L, 300L, 100L, 3L, 0L, 10L, 600L, 300L, 10L, 300L, 600L, 1000L, 600L, 600L, + 0L, 0L, 600L, 600L, 600L, 0L, 0L, 300L, 100L, 0L, 10L, 300L, 1000L, 300L, 600L, 600L, 300L, 10L, 600L, 100L, 100L, + 300L, 3L, 3L, 300L, 1000L, 10L, 3L, 100L, 3L, 100L, 100L, 300L, 3L, 3L, 600L, 300L, 3L, 3L, 3L, 300L, 3L, 0L, 10L, + 3L, 300L, 10L, 10L, 600L, 0L, 300L, 600L, 0L, 0L, 100L, 100L, 10L, 100L, 10L, 100L, 600L, 0L, 600L, 0L, 10L, 100L, + 0L, 0L, 0L, 0L, 3L, 10L, 3L, 300L, 600L, 0L, 0L, 300L, 10L, 10L, 100L, 300L, 0L, 0L, 0L, 3L, 0L, 0L, 10L, 0L, 300L, + 3L, 0L, 0L, 0L, 0L, 100L, 3L, 0L, 3L, 10L, 10L, 3L, 0L, 3L, 10L, 3L, 0L, 0L, 3L, 100L, 0L, 0L, 300L, 0L, 0L, 0L, + 0L, 0L, 0L, 0L, 3L, 0L, 3L, 0L, 0L, 0L, 0L), + PARAM = structure( + c( + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), + levels = "Tolerated amount of peanut protein (mg)", class = "factor"), + USUBJID = c( + 129L, 103L, 104L, 185L, 34L, 15L, 140L, 151L, 7L, 144L, 200L, 23L, 138L, 115L, 255L, 147L, 224L, 101L, 156L, 284L, + 136L, 248L, 179L, 298L, 168L, 295L, 289L, 241L, 36L, 27L, 123L, 266L, 11L, 291L, 236L, 130L, 173L, 195L, 203L, 160L, + 274L, 167L, 290L, 94L, 9L, 269L, 122L, 135L, 64L, 26L, 95L, 10L, 5L, 234L, 161L, 299L, 88L, 69L, 35L, 233L, 286L, + 85L, 91L, 189L, 80L, 152L, 223L, 287L, 244L, 57L, 108L, 18L, 62L, 157L, 300L, 283L, 164L, 243L, 89L, 220L, 24L, 271L, + 166L, 118L, 201L, 127L, 121L, 41L, 267L, 213L, 49L, 73L, 202L, 134L, 112L, 25L, 227L, 29L, 251L, 273L, 119L, 132L, + 74L, 270L, 83L, 37L, 181L, 258L, 253L, 48L, 120L, 54L, 277L, 176L, 65L, 264L, 107L, 171L, 262L, 162L, 187L, 272L, + 288L, 294L, 245L, 109L, 172L, 204L, 275L, 22L, 66L, 186L, 247L, 17L, 149L, 141L, 177L, 280L, 216L, 40L, 75L, 263L, + 246L, 14L, 81L, 260L, 153L, 45L, 237L, 8L, 117L, 86L, 296L, 146L, 154L, 116L, 38L, 100L, 191L, 175L, 92L, 158L, 192L, + 180L, 256L, 254L, 125L, 222L, 145L, 261L, 155L, 159L, 3L, 206L, 278L, 19L, 31L, 63L, 208L, 55L, 259L, 218L, 111L, + 226L, 33L, 2L, 44L, 297L, 53L, 87L, 16L, 28L, 90L, 207L, 56L, 137L, 128L, 178L, 142L, 143L, 148L, 193L, 229L, 265L, + 97L, 252L, 205L, 150L, 165L, 188L, 52L, 99L, 93L, 1L, 221L, 124L, 210L, 6L, 232L, 21L, 211L, 163L, 96L, 60L, 183L, + 190L, 242L, 42L, 46L, 67L, 126L, 209L, 72L, 194L, 238L, 184L, 39L, 105L, 249L, 61L, 113L, 30L, 77L, 12L, 4L, 51L, + 139L, 20L, 268L, 215L, 292L, 217L, 199L, 32L, 276L, 47L, 225L, 230L, 79L, 71L, 98L, 50L, 13L, 76L, 231L, 250L, 58L, + 68L, 239L, 198L, 293L, 212L, 110L, 59L, 182L, 133L, 170L, 43L, 282L, 281L, 131L, 114L, 196L, 214L, 285L, 70L, 102L, + 279L, 106L, 197L, 257L, 228L, 84L, 235L, 78L, 169L, 240L, 219L, 174L, 82L), + CRIT1 = structure(c( + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), + levels = "Tolerating >=600 mg of peanut protein without dose-limiting symptoms", class = "factor"), + CRIT1FL = structure(c( + 2L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, + 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, + 2L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, + 1L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, + 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, + 2L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, + 2L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, + 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), + levels = c("N", "Y"), class = "factor"), + CRIT2 = structure(c( + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), + levels = "Tolerating >=1000 mg of peanut protein without dose-limiting symptoms", class = "factor"), + CRIT2FL = structure(c( + 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, + 2L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, + 1L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, + 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, + 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, + 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, + 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), + levels = c("N", "Y"), class = "factor" ) ) + + +## ----------------------------------------------------------------------------- +#| code-fold: true +peanut |> + ggplot(aes(x=factor(AVAL), fill=TRT01P)) + + geom_bar( position=position_dodge(preserve = "single")) + + scale_fill_manual(values=c("royalblue", "#fb6a4a", "#ef3b2c", "#cb181d", "#a50f15", "#67000d")) + + xlab("Peanut protein tolerated without dose-limiting symptoms (mg)") + + ylab("Patients") + + theme(legend.position="right") + +peanut |> + group_by(TRT01P) |> + summarize(proportion = sum(CRIT1FL=="Y") / n()) |> + ggplot(aes(x=TRT01P, y=proportion, fill=TRT01P)) + + geom_bar(stat="identity", position=position_dodge()) + + geom_text(aes(label=scales::percent(proportion)), size=7, vjust=c(0, rep(1.5, 5))) + + scale_fill_manual(values=c("royalblue", "#fb6a4a", "#ef3b2c", "#cb181d", "#a50f15", "#67000d")) + + scale_y_continuous(breaks=seq(0, 0.7, 0.1), labels=scales::percent) + + xlab("Tolerating >=600 mg of peanut protein without dose-limiting symptoms") + + ylab("Percentage of patients") + + +## ----peanutmodel1------------------------------------------------------------- +#| eval: false +# model1 <- bf( #---- YOUR CODE HERE --- # ~ E0 + Emax * dose^h/(dose^h + ED50^h), +# family= #---- YOUR CODE HERE --- # , +# nlf(h ~ exp(logh)), nlf(ED50 ~ exp(logED50)), +# E0 ~ 1, logED50 ~ 1, logh ~ 1, Emax ~ 1, +# nl=TRUE) +# +# priors1 <- prior(normal(-2.944, 0.38), nlpar=E0) + +# prior(normal(0, 1), nlpar=logh) + +# prior(normal(0, 6), nlpar=Emax) + +# prior(normal(2.7, 2.5), nlpar=logED50) + + +## ----fitpeanutmodel1---------------------------------------------------------- +#| eval: false +# brmfit1 <- brm( +# formula = model1, +# prior = priors1, +# data = summarize(peanut, y=sum(CRIT1FL=="Y"), n=n(), .by=c(TRT01P, dose)) +# ) + + +## ----------------------------------------------------------------------------- +#| eval: false +# tibble(dose = seq(0, 300, 1), n=1) |> tidybayes::add_epred_rvars(brmfit1) + + +## ----sol_peanutmodel1--------------------------------------------------------- +#| cache.lazy: false +model1 <- bf( y | trials(n) ~ E0 + Emax * dose^h/(dose^h + ED50^h), + family=binomial(link="logit"), + nlf(h ~ exp(logh)), nlf(ED50 ~ exp(logED50)), + E0 ~ 1, logED50 ~ 1, logh ~ 1, Emax ~ 1, + nl=TRUE) + +priors1 <- prior(normal(-2.944, 0.38), nlpar=E0) + + prior(normal(0, 1), nlpar=logh) + + prior(normal(0, 6), nlpar=Emax) + + prior(normal(2.7, 2.5), nlpar=logED50) + + +brmfit1 <- brm( + formula = model1, + prior = priors1, + data = summarize(peanut, y=sum(CRIT1FL=="Y"), n=n(), .by=c(TRT01P, dose)), + refresh=0 +) + +summary(brmfit1) + +tibble(dose = seq(0, 300, 1), n=1) |> + tidybayes::add_epred_rvars(brmfit1) |> + ggplot(aes(x=dose, ydist=.epred)) + + stat_lineribbon() + + scale_fill_brewer(palette="Blues") + + ylab("Model predicted proportion") + + xlab("Dose [mg]") + +pr <- tibble(dose = seq(0, 300, 1), n=1) |> + tidybayes::add_epred_rvars(brmfit1) + +left_join(pr, filter(pr, dose == 0)|> + dplyr::select(-dose) |> + rename(.pbo=.epred), + by="n") |> + mutate(diff = .epred - .pbo) |> + ggplot(aes(x=dose, ydist=diff)) + + stat_lineribbon() + + scale_fill_brewer(palette="Blues") + + ylab("Model predicted difference\nin proportion vs. placebo") + + xlab("Dose [mg]") + + +## ----sol_lognormal------------------------------------------------------------ +#| cache: false +model2 <- bf( logAVAL | cens("interval", logAVALnext) ~ E0 + Emax * dose^h/(dose^h + ED50^h), + family = gaussian(), + nlf(h ~ exp(logh)), nlf(ED50 ~ exp(logED50)), + E0 ~ 1, logED50 ~ 1, logh ~ 1, Emax ~ 1, + nl=TRUE ) + +priors2 <- prior(normal(0, 5), nlpar=E0) + # centered on 1 mg, but + # very uncertain + prior(normal(0, 1), nlpar=logh) + # No particular reason + # to change prior (dose + # response could be + # just as steep here as + # for binomial outcome) + prior(normal(0, 6.5), nlpar=Emax) + # decent prior probability + # for >= 1000 mg, still conceivable could reach 300000 No + # particular reason to change prior here (ED50 could be same as + # for binomial outcome) + prior(normal(2.7, 2.5), nlpar=logED50) + # Additional parameter: residual SD, clearly a decent amount of + # variability, want to + # allow large SD on + # the log-scale + prior(lognormal(5, 10), class=sigma) + +brmfit2 <- brm( + formula = model2, + prior = priors2, + data = peanut |> + mutate(logAVAL = ifelse(AVAL==0, -28, log(AVAL)), + logAVALnext = case_when(AVAL==0 ~ log(3), + AVAL==3 ~ log(10), + AVAL==10 ~ log(100), + AVAL==100 ~ log(300), + AVAL==300 ~ log(600), + AVAL==600 ~ log(1000), + TRUE ~ log(30000))), + refresh=0 + ) + +summary(brmfit2) + + +## ----sol_ordinal-------------------------------------------------------------- +#| cache: false +# Note that we omit E0 from the model, because the expected placebo outcome +# is already described by the intercept parameters of the distribution +model3 <- bf(AVAL ~ Emax * dose^h/(dose^h + ED50^h), + family = cumulative(link = "logit", threshold = "flexible"), + nlf(h ~ exp(logh)), + nlf(ED50 ~ exp(logED50)), + logED50 ~ 1, + logh ~ 1, + Emax ~ 1, + nl=TRUE) + +priors3 <- prior(normal(0, 1), nlpar=logh) + # No particular reason to + # change prior here + prior(normal(0, 6), nlpar=Emax) + # Prior could be + # different (odds from + # one category to the + # next not necessarily + # the same as for top two + # vs. rest) + prior(normal(2.7, 2.5), nlpar=logED50) + # No particular + # reason to change + # prior here + prior(student_t(3, 0, 2.5), class=Intercept) + + prior(student_t(3, -0.2, 1), class=Intercept, coef=1) + + prior(student_t(3, 2.197, 1), class=Intercept, coef=5) + +brmfit3 <- brm( + formula = model3, + prior = priors3, + data = mutate(peanut, AVAL = ordered(AVAL)), + refresh=0 + ) + +summary(brmfit3) + diff --git a/workshops/goettingen2024/exercises/bamdd_goettingen2024_exercises.html b/workshops/goettingen2024/exercises/bamdd_goettingen2024_exercises.html new file mode 100644 index 0000000..dec5398 --- /dev/null +++ b/workshops/goettingen2024/exercises/bamdd_goettingen2024_exercises.html @@ -0,0 +1,3593 @@ + + + + + + + + + + + + Exercises Hierarchical Models in Preclincal Research + + + + + + + + + + + + + + + +
+
+ +
+ +
+
+
+

Setup

+ +
+
+

R Session

+
+

Note: All shown code can be copied by simply clicking the top right icon of the code block. The code blocks from the main presentation can also be copied by the same icon, which is visible when hovering over the respective block with your mouse.

+
+

For the course a RStudio server has been setup by the University of Göttingen: http://134.76.20.1:8787

+

To run exercises on your hardware please follow the instructions below.

+

Stan

+

Please first install the cmdstanr R package following the instructions from their Getting started with CmdStanR article. This also covers installation of the necessary compiler and accompanying C++ toolchain as well as cmdstan itself.

+

An alternative is to use rstan as described on the wiki page for rstan to get started. In this case, please use as backend for brms the setting rstan. Note that the use of the cmdstanr backend is recommended over rstan allowing to use more recent versions of Stan. Moreover, the instructions for installing a C++ toolchain is better described as part of the respective cmdstan guide chapter.

+

C++ toolchain installation

+
    +
  • Windows: cmdstanr can automatically install the RTools based C++ toolchain via
  • +
+
+
cmdstanr::check_cmdstan_toolchain(fix=T)
+
+ +
+
# install.packages("remotes")
+remotes::install_github("coatless-mac/macrtools")
+macrtools::macos_rtools_install()
+
+

R packages

+

Please also ensure to have all R packages installed as listed on the next preliminary code section.

+
+
# in case packages are missing, please run:
+install.packages(c("here", "ggplot2", "dplyr", "knitr", "brms", "posterior", "tidybayes", "RBesT", "ggrepel", "patchwork", "ggdist", "withr"))
+
+

Web-site

+

To download the full web-site to complement the material you may do so using the following R code snippet:

+
+
bamdd_zip <- tempfile(fileext=".zip")
+download.file("https://github.com/Novartis/bamdd/archive/refs/heads/main.zip", bamdd_zip)
+## extracts web-site into the users home
+unzip(bamdd_zip, exdir=normalizePath("~"))
+browseURL(normalizePath(file.path("~", "bamdd-main")))
+# to install all dependencies needed to build the web-site, please run
+source(file.path("~", "bamdd-main", "src", "install_dependencies.R"))
+
+
+
+

Preliminary code

+

First load the required packages and set some options as described in the case study.

+
+
# uncomment below and set to the filename of you R file for the
+# exercises
+# here::i_am("your-exercise-file.R")
+library(here)
+library(ggplot2)
+library(dplyr)
+library(knitr)
+library(brms)
+library(posterior)
+library(tidybayes)
+library(bayesplot)
+library(RBesT)
+library(ggrepel)
+library(patchwork)
+library(ggdist)
+
+options(
+  # how many processor cores would you like to use?
+  mc.cores = 4, 
+  # how would you like to access Stan?
+  brms.backend = "cmdstanr",
+  # cache model binaries
+  cmdstanr_write_stan_file_dir=here::here("_brms-cache"),
+  # no need to normalize likelihoods
+  brms.normalize = FALSE
+)
+
+dir.create(here::here("_brms-cache"), FALSE)
+set.seed(254335)
+
+# in case rstan is used as backend, consider to enable model caching
+# by enabling the following line
+# rstan_options(auto_write = TRUE)
+
+# Set defaults for ggplot2 ----
+theme_set(theme_bw(base_size=18))
+
+scale_colour_discrete <- function(...) {
+  # Alternative: ggsci::scale_color_nejm(...)
+  # scale_colour_brewer(..., palette="Set1")
+  ggthemes::scale_colour_colorblind(...)
+}
+scale_fill_discrete <- function(...) {
+  # Alternative: ggsci::scale_fill_nejm(...)
+  #scale_fill_brewer(..., palette="Set1")
+  ggthemes::scale_fill_colorblind(...)
+}
+scale_colour_continuous <- function(...) {
+  scale_colour_viridis_c(..., option="turbo")
+}
+update_geom_defaults("point", list(size=2))
+update_geom_defaults("line", list(size=1.5))
+
+
+
+

Resources

+ +
+
+
+

Historical Control Data

+ +
+
+

Exercise setup

+

Create the region dataset used in the example:

+
+
withr::with_seed(654873,
+                 AS_region <- bind_cols(RBesT::AS, region=sample(c("asia", "europe", "north_america"), 8, TRUE)))
+kable(AS_region)
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
studynrregion
Study 110723europe
Study 24412asia
Study 35119europe
Study 4399europe
Study 513939asia
Study 6206north_america
Study 7789europe
Study 83510asia
+
+
+

And fit the model as shown in the case study:

+
+
model <- bf(r | trials(n) ~ 1 + (1 | study), family=binomial)
+
+model_prior <- prior(normal(0, 2), class=Intercept) +
+    prior(normal(0, 1), class=sd, coef=Intercept, group=study)
+
+map_mc_brms  <- brm(model, AS_region, prior = model_prior,
+                    seed = 4767, control=list(adapt_delta=0.99),
+                    silent = 2, refresh = 0)
+map_mc_brms
+
+
 Family: binomial 
+  Links: mu = logit 
+Formula: r | trials(n) ~ 1 + (1 | study) 
+   Data: AS_region (Number of observations: 8) 
+  Draws: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
+         total post-warmup draws = 4000
+
+Multilevel Hyperparameters:
+~study (Number of levels: 8) 
+              Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
+sd(Intercept)     0.38      0.20     0.06     0.88 1.00     1088     1254
+
+Regression Coefficients:
+          Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
+Intercept    -1.10      0.19    -1.47    -0.70 1.00     1398     1575
+
+Draws were sampled using sample(hmc). For each parameter, Bulk_ESS
+and Tail_ESS are effective sample size measures, and Rhat is the potential
+scale reduction factor on split chains (at convergence, Rhat = 1).
+
+
+
+
+

Exercise 1: Posterior predictive check

+

Create a posterior predictive check based on the predictive distribution for the response rate.

+

Steps:

+
    +
  1. Use posterior_predict to create samples from the predictive distribution of outcomes per trial.
  2. +
  3. Use sweep(predictive, 2, AS_region$n, "/") to convert these samples from the predictive distribution of the outcome counts to samples from the predictive distribution for responder rates.
  4. +
  5. Use ppc_intervals from bayesplot to create a plot showing your results. Consider using the with function to refer more easily to the data columns of the analysis data set.
  6. +
  7. Redo the above using from the tidybayes package the add_predicted_rvars function adding the predictions directly to the analysis data set and then redo task 2 and 3. To convert a rvars column to the respective draws format of bayesplot you can use the as_draws_matrix from the posterior package.
  8. +
+
+
+

Exercise 2: Fixed vs random effect

+

Redo the analysis with region, but treat region as a fixed effect. Evaluate the informativeness of the obtained MAP priors. The model formula for brms should look like

+
+
region_model_fixed <- bf(r | trials(n) ~ 1 + region + (1 | study), family=binomial)
+
+

Steps:

+
    +
  1. Consider the prior for the region fixed effect first. The reference region is included in the intercept. The reference region is implicitly defined by the first level of the variable region when defined as factor.

    +
      +
    • Define asia to be the reference region in the example. Also include a level other in the set of levels.
    • +
    • Assume that an odds-ratio of \(2\) between regions can be seen as very large such that a prior of \(\text{N}(0, (\log(2)/1.96)^2)\) for the region main effect is adequate.
    • +
  2. +
  3. Obtain the MAP prior for each region by using the AS_region_all data frame defined below and apply posterior_linpred as shown in the case study.

  4. +
  5. Convert the MCMC samples from the MAP prior distribution into mixture distributions with the same code as in the case study.

  6. +
  7. Calculate the effective sample size (ESS) for each prior distribution with the ess function from the RBesT R package.

  8. +
+
+
AS_region_all <- data.frame(region=c("asia", "europe", "north_america", "other")) |>
+    mutate(study=paste("new_study", region, sep="_"), r=0, n=6)
+
+
+
+

Exercise 3: Normal endpoint meta-analysis

+

Run the analysis for the normal endpoint in the crohn data set of RBesT. Refer to the RBesT vignette for a normal endpoint on more details and context.

+

Steps:

+
    +
  1. Use as family=gaussian and use the se response modifier in place of trials to specify a known standard error. More details on the additional response information specifiers can be found for the documentation of brmsformula.
  2. +
  3. Use the same priors as proposed in the vignette from RBesT.
  4. +
  5. Compare the obtained MAP prior (in MCMC sample form) from RBesT and brms.
  6. +
+
+
+
+

Solutions Historical Control

+ +
+
+

Exercise 1: Posterior predictive check

+
+
pp_count_AS_region <- posterior_predict(map_mc_brms)
+
+pp_rate_AS_region <- sweep(pp_count_AS_region, 2, AS_region$n, "/")
+
+head(pp_rate_AS_region)
+
+
          [,1]      [,2]      [,3]      [,4]      [,5] [,6]      [,7]      [,8]
+[1,] 0.1495327 0.3181818 0.2549020 0.2051282 0.3165468 0.35 0.3205128 0.2571429
+[2,] 0.2149533 0.2727273 0.3529412 0.1538462 0.2661871 0.30 0.2435897 0.2285714
+[3,] 0.2336449 0.2272727 0.1372549 0.3076923 0.2158273 0.25 0.2435897 0.2857143
+[4,] 0.2523364 0.3409091 0.2352941 0.3846154 0.2805755 0.20 0.2307692 0.2857143
+[5,] 0.2056075 0.1590909 0.2745098 0.3076923 0.2589928 0.25 0.2179487 0.3714286
+[6,] 0.2336449 0.3181818 0.2352941 0.2564103 0.2014388 0.30 0.2820513 0.2571429
+
+
with(AS_region, ppc_intervals(r / n, pp_rate_AS_region))  +
+    scale_x_continuous("Study", breaks=1:nrow(AS_region), labels=AS_region$study) +
+    ylab("Responder Rate") +
+    coord_flip() +
+    theme(legend.position="right",
+          # suppress vertical grid lines for better readability of intervals
+          panel.grid.major.y = element_blank())
+
+
+
+

+
+
+
+
pp_AS_region <- AS_region |>
+    add_predicted_rvars(map_mc_brms, value="pp_r") |>
+    mutate(pp_rate=pp_r/n)
+
+pp_AS_region
+
+
# A tibble: 8 × 6
+  study       n     r region               pp_r       pp_rate
+  <chr>   <dbl> <dbl> <chr>          <rvar[1d]>    <rvar[1d]>
+1 Study 1   107    23 europe         24.3 ± 5.7  0.23 ± 0.053
+2 Study 2    44    12 asia           11.4 ± 3.6  0.26 ± 0.081
+3 Study 3    51    19 europe         16.1 ± 4.4  0.32 ± 0.086
+4 Study 4    39     9 europe          9.3 ± 3.3  0.24 ± 0.085
+5 Study 5   139    39 asia           37.8 ± 6.9  0.27 ± 0.049
+6 Study 6    20     6 north_america   5.3 ± 2.3  0.27 ± 0.115
+7 Study 7    78     9 europe         13.5 ± 4.7  0.17 ± 0.060
+8 Study 8    35    10 asia            9.3 ± 3.2  0.27 ± 0.091
+
+
with(pp_AS_region, ppc_intervals(r / n, as_draws_matrix(pp_rate)))  +
+    scale_x_continuous("Study", breaks=1:nrow(AS_region), labels=AS_region$study) +
+    ylab("Responder Rate") +
+    coord_flip() +
+    theme(legend.position="right",
+          # suppress vertical grid lines for better readability of intervals
+          panel.grid.major.y = element_blank())
+
+
+
+

+
+
+
+
+
+
+

Exercise 2: Fixed vs random effect

+
+
AS_region_all <- data.frame(region=c("asia", "europe", "north_america", "other")) |>
+    mutate(study=paste("new_study", region, sep="_"), r=0, n=6)
+
+## to get brms to include the other factor level in the model, we have
+## to add a fake row with region "other" and n=0
+AS_region_2 <- mutate(bind_rows(AS_region, mutate(AS_region_all, n=0)[4,]),
+                      region=factor(region, levels=c("asia", "europe", "north_america", "other")))
+
+str(AS_region_2)
+
+
'data.frame':   9 obs. of  4 variables:
+ $ study : chr  "Study 1" "Study 2" "Study 3" "Study 4" ...
+ $ n     : num  107 44 51 39 139 20 78 35 0
+ $ r     : num  23 12 19 9 39 6 9 10 0
+ $ region: Factor w/ 4 levels "asia","europe",..: 2 1 2 2 1 3 2 1 4
+
+
model_fixed <- bf(r | trials(n) ~ 1 + region + (1|study), family=binomial)
+
+get_prior(model_fixed, AS_region_2)
+
+
                prior     class                coef group resp dpar nlpar lb ub
+               (flat)         b                                                
+               (flat)         b        regioneurope                            
+               (flat)         b regionnorth_america                            
+               (flat)         b         regionother                            
+ student_t(3, 0, 2.5) Intercept                                                
+ student_t(3, 0, 2.5)        sd                                            0   
+ student_t(3, 0, 2.5)        sd                     study                  0   
+ student_t(3, 0, 2.5)        sd           Intercept study                  0   
+       source
+      default
+ (vectorized)
+ (vectorized)
+ (vectorized)
+      default
+      default
+ (vectorized)
+ (vectorized)
+
+
model_fixed_prior <- prior(normal(0, 2), class=Intercept) +
+    prior(normal(0, 1), class=sd, coef=Intercept, group=study) +
+    prior(normal(0, log(2)/1.96), class=b)
+
+fixed_mc_brms  <- brm(model_fixed, AS_region_2, prior=model_fixed_prior,
+                      seed=4767,
+                      silent = 2, refresh = 0, control=list(adapt_delta=0.99))
+
+fixed_mc_brms
+
+
 Family: binomial 
+  Links: mu = logit 
+Formula: r | trials(n) ~ 1 + region + (1 | study) 
+   Data: AS_region_2 (Number of observations: 9) 
+  Draws: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
+         total post-warmup draws = 4000
+
+Multilevel Hyperparameters:
+~study (Number of levels: 9) 
+              Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
+sd(Intercept)     0.38      0.22     0.04     0.92 1.00     1314     1612
+
+Regression Coefficients:
+                    Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
+Intercept              -1.02      0.23    -1.51    -0.57 1.00     1778     1669
+regioneurope           -0.17      0.26    -0.66     0.34 1.00     2226     2381
+regionnorth_america     0.03      0.31    -0.60     0.63 1.00     3351     2898
+regionother             0.00      0.35    -0.68     0.66 1.00     3691     2599
+
+Draws were sampled using sample(hmc). For each parameter, Bulk_ESS
+and Tail_ESS are effective sample size measures, and Rhat is the potential
+scale reduction factor on split chains (at convergence, Rhat = 1).
+
+
post_regions <- posterior_linpred(fixed_mc_brms,
+                                  newdata=AS_region_all,
+                                  transform=TRUE,
+                                  allow_new_levels=TRUE,
+                                  sample_new_levels="gaussian")
+
+head(post_regions)
+
+
          [,1]      [,2]      [,3]      [,4]
+[1,] 0.3788833 0.2384359 0.1931445 0.3315359
+[2,] 0.2635854 0.2223075 0.2449675 0.3184930
+[3,] 0.2613896 0.2025416 0.3473378 0.2283663
+[4,] 0.2744635 0.2252943 0.2307571 0.2308691
+[5,] 0.2788685 0.2634883 0.2260318 0.1963201
+[6,] 0.1659754 0.2146373 0.2868929 0.1606706
+
+
colnames(post_regions) <- AS_region_all$region
+map_region <- list()
+for(r in AS_region_all$region) {
+    map_region[[r]] <- mixfit(post_regions[,r], type="beta", Nc=3, constrain_gt1=TRUE)
+}
+
+kable(bind_rows(lapply(map_region, summary), .id="MAP"), digits=3)
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MAPmeansd2.5%50.0%97.5%
asia0.2730.0970.1060.2660.525
europe0.2440.0910.0980.2330.487
north_america0.2850.1070.1050.2710.548
other0.2790.1120.0960.2670.540
+
+
sapply(map_region, ess)
+
+
         asia        europe north_america         other 
+     30.95132      33.92309      20.68039      16.27676 
+
+
+
+
+

Exercise 3: Normal endpoint meta-analysis

+
+
crohn <- RBesT::crohn
+
+crohn_sigma <- 88
+crohn$y.se <- crohn_sigma/sqrt(crohn$n)
+
+library(RBesT)
+set.seed(1234)
+rbest_normal_map_mcmc <- gMAP(cbind(y, y.se) ~ 1 | study, 
+                              weights=n, data=crohn,
+                              family=gaussian,
+                              beta.prior=cbind(0, crohn_sigma),
+                              tau.dist="HalfNormal",tau.prior=cbind(0,crohn_sigma/2))
+
+model_normal <- bf(y | se(y.se) ~ 1 + (1 | study), family=gaussian())
+
+prior_normal <- prior(normal(0, 88), class=Intercept) +
+    prior(normal(0, 88/2), class=sd, coef=Intercept, group=study)
+
+brms_normal_map_mcmc <- brm(model_normal, crohn, prior=prior_normal,
+                            seed=4767,
+                            silent = 2, refresh = 0, control=list(adapt_delta=0.99))
+
+## comparing the outputs we see that the random effect posterior
+## matches...
+rbest_normal_map_mcmc
+
+
Generalized Meta Analytic Predictive Prior Analysis
+
+Call:  gMAP(formula = cbind(y, y.se) ~ 1 | study, family = gaussian, 
+    data = crohn, weights = n, tau.dist = "HalfNormal", tau.prior = cbind(0, 
+        crohn_sigma/2), beta.prior = cbind(0, crohn_sigma))
+
+Exchangeability tau strata: 1 
+Prediction tau stratum    : 1 
+Maximal Rhat              : 1 
+Estimated reference scale : 88 
+
+Between-trial heterogeneity of tau prediction stratum
+ mean    sd  2.5%   50% 97.5% 
+14.60  9.65  1.47 12.70 39.10 
+
+MAP Prior MCMC sample
+ mean    sd  2.5%   50% 97.5% 
+-49.6  19.6 -91.0 -48.4 -11.0 
+
+
brms_normal_map_mcmc
+
+
 Family: gaussian 
+  Links: mu = identity; sigma = identity 
+Formula: y | se(y.se) ~ 1 + (1 | study) 
+   Data: crohn (Number of observations: 6) 
+  Draws: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
+         total post-warmup draws = 4000
+
+Multilevel Hyperparameters:
+~study (Number of levels: 6) 
+              Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
+sd(Intercept)    14.25     10.02     1.07    40.33 1.00      699      885
+
+Regression Coefficients:
+          Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
+Intercept   -49.26      9.10   -68.11   -32.85 1.00     1061     1037
+
+Further Distributional Parameters:
+      Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
+sigma     0.00      0.00     0.00     0.00   NA       NA       NA
+
+Draws were sampled using sample(hmc). For each parameter, Bulk_ESS
+and Tail_ESS are effective sample size measures, and Rhat is the potential
+scale reduction factor on split chains (at convergence, Rhat = 1).
+
+
brms_normal_map <- posterior_epred(brms_normal_map_mcmc,
+                                   newdata=data.frame(study="new", n=1, y=0, y.se=88),
+                                   allow_new_levels=TRUE,
+                                   sample_new_levels="gaussian")
+
+## ... and the MAP prior is also the same
+summarise_draws(brms_normal_map, mean, sd, ~quantile2(., probs = c(0.025, 0.5, 0.975)))
+
+
# A tibble: 1 × 6
+  variable  mean    sd  q2.5   q50 q97.5
+  <chr>    <dbl> <dbl> <dbl> <dbl> <dbl>
+1 ...1     -48.9  18.8 -90.4 -48.0 -10.5
+
+
+
+
+
+

Dose-finding

+ +
+
+

Peanut allergy exercise overview

+

This exercises accompanies the dose finding case study.

+

In a hypothetical phase 2b trial children and adolescents with peanut allergy were randomly assigned to placebo or 5 doses (5 to 300 mg) of a new drug.

+

After 26 weeks the patients underwent a double-blind placebo-controlled food challenge and the primary endpoint was the proportion of patients that could ingest 600 mg or more of peanut protein without experiencing dose-limiting symptoms.

+

The plots below show an overview of the data. Note that no placebo patients were considered “responders” per the primary endpoint definition.

+
+
+Show data setup code +
peanut <- tibble(
+  TRT01P = structure(c(
+    6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L,
+    6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 5L, 5L, 5L, 5L, 5L, 5L,
+    5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L,
+    5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L,
+    4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L,
+    4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
+    3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
+    3L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
+    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L,
+    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L
+  ),levels = c("PBO", "5 mg", "15 mg", "50 mg", "150 mg", "300 mg"), class = "factor"),
+  dose = c(
+    300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L,
+    300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L,
+    300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 300L, 150L, 150L, 150L, 150L, 150L, 150L, 150L,
+    150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L,
+    150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L, 150L,
+    150L, 150L, 150L, 150L, 150L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L,
+    50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L,
+    50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L,
+    15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L,
+    15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L,
+    5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L,
+    5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
+    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
+    0L, 0L),
+  AVAL = c(
+    1000L, 100L, 0L, 600L, 600L, 300L, 300L, 10L, 10L, 100L, 1000L, 300L, 10L, 1000L, 1000L, 1000L, 3L, 3L, 600L, 300L,
+    1000L, 1000L, 100L, 1000L, 600L, 600L, 1000L, 1000L, 1000L, 300L, 600L, 1000L, 1000L, 1000L, 1000L, 1000L, 300L,
+    1000L, 600L, 1000L, 300L, 1000L, 600L, 600L, 1000L, 1000L, 600L, 1000L, 1000L, 1000L, 1000L, 600L, 1000L, 1000L,
+    1000L, 0L, 600L, 300L, 1000L, 1000L, 1000L, 100L, 1000L, 1000L, 600L, 1000L, 1000L, 1000L, 600L, 300L, 600L, 600L,
+    100L, 600L, 1000L, 300L, 10L, 3L, 1000L, 300L, 300L, 1000L, 300L, 300L, 10L, 1000L, 1000L, 10L, 10L, 600L, 3L, 10L,
+    600L, 600L, 600L, 1000L, 100L, 1000L, 1000L, 10L, 1000L, 3L, 10L, 1000L, 100L, 1000L, 100L, 10L, 300L, 10L, 100L,
+    1000L, 0L, 1000L, 100L, 3L, 10L, 100L, 100L, 300L, 1000L, 1000L, 1000L, 10L, 1000L, 3L, 3L, 600L, 600L, 10L, 3L,
+    600L, 600L, 300L, 300L, 1000L, 3L, 3L, 1000L, 10L, 1000L, 1000L, 600L, 100L, 300L, 600L, 10L, 100L, 0L, 100L, 3L,
+    0L, 10L, 3L, 600L, 300L, 300L, 300L, 600L, 300L, 100L, 3L, 0L, 10L, 600L, 300L, 10L, 300L, 600L, 1000L, 600L, 600L,
+    0L, 0L, 600L, 600L, 600L, 0L, 0L, 300L, 100L, 0L, 10L, 300L, 1000L, 300L, 600L, 600L, 300L, 10L, 600L, 100L, 100L,
+    300L, 3L, 3L, 300L, 1000L, 10L, 3L, 100L, 3L, 100L, 100L, 300L, 3L, 3L, 600L, 300L, 3L, 3L, 3L, 300L, 3L, 0L, 10L,
+    3L, 300L, 10L, 10L, 600L, 0L, 300L, 600L, 0L, 0L, 100L, 100L, 10L, 100L, 10L, 100L, 600L, 0L, 600L, 0L, 10L, 100L,
+    0L, 0L, 0L, 0L, 3L, 10L, 3L, 300L, 600L, 0L, 0L, 300L, 10L, 10L, 100L, 300L, 0L, 0L, 0L, 3L, 0L, 0L, 10L, 0L, 300L,
+    3L, 0L, 0L, 0L, 0L, 100L, 3L, 0L, 3L, 10L, 10L, 3L, 0L, 3L, 10L, 3L, 0L, 0L, 3L, 100L, 0L, 0L, 300L, 0L, 0L, 0L,
+    0L, 0L, 0L, 0L, 3L, 0L, 3L, 0L, 0L, 0L, 0L),
+  PARAM = structure(
+    c(
+      1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+      1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+      1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+      1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+      1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+      1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+      1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+      1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+      1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+      1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+      1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L),
+    levels = "Tolerated amount of peanut protein (mg)", class = "factor"),
+  USUBJID = c(
+    129L, 103L, 104L, 185L, 34L, 15L, 140L, 151L, 7L, 144L, 200L, 23L, 138L, 115L, 255L, 147L, 224L, 101L, 156L, 284L,
+    136L, 248L, 179L, 298L, 168L, 295L, 289L, 241L, 36L, 27L, 123L, 266L, 11L, 291L, 236L, 130L, 173L, 195L, 203L, 160L,
+    274L, 167L, 290L, 94L, 9L, 269L, 122L, 135L, 64L, 26L, 95L, 10L, 5L, 234L, 161L, 299L, 88L, 69L, 35L, 233L, 286L,
+    85L, 91L, 189L, 80L, 152L, 223L, 287L, 244L, 57L, 108L, 18L, 62L, 157L, 300L, 283L, 164L, 243L, 89L, 220L, 24L, 271L,
+    166L, 118L, 201L, 127L, 121L, 41L, 267L, 213L, 49L, 73L, 202L, 134L, 112L, 25L, 227L, 29L, 251L, 273L, 119L, 132L,
+    74L, 270L, 83L, 37L, 181L, 258L, 253L, 48L, 120L, 54L, 277L, 176L, 65L, 264L, 107L, 171L, 262L, 162L, 187L, 272L,
+    288L, 294L, 245L, 109L, 172L, 204L, 275L, 22L, 66L, 186L, 247L, 17L, 149L, 141L, 177L, 280L, 216L, 40L, 75L, 263L,
+    246L, 14L, 81L, 260L, 153L, 45L, 237L, 8L, 117L, 86L, 296L, 146L, 154L, 116L, 38L, 100L, 191L, 175L, 92L, 158L, 192L,
+    180L, 256L, 254L, 125L, 222L, 145L, 261L, 155L, 159L, 3L, 206L, 278L, 19L, 31L, 63L, 208L, 55L, 259L, 218L, 111L,
+    226L, 33L, 2L, 44L, 297L, 53L, 87L, 16L, 28L, 90L, 207L, 56L, 137L, 128L, 178L, 142L, 143L, 148L, 193L, 229L, 265L,
+    97L, 252L, 205L, 150L, 165L, 188L, 52L, 99L, 93L, 1L, 221L, 124L, 210L, 6L, 232L, 21L, 211L, 163L, 96L, 60L, 183L,
+    190L, 242L, 42L, 46L, 67L, 126L, 209L, 72L, 194L, 238L, 184L, 39L, 105L, 249L, 61L, 113L, 30L, 77L, 12L, 4L, 51L,
+    139L, 20L, 268L, 215L, 292L, 217L, 199L, 32L, 276L, 47L, 225L, 230L, 79L, 71L, 98L, 50L, 13L, 76L, 231L, 250L, 58L,
+    68L, 239L, 198L, 293L, 212L, 110L, 59L, 182L, 133L, 170L, 43L, 282L, 281L, 131L, 114L, 196L, 214L, 285L, 70L, 102L,
+    279L, 106L, 197L, 257L, 228L, 84L, 235L, 78L, 169L, 240L, 219L, 174L, 82L),
+  CRIT1 = structure(c(
+    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L),
+    levels = "Tolerating >=600 mg of peanut protein without dose-limiting symptoms", class = "factor"),
+  CRIT1FL = structure(c(
+    2L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L,
+    2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L,
+    2L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 1L,
+    1L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 2L,
+    1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 2L, 1L,
+    2L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L,
+    2L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L,
+    1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L,
+    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L,
+    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L),
+    levels = c("N", "Y"), class = "factor"),
+  CRIT2 = structure(c(
+    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L),
+    levels = "Tolerating >=1000 mg of peanut protein without dose-limiting symptoms", class = "factor"),
+  CRIT2FL = structure(c(
+    2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 2L, 2L,
+    2L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 1L,
+    1L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 1L,
+    1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 2L,
+    1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 1L,
+    2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+    1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+    1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
+    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L),
+    levels = c("N", "Y"), class = "factor" ) )
+
+
+
+
+Code +
peanut |>
+  ggplot(aes(x=factor(AVAL), fill=TRT01P)) +
+  geom_bar( position=position_dodge(preserve = "single")) +
+  scale_fill_manual(values=c("royalblue", "#fb6a4a", "#ef3b2c", "#cb181d", "#a50f15", "#67000d")) +
+  xlab("Peanut protein tolerated without dose-limiting symptoms (mg)") +
+  ylab("Patients") +
+  theme(legend.position="right")
+
+
+
+
+

+
+
+
+
+Code +
peanut |>
+  group_by(TRT01P) |>
+  summarize(proportion = sum(CRIT1FL=="Y") / n()) |>
+  ggplot(aes(x=TRT01P, y=proportion, fill=TRT01P)) +
+  geom_bar(stat="identity", position=position_dodge()) +
+  geom_text(aes(label=scales::percent(proportion)), size=7, vjust=c(0, rep(1.5, 5))) +
+  scale_fill_manual(values=c("royalblue", "#fb6a4a", "#ef3b2c", "#cb181d", "#a50f15", "#67000d")) +
+  scale_y_continuous(breaks=seq(0, 0.7, 0.1), labels=scales::percent) +
+  xlab("Tolerating >=600 mg of peanut protein without dose-limiting symptoms") +
+  ylab("Percentage of patients")
+
+
+
+
+

+
+
+
+
+
+
+

Excercise 1: Emax logistic regression

+

Fit a sigmoid Emax logistic regression model (i.e. family=binomial(link="logit")). To accelerate likelihood evaluations, first summarize data as “responders” y out of n patients per dose. We tell brms to use this information using y | trials(n) ~ ....

+

We expect the true placebo proportion to be around 0.05 (-2.944 on the logit scale) with much more than 0.1 or much less than 0.02 considered unlikely. It is a-priori at least possible that there is a huge treatment effect such as 95% versus 5% responders (difference on the log-scale close to 6), but we are at least mildly skeptical.

+

The dose response is a-priori somewhat likely to follow a Emax curve (with Hill parameter near 1), but we wish to allow for the possibility of a steeper or shallower curve. The dose with half the effect (ED50) might be near 15 mg, but have considerable uncertainty around that.

+
+
model1 <- bf( #---- YOUR CODE HERE --- # ~ E0 + Emax * dose^h/(dose^h + ED50^h),
+              family= #---- YOUR CODE HERE --- # ,
+              nlf(h ~ exp(logh)), nlf(ED50 ~ exp(logED50)),
+              E0 ~ 1, logED50 ~ 1, logh ~ 1, Emax ~ 1, 
+              nl=TRUE)
+
+priors1 <- prior(normal(-2.944, 0.38), nlpar=E0) +
+           prior(normal(0, 1), nlpar=logh) +
+           prior(normal(0, 6), nlpar=Emax) +
+           prior(normal(2.7, 2.5), nlpar=logED50)
+
+

Now fit the model

+
+
brmfit1 <- brm(
+  formula = model1,
+  prior = priors1, 
+  data = summarize(peanut, y=sum(CRIT1FL=="Y"), n=n(), .by=c(TRT01P, dose))
+)
+
+

Now use

+
+
tibble(dose = seq(0, 300, 1), n=1) |> tidybayes::add_epred_rvars(brmfit1)
+
+

to obtain predicted proportions for every dose from 0 to 300 mg.

+

Then, plot the curve of predicted proportions for each of these doses using ggplot2 and ggdist (using ydist=.epred in the aesthetics and the stat_lineribbon() geom from the ggdist package).

+

If you prefer, replace the default fill colors e.g. with shades of blue using + scale_fill_brewer(palette="Blues")

+

Next obtain the posterior distribution for the difference in proportions for each of these dose levels compared with placebo.

+
+
+

Excercise 2: ordinal outcome and interval censored

+

Try to perform a more efficient statistical analysis by either using an ordinal outcome or treating the data as interval censored.

+

Interval censored

+

Try treating the data about the logarithm of the amount of protein tolerated as interval censored (\(-\infty\) to \(< \log(3)\), \(>= \log(3)\) to \(< \log(10)\), …) using logAVAL | cens("interval", logAVALnext) as endpoint and with family = gaussian(). For the latter approach you might have to set log(0) to a very low number such as -28 (approximate \(\log(\text{weight})\) of one single peanut protein molecule) and assume the upper interval end when a patient could tolerate 1000 mg to, say, \(\log(30000)\) (approximately 100 peanut kernels). This achieves approximately the same thing as setting these to \(-\infty\) and \(\infty\), but is handled better by brms/Stan.

+

How would you change the prior distributions in this case?

+

Ordinal outcome aproach

+

Now use an ordinal outcome via family = cumulative(link = "logit", threshold = "flexible"). Details of this model are described in a journal article, for which there is also a PsyArXiv preprint in case you do not have access to the journal.

+

Note that the placebo response is described by a series of \(K-1\) ordered thresholds \(\theta_1, \ldots, \theta_{K-1}\) on the logit scale for \(K\) ordered categories. For the placebo group, the probability of being in categories \(k=1, \ldots, K-1\) is be given by \(\text{logit}^{-1} \theta_k\) and for category \(K\) by \(1-\text{logit}^{-1} \theta_{K-1}\). In this case, these parameters will appear in summary(brmfit3) as Intercept[1], …, Intercept[6].

+

How would you change the model and the prior distributions in this case?

+

Note, if we had a baseline amount of protein tolerated, we could treat this as a monotonic covariate e.g. using mo(BASE) or assume a particular functional form.

+
+
+
+

Solutions Dose-Finding

+ +
+
+

Excercise 1: Emax logistic regression

+
+
model1 <- bf( y | trials(n) ~ E0 + Emax * dose^h/(dose^h + ED50^h),
+              family=binomial(link="logit"),
+              nlf(h ~ exp(logh)), nlf(ED50 ~ exp(logED50)),
+              E0 ~ 1, logED50 ~ 1, logh ~ 1, Emax ~ 1, 
+              nl=TRUE)
+
+priors1 <- prior(normal(-2.944, 0.38), nlpar=E0) +
+           prior(normal(0, 1), nlpar=logh) +
+           prior(normal(0, 6), nlpar=Emax) +
+           prior(normal(2.7, 2.5), nlpar=logED50)
+
+
+brmfit1 <- brm(
+  formula = model1,
+  prior = priors1, 
+  data = summarize(peanut, y=sum(CRIT1FL=="Y"), n=n(), .by=c(TRT01P, dose)),
+  refresh=0
+)
+
+
Running MCMC with 4 parallel chains...
+
+Chain 1 finished in 0.2 seconds.
+Chain 2 finished in 0.2 seconds.
+Chain 3 finished in 0.2 seconds.
+Chain 4 finished in 0.2 seconds.
+
+All 4 chains finished successfully.
+Mean chain execution time: 0.2 seconds.
+Total execution time: 0.3 seconds.
+
+
summary(brmfit1)
+
+
 Family: binomial 
+  Links: mu = logit 
+Formula: y | trials(n) ~ E0 + Emax * dose^h/(dose^h + ED50^h) 
+         h ~ exp(logh)
+         ED50 ~ exp(logED50)
+         E0 ~ 1
+         logED50 ~ 1
+         logh ~ 1
+         Emax ~ 1
+   Data: summarize(peanut, y = sum(CRIT1FL == "Y"), n = n() (Number of observations: 6) 
+  Draws: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
+         total post-warmup draws = 4000
+
+Regression Coefficients:
+                  Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
+E0_Intercept         -3.22      0.33    -3.89    -2.58 1.00     1411     1841
+logED50_Intercept     3.58      1.17     1.94     6.42 1.00      996      859
+logh_Intercept       -0.59      0.38    -1.25     0.20 1.00     1028     1454
+Emax_Intercept        5.43      1.54     3.41     9.30 1.00      872      865
+
+Draws were sampled using sample(hmc). For each parameter, Bulk_ESS
+and Tail_ESS are effective sample size measures, and Rhat is the potential
+scale reduction factor on split chains (at convergence, Rhat = 1).
+
+
tibble(dose = seq(0, 300, 1), n=1) |> 
+  tidybayes::add_epred_rvars(brmfit1) |>
+  ggplot(aes(x=dose, ydist=.epred)) +
+  stat_lineribbon() +
+  scale_fill_brewer(palette="Blues") +
+  ylab("Model predicted proportion") +
+  xlab("Dose [mg]")
+
+
+
+

+
+
+
+
pr <- tibble(dose = seq(0, 300, 1), n=1) |> 
+    tidybayes::add_epred_rvars(brmfit1)
+
+left_join(pr, filter(pr, dose == 0)|> 
+              dplyr::select(-dose) |> 
+              rename(.pbo=.epred), 
+          by="n") |>
+    mutate(diff = .epred - .pbo) |>
+    ggplot(aes(x=dose, ydist=diff)) +
+    stat_lineribbon() +
+    scale_fill_brewer(palette="Blues") +
+    ylab("Model predicted difference\nin proportion vs. placebo") +
+    xlab("Dose [mg]")
+
+
+
+

+
+
+
+
+
+
+

Excercise 2: ordinal outcome and interval censored

+

Interval censored

+
+
model2 <- bf( logAVAL | cens("interval", logAVALnext) ~ E0 + Emax * dose^h/(dose^h + ED50^h),
+              family = gaussian(),
+              nlf(h ~ exp(logh)), nlf(ED50 ~ exp(logED50)),
+              E0 ~ 1, logED50 ~ 1, logh ~ 1, Emax ~ 1, 
+              nl=TRUE )
+
+priors2 <- prior(normal(0, 5), nlpar=E0) + # centered on 1 mg, but
+    # very uncertain
+    prior(normal(0, 1), nlpar=logh) + # No particular reason
+    # to change prior (dose
+    # response could be
+    # just as steep here as
+    # for binomial outcome)
+    prior(normal(0, 6.5), nlpar=Emax) + # decent prior probability
+    # for >= 1000 mg, still conceivable could reach 300000 No
+    # particular reason to change prior here (ED50 could be same as
+    # for binomial outcome)
+    prior(normal(2.7, 2.5), nlpar=logED50) + # Additional parameter: residual SD, clearly a decent amount of
+    # variability, want to
+    # allow large SD on
+    # the log-scale
+    prior(lognormal(5, 10), class=sigma) 
+
+brmfit2 <- brm(
+  formula = model2,
+  prior = priors2,
+  data = peanut |> 
+    mutate(logAVAL = ifelse(AVAL==0, -28, log(AVAL)),
+           logAVALnext = case_when(AVAL==0 ~ log(3),
+                                   AVAL==3 ~ log(10),
+                                   AVAL==10 ~ log(100),
+                                   AVAL==100 ~ log(300),
+                                   AVAL==300 ~ log(600),
+                                   AVAL==600 ~ log(1000),
+                                   TRUE ~ log(30000))),
+  refresh=0
+  )
+
+
Running MCMC with 4 parallel chains...
+
+
+
Chain 3 finished in 4.8 seconds.
+Chain 4 finished in 4.9 seconds.
+Chain 2 finished in 5.2 seconds.
+Chain 1 finished in 5.6 seconds.
+
+All 4 chains finished successfully.
+Mean chain execution time: 5.1 seconds.
+Total execution time: 5.7 seconds.
+
+
summary(brmfit2)
+
+
 Family: gaussian 
+  Links: mu = identity; sigma = identity 
+Formula: logAVAL | cens("interval", logAVALnext) ~ E0 + Emax * dose^h/(dose^h + ED50^h) 
+         h ~ exp(logh)
+         ED50 ~ exp(logED50)
+         E0 ~ 1
+         logED50 ~ 1
+         logh ~ 1
+         Emax ~ 1
+   Data: mutate(peanut, logAVAL = ifelse(AVAL == 0, -28, lo (Number of observations: 300) 
+  Draws: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
+         total post-warmup draws = 4000
+
+Regression Coefficients:
+                  Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
+E0_Intercept          0.90      0.40     0.14     1.67 1.00     2174     2058
+logED50_Intercept     3.11      1.01     1.75     5.66 1.00      993      926
+logh_Intercept       -0.63      0.34    -1.24     0.07 1.00     1007     1582
+Emax_Intercept        7.60      1.73     5.28    11.99 1.00      764     1066
+
+Further Distributional Parameters:
+      Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
+sigma     2.43      0.12     2.19     2.68 1.00     2200     2326
+
+Draws were sampled using sample(hmc). For each parameter, Bulk_ESS
+and Tail_ESS are effective sample size measures, and Rhat is the potential
+scale reduction factor on split chains (at convergence, Rhat = 1).
+
+
+

Ordinal outcome aproach

+
+
# Note that we omit E0 from the model, because the expected placebo outcome
+# is already described by the intercept parameters of the distribution
+model3 <- bf(AVAL ~ Emax * dose^h/(dose^h + ED50^h),
+             family = cumulative(link = "logit", threshold = "flexible"),
+             nlf(h ~ exp(logh)),
+             nlf(ED50 ~ exp(logED50)),
+             logED50 ~ 1,
+             logh ~ 1,
+             Emax ~ 1, 
+             nl=TRUE)
+
+priors3 <- prior(normal(0, 1), nlpar=logh) + # No particular reason to
+                                             # change prior here
+           prior(normal(0, 6), nlpar=Emax) + # Prior could be
+                                             # different (odds from
+                                             # one category to the
+                                             # next not necessarily
+                                             # the same as for top two
+                                             # vs. rest)
+           prior(normal(2.7, 2.5), nlpar=logED50) + # No particular
+                                                    # reason to change
+                                                    # prior here
+           prior(student_t(3, 0, 2.5), class=Intercept) +
+           prior(student_t(3, -0.2, 1), class=Intercept, coef=1) +
+           prior(student_t(3, 2.197, 1), class=Intercept, coef=5)
+
+brmfit3 <- brm(
+  formula = model3,
+  prior = priors3,
+  data = mutate(peanut, AVAL = ordered(AVAL)),
+  refresh=0
+  )
+
+
Running MCMC with 4 parallel chains...
+
+Chain 4 finished in 9.9 seconds.
+Chain 2 finished in 10.3 seconds.
+Chain 3 finished in 11.8 seconds.
+Chain 1 finished in 12.7 seconds.
+
+All 4 chains finished successfully.
+Mean chain execution time: 11.2 seconds.
+Total execution time: 12.8 seconds.
+
+
summary(brmfit3)
+
+
 Family: cumulative 
+  Links: mu = logit; disc = identity 
+Formula: AVAL ~ Emax * dose^h/(dose^h + ED50^h) 
+         h ~ exp(logh)
+         ED50 ~ exp(logED50)
+         logED50 ~ 1
+         logh ~ 1
+         Emax ~ 1
+   Data: mutate(peanut, AVAL = ordered(AVAL)) (Number of observations: 300) 
+  Draws: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
+         total post-warmup draws = 4000
+
+Regression Coefficients:
+                  Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
+Intercept[1]          0.07      0.25    -0.41     0.54 1.00     3641     2673
+Intercept[2]          1.02      0.26     0.53     1.54 1.00     4164     2782
+Intercept[3]          1.75      0.27     1.22     2.30 1.00     4376     2983
+Intercept[4]          2.29      0.28     1.75     2.85 1.00     4357     3066
+Intercept[5]          3.05      0.29     2.49     3.63 1.00     4469     3287
+Intercept[6]          4.04      0.32     3.43     4.67 1.00     4795     2844
+logED50_Intercept     3.96      1.16     2.26     6.76 1.00     1356     1160
+logh_Intercept       -0.64      0.30    -1.18    -0.03 1.00     1496     2133
+Emax_Intercept        5.66      1.58     3.57     9.62 1.00     1314     1195
+
+Further Distributional Parameters:
+     Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
+disc     1.00      0.00     1.00     1.00   NA       NA       NA
+
+Draws were sampled using sample(hmc). For each parameter, Bulk_ESS
+and Tail_ESS are effective sample size measures, and Rhat is the potential
+scale reduction factor on split chains (at convergence, Rhat = 1).
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/workshops/goettingen2024/slides/R/01_overview.R b/workshops/goettingen2024/slides/R/01_overview.R new file mode 100644 index 0000000..f02cd94 --- /dev/null +++ b/workshops/goettingen2024/slides/R/01_overview.R @@ -0,0 +1,130 @@ +here::i_am("slides/R/01_overview.R") + +library(here) +library(knitr) +library(tidyverse) +library(ggrepel) +library(latex2exp) +library(patchwork) +library(glue) +library(RBesT) +library(rstan) +library(brms) +library(posterior) +library(tidybayes) +library(bayesplot) +library(gt) +library(ggdist) +library(distributional) +library(mvtnorm) +library(dqrng) +library(emmeans) +library(simsurv) + +## data { +## int N; +## array[N] int y; +## } +## parameters { +## real theta; +## } +## model { +## theta ~ beta(1,1); +## y ~ bernoulli(theta); +## } + +## ----------------------------------------------------------------------------- +#| eval: false +#| echo: true +# formula <- y ~ 1 + x + (1 | g) + + +## ----------------------------------------------------------------------------- +#| eval: false +#| echo: true +# formula <- y ~ 1 + x + (1 + x | g) + + +## ----------------------------------------------------------------------------- +#| eval: false +#| echo: true +# formula <- y ~ 1 + gp(x) + (1 + x | g) + + +## ----------------------------------------------------------------------------- +#| eval: false +#| echo: true +# formula <- y ~ 1 + gp(x, k=9) + (1 + x | g) + + +## ----------------------------------------------------------------------------- +#| eval: false +#| echo: true +#| mysize: true +#| size: '\small' +# formula <- bf( +# y ~ 1 + x + (1 | g) + ..., +# par2 ~ 1 + x + (1 | g) + ..., +# par3 ~ 1 + x + (1 | g) + ..., +# ) + + +## ----------------------------------------------------------------------------- +#| eval: false +#| echo: true +#| mysize: true +#| size: '\small' +# formula <- bf( +# y ~ fun(x, nlpar1, nlpar2), +# nlpar1 ~ 1 + x + (1 | g) + ..., +# nlpar2 ~ 1 + (1 | g) + ..., +# nl = TRUE +# ) + + +## ----------------------------------------------------------------------------- +#| eval: false +#| echo: true +# family <- brmsfamily( +# family = "", link = "", +# more_link_arguments +# ) + + +## ----------------------------------------------------------------------------- +#| eval: false +#| echo: true +#| mysize: true +#| size: '\small' +# family <- brmsfamily(family = "gaussian", link = "identity", +# link_sigma = "log") + + +## ----------------------------------------------------------------------------- +#| eval: false +#| echo: true +#| mysize: true +#| size: '\small' +# family <- brmsfamily(family = "poisson", link = "log") + + +## ----------------------------------------------------------------------------- +#| eval: false +#| echo: true +# library(brms) +# here::i_am("relative_path_in_project_to/rscript.R") +# library(here) +# +# options( +# # how many processor cores would you like to use? +# mc.cores = 4, +# # how would you like to access Stan? +# brms.backend = "cmdstanr", +# # cache model binaries +# cmdstanr_write_stan_file_dir = here::here("_brms-cache"), +# # no need to normalize likelihoods +# brms.normalize = FALSE +# ) +# # create cache directory if not yet available +# dir.create(here::here("_brms-cache"), FALSE) + diff --git a/workshops/goettingen2024/slides/R/02_hist_control.R b/workshops/goettingen2024/slides/R/02_hist_control.R new file mode 100644 index 0000000..dcab611 --- /dev/null +++ b/workshops/goettingen2024/slides/R/02_hist_control.R @@ -0,0 +1,181 @@ +here::i_am("slides/R/02_hist_control.R") + +library(here) +library(knitr) +library(tidyverse) +library(ggrepel) +library(latex2exp) +library(patchwork) +library(glue) +library(RBesT) +library(rstan) +library(brms) +library(posterior) +library(tidybayes) +library(bayesplot) +library(gt) +library(ggdist) +library(distributional) +library(mvtnorm) +library(dqrng) +library(emmeans) +library(simsurv) + +## ----include=FALSE------------------------------------------------------------ +#| cache: true +library(RBesT) + +gt_format <- function(x, decimals = 2) { + x |> fmt_number(decimals=decimals) + ##|> + ##opt_interactive( + ## page_size_default = 6, + ## use_text_wrapping = FALSE, + ## use_compact_mode = TRUE + ##) +} + +map_mc <- gMAP(cbind(r, n-r) ~ 1 | study, family=binomial, data=AS, tau.dist="HalfNormal", tau.prior=1, beta.prior=2) +map_automix <- automixfit(map_mc) +map_robust <- robustify(map_automix, mean=0.5, weight=0.2) +pl_AS <- forest_plot(map_mc, size=1.5) + xlab(NULL) + ylab("Responder rate") +pl_map <- pl_map_AS <- plot(map_mc, size=1.5)$forest_model + xlab(NULL) + ylab("Responder rate") + + +## flowchart LR +## M((β,τ)) --> A +## M --> B +## M --> C +## M -->|prediction| T +## A((θ1)) --> YA[Y1] +## B((θ2)) --> YB[Y2] +## C((θ3)) --> YC[Y3] +## T((θ*)) -->|new trial| YT[Y*] + +## ----fig.width=5-------------------------------------------------------------- +#| echo: false +print(pl_AS) + + +## ----------------------------------------------------------------------------- +#| echo: false +summary(map_mc)$theta.pred |> as_tibble() |> gt() |> gt_format() + + +## ----echo=TRUE,eval=FALSE----------------------------------------------------- +# library(RBesT) +# set.seed(98721487) +# map_mc <- gMAP(cbind(r, n-r) ~ 1 | study, +# data=RBesT::AS, +# family=binomial, +# tau.dist="HalfNormal", +# tau.prior=1, +# beta.prior=2) + + +## ----------------------------------------------------------------------------- +#| echo: true +#| eval: true +#| output: false +library(brms) +# use of an outcome modifier to specify number of trials +# intercept study random effect requested with (1 | study) +bmap_model <- bf(r | trials(n) ~ 1 + (1 | study), + family=binomial, center=FALSE) +bmap_model_prior <- prior(normal(0, 2), class=b, coef=Intercept) + + prior(normal(0, 1), class=sd, coef=Intercept, group=study) +bmap_mc <- brm(bmap_model, + data=RBesT::AS, + prior=bmap_model_prior, + seed=98721487, + control=list(adapt_delta=0.99)) # Stan sampling parameter + + +## ----echo=FALSE--------------------------------------------------------------- +knitr::kable(RBesT::AS) + + +## ----------------------------------------------------------------------------- +#| output: false +form_AS <- bf(r | trials(n) ~ 1 + (1|study), + family = binomial("logit")) + +get_prior(form_AS, data = AS) + +bprior_AS <- prior(normal(0, 2), class = "Intercept") + + prior(normal(0, 1), class = "sd", coef = "Intercept", group = "study") + +fit_AS <- brm( + form_AS, data = AS, prior = bprior_AS, seed = 2454, + control=list(adapt_delta=0.99), + refresh=0 + ) + + +## ----------------------------------------------------------------------------- +summary(bmap_mc) + + +## ----------------------------------------------------------------------------- +AS_new <- data.frame(study = "new_study", n = 1) +pe <- posterior_epred( + bmap_mc, newdata = AS_new, + allow_new_levels = TRUE, + sample_new_levels = "gaussian" +) +posterior_summary(pe) + + +## ----------------------------------------------------------------------------- +pe_mix <- automixfit(pe[, 1], type = "beta") +print(pe_mix, digits=3) + + +## ----------------------------------------------------------------------------- +plot(pe_mix)$mix + + +## ----------------------------------------------------------------------------- +withr::with_seed(654873, + AS_region <- bind_cols(AS, region=sample(c("asia", "europe", "north_america"), 8, TRUE))) +kable(AS_region) + + +## ----------------------------------------------------------------------------- +#| output: false +form_AS_region <- bf(r | trials(n) ~ 1 + (1 | region/study), + family = binomial, center=FALSE) + +# show which priors brms defines for this model +get_prior(form_AS_region, AS_region) + +bprior_AS_region <- prior(normal(0, 2), class=b, coef=Intercept) + + prior(normal(0, 0.50), class=sd, coef=Intercept, group=region) + + prior(normal(0, 0.25), class=sd, coef=Intercept, group=region:study) + +fit_AS_region <- brm( + form_AS_region, data = AS_region, prior = bprior_AS_region, seed = 29856341, + control=list(adapt_delta=0.99)) + + +## ----------------------------------------------------------------------------- +summary(fit_AS_region) + + +## ----------------------------------------------------------------------------- +AS_region_new <- data.frame(study = "new_study_asia", + n = 1, region = "asia") + +pe_region <- posterior_epred( + fit_AS_region, newdata = AS_region_new, + allow_new_levels = TRUE, + sample_new_levels = "gaussian" +) +dim(pe_region) +posterior_summary(pe_region) + + +## ----------------------------------------------------------------------------- +pe_mix_region <- RBesT::automixfit(pe_region[, 1], type = "beta") +plot(pe_mix_region)$mix + diff --git a/workshops/goettingen2024/slides/R/03_priors.R b/workshops/goettingen2024/slides/R/03_priors.R new file mode 100644 index 0000000..15dd2d8 --- /dev/null +++ b/workshops/goettingen2024/slides/R/03_priors.R @@ -0,0 +1,302 @@ +here::i_am("slides/R/03_priors.R") + +library(here) +library(knitr) +library(tidyverse) +library(ggrepel) +library(latex2exp) +library(patchwork) +library(glue) +library(RBesT) +library(rstan) +library(brms) +library(posterior) +library(tidybayes) +library(bayesplot) +library(gt) +library(ggdist) +library(distributional) +library(mvtnorm) +library(dqrng) +library(emmeans) +library(simsurv) + +## ----echo = FALSE------------------------------------------------------------- + +# additional distributions +dbeta2 <- function(x, mu, nu, ...) { + shape1 <- mu * nu + shape2 <- (1-mu) * nu + dbeta(x, shape1, shape2, ...) +} + +dbeta2_prime <- function(x, mu, nu) { + shape1 <- mu * nu + shape2 <- (1-mu) * nu + x^(shape1-1) * (1 + x)^(-shape1 - shape2) / beta(shape1, shape2) +} + +dbernoulli <- function(x, prob, log = FALSE) { + dbinom(x, 1, prob, log = log) +} + +dcategorical <- function(x, ...) { + probs <- c(...) + probs[x] +} + +dhyper2 <- function(x, size, k, prob, log = FALSE) { + dhyper(x, m = size * prob, n = size * (1 - prob), k = k, log = log) +} + +plot_dist <- function(dist, bounds, pars, xtype = c("c", "d"), + prefix = c("d", "p", "q"), parnames = NULL, + package = NULL, ...) { + xtype <- match.arg(xtype) + prefix <- match.arg(prefix) + pos <- -1 + if (!is.null(package)) { + pos <- asNamespace(package) + } + dist_fun <- get(paste0(prefix, dist), pos = pos, mode = "function") + if (xtype == "c") { + # continuous + df <- data.frame(x = seq(bounds[1], bounds[2], 0.001)) + } else if (xtype == "d") { + # discrete + df <- data.frame(x = bounds[1]:bounds[2]) + } + if (!is.null(parnames)) { + parnames <- paste0(parnames, " = ") + } + cnames <- rep(NA, length(pars)) + for (i in seq_along(pars)) { + tmp <- do.call(dist_fun, c(list(df$x), pars[[i]], list(...))) + cnames[i] <- paste0("$", parnames, pars[[i]], "$", collapse = ", ") + df[paste0(parnames, pars[[i]], collapse = ", ")] <- tmp + } + df <- df %>% + gather("pars", "dens", -x) %>% + mutate(pars = factor(pars, unique(pars))) + + gg <- ggplot(df, aes(x, dens, color = pars)) + if (xtype == "c") { + gg <- gg + geom_line(size = 1) + } else if (xtype == "d") { + gg <- gg + + geom_linerange(aes(ymin=0, ymax=dens), size = 1) + + geom_line(size = 0.8, linetype = "dotted", alpha = 0.8) + } + gg <- gg + + scale_color_viridis_d(labels = unname(latex2exp::TeX(cnames))) + + labs(x = "x", y = "", color = "") + + theme( + axis.text.y = element_blank(), + axis.ticks.y = element_blank(), + axis.line.y = element_blank(), + legend.position = "bottom", + legend.text = element_text(size = 10) + ) + if (prefix == "p") { + gg <- gg + + scale_y_continuous(breaks = c(0, 0.5, 1)) + + theme(axis.ticks.y = element_line(), + axis.text.y = element_text(), + axis.line.y = element_line()) + } else if (prefix == "q") { + gg <- gg + + scale_y_continuous() + + theme(axis.ticks.y = element_line(), + axis.text.y = element_text(), + axis.line.y = element_line()) + } + gg +} + +histogram <- function(x, bins = 30) { + xname <- deparse(substitute(x)) + xexpr <- eval(parse(text = paste0("expression(", xname, ")"))) + ggplot(data.frame(x), aes(x, y = ..density..)) + + geom_histogram(fill = "lightgrey", color = "black", bins = bins) + + xlab(xexpr) + + theme( + axis.text.y = element_blank(), + axis.ticks.y = element_blank(), + axis.line.y = element_blank(), + axis.title.y = element_blank() + ) +} + + + +## ----message=FALSE------------------------------------------------------------ +#| fig-width: 7 +#| fig-height: 3 +#| fig-align: center +#| echo: false +n=1000 +#x <- seq(-2.5,2.5, length.out=n) +x=rnorm(n) +p <- brms:::inv_logit(0+1.2*x) +y <- rbinom(n, 1, p) +dat <- data.frame(x, p, y) +ggplot(dat, aes(x, y)) + + geom_point() + + geom_smooth(method = "lm") + + geom_smooth(method = "glm", method.args = list(family = binomial()), + color = "green") + + scale_y_continuous(breaks = c(0,1)) + + +## ----eval = FALSE, echo = TRUE----------------------------------------------- +# y ~ normal(b0[j] + b1 * x, sigma) +# b0[j] ~ normal(b0, sd0) + + +## ----warning=FALSE, message=FALSE--------------------------------------------- +#| fig-height: 3 +#| echo: false +inv_logit <- function(x) 1 / (1 + exp(-x)) +x <- runif(10000, -10, 10) +gg1 <- ggplot(data.frame(x), aes(x, after_stat(density))) + + geom_histogram() + + theme(axis.title.y = element_blank()) +gg2 <- ggplot(data.frame(x), aes(inv_logit(x), after_stat(density))) + + geom_histogram() + + theme(axis.title.y = element_blank()) +gg1 + gg2 + + +## ----model_normal_student, include=FALSE-------------------------------------- +model_conflict <- stan_model(here::here("stan", "conflict_normal_student-t.stan")) + + +## ----fit_conflict1, include=FALSE, results='hide'----------------------------- +#| echo: false +sdata_conflict1 <- list( + df1 = 1000, + location1 = -5, + scale1 = 1, + df2 = 4, + location2 = 5, + scale2 = 1 +) +fit_conflict1 <- sampling( + model_conflict, data = sdata_conflict1, + chains = 1, iter = 20000, warmup = 1000 +) + + +## ----fit_conflict2, include=FALSE, results='hide'----------------------------- +sdata_conflict2 <- list( + df1 = 4, + location1 = -5, + scale1 = 1, + df2 = 1000, + location2 = 5, + scale2 = 1 +) +fit_conflict2 <- sampling( + model_conflict, data = sdata_conflict2, + chains = 1, iter = 20000, warmup = 1000 +) + + + +## ----fit_conflict3, include=FALSE, results='hide'----------------------------- +sdata_conflict3 <- list( + df1 = 1000, + location1 = -5, + scale1 = 1, + df2 = 1000, + location2 = 5, + scale2 = 1 +) +fit_conflict3 <- sampling( + model_conflict, data = sdata_conflict3, + chains = 1, iter = 20000, warmup = 1000 +) + + +## ----fit_conflict4, include=FALSE, results='hide'----------------------------- +sdata_conflict4 <- list( + df1 = 4, + location1 = -5, + scale1 = 1, + df2 = 4, + location2 = 5, + scale2 = 1 +) +fit_conflict4 <- sampling( + model_conflict, data = sdata_conflict4, + chains = 1, iter = 20000, warmup = 1000 +) + + +## ----------------------------------------------------------------------------- +#| echo: false +plot_conflict <- function(fit, guide = "legend") { + pars <- + as.data.frame(fit) %>% + select(starts_with("mu")) %>% + rename(Likelihood = mu1, Prior = mu2, Posterior = mu) %>% + gather("Component", "value") %>% + mutate(Component = factor( + Component, levels = c("Likelihood", "Prior", "Posterior") + )) + + ggplot(pars, aes(value, fill = Component)) + + geom_density(alpha = 0.7) + + xlim(c(-10, 10)) + + ylim(c(0, 0.6)) + + xlab("Parameter") + + ylab("") + + scale_fill_manual( + values = c("#440154", "#FDE725", "#21908C"), + guide = guide + ) + + #scale_fill_viridis_d(guide = guide) + + theme( + axis.text.y = element_blank(), + axis.ticks.y = element_blank(), + axis.line.y = element_blank() + ) +} + + +## ----conflict, warning=FALSE-------------------------------------------------- +#| echo: false +gg_conflict1 <- plot_conflict(fit_conflict1) + + theme(legend.position="bottom") + +gg_conflict2 <- plot_conflict(fit_conflict2) + + theme(legend.position="bottom") + +gg_conflict3 <- plot_conflict(fit_conflict3) + + theme(legend.position="bottom") + +gg_conflict4 <- plot_conflict(fit_conflict4) + + theme(legend.position="bottom") + +# gg_conflict1 / gg_conflict2 / gg_conflict3 / gg_conflict4 + + +## ----conflict1, warning=FALSE------------------------------------------------- +#| echo: false +gg_conflict1 + + +## ----conflict2, warning=FALSE------------------------------------------------- +#| echo: false +gg_conflict2 + + +## ----conflict3, warning=FALSE------------------------------------------------- +#| echo: false +gg_conflict3 + + +## ----conflict4, warning=FALSE------------------------------------------------- +#| echo: false +gg_conflict4 + diff --git a/workshops/goettingen2024/slides/R/04_dose_finding.R b/workshops/goettingen2024/slides/R/04_dose_finding.R new file mode 100644 index 0000000..69b7e54 --- /dev/null +++ b/workshops/goettingen2024/slides/R/04_dose_finding.R @@ -0,0 +1,417 @@ +here::i_am("slides/R/04_dose_finding.R") + +library(here) +library(knitr) +library(tidyverse) +library(ggrepel) +library(latex2exp) +library(patchwork) +library(glue) +library(RBesT) +library(rstan) +library(brms) +library(posterior) +library(tidybayes) +library(bayesplot) +library(gt) +library(ggdist) +library(distributional) +library(mvtnorm) +library(dqrng) +library(emmeans) +library(simsurv) + +## ----------------------------------------------------------------------------- +#| echo: false +#| warning: false +#| fig.height: 6.5 +drfdata <- tibble( + Dose = (0:5000)/10, + Emax = Dose/(Dose+70), + `sigmoid Emax` = 1/(1+(100/Dose)^3), + `non-monotone` = 1/(1+(10/Dose)^0.9)-(Dose>300)*(Dose-300)^2/120000 +) |> + gather(value = delta, key=Function, -Dose) |> + mutate( + pointlabel = ifelse( + (Dose==300 & Function=="Emax") | + (Dose==100 & Function=="non-monotone") | + (Dose==120 & Function=="sigmoid Emax"), + Function, NA) + ) + +p1 <- drfdata %>% + filter(Function=="Emax") %>% + ggplot(aes(x=Dose, y=delta, col=Function, label=pointlabel)) + + scale_color_manual(values=c("#000000", "#E69F00", "#56B4E9")) + + theme_bw(base_size = 24) + + ylab("Percentage of full treatment effect") + + geom_hline(yintercept=0, size=2) + + coord_cartesian(ylim=c(0, 1)) + + scale_y_continuous(labels=scales::percent) + + geom_line(size=3) + + geom_text(data = . %>% filter(!is.na(pointlabel)), + size = 10, nudge_y=c(-0.1, -0.15, 0.11), nudge_x=c(10, 80, 2.5)) + + guides(color=FALSE) + +p2 <- drfdata %>% + filter(Function %in% c("Emax", "sigmoid Emax")) %>% + ggplot(aes(x=Dose, y=delta, col=Function, label=pointlabel)) + + scale_color_manual(values=c("#000000", "#E69F00", "#56B4E9")) + + theme_bw(base_size = 24) + + ylab("Percentage of full treatment effect") + + coord_cartesian(ylim=c(0, 1)) + + scale_y_continuous(labels=scales::percent) + + geom_hline(yintercept=0, size=2) + + geom_line(size=3) + + geom_text(data = . %>% filter(!is.na(pointlabel)), + size = 10, nudge_y=c(-0.1, -0.15, 0.11), nudge_x=c(10, 80, 2.5)) + + guides(color=FALSE) + +p3 <- drfdata %>% + ggplot(aes(x=Dose, y=delta, col=Function, label=pointlabel)) + + scale_color_manual(values=c("#000000", "#56B4E9", "#E69F00")) + + theme_bw(base_size = 24) + + ylab("Percentage of full treatment effect") + + coord_cartesian(ylim=c(0, 1)) + + scale_y_continuous(labels=scales::percent) + + geom_hline(yintercept=0, size=2) + + geom_line(size=3) + + geom_text(data = . %>% filter(!is.na(pointlabel)), + size = 10, nudge_y=c(-0.1, -0.15, 0.11), nudge_x=c(10, 80, 2.5)) + + guides(color=FALSE) + +p1 + + +## ----------------------------------------------------------------------------- +#| echo: false +#| warning: false +#| fig.height: 6.5 +p2 + + +## ----------------------------------------------------------------------------- +#| echo: false +#| warning: false +#| fig.height: 6.5 +p3 + + +## ----include=FALSE------------------------------------------------------------ +# This is the PATHWAY DRF data by group +pathway = tibble(dose = c(0, 70, 210, 280*2), + group = c("placebo", "tezepelumab 70 mg q4w", + "tezepelumab 210 mg q4w", "tezepelumab 280 mg q2w"), + log_est = log(c(0.67, 0.26, 0.19, 0.22)), + log_stderr = c(0.10304, 0.17689, 0.22217, 0.19108)) + + +## ----echo=FALSE--------------------------------------------------------------- +gt(pathway) %>% + fmt_number(columns=c("log_est", "log_stderr"), decimals=3) %>% + opt_stylize(style = 6, color = 'blue') + + +## ----sigemax_plots------------------------------------------------------------ +#| echo: FALSE +#| fig-height: 6 +# Plot some example sigEmax curves +expand_grid(Dose=seq(0, 100, 1), Emax=1, E0=0, ED50=c(5,25), h=c(1/3, 1, 3)) %>% + mutate(`Dose response` = E0 + Emax * Dose^h/(Dose^h + ED50^h), + text = paste0("ED50=", ED50, "/h=",round(h,2))) %>% + ggplot(aes(x=Dose, y=`Dose response`, col=text, label=text)) + + theme_bw(base_size=24) + + geom_line(lwd=3) + + scale_y_continuous(labels=scales::percent(seq(0,1,0.25))) + + geom_text_repel(data=. %>% filter( Dose==50), max.iter = 100, #max.time = 10, + size=6, + nudge_x=c(35, 30,-16, 30, 10, 5), segment.color = NA, + nudge_y=c(0,-0.02,-0.05, -0.02, -0.03,-0.1)) + + scale_color_brewer(palette="Dark2") + + theme(legend.position = "none") + + +## ----fit_sigemax-------------------------------------------------------------- +#| results: 'hide' +form_sig <- bf( + log_est | se(log_stderr) ~ E0 + Emax * dose^h / + (dose^h + ED50^h), + nlf(h ~ exp(logh)), nlf(ED50 ~ exp(logED50)), + E0 ~ 1, Emax ~ 1, logh ~ 1, logED50 ~ 1, + nl = TRUE, + family = gaussian() +) + +prior_sig <- prior(normal(0,1), nlpar=E0) + + prior(normal(0,1), nlpar=logh) + + prior(normal(0,1), nlpar=Emax) + + prior(normal(4,2), nlpar=logED50) + + +## ----sigemax_prior------------------------------------------------------------ +#| echo: FALSE +#| fig-height: 3 +# Plot some example sigEmax curves +expand_grid(Dose=seq(0, 100, 1), Emax=1, E0=0, data.frame(ED50=exp(rnorm(n=1000,mean=4,sd=2)), h=exp(rnorm(n=1000)))) |> + mutate(`Dose response` = E0 + Emax * Dose^h/(Dose^h + ED50^h), id=paste0(ED50, "-", h)) |> + ggplot(aes(x=Dose, y=`Dose response`, group=id)) + + theme_bw(base_size=24) + + geom_line(lwd=0.5, alpha = 0.05) + + scale_y_continuous(labels=scales::percent(seq(0,1,0.25))) + + scale_color_brewer(palette="Dark2") + + theme(legend.position = "none") + + +## ----sigemax_prior_wide------------------------------------------------------- +#| echo: FALSE +#| fig-height: 3 +# Plot some example sigEmax curves +expand_grid(Dose=c(seq(0, 5, 0.1), seq(6, 100, 1)), Emax=1, E0=0, data.frame(ED50=exp(rnorm(n=1000,mean=4,sd=2)), h=exp(rnorm(n=1000, sd=3)))) |> + mutate(`Dose response` = E0 + Emax * Dose^h/(Dose^h + ED50^h), id=paste0(ED50, "-", h)) |> + ggplot(aes(x=Dose, y=`Dose response`, group=id)) + + theme_bw(base_size=24) + + geom_line(lwd=0.5, alpha = 0.05) + + scale_y_continuous(labels=scales::percent(seq(0,1,0.25))) + + scale_color_brewer(palette="Dark2") + + theme(legend.position = "none") + + +## ----------------------------------------------------------------------------- +#| eval: FALSE +# fit_sig = brm( +# formula = form_sig, +# data = pathway, +# prior = prior_sig, +# control = list(adapt_delta = 0.999) +# ) + + +## ----------------------------------------------------------------------------- +#| echo: FALSE +#| results: 'hide' +fit_sig = brm( + formula = form_sig, + data = pathway, + prior = prior_sig, + control = list(adapt_delta = 0.999), + seed = 3624, + save_pars = save_pars(all = TRUE) +) + + +## ----------------------------------------------------------------------------- +summary(fit_sig) + + +## ----------------------------------------------------------------------------- +#| eval: false +# tibble(dose = seq(0, 560, 1), log_stderr=1) |> +# tidybayes::add_epred_rvars(object=fit_sig) |> +# (\(x) x |> +# left_join(x |> filter(dose==0) |> rename(pbo = .epred) |> dplyr::select(-dose), +# by="log_stderr"))() |> +# mutate(.delta = .epred - pbo) |> +# ggplot(aes(x=dose, ydist=.delta)) + +# ggdist::stat_lineribbon() + + +## ----------------------------------------------------------------------------- +#| echo: false +#| fig.height: 4 +tibble(dose = seq(0, 560, 1), log_stderr=1) |> + add_epred_rvars(object=fit_sig) |> + (\(x) x |> left_join(x |> filter(dose==0) |> rename(pbo = .epred) |> dplyr::select(-dose), by="log_stderr"))() |> + mutate(.delta = .epred - pbo) |> + ggplot(aes(x=dose, ydist=.delta)) + + theme_bw(base_size=24) + + theme(legend.position = "right") + + geom_hline(yintercept=0, color="darkred", lty=2) + + stat_lineribbon() + + scale_fill_brewer(palette="Blues") + + geom_point(aes(x = dose, y = log_rr), inherit.aes = FALSE, + col="#E69F00", + data = tibble(dose=c(70, 210, 280*2), + log_rr= log(c(1-0.62, 1-0.71, 1-0.66)), + log_rr_ucl = log(1-c(0.42, 0.54, 0.47)), + log_rr_lcl = log(1-c(0.75, 0.82, 0.79))), + size = 3) + + geom_errorbar(aes(x = dose, ymin=log_rr_lcl, ymax=log_rr_ucl), + inherit.aes = FALSE, col="#E69F00", + data = tibble(dose=c(70, 210, 280*2), + log_rr= log(c(1-0.62, 1-0.71, 1-0.66)), + log_rr_ucl = log(1-c(0.42, 0.54, 0.47)), + log_rr_lcl = log(1-c(0.75, 0.82, 0.79))), + size = 1, width=30) + + ylab("Rate ratio vs. placebo") + + scale_y_continuous(breaks=log(c(1, 0.7, 0.5, 0.35, 0.25, 0.15)), + labels=c(1, 0.7, 0.5, 0.35, 0.25, 0.15)) + + scale_x_continuous(breaks=c(0, 70, 210, 280*2)) + + xlab("Total tezepelumab dose [mg/month]") + + +## ----------------------------------------------------------------------------- +#| mysize: true +#| size: '\small' +form_mbeta <- bf( + log_est | se(log_stderr) ~ E0 + + Emax * (delta1+delta2)^(delta1+delta2) / + (delta1^delta1 * delta2^delta2) * + (dose/850)^delta1 * (1-dose/850)^delta2, + nlf(delta1 ~ exp(logdelta1)), nlf(delta2 ~ exp(logdelta2)), + E0 ~ 1, Emax ~ 1, logdelta1 ~ 1, logdelta2 ~ 1, + nl = TRUE, + family = gaussian() +) + +prior_mbeta <- prior(normal(0,1), nlpar="E0") + + prior(normal(0,1), nlpar="Emax") + + prior(normal(0,1), nlpar="logdelta1") + + prior(normal(0,1), nlpar="logdelta2") + + +## ----------------------------------------------------------------------------- +#| eval: FALSE +# fit_mbeta <- brm( +# form_mbeta, +# data = pathway, +# prior = prior_mbeta, +# control = list(adapt_delta = 0.999) +# ) + + +## ----------------------------------------------------------------------------- +#| echo: FALSE +#| results: 'hide' +fit_mbeta <- brm( + form_mbeta, data = pathway, prior = prior_mbeta, + control = list(adapt_delta = 0.999), seed = 7304, + save_pars = save_pars(all = TRUE) +) + + +## ----------------------------------------------------------------------------- +#| echo: false +#| fig.height: 8 +#| fig.align: center +tibble(dose = seq(0, 560, 1), log_stderr=1) |> + add_epred_rvars(object=fit_mbeta) |> + (\(x) x |> left_join(x |> filter(dose==0) |> rename(pbo = .epred) |> dplyr::select(-dose), by="log_stderr"))() |> + mutate(.delta = .epred - pbo) |> + ggplot(aes(x=dose, ydist=.delta)) + + theme_bw(base_size=24) + + theme(legend.position = "bottom") + + geom_hline(yintercept=0, color="darkred", lty=2) + + stat_lineribbon() + + scale_fill_brewer(palette="Blues") + + geom_point(aes(x = dose, y = log_rr), inherit.aes = FALSE, + col="#E69F00", + data = tibble(dose=c(70, 210, 280*2), + log_rr= log(c(1-0.62, 1-0.71, 1-0.66)), + log_rr_ucl = log(1-c(0.42, 0.54, 0.47)), + log_rr_lcl = log(1-c(0.75, 0.82, 0.79))), + size = 3) + + geom_errorbar(aes(x = dose, ymin=log_rr_lcl, ymax=log_rr_ucl), + inherit.aes = FALSE, col="#E69F00", + data = tibble(dose=c(70, 210, 280*2), + log_rr= log(c(1-0.62, 1-0.71, 1-0.66)), + log_rr_ucl = log(1-c(0.42, 0.54, 0.47)), + log_rr_lcl = log(1-c(0.75, 0.82, 0.79))), + size = 1, width=30) + + ylab("Rate ratio compared with placebo") + + scale_y_continuous(breaks=log(c(1, 0.7, 0.5, 0.35, 0.25, 0.15)), + labels=c(1, 0.7, 0.5, 0.35, 0.25, 0.15)) + + scale_x_continuous(breaks=c(0, 70, 210, 280*2)) + + xlab("Total tezepelumab dose [mg/month]") + + +## ----------------------------------------------------------------------------- +(loo_mbeta <- loo(fit_mbeta)) + + +## ----------------------------------------------------------------------------- +loo_exact_sig <- kfold(fit_sig, folds = "loo", silent=2) +(loo_exact_mbeta <- kfold(fit_mbeta, folds = "loo", silent=2)) + + +## ----------------------------------------------------------------------------- +loo_compare(loo_exact_sig, loo_exact_mbeta) + + +## ----------------------------------------------------------------------------- +fit_sig$criteria$loo <- loo_exact_sig +fit_mbeta$criteria$loo <- loo_exact_mbeta +(w_dose <- model_weights(fit_sig, fit_mbeta, weights = "loo")) + + +## ----------------------------------------------------------------------------- +#| echo: false +dose_df <- data.frame( + dose = seq(min(pathway$dose), max(pathway$dose), length.out = 100), + log_stderr = mean(pathway$log_stderr) +) + + +## ----------------------------------------------------------------------------- +pe_sig <- posterior_epred(fit_sig, newdata = dose_df) +pe_mbeta <- posterior_epred(fit_mbeta, newdata = dose_df) +pe_avg <- pe_sig * w_dose[1] + pe_mbeta * w_dose[2] + + +## ----------------------------------------------------------------------------- +pe_avg <- pe_avg |> + posterior_summary() |> + as.data.frame() |> + bind_cols(dose_df) + + +## ----------------------------------------------------------------------------- +#| echo: false +pe_avg |> select(-log_stderr) |> head(4) + + +## ----------------------------------------------------------------------------- +#| echo: false +#| fig.height: 6.5 +tibble(dose = seq(0, 560, 1), log_stderr=1) %>% + add_epred_rvars(object=fit_sig) %>% + rename(SigEmax = .epred) %>% + add_epred_rvars(object=fit_mbeta) %>% + rename(ModBeta = .epred) %>% + mutate(Averaged = w_dose["fit_sig"] * SigEmax + w_dose["fit_mbeta"] * ModBeta) %>% + (\(x) x %>% left_join(x %>% filter(dose==0) %>% rename(SigEmaxPbo = SigEmax, ModBetaPbo = ModBeta, AveragedPbo=Averaged) %>% dplyr::select(-dose), by="log_stderr"))() %>% + mutate(SigEmax = SigEmax - SigEmaxPbo, + ModBeta = ModBeta - ModBetaPbo, + Averaged = Averaged - AveragedPbo) %>% + dplyr::select(-SigEmaxPbo, -ModBetaPbo, -AveragedPbo) %>% + pivot_longer(cols=c("Averaged", "SigEmax", "ModBeta"), + names_to="Model", + values_to=".delta") %>% + mutate(Model = factor(Model, c("SigEmax", "ModBeta", "Averaged"))) %>% + ggplot(aes(x=dose, ydist=.delta)) + + theme_bw(base_size=18) + + theme(legend.position = "bottom") + + geom_hline(yintercept=0, color="darkred", lty=2) + + stat_lineribbon() + + scale_fill_brewer(palette="Blues") + + geom_point(aes(x = dose, y = log_rr), inherit.aes = FALSE, + col="#E69F00", + data = tibble(dose=c(70, 210, 280*2), + log_rr= log(c(1-0.62, 1-0.71, 1-0.66)), + log_rr_ucl = log(1-c(0.42, 0.54, 0.47)), + log_rr_lcl = log(1-c(0.75, 0.82, 0.79))), + size = 3) + + geom_errorbar(aes(x = dose, ymin=log_rr_lcl, ymax=log_rr_ucl), + inherit.aes = FALSE, col="#E69F00", + data = tibble(dose=c(70, 210, 280*2), + log_rr= log(c(1-0.62, 1-0.71, 1-0.66)), + log_rr_ucl = log(1-c(0.42, 0.54, 0.47)), + log_rr_lcl = log(1-c(0.75, 0.82, 0.79))), + size = 1, width=30) + + facet_wrap(~Model, ncol=3, nrow=1, labeller = label_both) + + ylab("Rate ratio compared with placebo") + + scale_y_continuous(breaks=log(c(1, 0.7, 0.5, 0.35, 0.25, 0.15)), + labels=c(1, 0.7, 0.5, 0.35, 0.25, 0.15)) + + scale_x_continuous(breaks=c(0, 70, 210, 280*2)) + + xlab("Total tezepelumab dose [mg/month]") + diff --git a/workshops/goettingen2024/slides/R/05_mmrm.R b/workshops/goettingen2024/slides/R/05_mmrm.R new file mode 100644 index 0000000..2914cb1 --- /dev/null +++ b/workshops/goettingen2024/slides/R/05_mmrm.R @@ -0,0 +1,365 @@ +here::i_am("slides/R/05_mmrm.R") + +library(here) +library(knitr) +library(tidyverse) +library(ggrepel) +library(latex2exp) +library(patchwork) +library(glue) +library(RBesT) +library(rstan) +library(brms) +library(posterior) +library(tidybayes) +library(bayesplot) +library(gt) +library(ggdist) +library(distributional) +library(mvtnorm) +library(dqrng) +library(emmeans) +library(simsurv) + +## ----------------------------------------------------------------------------- +#| echo: false +design <- tibble(arm = factor(rep(c("Drug 40 mg (N=50)", "Drug 20 mg (N=50)", "Drug 10 mg (N=50)", "Placebo (N=50)"), each=5), + levels=rev(c("Drug 40 mg (N=50)", "Drug 20 mg (N=50)", "Drug 10 mg (N=50)", "Placebo (N=50)"))), + x=rep(c(1, 3.65, 3.9, 3.65, 1), 4), + y=rep(c(1, 1, 0.6, 0.2, 0.2), 4)+ rep(3:0, each=5), + design="Parallel group dose finding") +ggplot(design, aes(x=x, y=y, label=arm, fill=arm)) + + geom_polygon() + + theme_void() + + theme(legend.position="none", panel.border=element_rect(fill = NA), + strip.background=element_rect(fill="lightgrey"), + strip.text.x = element_text( margin = margin( b = 5, t = 5) ), + axis.line.x = element_line(color="black"), + axis.text.x = element_text(color="black", angle=0, hjust=0.5, size=18), + axis.ticks.x = element_line(color="black"), + axis.ticks.length.x = unit(0.2, "cm"), + axis.title.x = element_blank()) + + geom_text(data=design |> filter(x==1 & y %in% c(1:10)), + aes(x=x+0.1, y=y-0.3), + size=10, + hjust = 0, vjust=0.75) + + geom_rect(aes(xmin=0, xmax=0.95, ymin=0.2, ymax=4), fill="darkgrey") + + geom_text(aes(x=0.45, y=1.9+0.2, label="Run-in"), size=10) + + scale_fill_manual(values=c("#377eb8", "#fd8d3c", "#f03b20", "#bd0026")) + + scale_x_continuous(breaks = c(0, 0.975, 1.6, 2.15, 2.9, 3.65), + labels = c(" Screening", "Baseline /\nRandomization", "Week 2", "Week 4", "Week 8", "Week 12")) + + +## ----------------------------------------------------------------------------- +#| echo: false +#| fig.height: 5 +# Correlation matrix between visits (baseline + 4 post-baseline visits) +corr_matrix <- diag(5) +rho <- c(0.6, 0.48, 0.4, 0.375) +corr_matrix[1,2:5] <- rho[1:4] +corr_matrix[2,3:5] <- rho[1:3] +corr_matrix[3,4:5] <- rho[1:2] +corr_matrix[4,5:5] <- rho[1:1] +corr_matrix[lower.tri(corr_matrix)] <- t(corr_matrix)[lower.tri(corr_matrix)] + +# Standard deviations by visit (baseline + 4 post-baseline visits) +sds <- sqrt(c(0.75, 0.8, 0.85, 0.95, 1.1)) + +cov_matrix <- diag(sds) %*% corr_matrix %*% diag(sds) +# print(cov_matrix, digits=2) + + +## ----------------------------------------------------------------------------- +#| echo: false +apply_colnames <- function(x,y){ + colnames(x) <- y + return(x) +} + + +## ----------------------------------------------------------------------------- +#| echo: false +# Simulate from multivariate normal for control group +# (before adding treatment effect later) +# We simulate 1000 patients and then apply inclusion criteria and keep the +# first 200 that meet them. +set.seed(4095867) +N <- 1000 +Nf <- 200 +simulated_data <- rmvnorm(n=N, mean=rep(0, 5), sigma = cov_matrix) |> + # turn into tibble + apply_colnames(c("BASE", paste0("visit", 1:4))) |> + as_tibble() |> + # Apply inclusion criteria and keep first 200 patients + filter(BASE>0) |> + filter(row_number()<=Nf) |> + ##filter(row_number()<=200) |> + # Assign subject ID, treatment group and create missing data + mutate(USUBJID = row_number(), + TRT01P = dqsample(x=c(0L, 10L, 20L, 40L), size=Nf, replace=T), + # Simulate dropouts + dropp2 = plogis(visit1-2), + dropp3 = plogis(visit2-2), + dropp4 = plogis(visit3-2), + dropv = case_when(runif(n=n()) + dplyr::select(-dropp2, -dropp3, -dropp4, -dropv) |> + # Turn data into long-format + pivot_longer(cols=starts_with("visit"), names_to = "AVISIT", values_to="AVAL") |> + mutate( + # Assign visit days + ADY = case_when(AVISIT=="visit1" ~ 2L*7L, + AVISIT=="visit2" ~ 4L*7L, + AVISIT=="visit3" ~ 8L*7L, + AVISIT=="visit4" ~ 12L*7L), + # Turn to factor with defined order of visits + AVISIT = factor(AVISIT, paste0("visit", 1:4)), + # Assume rising treatment effect over time (half there by week 3) with an + # Emax dose response (ED50 = 5 mg) + AVAL = AVAL + 0.9 * (ADY/7)^3/((ADY/7)^3+3^3) * TRT01P/(TRT01P+5), + # Change from baseline = value - baseline + CHG = AVAL - BASE, + TRT01P=factor(TRT01P)) |> + relocate(USUBJID, TRT01P, AVISIT, ADY, AVAL, CHG, BASE) |> + # Discard missing data + filter(!is.na(AVAL)) + +simulated_data <- simulated_data |> + mutate(USUBJID=factor(USUBJID)) + + +## ----------------------------------------------------------------------------- +#| echo: false +#| fig-height: 6 +p1 <- simulated_data |> + bind_rows(simulated_data |> + group_by(USUBJID) |> + slice_head(n=1) |> + mutate(AVISIT="Baseline", ADY=0, AVAL=BASE) + ) |> arrange(USUBJID, ADY) |> + ggplot(aes(x=AVISIT, y=AVAL, col=TRT01P)) + + theme_bw(base_size=24) + + geom_jitter(height=0, width=0.2) + + scale_color_manual(values=c("#377eb8", "#fd8d3c", "#f03b20", "#bd0026")) + + guides(x = guide_axis(angle = 45)) + + theme(axis.title.x = element_blank(), + legend.position="none") + +p2 <- simulated_data |> + ggplot(aes(x=AVISIT, y=CHG, fill=TRT01P)) + + geom_hline(yintercept=0) + + geom_jitter(alpha=0.4, size=0.65, col="black", shape=22, + position=position_jitterdodge(dodge.width=0.75, + jitter.width=0.2, jitter.height=0)) + + geom_boxplot(outlier.alpha = 0, alpha=0.8) + + theme_bw(base_size=24) + + scale_fill_manual(values=c("#377eb8", "#fd8d3c", "#f03b20", "#bd0026")) + + guides(x = guide_axis(angle = 45)) + + theme(legend.position="right", + axis.title.x = element_blank()) + +p1 + p2 + + +## ----------------------------------------------------------------------------- +#| echo: false +simulated_data |> + filter(USUBJID %in% c(3, 9, 13)) |> + gt() |> + fmt_number(columns=c("AVAL", "CHG", "BASE"), decimals=2) |> + opt_stylize(style = 6, color = "red", add_row_striping = TRUE) |> + tab_style(locations = cells_body(rows = c(4, 8, 10)), + style = cell_borders(sides = "bottom", color = "black", weight = px(1.5),style = "solid")) + + +## PROC MIXED DATA=simulated_data; +## CLASS TRT01P AVISIT USUBJID; +## MODEL CHG ~ TRT01P AVISIT BASE TRT01P*AVISIT AVISIT*BASE +## / SOLUTION DDFM=KR ALPHA = 0.05; +## REPEATED AVISIT / TYPE=UN SUBJECT = USUBJID R Rcorr GROUP=TRT01P; +## LSMEANS TRT01P*AVISIT / DIFFS PDIFF CL OM E; +## RUN; + +## ----------------------------------------------------------------------------- +#| eval: false +# library(mmrm) +# mmrm_fit <- mmrm( +# formula = CHG ~ TRT01P + AVISIT + BASE + AVISIT:TRT01P + +# AVISIT:BASE + us(AVISIT | TRT01P / USUBJID), +# method = "Kenward-Roger", +# vcov = "Kenward-Roger-Linear", # to match SAS +# data = mutate(simulated_data, USUBJID=factor(USUBJID)) +# ) + + +## ----------------------------------------------------------------------------- +#| eval: true +#| echo: false +library(mmrm) +mmrm_fit <- mmrm( + formula = CHG ~ TRT01P + AVISIT + BASE + AVISIT:TRT01P + + AVISIT:BASE + us(AVISIT | TRT01P / USUBJID), + method = "Kenward-Roger", + data = mutate(simulated_data, USUBJID=factor(USUBJID)) +) + + +## ----------------------------------------------------------------------------- +#| echo: FALSE +ex_data <- tibble(treatment = c(rep("PHEN/TPM CR 15/92", 15), + rep("PHEN/TPM CR 3.75/23", 15), + rep("placebo", 15)), + week = rep(c(0,4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56), 3), + chg = c(0, -3.73913043478261, -5.88405797101449, -7.50724637681159,-8.95652173913043, -10.0289855072464, -11.1014492753623, -11.8260869565217, -12.3478260869565, -12.8405797101449, -13.2173913043478, -13.304347826087, -13.3333333333333, -13.4492753623188, -13.1884057971014, 0, -2.57971014492753, -3.50724637681159, -4.17391304347826, -4.98550724637681, -5.56521739130435, -6.14492753623188, -6.55072463768116, -6.72463768115942, -6.89855072463768, -7.18840579710145, -7.15942028985507, -6.98550724637681, -6.84057971014492, -6.7536231884058, 0, -1.07246376811594, -1.47826086956522, -1.88405797101449, -2.08695652173913, -2.31884057971014, -2.43478260869565, -2.60869565217391, -2.69565217391304, -2.78260869565217, -2.92753623188406, -2.66666666666666, -2.46376811594203, -2.34782608695652, + -2.20289855072464), + stderr = c(NA, 0.594202898550725, 0.347826086956522, 0.434782608695651, 0.521739130434784, 0.594202898550725, 0.666666666666667, 0.710144927536232, 0.826086956521739, 0.869565217391306, 0.898550724637681, 0.942028985507246, 0.956521739130435, 0.971014492753623, 1.02898550724638, NA, 0.449275362318841, 0.449275362318841, 0.579710144927535, 0.652173913043478, 0.797101449275361, 0.956521739130435, 1.02898550724638, 1.13043478260869, 1.15942028985507, 1.23188405797102, 1.31884057971014, 1.3768115942029, 1.44927536231884, 1.42028985507246, NA, 0.333333333333332, 0.289855072463769, 0.391304347826086, 0.492753623188404, 0.623188405797102, 0.724637681159422, 0.782608695652174, 0.840579710144927, 0.869565217391304, 0.956521739130434, 1.01449275362319, 1.05797101449275, 1.10144927536232, 1.10144927536232), + lcl = c(NA, -4.90374671545133, -6.56578457433277, -8.35940463095944, -9.97911164410786, -11.1936017879151, -12.4080919317224, -13.2179454382966, -13.9669267698374, -14.5448962184406, -14.97851836292, -15.150690710074, -15.2080814924586, -15.3524287965824, -15.205180331918, NA, -3.46027367421365, -4.3878099060977, -5.31012404900872, -6.26374462759858, -7.12750752390873, -8.01967569535715, -8.56749917249773, -8.94024914194382, -9.17097273569861, -9.60285418385369, -9.74430032743688, -9.68400838451167, -9.68110722397109, -9.53734015195544, NA, -1.72578509629596, -2.04636637233045, -2.65100039974755, -3.05273587644002, -3.54026741065539, -3.85504636560874, -4.14258050964004, -4.34315813193221, -4.48692520394787, -4.80228439100932, -4.65503592634498, -4.53735320103513, -4.5066269974644, -4.36169946123252), + ucl = c(NA, -2.57451415411388, -5.20233136769621, -6.65508812266374, -7.93393183415301, -8.86436922657765, -9.79480661900228, -10.4342284747469, -10.7287254040756, -11.1362632018492, -11.4562642457756, -11.4580049420999, -11.4585851742081, -11.5461219280553, -11.1716312622849, NA, -1.69914661564142, -2.62668284752548, -3.0377020379478, -3.70726986515503, -4.00292725869996, -4.27017937710661, -4.53395010286458, -4.50902622037501, -4.62612871357675, -4.7739574103492, -4.57454025227326, -4.28700610824195, -4.00005219631876, -3.96990622485616, NA, -0.419142439935926, -0.910155366799983, -1.11711554228143, -1.12117716703824, -1.09741374876489, -1.01451885178257, -1.07481079470778, -1.04814621589387, -1.07829218735647, -1.05278807275879, -0.678297406988347, -0.390183030848927, -0.189025176448641, -0.0440976402167492)) + ggplot(ex_data, aes(x=week, y=chg, ymin=lcl, ymax=ucl, col=treatment, label=treatment)) + + theme_bw(base_size=18) + + theme(legend.position="none") + + geom_hline(yintercept=0, alpha=0.5) + + geom_errorbar(width=0.75) + + geom_line() + + geom_point() + + geom_text(data = ex_data |> filter(week==48), size=6, + nudge_y=c(-3, -3.25, 3)) + + xlab("Time since randomization (weeks)") + + ylab("Percent change in body weight (%)") + + scale_color_manual(values=c("#e41a1c", "#ff7f00", "#377eb8")) + + +## ----------------------------------------------------------------------------- +contrasts(simulated_data$AVISIT) <- MASS::contr.sdif + + +## ----------------------------------------------------------------------------- +#| echo: true +contrasts(simulated_data$AVISIT) |> MASS::fractions() + + +## ----------------------------------------------------------------------------- +# add the intercept +cmat <- cbind("Intercept" = 1, contrasts(simulated_data$AVISIT)) +# compute the inverse matrix +solve(cmat) |> MASS::fractions() + + +## ----------------------------------------------------------------------------- +mmrm_model1 <- bf( + CHG ~ 1 + AVISIT + BASE + BASE:AVISIT + TRT01P + TRT01P:AVISIT + + unstr(time = AVISIT, gr = USUBJID), + sigma ~ 1 + AVISIT + TRT01P + AVISIT:TRT01P +) + + +## ----------------------------------------------------------------------------- +mmrm_prior1 <- prior(normal(0, 2), class=Intercept) + + prior(normal(0, 1), class=b) + + prior(normal(0, log(10.0)/1.64), class=Intercept, dpar=sigma) + + prior(normal(0, log(2.0)/1.64), class=b, dpar=sigma) + + prior(lkj(1), class=cortime) + + +## ----------------------------------------------------------------------------- +#| eval: false +# fit_mmrm1 <- brm( +# formula = mmrm_model1, data = simulated_data, prior = mmrm_prior1, ... +# ) + + +## ----------------------------------------------------------------------------- +#| echo: false +#| include: false +fit_mmrm1 <- brm( + formula = mmrm_model1, + prior = mmrm_prior1, + data = simulated_data, + seed = 234235 +) + + +## ----------------------------------------------------------------------------- +#| eval: false +# emm2 <- emmeans(fit_mmrm1, ~ TRT01P | AVISIT, weights="proportional") + + +## ----------------------------------------------------------------------------- +#| echo: false +emm2 <- emmeans(fit_mmrm1, ~ TRT01P | AVISIT, weights="proportional", + at = list(AVISIT = c("visit1", "visit4"))) +emm2 + + +## ----------------------------------------------------------------------------- +#| eval: false +# emm2 |> as.mcmc() |> summarize_draws() + + +## ----------------------------------------------------------------------------- +contrast(emm2, adjust="none", method="trt.vs.ctrl", ref="TRT01P0") + + +## ----------------------------------------------------------------------------- +#| eval: false +# contrast(emm2, adjust="none", method="trt.vs.ctrl", ref="TRT01P0") |> as.mcmc() + + +## ----------------------------------------------------------------------------- +mmrm_model2 <- bf( + CHG ~ 1 + AVISIT + mo(TRT01P) + BASE + mo(TRT01P):AVISIT + + BASE:AVISIT + unstr(time = AVISIT, gr = USUBJID), + sigma ~1 + AVISIT + mo(TRT01P) + mo(TRT01P):AVISIT +) + + +## ----------------------------------------------------------------------------- +#| eval: false +# fit_mmrm2 <- brm(formula = mmrm_model2, +# data = simulated_data |> mutate(TRT01P=ordered(TRT01P)), prior = mmrm_prior1, ...) + + +## ----------------------------------------------------------------------------- +#| echo: false +#| include: false +fit_mmrm2 <- brm( + formula = mmrm_model2, + data = simulated_data |> mutate(TRT01P=ordered(TRT01P)), + prior = mmrm_prior1, + seed = 234235 +) + + +## ----------------------------------------------------------------------------- +#| echo: false +map2_dfr(list(mmrm_fit, fit_mmrm1, fit_mmrm2), + c("Frequentist", "Bayesian", "Bayesian (monotonic)"), + \(x, y) emmeans(x, ~ TRT01P | AVISIT, weights="proportional") |> + contrast(adjust="none", method="trt.vs.ctrl", ref="TRT01P0") |> + confint() |> + as_tibble() |> + mutate(Model=y)) |> + mutate(Week = c(2L, 4L, 8L, 12L)[as.integer(str_extract(AVISIT, "[0-9]+"))], + Model = factor(Model, + c("Frequentist", "Bayesian", "Bayesian (monotonic)")), + Dose = str_remove(str_extract(contrast, "[0-9]+ -"), " -"), + lower.CL = ifelse(is.na(lower.CL), lower.HPD, lower.CL), + upper.CL = ifelse(is.na(upper.CL), upper.HPD, upper.CL)) |> + ggplot(aes(x=Dose, y=estimate, ymin=lower.CL, ymax=upper.CL, col=Model)) + + geom_hline(yintercept=0, col="darkred", lty=2) + + theme_bw(base_size=24) + + theme(legend.position="bottom", + legend.title = element_text(size=22), + legend.text = element_text(size=22)) + + geom_point(position=position_dodge(width=0.4), size=4) + + geom_errorbar(position=position_dodge(width=0.4), lwd=1) + + scale_color_manual(values=c("#000000", "#E69F00", "#56B4E9")) + + facet_wrap(~Week, label=label_both, nrow=1, ncol=4) + + xlab("Dose [mg]") + + ylab("Difference to placebo") #+ guides(col=guide_legend(nrow=2, byrow=TRUE)) + diff --git a/workshops/goettingen2024/slides/R/06_longitudinal_data.R b/workshops/goettingen2024/slides/R/06_longitudinal_data.R new file mode 100644 index 0000000..e23b058 --- /dev/null +++ b/workshops/goettingen2024/slides/R/06_longitudinal_data.R @@ -0,0 +1,302 @@ +here::i_am("slides/R/06_longitudinal_data.R") + +library(here) +library(knitr) +library(tidyverse) +library(ggrepel) +library(latex2exp) +library(patchwork) +library(glue) +library(RBesT) +library(rstan) +library(brms) +library(posterior) +library(tidybayes) +library(bayesplot) +library(gt) +library(ggdist) +library(distributional) +library(mvtnorm) +library(dqrng) +library(emmeans) +library(simsurv) + +## ----echo=FALSE--------------------------------------------------------------- +adpasi <- readr::read_csv(here::here("data", "longitudinal.csv"), show_col_types = FALSE) |> + filter(TRT01P %in% c("PBO", "TRT")) |> + mutate(AVISIT = factor(AVISIT, paste("Week", c(1, 2 * (1:6)))), + TRT01P = factor(TRT01P, c("PBO", "TRT"))) + +pasi_data <- filter(adpasi, PARAMCD == "PASITSCO") + + +## ----echo = FALSE, fig.width = 10, fig.height = 10/1.62, echo = FALSE--------- +adp_with_base <- bind_rows( + adpasi |> + filter(PARAMCD == "PASITSCO") |> + transmute(SUBJID, TRT01P, AVISIT, AVAL, PCHG), + adpasi |> + filter(PARAMCD == "PASITSCO") |> + transmute(SUBJID, TRT01P, AVISIT = "Baseline", AVAL = BASE, PCHG = 0) |> + distinct() +) |> + mutate(AVISIT = factor(AVISIT, c("Baseline", levels(adpasi$AVISIT)))) + +ggplot(adp_with_base, + aes(x = TRT01P, y = AVAL, fill = TRT01P)) + + geom_boxplot() + + facet_grid(. ~ AVISIT) + + theme_default(base_size=20) + + labs(y = "PASI score", x = NULL, + title = "Boxplots of PASI score by treatment group and visit") + + scale_fill_discrete("Treatment group") + + theme(axis.text.x = element_text(angle = 60, hjust = 1, vjust = 1), + legend.position = "bottom") + + + +## ----echo=FALSE--------------------------------------------------------------- +head(select(pasi_data, CHG, BASE, TRT01P, AVISIT, AVISITN, SUBJID), 10) + + +## ----results='hide'----------------------------------------------------------- +fit_long_mean <- brm( + CHG ~ BASE + TRT01P * AVISIT + (1 | SUBJID), + data = pasi_data, seed = 2454 +) +fit_long_mean <- add_criterion(fit_long_mean, "loo") + + +## ----------------------------------------------------------------------------- +sum(rstan::get_elapsed_time(fit_long_mean$fit)) + + +## ----eval=F------------------------------------------------------------------- +# pp_check(fit_long_mean) + + +## ----echo=F------------------------------------------------------------------- +pp_check(fit_long_mean) + xlab("Change in PASI score from Baseline") + theme_default(base_size=24) + + +## ----------------------------------------------------------------------------- +loo(fit_long_mean) + + +## ----eval=FALSE--------------------------------------------------------------- +# conditional_effects(fit_long_mean, "AVISIT:TRT01P") + +## ----echo=FALSE--------------------------------------------------------------- +ce <- conditional_effects(fit_long_mean, "AVISIT:TRT01P") +ce <- plot(ce, plot = FALSE)[[1]] +ce + theme_default(base_size = 24) + theme(legend.position = "bottom") + + +## ----results='hide'----------------------------------------------------------- +fit_long_lin <- brm( + CHG ~ BASE + TRT01P * AVISITN + (1 | SUBJID), + data = pasi_data, seed = 2454 +) +fit_long_lin <- add_criterion(fit_long_lin, "loo") + + +## ----------------------------------------------------------------------------- +sum(rstan::get_elapsed_time(fit_long_lin$fit)) + + +## ----------------------------------------------------------------------------- +summary(fit_long_lin) + + +## ----eval=FALSE--------------------------------------------------------------- +# conditional_effects(fit_long_lin, "AVISITN:TRT01P") + + +## ----echo=FALSE--------------------------------------------------------------- +ce <- conditional_effects(fit_long_lin, "AVISITN:TRT01P") +ce <- plot(ce, plot = FALSE)[[1]] +ce + theme_default(base_size = 24) + theme(legend.position = "bottom") + + +## ----results='hide'----------------------------------------------------------- +fit_long_lin_vs <- brm( + CHG ~ BASE + TRT01P * AVISITN + (1 + AVISITN | SUBJID), + data = pasi_data, seed = 2454 +) +fit_long_lin_vs <- add_criterion(fit_long_lin_vs, "loo") + + +## ----------------------------------------------------------------------------- +sum(rstan::get_elapsed_time(fit_long_lin_vs$fit)) + + +## ----------------------------------------------------------------------------- +summary(fit_long_lin_vs) + + +## ----eval=FALSE--------------------------------------------------------------- +# conditional_effects(fit_long_lin_vs, "AVISITN:TRT01P") + + +## ----echo=FALSE--------------------------------------------------------------- +ce <- conditional_effects(fit_long_lin_vs, "AVISITN:TRT01P") +ce <- plot(ce, plot = FALSE)[[1]] +ce + theme_default(base_size = 24) + theme(legend.position = "bottom") + + +## ----------------------------------------------------------------------------- +loo_compare(fit_long_lin, fit_long_lin_vs) + + +## ----results='hide'----------------------------------------------------------- +fit_long_mo <- brm( + CHG ~ BASE + TRT01P * mo(AVISITN) + + (1 + mo(AVISITN) | SUBJID), + data = pasi_data, seed = 24543 +) +fit_long_mo <- add_criterion(fit_long_mo, "loo") + + +## ----------------------------------------------------------------------------- +sum(rstan::get_elapsed_time(fit_long_mo$fit)) + + +## ----eval=FALSE--------------------------------------------------------------- +# conditional_effects(fit_long_mo, "AVISITN:TRT01P") + + +## ----echo=FALSE--------------------------------------------------------------- +ce <- conditional_effects(fit_long_mo, "AVISITN:TRT01P") +ce <- plot(ce, plot = FALSE)[[1]] +ce + theme_default(base_size = 24) + theme(legend.position = "bottom") + + +## ----------------------------------------------------------------------------- +loo_compare(fit_long_lin_vs, fit_long_mo) + + +## ----results='hide'----------------------------------------------------------- +fit_long_quad <- brm( + CHG ~ BASE + TRT01P * (AVISITN + I(AVISITN^2)) + + (1 + AVISITN + I(AVISITN^2) | SUBJID), + data = pasi_data, seed = 245124 +) +fit_long_quad <- add_criterion(fit_long_quad, "loo") + + +## ----------------------------------------------------------------------------- +sum(rstan::get_elapsed_time(fit_long_quad$fit)) + + +## ----eval=FALSE--------------------------------------------------------------- +# conditional_effects(fit_long_quad, "AVISITN:TRT01P") + + +## ----echo=FALSE--------------------------------------------------------------- +ce <- conditional_effects(fit_long_quad, "AVISITN:TRT01P") +ce <- plot(ce, plot = FALSE)[[1]] +ce + theme_default(base_size = 24) + theme(legend.position = "bottom") + + +## ----------------------------------------------------------------------------- +cor(pasi_data$AVISITN, pasi_data$AVISITN^2) + + +## ----------------------------------------------------------------------------- +pasi_data <- pasi_data |> + mutate(AVISITN_c = AVISITN - 6) + + +## ----------------------------------------------------------------------------- +cor(pasi_data$AVISITN_c, pasi_data$AVISITN_c^2) + + +## ----results='hide'----------------------------------------------------------- +fit_long_quad_c <- brm( + CHG ~ BASE + TRT01P * (AVISITN_c + I(AVISITN_c^2)) + + (1 + AVISITN_c + I(AVISITN_c^2) | SUBJID), + data = pasi_data, seed = 24547 +) +fit_long_quad_c <- add_criterion(fit_long_quad_c, "loo") + + +## ----------------------------------------------------------------------------- +sum(rstan::get_elapsed_time(fit_long_quad_c$fit)) + + +## ----eval=FALSE--------------------------------------------------------------- +# conditional_effects(fit_long_quad_c, "AVISITN_c:TRT01P") + + +## ----echo=FALSE--------------------------------------------------------------- +ce <- conditional_effects(fit_long_quad_c, "AVISITN_c:TRT01P") +ce <- plot(ce, plot = FALSE)[[1]] +ce + theme_default(base_size = 24) + theme(legend.position = "bottom") + + +## ----------------------------------------------------------------------------- +loo_compare(fit_long_mo, fit_long_quad_c) + + +## ----results='hide'----------------------------------------------------------- +fit_long_gp <- brm( + CHG ~ BASE + gp(AVISITN_c, by = TRT01P, k=9) + + (1 + (AVISITN_c + I(AVISITN_c^2)) | SUBJID), + data = pasi_data, seed = 32454, + control = list(adapt_delta = 0.95) +) +fit_long_gp <- add_criterion(fit_long_gp, "loo") + + +## ----------------------------------------------------------------------------- +sum(rstan::get_elapsed_time(fit_long_gp$fit)) + + +## ----------------------------------------------------------------------------- +loo(fit_long_gp) + + +## ----eval=FALSE--------------------------------------------------------------- +# conditional_effects(fit_long_gp, "AVISITN_c:TRT01P") + + +## ----echo=FALSE--------------------------------------------------------------- +ce <- conditional_effects(fit_long_gp, "AVISITN_c:TRT01P") +ce <- plot(ce, plot = FALSE)[[1]] +ce + theme_default(base_size = 24) + theme(legend.position = "bottom") + + +## ----------------------------------------------------------------------------- +loo_compare(fit_long_quad_c, fit_long_gp) + + +## ----results='hide'----------------------------------------------------------- +fit_long_gp_ar <- brm( + CHG ~ BASE + gp(AVISITN_c, by = TRT01P, k=9) + + ar(AVISITN_c, gr = SUBJID, p = 1) + + (1 + (AVISITN_c + I(AVISITN_c^2)) | SUBJID), + data = pasi_data, seed = 24235, + iter = 4000, warmup = 1000, + control = list(adapt_delta = 0.95) +) +fit_long_gp_ar <- add_criterion(fit_long_gp_ar, "loo") + + +## ----------------------------------------------------------------------------- +sum(rstan::get_elapsed_time(fit_long_gp_ar$fit)) + + +## ----------------------------------------------------------------------------- +posterior_summary(fit_long_gp_ar, variable = "ar") |> + round(3) + + +## ----eval=FALSE--------------------------------------------------------------- +# conditional_effects(fit_long_gp_ar, "AVISITN_c:TRT01P") + + +## ----echo=FALSE--------------------------------------------------------------- +ce <- conditional_effects(fit_long_gp_ar, "AVISITN_c:TRT01P") +ce <- plot(ce, plot = FALSE)[[1]] +ce + theme_default(base_size = 24) + theme(legend.position = "bottom") + diff --git a/workshops/goettingen2024/slides/R/07_time_to_event.R b/workshops/goettingen2024/slides/R/07_time_to_event.R new file mode 100644 index 0000000..8ec158d --- /dev/null +++ b/workshops/goettingen2024/slides/R/07_time_to_event.R @@ -0,0 +1,251 @@ +here::i_am("slides/R/07_time_to_event.R") + +library(here) +library(knitr) +library(tidyverse) +library(ggrepel) +library(latex2exp) +library(patchwork) +library(glue) +library(RBesT) +library(rstan) +library(brms) +library(posterior) +library(tidybayes) +library(bayesplot) +library(gt) +library(ggdist) +library(distributional) +library(mvtnorm) +library(dqrng) +library(emmeans) +library(simsurv) + +## ----------------------------------------------------------------------------- +#| echo: false +set.seed(46767) +## n per group +n_grp <- 100 +n_hist <- 400 +## use month as time-unit +rate_1 <- 1 / 6 +rate_cens <- 1 / 10 +beta <- c(trt=-0.2, ## roughly 20% HR reduction + soc_alt=0.05, ## alternative chemotherapy is 5% worse + hist1=0.02) ## simulated historical data has a 2% worse outcome + +## covariates of simulated trial data +covs <- data.frame(id = seq(1, 2*n_grp), trt = c(0, 1), + soc_alt=rbinom(2*n_grp, 1L, 0.3), hist1=0L, hist2=0L) + +## covariates of historical data +hcovs <- data.frame(id = seq(2*n_grp+1, 2*n_grp+1 +n_hist - 1), + trt = c(0), soc_alt=0, hist1=1L, hist2=0L) + +simulate_trial <- function(lambda, gamma, lambda_cens, x, betas) { + ## simulate censoring times, note that we do not simulate end of + ## trial with maxt for now... + cens <- simsurv(lambdas = lambda_cens, gammas = 1, x=x) + events <- simsurv(lambdas = lambda, gammas = gamma, x=x, betas=betas) + names(cens) <- paste0(names(cens), "_cens") + bind_cols(events, select(cens, -id_cens), select(x, -id)) %>% + rename(censtime=eventtime_cens) %>% + mutate(event=1*(eventtime <= censtime), + y=if_else(event==1, eventtime, censtime), + status=NULL, status_cens=NULL) %>% + relocate(id, y, event) %>% + mutate(soc=factor(soc_alt, c(0, 1), c("ChA", "ChB")), + trt_ind=trt, + trt=factor(trt_ind, c(0,1), c("ctl", "act")), + arm=factor(paste0(c("ctl", "act")[trt_ind + 1], soc), + levels=c("actChA", "ctlChA", + "actChB", "ctlChB"))) +} + +sim <- simulate_trial(rate_1, 1, rate_cens, covs, beta) +hdata1 <- simulate_trial(rate_1, 1, rate_cens, hcovs, beta) %>% + mutate(id=id+max(sim$id)) + + +## ----------------------------------------------------------------------------- +#| echo: false +sim %>% + select(y, event, trt, soc, arm) %>% + head(8) %>% + kable() + + +## ----------------------------------------------------------------------------- +#| eval: false +# cc_inv + + +## ----------------------------------------------------------------------------- +#| echo: false +cc_inv <- matrix(c(1/4, 1/4, 1/4, 1/4, + 1/2, -1/2, 1/2, -1/2, + 1/2, -1/2, -1/2, 1/2, + 0, -1, 0, 1), +nrow=4, ncol=4, byrow=TRUE, +dimnames=list(contrast=c("intercept", "effectAvg", + "deltaEffect", "deltaControl"), + arm=c("actChA", "ctlChA", + "actChB", "ctlChB"))) + +cc_inv %>% MASS::fractions() + + +## ----------------------------------------------------------------------------- +cc <- solve(cc_inv) + + +## ----------------------------------------------------------------------------- +#| echo: false +cc %>% MASS::fractions() + + +## ----------------------------------------------------------------------------- +#| echo: false +contrasts(sim$arm) <- cc[, -1] + + +## ----------------------------------------------------------------------------- +#| mysize: true +#| size: '\small' +model_weibull1 <- bf(y | cens(1-event) ~ 1 + arm, + family=weibull()) + + +## ----------------------------------------------------------------------------- +#| mysize: true +#| size: '\small' +prior_weibull1 <- + prior(normal(meanInter, log(4)/1.64), class="Intercept") + + prior(normal(0, sdEffect), coef=armeffectAvg) + + prior(normal(0, sdDeltaEffect), coef=armdeltaEffect) + + prior(normal(0, sdDeltaControl), coef=armdeltaControl) + + prior(gamma(0.1, 0.1), class=shape) + + +## ----------------------------------------------------------------------------- +#| mysize: true +#| size: '\small' +stanvars_weibull1 <- + stanvar(-log(log(2)/8), name = "meanInter") + + stanvar(log(2)/1.64, name = "sdEffect") + + stanvar(log(1.25)/1.64, name = "sdDeltaEffect") + + stanvar(log(1.25)/1.64, name = "sdDeltaControl") + + +## ----------------------------------------------------------------------------- +#| eval: false +# fit_weibull1 <- brm( +# formula = model_weibull1, +# data = sim, +# prior = weibull_prior1, +# stanvars = stanvars_weibull1, +# ... +# ) + + +## ----------------------------------------------------------------------------- +#| echo: false +#| include: false +fit_weibull1 <- brm( + formula = model_weibull1, + data = sim, + prior = prior_weibull1, + stanvars = stanvars_weibull1 +) + + +## ----------------------------------------------------------------------------- +#| mysize: true +#| size: '\tiny' +summary(fit_weibull1) + + +## ----------------------------------------------------------------------------- +#| echo: true +#| eval: false +# p_full_fup <- pp_check( +# fit_weibull1, type = "km_overlay", +# status_y = sim$event, ndraws = 100 +# ) + + +## ----------------------------------------------------------------------------- +#| echo: false +#| fig-height: 4 +p_full_fup <- pp_check( + fit_weibull1, status_y=sim$event, + type="km_overlay", ndraws=100 +) + + scale_y_continuous(breaks=seq(0,1,by=0.1)) + + xlab("Time [month]") + coord_cartesian(xlim=c(0, 35)) + +p_full_fup + coord_cartesian(xlim=c(0, 15)) +# p_full_fup + + +## ----------------------------------------------------------------------------- +#| echo: false +hdata1 %>% + select(y, event, arm, hist1) %>% + head(8) %>% + kable() + + +## ----------------------------------------------------------------------------- +sim_comb <- bind_rows(sim, hdata1) + + +## ----------------------------------------------------------------------------- +#| echo: false +contrasts(sim_comb$arm) <- cc[, -1] + + +## ----------------------------------------------------------------------------- +model_weibull2 <- bf( + y | cens(1-event) ~ 1 + arm + hist1, + family=weibull() +) + + +## ----------------------------------------------------------------------------- +prior_weibull2 <- prior_weibull1 + + prior(student_t(6, 0, sdHist), coef = hist1) + + +## ----------------------------------------------------------------------------- +stanvars_weibull2 <- stanvars_weibull1 + + stanvar(log(1.8)/1.64, name = "sdHist") + + +## ----------------------------------------------------------------------------- +#| eval: false +# fit_weibull2 <- brm( +# formula = model_weibull2, +# data = sim_comb, +# prior = weibull_prior2, +# stanvars = stanvars_weibull2, +# ... +# ) + + +## ----------------------------------------------------------------------------- +#| echo: false +#| include: false +fit_weibull2 <- brm( + formula = model_weibull2, + data = sim_comb, + prior = prior_weibull2, + stanvars = stanvars_weibull2 +) + + +## ----------------------------------------------------------------------------- +#| mysize: true +#| size: '\tiny' +summary(fit_weibull2) + diff --git a/workshops/goettingen2024/slides/bamdd_goettingen2024.html b/workshops/goettingen2024/slides/bamdd_goettingen2024.html new file mode 100644 index 0000000..04384ad --- /dev/null +++ b/workshops/goettingen2024/slides/bamdd_goettingen2024.html @@ -0,0 +1,8513 @@ + + + + + + + + + + + + Hierarchical Models in Preclincal Research + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+
+

Preface

+ + +
+
+

Disclaimer

+

The opinions & statements expressed in this presentation and on the following slides are solely of the presenters, and not necessarily those of Novartis.

+
+
+

Learning Goals

+

After this course, you should:

+
    +
  • Be familiar with brms syntax and workflow
  • +
  • Recognize its versatility for statistical modelling in drug development
  • +
  • Have hands-on experience with the package from two guided exercises
  • +
+

and of course:

+
    +
  • Feel empowered to use brms going forward!
  • +
+
+
+

Housekeeping

+ +
+
+

Acknowledgements

+
    +
  • Paul Buerkner (Technical University of Dortmund)
  • +
  • Andrew Bean (Novartis)
  • +
  • Björn Holzhauer (Novartis)
  • +
  • David Ohlssen (Novartis)
  • +
  • Cong Zhang (Novartis)
  • +
+
+
+

Tutorial Agenda

+
    +
  1. Introduction: a brms modelling workflow
  2. +
  3. Historical controls
  4. +
  5. Priors
  6. +
  7. Dose finding (nonlinear Emax models, model averaging)
  8. +
  9. Mixed models with repeated measurements
  10. +
  11. Longitudinal data
  12. +
+ + + +
+
+
+

A brms modelling workflow

+ +
+
+

Bayesian inference

+

p(\theta|y) = \frac{p(y|\theta) \, p(\theta)}{p(y)}

+
    +
  • Prior p(\theta)
  • +
  • Model likelihood p(y|\theta)
  • +
  • Marginal data likelihood p(y) = \int p(y|\theta) \, p(\theta) \, d\theta
  • +
  • Posterior p(\theta|y) is conditional on data y
  • +
+
+
+

Bayesian inference is integration

+

\hat{\theta} = E[\theta|y] = \int \theta \, p(\theta|y) \, d\theta

+
+

In practice solved by Markov-Chain Monte-Carlo (MCMC) in generating draws s=1, \ldots, S

+

\theta_s \sim p(\theta|y)

+

\int \theta \, p(\theta|y) \, d\theta \approx \frac{1}{S} \sum_{s=1}^S \theta_s

+
+
+
+

Stan project: Bayesian modelling platform

+
+
+
    +
  • mc-stan.org
  • +
  • discourse.mc-stan.org
  • +
  • Models are written in the Stan probabilistic programming language for priors & model likelihood conditional on data
  • +
  • Hamiltonian Monte-Carlo No-U-turn sampler (NUTS)
  • +
+
+
+
+

+
+
+
+
+
data {
+  int<lower=0> N;
+  array[N] int<lower=0,upper=1> y;
+}
+parameters {
+  real<lower=0,upper=1> theta;
+}
+model {
+  theta ~ beta(1,1);
+  y ~ bernoulli(theta);
+}
+
+
+
+
+
+

brms: Bayesian regression modelling in Stan

+
+

https://paulbuerkner.com/brms/

+
+
+
+
    +
  • Specify models via extended R formula syntax
  • +
  • Internally write Stan code that is readable yet fast
  • +
  • Provide an easy interface for defining priors & models
  • +
  • Facilitate post-processing
  • +
+
+

+
+
+
+

Some Highlights of brms

+
    +
  • Flexible hierarchical (random effects) modeling
  • +
  • Both built-in and user-defined likelihoods
  • +
  • Explicit and implicit non-linear modeling
  • +
  • Distributional regression
  • +
  • Within-chain parallelization
  • +
  • Posterior and prior predictions
  • +
  • Model checking
  • +
  • Highly dense feature matrix
  • +
+
+
+

Model specification via formula

+

Varying intercept model for a single grouping factor:

+
+
formula <- y ~ 1 + x + (1 | g)
+
+

Varying intercept-slope model for a single grouping factor:

+
+
formula <- y ~ 1 + x + (1 + x | g)
+
+

Advanced non-linear terms such as Gaussian processes:

+
+
formula <- y ~ 1 + gp(x) + (1 + x | g)
+
+

… or approximate Gaussian processes:

+
+
formula <- y ~ 1 + gp(x, k=9) + (1 + x | g)
+
+
+
+

Model specification via formula

+

Linear formulas for multiple distributional parameters (e.g., predict mean and overdispersion of negative binomial):

+
+
formula <- bf(
+  y ~ 1 + x + (1 | g) + ...,
+  par2 ~ 1 + x + (1 | g) + ...,
+  par3 ~ 1 + x + (1 | g) + ...,
+)
+
+

Non-linear formula for a single distributional parameter:

+
+
formula <- bf(
+  y ~ fun(x, nlpar1, nlpar2),
+  nlpar1 ~ 1 + x + (1 | g) + ...,
+  nlpar2 ~ 1 + (1 | g) + ...,
+  nl = TRUE
+)
+
+
+
+

Model likelihood via family

+

General structure:

+
+
family <- brmsfamily(
+    family = "<family>", link = "<link>",
+    more_link_arguments
+)
+
+
+

Gaussian likelihood (default):

+
+
family <- brmsfamily(family = "gaussian", link = "identity",
+                     link_sigma = "log")
+
+

Poisson likelihood:

+
+
family <- brmsfamily(family = "poisson", link = "log")
+
+

See also vignette("brms_families") for details on the families.

+
+
+
+
+
+

Part 1: historical control data

+ +
+
+

Use of historical control data in clinical trials

+
+

Goal: reduce control group sample size while maintaining power

+
+
+
    +
  1. Collect historical data from relevant literature systematically

  2. +
  3. Evaluate heterogeniety of historical data
    +data quality, patient population, trial design

  4. +
  5. Pre-specify trial protocol
    +prior documentation, operating charachteristics

  6. +
  7. Prior-data conflict?

  8. +
+
+
+
+

The meta-analytic-predictive (MAP) prior1

+
+
+
    +
  • Borrow from historical data under an exchangeability assumption
  • +
  • Discount/down-weight historical data through between-trial heterogeneity \tau
  • +
  • Meta-analytic-predictive (MAP) prior through generative nature of hierarchical models
  • +
+
+
    +
  • Pre-requisites +
      +
    • essentially the same endpoint
    • +
    • similar treatment procedures
    • +
    • similar patient eligibility criteria
    • +
    • similar patient population characteristics
    • +
  • +
+
+
+
+
+
+

+
+
flowchart LR
+    M((β,τ)) --> A
+    M --> B
+    M --> C
+    M -->|prediction| T
+    A((θ<sub>1</sub>)) --> YA[Y<sub>1</sub>]
+    B((θ<sub>2</sub>)) --> YB[Y<sub>2</sub>]
+    C((θ<sub>3</sub>)) --> YC[Y<sub>3</sub>]
+    T((θ<sub>*</sub>)) -->|new trial| YT[Y<sub>*</sub>]
+
+
+

+
+
+
+
+ +
+ + +
+

Example: double-blind PoC placebo controlled trial1

+
+
+
    +
  • Endpoint binary ASAS20 response at week 6
    +Improvement = higher rates

  • +
  • Historical control data
    +8 studies with 513 patients

  • +
  • Bayesian design

    +
      +
    • P(\pi_t - \pi_p > 0 | y) > 0.95
    • +
    • Placebo: (“MAP prior” from historical data) +
        +
      • \pi_{p} \sim \text{Beta}(11,32)
      • +
    • +
    • Active: +
        +
      • \pi_{t} \sim \text{Beta}(0.5,1)
      • +
    • +
  • +
  • Randomization ratio 4:1 (24 vs 6)

  • +
+
+
+
+
+
+

+
+
+
+
+

MAP prior:

+
+
+
+ + + + + + + + + + + + + + + + + + + + + +
meansd2.5%50%97.5%
0.260.090.110.250.47
+ +
+
+
+
+
+
+

Generalized Meta-Analytic-Predictive model

+

Y is the (control) group summary data for H historical trials \begin{align*} +Y_{h}|\theta_{h} &\sim f(\theta_{h}) & \forall \; h \in [1,H] \\ +Y_\ast|\theta_\ast &\sim f(\theta_\ast) & \text{for new trial} +\end{align*}

+

Exchangeability assumption: \begin{align*} +g(\theta_{h})|\beta,\tau &\sim \text{Normal}(\beta, \tau^2) & \forall \; h \in [1,H] \\ +g(\theta_\ast)|\beta,\tau &\sim \text{Normal}(\beta, \tau^2) & \text{for new trial} +\end{align*}

+
    +
  • f likelihood / g link function: Binomial/logit, Normal (known \sigma)/identity or Poisson/log
  • +
+
+
    +
  • \tau \rightarrow 0 \Rightarrow pooling / unbound use of historical data
  • +
  • \tau \rightarrow \infty \Rightarrow stratification / no use of historical data
  • +
+
+
+
+

Running the MAP analysis in R

+
+
+
    +
  • RBesT1
  • +
+
+
library(RBesT)
+set.seed(98721487)
+map_mc <- gMAP(cbind(r, n-r) ~ 1 | study,
+               data=RBesT::AS,
+               family=binomial,
+               tau.dist="HalfNormal",
+               tau.prior=1,
+               beta.prior=2)
+
+
+
    +
  • brms
  • +
+
+
library(brms)
+# use of an outcome modifier to specify number of trials
+# intercept study random effect requested with (1 | study)
+bmap_model <- bf(r | trials(n) ~ 1 + (1 | study),
+                 family=binomial, center=FALSE)
+bmap_model_prior <- prior(normal(0, 2), class=b, coef=Intercept) +
+    prior(normal(0, 1), class=sd, coef=Intercept, group=study)
+bmap_mc <- brm(bmap_model,
+               data=RBesT::AS,
+               prior=bmap_model_prior,
+               seed=98721487,
+               control=list(adapt_delta=0.99)) # Stan sampling parameter
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
studynr
Study 110723
Study 24412
Study 35119
Study 4399
Study 513939
Study 6206
Study 7789
Study 83510
+
+
+
+
+ +
+

Summary MAP prior model

+
+
summary(bmap_mc)
+
+
 Family: binomial 
+  Links: mu = logit 
+Formula: r | trials(n) ~ 1 + (1 | study) 
+   Data: RBesT::AS (Number of observations: 8) 
+
+Multilevel Hyperparameters:
+~study (Number of levels: 8) 
+              Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
+sd(Intercept)     0.38      0.21     0.06     0.86 1.00     1186     1616
+
+Regression Coefficients:
+          Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
+Intercept    -1.10      0.19    -1.48    -0.72 1.00     1442     1530
+
+
+
    +
  • Intercept is the typical trial response rate on the logit scale
  • +
  • sd(Intercept) is the between-trial heterogeneity \tau
  • +
+
+
+

Predicting the placebo response rate in a new study

+
+
AS_new <- data.frame(study = "new_study", n = 1)
+pe <- posterior_epred(
+    bmap_mc, newdata = AS_new,
+    allow_new_levels = TRUE, 
+    sample_new_levels = "gaussian"
+)
+posterior_summary(pe)
+
+
      Estimate  Est.Error     Q2.5     Q97.5
+[1,] 0.2585929 0.08815447 0.109296 0.4732844
+
+
+
    +
  • allow_new_levels=TRUE allows to simulate the study random effect for a new (unseen) studies
  • +
  • sample_new_levels = "gaussian" ensures that the simulation is done using the normal hierarchical model (the default is to bootstrap existing levels)
  • +
+
+
+

Approximation with a finite mixture

+

For specifying the prior as part of a pre-specified analysis we choose a parametric approximation:

+
+
+
+
pe_mix <- automixfit(pe[, 1], type = "beta")
+print(pe_mix, digits=3)
+
+
EM for Beta Mixture Model
+Log-Likelihood = 4407.352
+
+Univariate beta mixture
+Mixture Components:
+  comp1 comp2
+w  0.67  0.33
+a 16.64  2.99
+b 50.26  7.71
+
+
+
+
+
plot(pe_mix)$mix
+
+
+
+

+
+
+
+
+
+
+
+

Region specific MAP prior (hypothetically)

+
+
withr::with_seed(654873,
+                 AS_region <- bind_cols(AS, region=sample(c("asia", "europe", "north_america"), 8, TRUE)))
+kable(AS_region)
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
studynrregion
Study 110723europe
Study 24412asia
Study 35119europe
Study 4399europe
Study 513939asia
Study 6206north_america
Study 7789europe
Study 83510asia
+
+
+
+
+

Region specific MAP Priors via varying regions model

+
+
form_AS_region <- bf(r | trials(n) ~ 1 + (1 | region/study), 
+                     family = binomial, center=FALSE)
+
+# show which priors brms defines for this model
+get_prior(form_AS_region, AS_region)
+
+bprior_AS_region <- prior(normal(0, 2), class=b, coef=Intercept) +
+  prior(normal(0, 0.50), class=sd, coef=Intercept, group=region) +
+  prior(normal(0, 0.25), class=sd, coef=Intercept, group=region:study)
+
+fit_AS_region <- brm(
+  form_AS_region, data = AS_region, prior = bprior_AS_region, seed = 29856341,
+  control=list(adapt_delta=0.99))
+
+
    +
  • (1 | region/study) specifies a nested random effect structure as in this example each study is run in a single region. It is equivalent to
    +(1 | region) + (1 | region:study).
  • +
+
+
+

Summary region model

+
+
summary(fit_AS_region)
+
+
 Family: binomial 
+  Links: mu = logit 
+Formula: r | trials(n) ~ 1 + (1 | region/study) 
+   Data: AS_region (Number of observations: 8) 
+
+Multilevel Hyperparameters:
+~region (Number of levels: 3) 
+              Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
+sd(Intercept)     0.27      0.22     0.01     0.82 1.00     1570     1731
+
+~region:study (Number of levels: 8) 
+              Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
+sd(Intercept)     0.23      0.13     0.01     0.51 1.00     1675     1548
+
+Regression Coefficients:
+          Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
+Intercept    -1.08      0.26    -1.63    -0.55 1.00     1914     1889
+
+
+
+
+

Extract MAP MCMC samples

+
+
AS_region_new <- data.frame(study = "new_study_asia", 
+                            n = 1, region = "asia")
+
+pe_region <- posterior_epred(
+  fit_AS_region, newdata = AS_region_new, 
+  allow_new_levels = TRUE, 
+  sample_new_levels = "gaussian"
+)
+dim(pe_region)
+
+
[1] 4000    1
+
+
posterior_summary(pe_region)
+
+
      Estimate  Est.Error      Q2.5    Q97.5
+[1,] 0.2671768 0.06109648 0.1572156 0.408521
+
+
+
+
+

Obtain parametric MAP prior

+
+
pe_mix_region <- RBesT::automixfit(pe_region[, 1], type = "beta")
+plot(pe_mix_region)$mix
+ +
+
+
+

Summary historical control data

+
    +
  • Bayesian random-effects meta-analysis models can be used to derive Meta-Analytic-Predictive (MAP) priors
  • +
  • Predictions for new study mean inform the MAP prior
  • +
  • Specification and inference for MAP models is simple in brms
  • +
  • Not covered: Parametric MAP mixtures can be used as priors in brms using the RBesT::mixstanvar adapter
  • +
+
+
+

Hands-on exercises: historical control data

+ +
+ +
+
+

Priors

+ + +
+
+

The prior can only be understood in the context of the model 1

+
+
+
+
+

+
+
+
+
+
+
+

Commonly heard reasons to be afraid of priors

+

“Priors are inherently subjective”

+

“Priors bias your analysis”

+

“You should let the data speak for themselves”

+

“Non-Bayesian models don’t have priors and don’t need them”

+

“I have no idea how to set appropriate priors”

+
+
+

Are priors inherently subjective?

+

Consider using the alternative terms “contextual” or “conditional”1

+
    +
  • on the person or people or agent performing the analysis
  • +
  • on results of previous studies
  • +
  • on structural assumptions
  • +
  • +
+
+
+

Do priors bias your analysis?

+

Definition:

+

An estimator \hat{\theta} of the parameter \theta is called unbiased if \text{E}_{y}(\hat{\theta}) = \theta.

+

Corrollary:

+

If an estimator \hat{\theta} is unbiased for a given prior, it will be biased for most other priors.

+

Corrollary:

+

If an estimator \hat{\theta} is unbiased at a given scale, it will be biased for most non-linear transformations f(\hat{\theta}) (Jensen’s inequality): +\text{E}_y(f(\hat{\theta})) \neq f(\theta) +

+

Unbiasedness is fragile and often only holds in the limit

+
+
+

Is bias even the right metric?

+

A sampling distribution is a distribution of a data-dependent variable (a “statistic”) as implied by variation in data y across the true data generating process

+

Consider two estimators \hat{\theta}_1 and \hat{\theta}_2 of \theta with sampling distributions given by

+
    +
  • p(\hat{\theta}_1) := p(\hat{\theta}_1(y)) = \text{normal}(\theta, 10)
  • +
  • p(\hat{\theta}_2) := p(\hat{\theta}_2(y)) = \text{normal}(\theta + 0.2, 1)
  • +
+

Which of them is better?

+
+
+

Winning the bias-variance trade-off

+

The RMSE can be defined as \begin{align*} +\text{RMSE}_y(\hat{\theta}, \theta) & = \sqrt{\int (\hat{\theta}(y) - \theta)^2 \; p(y) \; d y} \\ +& = \sqrt{\text{Var}_y{\hat{\theta}} + \text{Bias}_y(\hat{\theta}, \theta) ^2} +\end{align*}

+

It expresses a trade-off between variance and bias

+

A lot of priors will help you win the bias-variance trade-off, not the race for minimal bias!

+
+
+

Non-Bayesian models don’t have priors?

+

Basic multilevel model with J groups:

+
+
y ~ normal(b0[j] + b1 * x, sigma)
+b0[j] ~ normal(b0, sd0)
+
+

Is b0[j] ~ normal(b0, sd0) a likelihood, prior, or something else?

+ + + + + + + + + + + + + + + +
+
+

Some reasons for using priors

+
    +
  • Make a-priori implausible values unlikely (weakly informative priors)
  • +
  • Incorporate specific expert information into the model (“subjective” priors)
  • +
  • Mimic frequentist methods (uninformative/“objective” priors)
  • +
  • Represent known data structure (multilevel priors)
  • +
  • Regularize the model to avoid overfitting (shrinkage/sparsifying priors)
  • +
  • Enable hypothesis testing via Bayes factors
  • +
  • Ensure unimodal posteriors
  • +
  • Facilitate convergence
  • +
  • +
+
+
+

Some observations about priors

+
+
+

Uniformity is informative

+ +
+
+

Prior tails matter

+

What is the posterior?

+
    +
  • … if the prior is +\theta \sim \text{student-t}(4, 5, 1) +

  • +
  • … and the likelihood alone implies a posterior of +\theta \sim \text{normal}(-5, 1) +

  • +
+
+
+

Prior tails matter: Student-t(4) prior vs. normal likelihood

+ +
+
+

Prior tails matter: Normal prior vs. Student-t(4) likelihood

+ +
+
+

Prior tails matter: Normal prior vs. normal likelihood

+ +
+
+

Prior tails matter: Student-t(4) prior vs. Student-t(4) likelihood

+ +
+
+

But what now?

+
+
+

Principles of specifying priors

+
    +
  • Respecting boundaries: use hard bounds in priors exactly where parameters have natural bounds

  • +
  • Expressiveness: use prior families flexible enough to express different plausible prior knowledge

  • +
  • Controlling complexity: If you want to be conservative, put relevant amount of prior probability at or near a conservative submodel

  • +
  • Scale awareness: ensure that priors take the scales of parameters into account

  • +
  • Reflecting structure: reflect the structure of the data in the structure of the prior

  • +
  • Data Informed: Use previous data to inform the current priors

  • +
+
+
+

Data informed priors

+ + +
+
+
+

Part 2: Dose finding

+ + +
+
+

Typical dose response shapes

+ +
+
+

Typical dose response shapes

+ +
+
+

Typical dose response shapes

+ +
+
+

Data Set PATHWAY

+
    +
  • Placebo controlled trial
  • +
  • Treatment of severe asthma with tezepelumab
  • +
  • Three different doses + placebo
  • +
  • Endpoint: annualized rate of asthma exacerbations
  • +
  • Estimates per arm from negative binomial regression (like in “arm-based meta-analysis”), not individual patient data
  • +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
dosegrouplog_estlog_stderr
0placebo−0.4000.103
70tezepelumab 70 mg q4w−1.3470.177
210tezepelumab 210 mg q4w−1.6610.222
560tezepelumab 280 mg q2w−1.5140.191
+ +
+
+
+
+
+

Sigmoid Emax Model

+

+f(\text{dose}; \text{parameters}) = \text{E}_0 + \text{E}_\text{max} \frac{\text{dose}^h}{\text{dose}^h + \text{ED}_{50}^h} +

+

Parameters:

+
    +
  • \text{E}_0 \in \mathbb{R}: Expected placebo outcome
  • +
  • \text{E}_\text{max} \in \mathbb{R}: Maximum effect size
  • +
  • h \in \mathbb{R}_+: Hill (steepness) parameter
  • +
  • \text{ED}_{50}: Dose at which 50% of \text{E}_\text{max} is reached
  • +
+
+
+

Sigmoid Emax Model: Visualization

+ +
+
+

Specifying sigmoid Emax Model with brms

+
+
form_sig <- bf( 
+  log_est | se(log_stderr) ~ E0 + Emax * dose^h / 
+                             (dose^h + ED50^h),
+  nlf(h ~ exp(logh)), nlf(ED50 ~ exp(logED50)),
+  E0 ~ 1, Emax ~ 1, logh ~ 1, logED50 ~ 1,
+  nl = TRUE,
+  family = gaussian()
+)
+
+prior_sig <- prior(normal(0,1), nlpar=E0) +
+  prior(normal(0,1), nlpar=logh) +
+  prior(normal(0,1), nlpar=Emax) +
+  prior(normal(4,2), nlpar=logED50)
+
+
+
+

A note on Emax Model priors

+

What is more informative?

+
    +
  • \text{logh} \sim \text{normal}(0,1)
  • +
  • \text{logh} \sim \text{normal}(0,3)
  • +
+
+
+

A note on Emax Model priors

+ +
+
+

A note on Emax Model priors

+ +
+
    +
  • Biologically plausible values: approx. .25 < h < 4 (see prior interval probabilities).
    +The above prior puts roughly 1/3 above 4 and 1/3 below 0.25!

  • +
  • Re-writing the fraction to \left(\frac{d}{\text{ED}_{50}}\right)^h / \left(1+\left(\frac{d}{\text{ED}_{50}}\right)^h\right) makes it obvious that for h \rightarrow 0, this goes to 1/2, and for h \rightarrow \infty, either to 0 (d < \text{ED}_{50}) or 1 (d > \text{ED}_{50}).

  • +
+
+
+
+

Fitting the sigmoid Emax Model with brms

+
+
fit_sig = brm(
+  formula = form_sig, 
+  data = pathway, 
+  prior = prior_sig,
+  control = list(adapt_delta = 0.999)
+) 
+
+
+
+

Sigmoid Emax Model: Results Summary

+
+
summary(fit_sig)
+
+
 Family: gaussian 
+  Links: mu = identity; sigma = identity 
+Formula: log_est | se(log_stderr) ~ E0 + Emax * dose^h/(dose^h + ED50^h) 
+         h ~ exp(logh)
+         ED50 ~ exp(logED50)
+         E0 ~ 1
+         Emax ~ 1
+         logh ~ 1
+         logED50 ~ 1
+   Data: pathway (Number of observations: 4) 
+
+Regression Coefficients:
+                  Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
+E0_Intercept         -0.41      0.10    -0.62    -0.21 1.00     1693     1931
+Emax_Intercept       -1.28      0.30    -2.05    -0.83 1.00     1292     1162
+logh_Intercept        0.01      0.99    -1.79     1.98 1.00     1327     1844
+logED50_Intercept     2.63      1.43    -0.65     5.11 1.00     1311     1240
+
+Further Distributional Parameters:
+      Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
+sigma     0.00      0.00     0.00     0.00   NA       NA       NA
+
+
+
+
+

Visualizing the Fitted Sigmoid Emax Model

+
+
tibble(dose = seq(0, 560, 1), log_stderr=1) |>
+  tidybayes::add_epred_rvars(object=fit_sig) |>
+  (\(x) x |> 
+     left_join(x |> filter(dose==0) |> rename(pbo = .epred) |> dplyr::select(-dose), 
+               by="log_stderr"))() |>
+  mutate(.delta = .epred - pbo) |>
+  ggplot(aes(x=dose, ydist=.delta)) +
+  ggdist::stat_lineribbon()
+
+ +
+
+

Modified Beta Model

+

+f(\text{dose}; \text{parameters}) = \text{E}_0 + + \text{E}_\text{max} \; \frac{(\delta_1 + \delta_2)^{(\delta_1+\delta_2)}} {\delta_1^{\delta_1} \, \delta_2^{\delta_2}} \; \left(\frac{\text{dose}}{S}\right)^{\delta_1} \left(1-\frac{\text{dose}}{S}\right)^{\delta_2} +

+

Parameters:

+
    +
  • \text{E}_0 \in \mathbb{R}: Expected placebo response
  • +
  • \text{E}_\text{max} \in \mathbb{R}: Maximum effect size
  • +
  • \delta_1, \delta_2 \in \mathbb{R}_+: Shape parameters
  • +
  • S: constant > maximum dose, e.g. 1.5 \times \max(\text{dose}), here we choose S=850
  • +
+
+
+

Specifying the Modified Beta Model with brms

+
+
form_mbeta <- bf( 
+  log_est | se(log_stderr) ~ E0 +   
+    Emax * (delta1+delta2)^(delta1+delta2) /
+    (delta1^delta1 * delta2^delta2) * 
+    (dose/850)^delta1 * (1-dose/850)^delta2,
+  nlf(delta1 ~ exp(logdelta1)), nlf(delta2 ~ exp(logdelta2)),
+  E0 ~ 1, Emax ~ 1, logdelta1 ~ 1, logdelta2 ~ 1,
+  nl = TRUE,
+  family = gaussian()
+)
+
+prior_mbeta <- prior(normal(0,1), nlpar="E0") +
+  prior(normal(0,1), nlpar="Emax") +
+  prior(normal(0,1), nlpar="logdelta1") +
+  prior(normal(0,1), nlpar="logdelta2")
+
+
+
+

Fitting the Modified Beta Model with brms

+
+
fit_mbeta <- brm(
+  form_mbeta, 
+  data = pathway, 
+  prior = prior_mbeta,
+  control = list(adapt_delta = 0.999)
+)
+
+
+
+

Visualizing the Fitted Modified Beta Model

+ +
+
+

Model Evaluation (failed attempt)

+
+
(loo_mbeta <- loo(fit_mbeta))
+
+

+Computed from 4000 by 4 log-likelihood matrix.
+
+         Estimate  SE
+elpd_loo      0.1 0.7
+p_loo         2.1 0.5
+looic        -0.3 1.3
+------
+MCSE of elpd_loo is NA.
+MCSE and ESS estimates assume MCMC draws (r_eff in [0.4, 0.6]).
+
+Pareto k diagnostic values:
+                         Count Pct.    Min. ESS
+(-Inf, 0.7]   (good)     2     50.0%   150     
+   (0.7, 1]   (bad)      2     50.0%   <NA>    
+   (1, Inf)   (very bad) 0      0.0%   <NA>    
+See help('pareto-k-diagnostic') for details.
+
+
+
    +
  • brms interfaces with the loo R package that performs efficient approximate leave-one-out cross-validation (LOO) for Bayesian models by Pareto smoothed importance sampling (PSIS). See Vethari et al. (2017) and the loo documentation on CRAN.
  • +
+
+
+

Model Evaluation (works)

+
+
loo_exact_sig <- kfold(fit_sig, folds = "loo", silent=2)
+(loo_exact_mbeta <- kfold(fit_mbeta, folds = "loo", silent=2)) 
+
+

+Based on 4-fold cross-validation.
+
+           Estimate  SE
+elpd_kfold     -2.1 1.7
+p_kfold         4.4 2.2
+kfoldic         4.2 3.4
+
+
+
    +
  • elpd_kfold: CV estimate of the expected log pointwise predictive density for a new dataset
  • +
  • p_kfold: CV estimate of difference between elpd_loo and the non-cross-validated log posterior predictive density (describes how much more difficult it is to predict future data than the observed data).
  • +
  • kfoldic: -2 * elpd_kfold (on the conventional scale of deviance)
  • +
+ +
+
+

Model Comparison

+
+
loo_compare(loo_exact_sig, loo_exact_mbeta) 
+
+
          elpd_diff se_diff
+fit_sig    0.0       0.0   
+fit_mbeta -1.8       0.9   
+
+
+
    +
  • loo_compare computes a paired estimate of the difference in ELPD to take advantage of the fact that the same set of data points was used to fit both models (and reduce the standard error). See Vethari et al. (2017) and the loo R package manual for details.
  • +
+
+
fit_sig$criteria$loo <- loo_exact_sig
+fit_mbeta$criteria$loo <- loo_exact_mbeta
+(w_dose <- model_weights(fit_sig, fit_mbeta, weights = "loo")) 
+
+
  fit_sig fit_mbeta 
+0.8589718 0.1410282 
+
+
+
    +
  • Here, model_weights from brms will compute Akaike weights based on the information criterion values returned by loo
  • +
+
+
+

Bayesian Model Averaging

+
+
pe_sig <- posterior_epred(fit_sig, newdata = dose_df)
+pe_mbeta <- posterior_epred(fit_mbeta, newdata = dose_df)
+pe_avg <- pe_sig * w_dose[1] + pe_mbeta * w_dose[2]  
+
+
+
pe_avg <- pe_avg |>
+  posterior_summary() |>
+  as.data.frame() |> 
+  bind_cols(dose_df) 
+
+
+
+
    Estimate  Est.Error       Q2.5      Q97.5      dose
+1 -0.4151540 0.09045093 -0.5904823 -0.2415002  0.000000
+2 -0.8277490 0.27948258 -1.3727135 -0.3672984  5.656566
+3 -0.9523345 0.27751337 -1.4428015 -0.4227625 11.313131
+4 -1.0381309 0.26183898 -1.4743775 -0.4820924 16.969697
+
+
+
+
+

Visualizing the Model Averaging

+ +
+
+

Hands-on exercises: dose finding

+ +
+ +
+
+

Part 3: Bayesian Mixed Models for Repeated Measures (MMRM)

+ +
+
+

Hypothetical dose finding study, N=200

+

Continuous outcome measured at baseline & weeks 2, 4, 8, 12

+ +
+
+

Overview and Analysis Goals

+
    +
  • Mixed Effects Model for Repeated Measures (MMRM) commonly used for longitudinal data (each patient measured at multiple visits)

  • +
  • Direct likelihood analysis that can address hypothetical estimand of all patients completing the study on treatment without doing missing data imputation first

  • +
+
+
    +
  • Commonly no structure assumed for correlations between visits and different variance allowed for different visits (to avoid unnecessary assumptions)

  • +
  • Convergence issues with REML fit common, especially for small sample sizes, which is alleviated by Bayesian inference with (weakly-)informative priors

  • +
+
+
+
    +
  • Bayesian approach allows us to incorporate prior information and historical data, which is very interesting for Phase I studies

  • +
  • brms lets us easily add more components & structure to the model

  • +
+
+
+
+

What do our data look like?

+ +
+
+

Analysis Data Model (ADaM) Basic Data Structure (BDS)

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
USUBJIDTRT01PAVISITADYAVALCHGBASE
310visit1141.320.540.78
310visit2281.300.520.78
310visit356−0.24−1.020.78
310visit4841.400.630.78
910visit1140.950.840.11
910visit2281.461.350.11
910visit356−0.97−1.080.11
910visit4841.211.100.11
1310visit1142.350.451.90
1310visit2282.040.141.90
+ +
+
+
+
+

Patients can miss visits or drop-out of the study prior to the final visit.

+
+
+ +
+

Model Specification: Formal

+

Formally, let us assume that there are V visits. We assume that the V-dimensional response \boldsymbol{Y}_i for patient i satisfies +\boldsymbol{Y}_i = \boldsymbol{X}_i \boldsymbol{\beta} + \boldsymbol{Z}_i \boldsymbol{b}_i + \boldsymbol{\epsilon}_i +

+

with \boldsymbol{b}_i \sim \text{MVN}(\boldsymbol{0}, \boldsymbol{D}) and \boldsymbol{\epsilon}_i \sim \text{MVN}(\boldsymbol{0}, \boldsymbol{\Sigma}), where \boldsymbol{\Sigma} is a diagonal matrix. This implies +\boldsymbol{Y}_i \sim \text{MVN}(\boldsymbol{X}_i \boldsymbol{\beta}, \boldsymbol{V}_i), + where \boldsymbol{V}_i = \boldsymbol{Z}_i \boldsymbol{D} \boldsymbol{Z}_i^T + \boldsymbol{\Sigma}. Model the correlated Y_{ij} either by

+
    +
  1. marginalizing out random effects & account for them with correlated residual errors (residual covariance matrix V_i), or
  2. +
  3. conditionally on (V-dimensional) random effects \boldsymbol{b}_i with residual errors \boldsymbol{\epsilon}_i independent (once we condition on \boldsymbol{b}_i).
  4. +
+
+
+

MMRMs in SAS

+

Widely-used high-quality reference implementation

+
+
PROC MIXED DATA=simulated_data;
+  CLASS TRT01P AVISIT USUBJID;
+  MODEL CHG ~ TRT01P AVISIT BASE TRT01P*AVISIT AVISIT*BASE 
+    / SOLUTION DDFM=KR ALPHA = 0.05;
+  REPEATED AVISIT / TYPE=UN SUBJECT = USUBJID R Rcorr GROUP=TRT01P;
+  LSMEANS TRT01P*AVISIT / DIFFS PDIFF CL OM E;
+RUN;
+
+
+
+

MMRMs with the mmrm R package

+

Fit the model in R in a frequentist framework

+
+
library(mmrm)
+mmrm_fit <- mmrm(
+  formula = CHG ~ TRT01P + AVISIT + BASE + AVISIT:TRT01P + 
+    AVISIT:BASE + us(AVISIT | TRT01P / USUBJID),
+  method = "Kenward-Roger", 
+  vcov = "Kenward-Roger-Linear", # to match SAS
+  data = mutate(simulated_data, USUBJID=factor(USUBJID))
+)
+
+

Refer to https://openpharma.github.io/mmrm.

+
+
+

Motivation Forward Difference Parametrization

+

We would like to put priors on the differences from visit to visit

+ +
+
+

Difference contrasts in R

+

Setup forward difference contrasts for changes between visits:

+
+
contrasts(simulated_data$AVISIT) <- MASS::contr.sdif
+
+
+

Hard to interpret the contrast matrix directly:

+
+
contrasts(simulated_data$AVISIT) |> MASS::fractions()
+
+
       visit2-visit1 visit3-visit2 visit4-visit3
+visit1 -3/4          -1/2          -1/4         
+visit2  1/4          -1/2          -1/4         
+visit3  1/4           1/2          -1/4         
+visit4  1/4           1/2           3/4         
+
+
+

Learn more about contrasts: https://bbolker.github.io/mixedmodels-misc/notes/contrasts.pdf

+
+
+
+

What do these contrasts mean?

+

Inverting the contrast matrix reveals the dummy variables’ interpretation:

+
+
# add the intercept
+cmat <- cbind("Intercept" = 1, contrasts(simulated_data$AVISIT))
+# compute the inverse matrix
+solve(cmat) |> MASS::fractions()
+
+
              visit1 visit2 visit3 visit4
+Intercept     1/4    1/4    1/4    1/4   
+visit2-visit1  -1      1      0      0   
+visit3-visit2   0     -1      1      0   
+visit4-visit3   0      0     -1      1   
+
+
+
+
+

MMRMs in brms

+
+
mmrm_model1 <- bf(
+  CHG ~ 1 + AVISIT + BASE + BASE:AVISIT + TRT01P + TRT01P:AVISIT 
+    + unstr(time = AVISIT, gr = USUBJID),
+  sigma ~ 1 + AVISIT + TRT01P + AVISIT:TRT01P
+)
+
+
+
+
mmrm_prior1 <- prior(normal(0, 2), class=Intercept) +
+    prior(normal(0, 1), class=b) +
+    prior(normal(0, log(10.0)/1.64), class=Intercept, dpar=sigma) +
+    prior(normal(0, log(2.0)/1.64), class=b, dpar=sigma) +  
+    prior(lkj(1), class=cortime)
+
+
+
+
+
fit_mmrm1 <- brm(
+  formula = mmrm_model1, data = simulated_data, prior = mmrm_prior1, ...
+)
+
+
+

Note that a single corrleation matrix is estimated while the covariance varies as per the sigma model.

+
+
+

Expected marginal (least-squares) means

+ +
+
emm2 <- emmeans(fit_mmrm1, ~ TRT01P | AVISIT, weights="proportional")
+
+
+
+
AVISIT = visit1:
+ TRT01P  emmean lower.HPD upper.HPD
+ 0      -0.2281   -0.4306   -0.0217
+ 10      0.0364   -0.1462    0.2303
+ 20     -0.0519   -0.2470    0.1265
+ 40     -0.0568   -0.2764    0.1741
+
+AVISIT = visit4:
+ TRT01P  emmean lower.HPD upper.HPD
+ 0      -0.3291   -0.5982   -0.0655
+ 10      0.3198    0.0507    0.5893
+ 20      0.2099   -0.0572    0.4629
+ 40      0.4486    0.1338    0.7896
+
+Point estimate displayed: median 
+HPD interval probability: 0.95 
+
+
+

To work with MCMC samples of the expected marginal means & to summarize them exactly as we want (e.g. quantile credible intervals instead of highest posterior density intervals) we can use:

+
+
emm2 |> as.mcmc() |> summarize_draws()
+
+
+
+

Expected Marginal Contrasts per Visit

+
+
contrast(emm2, adjust="none", method="trt.vs.ctrl", ref="TRT01P0")
+
+
AVISIT = visit1:
+ contrast           estimate lower.HPD upper.HPD
+ TRT01P10 - TRT01P0    0.263   -0.0200     0.536
+ TRT01P20 - TRT01P0    0.174   -0.0774     0.460
+ TRT01P40 - TRT01P0    0.173   -0.1410     0.467
+
+AVISIT = visit4:
+ contrast           estimate lower.HPD upper.HPD
+ TRT01P10 - TRT01P0    0.650    0.2770     1.029
+ TRT01P20 - TRT01P0    0.541    0.1592     0.899
+ TRT01P40 - TRT01P0    0.781    0.3455     1.189
+
+Point estimate displayed: median 
+HPD interval probability: 0.95 
+
+
+

as.mcmc() to work with MCMC samples of the difference, e.g.

+
+
contrast(emm2, adjust="none", method="trt.vs.ctrl", ref="TRT01P0") |> as.mcmc()
+
+
+
+

Monotonic Effects Across Ordered Factor Levels

+
+
mmrm_model2 <- bf( 
+  CHG ~ 1 + AVISIT + mo(TRT01P) + BASE + mo(TRT01P):AVISIT 
+    + BASE:AVISIT + unstr(time = AVISIT, gr = USUBJID),
+  sigma ~1 + AVISIT + mo(TRT01P) + mo(TRT01P):AVISIT
+)
+
+
+

For category c=0,\ldots,(\text{categories}-1) = C-1, the monotonic term is \text{coefficient} \times (C-1) \times \sum_{k=1}^{c} \zeta_k

+
    +
  • \zeta_k \in [0, 1] is the percent increase and is subject to the constraint \sum_{k=1}^{C-1} \zeta_k = 1

  • +
  • \text{coefficient} is the mean change between adjacent categories

  • +
+

For more details see the respective vignette:
+https://paulbuerkner.com/brms/articles/brms_monotonic.html

+
+
fit_mmrm2 <- brm(formula = mmrm_model2,
+                 data = simulated_data |> mutate(TRT01P=ordered(TRT01P)), prior = mmrm_prior1, ...)
+
+
+
+
+

Results from different MMRMs

+ +
+
+

MMRMs: Outlook

+

In the online case study on http://opensource.nibr.com/bamdd you additionally find:

+
    +
  • Data and full code
  • +
  • More on estimands, parametrization, contrasts & priors
  • +
  • Estimating average differences across visits
  • +
  • Meta-analytic combined (MAC) using historical data
  • +
  • Robustifying MAC via a “slab-and-spike”-type prior
  • +
  • Non-linear functions over time & doses in MMRMs
  • +
  • Excercises
  • +
+
+
+
+

Part 4: Longitudinal data

+ + +
+
+

Longitudinal Data: Background

+
    +
  • Example: simulated study of a drug for the treatment of Psoriasis
  • +
  • 112 patients, 59 randomized to placebo, 53 to drug.
  • +
  • Efficacy was assessed using the Psoriasis Area and Severity Index (PASI), a numerical score which measures the severity and extent of psoriasis (0: no disease, 72: maximum).
  • +
  • Assessed at baseline and 7 post-baseline timepoints.
  • +
+
+
+

Longitudinal Data: Illustration

+ +
+
+

Longitudinal Data: Key Variables

+
+
+
# A tibble: 10 × 6
+      CHG  BASE TRT01P AVISIT  AVISITN SUBJID
+    <dbl> <dbl> <fct>  <fct>     <dbl>  <dbl>
+ 1 -2.2    16   PBO    Week 1        1      1
+ 2 -0.5    16   PBO    Week 2        2      1
+ 3  4.7    16   PBO    Week 4        4      1
+ 4  7.3    16   PBO    Week 6        6      1
+ 5 32.1    16   PBO    Week 8        8      1
+ 6 10      16   PBO    Week 10      10      1
+ 7 20.7    16   PBO    Week 12      12      1
+ 8  3.4    20.3 TRT    Week 1        1      2
+ 9  1.2    20.3 TRT    Week 2        2      2
+10  0.600  20.3 TRT    Week 4        4      2
+
+
+

+
+
+

Longitudinal Data: Mean Model

+
+
fit_long_mean <- brm(
+  CHG ~ BASE + TRT01P * AVISIT + (1 | SUBJID), 
+  data = pasi_data, seed = 2454
+)
+fit_long_mean <- add_criterion(fit_long_mean, "loo")
+
+

Total elapsed fitting time (seconds):

+
+
sum(rstan::get_elapsed_time(fit_long_mean$fit))
+
+
[1] 3.205
+
+
+
+
+

Mean Model: Posterior predictive checks

+
+
pp_check(fit_long_mean)
+
+ +
    +
  • pp_check in brms performs posterior predictive checks with the help of the bayesplot package (shows dens_overlay by default). +
      +
    • Can also be called with type loo_pit (probability integral transformation). In an ideal model fit, the resulting PIT-transformed values would be uniformly distributed: i.e. the blue points and dashed lines would align with the distribution function of a Uniform(0,1) variable (solid line). See chapter 12 of BAMDD for details.
    • +
  • +
+
+
+

Mean Model: LOO-CV results

+
+
loo(fit_long_mean)
+
+

+Computed from 4000 by 684 log-likelihood matrix.
+
+         Estimate   SE
+elpd_loo  -2285.7 33.1
+p_loo       101.9  9.5
+looic      4571.4 66.3
+------
+MCSE of elpd_loo is NA.
+MCSE and ESS estimates assume MCMC draws (r_eff in [0.4, 1.8]).
+
+Pareto k diagnostic values:
+                         Count Pct.    Min. ESS
+(-Inf, 0.7]   (good)     681   99.6%   103     
+   (0.7, 1]   (bad)        3    0.4%   <NA>    
+   (1, Inf)   (very bad)   0    0.0%   <NA>    
+See help('pareto-k-diagnostic') for details.
+
+
+
+
    +
  • While this is quick, is this what we are interested in? +
      +
    • If we’re interested in the prediction for a new (unseen) patient, we should be running leave-one-patient-out CV (not leave-one-observation-out)…
      +See kfold_split_grouped in the loo package.
    • +
    • For the Emax model data: not possible (IPD needed!)
    • +
  • +
+
+
+
+

Mean Model: Visualization of effects

+
+
conditional_effects(fit_long_mean, "AVISIT:TRT01P")
+
+ +
    +
  • By default, numeric variables will be conditionalized by using their means and factors will get their first level assigned.
  • +
+
+
    +
  • We might be interested in the effect integrated out over a population \rightarrow emmeans +
  • +
+
+
+
+

Longitudinal Data: Linear Model

+
+
fit_long_lin <- brm(
+  CHG ~ BASE + TRT01P * AVISITN + (1 | SUBJID), 
+  data = pasi_data, seed = 2454
+)
+fit_long_lin <- add_criterion(fit_long_lin, "loo")
+
+

Total elapsed fitting time:

+
+
sum(rstan::get_elapsed_time(fit_long_lin$fit))
+
+
[1] 2.643
+
+
+
+
+

Linear Model: Summary

+
+
summary(fit_long_lin)
+
+
 Family: gaussian 
+  Links: mu = identity; sigma = identity 
+Formula: CHG ~ BASE + TRT01P * AVISITN + (1 | SUBJID) 
+   Data: pasi_data (Number of observations: 684) 
+
+Multilevel Hyperparameters:
+~SUBJID (Number of levels: 112) 
+              Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
+sd(Intercept)     5.21      0.45     4.41     6.15 1.00     1358     2336
+
+Regression Coefficients:
+                  Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
+Intercept            13.11      1.78     9.55    16.53 1.00     1567     2375
+BASE                 -0.70      0.08    -0.85    -0.54 1.00     1502     2233
+TRT01PTRT            -6.10      1.34    -8.74    -3.43 1.00     1497     2504
+AVISITN              -0.22      0.09    -0.40    -0.04 1.00     3550     3397
+TRT01PTRT:AVISITN    -0.72      0.13    -0.97    -0.47 1.00     3360     3063
+
+Further Distributional Parameters:
+      Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
+sigma     6.52      0.19     6.15     6.91 1.00     4605     3086
+
+
+
+
+

Linear Model: Visualization of effects

+
+
conditional_effects(fit_long_lin, "AVISITN:TRT01P")
+
+ +
+
+

Longitudinal Data: Linear Model with Varying Slopes

+
+
fit_long_lin_vs <- brm(
+  CHG ~ BASE + TRT01P * AVISITN + (1 + AVISITN | SUBJID),
+  data = pasi_data, seed = 2454
+)
+fit_long_lin_vs <- add_criterion(fit_long_lin_vs, "loo")
+
+

Total elapsed fitting time:

+
+
sum(rstan::get_elapsed_time(fit_long_lin_vs$fit))
+
+
[1] 7.479
+
+
+
+
+

Linear Model: Summary

+
+
summary(fit_long_lin_vs)
+
+
 Family: gaussian 
+  Links: mu = identity; sigma = identity 
+Formula: CHG ~ BASE + TRT01P * AVISITN + (1 + AVISITN | SUBJID) 
+   Data: pasi_data (Number of observations: 684) 
+
+Multilevel Hyperparameters:
+~SUBJID (Number of levels: 112) 
+                       Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
+sd(Intercept)              5.26      0.53     4.28     6.32 1.00     1393     2805
+sd(AVISITN)                1.10      0.09     0.94     1.28 1.00      708     1345
+cor(Intercept,AVISITN)    -0.54      0.09    -0.70    -0.35 1.01      489      928
+
+Regression Coefficients:
+                  Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
+Intercept             9.26      1.71     5.94    12.66 1.00     1294     1997
+BASE                 -0.50      0.08    -0.65    -0.35 1.00     1052     1954
+TRT01PTRT            -6.46      1.22    -8.92    -4.00 1.00     1883     2263
+AVISITN              -0.24      0.16    -0.55     0.08 1.00      937     1943
+TRT01PTRT:AVISITN    -0.72      0.24    -1.18    -0.24 1.00      818     1626
+
+Further Distributional Parameters:
+      Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
+sigma     4.67      0.15     4.38     4.98 1.00     3159     3212
+
+
+
+
+

Linear Model with Varying Slopes: Visualization of effects

+
+
conditional_effects(fit_long_lin_vs, "AVISITN:TRT01P")
+
+ +
+
+

Model Comparison

+
+
loo_compare(fit_long_lin, fit_long_lin_vs)
+
+
                elpd_diff se_diff
+fit_long_lin_vs    0.0       0.0 
+fit_long_lin    -173.9      20.5 
+
+
+
+
+

Longitudinal Data: Monotonic Model

+
+
fit_long_mo <- brm(
+  CHG ~ BASE + TRT01P * mo(AVISITN) + 
+    (1 + mo(AVISITN) | SUBJID),
+  data = pasi_data, seed = 24543
+)
+fit_long_mo <- add_criterion(fit_long_mo, "loo")
+
+

Total elapsed fitting time:

+
+
sum(rstan::get_elapsed_time(fit_long_mo$fit))
+
+
[1] 26.457
+
+
+
+
+

Monotonic Model: Visualization of effects

+
+
conditional_effects(fit_long_mo, "AVISITN:TRT01P")
+
+ +
+
+

Model Comparison

+
+
loo_compare(fit_long_lin_vs, fit_long_mo)
+
+
                elpd_diff se_diff
+fit_long_mo       0.0       0.0  
+fit_long_lin_vs -91.5      11.7  
+
+
+
+
+

Longitudinal Data: Quadratic Model

+
+
fit_long_quad <- brm(
+  CHG ~ BASE + TRT01P * (AVISITN + I(AVISITN^2)) + 
+    (1 + AVISITN + I(AVISITN^2) | SUBJID),
+  data = pasi_data, seed = 245124
+)
+fit_long_quad <- add_criterion(fit_long_quad, "loo")
+
+

Total elapsed fitting time:

+
+
sum(rstan::get_elapsed_time(fit_long_quad$fit))
+
+
[1] 35.05
+
+
+
+
+

Quadratic Model: Visualization of effects

+
+
conditional_effects(fit_long_quad, "AVISITN:TRT01P")
+
+ +
+
+

Longitudinal Data: Centering the time variable

+

Non-centered variables are often highly correlated with their square

+
+
cor(pasi_data$AVISITN, pasi_data$AVISITN^2)
+
+
[1] 0.9734303
+
+
+

Centering can be done around any central value. Here we use 6 because this is the average week in the study

+
+
pasi_data <- pasi_data |> 
+  mutate(AVISITN_c = AVISITN - 6)
+
+

After centering, the correlation is drastically reduced

+
+
cor(pasi_data$AVISITN_c, pasi_data$AVISITN_c^2)
+
+
[1] 0.2548532
+
+
+
+
+

Longitudinal Data: Centered Quadratic model

+
+
fit_long_quad_c <- brm(
+  CHG ~ BASE + TRT01P * (AVISITN_c + I(AVISITN_c^2)) + 
+    (1 + AVISITN_c + I(AVISITN_c^2) | SUBJID),
+  data = pasi_data, seed = 24547
+)
+fit_long_quad_c <- add_criterion(fit_long_quad_c, "loo")
+
+

Total elapsed fitting time:

+
+
sum(rstan::get_elapsed_time(fit_long_quad_c$fit))
+
+
[1] 11.902
+
+
+
+
+

Centered Quadratic Model: Visualization of effects

+
+
conditional_effects(fit_long_quad_c, "AVISITN_c:TRT01P")
+
+ +
+
+

Model Comparison

+
+
loo_compare(fit_long_mo, fit_long_quad_c)
+
+
                elpd_diff se_diff
+fit_long_mo       0.0       0.0  
+fit_long_quad_c -17.8       9.8  
+
+
+
+
+

Longitudinal Data: Gaussian Process Model

+
+
fit_long_gp <- brm(
+  CHG ~ BASE + gp(AVISITN_c, by = TRT01P, k=9) + 
+    (1 + (AVISITN_c + I(AVISITN_c^2)) | SUBJID),
+  data = pasi_data, seed = 32454,
+  control = list(adapt_delta = 0.95)
+)
+fit_long_gp <- add_criterion(fit_long_gp, "loo")
+
+

Total elapsed fitting time:

+
+
sum(rstan::get_elapsed_time(fit_long_gp$fit))
+
+
[1] 78.556
+
+
+
+
+

Gaussian Process Model: LOO-CV results

+
+
loo(fit_long_gp)
+
+

+Computed from 4000 by 684 log-likelihood matrix.
+
+         Estimate   SE
+elpd_loo  -2042.9 35.3
+p_loo       191.4 15.6
+looic      4085.9 70.7
+------
+MCSE of elpd_loo is NA.
+MCSE and ESS estimates assume MCMC draws (r_eff in [0.3, 1.7]).
+
+Pareto k diagnostic values:
+                         Count Pct.    Min. ESS
+(-Inf, 0.7]   (good)     643   94.0%   121     
+   (0.7, 1]   (bad)       36    5.3%   <NA>    
+   (1, Inf)   (very bad)   5    0.7%   <NA>    
+See help('pareto-k-diagnostic') for details.
+
+
+
+
+

Gaussian Process Model: Visualization of effects

+
+
conditional_effects(fit_long_gp, "AVISITN_c:TRT01P")
+
+ +
+
+

Model Comparison

+
+
loo_compare(fit_long_quad_c, fit_long_gp)
+
+
                elpd_diff se_diff
+fit_long_gp       0.0       0.0  
+fit_long_quad_c -13.9       6.3  
+
+
+

Recall that model comparisons may not be trustworthy.

+
+
+

Longitudinal Data: Gaussian Process AR1 Model

+
+
fit_long_gp_ar <- brm(
+  CHG ~ BASE + gp(AVISITN_c, by = TRT01P, k=9) + 
+    ar(AVISITN_c, gr = SUBJID, p = 1) +
+    (1 + (AVISITN_c + I(AVISITN_c^2)) | SUBJID),
+  data = pasi_data, seed = 24235,
+  iter = 4000, warmup = 1000,
+  control = list(adapt_delta = 0.95)
+)
+fit_long_gp_ar <- add_criterion(fit_long_gp_ar, "loo")
+
+

Total elapsed fitting time:

+
+
sum(rstan::get_elapsed_time(fit_long_gp_ar$fit))
+
+
[1] 169.07
+
+
+
+
+

Gaussian Process AR1 Model: Autocorrelation results

+

Some autocorrelation may be present:

+
+
posterior_summary(fit_long_gp_ar, variable = "ar") |>
+  round(3)
+
+
      Estimate Est.Error  Q2.5 Q97.5
+ar[1]    0.384     0.122 0.159  0.63
+
+
+

A more formal model comparison may be theoretically advantageous but given that we add only a single parameter (the AR1 effect), we should probably gain more than we loose by including it.

+
+
+

Gaussian Process AR1 Model: Visualization of effects

+
+
conditional_effects(fit_long_gp_ar, "AVISITN_c:TRT01P")
+
+ +
+
+
+

Course wrap-up

+ +
+
+

Summary

+
    +
  • Diverse opportunities for applied modelling to inform good drug-development decisions
  • +
  • Bayesian paradigm is well suited for many of these situations +
      +
    • Availability of meaningful prior information
    • +
    • Desire for probabilistically interpretable statements about unknowns and future observable quantities
    • +
  • +
  • brms is a powerful and highly flexible engine for applied modelling , facilitating straightforward model specification and inference
  • +
+
+
+

Looking ahead

+
    +
  • We hope you have: +
      +
    • Become familiar with brms syntax and workflow
    • +
    • Seen its versatility for statistical modelling in drug development
    • +
    • Gained hands-on experience with the package from guided exercises
    • +
  • +
  • And that you feel empowered to use brms going forward!
  • +
+
+
+

Resources

+ +
+
+

Thank you

+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/workshops/goettingen2024/stan/conflict_normal_student-t.stan b/workshops/goettingen2024/stan/conflict_normal_student-t.stan new file mode 100644 index 0000000..b5e2d31 --- /dev/null +++ b/workshops/goettingen2024/stan/conflict_normal_student-t.stan @@ -0,0 +1,19 @@ +data { + real df1; + real location1; + real scale1; + real df2; + real location2; + real scale2; +} +parameters { + real mu1; + real mu2; + real mu; +} +model { + target += student_t_lpdf(mu1 | df1, location1, scale1); + target += student_t_lpdf(mu2 | df2, location2, scale2); + target += student_t_lpdf(mu | df1, location1, scale1); + target += student_t_lpdf(mu | df2, location2, scale2); +}