Notice: On March 31, it was **announced** that Statalist is moving from an email list to a **forum**. The old list will shut down on April 23, and its replacement, **statalist.org** is already up and running.

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

From |
Tomáš Houška <xbender@gmail.com> |

To |
statalist@hsphsun2.harvard.edu |

Subject |
Re: st: mata programming - input type |

Date |
Thu, 21 Mar 2013 21:10:22 +0100 |

Hi Nick, no problem. I got your point about carrying over Stata macros into Mata from the previous post. I found that information useful, even though I could not implement it to solve my current problem :-) The example that you have posted works great - thank you for that! (maybe one pointer for future readers about a small typo - second line inside the Mata environment should read for(i = 1; i <= length(ids); i++) { Thank you! Tomas 2013/3/21 Nick Cox <njcoxstata@gmail.com>: > You're right. I eat my words: that kind of interactive use within a > loop does not work. I've evidently never tried that, or forgotten > trying it. > > I was thinking that you were asserting generally that you can't call > up Mata within a loop, which is wrong, because many programs do it. > > But not in that way. > > So what I suggest is that you turn it round and write something like this > > levelsof time_period, local(period_id) > mata > ids = tokens(st_local("period_id")) > for(i = 1; i <= length(tokens); i++) { > EPSILON = st_matrix("EPSILON_M" + ids[i]) > PRICE = st_matrix("PRICE_M" + ids[i]) > ... > } > end > > Nick > > On Thu, Mar 21, 2013 at 6:53 PM, Tomáš Houška <xbender@gmail.com> wrote: >> Hello Nick, >> >> thank you for your help. I have been surprised by your answer as I >> have met several discussions on Statalist talking about how Mata >> cannot be processed within Stata loop. I have tried your proposal but >> I am running into a problem comparable to the problem described in the >> above mentioned discussions. >> >> Even in a very trivial example, in which I just want to list the macro >> carried over from Stata to Mata: >> >> levelsof time_period, local(period_id) >> >> foreach period of local period_id { >> >> mata >> mata_period = st_local("period") >> mata_period >> end >> } >> >> ... I get an error "-Break- r(1); " and the values of mata_period are >> not shown. I expect this to be a comparable problem as e.g. >> http://www.stata.com/statalist/archive/2007-07/msg00834.html >> A solution to that would be establishing a mata function (taking >> "time_period" as an argument) that I will call within the stata loop, >> Or am I missing something? >> >> Thank you , >> Tomas >> >> >> >> >> 2013/3/21 Nick Cox <njcoxstata@gmail.com>: >>> It's just not true that Mata cannot be processed within a Stata loop, >>> but that does not seem to be the problem here. >>> >>> The lack of macros in Mata poses challenges that are more evident than >>> real to many programmers who know a lot of Stata. The question was >>> addressed in >>> >>> SJ-11-2 pr0052 . . . . Stata tip 100: Mata and the case of the missing macros >>> . . . . . . . . . . . . . . . . . . . . . . . . W. Gould and N. J. Cox >>> Q2/11 SJ 11(2):323--324 (no commands) >>> tip showing how to do the equivalent of Stata's macro >>> substitution in Mata >>> >>> and the gnomic answer is to solve the problem by avoiding it. >>> >>> In the Tip above the main contribution of the junior author (meaning, >>> younger by just about 2 months) was to add a Perry Mason-type title to >>> the work of the senior author. >>> >>> One good method is to pass macros once to Mata and thereafter to use >>> Mata's string operators and functions. >>> >>> Try this: >>> >>> levelsof time_period, local(period_id) >>> >>> foreach period of local period_id { >>> mata >>> //import STATA matrices >>> period = st_local("period") >>> EPSILON = st_matrix("EPSILON_M" + period) >>> PRICE = st_matrix("PRICE_M" + period) >>> ... >>> end >>> } >>> >>> So, >>> >>> 1. -period- in Mata is just a string scalar containing the same same >>> contents as a Stata local macro. >>> >>> 2. Adding that string scalar to given text is quite enough technique >>> for what you want. >>> >>> 3. More complicated manipulations just need e.g. string functions in Mata. >>> >>> Nick >>> >>> On Wed, Mar 20, 2013 at 10:16 PM, Tomáš Houška <xbender@gmail.com> wrote: >>> >>>> I am trying to write this loop (here I give an example in "stata >>>> language", but I am aware that this will never work as mata cannot be >>>> processed within Stata loop): >>>> >>>> Example: >>>> >>>> levelsof time_period, local(period_id) >>>> >>>> foreach period of local period_id { >>>> mata >>>> //import STATA matrices >>>> EPSILON = st_matrix("EPSILON_M`period'") >>>> PRICE = st_matrix("PRICE_M`period'") >>>> SHARE = st_matrix("SHARE_M`period'") >>>> >>>> BETA = EPSILON :* ( (SHARE *(1:/PRICE)') ) >>>> >>>> st_matrix("BETA`period'",BETA) >>>> >>>> end >>>> } >>>> >>>> Which means I have several matrices, each marked by period number and >>>> I am trying to perform some operations on them (here I give a >>>> simplified example of my code). I would like to create a mata function >>>> that would take "period_id" as an input (period_id is always in >>>> integer) and process the mata code, resulting in creating new matrix >>>> BETA`period_id'. >>>> >>>> So far I have been able to come up with this: >>>> Example 2: >>>> >>>> mata >>>> mata clear >>>> void mc_estim(string scalar period) { >>>> //import STATA matrices >>>> EPSILON = st_matrix("EPSILON_M`period'") >>>> PRICE = st_matrix("PRICE_M`period'") >>>> SHARE = st_matrix("SHARE_M`period'") >>>> >>>> BETA = EPSILON :* ( (SHARE *(1:/PRICE)') ) >>>> >>>> st_matrix("BETA`period'",BETA) >>>> } >>>> end >>>> * run mata function with a selected input >>>> mata mc_estim(534) >>>> >>>> But I am not sure how to use the "input" in the mata function code (I >>>> expect that the notation is different from Statas local macros....) I >>>> would appreciate any help on this. > > * > * For searches and help try: > * http://www.stata.com/help.cgi?search > * http://www.stata.com/support/faqs/resources/statalist-faq/ > * http://www.ats.ucla.edu/stat/stata/ * * For searches and help try: * http://www.stata.com/help.cgi?search * http://www.stata.com/support/faqs/resources/statalist-faq/ * http://www.ats.ucla.edu/stat/stata/

**Follow-Ups**:**Re: st: mata programming - input type***From:*Nick Cox <njcoxstata@gmail.com>

**References**:**st: mata programming - input type***From:*Tomáš Houška <xbender@gmail.com>

**Re: st: mata programming - input type***From:*Nick Cox <njcoxstata@gmail.com>

**Re: st: mata programming - input type***From:*Tomáš Houška <xbender@gmail.com>

**Re: st: mata programming - input type***From:*Nick Cox <njcoxstata@gmail.com>

- Prev by Date:
**Re: st: Combining two datafiles- Union(AND), not Intersection (merge) or Stack (append)** - Next by Date:
**st: gllamm level 1 variance in dyadic analysis** - Previous by thread:
**Re: st: mata programming - input type** - Next by thread:
**Re: st: mata programming - input type** - Index(es):