Thanks for this. I waited until I run various cases before
      providing feedback. Both approaches work fine in general... but
      not in a specific model I work with now. And I cannot understand
      why, because even in the simple bivariate normal example, the qqq
      construct includes parameters under estimation in any case. So I
      would really appreciate any idea why the following does not work
      (it gives immediately a numerical derivative value of exactly zero
      for the rho correlation parameter irrespective of starting value,
      which is suspicious, and stays there for ever, and after some
      iterations it aborts with a message "matrix is not
      positive-definite") . I am not saying that it necessarily has to
      do with the code, it may be the model's problem. But the thing
      is,  if I write out explicitly the likelihood (since this is the
      bivariate case), without using the qqq construct, the code does
      provide results, this is why I am at a loss here.
    
<hansl>
[data...]
    
[starting values for the parameters...]
    
matrix R2 = {1,rho; rho,1}
    
mle logl = check ? -0.5*ldet(R2) -0.5*qqq  +
      0.5*((invcdf(N,CDF))^2)  +  log(B1+B2) :NA
          
         series resCor = Depv - Regrs*kVec
series B1 = (resCor/vu)+ ...
    series B2 = (resCor/vu) +...
      
      series CDF = cnorm(resCor/vu) + mix*B1 - (1-mix)*B2 
      
           matrix q = {W, invcdf(N,CDF)}
          matrix qq = q*inv(R2)
          series qqq = sumr(q.*qq)
          
      
      scalar check = (vu>0)   && (mix>0) && (mix
      < 1)   && (abs(rho)<1) 
      params kVec vu mix rho  
      end mle   
    
</hansl>
    
Alecos Papadopoulos PhD Candidate Athens University of Economics and Business, Greece School of Economic Sciences Department of Economics https://alecospapadopoulos.wordpress.com/
      A minimal modification of your script that fixes this is
<hansl>
nulldata 128
series N1 = normal()
series N2 = normal()
scalar s1 = 1
scalar s2 = 1
scalar c12 = 0.5
matrix q = {N1, N2}
mle logl = check ? -0.5 * (qqq + ldet(S)) : NA
     matrix S = {s12,c12;c12,s22}
     scalar check = (s1>0) && (s2>0) && (abs(c12)<1)
     matrix qq = q * inv(S)
     series qqq = sumr(q.*qq)
     params s1 s2 c12
end mle
# check
Shat = q'q ./ $nobs
print Shat
eval sqrt(diag(Shat))
</hansl>
    
    Having said this, though, there's a more general point, on the check for 
positive definiteness of S. If you reparametrise the problem, you can make 
S pd by construction simply optimising over the elements of the Cholesky 
factor of S rather than S itself. This is a very nice trick, which saves 
you lots of intermediate computation, works quite well in practice and is 
trivial to generalise to any number of columns of q. For example:
<hansl>
nulldata 128
series N1 = normal()
series N2 = normal()
scalar s1 = 1
scalar s2 = 1
scalar c12 = 0.5
matrix q = {N1, N2}
matrix S = I(2)
matrix theta = vech(S)
mle logl = -0.5 * (qqq + ldet(S))
     matrix K = lower(unvech(theta))
     matrix S = K*K'
     matrix qq = q * invpd(S)
     series qqq = sumr(q.*qq)
     params theta
end mle
# check
Shat = q'q ./ $nobs
eval cholesky(Shat)
</hansl>
Hope this helps.
    ------------------------------------------------------- Riccardo (Jack) Lucchetti Dipartimento di Scienze Economiche e Sociali (DiSES) Universit? Politecnica delle Marche (formerly known as Universit? di Ancona) r.lucchetti@univpm.it http://www2.econ.univpm.it/servizi/hpp/lucchetti