What’s a Toxic Unit anyway

Introduction

The Toxic Unit approach is a handy way of investigating the toxicity of individual contaminants in a mixture. At their simplest, they are a potency-normalised concentration. This is useful because it lets us consider the toxicity of different contaminants in a mixture on an equivalent scale.

Using toxic units is the equivalent of comparing EC10s, LC50s, etc. but in a mixture where more than one contmainant is having an effect. A handy overview is given at wikipedia.


A little example

Consider an experiment where two contaminants were expsoed singly and in a mixture to an organism. We measured the immobility (as percent of control) that * Treatment (as Factors) * “Response” (as a percent of control response) * “Cadmium” concentrations in the exposure * “Zinc”concentrations in the exposure

library(tidyverse)
library(drc)

data <- structure(list(Treatment = structure(c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
    3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("BB", "Cd", "Zn"), class = "factor"), 
    Response = c(100, 100, 100, 100, 100, 100, 75, 100, 63, 88, 100, 38, 0, 
        75, 25, 0, 88, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 88, 
        100, 50, 88, 88, 25, 38, 100, 100, 100, 100, 100, 100, 100, 100, 88, 
        88, 50, 88, 25, 50, 88, 25, 63, 25, 63), Cadmium = c(0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.4, 0.4, 0.4, 85.3, 85.3, 85.3, 
        210, 210, 210, 429.8, 429.8, 429.8, 869.7, 869.7, 869.7, 1765.9, 1765.9, 
        1765.9, 0.5, 0.5, 0.5, 7.5, 7.5, 7.5, 14.7, 14.7, 14.7, 29.9, 29.9, 
        29.9, 44.4, 44.4, 44.4, 98.1, 98.1, 98.1), Zinc = c(12, 12, 12, 73.6, 
        73.6, 73.6, 97.7, 97.7, 225.3, 225.3, 225.3, 817.1, 817.1, 817.1, 870.9, 
        870.9, 870.9, 9.7, 9.7, 9.7, 9.8, 9.8, 9.8, 7.9, 7.9, 7.9, 7.8, 7.8, 
        7.8, 9.3, 9.3, 9.3, 8.7, 8.7, 8.7, 23.5, 23.5, 23.5, 329.9, 329.9, 329.9, 
        647.7, 647.7, 647.7, 1279.5, 1279.5, 1279.5, 1911.4, 1911.4, 1911.4, 
        4077.3, 4077.3, 4077.3)), .Names = c("Treatment", "Response", "Cadmium", 
    "Zinc"), class = "data.frame", row.names = c(NA, -53L))
str(data)
## 'data.frame':    53 obs. of  4 variables:
##  $ Treatment: Factor w/ 3 levels "BB","Cd","Zn": 3 3 3 3 3 3 3 3 3 3 ...
##  $ Response : num  100 100 100 100 100 100 75 100 63 88 ...
##  $ Cadmium  : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Zinc     : num  12 12 12 73.6 73.6 ...

Zinc and Cadmium had different toxicities to our organism…

#subset the single-exposure data from the dataset and make it 'long'
#format with the function 'gather'

single.exposures<- data%>%
  filter(Treatment == "Cd" | Treatment == "Zn")%>%
  gather(key = "Metal", value = "Concentration", Cadmium:Zinc)
#run a 3-parameter log-logistic model and look at the EC50 values
models<- drm(data=single.exposures, Response~Concentration, Metal, fct=LL.3(fixed=c(NA, 100, NA)))
ED(models, 50)
## 
## Estimated effective doses
## 
##              Estimate Std. Error
## e:Cadmium:50  2143.57     978.38
## e:Zinc:50      605.23     192.46

In the mixture (Treatment = BB), we can see both Cd and Zn concentrations but how can we compare them to investigate their relative contribution to mixture toxicity when they have different single-metal toxicities?

As you can see, both metals look to have a good dose-relationship with toxiciy, despite them having very different concentrations. Based on this, we can’t work out which is contributing to the toxicity.

So we can standardise the concentrations to the potency of the metal, like their EC50s. This way we know that 1 TU = 50% toxicity and we can add the contributions from the individual metals:

data$Cd.TU<- data$Cadmium/ 2143.57
data$Zn.TU<- data$Zinc/605.23
data$Sum.TU<- (data$Cd.TU+data$Zn.TU)

data%>%filter(Treatment == "BB")%>%
  ggplot()+
  geom_point(aes(x=Sum.TU, y= Response), shape = 23, fill = "black")+
  scale_y_continuous(limits=c(0,120), breaks=c(0,10,50,90,100))+
  theme_bw()+
  scale_x_log10()

Using this approach, we can investigate whether or not we’re seeing mixture interactivity. Does the combination of contaminants create MORE toxicity than expected (aka synergism), LESS toxicity than expected (aka antagonism), or about the toxicity expected (aka non-interactivity / additivity)?

If the EC50_TU of the mixture is <1, it can be said to be synergistic (because it takes a lower concentration of contaminants to cause a 50% effect than when they are exposed singly)

If the EC50_TU of the mixture is >1, it can be said to be antagonistic (because it takes a greater concentration of contaminants to cause a 50% effect than when they are exposed singly)

If the EC50_TU of the mixture is =1, it is non interactive.

mixture.data<- data %>% filter(Treatment == "BB")
mixture.model<- drm(data= mixture.data, Response~Sum.TU, fct=LL.3(fixed=c(NA, 100, NA))) 
ED(mixture.model, 50)
## 
## Estimated effective doses
## 
##        Estimate Std. Error
## e:1:50   4.7183     1.5381
plot(mixture.model)

As we can see EC50_TU = 4.7 so the mixture can be said to be antagonistic.

This is one of the simplest ways to assess mixture toxicity. More complicated measures use the single metal toxicity model parameters in a bigger model to directly calculate expected toxicities. These can then be compared to observed toxicities (see Hochmuth et al. 2014 or Koppel et al. 2018).