Introduction
Why do we assume symmetry in our concentration-effect relationship?
I recently came across an article published by Piet Hein van der Graaf and Rik Schoemaker from 1999 on the use of asymmetry in concentration-effect curves.
“Analysis of asymmetry of agonist concentration–effect curves”: https://www.sciencedirect.com/science/article/pii/S105687199900026X
They make a valid point on an assumption we commonly do not investigate: a logistic or a Hill model assumes a symmetric relationship. However, is it really?
They analysed different concentration-effect curves with a1-adrenoceptor agonists in rat aorta and showed that a asymmetrical curve was able to better fit the data than the ‘standard’ symmetrical hill equation. So what does it mean to include asymmetry in a relationship?
Terminology
To understand asymmetry, it is important to know the following terminology:
Mid-point: also called the EC50, in which half of the effect is reached.
Inflection point: as wikipedia puts it, “a point on a continuous plane curve at which the curve changes from being concave (concave downward) to convex(concave upward), or vice versa”
Equations
I found out that one complicating factor in exploring and understanding asymmetry equations is that there are different parameterizations of the formula’s available. In this post I will use the parameterization as presented in:
Assessing the (a)symmetry of concentration-effect curves:empirical versus mechanistic models
Let’s start with a standard Hill equation, which we can rewrite as:

m= hill coefficient
xb (log10 [A]) = not named (EC50 in hill equation)
x = log10 [A]
Since this curve is symmetrical, the mid-point ánd the inflection point are equal.
We can use the Richards function (Richards, F. J. (1959). “A Flexible Growth Function for Empirical Use”. Journal of Experimental Botany. 10 (2): 290–300. doi:10.1093/jxb/10.2.290) to introduce asymmetry in our relationship with the parameter s.

In this equation, when s == 1, we return to the previous (symmetrical) Hill equation. In all other scenario’s, the concentration-effect relationship is asymmetrical.
We can calculate the mid-point (x50) and the inflection point (xi) using the following equations:


Application
Let’s use R to simulate some scenario’s with this Richards function! First define the previously described equations in R
# Richards equation E = a/((1+10^(m*(xb-x)))^s) # mid-point x50 = xb - (1/m)*log10(2^(1/s)-1) # Inflection point xi = xb + (1/m) * log10(s)
This will give us the effect (E) at different values for x, the mid-point (x50) and the inflection point (xi).
If we simulate a range of concentrations over multiple orders of magnitude (e.g. from 10-10 to 1010) and define our parameter objects, we can simulate the effect at these concentrations:
x<-seq(-10,10,length.out = 100) a <- 1 m <- 1 xb <- 0 s <- 0.5 # Richards equation E = a/((1+10^(m*(xb-x)))^s) # Mid-point x50 = xb - (1/m)*log10(2^(1/s)-1) # Effect at mid-point E50 = a/2 # Inflection point xi = xb + (1/m) * log10(s) # Effect at inflection point Ei = a/((1+10^(m*(xb-xi)))^s) # Data frame with C-E df<-data.frame(logC=x,E=E) # Data frame with mid-point and inflection point points <-data.frame(Point='Mid-point',x=10^x50,E=E50) row <-data.frame(Point='Inflection point',x= 10^xi,E=Ei) points <- rbind(points,row)
Remember that x equals the log10 of [A], which we can backtransform to [A].
We can now use ggplot2 to plot these results:
library(ggplot2) ggplot(df,aes(x=10^logC,y=E))+ geom_line() + theme_bw()+ xlab("Log10 [Concentration]")+ ylab('Effect')+ geom_point(data=points,aes(x=x,y=E,shape=Point),size=3)+ scale_shape_manual(values=c(1,3))+ scale_x_log10()

or in a case where s = 0.1

a=1, m= 1, xb=0, s=0.1
Asymmetry in PMX models
Due to the existence of asymmetrical curves in biology, it would be interesting to investigate asymmetrical concentration-effect relationships in population PK/PD models. The difference between the mid-point and the inflection point can give an indication on the severity of this asymmetry in the curve and whether, if at all, there is a significant difference with a parsimonious symmetrical relationship (EMAX/Hill).
Shiny simulations
We can create a very simple Shiny application to have an interactive interface to explore different parameter values:

ui.R
library(shiny) # Define UI for application that draws a histogram shinyUI(fluidPage( # Application title titlePanel("Asymmetry function simulation"), # Sidebar with a slider input for number of bins sidebarLayout( sidebarPanel( numericInput("a","Emax",min = 0,value = 1), numericInput("m","Hill coefficient",min = 0.1,value = 1), numericInput("xb","Log10 Xb",value = 0), numericInput("s","Asymmetry factor",min = 0.1,value = 1,step = 0.1), numericInput("min_C","Log10 minimal concentration",value = -10), numericInput("max_C","Log10 maximal concentration",min = 0,value = 10) ), # Show a plot of the generated distribution mainPanel( plotOutput("distPlot") ) ) ))
server.R
library(shiny) shinyServer(function(input, output) { c_range <- reactive({ x<-seq(input$min_C,input$max_C,length.out = 100) return(x) }) df <- reactive({ # Richards equation E = input$a/((1+10^(input$m*(input$xb-c_range())))^input$s) df<-data.frame(logC=c_range(),E=E) return(df) }) points <- reactive({ # Mid-point x50 = input$xb - (1/input$m)*log10(2^(1/input$s)-1) # Effect at mid-point E50 = input$a/2 # Inflection point xi = input$xb + (1/input$m) * log10(input$s) # Effect at inflection point Ei = input$a/((1+10^(input$m*(input$xb-xi)))^input$s) points <-data.frame(Point='Mid-point',x=10^x50,E=E50) row <-data.frame(Point='Inflection point',x= 10^xi,E=Ei) points <- rbind(points,row) return(points) }) output$distPlot <- renderPlot({ ggplot(df(),aes(x=10^logC,y=E))+ geom_line() + theme_bw()+ xlab("Concentration")+ ylab('Effect')+ geom_point(data=points(),aes(x=x,y=E,shape=Point),size=3)+ scale_shape_manual(values=c(1,3))+ scale_x_log10() }) })
Acknowledgments
I would like to thank Hadi Taghvafardfor his input on asymmetrical equations.
COMMENT
Any suggestions or typo’s? Leave a comment or contact me at info@pmxsolutions.com!