[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