Simulation results 3

Sequential design with early stopping (restricted action set)

Published

April 16, 2024

Modified

April 15, 2024

Simulation 3 is a sequential trial with decision criteria for superiority, and non-inferiority and also for futility with respect to both superiority and non-inferiority.

  1. For the surgical domain we evaluate whether revision is superior to dair and futility for superiority.
  2. For the duration domain (one-stage) we evaluate whether short duration is non-inferior to long duration antibiotic treatment. We also evaluate whether the non-inferiority decision is futile.
  3. For the duration domain (two-stage) we evaluate whether long duration is superior to short duration antibiotic treatment (equivalently whether short duration is inferior to long). We also evaluate whether the superiority decision is futile.
  4. For the choice domain we evaluate whether rif is superior to no-rif. We also evaluate whether the superiority decision is futile.

Enrolment stops for the respective domain/cells when any of the above are triggered based the decision rules described earlier.

We provide summaries of each simulation scenario and the results that were obtained.

Load simulation results
# files of interest
flist <- list.files("data", pattern = "sim03-sc01")
toks <- list()
l <- list()
for(i in 1:length(flist)){
  l[[i]] <- qs::qread(file.path("data", flist[i]))
  toks[[i]] <-  unlist(tstrsplit(flist[i], "[-.]"))
}
Configuration used for each simulated scenario
# cfg used in each scenario
d_cfg <- rbindlist(lapply(seq_along(l), function(i){
  tok <- toks[[i]]
  m <- data.table(do.call(cbind, l[[i]]$cfg))
  data.table(cbind(sc = tok[2], v = tok[3], analys = 1:nrow(m), m))
}))

# conversion to numeric
d_cfg[, `:=`(
  nsim = as.numeric(nsim),
  N_pt = as.numeric(N_pt),
  b_r1 = as.numeric(b_r1),
  b_r2 = as.numeric(b_r2),
  w_srp2 = as.numeric(w_srp2),
  b_r1d = as.numeric(b_r1d),
  b_r2d = as.numeric(b_r2d),
  b_f = as.numeric(b_f),
  d_sup = as.numeric(thresh_sup),
  d_ni = as.numeric(thresh_non_inf),
  d_fut_sup = as.numeric(thresh_fut_sup),
  d_fut_ni = as.numeric(thresh_fut_ni)
  )]

# derive the 'true' effect for surgery based on weight combination
# d_cfg[, b_r := b_r1 + w_srp2 * b_r2]
# d_cfg[, `:=`(b_r1 = NULL, b_r2 = NULL, w_srp2 = NULL)]

d_cfg[, `:=`(w_srp2 = NULL)]

# d_tru <- melt(d_cfg[
#   , .SD, .SDcols = c("sc", "v", "analys", 
#                      "b_r", "b_r1d", "b_r2d", "b_f")], 
#   id.vars = c("sc", "v", "analys"), value.name = "lor_tru")
Process simulation results for variables of interest
# Decisions
i <- 1
d_dec <- rbindlist(lapply(seq_along(l), function(i){
  tok <- toks[[i]]
  # l[[i]]$d_decision

  d_decision <- copy(l[[i]]$d_decision)
  m <- melt(d_decision, id.vars = c("sim", "analys", "quant"), variable.name = "parname")
  
  # Should be right, but just in case...
  if(any(is.na(m$value))){
    message("Some of the decision values are NA in index ", i, " file ", flist[i])
    m[is.na(value), value := FALSE]
  }
  
  # compute the cumulative instances of a decision being made by sim, each 
  # decision type and by parameter
  m[, value := as.logical(cumsum(value)>0), keyby = .(sim, quant, parname)]
  # summarise by analysis, decision type and parameter
  m <- m[, .(pr_val = mean(value)), keyby = .(analys, quant, parname)]
  # put into wide format
  m <- dcast(m, parname + analys ~ quant, value.var = "pr_val")

  cbind(sc = tok[2], v = tok[3], m)
}))

# Posterior summaries on effects of interest
d_post_smry_2 <- rbindlist(lapply(seq_along(l), function(i){
  tok <- toks[[i]]
  m <- l[[i]]$d_post_smry_2
  cbind(sc = tok[2], v = tok[3], m)
}))

# Participant data from trial (grouped)
d_all <- rbindlist(lapply(seq_along(l), function(i){
  tok <- toks[[i]]
  m <- l[[i]]$d_grp
  cbind(sc = tok[2], v = tok[3], m)
}))

Table 1 summarises the configurations used in each simulated scenario. Each treatment effect parameter is set to have the same magnitude of effect. The effects range from \(\log(1/2)\) in scenario 1 to \(\log(2)\) in scenario 7. Decision rules and thresholds remain constant over the entire enrolment period. The decision processes are documented in the Decision rules page.

Revision effects are computed as a weighted combination of the log-odds ratios for the one-stage and two-stage revision effects. The weights are the sample proportion receiving one-stage and two-stage surgery in those patients receiving randomised surgical treatment and randomised to revision.

Code
d_tbl <- d_cfg[, .(v, N_pt, b_r1, b_r2, b_r1d, b_r2d, b_f, 
                   delta_sup = delta_sup,
                   delta_sup_fut = delta_sup_fut,
                   delta_ni = 1/delta_ni,
                   thresh_sup, thresh_non_inf, thresh_fut_sup, thresh_fut_ni)]

g_tbl <- d_tbl |> gt() |> 
  cols_align(
    columns = everything(),
    align = "center"
  )  |> 
  fmt_number(
    columns = c(b_r1, b_r2, b_r1d, b_r2d, b_f,
                delta_ni
                ),
    decimals = 3
  ) |>
  tab_spanner(
    label = html("Surgical (D<sub>a</sub>)"),
    columns = c(b_r1, b_r2)
  ) |>
  tab_spanner(
    label = html("Duration (D<sub>b</sub>)"),
    columns = c(b_r1d, b_r2d)
  ) |>
  tab_spanner(
    label = html("Type (D<sub>c</sub>)"),
    columns = c(b_f)
  ) |>
  tab_spanner(
    label = html("Decision setup"),
    columns = c(delta_sup, thresh_sup, 
                delta_sup_fut, thresh_fut_sup, 
                delta_ni, thresh_non_inf, thresh_fut_ni)
  ) |>
  cols_label(
    v = html("Configuration"),
    b_r1 = html("rev<br>(one-stage)"),
    b_r2 = html("rev<br>(two-stage)"),
    b_r1d = html("short<br>(one-stage)"),
    b_r2d = html("short<br>(two-stage)"),
    b_f = html("rif"),
    delta_sup = html("delta<sub>sup</sub>"),
    thresh_sup = html("p<sub>sup</sub>"),
    delta_sup_fut = html("delta<sub>fut-sup</sub>"),
    thresh_fut_sup = html("p<sub>fut-sup</sub>"),
    delta_ni = html("delta<sub>ni</sub>"),
    thresh_non_inf = html("p<sub>ni</sub>"),
    thresh_fut_ni = html("p<sub>fut-ni</sub>")
  ) |>
  tab_style(
    style = list(
      cell_borders(
        sides = c("bottom"), color = "black", weight = px(1), style = "solid"
      )),
    locations = list(
      cells_body(
        columns = everything(),
        rows = N_pt == 2500
      )
    )
  ) |>
  tab_options(
    table.font.size = "70%"
  ) |> 
  tab_footnote(
    footnote = "Surgical effects only applies to late silo, effect is relative to response under DAIR.",
    locations = cells_column_labels(columns = c(b_r1, b_r2))
  ) |> 
  tab_footnote(
    footnote = "Applies to all silos, effect is relative to response under long duration.",
    locations = cells_column_labels(columns = b_r1d)
  ) |> 
  tab_footnote(
    footnote = "Applies to all silos, effect is relative to response under short duration.",
    locations = cells_column_labels(columns = b_r2d)
  ) |> 
  tab_footnote(
    footnote = "Applies to all silos, effect is relative to response under no-rifampicin",
    locations = cells_column_labels(columns = b_f)
  ) |> 
  tab_footnote(
    footnote = "Reference OR for evaluating superiority",
    locations = cells_column_labels(columns = delta_sup)
  ) |>
  tab_footnote(
    footnote = "Probability threshold above which superiority is concluded",
    locations = cells_column_labels(columns = thresh_sup)
  ) |> 
  tab_footnote(
    footnote = "Reference OR for evaluating futility wrt the superiority decision",
    locations = cells_column_labels(columns = delta_sup_fut)
  ) |> 
  tab_footnote(
    footnote = "Probability threshold below which futility is concluded",
    locations = cells_column_labels(columns = thresh_fut_sup)
  ) |> 
  tab_footnote(
    footnote = "Reference OR for evaluating non-inferiority",
    locations = cells_column_labels(columns = delta_ni)
  ) |> 
  tab_footnote(
    footnote = "Probability threshold above which non-inferiority is concluded",
    locations = cells_column_labels(columns = thresh_non_inf)
  ) |> 
  tab_footnote(
    footnote = "Probability threshold below which non-inferiority decision is deemed futile",
    locations = cells_column_labels(columns = thresh_fut_ni)
  )   

g_tbl
Configuration N_pt Surgical (Da) Duration (Db) Type (Dc) Decision setup
rev
(one-stage)1
rev
(two-stage)1
short
(one-stage)2
short
(two-stage)3
rif4 deltasup5 psup6 deltafut-sup7 pfut-sup8 deltani9 pni10 pfut-ni11
v01 500 −0.693 −0.693 −0.693 −0.693 −0.693 1 0.99 1.2 0.05 0.833 0.99 0.05
v01 1000 −0.693 −0.693 −0.693 −0.693 −0.693 1 0.99 1.2 0.05 0.833 0.99 0.05
v01 1500 −0.693 −0.693 −0.693 −0.693 −0.693 1 0.99 1.2 0.05 0.833 0.99 0.05
v01 2000 −0.693 −0.693 −0.693 −0.693 −0.693 1 0.99 1.2 0.05 0.833 0.99 0.05
v01 2500 −0.693 −0.693 −0.693 −0.693 −0.693 1 0.99 1.2 0.05 0.833 0.99 0.05
v02 500 −0.405 −0.405 −0.405 −0.405 −0.405 1 0.99 1.2 0.05 0.833 0.99 0.05
v02 1000 −0.405 −0.405 −0.405 −0.405 −0.405 1 0.99 1.2 0.05 0.833 0.99 0.05
v02 1500 −0.405 −0.405 −0.405 −0.405 −0.405 1 0.99 1.2 0.05 0.833 0.99 0.05
v02 2000 −0.405 −0.405 −0.405 −0.405 −0.405 1 0.99 1.2 0.05 0.833 0.99 0.05
v02 2500 −0.405 −0.405 −0.405 −0.405 −0.405 1 0.99 1.2 0.05 0.833 0.99 0.05
v03 500 −0.182 −0.182 −0.182 −0.182 −0.182 1 0.99 1.2 0.05 0.833 0.99 0.05
v03 1000 −0.182 −0.182 −0.182 −0.182 −0.182 1 0.99 1.2 0.05 0.833 0.99 0.05
v03 1500 −0.182 −0.182 −0.182 −0.182 −0.182 1 0.99 1.2 0.05 0.833 0.99 0.05
v03 2000 −0.182 −0.182 −0.182 −0.182 −0.182 1 0.99 1.2 0.05 0.833 0.99 0.05
v03 2500 −0.182 −0.182 −0.182 −0.182 −0.182 1 0.99 1.2 0.05 0.833 0.99 0.05
v04 500 0.000 0.000 0.000 0.000 0.000 1 0.99 1.2 0.05 0.833 0.99 0.05
v04 1000 0.000 0.000 0.000 0.000 0.000 1 0.99 1.2 0.05 0.833 0.99 0.05
v04 1500 0.000 0.000 0.000 0.000 0.000 1 0.99 1.2 0.05 0.833 0.99 0.05
v04 2000 0.000 0.000 0.000 0.000 0.000 1 0.99 1.2 0.05 0.833 0.99 0.05
v04 2500 0.000 0.000 0.000 0.000 0.000 1 0.99 1.2 0.05 0.833 0.99 0.05
v05 500 0.182 0.182 0.182 0.182 0.182 1 0.99 1.2 0.05 0.833 0.99 0.05
v05 1000 0.182 0.182 0.182 0.182 0.182 1 0.99 1.2 0.05 0.833 0.99 0.05
v05 1500 0.182 0.182 0.182 0.182 0.182 1 0.99 1.2 0.05 0.833 0.99 0.05
v05 2000 0.182 0.182 0.182 0.182 0.182 1 0.99 1.2 0.05 0.833 0.99 0.05
v05 2500 0.182 0.182 0.182 0.182 0.182 1 0.99 1.2 0.05 0.833 0.99 0.05
v06 500 0.405 0.405 0.405 0.405 0.405 1 0.99 1.2 0.05 0.833 0.99 0.05
v06 1000 0.405 0.405 0.405 0.405 0.405 1 0.99 1.2 0.05 0.833 0.99 0.05
v06 1500 0.405 0.405 0.405 0.405 0.405 1 0.99 1.2 0.05 0.833 0.99 0.05
v06 2000 0.405 0.405 0.405 0.405 0.405 1 0.99 1.2 0.05 0.833 0.99 0.05
v06 2500 0.405 0.405 0.405 0.405 0.405 1 0.99 1.2 0.05 0.833 0.99 0.05
v07 500 0.693 0.693 0.693 0.693 0.693 1 0.99 1.2 0.05 0.833 0.99 0.05
v07 1000 0.693 0.693 0.693 0.693 0.693 1 0.99 1.2 0.05 0.833 0.99 0.05
v07 1500 0.693 0.693 0.693 0.693 0.693 1 0.99 1.2 0.05 0.833 0.99 0.05
v07 2000 0.693 0.693 0.693 0.693 0.693 1 0.99 1.2 0.05 0.833 0.99 0.05
v07 2500 0.693 0.693 0.693 0.693 0.693 1 0.99 1.2 0.05 0.833 0.99 0.05
1 Surgical effects only applies to late silo, effect is relative to response under DAIR.
2 Applies to all silos, effect is relative to response under long duration.
3 Applies to all silos, effect is relative to response under short duration.
4 Applies to all silos, effect is relative to response under no-rifampicin
5 Reference OR for evaluating superiority
6 Probability threshold above which superiority is concluded
7 Reference OR for evaluating futility wrt the superiority decision
8 Probability threshold below which futility is concluded
9 Reference OR for evaluating non-inferiority
10 Probability threshold above which non-inferiority is concluded
11 Probability threshold below which non-inferiority decision is deemed futile
Table 1: Parameters used to simulate treatment effects and decision thresholds

Figure 1 shows the cumulative probability of each decision quantity. Once answered, the questions are no longer evaluated.

Code
# put power by scenario, variant and analysis in long format
d_fig_0_01 <- melt(d_dec, id.vars = c("sc", "v", "analys", "parname"), variable.name = "quant")
d_fig_0_01[, quant := factor(quant, 
                        levels = c("sup", "fut_sup", "trt_ni_ref", "fut_trt_ni_ref"))]
# add in the number of pts having reached 12 months post rand by analysis num
d_fig_0_01 <- merge(d_fig_0_01, unique(d_cfg[, .(analys, N_pt)]), by = "analys")

d_fig_0_01 <- rbind(
  d_fig_0_01[parname == "b_r" & quant %in% c("sup", "fut_sup"), ],
  d_fig_0_01[parname == "b_r1d" & quant %in% c("trt_ni_ref", "fut_trt_ni_ref"), ],
  d_fig_0_01[parname == "b_r2d" & quant %in% c("sup", "fut_sup"), ],
  d_fig_0_01[parname == "b_f" & quant %in% c("sup", "fut_sup"), ]
)

d_fig_0_01[, or_tru := g_or_lab[v]]
d_fig_0_01[, or_tru := factor(
  or_tru, labels = g_or_lab, levels = g_or_lab)]

fx <- g_fx
names(fx) <- c("rev vs dair", "6-wk vs 12-wk (one)", "12-wk vs 7-day (two)", "rif vs no-rif")
d_fig_0_01[, parname_lab := factor(
  names(fx[parname]), levels = c("rev vs dair", "6-wk vs 12-wk (one)", "12-wk vs 7-day (two)", "rif vs no-rif")
  ) ]

d_text <- unique(d_fig_0_01[, .(parname_lab, or_tru, quant)])
d_text[parname_lab == "rev vs dair" & or_tru %in% c("OR 1/2"),
       `:=`(label = c("rev fut (sup)"), x = 500, y = 0.2)]
d_text[parname_lab == "rev vs dair" & or_tru %in% c("OR 2"),
       `:=`(label = c("rev sup \nto dair"), x = 500, y = 0.2)]
d_text[parname_lab == "6-wk vs 12-wk (one)" & or_tru %in% c("OR 1/2"),
       `:=`(label = c("short fut (ni)"), x = 500, y = 0.2)]
d_text[parname_lab == "6-wk vs 12-wk (one)" & or_tru %in% c("OR 2"),
       `:=`(label = c("short ni \nto long"), x = 500, y = 0.2)]


d_text[parname_lab == "12-wk vs 7-day (two)" & or_tru %in% c("OR 1/2"),
       `:=`(label = c("long fut (sup)"), x = 500, y = 0.2)]
d_text[parname_lab == "12-wk vs 7-day (two)" & or_tru %in% c("OR 2"),
       `:=`(label = c("long sup \nto short"), x = 500, y = 0.2)]

d_text[parname_lab == "rif vs no-rif" & or_tru %in% c("OR 1/2"),
       `:=`(label = c("rif fut (sup)"), x = 500, y = 0.2)]
d_text[parname_lab == "rif vs no-rif" & or_tru %in% c("OR 2"),
       `:=`(label = c("rif sup \nto no-rif"), x = 500, y = 0.2)]


names(d_tbl) <- gsub("superiority", "sup", names(d_tbl))
names(d_tbl) <- gsub("futility (sup)", "fut_sup", names(d_tbl))
names(d_tbl) <- gsub("NI (trt ni ref)", "trt_ni_inf", names(d_tbl))
names(d_tbl) <- gsub("futility (NI)", "fut_trt_ni_ref", names(d_tbl))

d_fig_0_01$quant <- factor(
  d_fig_0_01$quant, 
  levels = c("sup", "fut_sup", "trt_ni_ref", "fut_trt_ni_ref"),
  labels = c("sup", "fut_sup", "ni", "fut_ni"))

p <- ggplot(d_fig_0_01, aes(x = N_pt, y = value, group = quant, col = quant)) +
  geom_point(size = 0.5) +
  geom_line(lwd = 0.4) +
  geom_hline(yintercept = 0.05, lwd = 0.2) +
  ggthemes::scale_colour_tableau(
    "", palette = "Tableau 10",
  type = "regular",
  direction = 1) +
  geom_text(
    data = d_text,
    aes(x = x, y = y, label = label),
    hjust   = 0,
    vjust   = 0, col = 1, size = 3) +
  scale_linetype_discrete("") +
  scale_x_continuous("N (12-months post rand)", guide = guide_axis(angle = 45)) +
  scale_y_continuous("Cumulative probability", breaks = seq(0, 1, by = 0.1)) +
  facet_grid(parname_lab ~ or_tru)

suppressWarnings(print(p))
Figure 1: Probability of declaring decision by parameter by effect size (all pars set with same OR).

Table 2 provides the same detail as the above figure, but makes it easier to see what the magnitudes of the cumulate probabilities are.

Code
# Widen data so that power is shown by col with each col corresponding to an
# analysis
d_tbl <- d_fig_0_01[quant %in% c("sup", "fut_sup", "ni", "fut_ni")]
d_tbl <- dcast(d_tbl, parname + or_tru ~ quant + analys, value.var = "value")
d_tbl <- d_tbl[order(or_tru, parname)]

g_tbl <- d_tbl |> gt(groupname_col = "parname") |>
  fmt_number(
    columns = everything(),
    decimals = 2,
    use_seps = FALSE
  ) |> 
  tab_spanner(
    label = html("Superiority"),
    columns = paste0("sup_", 1:5)
  ) |>
  tab_spanner(
    label = html("Futility (sup)"),
    columns = c(paste0("fut_sup_", 1:5))
  ) |>
  tab_spanner(
    label = html("NI (trt ni ref)"),
    columns = paste0("ni_", 1:5)
  ) |>
  tab_spanner(
    label = html("Futility (ni)"),
    columns = c(paste0("fut_ni_", 1:5))
  ) |>
  cols_label(
    or_tru = html("OR (true)"),
    sup_1 = html("500"),
    sup_2 = html("1000"),
    sup_3 = html("1500"),
    sup_4 = html("2000"),
    sup_5 = html("2500"),
    fut_sup_1 = html("500"),
    fut_sup_2 = html("1000"),
    fut_sup_3 = html("1500"),
    fut_sup_4 = html("2000"),
    fut_sup_5 = html("2500"),
    ni_1 = html("500"),
    ni_2 = html("1000"),
    ni_3 = html("1500"),
    ni_4 = html("2000"),
    ni_5 = html("2500"),
    fut_ni_1 = html("500"),
    fut_ni_2 = html("1000"),
    fut_ni_3 = html("1500"),
    fut_ni_4 = html("2000"),
    fut_ni_5 = html("2500")
  ) |>
  tab_style(
    style = cell_borders(
      sides = c("left"),
      weight = px(1)),
    locations = cells_body(
      # columns = c(sup_1, fut_sup_1, inf_1, fut_inf_1, ni_1, fut_ni_1)
      columns = c(sup_1, fut_sup_1, ni_1, fut_ni_1)
      )
    ) |>
  tab_style(
    style = list(
      cell_borders(
        sides = c("top", "bottom"), color = "red", weight = px(1), style = "solid"
      )),
    locations = list(
      cells_body(
        columns = everything(),
        rows = or_tru == "OR 1"
      )
    )
  ) |>
  tab_options(
    table.font.size = "80%"
  ) |>
  sub_missing(columns = everything(), missing_text = "") 

g_tbl
OR (true) Superiority Futility (sup) NI (trt ni ref) Futility (ni)
500 1000 1500 2000 2500 500 1000 1500 2000 2500 500 1000 1500 2000 2500 500 1000 1500 2000 2500
b_r
OR 1/2 0.00 0.00 0.00 0.00 0.00 0.93 1.00 1.00 1.00 1.00









OR 1/1.5 0.00 0.00 0.00 0.00 0.00 0.68 0.93 0.99 1.00 1.00









OR 1/1.2 0.00 0.00 0.00 0.00 0.00 0.35 0.63 0.80 0.90 0.95









OR 1 0.01 0.01 0.02 0.02 0.03 0.15 0.28 0.39 0.48 0.56









OR 1.2 0.04 0.09 0.14 0.19 0.25 0.04 0.07 0.09 0.11 0.12









OR 1.5 0.15 0.38 0.59 0.76 0.86 0.00 0.00 0.00 0.00 0.00









OR 2 0.45 0.86 0.98 1.00 1.00 0.00 0.00 0.00 0.00 0.00









b_r1d
OR 1/2









0.00 0.00 0.00 0.00 0.00 0.40 0.75 0.90 0.96 0.99
OR 1/1.5









0.00 0.00 0.00 0.00 0.00 0.19 0.40 0.57 0.69 0.78
OR 1/1.2









0.00 0.01 0.01 0.02 0.02 0.07 0.16 0.23 0.30 0.35
OR 1









0.02 0.04 0.06 0.10 0.12 0.03 0.06 0.08 0.10 0.11
OR 1.2









0.04 0.12 0.20 0.28 0.36 0.01 0.01 0.02 0.02 0.02
OR 1.5









0.12 0.29 0.47 0.63 0.76 0.00 0.00 0.00 0.00 0.00
OR 2









0.22 0.60 0.84 0.95 0.98 0.00 0.00 0.00 0.00 0.00
b_r2d
OR 1/2 0.00 0.00 0.00 0.00 0.00 0.83 0.99 1.00 1.00 1.00









OR 1/1.5 0.00 0.00 0.00 0.00 0.00 0.57 0.88 0.97 0.99 1.00









OR 1/1.2 0.00 0.00 0.00 0.00 0.00 0.30 0.56 0.72 0.83 0.90









OR 1 0.01 0.02 0.02 0.03 0.03 0.13 0.24 0.33 0.42 0.49









OR 1.2 0.03 0.07 0.12 0.16 0.20 0.04 0.07 0.09 0.11 0.12









OR 1.5 0.10 0.28 0.47 0.62 0.75 0.01 0.01 0.01 0.01 0.01









OR 2 0.28 0.69 0.92 0.98 1.00 0.00 0.00 0.00 0.00 0.00









b_f
OR 1/2 0.00 0.00 0.00 0.00 0.00 0.98 1.00 1.00 1.00 1.00









OR 1/1.5 0.00 0.00 0.00 0.00 0.00 0.80 0.97 1.00 1.00 1.00









OR 1/1.2 0.00 0.00 0.00 0.00 0.00 0.46 0.75 0.89 0.95 0.98









OR 1 0.01 0.02 0.02 0.03 0.03 0.18 0.33 0.45 0.55 0.63









OR 1.2 0.06 0.13 0.21 0.28 0.35 0.04 0.07 0.09 0.10 0.11









OR 1.5 0.25 0.52 0.73 0.85 0.93 0.00 0.01 0.01 0.01 0.01









OR 2 0.62 0.93 0.99 1.00 1.00 0.00 0.00 0.00 0.00 0.00









Table 2: Cumulative probability of decision

Figure 2 shows the distribution of estimated posterior means by simulated effect size, parameter and sample size.

Figure 2: Distribution of posterior means (true log OR shown in red).