# Re: st: Tough ML Model

 From wgould@stata.com (William Gould, Stata) To statalist@hsphsun2.harvard.edu Subject Re: st: Tough ML Model Date Mon, 23 Feb 2004 08:21:22 -0600

```Michael Kunz <kunzf@musc.edu> offers the following -ml- method lf
likelihood evaluator,

program define dbdc
args lnf Xb
tempvar YY YN NY NN

quietly {
gen double `YY' = ln(norm(ratelow -`Xb'))
gen double `NN' = ln(norm(rateup- `Xb'))
gen double `YN' = ln(norm(rate1-`Xb')  - 1 +
norm(ratelow-`Xb'))
gen double `NY'=  ln(norm(rateup-`Xb') -1 +
norm(rate1 - `Xb'))
replace `lnf' = yy*`YY' + yn*`YN' + ny*`NY' + nn*`NN'
}
end

He writes,

> I am having trouble getting the following maximum likelihood function to
> work - stata cannot find initial values that will yield a nonmissing log
> likelihood function.
>
> I've done ML check, ML search. I am about to switch methods from LF to D2 to
> see if this method will produce better results.
>
> Any suggestions, tips, existing programs out there?

Method -d2- is not going to help; better to fix this program and then, if
there are convergence problems, consider switching to method d2.

Debugging should be easy.  Based on Stata's response, we know virtually any
value of `Xb' results in `lnf' being missing, so let's use `Xb'=0 and then,
one at a time, type the statements and look at the result.  For instance,

. gen double YY = ln(norm(ratelow))
. summ YY

Make sure there are no missing values.  If there are, perhaps it is because
ratelow is missing.  Anyway, just keep going like that until you spot the
problem.

By the way, in quoting the program above, I added a couple of close
parentheses to make the parens balance; so Michael should look at his
code carefully.  For instance, in Michael's original email, he wrote

gen double `YN' = ln(norm(rate1-`Xb')  - 1 +
norm(ratelow-`Xb')
^
|
note missing paren

I stuck the paren where I thought it belonged.

Concerning this statement, I have one other suggested improvement:

gen double `YN' = ln(-norm(`Xb'-rate1) +
norm(ratelow-`Xb'))

That is, I substitute

-norm(`Xb'-rate1)    for    norm(rate1-`Xb')-1

I think I did that right, yes?  F(-x) = 1-F(x).  Expressions like
1-F(x) (or F(x)-1) are to be avoided because subtraction from 1
introduces lots of roundoff error.  I do not think this is Michael's
problem, but I would not be surprised if, later, once the initial-value
problem is solved, F(x)-1 rather than -F(-x) causes him convergence
problems.

-- Bill
wgould@stata.com
*
*   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/
```