I'm trying to estimate a simple binary choice (probit) model by
maximum likelihood. The outcome variable, y, equals 1 if the latent
variable, z, is less than X*b and equals 0 otherwise. (X is a matrix
of observable variables and b is a parameter vector to be estimated.)
I assume z is a standard normal random variable. Thus, y=1 with
probability Prob(z< X*b). I have a panel of data on N individuals; I
observe each individual for T periods.
Suppose b is just a 2x1 equal to [alpha beta]'; these are the
variables I seek to estimate. But in the process I need to define a
number of auxiliary variables. In this case, that is relatively easy
to do. I define:
var Bnd {i in N, t in T} = alpha + beta*x[i,t]; # this is X*b (the
upper limit of integration)
# Now, I need to evaluate the standard normal CDF at X*b. Ideally, I
would wrap in a function, but it appears the NEOS server does not
accept pipe-in functions. So here, I just calculate it directly. The
parameters N_a1, etc. would be defined earlier in the mod file. (The
code is borrowed from John Burkardt,
http://people.sc.fsu.edu/~burkardt.)
var NCDF {i in N, t in T} = 1 - (
if Bnd[i,t] > N_max then 1 else (
if Bnd[i,t]<= N_con then 0.5-Bnd[i,t]*(N_p - N_q*0.5*Bnd[i,t]^2
/(0.5*Bnd[i,t]^2 +N_a1+N_b1
/(0.5*Bnd[i,t]^2 +N_a2+N_b2
/(0.5*Bnd[i,t]^2 +N_a3)))) else
if Bnd[i,t] > N_con then N_r*exp(-0.5*Bnd[i,t]^2)
/(Bnd[i,t] + N_c1+N_d1
/(Bnd[i,t] + N_c2+N_d2
/(Bnd[i,t] + N_c3+N_d3
/(Bnd[i,t] + N_c4+N_d4
/(Bnd[i,t] + N_c5+N_d5
/(Bnd[i,t] + N_c6))))))
)
);
# Lastly, I calculate the likelihood contribution of each
observation.
var Like {i in N, t in T} = (
if y[i,t]=1 then NCDF[i,t] else
if y[i,t]=0 then 1-NCDF[i,t]
);
maximize Log_Likelihood: sum {i in N, t in T} Like[i,t];
As far as I can tell, this code works well.
Here, I do not need for loops. But in more complicated problems, it's
a lot easier for me to think in terms of loops. So I wanted to try to
re-estimate this model by building up the likelihood within a for
loop. But thus far, this has been a failure. My code is provided
below. I'm receiving the message, "Unbounded objective". In addition,
even after substitution, my output reads, "50 variables, all linear"
-- but substitution should eliminate all variables except alpha and
beta. Any help would be greatly appreciated. (sorry for such a long
email.)
var alpha := 0.25;
var beta := 0.1;
var Bnd {i in N, t in T};
var NCDF {i in N, t in T};
var Like {i in N, t in T};
var Log_Like {i in N};
for {i in N} {
for {t in T} {
let Bnd[i,t] := alpha + beta*x[i,t];
let NCDF[i,t] := 1 - (
if Bnd[i,t] > N_max then 1 else (
if Bnd[i,t]<= N_con then 0.5-Bnd[i,t]*(N_p - N_q*0.5*Bnd[i,t]^2
/(0.5*Bnd[i,t]^2 +N_a1+N_b1
/(0.5*Bnd[i,t]^2 +N_a2+N_b2
/(0.5*Bnd[i,t]^2 +N_a3)))) else
if Bnd[i,t] > N_con then N_r*exp(-0.5*Bnd[i,t]^2)
/(Bnd[i,t] + N_c1+N_d1
/(Bnd[i,t] + N_c2+N_d2
/(Bnd[i,t] + N_c3+N_d3
/(Bnd[i,t] + N_c4+N_d4
/(Bnd[i,t] + N_c5+N_d5
/(Bnd[i,t] + N_c6))))))
)
);
let Like[i,t] := (
if y[i,t]=1 then NCDF[i,t] else
if y[i,t]=0 then 1-NCDF[i,t]
);
}
}
maximize Log_Likelihood: sum {i in N, t in T} Like[i,t];