Designing Bioassays to Detect Dose-Dependent Drug Toxicity 🧪
A strong toxicity study design should make dose-response conclusions clear, reproducible, and statistically defensible.
This experimental design was part of a preclinical bioassay, but it can be adapted to clinical settings.
The goal was to determine whether drug “X” could be administered at higher doses without causing toxic side effects.
Drug “X” was delivered through intravitreal injection (injection into the eye), and administration occurred once every 4 weeks.
🎯 Objective
To determine whether drug “X” exhibits dose-dependent toxicity in a controlled population of experimental units (e.g., animal models).
📊 Measured Response Variables
| Quantity | Description |
|---|---|
| Length of Rod Outer Segments \((\mu m)\) | A measure of retinal detachment |
| Retinal Thickness \((\mu m)\) | A measure of photoreceptor function |
| “Y” levels in vitreous humor \((pg/ml)\) | An inflammation biomarker—primary toxicity measure |
| Mortality rate | Ratio of deaths to initial sample size |
| Weight change | Body mass gained or lost after treatment |
Although several response variables were measured, this blog focuses on toxicity levels—quantified via “Y” concentration in vitreous humor, measured in picograms per milliliter (pg/ml).
ℹ️ What is pg/ml?
pg/ml stands for picograms per milliliter. A picogram is one-trillionth of a gram, and a milliliter is one-thousandth of a liter.
This unit reflects the concentration of “Y” in the fluid sample.
🧪 Methodology
- Blocking: Subjects were divided into 3 age groups: \(\alpha_1\), \(\alpha_2\), and \(\alpha_3\).
- Randomization: Subjects were randomly assigned to each treatment group.
- Blinding: Double-blinded protocol for both treatment and response measurement.
- Treatment Frequency: Once every 4 weeks.
- Monitoring:
- Daily physical and behavioral checks
- Weekly body weight
- Periodic anatomical measurements (retina & rod length)
- “Y” levels measured at irregular but predefined intervals: 3h, 9h, 24h, 48h, etc.
- Replication: Each treatment was independently replicated on multiple units. We also perform replication by independently assigning the treatments to several experimental units to ensure reproducibility of the results. —
🧮 Summary Statistics for “Y” Levels (Toxicity Marker)
| Treatment Dose | Mean Y Level | Std Dev | N |
|---|---|---|---|
| $$\tau_0$$ (Control) | 7.2 | 1.1 | 12 |
| $$\tau_1$$ | 7.9 | 1.3 | 12 |
| $$\tau_2$$ | 9.8 | 1.5 | 12 |
| $$\tau_3$$ | 12.5 | 2.1 | 12 |
| $$\tau_4$$ | 15.7 | 2.5 | 12 |
🎞️ Dose-Response Animation (Illustrative)
📈 Statistical Analysis & Hypothesis Testing
We are analyzing “Y” levels, a continuous variable, across multiple treatments and blocking for age.
Thus, we use a two-way Analysis of Variance (two-way ANOVA Model). If weight change is suspected to affect toxicity, we could also use a two-way ANCOVA.
If mortality is observed, a Chi-square test for homogeneity may be used to compare mortality rates across treatment groups.
Using a two-way ANOVA, we define our hypothesis as follows:
Hypotheses:
- Null (H₀): Drug “X” has no toxic effect at any dose, after controlling for the age of the experimental units.
- Alternative (H₁): Drug “X” exhibits toxicity at one or more of the tested dose levels, even after accounting for age.
Rejecting the null hypothesis in favor of the alternate hypothesis means that there is an age-independent difference in the effect across different treatment levels. This indicates the presence of dose-dependent toxicity. Failing to reject the null hypothesis means that there is no difference in the toxicity level.
📋 Experimental Design Table
To keep notation consistent across all options below, factor levels in screening designs are coded as:
- (0) = low level
- (1) = high level
The full RCBD design uses explicit treatment-dose groups (\tau_0) through (\tau_4) across age groups (\alpha_1, \alpha_2, \alpha_3). Fractional and split-plot alternatives are streamlined versions used when resources or logistics are constrained.
Here, frequency means how often each treatment is administered (e.g., once every 4 weeks versus a higher-frequency schedule). It is a treatment setting and does not replace treatment identity; it is studied alongside treatment dose and age-group blocking.
Design notation legend:
- (A) = Dose, (B) = Frequency, (C) = Vehicle/Formulation
- “Derived” columns are constructed from design generators and help reduce the number of required runs
- RCBD is shown in treatment-dose notation ((\tau_0) to (\tau_4)), while screening designs use coded factor levels ((0/1))
- A run is one unique factor-level combination. Replicates are repeated observations of the same run.
- RCBD Full Factorial
- Fractional Factorial (2^(4-1), Resolution IV)
- Fractional Factorial (2^(5-2), Resolution III)
- Split-Plot Design
-
Treatments (\tau_0) (Control) (\tau_1) (\tau_2) (\tau_3) (\tau_4) (\alpha_1) 4 4 4 4 4 Age Groups (\alpha_2) 4 4 4 4 4 (\alpha_3) 4 4 4 4 4 This is the balanced randomized complete block design used in the main setup.
-
Run A (Dose) B (Frequency) C (Vehicle) D (Derived) 1 0 0 0 0 2 1 0 0 1 3 0 1 0 1 4 1 1 0 0 5 0 0 1 1 6 1 0 1 0 7 0 1 1 0 8 1 1 1 1 This design cuts runs in half while preserving estimability of main effects and selected interactions. Each row is one run (one treatment-setting combination), and each run can have one or more biological replicates.
-
Run A (Dose) B (Frequency) C (Vehicle) D (Derived) E (Derived) 1 0 0 0 1 1 2 1 0 0 0 0 3 0 1 0 0 1 4 1 1 0 1 0 5 0 0 1 1 0 6 1 0 1 0 1 7 0 1 1 0 0 8 1 1 1 1 1 This lower-resolution screen is useful when pilot material is limited and only broad directional effects are needed. Again, each row is a run, not automatically a single replicate.
-
Whole Plot (Batch) Formulation Level Dose Levels Applied Replicates per Dose W1 0 (\tau_0,\tau_1,\tau_2,\tau_3,\tau_4) 3 W2 1 (\tau_0,\tau_1,\tau_2,\tau_3,\tau_4) 3 W3 2 (\tau_0,\tau_1,\tau_2,\tau_3,\tau_4) 3 Split-plot structure is practical when formulation changes are expensive (whole plot) but dose assignment is easy within each batch (subplot). Within each whole plot, age-group blocking and replicate counts can still be applied at the subplot level.
In practice, these designs form a progression:
- RCBD full factorial is the most complete option and strongest for detailed inference.
- Fractional factorial designs reduce runs for early screening and factor prioritization.
- Split-plot designs handle operational constraints while preserving valid treatment comparisons.
Reading them together: start with fractional designs to identify influential factors, move to split-plot when execution constraints dominate, and confirm final dose-response conclusions with the full RCBD structure.
📐 ANOVA Effects Model
The Effects model of the two-way ANOVA is given by:
\[y_{ijk} = \mu + \tau_j + \alpha_k + (\tau\alpha)_{jk} + \varepsilon_{ijk}\]Where:
- \(\mu\) is the overall mean
- \(\tau_j\) is the treatment effect
- \(\alpha_k\) is the block (age group) effect
- \((\tau\alpha)_{jk}\) is the interaction effect
- \(\varepsilon_{ijk}\) is the residual error of the model at each observation \(\varepsilon_{ijk}\) is normally distributed with \(0\) mean .
🔀 Understanding Factor Interactions
Here is an analogy of interaction my manager once shared with me:
Consider gasoline as one factor (amount in gallons) and lit matchsticks as another (number of matches). Each of these factors affect room temperature independently. But together—they ignite a dramatic interaction (🔥). This is how interaction effects can amplify outcomes. (Don’t try this experiment at home!)
-
{ "data": [ {"x": [1, 2, 3, 4, 5], "y": [5, 10, 13, 14, 14.5], "type": "scatter", "name": "Treatment 1"}, {"x": [1, 2, 3, 4, 5], "y": [8.2, 12.8, 16.3, 17.1, 17.2], "type": "scatter", "name": "Treatment 2"} ] } -
{ "data": [ {"x": [1, 2, 3, 4, 5], "y": [5, 12.2, 13, 14, 14.5], "type": "scatter", "name": "Treatment 1"}, {"x": [1, 2, 3, 4, 5], "y": [8.2, 8.1, 12.3, 17.1, 17.2], "type": "scatter", "name": "Treatment 2"} ] } -
{ "data": [ {"x": [1, 2, 3, 4, 5], "y": [4.3, 6.4, 9, 14, 14.5], "type": "scatter", "name": "Treatment 1"}, {"x": [1, 2, 3, 4, 5], "y": [7.2, 10.8, 15.9, 22.1, 23], "type": "scatter", "name": "Treatment 2"} ] }
🔍 Type II Error & Power
- Type II Error (\(\beta\)): is the probability of failing to detect toxicity at any level when it exists.
- Power: is the probability of detecting the presence toxicity for at least one of the treatment levels if it exists.
\[Power = 1- \beta\]Higher power is desired in this context, since missing signs of toxicity could be dangerous. Dosage safety is paramount to future human subjects of the experiments.
🧪 Optional Code: Two-Way ANOVA (R)
In our “df_toxicity” dataframe, Y_concentration contains the toxicity measurement, Dosage contains the drug treatment groups (factor 1), and Age contains the age groups (factor 2).
The original work was performed in JMP, although here I provide the r code since it is open source, and so more easily accessible for most users. One can also use the proc GLM function in SAS to do the same. Follow the SAS documentation for easy implementation.
We use a generalized linear model function to perform the two-way ANOVA in a regression context.
The output:
\[\hat{Y} = \beta_o + {\beta}_1X_1 + {\beta}_2X_2 + \cdots + {\beta}_nX_n\]can be interperated as follows:
- \(\beta_0\) is the baseline, represents the mean effect of the treatment control group,(\(\tau_0\)) at age block 1.
- \(\beta_1\) repesents the mean effect of the second treatment group,(\(\tau_1\)) at age block 1 after including the treatment control. That is, the mean effect of the second treatment group at age block 1 is represented by \(\beta_0 + \beta_1\).
This interpretation however, is not particularly relevant since our goal is not prediction. Instead, we wish to determine whether the effects of any of the treatments is significant.
As such if significant a significant effect is detected, a natural follow-up would be to determine where the difference exists.
Two-way ANOVA model with no interaction
library(stats)
library(ggplot2)
library(dplyr)
# Example data frame format
df_toxicity = pd.read_csv("toxicity_data.csv")
twoway_lmodel <- lm(formula = Y_concentration ~ Dosage + Age, data = df_toxicity)
print(summary(twoway_lmodel))
Two-way ANOVA model with interaction
library(stats)
library(ggplot2)
library(dplyr)
twoway_interaction_lmodel <- lm(formula = Y_concentration ~ Dosage + Age + Dosage:Age, data = df_toxicity)
print(summary(twoway_interaction_lmodel))
Post-hoc test for multiple comparison
If the null hypothesis is rejected in favor of the alternate (that is, if toxicity is detected), we neewould need to perform a post-hoc analysis.
Depending on the application, it may be important to execute planned comparisons. We do this by defining contrast and ensuring that the defined constrast are orthogonal.
Performing all possible multiple comparisons can increase the probability of error, and lead to incorrect and sometimes contradicting conclusions.
Assuming the specified significance level (probability of rejecting a true null hypothesis), \(\alpha=0.05\). Say we choose to perform 5 other post-hoc comparisons, then the probability of making this error is no longer \(5\%\). Instead, it is:
\[P(error) = 1 - (1-0.05)^6 \approx 0.26\]which is about 26%.
multiple_comparison <- pairwise.t.test(df_toxicity$Y_concentration, df_toxicity$Dosage, p.adjust.method = 'bonferroni', conf.level=0.95)
print(multiple_comparison)
⚖️ Ethical Considerations
- Follow NIH guidelines for human subjects.
- For animal subjects, adhere to IACUC regulations.
- Use the minimum number of animals required for statistical power.
- Prioritize animal welfare—minimize pain and suffering throughout the study.
Source Check Notes
- Regulatory comparability and process-change assessments in biomanufacturing are framed in ICH Q5E guidance (internationally recognized benchmark for post-change comparability).
- NIST defines producer/consumer risks and OC-curve-based acceptance sampling interpretation in manufacturing QA: NIST/SEMATECH e-Handbook, 6.2.2.
- Power and Type I/II error interpretation aligned with standard biostatistical guidance: StatPearls overview.
Enjoy Reading This Article?
Here are some more articles you might like to read next: