Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error with pred$fit using nls in ggplot2

Tags:

r

ggplot2

So Im using nls in ggplot2 to plot a power curve code is below:

mass <- c(4120,4740,5550,5610,6520,6870,7080,8500,8960,10350,10480,10550,11450,11930,12180,13690,13760,13800,14050,14700,15340,15790,15990,17300,18460,18630,18650,20050,23270,24530,25030,27540,28370,33460,33930,34450,34500)

solv_acc <- c(2760,2990,2990,3180,3900,4010,4140,4680,4750,5330,4980,5860,5930,5570,5910,6790,6690,7020,6240,6620,6600,6860,7940,7600,8250,8530,7410,9160,9140,10300,10440,10390,11020,12640,11920,12110,12650)

df <- data.frame(Mass=log(mass),Solv=log(solv_acc))

plotter <- (ggplot(df, aes(x=Mass, y=Solv)) + geom_point(shape=1) + stat_smooth(method = "nls", formula = y~i*x^z, start=list(i=1,z=0.2)))
plotter <-  plotter + labs(x = "Mass kDa" ,y = "Solvent Accessibility")
print(plotter)

Running the above code I get the following error:

Error in pred$fit : $ operator is invalid for atomic vectors

I am assuming the error occurs when it tries to use predict()?

When I perform nls without the use of ggplot2 on the same data frame I do not get an error

> nls1=nls(Solv~i*Mass^z,start=list(i=1,z=0.2),data=df)
> predict(nls1)
 [1] 7.893393 7.997985 8.115253 8.123230 8.234519 8.273135 8.295350 8.429871 8.468550 8.574147 8.583270 8.588134 8.647895 8.677831 8.692939 8.777944 8.781648 8.783757 8.796793 8.829609
[21] 8.860502 8.881445 8.890558 8.947512 8.994380 9.000995 9.001769 9.053953 9.161073 9.198919 9.213390 9.281841 9.303083 9.420894 9.430834 9.441670 9.442703

Can anyone point out why I am getting the error?

like image 859
Harpal Avatar asked Dec 12 '12 13:12

Harpal


People also ask

How to extract coefficients from NLS fit in ggplot2?

5 Extract coefficients from ggplot2-created nls fit 1 Plot a smooth and extrapolated curve using an nls model with several fitted parameters 1 Combine nls function in geom_smooth with ggplot2

How to use NLS with ggplot2 and Geom_smooth?

5 Extract coefficients from ggplot2-created nls fit 1 Plot a smooth and extrapolated curve using an nls model with several fitted parameters 1 Combine nls function in geom_smooth with ggplot2 3 geom_smooth gives different fit than nls alone

How get plot from NLS in R?

How get plot from nls in R? 5 Extract coefficients from ggplot2-created nls fit 1 Plot a smooth and extrapolated curve using an nls model with several fitted parameters 1 Combine nls function in geom_smooth with ggplot2

How do I plot fitted lines in ggplot2?

The geom_smooth () function in ggplot2 can plot fitted lines from models with a simple structure. Supported model types include models fit with lm (), glm (), nls (), and mgcv::gam (). Fitted lines can vary by groups if a factor variable is mapped to an aesthetic like color or group.


1 Answers

Your question is answered in this question on the ggplot2 mailing list. Briefly,

According to the documentation for predict.nls, it is unable to create standard errors for the predictions, so that has to be turned off in the stat_smooth call. .

So, we need to turn off the standard errors:

ggplot(df, aes(x=Mass, y=Solv)) +
  stat_smooth(method="nls", formula=y~i*x^z, se=FALSE, 
              start=list(i=1,z=0.2)) +
  geom_point(shape=1) 

Update 2019: for new versions of ggplot2, we need the start argument to nls to be passed like this:

ggplot(df, aes(x = Mass, y = Solv)) +
  stat_smooth(method = "nls", 
              se = FALSE,
              method.args = list( 
                formula = y ~ i*x^z, 
                start = list(i=1, z=2)
              )) +
  geom_point()
like image 133
csgillespie Avatar answered Oct 02 '22 15:10

csgillespie