Chronic respiratory problems, and lung infections.
Poor growth, and low weight.
ENAR Spring Meeting | March 29, 2022
Chronic respiratory problems, and lung infections.
Poor growth, and low weight.
Outcomes:
· Lung function decline (FEV1)
· Nutritional status evolution (BMI)
· Pulmonary exacerbations
· Death or transplantation
27K CF patients
1,400K observations
317K years of follow-up
50% of patients reported ≥50 measurements, and ≥12.5 years of follow-up.
50% of patients experienced ≥4 acute respiratory events.
26% of patients died or received a transplant.
Why?
· Survival analysis: endogenous time-varying covariates
· Longitudinal analysis: nonrandom dropout
Why?
· Survival analysis: endogenous time-varying covariates
· Longitudinal analysis: nonrandom dropout
\[\small{\require{color} \begin{cases} y_i(t)= \colorbox{#79FCFD80}{$ x_i(t)^\top\beta + z_i(t)^\top b_i$} + \varepsilon_i(t) = \colorbox{#79FCFD80}{$ \eta_i(t)$} + \varepsilon_i(t) & \text{Longitudinal outcome}\\ h_i(t)= h_0(t)\exp\left\{ w_i(t)^\top \gamma + \colorbox{#79FCFD80}{$\mathcal{f}\left\{\eta_i(t)\right\}$} \alpha \right\} & \text{Time-to-event outcome}\\ \end{cases} } \]
\[ b_i \sim \mathcal N \left(0, D\right), \qquad \varepsilon_i(t) \sim \mathcal N \left(0, \sigma^2\right) \]
Recurrent failure times + Multiple longitudinal markers + Multiple functional forms
\[\small{\require{color}
\begin{cases}
y_{i1}(t)= \colorbox{#79FCFD80}{$ x_{i1}(t)^\top \beta_1 + z_{i1}(t)^\top b_{i1}$} + \varepsilon_{i1}(t) = \colorbox{#79FCFD80}{$ \eta_{i1}(t)$} + \varepsilon_{i1}(t) & \text{FEV$_1$}\\
y_{i2}(t)= \colorbox{#FCFF5580}{$ x_{i2}(t)^\top \beta_2 + z_{i2}(t)^\top b_{i2}$} + \varepsilon_{i2}(t) = \colorbox{#FCFF5580}{$ \eta_{i2}(t)$} + \varepsilon_{i2}(t) & \text{BMI}\\\\
h_i(t) = h_0(t)\exp\left\{ w_{it}(t)^\top \gamma_t + \colorbox{#79FCFD80}{$\mathcal{f}_{1}\left\{\eta_{i1}(t)\right\}$} \alpha_{t1} + \colorbox{#FCFF5580}{$\mathcal{f}_{2}\left\{\eta_{i2}(t)\right\}$} \alpha_{t2} + \colorbox{#5FFFAB80}{$v_i$} \alpha_{F} \right\} & \text{Death or TX}\\
r_i(t)= r_0(t)\exp\left\{ w_{ir}(t)^\top \gamma_r + \colorbox{#79FCFD80}{$\mathcal{g}_{1}\left\{\eta_{i1}(t)\right\}$} \alpha_{r1} + \colorbox{#FCFF5580}{$\mathcal{g}_{2}\left\{\eta_{i2}(t)\right\}$} \alpha_{r2} + \colorbox{#5FFFAB80}{$v_i$} \right\} & \text{PEx}\\
\end{cases}
}
\]
\[ \begin{pmatrix} \colorbox{#79FCFD80}{$b_{i1}$} \\ \colorbox{#FCFF5580}{$b_{i2}$} \\ \colorbox{#5FFFAB80}{$v_i$}\end{pmatrix} \sim \mathcal N \left(0, \begin{pmatrix}D & 0 \\ 0 & \sigma^2_F\end{pmatrix} \right), \qquad \varepsilon_{ij}(t) \sim \mathcal N (0, \sigma_j^2) \]
Functional Forms
\[
f\{\eta_i(t)\} =
\begin{cases}
\eta_i(t) & \text{value}\\\\
\displaystyle \frac{d}{dt} \eta_i(t) & \text{slope}\\\\
\eta_i(t) - \eta_i(t - 1) & \text{last year increase}\\\\
\displaystyle \frac{1}{t} \displaystyle \int_0^t \eta_i(s) \, ds & \text{(normalized) cumulative effect}
\end{cases}
\]
Hazard timescale
Discontinuous risk intervals
Bayesian framework
Gibbs and Metropolis-Hastings algorithms in C++
R package: https://drizopoulos.github.io/JMbayes2/
## id tstart tstop status strata sex ## 1 1 0 2 1 1 m ## 2 1 3 4 1 1 m ## 3 1 5 7 0 1 m ## 4 1 0 7 0 2 m ## 5 2 0 1 1 1 f ## 6 2 2 4 0 1 f ## 7 2 0 4 1 2 f
\[\small{\require{color}
\begin{cases}
y_i(t)= \colorbox{#79FCFD80}{$ \beta_0 + t\beta + b_{0i} + tb_{1i}$} + \varepsilon_i(t) = \colorbox{#79FCFD80}{$ \eta_{i}(t)$} + \varepsilon_i(t) \\
h_i(t)= h_0(t) \exp \left \{ \text{group}_i \gamma_{t} + \colorbox{#79FCFD80}{$\eta_{i}(t)$} \alpha_t + \colorbox{#5FFFAB80}{$v_i$} \alpha_{F} \right\} \\
r_i(t)= r_0(t)\exp\left\{ \text{group}_i \gamma_{r} + \colorbox{#79FCFD80}{$\eta_{i}(t)$} \alpha_r + \colorbox{#5FFFAB80}{$v_i$} \right\} \\
\end{cases}
}
\]
library("JMbayes2") lme_fit <- lme(fixed = y ~ time, random = ~ time | id, data = data_long) cox_fit <- coxph(Surv(tstart, tstop, status) ~ group * strata(strata), data = data_strt) jm_fit <- jm(cox_fit, lme_fit, time_var = "time", functional_forms = ~ value(y) * strata, recurrent = "gap")
100 replications
\[\small{\require{color}
\begin{cases}
y_i(t)= \colorbox{#79FCFD80}{$ \beta_0 + b_{0i} + \sum_{j=1}^{4}\left( \beta_j + b_{ji}\right)ns_j(t)$} + \varepsilon(t) = \colorbox{#79FCFD80}{$ \eta_i(t)$} + \varepsilon(t)\\
h_i(t)= h_0(t) \exp \left\{ w_{i1}\gamma_{t1} + w_{i2}\gamma_{t2} + \colorbox{#79FCFD80}{$\eta_i(t)$} \alpha_t + \colorbox{#5FFFAB80}{$v_i$} \alpha_{F} \right\}\\
r_i(t)= r_0(t) \exp \left\{ w_{i1}\gamma_{r1} + w_{i2}\gamma_{r2} + \colorbox{#79FCFD80}{$\eta_i(t)$} \alpha_r + \colorbox{#5FFFAB80}{$v_i$} \right\} \\
\end{cases}
}
\]
\[ \begin{pmatrix} \colorbox{#79FCFD80}{$b_i$} \\ \colorbox{#5FFFAB80}{$v_i$}\end{pmatrix} \sim \mathcal N \left(0, \begin{pmatrix}D & 0 \\ 0 & \sigma^2_F\end{pmatrix}\right), \quad \varepsilon_i(t) \sim \mathcal N (0, \sigma^2), \quad i=1,\dots,500 \]
Running time: 9.3 hours
FEV1_fit <- lme(fixed = FEV1 ~ age, random = ~ age | ID, data = dataL$long) BMI_fit <- lme(fixed = BMI ~ age, random = ~ age | ID, data = dataL$long) Cox_fit <- coxph(Surv(tstart, tstop, status) ~ Gender * strata(process), data = dataL$strt) jm_fit <- jm(Cox_fit, list(FEV1_fit, BMI_fit), time_var = "age", functional_forms = ~ value(FEV1):process + value(BMI):process recurrent = "gap")
Thanks for your attention!
@drizopoulos d.rizopoulos @ erasmus mc.nl |