Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.
From | Kit Baum <kitbaum@me.com> |
To | statalist@hsphsun2.harvard.edu |
Subject | re: Re: st: Use of matrix values in generate statements |
Date | Sat, 26 Mar 2011 21:40:55 -0400 |
<> Nick said I want to add a footnote. Here is a basic technique for using a lookup matrix to populate a variable z. I mix algebra with Stata. The idea is that variables x and y tell you which row and column of the matrix to use. matrix lookup = ... gen z = . forval i = 1/I { forval j = 1/J { quietly replace z = lookup[`i', `j'] if x == `i' & y == `j' } } I am just using -forval- to turn Daniel's statements into a double loop over possibilities. Nick is of course quite correct in noting that Dan's frustration in translating logic into ado-file code can be handled very well this way by a double loop. For a relatively small problem (where there are not too many values in the lookup matrix, and where you're trying to apply the lookup to a sample of modest size) this will work just fine. However, it must enumerate all of the (in Dan's case, 144) possibilities and issue (in Dan's case, 144) -replace- statements for each possibility. Stata has an overhead, as Nick well knows, for -replace-, as Stata must keep track of how many changes are being made. The Mata logic which I presented is (horror!) a loop over observations, but the compiled code is so fast that I had to kick the sample size to 1 million before -rmsg- would register more than a fraction of one second to perform the loop. I haven't tried timing Nick's option (and to be fair I would have to generate more elaborate fake data to really test it) but I wager it will take more than 8 or 9 seconds to perform those 144 replace commands on 1 million observations. Kit Baum kitbaum@me.com * * 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/