Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.
From | "Thomas, Anthony" <anthony_h_thomas@brown.edu> |
To | statalist@hsphsun2.harvard.edu |
Subject | Re: st: do loops and mata |
Date | Thu, 13 Mar 2014 12:04:02 -0400 |
But regardless of which matrix you want to store, Mark is correct that P = P[i,.] will overwrite the original matrix P which is not good, so if indeed the Pi matrices need to be stored, just use some new name like: W = P[i, .] M[i] = &W Anthony On Thu, Mar 13, 2014 at 11:59 AM, Thomas, Anthony <anthony_h_thomas@brown.edu> wrote: > It seemed like the "Pi" were the matrices Jonathan wanted to store > (since he wanted them named P1- P39) and I thought "Pi" was an attempt > to do P`i' as one would in Stata, but the principle is the same either > way. > > Thanks, > > Anthony > > On Thu, Mar 13, 2014 at 11:38 AM, Schaffer, Mark E > <M.E.Schaffer@hw.ac.uk> wrote: >> Jonathan, Anthony, >> >> I think there might be a typo or 2 in Anthony's code (e.g., "M[i] = &P") but I agree with Anthony that this is the way to go. >> >> Below his code but with (I think) the typos fixed. I also changed M to a column vector (easier to read). >> >> --Mark >> >> mata >> >> P = st_data( ., ("ee", "eu" ,"ue", "uu") ) >> >> M = J(rows(P), 1, NULL) >> >> for ( i=1; i<=rows(P) ;i++) { >> >> Pi = P[i,.] >> xi = rowshape(Pi,2) >> // store xi in M >> M[i] = &xi >> >> } >> >> // look at M >> M >> // not useful - just a bunch of memory junk >> >> // get 10th matrix >> *M[10] >> >> end >> >>> -----Original Message----- >>> From: owner-statalist@hsphsun2.harvard.edu [mailto:owner- >>> statalist@hsphsun2.harvard.edu] On Behalf Of Thomas, Anthony >>> Sent: 13 March 2014 15:18 >>> To: statalist@hsphsun2.harvard.edu >>> Subject: Re: st: do loops and mata >>> >>> Hi Jonathan, >>> >>> You could also try putting each matrix in an array in Mata. They >>> wouldn't have a nice naming system like Stata matrices do, but then >>> your code could be contained to Mata. Note that as Nick points out, >>> this may be needlessly complicated, but if you're interested in a Mata >>> only solution this is what I would do. >>> >>> **************** CODE **************** >>> >>> P = st_data( ., ("ee", "eu" ,"ue", "uu") ) P >>> >>> // assuming P has 39 rows...? >>> M = J(1, 39, NULL) >>> >>> for ( i=1; i<=rows(P) ;i++) { >>> >>> P= P[i,.] >>> P >>> // store P in M >>> M[i] = &P >>> >>> xi=rowshape( Pi, 2) >>> xi >>> >>> } >>> >>> ****************** END **************** >>> >>> The matrix M holds pointers to the 39 smaller matrices P1 - P39. These >>> pointers tell the computer where the 39 small matrices are stored in >>> the system's memory. Then you can ask Mata to retrieve one of the >>> matrices by doing the following: >>> >>> // look at M >>> M >>> // not useful - just a bunch of memory junk >>> >>> // get 34th matrix >>> *M[34] >>> >>> Others may have a better solution, but this is just what came to mind. >>> Arrays are cool in general and come in handy in a variety of >>> situations. >>> >>> Anthony >>> >>> >>> On Thu, Mar 13, 2014 at 10:36 AM, <J.Wadsworth@lse.ac.uk> wrote: >>> > Thanks again Nick. I'll persevere using the old command structure >>> > >>> > The reason I need the sequence of matrices is that my colleagues and I are >>> writing a paper that involves decomposing the contribution of labour market >>> transition probabilities to changes in the labour market stocks. After some >>> algebra this essentially involves multiplying the sequence of transition >>> probability matrices from t= 1 to t=t. So I need to refer specifically to each >>> transition matrix at each period t and loop this because the calculation will be >>> different at each t (involve a different set of matrices) >>> > >>> > Hope that makes things a little more transparent. Let me know if mata ever >>> gets macros >>> > >>> > Jonathan >>> > >>> > -----Original Message----- >>> > From: owner-statalist@hsphsun2.harvard.edu [mailto:owner- >>> statalist@hsphsun2.harvard.edu] On Behalf Of Nick Cox >>> > Sent: 13 March 2014 14:10 >>> > To: statalist@hsphsun2.harvard.edu >>> > Subject: Re: st: do loops and mata >>> > >>> > The short answer is that there is no exact Stata equivalent, because Mata as >>> such does not have macros. But although you did not specify an exact Mata >>> equivalent, I guess the longer answer would depend on what you want to do >>> with these matrices. It could be that you need something deeper, e.g. pointers >>> or structures. >>> > >>> > Indeed, although it's always fair just to ask about language details as a matter >>> of curiosity, I remain very puzzled why you want to do this. I've never wanted to >>> do anything like this in Mata: that means no more than it says, and can be put >>> down to narrowness of my experience, but it's why I am puzzled. >>> > Nick >>> > njcoxstata@gmail.com >>> > >>> > >>> > On 13 March 2014 13:48, <J.Wadsworth@lse.ac.uk> wrote: >>> >> Dear Nick >>> >> >>> >> Thanks for the quick response. The commands is indeed almost >>> >> equivalent to vec (except I need to go from a 39X4 matrix to 39 2 by >>> >> 2 matrices rather than a column vector ) but I still need a loop to >>> >> extract the 39 separate matrices and label them differently >>> >> >>> >> I can do this in the old matrix sequence using the commands >>> >> >>> >> mkmat ee eu ue uu, matrix(P) >>> >> matrix list P >>> >> >>> >> local i=1 >>> >> while `i'<=rowsof(P) { >>> >> matrix P`i'= P[`i',1...] /* loops to give 39 different 1 by 4 matrices of >>> transition probabilities */ >>> >> local i=`i'+1 >>> >> } >>> >> >>> >> matrix list P1 >>> >> matrix list P39 >>> >> >>> >> but I was interested in doing the mata equivalent >>> >> >>> >> thanks again >>> >> >>> >> Jonathan Wadsworth >>> >> >>> >> >>> >> -----Original Message----- >>> >> From: owner-statalist@hsphsun2.harvard.edu >>> >> [mailto:owner-statalist@hsphsun2.harvard.edu] On Behalf Of Nick Cox >>> >> Sent: 13 March 2014 12:49 >>> >> To: statalist@hsphsun2.harvard.edu >>> >> Subject: Re: st: do loops and mata >>> >> >>> >> This looks like a way of reinventing -stack-. Am I wrong? >>> >> >>> >> Nick >>> >> njcoxstata@gmail.com >>> >> >>> >> >>> >> On 13 March 2014 12:34, <J.Wadsworth@lse.ac.uk> wrote: >>> >> >>> >>> As a novice to mata I'm trying to generate a set of 39 matrices using >>> >>> a loop - essentially extracting each row of a larger matrix P >>> >>> sequentially and then transforming the vector into a matrix using the >>> >>> rowshape command >>> >>> >>> >>> I've got as far as this - which does indeed scroll through a matrix P >>> >>> 39 times and extract a row at a time and writes to a mtrix Pi, but >>> >>> then it overwrites the matrix Pi each time so that I'm left with just >>> >>> one matrix called Pi at the end of the loop instead of 39 matrics >>> >>> called P1--P39 >>> >>> >>> >>> Does anyone know how to adapt the code below to generate and store 39 >>> different matrices named p1, p2, ..p39 ? >>> >> >>> >>> mata >>> >>> >>> >>> >>> >>> P = st_data( ., ("ee", "eu" ,"ue", "uu") ) P >>> >>> >>> >>> for ( i=1; i<=rows(P) ;i++) { >>> >>> >>> >>> Pi= P[i,.] >>> >>> Pi >>> >>> >>> >>> xi=rowshape( Pi, 2) >>> >>> xi >>> >>> >>> >>> } >>> >>> >>> >>> end >>> >> >>> >> * >>> >> * 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/ >>> >> >>> >> Please access the attached hyperlink for an important electronic >>> >> communications disclaimer: http://lse.ac.uk/emailDisclaimer >>> >> >>> >> * >>> >> * 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/ >>> > >>> > Please access the attached hyperlink for an important electronic >>> communications disclaimer: http://lse.ac.uk/emailDisclaimer >>> > >>> > * >>> > * 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/ >> >> >> ----- >> Sunday Times Scottish University of the Year 2011-2013 >> Top in the UK for student experience >> Fourth university in the UK and top in Scotland (National Student Survey 2012) >> >> We invite research leaders and ambitious early career researchers to >> join us in leading and driving research in key inter-disciplinary themes. >> Please see www.hw.ac.uk/researchleaders for further information and how >> to apply. >> >> Heriot-Watt University is a Scottish charity >> registered under charity number SC000278. >> >> >> * >> * 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/