I'm trying to perform a tobit regression with the lower limited (left-)censoring at 0, in Ox (Cramer, 1987, chap 11). I followed the Ox documentation, but I'm still struggling to make it work.
Here is my code:
#include <oxstd.h>
#include <oxprob.h>
#import <maximize>
decl g_mY, g_m;
decl g_iX;
Lik(const vp, const adFunc, const avScore, const amHessian){
//Mapping parameters
decl vBeta = vp[0:(g_iX-1)];
decl vT = vp[g_iX];
decl XB = (g_mX)*vBeta;
//Complete likelihood.
decl vLike = new matrix [rows(g_mY)][1];
for(decl i = 0; i < rows(g_mY); ++i){
if(g_mY[i] == 0 )
{
vLike[i][] = max(1.e-20, tailn(XB[i][])) ; // probit part
}
else if(g_mY[i] > 0)
{
vLike[i][] = fabs(vT) - 0.5 * (g_mY[i][] * fabs(vT) - XB[i][]).^2 ;
}
}
adFunc[0] = double(meanc(log(vLike)));
return 1;
}
main()
{
decl vp, dfunc, mh, ir, avScore;
//Loading data
decl mx = loadmat("p_intervfin.dta");
// Depedent variable
g_mY = mx[][0];
// X, explaining y
//with intercept
decl mX = ones(rows(g_mY), 1)~mx[][14:24]~mx[][28]~mx[][36]~mx[][38];
g_mX = mX;
//Number of parameters X
g_iX = columns(g_mX);
// Starting values.
vp = zeros(g_iX,1);
vp[0] = 1; //Intercept
//Scale
vp[g_iX] = 0.02;
println("Starting values", vp) ;
println("Ordered Probit, run on ", date());
MaxControl(-1, 1, 1); // print each iteration maximize
ir = MaxBFGS(Lik, &vp, &dfunc, 0, TRUE);
print("\n", MaxConvergenceMsg(ir),
" using numerical derivatives",
"\n Function value = ", dfunc * rows(g_mY),
"; parameters:", vp);
if (ir == MAX_CONV || ir == MAX_WEAK_CONV){
if (Num2Derivative(Lik, vp, &mh))
{
decl mcovar = -invertgen (mh) / rows(g_mY);
print("SE: ", sqrt(diagonal(mcovar)'));
}
}
println("N:", rows(g_mY));
}
This function does not converge. Any idea on how to make this simpler and efficient?