Author: Lukas Baumann
Date: 2024-04-09

# Reproduce Results From Fujikawa et al. (2020)

#### Lukas Baumann

#### 2024-04-09

In this vignette it is shown how the results from Fujikawa et al. (2020) can be reproduced using `baskexact`. At first, we have to set up a a design object, using either `setupOneStageBasket()` for a single-stage design or `setupTwoStageBasket()`for a two-stage design with one interim analysis.

    library(baskexact)
    design1 <- setupOneStageBasket(k = 3, shape1 = 1, shape2 = 1, p0 = 0.2)

To get the results shown in Figure 1, `basket_test()` can be used, which computes posterior probabilities for a given results-vector and also shows the pairwise weights and the parameters of the Beta posterior distribution.

    basket_test(design1, n = 15, r = c(1, 5, 7), lambda = 0.99,
      weight_fun = weights_fujikawa, weight_params = list(epsilon = 2, tau = 0.5,
        logbase = exp(1)))

    # $weights
    #          Basket 1  Basket 2  Basket 3
    # Basket 1        1 0.0000000 0.0000000
    # Basket 2        0 1.0000000 0.7832585
    # Basket 3        0 0.7832585 1.0000000
    #
    # $post_dist_noborrow
    #        Basket 1 Basket 2 Basket 3
    # shape1        2        6        8
    # shape2       15       11        9
    #
    # $post_dist_borrow
    #        Basket 1 Basket 2 Basket 3
    # shape1        2 12.26607 12.69955
    # shape2       15 18.04933 17.61584
    #
    # $post_prob_noborrow
    #  Basket 1  Basket 2  Basket 3
    # 0.1407375 0.9183121 0.9929964
    #
    # $post_prob_borrow
    #  Basket 1  Basket 2  Basket 3
    # 0.1407375 0.9942795 0.9965258

Note that at the moment it’s not possible to reproduce the results from Table 1, as `baskexact` currently doesn’t support baskets with unequal sample sizes.

To reproduce the results from Table 2 we can use `toer()` and `pow()`. First, the results from the single-stage design with two different choices of tuning parameter values. Fujikawa et al.’s “Proposed design (i)” uses \(\varepsilon = 2\) and \(\tau = 0\), “Proposed design (ii)” uses \(\varepsilon = 2\) and \(\tau = 0.5\).

Note that the default value for the logbase parameter is 2, such that the weights are always bounded between 0 and 1, but Fujikawa et al. use the natural logarithm, which leads to a lower limit for the weights that is strictly greater than 0.

    ## p = (0.2, 0.2, 0.2)
    # Proposed design (i)
    toer(
      design = design1, n = 24, lambda = 0.99,
      weight_fun = weights_fujikawa, weight_params = list(epsilon = 2, tau = 0,
      logbase = exp(1)), results = "group"
    )

    # $rejection_probabilities
    # [1] 0.02158174 0.02158174 0.02158174
    #
    # $fwer
    # [1] 0.03600149

    # Proposed design (ii)
    toer(
      design = design1, n = 24, lambda = 0.99,
      weight_fun = weights_fujikawa, weight_params = list(epsilon = 2, tau = 0.5,
      logbase = exp(1)), results = "group"
    )

    # $rejection_probabilities
    # [1] 0.03239555 0.03239555 0.03239555
    #
    # $fwer
    # [1] 0.06315308

For the results from the two-stage design, we have to set up a different design object at first:

    design2 <- setupTwoStageBasket(k = 3, shape1 = 1, shape2 = 1, p0 = 0.2)

Fujikawa et al. use an interim analysis that allows stopping of individual baskets based on the posterior predictive probability.

    ## p = (0.2, 0.2, 0.2)
    # Proposed design (i)
    toer(
      design = design2, n = 24, n1 = 15, lambda = 0.99,
      interim_fun = interim_postpred, interim_params = list(prob_futstop = 0.1,
        prob_effstop = 0.9), weight_fun = weights_fujikawa,
      weight_params = list(logbase = exp(1), tau = 0, epsilon = 2),
      results = "group"
    )

    # $rejection_probabilities
    # [1] 0.01703198 0.01703198 0.01703198
    #
    # $fwer
    # [1] 0.03722851

    ess(
      design = design2, n = 24, n1 = 15, lambda = 0.99,
      interim_fun = interim_postpred, interim_params = list(prob_futstop = 0.1,
        prob_effstop = 0.9), weight_fun = weights_fujikawa,
      weight_params = list(logbase = exp(1), tau = 0, epsilon = 2)
    )

    # [1] 16.06847 16.06847 16.06847

    # Proposed design (ii)
    toer(
      design = design2, n = 24, n1 = 15, lambda = 0.99,
      interim_fun = interim_postpred, interim_params = list(prob_futstop = 0.1,
        prob_effstop = 0.9), weight_fun = weights_fujikawa,
      weight_params = list(logbase = exp(1), tau = 0.5, epsilon = 2),
      results = "group"
    )

    # $rejection_probabilities
    # [1] 0.02175429 0.02175429 0.02175429
    #
    # $fwer
    # [1] 0.04955128

    ess(
      design = design2, n = 24, n1 = 15, lambda = 0.99,
      interim_fun = interim_postpred, interim_params = list(prob_futstop = 0.1,
        prob_effstop = 0.9), weight_fun = weights_fujikawa,
      weight_params = list(logbase = exp(1), tau = 0.5, epsilon = 2)
    )

    # [1] 16.22526 16.22526 16.22526

To reproduce the rest of Table 2, `p1` has to be changed accordingly. Note that the results are slightly different, as Fujikawa et al.’s results are based on simulation with \(n_{\text{sim}} = 5000\). `baskexact` calculates the results analytically.

## References

Fujikawa, K., Teramukai, S., Yokota, I., & Daimon, T. (2020). A Bayesian basket trial design that borrows information across strata based on the similarity between the posterior distributions of the response probability. Biometrical Journal, 62(2), 330-338.