Bookmark and Share

Notice: On March 31, it was announced that Statalist is moving from an email list to a forum. The old list will shut down at the end of May, and its replacement, statalist.org is already up and running.


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

Re: st: looping with geodist


From   Robert Picard <picard@netbox.com>
To   statalist@hsphsun2.harvard.edu
Subject   Re: st: looping with geodist
Date   Sat, 8 May 2010 10:13:42 -0400

The version 10 syntax is "merge using "`f'"

Robert

On Sat, May 8, 2010 at 5:38 AM, Frederick Guy <f.guy@bbk.ac.uk> wrote:
> Thanks again, Robert. This looks good. Just one (I hope) more question: I'm using Stata 10, and am not sure what the equivalent of "merge 1:1 _n" is.
>
>
> -----Original Message-----
> From: owner-statalist@hsphsun2.harvard.edu [mailto:owner-statalist@hsphsun2.harvard.edu] On Behalf Of Robert Picard
> Sent: 07 May 2010 15:12
> To: statalist@hsphsun2.harvard.edu
> Subject: Re: st: looping with geodist
>
> If you have two kinds of locations, then the easiest solution is not
> to append both datasets but to do an unmatched merge. This puts each
> set of observations side-to-side and it's easier to manage. Here's an
> updated version of my example; the looping is over all observations of
> the second dataset. Hope this helps,
>
> Robert
>
> *--------------------------- begin example -----------------------
> version 11
>
> * This example require my -geodist- program available on SSC
> * To install: ssc install geodist
>
> clear all
> set obs 5
> set seed 1234
> gen lat1 = 37 + (41 - 37) * uniform()
> gen lon1 = -109 + (109 - 102) * uniform()
> gen x1 = round(uniform()*100)
> tempfile f
> save "`f'"
>
> clear
> set obs 3
> gen lat2 = 37 + (41 - 37) * uniform()
> gen lon2 = -109 + (109 - 102) * uniform()
> gen x2 = round(uniform()*100)
>
> merge 1:1 _n using "`f'", nogen
> list
>
> gen x3 = .
> count if x2 != .
> local nobs = r(N)
>
> forvalues i = 1/`nobs' {
>       geodist lat1 lon1 `=lat2[`i']' `=lon2[`i']', gen(d)
>       gen xtemp = x1 / d
>       sum xtemp, meanonly
>       qui replace x3 = r(sum) + x2[`i'] in `i'
>       list
>       drop d xtemp
> }
> *--------------------- end example --------------------------
>
>
> On Fri, May 7, 2010 at 4:35 AM, Frederick Guy <f.guy@bbk.ac.uk> wrote:
>> Robert Picard sent the code below, which works as advertised - many thanks, Robert! Now I have a slightly different problem: I have two kinds of locations in the data, i and j. For each location of type i, I need to compute the distances to every location of type j. If I just stack observations type i on top of observations type j, geodist doesn't like the missing values (observations type i have missing values for type j, and vice versa). Can anybody suggest a solution?
>>
>> -----Original Message-----
>> From: owner-statalist@hsphsun2.harvard.edu [mailto:owner-statalist@hsphsun2.harvard.edu] On Behalf Of Robert Picard
>> Sent: 30 April 2010 17:09
>> To: statalist@hsphsun2.harvard.edu
>> Subject: Re: st: RE: RE: RE: AW: Creating index relative to other observations
>>
>> Perhaps the following example is close to what you are trying to do.
>> It loops through all observations. Each time, it calculates the
>> distance from observation `i' to all others (distance will be missing
>> for the observation `i'). Values for variable x1 are adjusted
>> according to the distance to `i' and summed. The observation `i' of x3
>> is then updated with the value of the sum plus the value of x2 for
>> observation `i'.
>>
>> Hope this helps,
>>
>> Robert
>> http://robertpicard.com/
>>
>> *--------------------------- begin example -----------------------
>> version 11
>>
>> * This example require my -geodist- program available on SSC
>> * To install: ssc install geodist
>>
>> clear all
>> set obs 5
>> set seed 1234
>> gen lat = 37 + (41 - 37) * uniform()
>> gen lon = -109 + (109 - 102) * uniform()
>> gen x1 = round(uniform()*100)
>> gen x2 = round(uniform()*100)
>> gen x3 = .
>>
>> forvalues i = 1/`c(N)' {
>>        geodist lat lon `=lat[`i']' `=lon[`i']' if _n != `i', gen(d)
>>        gen xtemp = x1 / d
>>        sum xtemp, meanonly
>>        qui replace x3 = r(sum) + x2 in `i'
>>        list
>>        drop d xtemp
>> }
>> *--------------------- end example --------------------------
>>
>>
>> On Fri, Apr 30, 2010 at 7:49 AM, Frederick Guy <f.guy@bbk.ac.uk> wrote:
>>> Many thanks. Now for a crash-course in MATA...
>>>
>>> -----Original Message-----
>>> From: owner-statalist@hsphsun2.harvard.edu
>>> [mailto:owner-statalist@hsphsun2.harvard.edu] On Behalf Of Nick Cox
>>> Sent: 29 April 2010 19:22
>>> To: statalist@hsphsun2.harvard.edu
>>> Subject: st: RE: RE: AW: Creating index relative to other observations
>>>
>>> I'd do this in Mata. Mata has a -for- loop.
>>>
>>> Nick
>>> n.j.cox@durham.ac.uk
>>>
>>> Frederick Guy
>>>
>>> Thanks, I guess I was unclear on this aspect of the problem. For each
>>> observation, the sum I'm talking about is of measurements made relative
>>> to all other observations (or more generally, to some set of other
>>> observations) in the sample.
>>>
>>> Martin Weiss
>>>
>>> ".. sum up the results of these computations,".
>>>
>>> Creating sums can mean different things in Stata. It may sound trite,
>>> but
>>> the easiest is simply to -generate- a sum by adding values with a "+"
>>> sign.
>>> If you want the total of a variable, look at -egen, total()-. If you
>>> want a
>>> running sum, take a look at -help sum()-.
>>>
>>> Frederick Guy
>>>
>>> I have need to use information from all observations (about 1800 of
>>> them) to create a new variable.
>>>
>>> The variable created is a weighted sum of the inverse of geographical
>>> distances between observation i and all j n.e. i. I have longitude and
>>> latitude for each observation, and computation of the distance from any
>>> i to any j is straightforward. What I don't know is how to get Stata to
>>> loop over all observation and sum up the results.
>>>
>>> For every observation i, I think I need to
>>>
>>> (a) loop through all j n.e. I, doing computations involving variables
>>> x1, x2(i) and x1, x2(j), and then
>>>
>>> (b) sum up the results of these computations, returning a value which
>>> becomes variable x3 for that i.
>>>
>>> I expect there's a straightforward way to do this. Any suggestions?
>>>
>>> *
>>> *   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/
>>>
>>> *
>>> *   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/
>>>
>>
>> *
>> *   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/
>>
>> *
>> *   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/
>>
>
> *
> *   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/
>
> *
> *   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/
>

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


© Copyright 1996–2014 StataCorp LP   |   Terms of use   |   Privacy   |   Contact us   |   Site index