# Is there a way to calculate LC50 from a continuous dependent variable?

I'm very new to R and also statistics, so the basics are lost on me. In the past I have done some simple experiments with chemicals and calculating the LC50 from binary responses (dead or alive). However, this time, I must calculate the LC50 from continuous response variables; for example: toxicant concentrations (independent variable) by absorbance values of a metabolic compound (continuous dependent variable). How do I go about doing this? I need to obtain the LC50 to be able to perform sublethal tests with the toxicants.

I've read around I'm not sure if it's a good idea to normalise these values as a percentage of the untreated control group then do a regression because of potential information loss(?)

I'll appreciate any suggestions and insight.

EDIT1: Thanks for the responses. Honestly I am even more confused now as I don't understand how to perform these tasks or what I am doing wrong when I attempt it in R. I've tried @Ben Bolker's suggestion and got a negative xmid. Forgive me if the format is not correct but here is a direct copy of the code I used and bit more information about the data: I have 6 test concentrations from 0 up to 200 mg/L and 18 observations per treatment (n=3).

I entered the following lines of code:

plot(PU$Concentration, PU$fluorescence, xlab="Concentration", ylab="fluorescence",col="green", pch=19, cex=2)

testmodel<-nls(fluorescence~SSlogis(Concentration,Asym,xmid,scal), data=PU) summary(testmodel)

This was the output:

_Formula: fluorescence ~ SSlogis(Concentration, Asym, xmid, scal)

Parameters: Estimate Std. Error t value Pr(>|t|) Asym 1319849.9 2757240.6 0.479 0.633 xmid -106.6 711.0 -0.150 0.881 scal -192.9 151.6 -1.272 0.206

Residual standard error: 98540 on 105 degrees of freedom

Number of iterations to convergence: 0 Achieved convergence tolerance: 4.008e-06_

How would one interpret this? How can the xmid be negative?

• These are statistical questions, not programming questions. It would be better to ask at Cross Validated instead; that's where statistical questions are on topic. Commented Aug 6 at 13:00
• if you do something like nls(response ~ SSlogis(dose, Asym, xmid, scal), data = ...) the xmid parameter should be your LC50 value. Commented Aug 6 at 13:35
• As I suspected, even at the highest concentration you have a highly positive fluorescence value. The SSlogis() function, however, assumes that there is a 0 asymptotic value at high concentrations. Thus it won't fit your data properly. In a comment on my answer, @BenBolker noted a SSfpl() function that can work with a non-0 limiting value. The increase in fluorescence between a concentration of 0 and the lowest non-0 concentration might be hormesis, which would require the more complex models provided by the drc package I linked in my answer.
– EdM
Commented Aug 29 at 2:24
• I just tried using nls() (on values from your plot )with the 4-parameter logistic fit SSfpl() instead of SSlogis() to allow for a non-zero asymptote at high concentrations. That seemed to work fine. The drc package has a similar LL.4() function to use with its drm() fitting function. The syntax in drc is a bit awkward, but worth learning if you will be doing this a lot. The drc package also has functions that will fit hormesis, for example BC.5() that allows for both hormesis and a non-zero asymptote. Both of those functions in drc also work on the data in your plot.
– EdM
Commented Aug 29 at 2:54
• Hi. I've just attempted the nls() with the SSfpl() logistic fit and I keep getting this error: testmodel<-nls(fluorescence~SSfpl(Concentration,Asym,xmid,scal), data=PU) Error in SSfpl(Concentration, Asym, xmid, scal) : argument "scal" is missing, with no default So I changed the scal to 200,000 (I didn´t know what number to put as I didn't understand the language of the help guide) and it returned a similar error but this time for xmid Error in SSfpl(Concentration, Asym, xmid, scal = 5e+05) : argument "xmid" is missing, with no default
– Gabb
Commented Aug 30 at 9:07

What you describe is a concentration-response curve, curves that in my experience more typically involve continuous rather than binary (alive/dead) outcomes. With a continuous response/outcome the value you seek is typically called "IC50" (concentration for 50% inhibition) or "EC50" (concentration for 50% effect) rather than the "LC50" (concentration for 50% lethality) that better describes alive/dead outcomes.

A typical best practice is to fit all the data, in your case absorbance versus toxicant concentration, with a nonlinear least squares regression model that captures the underlying dynamics. Then estimate the concentration at which the absorbance is half way between the model's estimates of the lower and upper asymptotes. If your lower asymptote is necessarily 0 and a simple logistic model is appropriate, then Ben Bolker's suggestion of a simple 3-parameter nls() model with a SSlogis() equation form might be OK.

If this is something like the MTT assay, however, there's a chance that there will be positive absorbance even when all the cells have died. Then you need to model both the upper and lower asymptotes. Also, depending on the way the toxicant affects cell metabolism or death, a simple logistic model might not capture the curve between the asymptotes if there is an asymmetry around the midpoint.

There is a drc package in R that handles many forms of dose-response curves. For example, it can fit a 5-parameter logistic model that models both the asymptotes and the asymmetry, or a model that handles hormesis, a biphasic concentration-response curve that can occur in practice when small doses of a "toxicant" might actually increase metabolism. Using this package takes some care, however, as fitting a nonlinear regression only works reliably if you have good starting estimates for the model parameters.

A common beginner's mistake is just to submit the data to the software without looking at the concentration-response curve carefully, first. Always plot the data. Always look at how well the model fits.

There are additional biological considerations you should know about: the IC50 in an MTT-type assay doesn't always measure what you think it does. A review in Int. J. Mol. Sci. 2021, 22(23), 12827 discusses those matters, off-topic on this site.

• FWIW R also has a SSfpl function which fits a self-starting four-parameter logistic model (addressing your concern about the lower asymptote being different from 0 ...) Commented Aug 6 at 22:08