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: Creating a dummy variable under certain conditions


From   Nick Cox <njcoxstata@gmail.com>
To   statalist@hsphsun2.harvard.edu
Subject   Re: st: Creating a dummy variable under certain conditions
Date   Mon, 4 Jun 2012 13:31:33 +0100

Earlier in the thread Abhimanyu mentioned -tsspell- (SSC).

-tsspell- can indeed be used here, but first you must reverse time.
That is you are looking for spells that are at least four 0s long
ending with a 1.

First creating a sandpit with similar data:

clear
input str6 date gvkey viol
1997q1 1004    0
1997q2 1004    0
1997q3 1004    0
1997q4 1004    0
1998q1 1004    1
1998q2 1004    0
1998q3 1004    0
1998q4 1004    0
1999q1 1004    0
1999q2 1004    1
1999q3 1004    0
1999q4 1004    0
2000q1 1004    1
2000q2 1004    0
2000q3 1004    0
2000q4 1004    1
2001q1 1004    0
2001q2 1004    0
2001q3 1004    0
2001q4 1004    0
2002q1 1004    0
2002q2 1004    1
end
gen numdate = yq(real(substr(date,1,4)), real(substr(date,6,1)))

Now I reverse time

gen negdate = -numdate
tsset gvkey negdate

Then spells start with 1. (And 1s start spells.)

tsspell , fcond(viol == 1)

And a spell must be at least 5 obs long.

egen length = max(_seq), by(gvkey _spell)
gen OK = _seq == 1 & length >= 5

Restore usual direction of time:

tsset gvkey numdate


On Mon, Jun 4, 2012 at 1:15 PM, sebas nicaise <sebasnicaise@hotmail.com> wrote:
> Thank you very much Nick, it worked!
>
> Thank you to for your effort Abhimanyu, your code gives me this:
> date gvkey viol new_viol_dummy
> 1997q1 1004 0   0
> 1997q2 1004 0   0
> 1997q3 1004 0   0
> 1997q4 1004 0   0
> 1998q1 1004 0   1
> 1998q2 1004 0   0
> 1998q3 1004 0   0
> 1998q4 1004 0   0
> 1999q1 1004 0   0
> 1999q2 1004 0   1
> 1999q3 1004 0   0
> 1999q4 1004 0   0
> 2000q1 1004 0   0
> 2000q2 1004 0   0
> 2000q3 1004 0   0
> 2000q4 1004 0   1
> 2001q1 1004 0   0
> 2001q2 1004 0   0
> 2001q3 1004 0   0
> 2001q4 1004 0   0
> 2002q1 1004 0   0
> 2002q2 1004 0   1
>
> So now it gave too many :)
>
>
>
> ----------------------------------------
>> Date: Mon, 4 Jun 2012 12:19:23 +0100
>> Subject: Re: st: Creating a dummy variable under certain conditions
>> From: njcoxstata@gmail.com
>> To: statalist@hsphsun2.harvard.edu
>>
>> Thanks. As my previous three solutions were all quite wrong, I had
>> some distance to make up.
>>
>> Nick
>>
>> On Mon, Jun 4, 2012 at 12:11 PM, Abhimanyu Arora
>> <abhimanyu.arora1987@gmail.com> wrote:
>> > All I can say to Nick's ingenious solution iswow (shouldn't come as a
>> > surprise though)
>> >
>> > Sebas, instead of -replacing- 2 times you could further shorten the
>> > alternative solution by
>> >
>> > replace new_viol_dummy=0 if ceil(_seq/6)!=floor(_seq/6) & _seq!=1 & viol==0
>> >
>> > In order to get a clear, detailed understanding of things, would you
>> > mind listing out why this gives too few ones, given your requirements?
>> >
>> > Thanks
>> >
>> > Abhimanyu
>> >
>> >
>> > On Mon, Jun 4, 2012 at 12:06 PM, Nick Cox <njcoxstata@gmail.com> wrote:
>> >> Quite so. Let's try something different.
>> >>
>> >> gen history = ""
>> >> bysort gvkey (date) : replace history = string(viol) + history[_n-1]
>> >> gen OK = substr(history, 1, 5) == "10000"
>> >>
>> >> Nick
>> >>
>> >> On Mon, Jun 4, 2012 at 10:38 AM, sebas nicaise <sebasnicaise@hotmail.com> wrote:
>> >>>
>> >>> Nick your code is almost right. Only it gives a 1 for these cases while it should not:
>> >>>
>> >>> date gvkey viol myindicator
>> >>> 2000q3 1045 0 0
>> >>> 2000q4 1045 0 0
>> >>> 2001q1 1045 0 0
>> >>> 2001q2 1045 0 0
>> >>> 2001q3 1045 1 1
>> >>> 2001q4 1045 1 0
>> >>> 2002q1 1045 0 0
>> >>> 2002q2 1045 0 0
>> >>> 2002q3 1045 0 0
>> >>> 2002q4 1045 1 1
>> >>> 2003q1 1045 1 0
>> >>> 2003q2 1045 0 0
>> >>>
>> >>> You see, because viol is 1 again after the new viol reported a 1. So it is wrong because there are only 3 quarters of 0 in the viol dummy.
>> >>>
>> >>>
>> >>> Abrihmanyu, in your code it gives to few 1's But if it reports a 1 it is right. I do not see the error in the code...
>> >>>
>> >>>
>> >>>
>> >>>
>> >>> ----------------------------------------
>> >>>> Date: Mon, 4 Jun 2012 09:41:24 +0100
>> >>>> Subject: Re: st: Creating a dummy variable under certain conditions
>> >>>> From: njcoxstata@gmail.com
>> >>>> To: statalist@hsphsun2.harvard.edu
>> >>>>
>> >>>> bysort gvkey (date) : gen cuviol = sum(viol)
>> >>>> by gvkey : gen myindicator = (viol == 1) & (cuviol[_n-1] ==
>> >>>> cuviol[_n-4]) & _n> 4
>> >>>>
>> >>>> Nick
>> >>>>
>> >>>> On Mon, Jun 4, 2012 at 9:22 AM, sebas nicaise <sebasnicaise@hotmail.com> wrote:
>> >>>>
>> >>>>> It is important that new viol dummy can only be 1 if viol is 1 and in the previous 4 quarters viol is 0.

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