Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: st: Looping within a subset under a certain condition
From
"Gerard Solbrig" <[email protected]>
To
<[email protected]>
Subject
RE: st: Looping within a subset under a certain condition
Date
Tue, 2 Oct 2012 00:15:14 +0200
I'm currently trying to modify the code for the next step of my analysis:
The code is supposed to sum up ("running sum") variable -shares_dir- of
every rep = 0 observation if its respective -trandate- is in range of
-wind_start- and -wind_end- of the rep = 1 case the loop currently deals
with. The result of the running sum is supposed to be stored in variable
-sum_sh- for every rep = 1 case when the loop is done looking through all
rep = 0 cases for this rep = 1 case
.
Therefore, I tried to modify the code to tackle this problem (see comments
within code below). I'm not sure about the correct construction of the
running sum and how/when I need to tell the loop to put the result in
-sum_sh- when done.
Here's what I came up with so far:
gen sum_sh = .
gen long obsno = _n
sort cusip6 rep trandate
summarize firm_numid, meanonly
local max = r(max)
forvalues x = 1/`max' {
summarize obsno if firm_numid == `x' & rep == 0, meanonly
local z1 = r(min)
local z2 = r(max)
summarize obsno if firm_numid == `x' & rep == 1, meanonly
local o1 = r(min)
local o2 = r(max)
if missing(`z1',`z2',`o1',`o2') continue
/* start by entering the rep = 1 cases first, as output should be
stored in var sum_sh here */
quietly forvalues o = `o1'/`o2' {
/* slightly changed starting assumption: now every rep = 0
case assumed to be in a window, unless found otherwise */
local isin = 1
/* -noshcum- local macro to store result of running sum,
zero initially */
local noshcum = 0
forvalues i = `z1'/`z2' {
/* if Stata finds that rep = 0 -trandate- is not in
range, just continue with the next observation */
if !inrange(trandate[`i'], wind_start[`o'],
wind_end[`o']) {
local isin = 0 continue
}
/* now deal with the cases which are in the range */
else {
/* local macro to temporarily store this
observation's -share_dir- to be included in the running sum */
local nosh = shares_dir[`z']
/* update local macro keeping the result of the
running sum until all rep = 0 cases have been screened */
local shares_cum = `shares_cum' + `nosh'
}
/* this might not be correct: I want the result of the
running sum to be put in -sum_sh- for each rep = 1 observation */
if `isin' == 1 replace sum_sh = `shares_cum' in `o'
}
}
All useful input much appreciated, as always!
Best,
Gerard
-----Original Message-----
From: [email protected]
[mailto:[email protected]] On Behalf Of Nick Cox
Sent: Montag, 1. Oktober 2012 19:15
To: [email protected]
Subject: Re: st: Looping within a subset under a certain condition
Good! Thanks for the closure.
Needing to compare all the events of type A _individually_ with all the
events of type B -- within a larger set of classes C -- can't be that
unusual.
Nick
On Mon, Oct 1, 2012 at 5:42 PM, Gerard Solbrig
<[email protected]> wrote:
> Now, the code works the way it is supposed to work! I find the
> intuition behind the code very appealing!
>
> Can't thank you enough for the assistance. Especially you, Nick.
> Being new to Stata, I learned a lot from this thread and the
correspondence.
> Maybe I'll be able to make valuable contributions soon, too.
>
> Best,
> Gerard
>
>
> -----Original Message-----
> From: [email protected]
> [mailto:[email protected]] On Behalf Of Nick Cox
> Sent: Montag, 1. Oktober 2012 02:38
> To: [email protected]
> Subject: Re: st: Looping within a subset under a certain condition
>
> So, straight away the first firm has no cases with rep == 1. Nothing
> doing in those circumstances.
>
> Also, you messed with the rest of my code without explaining why.
>
> I recommend as follows. You need to be consistent on -date- and
-trandate-.
>
> sort cusip6 rep date
> gen long obs = _n
> gen rep_ins = 0
> egen firm_numid = group(cusip6)
> summarize firm_numid, meanonly
> forvalues x = 1/`r(max)' {
> su obs if firm_numid == `x' & rep == 0, meanonly
> local z1 = r(min)
> local z2 = r(max)
> su obs if firm_numid == `x' & rep == 1, meanonly
> local o1 = r(min)
> local o2 = r(max)
>
> if missing(`z1', `z2', `o1', `o2') continue
>
> forvalues i = `z1'/`z2' {
> local isin = 0
> forvalues o = `o1'/`o2' {
> if inrange(trandate[`i'], wind_start[`o'],
> wind_end[`o']) {
> local isin = 1
> }
> }
> if `isin' == 1 replace rep_ins = 1 in `i'
> }
> }
>
> On Sun, Sep 30, 2012 at 9:15 PM, Gerard Solbrig
> <[email protected]> wrote:
>> Here's what Stata says:
>>
>> - forvalues x = 1/`r(max)' {
>> = forvalues x = 1/18554 {
>> - summarize obs if firm_numid == `x' & rep == 0, meanonly = summarize
>> obs if firm_numid == 1 & rep == 0, meanonly
>> - local z1 = r(min)
>> - local z2 = r(max)
>> - summarize obs if firm_numid == `x' & rep == 1, meanonly = summarize
>> obs if firm_numid == 1 & rep == 1, meanonly
>> - local o1 = r(min)
>> - local o2 = r(max)
>> - forvalues i = `z1'/`z2' {
>> = forvalues i = 1/106 {
>> - local isin = 1
>> - forvalues o = `o1'/`o2' {
>> = forvalues o = ./. {
>> invalid syntax
>> if inrange(trandate[`i'], wind_start[`o'], wind_end[`o']) {
>> local isin = 0
>> }
>> if `isin' == 1 replace rep_ins = 1 in `i'
>> }
>> }
>> r(198);
>>
>>
>>
>> -----Original Message-----
>> From: [email protected]
>> [mailto:[email protected]] On Behalf Of Nick Cox
>> Sent: Sonntag, 30. September 2012 21:53
>> To: [email protected]
>> Subject: Re: st: Looping within a subset under a certain condition
>>
>> This code refers to -date- and -trandate- at different places.
>>
>> gen long obs = _n
>>
>> was recommended earlier.
>>
>> Type
>>
>> set trace on
>> set tracedepth 1
>>
>> before running the code and see which line produces the error.
>>
>> On Sun, Sep 30, 2012 at 7:28 PM, Gerard Solbrig
>> <[email protected]> wrote:
>>> I'm sorry, but I've been trying for hours now: Stata yields me
>>> "invalid syntax r(198);" every time I try to run this code:
>>>
>>> sort cusip6 rep date
>>> gen obs = _n
>>> gen rep_ins = 0
>>> egen firm_numid = group(cusip6)
>>> summarize firm_numid, meanonly
>>> forvalues x = 1/`r(max)' {
>>> su obs if firm_numid == `x' & rep == 0, meanonly
>>> local z1 = r(min)
>>> local z2 = r(max)
>>> su obs if firm_numid == `x' & rep == 1, meanonly
>>> local o1 = r(min)
>>> local o2 = r(max)
>>> forvalues i = `z1'/`z2' {
>>> local isin = 1
>>> forvalues o = `o1'/`o2' {
>>> if inrange(trandate[`i'], wind_start[`o'],
>>> wind_end[`o']) {
>>> local isin = 0
>>> }
>>> if `isin' == 1 replace rep_ins = 1 in `i'
>>> }
>>> }
>>> }
>>>
>>> Despite countless tries and modifications, I cannot find the mistake
>>> in the syntax. I simply don't know what is supposed to be wrong here.
>>> I know this code should be working the way I need it...
*
* 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/