剂量选择设计
创新药首次人体试验(FIH)的剂量选择的设计常见的有算法设计(如3+3设计),模型辅助设计(如BOIN设计)。
3+3设计案例:
480ug入组3例受试者未观察到DLT;随后剂量递增到600ug剂量组,入组3例受试者,发生1例DLT,再入组3例受试者,又发生1例DLT。由此确定MTD为480ug。进入剂量扩展阶段,入组30例受试者;而最终480ug剂量组的70%的受试者因剂量调整至240ug剂量组。
该案例中未能准确判断MTD,导致大量受试者暴露在过高的药物剂量下。
120ug | 240ug | 480ug(MTD) | 600ug | |
---|---|---|---|---|
剂量递增: N = | 3 | 3 | 3 | 6 |
DLT: N= | 0 | 0 | 0 | 2 |
剂量扩展: N = | 30 | |||
延长给药实际剂量 | 70% 240ug | |||
BOIN(Bayesian Optimal Interval)设计:
找出“最优”区间(\(\lambda\)e和\(\lambda\)d)的设置以最小化受试者被分配到不恰当剂量上的概率为目标,那么这一组阀值让我们做出错误决策(应提升剂量时实际却维持或降低剂量;应维持剂量时实际却升高或降低剂量;应降低剂量时实际却维持或升高了剂量)的概率最小,即“最优”。
贝叶斯框架下,利用无信息先验概率,得到最优区间的表达式只与目标毒性概率\(\phi\)有关,而\(\phi\)由申办方,研究者等根据药物特点在方案中指定,统计师据此计算出边界值\(\lambda\)e和\(\lambda\)d,研究者根据当前剂量组的剂量限制毒性(DLT)发生率(DLT发生率=当前剂量水平发生DLT的受试者数/当前剂量水平的可评估受试者数)决定下一个剂量水平。
Boundaries | 0.15 | 0.2 | 0.25 | 0.3 | 0.35 | 0.4 |
---|---|---|---|---|---|---|
\(\lambda\)e | 0.118 | 0.157 | 0.197 | 0.236 | 0.276 | 0.316 |
\(\lambda\)d | 0.179 | 0.238 | 0.298 | 0.359 | 0.419 | 0.480 |
BOIN设计小程序:https://trialdesign.org/one-page-shell.html#BOIN
BOIN设计R package:library(BOIN)
library(BOIN)
#######################################
# 剂量BOIN设计剂量升降决策表
# get.boundary()
#######################################
<- get.boundary(target = 0.3,
bound ncohort = 12,
cohortsize = 3
)
summary(bound)
plot(bound)
#######################################
# 模拟BOIN设计的统计性能
# get.oc()
#######################################
# remove(list=ls())
#----------- 1. initialization ---------------
<- 0.3
target <- 12
ncohort <- 3
cohortsize <- 9
n.earlystop #
<- matrix(0, 6, 6)
p.true # dose 100 300 800 1200 1600
1,] <- c(0.30, 0.44, 0.50, 0.55, 0.60, 0.65)
p.true[2,] <- c(0.15, 0.30, 0.45, 0.51, 0.58, 0.64)
p.true[3,] <- c(0.04, 0.12, 0.30, 0.47, 0.53, 0.59)
p.true[4,] <- c(0.02, 0.08, 0.14, 0.30, 0.48, 0.61)
p.true[5,] <- c(0.03, 0.07, 0.11, 0.15, 0.30, 0.47)
p.true[6,] <- c(0.06, 0.08, 0.11, 0.13, 0.16, 0.30)
p.true[#
#----------- 2. compute oc ----------------
<- list()
select_percent <- list()
patient_percent <- list()
samplesize <- list()
toxic_percent #
for( k in 1:6){
# k <- 1
<- get.oc(target = target, p.true=p.true[k,], ncohort=ncohort, cohortsize=cohortsize, n.earlystop = n.earlystop,
oc_single startdose = 1, titration = TRUE, p.saf = 0.6 * target, p.tox = 1.4 * target, cutoff.eli = 0.95, extrasafe = FALSE, offset = 0.05,
boundMTD = FALSE, ntrial = 1000, seed = 123456)
<- oc_single$selpercent
select_percent[[k]] <- signif(100 * oc_single$npatients / sum(oc_single$npatients), 3)
patient_percent[[k]] <- oc_single$totaln
samplesize[[k]] <- oc_single$percentstop
toxic_percent[[k]]
}
select_percent
patient_percent
samplesize
toxic_percent
<- unlist( select_percent )
temp <- matrix(temp, nrow=6, ncol=6, byrow=T)
temp.mat write.csv(temp.mat , "temp.csv")
<- unlist( patient_percent )
temp <- matrix(temp, nrow=6, ncol=6, byrow=T)
temp.mat write.csv(temp.mat , "temp.csv")