In drc() package, drm fct = L.4 finds wrong intercept parameters, even though the graph is right

418 Views Asked by At

I have a problem with the following code. It calculates the drc curve correctly, but the ec50 wrongly, although the are closely related...

    x <- c(-1, -0.114074, 0.187521, 0.363612, 0.488551, 0.585461, 0.664642, 0.730782, 0.788875, 0.840106, 0.885926, 0.92737, 0.965202, 1)
    y <- c(100, 3.978395643, 0.851717911, 0.697307565, 0.512455497, 0.512455497, 0.482273052, 0.479293487, 0.361024717, 0.355324864, 0.303120838, 0.286539832, 0.465692047, 0.358045152)
    
    mat <- cbind(x, y)
    df <- as.data.frame(mat)

      calc <- drm(
        formula = y ~ x,
        data = df,
        fct = L.4(names = c("hill", "min_value", "max_value", "ec50"))
      )
      
      plot <- ggplot(df, aes(x=x, y=y), color="black") +
        geom_point() +
        labs(x = "x", y = "y") +
        theme(
          axis.title.x = element_text(color="black", size=10),
          axis.title.y = element_text(color="black", size=10),
          axis.line.x = element_line(color = "black"),
          axis.line.y = element_line(color = "black")
        ) +
        stat_smooth(
          formula = y ~ x,
          method = "drm", color="black",
          method.args = list(fct = L.4(names = c("hill", "min_value", "max_value", "ec50"))),
          se = FALSE
           ) +
        theme(panel.background=element_rect(fill="white"))+
        ylim(0, NA) 
      
     ec50 <- ED(calc,50)
      
  print(ec50)
  print(calc)
  print(plot)

This is the graph I obtain: enter image description here

But if I print the parameters of the function L.4, I have the following result:

    hill:(Intercept)       6.3181 
    min_value:(Intercept)  0.3943 
    max_value:(Intercept)  111.0511  
    ec50:(Intercept)       -0.6520 

max_value:(Intercept) is obviously wrong (it has to be 100), and, as a consequence, ec50 is wrong too.

I would also add that for other sets of data, the min_value:(Intercept) is wrong too (with values < 0...)

I cannot find the mistake, because the graph derived from the same function L.4 shows the right values.

Thank you very much for your help!

1

There are 1 best solutions below

1
On

The upper asymptote in your case assumes a symmetrical curve (due to 4PL fitting). Meaning that both bottom and upper asymptote have the same inflection. Your data might max out at 100 but the formula calculates the upper asymptote further than 100 (111) because that's where the actual asymptote lies, not the end of your data.

So the graph is based on your data, but the estimated parameters forces a symmetrical curve to fit it, and your asymptote increases. This will also shift the EC50.