Metrum Research Group
library(tidyverse)
library(mrgsolve)
library(PKPDmisc)
theme_set(theme_bw() + theme(legend.position = "top"))
This model and vignette was derived from this publication
Comprehensive PBPK Model of Rifampicin for Quantitative Prediction of Complex Drug-Drug Interactions: CYP3A/2C9 Induction and OATP Inhibition Effects - Asaumi R, Toshimoto K, Tobe Y, Hashizume K, Nunoya KI, Imawaka H, Lee W, Sugiyama Y. CPT Pharmacometrics Syst Pharmacol. 2018 Jan 25. PMID: 29368402 - https://www.ncbi.nlm.nih.gov/pubmed/29368402
model_dir <- "model"
mod <- mread_cache("rifampicin_midazolam", model_dir, delta = 0.1)
mod
.
.
. --------- source: rifampicin_midazolam.cpp ---------
.
. project: /Users/kyleb/git...content/model
. shared object: rifampicin_midazolam-so-cca215f11e6a
.
. time: start: 0 end: 24 delta: 0.1
. add: <none>
.
. compartments: Xgutlumen Mgutlumen central Cmuscle
. Cskin Cadipose Cserosa Cmucblood Cent
. CHE1 CHE2 CHE3 CHE4 CHE5 CHC1 CHC2 CHC3
. CHC4 CHC5 mcentral mCmuscle mCskin
. ... [41]
. parameters: Rdif beta gamma Km_u_uptake SFKp mSFKp
. Emax_UGT_RIF EC50_u_UGT_RIF
. kdeg_UGT_liver kdeg_UGT_ent
. fm_UGT_liver fm_UGT_ent Emax_CYP3A4_RIF
. ... [61]
. captures: Ccentral mCcentral Cmidazolam [3]
. omega: 0x0
. sigma: 0x0
.
. solver: atol: 1e-08 rtol: 1e-08 maxsteps: 20k
. ------------------------------------------------------
param(mod)
.
. Model parameters (N=61):
. name value . name value . name value
. beta 0.2 | kdeg_UGT_liver 0.0158 | Qh_kg 1.24
. CLrenal_kg 0.011 | Km_u_uptake 0.146 | Qmuscle_kg 0.642
. EC50_u_CYP3A4_RIF 0.0526 | Kp_adipose 0.0629 | Qportal_kg 0.531
. EC50_u_UGT_RIF 0.0526 | Kp_muscle 0.0947 | Qserosa_kg 0.274
. Emax_CYP3A4_RIF 4.57 | Kp_serosa 0.2 | Qskin_kg 0.257
. Emax_UGT_RIF 1.34 | Kp_skin 0.326 | Qvilli_kg 0.257
. Fa 1 | mCLperm_gut_kg 0.151 | Rdif 0.129
. fB 0.0778 | mCLrenal 0 | SFKp 6.65
. fBCLint_all_kg 0.251 | mFa 1 | Vadipose_kg 0.143
. fE 0.115 | mfB 0.0545 | Vcentral_kg 0.0743
. Fg 0.943 | mfBCLint_kg 0.469 | Vent_kg 0.00739
. fH 0.0814 | mfECLint_E_kg 0.107 | VHC_kg 0.0174
. fm_CYP3A4_ent 1 | mka 1.29 | VHE_kg 0.0067
. fm_CYP3A4_liver 0.93 | mKp_adipose 34.4 | Vmucblood_kg 0.00099
. fm_UGT_ent 0.759 | mKp_liver 6.96 | Vmuscle_kg 0.429
. fm_UGT_liver 0.759 | mKp_muscle 4 | Vportal_kg 0.001
. gamma 0.778 | mKp_skin 20.4 | Vserosa_kg 0.00893
. ka 37.6 | mSFKp 0.201 | Vskin_kg 0.111
. kdeg_CYP3A4_ent 0.0288 | mVcentral_kg 0.571 | WT 80
. kdeg_CYP3A4_liver 0.0158 | PSdif_E_kg 0.161 | . .
. kdeg_UGT_ent 0.0288 | Qadipose_kg 0.223 | . .
init(mod)
.
. Model initial conditions (N=41):
. name value . name value . name
. Cadipose (6) 0 | CLIV2 (25) 0 | CYP3A4_ratio_HC5 (40)
. Cent (9) 0 | CLIV3 (26) 0 | mCadipose (23)
. central (3) 0 | CLIV4 (27) 0 | mcentral (20)
. CHC1 (15) 0 | CLIV5 (28) 0 | mCmuscle (21)
. CHC2 (16) 0 | Cmucblood (8) 0 | mCskin (22)
. CHC3 (17) 0 | Cmuscle (4) 0 | Mgutlumen (2)
. CHC4 (18) 0 | Cportal (29) 0 | UGT_ratio_ent (35)
. CHC5 (19) 0 | Cserosa (7) 0 | UGT_ratio_HC1 (30)
. CHE1 (10) 0 | Cskin (5) 0 | UGT_ratio_HC2 (31)
. CHE2 (11) 0 | CYP3A4_ratio_ent (41) 1 | UGT_ratio_HC3 (32)
. CHE3 (12) 0 | CYP3A4_ratio_HC1 (36) 1 | UGT_ratio_HC4 (33)
. CHE4 (13) 0 | CYP3A4_ratio_HC2 (37) 1 | UGT_ratio_HC5 (34)
. CHE5 (14) 0 | CYP3A4_ratio_HC3 (38) 1 | Xgutlumen (1)
. CLIV1 (24) 0 | CYP3A4_ratio_HC4 (39) 1 | . ...
. value
. 1
. 0
. 0
. 0
. 0
. 0
. 1
. 1
. 1
. 1
. 1
. 1
. 0
. .
rif <- ev(amt = 600)
rif
. Events:
. time amt cmt evid
. 1 0 600 1 1
mod %>%
ev(rif) %>%
Req(Ccentral) %>%
mrgsim(end = 48) %>%
plot()
rif <- mutate(rif, ii = 24, addl = 9)
rif
. Events:
. time amt ii addl cmt evid
. 1 0 600 24 9 1 1
out <-
mod %>%
ev(rif) %>%
mrgsim(end = 240)
What is going on here?
p <- plot(out, Ccentral ~ time)
ggplot(as_tibble(out), aes(time/24,Ccentral)) +
geom_line(lwd=1) + theme_bw() +
scale_x_continuous(name = "Time (day)", breaks = seq(0,10,2))
Let’s investigate
aucs <-
out %>%
mutate(DAY = 1+floor(time/24)) %>%
group_by(DAY) %>%
summarise(AUC = auc_partial(time,Ccentral)) %>%
ungroup %>%
mutate(pAUC = 100*AUC/first(AUC)) %>%
filter(DAY < 10)
ggplot(aucs, aes(factor(DAY),pAUC)) +
geom_col(alpha = 0.6) +
geom_hline(yintercept = 70, lty = 2, col = "firebrick") +
scale_y_continuous(breaks = seq(0,100,10))
Both CYP3A4
and UGT
metabolic activity increased after multiple
rifampicin doses
simsm <-
out %>%
as_tibble() %>%
gather(variable, value, c(UGT_ratio_HC5, CYP3A4_ratio_HC5))
simsm %>%
ggplot(., aes(time/24, value, col = variable)) +
geom_line(lwd =1 ) +
scale_color_brewer(palette = "Set2",name="",labels=c("CYP3A4", "UGT")) +
scale_x_continuous(name="Time (day)", breaks = seq(0,10,2)) +
ylab("fold induction") + theme(legend.position = "right")
- Recall that our PBPK model is really a combination of two models: one for rifampicin and one for midazolam
A single 3 mg midazolam dose
mid <- ev(amt = 3, cmt = "Mgutlumen")
mid
. Events:
. time amt cmt evid
. 1 0 3 Mgutlumen 1
mod %>% mrgsim_e(mid, outvars = "Cmidazolam") %>% plot()
Now, a single 3 mg midazolam dose after 7 days of rifampin 75 mg QD
rif <- ev(amt = 75, ii = 24, addl = 6, cmt = "Xgutlumen")
rif_mid <- ev_seq(rif, wait = -12, mid)
mid <- filter(rif_mid, cmt=="Mgutlumen")
both <- as_data_set(mid, rif_mid)
both
. ID time cmt evid amt ii addl
. 1 1 156 Mgutlumen 1 3 0 0
. 2 2 0 Xgutlumen 1 75 24 6
. 3 2 156 Mgutlumen 1 3 0 0
sims <-
mod %>%
mrgsim_d(both, Req="Cmidazolam", end = 166) %>%
filter_sims(time >= 156) %>%
mutate(ID = factor(ID, labels = c("Midazolam", "Midazolam after Rif")))
ggplot(sims, aes(time-156,Cmidazolam,col = factor(ID))) +
geom_line(lwd = 1) +
scale_y_continuous(trans = "log10", limits = c(0.1, 10)) +
scale_x_continuous(name = "Time (hr)", breaks = seq(0,10,2)) +
scale_color_brewer(palette = "Set2", name="")
Midazolam exposure is reduced after rifampicin 75 mg daily x 7d
sims %>%
group_by(ID) %>%
summarise(AUC = auc_partial(time,Cmidazolam)) %>%
mutate(percent_reduction = 100*(1-AUC/first(AUC)))
. # A tibble: 2 x 3
. ID AUC percent_reduction
. <fct> <dbl> <dbl>
. 1 Midazolam 24.7 0
. 2 Midazolam after Rif 6.84 72.3
Make a function to wrap up the workflow for a single dose
sim_ddi <- function(rif_dose, mid_dose = 3) {
mid <- ev(amt = mid_dose, cmt = 2)
rif <- ev(amt = rif_dose, ii = 24, addl = 6)
rif_mid <- ev_seq(rif, wait = -12, mid)
mod %>%
mrgsim_e(rif_mid, Req="Cmidazolam", end = 166) %>%
filter_sims(time >= 156) %>%
mutate(rif = rif_dose, mid = mid_dose)
}
sim_ddi(600)
. # A tibble: 102 x 5
. ID time Cmidazolam rif mid
. <dbl> <dbl> <dbl> <dbl> <dbl>
. 1 1 156 0 600 3
. 2 1 156 0 600 3
. 3 1 156. 0.323 600 3
. 4 1 156. 0.597 600 3
. 5 1 156. 0.758 600 3
. 6 1 156. 0.845 600 3
. 7 1 156. 0.884 600 3
. 8 1 157. 0.893 600 3
. 9 1 157. 0.883 600 3
. 10 1 157. 0.860 600 3
. # … with 92 more rows
out <- map_df(seq(0,600,10), .f = sim_ddi)
Summarize the simulations by both rifampicin dose and midazolam dose. Because we simulated the zero rifampicin dose, we get the percent reduction in AUC by dividing by the “first” auc in the series
summ <-
out %>%
group_by(rif,mid) %>%
summarise(auc = auc_partial(time,Cmidazolam)) %>%
ungroup() %>%
mutate(pAUC = 100*(auc/first(auc)))
summ
. # A tibble: 61 x 4
. rif mid auc pAUC
. <dbl> <dbl> <dbl> <dbl>
. 1 0 3 24.7 100
. 2 10 3 13.9 56.3
. 3 20 3 11.2 45.4
. 4 30 3 9.74 39.4
. 5 40 3 8.76 35.5
. 6 50 3 8.05 32.6
. 7 60 3 7.49 30.3
. 8 70 3 7.04 28.5
. 9 80 3 6.66 27.0
. 10 90 3 6.33 25.6
. # … with 51 more rows
ggplot(summ, aes(rif,pAUC)) +
geom_line(lwd = 1) +
scale_y_continuous(breaks = seq(0,100,10), limits = c(0,100),
name = "Midazolam AUC after Rif (% of no-Rif AUC)") +
scale_x_continuous(name = "Rifampicin dose (mg)", breaks=seq(0,600,100)) +
theme_bw()