-1

I am trying to fit michaelis menten equation to a dataset to determine rate of disappearance as well as IC50 (Km) if data permits. I am getting good fit except the first point at concentration 0, however, I am getting negative value of Km, which is not correct. I am using the following code.

x <- c(0, 2.5, 5.0, 10.0, 25.0)
y <- c(4.91, 1.32, 1.18, 1.12, 1.09)

#########################Fit General Michaelis Menten Equation########################################################          


model.mm <- nls(y ~ (Vmax*x/(Km+x)), data = data.frame(x,y), 
                 start = list(Km=max(y)/2, Vmax = max(y)))
print(summary(model.mm))

#plot it
plot(y~x, type="p", lwd=2,
     xlab="Lopinavir Concentrations (uM)", ylab="Efflux Ratio")
title("Lopinavir Transport in MDCK-MDR1 Cells")
lines(fitted(model.mm)~x, col="red")

enter image description here

Any suggestions for improving the fit and parameter estimates will be very appreciated.

thanks, Krina

Krina M
  • 135
  • 2
  • 13

2 Answers2

0

The Michealis Menten Hyperbola of xlab = Substrate Concentration and ylab = Velocity usually looks like a rising hyperbola to a maximum. The parameters which you are measuring look like an exponential decay as the substrate concentration increases. I'm not sure the Michealis Menten Equation works so well here. Also you shouldn't be using the lines function. It doesn't give you a curve. You should be using the curve function.

x <- c(0, 2.5, 5.0, 10.0, 25.0) y <- c(4.91, 1.32, 1.18, 1.12, 1.09) mm <- data.frame(x, y)

I think you should make the dataframe before you call it into a function.

model.mm <- nls(y ~ Vmax*x / (Km + x), data = mm, start = list(Km = max(mm$y)/2, Vmax = max(mm$y)))

plot(y ~ x, type = "p", lwd = 2, xlab = "Lopinavir Concentrations (uM)", ylab = "Efflux Ratio", pch = 16, main = "Lopinavir Transport in MDCK-MDR1 Cells")

summary(model.mm)

Formula: y ~ Vmax * x/(Km + x)

Parameters: Estimate Std. Error t value Pr(>|t|) Km -0.4772 6.6246 -0.072 0.947 Vmax 1.0678 2.1382 0.499 0.652

Residual standard error: 2.835 on 3 degrees of freedom

Number of iterations to convergence: 4 Achieved convergence tolerance: 6.634e-06

Now I think the curve function is pretty self explanatory:

?curve

curve(x * 1.0678 / (x + -0.4772), col = "red", lwd = 2, add = TRUE)

enter image description here

fx <- function(x){x * 1.0678 / (x + -0.4772)}

range(x) 1 0 25

We can integrate this Michealis-Menten FUnction and calculate area under curve:

require(pracma)

integrate(fx, lower = 0, upper = 25) Error in integrate(fx, lower = 0, upper = 25) : the integral is probably divergent

This divergence is because you plot looks a lot like y = (1 / x) which is divergent.

If you push x a little bit away from zero, where y tends to infinity we can get a finite answer.

integrate(fx, lower = 0.5, upper = 25) 29.71809 with absolute error < 0.00069

but this integral is questionable for divergence reasons.

You can estimate the area under your scatterplot points using the trapezoidal approximation for integration:

trapz(mm$x, mm$y) 1 33.2375

Note: I tried fitting exponential functions to your plot but that doesn't work. The curve drops too fast missing most of the points.

I think I figured out what's wrong with your function.

Type: y = (x * v) / (x + K)

into https://www.desmos.com/calculator

and see what happens when you make K negative and K - positive, and when you make both K and v negative, etc.

Adjusting the sliders

xyz123
  • 651
  • 4
  • 19
0

Thank you for your help, really appreciated.

I was able to resolve this by using hill equation.

fo <- y ~ (Vmax*x^hill/((VC50^hill) + (x^hill)))
st <- c(Vmax=0.5, hill=1, VC50=0.3)

model.hill <- nls(fo, data = data.frame(x,y), start = st)
print(summary(model.hill))
co <- coef(model.hill)

plot(y~x, type="p", lwd=2,
     xlab="Lopinavir Concentrations (uM)", ylab="Efflux Ratio")
title("Lopinavir Transport in MDCK-MDR1 Cells")
lines(fitted(model.hill)~x, col="red")
Krina M
  • 135
  • 2
  • 13