Installation with ggplot2, geom_smooth and nls

I am trying to fit data on an exponential decay function (RC system) with the equation:

RC

My data is on the following data frame:

dataset <- data.frame(Exp = c(4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6), t = c(0, 0.33, 0.67, 1, 1.33, 1.67, 2, 4, 6, 8, 10, 0, 33, 0.67, 1, 1.33, 1.67, 2, 4, 6, 8, 10, 0, 0.33, 0.67, 1, 1.33, 1.67, 2, 4, 6, 8, 10), fold = c(1, 0.957066345654286, 1.24139015724819, 1.62889151698633, 1.72008539595879, 1.82725412314402, 1.93164365299958, 1.9722929538061, 2.15842019312484, 1.9200507796933, 1.95804730344453, 1, 0.836176542548747, 1.07077717914707, 1.45471712491441, 1.61069357875771, 1.75576377806756, 1.89280913889538, 2.00219054189937, 1.87795513639311, 1.85242493827193, 1.7409346372629, 1, 0.840498729335292, 0.904130905000499, 1.23116185602517, 1.41897551928886, 1.60167656534099, 1.72389226836308, 1.80635095956481, 1.76640786872057, 1.74327897001172, 1.63581509884482)) 

I have 3 experimental (Exp: 4, 5, and 6) data that I want to put in each experiment using this equation.

I managed to do this for the experiment by a subset of my data and using the parameter calculated by nls

 test <- subset(dataset,Exp==4) fit1 = nls(fold ~ 1+(Vmax*(1-exp(-t/tau))), data=test, start=c(tau=0.2,Vmax=2)) ggplot(test,aes(t,fold))+ stat_function(fun=function(t){1+coef(fit1)[[2]]*(1-exp(-t/coef(fit1)[[1]]))})+ geom_point() 

2SzbW.png

But if I try to use the geom_smooth function directly in the complete data set with this code

 d <- ggplot(test,aes(t,fold))+ geom_point()+ geom_smooth(method="nls", formula='fold~1+Vmax*(1-exp(-t/tau))', start=c(tau=0.2,Fmax=2)) print(d) 

I get the following error:

 Error in model.frame.default(formula = ~fold, data = data, weights = weight) : variable lengths differ (found for '(weights)') In addition: Warning messages: 1: In min(x) : no non-missing arguments to min; returning Inf 2: In max(x) : no non-missing arguments to max; returning -Inf 

Is there something wrong with my syntax? I would work on this to use the same function in the dataset and use the group to have one level of correspondence for the Exp level.

+8
r ggplot2 curve-fitting
source share
1 answer

There are several problems:

  • formula is an nls parameter, and you need to pass it a formula object, not a symbol.
  • ggplot2 goes y and x to nls , not fold and t .
  • By default, stat_smooth attempts to obtain a confidence interval. It is not implemented in predict.nls .

In short:

 d <- ggplot(test,aes(x=t, y=fold))+ #to make it obvious I use argument names instead of positional matching geom_point()+ geom_smooth(method="nls", formula=y~1+Vmax*(1-exp(-x/tau)), # this is an nls argument, #but stat_smooth passes the parameter along start=c(tau=0.2,Vmax=2), # this too se=FALSE) # this is an argument to stat_smooth and # switches off drawing confidence intervals 

Edit:

After the main upgrade of ggplot2 to version 2 you need:

 geom_smooth(method="nls", formula=y~1+Vmax*(1-exp(-x/tau)), # this is an nls argument method.args = list(start=c(tau=0.2,Vmax=2)), # this too se=FALSE) 
+13
source share

All Articles