Error with pred$fit using nls in ggplot2

2020-02-12 04:52发布

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?

标签: r ggplot2
1条回答
成全新的幸福
2楼-- · 2020-02-12 05:19

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()
查看更多
登录 后发表回答