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 |
Nick Cox <njcoxstata@gmail.com> |

To |
statalist@hsphsun2.harvard.edu |

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

Date |
Fri, 22 Mar 2013 10:26:28 +0000 |

Correct on the typo; thanks for the fix. I'm recalling the problem with interactive use of Mata within a loop; the -end- statement is misinterpreted. Nick On Thu, Mar 21, 2013 at 8:10 PM, Tomáš Houška <xbender@gmail.com> wrote: > 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/ * * 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/

**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>

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

- Prev by Date:
**Re: Fwd: st: -args- how to flag when missing or too many arguments** - Next by Date:
**Re: Fwd: st: -args- how to flag when missing or too many arguments** - Previous by thread:
**Re: st: mata programming - input type** - Next by thread:
**st: calculating the whiskers on a boxplot using -twoway-** - Index(es):