[R] Discrete choice model maximum likelihood estimation

Rui Barradas ruipbarradas at sapo.pt
Mon May 14 00:42:52 CEST 2012


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.



More information about the R-help mailing list