Skip to content
Prev 75938 / 398502 Next

How to put factor variables in an nls formula ?

On 8/19/05, Douglas Bates <dmbates at gmail.com> wrote:
Sorry for the non-informative contribution - I hit the "Send" button
when I meant to hit "Cancel".

This is less easy than I thought it would be.  The Puromycin data
provides a similar example in that there are two sets of observations
of concentrations and rates, for treated and untreated cells.  The
experimenters assumption is that the rate should be related to the
concentration via the Michaelis-Menten relationship that depends on
two parameters, Asym and K, and that K should not change with
treatment but Asym will.

To fit that we can use
Nonlinear regression model
  model:  rate ~ (Asym + delta * (state == "treated")) * conc/(K + conc) 
   data:  Puromycin 
        Asym        delta            K 
166.60407167  42.02596094   0.05797178 
 residual sum-of-squares:  2240.891 

To generalize this it is convenient to form the model matrix with the
indicator columns of the state factor.
then use matrix multiplication within a call to drop().
2822.528 :  210.00 165.00   0.05 
2247.841 :  207.77558541 165.94256936   0.05647425 
2240.997 :  208.49340568 166.51190757   0.05778192 
2240.893 :  208.61339576 166.59293688   0.05794926 
2240.891 :  208.62809965 166.60277853   0.05796917 
2240.891 :  208.62983812 166.60394147   0.05797152 
2240.891 :  208.6300430 166.6040785   0.0579718 
Nonlinear regression model
  model:  rate ~ drop(mm %*% c(a1, a2)) * conc/(K + conc) 
   data:  Puromycin 
         a1          a2           K 
208.6300430 166.6040785   0.0579718 
 residual sum-of-squares:  2240.891 

You can do the same thing defining the model matrix of indicators of
Drain and a vector of length 4 for D.  (By the way, I would avoid the
name 'D' for a variable as that is the name of an in-built function in
R.)

The reason that I said this is more difficult than I thought it would
be is because I thought that the parameters in nls could be vectors
but I haven't been able to get that to work.

An alternative is to use the gnls function from the nlme package which
does allow a parameter to be specified according to the levels of a
factor.