BRAID
Description
BRAID is a parametric synergy model based on the Loewe additivity principle. In BRAID, synergy is parametrically defined using the parameters kappa and delta, another parameter, E3 is also related to the overall strength of the combination.
Note: E3 is not defined as \(\lim_{d_1 \rightarrow \inf, d_2 \rightarrow \inf}E(d_1, d_2)\) in BRAID.
BRAID models multidimensional drug response data using a form based on the Hill equation
where \(\Delta_{max} E\) is based on the undrugged state \(E_0\), the maximum effect of drugs 1 (\(E_1\)) and 2 (\(E_2\)), as well as a parameter fit by the model \(E_3\)
Note \(E_3\) has no impact on the model unless it represents a stronger effect than either \(E_1\) or \(E_2\).
\(h\) is the geometric mean of the individual drugs’ Hill coefficients
and \(D(d_1, d_2)\) is an “aggregate” dose defined as
where
The values of BRAID synergy parameters are interpreted as
Parameter |
Values |
Synergy/Antagonism |
Interpretation |
|---|---|---|---|
kappa (\(\kappa\)) |
\(< 0\) |
Antagonism |
Drug 1 decreases the effective dose (potency) of drug 2 |
\(> 0\) |
Synergism |
Drug 1 increases the effective dose (potency) of drug 2 |
|
delta (\(\delta\)) |
\([0, 1)\) |
Antagonism |
Drug 2 decreases the effective dose (potency) of drug 1 |
\(> 1\) |
Synergism |
Drug 2 increases the effective dose (potency) of drug 1 |
synergy supports 3 separate modes for the BRAID model which can be specified at instantiation via BRAID(mode=mode)
mode="kappa"Only fit the
kappasynergy parameter, hold constantdelta = 1
mode="delta"Only fit the
deltasynergy parameter, hold constantkappa = 0
mode="both"Fit both the
kappaanddeltasynergy parameters
The default mode is "kappa".
Assumptions
Each individual drug follows a Hill equation dose response
If this assumption is not met, you may consider using another synergy model based on the Loewe additivity principle, such as Loewe, or another model based on an alternative synergy definition.
Defaults
Single-drug models:
Default:
synergy.single.hill.HillRequired:
synergy.single.hill.Hillor subclass
2D
Load and plot example dataset
2D synergy models work with 1D arrays of drug 1 dose, drug 2 dose, and effect.
[1]:
from synergy import datasets
from synergy.utils.plots import plot_heatmap, plot_surface_plotly, set_plotly_interactive
set_plotly_interactive() # This should only be run in an interactive notebook setting - for other scripts skip this
d1, d2, E = datasets.load_2d_example()
Fit the BRAID model to data
[2]:
from synergy.combination.braid import BRAID
model_kappa = BRAID(mode="kappa")
model_delta = BRAID(mode="delta")
model_both = BRAID(mode="both")
model_kappa.fit(d1, d2, E, bootstrap_iterations=100, use_jacobian=False) # bootstrap iterations is used to get confidence intervals
model_delta.fit(d1, d2, E, bootstrap_iterations=100, use_jacobian=False)
model_both.fit(d1, d2, E, bootstrap_iterations=100, use_jacobian=False)
print("kappa-BRAID")
model_kappa.summarize() # print a table of synergy parameters, values, confidence intervals, and determination
print()
print("delta-BRAID")
model_delta.summarize()
print()
print("eBRAID")
model_both.summarize()
kappa-BRAID
Parameter | Value | 95% CI | Comparison | Synergy
===================================================================
kappa | 0.865 | (0.607, 1.2) | > 0 | synergistic
delta-BRAID
Parameter | Value | 95% CI | Comparison | Synergy
===================================================================
delta | 1.55 | (1.39, 1.72) | > 1 | synergistic
eBRAID
Parameter | Value | 95% CI | Comparison | Synergy
======================================================================
kappa | -0.262 | (-0.45, 0.602) | ~= 0 | additive
delta | 2.03 | (1.16, 2.71) | > 1 | synergistic
[13]:
for parameter, ci in model_kappa.get_confidence_intervals().items():
print(f"{parameter}: {ci}")
E0: [0.97374734 1.01195182]
E1: [0.48259425 0.52767384]
E2: [0.20700496 0.27531626]
E3: [-0.48820044 -0.23575439]
h1: [1.23814375 1.58036751]
h2: [0.80864465 0.99377081]
C1: [1.06210723 1.35394774]
C2: [0.90904027 1.21354333]
kappa: [0.60739758 1.19643948]
Plot the model fit
[3]:
from synergy.utils.dose_utils import make_dose_grid
# Get a smooth looking dose response surface from dmin=0.025 to dmax=20
dmin, dmax = 0.025, 20
n_points = 20 # 20 points x 20 points
d1_smooth, d2_smooth = make_dose_grid(dmin, dmax, dmin, dmax, n_points, n_points)
E_smooth = model_kappa.E(d1_smooth, d2_smooth)
scatter_points = {
"drug1.conc": d1,
"drug2.conc": d2,
"effect": E
}
plot_surface_plotly(d1_smooth, d2_smooth, E_smooth, cmap="YlGnBu", title="kappa-BRAID Fit", scatter_points=scatter_points)
[5]:
from matplotlib import pyplot as plt
import numpy as np
from synergy.utils.dose_utils import aggregate_replicates
# plot_heatmap will automatically aggregate replicates for real data, but we don't need it to do that for the BRAID fit (middle plot)
d, _ = aggregate_replicates(np.vstack([d1, d2]).transpose(), E)
unique_d1 = d[:, 0]
unique_d2 = d[:, 1]
fig = plt.figure(figsize=(10, 5))
plot_heatmap(d1, d2, E, title="Original Data", cmap="YlGnBu", ax=fig.add_subplot(1, 3, 1))
plot_heatmap(unique_d1, unique_d2, model_kappa.E(unique_d1, unique_d2), title="kappa-BRAID Fit", cmap="YlGnBu", ax=fig.add_subplot(1, 3, 2))
plot_heatmap(d1, d2, model_kappa.E(d1, d2) - E, title="Residuals", cmap="RdBu", ax=fig.add_subplot(1, 3, 3), center_on_zero=True)
plt.tight_layout()
N-drug Combinations
The BRAID model has not been generalized to an \(N\)-drug case
References
Twarog, N. R., Stewart, E., Hammill, C. V., & Shelat, A. A. (2016). BRAID: A Unifying Paradigm for the Analysis of Combined Drug Action. Scientific reports, 6, 25523. https://doi.org/10.1038/srep25523
[ ]: