Search code examples
rdrc

How to fit a Biphasic Dose Response Curve using R?


I am trying to process NanoBRET assay data to analyze competition between Ternary Complex (TC) formation and binary binding between Chimeric Targeted Molecule and weaker affinity interacting species using R. I could not locate the correct library function that helps perform the biphasic dose-response curve fit using the following formula. Can someone direct me to the appropriate R Library if available?

enter image description here

Concn   CompoundX   CompoundX
0.00001 0.309967    0.28848
0.000004    0.239756    0.386004
0.0000015   0.924346    0.924336
0.00000075  1.409483    1.310479
0.00000025  2.128796    2.007222
0.0000001   2.407227    2.371517
3.75E-08    2.300768    2.203162
1.63E-08    1.826203    1.654133
6.25E-09    0.978104    1.06907
2.5E-09 0.483403    0.473238
1.06E-09    0.235191    0.251971
4.06E-10    0.115721    0.114867
1.56E-10    0.06902 0.053681
6.25E-11    0.031384    0.054416
2.66E-11    0.023007    0.028945
1.09E-11    0.003956    0.020866

Plot generated in GraphPad PRISM using biphasic dose-response equation.

enter image description here


Solution

  • I needed to answer my questions by following further links in the article suggested by @I_O. Apparently the bell-shaped response curve which I thought looked more like the "bell-shaped" model described in the skimpy Prism documentation is precisely what the referenced article was calling "biphasic". See: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4660423/pdf/srep17200.pdf

    The R code to do the fitting is in the supplemental material referenced at https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4660423/#S1

    dput(dat)
    structure(list(Concn = c(1e-05, 4e-06, 1.5e-06, 7.5e-07, 2.5e-07, 
    1e-07, 3.75e-08, 1.63e-08, 6.25e-09, 2.5e-09, 1.06e-09, 4.06e-10, 
    1.56e-10, 6.25e-11, 2.66e-11, 1.09e-11), CompoundX = c(0.309967, 
    0.239756, 0.924346, 1.409483, 2.128796, 2.407227, 2.300768, 1.826203, 
    0.978104, 0.483403, 0.235191, 0.115721, 0.06902, 0.031384, 0.023007, 
    0.003956), CompoundX.2 = c(0.28848, 0.386004, 0.924336, 1.310479, 
    2.007222, 2.371517, 2.203162, 1.654133, 1.06907, 0.473238, 0.251971, 
    0.114867, 0.053681, 0.054416, 0.028945, 0.020866)), class = "data.frame", row.names = c(NA, 
    -16L))
    
    > m0<-drm(CompoundX~log(Concn), data = dat, fct = gaussian())
    > summary(m0)
    
    Model fitted: Gaussian (5 parms)
    
    Parameter estimates:
    
                    Estimate Std. Error  t-value   p-value    
    b:(Intercept)   2.031259   0.086190   23.567 9.128e-11 ***
    c:(Intercept)   0.012121   0.040945    0.296    0.7727    
    d:(Intercept)   2.447918   0.067136   36.462 7.954e-13 ***
    e:(Intercept) -16.271552   0.045899 -354.509 < 2.2e-16 ***
    f:(Intercept)   2.095870   0.195703   10.709 3.712e-07 ***
    ---
    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    
    Residual standard error:
    
     0.07894641 (11 degrees of freedom)
    > plot(m0, type = "all", col= "black", log = "")
    Warning message:
    In min(dose[dose > 0]) : no non-missing arguments to min; returning Inf
    

    enter image description here

    That Supplement goes on to compare a variety of model variations and constraints, so it should be read, digested and followed more closely than space permits here.