Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

R implementation of Genetic Algorithm for Bass Model

I try to estimate Bass Curves to analyse diffusion of innovation for different groups. Until now I use nlsLM() of the minpack.lm package to estimate the parameter of the curve/to fit the curve. I loop through different starting values to estimate the best fit using this command for the different starting values:

Bass.nls <- nlsLM(cumulative_y~ M * (((P + Q)^2/P) * exp(-(P + Q) * time))/(1 + (Q/P) * exp(-(P + Q) * time))^2
                , start = list(M=m_start, P= p_start, Q=q_start)
                , trace = F
                , control = list(maxiter = 100, warnOnly = T) )

Since some groups have little data points many do not converge.

Venkatesan and Kumar (2002) suggest to use a Genetic Algorithm approach for bass model estimations when data is scarce (see also Venkatesan et al 2004). I have found some packages that implement GA in R (like GA, genalg, gafit). However, since I am new to the field, I don't know which package to use and how to use the bass formula in the packages.

  • Is there a package you would recommend for this kind of estimation?
  • If yes, is there an example for how to include the formula of the bass model in the code of the package?
like image 798
JMueller Avatar asked Nov 08 '18 10:11

JMueller


1 Answers

I hope below code can help you. I used "GA" package to utilize genetic algorithm.

x <- c(840,1470,2110,4000,7590,10950,10530,9470,
       7790,5890)

t<- 1:length(x)
Horiz <- length(x)




fit <- function(p,q,m) {

    res = x - (m*((exp((p+q)*t)*p*(p+q)^2) / (p*exp((p+q)*t)+q)^2))

        -(sum(res**2)/Horiz)

}



GA <- ga(type = "real-valued", 
         fitness = function(x) fit(x[1],x[2],x[3]),
         lower = c(0,0,0), upper = c(1,1,sum(x)*2), 
         popSize = 1000, maxiter = 1000 ,run = 500)


like image 199
Abdurrahman Yavuz Avatar answered Nov 16 '22 07:11

Abdurrahman Yavuz