## ----include = FALSE----------------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)

## ----setup--------------------------------------------------------------------
library(bayespmtools)

## ----set-seed-----------------------------------------------------------------
# Setting the random number seed for reproducibility
set.seed(123)

## ----load-evidence------------------------------------------------------------
evidence <- list(
    prev~beta(mean=0.428, sd=0.030), 
    cstat~beta(mean=0.761, cih=0.773), 
    cal_mean~norm(-0.009, 0.125),  #mean and SD
    cal_slp~norm(0.995, 0.024)     #mean and SD
  )

## ----inspect-evidence---------------------------------------------------------
process_evidence(evidence)

## ----summarise-evidence-------------------------------------------------------
summary(process_evidence(evidence))

## ----targets-samp-------------------------------------------------------------
targets_samp <- list(eciw.cstat=0.1,
                eciw.cal_oe=0.22,
                eciw.cal_slp=0.30,
                qciw.cstat=c(0.9, 0.1),
                qciw.cal_oe=c(0.9, 0.22),
                qciw.cal_slp=c(0.9, 0.30),
                oa.nb=0.90)

## ----eval=FALSE---------------------------------------------------------------
# samp <- bpm_valsamp(evidence=evidence, #Evidence as a list
#                    targets=targets_samp, #Targets (as specified above)
#                    n_sim=10000, #Number of Monte Carlo simulations
#                    threshold=0.2) #Risk threshold for NB calculations
# 

## ----include=FALSE------------------------------------------------------------
samp <- readRDS("precomputed/samp_result.rds")

## ----print-samp-results-------------------------------------------------------
#Print results
print(samp$results)

## -----------------------------------------------------------------------------
N_prec <- samp$results  #Sample size components from the main function call.

targets_prec = list(eciw.cstat = T, eciw.cal_oe = T, eciw.cal_slp = T, qciw.cstat = 0.9, qciw.cal_oe = 0.9, qciw.cal_slp = 0.9, oa.nb=T)

## ----eval=FALSE---------------------------------------------------------------
# prec <- bpm_valprec(
#   N = N_prec, #Sample sizes
#   evidence = evidence, #Evidence as a list
#   dist_type="logitnorm", #Distribution type for calibrated risks
#   method="sample", #Sample based or two-level ("2s") method
#   targets = targets_prec, #Targets specified above
#   n_sim = 10000, #Number of Monte Carlo simulations
#   threshold=0.2) #Risk threshold for NB VoI calculations

## ----include=FALSE------------------------------------------------------------
prec <- readRDS("precomputed/prec_result.rds")

## ----compare_results----------------------------------------------------------

res <- prec$results[cbind(samp$results, names(samp$results))]
names(res) <- names(samp$results)

print(res)

## ----eval=FALSE---------------------------------------------------------------
# voi <- bpm_valprec(
#   N = N_prec, #Sample sizes at each calculations are to be conducted.
#   evidence = samp$sample, #Evidence as a list
#   targets = list(voi.nb=T), #Only requesting EVSI and EVPI
#   threshold=0.2) #Risk threshold for NB VoI calculations

## ----include=FALSE------------------------------------------------------------
voi <- readRDS("precomputed/voi_result.rds")

## ----fig.fullwidth, fig.width = 8, fig.height = 5, out.width = "100%"---------
library(ggplot2)

graph_shapes <- c("oa.nb"=18,
                  "eciw.cstat"=15,
                  "qciw.cstat"=15,
                  "eciw.cal_oe"=16,
                  "qciw.cal_oe"=16,
                  "eciw.cal_slp"=17,
                  "qciw.cal_slp"=17)

graph_names <- c("oa.nb"="Optimality assurance",
                  "eciw.cstat"="c-statistic (expected value)",
                  "qciw.cstat"="c-statistic (assurance)",
                  "eciw.cal_oe"="O/E ratio (expected value)",
                  "qciw.cal_oe"="O/E ratio (assurance)",
                  "eciw.cal_slp"="Calibration slope (expected value)",
                  "qciw.cal_slp"="Calibration slope (assurance)")

graph_colors <- c("oa.nb"="black",
                  "eciw.cstat"="#1f77b4", 
                  "qciw.cstat"="orange",
                  "eciw.cal_oe"="#1f77b4",
                  "qciw.cal_oe"="orange",
                  "eciw.cal_slp"="#1f77b4",
                  "qciw.cal_slp"="orange")

df <- data.frame(N=voi$N, EVPI=voi$results[,'voi.evpi'], EVSI=voi$results[,'voi.evsi'])
o <- order(df$N)
df <- df[o, ]

df$shapes <- graph_shapes[rownames(df)]
df$graph_names <- graph_names[rownames(df)]
df$colors <- graph_colors[rownames(df)]
df$names <- rownames(df)

df$names <- factor(df$names, levels = unique(df$names))


df$EVSI_EVPI_ratio <- df$EVSI / df$EVPI
scale_factor <- max(df$EVSI) / max(df$EVSI_EVPI_ratio)
df$EVSI_EVPI_ratio_scaled <- df$EVSI_EVPI_ratio * scale_factor


# EVSI plot
plt <- ggplot(df, aes(x=N)) +
  geom_line(aes(y=EVSI), color="black") +  # Add the EVSI/EVPI ratio line
  geom_point(aes(y=EVSI, shape=names, color=names), size=2) +  
  labs(x = "Sample size (N)", y = "Expected gain in NB (EVSI)", title = "") +
  scale_shape_manual(
    name = "Sample size targets and rules",  
    values = df$shapes,  # Unique shapes
    labels = df$graph_names  # Use levels of N for labels
  ) +
  scale_color_manual(
    name = "Sample size targets and rules",  
    values = df$colors,  # Unique shapes
    labels = df$graph_names  # Use levels of N for labels
  ) +
  # Primary Y-axis limits
  scale_y_continuous(
    limits = c(0, max(df$EVSI, df$EVPI)),
    sec.axis = sec_axis(~ . / scale_factor, name = "EVSI/EVPI Ratio")  # Secondary Y-axis
  ) +
  # Horizontal lines
  geom_hline(yintercept = df$EVPI, color = "gray") +
  theme_minimal()
print(plt)


