5

There's a nice explanation here of how to use ggplot2 to create a scatterplot, fit the data using nls, and plot the fit, all in one line, like so

myhist = data.frame(size = 10:27, counts = c(1L, 3L, 5L, 6L, 9L, 14L, 13L, 23L, 31L, 40L, 42L, 22L, 14L, 7L, 4L, 2L, 2L, 1L) )

ggplot(data=myhist, aes(x=size, y=counts)) + geom_point() + 
    geom_smooth(method="nls", formula = y ~ N * dnorm(x, m, s), se=F, 
    start=list(m=20, s=5, N=300)) 

My question is: using this construction, is it possible to pull out the actual nls object from that call? I'd like to know my coefficients, etc. Right now I can't figure out how to get them without doing a separate nls call.

Community
  • 1
  • 1
Drew Steen
  • 16,045
  • 12
  • 62
  • 90
  • 3
    in principle yes, but it's probably easier to do the separate `nls` call. – Ben Bolker Apr 24 '12 at 17:28
  • 2
    A [possible duplicate](http://stackoverflow.com/q/9789871/324364) illustrating @BenBolker 's point. – joran Apr 24 '12 at 17:30
  • 1
    Agreed. For more specific plot customizations, I almost always shift to generating my model fits + predictions separately. Here's another example where I use `ddply()` to compile the coefficients across different facets, and then annotate the plots. http://www.colbyimaging.com/wiki/statistics/longitudinal-data – John Colby Apr 24 '12 at 18:41
  • @joran: Perhaps it is not a duplicate, as MikeTP's question asks whether it is possible to extract the fitted values, which is possible, while here DrewSteen would like to extract the nls object, which is not (currently) possible. – jthetzel May 23 '12 at 21:13

1 Answers1

8

My question is: using this construction, is it possible to pull out the actual nls object from that call? I'd like to know my coefficients, etc.

This is currently not possible in ggplot2. The ggplot2 functions return predictions from the model, but not the model object itself. Thus, you cannot extract an nls object from the ggplot object to find the coefficients, etc.

There are two relevant discussions in the ggplot2 and ggplot2-dev mailing lists:

https://groups.google.com/d/topic/ggplot2/7tiUB2sjCxM/discussion

https://groups.google.com/d/topic/ggplot2-dev/dLGJnzIg4ko/discussion

Quick synopsis:

While many users have asked for the ability to extract statistics from ggplot objects, the developers are considering it but seem somewhat opposed. They would prefer users to use ggplot2 for visualization, and appropriate modelling functions to explore modelling parameters. However, Hadley supports the idea of implementing the ability to pass a model object to a ggplot() call. So, instead of trying to extract the nls object from your ggplot object, you would instead:

mod <- nls(y ~ N * dnorm(x, m, s), se = F, start = list(m = 20, s = 5, N = 300), 
        data = myhist)
ggplot(data = myhist, aes(x = size, y = counts)) + geom_point() + 
        geom_smooth(mod) 

That way, the model only needs to be called once, you can do anything you want to it, and you don't have to go searching through ggplot objects to find it. However, I don't know when or if this will be implemented.

jthetzel
  • 3,603
  • 3
  • 25
  • 38