library(tibble)
library(dplyr)
library(testthat)
library(gt)
devtools::load_all()
setwd("./..")
my_path <- "./old_function/"
source_files <- list.files(my_path, "*.R$")
sapply(paste0(my_path, source_files), source)
##         ./old_function/AHR_.R ./old_function/eAccrual_.R
## value   ?                     ?                         
## visible FALSE                 FALSE                     
##         ./old_function/eEvents_.R ./old_function/eEvents_df_.R
## value   ?                         ?                           
## visible FALSE                     FALSE                       
##         ./old_function/gridpts_h1_hupdate_oldR.R
## value   ?                                       
## visible FALSE                                   
##         ./old_function/gs_design_ahr_.R ./old_function/gs_design_npe_.R
## value   ?                               ?                              
## visible FALSE                           FALSE                          
##         ./old_function/gs_info_ahr_.R ./old_function/gs_power_ahr_.R
## value   ?                             ?                             
## visible FALSE                         FALSE                         
##         ./old_function/gs_power_npe_.R ./old_function/tEvents_.R
## value   ?                              ?                        
## visible FALSE                          FALSE

1 Test 1: verify by gs_power_npe

1.1 new version

x <- gs_design_npe(
  theta = c(.1, .2, .3), info = (1:3) * 40, beta = 0.1,
  upper = gs_spending_bound,
  upar = list(sf = gsDesign::sfLDOF, total_spend = 0.025, param = NULL, timing = NULL),
  lower = gs_spending_bound,
  lpar = list(sf = gsDesign::sfLDOF, total_spend = 0.025, param = NULL, timing = NULL), binding = TRUE
)
x %>% gt()
analysis bound z probability probability0 theta info_frac info info0 info1
1 upper 3.7103029 0.0010356481 0.0001035057 0.1 0.3333333 39.75157 39.75157 39.75157
1 lower -3.0798144 0.0001035057 0.0010356481 0.1 0.3333333 39.75157 39.75157 39.75157
2 upper 2.5114338 0.2332751723 0.0060483891 0.2 0.6666667 79.50314 79.50314 79.50314
2 lower -0.7281431 0.0060483891 0.2332751723 0.2 0.6666667 79.50314 79.50314 79.50314
3 upper 1.9930482 0.8999999998 0.0250000000 0.3 1.0000000 119.25471 119.25471 119.25471
3 lower 1.2830660 0.0250000000 0.8999999998 0.3 1.0000000 119.25471 119.25471 119.25471

The power is 0.9. If we re-use these bounds under alternate hypothesis, then we can get a power close to 0.9.

gs_power_npe(
  theta = c(.1, .2, .3), info = (1:3) * 40,
  upper = gs_b, upar = (x %>% filter(bound == "upper"))$z,
  lower = gs_b, lpar = -(x %>% filter(bound == "upper"))$z,
  binding = TRUE # Always use binding = TRUE for power calculations
) %>% gt()
analysis bound z probability theta theta1 info_frac info info0 info1
1 upper 3.710303 1.042508e-03 0.1 0.1 0.3333333 40 40 40
2 upper 2.511434 2.349812e-01 0.2 0.2 0.6666667 80 80 80
3 upper 1.993048 9.020716e-01 0.3 0.3 1.0000000 120 120 120
1 lower -3.710303 7.035242e-06 0.1 0.1 0.3333333 40 40 40
2 lower -2.511434 1.510031e-05 0.2 0.2 0.6666667 80 80 80
3 lower -1.993048 1.512598e-05 0.3 0.3 1.0000000 120 120 120

1.2 old version

x <- gs_design_npe_(
  theta = c(.1, .2, .3), info = (1:3) * 40, beta = 0.1,
  upper = gs_spending_bound,
  upar = list(sf = gsDesign::sfLDOF, total_spend = 0.025, param = NULL, timing = NULL),
  lower = gs_spending_bound,
  lpar = list(sf = gsDesign::sfLDOF, total_spend = 0.025, param = NULL, timing = NULL), binding = TRUE
)
x %>% gt()
Analysis Bound Z Probability theta theta1 info info0 info1
1 Upper 3.7103029 0.0010356481 0.1 0.1 39.75157 39.75157 39.75157
2 Upper 2.5114338 0.2332751723 0.2 0.2 79.50314 79.50314 79.50314
3 Upper 1.9930482 0.8999999998 0.3 0.3 119.25471 119.25471 119.25471
1 Lower -3.0798144 0.0001035057 0.1 0.1 39.75157 39.75157 39.75157
2 Lower -0.7281431 0.0060483891 0.2 0.2 79.50314 79.50314 79.50314
3 Lower 1.2830660 0.0250000000 0.3 0.3 119.25471 119.25471 119.25471

The power is 0.9. If we re-use these bounds under alternate hypothesis, then we can get a power close to 0.9.

gs_power_npe_(
  theta = c(.1, .2, .3), info = (1:3) * 40,
  upper = gs_b, upar = (x %>% filter(Bound == "Upper"))$Z,
  lower = gs_b, lpar = -(x %>% filter(Bound == "Upper"))$Z,
  binding = TRUE # Always use binding = TRUE for power calculations
) %>% gt()
Analysis Bound Z Probability theta theta1 info info0 info1
1 Upper 3.710303 1.042508e-03 0.1 0.1 40 40 40
2 Upper 2.511434 2.349812e-01 0.2 0.2 80 80 80
3 Upper 1.993048 9.020716e-01 0.3 0.3 120 120 120
1 Lower -3.710303 7.035242e-06 0.1 0.1 40 40 40
2 Lower -2.511434 1.510031e-05 0.2 0.2 80 80 80
3 Lower -1.993048 1.512598e-05 0.3 0.3 120 120 120

2 Test 1: examples in spec

2.1 difference of proportions

# Lachin book p71
pc <- .28 # Control response rate
pe <- .40 # Experimental response rate
p0 <- (pc + pe) / 2 # Ave response rate under H0

# Information per increment of 1 in sample size
info0 <- 1 / (p0 * (1 - p0) * 4)
info <- 1 / (pc * (1 - pc) * 2 + pe * (1 - pe) * 2)

# Result should round up to next even number = 652
# Divide information needed under H1 by information per patient added
x1_a <- gs_design_npe(theta = pe - pc, info = info, info0 = info0, info_scale = 0) %>% mutate(`Computated from` = "new version", `Info scale` = 0)
x1_b <- gs_design_npe(theta = pe - pc, info = info, info0 = info0, info_scale = 1) %>% mutate(`Computated from` = "new version", `Info scale` = 1)
x1_c <- gs_design_npe(theta = pe - pc, info = info, info0 = info0, info_scale = 2) %>% mutate(`Computated from` = "new version", `Info scale` = 2)

x2 <- gs_design_npe_(theta = pe - pc, info = info, info0 = info0) %>% 
  mutate(`Computated from` = "old version") %>% 
  rename(analysis = Analysis,
         bound = Bound, z = Z, probability = Probability)
analysis bound z probability probability0 theta info info0 info1 info_frac Computated from Info scale
1 upper 1.959964 0.9 0.025 0.12 729.6822 729.6822 729.6822 1 new version 0
1 upper 1.959964 0.9 0.025 0.12 729.6822 729.6822 729.6822 1 new version 1
1 upper 1.959964 0.9 0.025 0.12 736.8641 725.0428 736.8641 1 new version 2
1 Upper 1.959964 0.9 NA 0.12 736.8641 725.0428 NA NA old version NA

2.2 fixed design

2.2.1 info = info0 = info1

x1_a <- gs_design_npe(
  theta = c(.1, .2, .3),
  info = (1:3) * 80, info_scale = 0,
  upper = gs_b, upar = gsDesign::gsDesign(k = 3, sfu = gsDesign::sfLDOF)$upper$bound,
  lower = gs_b, lpar = c(-1, 0, 0)
) %>% mutate(`Computated from` = "new version", `Info scale` = 0)
x1_b <- gs_design_npe(
  theta = c(.1, .2, .3),
  info = (1:3) * 80, info_scale = 1,
  upper = gs_b, upar = gsDesign::gsDesign(k = 3, sfu = gsDesign::sfLDOF)$upper$bound,
  lower = gs_b, lpar = c(-1, 0, 0)
) %>% mutate(`Computated from` = "new version", `Info scale` = 1)
x1_c <- gs_design_npe(
  theta = c(.1, .2, .3),
  info = (1:3) * 80, info_scale = 2,
  upper = gs_b, upar = gsDesign::gsDesign(k = 3, sfu = gsDesign::sfLDOF)$upper$bound,
  lower = gs_b, lpar = c(-1, 0, 0)
) %>% mutate(`Computated from` = "new version", `Info scale` = 2)

x2 <- gs_design_npe_(
  theta = c(.1, .2, .3),
  info = (1:3) * 80,
  upper = gs_b, upar = gsDesign::gsDesign(k = 3, sfu = gsDesign::sfLDOF)$upper$bound,
  lower = gs_b, lpar = c(-1, 0, 0)) %>% 
  mutate(`Computated from` = "old version") %>% 
  rename(analysis = Analysis,
         bound = Bound, z = Z, probability = Probability)
z probability probability0 theta info_frac info info0 info1 Computated from Info scale theta1
1 - upper
3.710303 0.001201556 0.0001035057 0.1 0.3333333 45.56536 45.56536 45.56536 new version 0 NA
3.710303 0.001201556 0.0001035057 0.1 0.3333333 45.56536 45.56536 45.56536 new version 1 NA
3.710303 0.001201556 0.0001035057 0.1 0.3333333 45.56536 45.56536 45.56536 new version 2 NA
1 - lower
-1.000000 0.046965036 0.1586552539 0.1 0.3333333 45.56536 45.56536 45.56536 new version 0 NA
-1.000000 0.046965036 0.1586552539 0.1 0.3333333 45.56536 45.56536 45.56536 new version 1 NA
-1.000000 0.046965036 0.1586552539 0.1 0.3333333 45.56536 45.56536 45.56536 new version 2 NA
1 - Upper
3.710303 0.001201556 NA 0.1 NA 45.56536 45.56536 45.56536 old version NA 0.1
1 - Lower
-1.000000 0.046965036 NA 0.1 NA 45.56536 45.56536 45.56536 old version NA 0.1
2 - upper
2.511427 0.273421987 0.0060483983 0.2 0.6666667 91.13072 91.13072 91.13072 new version 0 NA
2.511427 0.273421987 0.0060483983 0.2 0.6666667 91.13072 91.13072 91.13072 new version 1 NA
2.511427 0.273421987 0.0060483983 0.2 0.6666667 91.13072 91.13072 91.13072 new version 2 NA
2 - lower
0.000000 0.061921702 0.5125857748 0.2 0.6666667 91.13072 91.13072 91.13072 new version 0 NA
0.000000 0.061921702 0.5125857748 0.2 0.6666667 91.13072 91.13072 91.13072 new version 1 NA
0.000000 0.061921702 0.5125857748 0.2 0.6666667 91.13072 91.13072 91.13072 new version 2 NA
2 - Upper
2.511427 0.273421987 NA 0.2 NA 91.13072 91.13072 91.13072 old version NA 0.2
2 - Lower
0.000000 0.061921702 NA 0.2 NA 91.13072 91.13072 91.13072 old version NA 0.2
3 - upper
1.993048 0.900000000 0.0249302430 0.3 1.0000000 136.69609 136.69609 136.69609 new version 0 NA
1.993048 0.900000000 0.0249302430 0.3 1.0000000 136.69609 136.69609 136.69609 new version 1 NA
1.993048 0.900000000 0.0249302430 0.3 1.0000000 136.69609 136.69609 136.69609 new version 2 NA
3 - lower
0.000000 0.061926296 0.6063477109 0.3 1.0000000 136.69609 136.69609 136.69609 new version 0 NA
0.000000 0.061926296 0.6063477109 0.3 1.0000000 136.69609 136.69609 136.69609 new version 1 NA
0.000000 0.061926296 0.6063477109 0.3 1.0000000 136.69609 136.69609 136.69609 new version 2 NA
3 - Upper
1.993048 0.900000000 NA 0.3 NA 136.69609 136.69609 136.69609 old version NA 0.3
3 - Lower
0.000000 0.061926296 NA 0.3 NA 136.69609 136.69609 136.69609 old version NA 0.3

2.2.2 info != info0 != info1

x1_a <- gs_design_npe(
  theta = c(.1, .2, .3),
  info = (1:3) * 80, info0 = (1:3) * 90 + 10, info1 = (1:3) * 70 - 5, info_scale = 0,
  upper = gs_b, upar = gsDesign::gsDesign(k = 3, sfu = gsDesign::sfLDOF)$upper$bound,
  lower = gs_b, lpar = c(-1, 0, 0)
) %>% mutate(`Computated from` = "new version", `Info scale` = 0)
x1_b <- gs_design_npe(
  theta = c(.1, .2, .3),
  info = (1:3) * 80, info0 = (1:3) * 90 + 10, info1 = (1:3) * 70 - 5, info_scale = 1,
  upper = gs_b, upar = gsDesign::gsDesign(k = 3, sfu = gsDesign::sfLDOF)$upper$bound,
  lower = gs_b, lpar = c(-1, 0, 0)
) %>% mutate(`Computated from` = "new version", `Info scale` = 1)
x1_c <- gs_design_npe(
  theta = c(.1, .2, .3),
  info = (1:3) * 80, info0 = (1:3) * 90 + 10, info1 = (1:3) * 70 - 5, info_scale = 2,
  upper = gs_b, upar = gsDesign::gsDesign(k = 3, sfu = gsDesign::sfLDOF)$upper$bound,
  lower = gs_b, lpar = c(-1, 0, 0)
) %>% mutate(`Computated from` = "new version", `Info scale` = 2)

x2 <- gs_design_npe_(
  theta = c(.1, .2, .3),
  info = (1:3) * 80, info0 = (1:3) * 90 + 10, info1 = (1:3) * 70 - 5,
  upper = gs_b, upar = gsDesign::gsDesign(k = 3, sfu = gsDesign::sfLDOF)$upper$bound,
  lower = gs_b, lpar = c(-1, 0, 0)) %>% 
  mutate(`Computated from` = "old version") %>% 
  rename(analysis = Analysis,
         bound = Bound, z = Z, probability = Probability)
z probability probability0 theta info_frac info info0 info1 Computated from Info scale theta1
1 - upper
3.710303 0.001278699 0.0001035057 0.1 0.3571429 48.14094 48.14094 48.14094 new version 0 NA
3.710303 0.001149869 0.0001035057 0.1 0.3170732 43.79604 43.79604 43.79604 new version 1 NA
3.710303 0.004048062 0.0001035057 0.1 0.3333333 44.96523 56.20654 36.53425 new version 2 NA
1 - lower
-1.000000 0.045148157 0.1586552539 0.1 0.3571429 48.14094 48.14094 48.14094 new version 0 NA
-1.000000 0.048277869 0.1586552539 0.1 0.3170732 43.79604 43.79604 43.79604 new version 1 NA
-1.000000 0.058792818 0.1586552539 0.1 0.3333333 44.96523 56.20654 36.53425 new version 2 NA
1 - Upper
3.710303 0.004048062 NA 0.1 NA 44.96523 56.20654 36.53425 old version NA 0.1
1 - Lower
-1.000000 0.058792818 NA 0.1 NA 44.96523 56.20654 36.53425 old version NA 0.1
2 - upper
2.511427 0.274637453 0.0060442562 0.2 0.6785714 91.46778 91.46778 91.46778 new version 0 NA
2.511427 0.272791297 0.0060513253 0.2 0.6585366 90.96101 90.96101 90.96101 new version 1 NA
2.511427 0.272107963 0.0060442562 0.2 0.6666667 89.93046 106.79242 75.87883 new version 2 NA
2 - lower
0.000000 0.059626767 0.5110855741 0.2 0.6785714 91.46778 91.46778 91.46778 new version 0 NA
0.000000 0.063543969 0.5136901172 0.2 0.6585366 90.96101 90.96101 90.96101 new version 1 NA
0.000000 0.074240014 0.5110855741 0.2 0.6666667 89.93046 106.79242 75.87883 new version 2 NA
2 - Upper
2.511427 0.272107963 NA 0.2 NA 89.93046 106.79242 75.87883 old version NA 0.2
2 - Lower
0.000000 0.074240014 NA 0.2 NA 89.93046 106.79242 75.87883 old version NA 0.2
3 - upper
1.993048 0.899999988 0.0248602069 0.3 1.0000000 134.79463 134.79463 134.79463 new version 0 NA
1.993048 0.900000000 0.0249748131 0.3 1.0000000 138.12597 138.12597 138.12597 new version 1 NA
1.993048 0.899999920 0.0248602069 0.3 1.0000000 134.89569 157.37831 115.22340 new version 2 NA
3 - lower
0.000000 0.059631346 0.6032976877 0.3 1.0000000 134.79463 134.79463 134.79463 new version 0 NA
0.000000 0.063548525 0.6084787927 0.3 1.0000000 138.12597 138.12597 138.12597 new version 1 NA
0.000000 0.074245152 0.6032976877 0.3 1.0000000 134.89569 157.37831 115.22340 new version 2 NA
3 - Upper
1.993048 0.899999920 NA 0.3 NA 134.89569 157.37831 115.22340 old version NA 0.3
3 - Lower
0.000000 0.074245152 NA 0.3 NA 134.89569 157.37831 115.22340 old version NA 0.3

2.3 futility at IA1; efficacy only at IA2 +FA

x1_a <- gs_design_npe(
  theta = c(.1, .2, .3),
  info = (1:3) * 40, info0 = (1:3) * 40, info_scale = 0,
  upper = gs_spending_bound, upar = list(sf = gsDesign::sfLDOF, total_spend = 0.025, param = NULL, timing = NULL),
  lower = gs_b, lpar = c(-1, -Inf, -Inf),
  test_upper = c(FALSE, TRUE, TRUE)
) %>% mutate(`Computated from` = "new version", `Info scale` = 0)

x1_b <- gs_design_npe(
  theta = c(.1, .2, .3),
  info = (1:3) * 40, info0 = (1:3) * 40, info_scale = 1,
  upper = gs_spending_bound, upar = list(sf = gsDesign::sfLDOF, total_spend = 0.025, param = NULL, timing = NULL),
  lower = gs_b, lpar = c(-1, -Inf, -Inf),
  test_upper = c(FALSE, TRUE, TRUE)
) %>% mutate(`Computated from` = "new version", `Info scale` = 1)

x1_c <- gs_design_npe(
  theta = c(.1, .2, .3),
  info = (1:3) * 40, info0 = (1:3) * 40, info_scale = 2,
  upper = gs_spending_bound, upar = list(sf = gsDesign::sfLDOF, total_spend = 0.025, param = NULL, timing = NULL),
  lower = gs_b, lpar = c(-1, -Inf, -Inf),
  test_upper = c(FALSE, TRUE, TRUE)
) %>% mutate(`Computated from` = "new version", `Info scale` = 2)

x2 <- gs_design_npe_(
  theta = c(.1, .2, .3),
  info = (1:3) * 40, info0 = (1:3) * 40,
  upper = gs_spending_bound, upar = list(sf = gsDesign::sfLDOF, total_spend = 0.025, param = NULL, timing = NULL),
  lower = gs_b, lpar = c(-1, -Inf, -Inf),
  test_upper = c(FALSE, TRUE, TRUE)) %>% 
  mutate(`Computated from` = "old version", `Info scale` = 0) %>% 
  rename(analysis = Analysis,
         bound = Bound, z = Z, probability = Probability)
x1_a %>%
  union_all(x1_b) %>%
  union_all(x1_c) %>%
  union_all(x2) %>%
  arrange(analysis) %>%
  group_by(analysis, bound) %>%
  gt() %>%
  tab_style(
    style = list(cell_fill(color = "#d3edeb")),
    locations = cells_body(rows = `Computated from` == "old version")
  )
z probability probability0 theta info_frac info info0 info1 Computated from Info scale theta1
1 - upper
Inf 0.00000000 0.000000000 0.1 0.3333333 44.55554 44.55554 44.55554 new version 0 NA
Inf 0.00000000 0.000000000 0.1 0.3333333 44.55554 44.55554 44.55554 new version 1 NA
Inf 0.00000000 0.000000000 0.1 0.3333333 44.55554 44.55554 44.55554 new version 2 NA
1 - lower
-1.000000 0.04770758 0.158655254 0.1 0.3333333 44.55554 44.55554 44.55554 new version 0 NA
-1.000000 0.04770758 0.158655254 0.1 0.3333333 44.55554 44.55554 44.55554 new version 1 NA
-1.000000 0.04770758 0.158655254 0.1 0.3333333 44.55554 44.55554 44.55554 new version 2 NA
1 - Upper
Inf 0.00000000 NA 0.1 NA 44.55554 44.55554 44.55554 old version 0 0.1
1 - Lower
-1.000000 0.04770758 NA 0.1 NA 44.55554 44.55554 44.55554 old version 0 0.1
2 - upper
2.509315 0.26707709 0.006048281 0.2 0.6666667 89.11107 89.11107 89.11107 new version 0 NA
2.509315 0.26707709 0.006048281 0.2 0.6666667 89.11107 89.11107 89.11107 new version 1 NA
2.509315 0.26707709 0.006048281 0.2 0.6666667 89.11107 89.11107 89.11107 new version 2 NA
2 - lower
-Inf 0.04770758 0.158655254 0.2 0.6666667 89.11107 89.11107 89.11107 new version 0 NA
-Inf 0.04770758 0.158655254 0.2 0.6666667 89.11107 89.11107 89.11107 new version 1 NA
-Inf 0.04770758 0.158655254 0.2 0.6666667 89.11107 89.11107 89.11107 new version 2 NA
2 - Upper
2.509315 0.26707709 NA 0.2 NA 89.11107 89.11107 89.11107 old version 0 0.2
2 - Lower
-Inf 0.04770758 NA 0.2 NA 89.11107 89.11107 89.11107 old version 0 0.2
3 - upper
1.992888 0.90000000 0.024947293 0.3 1.0000000 133.66661 133.66661 133.66661 new version 0 NA
1.992888 0.90000000 0.024947293 0.3 1.0000000 133.66661 133.66661 133.66661 new version 1 NA
1.992888 0.90000000 0.024947293 0.3 1.0000000 133.66661 133.66661 133.66661 new version 2 NA
3 - lower
-Inf 0.04770758 0.158655254 0.3 1.0000000 133.66661 133.66661 133.66661 new version 0 NA
-Inf 0.04770758 0.158655254 0.3 1.0000000 133.66661 133.66661 133.66661 new version 1 NA
-Inf 0.04770758 0.158655254 0.3 1.0000000 133.66661 133.66661 133.66661 new version 2 NA
3 - Upper
1.992888 0.90000000 NA 0.3 NA 133.66661 133.66661 133.66661 old version 0 0.3
3 - Lower
-Inf 0.04770758 NA 0.3 NA 133.66661 133.66661 133.66661 old version 0 0.3

2.4 spending bounds

x1_a <- gs_design_npe(
  theta = c(.1, .2, .3),
  info = (1:3) * 40, info0 = (1:3) * 50, info_scale = 0,
  upper = gs_spending_bound,
  upar = list(sf = gsDesign::sfLDOF, total_spend = 0.025, param = NULL, timing = NULL),
  lower = gs_spending_bound,
  lpar = list(sf = gsDesign::sfHSD, total_spend = 0.1, param = -1, timing = NULL)
) %>% mutate(`Computated from` = "new version", `Info scale` = 0)

x1_b <- gs_design_npe(
  theta = c(.1, .2, .3),
  info = (1:3) * 40, info0 = (1:3) * 50, info_scale = 1,
  upper = gs_spending_bound,
  upar = list(sf = gsDesign::sfLDOF, total_spend = 0.025, param = NULL, timing = NULL),
  lower = gs_spending_bound,
  lpar = list(sf = gsDesign::sfHSD, total_spend = 0.1, param = -1, timing = NULL)
) %>% mutate(`Computated from` = "new version", `Info scale` = 1)

x1_c <- gs_design_npe(
  theta = c(.1, .2, .3),
  info = (1:3) * 40, info0 = (1:3) * 50, info_scale = 2,
  upper = gs_spending_bound,
  upar = list(sf = gsDesign::sfLDOF, total_spend = 0.025, param = NULL, timing = NULL),
  lower = gs_spending_bound,
  lpar = list(sf = gsDesign::sfHSD, total_spend = 0.1, param = -1, timing = NULL)
) %>% mutate(`Computated from` = "new version", `Info scale` = 2)

x2 <- gs_design_npe_(
  theta = c(.1, .2, .3),
  info = (1:3) * 40, info0 = (1:3) * 50,
  upper = gs_spending_bound,
  upar = list(sf = gsDesign::sfLDOF, total_spend = 0.025, param = NULL, timing = NULL),
  lower = gs_spending_bound,
  lpar = list(sf = gsDesign::sfHSD, total_spend = 0.1, param = -1, timing = NULL)
) %>% mutate(`Computated from` = "old version") %>% 
  rename(analysis = Analysis,
         bound = Bound, z = Z, probability = Probability)
z probability probability0 theta info_frac info info0 info1 Computated from Info scale theta1
1 - upper
3.7103029 0.001136317 0.0001035057 0.1 0.3333333 43.32605 43.32605 43.32605 new version 0 NA
3.7103029 0.001136317 0.0001035057 0.1 0.3333333 43.32605 43.32605 43.32605 new version 1 NA
3.7103029 0.003850782 0.0001035057 0.1 0.3333333 42.73434 53.41793 42.73434 new version 2 NA
1 - lower
-1.3367329 0.023023722 0.0906549246 0.1 0.3333333 43.32605 43.32605 43.32605 new version 0 NA
-1.3367329 0.023023722 0.0906549246 0.1 0.3333333 43.32605 43.32605 43.32605 new version 1 NA
-1.3412431 0.031915434 0.0899207747 0.1 0.3333333 42.73434 53.41793 42.73434 new version 2 NA
1 - Upper
3.7103029 0.003850782 NA 0.1 NA 42.73434 53.41793 42.73434 old version NA 0.1
1 - Lower
-1.3412431 0.031915434 NA 0.1 NA 42.73434 53.41793 42.73434 old version NA 0.1
2 - upper
2.5114338 0.257938878 0.0060483767 0.2 0.6666667 86.65211 86.65211 86.65211 new version 0 NA
2.5114338 0.257938878 0.0060483767 0.2 0.6666667 86.65211 86.65211 86.65211 new version 1 NA
2.5114338 0.256567802 0.0060483771 0.2 0.6666667 85.46869 106.83586 85.46869 new version 2 NA
2 - lower
0.1455293 0.055155914 0.5605209895 0.2 0.6666667 86.65211 86.65211 86.65211 new version 0 NA
0.1455293 0.055155914 0.5605209895 0.2 0.6666667 86.65211 86.65211 86.65211 new version 1 NA
0.1327725 0.064047626 0.5555411487 0.2 0.6666667 85.46869 106.83586 85.46869 new version 2 NA
2 - Upper
2.5114338 0.256567802 NA 0.2 NA 85.46869 106.83586 85.46869 old version NA 0.2
2 - Lower
0.1327725 0.064047626 NA 0.2 NA 85.46869 106.83586 85.46869 old version NA 0.2
3 - upper
1.9930511 0.900000000 0.0249444277 0.3 1.0000000 129.97816 129.97816 129.97816 new version 0 NA
1.9930511 0.900000000 0.0249444277 0.3 1.0000000 129.97816 129.97816 129.97816 new version 1 NA
1.9930511 0.900000001 0.0249474621 0.3 1.0000000 128.20303 160.25379 128.20303 new version 2 NA
3 - lower
1.9930488 0.100000000 0.9750558052 0.3 1.0000000 129.97816 129.97816 129.97816 new version 0 NA
1.9930488 0.100000000 0.9750558052 0.3 1.0000000 129.97816 129.97816 129.97816 new version 1 NA
1.9696010 0.108891712 0.9738270973 0.3 1.0000000 128.20303 160.25379 128.20303 new version 2 NA
3 - Upper
1.9930511 0.900000001 NA 0.3 NA 128.20303 160.25379 128.20303 old version NA 0.3
3 - Lower
1.9696010 0.108891712 NA 0.3 NA 128.20303 160.25379 128.20303 old version NA 0.3

2.5 2-sided symmetric spend

x1_a <- gs_design_npe(
  theta = c(.1, .2, .3),
  info = (1:3) * 40, info_scale = 0,
  binding = TRUE,
  upper = gs_spending_bound,
  upar = list(sf = gsDesign::sfLDOF, total_spend = 0.025, param = NULL, timing = NULL),
  lower = gs_spending_bound,
  lpar = list(sf = gsDesign::sfLDOF, total_spend = 0.025, param = NULL, timing = NULL)
) %>% mutate(`Computated from` = "new version", `Info scale` = 0)

x1_b <- gs_design_npe(
  theta = c(.1, .2, .3),
  info = (1:3) * 40, info_scale = 1,
  binding = TRUE,
  upper = gs_spending_bound,
  upar = list(sf = gsDesign::sfLDOF, total_spend = 0.025, param = NULL, timing = NULL),
  lower = gs_spending_bound,
  lpar = list(sf = gsDesign::sfLDOF, total_spend = 0.025, param = NULL, timing = NULL)
) %>% mutate(`Computated from` = "new version", `Info scale` = 1)

x1_c <- gs_design_npe(
  theta = c(.1, .2, .3),
  info = (1:3) * 40, info_scale = 2,
  binding = TRUE,
  upper = gs_spending_bound,
  upar = list(sf = gsDesign::sfLDOF, total_spend = 0.025, param = NULL, timing = NULL),
  lower = gs_spending_bound,
  lpar = list(sf = gsDesign::sfLDOF, total_spend = 0.025, param = NULL, timing = NULL)
) %>% mutate(`Computated from` = "new version", `Info scale` = 2)

x2 <- gs_design_npe_(
  theta = c(.1, .2, .3),
  info = (1:3) * 40,
  binding = TRUE,
  upper = gs_spending_bound,
  upar = list(sf = gsDesign::sfLDOF, total_spend = 0.025, param = NULL, timing = NULL),
  lower = gs_spending_bound,
  lpar = list(sf = gsDesign::sfLDOF, total_spend = 0.025, param = NULL, timing = NULL)
) %>% mutate(`Computated from` = "old version") %>% 
  rename(analysis = Analysis,
         bound = Bound, z = Z, probability = Probability)
z probability probability0 theta info_frac info info0 info1 Computated from Info scale theta1
1 - upper
3.7103029 0.0010356481 0.0001035057 0.1 0.3333333 39.75157 39.75157 39.75157 new version 0 NA
3.7103029 0.0010356481 0.0001035057 0.1 0.3333333 39.75157 39.75157 39.75157 new version 1 NA
3.7103029 0.0010356481 0.0001035057 0.1 0.3333333 39.75157 39.75157 39.75157 new version 2 NA
1 - lower
-3.0798144 0.0001035057 0.0010356481 0.1 0.3333333 39.75157 39.75157 39.75157 new version 0 NA
-3.0798144 0.0001035057 0.0010356481 0.1 0.3333333 39.75157 39.75157 39.75157 new version 1 NA
-3.0798144 0.0001035057 0.0010356481 0.1 0.3333333 39.75157 39.75157 39.75157 new version 2 NA
1 - Upper
3.7103029 0.0010356481 NA 0.1 NA 39.75157 39.75157 39.75157 old version NA 0.1
1 - Lower
-3.0798144 0.0001035057 NA 0.1 NA 39.75157 39.75157 39.75157 old version NA 0.1
2 - upper
2.5114338 0.2332751723 0.0060483891 0.2 0.6666667 79.50314 79.50314 79.50314 new version 0 NA
2.5114338 0.2332751723 0.0060483891 0.2 0.6666667 79.50314 79.50314 79.50314 new version 1 NA
2.5114338 0.2332751723 0.0060483891 0.2 0.6666667 79.50314 79.50314 79.50314 new version 2 NA
2 - lower
-0.7281431 0.0060483891 0.2332751723 0.2 0.6666667 79.50314 79.50314 79.50314 new version 0 NA
-0.7281431 0.0060483891 0.2332751723 0.2 0.6666667 79.50314 79.50314 79.50314 new version 1 NA
-0.7281431 0.0060483891 0.2332751723 0.2 0.6666667 79.50314 79.50314 79.50314 new version 2 NA
2 - Upper
2.5114338 0.2332751723 NA 0.2 NA 79.50314 79.50314 79.50314 old version NA 0.2
2 - Lower
-0.7281431 0.0060483891 NA 0.2 NA 79.50314 79.50314 79.50314 old version NA 0.2
3 - upper
1.9930482 0.8999999998 0.0250000000 0.3 1.0000000 119.25471 119.25471 119.25471 new version 0 NA
1.9930482 0.8999999998 0.0250000000 0.3 1.0000000 119.25471 119.25471 119.25471 new version 1 NA
1.9930482 0.8999999998 0.0250000000 0.3 1.0000000 119.25471 119.25471 119.25471 new version 2 NA
3 - lower
1.2830660 0.0250000000 0.8999999998 0.3 1.0000000 119.25471 119.25471 119.25471 new version 0 NA
1.2830660 0.0250000000 0.8999999998 0.3 1.0000000 119.25471 119.25471 119.25471 new version 1 NA
1.2830660 0.0250000000 0.8999999998 0.3 1.0000000 119.25471 119.25471 119.25471 new version 2 NA
3 - Upper
1.9930482 0.8999999998 NA 0.3 NA 119.25471 119.25471 119.25471 old version NA 0.3
3 - Lower
1.2830660 0.0250000000 NA 0.3 NA 119.25471 119.25471 119.25471 old version NA 0.3