[R] Lattice: raw data and prediction of a non linear fitted function

Duncan Mackay dulcalma at bigpond.com
Thu Aug 6 06:23:55 CEST 2015


Sending again as I pressed the wrong button

Hi

Your model is overfitted for the number of points - the fitted values bear
no resemblance to a line fitting the data - ?too many x values to properly
predict
? splines etc
 library(locfit)
?locfit
If you want coefs of sort.

You have to do a nls on each group to get the values. 
You have 2 ways to do this 
1 do nls and predict y values separately as below an plot them in a panel
function
2 do nls and predict within the panel function 

> res_nlsA <-
+ nls(y ~ SSgompertz(time, Asym = 100, b2, b3), data = subset(foo, char ==
"A"),
+     start = list( b2 = c(7,7), b3 = c(0.9, 0.9)))
There were 50 or more warnings (use warnings() to see the first 50)
> res_nlsA
Nonlinear regression model
  model: y ~ SSgompertz(time, Asym = 100, b2, b3)
   data: subset(foo, char == "A")
   b21    b22    b31    b32 
4.6761 7.6280 0.9111 0.9000 
 residual sum-of-squares: 10.59

Number of iterations to convergence: 32 
Achieved convergence tolerance: 8.001e-06
> res_nlsB <-
+ nls(y ~ SSgompertz(time, Asym = 100, b2, b3), data = subset(foo, char ==
"B"),
+     start = list( b2 = c(7,7), b3 = c(0.9, 0.9)))
> res_nlsB
Nonlinear regression model
  model: y ~ SSgompertz(time, Asym = 100, b2, b3)
   data: subset(foo, char == "B")
    b21     b22     b31     b32 
 9.5231 86.6421  0.8164  0.6582 
 residual sum-of-squares: 36.26

Number of iterations to convergence: 10 
Achieved convergence tolerance: 1.37e-06
> 
> predict(res_nlsB, newdata = list(time = seq(5,60,2.5)))
 [1]   3.162527   2.321040  28.575719  62.814774  63.489626  94.416582
84.809570  99.292612  94.199502  99.912322  97.856129  99.989162  99.217093
99.998661  99.715346
[16]  99.999835  99.896669  99.999980  99.962512  99.999997  99.986402
100.000000  99.995068
Warning messages:
1: In b3^x :
  longer object length is not a multiple of shorter object length
2: In -b2 * .expr2 :
  longer object length is not a multiple of shorter object length
> predict(res_nlsB, newdata = list(time = seq(5,60,5)))
 [1]   3.162527  26.638924  63.489626  98.000694  94.199502  99.969171
99.217093  99.999529  99.896669  99.999993  99.986402 100.000000
> predict(res_nlsA, newdata = list(time = seq(0,55,5)))
 [1]  0.9314904  1.1062577 15.8281748 20.7951276 48.3512870 57.8358643
75.0914782 82.6202586 89.3216331 93.5601696 95.6459638 97.7058236

xyplot(y ~ time, data = foo,
       groups = char,
       panel = panel.superpose,
       panel.groups = function(x, y, ...,group.number){
       
                 panel.xyplot(x,y, ...);

                 xy.nls <-
                 nls(y ~ SSgompertz(x, Asym = 100, b2, b3),
                     start = list( b2 =7, b3 =  0.9))

                 #print(summary(xy.nls))
                 
                 if (group.number == 1){
                   xy.pre <- predict(xy.nls, newdata = list(time =
seq(0,55,5)))
                   print(xy.pre)
                   llines( seq(5,60,5), xy.pre, col = "blue")
                 } else {
                   xy.pre <- predict(xy.nls, newdata = list(time =
seq(5,60,5)))
                   print(xy.pre)
                   llines( seq(5,60,5), xy.pre, col = "magenta")
                 }
                   
       })

Regards

Duncan

Duncan Mackay
Department of Agronomy and Soil Science
University of New England
Armidale NSW 2351
Email: home: mackay at northnet.com.au


-----Original Message-----
From: R-help [mailto:r-help-bounces at r-project.org] On Behalf Of François
Collin
Sent: Wednesday, 5 August 2015 22:24
To: r-help at r-project.org
Subject: [R] Lattice: raw data and prediction of a non linear fitted
function

Dear all,

I have a question about lattice use. I would like to use it to represent:
- my raw data as points,
- and the results of a non linear fit as a line,
- having 2 groups data (and so 2 colors).

However, as I have few raw data, I would like to increase the number of
points to smooth the line which correspond to the fit.

So my questions are:
- How can I use the group argument to make new predictions inside panel
argument ?
- How can I use this prediction inside the panel argument to draw the fit
per group?

Hereafter a minimal example:

#==================================================
library(lattice)
set.seed(2)

# Dummy dataframe
foo <- data.frame(
  time = seq(0, 60, 5),
  char = sample(c("A", "B"), size = 13, replace = TRUE)
  );

# Simulated response vector according a Gompertz function + rnorn(0, 5)
foo$y <- SSgompertz(foo$time, Asym = 100, b2 = ifelse(foo$char == 'A', 6,
10),
  b3 = ifelse(foo$char == "A", .91, .8)) +
  rnorm(nrow(foo), mean=0, sd = 5);

# Non-linear fit on simulation data
res_nls <-  nls(
  y ~ SSgompertz(time, Asym = 100, b2[char], b3[char]), data = foo,
  start = list( b2 = c(7,7), b3 = c(0.9, 0.9)));

# My problem
xyplot(y ~ time, groups = char, data = foo,
  panel = function(x, y, groups=groups, model = model, ...){
    panel.xyplot(x,y, groups = groups, ...);

    newdata <- data.frame(time = x, char = groups);
    newdata$y <- predict(model, newdata = newdata);

    panel.superpose(x = newdata$time, y=newdata$y,  groups = groups, ...,
      panel.groups = function(x,y, col, col.symbol, ...){
        panel.lines(x,y, col.line = col.symbol)
      })

  }, model = res_nls);
#==================================================


Many thanks,
Francois

	[[alternative HTML version deleted]]

______________________________________________
R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
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.



More information about the R-help mailing list