[R] Discrete choice model maximum likelihood estimation

infinitehorizon barisvardar at hotmail.com
Mon May 14 01:33:07 CEST 2012


Hello Rui,

First of all, thanks a lot!
1. I changed par to param,
2. t is a variable too, a binary one, b is the parameter associated to it,

4. Yes, this is where I am stuck actually.

I fixed the code for likelihood functions as follows, but still getting the
same error:

L3	<- function(b1,b2,b3,b,t) {
P11	<- P1(b1,b,t)
P22	<- P2(b2,b,t)
P33	<- P3(b3,b,t)

L3l	<- P11*P22*P33
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*P22
return(L2l)
}

L1	<- function(b1,b2,b,t) {
P11	<- P1(b1,b,t)
P22	<- P2(b2,b,t)

L1l	<- P11
return(L1l)
}

# Log-likelihood function

llfn	<- function(param,a,t) {

b1	<- param[1]
b2	<- param[2]
b3	<- param[3]
b	<- param[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
}
start.par <- c(1,1,1,1)
est	<- optim(param=start.par,llfn, method =
c("CG"),control=list(trace=2,maxit=2000), hessian=TRUE)

In the end, i receive the same error message, 
actually, first I tried without start.par and I got the error of "object
param not found", then I defined start.par, it lead me to same error "cannot
coerce type 'closure' to vector of type 'double'".

I am aware that my questions might be too basic, but as I said I am not
familiar with syntax :/
Thanks for your help! 

Best,

Marc



Rui Barradas wrote
> 
> 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-tp4629877p4629881.html
Sent from the R help mailing list archive at Nabble.com.



More information about the R-help mailing list