Hi Nick,
The problem is that I don't have much knowledge of maximum likelihood
estimating. I've been told that it is a duration model (hazu is then
the hazard function and survu the survivor function). Someone asked me
if I could program some TSP programs in Stata for the use of students
and I succeeded for some simpler programs. This one, however, is
running okay, but (after more than half an hour) I stop the program,
because it does not seem to work correctly. First of all, the
likelihoods are positive and keeps on growing (to me, this looks
wrong). And well, it keeps on calculating something (I'm using Stata
10 by the way). And the last thing why I think it is not calculating
what it is supposed to be, is that the function ua needs only one
coefficient to be calculated, whereas my program has two (in theta1
and in theta2). So I need some 'trick' to let Stata know that it is
the same coefficient (some kind of constraint maybe). The TSP formula
looks like this: frml ua exp(exit*(lu0000a+hazu)-exp(lu0000a)*survu);
(where it is first defined: frml exit uncc; and the function covu, lu0
... lu15, hazu and survu)
Thanks for your comment. Unfortunately, it was not such a simple thing
as a space.
Best,
Lenny
clear
set memory 300m
use fi
gen trt39t52=tr*(t39+t52)
capture program drop myml
program define myml
args lnf covu lu0 lu1 lu2 lu3 lu4 lu5 lu6 lu7 lu8 lu9 lu10
lu11 lu12 lu13 lu14 lu15 theta1 theta2
tempvar hazu survu ua
quietly gen double `hazu' =
`covu'+`lu0'+dtu1*`lu1'+dtu2*`lu2'+dtu3*`lu3'+dtu4*`lu4'+dtu5*`lu5'+dtu6*`lu6'+dtu7*`lu7'+dtu8*`lu8'+dtu9*`lu9'+dtu10*`lu10'+dtu11*`lu11'+dtu12*`lu12'+dtu13*`lu13'+dtu14*`lu14'+dtu15*`lu15'
quietly gen double `survu' =
exp(`covu'+`lu0')*(btu0+btu1*exp(`lu1') + btu2*exp(`lu2') +
btu3*exp(`lu3') +
btu4*exp(`lu4')+btu5*exp(`lu5')+btu6*exp(`lu6')+btu7*exp(`lu7')+btu8*exp(`lu8')+btu9*exp(`lu9')+btu10*exp(`lu10')+btu11*exp(`lu11')+btu12*exp(`lu12')+btu13*exp(`lu13')+btu14*exp(`lu14')+btu15*exp(`lu15'))
quietly gen double `ua' = exp(`theta1'+uncc*`hazu'-`theta2')
replace `lnf' = log(`ua')
end
ml model lf myml (covu: age married single divorced sfrau f_marr
f_single f_divor lehre med_educ hi_educ lwage ein_zus bc seasonal
manuf pnon ten72 y1988 y1989 y1990 y1991 q2 q3 q4, nocons) (lu0: tr
t39 t52 trt39t52 after0 tr_a0 t39_a0 t52_a0 t39tra0 t52tra0, nocons)
(lu1: tr t39 t52 trt39t52 after1 tr_a1 t39_a1 t52_a1 t39tra1 t52tra1)
(lu2: tr t39 t52 trt39t52 after2 tr_a2 t39_a2 t52_a2 t39tra2 t52tra2)
(lu3: tr t39 t52 trt39t52 after3 tr_a3 t39_a3 t52_a3 t39tra3 t52tra3)
(lu4: tr t39 t52 trt39t52 after4 tr_a4 t39_a4 t52_a4 t39tra4 t52tra4)
(lu5: tr t39 t52 trt39t52 after5 tr_a5 t39_a5 t52_a5 t39tra5 t52tra5)
(lu6: tr t39 t52 trt39t52 after6 tr_a6 t39_a6 t52_a6 t39tra6 t52tra6)
(lu7: tr t39 t52 trt39t52 after7 tr_a7 t39_a7 t52_a7 t39tra7 t52tra7)
(lu8: tr t39 t52 trt39t52 after8 tr_a8 t39_a8 t52_a8 t39tra8 t52tra8)
(lu9: tr t39 t52 trt39t52 after9 tr_a9 t39_a9 t52_a9 t39tra9 t52tra9)
(lu10: tr t39 t52 trt39t52 after10 tr_a10 t39_a10 t52_a10 t39tra10
t52tra10) (lu11: tr t39 t52 trt39t52 after11 tr_a11 t39_a11 t52_a11
t39tra11 t52tra11) (lu12: tr t39 t52 trt39t52 after12 tr_a12 t39_a12
t52_a12 t39tra12 t52tra12) (lu13: tr t39 t52 trt39t52 after13 tr_a13
t39_a13 t52_a13 t39tra13 t52tra13) (lu14: tr t39 t52 trt39t52 after14
tr_a14 t39_a14 t52_a14 t39tra14 t52tra14) (lu15: tr t39 t52 trt39t52
after15 tr_a15 t39_a15 t52_a15 t39tra15 t52tra15) (theta1: uncc)
(theta2: `survu'), technique(bhhh)
ml check
ml maximize
2008/3/4, Nick Cox <[email protected]>:
> My guess is that you need to hide less and show and explain more.
>
> If you -set trace on- where does the program crash?
>
> The error code you cite, 111, is invalid syntax, which by itself is
> not helpful.
>
> replace`lnf' = log(`ua')
>
> would very probably not work. There needs to be a space after -replace-.
>
>
> Nick
> [email protected]
>
> Lenny Stoeldraijer
>
> I'm trying to make my own maximum likelihood model, but I can't get it
> right. The first part looks okay (I think), but then I have to define
> the function which is called ua, which looks like:
> exp(uncc*(b+hazu)-exp(b)*survu), where b is the coefficient to be
> estimated. This coefficient is thus used twice but once with an
> exponential. So far, my code looks like this (I've left some parts
> out):
>
> program define myml
> args lnf covu lu0 lu1 lu2 ... theta1 theta2
> tempvar hazu survu ua
> quietly gen double `hazu' = `covu'+`lu0'+dtu1*`lu1'+dtu2*`lu2'+...
> quietly gen double `survu' =
> exp(`covu'+`lu0')*(btu0+btu1*exp(`lu1')+btu2*exp(`lu2')+...
> quietly gen double `ua' = exp(`theta1'+uncc*`hazu'-`theta2')
> replace`lnf' = log(`ua')
> end
> ml model lf myml (covu: ... , nocons) (luo: ... , nocons) (lu1:...)
> (lu2:...) ... (theta1: uncc) (theta2: `survu'), technique(bhhh)
>
> In the code I thus have different estimates for the b (once in theta1
> and once in theta2). I've tried to include a constraint (e.g.
> b1=log(b2)), but then I get errors (111 for example).
>
>
> *
> * 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/
>
*
* 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/