Thanks for this. I can't follow the question embedded here about e(b), but I wouldn't infer any special properties necessarily. Sometimes one's misunderstandings cancel and the right answer arrives for the wrong reason.
I think it's fair to say that the Mata manuals are pitched at a different level from the Stata manuals with different assumptions about the motivation and knowledge of the readership. If you don't know some programming already, learning Mata would be a tough call. That leaves enormous scope for user-friendly introductions, such as Kit's new book.
Nick
[email protected]
Thomas Jacobs
Thanks very much for taking the time to examine the code and provide
suggested improvements. I cannot disagree with any of your comments
and your code produces identical results to what I had. By way of
explanation, I posted the first version I was able to get working and
even then missed that rather than calling the eofb matrix I created
upstream in stata for the purpose of passing to this mata function, I
still had the "e(b)" matrix eofb was created from in the mata function
and was surprised it still worked. So I take it there is some
property of e matrices that they are still seen in an ado mata
function whereas any matrices I create myself within stata have to be
explicitly passed. I appreciated all of your efficiency comments,
particularly the elimination of creating local macros within the ado
and simply referring to the passed parameters as real scalars within
the function directly as my prior attempts to do this had been
unsuccessful. IMHO, the stata manuals are rather sparse and confusing
regarding passing arguments to a mata function (page 13 of [M-1] ado)
so again I appreciate your taking the time to modify my example.
Finally, the entire purpose of this little routine was to save me time
scrolling up and down in the event window around the blocks of mata
code created by repeatedly implementing this within the do file
directly. I only posted it in hope that if someone else ran into this
they might find a working, albeit inefficient, example of passing a
stata matrix to a mata function in an ado.
On Sun, Mar 1, 2009 at 11:51 AM, Nick Cox <[email protected]> wrote:
>
> There seems to be scope for simplifying the code here. For example,
> in your calling program -scolfirm- is a local macro containing a number.
>
> You could just pass that to your Mata function as a real scalar. The
> same goes for some other arguments.
>
> Also, you do the double conversion
>
> strtoreal(st_local("scolFirm"))
>
> twice, which is not necessary.
>
> On a different point, there are so many wired-in constants here that it
> is difficult to see any gain over a few lines of a do-file. Perhaps you
> are working gradually towards a more general program.
>
> Here is a revised (and untested) version.
>
> program ProduceResults
>
> version 10.1
> mata: OutputFn("eofb","sFirmModelResults", `1', `2', `3')
>
> end
>
> version 10.1
> mata:
> void OutputFn(eofb,sFirmModelResults, real scalar Begin, real scalar
> End, real scalar Firm)
> {
> printf("Results for Event Period beginning with trading day
> %4.0f and
> ending at day %4.0f.\n", Begin, End)
> FirmModelVar = st_matrixcolstripe("e(b)")[.,2]
> printf("Average Firm Adjusted R Square %12.4f\n",
> st_matrix(sFirmModelResults)[1,Firm])
> printf("\n")
>
> printf("{txt}Average Firm Model{c |} Coef SampSE
> t-stat p-val\n")
> printf("{hline 18}{c +}{hline 52}\n")
> for (mi=1; mi<= Firm-1; mi++) {
>
> printf("{txt} %13s {c |}", FirmModelVar[mi])
>
> for (mj=1; mj <=4; mj++) {
>
> printf("{res}
> %9.4f",st_matrix(sFirmModelResults)[mj,mi])
>
> }
>
> printf("\n")
>
> }
>
> }
> end
>
>
> Nick
> [email protected]
>
> Thomas Jacobs
>
> Well call me pig-headed but I just could not let go of this until I
> figured out how to get it working. In the end it required either
> converting mata values(matrices) to stata locals(matrices) so they
> could be passed to the mata function. I post it here not just for
> posterity but for anyone else trying to pass a stata matrix to a mata
> function within an ado file. Hopefully it will save someone the many
> hours I spent trying to get it to work. Both eofb and
> sFirmModelResults are stata matrices. The latter was created from a
> mata matrix FirmModelResults using
>
> st_replacematrix("sFirmModelResults",FirmModelResults)
>
> and the ado follows:
>
> program ProduceResults
>
> version 10.1
> local EventBeginDay "`1'"
> local EventEndDay "`2'"
> local scolFirm "`3'"
>
> mata: OutputFn("eofb","sFirmModelResults")
>
> end
>
> version 10.1
> mata:
> void OutputFn(eofb,sFirmModelResults)
> {
> printf("Results for Event Period beginning with trading day
> %4.0f and
> ending at day %4.0f.\n",
> strtoreal(st_local("EventBeginDay")),
> strtoreal(st_local("EventEndDay")))
>
> colFirm = strtoreal(st_local("scolFirm"))
>
> FirmModelVar = st_matrixcolstripe("e(b)")[.,2]
>
> printf("Average Firm Adjusted R Square %12.4f\n",
>
> st_matrix(sFirmModelResults)[1,strtoreal(st_local("scolFirm"))])
> printf("\n")
>
> printf("{txt}Average Firm Model{c |} Coef SampSE
> t-stat p-val\n")
> printf("{hline 18}{c +}{hline 52}\n")
> for (mi=1; mi<= colFirm-1; mi++) {
>
> printf("{txt} %13s {c |}", FirmModelVar[mi])
>
> for (mj=1; mj <=4; mj++) {
>
> printf("{res}
> %9.4f",st_matrix(sFirmModelResults)[mj,mi])
>
> }
>
> printf("\n")
>
> }
>
> }
> end
*
* 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/