Your function will not evaluate as coded. i.e., llfn(start.par) doesn't "work", as there are unequal numbers of arguments. Also, while R allows you to use variables that are not explicitly defined for a function, I've almost always got into trouble if I don't pass them VERY carefully.
Finally, as author of the code used to put CG in optim, I'll advise against its use. One of my least successful pieces of code. Rcgmin is better, but you really do need analytic derivatives to make it sing. For 5 parameters, use NM, or better the nmk from dfoptim package. Best, JN On 05/15/2012 06:00 AM, r-help-requ...@r-project.org wrote: > Message: 13 > Date: Mon, 14 May 2012 04:21:57 -0700 (PDT) > From: infinitehorizon <barisvar...@hotmail.com> > To: r-help@r-project.org > Subject: Re: [R] Discrete choice model maximum likelihood estimation > Message-ID: <1336994517063-4629910.p...@n4.nabble.com> > Content-Type: text/plain; charset=us-ascii > > Hello again, > > I changed the name to tt. > and for a and tt actually I was getting them from data, I didn't put them > here in the question. Now I restructured my code and below I copy the full > code, I tried many things but still getting the same error, I don't > understand where is the mistake. > > I also defined one more variable to increase comprehension of the problem. > Instead of data, I define three representative vectors in the beginning. If > you run this code, you will see the error message. > > # Variables, a: discrete choice variable-dependent, x and tt are independent > variables, tt is binary > a <- c(1,1,2,3,2,3,1,2,2,3,1,1) > x <- c(23,26,12,27,10,30,13,20,23,44,17,15) > tt <- c(1,0,0,1,1,1,0,0,1,0,1,1) > > # First, just to see, the linear model > > LM <-lm(a ~ x+tt) > coefLM <- coefficients(LM) > summary(LM) > > # Probabilities for discrete choices for a=3, a=2 and a=1 respectively > P3 <- function(bx,b3,b,tt) { > P <- exp(bx*x+b3+b*(tt==1))/(1-exp(bx*x+b3+b*(tt==1))) > return(P) > } > P2 <- function(bx,b2,b,tt) { > P <- exp(bx*x+b2+b*(tt==1))/(1-exp(bx*x+b2+b*(tt==1))) > return(P) > } > P1 <- function(bx,b1,b,tt) { > P <- exp(bx*x+b1+b*(tt==1))/(1-exp(bx*x+b1+b*(tt==1))) > return(P) > } > > # Likelihood functions for discrete choices for a=3, a=2 and a=1 > respectively > > L3 <- function(bx,b1,b2,b3,b,tt) { > P11 <- P1(bx,b1,b,tt) > P22 <- P2(bx,b2,b,tt) > P33 <- P3(bx,b3,b,tt) > > L3l <- P11*P22*P33 > return(L3l) > } > > L2 <- function(bx,b1,b2,b,tt) { > P11 <- P1(bx,b1,b,tt) > P22 <- P2(bx,b2,b,tt) > > L2l <- P11*P22 > return(L2l) > } > > L1 <- function(bx,b1,b,tt) { > P11 <- P1(bx,b1,b,tt) > > L1l <- P11 > return(L1l) > } > > # Log-likelihood function > > llfn <- function(param) { > > bx <- param[1] > b1 <- param[2] > b2 <- param[3] > b3 <- param[4] > b <- param[5] > > lL1 <- log(L1(bx,b1,b2,b,tt)) > lL2 <- log(L2(bx,b1,b2,b3,b,tt)) > lL3 <- log(L3(bx,b1,b2,b3,b,tt)) > > llfn <- (a==1)*lL1+(a==2)*lL2+(a==3)*lL3 > } > start.par <- c(0,0,0,0,0) > est <- optim(param=start.par,llfn,x=x, a=a, tt=tt, method = > c("CG"),control=list(trace=2,maxit=2000), hessian=TRUE) > ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.