Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.
From | George Vega Yon <g.vegayon@gmail.com> |
To | statalist@hsphsun2.harvard.edu |
Subject | Re: st: Mata - extracting various vectors of different sizes in one loop |
Date | Thu, 4 Apr 2013 11:43:40 -0300 |
Dear Nicolas, I guess a more efficient way to do this would be filling a matrix and after that replacing the data in Stata. That way you won't need to make a fancy replacement during the loop; will be a clearer code. Best wishes! George George Vega Yon 7 647 2552 http://cl.linkedin.com/in/georgevegayon 2013/4/4 Matthew Baker <matthew.baker@hunter.cuny.edu>: > Nicholas -- > > I have run into this problem as well, but have a slightly different > solution (I'm not sure it's more elegant, though!) One thing that > wasn't quite clear from your message was whether or not the values you > were computing had to be placed in a particular place or if they could > just be listed "from the beginning of a row," so I assumed not. > > My solution is to create a matrix with a maximal number of columns and > then fill it in on the fly, and then get everything into stata using > st_view - which has the property that variables can be overwritten > from within mata. Anyways: > > clear all > set seed 8675309 > set obs 100 > mata: > > // Random lengths for vectors: > ni=J(100,1,1) > for (i=1;i<=100;i++) ni[i]=round(runiform(1,1)*20)+1 > > // Random vectors of random lengths placed in the array, > // Which will also store a scalar which is length: > > Z=J(100,30,.) > for (i=1;i<=100;i++) { > Stuff=runiform(1,ni[i]) > length=cols(Stuff) > Z[i,1::length]=Stuff > } > end > > local zvals > forvalues i=1/30 { > gen z`i'=. > local zvals "`zvals' z`i'" > } > mata > st_view(Ztemp=.,.,"`zvals'") > Ztemp[.,.]=Z > end > > On Thu, Apr 4, 2013 at 6:26 AM, nick bungy <nickbungystata@hotmail.co.uk> wrote: >> I have a mata code that cycles through grid references (eastings, northings) of x entities and calculates for each entity all the other entities which are within a 10km radius of it. >> So each individual entity has a row vector, with dimensions anywhere between 1 row (1 firm within 10km radius) and ~80 rows (80 firms within 10km radius). This is throwing up conformity errors when I try to store these vectors into a selection of ~80 variables in Stata. >> My thought was to artifically inflate all row vectors to say 100 and fill all of the extra cells in each row vector with 0, then I can extract to 100 variables without conformity errors. I can then clean this up quite easily using Stata functions. I'm not quite sure how to go about this though. >> My mata code is the following: >> >> mata: >> geoeasta = st_data(., "Geoeast") >> geonortha = st_data(., "Geonorth") >> n = rows(geoeasta) >> >> density = . >> densitytwo = . >> densitythree = . >> dups = . >> >> >> for(i=1; i<=n; ++i) { >> >> d = sqrt((geoeasta:-geoeasta[i]):^2 + (geonortha:-geonortha[i]):^2) >> d[i] = . >> density = select(d, d[.,1]:<10000) >> minindex(density, 80, densitytwo, dups) >> st_store(i, ("MSOA1", "MSOA2", "MSOA3" etc etc.), densitytwo) >> //This stores the nearest neighbours into our variables, which we defined at the top. >> >> } >> >> >> end >> I suspect I need a line or two below minidex, which inflates densitytwo to a 100 row vector and fills all the extra rows generated with 0. Or perhaps there is a more elegent way? >> Many thanks, >> Nicholas >> * >> * 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/ > > > > -- > Dr. Matthew J. Baker > Department of Economics > Hunter College and the Graduate Center, CUNY > > * > * 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/