infinitehorizon
2012-May-13 21:53 UTC
[R] Discrete choice model maximum likelihood estimation
Hello, I am new to R and I am trying to estimate a discrete model with three choices. I am stuck at a point and cannot find a solution. I have probability functions for occurrence of these choices, and then I build the likelihood functions associated to these choices and finally I build the general log-likelihood function. There are four parameters in the model, three of them are associated to three discrete choices I mentioned, and one of them is for a binary variable in the data (t). There are also latent variables but I didn't put them in this question because if I figure out how to do this, I will be able to add them as well. I am not familiar with the syntax I have to write in the likelihood functions, so I really doubt that they are true. Below I simplify the problem and provide the code I've written: # Probabilities for discrete choices for a=3, a=2 and a=1 respectively P3 <- function(b3,b,t) { P <- exp(b3+b*(t==1))/(1-exp(b3+b*(t==1))) return(P) } P2 <- function(b2,b,t) { P <- exp(b2+b*(t==1))/(1-exp(b2+b*(t==1))) return(P) } P1 <- function(b1,b,t) { P <- exp(b1+b*(t==1))/(1-exp(b1+b*(t==1))) return(P) } # Likelihood functions for discrete choices for a=3, a=2 and a=1 respectively L3 <- function(b1,b2,b3,b,t) { P11 <- P1(b1,b,t) P22 <- P2(b2,b,t) P33 <- P3(b3,b,t) L3l <- (P11=1)*(P22=1)*(P33=1) return(L3l) } L2 <- function(b1,b2,b3,b,t) { P11 <- P1(b1,b,t) P22 <- P2(b2,b,t) P33 <- P3(b3,b,t) L2l <- (P11=1)*(P22=1)*(P33=0) return(L2l) } L1 <- function(b1,b2,b,t) { P11 <- P1(b1,b,t) P22 <- P2(b2,b,t) L1l <- (P11=1)*(P22=0) return(L1l) } # Log-likelihood function llfn <- function(par,a,t) { b1 <- par[1] b2 <- par[2] b3 <- par[3] b <- par[4] lL1 <- log(L1(b1,b2,b,t)) lL2 <- log(L2(b1,b2,b3,b,t)) lL3 <- log(L3(b1,b2,b3,b,t)) llfn <- (a==1)*lL1+(a==2)*lL2+(a==3)*lL3 } est <- optim(par,llfn, method = c("CG"),control=list(trace=2,maxit=2000), hessian=TRUE) And when I run this code I get "cannot coerce type 'closure' to vector of type 'double'" error. I will really appreciate your help. Thanks, -- View this message in context: http://r.789695.n4.nabble.com/Discrete-choice-model-maximum-likelihood-estimation-tp4629877.html Sent from the R help mailing list archive at Nabble.com.
Rui Barradas
2012-May-13 22:42 UTC
[R] Discrete choice model maximum likelihood estimation
Hello, There are several issues with your code. 1. The error message. Don't use 'par' as a variable name, it's already an R function, tyo get or set graphics parameters. Call it something else, say, 'param'. This is what causes the error. You must pass initial values to optim, but the variable you're passing doesn't exist, you haven't created it so R finds an object with that name, the graphics parameters function. Avoid the confusion. And create 'param' with as many values as expected by llfn before the call. 2. 't' is also a parameter. Take it out of llfn formals and put it in 'param'. Then, inside llfn's body, t <- param[5] 3. It still won't work. llfn will not be passed a value for 'a', for the same reason it can't find 't'. 4. Then, look at L3 and the others. The line just before return. L3l <- (P11=1)*(P22=1)*(P33=1) After computing P11, etc, you're discarding those values and assigning 1 to each of them. Your likelihood functions just became constants... And if this is a typo, if you meant P11 == 1, etc, it's even worse. You can't expect that ratios of exponentials to be equal to that one real value. Points 1-3 are workable but this last one means you have to revise your likelihood. Good luck. Hope this helps, Rui Barradas infinitehorizon wrote> > Hello, > > I am new to R and I am trying to estimate a discrete model with three > choices. I am stuck at a point and cannot find a solution. > > I have probability functions for occurrence of these choices, and then I > build the likelihood functions associated to these choices and finally I > build the general log-likelihood function. > > There are four parameters in the model, three of them are associated to > three discrete choices I mentioned, and one of them is for a binary > variable in the data (t). There are also latent variables but I didn't > put them in this question because if I figure out how to do this, I will > be able to add them as well. > > I am not familiar with the syntax I have to write in the likelihood > functions, so I really doubt that they are true. Below I simplify the > problem and provide the code I've written: > > # Probabilities for discrete choices for a=3, a=2 and a=1 respectively > P3 <- function(b3,b,t) { > P <- exp(b3+b*(t==1))/(1-exp(b3+b*(t==1))) > return(P) > } > P2 <- function(b2,b,t) { > P <- exp(b2+b*(t==1))/(1-exp(b2+b*(t==1))) > return(P) > } > P1 <- function(b1,b,t) { > P <- exp(b1+b*(t==1))/(1-exp(b1+b*(t==1))) > return(P) > } > > # Likelihood functions for discrete choices for a=3, a=2 and a=1 > respectively > > L3 <- function(b1,b2,b3,b,t) { > P11 <- P1(b1,b,t) > P22 <- P2(b2,b,t) > P33 <- P3(b3,b,t) > > L3l <- (P11=1)*(P22=1)*(P33=1) > return(L3l) > } > > L2 <- function(b1,b2,b3,b,t) { > P11 <- P1(b1,b,t) > P22 <- P2(b2,b,t) > P33 <- P3(b3,b,t) > > L2l <- (P11=1)*(P22=1)*(P33=0) > return(L2l) > } > > L1 <- function(b1,b2,b,t) { > P11 <- P1(b1,b,t) > P22 <- P2(b2,b,t) > > L1l <- (P11=1)*(P22=0) > return(L1l) > } > > # Log-likelihood function > > llfn <- function(par,a,t) { > > b1 <- par[1] > b2 <- par[2] > b3 <- par[3] > b <- par[4] > > lL1 <- log(L1(b1,b2,b,t)) > lL2 <- log(L2(b1,b2,b3,b,t)) > lL3 <- log(L3(b1,b2,b3,b,t)) > > llfn <- (a==1)*lL1+(a==2)*lL2+(a==3)*lL3 > } > est <- optim(par,llfn, method = c("CG"),control=list(trace=2,maxit=2000), > hessian=TRUE) > > And when I run this code I get "cannot coerce type 'closure' to vector of > type 'double'" error. > I will really appreciate your help. Thanks, >-- View this message in context: http://r.789695.n4.nabble.com/Discrete-choice-model-maximum-likelihood-estimation-tp4629877p4629880.html Sent from the R help mailing list archive at Nabble.com.
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-request at r-project.org wrote:> Message: 13 > Date: Mon, 14 May 2012 04:21:57 -0700 (PDT) > From: infinitehorizon <barisvardar at hotmail.com> > To: r-help at r-project.org > Subject: Re: [R] Discrete choice model maximum likelihood estimation > Message-ID: <1336994517063-4629910.post at 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) >