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,