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 on April 23, and its replacement, statalist.org is already up and running.


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

Re: st: RE: Looping within a subset under a certain condition


From   Nick Cox <njcoxstata@gmail.com>
To   statalist@hsphsun2.harvard.edu
Subject   Re: st: RE: Looping within a subset under a certain condition
Date   Sat, 29 Sep 2012 10:18:23 +0100

Have a look at

SJ-7-3  pr0033  . . . . . . . . . . . . . .  Stata tip 51: Events in intervals
        . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  N. J. Cox
        Q3/07   SJ 7(3):440--443                                 (no commands)
        tip for counting or summarizing irregularly spaced
        events in intervals

which is accessible to all at

http://www.stata-journal.com/sjpdf.html?articlenum=pr0033


On Sat, Sep 29, 2012 at 2:38 AM, Nick Cox <njcoxstata@gmail.com> wrote:
> Stata, not STATA.
>
> I don't understand what you are trying to do but
>
> local r = obs[`i'] if rep[`i'] == 1
> local z = `i'+1 if rep[`i'] == 1
>
> makes no sense. What you mean is perhaps
>
> if rep[`i'] == 1 {
>           local r = obs[`i']
>           local z = `i'+1
> }
>
> On Sat, Sep 29, 2012 at 12:31 AM, Gerard Solbrig
> <gsolbrig@mail.uni-mannheim.de> wrote:
>> This is what I have come up with so far, but for the second -forvalues-
>> loop, STATA tells me that "invalid syntax r(198)"!
>> I guess the problem lies with the local macro z, but I'm not sure.
>> Any troubleshooting idea? I'm not even sure if that get's me where I want to
>> go...
>>
>> gen rep_ins = .
>> gsort +firm_id -rep
>> by firm_id: gen obs = _n
>> gen group_obs = _n
>> sort firm_id
>> by firm_id (group_obs): replace group_obs = group_obs[1]
>> by group_obs, sort: gen group = _n == 1
>> replace group = sum(group)
>> summarize group, meanonly
>> local max = r(max)
>> forvalues x = 1/`max' {
>>         local N`x' = obs[_N]
>> }
>> /*how to make the counting macro for the forvalues look dynamic by firm_id
>> group? */
>> /* works fine up to here! */
>>
>> forvalues i = 1/`N`x'' {
>>         local r = obs[`i'] if rep[`i'] == 1
>>         local z = `i'+1 if rep[`i'] == 1
>>                 if trandate[`z'] >= wind_start[`r'] & trandate[`z'] <=
>> wind_end[`r'] {
>>                 replace rep_ins = 1 in [`z']
>>                 }
>>         else {
>>         replace rep_ins = 0 in [`z']
>>         }
>> }
>>
>> Thanks in advance.
>> Best,
>> Gerard Solbrig
>>
>>
>> -----Original Message-----
>> From: Gerard Solbrig [mailto:gsolbrig@mail.uni-mannheim.de]
>> Sent: Freitag, 28. September 2012 22:45
>> To: 'statalist@hsphsun2.harvard.edu'
>> Subject: Looping within a subset under a certain condition
>>
>> Dear Statalist-Members,
>>
>> I'm encountering a problem for which I seek your help.
>>
>> Let me start off with an example from my data (what I want it to look like
>> in the end), before I explain my particular problem.
>>
>> firm_id date            rep     wind_start              wind_end
>> rep_ins
>>
>> firm1           01jan2000       0       .                       .
>> 0
>> firm1           05apr2004       0       .                       .
>> 1
>> firm1           01nov2004       1       05may2004               30may2005
>> .
>> firm1           10dec2004       0       .                       .
>> 1
>> firm1           01jan2006       0       .                       .
>> 0
>> firm2           30dec1999       1       03jul1999               27jul2000
>> .
>> firm2           05jan2000       1       09jul1999               02aug2000
>> .
>> firm2           06jun2000       0       .                       .
>> 1
>>
>> Each firm in my data has a 'firm_id'. Variable 'date' refers to an event
>> date. The 'rep' dummy indicates the type of event.
>> I set 'wind_start' and 'wind_end' as period around the event
>> (-180days,+210days), in case it's a rep = 1 type event.
>>
>> Now, I would like the 'rep_ins' dummy to indicate (i.e., rep_ins = 1),
>> whether the date of all other observations of this firm (where rep = 0) lies
>> within the range determined by 'wind_start' and 'wind_end' (which is
>> conditional upon the 'rep' dummy).
>>
>> I've come across looping over observations and tried to design a solution
>> for this problem based on that, but failed to do so. I assume the solution
>> also depends on sorting the data in a special way.
>>
>> Here's the first part of my .do-file:
>>
>> gen wind_start = date-180 if rep == 1
>> gen wind_end = date+210 if rep == 1
>> format wind_start %d
>> format wind_end %d
>> gsort +firm_id +date +trandate
>> gen rep_ins = 0 if rep != 1
>>
>> I tried to come up with a solution by adding variables 'per_start' and
>> 'per_end' for all rep = 0:
>>
>> gen per_start = date-180 if rep == 0
>> gen per_end = date+180 if rep == 0
>> format per_start %d
>> format per_end %d
>>
>> To mark the period within which the rep = 1 event can lie. Maybe this could
>> contribute to finding a solution as well.
>>
*
*   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/


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