如何使用方法=" nlsLM" (在包minpack.lm中)在geom_smooth中

时间:2017-08-31 00:52:34

标签: r methods ggplot2 nls

test <- 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))

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
          method.args = list(start=c(tau=0.2,Vmax=2)), # this too
          se=FALSE)

我在这个网站上找到了代码,但我想知道如何在geom_smooth中将method="nls"更改为method = "nlsLM",就像原来的&#34; nls&#34;设置起始值时,对我来说确实是个大问题。 有没有办法在ggplot2中的geom_smooth方法中使用来自cran的包? 感谢

3 个答案:

答案 0 :(得分:2)

你似乎没有尝试任何东西。你可以简单地做到这一点:

library(ggplot2)
library(minpack.lm)
d <- ggplot(test,aes(x=t, y=fold))+ 
  geom_point()+
  geom_smooth(method="nlsLM", 
              formula=y~1+Vmax*(1-exp(-x/tau)), 
              method.args = list(start=c(tau=0.2,Vmax=2)), 
              se=FALSE)
print(d)
#works

请注意,收敛问题没有简单的“一刀切”解决方案。有时minpack可以提供帮助,但是在nls帮助抛出错误的情况下,它通常会让你感觉不合适。

答案 1 :(得分:1)

最好将nls结果保存在单独的数据框中,并分别绘制两个项目:

ggplot() + 
    geom_point(aes(x=t, y=fold), data = test) + 
    geom_line(aes(...), data = my.nls.results)

答案 2 :(得分:0)

改用 geom_line()

例如,假设您正在使用 mtcars 并且您的公式为 mpg ~ k / wt + b

nls_model <- nls(mpg ~ k / wt + b, data, etc.)

ggplot(...) +
geom_line(stat = "smooth",
          method = "nls",
          formula = y ~ k / x + b,
          method.args = list(start = as.list(coef(nls_model))),
          se = FALSE)

即使使用 nlsLM 这也对我有用。 coef(nls_model) 背后的想法也是使用您成功模型的系数作为 geom_line 中的起始值,以便您获得相同的模型。只需确保在 y 内的公式中使用 xgeom_line