|  | 
[Date Prev][Date Next][Thread Prev][Thread Next][Date index][Thread index]
st: Accept-reject procedure and -drawnorm- for simulating likelihood in -ml-
Dear Statalisters
I am writing a program that calculates the log likelihood value for 
use in -ml-. The density function that I am maximising does not have 
a closed form solution as it depends on three random coefficients. 
Simulating the density function requires drawing from the truncated 
trivariate normal distribution which I am attempting to do using the 
accept-reject method.  This first involves generating a set of three 
random numbers using -drawnorm- and dropping the observations that 
are not within the accepted range, using the accepted observations to 
simulate the density.
The problem with the accept-reject approach as described above is 
that I would need to drop the data (using -drop _all-), which also 
drops the temporary variables that Stata generates for -ml- such as 
the lnf and coefficient vectors. I attempted to use scalars to 
capture the values of the coefficient vectors as I require them for 
the intermediate calculations. I have also tried to preserve the data 
prior to dropping them and for which Stata automatically restores 
after the program ends.
There must have been something wrong with my approach because while 
implementing -ml check-, Stata returns the following message:
"The initial values are not feasible.  This may be because the 
initial values have been chosen poorly or because there is an error 
in progname and it always returns missing no matter what the 
parameter values."
I would appreciate if someone could point out where I had gone wrong. 
Is there a better way to generate draws from a truncated multivariate 
normal distribution? Thanks.
The beginning segment of my code is as follows:
****************
cap prog drop progname
program define poinorm_mlv3
version 9.0
args lnf theta1 theta2 theta3 theta4 theta5 theta6
/*Capture coefficient vectors as scalars prior to drop _all*/
tempname rho12 rho13 rho23 /*Correlation matrix*/
scalar `rho12'=[exp(2*`theta4')-1]/[exp(2*`theta4')+1]
scalar `rho13'=[exp(2*`theta5')-1]/[exp(2*`theta5')+1]
scalar `rho23'=[exp(2*`theta6')-1]/[exp(2*`theta6')+1]
if (`rho12'==. | `rho13'==. | `rho23'==.) {
qui replace `lnf'=.
exit
}
matrix Sig = (1 , `rho12' , `rho13' \ /* /*Construct corr mat*/
*/`rho12' , 1 , `rho23' \ /*
*/`rho13' , `rho23' , 1 )
matrix symeigen X V = Sig /*Test for positive df*/
if V[1,3] <= 0 {
qui replace `lnf' =.
exit
}
mat M = inv(Sig)
local repl = 5 /*Number of replications*/
local n = _N /*Sample size for density function*/
tempname xb1 xb2 xb3 y1 y2 y3
scalar `xb1' = `theta1' /*Capture xbs*/
scalar `xb2' = `theta2'
scalar `xb3' = `theta3'
scalar `y1' = $ML_y1 /*Capture depvars*/
scalar `y2' = $ML_y2
scalar `y3' = $ML_y3
preserve
qui drop _all /*drop data and variables*/
/* Using -drawnorm- to generate random numbers, accept and reject. */
 
*
*   For searches and help try:
*   http://www.stata.com/support/faqs/res/findit.html
*   http://www.stata.com/support/statalist/faq
*   http://www.ats.ucla.edu/stat/stata/