[R] nls() and lines()

David Winsemius dwinsemius at comcast.net
Mon Jul 18 18:51:56 CEST 2011


On Jul 18, 2011, at 10:13 AM, Steven Ranney wrote:

> Unfortunately, the transposition of lines and list was a typo on my
> part.  Now that I look like a fool and have corrected the issue, I'm
> still faced with the same dilemma.  With the original data set I
> posted in this thread,

No. You did not give us a dataset in the sense that the word  
"reproducible" implies when used in the tag-line of r-help. You gave  
us a console print representation. Considerable ambiguity remains. Had  
you posted dput(data_object) , or if you had responded constructively  
to Ehler's suggesting to post str() output, we might not have wasted  
all this time guessing.

>
> plot(mpg~x, data=mileage[year==2009,], ylab="Miles per gallon",
> xlab="2009", yaxs="i", ylim=c(10,30))
> nls.2009 <- nls(mpg~(alpha*(as.numeric(x)^2))+(bravo*as.numeric(x))+ 
> (charlie),

After noting your error below .... I don't think the naming of terms  
in the internal processing will carry along the "as.numeric" function  
to the final names of the terms. And furthermore why would input to  
nls not already _be_ numeric? You aren't dealing with a factor object  
are you? In that case you are not making the conversion correctly and  
you need to read the FAQ on the topic of factor conversion.

> data=mileage[year==2009,], start=list(alpha=-2e-14, bravo=5e-5,
> charlie=-31407),
>  trace=T, na.action=na.omit,  
> nls.control(minFactor=0.000000000000000000001))
> plot(mpg~x, data=mileage[year==2009,])
>  modb=seq(min(as.numeric(x)), max(as.numeric(x)), by=10000)#; modb
>  lines(modb, predict(nls.2009, list(as.numeric(x) = modb)))

Sometimes I worry that I am starting to view the printed word exactly  
as my R parser would. That looks ... just wrong. How do you expect  
this to be parsed:

list(as.numeric(x) = modb)

The name of the list item in the result would be ... what?   
`as.numeric(x)`? That could be a real mess. Fortunately, an error is  
thrown.

> The last line returns the following error:
>
> Error: unexpected '=' in "  lines(modb, predict(nls.2009,  
> list(as.numeric(x) ="
>
> I've tried putting in modb as the "newdata" in the predict()
> statement,

.... but you don't offer the code?

> but I end up with
>
> Error in xy.coords(x, y) : 'x' and 'y' lengths differ

So we have not way of commenting on that error, now, do we?

-- David.

>
> SR
> Steven H. Ranney
>
>
>
> On Mon, Jul 18, 2011 at 7:52 AM, Peter Ehlers <ehlers at ucalgary.ca>  
> wrote:
>> On 2011-07-18 06:38, Steven Ranney wrote:
>>>
>>> Provided, of course, that I alter the lines for different data sets
>>> and data frames, the code to plot a line derived from nls() onto a
>>> plot works with no problems.
>>>
>>> Here's an example:
>>>
>>> Year NOP
>>> 2002   6
>>> 2003   8
>>> 2004  11
>>> 2005  19
>>> 2006  26
>>> 2007  25
>>>
>>> mod1<- nls(NOP~alpha*exp(beta*Year), data=aic,
>>> start=list(alpha=1e-278, beta=0.3205), trace=T,
>>> nls.control(maxiter=30000, minFactor=0.000005))
>>> plot(NOP~Year, data=aic, pch=19, ylab="Number of papers")
>>> mod1a=seq(2002, 2007, by=.0001)
>>> lines(mod1a, predict(mod1, list(Year = mod1a)))
>>
>> Yes, but here's what you posted as your 'last line of code':
>>
>>  lines(modb, predict(nls.2009, lines(as.numeric(x)=modb)))
>>
>> Perhaps just a typo: lines -> list???
>> In any case, the newdata in predict should have a variable 'Year'.
>>
>> Peter Ehlers
>>
>>>
>>> I've been using this code for several years not to get models from
>>> nls() onto plot and I've never had an issue with it until the  
>>> dataset
>>> I referenced in my initial email.
>>>
>>> Thanks for your assistance.
>>>
>>> SR
>>>
>>> Steven H. Ranney
>>>
>>> http://www.steven-ranney.com
>>> http://stevenranney.blogspot.com
>>>
>>>
>>> On Mon, Jul 18, 2011 at 2:55 AM, Peter Ehlers<ehlers at ucalgary.ca>   
>>> wrote:
>>>>
>>>> On 2011-07-17 17:37, Steven Ranney wrote:
>>>>>
>>>>> All -
>>>>>
>>>>> I'm having an issue with trying to plot a model derived from nls()
>>>>> onto a simple plot.  I have included a sample data set and the  
>>>>> code
>>>>> that I've been using.
>>>>>
>>>>>    year month day       date location mileage  cost gallon       
>>>>> cpg
>>>>>   mpg          x
>>>>> 2009     1   4   1/4/2009      BZN  124585 19.39  14.37 1.349339
>>>>> 10.71677 2009-01-04
>>>>> 2009     1  15  1/15/2009      BZN  124888  23.2  16.12 1.439206
>>>>> 18.79653 2009-01-15
>>>>> 2009     1  27  1/27/2009      BZN  125133 21.51  14.35 1.498955
>>>>> 17.07317 2009-01-27
>>>>> 2009     2  16  2/16/2009      BZN  125429 27.96  15.54 1.799228
>>>>> 19.04762 2009-02-16
>>>>> 2009     2  27  2/27/2009      BZN  125702 26.82  14.27 1.879467
>>>>> 19.13104 2009-02-27
>>>>> 2009     3  19  3/19/2009      BZN  125941 24.38  12.91 1.888459
>>>>> 18.51278 2009-03-19
>>>>> 2009     4   9   4/9/2009      BZN  126260 32.59  16.30 1.999387
>>>>> 19.57055 2009-04-09
>>>>> 2009     4  28  4/28/2009      BZN  126587 34.58  16.79 2.059559
>>>>> 19.47588 2009-04-28
>>>>> 2009     5  17  5/17/2009      BZN  126925 35.78  16.57 2.159324
>>>>> 20.39831 2009-05-17
>>>>> 2009     5  27  5/27/2009      BZN  127240 35.57  15.01 2.369753
>>>>> 20.98601 2009-05-27
>>>>> 2009     6   7   6/7/2009      BZN  127590 40.99  16.60 2.469277
>>>>> 21.08434 2009-06-07
>>>>> 2009     6  21  6/21/2009      BZN  127910 41.52  15.64 2.654731
>>>>> 20.46036 2009-06-21
>>>>> 2009     7  21  7/21/2009      BZN  128264 43.37  16.67 2.601680
>>>>> 21.23575 2009-07-21
>>>>> 2009     8  11  8/11/2009      BZN  128618 42.68  16.42 2.599269
>>>>> 21.55907 2009-08-11
>>>>> 2009     8  27  8/27/2009      BZN  128947 43.12  16.60 2.597590
>>>>> 19.81928 2009-08-27
>>>>> 2009     9  21  9/21/2009      BZN  129255 40.44  15.56 2.598972
>>>>> 19.79434 2009-09-21
>>>>> 2009    10   1  10/1/2009      BZN  129541 38.55  14.83 2.599461
>>>>> 19.28523 2009-10-01
>>>>> 2009    10  11 10/11/2009      BZN  129806 36.65  14.10 2.599291
>>>>> 18.79433 2009-10-11
>>>>> 2009    10  22 10/22/2009      BZN  130027 30.18  11.61 2.599483
>>>>> 19.03531 2009-10-22
>>>>> 2009    11   9  11/9/2009      BZN  130358 43.19  16.62 2.598676
>>>>> 19.91576 2009-11-09
>>>>> 2009    11  22 11/22/2009      BZN  130631 39.23  15.09 2.599735
>>>>> 18.09145 2009-11-22
>>>>> 2009    12   5  12/5/2009      BZN  130950 44.43  17.09 2.599766
>>>>> 18.66589 2009-12-05
>>>>> 2009    12  30 12/30/2009      BZN  131239 42.14  16.70 2.523353
>>>>> 17.30539 2009-12-30
>>>>>
>>>>> After converting my dates into R-usable dates:
>>>>>
>>>>> #convert my dates to R-usable dates
>>>>> x<- strptime(date, format="%m/%d/%Y")
>>>>> x
>>>>> mileage<- cbind(mileage, x)
>>>>>
>>>>> I plot the data and model mpg as a function of date.  In the nls()
>>>>> statement, I convert x back to a numeric value so that I can  
>>>>> conduct
>>>>> the regression:
>>>>>
>>>>> plot(mpg~x, data=mileage[year==2009,], ylab="Miles per gallon",
>>>>> xlab="2009", yaxs="i", ylim=c(10,30))
>>>>> nls.2009<-
>>>>> nls(mpg~(alpha*(as.numeric(x)^2))+(bravo*as.numeric(x))+(charlie),
>>>>> data=mileage[year==2009,], start=list(alpha=-2e-14, bravo=5e-5,
>>>>> charlie=-31407),
>>>>>   trace=T, na.action=na.omit,
>>>>> nls.control(minFactor=0.000000000000000000001))
>>>>> plot(mpg~x, data=mileage[year==2009,])
>>>>>   modb=seq(min(as.numeric(x)), max(as.numeric(x)), by=10000)
>>>>>   lines(modb, predict(nls.2009, lines(as.numeric(x)=modb)))
>>>>>
>>>>> Unfortunately, when I run the final line of this code, I get the
>>>>> following:
>>>>>
>>>>> Error: unexpected '=' in "  lines(modb, predict(nls.2009,
>>>>> lines(as.numeric(x)="
>>>>>
>>>>> In other similar analyses, I've been able to plot an nls() model  
>>>>> using
>>>>> this exact code--altered of course according to information--but  
>>>>> here
>>>>> I'm at a loss.  I'm certain it has something to do with the
>>>>> lines(...as.numeric(x)) value I'm trying to plot, but I can't  
>>>>> figure
>>>>> out what I'm doing wrong.
>>>>
>>>> That last line of code doesn't look right to me. The arguments
>>>> that you need to supply to predict() are 'object' and 'newdata',
>>>> where 'newdata' must have the appropriate form. Unless you have
>>>> your own function lines(), I don't think that  
>>>> lines(as.numeric(x)=modb)
>>>> would qualify as newdata.
>>>>
>>>> It's usually a bad idea to shove too much stuff into a single  
>>>> command
>>>> and a good idea to use str() often.
>>>>
>>>> This 'exact' code worked in the past?
>>>>
>>>> Peter Ehlers
>>>>
>>>>>
>>>>> The model is fine, but it's the plotting of the model that  
>>>>> escapes me.
>>>>>
>>>>> I'm running R version 2.12.1 on a Windows 7 machine.
>>>>>
>>>>> Thanks for your help -
>>>>>
>>>>> Steven H. Ranney
>>>>>
>>>>> http://stevenranney.blogspost.com
>>>>> http://www.steven-ranney.com
>>>>>
>>>>> ______________________________________________
>>>>> R-help at r-project.org mailing list
>>>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>>>> PLEASE do read the posting guide
>>>>> http://www.R-project.org/posting-guide.html
>>>>> and provide commented, minimal, self-contained, reproducible code.
>>>>
>>>>
>>
>>
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

David Winsemius, MD
West Hartford, CT



More information about the R-help mailing list