[R] writing selfStart models that can deal with treatment effects

Michael A. Gilchrist mikeg at utk.edu
Thu Nov 12 21:39:08 CET 2009


Hello,

I'm trying to do some non-linear regression with 2 cell types and 4 tissue 
type treatments using selfStart models

Following Ritz and Streibig (2009), I wrote the following routines:

##Selfstart
expDecayAndConstantInflowModel <- function(Tb0, time, aL, aN, T0){
   exp(-time*aL)*(T0*aL+(-1+exp(time * aL))*Tb0 * aN)/aL
}

expDecayAndConstantInflowModelInit <- function(mCall, LHS, data){
   print(paste("SelfStart mCall:", mCall));
   print(attributes(mCall));
   print(mCall[["aN"]]);
   xy <-  sortedXyData(mCall[["time"]], LHS, data);
   lmFit <- lm(log(xy[, "y"]) ~ xy[, "x"]);
   coefs <- coef(lmFit);
   T0 <- exp(coefs[1]);
   aL <- -coefs[2]*0.99;
   aN <- 0.0001;
   value <- c(aL, aN, T0);
   names(value) <- mCall[c("aL", "aN", "T0")];
   value
}

SSexpDecayAndConstantInflow <- selfStart(expDecayAndConstantInflowModel, 
expDecayAndConstantInflowModelInit, c("aL", "aN", "T0"))

Ignoring the treatment effects, the routines seem to work find:
-----------------------------------
> getInitial(Count ~ SSexpDecayAndConstantInflow(B0, Time, aL, aN, T0), data = 
tissueData)
           aL           aN           T0
4.600144e-02 1.000000e-04 1.082172e+03
> nls(Count ~ SSexpDecayAndConstantInflow(B0, Time, aL, aN, T0), data = 
tissueData)
Nonlinear regression model
   model:  Count ~ SSexpDecayAndConstantInflow(B0, Time, aL, aN, T0)
    data:  tissueData
        aL        aN        T0
    0.1131    0.1206 1348.0646
  residual sum-of-squares: 38821317

Number of iterations to convergence: 11
Achieved convergence tolerance: 6.267e-06
> 
----------------------------------

However, I need to be able to test for these treatment effects (they are quite 
heterogenous), but when I try using the standard syntax for nls(), the 
selfStart model only estimates a set of global values and these don't work 
with nls()

> getInitial(Count ~ SSexpDecayAndConstantInflow(B0, Time, aL[Type], aN[Type], 
T0[TypeTissue]), data = tissueData)
       aL[Type]       aN[Type] T0[TypeTissue]
   4.600144e-02   1.000000e-04   1.082172e+03
> nls(Count ~ SSexpDecayAndConstantInflow(B0, Time, aL[Type], aN[Type], 
T0[TypeTissue]), data = tissueData)
Error in numericDeriv(form[[3L]], names(ind), env) :
   Missing value or an infinity produced when evaluating the model
In addition: Warning message:
In nls(Count ~ SSexpDecayAndConstantInflow(B0, Time, aL[Type], aN[Type],  :
   No starting values specified for some parameters.
Intializing 'aL', 'aN', 'T0' to '1.'.
Consider specifying 'start' or using a selfStart model
>
----------------------------------

I've tried the following syntax, but it seems that the global estimates give 
singularities when applied to each group

----------------------------------
> nls(Count ~ SSexpDecayAndConstantInflow(B0, Time, aL[Type], aN[Type], 
T0[TypeTissue]),
     data = tissueData,
     start = getInitial(Count ~ SSexpDecayAndConstantInflow(B0, Time, aL, aN, 
T0), data = tissueData))

nls(Count ~ SSexpDecayAndConstantInflow(B0, Time, aL[Type], aN[Type], 
T0[TypeTissue]),
+     data = tissueData,
+     start = getInitial(Count ~ SSexpDecayAndConstantInflow(B0, Time, aL, aN, 
T0), data = tissueData))
Error in numericDeriv(form[[3L]], names(ind), env) :
   Missing value or an infinity produced when evaluating the model
>
----------------------------------

Does anyone have any suggestions for how to work around this problem or have 
an example of a selfStart model that can deal with treatment effects?  The 
dataset is quite heterogenous and so I need to explore a number of alternative 
transformations and models so I really need something that works without me 
having to continually reset the start values by hand.

Many thanks.

Mike

-----------------------------------------------------
Department of Ecology & Evolutionary Biology
569 Dabney Hall
University of Tennessee
Knoxville, TN 37996-1610

phone:(865) 974-6453
fax:  (865) 974-6042

web: http://eeb.bio.utk.edu/gilchrist.asp




More information about the R-help mailing list