[R] Problems with nls

Gabor Grothendieck ggrothendieck at gmail.com
Wed Jun 15 23:47:50 CEST 2011


On Wed, Jun 15, 2011 at 5:35 PM, Gabor Grothendieck
<ggrothendieck at gmail.com> wrote:
> 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

and if its important to you to use "plinear" then try absorbing
(p+q)^2/p into m which means you will have to back that out from .lin
to calculate m:

> Bass.Model <- adoption ~ (exp(-(p + q) * time)/((q / p) *
+ exp(-(p + q) * time) + 1)^2)
> nls(formula = Bass.Model, start = c(p = 0.03, q = 0.4), alg = "plinear")
Nonlinear regression model
  model:  adoption ~ (exp(-(p + q) * time)/((q/p) * exp(-(p + q) *
time) +      1)^2)
   data:  parent.frame()
                p                 q              .lin
2.70843216557e-03 4.56307130968e-01 7.99164076337e+09
 residual sum-of-squares: 2922323788276

Number of iterations to convergence: 12
Achieved convergence tolerance: 2.56069064476e-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