Learn R Programming

BayesianHybridDesign (version 0.1.0)

SAM_weight: Calculating Mixture Weight of SAM Priors

Description

This function is exactly from the SAMprior R package version 1.1.1. It is included to support the runSAM function in this package.

Usage

SAM_weight(if.prior, theta.h, method.w, prior.odds, data, delta, ...)

# S3 method for betaMix SAM_weight(if.prior, theta.h, method.w, prior.odds, data, delta, n, r, ...)

# S3 method for normMix SAM_weight( if.prior, theta.h, method.w, prior.odds, data, delta, m, n, sigma, ... )

# S3 method for gammaMix SAM_weight(if.prior, theta.h, method.w, prior.odds, data, delta, u, w, ...)

Value

The mixture weight of the SAM priors.

Arguments

if.prior

Informative prior constructed based on historical data, represented (approximately) as a mixture of conjugate distributions.

theta.h

Estimate of the treatment effect based on historical data. If missing, the default value is set to be the posterior mean estimate from if.prior.

method.w

Methods used to determine the mixture weight for SAM priors. The default method is "LRT" (Likelihood Ratio Test), the alternative option is "PPR" (Posterior Probability Ratio). See Details section for more information.

prior.odds

The prior probability of \(H_0\) being true compared to the prior probability of \(H_1\) being true using PPR method. The default value is 1. See Details section for more information.

data

Data of the control arm from the current trial, see Methods section for more details.

delta

Clinically significant difference used for the SAM prior.

...

Additional parameters required for different endpoints.

n

Number of subjects in the control arm for continuous endpoint.

r

Number of responses in the control arm for binary endpoint.

m

Mean estimate in the control arm for continuous endpoint.

sigma

Standard deviation in the control arm for continuous endpoint.

u

Number of events in the control arm for time-to-event endpoint.

w

Total observed time in the control arm for time-to-event endpoint.

Methods (by class)

  • SAM_weight(betaMix): The function calculates the mixture weight of SAM priors for beta mixture distribution. The input data can be patient-level data (i.e., a vector of 0 and 1 representing the response status of each patient) or summary statistics (i.e., the number of patients and the number of responses).

  • SAM_weight(normMix): The function calculates the mixture weight of SAM priors for normal mixture distribution. The input data should be a vector of patient-level observations. The input data can be patient-level data (i.e., a vector of continuous response of each patient) or summary statistics (i.e., the mean estimate, number of subjects, and the standard deviation in the control arm).

  • SAM_weight(gammaMix): The function calculates the mixture weight of SAM priors for gamma mixture distribution. The input data can be patient-level data (i.e., a matrix with the first row as the censoring indicator and the second row recording the observed time) or summary statistics (i.e., the number of uncensored observations u and total observed time w).

Details

The SAM_weight function is designed to calculate the mixture weight of the SAM priors according to the degree of prior-data conflicts (Yang, et al., 2023).

SAM prior is constructed by mixing an informative prior \(\pi_1(\theta)\), constructed based on historical data, with a non-informative prior \(\pi_0(\theta)\) using the mixture weight \(w\) determined by SAM_weight function to achieve the degree of prior-data conflict (Schmidli et al., 2015, Yang et al., 2023).

Let \(\theta\) and \(\theta_h\) denote the treatment effects associated with the current arm data \(D\) and historical data \(D_h\), respectively. Let \(\delta\) denote the clinically significant difference such that if \(|\theta_h - \theta| \ge \delta\), then \(\theta_h\) is regarded as clinically distinct from \(\theta\), and it is therefore inappropriate to borrow any information from \(D_h\). Consider two hypotheses:

$$H_0: \theta = \theta_h, ~ H_1: \theta = \theta_h + \delta ~ or ~ \theta = \theta_h - \delta.$$ \(H_0\) represents that \(D_h\) and \(D\) are consistent (i.e., no prior-data conflict) and thus information borrowing is desirable, whereas \(H_1\) represents that the treatment effect of \(D\) differs from \(D_h\) to such a degree that no information should be borrowed.

The SAM prior uses the likelihood ratio test (LRT) statistics \(R\) to quantify the degree of prior-data conflict and determine the extent of information borrowing.

$$R = P(D | H_0, \theta_h) / P(D | H_1, \theta_h) = P(D | \theta = \theta_h) / \max(P(D | \theta = \theta_h + \delta), P(D | \theta = \theta_h - \delta)) ,$$ where \(P(D | \cdot)\) denotes the likelihood function. An alternative Bayesian choice is the posterior probability ratio (PPR):

$$R = P(D | H_0, \theta_h) / P(D | H_1, \theta_h) = P(H_0) / P( H_1) \times BF, $$ where \(P(H_0)\) and \(P(H_1)\) is the prior probabilities of \(H_0\) and \(H_1\) being true. \(BF\) is the Bayes Factor that in this case is the same as the LRT.

The SAM prior, denoted as \(\pi_{sam}(\theta)\), is then defined as a mixture of an informative prior \(\pi_1(\theta)\), constructed based on \(D_h\) and a non-informative prior \(\pi_0(\theta)\):

$$\pi_{sam}(\theta) = w\pi_1(\theta) + (1-w)\pi_0(\theta),$$ where the mixture weight \(w\) is calculated as:

$$w = R / (1 + R).$$

As the level of prior-data conflict increases, the likelihood ratio \(R\) decreases, resulting in a decrease in the weight \(w\) assigned to the informative prior and thus a decrease in information borrowing. As a result, \(\pi_{sam}(\theta)\) is data-driven and has the ability to self-adapt the information borrowing based on the degree of prior-data conflict.

References

Yang P, Zhao Y, Nie L, Vallejo J, Yuan Y. SAM: Self-adapting mixture prior to dynamically borrow information from historical data in clinical trials. Biometrics 2023; 00, 1–12. https://doi.org/10.1111/biom.13927

Examples

Run this code
# \donttest{
set.seed(123)
## Examples for binary endpoints
## Example 1: no prior-data conflict
## Suppose that the informative prior is beta(40, 60)
prior.historical <- RBesT::mixbeta(c(1, 40, 60))
## Data of control arm
data.control     <- stats::rbinom(60, size = 1, prob = 0.42)
## Calculate the mixture weight of the SAM prior
wSAM <- SAM_weight(if.prior = prior.historical,
                   delta = 0.15,      ## Clinically significant difference
                   data = data.control  ## Control arm data
                   )
print(wSAM)

## Example 2: with prior-data conflict (12 responses in 60 patients)
wSAM <- SAM_weight(if.prior = prior.historical,
                   delta = 0.15,
                   method.w = 'PPR',
                   prior.odds = 1/9,
                   n = 60,
                   r = 12
                   )
print(wSAM)

## Examples for continuous endpoints
## Example 1: no prior-data conflict
## Suppose the informative prior is N(0, 3)
sigma      <- 3
prior.mean <- 0
prior.se   <- sigma/sqrt(100)
prior.historical <- RBesT::mixnorm(c(1, prior.mean, prior.se), sigma = sigma)
## Data of the control arm
data.control <- stats::rnorm(80, mean = 0, sd = sigma)
wSAM <- SAM_weight(if.prior = prior.historical,
                   delta = 0.3 * sigma,
                   data = data.control
                   )
print(wSAM)
# }

Run the code above in your browser using DataLab