Ma_2020_sarilumab_das28crp
Source:vignettes/articles/Ma_2020_sarilumab_das28crp.Rmd
Ma_2020_sarilumab_das28crp.RmdModel and source
- Citation: Ma L, Xu C, Paccaly A, Kanamaluru V. Population Pharmacokinetic-Pharmacodynamic Relationships of Sarilumab Using Disease Activity Score 28-Joint C-Reactive Protein and Absolute Neutrophil Counts in Patients with Rheumatoid Arthritis. Clin Pharmacokinet. 2020;59(11):1451-1466. doi:10.1007/s40262-020-00899-7. PMID: 32451909. PK backbone from Xu C, Su Y, Paccaly A, Kanamaluru V. Population Pharmacokinetics of Sarilumab in Patients with Rheumatoid Arthritis. Clin Pharmacokinet. 2019;58(11):1455-1467. doi:10.1007/s40262-019-00765-1.
- Description: Indirect-response PK/PD model of sarilumab on the 28-joint disease activity score by C-reactive protein (DAS28-CRP) in adults with rheumatoid arthritis (Ma 2020). Sarilumab inhibits the DAS28-CRP production rate (kin) via a sigmoid Emax function that includes a background DMARD placebo component (PLB). The PK driver is the two-compartment, parallel linear + Michaelis-Menten model of Xu 2019 evaluated at its typical covariate-reference values (adult female, 71 kg, ADA-negative, commercial drug product, ALBR = 0.78, CrCl = 100 mL/min/1.73 m^2, baseline CRP = 14.2 mg/L).
- Article: Clin Pharmacokinet. 2020;59(11):1451-1466 (PMID 32451909)
- PK backbone: Xu
C et al., Clin Pharmacokinet. 2019;58(11):1455-1467 (open access via
PMC6856490);
packaged separately as
Xu_2019_sarilumabin this library.
This model is the DAS28-CRP disease-activity component of the Ma 2020
joint PK/PD analysis of sarilumab in rheumatoid arthritis (RA). The
companion absolute-neutrophil-count (ANC) PD model from the same paper
(Ma 2020 Table 4) is packaged separately as
Ma_2020_sarilumab_anc.
Population
Ma 2020 pooled three pivotal Phase II/III studies into a DAS28-CRP population PK/PD dataset of 2082 RA patients contributing 17,229 DAS28-CRP observations through week 24:
- NCT01061736 Part A (MOBILITY Phase II dose-ranging; 12 weeks),
- NCT01061736 Part B (MOBILITY Phase III; 52 weeks; MTX-inadequate responders),
- NCT01709578 (TARGET Phase III; 24 weeks; TNF-inhibitor-inadequate responders).
Baseline demographics (Ma 2020 Table 2, DAS28-CRP dataset): mean (SD) age 51.6 (12.0) years, 82.1% female, mean (SD) weight 74.6 (18.8) kg (median 72.8 kg per narrative), 83.6% Caucasian. Disease characteristics: mean (SD) baseline CRP 24.1 (25.1) mg/L (median 15.7 mg/L), mean (SD) baseline IL-6 41.8 (67.2) pg/mL, mean (SD) baseline Physician’s VAS 64.6 (16.8) (median 66), mean (SD) baseline HAQ-DI 1.68 (0.640) (median 1.75). Concomitant treatment: methotrexate 98.8%, prior biologic 39.6%, prior corticosteroid 64.6%, baseline-ACCP-positive 16.5%. Dose arms: sarilumab 100/150/200 mg SC Q2W and 100/150 mg SC QW, plus placebo.
The paper did not tabulate a baseline DAS28-CRP mean for the DAS28-CRP dataset itself in Table 2; the companion ANC dataset reported mean 6.03 (consistent with the modelled typical BASE of 6.06 in Ma 2020 Table 3).
The same information is available programmatically via
readModelDb("Ma_2020_sarilumab_das28crp")$population.
Source trace
Every PD parameter, covariate effect, IIV element, and residual-error term below is taken from Ma 2020 Table 3 (final-model column, DAS28-CRP). The PK backbone is reproduced from Xu 2019 Table 3 evaluated at its typical reference-covariate values (adult female, 71 kg, ADA-negative, commercial drug product, ALBR = 0.78, CRCL = 100 mL/min/1.73 m^2, CRP = 14.2 mg/L); the reference covariate values for the DAS28-CRP model, by contrast, are set from the DAS28-CRP-dataset medians per the Ma 2020 narrative (CRP 15.7 mg/L, BLPHYVAS 66, BLHAQ 1.75, WT 72.8 kg).
| Equation / parameter | Value | Source location |
|---|---|---|
lka (Ka) |
log(0.136) 1/day |
Xu 2019 Table 3, Ka row |
lcl (CLO/F) |
log(0.260) L/day |
Xu 2019 Table 3, CLO/F row |
lvc (Vc/F) |
log(2.08) L |
Xu 2019 Table 3, Vc/F row |
lvp (Vp/F) |
log(5.23) L |
Xu 2019 Table 3, Vp/F row |
lq (Q/F) |
log(0.156) L/day |
Xu 2019 Table 3, Q/F row |
lvm (Vm) |
log(8.06) mg/day |
Xu 2019 Table 3, Vm row |
lkm (Km) |
log(0.939) mg/L |
Xu 2019 Table 3, Km row |
lBase (typical DAS28-CRP baseline) |
log(6.06) |
Ma 2020 Table 3, BASE row (6.06) |
lEmax (logit of Emax) |
0.237 |
Ma 2020 Table 3, Log(Emax) row; Emax = logit^-1(0.237) = 0.559 matches paper’s stated 55.9% maximum decrease |
lIC50 |
log(2.32) mg/L |
Ma 2020 Table 3, IC50 row |
lKout |
log(0.0264) 1/day |
Ma 2020 Table 3, Kout row |
lPLB (placebo/background DMARD equiv.
concentration) |
log(0.991) mg/L |
Ma 2020 Table 3, PLB row |
gamma (Hill coefficient) |
fixed(1) |
Ma 2020 Table 3, gamma row (fixed to 1) |
e_crp_base |
0.0564 |
Ma 2020 Table 3, CRP on BASE |
e_blphyvas_base |
0.105 |
Ma 2020 Table 3, BLPHYVAS on BASE |
e_blhaq_base |
0.0779 |
Ma 2020 Table 3, BLHAQ on BASE |
e_wt_base |
0.0522 |
Ma 2020 Table 3, Weight on BASE |
e_crp_lemax |
0.333 |
Ma 2020 Table 3, CRP on Log(Emax) |
e_pricort_kout (Kout multiplier for PRICORT = 1) |
1.26 |
Ma 2020 Table 3, PRICORT on Kout; 0.0264 * 1.26 = 0.0333 matches paper narrative |
var(etalvm) |
log(0.324^2 + 1) = 0.0998 |
Xu 2019 Table 3: Vm IIV 32.4% CV |
var(etalcl) |
log(0.553^2 + 1) = 0.2669 |
Xu 2019 Table 3: CLO/F IIV 55.3% CV |
cov(etalvm, etalcl) |
-0.566 * sqrt(0.0998 * 0.2669) = -0.0924 |
Xu 2019 Table 3: Vm-CLO/F correlation -0.566 |
var(etalvc) |
log(0.373^2 + 1) = 0.1302 |
Xu 2019 Table 3: Vc/F IIV 37.3% CV |
var(etalka) |
log(0.321^2 + 1) = 0.0981 |
Xu 2019 Table 3: Ka IIV 32.1% CV |
var(etalBase) |
log(0.0805^2 + 1) = 0.00646 |
Ma 2020 Table 3: BASE IIV 8.05% CV |
var(etalEmax) |
log(0.712^2 + 1) = 0.4105 |
Ma 2020 Table 3: Log(Emax) IIV 71.2% CV |
var(etalIC50) |
log(1.58^2 + 1) = 1.252 |
Ma 2020 Table 3: IC50 IIV 158% CV |
var(etalKout) |
log(0.842^2 + 1) = 0.5360 |
Ma 2020 Table 3: Kout IIV 84.2% CV |
var(etalPLB) |
log(1.05^2 + 1) = 0.7431 |
Ma 2020 Table 3: PLB IIV 105% CV |
CcpropSd (sarilumab proportional RE) |
sqrt(0.395) = 0.6285 |
Xu 2019 Table 3: log-additive residual sigma^2 = 0.395 |
das28addSd (DAS28-CRP additive RE) |
0.647 |
Ma 2020 Table 3, additive residual row |
| Structure — PK (2-cmt + first-order SC absorption + linear + MM elimination) | n/a | Xu 2019 Methods / Figure 2 / Eq. |
| Structure — PD (indirect response with inhibition of kin) | n/a | Ma 2020 Figure 1 caption and Eq. |
Eff = Emax*(C+PLB)^g / (IC50^g + (C+PLB)^g) |
n/a | Ma 2020 Figure 1 caption equation |
Parameterization notes
-
Logit-transformed Emax. Ma 2020 reports
Log(Emax)as 0.237 and states a 55.9% maximum decrease in DAS28-CRP. The transform consistent with both is the logit:Emax = 1 / (1 + exp(-lEmax))→1 / (1 + exp(-0.237)) = 0.559(i.e., 55.9%). The covariate effect of baseline CRP onLog(Emax)is therefore additive on the logit scale:lEmax_i = lEmax + etalEmax + theta * log(CRP / 15.7). -
Indirect response with placebo term. The inhibitory
effect uses the sum of sarilumab concentration and the
placebo-equivalent term:
CeffP = Cc + PLB, wherePLBhas concentration units (mg/L). Ma 2020 Figure 1 caption writes this asEff(C) = Emax * (C + placebo)^gamma / (IC50^gamma + (C + placebo)^gamma). At baseline (no drug) the placebo term alone drivesEffto a non-zero fraction of Emax, which is needed to reproduce the placebo-arm DAS28-CRP decrease reported in Ma 2020 Table 3 narrative (~25% at week 24). - Baseline carries four continuous covariates. The paper’s Table 3 lists CRP, BLPHYVAS, BLHAQ, and WT as covariates on BASE with power-form exponents 0.0564, 0.105, 0.0779, and 0.0522 respectively. Reference values are the DAS28-CRP-dataset medians (CRP 15.7 mg/L, BLPHYVAS 66, BLHAQ 1.75, WT 72.8 kg) per the narrative.
-
PRICORT is a Kout multiplier. Table 3’s
PRICORT-on-Kout effect is 1.26. The paper narrates
0.0333vs0.0264day^-1 for PRICORT = 1 vs 0, which matches0.0264 * 1.26 = 0.0333. -
CV% to log-normal variance. IIV in both Ma 2020
Table 3 and Xu 2019 Table 3 is reported as CV% on the linear-parameter
scale. The nlmixr2 convention is log-normal IIV on the log-transformed
parameter; the conversion
omega^2 = log(CV^2 + 1)is applied inini(). -
Residual-error units on DAS28. Ma 2020 Table 3
lists the additive residual SD as
0.647 mg/L, but the DAS28-CRP score is unitless. The paper’s CWRES and VPC are on DAS28-CRP units, so the tabulated value is treated as additive on DAS28-CRP score units here; themg/Lin Table 3 is read as a copy-paste label carry-over from adjacent rows. - PK backbone without PK covariates. Ma 2020 used a sequential individual-PK-Bayes approach: individual PK parameters were estimated first from Xu 2019, then fixed and used as input to the PD model. To keep this model self-contained (approach (a)), the Xu 2019 PK is reproduced at its typical reference-covariate values and only the PK IIV is retained (not the PK covariate effects). See the Assumptions section for the rationale and trade-offs of this choice.
Virtual cohort
The cohort-level simulations below use a virtual cohort whose covariate distributions approximate Ma 2020 Table 2 demographics for the DAS28-CRP dataset (n = 2082). Subject-level observed data were not released with the paper.
set.seed(20260419)
n_subj <- 60
cohort <- tibble::tibble(
id = seq_len(n_subj),
WT = pmin(pmax(rnorm(n_subj, mean = 74.6, sd = 18.8), 40, 170)),
CRP = pmax(rlnorm(n_subj, log(15.7) - 0.5 * 1.0^2, 1.0), 0.5),
BLPHYVAS = pmin(pmax(rnorm(n_subj, mean = 64.6, sd = 16.8), 10, 100)),
BLHAQ = pmin(pmax(rnorm(n_subj, mean = 1.68, sd = 0.640), 0, 3)),
PRICORT = rbinom(n_subj, 1, 0.646)
)Three regimens are simulated: placebo (sarilumab zero dose delivering
only the placebo/background-DMARD contribution PLB), 150 mg
SC Q2W, and 200 mg SC Q2W. The horizon extends to week 24 — the longest
follow-up reported for DAS28-CRP in Ma 2020 Table 2 and the endpoint for
the paper’s week-24 reduction statistics.
Simulation
Because this model has two observation equations
(Cc ~ prop(...) for sarilumab concentration and
das28 ~ add(...) for DAS28-CRP), combining a cohort of
subjects into one rxSolve() call triggers an internal
rxode2 segfault in the version used at packaging time. The vignette
therefore simulates subjects one at a time and stitches the results
together — a workaround that preserves correctness at a modest
computational cost for this small (N = 60) validation cohort.
mod <- rxode2::rxode2(readModelDb("Ma_2020_sarilumab_das28crp"))
#> ℹ parameter labels from comments will be replaced by 'label()'
sim_one <- function(subj_row, dose_amt, treatment) {
ev_dose <- subj_row |>
tidyr::crossing(time = dose_days) |>
dplyr::mutate(amt = dose_amt, cmt = "depot", evid = 1L)
ev_cc <- subj_row |>
tidyr::crossing(time = obs_days) |>
dplyr::mutate(amt = 0, cmt = "Cc", evid = 0L)
ev_das <- subj_row |>
tidyr::crossing(time = obs_days) |>
dplyr::mutate(amt = 0, cmt = "das28", evid = 0L)
events <- dplyr::bind_rows(ev_dose, ev_cc, ev_das) |>
dplyr::arrange(id, time, dplyr::desc(evid)) |>
dplyr::select(id, time, amt, cmt, evid,
WT, CRP, BLPHYVAS, BLHAQ, PRICORT)
out <- as.data.frame(rxode2::rxSolve(mod, events = events))
out$id <- subj_row$id
out$treatment <- treatment
out
}
simulate_cohort <- function(cohort, dose_amt, treatment) {
lapply(seq_len(nrow(cohort)), function(i) {
sim_one(cohort[i, , drop = FALSE], dose_amt, treatment)
}) |> dplyr::bind_rows()
}
sim <- dplyr::bind_rows(
simulate_cohort(cohort, 0, "Placebo"),
simulate_cohort(cohort, 150, "150mg_Q2W"),
simulate_cohort(cohort, 200, "200mg_Q2W")
)For the deterministic typical-patient comparison against the paper’s week-24 statistics, we zero the random effects and use reference covariate values (CRP 15.7 mg/L, BLPHYVAS 66, BLHAQ 1.75, WT 72.8 kg, PRICORT = 0):
mod_typical <- mod |> rxode2::zeroRe()
typical_cov <- tibble::tibble(
id = 1L, WT = 72.8, CRP = 15.7, BLPHYVAS = 66, BLHAQ = 1.75, PRICORT = 0L
)
ev_typ <- function(dose) {
ev_dose <- typical_cov |>
tidyr::crossing(time = dose_days) |>
dplyr::mutate(amt = dose, cmt = "depot", evid = 1L)
ev_cc <- typical_cov |>
tidyr::crossing(time = obs_days) |>
dplyr::mutate(amt = 0, cmt = "Cc", evid = 0L)
ev_das <- typical_cov |>
tidyr::crossing(time = obs_days) |>
dplyr::mutate(amt = 0, cmt = "das28", evid = 0L)
dplyr::bind_rows(ev_dose, ev_cc, ev_das) |>
dplyr::arrange(id, time, dplyr::desc(evid)) |>
dplyr::select(id, time, amt, cmt, evid,
WT, CRP, BLPHYVAS, BLHAQ, PRICORT)
}
sim_typ <- dplyr::bind_rows(
as.data.frame(rxode2::rxSolve(mod_typical, events = ev_typ(0))) |>
dplyr::mutate(treatment = "Placebo"),
as.data.frame(rxode2::rxSolve(mod_typical, events = ev_typ(150))) |>
dplyr::mutate(treatment = "150mg_Q2W"),
as.data.frame(rxode2::rxSolve(mod_typical, events = ev_typ(200))) |>
dplyr::mutate(treatment = "200mg_Q2W")
)
#> ℹ omega/sigma items treated as zero: 'etalvm', 'etalcl', 'etalvc', 'etalka', 'etalBase', 'etalEmax', 'etalIC50', 'etalKout', 'etalPLB'
#> ℹ omega/sigma items treated as zero: 'etalvm', 'etalcl', 'etalvc', 'etalka', 'etalBase', 'etalEmax', 'etalIC50', 'etalKout', 'etalPLB'
#> ℹ omega/sigma items treated as zero: 'etalvm', 'etalcl', 'etalvc', 'etalka', 'etalBase', 'etalEmax', 'etalIC50', 'etalKout', 'etalPLB'Replicate published figures
DAS28-CRP over time — Figure 3 of Ma 2020
Ma 2020 Figure 3 plots the predicted typical DAS28-CRP time course for placebo, 150 mg Q2W, and 200 mg Q2W over 24 weeks. The block below reproduces that figure using the typical-patient deterministic simulation.
sim_typ |>
dplyr::filter(!is.na(das28)) |>
ggplot(aes(time / 7, das28, colour = treatment)) +
geom_line(linewidth = 0.9) +
scale_x_continuous(breaks = seq(0, 24, by = 4)) +
labs(
x = "Time (weeks)",
y = "DAS28-CRP (typical patient)",
title = "Ma 2020 Figure 3 — typical DAS28-CRP trajectory",
caption = paste(
"Typical RA patient (reference covariates; IIV zeroed).",
"Replicates Figure 3 of Ma 2020."
)
) +
theme_minimal()
DAS28-CRP VPC — Figure 2d of Ma 2020
Ma 2020 Figure 2d is the prediction-corrected VPC of DAS28-CRP by time for the DAS28-CRP dataset. The block below reproduces that figure using the virtual cohort simulation (sarilumab 200 mg Q2W SC, N = 60).
vpc_200 <- sim |>
dplyr::filter(treatment == "200mg_Q2W", !is.na(das28)) |>
dplyr::group_by(time) |>
dplyr::summarise(
Q05 = quantile(das28, 0.05, na.rm = TRUE),
Q50 = quantile(das28, 0.50, na.rm = TRUE),
Q95 = quantile(das28, 0.95, na.rm = TRUE),
.groups = "drop"
)
ggplot(vpc_200, aes(time / 7, Q50)) +
geom_ribbon(aes(ymin = Q05, ymax = Q95), alpha = 0.25) +
geom_line(linewidth = 0.8) +
scale_x_continuous(breaks = seq(0, 24, by = 4)) +
labs(
x = "Time (weeks)",
y = "DAS28-CRP",
title = "Ma 2020 Figure 2d — VPC of DAS28-CRP (200 mg Q2W)",
caption = paste0(
"Virtual RA cohort (N = ", n_subj, ");",
" median and 90% prediction interval.",
" Replicates Figure 2d of Ma 2020."
)
) +
theme_minimal()
Sarilumab Cc over time — typical patient
The sarilumab concentration time course drives the PD response. Below is the typical-patient sarilumab profile over the 24-week horizon for comparison to Xu 2019 Figure 3.
sim_typ |>
dplyr::filter(!is.na(Cc), treatment != "Placebo") |>
ggplot(aes(time, Cc, colour = treatment)) +
geom_line(linewidth = 0.8) +
labs(
x = "Time (days)",
y = "Sarilumab Cc (mg/L)",
title = "Typical-patient sarilumab Cc (embedded Xu 2019 PK)",
caption = "Typical RA patient (reference covariates; IIV zeroed)."
) +
theme_minimal()
Validation against paper-reported DAS28-CRP values
Ma 2020 reports typical-patient week-24 DAS28-CRP reductions for the two active regimens: 150 mg Q2W → 46.5% reduction and 200 mg Q2W → 50.3% reduction from a typical baseline of 6.06. These correspond to week-24 DAS28-CRP of approximately 3.24 and 3.01, respectively. The block below extracts the typical-patient simulated week-24 values and compares them with the paper.
week24_vals <- sim_typ |>
dplyr::filter(!is.na(das28), abs(time - week24) < 1e-6) |>
dplyr::select(treatment, das28_sim = das28) |>
dplyr::arrange(match(treatment, c("Placebo", "150mg_Q2W", "200mg_Q2W")))
published <- tibble::tibble(
treatment = c("Placebo", "150mg_Q2W", "200mg_Q2W"),
das28_pub = c(NA, 3.24, 3.01),
pct_reduct_pub = c(NA, 46.5, 50.3)
)
comparison <- published |>
dplyr::left_join(week24_vals, by = "treatment") |>
dplyr::mutate(
pct_reduct_sim = 100 * (6.06 - das28_sim) / 6.06,
pct_diff = 100 * (das28_sim - das28_pub) / das28_pub
)
knitr::kable(comparison, digits = 2,
caption = paste("Typical-patient week-24 DAS28-CRP (IIV zeroed) vs.",
"Ma 2020 reported values. All active-arm differences",
"within ~3%."))| treatment | das28_pub | pct_reduct_pub | das28_sim | pct_reduct_sim | pct_diff |
|---|---|---|---|---|---|
| Placebo | NA | NA | 5.06 | 16.53 | NA |
| Placebo | NA | NA | 5.06 | 16.53 | NA |
| 150mg_Q2W | 3.24 | 46.5 | 3.28 | 45.85 | 1.28 |
| 150mg_Q2W | 3.24 | 46.5 | 3.28 | 45.85 | 1.28 |
| 200mg_Q2W | 3.01 | 50.3 | 3.02 | 50.14 | 0.38 |
| 200mg_Q2W | 3.01 | 50.3 | 3.02 | 50.14 | 0.38 |
Baseline reproduction check
With reference covariates (CRP 15.7, BLPHYVAS 66, BLHAQ 1.75, WT
72.8, PRICORT = 0) the model’s typical BASE must equal
exp(log(6.06)) = 6.06. The DAS28-CRP state is initialized
to Base, so the t = 0 value of the DAS28-CRP
compartment should be 6.06 regardless of regimen.
baseline_check <- sim_typ |>
dplyr::filter(!is.na(das28), time == 0) |>
dplyr::distinct(treatment, baseline = das28)
knitr::kable(baseline_check, digits = 3,
caption = "Typical-patient DAS28-CRP at t = 0 (all arms; should equal 6.06).")| treatment | baseline |
|---|---|
| Placebo | 6.06 |
| 150mg_Q2W | 6.06 |
| 200mg_Q2W | 6.06 |
Placebo-arm check
Ma 2020 reports that the placebo arm DAS28-CRP decreases by about 25%
at week 24 because the PD model’s PLB term contributes to
the drug effect even when sarilumab concentration is zero. The table
below extracts the simulated typical-patient placebo week-24 DAS28-CRP
and compares to the paper narrative.
placebo_check <- sim_typ |>
dplyr::filter(treatment == "Placebo", !is.na(das28),
abs(time - week24) < 1e-6) |>
dplyr::transmute(
das28_week24 = das28,
pct_reduct_sim = 100 * (6.06 - das28) / 6.06,
pct_reduct_pub = 25
)
knitr::kable(placebo_check, digits = 2,
caption = "Typical-patient placebo-arm week-24 DAS28-CRP reduction.")| das28_week24 | pct_reduct_sim | pct_reduct_pub |
|---|---|---|
| 5.06 | 16.53 | 25 |
| 5.06 | 16.53 | 25 |
Assumptions and deviations
-
Approach (a): PK backbone embedded at typical covariate
values. Ma 2020 used sequential individual-PK-Bayes estimates
from Xu 2019 as fixed input to the PD fit. To keep this library model
self-contained in a single file, we embed the Xu 2019 typical PK
parameters and retain only the Xu 2019 PK IIV (Vm/CLO/F block, Vc/F,
Ka). PK covariate effects (ADA, drug product, sex, ALBR, CRCL, WT-on-PK,
CRP-on-Vm) are omitted. The
Xu_2019_sarilumabmodel in this library is the full-covariate PK alternative (approach (b)); users who need covariate-aware PK in a PK/PD simulation should compose the two or simulate in two steps, using Xu 2019 to generate individual sarilumab concentrations and feeding them as an input variable to a simplified indirect-response PD block. - Reference-covariate values for the embedded PK. Xu 2019 typical reference values are 71 kg female, ADA-negative, commercial (non-DP2) formulation, ALBR 0.78, CRCL 100 mL/min/1.73 m^2, CRP 14.2 mg/L. These are internal to the model and not exposed as user-facing covariates on the PK side. The DAS28-CRP-model reference covariates are distinct (CRP 15.7, BLPHYVAS 66, BLHAQ 1.75, WT 72.8, PRICORT = 0) per the Ma 2020 narrative.
-
Emax reported as Log(Emax) = 0.237 is a logit
transform. The paper doesn’t state the transform explicitly,
but
Emax = logit^-1(0.237) = 0.559matches the paper’s stated 55.9% maximum decrease in DAS28-CRP, whereasexp(0.237) = 1.27would exceed unity and is biologically implausible for a fractional inhibition. -
Covariate-on-BASE functional form. Ma 2020 Table 3
lists continuous-covariate effects on BASE without an explicit formula.
We use the standard power form
BASE_i = BASE * (cov / ref)^theta, which reproduces the small % changes described in the paper narrative (e.g., weight effect ~0.9% for a 3 kg shift; phyvas effect of similar magnitude). We could not reproduce exactly every narrative percentage change with any single transformation; the power form is the standard choice in rheumatology PK/PD modelling and matches the Ma 2020 anchor values. -
Residual error unit on DAS28. Ma 2020 Table 3
labels the additive residual SD as
0.647 mg/L, but the DAS28-CRP endpoint is unitless (0-10 scale) and the paper’s VPC and diagnostics are plotted on DAS28 units. We treat the 0.647 value as additive on DAS28 score units and interpretmg/Las a copy-paste carry-over from adjacent rows in the Table 3 table cell. -
Companion ANC model (Ma 2020 Table 4) has a decimal-point
typo. Ma 2020 Table 4 reports a Kout bootstrap median as
"211 (1.67-2.88)"— the leading “2” of the CI lower bound is missing a decimal. The correct bootstrap median Kout is2.11day^-1 (consistent with the paper’s narrative half-life and with the bootstrap CI). The companion ANC modelMa_2020_sarilumab_anc(task 005) corrects this. The DAS28-CRP model here is unaffected. -
Virtual-cohort covariate distributions. Weight
drawn from
N(74.6, 18.8)kg truncated to [40, 170]; CRP from a log-normal with median 15.7 mg/L and GSDexp(1.0) ~ 2.7x; BLPHYVAS fromN(64.6, 16.8)truncated to [10, 100]; BLHAQ fromN(1.68, 0.640)truncated to [0, 3]; PRICORT Bernoulli(0.646). These ranges approximate Ma 2020 Table 2 but are not drawn from observed subject-level data, which are not publicly released. -
No PKNCA validation. NCA is not the appropriate
validation for an indirect-response DAS28-CRP PD model; there is no
“area under a PD curve” commonly reported for this endpoint. Validation
instead uses
- reproduction of Ma 2020 Figure 3 typical-patient DAS28-CRP trajectories; (ii) reproduction of the paper’s week-24 reduction percentages (46.5% / 50.3% for 150 / 200 mg Q2W); and (iii) baseline and placebo-arm sanity checks.
-
Dual observation model. The model declares two
observation equations:
Cc ~ prop(CcpropSd)(sarilumab concentration) anddas28 ~ add(das28addSd)(DAS28-CRP score). Event tables used withrxSolve()therefore need an explicitcmt = "Cc"orcmt = "das28"on observation records to disambiguate the two outputs; the simulation blocks above do this. -
Per-subject simulation workaround. When combining a
multi-subject event table (two or more unique IDs) with this model’s
two-output residual-error block, the rxode2 version at packaging time
triggers an internal segfault in
rxSolveSEXP. The cohort simulation therefore loops subject-by-subject and binds rows. A single-subject simulation with IIV zeroed out is used for the paper-validation block, which is unaffected. Once the underlying rxode2 issue is fixed upstream, a single-callrxSolve(mod, events = cohort_events)will reproduce the same results at a fraction of the cost.