R 贝叶斯自适应随机化:如何计算参与治疗组的平均人数

R 贝叶斯自适应随机化:如何计算参与治疗组的平均人数,r,model,mean,bayesian,trial,R,Model,Mean,Bayesian,Trial,这就是我正在处理的问题。这是一个贝叶斯自适应随机化设计。符合条件的患者被随机分为标准治疗组或新的靶向药物组。试验的主要终点是4周的临床反应状态。设计一个二期试验,假设有两个手臂: 第1组:患者接受标准化疗,已知有效率p1=0.2(后验成功概率=θ) 第二组:患者接受新的新辅助化疗,该方案的应答率p2=0.4(后验成功概率=thetaB)为两倍 前40名患者被同样随机分配到新的治疗组(20+20),之后,他们根据成功的后验概率自适应随机分配 为了使可能性支配后验分布,对p1和p2采用非信息分布(最

这就是我正在处理的问题。这是一个贝叶斯自适应随机化设计。符合条件的患者被随机分为标准治疗组或新的靶向药物组。试验的主要终点是4周的临床反应状态。设计一个二期试验,假设有两个手臂:

第1组:患者接受标准化疗,已知有效率p1=0.2(后验成功概率=θ)

第二组:患者接受新的新辅助化疗,该方案的应答率p2=0.4(后验成功概率=thetaB)为两倍

前40名患者被同样随机分配到新的治疗组(20+20),之后,他们根据成功的后验概率自适应随机分配

为了使可能性支配后验分布,对p1和p2采用非信息分布(最简单的情况是对同一患者测试两种治疗,因此这意味着考虑成功/失败概率的先验分布等于0.5+0.5=1)。我被要求进行100次模拟,假设参数c为optim,计算Nmax=100(最大患者数)的随机化概率,并最终确定:

the mean number of patients enrolled in ARM 1 and ARM 2
我还假设0.01和0.98分别为因无效和有效而提前停止治疗的阈值,如果所有100名患者都进行了评估,则0.9为宣布疗效的阈值

因此,我为模拟提供的代码如下所示(设置参数,正如您在“设置参数”一点上看到的那样)

这似乎是错误的。你认为我怎样才能纠正这个错误。如果我没有在代码中输入所有100名患者的评估值(0.90),您认为这可能取决于声明疗效的阈值吗?任何人都可能知道如何建立一个适当的指挥,如果这是差距的话

谢谢

AR = function(priorA, priorB, c=1){
  posteriorA = rbeta(10000, priorA[1], priorA[2])
  posteriorB = rbeta(10000, priorB[1], priorB[2])
  pab = posteriorA-posteriorB
  
  pA.less.B = length(pab[pab<0])/length(pab)
  pA.great.B = length(pab[pab>0])/length(pab)
  pB.great.A = length(pab[pab<0])/length(pab)
  
  rb = (pA.less.B^c)/(pA.less.B^c + pA.great.B^c)
  ra = 1- rb
  ar=list(ra=ra, rb=rb, pA.less.B=pA.less.B, 
          pA.great.B = pA.great.B, pB.great.A = pB.great.A)
  ar
}

update.prior = function(priorA, patientA, priorB, patientB){
  priorA=priorA+patientA
  priorB=priorB+patientB
  prior=list(priorA=priorA, priorB=priorB)
  prior
  
}

#SET PARAMETERS
set.seed(123)
thetaA = 0.2
thetaB = 0.4
priorA = c(0.5,0.5) 
priorB = c(0.5,0.5) 
inits = 20
c = 'optim'
futility = 0.01
efficacy = 0.98
nsims = 100
Nmax = 100

Na=NULL
Nb=NULL
result = NULL
Rb = NULL


for(j in 1:nsims){
  Nmax=Nmax
  # yA = rbinom(n=Nmax, size=1, prob=0.25)
  # yB = rbinom(n=Nmax, size=1, prob=0.25)
  
  priorA = c(0.5,0.5) 
  priorB = c(0.5,0.5) 
  treatment=NULL
  posterior=NULL
  success = NULL
  
  for (k in 1:inits){
    patientA = rbinom(1, size=1, prob=thetaA)
    patientB = rbinom(1, size=1, prob=thetaB)
    prior=update.prior(priorA, c(patientA,1-patientA), priorB, c(patientB,1-patientB))
    priorA=prior$priorA
    priorB=prior$priorB
    success=c(success,patientA,patientB)
  }
  
  A=inits
  B=inits
  treatment[1:(A+B)]=rep(c('A','B'), inits)
  
  if(c=='optim'){
    c=(A+B)/(2*Nmax)}else{c=c}
  ar= AR(priorA, priorB, c=c)
  
  #check for futility
  if (ar$pA.less.B<=futility) {print('stop for futility') 
    
    result[j] = 'stop for futility'
    Rb[j] = 'stop for futility'}
  
  #check for efficacy
  if (ar$pA.less.B>=efficacy) {print('stop for efficacy')
    result[j] = 'stop for efficacy'
    Rb[j] = 'stop for efficacy'}
  
  ra=ar$ra
  rb=ar$rb
  result[j] = ar$pA.less.B
  Rb[j] = ar$rb
  
  i=A+B
  while ((A+B)<Nmax & ar$pA.less.B<efficacy & ar$pA.less.B>futility ){
    i=i+1
    randomize = sample(c('A','B'), 1, prob = c(ra, rb))
    if (randomize=='A'){
      A=A+1
      patientA = rbinom(1, size=1, prob=thetaA)
      success[i] = patientA
      patientA = c(patientA, 1- patientA)
      patientB = c(0,0)
      treatment[i]='A'
      # success[i]=yA[A]
    }
    
    if (randomize=='B'){
      B=B+1
      patientB = rbinom(1, size=1, prob=thetaB)
      success[i] = patientB
      patientB = c(patientB, 1-patientB)
      patientA = c(0,0)
      treatment[i]='B'
    }
    
    if(c=='optim'){
      c=(A+B)/(2*Nmax)}else{c=c}
    prior=update.prior(priorA, patientA, priorB, patientB)
    priorA=prior$priorA
    priorB=prior$priorB
    ar=AR(priorA, priorB, c=c)
    #print(ar)
    ra=ar$ra
    rb=ar$rb
    Rb[j]=ar$rb
    posterior[i]=ar$pA.less.B
    result[j] = posterior[i]
    
  }
  Na[j]=A
  Nb[j]=B
}
> mean(Na[1:j])
[1] 30.4

> mean(Nb[1:j])
[1] 34.89