Bookmark and Share

Notice: On March 31, it was announced that Statalist is moving from an email list to a forum. The old list will shut down at the end of May, and its replacement, statalist.org is already up and running.


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

st: RE: Optimize for 2 unknowns looping over observations using Mata


From   Nick Cox <n.j.cox@durham.ac.uk>
To   "'statalist@hsphsun2.harvard.edu'" <statalist@hsphsun2.harvard.edu>
Subject   st: RE: Optimize for 2 unknowns looping over observations using Mata
Date   Mon, 5 Mar 2012 16:53:00 +0000

I started reading and got to a call 

      x = st_data( i,

in which you refer to "i", which is not an argument of the function nor defined earlier. But seemingly it worked. So I guess you are asking us to comment on code that is not self-contained. 

I decline to count parentheses for you; I have too many of my own to care for.... 

Nick 
n.j.cox@durham.ac.uk 

William Pratt

I am trying to optimize two unknowns while looping over observations.
I receive the statements "too many )", "x not found" or  "anything but
for is expected where found", as this is my first transition to mata
from stata, I would greatly appreciate any advice / help, my script is
presented below, and the error reporting further down.
I have referred to prior postings:
      - Using for within Mata optimize to loop over observations,
http://www.stata.com/statalist/archive/2009-02/msg00668.html
      - Setting up optimize for 2 equations in 2 unknowns,
http://www.stata.com/statalist/archive/2008-07/msg01027.html


**time and sqrtT are constant
**sige, Ix, divrate, rf, ve


gen double a = .
gen double b = .
mata
void bsmp0(todo, p, x, lnf, g, H)
 {
      a = p[1]
      b = p[2]
      x = st_data( i,("sige", "Ix", "divrate", "rf", "time", "ve", "sqrtT"))

	f1= a * exp(-x[3]*x[5])*normal(ln(a/x[2])+x[5]*(x[4]-x[3]+(b^2/2)))/(b*x[7]))
	f2= x[2]*exp(-x[4]*x[5])*normal(ln(a/x[2])+x[5]*(x[4]-x[3]+(b^2/2)))/(b*x[7]))
	f3= (1-exp(-x[3]*x[5]))*a-x[6]
	f4=  ((a*b*exp(-x[3]*x[5]))/x[6])*normal(ln(a/x[2])+
x[5]*(x[4]-x[3]+(b^2/2)))/(b*x[7]))-x[1]
	lnf = (f1-f2)^2+(f3-f4)^2
}
  for(i=1;i<=st_nobs();i++) {
   S = optimize_init()
   optimize_init_evaluator(S, &bsmp0())
   optimize_init_evaluatortype(s,"v0")
   optimize_init_params(S,(0,0))
   optimize_init_argument(S,1,i)
  p = optimize(S)
  st_store(i,"va", a)
  st_store(i,"siga", b)
   }
end


After trying numerous combinations based on help, the mata manual and
online guides, I am not sure how to proceed.

Thanks for your consideration,

William


. mata
------------------------------------------------- mata (type end to
exit) ----------------------------------------

: void bsmp0(todo, p, x, lnf, g, H)
>  {
>       a = p[1]
>       b = p[2]
>       x = st_data( i,("sige", "x", "divrate", "r", "time", "ve", "sqrtT"))
>
> f1= a * exp(-x[3]*x[5])*normal(ln(a/x[2])+x[5]*(x[4]-x[3]+(b^2/2)))/(b*x[7]))
too many ')'
r(3000);
:
: f2= x[2]*exp(-x[4]*x[5])*normal(ln(a/x[2])+x[5]*(x[4]-x[3]+(b^2/2)))/(b*x[7]))
too many ')'
r(3000);
:
: f3= (1-exp(-x[3]*x[5]))*a-x[6]
                 <istmt>:  3499  x not found
r(3499);
:
: f4=  ((a*b*exp(-x[3]*x[5]))/x[6])*normal(ln(a/x[2])+
x[5]*(x[4]-x[3]+(b^2/2)))/(b*x[7]))-x[1]
too many ')'
r(3000);
:
: lnf = (f1-f2)^2+(f3-f4)^2
                 <istmt>:  3499  f1 not found
r(3499);
:
: }
expression invalid
r(3000);
:
:   for(i=1;i<=st_nobs();i++) {
>    S = optimize_init()
>    optimize_init_evaluator(S, &bsmp0())
>    optimize_init_evaluatortype(s,"v0")
>    optimize_init_params(S,(0,0))
>    optimize_init_argument(S,1,i)
>   p = optimize(S)
>   st_store(i,"va", a)
>   st_store(i,"siga", b)
>    }
                 <istmt>:  3499  s not found
r(3499);

*
*   For searches and help try:
*   http://www.stata.com/help.cgi?search
*   http://www.stata.com/support/statalist/faq
*   http://www.ats.ucla.edu/stat/stata/


© Copyright 1996–2014 StataCorp LP   |   Terms of use   |   Privacy   |   Contact us   |   Site index