• Tidak ada hasil yang ditemukan

Bayesian Estimation of Two-Part Joint Models for a Longitudinal Semicontinuous Biomarker and a Terminal Event with R-INLA: Interests for Cancer Clinical Trial Evaluation

N/A
N/A
Protected

Academic year: 2024

Membagikan "Bayesian Estimation of Two-Part Joint Models for a Longitudinal Semicontinuous Biomarker and a Terminal Event with R-INLA: Interests for Cancer Clinical Trial Evaluation"

Copied!
8
0
0

Teks penuh

(1)

Bayesian Estimation of Two-Part Joint Models for a Longitudinal Semicontinuous Biomarker and a Terminal Event with R-INLA:

Interests for Cancer Clinical Trial Evaluation

Item Type Article

Authors Rustand, Denis;Niekerk, Janet van;Rue, Haavard;Tournigand, Christophe;Rondeau, Virginie;Briollais, Laurent

Citation Rustand, D., van Niekerk, J., Rue, H., Tournigand, C., Rondeau, V., & Briollais, L. (2023). Bayesian estimation of two-part joint models for a longitudinal semicontinuous biomarker and a terminal event with INLA: Interests for cancer clinical trial evaluation. Biometrical Journal, 2100322. Portico. https://

doi.org/10.1002/bimj.202100322 Eprint version Post-print

DOI 10.1002/bimj.202100322

Publisher arXiv

Journal Accepted by Biometrical Journal

Rights Archived with thanks to Biometrical Journal Download date 2023-12-01 07:47:51

Link to Item http://hdl.handle.net/10754/665796

(2)

Supplementary Materials for “Bayesian estimation of two-part joint models for a longitudinal semicontinuous biomarker and a terminal event with INLA: Interests for cancer clinical trial evaluation”

Denis Rustand

∗,1,2

, Janet van Niekerk

2

, H˚avard Rue

2

, Christophe Tournigand

3

, Virginie Rondeau

1

, and Laurent Briollais

4

1

Biostatistic Team, Bordeaux Population Health Center, ISPED, Centre INSERM U1219, Bordeaux, France

2

Statistics Program, Computer, Electrical and Mathematical Sciences and Engineering Division,

King Abdullah University of Science and Technology (KAUST), Thuwal 23955-6900, Kingdom of Saudi Arabia

3

Hopital Henri Mondor, Creteil, France

4

Lunenfeld-Tanenbaum Research Institute, Mount Sinai Hospital, Dalla Lana School of Public Health (Biostatistics), University of Toronto, 600 University Ave., Ontario M5G 1X5, Canada

Table S1: Simulations with two correlated random effects

Approach True value INLA frailtypack

Est.(SD) [CP] Est. (SD) [CP]

Binary part(SLD>0 versus SLD=0)

intercept α0= 4 4.02 (0.36) [92%] 4.03 (0.38) [95%]

time (year) α1=−0.5 -0.51 (0.12) [95%] -0.51 (0.12) [95%]

treatment (B/A) α2=−0.5 -0.50 (0.46) [95%] -0.50 (0.46) [95%]

time:treatment (B/A) α3= 0.5 0.51 (0.18) [94%] 0.51 (0.18) [94%]

Continuous part(E[log(Yij)|Yij>0])

intercept β0= 2 2.00 (0.05) [95%] 2.00 (0.06) [92%]

time (years) β1=−0.3 -0.30 (0.01) [95%] -0.30 (0.01) [94%]

treatment (B/A) β2=−0.3 -0.30 (0.08) [94%] -0.30 (0.09) [91%]

time:treatment (B/A) β3= 0.3 0.30 (0.02) [95%] 0.30 (0.02) [94%]

residual S.E. σε= 0.3 0.30 (0.01) [94%] 0.30 (0.01) [95%]

Death risk

treatment (B/A) γ= 0.2 0.19 (0.28) [95%] 0.22 (0.36) [96%]

Association

intercept (binary part) φa= 1 0.99 (0.13) [99%] 1.06 (0.89) [94%]

intercept (continuous part) φb0= 1 1.07 (0.15) [98%] 1.40 (1.28) [92%]

Random effects’s standard deviation

intercept (binary part) σa= 1 0.93 (0.19) [92%] 0.96 (0.21) [94%]

intercept (continuous part) σb0= 0.5 0.51 (0.03) [96%] 0.50 (0.03) [87%]

ρab= 0.5 0.47 (0.11) [94%] 0.49 (0.16) [93%]

Computation time

80 CPUs (Intel Xeon Gold 6248 2.50GHz) 6 sec. (1) 74 sec. (29)

% of estimated models 100% 91%

Posterior mean,Standard deviation of the posterior mean,Coverage probability

Corresponding author e-mail:[email protected]

(3)

2 Denis Rustand et al.: Supplementary Materials for “Bayesian Estimation of Two-Part Joint Models with INLA”

Table S2: Simulations with three correlated random effects

Approach True value INLA frailtypack

Est.(SD) [CP] Est. (SD) [CP]

Binary part(SLD>0 versus SLD=0)

intercept α0= 4 4.00 (0.36) [93%] 4.02 (0.41) [93%]

time (year) α1=−0.5 -0.51 (0.12) [94%] -0.51 (0.13) [95%]

treatment (B/A) α2=−0.5 -0.51 (0.48) [95%] -0.50 (0.51) [93%]

time:treatment (B/A) α3= 0.5 0.51 (0.18) [95%] 0.51 (0.18) [95%]

Continuous part(E[log(Yij)|Yij>0])

intercept β0= 2 2.00 (0.06) [95%] 1.99 (0.08) [85%]

time (years) β1=−0.3 -0.30 (0.06) [94%] -0.25 (0.12) [44%]

treatment (B/A) β2=−0.3 -0.30 (0.08) [95%] -0.29 (0.10) [88%]

time:treatment (B/A) β3= 0.3 0.30 (0.08) [95%] 0.29 (0.15) [47%]

residual S.E. σε= 0.3 0.30 (0.01) [93%] 0.30 (0.01) [95%]

Death risk

treatment (B/A) γ= 0.2 0.19 (0.30) [94%] 0.25 (0.53) [82%]

Association

intercept (binary part) φa= 1 0.98 (0.12) [99%] 0.89 (1.86) [89%]

intercept (continuous part) φb0= 1 1.10 (0.14) [98%] 1.09 (1.82) [89%]

slope (continuous part) φb1= 1 1.07 (0.14) [98%] 1.46 (1.81) [89%]

Random effects’s standard deviation

intercept (binary part) σa= 1 0.93 (0.15) [95%] 1.12 (0.29) [91%]

intercept (continuous part) σb0= 0.5 0.50 (0.03) [95%] 0.50 (0.04) [85%]

slope (continuous part) σb1= 0.5 0.50 (0.03) [94%] 0.58 (0.11) [22%]

ρab0= 0.5 0.45 (0.10) [94%] 0.49 (0.16) [87%]

ρab1= 0.5 0.44 (0.13) [93%] 0.57 (0.15) [73%]

ρb0b1=−0.2 -0.19 (0.10) [93%] -0.11 (0.19) [23%]

Computation time

80 CPUs (Intel Xeon Gold 6248 2.50GHz) 6 sec. (1) 181 sec. (57)

% of estimated models 100% 81%

Posterior mean,Standard deviation of the posterior mean,Coverage probability

Table S3: Simulations with n = 500

Approach INLA frailtypack

Est.(SD) [CP] Est. (SD) [CP]

Binary part(SLD>0 versus SLD=0)

intercept α0= 4 3.99 (0.23) [92%] 3.95 (0.25) [92%]

time (year) α1=−0.5 -0.51 (0.07) [95%] -0.51 (0.08) [95%]

treatment (B/A) α2=−0.5 -0.51 (0.29) [95%] -0.51 (0.31) [93%]

time:treatment (B/A) α3= 0.5 0.51 (0.11) [95%] 0.50 (0.11) [95%]

Continuous part(E[log(Yij)|Yij>0])

intercept β0= 2 2.00 (0.03) [95%] 1.99 (0.04) [87%]

time (years) β1=−0.3 -0.30 (0.04) [92%] -0.30 (0.08) [45%]

treatment (B/A) β2=−0.3 -0.30 (0.05) [96%] -0.30 (0.06) [89%]

time:treatment (B/A) β3= 0.3 0.30 (0.05) [95%] 0.29 (0.10) [46%]

residual S.E. σε= 0.3 0.30 (0.00) [94%] 0.30 (0.00) [95%]

Death risk

treatment (B/A) γ= 0.2 0.19 (0.18) [94%] 0.19 (0.28) [80%]

Association

intercept (binary part) φa= 1 0.91 (0.17) [96%] 0.99 (1.02) [92%]

intercept (continuous part) φb0= 1 1.12 (0.18) [94%] 1.06 (0.96) [89%]

slope (continuous part) φb1= 1 1.09 (0.15) [97%] 1.08 (1.00) [89%]

Random effects’s standard deviation

intercept (binary part) σa= 1 0.96 (0.11) [93%] 1.01 (0.14) [92%]

intercept (continuous part) σb0= 0.5 0.50 (0.02) [95%] 0.50 (0.02) [86%]

slope (continuous part) σb1= 0.5 0.50 (0.02) [95%] 0.53 (0.06) [29%]

ρab0= 0.5 0.47 (0.08) [94%] 0.51 (0.11) [83%]

ρab1= 0.5 0.47 (0.08) [94%] 0.54 (0.11) [77%]

ρb0b1=−0.2 -0.20 (0.06) [94%] -0.16 (0.14) [30%]

Computation time

80 CPUs (Intel Xeon Gold 6248 2.50GHz) 11 sec. (1) 340 sec. (89)

% of estimated models 100% 96%

Posterior mean,Standard deviation of the posterior mean,Coverage probability

(4)

Table S4: Simulations with splines (4 correlated random effects, 200 individuals)

Approach INLA frailtypack

Est.(SD) [CP] Est. (SD) [CP]

Binary part(SLD>0 versus SLD=0)

intercept α0= 4 4.08 (0.41) [94%] 4.12 (0.43) [96%]

time (year) α1=−0.5 -0.51 (0.14) [94%] -0.52 (0.15) [94%]

treatment (B/A) α2=−0.5 -0.51 (0.57) [93%] -0.53 (0.56) [95%]

time:treatment (B/A) α3= 0.5 0.52 (0.24) [93%] 0.52 (0.24) [93%]

Continuous part(E[log(Yij)|Yij>0])

intercept β0= 2 2.00 (0.05) [95%] 2.00 (0.07) [91%]

slope 1 β1=−1 -0.99 (0.09) [95%] -1.00 (0.13) [88%]

slope 2 β2=−1 -1.00 (0.09) [92%] -1.02 (0.16) [85%]

treatment (B/A) β3=−0.3 -0.30 (0.06) [95%] -0.30 (0.08) [91%]

slope 1:treatment (B/A) β4= 1 1.00 (0.12) [96%] 1.00 (0.13) [94%]

slope 2:treatment (B/A) β5= 1 1.00 (0.12) [96%] 1.00 (0.13) [92%]

residual S.E. σε= 0.3 0.30 (0.01) [93%] 0.30 (0.01) [94%]

Death risk

treatment (B/A) γ= 0.2 0.21 (0.25) [94%] 0.28 (0.39) [95%]

Association

intercept (binary part) φa= 0.9 0.97 (0.35) [99%] 1.08 (1.35) [98%]

intercept (continuous part) φb0= 1 1.05 (0.39) [99%] 1.53 (2.37) [98%]

slope 1 (continuous part) φbs1= 1 1.01 (0.26) [99%] 1.32 (1.57) [96%]

slope 2 (continuous part) φbs2= 1 0.98 (0.15) [99%] 1.28 (2.12) [92%]

Random effects’s standard deviation

intercept (binary part) σa= 0.5 0.55 (0.10) [98%] 0.78 (0.25) [89%]

intercept (continuous part) σb0= 0.4 0.42 (0.03) [93%] 0.40 (0.04) [89%]

slope 1 (continuous part) σbs1= 0.4 0.45 (0.05) [92%] 0.40 (0.10) [82%]

slope 2 (continuous part) σbs2= 0.5 0.51 (0.05) [95%] 0.53 (0.08) [90%]

ρab0= 0.1 0.08 (0.15) [99%] 0.06 (0.24) [93%]

ρabs1= 0.1 0.03 (0.17) [98%] 0.06 (0.29) [93%]

ρabs2= 0 -0.02 (0.20) [98%] -0.02 (0.28) [92%]

ρb0bs1= 0.1 0.04 (0.12) [95%] 0.16 (0.22) [85%]

ρb0bs2= 0.1 0.09 (0.12) [98%] 0.07 (0.17) [81%]

ρbs1bs2= 0.2 0.16 (0.16) [97%] 0.22 (0.23) [83%]

Computation time

80 CPUs (Intel Xeon Gold 6248 2.50GHz) 7 sec. (1) 156 sec. (42)

% of estimated models 100% 53%

Posterior mean,Standard deviation of the posterior mean,Coverage probability

Figure S1: Natural cubic splines with one knot at the median of observed times for the application of the TPJM to the GERCOR study.

0 1 2 3 4

0.0 0.5 1.0 1.5 2.0

GERCOR study

Time (years)

Spline v alue

First spline

Second spline

(5)

4 Denis Rustand et al.: Supplementary Materials for “Bayesian Estimation of Two-Part Joint Models with INLA”

Table S5: Application of the Bayesian and frequentist two-part joint models with a linear trend to the GERCOR study with the R packages INLA and frailtypack

Approach INLA frailtypack

Est.(SD) Est. (SD) Binary part(SLD>0 versus SLD=0)

intercept α0 5.21*** (0.62) 5.10*** (0.69)

time (year) α1 -2.18*** (0.38) -2.16*** (0.41)

treatment (B/A) α2 -1.19 (0.71) -1.22 (0.69)

PS (1 vs. 0) α3 2.07** (0.58) 2.19*** (0.59)

PS (2 vs. 0) α4 2.05 (1.11) 1.92 (1.23)

previous radio (Y/N) α5 0.92 (0.73) 0.80 (0.71)

lung (Y/N) α6 1.90** (0.68) 1.83* (0.72)

time:treatment (B/A) α7 0.34 (0.46) 0.36 (0.47)

Continuous part(E[log(Yij)|Yij>0])

intercept β0 2.12*** (0.13) 2.06*** (0.13)

time (years) β1 -0.30*** (0.06) -0.32*** (0.06)

treatment (B/A) β2 -0.26** (0.09) -0.27** (0.08)

PS (1 vs. 0) β3 0.38*** (0.09) 0.37*** (0.08)

PS (2 vs. 0) β4 0.46** (0.14) 0.44*** (0.13)

previous surgery (curative) β5 -0.43* (0.17) -0.38* (0.15) previous surgery (palliative) β6 -0.03 (0.13) 0.04 (0.12)

previous radio (Y/N) β7 -0.21 (0.11) -0.16 (0.10)

metastases (metachronous vs. synchronous) β8 0.32* (0.14) 0.30* (0.12) time:treatment (B/A) β9 0.29*** (0.09) 0.28*** (0.08)

residual S.E. σε 0.31*** (0.01) 0.31*** (0.01)

Death risk

treatment (B/A) γ1 0.26 (0.20) 0.23 (0.19)

PS (1 vs. 0) γ2 0.79*** (0.20) 0.82*** (0.21)

PS (2 vs. 0) γ3 1.50*** (0.32) 1.55*** (0.34)

previous surgery (curative) γ4 -0.89* (0.41) -0.83* (0.41) previous surgery (palliative) γ5 -0.48 (0.29) -0.44 (0.29) metastases (metachronous vs. synchronous) γ6 0.94** (0.34) 0.96** (0.34) Association

intercept (binary part) φa 0.12 (0.06) 0.18 (0.14) intercept (continuous part) φb0 0.71*** (0.16) 0.34 (0.48) slope (continuous part) φb1 0.84*** (0.23) 0.27 (0.72) Random effects’s standard deviation

intercept (binary part) σa 2.78 (0.41) 2.91 (0.40) intercept (continuous part) σb0 0.60 (0.03) 0.58 (0.03) slope (continuous part) σb1 0.47 (0.06) 0.44 (0.04) ρab0 0.47 (0.07) 0.56 (0.07) ρab1 0.49 (0.11) 0.51 (0.10) ρb0b1 -0.22 (0.09) -0.19 (0.08) Computation time (Intel Xeon Gold 6248 2.50GHz)

8 CPUs 14 sec. 6134 sec.

80 CPUs 8 sec. 1038 sec.

Posterior mean,Posterior standard deviation ,***p <0.001,**p <0.01,*p <0.05

Figure S2: Observed vs. fitted longitudinal trajectories with INLA for five patients representative of the various observed trajectories.

0 1 2

0.0 0.5 1.0 1.5

Time (years)

SLD

fitted observed

(6)

R code for the estimation of the conditional TPJM with INLAjoint and frailtypack

1 # The code is available at github.com/DenisRustand/TPJM_sim/TPJM_INLA.R 2 # 1- This code shows how to simulate a dataset assuming a conditional 3 # two-part joint model with shared random effects association

4 # 2- The estimation of the conditional two-part joint model with INLAjoint 5 # 3- The estimation of the conditional two-part joint model with frailtypack 6 set.seed(1)

7

8 ###########

9 ### 1 ### Simulation of a dataset (scenario 3) 10 ###########

11

12 library(mvtnorm) # for multivariate normal generation (random effects) 13 nsujet=200 # number of individuals

14 alpha_0=4 # Intercept (binary part) 15 alpha_1=-0.5 # slope

16 alpha_2=-0.5 # treatment 17 alpha_3=0.5 # treatment x time

18 beta_0=2 # Intercept (continuous part) 19 beta_1=-0.3 # slope

20 beta_2=-0.3 # treatment 21 beta_3=0.3 # treatment x time

22 sigma_e=0.3 # error term (standard error) 23 gamma_1=0.2 # treatmentt effect on survival

24 # Shared random effects association between the two-part model and survival 25 phi_a=1 # random intercept (binary)

26 phi_b=1 # random intercept (continuous) 27 phi_bt=1 # random slope (continuous) 28 baseScale=0.2 # baseline hazard scale

29 gap=0.4# gap between longitudinal repeated measurements 30 followup=4 # study duration

31 sigma_a=1 # random intercept (binary) 32 sigma_b=0.5 # random intercept (continuous) 33 sigma_bt=0.5 # random slope (continuous)

34 cor_ba=0.5 # correlation intercept (binary)/intercept (continuous) 35 cor_bta=0.5 # correlation intercept (binary)/slope (continuous) 36 cor_bbt=-0.2 # correlation continuous intercept/slope

37 cov_ba <- sigma_b * sigma_a *cor_ ba # covariance 38 cov_bta <- sigma_bt * sigma_a *cor_ bta

39 cov_bbt <- sigma_b * sigma_bt *cor_ bbt

40 Sigma=matrix(c(sigma_aˆ2,cov_ba,cov_bta, # variance-covariance matrix

41 cov_ba,sigma_bˆ2,cov_bbt,

42 cov_bta,cov_bbt,sigma_btˆ2),ncol=3,nrow=3) 43 mestime=seq(0,followup,gap) # measurement times

44 timej=rep(mestime, nsujet) # time column

45 nmesindiv=followup/gap+1 # number of individual measurements 46 nmesy= nmesindiv * nsujet # number of longi measurements 47 id<-as.factor(rep(1:nsujet, each=nmesindiv)) # patient id 48 # random effects generation

49 MVnorm <- mvtnorm::rmvnorm(nsujet, rep(0, 3), Sigma) 50 a_i = MVnorm[,1] # binary intercept

51 a_iY <- rep(a_i, each=nmesindiv) # binary intercept (repeated for longi dataset)

52 b_i = MVnorm[,2] # continuous intercept

(7)

6 Denis Rustand et al.: Supplementary Materials for “Bayesian Estimation of Two-Part Joint Models with INLA”

53 b_iY <- rep(b_i, each=nmesindiv) 54 bt_i = MVnorm[,3] # continuous slope 55 bt_iY <- rep(bt_i, each=nmesindiv)

56 treated <- sample(1:nsujet, nsujet/2, replace=F)

57 trt <- as.integer(1:200 %in% sort(treated)) # treatment covariate

58 trtY=rep(trt, each=nmesindiv) # treatment covariate - repeated for longitudinal 59 ## linear predictor (binary part)

60 linPredBin <- alpha_0+a_iY+alpha_1 * timej+alpha_2 * trtY+alpha_3 * timej * trtY

61 probaBin <- exp(linPredBin)/(1+exp(linPredBin)) # probability of positive value 62 B <- rbinom(nmesy,1, probaBin) # observed zero values

63 ## linear predictor (continuous part)

64 linPredCont <- beta_0+b_iY+(beta_1+bt_iY) * timej+beta_2 * trtY+beta_3 * timej * trtY 65 # observed biomarker values

66 Ypos <- rnorm(length(linPredCont), mean = linPredCont, sd = sigma_e) 67 Y = ifelse(B==1, Ypos, 0) # include zeros in the biomarker distribution

68 longDat <- data.frame(id=as.integer(id), timej, trtY, Y, B) # longitudinal dataset 69 ## generation of exponential death times

70 u <- runif(nsujet) # uniform distribution for survival times generation

71 deathTimes <- -(log(u)/(baseScale *exp (trt *gamma_ 1+a_i * phi_a+b_i * phi_b+bt_i * phi_bt))) 72 d <- as.numeric(deathTimes<followup) # deathtimes indicator

73 ## censoring individuals at end of follow-up (not at random) 74 deathTimes[deathTimes>=followup]=followup

75 ids <- as.factor(1:nsujet)

76 survDat <- data.frame(id=as.integer(ids),deathTimes, d, trt) # survival dataset 77 ## removing longi measurements after death

78 ind <- rep(NA, nsujet *length (mestime)) 79 for (i in 1:nsujet){

80 for(j in 1:length(mestime)){

81 if(longDat[(i-1) *length (mestime)+j, "timej"]<=survDat[i,"deathTimes"]){

82 ind[(i-1) *length (mestime)+j]=1 83 } } }

84 longDat <- longDat[!is.na(ind),]

85 ## Summary of the longitudinal and survival datasets 86 print(summary(survDat))

87 print(summary(longDat)) 88

89 ###########

90 ### 2 ### Estimation of a conditional two-part joint model with INLAjoint 91 ###########

92

93 # install instructions: https://github.com/DenisRustand/INLAjoint 94 library(INLAjoint)

95 Event <- inla.surv(survDat$deathTimes, survDat$d) # event outcome 96 TPinla <- joint(formLong = list(B ˜ timej * trtY + (1|id),

97 Y ˜ timej * trtY + (1+timej|id)),

98 formSurv = Event ˜ -1+trt, id = "id", timeVar = "timej", 99 family = c("binomial", "gaussian"), basRisk = "rw2", 100 corLong = TRUE, assoc = c("SRE_ind", "SRE_ind"),

101 control=list(PriorRandom=list(r=5),

102 priorAssoc=list(mean=1, prec=10), int.strategy="eb"), 103 dataLong = list(longDat, longDat[longDat$Y!=0,]), dataSurv=survDat) 104 summary(TPinla, sdcor=T)

105

106

(8)

107 ###########

108 ### 3 ### Estimation of a conditional two-part joint model with frailtypack 109 ###########

110

111 library(frailtypack)

112 # kappa value (smoothing) chosen by cross-validation with an univariate Cox model 113 tte <- frailtyPenal(Surv(deathTimes, d)˜trt, n.knots=5,

114 kappa=0, data=survDat, cross.validation=T)

115 kap <- round(tte$kappa,2);kap # smoothing parameter

116 longDat[longDat$Y==0,"Y"] <- -40 # need to set zeros as smallest value observed 117 # computation takes ˜12min with an Intel i7-4790 (8 cores, 3.60 GHz)

118 TPJM <- longiPenal(formula = Surv(deathTimes, d)˜trt,

119 formula.LongitudinalData = Y˜timej * trtY,

120 formula.Binary=Y˜timej * trtY,

121 data=survDat, data.Longi = longDat,

122 random = c("1","timej"), random.Binary=c("1"), 123 timevar="timej", id = "id",

124 link = "Random-effects", n.knots = 5, kappa = kap,

125 hazard="Splines-per", method.GH="Monte-carlo",

126 n.nodes=1000, seed.MC=1234);TPJM

Referensi

Dokumen terkait