/*
    This program estimates a simultaneous sequential tobit model
    in reduced form. The model is set up as follows.
    1. Probit-part: This is the selection equation. The Tobit-part
                    is only observed if the binary variable is one.
    2. Tobit-part: This is the levels equation.
    The program runs a Full Information Maximum Likelihood procedure.
    Recommendation: Start iterations in the full model with BFGS and
    sitch then to BHHH.

    REFERENCE:
    Kaiser, U. (2001): Product Innovation and Product Innovation
        Marketing: Theory and Microeconometric Evidence. ZEW mimeo.
*/

/* prerequisites */
new;
library maxlik, pgraph;
#include maxlik.ext;
#include indices.src;
maxset;
format /rd 12,4 ;

/* set global MAXLIK variables */
_max_Algorithm  = 5     ; /* see MAXLIK manual, p. 42 */
_max_LineSearch = 1     ; /* see MAXLIK manual, p. 45 */
_max_CovPar     = 2     ; /* see MAXLIK manual, p. 42 */
_max_gradtol    = 1e-5  ; /* see MAXLIK manual, p. 43 */
_max_GradMethod = 1     ; /* see MAXLIK manual, p. 43 */
_max_MaxIters   = 500  ; /* see MAXLIK manual, p. 45 */

output file = c:\fabel\progs\simult.out reset ;

/* COMPLETE DATA SET */
open f1     = c:\fabel\data\mdp.dat varindxi ;
mat         = readr(f1, rowsf(f1));

/* all variables */
mat         =   mat[.,ipd     ]~mat[.,iiama_ia]~
                mat[.,iH      ]~mat[.,idlexe  ]~
                mat[.,ihandel ]~mat[.,iverk   ]~
                mat[.,isonst  ]~
                mat[.,iln_l   ]~mat[.,iln_l2  ]~
                mat[.,iost    ]~
                mat[.,im_koop ]~
                ones(rows(mat),1)~mat[.,is_high   ]~mat[.,idive_br];

names       =  {    pd      , iama_ia,
                    H       , dlexe,
                    handel  , verk,
                    sonst   ,
                    ln_l    , lnl2,
                    ost     ,
                    m_koop  ,
                    cons    ,
                    s_high  , dive_br };

exclsel     = 1;
excl        = 2;

/* FULL DATA SET */
create full = c:\fabel\data\full with ^names,0,8;
call              writer(full,mat);

/* ==================================== */
/* STARTING VALUES: BINARY PROBIT MODEL */
/* ==================================== */
namesn          = names[1]|names[3:rows(names)];
_max_ParNames   = namesn[2:rows(namesn)];
b0              = zeros(rows(_max_ParNames),1);

{binstart,f,g,cov,ret}=maxlik("c:\\fabel\\data\\full",namesn,&probit,b0);
call maxprt(binstart,f,g,cov,ret) ;
binnam          = _max_ParNames;

/* hier


/* ==================================== */
/* STARTING VALUES: TYPE II TOBIT       */
/* ==================================== */
x               = mat[.,3:cols(mat)];
lambda          = pdfn(x*binstart)./cdfn(x*binstart);
x               = x~lambda~mat[.,2];
x               = selif(x,x[.,cols(x)].>0);
y               = x[.,cols(x)];
x               = x[.,1:cols(x)-1-excl];
blevel          = inv(x'*x)*x'y;
blevel          = blevel[1:rows(blevel)-1];

b0              = binstart|blevel|0.73|-.11;

s2              = { s2 };
s12             = { s12 };

_max_ParNames   = names[3:rows(names)]|names[3:rows(names)-excl]|s2|s12;

_max_CovPar     = 2     ; /* see MAXLIK manual, p. 42 */
_max_MaxIters   = 10000 ; /* see MAXLIK manual, p. 45 */
_max_Algorithm  = 2   ; /* see MAXLIK manual, p. 42 */
_max_GradTol    = 1e-5   ; /* see MAXLIK manual, p. 42 */
{bsim,f1,g1,cov1,ret1}=maxlik("c:\\rigorosu\\fabel\\data\\full",names,&tobit2,b0);
call maxprt(bsim,f1,g1,cov1,ret1) ;


hv1     = (rows(bsim)+excl-2)/2;
bsel    = bsim[1:hv1];
blev    = bsim[hv1+1:hv1+hv1-excl];
covsel  = cov1[1:hv1,1:hv1];
covlev  = cov1[hv1+1:hv1+hv1-excl,hv1+1:hv1+hv1-excl];
sqrt(diag(covlev));

format /rd 12,4 ;
/* ================================================ */
print"/* Wald-tests for joint significance          */";
/* ================================================ */

print"Firm size";
s1      = 6; s2     = 7;
print"Selection equation";
theta   = bsel[s1:s2];
var     = covsel[s1:s2,s1:s2];
R       = eye(rows(theta));
W       = (R*theta)'*inv(R*var*R')*(R*theta);
W~cdfchic(W,rows(R));
print"Level equation";
theta   = blev[s1:s2];
var     = covlev[s1:s2,s1:s2];
R       = eye(rows(theta));
W       = (R*theta)'*inv(R*var*R')*(R*theta);
W~cdfchic(W,rows(R));

print"Sector dummies";
s1      = 3; s2     = 5;
print"Selection equation";
theta   = bsel[s1:s2];
var     = covsel[s1:s2,s1:s2];
R       = eye(rows(theta));
W       = (R*theta)'*inv(R*var*R')*(R*theta);
W~cdfchic(W,rows(R));
print"Level equation";
theta   = blev[s1:s2];
var     = covlev[s1:s2,s1:s2];
R       = eye(rows(theta));
W       = (R*theta)'*inv(R*var*R')*(R*theta);
W~cdfchic(W,rows(R));

print"Entire specification";
print"Selection equation";
theta   = bsel[1:rows(bsel)-excl-1]|bsel[rows(bsel)-1:rows(bsel)];
var     =
(covsel[1:rows(bsel)-excl-1,1:rows(bsel)-excl-1]~covsel[1:rows(bsel)-excl-1,rows(bsel)-1:rows(bsel)])|
(covsel[rows(bsel)-1:rows(bsel),1:rows(bsel)-excl-1]~covsel[rows(bsel)-1:rows(bsel),rows(bsel)-1:rows(bsel)]);
sqrt(diag(var       ));
R       = eye(rows(theta));
W       = (R*theta)'*inv(R*var*R')*(R*theta);
W~cdfchic(W,rows(R));
print"Level equation";
theta   = blev[1:rows(blev)-1];
var     = covlev[1:rows(blev)-1,1:rows(blev)-1];
R       = eye(rows(theta));
W       = (R*theta)'*inv(R*var*R')*(R*theta);
W~cdfchic(W,rows(R));

print"Entire specification";
theta   = bsel[1:rows(bsel)-excl-1]|bsel[rows(bsel)-excl+1:rows(bsel)]|
          blev[1:rows(blev)-1];
var     = (cov1[1:9,1:9]~cov1[1:9,11:12]~cov1[1:9,13:21])|
          (cov1[11:12,1:9]~cov1[11:12,11:12]~cov1[11:12,13:21])|
          (cov1[13:21,1:9]~cov1[13:21,11:12]~cov1[13:21,13:21]);
R       = eye(rows(theta));
W       = (R*theta)'*inv(R*var*R')*(R*theta);
W~cdfchic(W,rows(R));

/* ================================================ */
print"/* Two-step results                           */";
/* ================================================ */
_max_Algorithm  = 5     ; /* see MAXLIK manual, p. 42 */

namn    = names[1]|names[3:rows(names)-excl-exclsel-1]|names[rows(names)-excl:rows(names)];
namn    = namn[1:7]|namn[9:rows(namn)];

matn    = mat[.,1]~mat[.,3:cols(mat)-excl-exclsel-1]~mat[.,cols(mat)-excl:cols(mat)];
matn    = matn[.,1:7]~matn[.,9:cols(matn)];

mhat    = mat[.,3:cols(mat)-excl]*blev;
matn    = matn~mhat;
hv      = { mhat };
namn    = namn|hv ;

closeall;
create fulln    = c:\rigorosu\fabel\data\fulln with ^namn,0,8;
call              writer(fulln,matn);

namesn          = namn;
_max_ParNames   = namesn[2:rows(namesn)];
b0              = zeros(rows(_max_ParNames),1)+.1;

{binstart,f,g,cov,ret}=maxlik("c:\\rigorosu\\fabel\\data\\fulln",namesn,&probit,b0);
call maxprt(binstart,f,g,cov,ret) ;

hier */


/* SIMULTANEOUS MODEL */
proc tobit2(b,dat);
    local p,e,u,hv1,hv2,x,M,D0,D10,D1M,pipd,pim,thetax,thetaM,sigma,rho,dp,blau,gelb,rosa,gruen;
        x       = dat[.,1];
        M       = dat[.,2];

        D0      = x.==0;
        D10     = (x.==1) .and (M.==0);
        D1M     = (x.==1) .and (M.>0);

        pipd    = dat[.,3:cols(dat)];
        pim     = dat[.,3:cols(dat)-excl];

        hv1     = (rows(b)+excl-2)/2;

        thetax  = b[1:hv1];
        thetaM  = b[hv1+1:hv1+hv1-excl];

        sigma   = b[rows(b)-1];
        rho     = b[rows(b)];

        blau    = ln(cdfn(-pipd*thetax));
        gelb    = ln(cdfbvn((-pim*thetaM)/sigma,pipd*thetax,-rho));
        gruen   = ln(cdfn( ( pipd*thetax+(M-pim*thetam)*rho/sigma )/sqrt(1-rho^2) ) )
                  -.5*((M-pim*thetaM)/sigma)^2-ln(sqrt(2*Pi)*sigma);

    retp( ( D0.*blau + D10.*gelb + D1M.*gruen ) );
endp;



/* BINARY PROBIT PROCEDURE AND GRADIENT */
proc probit(b,dat);
    local   y,x,p,dp;
        y   = dat[.,1];
        x   = dat[.,2:cols(dat)];
        p   = cdfn(x*b);
        dp  = p.>1e-18;
        p   = p.*dp+(1-dp)*1e-18;
    retp( y.*ln(p) + (1-y).*ln(1-p)  );
endp;

proc probitg(b,dat);
    local   y,x,p,dp;
        y   = dat[.,1];
        x   = dat[.,2:cols(dat)];
        p   = cdfn(x*b);
        dp  = p.>1e-18;
        p   = p.*dp+(1-dp)*1e-18;
    retp( (y-p)./(p.*(1-p)).*pdfn(x*b).*x );
endp;

output off;

    Source: geocities.com/ulrichkaiser1971