[R] Problems with nls

Gabor Grothendieck ggrothendieck at gmail.com
Wed Jun 15 23:35:42 CEST 2011


On Wed, Jun 15, 2011 at 11:06 AM, Christopher Hulme-Lowe
<hulme005 at umn.edu> wrote:
> I'm trying to fit the Bass Diffusion Model using the nls function in R but
> I'm running into a strange problem. The model has either two or three
> parameters, depending on how it's parameterized, p (coefficient of
> innovation), q (coefficient of immitation), and sometimes m (maximum market
> share). Regardless of how I parameterize the model I get an error saying
> that the step factor has decreased below it's minimum. I have tried
> re-setting the minimum in nls.controls but that doesn't seem to fix the
> problem. Likewise, I have run through a variety of start values in the past
> few days, all to no avail. Looking at the trace output it appears that R
> believes I always have one more parameter than I actually have (i.e. when
> the model is parameterized with p and q R seems to be seeing three
> parameters, when m is also included R seems to be seeing four). My
> experience with nls is limited, can someone explain to me why it's doing
> this? I've included the data set I'm working with (published in Michalakelis
> et al. 2008) and some example code.
>
> ## Assign relevant variables
> adoption <-
> c(167000,273000,531000,938000,2056452,3894103,5932090,7963742,9314687,10469060,11393302,11976340)
> time <- seq(from = 1,to = 12, by = 1)
> ## Models
> Bass.Model <- adoption ~ ((p + q)^2/p) * (exp(-(p + q) * time)/((q / p) *
> exp(-(p + q) * time) + 1)^2)
> ## Starting Parameters
> Bass.Params <- list(p = 0.1, q = 0.1)
> ## Model fitting
> Bass.Fit <- nls(formula = Bass.Model, start = Bass.Params, algorithm =
> "plinear", trace = TRUE)

Using the default nls algorithm (which means we must specify m in the
formula and in the starting values) rather than "plinear" and using
commonly found p and q for starting values:

> Bass.Model <- adoption ~ m * ((p + q)^2/p) * (exp(-(p + q) * time)/((q / p) *
+ exp(-(p + q) * time) + 1)^2)
> nls(formula = Bass.Model, start = c(p = 0.03, q = 0.4, m = max(adoption)))
Nonlinear regression model
  model:  adoption ~ m * ((p + q)^2/p) * (exp(-(p + q) * time)/((q/p)
*      exp(-(p + q) * time) + 1)^2)
   data:  parent.frame()
                p                 q                 m
2.70842174019e-03 4.56307730094e-01 1.02730314877e+08
 residual sum-of-squares: 2922323788247

Number of iterations to convergence: 14
Achieved convergence tolerance: 3.05692430520e-06


-- 
Statistics & Software Consulting
GKX Group, GKX Associates Inc.
tel: 1-877-GKX-GROUP
email: ggrothendieck at gmail.com



More information about the R-help mailing list